{"schema":"libjg2-1",
"vpath":"/git/",
"avatar":"/git/avatar/",
"alang":"",
"gen_ut":1745467358,
"reponame":"libwebsockets",
"desc":"libwebsockets lightweight C networking library",
"owner": { "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },"url":"https://libwebsockets.org/repo/libwebsockets",
"f":3,
"items": [
{"schema":"libjg2-1",
"cid":"92c94dec4b5e5ae67e83a408a89740a6",
"commit": {"type":"commit",
"time": 1633682945,
"time_ofs": 60,
"oid_tree": { "oid": "90f271d13810db70515d7aafc087d58bad1c7a07", "alias": []},
"oid":{ "oid": "8fd1ea61809599531662f964d97ef091a97ce92c", "alias": []},
"msg": "examples: move existing to m-e-lowlevel and start repoulating m-e with SS",
"sig_commit": { "git_time": { "time": 1633682945, "offset": 60 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },
"sig_author": { "git_time": { "time": 1631954076, "offset": 60 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }},
"body": "examples: move existing to m-e-lowlevel and start repoulating m-e with SS\n"
,
"diff": "diff --git a/CMakeLists.txt b/CMakeLists.txt\nindex 3565589..e00317b 100644\n--- a/CMakeLists.txt\n+++ b/CMakeLists.txt\n@@ -942,7 +942,7 @@ endif()\n \n if (LWS_HAVE_LIBCAP)\n \tfind_library(LIBCAP_LIBRARIES NAMES cap)\n-\tlist(APPEND LIB_LIST ${LIBCAP_LIBRARIES} )\n+\tlist(APPEND LIB_LIST_AT_END ${LIBCAP_LIBRARIES} )\n endif()\n \n if (LWS_WITH_PLUGINS_BUILTIN)\n@@ -1006,7 +1006,10 @@ set(CMAKE_MODULE_PATH \u0022${PROJECT_SOURCE_DIR}/cmake\u0022)\n message(\u0022DIR ${libwebsockets_DIR} CMP ${CMAKE_MODULE_PATH}\u0022)\n \n if (LWS_WITH_MINIMAL_EXAMPLES)\n-\tadd_subdirectory(minimal-examples)\n+\tif (LWS_WITH_SECURE_STREAMS)\n+\t\tadd_subdirectory(minimal-examples)\n+\tendif()\n+\tadd_subdirectory(minimal-examples-lowlevel)\n endif()\n \n if (NOT LWS_WITHOUT_TESTAPPS)\ndiff --git a/README.md b/README.md\nindex 552603f..f44e2e4 100644\n--- a/README.md\n+++ b/README.md\n@@ -26,6 +26,84 @@ sdevent, glib and uloop, as well as custom event libs.\n News\n ----\n \n+## Lws examples switching to Secure Streams\n+\n+\n+\n+**Secure Streams** support in lws was introduced a couple of years ago, it's a\n+higher-level interface to lws `wsi`-level apis that simplifies connectivity by\n+segregating connection policy like protocol and endpoint information into a\n+separate [JSON policy file](./minimal-examples/client/hello_world/example-policy.json), and just having the [code deal with payloads](./minimal-examples/clients/hello_world/hello_world-ss.c); as many\n+details of the wire protocol as possible are hidden or moved to the policy, so\n+user code is almost identical even if the wire protocol changes.\n+\n+The user code just asks to create a SS by \u0022streamtype name\u0022, it is created\n+according to the details (protocol, endpoint, etc) under the same name in the\n+policy.\n+\n+Key policy entries like endpoint can contain `${metadata-name}` string\n+substitutions to handle runtime adaptations via metadata. h1, h2, ws and mqtt\n+are supported.\n+\n+As a layer on top of the `wsi` apis, SS provides a higher-level way to access\n+the existing wsi-level capabilities, both kinds of API will remain supported.\n+Secure Streams are longer-lived than a single wsi, so an SS can coordinate\n+retries by itself. SS-based user code is typically significantly smaller and\n+more maintainable than wsi layer.\n+\n+In main branch I have moved the older examples into `./minimal-examples-lowlevel`\n+and am starting to port more cases from there into SS-based examples.\n+\n+### Comparison between wsi and SS level lws usage\n+\n+|Feature|\u0022low-level\u0022 wsi way|Secure Streams way|\n+|---|---|---|\n+|Create context|code|same|\n+|Loop support, sul scheduler|default, event libs|same|\n+|Supports comms mode|Client, Server, Raw|same|\n+|Supports protocols|h1, h2, ws, mqtt (client)|same|\n+|TLS support|mbedtls (including v3), openssl (including v3), wolfssl, boringssl, libressl|same|\n+|Serializable, proxiable, muxable, transportable|No|Yes|\n+|Auto-allocated per-connection user object|pss specified in lws_protocols|Specified in ss info struct|\n+|Connection User API|Protocol-specific lws_protocols cbs (\u003e 100)|SS API (rx, tx, state callbacks only)|\n+|Sending adaptation|lws_callback_on_writeable() + WRITEABLE|lws_ss_request_write() + tx() cb|\n+|Sending buffer|User-chosen + malloc'd partial handling|SS-provided, no partials|\n+|Create vhosts|code|**JSON policy**|\n+|TLS validation|cert bundle or code|**JSON policy**, or cert bundle|\n+|Connection retry / backoff|code|**JSON policy**, Auto|\n+|Nailing up|code|**JSON policy**, Auto|\n+|Endpoint and protocol details|spread around the code|**JSON policy**|\n+|Protocol selection, pipeline / stream sharing|code|**JSON policy**|\n+|ws subprotocol selection|code|**JSON policy**|\n+|ws binary / text|code|**JSON policy**|\n+|Protocol-specific metadata|Protocol-specific apis in code (eg, lws_hdr)|**JSON policy**, generic metadata apis in code|\n+|Connection validity rules|struct|**JSON policy**, Auto|\n+|Stream as Long Poll|code|**JSON policy**|\n+|Auth|code|**JSON policy** + automatic rotation if provider supported, else code|\n+\n+### Serialized Secure Streams\n+\n+\n+\n+Secure Streams APIs are also **serializable**, the exact same client code can\n+fulfil the connection directly in the same process as you would expect, or\n+forward the actions, metadata and payloads to an [SS Proxy](./minimal-examples/ssproxy/ssproxy-socket) that owns the policy\n+over a Unix Domain or TCP socket connection to be fulfilled centrally. This\n+allows, eg, h2 streams from different processes sharing a single connection.\n+\n+\n+\n+The serialized SS can also travel over generic transports like UART, an [example\n+is provided implementing the Binance example on an RPi Pico](./minimal-examples/embedded/pico/pico-sspc-binance) with a UART transport\n+to a [UART transport SS proxy](./minimal-examples/ssproxy/ssproxy-custom-transport-uart), where the pico itself has no network stack, tls, compression or\n+wss stack, but can send and receive to and from the endpoint as if it did.\n+\n+The optional `lws_trasport_mux` is used to interpose between the UART transport\n+and the SSPC layer, allowing a single pipe to carry many separate SS connections.\n+\n+The user SS code is identical however it is transported, muxed and fulfilled.\n+\n+\n ## v4.3 is released\n \n See the [changelog](https://libwebsockets.org/git/libwebsockets/tree/changelog)\ndiff --git a/READMEs/README.ctest.md b/READMEs/README.ctest.md\nindex 0ed8a84..9fdb1ee 100644\n--- a/READMEs/README.ctest.md\n+++ b/READMEs/README.ctest.md\n@@ -282,7 +282,7 @@ named fixture \u0022hcm_srv\u0022, itself with an 800s timeout\n \n ```\n \tset_tests_properties(st_hcm_srv PROPERTIES\n- \t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-tls\n+ \t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-tls\n \t\tFIXTURES_SETUP hcm_srv\n \t\tTIMEOUT 800)\n \tset_tests_properties(ki_hcm_srv PROPERTIES\n@@ -296,7 +296,7 @@ test (http-client-multi) we are testing\n \tset_tests_properties(http-client-multi\n \t\t\t PROPERTIES\n \t\t\t FIXTURES_REQUIRED \u0022hcm_srv\u0022\n-\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-multi\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-multi\n \t\t\t TIMEOUT 50)\n ```\n \ndiff --git a/doc-assets/ss-api1.png b/doc-assets/ss-api1.png\nnew file mode 100644\nindex 0000000..8acdf06\nBinary files /dev/null and b/doc-assets/ss-api1.png differ\ndiff --git a/doc-assets/ss-api2.png b/doc-assets/ss-api2.png\nnew file mode 100644\nindex 0000000..cf58ba1\nBinary files /dev/null and b/doc-assets/ss-api2.png differ\ndiff --git a/doc-assets/ss-api3.png b/doc-assets/ss-api3.png\nnew file mode 100644\nindex 0000000..a23e2e3\nBinary files /dev/null and b/doc-assets/ss-api3.png differ\ndiff --git a/include/libwebsockets/lws-context-vhost.h b/include/libwebsockets/lws-context-vhost.h\nindex 2ea966f..0c91ebe 100644\n--- a/include/libwebsockets/lws-context-vhost.h\n+++ b/include/libwebsockets/lws-context-vhost.h\n@@ -1229,6 +1229,19 @@ lws_context_user(struct lws_context *context);\n LWS_VISIBLE LWS_EXTERN const char *\n lws_vh_tag(struct lws_vhost *vh);\n \n+LWS_VISIBLE LWS_EXTERN void\n+_lws_context_info_defaults(struct lws_context_creation_info *info,\n+\t\t\t const char *sspol);\n+\n+LWS_VISIBLE LWS_EXTERN void\n+lws_default_loop_exit(struct lws_context *cx);\n+\n+LWS_VISIBLE LWS_EXTERN void\n+lws_context_default_loop_run_destroy(struct lws_context *cx);\n+\n+LWS_VISIBLE LWS_EXTERN int\n+lws_cmdline_passfail(int argc, const char **argv, int actual);\n+\n /**\n * lws_context_is_being_destroyed() - find out if context is being destroyed\n *\ndiff --git a/include/libwebsockets/lws-misc.h b/include/libwebsockets/lws-misc.h\nindex 58217e8..2a72142 100644\n--- a/include/libwebsockets/lws-misc.h\n+++ b/include/libwebsockets/lws-misc.h\n@@ -886,7 +886,7 @@ LWS_VISIBLE extern const lws_humanize_unit_t humanize_schema_us[8];\n void\n lws_assert_fourcc(uint32_t fourcc, uint32_t expected);\n #else\n-#define lws_assert_fourcc(_a, _b)\n+#define lws_assert_fourcc(_a, _b) do { } while (0);\n #endif\n \n /**\ndiff --git a/include/libwebsockets/lws-secure-streams-client.h b/include/libwebsockets/lws-secure-streams-client.h\nindex 361b980..3683d70 100644\n--- a/include/libwebsockets/lws-secure-streams-client.h\n+++ b/include/libwebsockets/lws-secure-streams-client.h\n@@ -66,6 +66,7 @@ struct lws_sspc_handle;\n #define lws_ss_to_user_object\t\tlws_sspc_to_user_object\n #define lws_ss_change_handlers\t\tlws_sspc_change_handlers\n #define lws_smd_ss_rx_forward\t\tlws_smd_sspc_rx_forward\n+#define lws_ss_server_ack\t\tlws_sspc_server_ack\n #define lws_ss_tag\t\t\tlws_sspc_tag\n #define _lws_fi_user_ss_fi\t\t_lws_fi_user_sspc_fi\n #define lwsl_ss_get_cx\t\t\tlwsl_sspc_get_cx\n@@ -349,6 +350,9 @@ LWS_VISIBLE LWS_EXTERN void\n lws_sspc_change_handlers(struct lws_sspc_handle *h,\n \t\t\t lws_sscb_rx rx,lws_sscb_tx tx, lws_sscb_state state);\n \n+LWS_VISIBLE LWS_EXTERN void\n+lws_sspc_server_ack(struct lws_sspc_handle *h, int nack);\n+\n \n /*\n * Helpers offered by lws to handle transport SSPC-side proxy link events\ndiff --git a/include/libwebsockets/lws-secure-streams.h b/include/libwebsockets/lws-secure-streams.h\nindex 4a0aa44..39fc50e 100644\n--- a/include/libwebsockets/lws-secure-streams.h\n+++ b/include/libwebsockets/lws-secure-streams.h\n@@ -248,6 +248,28 @@ typedef struct lws_ss_info {\n \n } lws_ss_info_t;\n \n+#define LWS_SS_USER_TYPEDEF \u005c\n+\ttypedef struct { \u005c\n+\t\tstruct lws_ss_handle \t*ss; \u005c\n+\t\tvoid\t\t\t*opaque_data;\n+\n+#define LWS_SS_INFO(_streamtype, _type) \u005c\n+\tconst lws_ss_info_t ssi_##_type \u003d { \u005c\n+\t\t.handle_offset \u003d offsetof(_type, ss), \u005c\n+\t\t.opaque_user_data_offset \u003d offsetof(_type, opaque_data), \u005c\n+\t\t.user_alloc \u003d sizeof(_type), \u005c\n+\t\t.streamtype \u003d _streamtype,\n+\n+#define lws_ss_from_user(_u)\t\t(_u)-\u003ess\n+#define lws_ss_opaque_from_user(_u)\t(_u)-\u003eopaque_data\n+#define lws_ss_cx_from_user(_u)\t\tlws_ss_get_context((_u)-\u003ess)\n+\n+#if defined(LWS_SS_USE_SSPC)\n+#define lws_context_info_defaults(_x, _y) _lws_context_info_defaults(_x, NULL)\n+#else\n+#define lws_context_info_defaults(_x, _y) _lws_context_info_defaults(_x, _y)\n+#endif\n+\n /**\n * lws_ss_create() - Create secure stream\n *\ndiff --git a/lib/core-net/vhost.c b/lib/core-net/vhost.c\nindex 562607c..1741f70 100644\n--- a/lib/core-net/vhost.c\n+++ b/lib/core-net/vhost.c\n@@ -690,10 +690,10 @@ lws_create_vhost(struct lws_context *context,\n \tif (!pcols) {\n \t\tfor (vh-\u003ecount_protocols \u003d 0;\n \t\t\tinfo-\u003epprotocols[vh-\u003ecount_protocols];\n-\t\t\tvh-\u003ecount_protocols++) {\n-\t\t\t\tlwsl_user(\u0022%s: ppcols: %s\u005cn\u0022, __func__,\n-\t\t\t\t\t\tinfo-\u003epprotocols[vh-\u003ecount_protocols]-\u003ename);\n-\t\t}\n+\t\t\tvh-\u003ecount_protocols++)\n+\t\t\t\t;\n+\t\t\t//lwsl_user(\u0022%s: ppcols: %s\u005cn\u0022, __func__,\n+\t\t\t// info-\u003epprotocols[vh-\u003ecount_protocols]-\u003ename);\n \t} else\n \t\tfor (vh-\u003ecount_protocols \u003d 0;\n \t\t\tpcols[vh-\u003ecount_protocols].callback;\ndiff --git a/lib/core/libwebsockets.c b/lib/core/libwebsockets.c\nindex 958d843..0fd5a8f 100644\n--- a/lib/core/libwebsockets.c\n+++ b/lib/core/libwebsockets.c\n@@ -1399,7 +1399,10 @@ static const char * const builtins[] \u003d {\n \t\u0022-d\u0022,\n \t\u0022--fault-injection\u0022,\n \t\u0022--fault-seed\u0022,\n-\t\u0022--ignore-sigterm\u0022\n+\t\u0022--ignore-sigterm\u0022,\n+\t\u0022--ssproxy-port\u0022,\n+\t\u0022--ssproxy-iface\u0022,\n+\t\u0022--ssproxy-ads\u0022,\n };\n \n enum opts {\n@@ -1407,6 +1410,9 @@ enum opts {\n \tOPT_FAULTINJECTION,\n \tOPT_FAULT_SEED,\n \tOPT_IGNORE_SIGTERM,\n+\tOPT_SSPROXY_PORT,\n+\tOPT_SSPROXY_IFACE,\n+\tOPT_SSPROXY_ADS,\n };\n \n #if !defined(LWS_PLAT_FREERTOS)\n@@ -1417,6 +1423,72 @@ lws_sigterm_catch(int sig)\n #endif\n \n void\n+_lws_context_info_defaults(struct lws_context_creation_info *info,\n+\t\t\t const char *sspol)\n+{\n+\tmemset(info, 0, sizeof *info);\n+ info-\u003efd_limit_per_thread \u003d 1 + 6 + 1;\n+#if defined(LWS_WITH_NETWORK)\n+ info-\u003eport \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+#if defined(LWS_WITH_SECURE_STREAMS) \u0026\u0026 !defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY)\n+ info-\u003epss_policies_json \u003d sspol;\n+#endif\n+#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\n+ if (!sspol)\n+ \tinfo-\u003eprotocols \u003d lws_sspc_protocols;\n+ else\n+#endif\n+ \tinfo-\u003eoptions \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+ \t\tLWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW |\n+ \t\tLWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+}\n+\n+void\n+lws_default_loop_exit(struct lws_context *cx)\n+{\n+\tif (cx) {\n+\t\tcx-\u003einterrupted \u003d 1;\n+#if defined(LWS_WITH_NETWORK)\n+\t\tlws_cancel_service(cx);\n+#endif\n+\t}\n+}\n+\n+#if defined(LWS_WITH_NETWORK)\n+void\n+lws_context_default_loop_run_destroy(struct lws_context *cx)\n+{\n+ /* the default event loop, since we didn't provide an alternative one */\n+\n+ while (!cx-\u003einterrupted \u0026\u0026 lws_service(cx, 0) \u003e\u003d 0)\n+ \t;\n+\n+ lws_context_destroy(cx);\n+}\n+#endif\n+\n+int\n+lws_cmdline_passfail(int argc, const char **argv, int actual)\n+{\n+\tint expected \u003d 0;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n+\t\texpected \u003d atoi(p);\n+\n+\tif (actual \u003d\u003d expected) {\n+\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, actual);\n+\n+\t\treturn 0;\n+\t}\n+\n+\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, actual, expected);\n+\n+\treturn 1;\n+}\n+\n+void\n lws_cmdline_option_handle_builtin(int argc, const char **argv,\n \t\t\t\t struct lws_context_creation_info *info)\n {\n@@ -1438,6 +1510,25 @@ lws_cmdline_option_handle_builtin(int argc, const char **argv,\n \t\t\tlogs \u003d m;\n \t\t\tbreak;\n \n+#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tcase OPT_SSPROXY_PORT:\n+\t\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t\t * tcp connection to this port */\n+\t\t\tinfo-\u003ess_proxy_port \u003d (uint16_t)atoi(p);\n+\t\t\tbreak;\n+\n+\t\tcase OPT_SSPROXY_IFACE:\n+\t\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t\t * path; when -p given this can specify the network interface\n+\t\t\t * to bind to */\n+\t\t\tinfo-\u003ess_proxy_bind \u003d p;\n+\t\t\tbreak;\n+\n+\t\tcase OPT_SSPROXY_ADS:\n+\t\t\tinfo-\u003ess_proxy_address \u003d p;\n+\t\t\tbreak;\n+#endif\n+\n \t\tcase OPT_FAULTINJECTION:\n #if !defined(LWS_WITH_SYS_FAULT_INJECTION)\n \t\t\tlwsl_err(\u0022%s: FAULT_INJECTION not built\u005cn\u0022, __func__);\ndiff --git a/lib/core/private-lib-core.h b/lib/core/private-lib-core.h\nindex 71ed780..1914190 100644\n--- a/lib/core/private-lib-core.h\n+++ b/lib/core/private-lib-core.h\n@@ -735,6 +735,7 @@ struct lws_context {\n \tchar\t\ttls_gate_accepts;\n \n \tunsigned int deprecated:1;\n+\tunsigned int interrupted:1;\n \tunsigned int inside_context_destroy:1;\n \tunsigned int being_destroyed:1;\n \tunsigned int service_no_longer_possible:1;\ndiff --git a/lib/secure-streams/policy-json.c b/lib/secure-streams/policy-json.c\nindex 3427ae6..cf742a2 100644\n--- a/lib/secure-streams/policy-json.c\n+++ b/lib/secure-streams/policy-json.c\n@@ -395,6 +395,7 @@ lws_ss_policy_parser_cb(struct lejp_ctx *ctx, char reason)\n \t\t * The struct *x is in the lwsac... the ca_der it points to\n \t\t * is individually allocated from the heap\n \t\t */\n+\n \t\ta-\u003ecurr[LTY_X509].x-\u003eca_der \u003d lws_malloc((unsigned int)a-\u003ecount, \u0022ssx509\u0022);\n \t\tif (!a-\u003ecurr[LTY_X509].x-\u003eca_der)\n \t\t\tgoto oom;\n@@ -1168,7 +1169,7 @@ lws_ss_policy_parse_abandon(struct lws_context *context)\n {\n \tstruct policy_cb_args *args \u003d (struct policy_cb_args *)context-\u003epol_args;\n \tlws_ss_x509_t *x;\n-\n+lwsl_notice(\u0022%s\u005cn\u0022, __func__);\n \tx \u003d args-\u003eheads[LTY_X509].x;\n \twhile (x) {\n \t\t/*\n@@ -1206,8 +1207,10 @@ lws_ss_policy_parse_file(struct lws_context *cx, const char *filepath)\n \tuint8_t buf[512];\n \tint n, m, fd \u003d lws_open(filepath, LWS_O_RDONLY);\n \n-\tif (fd \u003c 0)\n+\tif (fd \u003c 0) {\n+\t\tlwsl_cx_err(cx, \u0022Unable to open policy '%s'\u0022, filepath);\n \t\treturn LEJP_REJECT_UNKNOWN;\n+\t}\n \n \tdo {\n \t\tn \u003d (int)read(fd, buf, sizeof(buf));\ndiff --git a/lib/secure-streams/protocols/ss-h1.c b/lib/secure-streams/protocols/ss-h1.c\nindex 73cc256..9d8e644 100644\n--- a/lib/secure-streams/protocols/ss-h1.c\n+++ b/lib/secure-streams/protocols/ss-h1.c\n@@ -549,7 +549,7 @@ secstream_h1(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n \t\tif (h-\u003ess_dangling_connected) {\n \t\t\t/* already disconnected, no action for DISCONNECT_ME */\n \t\t\tr \u003d lws_ss_event_helper(h, LWSSSCS_DISCONNECTED);\n-\t\t\tif (r !\u003d LWSSSSRET_OK)\n+\t\t\tif (r \u003d\u003d LWSSSSRET_DESTROY_ME)\n \t\t\t\treturn _lws_ss_handle_state_ret_CAN_DESTROY_HANDLE(r, wsi, \u0026h);\n \t\t}\n \t\tbreak;\n@@ -919,7 +919,7 @@ malformed:\n \tcase LWS_CALLBACK_CLIENT_HTTP_WRITEABLE:\n \n \t\tif (!h || !h-\u003einfo.tx) {\n-\t\t\tlwsl_notice(\u0022%s: no handle / tx\u005cn\u0022, __func__);\n+\t\t\tlwsl_debug(\u0022%s: no handle / tx\u005cn\u0022, __func__);\n \t\t\treturn 0;\n \t\t}\n \ndiff --git a/lib/secure-streams/secure-streams.c b/lib/secure-streams/secure-streams.c\nindex 4f25a8a..6bf1964 100644\n--- a/lib/secure-streams/secure-streams.c\n+++ b/lib/secure-streams/secure-streams.c\n@@ -433,6 +433,7 @@ lws_ss_event_helper(lws_ss_handle_t *h, lws_ss_constate_t cs)\n \t\t\tcs \u003d\u003d LWSSSCS_UNREACHABLE \u0026\u0026\n \t\t\th-\u003ewsi \u0026\u0026 h-\u003ewsi-\u003edns_reachability);\n \t\th-\u003eh_in_svc \u003d NULL;\n+\n #if defined(LWS_WITH_SERVER)\n \t\tif ((h-\u003einfo.flags \u0026 LWSSSINFLAGS_ACCEPTED) \u0026\u0026\n \t\t cs \u003d\u003d LWSSSCS_DISCONNECTED)\n@@ -1502,7 +1503,7 @@ lws_ss_destroy(lws_ss_handle_t **ppss)\n #endif\n \n #if defined(LWS_WITH_SERVER)\n-\tif (v)\n+\tif (v \u0026\u0026 (h-\u003einfo.flags \u0026 LWSSSINFLAGS_SERVER))\n \t\t/*\n \t\t * For server, the policy describes a vhost that implements the\n \t\t * server, when we take down the ss, we take down the related\ndiff --git a/lib/secure-streams/serialized/client/sspc-transport.c b/lib/secure-streams/serialized/client/sspc-transport.c\nindex 9fe4b34..a689b89 100644\n--- a/lib/secure-streams/serialized/client/sspc-transport.c\n+++ b/lib/secure-streams/serialized/client/sspc-transport.c\n@@ -173,9 +173,6 @@ lws_sspc_txp_event_closed(lws_transport_priv_t priv)\n \tlws_sspc_handle_t *h \u003d (lws_sspc_handle_t *)priv;\n \tlws_ss_state_return_t r \u003d LWSSSSRET_OK;\n \n-\n-\tlwsl_sspc_notice(h, \u0022entry\u0022);\n-\n \tif (!h) {\n \t\tlwsl_sspc_info(h, \u0022No sspc on client proxy link close\u0022);\n \t\treturn LWSSSSRET_OK;\n@@ -275,7 +272,7 @@ lws_sspc_txp_tx(lws_sspc_handle_t *h, size_t metadata_limit)\n \t\t * We are negotating the opening of a particular\n \t\t * streamtype\n \t\t */\n-\t\tlwsl_sspc_notice(h, \u0022LPCSCLI_SENDING_INITIAL_TX\u0022);\n+\t\t// lwsl_sspc_notice(h, \u0022LPCSCLI_SENDING_INITIAL_TX\u0022);\n \t\ttxl \u003d strlen(h-\u003essi.streamtype) + 1 + 4 + 4;\n \n \t\tcp \u003d s;\n@@ -297,7 +294,7 @@ lws_sspc_txp_tx(lws_sspc_handle_t *h, size_t metadata_limit)\n \n \tcase LPCSCLI_LOCAL_CONNECTED:\n \n-\t\tlwsl_sspc_notice(h, \u0022LPCSCLI_LOCAL_CONNECTED\u0022);\n+\t\t// lwsl_sspc_notice(h, \u0022LPCSCLI_LOCAL_CONNECTED\u0022);\n \n \t\t/*\n \t\t * Do we need to prioritize sending any metadata\ndiff --git a/lib/secure-streams/serialized/client/sspc.c b/lib/secure-streams/serialized/client/sspc.c\nindex 1f454ec..8586615 100644\n--- a/lib/secure-streams/serialized/client/sspc.c\n+++ b/lib/secure-streams/serialized/client/sspc.c\n@@ -339,8 +339,8 @@ lws_sspc_create(struct lws_context *context, int tsi, const lws_ss_info_t *ssi,\n \n \t/* priv_onw filled in by onw transport */\n \n-\tlwsl_sspc_notice(h, \u0022txp path %s -\u003e %s\u0022, h-\u003etxp_path.ops_in-\u003ename,\n-\t\t\t\t\t\t h-\u003etxp_path.ops_onw-\u003ename);\n+\tlwsl_sspc_info(h, \u0022txp path %s -\u003e %s\u0022, h-\u003etxp_path.ops_in-\u003ename,\n+\t\t\t\t\t h-\u003etxp_path.ops_onw-\u003ename);\n \n \tmemcpy(\u0026h-\u003essi, ssi, sizeof(*ssi));\n \tua \u003d (uint8_t *)\u0026h[1];\n@@ -502,7 +502,7 @@ lws_sspc_request_tx(lws_sspc_handle_t *h)\n \tif (!h-\u003eus_earliest_write_req)\n \t\th-\u003eus_earliest_write_req \u003d lws_now_usecs();\n \n-\tlwsl_notice(\u0022%s: state %u, conn_req_state %u\u005cn\u0022, __func__,\n+\tlwsl_info(\u0022%s: state %u, conn_req_state %u\u005cn\u0022, __func__,\n \t\t\t(unsigned int)h-\u003estate,\n \t\t\t(unsigned int)h-\u003econn_req_state);\n \n@@ -697,6 +697,14 @@ _lws_sspc_set_metadata(struct lws_sspc_handle *h, const char *name,\n \treturn 0;\n }\n \n+void\n+lws_sspc_server_ack(struct lws_sspc_handle *h, int nack)\n+{\n+\t//h-\u003etxn_resp \u003d nack;\n+\t//h-\u003etxn_resp_set \u003d 1;\n+\n+}\n+\n int\n lws_sspc_set_metadata(struct lws_sspc_handle *h, const char *name,\n \t\t const void *value, size_t len)\ndiff --git a/lib/tls/tls-network.c b/lib/tls/tls-network.c\nindex b2038d5..8c9448f 100644\n--- a/lib/tls/tls-network.c\n+++ b/lib/tls/tls-network.c\n@@ -201,11 +201,11 @@ lws_gate_accepts(struct lws_context *context, int on)\n {\n \tstruct lws_vhost *v \u003d context-\u003evhost_list;\n \n-\tlwsl_notice(\u0022%s: on \u003d %d\u005cn\u0022, __func__, on);\n-\n \tif (context-\u003etls_gate_accepts \u003d\u003d (char)on)\n \t\treturn 0;\n \n+\tlwsl_notice(\u0022%s: on \u003d %d\u005cn\u0022, __func__, on);\n+\n \tcontext-\u003etls_gate_accepts \u003d (char)on;\n \n \twhile (v) {\ndiff --git a/minimal-examples-lowlevel/CMakeLists.txt b/minimal-examples-lowlevel/CMakeLists.txt\nnew file mode 100644\nindex 0000000..54696b5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/CMakeLists.txt\n@@ -0,0 +1,50 @@\n+#\n+# libwebsockets - small server side websockets and web server implementation\n+#\n+# Copyright (C) 2010 - 2021 Andy Green \u003candy@warmcat.com\u003e\n+#\n+# Permission is hereby granted, free of charge, to any person obtaining a copy\n+# of this software and associated documentation files (the \u0022Software\u0022), to\n+# deal in the Software without restriction, including without limitation the\n+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n+# sell copies of the Software, and to permit persons to whom the Software is\n+# furnished to do so, subject to the following conditions:\n+#\n+# The above copyright notice and this permission notice shall be included in\n+# all copies or substantial portions of the Software.\n+#\n+# THE SOFTWARE IS PROVIDED \u0022AS IS\u0022, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n+# IN THE SOFTWARE.\n+\n+MACRO(SUBDIRLIST result curdir)\n+ FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)\n+ SET(dirlist \u0022\u0022)\n+\n+ FOREACH(child ${children})\n+ IF (IS_DIRECTORY ${curdir}/${child})\n+\tLIST(APPEND dirlist ${child})\n+ ENDIF()\n+ ENDFOREACH()\n+\n+ SET(${result} ${dirlist})\n+ENDMACRO()\n+\n+include_directories(${LWS_LIB_BUILD_INC_PATHS})\n+link_libraries(${LIB_LIST_AT_END})\n+\n+SUBDIRLIST(SUBDIRS \u0022${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel\u0022)\n+FOREACH(subdir ${SUBDIRS})\n+\n+\tSUBDIRLIST(SUBDIRS2 \u0022${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel/${subdir}\u0022)\n+\tFOREACH(subdir2 ${SUBDIRS2})\n+\t\tif (EXISTS \u0022${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel/${subdir}/${subdir2}/CMakeLists.txt\u0022)\n+\t\t\tmessage(\u0022Processing ${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel/${subdir}/${subdir2}\u0022)\n+\t\t\tadd_subdirectory(\u0022${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel/${subdir}/${subdir2}\u0022)\n+\t\tendif()\n+\tENDFOREACH()\n+ENDFOREACH()\ndiff --git a/minimal-examples-lowlevel/README.md b/minimal-examples-lowlevel/README.md\nnew file mode 100644\nindex 0000000..97d9881\n--- /dev/null\n+++ b/minimal-examples-lowlevel/README.md\n@@ -0,0 +1,100 @@\n+## minimal-examples-lowlevel\n+\n+These are the traditional lws low-level, wsi-based examples.\n+\n+`./minimal-examples` contains higher-level, Secure Stream based examples for a\n+growing subset of these cases. New users may find it easier to use those higher-\n+level examples for the (common) cases they cover.\n+\n+These lowlevel apis are not going anywhere, the higher level stuff uses them\n+to get stuff done itself. \n+\n+|name|demonstrates|\n+---|---\n+client-server|Minimal examples providing client and server connections simultaneously\n+crypto|Minimal examples related to using lws crypto apis\n+dbus-server|Minimal examples showing how to integrate DBUS into lws event loop\n+http-client|Minimal examples providing an http client\n+http-server|Minimal examples providing an http server\n+raw|Minimal examples related to adopting raw file or socket descriptors into the event loop\n+secure-streams|Minimal examples related to the Secure Streams client api\n+ws-client|Minimal examples providing a ws client\n+ws-server|Minimal examples providing a ws server (and an http server)\n+\n+## FAQ\n+\n+### Getting started\n+\n+Build and install lws itself first (note that after installing lws on \u005c*nix, you need to run `ldconfig` one time so the OS can learn about the new library. Lws installs in `/usr/local` by default, Debian / Ubuntu ldconfig knows to look there already, but Fedora / CentOS need you to add the line `/usr/local/lib` to `/etc/ld.so.conf` and run ldconfig)\n+\n+Then start with the simplest:\n+\n+`http-server/minimal-http-server`\n+\n+### Why are most of the sources split into a main C file file and a protocol file?\n+\n+Lws supports three ways to implement the protocol callback code:\n+\n+ - you can just add it all in the same source file\n+\n+ - you can separate it as these examples do, and #include it\n+ into the main sources\n+\n+ - you can build it as a standalone plugin that is discovered\n+ and loaded at runtime.\n+\n+The way these examples are structured, you can easily also build\n+the protocol callback as a plugin just with a different\n+CMakeLists.txt... see https://github.com/warmcat/libwebsockets/tree/master/plugin-standalone\n+for an example.\n+\n+### Why would we want the protocol as a plugin?\n+\n+You will notice a lot of the main C code is the same boilerplate\n+repeated for each example. The actual interesting part is in\n+the protocol callback only.\n+\n+Lws provides (-DLWS_WITH_LWSWS\u003d1) a generic lightweight server app called 'lwsws' that\n+can be configured by JSON. Combined with your protocol as a plugin,\n+it means you don't actually have to make a special server \u0022app\u0022\n+part, you can just use lwsws and pass per-vhost configuration\n+from JSON into your protocol. (Of course in some cases you have\n+an existing app you are bolting lws on to, then you don't care\n+about this for that particular case).\n+\n+Because lwsws has no dependency on whatever your plugin does, it\n+can mix and match different protocols randomly without needing any code\n+changes. It reduces the size of the task to just writing the\n+code you care about in your protocol handler, and nothing else to write\n+or maintain.\n+\n+Lwsws supports advanced features like reload, where it starts a new server\n+instance with changed config or different plugins, while keeping the old\n+instance around until the last connection to it closes.\n+\n+### I get why there is a pss, but why is there a vhd?\n+\n+The pss is instantiated per-connection. But there are almost always\n+other variables that have a lifetime longer than a single connection.\n+\n+You could make these variables \u0022filescope\u0022 one-time globals, but that\n+means your protocol cannot instantiate multiple times.\n+\n+Lws supports vhosts (virtual hosts), for example both https://warmcat.com\n+and https://libwebsockets are running on the same lwsws instance on the\n+same server and same IP... each of these is a separate vhost.\n+\n+Your protocol may be enabled on multiple vhosts, each of these vhosts\n+provides a different vhd specific to the protocol instance on that\n+vhost. For example many of the samples keep a linked-list head to\n+a list of live pss in the vhd... that means it's cleanly a list of\n+pss opened **on that vhost**. If another vhost has the protocol\n+enabled, connections to that will point to a different vhd, and the\n+linked-list head on that vhd will only list connections to his vhost.\n+\n+The example \u0022ws-server/minimal-ws-server-threads\u0022 demonstrates how to deliver\n+external configuration data to a specific vhost + protocol\n+combination using code. In lwsws, this is simply a matter of setting\n+the desired JSON config.\n+\n+\ndiff --git a/minimal-examples-lowlevel/abstract/protocols/smtp-client/CMakeLists.txt b/minimal-examples-lowlevel/abstract/protocols/smtp-client/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5264313\n--- /dev/null\n+++ b/minimal-examples-lowlevel/abstract/protocols/smtp-client/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-api-test-smtp_client C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-smtp_client)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SMTP 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/abstract/protocols/smtp-client/README.md b/minimal-examples-lowlevel/abstract/protocols/smtp-client/README.md\nnew file mode 100644\nindex 0000000..a3b3d01\n--- /dev/null\n+++ b/minimal-examples-lowlevel/abstract/protocols/smtp-client/README.md\n@@ -0,0 +1,29 @@\n+# lws api test smtp client\n+\n+Demonstrates how to send email through your local MTA\n+\n+## build\n+\n+Requires lws was built with `-DLWS_WITH_SMTP\u003d1` at cmake.\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-r \u003crecipient@whatever.com\u003e|Send the test email to this email address\n+\n+\n+```\n+ $ ./lws-api-test-smtp_client -r andy@warmcat.com\n+[2019/04/17 05:12:06:5293] USER: LWS API selftest: SMTP client\n+[2019/04/17 05:12:06:5635] NOTICE: LGSSMTP_IDLE: connecting to 127.0.0.1:25\n+[2019/04/17 05:12:06:6238] NOTICE: email_sent_or_failed: sent OK\n+[2019/04/17 05:12:06:6394] USER: Completed: PASS\n+\n+```\n+\ndiff --git a/minimal-examples-lowlevel/abstract/protocols/smtp-client/main.c b/minimal-examples-lowlevel/abstract/protocols/smtp-client/main.c\nnew file mode 100644\nindex 0000000..d21c4ea\n--- /dev/null\n+++ b/minimal-examples-lowlevel/abstract/protocols/smtp-client/main.c\n@@ -0,0 +1,126 @@\n+/*\n+ * lws-api-test-smtp_client\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, result \u003d 1;\n+static const char *recip;\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static int\n+done_cb(struct lws_smtp_email *email, void *buf, size_t len)\n+{\n+\t/* you could examine email-\u003edata here */\n+\tif (buf) {\n+\t\tchar dotstar[96];\n+\t\tlws_strnncpy(dotstar, (const char *)buf, len, sizeof(dotstar));\n+\t\tlwsl_notice(\u0022%s: %s\u005cn\u0022, __func__, dotstar);\n+\t} else\n+\t\tlwsl_notice(\u0022%s:\u005cn\u0022, __func__);\n+\n+\t/* destroy any allocations in email */\n+\n+\tfree((char *)email-\u003epayload);\n+\n+\tresult \u003d 0;\n+\tinterrupted \u003d 1;\n+\n+\treturn 0;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tlws_smtp_sequencer_args_t ss_args;\n+\tstruct lws_context *context;\n+\tlws_smtp_sequencer_t *sseq;\n+\tlws_smtp_email_t *email;\n+\tstruct lws_vhost *vh;\n+\tchar payload[2048];\n+\tconst char *p;\n+\n+\t/* the normal lws init */\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tp \u003d lws_cmdline_option(argc, argv, \u0022-r\u0022);\n+\tif (!p) {\n+\t\tlwsl_err(\u0022-r \u003crecipient email\u003e is required\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\trecip \u003d p;\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: SMTP client\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tvh \u003d lws_create_vhost(context, \u0026info);\n+\tif (!vh) {\n+\t\tlwsl_err(\u0022Failed to create first vhost\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\tmemset(\u0026ss_args, 0, sizeof(ss_args));\n+\tss_args.helo \u003d \u0022lws-abs-smtp-test\u0022;\n+\tss_args.vhost \u003d vh;\n+\n+\tsseq \u003d lws_smtp_sequencer_create(\u0026ss_args);\n+\tif (!sseq) {\n+\t\tlwsl_err(\u0022%s: smtp sequencer create failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* attach an email to it */\n+\n+\tn \u003d lws_snprintf(payload, sizeof(payload),\n+\t\t\t\u0022From: noreply@example.com\u005cn\u0022\n+\t\t\t\u0022To: %s\u005cn\u0022\n+\t\t\t\u0022Subject: Test email for lws smtp-client\u005cn\u0022\n+\t\t\t\u0022\u005cn\u0022\n+\t\t\t\u0022Hello this was an api test for lws smtp-client\u005cn\u0022\n+\t\t\t\u0022\u005cr\u005cn.\u005cr\u005cn\u0022, recip);\n+\n+\tif (lws_smtpc_add_email(sseq, payload, n, \u0022testserver\u0022,\n+\t\t\t\t\u0022andy@warmcat.com\u0022, recip, NULL, done_cb)) {\n+\t\tlwsl_err(\u0022%s: failed to add email\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* the usual lws event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail1:\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, result ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/README.md b/minimal-examples-lowlevel/api-tests/README.md\nnew file mode 100644\nindex 0000000..a28df4f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/README.md\n@@ -0,0 +1,12 @@\n+These are buildable test apps that run in CI to confirm correct api operation.\n+\n+|name|tests|\n+---|---\n+api-test-lwsac|LWS Allocated Chunks api\n+api-test-lws_struct-json|Selftests for lws_struct JSON serialization and deserialization\n+api-test-lws_tokenize|Generic secure string tokenizer api\n+api-test-fts|LWS Full-text Search api\n+api-test-gencrypto|LWS Generic Crypto apis\n+api-test-jose|LWS JOSE apis\n+api-test-smtp_client|SMTP client for sending emails\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-async-dns/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-async-dns/CMakeLists.txt\nnew file mode 100644\nindex 0000000..6deade9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-async-dns/CMakeLists.txt\n@@ -0,0 +1,30 @@\n+project(lws-api-test-async-dns C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-async-dns)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SYS_ASYNC_DNS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\tadd_test(NAME api-test-async-dns COMMAND lws-api-test-async-dns)\n+\tset_tests_properties(api-test-async-dns\n+\t\t\t PROPERTIES\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/api-tests/api-test-async-dns\n+\t\t\t TIMEOUT 60)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-async-dns/main.c b/minimal-examples-lowlevel/api-tests/api-test-async-dns/main.c\nnew file mode 100644\nindex 0000000..4af79d3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-async-dns/main.c\n@@ -0,0 +1,372 @@\n+/*\n+ * lws-api-test-async-dns\n+ *\n+ * Written in 2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This api test confirms various kinds of async dns apis\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, dtest, ok, fail, _exp \u003d 26;\n+struct lws_context *context;\n+\n+/*\n+ * These are used to test the apis to parse and print ipv4 / ipv6 literal\n+ * address strings for various cases.\n+ *\n+ * Expected error cases are not used to test the ip data -\u003e string api.\n+ */\n+\n+static const struct ipparser_tests {\n+\tconst char\t*test;\n+\tint\t\trlen;\n+\tconst char\t*emit_test;\n+\tint\t\temit_len;\n+\tuint8_t\t\tb[16];\n+} ipt[] \u003d {\n+\t{ \u00222001:db8:85a3:0:0:8a2e:370:7334\u0022, 16,\n+\t \u00222001:db8:85a3::8a2e:370:7334\u0022, 28,\n+\t\t{ 0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00,\n+\t\t 0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34 } },\n+\n+\t{ \u00222001:db8:85a3::8a2e:370:7334\u0022, 16,\n+\t \u00222001:db8:85a3::8a2e:370:7334\u0022, 28,\n+\t\t{ 0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00,\n+\t\t 0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34 } },\n+\n+\t{ \u0022::1\u0022, 16, \u0022::1\u0022, 3,\n+\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n+\n+\t{ \u0022::\u0022, 16, \u0022::\u0022, 2,\n+\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },\n+\n+\t{ \u0022::ffff:192.0.2.128\u0022, 16, \u0022::ffff:192.0.2.128\u0022, 18,\n+\t\t{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x02, 0x80 } },\n+\n+\t{ \u0022cats\u0022, -1, \u0022\u0022, 0,\n+\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n+\n+\t{ \u0022onevalid.bogus.warmcat.com\u0022, -1, \u0022\u0022, 0,\n+\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n+\n+\t{ \u00221.cat.dog.com\u0022, -1, \u0022\u0022, 0,\n+\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n+\n+\t{ \u0022:::1\u0022, -8, \u0022\u0022, 0,\n+\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n+\n+\t{ \u00220:0::0:1\u0022, 16, \u0022::1\u0022, 3,\n+\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n+\n+\t{ \u00221.2.3.4\u0022, 4, \u00221.2.3.4\u0022, 7, { 1, 2, 3, 4 } },\n+};\n+\n+static const struct async_dns_tests {\n+\tconst char *dns_name;\n+\tint recordtype;\n+\tint addrlen;\n+\tuint8_t ads[16];\n+} adt[] \u003d {\n+\t{ \u0022warmcat.com\u0022, LWS_ADNS_RECORD_A, 4,\n+\t\t{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n+\t{ \u0022libwebsockets.org\u0022, LWS_ADNS_RECORD_A, 4,\n+\t\t{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n+\t{ \u0022doesntexist\u0022, LWS_ADNS_RECORD_A, 0,\n+\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n+\t{ \u0022localhost\u0022, LWS_ADNS_RECORD_A, 4,\n+\t\t{ 127, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n+\t{ \u0022ipv4only.warmcat.com\u0022, LWS_ADNS_RECORD_A, 4,\n+\t\t{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n+\t{ \u0022onevalid.bogus.warmcat.com\u0022, LWS_ADNS_RECORD_A, 4,\n+\t\t{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n+#if defined(LWS_WITH_IPV6)\n+\t{ \u0022warmcat.com\u0022, LWS_ADNS_RECORD_AAAA, 16, /* check ipv6 */\n+\t\t{ 0x20, 0x01, 0x41, 0xd0, 0x00, 0x02, 0xee, 0x93,\n+\t\t\t\t0, 0, 0, 0, 0, 0, 0, 1, } },\n+\t{ \u0022ipv6only.warmcat.com\u0022, LWS_ADNS_RECORD_AAAA, 16, /* check ipv6 */\n+\t\t{ 0x20, 0x01, 0x41, 0xd0, 0x00, 0x02, 0xee, 0x93,\n+\t\t\t\t0, 0, 0, 0, 0, 0, 0, 1, } },\n+#endif\n+};\n+\n+static lws_sorted_usec_list_t sul;\n+\n+struct lws *\n+cb1(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,\n+ void *opaque);\n+\n+static void\n+next_test_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tint m;\n+\n+\tlwsl_notice(\u0022%s: querying %s\u005cn\u0022, __func__, adt[dtest].dns_name);\n+\n+\tm \u003d lws_async_dns_query(context, 0,\n+\t\t\t\tadt[dtest].dns_name,\n+\t\t\t\t(adns_query_type_t)adt[dtest].recordtype, cb1, NULL,\n+\t\t\t\tcontext);\n+\tif (m !\u003d LADNS_RET_CONTINUING \u0026\u0026 m !\u003d LADNS_RET_FOUND \u0026\u0026 m !\u003d LADNS_RET_FAILED_WSI_CLOSED) {\n+\t\tlwsl_err(\u0022%s: adns 1: %s failed: %d\u005cn\u0022, __func__, adt[dtest].dns_name, m);\n+\t\tinterrupted \u003d 1;\n+\t}\n+}\n+\n+struct lws *\n+cb1(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,\n+ void *opaque)\n+{\n+\tconst struct addrinfo *ac \u003d a;\n+\tint ctr \u003d 0, alen;\n+\tuint8_t *addr;\n+\tchar buf[64];\n+\n+\tdtest++;\n+\n+\tif (!ac)\n+\t\tlwsl_warn(\u0022%s: no results\u005cn\u0022, __func__);\n+\n+\t/* dump the results */\n+\n+\twhile (ac) {\n+\t\tif (ac-\u003eai_family \u003d\u003d AF_INET) {\n+\t\t\taddr \u003d (uint8_t *)\u0026(((struct sockaddr_in *)\n+\t\t\t\t\tac-\u003eai_addr)-\u003esin_addr.s_addr);\n+\t\t\talen \u003d 4;\n+\t\t} else {\n+\t\t\taddr \u003d (uint8_t *)\u0026(((struct sockaddr_in6 *)\n+\t\t\t\t\tac-\u003eai_addr)-\u003esin6_addr.s6_addr);\n+\t\t\talen \u003d 16;\n+\t\t}\n+\t\tstrcpy(buf, \u0022unknown\u0022);\n+\t\tlws_write_numeric_address(addr, alen, buf, sizeof(buf));\n+\n+\t\tlwsl_warn(\u0022%s: %d: %s %d %s\u005cn\u0022, __func__, ctr++, ads, alen, buf);\n+\n+\t\tac \u003d ac-\u003eai_next;\n+\t}\n+\n+\tac \u003d a;\n+\twhile (ac) {\n+\t\tif (ac-\u003eai_family \u003d\u003d AF_INET) {\n+\t\t\taddr \u003d (uint8_t *)\u0026(((struct sockaddr_in *)\n+\t\t\t\t\tac-\u003eai_addr)-\u003esin_addr.s_addr);\n+\t\t\talen \u003d 4;\n+\t\t} else {\n+#if defined(LWS_WITH_IPV6)\n+\t\t\taddr \u003d (uint8_t *)\u0026(((struct sockaddr_in6 *)\n+\t\t\t\t\tac-\u003eai_addr)-\u003esin6_addr.s6_addr);\n+\t\t\talen \u003d 16;\n+#else\n+\t\t\tgoto again;\n+#endif\n+\t\t}\n+\t\tif (alen \u003d\u003d adt[dtest - 1].addrlen \u0026\u0026\n+\t\t !memcmp(adt[dtest - 1].ads, addr, (unsigned int)alen)) {\n+\t\t\tok++;\n+\t\t\tgoto next;\n+\t\t}\n+#if !defined(LWS_WITH_IPV6)\n+again:\n+#endif\n+\t\tac \u003d ac-\u003eai_next;\n+\t}\n+\n+\t/* testing for NXDOMAIN? */\n+\n+\tif (!a \u0026\u0026 !adt[dtest - 1].addrlen) {\n+\t\tok++;\n+\t\tgoto next;\n+\t}\n+\n+\tlwsl_err(\u0022%s: dns test %d: no match\u005cn\u0022, __func__, dtest);\n+\tfail++;\n+\n+next:\n+\tlws_async_dns_freeaddrinfo(\u0026a);\n+\tif (dtest \u003d\u003d (int)LWS_ARRAY_SIZE(adt))\n+\t\tinterrupted \u003d 1;\n+\telse\n+\t\tlws_sul_schedule(context, 0, \u0026sul, next_test_cb, 1);\n+\n+\treturn NULL;\n+}\n+\n+static lws_sorted_usec_list_t sul_l;\n+\n+struct lws *\n+cb_loop(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,\n+\t\tvoid *opaque)\n+{\n+\tif (!a) {\n+\t\tlwsl_err(\u0022%s: no results\u005cn\u0022, __func__);\n+\t\treturn NULL;\n+\t}\n+\n+\tlwsl_notice(\u0022%s: addrinfo %p\u005cn\u0022, __func__, a);\u005c\n+\tlws_async_dns_freeaddrinfo(\u0026a);\n+\n+\treturn NULL;\n+}\n+\n+\n+static void\n+sul_retry_l(struct lws_sorted_usec_list *sul)\n+{\n+\tint m;\n+\n+\tlwsl_user(\u0022%s: starting new query\u005cn\u0022, __func__);\n+\n+\tm \u003d lws_async_dns_query(context, 0, \u0022warmcat.com\u0022,\n+\t\t\t\t (adns_query_type_t)LWS_ADNS_RECORD_A,\n+\t\t\t\t cb_loop, NULL, context);\n+\tswitch (m) {\n+\tcase LADNS_RET_FAILED_WSI_CLOSED:\n+\t\tlwsl_warn(\u0022%s: LADNS_RET_FAILED_WSI_CLOSED \u0022\n+\t\t\t \u0022(\u003d\u003d from cache / success in this test)\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LADNS_RET_NXDOMAIN:\n+\t\tlwsl_warn(\u0022%s: LADNS_RET_NXDOMAIN\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LADNS_RET_TIMEDOUT:\n+\t\tlwsl_warn(\u0022%s: LADNS_RET_TIMEDOUT\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LADNS_RET_FAILED:\n+\t\tlwsl_warn(\u0022%s: LADNS_RET_FAILED\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LADNS_RET_FOUND:\n+\t\tlwsl_warn(\u0022%s: LADNS_RET_FOUND\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LADNS_RET_CONTINUING:\n+\t\tlwsl_warn(\u0022%s: LADNS_RET_CONTINUING\u005cn\u0022, __func__);\n+\t\tbreak;\n+\t}\n+\n+\tlws_sul_schedule(context, 0, \u0026sul_l, sul_retry_l, 5 * LWS_US_PER_SEC);\n+}\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tint n \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\n+\t/* the normal lws init */\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: Async DNS\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n+\t\tlws_sul_schedule(context, 0, \u0026sul_l, sul_retry_l, LWS_US_PER_SEC);\n+\t\tgoto evloop;\n+\t}\n+\n+\n+\t/* ip address parser tests */\n+\n+\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(ipt); n++) {\n+\t\tuint8_t u[16];\n+\t\tint m \u003d lws_parse_numeric_address(ipt[n].test, u, sizeof(u));\n+\n+\t\tif (m !\u003d ipt[n].rlen) {\n+\t\t\tlwsl_err(\u0022%s: fail %s ret %d\u005cn\u0022,\n+\t\t\t\t\t__func__, ipt[n].test, m);\n+\t\t\tfail++;\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tif (m \u003e 0) {\n+\t\t\tif (memcmp(ipt[n].b, u, (unsigned int)m)) {\n+\t\t\t\tlwsl_err(\u0022%s: fail %s compare\u005cn\u0022, __func__,\n+\t\t\t\t\t\tipt[n].test);\n+\t\t\t\tlwsl_hexdump_notice(u, (unsigned int)m);\n+\t\t\t\tfail++;\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\t\t}\n+\t\tok++;\n+\t}\n+\n+\t/* ip address formatter tests */\n+\n+\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(ipt); n++) {\n+\t\tchar buf[64];\n+\t\tint m;\n+\n+\t\t/* don't attempt to reverse the ones that are meant to fail */\n+\t\tif (ipt[n].rlen \u003c 0)\n+\t\t\tcontinue;\n+\n+\t\tm \u003d lws_write_numeric_address(ipt[n].b, ipt[n].rlen, buf,\n+\t\t\t\t\t\tsizeof(buf));\n+\t\tif (m !\u003d ipt[n].emit_len) {\n+\t\t\tlwsl_err(\u0022%s: fail %s ret %d\u005cn\u0022,\n+\t\t\t\t\t__func__, ipt[n].emit_test, m);\n+\t\t\tfail++;\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tif (m \u003e 0) {\n+\t\t\tif (strcmp(ipt[n].emit_test, buf)) {\n+\t\t\t\tlwsl_err(\u0022%s: fail %s compare\u005cn\u0022, __func__,\n+\t\t\t\t\t\tipt[n].test);\n+\t\t\t\tlwsl_hexdump_notice(buf, (unsigned int)m);\n+\t\t\t\tfail++;\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\t\t}\n+\t\tok++;\n+\t}\n+\n+#if !defined(LWS_WITH_IPV6)\n+\t_exp -\u003d 2;\n+#endif\n+\n+\t/* kick off the async dns tests */\n+\n+\tlws_sul_schedule(context, 0, \u0026sul, next_test_cb, 1);\n+\n+evloop:\n+\t/* the usual lws event loop */\n+\n+\tn \u003d 1;\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tif (fail || ok !\u003d _exp)\n+\t\tlwsl_user(\u0022Completed: PASS: %d / %d, FAIL: %d\u005cn\u0022, ok, _exp,\n+\t\t\t\tfail);\n+\telse\n+\t\tlwsl_user(\u0022Completed: ALL PASS: %d / %d\u005cn\u0022, ok, _exp);\n+\n+\treturn !(ok \u003d\u003d _exp \u0026\u0026 !fail);\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-cose/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-cose/CMakeLists.txt\nnew file mode 100644\nindex 0000000..bd6b142\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-cose/CMakeLists.txt\n@@ -0,0 +1,29 @@\n+project(lws-api-test-cose C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-cose)\n+set(SRCS main.c keys.c sign.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_COSE 1 requirements)\n+require_lws_config(LWS_WITH_CBOR 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (NOT (LWS_WITH_MBEDTLS AND NOT LWS_HAVE_mbedtls_internal_aes_encrypt))\n+\t\tadd_test(NAME api-test-cose COMMAND lws-api-test-cose)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-cose/README.md b/minimal-examples-lowlevel/api-tests/api-test-cose/README.md\nnew file mode 100644\nindex 0000000..74034c7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-cose/README.md\n@@ -0,0 +1,22 @@\n+# lws api test lwsac\n+\n+Demonstrates how to use and performs selftests for lwsac\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-lwsac\n+[2018/10/09 09:14:17:4834] USER: LWS API selftest: lwsac\n+[2018/10/09 09:14:17:4835] USER: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-cose/keys.c b/minimal-examples-lowlevel/api-tests/api-test-cose/keys.c\nnew file mode 100644\nindex 0000000..134784d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-cose/keys.c\n@@ -0,0 +1,931 @@\n+/*\n+ * lws-api-test-jose - RFC8152 cose_key tests\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Raw key CBOR created from descriptions at\n+ *\n+ * https://github.com/cose-wg/Examples/blob/master/KeySet.txt\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+static int\n+key_import_cb(struct lws_cose_key *s, void *user)\n+{\n+\tlwsl_notice(\u0022%s: key type %lld\u005cn\u0022, __func__, (long long)s-\u003ekty);\n+\n+\treturn 0;\n+}\n+\n+static const uint8_t\n+\tcose_key1[] \u003d {\n+\t\t\t0xa6, 0x01, 0x02, 0x02, 0x62,\n+\t\t\t0x31, 0x31, 0x20, 0x01, 0x21,\n+\t\t\t0x58, 0x20, 0xba, 0xc5, 0xb1,\n+\t\t\t0x1c, 0xad, 0x8f, 0x99, 0xf9,\n+\t\t\t0xc7, 0x2b, 0x05, 0xcf, 0x4b,\n+\t\t\t0x9e, 0x26, 0xd2, 0x44, 0xdc,\n+\t\t\t0x18, 0x9f, 0x74, 0x52, 0x28,\n+\t\t\t0x25, 0x5a, 0x21, 0x9a, 0x86,\n+\t\t\t0xd6, 0xa0, 0x9e, 0xff, 0x22,\n+\t\t\t0x58, 0x20, 0x20, 0x13, 0x8b,\n+\t\t\t0xf8, 0x2d, 0xc1, 0xb6, 0xd5,\n+\t\t\t0x62, 0xbe, 0x0f, 0xa5, 0x4a,\n+\t\t\t0xb7, 0x80, 0x4a, 0x3a, 0x64,\n+\t\t\t0xb6, 0xd7, 0x2c, 0xcf, 0xed,\n+\t\t\t0x6b, 0x6f, 0xb6, 0xed, 0x28,\n+\t\t\t0xbb, 0xfc, 0x11, 0x7e, 0x23,\n+\t\t\t0x58, 0x20, 0x57, 0xc9, 0x20,\n+\t\t\t0x77, 0x66, 0x41, 0x46, 0xe8,\n+\t\t\t0x76, 0x76, 0x0c, 0x95, 0x20,\n+\t\t\t0xd0, 0x54, 0xaa, 0x93, 0xc3,\n+\t\t\t0xaf, 0xb0, 0x4e, 0x30, 0x67,\n+\t\t\t0x05, 0xdb, 0x60, 0x90, 0x30,\n+\t\t\t0x85, 0x07, 0xb4, 0xd3 },\n+\tcose_key2[] \u003d {\n+\t\t\t0xa6, 0x01, 0x02, 0x02, 0x78,\n+\t\t\t0x24, 0x6d, 0x65, 0x72, 0x69,\n+\t\t\t0x61, 0x64, 0x6f, 0x63, 0x2e,\n+\t\t\t0x62, 0x72, 0x61, 0x6e, 0x64,\n+\t\t\t0x79, 0x62, 0x75, 0x63, 0x6b,\n+\t\t\t0x40, 0x62, 0x75, 0x63, 0x6b,\n+\t\t\t0x6c, 0x61, 0x6e, 0x64, 0x2e,\n+\t\t\t0x65, 0x78, 0x61, 0x6d, 0x70,\n+\t\t\t0x6c, 0x65, 0x20, 0x01, 0x21,\n+\t\t\t0x58, 0x20, 0x65, 0xed, 0xa5,\n+\t\t\t0xa1, 0x25, 0x77, 0xc2, 0xba,\n+\t\t\t0xe8, 0x29, 0x43, 0x7f, 0xe3,\n+\t\t\t0x38, 0x70, 0x1a, 0x10, 0xaa,\n+\t\t\t0xa3, 0x75, 0xe1, 0xbb, 0x5b,\n+\t\t\t0x5d, 0xe1, 0x08, 0xde, 0x43,\n+\t\t\t0x9c, 0x08, 0x55, 0x1d, 0x22,\n+\t\t\t0x58, 0x20, 0x1e, 0x52, 0xed,\n+\t\t\t0x75, 0x70, 0x11, 0x63, 0xf7,\n+\t\t\t0xf9, 0xe4, 0x0d, 0xdf, 0x9f,\n+\t\t\t0x34, 0x1b, 0x3d, 0xc9, 0xba,\n+\t\t\t0x86, 0x0a, 0xf7, 0xe0, 0xca,\n+\t\t\t0x7c, 0xa7, 0xe9, 0xee, 0xcd,\n+\t\t\t0x00, 0x84, 0xd1, 0x9c, 0x23,\n+\t\t\t0x58, 0x20, 0xaf, 0xf9, 0x07,\n+\t\t\t0xc9, 0x9f, 0x9a, 0xd3, 0xaa,\n+\t\t\t0xe6, 0xc4, 0xcd, 0xf2, 0x11,\n+\t\t\t0x22, 0xbc, 0xe2, 0xbd, 0x68,\n+\t\t\t0xb5, 0x28, 0x3e, 0x69, 0x07,\n+\t\t\t0x15, 0x4a, 0xd9, 0x11, 0x84,\n+\t\t\t0x0f, 0xa2, 0x08, 0xcf },\n+\n+\tcose_key3[] \u003d { 0xa3, 0x01, 0x04, 0x02, 0x6a,\n+\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n+\t\t\t0x20, 0x58, 0x20, 0x84, 0x9b,\n+\t\t\t0x57, 0x21, 0x9d, 0xae, 0x48,\n+\t\t\t0xde, 0x64, 0x6d, 0x07, 0xdb,\n+\t\t\t0xb5, 0x33, 0x56, 0x6e, 0x97,\n+\t\t\t0x66, 0x86, 0x45, 0x7c, 0x14,\n+\t\t\t0x91, 0xbe, 0x3a, 0x76, 0xdc,\n+\t\t\t0xea, 0x6c, 0x42, 0x71, 0x88 },\n+\n+\tcose_key4[] \u003d { 0xa6, 0x01, 0x02, 0x02, 0x78,\n+\t\t\t0x1e, 0x62, 0x69, 0x6c, 0x62,\n+\t\t\t0x6f, 0x2e, 0x62, 0x61, 0x67,\n+\t\t\t0x67, 0x69, 0x6e, 0x73, 0x40,\n+\t\t\t0x68, 0x6f, 0x62, 0x62, 0x69,\n+\t\t\t0x74, 0x6f, 0x6e, 0x2e, 0x65,\n+\t\t\t0x78, 0x61, 0x6d, 0x70, 0x6c,\n+\t\t\t0x65, 0x20, 0x03, 0x21, 0x58,\n+\t\t\t0x42, 0x00, 0x72, 0x99, 0x2c,\n+\t\t\t0xb3, 0xac, 0x08, 0xec, 0xf3,\n+\t\t\t0xe5, 0xc6, 0x3d, 0xed, 0xec,\n+\t\t\t0x0d, 0x51, 0xa8, 0xc1, 0xf7,\n+\t\t\t0x9e, 0xf2, 0xf8, 0x2f, 0x94,\n+\t\t\t0xf3, 0xc7, 0x37, 0xbf, 0x5d,\n+\t\t\t0xe7, 0x98, 0x66, 0x71, 0xea,\n+\t\t\t0xc6, 0x25, 0xfe, 0x82, 0x57,\n+\t\t\t0xbb, 0xd0, 0x39, 0x46, 0x44,\n+\t\t\t0xca, 0xaa, 0x3a, 0xaf, 0x8f,\n+\t\t\t0x27, 0xa4, 0x58, 0x5f, 0xbb,\n+\t\t\t0xca, 0xd0, 0xf2, 0x45, 0x76,\n+\t\t\t0x20, 0x08, 0x5e, 0x5c, 0x8f,\n+\t\t\t0x42, 0xad, 0x22, 0x58, 0x42,\n+\t\t\t0x01, 0xdc, 0xa6, 0x94, 0x7b,\n+\t\t\t0xce, 0x88, 0xbc, 0x57, 0x90,\n+\t\t\t0x48, 0x5a, 0xc9, 0x74, 0x27,\n+\t\t\t0x34, 0x2b, 0xc3, 0x5f, 0x88,\n+\t\t\t0x7d, 0x86, 0xd6, 0x5a, 0x08,\n+\t\t\t0x93, 0x77, 0xe2, 0x47, 0xe6,\n+\t\t\t0x0b, 0xaa, 0x55, 0xe4, 0xe8,\n+\t\t\t0x50, 0x1e, 0x2a, 0xda, 0x57,\n+\t\t\t0x24, 0xac, 0x51, 0xd6, 0x90,\n+\t\t\t0x90, 0x08, 0x03, 0x3e, 0xbc,\n+\t\t\t0x10, 0xac, 0x99, 0x9b, 0x9d,\n+\t\t\t0x7f, 0x5c, 0xc2, 0x51, 0x9f,\n+\t\t\t0x3f, 0xe1, 0xea, 0x1d, 0x94,\n+\t\t\t0x75, 0x23, 0x58, 0x42, 0x00,\n+\t\t\t0x08, 0x51, 0x38, 0xdd, 0xab,\n+\t\t\t0xf5, 0xca, 0x97, 0x5f, 0x58,\n+\t\t\t0x60, 0xf9, 0x1a, 0x08, 0xe9,\n+\t\t\t0x1d, 0x6d, 0x5f, 0x9a, 0x76,\n+\t\t\t0xad, 0x40, 0x18, 0x76, 0x6a,\n+\t\t\t0x47, 0x66, 0x80, 0xb5, 0x5c,\n+\t\t\t0xd3, 0x39, 0xe8, 0xab, 0x6c,\n+\t\t\t0x72, 0xb5, 0xfa, 0xcd, 0xb2,\n+\t\t\t0xa2, 0xa5, 0x0a, 0xc2, 0x5b,\n+\t\t\t0xd0, 0x86, 0x64, 0x7d, 0xd3,\n+\t\t\t0xe2, 0xe6, 0xe9, 0x9e, 0x84,\n+\t\t\t0xca, 0x2c, 0x36, 0x09, 0xfd,\n+\t\t\t0xf1, 0x77, 0xfe, 0xb2, 0x6d },\n+\tcose_key5[] \u003d { 0xa3, 0x01, 0x04, 0x02, 0x6b,\n+\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n+\t\t\t0x32, 0x20, 0x50, 0x84, 0x9b,\n+\t\t\t0x57, 0x86, 0x45, 0x7c, 0x14,\n+\t\t\t0x91, 0xbe, 0x3a, 0x76, 0xdc,\n+\t\t\t0xea, 0x6c, 0x42, 0x71 },\n+\n+\tcose_key6[] \u003d { 0xa6, 0x01, 0x02, 0x02, 0x78,\n+\t\t\t0x21, 0x70, 0x65, 0x72, 0x65,\n+\t\t\t0x67, 0x72, 0x69, 0x6e, 0x2e,\n+\t\t\t0x74, 0x6f, 0x6f, 0x6b, 0x40,\n+\t\t\t0x74, 0x75, 0x63, 0x6b, 0x62,\n+\t\t\t0x6f, 0x72, 0x6f, 0x75, 0x67,\n+\t\t\t0x68, 0x2e, 0x65, 0x78, 0x61,\n+\t\t\t0x6d, 0x70, 0x6c, 0x65, 0x20,\n+\t\t\t0x01, 0x21, 0x58, 0x20, 0x98,\n+\t\t\t0xf5, 0x0a, 0x4f, 0xf6, 0xc0,\n+\t\t\t0x58, 0x61, 0xc8, 0x86, 0x0d,\n+\t\t\t0x13, 0xa6, 0x38, 0xea, 0x56,\n+\t\t\t0xc3, 0xf5, 0xad, 0x75, 0x90,\n+\t\t\t0xbb, 0xfb, 0xf0, 0x54, 0xe1,\n+\t\t\t0xc7, 0xb4, 0xd9, 0x1d, 0x62,\n+\t\t\t0x80, 0x22, 0x58, 0x20, 0xf0,\n+\t\t\t0x14, 0x00, 0xb0, 0x89, 0x86,\n+\t\t\t0x78, 0x04, 0xb8, 0xe9, 0xfc,\n+\t\t\t0x96, 0xc3, 0x93, 0x21, 0x61,\n+\t\t\t0xf1, 0x93, 0x4f, 0x42, 0x23,\n+\t\t\t0x06, 0x91, 0x70, 0xd9, 0x24,\n+\t\t\t0xb7, 0xe0, 0x3b, 0xf8, 0x22,\n+\t\t\t0xbb, 0x23, 0x58, 0x20, 0x02,\n+\t\t\t0xd1, 0xf7, 0xe6, 0xf2, 0x6c,\n+\t\t\t0x43, 0xd4, 0x86, 0x8d, 0x87,\n+\t\t\t0xce, 0xb2, 0x35, 0x31, 0x61,\n+\t\t\t0x74, 0x0a, 0xac, 0xf1, 0xf7,\n+\t\t\t0x16, 0x36, 0x47, 0x98, 0x4b,\n+\t\t\t0x52, 0x2a, 0x84, 0x8d, 0xf1,\n+\t\t\t0xc3 },\n+\tcose_key7[] \u003d { 0xa3, 0x01, 0x04, 0x02, 0x58,\n+\t\t\t0x24, 0x30, 0x31, 0x38, 0x63,\n+\t\t\t0x30, 0x61, 0x65, 0x35, 0x2d,\n+\t\t\t0x34, 0x64, 0x39, 0x62, 0x2d,\n+\t\t\t0x34, 0x37, 0x31, 0x62, 0x2d,\n+\t\t\t0x62, 0x66, 0x64, 0x36, 0x2d,\n+\t\t\t0x65, 0x65, 0x66, 0x33, 0x31,\n+\t\t\t0x34, 0x62, 0x63, 0x37, 0x30,\n+\t\t\t0x33, 0x37, 0x20, 0x58, 0x20,\n+\t\t\t0x84, 0x9b, 0x57, 0x21, 0x9d,\n+\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n+\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n+\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n+\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n+\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n+\t\t\t0x71, 0x88 },\n+\n+\tcose_key8[] \u003d {\n+\t\t\t/* kid \u0022sec-48\u0022 for hmac 384 */\n+\n+\t\t\t0xa3, 0x01, 0x04, 0x02, 0x66,\n+\t\t\t0x73, 0x65, 0x63, 0x2d, 0x34,\n+\t\t\t0x38, 0x20, 0x58, 0x30, 0x84,\n+\t\t\t0x9b, 0x57, 0x21, 0x9d, 0xae,\n+\t\t\t0x48, 0xde, 0x64, 0x6d, 0x07,\n+\t\t\t0xdb, 0xb5, 0x33, 0x56, 0x6e,\n+\t\t\t0x97, 0x66, 0x86, 0x45, 0x7c,\n+\t\t\t0x14, 0x91, 0xbe, 0x3a, 0x76,\n+\t\t\t0xdc, 0xea, 0x6c, 0x42, 0x71,\n+\t\t\t0x88, 0x00, 0x11, 0x22, 0x33,\n+\t\t\t0x77, 0x88, 0x99, 0xaa, 0x21,\n+\t\t\t0x22, 0x23, 0x24, 0x25, 0x26,\n+\t\t\t0x27, 0x28\n+\t},\n+\n+\tcose_key9[] \u003d {\n+\t\t\t/* kid \u0022sec-64\u0022 for hmac 512 */\n+\n+\t\t\t0xa3, 0x01, 0x04, 0x02, 0x46,\n+\t\t\t0x73, 0x65, 0x63, 0x2d, 0x36,\n+\t\t\t0x34, 0x20, 0x58, 0x40, 0x84,\n+\t\t\t0x9b, 0x57, 0x21, 0x9d, 0xae,\n+\t\t\t0x48, 0xde, 0x64, 0x6d, 0x07,\n+\t\t\t0xdb, 0xb5, 0x33, 0x56, 0x6e,\n+\t\t\t0x97, 0x66, 0x86, 0x45, 0x7c,\n+\t\t\t0x14, 0x91, 0xbe, 0x3a, 0x76,\n+\t\t\t0xdc, 0xea, 0x6c, 0x42, 0x71,\n+\t\t\t0x88, 0x00, 0x11, 0x22, 0x33,\n+\t\t\t0x77, 0x88, 0x99, 0xaa, 0x21,\n+\t\t\t0x22, 0x23, 0x24, 0x25, 0x26,\n+\t\t\t0x27, 0x28, 0xaa, 0xbb, 0xcc,\n+\t\t\t0xdd, 0xee, 0xff, 0xa5, 0xa6,\n+\t\t\t0xa7, 0xa8, 0xa9, 0xa0, 0xb1,\n+\t\t\t0xb2, 0xb3, 0xb4,\n+\t},\n+\n+\tcose_key10[] \u003d { /* kid \u002211\u0022 (again) ed22519 OKP key */\n+\t\t\t0xa5, 0x01, 0x01, 0x02, 0x42,\n+\t\t\t0x31, 0x31, 0x20, 0x06, 0x21,\n+\t\t\t0x58, 0x20, 0xd7, 0x5a, 0x98,\n+\t\t\t0x01, 0x82, 0xb1, 0x0a, 0xb7,\n+\t\t\t0xd5, 0x4b, 0xfe, 0xd3, 0xc9,\n+\t\t\t0x64, 0x07, 0x3a, 0x0e, 0xe1,\n+\t\t\t0x72, 0xf3, 0xda, 0xa6, 0x23,\n+\t\t\t0x25, 0xaf, 0x02, 0x1a, 0x68,\n+\t\t\t0xf7, 0x07, 0x51, 0x1a, 0x23,\n+\t\t\t0x58, 0x20, 0x9d, 0x61, 0xb1,\n+\t\t\t0x9d, 0xef, 0xfd, 0x5a, 0x60,\n+\t\t\t0xba, 0x84, 0x4a, 0xf4, 0x92,\n+\t\t\t0xec, 0x2c, 0xc4, 0x44, 0x49,\n+\t\t\t0xc5, 0x69, 0x7b, 0x32, 0x69,\n+\t\t\t0x19, 0x70, 0x3b, 0xac, 0x03,\n+\t\t\t0x1c, 0xae, 0x7f, 0x60\n+\t},\n+\n+\tcose_key_set1[] \u003d {\n+\n+\t\t\t0x89,\n+\n+\t\t\t0xa6, 0x01, 0x02, 0x02, 0x42,\n+\t\t\t0x31, 0x31, 0x20, 0x01, 0x21,\n+\t\t\t0x58, 0x20, 0xba, 0xc5, 0xb1,\n+\t\t\t0x1c, 0xad, 0x8f, 0x99, 0xf9,\n+\t\t\t0xc7, 0x2b, 0x05, 0xcf, 0x4b,\n+\t\t\t0x9e, 0x26, 0xd2, 0x44, 0xdc,\n+\t\t\t0x18, 0x9f, 0x74, 0x52, 0x28,\n+\t\t\t0x25, 0x5a, 0x21, 0x9a, 0x86,\n+\t\t\t0xd6, 0xa0, 0x9e, 0xff, 0x22,\n+\t\t\t0x58, 0x20, 0x20, 0x13, 0x8b,\n+\t\t\t0xf8, 0x2d, 0xc1, 0xb6, 0xd5,\n+\t\t\t0x62, 0xbe, 0x0f, 0xa5, 0x4a,\n+\t\t\t0xb7, 0x80, 0x4a, 0x3a, 0x64,\n+\t\t\t0xb6, 0xd7, 0x2c, 0xcf, 0xed,\n+\t\t\t0x6b, 0x6f, 0xb6, 0xed, 0x28,\n+\t\t\t0xbb, 0xfc, 0x11, 0x7e, 0x23,\n+\t\t\t0x58, 0x20, 0x57, 0xc9, 0x20,\n+\t\t\t0x77, 0x66, 0x41, 0x46, 0xe8,\n+\t\t\t0x76, 0x76, 0x0c, 0x95, 0x20,\n+\t\t\t0xd0, 0x54, 0xaa, 0x93, 0xc3,\n+\t\t\t0xaf, 0xb0, 0x4e, 0x30, 0x67,\n+\t\t\t0x05, 0xdb, 0x60, 0x90, 0x30,\n+\t\t\t0x85, 0x07, 0xb4, 0xd3,\n+\n+\t\t\t0xa6, 0x01, 0x02, 0x02, 0x58,\n+\t\t\t0x24, 0x6d, 0x65, 0x72, 0x69,\n+\t\t\t0x61, 0x64, 0x6f, 0x63, 0x2e,\n+\t\t\t0x62, 0x72, 0x61, 0x6e, 0x64,\n+\t\t\t0x79, 0x62, 0x75, 0x63, 0x6b,\n+\t\t\t0x40, 0x62, 0x75, 0x63, 0x6b,\n+\t\t\t0x6c, 0x61, 0x6e, 0x64, 0x2e,\n+\t\t\t0x65, 0x78, 0x61, 0x6d, 0x70,\n+\t\t\t0x6c, 0x65, 0x20, 0x01, 0x21,\n+\t\t\t0x58, 0x20, 0x65, 0xed, 0xa5,\n+\t\t\t0xa1, 0x25, 0x77, 0xc2, 0xba,\n+\t\t\t0xe8, 0x29, 0x43, 0x7f, 0xe3,\n+\t\t\t0x38, 0x70, 0x1a, 0x10, 0xaa,\n+\t\t\t0xa3, 0x75, 0xe1, 0xbb, 0x5b,\n+\t\t\t0x5d, 0xe1, 0x08, 0xde, 0x43,\n+\t\t\t0x9c, 0x08, 0x55, 0x1d, 0x22,\n+\t\t\t0x58, 0x20, 0x1e, 0x52, 0xed,\n+\t\t\t0x75, 0x70, 0x11, 0x63, 0xf7,\n+\t\t\t0xf9, 0xe4, 0x0d, 0xdf, 0x9f,\n+\t\t\t0x34, 0x1b, 0x3d, 0xc9, 0xba,\n+\t\t\t0x86, 0x0a, 0xf7, 0xe0, 0xca,\n+\t\t\t0x7c, 0xa7, 0xe9, 0xee, 0xcd,\n+\t\t\t0x00, 0x84, 0xd1, 0x9c, 0x23,\n+\t\t\t0x58, 0x20, 0xaf, 0xf9, 0x07,\n+\t\t\t0xc9, 0x9f, 0x9a, 0xd3, 0xaa,\n+\t\t\t0xe6, 0xc4, 0xcd, 0xf2, 0x11,\n+\t\t\t0x22, 0xbc, 0xe2, 0xbd, 0x68,\n+\t\t\t0xb5, 0x28, 0x3e, 0x69, 0x07,\n+\t\t\t0x15, 0x4a, 0xd9, 0x11, 0x84,\n+\t\t\t0x0f, 0xa2, 0x08, 0xcf,\n+\n+\t\t\t0xa3, 0x01, 0x04, 0x02, 0x4a,\n+\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n+\t\t\t0x20, 0x58, 0x20, 0x84, 0x9b,\n+\t\t\t0x57, 0x21, 0x9d, 0xae, 0x48,\n+\t\t\t0xde, 0x64, 0x6d, 0x07, 0xdb,\n+\t\t\t0xb5, 0x33, 0x56, 0x6e, 0x97,\n+\t\t\t0x66, 0x86, 0x45, 0x7c, 0x14,\n+\t\t\t0x91, 0xbe, 0x3a, 0x76, 0xdc,\n+\t\t\t0xea, 0x6c, 0x42, 0x71, 0x88,\n+\n+\t\t\t0xa6, 0x01, 0x02, 0x02, 0x58,\n+\t\t\t0x1e, 0x62, 0x69, 0x6c, 0x62,\n+\t\t\t0x6f, 0x2e, 0x62, 0x61, 0x67,\n+\t\t\t0x67, 0x69, 0x6e, 0x73, 0x40,\n+\t\t\t0x68, 0x6f, 0x62, 0x62, 0x69,\n+\t\t\t0x74, 0x6f, 0x6e, 0x2e, 0x65,\n+\t\t\t0x78, 0x61, 0x6d, 0x70, 0x6c,\n+\t\t\t0x65, 0x20, 0x03, 0x21, 0x58,\n+\t\t\t0x42, 0x00, 0x72, 0x99, 0x2c,\n+\t\t\t0xb3, 0xac, 0x08, 0xec, 0xf3,\n+\t\t\t0xe5, 0xc6, 0x3d, 0xed, 0xec,\n+\t\t\t0x0d, 0x51, 0xa8, 0xc1, 0xf7,\n+\t\t\t0x9e, 0xf2, 0xf8, 0x2f, 0x94,\n+\t\t\t0xf3, 0xc7, 0x37, 0xbf, 0x5d,\n+\t\t\t0xe7, 0x98, 0x66, 0x71, 0xea,\n+\t\t\t0xc6, 0x25, 0xfe, 0x82, 0x57,\n+\t\t\t0xbb, 0xd0, 0x39, 0x46, 0x44,\n+\t\t\t0xca, 0xaa, 0x3a, 0xaf, 0x8f,\n+\t\t\t0x27, 0xa4, 0x58, 0x5f, 0xbb,\n+\t\t\t0xca, 0xd0, 0xf2, 0x45, 0x76,\n+\t\t\t0x20, 0x08, 0x5e, 0x5c, 0x8f,\n+\t\t\t0x42, 0xad, 0x22, 0x58, 0x42,\n+\t\t\t0x01, 0xdc, 0xa6, 0x94, 0x7b,\n+\t\t\t0xce, 0x88, 0xbc, 0x57, 0x90,\n+\t\t\t0x48, 0x5a, 0xc9, 0x74, 0x27,\n+\t\t\t0x34, 0x2b, 0xc3, 0x5f, 0x88,\n+\t\t\t0x7d, 0x86, 0xd6, 0x5a, 0x08,\n+\t\t\t0x93, 0x77, 0xe2, 0x47, 0xe6,\n+\t\t\t0x0b, 0xaa, 0x55, 0xe4, 0xe8,\n+\t\t\t0x50, 0x1e, 0x2a, 0xda, 0x57,\n+\t\t\t0x24, 0xac, 0x51, 0xd6, 0x90,\n+\t\t\t0x90, 0x08, 0x03, 0x3e, 0xbc,\n+\t\t\t0x10, 0xac, 0x99, 0x9b, 0x9d,\n+\t\t\t0x7f, 0x5c, 0xc2, 0x51, 0x9f,\n+\t\t\t0x3f, 0xe1, 0xea, 0x1d, 0x94,\n+\t\t\t0x75, 0x23, 0x58, 0x42, 0x00,\n+\t\t\t0x08, 0x51, 0x38, 0xdd, 0xab,\n+\t\t\t0xf5, 0xca, 0x97, 0x5f, 0x58,\n+\t\t\t0x60, 0xf9, 0x1a, 0x08, 0xe9,\n+\t\t\t0x1d, 0x6d, 0x5f, 0x9a, 0x76,\n+\t\t\t0xad, 0x40, 0x18, 0x76, 0x6a,\n+\t\t\t0x47, 0x66, 0x80, 0xb5, 0x5c,\n+\t\t\t0xd3, 0x39, 0xe8, 0xab, 0x6c,\n+\t\t\t0x72, 0xb5, 0xfa, 0xcd, 0xb2,\n+\t\t\t0xa2, 0xa5, 0x0a, 0xc2, 0x5b,\n+\t\t\t0xd0, 0x86, 0x64, 0x7d, 0xd3,\n+\t\t\t0xe2, 0xe6, 0xe9, 0x9e, 0x84,\n+\t\t\t0xca, 0x2c, 0x36, 0x09, 0xfd,\n+\t\t\t0xf1, 0x77, 0xfe, 0xb2, 0x6d,\n+\n+\t\t\t0xa3, 0x01, 0x04, 0x02, 0x4b,\n+\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n+\t\t\t0x32, 0x20, 0x50, 0x84, 0x9b,\n+\t\t\t0x57, 0x86, 0x45, 0x7c, 0x14,\n+\t\t\t0x91, 0xbe, 0x3a, 0x76, 0xdc,\n+\t\t\t0xea, 0x6c, 0x42, 0x71,\n+\n+\t\t\t0xa6, 0x01, 0x02, 0x02, 0x58,\n+\t\t\t0x21, 0x70, 0x65, 0x72, 0x65,\n+\t\t\t0x67, 0x72, 0x69, 0x6e, 0x2e,\n+\t\t\t0x74, 0x6f, 0x6f, 0x6b, 0x40,\n+\t\t\t0x74, 0x75, 0x63, 0x6b, 0x62,\n+\t\t\t0x6f, 0x72, 0x6f, 0x75, 0x67,\n+\t\t\t0x68, 0x2e, 0x65, 0x78, 0x61,\n+\t\t\t0x6d, 0x70, 0x6c, 0x65, 0x20,\n+\t\t\t0x01, 0x21, 0x58, 0x20, 0x98,\n+\t\t\t0xf5, 0x0a, 0x4f, 0xf6, 0xc0,\n+\t\t\t0x58, 0x61, 0xc8, 0x86, 0x0d,\n+\t\t\t0x13, 0xa6, 0x38, 0xea, 0x56,\n+\t\t\t0xc3, 0xf5, 0xad, 0x75, 0x90,\n+\t\t\t0xbb, 0xfb, 0xf0, 0x54, 0xe1,\n+\t\t\t0xc7, 0xb4, 0xd9, 0x1d, 0x62,\n+\t\t\t0x80, 0x22, 0x58, 0x20, 0xf0,\n+\t\t\t0x14, 0x00, 0xb0, 0x89, 0x86,\n+\t\t\t0x78, 0x04, 0xb8, 0xe9, 0xfc,\n+\t\t\t0x96, 0xc3, 0x93, 0x21, 0x61,\n+\t\t\t0xf1, 0x93, 0x4f, 0x42, 0x23,\n+\t\t\t0x06, 0x91, 0x70, 0xd9, 0x24,\n+\t\t\t0xb7, 0xe0, 0x3b, 0xf8, 0x22,\n+\t\t\t0xbb, 0x23, 0x58, 0x20, 0x02,\n+\t\t\t0xd1, 0xf7, 0xe6, 0xf2, 0x6c,\n+\t\t\t0x43, 0xd4, 0x86, 0x8d, 0x87,\n+\t\t\t0xce, 0xb2, 0x35, 0x31, 0x61,\n+\t\t\t0x74, 0x0a, 0xac, 0xf1, 0xf7,\n+\t\t\t0x16, 0x36, 0x47, 0x98, 0x4b,\n+\t\t\t0x52, 0x2a, 0x84, 0x8d, 0xf1,\n+\t\t\t0xc3,\n+\n+\t\t\t0xa3, 0x01, 0x04, 0x02, 0x58,\n+\t\t\t0x24, 0x30, 0x31, 0x38, 0x63,\n+\t\t\t0x30, 0x61, 0x65, 0x35, 0x2d,\n+\t\t\t0x34, 0x64, 0x39, 0x62, 0x2d,\n+\t\t\t0x34, 0x37, 0x31, 0x62, 0x2d,\n+\t\t\t0x62, 0x66, 0x64, 0x36, 0x2d,\n+\t\t\t0x65, 0x65, 0x66, 0x33, 0x31,\n+\t\t\t0x34, 0x62, 0x63, 0x37, 0x30,\n+\t\t\t0x33, 0x37, 0x04, 0x58, 0x20,\n+\t\t\t0x84, 0x9b, 0x57, 0x21, 0x9d,\n+\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n+\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n+\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n+\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n+\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n+\t\t\t0x71, 0x88,\n+\n+\t\t\t/* kid \u0022sec-48\u0022 for hmac 384 */\n+\n+\t\t\t0xa3, 0x01, 0x04, 0x02, 0x46,\n+\t\t\t0x73, 0x65, 0x63, 0x2d, 0x34,\n+\t\t\t0x38, 0x20, 0x58, 0x30, 0x84,\n+\t\t\t0x9b, 0x57, 0x21, 0x9d, 0xae,\n+\t\t\t0x48, 0xde, 0x64, 0x6d, 0x07,\n+\t\t\t0xdb, 0xb5, 0x33, 0x56, 0x6e,\n+\t\t\t0x97, 0x66, 0x86, 0x45, 0x7c,\n+\t\t\t0x14, 0x91, 0xbe, 0x3a, 0x76,\n+\t\t\t0xdc, 0xea, 0x6c, 0x42, 0x71,\n+\t\t\t0x88, 0x00, 0x11, 0x22, 0x33,\n+\t\t\t0x77, 0x88, 0x99, 0xaa, 0x21,\n+\t\t\t0x22, 0x23, 0x24, 0x25, 0x26,\n+\t\t\t0x27, 0x28,\n+\n+\t\t\t/* kid \u0022sec-64\u0022 for hmac 512 */\n+\n+\t\t\t0xa3, 0x01, 0x04, 0x02, 0x46,\n+\t\t\t0x73, 0x65, 0x63, 0x2d, 0x36,\n+\t\t\t0x34, 0x20, 0x58, 0x40, 0x84,\n+\t\t\t0x9b, 0x57, 0x21, 0x9d, 0xae,\n+\t\t\t0x48, 0xde, 0x64, 0x6d, 0x07,\n+\t\t\t0xdb, 0xb5, 0x33, 0x56, 0x6e,\n+\t\t\t0x97, 0x66, 0x86, 0x45, 0x7c,\n+\t\t\t0x14, 0x91, 0xbe, 0x3a, 0x76,\n+\t\t\t0xdc, 0xea, 0x6c, 0x42, 0x71,\n+\t\t\t0x88, 0x00, 0x11, 0x22, 0x33,\n+\t\t\t0x77, 0x88, 0x99, 0xaa, 0x21,\n+\t\t\t0x22, 0x23, 0x24, 0x25, 0x26,\n+\t\t\t0x27, 0x28, 0xaa, 0xbb, 0xcc,\n+\t\t\t0xdd, 0xee, 0xff, 0xa5, 0xa6,\n+\t\t\t0xa7, 0xa8, 0xa9, 0xa0, 0xb1,\n+\t\t\t0xb2, 0xb3, 0xb4,\n+}\n+;\n+\n+struct keyinfo {\n+\tconst uint8_t\t\t*set;\n+\tsize_t\t\t\tlen;\n+};\n+\n+struct keyinfo keyset1 \u003d { cose_key_set1, sizeof(cose_key_set1) },\n+\t\tkey3 \u003d { cose_key3, sizeof(cose_key3) },\n+\t\tkey8 \u003d { cose_key8, sizeof(cose_key8) },\n+\t\tkey9 \u003d { cose_key9, sizeof(cose_key9) },\n+\t\tkey10 \u003d { cose_key10, sizeof(cose_key10) }\n+;\n+\n+/* key pieces */\n+\n+static const uint8_t\n+\tkey1_x[] \u003d { 0xba, 0xc5, 0xb1, 0x1c, 0xad,\n+\t\t\t0x8f, 0x99, 0xf9, 0xc7, 0x2b,\n+\t\t\t0x05, 0xcf, 0x4b, 0x9e, 0x26,\n+\t\t\t0xd2, 0x44, 0xdc, 0x18, 0x9f,\n+\t\t\t0x74, 0x52, 0x28, 0x25, 0x5a,\n+\t\t\t0x21, 0x9a, 0x86, 0xd6, 0xa0,\n+\t\t\t0x9e, 0xff },\n+\tkey1_y[] \u003d { 0x20, 0x13, 0x8b, 0xf8, 0x2d,\n+\t\t\t0xc1, 0xb6, 0xd5, 0x62, 0xbe,\n+\t\t\t0x0f, 0xa5, 0x4a, 0xb7, 0x80,\n+\t\t\t0x4a, 0x3a, 0x64, 0xb6, 0xd7,\n+\t\t\t0x2c, 0xcf, 0xed, 0x6b, 0x6f,\n+\t\t\t0xb6, 0xed, 0x28, 0xbb, 0xfc,\n+\t\t\t0x11, 0x7e },\n+\tkey1_d[] \u003d { 0x57, 0xc9, 0x20, 0x77, 0x66,\n+\t\t\t0x41, 0x46, 0xe8, 0x76, 0x76,\n+\t\t\t0x0c, 0x95, 0x20, 0xd0, 0x54,\n+\t\t\t0xaa, 0x93, 0xc3, 0xaf, 0xb0,\n+\t\t\t0x4e, 0x30, 0x67, 0x05, 0xdb,\n+\t\t\t0x60, 0x90, 0x30, 0x85, 0x07,\n+\t\t\t0xb4, 0xd3 },\n+\n+\tkey2_x[] \u003d { 0x65, 0xed, 0xa5, 0xa1, 0x25,\n+\t\t\t0x77, 0xc2, 0xba, 0xe8, 0x29,\n+\t\t\t0x43, 0x7f, 0xe3, 0x38, 0x70,\n+\t\t\t0x1a, 0x10, 0xaa, 0xa3, 0x75,\n+\t\t\t0xe1, 0xbb, 0x5b, 0x5d, 0xe1,\n+\t\t\t0x08, 0xde, 0x43, 0x9c, 0x08,\n+\t\t\t0x55, 0x1d },\n+\tkey2_y[] \u003d { 0x1e, 0x52, 0xed, 0x75, 0x70,\n+\t\t\t0x11, 0x63, 0xf7, 0xf9, 0xe4,\n+\t\t\t0x0d, 0xdf, 0x9f, 0x34, 0x1b,\n+\t\t\t0x3d, 0xc9, 0xba, 0x86, 0x0a,\n+\t\t\t0xf7, 0xe0, 0xca, 0x7c, 0xa7,\n+\t\t\t0xe9, 0xee, 0xcd, 0x00, 0x84,\n+\t\t\t0xd1, 0x9c },\n+\tkey2_d[] \u003d { 0xaf, 0xf9, 0x07, 0xc9, 0x9f,\n+\t\t\t0x9a, 0xd3, 0xaa, 0xe6, 0xc4,\n+\t\t\t0xcd, 0xf2, 0x11, 0x22, 0xbc,\n+\t\t\t0xe2, 0xbd, 0x68, 0xb5, 0x28,\n+\t\t\t0x3e, 0x69, 0x07, 0x15, 0x4a,\n+\t\t\t0xd9, 0x11, 0x84, 0x0f, 0xa2,\n+\t\t\t0x08, 0xcf },\n+\n+\tkey3_k[] \u003d { 0x84, 0x9b, 0x57, 0x21, 0x9d,\n+\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n+\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n+\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n+\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n+\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n+\t\t\t0x71, 0x88 },\n+\n+\tkey4_x[] \u003d { 0x00, 0x72, 0x99, 0x2c, 0xb3,\n+\t\t\t0xac, 0x08, 0xec, 0xf3, 0xe5,\n+\t\t\t0xc6, 0x3d, 0xed, 0xec, 0x0d,\n+\t\t\t0x51, 0xa8, 0xc1, 0xf7, 0x9e,\n+\t\t\t0xf2, 0xf8, 0x2f, 0x94, 0xf3,\n+\t\t\t0xc7, 0x37, 0xbf, 0x5d, 0xe7,\n+\t\t\t0x98, 0x66, 0x71, 0xea, 0xc6,\n+\t\t\t0x25, 0xfe, 0x82, 0x57, 0xbb,\n+\t\t\t0xd0, 0x39, 0x46, 0x44, 0xca,\n+\t\t\t0xaa, 0x3a, 0xaf, 0x8f, 0x27,\n+\t\t\t0xa4, 0x58, 0x5f, 0xbb, 0xca,\n+\t\t\t0xd0, 0xf2, 0x45, 0x76, 0x20,\n+\t\t\t0x08, 0x5e, 0x5c, 0x8f, 0x42,\n+\t\t\t0xad },\n+\tkey4_y[] \u003d { 0x01, 0xdc, 0xa6, 0x94, 0x7b,\n+\t\t\t0xce, 0x88, 0xbc, 0x57, 0x90,\n+\t\t\t0x48, 0x5a, 0xc9, 0x74, 0x27,\n+\t\t\t0x34, 0x2b, 0xc3, 0x5f, 0x88,\n+\t\t\t0x7d, 0x86, 0xd6, 0x5a, 0x08,\n+\t\t\t0x93, 0x77, 0xe2, 0x47, 0xe6,\n+\t\t\t0x0b, 0xaa, 0x55, 0xe4, 0xe8,\n+\t\t\t0x50, 0x1e, 0x2a, 0xda, 0x57,\n+\t\t\t0x24, 0xac, 0x51, 0xd6, 0x90,\n+\t\t\t0x90, 0x08, 0x03, 0x3e, 0xbc,\n+\t\t\t0x10, 0xac, 0x99, 0x9b, 0x9d,\n+\t\t\t0x7f, 0x5c, 0xc2, 0x51, 0x9f,\n+\t\t\t0x3f, 0xe1, 0xea, 0x1d, 0x94,\n+\t\t\t0x75 },\n+\tkey4_d[] \u003d { 0x00, 0x08, 0x51, 0x38, 0xdd,\n+\t\t\t0xab, 0xf5, 0xca, 0x97, 0x5f,\n+\t\t\t0x58, 0x60, 0xf9, 0x1a, 0x08,\n+\t\t\t0xe9, 0x1d, 0x6d, 0x5f, 0x9a,\n+\t\t\t0x76, 0xad, 0x40, 0x18, 0x76,\n+\t\t\t0x6a, 0x47, 0x66, 0x80, 0xb5,\n+\t\t\t0x5c, 0xd3, 0x39, 0xe8, 0xab,\n+\t\t\t0x6c, 0x72, 0xb5, 0xfa, 0xcd,\n+\t\t\t0xb2, 0xa2, 0xa5, 0x0a, 0xc2,\n+\t\t\t0x5b, 0xd0, 0x86, 0x64, 0x7d,\n+\t\t\t0xd3, 0xe2, 0xe6, 0xe9, 0x9e,\n+\t\t\t0x84, 0xca, 0x2c, 0x36, 0x09,\n+\t\t\t0xfd, 0xf1, 0x77, 0xfe, 0xb2,\n+\t\t\t0x6d },\n+\tkey5_k[] \u003d { 0x84, 0x9b, 0x57, 0x86, 0x45,\n+\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n+\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n+\t\t\t0x71 },\n+\n+\tkey6_x[] \u003d { 0x98, 0xf5, 0x0a, 0x4f, 0xf6,\n+\t\t\t0xc0, 0x58, 0x61, 0xc8, 0x86,\n+\t\t\t0x0d, 0x13, 0xa6, 0x38, 0xea,\n+\t\t\t0x56, 0xc3, 0xf5, 0xad, 0x75,\n+\t\t\t0x90, 0xbb, 0xfb, 0xf0, 0x54,\n+\t\t\t0xe1, 0xc7, 0xb4, 0xd9, 0x1d,\n+\t\t\t0x62, 0x80 },\n+\tkey6_y[] \u003d { 0xf0, 0x14, 0x00, 0xb0, 0x89,\n+\t\t\t0x86, 0x78, 0x04, 0xb8, 0xe9,\n+\t\t\t0xfc, 0x96, 0xc3, 0x93, 0x21,\n+\t\t\t0x61, 0xf1, 0x93, 0x4f, 0x42,\n+\t\t\t0x23, 0x06, 0x91, 0x70, 0xd9,\n+\t\t\t0x24, 0xb7, 0xe0, 0x3b, 0xf8,\n+\t\t\t0x22, 0xbb },\n+\tkey6_d[] \u003d { 0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t\t\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t\t\t0x87, 0xce, 0xb2, 0x35, 0x31,\n+\t\t\t0x61, 0x74, 0x0a, 0xac, 0xf1,\n+\t\t\t0xf7, 0x16, 0x36, 0x47, 0x98,\n+\t\t\t0x4b, 0x52, 0x2a, 0x84, 0x8d,\n+\t\t\t0xf1, 0xc3 },\n+\n+\tkey7_k[] \u003d { 0x84, 0x9b, 0x57, 0x21, 0x9d,\n+\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n+\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n+\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n+\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n+\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n+\t\t\t0x71, 0x88 },\n+\n+\tkey8_k[] \u003d { 0x84, 0x9b, 0x57, 0x21, 0x9d,\n+\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n+\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n+\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n+\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n+\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n+\t\t\t0x71, 0x88, 0x00, 0x11, 0x22,\n+\t\t\t0x33, 0x77, 0x88, 0x99, 0xaa,\n+\t\t\t0x21, 0x22, 0x23, 0x24, 0x25,\n+\t\t\t0x26, 0x27, 0x28 },\n+\n+\tkey9_k[] \u003d { 0x84, 0x9b, 0x57, 0x21, 0x9d,\n+\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n+\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n+\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n+\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n+\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n+\t\t\t0x71, 0x88, 0x00, 0x11, 0x22,\n+\t\t\t0x33, 0x77, 0x88, 0x99, 0xaa,\n+\t\t\t0x21, 0x22, 0x23, 0x24, 0x25,\n+\t\t\t0x26, 0x27, 0x28, 0xaa, 0xbb,\n+\t\t\t0xcc, 0xdd, 0xee, 0xff, 0xa5,\n+\t\t\t0xa6, 0xa7, 0xa8, 0xa9, 0xa0,\n+\t\t\t0xb1, 0xb2, 0xb3, 0xb4 }\n+#if 0\n+\t\t\t,\n+\tkey10_x[] \u003d {\n+\t\t\t0xd7, 0x5a, 0x98, 0x01, 0x82,\n+\t\t\t0xb1, 0x0a, 0xb7, 0xd5, 0x4b,\n+\t\t\t0xfe, 0xd3, 0xc9, 0x64, 0x07,\n+\t\t\t0x3a, 0x0e, 0xe1, 0x72, 0xf3,\n+\t\t\t0xda, 0xa6, 0x23, 0x25, 0xaf,\n+\t\t\t0x02, 0x1a, 0x68, 0xf7, 0x07,\n+\t\t\t0x51, 0x1a\n+\t}, key10_d[] \u003d {\n+\t\t\t0x9d, 0x61, 0xb1, 0x9d, 0xef,\n+\t\t\t0xfd, 0x5a, 0x60, 0xba, 0x84,\n+\t\t\t0x4a, 0xf4, 0x92, 0xec, 0x2c,\n+\t\t\t0xc4, 0x44, 0x49, 0xc5, 0x69,\n+\t\t\t0x7b, 0x32, 0x69, 0x19, 0x70,\n+\t\t\t0x3b, 0xac, 0x03, 0x1c, 0xae,\n+\t\t\t0x7f, 0x60\n+\t}\n+#endif\n+;\n+\n+int\n+test_cose_keys(struct lws_context *context)\n+{\n+\tstruct lws_cose_key *ck;\n+\tlws_dll2_owner_t set;\n+\tlws_lec_pctx_t wc;\n+\tuint8_t buf[4096];\n+\tint n;\n+\n+#if 0\n+\t{\n+\t\tint fd \u003d open(\u0022set1.cks\u0022,\n+\t\t\t LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);\n+\n+\t\tif (fd \u003e\u003d 0) {\n+\t\t\twrite(fd, cose_key_set1, sizeof(cose_key_set1));\n+\t\t\tclose(fd);\n+\t\t}\n+\t}\n+#endif\n+\n+#if 0\n+\tlws_lec_pctx_t wx;\n+\tuint8_t dump[8192];\n+\n+\tlws_lec_init(\u0026wx, buf, sizeof(buf));\n+\n+\tif (lws_lec_printf(\u0026wx,\n+\t\t\u0022{%d:%d, %d:%.*b, %d:%d, %d:%.*b, %d:%.*b}\u0022,\n+\t\tLWSCOSE_WKK_KTY, LWSCOSE_WKKTV_OKP,\n+\t\tLWSCOSE_WKK_KID, 2, \u002211\u0022,\n+\t\tLWSCOSE_WKOKP_CRV, LWSCOSE_WKEC_ED25519,\n+\t\tLWSCOSE_WKECKP_X, (int)sizeof(key10_x), key10_x,\n+//\t\tLWSCOSE_WKECKP_Y, (int)sizeof(key6_y), key6_y,\n+\t\tLWSCOSE_WKECKP_D, (int)sizeof(key10_d), key10_d) !\u003d\n+\t\t\tLWS_LECPCTX_RET_FINISHED)\n+\t\treturn 1;\n+\n+\tlws_hex_from_byte_array(buf, wx.used, (char *)dump, sizeof(dump));\n+\tputs((const char *)dump);\n+#endif\n+#if 0\n+\tlws_lec_pctx_t wx;\n+\tuint8_t dump[8192];\n+\n+\tlws_lec_init(\u0026wx, buf, sizeof(buf));\n+\n+\tif (lws_lec_printf(\u0026wx,\n+\t\t\u0022{%d:%d, %d:%.*b, %d:%.*b}\u0022,\n+\t\tLWSCOSE_WKK_KTY, LWSCOSE_WKKTV_SYMMETRIC,\n+\t\tLWSCOSE_WKK_KID, 6, \u0022sec-64\u0022,\n+\t\t-1, (int)sizeof(key9_k), key9_k) !\u003d\n+\t\t\tLWS_LECPCTX_RET_FINISHED)\n+\t\treturn 1;\n+\n+\tlws_hex_from_byte_array(buf, wx.used, (char *)dump, sizeof(dump));\n+\tputs((const char *)dump);\n+#endif\n+\n+\t/* key1 import */\n+\n+\tlwsl_user(\u0022%s: key 1 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, key_import_cb, NULL, cose_key1, sizeof(cose_key1));\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_EC2 ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_EC ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].len !\u003d sizeof(key1_x) ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].len !\u003d sizeof(key1_y) ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].len !\u003d sizeof(key1_d) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].buf, key1_x, sizeof(key1_x)) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].buf, key1_y, sizeof(key1_y)) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].buf, key1_d, sizeof(key1_d)))\n+\t\tgoto bail;\n+\n+\t// lws_cose_key_dump(ck);\n+\n+\t/* key 1 export */\n+\n+\tlwsl_user(\u0022%s: key 1 export\u005cn\u0022, __func__);\n+\n+\tlws_lec_init(\u0026wc, buf, sizeof(buf));\n+\tn \u003d (int)lws_cose_key_export(ck, \u0026wc, LWSJWKF_EXPORT_PRIVATE);\n+\tlws_cose_key_destroy(\u0026ck);\n+\tif (n !\u003d LWS_LECPCTX_RET_FINISHED)\n+\t\tgoto bail;\n+\n+\t// lwsl_hexdump_notice(buf, wc.used);\n+\n+\t/* key2 import */\n+\n+\tlwsl_user(\u0022%s: key 2 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key2, sizeof(cose_key2));\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_EC2 ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_EC ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].len !\u003d sizeof(key2_x) ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].len !\u003d sizeof(key2_y) ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].len !\u003d sizeof(key2_d) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].buf, key2_x, sizeof(key2_x)) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].buf, key2_y, sizeof(key2_y)) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].buf, key2_d, sizeof(key2_d)))\n+\t\tgoto bail;\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\t/* key3 import */\n+\n+\tlwsl_user(\u0022%s: key 3 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key3, sizeof(cose_key3));\n+\tif (!ck) {\n+\t\tlwsl_err(\u0022%s: key 3 import failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n+\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key3_k) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key3_k, sizeof(key3_k))) {\n+\t\tlwsl_err(\u0022%s: key 3 checks failed %d %d %d\u005cn\u0022, __func__,\n+\t\t\t\t(int)ck-\u003ekty, (int)ck-\u003egencrypto_kty,\n+\t\t\t\t(int)ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\t/* key4 import */\n+\n+\tlwsl_user(\u0022%s: key 4 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key4, sizeof(cose_key4));\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_EC2 ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_EC ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].len !\u003d sizeof(key4_x) ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].len !\u003d sizeof(key4_y) ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].len !\u003d sizeof(key4_d) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].buf, key4_x, sizeof(key4_x)) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].buf, key4_y, sizeof(key4_y)) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].buf, key4_d, sizeof(key4_d)))\n+\t\tgoto bail;\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\t/* key5 import */\n+\n+\tlwsl_user(\u0022%s: key 5 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key5, sizeof(cose_key5));\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n+\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key5_k) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key5_k, sizeof(key5_k)))\n+\t\tgoto bail;\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\t/* key6 import */\n+\n+\tlwsl_user(\u0022%s: key 6 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key6, sizeof(cose_key6));\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_EC2 ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_EC ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].len !\u003d sizeof(key6_x) ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].len !\u003d sizeof(key6_y) ||\n+\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].len !\u003d sizeof(key6_d) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].buf, key6_x, sizeof(key6_x)) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].buf, key6_y, sizeof(key6_y)) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].buf, key6_d, sizeof(key6_d)))\n+\t\tgoto bail;\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\t/* key7 import */\n+\n+\tlwsl_user(\u0022%s: key 7 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key7, sizeof(cose_key7));\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n+\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key7_k) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key7_k, sizeof(key7_k)))\n+\t\tgoto bail;\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\t/* key8 import */\n+\n+\tlwsl_user(\u0022%s: key 8 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key8, sizeof(cose_key8));\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n+\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key8_k) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key8_k, sizeof(key8_k)))\n+\t\tgoto bail;\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\t/* key9 import */\n+\n+\tlwsl_user(\u0022%s: key 9 import\u005cn\u0022, __func__);\n+\n+\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key9, sizeof(cose_key9));\n+\tif (!ck) {\n+\t\tlwsl_err(\u0022%s: cose9 import fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n+\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n+\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key9_k) ||\n+\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key9_k, sizeof(key9_k))) {\n+\t\tlwsl_notice(\u0022%s: key9 check fails\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\t/* key set 1 */\n+\n+\tlwsl_user(\u0022%s: key_set1\u005cn\u0022, __func__);\n+\tlws_dll2_owner_clear(\u0026set);\n+\tck \u003d lws_cose_key_import(\u0026set, NULL, NULL, cose_key_set1, sizeof(cose_key_set1));\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/* generate */\n+\n+\tck \u003d lws_cose_key_generate(context, LWSCOSE_WKKTV_EC2,\n+\t\t\t\t (1 \u003c\u003c LWSCOSE_WKKO_SIGN) |\n+\t\t\t\t (1 \u003c\u003c LWSCOSE_WKKO_VERIFY) |\n+\t\t\t\t (1 \u003c\u003c LWSCOSE_WKKO_ENCRYPT) |\n+\t\t\t\t (1 \u003c\u003c LWSCOSE_WKKO_DECRYPT),\n+\t\t\t\t 0, \u0022P-256\u0022, (const uint8_t *)\u0022the-keyid\u0022, 9);\n+\tif (!ck)\n+\t\treturn 1;\n+\n+\t// lws_cose_key_dump(ck);\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-cose/main.c b/minimal-examples-lowlevel/api-tests/api-test-cose/main.c\nnew file mode 100644\nindex 0000000..19de29c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-cose/main.c\n@@ -0,0 +1,50 @@\n+/*\n+ * lws-api-test-cose\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+int\n+test_cose_keys(struct lws_context *context);\n+int\n+test_cose_sign(struct lws_context *context);\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint result \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS COSE api tests\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\tinfo.options \u003d 0;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tresult |\u003d test_cose_keys(context);\n+\tresult |\u003d test_cose_sign(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, result ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-cose/sign.c b/minimal-examples-lowlevel/api-tests/api-test-cose/sign.c\nnew file mode 100644\nindex 0000000..6c8c50b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-cose/sign.c\n@@ -0,0 +1,1862 @@\n+/*\n+ * lws-api-test-jose - RFC8152 cose_sign tests\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Raw key CBOR created from descriptions at\n+ *\n+ * https://github.com/cose-wg/Examples/blob/master/KeySet.txt\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+static const uint8_t\n+\tsign1_pass_01[] \u003d {\n+\t\t/*\n+\t\t * https://github.com/cose-wg/Examples/blob/master/\n+\t\t * sign1-tests/sign-pass-01.json\n+\t\t */\n+\t\t0xd2, 0x84, 0x41, 0xa0, 0xa2,\n+\t\t0x01, 0x26, 0x04, 0x42, 0x31,\n+\t\t0x31, 0x54, 0x54, 0x68, 0x69,\n+\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n+\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n+\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n+\t\t0x74, 0x2e, 0x58, 0x40, 0x87,\n+\t\t0xdb, 0x0d, 0x2e, 0x55, 0x71,\n+\t\t0x84, 0x3b, 0x78, 0xac, 0x33,\n+\t\t0xec, 0xb2, 0x83, 0x0d, 0xf7,\n+\t\t0xb6, 0xe0, 0xa4, 0xd5, 0xb7,\n+\t\t0x37, 0x6d, 0xe3, 0x36, 0xb2,\n+\t\t0x3c, 0x59, 0x1c, 0x90, 0xc4,\n+\t\t0x25, 0x31, 0x7e, 0x56, 0x12,\n+\t\t0x7f, 0xbe, 0x04, 0x37, 0x00,\n+\t\t0x97, 0xce, 0x34, 0x70, 0x87,\n+\t\t0xb2, 0x33, 0xbf, 0x72, 0x2b,\n+\t\t0x64, 0x07, 0x2b, 0xeb, 0x44,\n+\t\t0x86, 0xbd, 0xa4, 0x03, 0x1d,\n+\t\t0x27, 0x24, 0x4f },\n+\tsign1_pass_02[] \u003d {\n+\t\t0xd2, 0x84, 0x43, 0xa1, 0x01,\n+\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n+\t\t0x31, 0x54, 0x54, 0x68, 0x69,\n+\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n+\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n+\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n+\t\t0x74, 0x2e, 0x58, 0x40, 0x10,\n+\t\t0x72, 0x9c, 0xd7, 0x11, 0xcb,\n+\t\t0x38, 0x13, 0xd8, 0xd8, 0xe9,\n+\t\t0x44, 0xa8, 0xda, 0x71, 0x11,\n+\t\t0xe7, 0xb2, 0x58, 0xc9, 0xbd,\n+\t\t0xca, 0x61, 0x35, 0xf7, 0xae,\n+\t\t0x1a, 0xdb, 0xee, 0x95, 0x09,\n+\t\t0x89, 0x12, 0x67, 0x83, 0x7e,\n+\t\t0x1e, 0x33, 0xbd, 0x36, 0xc1,\n+\t\t0x50, 0x32, 0x6a, 0xe6, 0x27,\n+\t\t0x55, 0xc6, 0xbd, 0x8e, 0x54,\n+\t\t0x0c, 0x3e, 0x8f, 0x92, 0xd7,\n+\t\t0xd2, 0x25, 0xe8, 0xdb, 0x72,\n+\t\t0xb8, 0x82, 0x0b },\n+\n+\tsign1_pass_02_ext[] \u003d {\n+\t\t0x11, 0xaa, 0x22, 0xbb, 0x33,\n+\t\t0xcc, 0x44, 0xdd, 0x55, 0x00,\n+\t\t0x66, 0x99 },\n+\n+\tsign1_pass_03[] \u003d {\n+\t\t0x84, 0x43, 0xa1, 0x01, 0x26,\n+\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n+\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t0x2e, 0x58, 0x40, 0x8e, 0xb3,\n+\t\t0x3e, 0x4c, 0xa3, 0x1d, 0x1c,\n+\t\t0x46, 0x5a, 0xb0, 0x5a, 0xac,\n+\t\t0x34, 0xcc, 0x6b, 0x23, 0xd5,\n+\t\t0x8f, 0xef, 0x5c, 0x08, 0x31,\n+\t\t0x06, 0xc4, 0xd2, 0x5a, 0x91,\n+\t\t0xae, 0xf0, 0xb0, 0x11, 0x7e,\n+\t\t0x2a, 0xf9, 0xa2, 0x91, 0xaa,\n+\t\t0x32, 0xe1, 0x4a, 0xb8, 0x34,\n+\t\t0xdc, 0x56, 0xed, 0x2a, 0x22,\n+\t\t0x34, 0x44, 0x54, 0x7e, 0x01,\n+\t\t0xf1, 0x1d, 0x3b, 0x09, 0x16,\n+\t\t0xe5, 0xa4, 0xc3, 0x45, 0xca,\n+\t\t0xcb, 0x36 },\n+\tsign1_fail_01[] \u003d {\n+\t\t0xd9, 0x03, 0xe6, 0x84, 0x43,\n+\t\t0xa1, 0x01, 0x26, 0xa1, 0x04,\n+\t\t0x42, 0x31, 0x31, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n+\t\t0x40, 0x8e, 0xb3, 0x3e, 0x4c,\n+\t\t0xa3, 0x1d, 0x1c, 0x46, 0x5a,\n+\t\t0xb0, 0x5a, 0xac, 0x34, 0xcc,\n+\t\t0x6b, 0x23, 0xd5, 0x8f, 0xef,\n+\t\t0x5c, 0x08, 0x31, 0x06, 0xc4,\n+\t\t0xd2, 0x5a, 0x91, 0xae, 0xf0,\n+\t\t0xb0, 0x11, 0x7e, 0x2a, 0xf9,\n+\t\t0xa2, 0x91, 0xaa, 0x32, 0xe1,\n+\t\t0x4a, 0xb8, 0x34, 0xdc, 0x56,\n+\t\t0xed, 0x2a, 0x22, 0x34, 0x44,\n+\t\t0x54, 0x7e, 0x01, 0xf1, 0x1d,\n+\t\t0x3b, 0x09, 0x16, 0xe5, 0xa4,\n+\t\t0xc3, 0x45, 0xca, 0xcb, 0x36 },\n+\tsign1_fail_02[] \u003d {\n+\t\t0xd2, 0x84, 0x43, 0xa1, 0x01,\n+\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n+\t\t0x31, 0x54, 0x54, 0x68, 0x69,\n+\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n+\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n+\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n+\t\t0x74, 0x2f, 0x58, 0x40, 0x8e,\n+\t\t0xb3, 0x3e, 0x4c, 0xa3, 0x1d,\n+\t\t0x1c, 0x46, 0x5a, 0xb0, 0x5a,\n+\t\t0xac, 0x34, 0xcc, 0x6b, 0x23,\n+\t\t0xd5, 0x8f, 0xef, 0x5c, 0x08,\n+\t\t0x31, 0x06, 0xc4, 0xd2, 0x5a,\n+\t\t0x91, 0xae, 0xf0, 0xb0, 0x11,\n+\t\t0x7e, 0x2a, 0xf9, 0xa2, 0x91,\n+\t\t0xaa, 0x32, 0xe1, 0x4a, 0xb8,\n+\t\t0x34, 0xdc, 0x56, 0xed, 0x2a,\n+\t\t0x22, 0x34, 0x44, 0x54, 0x7e,\n+\t\t0x01, 0xf1, 0x1d, 0x3b, 0x09,\n+\t\t0x16, 0xe5, 0xa4, 0xc3, 0x45,\n+\t\t0xca, 0xcb, 0x36 },\n+\tsign1_fail_03[] \u003d {\n+\t\t0xd2, 0x84, 0x45, 0xa1, 0x01,\n+\t\t0x39, 0x03, 0xe6, 0xa1, 0x04,\n+\t\t0x42, 0x31, 0x31, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n+\t\t0x40, 0x8e, 0xb3, 0x3e, 0x4c,\n+\t\t0xa3, 0x1d, 0x1c, 0x46, 0x5a,\n+\t\t0xb0, 0x5a, 0xac, 0x34, 0xcc,\n+\t\t0x6b, 0x23, 0xd5, 0x8f, 0xef,\n+\t\t0x5c, 0x08, 0x31, 0x06, 0xc4,\n+\t\t0xd2, 0x5a, 0x91, 0xae, 0xf0,\n+\t\t0xb0, 0x11, 0x7e, 0x2a, 0xf9,\n+\t\t0xa2, 0x91, 0xaa, 0x32, 0xe1,\n+\t\t0x4a, 0xb8, 0x34, 0xdc, 0x56,\n+\t\t0xed, 0x2a, 0x22, 0x34, 0x44,\n+\t\t0x54, 0x7e, 0x01, 0xf1, 0x1d,\n+\t\t0x3b, 0x09, 0x16, 0xe5, 0xa4,\n+\t\t0xc3, 0x45, 0xca, 0xcb, 0x36 },\n+\tsign1_fail_04[] \u003d {\n+\t\t0xd2, 0x84, 0x4a, 0xa1, 0x01,\n+\t\t0x67, 0x75, 0x6e, 0x6b, 0x6e,\n+\t\t0x6f, 0x77, 0x6e, 0xa1, 0x04,\n+\t\t0x42, 0x31, 0x31, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n+\t\t0x40, 0x8e, 0xb3, 0x3e, 0x4c,\n+\t\t0xa3, 0x1d, 0x1c, 0x46, 0x5a,\n+\t\t0xb0, 0x5a, 0xac, 0x34, 0xcc,\n+\t\t0x6b, 0x23, 0xd5, 0x8f, 0xef,\n+\t\t0x5c, 0x08, 0x31, 0x06, 0xc4,\n+\t\t0xd2, 0x5a, 0x91, 0xae, 0xf0,\n+\t\t0xb0, 0x11, 0x7e, 0x2a, 0xf9,\n+\t\t0xa2, 0x91, 0xaa, 0x32, 0xe1,\n+\t\t0x4a, 0xb8, 0x34, 0xdc, 0x56,\n+\t\t0xed, 0x2a, 0x22, 0x34, 0x44,\n+\t\t0x54, 0x7e, 0x01, 0xf1, 0x1d,\n+\t\t0x3b, 0x09, 0x16, 0xe5, 0xa4,\n+\t\t0xc3, 0x45, 0xca, 0xcb, 0x36 },\n+\n+\t\t/* sign1/fail05 is missing upstream */\n+\n+\tsign1_fail_06[] \u003d {\n+\t\t0xd2, 0x84, 0x45, 0xa2, 0x01,\n+\t\t0x26, 0x03, 0x00, 0xa1, 0x04,\n+\t\t0x42, 0x31, 0x31, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n+\t\t0x40, 0x8e, 0xb3, 0x3e, 0x4c,\n+\t\t0xa3, 0x1d, 0x1c, 0x46, 0x5a,\n+\t\t0xb0, 0x5a, 0xac, 0x34, 0xcc,\n+\t\t0x6b, 0x23, 0xd5, 0x8f, 0xef,\n+\t\t0x5c, 0x08, 0x31, 0x06, 0xc4,\n+\t\t0xd2, 0x5a, 0x91, 0xae, 0xf0,\n+\t\t0xb0, 0x11, 0x7e, 0x2a, 0xf9,\n+\t\t0xa2, 0x91, 0xaa, 0x32, 0xe1,\n+\t\t0x4a, 0xb8, 0x34, 0xdc, 0x56,\n+\t\t0xed, 0x2a, 0x22, 0x34, 0x44,\n+\t\t0x54, 0x7e, 0x01, 0xf1, 0x1d,\n+\t\t0x3b, 0x09, 0x16, 0xe5, 0xa4,\n+\t\t0xc3, 0x45, 0xca, 0xcb, 0x36 },\n+\n+\tsign1_fail_07[] \u003d {\n+\t\t0xd2, 0x84, 0x43, 0xa1, 0x01,\n+\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n+\t\t0x31, 0x54, 0x54, 0x68, 0x69,\n+\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n+\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n+\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n+\t\t0x74, 0x2e, 0x58, 0x40, 0x65,\n+\t\t0x20, 0xbb, 0xaf, 0x20, 0x81,\n+\t\t0xd7, 0xe0, 0xed, 0x0f, 0x95,\n+\t\t0xf7, 0x6e, 0xb0, 0x73, 0x3d,\n+\t\t0x66, 0x70, 0x05, 0xf7, 0x46,\n+\t\t0x7c, 0xec, 0x4b, 0x87, 0xb9,\n+\t\t0x38, 0x1a, 0x6b, 0xa1, 0xed,\n+\t\t0xe8, 0xe0, 0x0d, 0xf2, 0x9f,\n+\t\t0x32, 0xa3, 0x72, 0x30, 0xf3,\n+\t\t0x9a, 0x84, 0x2a, 0x54, 0x82,\n+\t\t0x1f, 0xdd, 0x22, 0x30, 0x92,\n+\t\t0x81, 0x9d, 0x77, 0x28, 0xef,\n+\t\t0xb9, 0xd3, 0xa0, 0x08, 0x0b,\n+\t\t0x75, 0x38, 0x0b },\n+\n+\tsign_pass_01[] \u003d {\n+\t\t0xd8, 0x62, 0x84, 0x41, 0xa0,\n+\t\t0xa0, 0x54, 0x54, 0x68, 0x69,\n+\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n+\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n+\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n+\t\t0x74, 0x2e, 0x81, 0x83, 0x43,\n+\t\t0xa1, 0x01, 0x26, 0xa1, 0x04,\n+\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n+\t\t0xe2, 0xae, 0xaf, 0xd4, 0x0d,\n+\t\t0x69, 0xd1, 0x9d, 0xfe, 0x6e,\n+\t\t0x52, 0x07, 0x7c, 0x5d, 0x7f,\n+\t\t0xf4, 0xe4, 0x08, 0x28, 0x2c,\n+\t\t0xbe, 0xfb, 0x5d, 0x06, 0xcb,\n+\t\t0xf4, 0x14, 0xaf, 0x2e, 0x19,\n+\t\t0xd9, 0x82, 0xac, 0x45, 0xac,\n+\t\t0x98, 0xb8, 0x54, 0x4c, 0x90,\n+\t\t0x8b, 0x45, 0x07, 0xde, 0x1e,\n+\t\t0x90, 0xb7, 0x17, 0xc3, 0xd3,\n+\t\t0x48, 0x16, 0xfe, 0x92, 0x6a,\n+\t\t0x2b, 0x98, 0xf5, 0x3a, 0xfd,\n+\t\t0x2f, 0xa0, 0xf3, 0x0a },\n+\n+\tsign_pass_02[] \u003d {\n+\t\t0xd8, 0x62, 0x84, 0x40, 0xa0,\n+\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t0x2e, 0x81, 0x83, 0x43, 0xa1,\n+\t\t0x01, 0x26, 0xa1, 0x04, 0x42,\n+\t\t0x31, 0x31, 0x58, 0x40, 0xcb,\n+\t\t0xb8, 0xda, 0xd9, 0xbe, 0xaf,\n+\t\t0xb8, 0x90, 0xe1, 0xa4, 0x14,\n+\t\t0x12, 0x4d, 0x8b, 0xfb, 0xc2,\n+\t\t0x6b, 0xed, 0xf2, 0xa9, 0x4f,\n+\t\t0xcb, 0x5a, 0x88, 0x24, 0x32,\n+\t\t0xbf, 0xf6, 0xd6, 0x3e, 0x15,\n+\t\t0xf5, 0x74, 0xee, 0xb2, 0xab,\n+\t\t0x51, 0xd8, 0x3f, 0xa2, 0xcb,\n+\t\t0xf6, 0x26, 0x72, 0xeb, 0xf4,\n+\t\t0xc7, 0xd9, 0x93, 0xb0, 0xf4,\n+\t\t0xc2, 0x44, 0x76, 0x47, 0xd8,\n+\t\t0x31, 0xba, 0x57, 0xcc, 0xa8,\n+\t\t0x6b, 0x93, 0x0a },\n+\n+\tsign_pass_03[] \u003d {\n+\t\t0x84, 0x40, 0xa0, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n+\t\t0x83, 0x43, 0xa1, 0x01, 0x26,\n+\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n+\t\t0x58, 0x40, 0xe2, 0xae, 0xaf,\n+\t\t0xd4, 0x0d, 0x69, 0xd1, 0x9d,\n+\t\t0xfe, 0x6e, 0x52, 0x07, 0x7c,\n+\t\t0x5d, 0x7f, 0xf4, 0xe4, 0x08,\n+\t\t0x28, 0x2c, 0xbe, 0xfb, 0x5d,\n+\t\t0x06, 0xcb, 0xf4, 0x14, 0xaf,\n+\t\t0x2e, 0x19, 0xd9, 0x82, 0xac,\n+\t\t0x45, 0xac, 0x98, 0xb8, 0x54,\n+\t\t0x4c, 0x90, 0x8b, 0x45, 0x07,\n+\t\t0xde, 0x1e, 0x90, 0xb7, 0x17,\n+\t\t0xc3, 0xd3, 0x48, 0x16, 0xfe,\n+\t\t0x92, 0x6a, 0x2b, 0x98, 0xf5,\n+\t\t0x3a, 0xfd, 0x2f, 0xa0, 0xf3,\n+\t\t0x0a },\n+\n+\tsign_fail_01[] \u003d {\n+\t\t0xd9, 0x03, 0xe6, 0x84, 0x40,\n+\t\t0xa0, 0x54, 0x54, 0x68, 0x69,\n+\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n+\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n+\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n+\t\t0x74, 0x2e, 0x81, 0x83, 0x43,\n+\t\t0xa1, 0x01, 0x26, 0xa1, 0x04,\n+\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n+\t\t0xe2, 0xae, 0xaf, 0xd4, 0x0d,\n+\t\t0x69, 0xd1, 0x9d, 0xfe, 0x6e,\n+\t\t0x52, 0x07, 0x7c, 0x5d, 0x7f,\n+\t\t0xf4, 0xe4, 0x08, 0x28, 0x2c,\n+\t\t0xbe, 0xfb, 0x5d, 0x06, 0xcb,\n+\t\t0xf4, 0x14, 0xaf, 0x2e, 0x19,\n+\t\t0xd9, 0x82, 0xac, 0x45, 0xac,\n+\t\t0x98, 0xb8, 0x54, 0x4c, 0x90,\n+\t\t0x8b, 0x45, 0x07, 0xde, 0x1e,\n+\t\t0x90, 0xb7, 0x17, 0xc3, 0xd3,\n+\t\t0x48, 0x16, 0xfe, 0x92, 0x6a,\n+\t\t0x2b, 0x98, 0xf5, 0x3a, 0xfd,\n+\t\t0x2f, 0xa0, 0xf3, 0x0a },\n+\n+\tsign_fail_02[] \u003d {\n+\t\t0xd8, 0x62, 0x84, 0x40, 0xa0,\n+\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t0x2e, 0x81, 0x83, 0x43, 0xa1,\n+\t\t0x01, 0x26, 0xa1, 0x04, 0x42,\n+\t\t0x31, 0x31, 0x58, 0x40, 0xe2,\n+\t\t0xae, 0xaf, 0xd4, 0x0d, 0x69,\n+\t\t0xd1, 0x9d, 0xfe, 0x6e, 0x52,\n+\t\t0x07, 0x7c, 0x5d, 0x7f, 0xf4,\n+\t\t0xe4, 0x08, 0x28, 0x2c, 0xbe,\n+\t\t0xfb, 0x5d, 0x06, 0xcb, 0xf4,\n+\t\t0x14, 0xaf, 0x2e, 0x19, 0xd9,\n+\t\t0x82, 0xac, 0x45, 0xac, 0x98,\n+\t\t0xb8, 0x54, 0x4c, 0x90, 0x8b,\n+\t\t0x45, 0x07, 0xde, 0x1e, 0x90,\n+\t\t0xb7, 0x17, 0xc3, 0xd3, 0x48,\n+\t\t0x16, 0xfe, 0x92, 0x6a, 0x2b,\n+\t\t0x98, 0xf5, 0x3a, 0xfd, 0x2f,\n+\t\t0xa0, 0xf3, 0x0b },\n+\n+\tsign_fail_03[] \u003d {\n+\t\t0xd8, 0x62, 0x84, 0x40, 0xa0,\n+\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t0x2e, 0x81, 0x83, 0x45, 0xa1,\n+\t\t0x01, 0x39, 0x03, 0xe6, 0xa1,\n+\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t0x40, 0xe2, 0xae, 0xaf, 0xd4,\n+\t\t0x0d, 0x69, 0xd1, 0x9d, 0xfe,\n+\t\t0x6e, 0x52, 0x07, 0x7c, 0x5d,\n+\t\t0x7f, 0xf4, 0xe4, 0x08, 0x28,\n+\t\t0x2c, 0xbe, 0xfb, 0x5d, 0x06,\n+\t\t0xcb, 0xf4, 0x14, 0xaf, 0x2e,\n+\t\t0x19, 0xd9, 0x82, 0xac, 0x45,\n+\t\t0xac, 0x98, 0xb8, 0x54, 0x4c,\n+\t\t0x90, 0x8b, 0x45, 0x07, 0xde,\n+\t\t0x1e, 0x90, 0xb7, 0x17, 0xc3,\n+\t\t0xd3, 0x48, 0x16, 0xfe, 0x92,\n+\t\t0x6a, 0x2b, 0x98, 0xf5, 0x3a,\n+\t\t0xfd, 0x2f, 0xa0, 0xf3, 0x0a },\n+\n+\tsign_fail_04[] \u003d {\n+\t\t0xd8, 0x62, 0x84, 0x40, 0xa0,\n+\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t0x2e, 0x81, 0x83, 0x4a, 0xa1,\n+\t\t0x01, 0x67, 0x75, 0x6e, 0x6b,\n+\t\t0x6e, 0x6f, 0x77, 0x6e, 0xa1,\n+\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t0x40, 0xe2, 0xae, 0xaf, 0xd4,\n+\t\t0x0d, 0x69, 0xd1, 0x9d, 0xfe,\n+\t\t0x6e, 0x52, 0x07, 0x7c, 0x5d,\n+\t\t0x7f, 0xf4, 0xe4, 0x08, 0x28,\n+\t\t0x2c, 0xbe, 0xfb, 0x5d, 0x06,\n+\t\t0xcb, 0xf4, 0x14, 0xaf, 0x2e,\n+\t\t0x19, 0xd9, 0x82, 0xac, 0x45,\n+\t\t0xac, 0x98, 0xb8, 0x54, 0x4c,\n+\t\t0x90, 0x8b, 0x45, 0x07, 0xde,\n+\t\t0x1e, 0x90, 0xb7, 0x17, 0xc3,\n+\t\t0xd3, 0x48, 0x16, 0xfe, 0x92,\n+\t\t0x6a, 0x2b, 0x98, 0xf5, 0x3a,\n+\t\t0xfd, 0x2f, 0xa0, 0xf3, 0x0a },\n+\n+\t\t/* fail 5 missing upstream */\n+\n+\tsign_fail_06[] \u003d {\n+\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n+\t\t0x03, 0x00, 0xa0, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n+\t\t0x83, 0x43, 0xa1, 0x01, 0x26,\n+\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n+\t\t0x58, 0x40, 0xe2, 0xae, 0xaf,\n+\t\t0xd4, 0x0d, 0x69, 0xd1, 0x9d,\n+\t\t0xfe, 0x6e, 0x52, 0x07, 0x7c,\n+\t\t0x5d, 0x7f, 0xf4, 0xe4, 0x08,\n+\t\t0x28, 0x2c, 0xbe, 0xfb, 0x5d,\n+\t\t0x06, 0xcb, 0xf4, 0x14, 0xaf,\n+\t\t0x2e, 0x19, 0xd9, 0x82, 0xac,\n+\t\t0x45, 0xac, 0x98, 0xb8, 0x54,\n+\t\t0x4c, 0x90, 0x8b, 0x45, 0x07,\n+\t\t0xde, 0x1e, 0x90, 0xb7, 0x17,\n+\t\t0xc3, 0xd3, 0x48, 0x16, 0xfe,\n+\t\t0x92, 0x6a, 0x2b, 0x98, 0xf5,\n+\t\t0x3a, 0xfd, 0x2f, 0xa0, 0xf3,\n+\t\t0x0a },\n+\n+\tsign_fail_07[] \u003d {\n+\t\t0xd8, 0x62, 0x84, 0x41, 0xa0,\n+\t\t0xa0, 0x54, 0x54, 0x68, 0x69,\n+\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n+\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n+\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n+\t\t0x74, 0x2e, 0x81, 0x83, 0x43,\n+\t\t0xa1, 0x01, 0x26, 0xa1, 0x04,\n+\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n+\t\t0xd7, 0x1c, 0x05, 0xdb, 0x52,\n+\t\t0xc9, 0xce, 0x7f, 0x1b, 0xf5,\n+\t\t0xaa, 0xc0, 0x13, 0x34, 0xbb,\n+\t\t0xea, 0xca, 0xc1, 0xd8, 0x6a,\n+\t\t0x23, 0x03, 0xe6, 0xee, 0xaa,\n+\t\t0x89, 0x26, 0x6f, 0x45, 0xc0,\n+\t\t0x1e, 0xd6, 0x02, 0xca, 0x64,\n+\t\t0x9e, 0xaf, 0x79, 0x0d, 0x8b,\n+\t\t0xc9, 0x9d, 0x24, 0x58, 0x45,\n+\t\t0x7c, 0xa6, 0xa8, 0x72, 0x06,\n+\t\t0x19, 0x40, 0xe7, 0xaf, 0xbe,\n+\t\t0x48, 0xe2, 0x89, 0xdf, 0xac,\n+\t\t0x14, 0x6a, 0xe2, 0x58 },\n+\n+\tsign_hmac_01[] \u003d {\n+\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n+\t\t0x01, 0x05, 0xa0, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n+\t\t0x20, 0x2b, 0xdc, 0xc8, 0x9f,\n+\t\t0x05, 0x82, 0x16, 0xb8, 0xa2,\n+\t\t0x08, 0xdd, 0xc6, 0xd8, 0xb5,\n+\t\t0x4a, 0xa9, 0x1f, 0x48, 0xbd,\n+\t\t0x63, 0x48, 0x49, 0x86, 0x56,\n+\t\t0x51, 0x05, 0xc9, 0xad, 0x5a,\n+\t\t0x66, 0x82, 0xf6, 0x81, 0x83,\n+\t\t0x40, 0xa2, 0x01, 0x25, 0x04,\n+\t\t0x4a, 0x6f, 0x75, 0x72, 0x2d,\n+\t\t0x73, 0x65, 0x63, 0x72, 0x65,\n+\t\t0x74, 0x40 },\n+\n+\tsign_hmac_02[] \u003d {\n+\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n+\t\t0x01, 0x06, 0xa0, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n+\t\t0x30, 0xb3, 0x09, 0x7f, 0x70,\n+\t\t0x00, 0x9a, 0x11, 0x50, 0x74,\n+\t\t0x09, 0x59, 0x8a, 0x83, 0xe1,\n+\t\t0x5b, 0xbb, 0xbf, 0x19, 0x82,\n+\t\t0xdc, 0xe2, 0x8e, 0x5a, 0xb6,\n+\t\t0xd5, 0xa6, 0xaf, 0xf6, 0x89,\n+\t\t0x7b, 0xd2, 0x4b, 0xb8, 0xb7,\n+\t\t0x47, 0x96, 0x22, 0xc9, 0x40,\n+\t\t0x1b, 0x24, 0x09, 0x0d, 0x45,\n+\t\t0x82, 0x06, 0xd5, 0x87, 0x81,\n+\t\t0x83, 0x40, 0xa2, 0x01, 0x25,\n+\t\t0x04, 0x46, 0x73, 0x65, 0x63,\n+\t\t0x2d, 0x34, 0x38, 0x40 },\n+\n+\tsign_hmac_03[] \u003d {\n+\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n+\t\t0x01, 0x07, 0xa0, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n+\t\t0x40, 0xcd, 0x28, 0xa6, 0xb3,\n+\t\t0xcf, 0xbb, 0xbf, 0x21, 0x48,\n+\t\t0x51, 0xb9, 0x06, 0xe0, 0x50,\n+\t\t0x05, 0x6c, 0xb4, 0x38, 0xa8,\n+\t\t0xb8, 0x89, 0x05, 0xb8, 0xb7,\n+\t\t0x46, 0x19, 0x77, 0x02, 0x27,\n+\t\t0x11, 0xa9, 0xd8, 0xac, 0x5d,\n+\t\t0xbc, 0x54, 0xe2, 0x9a, 0x56,\n+\t\t0xd9, 0x26, 0x04, 0x6b, 0x40,\n+\t\t0xfc, 0x26, 0x07, 0xc2, 0x5b,\n+\t\t0x34, 0x44, 0x54, 0xaa, 0x5f,\n+\t\t0x68, 0xde, 0x09, 0xa3, 0xe5,\n+\t\t0x25, 0xd3, 0x86, 0x5a, 0x05,\n+\t\t0x81, 0x83, 0x40, 0xa2, 0x01,\n+\t\t0x25, 0x04, 0x46, 0x73, 0x65,\n+\t\t0x63, 0x2d, 0x36, 0x34, 0x40 },\n+\n+\tsign_hmac_04[] \u003d {\n+\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n+\t\t0x01, 0x05, 0xa0, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n+\t\t0x20, 0x2b, 0xdc, 0xc8, 0x9f,\n+\t\t0x05, 0x82, 0x16, 0xb8, 0xa2,\n+\t\t0x08, 0xdd, 0xc6, 0xd8, 0xb5,\n+\t\t0x4a, 0xa9, 0x1f, 0x48, 0xbd,\n+\t\t0x63, 0x48, 0x49, 0x86, 0x56,\n+\t\t0x51, 0x05, 0xc9, 0xad, 0x5a,\n+\t\t0x66, 0x82, 0xf7, 0x81, 0x83,\n+\t\t0x40, 0xa2, 0x01, 0x25, 0x04,\n+\t\t0x4a, 0x6f, 0x75, 0x72, 0x2d,\n+\t\t0x73, 0x65, 0x63, 0x72, 0x65,\n+\t\t0x74, 0x40 },\n+\n+\tsign_hmac_05[] \u003d {\n+\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n+\t\t0x01, 0x04, 0xa0, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x48,\n+\t\t0x6f, 0x35, 0xca, 0xb7, 0x79,\n+\t\t0xf7, 0x78, 0x33, 0x81, 0x83,\n+\t\t0x40, 0xa2, 0x01, 0x25, 0x04,\n+\t\t0x4a, 0x6f, 0x75, 0x72, 0x2d,\n+\t\t0x73, 0x65, 0x63, 0x72, 0x65,\n+\t\t0x74, 0x40 },\n+\n+\tenc_hmac_01[] \u003d {\n+\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n+\t\t0x05, 0xa0, 0x54, 0x54, 0x68,\n+\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n+\t\t0x6e, 0x74, 0x2e, 0x58, 0x20,\n+\t\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n+\t\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n+\t\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n+\t\t0x47, 0x72, 0xf2, 0x23, 0xad,\n+\t\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n+\t\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n+\t\t0x8c, 0x58 },\n+\n+\tenc_hmac_02[] \u003d {\n+\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n+\t\t0x06, 0xa0, 0x54, 0x54, 0x68,\n+\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n+\t\t0x6e, 0x74, 0x2e, 0x58, 0x30,\n+\t\t0x99, 0x8d, 0x26, 0xc6, 0x45,\n+\t\t0x9a, 0xae, 0xec, 0xf4, 0x4e,\n+\t\t0xd2, 0x0c, 0xe0, 0x0c, 0x8c,\n+\t\t0xce, 0xdf, 0x0a, 0x1f, 0x3d,\n+\t\t0x22, 0xa9, 0x2f, 0xc0, 0x5d,\n+\t\t0xb0, 0x8c, 0x5a, 0xeb, 0x1c,\n+\t\t0xb5, 0x94, 0xca, 0xaf, 0x5a,\n+\t\t0x5c, 0x5e, 0x2e, 0x9d, 0x01,\n+\t\t0xcc, 0xe7, 0xe7, 0x7a, 0x93,\n+\t\t0xaa, 0x8c, 0x62 },\n+\n+\tenc_hmac_03[] \u003d {\n+\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n+\t\t0x07, 0xa0, 0x54, 0x54, 0x68,\n+\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n+\t\t0x6e, 0x74, 0x2e, 0x58, 0x40,\n+\t\t0x4a, 0x55, 0x5b, 0xf9, 0x71,\n+\t\t0xf7, 0xc1, 0x89, 0x1d, 0x9d,\n+\t\t0xdf, 0x30, 0x4a, 0x1a, 0x13,\n+\t\t0x2e, 0x2d, 0x6f, 0x81, 0x74,\n+\t\t0x49, 0x47, 0x4d, 0x81, 0x3e,\n+\t\t0x6d, 0x04, 0xd6, 0x59, 0x62,\n+\t\t0xbe, 0xd8, 0xbb, 0xa7, 0x0c,\n+\t\t0x17, 0xe1, 0xf5, 0x30, 0x8f,\n+\t\t0xa3, 0x99, 0x62, 0x95, 0x9a,\n+\t\t0x4b, 0x9b, 0x8d, 0x7d, 0xa8,\n+\t\t0xe6, 0xd8, 0x49, 0xb2, 0x09,\n+\t\t0xdc, 0xd3, 0xe9, 0x8c, 0xc0,\n+\t\t0xf1, 0x1e, 0xdd, 0xf2 },\n+\n+\tenc_hmac_04[] \u003d {\n+\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n+\t\t0x05, 0xa0, 0x54, 0x54, 0x68,\n+\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n+\t\t0x6e, 0x74, 0x2e, 0x58, 0x20,\n+\t\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n+\t\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n+\t\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n+\t\t0x47, 0x72, 0xf2, 0x23, 0xad,\n+\t\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n+\t\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n+\t\t0x8c, 0x59 },\n+\n+\tenc_hmac_05[] \u003d {\n+\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n+\t\t0x04, 0xa0, 0x54, 0x54, 0x68,\n+\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n+\t\t0x6e, 0x74, 0x2e, 0x48, 0x11,\n+\t\t0xf9, 0xe3, 0x57, 0x97, 0x5f,\n+\t\t0xb8, 0x49 }\n+#if 0\n+,\n+\n+\tcountersign_sign_01[] \u003d {\n+\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n+\t\t0x03, 0x00, 0xa0, 0x54, 0x54,\n+\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n+\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n+\t\t0xa2, 0x07, 0x83, 0x43, 0xa1,\n+\t\t0x01, 0x27, 0xa1, 0x04, 0x42,\n+\t\t0x31, 0x31, 0x58, 0x40, 0x8e,\n+\t\t0x1b, 0xe2, 0xf9, 0x45, 0x3d,\n+\t\t0x26, 0x48, 0x12, 0xe5, 0x90,\n+\t\t0x49, 0x91, 0x32, 0xbe, 0xf3,\n+\t\t0xfb, 0xf9, 0xee, 0x9d, 0xb2,\n+\t\t0x7c, 0x2c, 0x16, 0x87, 0x88,\n+\t\t0xe3, 0xb7, 0xeb, 0xe5, 0x06,\n+\t\t0xc0, 0x4f, 0xd3, 0xd1, 0x9f,\n+\t\t0xaa, 0x9f, 0x51, 0x23, 0x2a,\n+\t\t0xf5, 0xc9, 0x59, 0xe4, 0xef,\n+\t\t0x47, 0x92, 0x88, 0x34, 0x64,\n+\t\t0x7f, 0x56, 0xdf, 0xbe, 0x93,\n+\t\t0x91, 0x12, 0x88, 0x4d, 0x08,\n+\t\t0xef, 0x25, 0x05, 0x04, 0x42,\n+\t\t0x31, 0x31, 0x58, 0x40, 0x77,\n+\t\t0xf3, 0xea, 0xcd, 0x11, 0x85,\n+\t\t0x2c, 0x4b, 0xf9, 0xcb, 0x1d,\n+\t\t0x72, 0xfa, 0xbe, 0x6b, 0x26,\n+\t\t0xfb, 0xa1, 0xd7, 0x60, 0x92,\n+\t\t0xb2, 0xb5, 0xb7, 0xec, 0x83,\n+\t\t0xb8, 0x35, 0x57, 0x65, 0x22,\n+\t\t0x64, 0xe6, 0x96, 0x90, 0xdb,\n+\t\t0xc1, 0x17, 0x2d, 0xdc, 0x0b,\n+\t\t0xf8, 0x84, 0x11, 0xc0, 0xd2,\n+\t\t0x5a, 0x50, 0x7f, 0xdb, 0x24,\n+\t\t0x7a, 0x20, 0xc4, 0x0d, 0x5e,\n+\t\t0x24, 0x5f, 0xab, 0xd3, 0xfc,\n+\t\t0x9e, 0xc1, 0x06 }\n+#endif\n+;\n+\n+extern const struct {\n+\tconst uint8_t\t\t*set;\n+\tsize_t\t\t\tlen;\n+} keyset1, key3, key8, key9, key10;\n+\n+static int\n+xcb(lws_cose_sig_ext_pay_t *x)\n+{\n+\tx-\u003eext \u003d sign1_pass_02_ext;\n+\tx-\u003exl \u003d sizeof(sign1_pass_02_ext);\n+\n+\treturn LCOSESIGEXTCB_RET_FINISHED;\n+}\n+\n+\n+\n+int\n+test_cose_sign(struct lws_context *context)\n+{\n+\tstruct lws_cose_validate_context *cps;\n+\tlws_cose_validate_create_info_t info;\n+\tlws_cose_validate_res_t *res;\n+\tlws_dll2_owner_t set;\n+\tlws_dll2_owner_t *o;\n+\tint n;\n+\n+\tmemset(\u0026info, 0, sizeof(info));\n+\tinfo.cx \u003d context;\n+\tinfo.keyset \u003d \u0026set;\n+\n+#if 1\n+\t{\n+\t\tint fd \u003d open(\u0022sign_hmac01.sig\u0022,\n+\t\t\t LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);\n+\n+\t\tif (fd \u003e\u003d 0) {\n+\t\t\twrite(fd, sign_hmac_01, sizeof(sign_hmac_01));\n+\t\t\tclose(fd);\n+\t\t}\n+\t}\n+#endif\n+\n+\t/*\n+\t * valid sign1 we have key for\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-pass-01\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_pass_01, sizeof(sign1_pass_01),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid sign1 but empty key set, so can't judge it\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-pass-01 - no key\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_pass_01, sizeof(sign1_pass_01),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid sign1\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-pass-02\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tinfo.ext_cb \u003d xcb;\n+\tinfo.ext_len \u003d sizeof(sign1_pass_02_ext);\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_pass_02, sizeof(sign1_pass_02),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid sign1 without enclosing tag\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-pass-03\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tinfo.ext_cb \u003d NULL;\n+\tinfo.ext_len \u003d 0;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_pass_03, sizeof(sign1_pass_03),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * sign1 with wrong tag\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-fail-01\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_01, sizeof(sign1_fail_01),\n+\t\t\t\t NULL);\n+\tif (!n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk should have failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * invalid sign1, signature tampered\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-fail-02\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_02, sizeof(sign1_fail_02),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\t/* validation result must be fail */\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * invalid sign1, alg tampered\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-fail-03\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_03, sizeof(sign1_fail_03),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\t/* validation result must be fail */\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * invalid sign1, alg sign tampered\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-fail-04\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_04, sizeof(sign1_fail_04),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\t/* validation result must be fail */\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * invalid sign1, protected attributes tampered\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-fail-06\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_06, sizeof(sign1_fail_06),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\t/* validation result must be fail */\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * invalid sign1, protected attribute removed\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign1/sign-fail-07\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_07, sizeof(sign1_fail_07),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1)\n+\t\tgoto bail1;\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\t/* validation result must be fail */\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid sign we have key for\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-pass-01\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_pass_01, sizeof(sign_pass_01),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid sign we have key for\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-pass-02\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tinfo.ext_cb \u003d xcb;\n+\tinfo.ext_len \u003d sizeof(sign1_pass_02_ext);\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_pass_02, sizeof(sign_pass_02),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid sign we have key for\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-pass-03\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tinfo.ext_cb \u003d NULL;\n+\tinfo.ext_len \u003d 0;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_pass_03, sizeof(sign_pass_03),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * wrong cbor tag\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-fail-01\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_fail_01, sizeof(sign_fail_01),\n+\t\t\t\t NULL);\n+\tif (!n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk should fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * tampered signature\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-fail-02\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_fail_02, sizeof(sign_fail_02),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * tampered sign alg -999\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-fail-03\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_fail_03, sizeof(sign_fail_03),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * tampered sign alg 0\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-fail-04\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_fail_04, sizeof(sign_fail_04),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * add protected attribute\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-fail-06\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_fail_06, sizeof(sign_fail_06),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * remove protected attribute\n+\t */\n+\n+\tlwsl_user(\u0022%s: sign/sign-fail-07\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MULTI;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_fail_07, sizeof(sign_fail_07),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult)\n+\t\tgoto bail1;\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\n+\t/*\n+\t * valid HMAC sign we have key for\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/hmac-01\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_01, sizeof(sign_hmac_01),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid HMAC sign we have key for\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/hmac-02\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_02, sizeof(sign_hmac_02),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\n+\t/*\n+\t * valid HMAC sign we have key for\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/hmac-03\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_03, sizeof(sign_hmac_03),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * invalid HMAC sign we have key for\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/hmac-04 fail mac tag\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_04, sizeof(sign_hmac_04),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is wrongly succeeding\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid HMAC sign we have key for HS256/64\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/hmac-05\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_05, sizeof(sign_hmac_05),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid HMAC sign with implicit HS256 key\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/enc-01\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key3.set, key3.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC0;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_01, sizeof(enc_hmac_01),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid HMAC sign with implicit HS384 key\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/enc-02\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key8.set, key8.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC0;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_02, sizeof(enc_hmac_02),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid HMAC sign with implicit HS512 key\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/enc-03\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key9.set, key9.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC0;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_03, sizeof(enc_hmac_03),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * invalid HMAC sign with implicit HS256 key, tampered hmac tag\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/enc-04\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key3.set, key3.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC0;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_04, sizeof(enc_hmac_04),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (!res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result wrongly succeeds\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\t/*\n+\t * valid HMAC sign with implicit HS256 key, HS256/64\n+\t */\n+\n+\tlwsl_user(\u0022%s: hmac-examples/enc-05\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key3.set, key3.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_MAC0;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_05, sizeof(enc_hmac_05),\n+\t\t\t\t NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+#if 0\n+\t/*\n+\t * valid Ed25519 signature with countersignature from same key + alg\n+\t */\n+\n+\tlwsl_user(\u0022%s: countersign/sign-01\u005cn\u0022, __func__);\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key10.set, key10.len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.sigtype \u003d SIGTYPE_COUNTERSIGNED;\n+\tcps \u003d lws_cose_validate_create(\u0026info);\n+\tif (!cps) {\n+\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_cose_validate_chunk(cps, countersign_sign_01,\n+\t\t\t\t\t sizeof(countersign_sign_01), NULL);\n+\tif (n) {\n+\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\to \u003d lws_cose_validate_results(cps);\n+\tif (o-\u003ecount !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: result count %d\u005cn\u0022, __func__, o-\u003ecount);\n+\t\tgoto bail1;\n+\t}\n+\n+\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n+\tif (res-\u003eresult) {\n+\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_cose_validate_destroy(\u0026cps);\n+\tlws_cose_key_set_destroy(\u0026set);\n+#endif\n+\n+\treturn 0;\n+\n+bail1:\n+\tlws_cose_validate_destroy(\u0026cps);\n+bail:\n+\tlws_cose_key_set_destroy(\u0026set);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-dhcpc/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/CMakeLists.txt\nnew file mode 100644\nindex 0000000..1bb2dcd\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-api-test-dhcpc C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-dhcpc)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SYS_DHCP_CLIENT 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-dhcpc/README.md b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/README.md\nnew file mode 100644\nindex 0000000..74f79a0\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/README.md\n@@ -0,0 +1,27 @@\n+# api test dhcpc\n+\n+The application confirms it can set DHCP on the given interface\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-i \u003cnetif\u003e|Network interface name to set by DHCP, eg, eth0 or wlo1\n+\n+```\n+ $ ./lws-api-test-dhcpc -i wlo1\n+[2019/10/06 14:56:41:7683] U: LWS API selftest: Async DNS\n+[2019/10/06 14:56:42:4461] U: main: requesting DHCP for wlo1\n+[2019/10/06 14:56:42:5207] N: callback_dhcpc: DHCP configured wlo1\n+[2019/10/06 14:56:42:5246] U: lws_dhcpc_cb: dhcp set OK\n+[2019/10/06 14:56:42:5999] U: Completed: ALL PASS: 1 / 1\n+```\n+\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-dhcpc/main.c b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/main.c\nnew file mode 100644\nindex 0000000..3914f43\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/main.c\n@@ -0,0 +1,99 @@\n+/*\n+ * lws-api-test-dhcpc\n+ *\n+ * Written in 2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, ok, fail, exp \u003d 1;\n+struct lws_context *context;\n+const char *nif;\n+\n+static const char * const sa46_names[] \u003d {\n+\t\u0022LWSDH_SA46_IP\u0022,\n+\t\u0022LWSDH_SA46_DNS_SRV_1\u0022,\n+\t\u0022LWSDH_SA46_DNS_SRV_2\u0022,\n+\t\u0022LWSDH_SA46_DNS_SRV_3\u0022,\n+\t\u0022LWSDH_SA46_DNS_SRV_4\u0022,\n+\t\u0022LWSDH_SA46_IPV4_ROUTER\u0022,\n+\t\u0022LWSDH_SA46_NTP_SERVER\u0022,\n+\t\u0022LWSDH_SA46_DHCP_SERVER\u0022,\n+};\n+\n+static int\n+lws_dhcpc_cb(void *opaque, lws_dhcpc_ifstate_t *is)\n+{\n+\tunsigned int n;\n+\tchar buf[64];\n+\n+\tlwsl_user(\u0022%s: dhcp set OK\u005cn\u0022, __func__);\n+\n+\tfor (n \u003d 0; n \u003c LWS_ARRAY_SIZE(sa46_names); n++) {\n+\t\tlws_sa46_write_numeric_address(\u0026is-\u003esa46[n], buf, sizeof(buf));\n+\t\tlwsl_notice(\u0022%s: %s: %s\u005cn\u0022, __func__, sa46_names[n], buf);\n+\t}\n+\n+\tok \u003d 1;\n+\tinterrupted \u003d 1;\n+\treturn 0;\n+}\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 1;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tlwsl_user(\u0022LWS API selftest: DHCP Client\u005cn\u0022);\n+\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\tnif \u003d p;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (nif) {\n+\t\tlwsl_user(\u0022%s: requesting DHCP for %s\u005cn\u0022, __func__, nif);\n+\t\tlws_dhcpc_request(context, nif, AF_INET, lws_dhcpc_cb, NULL);\n+\t} else {\n+\t\tlwsl_err(\u0022%s: use -i \u003cnetwork-interface\u003e to select if\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\t/* the usual lws event loop */\n+\n+\tn \u003d 1;\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tif (fail || ok !\u003d exp)\n+\t\tlwsl_user(\u0022Completed: PASS: %d / %d, FAIL: %d\u005cn\u0022, ok, exp,\n+\t\t\t\tfail);\n+\telse\n+\t\tlwsl_user(\u0022Completed: ALL PASS: %d / %d\u005cn\u0022, ok, exp);\n+\n+\treturn !(ok \u003d\u003d exp \u0026\u0026 !fail);\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-fts/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5a81ae8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-fts/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-api-test-fts C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-fts)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_FTS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-fts/README.md b/minimal-examples-lowlevel/api-tests/api-test-fts/README.md\nnew file mode 100644\nindex 0000000..fe7881f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-fts/README.md\n@@ -0,0 +1,53 @@\n+# lws api test fts\n+\n+Demonstrates how to create indexes and perform full-text searches.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-c / --createindex|Create an index file, instead of searching\n+-i / --index \u003cfile\u003e|Use this file as the index\n+\n+The two modes are:\n+\n+ - create an index: `--createindex inputfile [inputfile...]`\n+\n+```\n+ $ ./lws-api-test-fts -c ./the-picture-of-dorian-gray.txt\n+[2018/10/15 07:14:15:1175] USER: LWS API selftest: full-text search\n+[2018/10/15 07:14:15:1531] NOTICE: lws_fts_serialize: index 1 files (0MiB) cpu time 32ms, alloc: 1024KiB + 1024KiB, serialize: 3ms, file: 325KiB \n+```\n+\n+ - perform search[es]: `searchterm [searchterm...]`\n+\n+```\n+ $ ./lws-api-test-fts b\n+[2018/10/15 07:15:44:1442] USER: LWS API selftest: full-text search \n+[2018/10/15 07:15:44:1442] NOTICE: lws_fts_search: 'b' Matched: 3 instances, 8 children, 0ms\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC b: 3 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC be: 472 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC bee: 3 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC been: 236 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC beaut: 1 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC beauty: 55 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC because: 40 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC believe: 49 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC better: 54 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC before: 75 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC beg: 5 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC began: 44 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC but: 401 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC basil: 158 agg hits\n+[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC broke: 22 agg hits\n+[2018/10/15 07:15:44:1444] NOTICE: lws_fts_results_dump: AC by: 242 agg hits\n+[2018/10/15 07:15:44:1444] NOTICE: lws_fts_results_dump: AC boy: 36 agg hits\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-fts/canned-1.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/canned-1.txt\nnew file mode 100644\nindex 0000000..b211f89\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-fts/canned-1.txt\n@@ -0,0 +1,26 @@\n+API selftest: full-text search\n+AC be: 472 agg hits\n+AC but: 401 agg hits\n+AC by: 242 agg hits\n+AC been: 236 agg hits\n+AC basil: 158 agg hits\n+AC before: 75 agg hits\n+AC beauty: 55 agg hits\n+AC better: 54 agg hits\n+AC believe: 49 agg hits\n+AC began: 44 agg hits\n+AC because: 40 agg hits\n+AC boy: 36 agg hits\n+AC book: 31 agg hits\n+AC body: 28 agg hits\n+AC both: 26 agg hits\n+AC broke: 22 agg hits\n+AC beg: 5 agg hits\n+AC bore: 5 agg hits\n+AC b: 3 agg hits\n+AC bee: 3 agg hits\n+AC beaut: 1 agg hits\n+no filepath results\n+\n+\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-fts/canned-2.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/canned-2.txt\nnew file mode 100644\nindex 0000000..579f3ba\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-fts/canned-2.txt\n@@ -0,0 +1,42 @@\n+API selftest: full-text search\n+no autocomplete results\n+../minimal-examples/api-tests/api-test-fts/the-picture-of-dorian-gray.txt: (8904 lines) 32 hits \n+360\n+17482\n+393\n+18984\n+562\n+28820\n+837\n+42903\n+1640\n+82057\n+2037\n+102214\n+2091\n+105019\n+2145\n+107351\n+2725\n+137188\n+2808\n+141127\n+2977\n+149971\n+3429\n+173810\n+4417\n+229186\n+4431\n+230058\n+4656\n+241181\n+4708\n+244372\n+../minimal-examples/api-tests/api-test-fts/les-mis-utf8.txt: (14399 lines) 3 hits \n+14106\n+14313\n+14396\n+\n+\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-fts/les-mis-utf8.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/les-mis-utf8.txt\nnew file mode 100644\nindex 0000000..20aa7e3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-fts/les-mis-utf8.txt\n@@ -0,0 +1,14399 @@\n+The Project Gutenberg EBook of Les misérables Tome I, by Victor Hugo\r\n+\r\n+This eBook is for the use of anyone anywhere at no cost and with\r\n+almost no restrictions whatsoever. You may copy it, give it away or\r\n+re-use it under the terms of the Project Gutenberg License included\r\n+with this eBook or online at www.gutenberg.org\r\n+\r\n+\r\n+Title: Les misérables Tome I\r\n+ Fantine\r\n+\r\n+Author: Victor Hugo\r\n+\r\n+Release Date: January 10, 2006 [EBook #17489]\r\n+[Date last updated: July 28, 2010]\r\n+\r\n+Language: French\r\n+\r\n+\r\n+*** START OF THIS PROJECT GUTENBERG EBOOK LES MISÉRABLES TOME I ***\r\n+\r\n+\r\n+\r\n+\r\n+Produced by www.ebooksgratuits.com and Chuck Greif\r\n+\r\n+\r\n+\r\n+\r\n+Victor Hugo\r\n+\r\n+LES MISÉRABLES\r\n+\r\n+Tome I--FANTINE\r\n+\r\n+(1862)\r\n+\r\n+\r\n+TABLE DES MATIÈRES\r\n+\r\n+Livre premier--Un juste\r\n+\r\n+Chapitre I Monsieur Myriel\r\n+Chapitre II Monsieur Myriel devient monseigneur Bienvenu\r\n+Chapitre III À bon évêque dur évêché\r\n+Chapitre IV Les oeuvres semblables aux paroles\r\n+Chapitre V Que monseigneur Bienvenu faisait durer trop longtemps ses\r\n+ soutanes\r\n+Chapitre VI Par qui il faisait garder sa maison\r\n+Chapitre VII Cravatte\r\n+Chapitre VIII Philosophie après boire\r\n+Chapitre IX Le frère raconté par la soeur\r\n+Chapitre X L'évêque en présence d'une lumière inconnue\r\n+Chapitre XI Une restriction\r\n+Chapitre XII Solitude de monseigneur Bienvenu\r\n+Chapitre XIII Ce qu'il croyait\r\n+Chapitre XIV Ce qu'il pensait\r\n+\r\n+\r\n+Livre deuxième--La chute\r\n+\r\n+Chapitre I Le soir d'un jour de marche\r\n+Chapitre II La prudence conseillée à la sagesse\r\n+Chapitre III Héroïsme de l'obéissance passive\r\n+Chapitre IV Détails sur les fromageries de Pontarlier\r\n+Chapitre V Tranquillité\r\n+Chapitre VI Jean Valjean\r\n+Chapitre VII Le dedans du désespoir\r\n+Chapitre VIII L'onde et l'ombre\r\n+Chapitre IX Nouveaux griefs\r\n+Chapitre X L'homme réveillé\r\n+Chapitre XI Ce qu'il fait\r\n+Chapitre XII L'évêque travaille\r\n+Chapitre XIII Petit-Gervais\r\n+\r\n+\r\n+Livre troisième--En l'année 1817\r\n+\r\n+Chapitre I L'année 1817\r\n+Chapitre II Double quatuor\r\n+Chapitre III Quatre à quatre\r\n+Chapitre IV Tholomyès est si joyeux qu'il chante une chanson espagnole\r\n+Chapitre V Chez Bombarda\r\n+Chapitre VI Chapitre où l'on s'adore\r\n+Chapitre VII Sagesse de Tholomyès\r\n+Chapitre VIII Mort d'un cheval\r\n+Chapitre IX Fin joyeuse de la joie\r\n+Livre quatrième--Confier, c'est quelquefois livrer\r\n+Chapitre I Une mère qui en rencontre une autre\r\n+Chapitre II Première esquisse de deux figures louches\r\n+Chapitre III L'Alouette\r\n+\r\n+\r\n+Livre cinquième--La descente\r\n+\r\n+Chapitre I Histoire d'un progrès dans les verroteries noires\r\n+Chapitre II M. Madeleine\r\n+Chapitre III Sommes déposées chez Laffitte\r\n+Chapitre IV M. Madeleine en deuil\r\n+Chapitre V Vagues éclairs à l'horizon\r\n+Chapitre VI Le père Fauchelevent\r\n+Chapitre VII Fauchelevent devient jardinier à Paris\r\n+Chapitre VIII Madame Victurnien dépense trente-cinq francs pour la morale\r\n+Chapitre IX Succès de Madame Victurnien\r\n+Chapitre X Suite du succès\r\n+Chapitre XI _Christus nos liberavit_\r\n+Chapitre XII Le désoeuvrement de M. Bamatabois\r\n+Chapitre XIII Solution de quelques questions de police municipale\r\n+\r\n+\r\n+Livre sixième--Javert\r\n+\r\n+Chapitre I Commencement du repos\r\n+Chapitre II Comment Jean peut devenir Champ\r\n+\r\n+\r\n+Livre septième--L'affaire Champmathieu\r\n+\r\n+Chapitre I La soeur Simplice\r\n+Chapitre II Perspicacité de maître Scaufflaire\r\n+Chapitre III Une tempête sous un crâne\r\n+Chapitre IV Formes que prend la souffrance pendant le sommeil\r\n+Chapitre V Bâtons dans les roues\r\n+Chapitre VI La soeur Simplice mise à l'épreuve\r\n+Chapitre VII Le voyageur arrivé prend ses précautions pour repartir\r\n+Chapitre VIII Entrée de faveur\r\n+Chapitre IX Un lieu où des convictions sont en train de se former\r\n+Chapitre X Le système de dénégations\r\n+Chapitre XI Champmathieu de plus en plus étonné\r\n+\r\n+\r\n+Livre huitième--Contre-coup\r\n+\r\n+Chapitre I Dans quel miroir M. Madeleine regarde ses cheveux\r\n+Chapitre II Fantine heureuse\r\n+Chapitre III Javert content\r\n+Chapitre IV L'autorité reprend ses droits\r\n+Chapitre V Tombeau convenable\r\n+\r\n+\r\n+\r\n+\r\n+Livre premier--Un juste\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre I\r\n+\r\n+Monsieur Myriel\r\n+\r\n+\r\n+En 1815, M. Charles-François-Bienvenu Myriel était évêque de Digne.\r\n+C'était un vieillard d'environ soixante-quinze ans; il occupait le siège\r\n+de Digne depuis 1806.\r\n+\r\n+Quoique ce détail ne touche en aucune manière au fond même de ce que\r\n+nous avons à raconter, il n'est peut-être pas inutile, ne fût-ce que\r\n+pour être exact en tout, d'indiquer ici les bruits et les propos qui\r\n+avaient couru sur son compte au moment où il était arrivé dans le\r\n+diocèse. Vrai ou faux, ce qu'on dit des hommes tient souvent autant de\r\n+place dans leur vie et surtout dans leur destinée que ce qu'ils font. M.\r\n+Myriel était fils d'un conseiller au parlement d'Aix; noblesse de robe.\r\n+On contait de lui que son père, le réservant pour hériter de sa charge,\r\n+l'avait marié de fort bonne heure, à dix-huit ou vingt ans, suivant un\r\n+usage assez répandu dans les familles parlementaires. Charles Myriel,\r\n+nonobstant ce mariage, avait, disait-on, beaucoup fait parler de lui. Il\r\n+était bien fait de sa personne, quoique d'assez petite taille, élégant,\r\n+gracieux, spirituel; toute la première partie de sa vie avait été donnée\r\n+au monde et aux galanteries. La révolution survint, les événements se\r\n+précipitèrent, les familles parlementaires décimées, chassées, traquées,\r\n+se dispersèrent. M. Charles Myriel, dès les premiers jours de la\r\n+révolution, émigra en Italie. Sa femme y mourut d'une maladie de\r\n+poitrine dont elle était atteinte depuis longtemps. Ils n'avaient point\r\n+d'enfants. Que se passa-t-il ensuite dans la destinée de M. Myriel?\r\n+L'écroulement de l'ancienne société française, la chute de sa propre\r\n+famille, les tragiques spectacles de 93, plus effrayants encore\r\n+peut-être pour les émigrés qui les voyaient de loin avec le\r\n+grossissement de l'épouvante, firent-ils germer en lui des idées de\r\n+renoncement et de solitude? Fut-il, au milieu d'une de ces distractions\r\n+et de ces affections qui occupaient sa vie, subitement atteint d'un de\r\n+ces coups mystérieux et terribles qui viennent quelquefois renverser, en\r\n+le frappant au coeur, l'homme que les catastrophes publiques\r\n+n'ébranleraient pas en le frappant dans son existence et dans sa\r\n+fortune? Nul n'aurait pu le dire; tout ce qu'on savait, c'est que,\r\n+lorsqu'il revint d'Italie, il était prêtre.\r\n+\r\n+En 1804, M. Myriel était curé de Brignolles. Il était déjà vieux, et\r\n+vivait dans une retraite profonde.\r\n+\r\n+Vers l'époque du couronnement, une petite affaire de sa cure, on ne sait\r\n+plus trop quoi, l'amena à Paris. Entre autres personnes puissantes, il\r\n+alla solliciter pour ses paroissiens M. le cardinal Fesch. Un jour que\r\n+l'empereur était venu faire visite à son oncle, le digne curé, qui\r\n+attendait dans l'antichambre, se trouva sur le passage de sa majesté.\r\n+Napoléon, se voyant regardé avec une certaine curiosité par ce\r\n+vieillard, se retourna, et dit brusquement:\r\n+\r\n+--Quel est ce bonhomme qui me regarde?\r\n+\r\n+--Sire, dit M. Myriel, vous regardez un bonhomme, et moi je regarde un\r\n+grand homme. Chacun de nous peut profiter.\r\n+\r\n+L'empereur, le soir même, demanda au cardinal le nom de ce curé, et\r\n+quelque temps après M. Myriel fut tout surpris d'apprendre qu'il était\r\n+nommé évêque de Digne.\r\n+\r\n+Qu'y avait-il de vrai, du reste, dans les récits qu'on faisait sur la\r\n+première partie de la vie de M. Myriel? Personne ne le savait. Peu de\r\n+familles avaient connu la famille Myriel avant la révolution.\r\n+\r\n+M. Myriel devait subir le sort de tout nouveau venu dans une petite\r\n+ville où il y a beaucoup de bouches qui parlent et fort peu de têtes qui\r\n+pensent. Il devait le subir, quoiqu'il fût évêque et parce qu'il était\r\n+évêque. Mais, après tout, les propos auxquels on mêlait son nom\r\n+n'étaient peut-être que des propos; du bruit, des mots, des paroles;\r\n+moins que des paroles, des _palabres_, comme dit l'énergique langue du\r\n+midi.\r\n+\r\n+Quoi qu'il en fût, après neuf ans d'épiscopat et de résidence à Digne,\r\n+tous ces racontages, sujets de conversation qui occupent dans le premier\r\n+moment les petites villes et les petites gens, étaient tombés dans un\r\n+oubli profond. Personne n'eût osé en parler, personne n'eût même osé\r\n+s'en souvenir.\r\n+\r\n+M. Myriel était arrivé à Digne accompagné d'une vieille fille,\r\n+mademoiselle Baptistine, qui était sa soeur et qui avait dix ans de\r\n+moins que lui.\r\n+\r\n+Ils avaient pour tout domestique une servante du même âge que\r\n+mademoiselle Baptistine, et appelée madame Magloire, laquelle, après\r\n+avoir été _la servante de M. le Curé_, prenait maintenant le double\r\n+titre de femme de chambre de mademoiselle et femme de charge de\r\n+monseigneur.\r\n+\r\n+Mademoiselle Baptistine était une personne longue, pâle, mince, douce;\r\n+elle réalisait l'idéal de ce qu'exprime le mot «respectable»; car il\r\n+semble qu'il soit nécessaire qu'une femme soit mère pour être vénérable.\r\n+Elle n'avait jamais été jolie; toute sa vie, qui n'avait été qu'une\r\n+suite de saintes oeuvres, avait fini par mettre sur elle une sorte de\r\n+blancheur et de clarté; et, en vieillissant, elle avait gagné ce qu'on\r\n+pourrait appeler la beauté de la bonté. Ce qui avait été de la maigreur\r\n+dans sa jeunesse était devenu, dans sa maturité, de la transparence; et\r\n+cette diaphanéité laissait voir l'ange. C'était une âme plus encore que\r\n+ce n'était une vierge. Sa personne semblait faite d'ombre; à peine assez\r\n+de corps pour qu'il y eût là un sexe; un peu de matière contenant une\r\n+lueur; de grands yeux toujours baissés; un prétexte pour qu'une âme\r\n+reste sur la terre.\r\n+\r\n+Madame Magloire était une petite vieille, blanche, grasse, replète,\r\n+affairée, toujours haletante, à cause de son activité d'abord, ensuite à \r\n+cause d'un asthme.\r\n+\r\n+À son arrivée, on installa M. Myriel en son palais épiscopal avec les\r\n+honneurs voulus par les décrets impériaux qui classent l'évêque\r\n+immédiatement après le maréchal de camp. Le maire et le président lui\r\n+firent la première visite, et lui de son côté fit la première visite au\r\n+général et au préfet.\r\n+\r\n+L'installation terminée, la ville attendit son évêque à l'oeuvre.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre II\r\n+\r\n+Monsieur Myriel devient monseigneur Bienvenu\r\n+\r\n+\r\n+Le palais épiscopal de Digne était attenant à l'hôpital.\r\n+\r\n+Le palais épiscopal était un vaste et bel hôtel bâti en pierre au\r\n+commencement du siècle dernier par monseigneur Henri Puget, docteur en\r\n+théologie de la faculté de Paris, abbé de Simore, lequel était évêque de\r\n+Digne en 1712. Ce palais était un vrai logis seigneurial. Tout y avait\r\n+grand air, les appartements de l'évêque, les salons, les chambres, la\r\n+cour d'honneur, fort large, avec promenoirs à arcades, selon l'ancienne\r\n+mode florentine, les jardins plantés de magnifiques arbres. Dans la\r\n+salle à manger, longue et superbe galerie qui était au rez-de-chaussée\r\n+et s'ouvrait sur les jardins, monseigneur Henri Puget avait donné à \r\n+manger en cérémonie le 29 juillet 1714 à messeigneurs Charles Brûlart de\r\n+Genlis, archevêque-prince d'Embrun, Antoine de Mesgrigny, capucin,\r\n+évêque de Grasse, Philippe de Vendôme, grand prieur de France, abbé de\r\n+Saint-Honoré de Lérins, François de Berton de Grillon, évêque-baron de\r\n+Vence, César de Sabran de Forcalquier, évêque-seigneur de Glandève, et\r\n+Jean Soanen, prêtre de l'oratoire, prédicateur ordinaire du roi,\r\n+évêque-seigneur de Senez. Les portraits de ces sept révérends\r\n+personnages décoraient cette salle, et cette date mémorable, 29 juillet\r\n+1714, y était gravée en lettres d'or sur une table de marbre blanc.\r\n+\r\n+L'hôpital était une maison étroite et basse à un seul étage avec un\r\n+petit jardin. Trois jours après son arrivée, l'évêque visita l'hôpital.\r\n+La visite terminée, il fit prier le directeur de vouloir bien venir\r\n+jusque chez lui.\r\n+\r\n+--Monsieur le directeur de l'hôpital, lui dit-il, combien en ce moment\r\n+avez-vous de malades?\r\n+\r\n+--Vingt-six, monseigneur.\r\n+\r\n+--C'est ce que j'avais compté, dit l'évêque.\r\n+\r\n+--Les lits, reprit le directeur, sont bien serrés les uns contre les\r\n+autres.\r\n+\r\n+--C'est ce que j'avais remarqué.\r\n+\r\n+--Les salles ne sont que des chambres, et l'air s'y renouvelle\r\n+difficilement.\r\n+\r\n+--C'est ce qui me semble.\r\n+\r\n+--Et puis, quand il y a un rayon de soleil, le jardin est bien petit\r\n+pour les convalescents.\r\n+\r\n+--C'est ce que je me disais.\r\n+\r\n+--Dans les épidémies, nous avons eu cette année le typhus, nous avons eu\r\n+une suette militaire il y a deux ans, cent malades quelquefois; nous ne\r\n+savons que faire.\r\n+\r\n+--C'est la pensée qui m'était venue.\r\n+\r\n+--Que voulez-vous, monseigneur? dit le directeur, il faut se résigner.\r\n+\r\n+Cette conversation avait lieu dans la salle à manger-galerie du\r\n+rez-de-chaussée. L'évêque garda un moment le silence, puis il se tourna\r\n+brusquement vers le directeur de l'hôpital:\r\n+\r\n+--Monsieur, dit-il, combien pensez-vous qu'il tiendrait de lits rien que\r\n+dans cette salle?\r\n+\r\n+--La salle à manger de monseigneur! s'écria le directeur stupéfait.\r\n+\r\n+L'évêque parcourait la salle du regard et semblait y faire avec les yeux\r\n+des mesures et des calculs.\r\n+\r\n+--Il y tiendrait bien vingt lits! dit-il, comme se parlant à lui-même.\r\n+\r\n+Puis élevant la voix:\r\n+\r\n+--Tenez, monsieur le directeur de l'hôpital, je vais vous dire. Il y a\r\n+évidemment une erreur. Vous êtes vingt-six personnes dans cinq ou six\r\n+petites chambres. Nous sommes trois ici, et nous avons place pour\r\n+soixante. Il y a erreur, je vous dis. Vous avez mon logis, et j'ai le\r\n+vôtre. Rendez-moi ma maison. C'est ici chez vous.\r\n+\r\n+Le lendemain, les vingt-six pauvres étaient installés dans le palais de\r\n+l'évêque et l'évêque était à l'hôpital.\r\n+\r\n+M. Myriel n'avait point de bien, sa famille ayant été ruinée par la\r\n+révolution. Sa soeur touchait une rente viagère de cinq cents francs\r\n+qui, au presbytère, suffisait à sa dépense personnelle. M. Myriel\r\n+recevait de l'état comme évêque un traitement de quinze mille francs. Le\r\n+jour même où il vint se loger dans la maison de l'hôpital, M. Myriel\r\n+détermina l'emploi de cette somme une fois pour toutes de la manière\r\n+suivante. Nous transcrivons ici une note écrite de sa main.\r\n+\r\n+_Note pour régler les dépenses de ma maison._\r\n+\r\n+_Pour le petit séminaire: quinze cents livres_\r\n+_Congrégation de la mission: cent livres_\r\n+_Pour les lazaristes de Montdidier: cent livres_\r\n+_Séminaire des missions étrangères à Paris: deux cents livres_\r\n+_Congrégation du Saint-Esprit: cent cinquante livres_\r\n+_Établissements religieux de la Terre-Sainte: cent livres_\r\n+_Sociétés de charité maternelle: trois cents livres_\r\n+_En sus, pour celle d'Arles: cinquante livres_\r\n+_OEuvre pour l'amélioration des prisons: quatre cents livres_\r\n+_OEuvre pour le soulagement et la délivrance des prisonniers: cinq cents\r\n+livres_\r\n+_Pour libérer des pères de famille prisonniers pour dettes: mille livres_\r\n+_Supplément au traitement des pauvres maîtres d'école du diocèse: deux\r\n+mille livres_\r\n+_Grenier d'abondance des Hautes-Alpes: cent livres_\r\n+_Congrégation des dames de Digne, de Manosque et de Sisteron,\r\n+pour l'enseignement gratuit des filles indigentes: quinze cents livres_\r\n+_Pour les pauvres: six mille livres_\r\n+_Ma dépense personnelle: mille livres_\r\n+\r\n+Total: _quinze mille livres_\r\n+\r\n+Pendant tout le temps qu'il occupa le siège de Digne, M. Myriel ne\r\n+changea presque rien à cet arrangement. Il appelait cela, comme on voit,\r\n+_avoir réglé les dépenses de sa maison_.\r\n+\r\n+Cet arrangement fut accepté avec une soumission absolue par mademoiselle\r\n+Baptistine. Pour cette sainte fille, M. de Digne était tout à la fois\r\n+son frère et son évêque, son ami selon la nature et son supérieur selon\r\n+l'église. Elle l'aimait et elle le vénérait tout simplement. Quand il\r\n+parlait, elle s'inclinait; quand il agissait, elle adhérait. La servante\r\n+seule, madame Magloire, murmura un peu. M. l'évêque, on l'a pu\r\n+remarquer, ne s'était réservé que mille livres, ce qui, joint à la\r\n+pension de mademoiselle Baptistine, faisait quinze cents francs par an.\r\n+Avec ces quinze cents francs, ces deux vieilles femmes et ce vieillard\r\n+vivaient.\r\n+\r\n+Et quand un curé de village venait à Digne, M. l'évêque trouvait encore\r\n+moyen de le traiter, grâce à la sévère économie de madame Magloire et à \r\n+l'intelligente administration de mademoiselle Baptistine.\r\n+\r\n+Un jour--il était à Digne depuis environ trois mois--l'évêque dit:\r\n+\r\n+--Avec tout cela je suis bien gêné!\r\n+\r\n+--Je le crois bien! s'écria madame Magloire, Monseigneur n'a seulement\r\n+pas réclamé la rente que le département lui doit pour ses frais de\r\n+carrosse en ville et de tournées dans le diocèse. Pour les évêques\r\n+d'autrefois c'était l'usage.\r\n+\r\n+--Tiens! dit l'évêque, vous avez raison, madame Magloire.\r\n+\r\n+Il fit sa réclamation.\r\n+\r\n+Quelque temps après, le conseil général, prenant cette demande en\r\n+considération, lui vota une somme annuelle de trois mille francs, sous\r\n+cette rubrique: _Allocation à M. l'évêque pour frais de carrosse, frais\r\n+de poste et frais de tournées pastorales_.\r\n+\r\n+Cela fit beaucoup crier la bourgeoisie locale, et, à cette occasion, un\r\n+sénateur de l'empire, ancien membre du conseil des cinq-cents favorable\r\n+au dix-huit brumaire et pourvu près de la ville de Digne d'une\r\n+sénatorerie magnifique, écrivit au ministre des cultes, M. Bigot de\r\n+Préameneu, un petit billet irrité et confidentiel dont nous extrayons\r\n+ces lignes authentiques:\r\n+\r\n+«--Des frais de carrosse? pourquoi faire dans une ville de moins de\r\n+quatre mille habitants? Des frais de poste et de tournées? à quoi bon\r\n+ces tournées d'abord? ensuite comment courir la poste dans un pays de\r\n+montagnes? Il n'y a pas de routes. On ne va qu'à cheval. Le pont même de\r\n+la Durance à Château-Arnoux peut à peine porter des charrettes à boeufs.\r\n+Ces prêtres sont tous ainsi. Avides et avares. Celui-ci a fait le bon\r\n+apôtre en arrivant. Maintenant il fait comme les autres. Il lui faut\r\n+carrosse et chaise de poste. Il lui faut du luxe comme aux anciens\r\n+évêques. Oh! toute cette prêtraille! Monsieur le comte, les choses\r\n+n'iront bien que lorsque l'empereur nous aura délivrés des calotins. À\r\n+bas le pape! (les affaires se brouillaient avec Rome). Quant à moi, je\r\n+suis pour César tout seul. Etc., etc.»\r\n+\r\n+La chose, en revanche, réjouit fort madame Magloire.\r\n+\r\n+--Bon, dit-elle à mademoiselle Baptistine, Monseigneur a commencé par\r\n+les autres, mais il a bien fallu qu'il finît par lui-même. Il a réglé\r\n+toutes ses charités. Voilà trois mille livres pour nous. Enfin!\r\n+\r\n+Le soir même, l'évêque écrivit et remit à sa soeur une note ainsi\r\n+conçue:\r\n+\r\n+_Frais de carrosse et de tournées._\r\n+\r\n+_Pour donner du bouillon de viande aux malades de l'hôpital: quinze\r\n+cents livres_\r\n+_Pour la société de charité maternelle d'Aix: deux cent cinquante livres_\r\n+_Pour la société de charité maternelle de Draguignan: deux cent cinquante\r\n+livres_\r\n+_Pour les enfants trouvés: cinq cents livres_\r\n+_Pour les orphelins: cinq cents livres_\r\n+\r\n+Total: _trois mille livres_\r\n+\r\n+Tel était le budget de M. Myriel.\r\n+\r\n+Quant au casuel épiscopal, rachats de bans, dispenses, ondoiements,\r\n+prédications, bénédictions d'églises ou de chapelles, mariages, etc.,\r\n+l'évêque le percevait sur les riches avec d'autant plus d'âpreté qu'il\r\n+le donnait aux pauvres.\r\n+\r\n+Au bout de peu de temps, les offrandes d'argent affluèrent. Ceux qui ont\r\n+et ceux qui manquent frappaient à la porte de M. Myriel, les uns venant\r\n+chercher l'aumône que les autres venaient y déposer. L'évêque, en moins\r\n+d'un an, devint le trésorier de tous les bienfaits et le caissier de\r\n+toutes les détresses. Des sommes considérables passaient par ses mains;\r\n+mais rien ne put faire qu'il changeât quelque chose à son genre de vie\r\n+et qu'il ajoutât le moindre superflu à son nécessaire.\r\n+\r\n+Loin de là . Comme il y a toujours encore plus de misère en bas que de\r\n+fraternité en haut, tout était donné, pour ainsi dire, avant d'être\r\n+reçu; c'était comme de l'eau sur une terre sèche; il avait beau recevoir\r\n+de l'argent, il n'en avait jamais. Alors il se dépouillait.\r\n+\r\n+L'usage étant que les évêques énoncent leurs noms de baptême en tête de\r\n+leurs mandements et de leurs lettres pastorales, les pauvres gens du\r\n+pays avaient choisi, avec une sorte d'instinct affectueux, dans les noms\r\n+et prénoms de l'évêque, celui qui leur présentait un sens, et ils ne\r\n+l'appelaient que monseigneur Bienvenu. Nous ferons comme eux, et nous le\r\n+nommerons ainsi dans l'occasion. Du reste, cette appellation lui\r\n+plaisait.\r\n+\r\n+--J'aime ce nom-là , disait-il. Bienvenu corrige monseigneur.\r\n+\r\n+Nous ne prétendons pas que le portrait que nous faisons ici soit\r\n+vraisemblable; nous nous bornons à dire qu'il est ressemblant.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre III\r\n+\r\n+À bon évêque dur évêché\r\n+\r\n+\r\n+M. l'évêque, pour avoir converti son carrosse en aumônes, n'en faisait\r\n+pas moins ses tournées. C'est un diocèse fatigant que celui de Digne. Il\r\n+a fort peu de plaines, beaucoup de montagnes, presque pas de routes, on\r\n+l'a vu tout à l'heure; trente-deux cures, quarante et un vicariats et\r\n+deux cent quatre-vingt-cinq succursales. Visiter tout cela, c'est une\r\n+affaire. M. l'évêque en venait à bout. Il allait à pied quand c'était\r\n+dans le voisinage, en carriole dans la plaine, en cacolet dans la\r\n+montagne. Les deux vieilles femmes l'accompagnaient. Quand le trajet\r\n+était trop pénible pour elles, il allait seul.\r\n+\r\n+Un jour, il arriva à Senez, qui est une ancienne ville épiscopale, monté\r\n+sur un âne. Sa bourse, fort à sec dans ce moment, ne lui avait pas\r\n+permis d'autre équipage. Le maire de la ville vint le recevoir à la\r\n+porte de l'évêché et le regardait descendre de son âne avec des yeux\r\n+scandalisés. Quelques bourgeois riaient autour de lui.\r\n+\r\n+--Monsieur le maire, dit l'évêque, et messieurs les bourgeois, je vois\r\n+ce qui vous scandalise; vous trouvez que c'est bien de l'orgueil à un\r\n+pauvre prêtre de monter une monture qui a été celle de Jésus-Christ. Je\r\n+l'ai fait par nécessité, je vous assure, non par vanité.\r\n+\r\n+Dans ses tournées, il était indulgent et doux, et prêchait moins qu'il\r\n+ne causait. Il ne mettait aucune vertu sur un plateau inaccessible. Il\r\n+n'allait jamais chercher bien loin ses raisonnements et ses modèles.\r\n+Aux habitants d'un pays il citait l'exemple du pays voisin. Dans les\r\n+cantons où l'on était dur pour les nécessiteux, il disait:\r\n+\r\n+--Voyez les gens de Briançon. Ils ont donné aux indigents, aux veuves et\r\n+aux orphelins le droit de faire faucher leurs prairies trois jours avant\r\n+tous les autres. Ils leur rebâtissent gratuitement leurs maisons quand\r\n+elles sont en ruines. Aussi est-ce un pays béni de Dieu. Durant tout un\r\n+siècle de cent ans, il n'y a pas eu un meurtrier.\r\n+\r\n+Dans les villages âpres au gain et à la moisson, il disait:\r\n+\r\n+--Voyez ceux d'Embrun. Si un père de famille, au temps de la récolte, a\r\n+ses fils au service à l'armée et ses filles en service à la ville, et\r\n+qu'il soit malade et empêché, le curé le recommande au prône; et le\r\n+dimanche, après la messe, tous les gens du village, hommes, femmes,\r\n+enfants, vont dans le champ du pauvre homme lui faire sa moisson, et lui\r\n+rapportent paille et grain dans son grenier.\r\n+\r\n+Aux familles divisées par des questions d'argent et d'héritage, il\r\n+disait:\r\n+\r\n+--Voyez les montagnards de Devoluy, pays si sauvage qu'on n'y entend pas\r\n+le rossignol une fois en cinquante ans. Eh bien, quand le père meurt\r\n+dans une famille, les garçons s'en vont chercher fortune, et laissent le\r\n+bien aux filles, afin qu'elles puissent trouver des maris.\r\n+\r\n+Aux cantons qui ont le goût des procès et où les fermiers se ruinent en\r\n+papier timbré, il disait:\r\n+\r\n+--Voyez ces bons paysans de la vallée de Queyras. Ils sont là trois\r\n+mille âmes. Mon Dieu! c'est comme une petite république. On n'y connaît\r\n+ni le juge, ni l'huissier. Le maire fait tout. Il répartit l'impôt, taxe\r\n+chacun en conscience, juge les querelles gratis, partage les patrimoines\r\n+sans honoraires, rend des sentences sans frais; et on lui obéit, parce\r\n+que c'est un homme juste parmi des hommes simples.\r\n+\r\n+Aux villages où il ne trouvait pas de maître d'école, il citait encore\r\n+ceux de Queyras:\r\n+\r\n+--Savez-vous comment ils font? disait-il. Comme un petit pays de douze\r\n+ou quinze feux ne peut pas toujours nourrir un magister, ils ont des\r\n+maîtres d'école payés par toute la vallée qui parcourent les villages,\r\n+passant huit jours dans celui-ci, dix dans celui-là , et enseignant. Ces\r\n+magisters vont aux foires, où je les ai vus. On les reconnaît à des\r\n+plumes à écrire qu'ils portent dans la ganse de leur chapeau. Ceux qui\r\n+n'enseignent qu'à lire ont une plume, ceux qui enseignent la lecture et\r\n+le calcul ont deux plumes; ceux qui enseignent la lecture, le calcul et\r\n+le latin ont trois plumes. Ceux-là sont de grands savants. Mais quelle\r\n+honte d'être ignorants! Faites comme les gens de Queyras.\r\n+\r\n+Il parlait ainsi, gravement et paternellement, à défaut d'exemples\r\n+inventant des paraboles, allant droit au but, avec peu de phrases et\r\n+beaucoup d'images, ce qui était l'éloquence même de Jésus-Christ,\r\n+convaincu et persuadant.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IV\r\n+\r\n+Les oeuvres semblables aux paroles\r\n+\r\n+\r\n+Sa conversation était affable et gaie. Il se mettait à la portée des\r\n+deux vieilles femmes qui passaient leur vie près de lui; quand il riait,\r\n+c'était le rire d'un écolier.\r\n+\r\n+Madame Magloire l'appelait volontiers _Votre Grandeur_. Un jour, il se\r\n+leva de son fauteuil et alla à sa bibliothèque chercher un livre. Ce\r\n+livre était sur un des rayons d'en haut. Comme l'évêque était d'assez\r\n+petite taille, il ne put y atteindre.\r\n+\r\n+--Madame Magloire, dit-il, apportez-moi une chaise. Ma grandeur ne va\r\n+pas jusqu'à cette planche.\r\n+\r\n+Une de ses parentes éloignées, madame la comtesse de Lô, laissait\r\n+rarement échapper une occasion d'énumérer en sa présence ce qu'elle\r\n+appelait «les espérances» de ses trois fils. Elle avait plusieurs\r\n+ascendants fort vieux et proches de la mort dont ses fils étaient\r\n+naturellement les héritiers. Le plus jeune des trois avait à recueillir\r\n+d'une grand'tante cent bonnes mille livres de rentes; le deuxième était\r\n+substitué au titre de duc de son oncle; l'aîné devait succéder à la\r\n+pairie de son aïeul. L'évêque écoutait habituellement en silence ces\r\n+innocents et pardonnables étalages maternels. Une fois pourtant, il\r\n+paraissait plus rêveur que de coutume, tandis que madame de Lô\r\n+renouvelait le détail de toutes ces successions et de toutes ces\r\n+«espérances». Elle s'interrompit avec quelque impatience:\r\n+\r\n+--Mon Dieu, mon cousin! mais à quoi songez-vous donc?\r\n+\r\n+--Je songe, dit l'évêque, à quelque chose de singulier qui est, je\r\n+crois, dans saint Augustin: «Mettez votre espérance dans celui auquel on\r\n+ne succède point.»\r\n+\r\n+Une autre fois, recevant une lettre de faire-part du décès d'un\r\n+gentilhomme du pays, où s'étalaient en une longue page, outre les\r\n+dignités du défunt, toutes les qualifications féodales et nobiliaires de\r\n+tous ses parents:\r\n+\r\n+--Quel bon dos a la mort! s'écria-t-il. Quelle admirable charge de\r\n+titres on lui fait allègrement porter, et comme il faut que les hommes\r\n+aient de l'esprit pour employer ainsi la tombe à la vanité!\r\n+\r\n+Il avait dans l'occasion une raillerie douce qui contenait presque\r\n+toujours un sens sérieux. Pendant un carême, un jeune vicaire vint à \r\n+Digne et prêcha dans la cathédrale. Il fut assez éloquent. Le sujet de\r\n+son sermon était la charité. Il invita les riches à donner aux\r\n+indigents, afin d'éviter l'enfer qu'il peignit le plus effroyable qu'il\r\n+put et de gagner le paradis qu'il fit désirable et charmant. Il y avait\r\n+dans l'auditoire un riche marchand retiré, un peu usurier, nommé M.\r\n+Géborand, lequel avait gagné un demi-million à fabriquer de gros draps,\r\n+des serges, des cadis et des gasquets. De sa vie M. Géborand n'avait\r\n+fait l'aumône à un malheureux. À partir de ce sermon, on remarqua qu'il\r\n+donnait tous les dimanches un sou aux vieilles mendiantes du portail de\r\n+la cathédrale. Elles étaient six à se partager cela. Un jour, l'évêque\r\n+le vit faisant sa charité et dit à sa soeur avec un sourire:\r\n+\r\n+--Voilà monsieur Géborand qui achète pour un sou de paradis.\r\n+\r\n+Quand il s'agissait de charité, il ne se rebutait pas, même devant un\r\n+refus, et il trouvait alors des mots qui faisaient réfléchir. Une fois,\r\n+il quêtait pour les pauvres dans un salon de la ville. Il y avait là le\r\n+marquis de Champtercier, vieux, riche, avare, lequel trouvait moyen\r\n+d'être tout ensemble ultra-royaliste et ultra-voltairien. Cette variété\r\n+a existé. L'évêque, arrivé à lui, lui toucha le bras.\r\n+\r\n+--Monsieur le marquis, il faut que vous me donniez quelque chose.\r\n+\r\n+Le marquis se retourna et répondit sèchement:\r\n+\r\n+--Monseigneur, j'ai mes pauvres.\r\n+\r\n+--Donnez-les-moi, dit l'évêque.\r\n+\r\n+Un jour, dans la cathédrale, il fit ce sermon.\r\n+\r\n+«Mes très chers frères, mes bons amis, il y a en France treize cent\r\n+vingt mille maisons de paysans qui n'ont que trois ouvertures, dix-huit\r\n+cent dix-sept mille qui ont deux ouvertures, la porte et une fenêtre, et\r\n+enfin trois cent quarante-six mille cabanes qui n'ont qu'une ouverture,\r\n+la porte. Et cela, à cause d'une chose qu'on appelle l'impôt des portes\r\n+et fenêtres. Mettez-moi de pauvres familles, des vieilles femmes, des\r\n+petits enfants, dans ces logis-là , et voyez les fièvres et les maladies.\r\n+Hélas! Dieu donne l'air aux hommes, la loi le leur vend. Je n'accuse pas\r\n+la loi, mais je bénis Dieu. Dans l'Isère, dans le Var, dans les deux\r\n+Alpes, les hautes et les basses, les paysans n'ont pas même de\r\n+brouettes, ils transportent les engrais à dos d'hommes; ils n'ont pas de\r\n+chandelles, et ils brûlent des bâtons résineux et des bouts de corde\r\n+trempés dans la poix résine. C'est comme cela dans tout le pays haut du\r\n+Dauphiné. Ils font le pain pour six mois, ils le font cuire avec de la\r\n+bouse de vache séchée. L'hiver, ils cassent ce pain à coups de hache et\r\n+ils le font tremper dans l'eau vingt-quatre heures pour pouvoir le\r\n+manger.--Mes frères, ayez pitié! voyez comme on souffre autour de vous.»\r\n+\r\n+Né provençal, il s'était facilement familiarisé avec tous les patois du\r\n+midi. Il disait: «_Eh bé! moussu, sès sagé?_» comme dans le bas\r\n+Languedoc. «_Onté anaras passa?_» comme dans les basses Alpes. «_Puerte\r\n+un bouen moutou embe un bouen froumage grase_», comme dans le haut\r\n+Dauphiné. Ceci plaisait au peuple, et n'avait pas peu contribué à lui\r\n+donner accès près de tous les esprits. Il était dans la chaumière et\r\n+dans la montagne comme chez lui. Il savait dire les choses les plus\r\n+grandes dans les idiomes les plus vulgaires. Parlant toutes les langues,\r\n+il entrait dans toutes les âmes. Du reste, il était le même pour les\r\n+gens du monde et pour les gens du peuple. Il ne condamnait rien\r\n+hâtivement, et sans tenir compte des circonstances environnantes. Il\r\n+disait:\r\n+\r\n+--Voyons le chemin par où la faute a passé.\r\n+\r\n+Étant, comme il se qualifiait lui-même en souriant, un _ex-pécheur_, il\r\n+n'avait aucun des escarpements du rigorisme, et il professait assez\r\n+haut, et sans le froncement de sourcil des vertueux féroces, une\r\n+doctrine qu'on pourrait résumer à peu près ainsi:\r\n+\r\n+«L'homme a sur lui la chair qui est tout à la fois son fardeau et sa\r\n+tentation. Il la traîne et lui cède.\r\n+\r\n+«Il doit la surveiller, la contenir, la réprimer, et ne lui obéir qu'à \r\n+la dernière extrémité. Dans cette obéissance-là , il peut encore y avoir\r\n+de la faute; mais la faute, ainsi faite, est vénielle. C'est une chute,\r\n+mais une chute sur les genoux, qui peut s'achever en prière.\r\n+\r\n+«Être un saint, c'est l'exception; être un juste, c'est la règle. Errez,\r\n+défaillez, péchez, mais soyez des justes.\r\n+\r\n+«Le moins de péché possible, c'est la loi de l'homme. Pas de péché du\r\n+tout est le rêve de l'ange. Tout ce qui est terrestre est soumis au\r\n+péché. Le péché est une gravitation.»\r\n+\r\n+Quand il voyait tout le monde crier bien fort et s'indigner bien vite:\r\n+\r\n+--Oh! oh! disait-il en souriant, il y a apparence que ceci est un gros\r\n+crime que tout le monde commet. Voilà les hypocrisies effarées qui se\r\n+dépêchent de protester et de se mettre à couvert.\r\n+\r\n+Il était indulgent pour les femmes et les pauvres sur qui pèse le poids\r\n+de la société humaine. Il disait:\r\n+\r\n+--Les fautes des femmes, des enfants, des serviteurs, des faibles, des\r\n+indigents et des ignorants sont la faute des maris, des pères, des\r\n+maîtres, des forts, des riches et des savants.\r\n+\r\n+Il disait encore:\r\n+\r\n+--À ceux qui ignorent, enseignez-leur le plus de choses que vous\r\n+pourrez; la société est coupable de ne pas donner l'instruction gratis;\r\n+elle répond de la nuit qu'elle produit. Cette âme est pleine d'ombre, le\r\n+péché s'y commet. Le coupable n'est pas celui qui y fait le péché, mais\r\n+celui qui y a fait l'ombre.\r\n+\r\n+Comme on voit, il avait une manière étrange et à lui de juger les\r\n+choses. Je soupçonne qu'il avait pris cela dans l'évangile.\r\n+\r\n+Il entendit un jour conter dans un salon un procès criminel qu'on\r\n+instruisait et qu'on allait juger. Un misérable homme, par amour pour\r\n+une femme et pour l'enfant qu'il avait d'elle, à bout de ressources,\r\n+avait fait de la fausse monnaie. La fausse monnaie était encore punie de\r\n+mort à cette époque. La femme avait été arrêtée émettant la première\r\n+pièce fausse fabriquée par l'homme. On la tenait, mais on n'avait de\r\n+preuves que contre elle. Elle seule pouvait charger son amant et le\r\n+perdre en avouant. Elle nia. On insista. Elle s'obstina à nier. Sur ce,\r\n+le procureur du roi avait eu une idée. Il avait supposé une infidélité\r\n+de l'amant, et était parvenu, avec des fragments de lettres savamment\r\n+présentés, à persuader à la malheureuse qu'elle avait une rivale et que\r\n+cet homme la trompait. Alors, exaspérée de jalousie, elle avait dénoncé\r\n+son amant, tout avoué, tout prouvé. L'homme était perdu. Il allait être\r\n+prochainement jugé à Aix avec sa complice. On racontait le fait, et\r\n+chacun s'extasiait sur l'habileté du magistrat. En mettant la jalousie\r\n+en jeu, il avait fait jaillir la vérité par la colère, il avait fait\r\n+sortir la justice de la vengeance. L'évêque écoutait tout cela en\r\n+silence. Quand ce fut fini, il demanda:\r\n+\r\n+--Où jugera-t-on cet homme et cette femme?\r\n+\r\n+--À la cour d'assises.\r\n+\r\n+Il reprit:\r\n+\r\n+--Et où jugera-t-on monsieur le procureur du roi?\r\n+\r\n+Il arriva à Digne une aventure tragique. Un homme fut condamné à mort\r\n+pour meurtre. C'était un malheureux pas tout à fait lettré, pas tout à \r\n+fait ignorant, qui avait été bateleur dans les foires et écrivain\r\n+public. Le procès occupa beaucoup la ville. La veille du jour fixé pour\r\n+l'exécution du condamné, l'aumônier de la prison tomba malade. Il\r\n+fallait un prêtre pour assister le patient à ses derniers moments. On\r\n+alla chercher le curé. Il paraît qu'il refusa en disant: Cela ne me\r\n+regarde pas. Je n'ai que faire de cette corvée et de ce saltimbanque;\r\n+moi aussi, je suis malade; d'ailleurs ce n'est pas là ma place. On\r\n+rapporta cette réponse à l'évêque qui dit:\r\n+\r\n+--Monsieur le curé a raison. Ce n'est pas sa place, c'est la mienne.\r\n+\r\n+Il alla sur-le-champ à la prison, il descendit au cabanon du\r\n+«saltimbanque», il l'appela par son nom, lui prit la main et lui parla.\r\n+Il passa toute la journée et toute la nuit près de lui, oubliant la\r\n+nourriture et le sommeil, priant Dieu pour l'âme du condamné et priant\r\n+le condamné pour la sienne propre. Il lui dit les meilleures vérités qui\r\n+sont les plus simples. Il fut père, frère, ami; évêque pour bénir\r\n+seulement. Il lui enseigna tout, en le rassurant et en le consolant. Cet\r\n+homme allait mourir désespéré. La mort était pour lui comme un abîme.\r\n+Debout et frémissant sur ce seuil lugubre, il reculait avec horreur. Il\r\n+n'était pas assez ignorant pour être absolument indifférent. Sa\r\n+condamnation, secousse profonde, avait en quelque sorte rompu çà et là \r\n+autour de lui cette cloison qui nous sépare du mystère des choses et que\r\n+nous appelons la vie. Il regardait sans cesse au dehors de ce monde par\r\n+ces brèches fatales, et ne voyait que des ténèbres. L'évêque lui fit\r\n+voir une clarté.\r\n+\r\n+Le lendemain, quand on vint chercher le malheureux, l'évêque était là .\r\n+Il le suivit. Il se montra aux yeux de la foule en camail violet et avec\r\n+sa croix épiscopale au cou, côte à côte avec ce misérable lié de cordes.\r\n+\r\n+Il monta sur la charrette avec lui, il monta sur l'échafaud avec lui. Le\r\n+patient, si morne et si accablé la veille, était rayonnant. Il sentait\r\n+que son âme était réconciliée et il espérait Dieu. L'évêque l'embrassa,\r\n+et, au moment où le couteau allait tomber, il lui dit:\r\n+\r\n+--Celui que l'homme tue, Dieu le ressuscite; celui que les frères\r\n+chassent retrouve le Père. Priez, croyez, entrez dans la vie! le Père\r\n+est là .\r\n+\r\n+Quand il redescendit de l'échafaud, il avait quelque chose dans son\r\n+regard qui fit ranger le peuple. On ne savait ce qui était le plus\r\n+admirable de sa pâleur ou de sa sérénité. En rentrant à cet humble logis\r\n+qu'il appelait en souriant son palais, il dit à sa soeur:\r\n+\r\n+--Je viens d'officier pontificalement.\r\n+\r\n+Comme les choses les plus sublimes sont souvent aussi les choses les\r\n+moins comprises, il y eut dans la ville des gens qui dirent, en\r\n+commentant cette conduite de l'évêque: «C'est de l'affectation.» Ceci ne\r\n+fut du reste qu'un propos de salons. Le peuple, qui n'entend pas malice\r\n+aux actions saintes, fut attendri et admira.\r\n+\r\n+Quant à l'évêque, avoir vu la guillotine fut pour lui un choc, et il fut\r\n+longtemps à s'en remettre.\r\n+\r\n+L'échafaud, en effet, quand il est là , dressé et debout, a quelque chose\r\n+qui hallucine. On peut avoir une certaine indifférence sur la peine de\r\n+mort, ne point se prononcer, dire oui et non, tant qu'on n'a pas vu de\r\n+ses yeux une guillotine; mais si l'on en rencontre une, la secousse est\r\n+violente, il faut se décider et prendre parti pour ou contre. Les uns\r\n+admirent, comme de Maistre; les autres exècrent, comme Beccaria. La\r\n+guillotine est la concrétion de la loi; elle se nomme _vindicte;_ elle\r\n+n'est pas neutre, et ne vous permet pas de rester neutre. Qui l'aperçoit\r\n+frissonne du plus mystérieux des frissons. Toutes les questions sociales\r\n+dressent autour de ce couperet leur point d'interrogation. L'échafaud\r\n+est vision. L'échafaud n'est pas une charpente, l'échafaud n'est pas une\r\n+machine, l'échafaud n'est pas une mécanique inerte faite de bois, de fer\r\n+et de cordes. Il semble que ce soit une sorte d'être qui a je ne sais\r\n+quelle sombre initiative; on dirait que cette charpente voit, que cette\r\n+machine entend, que cette mécanique comprend, que ce bois, ce fer et ces\r\n+cordes veulent. Dans la rêverie affreuse où sa présence jette l'âme,\r\n+l'échafaud apparaît terrible et se mêlant de ce qu'il fait. L'échafaud\r\n+est le complice du bourreau; il dévore; il mange de la chair, il boit du\r\n+sang. L'échafaud est une sorte de monstre fabriqué par le juge et par le\r\n+charpentier, un spectre qui semble vivre d'une espèce de vie\r\n+épouvantable faite de toute la mort qu'il a donnée.\r\n+\r\n+Aussi l'impression fut-elle horrible et profonde; le lendemain de\r\n+l'exécution et beaucoup de jours encore après, l'évêque parut accablé.\r\n+La sérénité presque violente du moment funèbre avait disparu: le fantôme\r\n+de la justice sociale l'obsédait. Lui qui d'ordinaire revenait de toutes\r\n+ses actions avec une satisfaction si rayonnante, il semblait qu'il se\r\n+fît un reproche. Par moments, il se parlait à lui-même, et bégayait à \r\n+demi-voix des monologues lugubres. En voici un que sa soeur entendit un\r\n+soir et recueillit:\r\n+\r\n+--Je ne croyais pas que cela fût si monstrueux. C'est un tort de\r\n+s'absorber dans la loi divine au point de ne plus s'apercevoir de la loi\r\n+humaine. La mort n'appartient qu'à Dieu. De quel droit les hommes\r\n+touchent-ils à cette chose inconnue?\r\n+\r\n+Avec le temps ces impressions s'atténuèrent, et probablement\r\n+s'effacèrent. Cependant on remarqua que l'évêque évitait désormais de\r\n+passer sur la place des exécutions. On pouvait appeler M. Myriel à toute\r\n+heure au chevet des malades et des mourants. Il n'ignorait pas que là \r\n+était son plus grand devoir et son plus grand travail. Les familles\r\n+veuves ou orphelines n'avaient pas besoin de le demander, il arrivait de\r\n+lui-même. Il savait s'asseoir et se taire de longues heures auprès de\r\n+l'homme qui avait perdu la femme qu'il aimait, de la mère qui avait\r\n+perdu son enfant. Comme il savait le moment de se taire, il savait aussi\r\n+le moment de parler. Ô admirable consolateur! il ne cherchait pas à \r\n+effacer la douleur par l'oubli, mais à l'agrandir et à la dignifier par\r\n+l'espérance. Il disait:\r\n+\r\n+--Prenez garde à la façon dont vous vous tournez vers les morts. Ne\r\n+songez pas à ce qui pourrit. Regardez fixement. Vous apercevrez la lueur\r\n+vivante de votre mort bien-aimé au fond du ciel.\r\n+\r\n+Il savait que la croyance est saine. Il cherchait à conseiller et à \r\n+calmer l'homme désespéré en lui indiquant du doigt l'homme résigné, et à \r\n+transformer la douleur qui regarde une fosse en lui montrant la douleur\r\n+qui regarde une étoile.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre V\r\n+\r\n+Que monseigneur Bienvenu faisait durer trop longtemps ses soutanes\r\n+\r\n+\r\n+La vie intérieure de M. Myriel était pleine des mêmes pensées que sa vie\r\n+publique. Pour qui eût pu la voir de près, c'eût été un spectacle grave\r\n+et charmant que cette pauvreté volontaire dans laquelle vivait M.\r\n+l'évêque de Digne.\r\n+\r\n+Comme tous les vieillards et comme la plupart des penseurs, il dormait\r\n+peu. Ce court sommeil était profond. Le matin il se recueillait pendant\r\n+une heure, puis il disait sa messe, soit à la cathédrale, soit dans son\r\n+oratoire. Sa messe dite, il déjeunait d'un pain de seigle trempé dans le\r\n+lait de ses vaches. Puis il travaillait.\r\n+\r\n+Un évêque est un homme fort occupé; il faut qu'il reçoive tous les jours\r\n+le secrétaire de l'évêché, qui est d'ordinaire un chanoine, presque tous\r\n+les jours ses grands vicaires. Il a des congrégations à contrôler, des\r\n+privilèges à donner, toute une librairie ecclésiastique à examiner,\r\n+paroissiens, catéchismes diocésains, livres d'heures, etc., des\r\n+mandements à écrire, des prédications à autoriser, des curés et des\r\n+maires à mettre d'accord, une correspondance cléricale, une\r\n+correspondance administrative, d'un côté l'état, de l'autre le\r\n+Saint-Siège, mille affaires.\r\n+\r\n+Le temps que lui laissaient ces mille affaires, ses offices et son\r\n+bréviaire, il le donnait d'abord aux nécessiteux, aux malades et aux\r\n+affligés; le temps que les affligés, les malades et les nécessiteux lui\r\n+laissaient, il le donnait au travail. Tantôt il bêchait la terre dans\r\n+son jardin, tantôt il lisait et écrivait. Il n'avait qu'un mot pour ces\r\n+deux sortes de travail; il appelait cela _jardiner_.\r\n+\r\n+--L'esprit est un jardin, disait-il.\r\n+\r\n+À midi, il dînait. Le dîner ressemblait au déjeuner.\r\n+\r\n+Vers deux heures, quand le temps était beau, il sortait et se promenait\r\n+à pied dans la campagne ou dans la ville, entrant souvent dans les\r\n+masures. On le voyait cheminer seul, tout à ses pensées, l'oeil baissé,\r\n+appuyé sur sa longue canne, vêtu de sa douillette violette ouatée et\r\n+bien chaude, chaussé de bas violets dans de gros souliers, et coiffé de\r\n+son chapeau plat qui laissait passer par ses trois cornes trois glands\r\n+d'or à graine d'épinards.\r\n+\r\n+C'était une fête partout où il paraissait. On eût dit que son passage\r\n+avait quelque chose de réchauffant et de lumineux. Les enfants et les\r\n+vieillards venaient sur le seuil des portes pour l'évêque comme pour le\r\n+soleil. Il bénissait et on le bénissait. On montrait sa maison à \r\n+quiconque avait besoin de quelque chose.\r\n+\r\n+Çà et là , il s'arrêtait, parlait aux petits garçons et aux petites\r\n+filles et souriait aux mères. Il visitait les pauvres tant qu'il avait\r\n+de l'argent; quand il n'en avait plus, il visitait les riches.\r\n+\r\n+Comme il faisait durer ses soutanes beaucoup de temps, et qu'il ne\r\n+voulait pas qu'on s'en aperçût, il ne sortait jamais dans la ville\r\n+autrement qu'avec sa douillette violette. Cela le gênait un peu en été.\r\n+\r\n+Le soir à huit heures et demie il soupait avec sa soeur, madame Magloire\r\n+debout derrière eux et les servant à table. Rien de plus frugal que ce\r\n+repas. Si pourtant l'évêque avait un de ses curés à souper, madame\r\n+Magloire en profitait pour servir à Monseigneur quelque excellent\r\n+poisson des lacs ou quelque fin gibier de la montagne. Tout curé était\r\n+un prétexte à bon repas; l'évêque se laissait faire. Hors de là , son\r\n+ordinaire ne se composait guère que de légumes cuits dans l'eau et de\r\n+soupe à l'huile. Aussi disait-on dans la ville:\r\n+\r\n+--Quand l'évêque fait pas chère de curé, il fait chère de trappiste.\r\n+\r\n+Après son souper, il causait pendant une demi-heure avec mademoiselle\r\n+Baptistine et madame Magloire; puis il rentrait dans sa chambre et se\r\n+remettait à écrire, tantôt sur des feuilles volantes, tantôt sur la\r\n+marge de quelque in-folio. Il était lettré et quelque peu savant. Il a\r\n+laissé cinq ou six manuscrits assez curieux; entre autres une\r\n+dissertation sur le verset de la Genèse: _Au commencement l'esprit de\r\n+Dieu flottait sur les eaux_. Il confronte avec ce verset trois textes:\r\n+la version arabe qui dit: _Les vents de Dieu soufflaient;_ Flavius\r\n+Josèphe qui dit: _Un vent d'en haut se précipitait sur la terre_, et\r\n+enfin la paraphrase chaldaïque d'Onkelos qui porte: _Un vent venant de\r\n+Dieu soufflait sur la face des eaux_. Dans une autre dissertation, il\r\n+examine les oeuvres théologiques de Hugo, évêque de Ptolémaïs,\r\n+arrière-grand-oncle de celui qui écrit ce livre, et il établit qu'il\r\n+faut attribuer à cet évêque les divers opuscules publiés, au siècle\r\n+dernier, sous le pseudonyme de Barleycourt.\r\n+\r\n+Parfois au milieu d'une lecture, quel que fût le livre qu'il eût entre\r\n+les mains, il tombait tout à coup dans une méditation profonde, d'où il\r\n+ne sortait que pour écrire quelques lignes sur les pages mêmes du\r\n+volume. Ces lignes souvent n'ont aucun rapport avec le livre qui les\r\n+contient. Nous avons sous les yeux une note écrite par lui sur une des\r\n+marges d'un in-quarto intitulé: _Correspondance du lord Germain avec les\r\n+généraux Clinton, Cornwallis et les amiraux de la station de l'Amérique.\r\n+À Versailles, chez Poinçot, libraire, et à Paris, chez Pissot, libraire,\r\n+quai des Augustins_.\r\n+\r\n+Voici cette note:\r\n+\r\n+«Ô vous qui êtes!\r\n+\r\n+«L'Ecclésiaste vous nomme Toute-Puissance, les Macchabées vous nomment\r\n+Créateur, l'Épître aux Éphésiens vous nomme Liberté, Baruch vous nomme\r\n+Immensité, les Psaumes vous nomment Sagesse et Vérité, Jean vous nomme\r\n+Lumière, les Rois vous nomment Seigneur, l'Exode vous appelle\r\n+Providence, le Lévitique Sainteté, Esdras Justice, la création vous\r\n+nomme Dieu, l'homme vous nomme Père; mais Salomon vous nomme\r\n+Miséricorde, et c'est là le plus beau de tous vos noms.»\r\n+\r\n+Vers neuf heures du soir, les deux femmes se retiraient et montaient à \r\n+leurs chambres au premier, le laissant jusqu'au matin seul au\r\n+rez-de-chaussée.\r\n+\r\n+Ici il est nécessaire que nous donnions une idée exacte du logis de M.\r\n+l'évêque de Digne.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VI\r\n+\r\n+Par qui il faisait garder sa maison\r\n+\r\n+\r\n+La maison qu'il habitait se composait, nous l'avons dit, d'un\r\n+rez-de-chaussée et d'un seul étage: trois pièces au rez-de-chaussée,\r\n+trois chambres au premier, au-dessus un grenier. Derrière la maison, un\r\n+jardin d'un quart d'arpent. Les deux femmes occupaient le premier.\r\n+L'évêque logeait en bas. La première pièce, qui s'ouvrait sur la rue,\r\n+lui servait de salle à manger, la deuxième de chambre à coucher, et la\r\n+troisième d'oratoire. On ne pouvait sortir de cet oratoire sans passer\r\n+par la chambre à coucher, et sortir de la chambre à coucher sans passer\r\n+par la salle à manger. Dans l'oratoire, au fond, il y avait une alcôve\r\n+fermée, avec un lit pour les cas d'hospitalité. M. l'évêque offrait ce\r\n+lit aux curés de campagne que des affaires ou les besoins de leur\r\n+paroisse amenaient à Digne.\r\n+\r\n+La pharmacie de l'hôpital, petit bâtiment ajouté à la maison et pris sur\r\n+le jardin, avait été transformée en cuisine et en cellier.\r\n+\r\n+Il y avait en outre dans le jardin une étable qui était l'ancienne\r\n+cuisine de l'hospice et où l'évêque entretenait deux vaches. Quelle que\r\n+fût la quantité de lait qu'elles lui donnassent, il en envoyait\r\n+invariablement tous les matins la moitié aux malades de l'hôpital.--Je\r\n+paye ma dîme, disait-il.\r\n+\r\n+Sa chambre était assez grande et assez difficile à chauffer dans la\r\n+mauvaise saison. Comme le bois est très cher à Digne, il avait imaginé\r\n+de faire faire dans l'étable à vaches un compartiment fermé d'une\r\n+cloison en planches. C'était là qu'il passait ses soirées dans les\r\n+grands froids. Il appelait cela son _salon d'hiver_.\r\n+\r\n+Il n'y avait dans ce salon d'hiver, comme dans la salle à manger,\r\n+d'autres meubles qu'une table de bois blanc, carrée, et quatre chaises\r\n+de paille. La salle à manger était ornée en outre d'un vieux buffet\r\n+peint en rose à la détrempe. Du buffet pareil, convenablement habillé de\r\n+napperons blancs et de fausses dentelles, l'évêque avait fait l'autel\r\n+qui décorait son oratoire.\r\n+\r\n+Ses pénitentes riches et les saintes femmes de Digne s'étaient souvent\r\n+cotisées pour faire les frais d'un bel autel neuf à l'oratoire de\r\n+monseigneur; il avait chaque fois pris l'argent et l'avait donné aux\r\n+pauvres.\r\n+\r\n+--Le plus beau des autels, disait-il, c'est l'âme d'un malheureux\r\n+consolé qui remercie Dieu.\r\n+\r\n+Il avait dans son oratoire deux chaises prie-Dieu en paille, et un\r\n+fauteuil à bras également en paille dans sa chambre à coucher. Quand par\r\n+hasard il recevait sept ou huit personnes à la fois, le préfet, ou le\r\n+général, ou l'état-major du régiment en garnison, ou quelques élèves du\r\n+petit séminaire, on était obligé d'aller chercher dans l'étable les\r\n+chaises du salon d'hiver, dans l'oratoire les prie-Dieu, et le fauteuil\r\n+dans la chambre à coucher; de cette façon, on pouvait réunir jusqu'à \r\n+onze sièges pour les visiteurs. À chaque nouvelle visite on démeublait\r\n+une pièce.\r\n+\r\n+Il arrivait parfois qu'on était douze; alors l'évêque dissimulait\r\n+l'embarras de la situation en se tenant debout devant la cheminée si\r\n+c'était l'hiver, ou en proposant un tour dans le jardin si c'était\r\n+l'été.\r\n+\r\n+Il y avait bien encore dans l'alcôve fermée une chaise, mais elle était\r\n+à demi dépaillée et ne portait que sur trois pieds, ce qui faisait\r\n+qu'elle ne pouvait servir qu'appuyée contre le mur. Mademoiselle\r\n+Baptistine avait bien aussi dans sa chambre une très grande bergère en\r\n+bois jadis doré et revêtue de pékin à fleurs, mais on avait été obligé\r\n+de monter cette bergère au premier par la fenêtre, l'escalier étant trop\r\n+étroit; elle ne pouvait donc pas compter parmi les en-cas du mobilier.\r\n+\r\n+L'ambition de mademoiselle Baptistine eût été de pouvoir acheter un\r\n+meuble de salon en velours d'Utrecht jaune à rosaces et en acajou à cou\r\n+de cygne, avec canapé. Mais cela eût coûté au moins cinq cents francs,\r\n+et, ayant vu qu'elle n'avait réussi à économiser pour cet objet que\r\n+quarante-deux francs dix sous en cinq ans, elle avait fini par y\r\n+renoncer. D'ailleurs qui est-ce qui atteint son idéal?\r\n+\r\n+Rien de plus simple à se figurer que la chambre à coucher de l'évêque.\r\n+Une porte-fenêtre donnant sur le jardin, vis-à -vis le lit; un lit\r\n+d'hôpital, en fer avec baldaquin de serge verte; dans l'ombre du lit,\r\n+derrière un rideau, les ustensiles de toilette trahissant encore les\r\n+anciennes habitudes élégantes de l'homme du monde; deux portes, l'une\r\n+près de la cheminée, donnant dans l'oratoire; l'autre, près de la\r\n+bibliothèque, donnant dans la salle à manger; la bibliothèque, grande\r\n+armoire vitrée pleine de livres; la cheminée, de bois peint en marbre,\r\n+habituellement sans feu; dans la cheminée, une paire de chenets en fer\r\n+ornés de deux vases à guirlandes et cannelures jadis argentés à l'argent\r\n+haché, ce qui était un genre de luxe épiscopal; au-dessus, à l'endroit\r\n+où d'ordinaire on met la glace, un crucifix de cuivre désargenté fixé\r\n+sur un velours noir râpé dans un cadre de bois dédoré. Près de la\r\n+porte-fenêtre, une grande table avec un encrier, chargée de papiers\r\n+confus et de gros volumes. Devant la table, le fauteuil de paille.\r\n+Devant le lit, un prie-Dieu, emprunté à l'oratoire.\r\n+\r\n+Deux portraits dans des cadres ovales étaient accrochés au mur des deux\r\n+côtés du lit. De petites inscriptions dorées sur le fond neutre de la\r\n+toile à côté des figures indiquaient que les portraits représentaient,\r\n+l'un, l'abbé de Chaliot, évêque de Saint-Claude, l'autre, l'abbé\r\n+Tourteau, vicaire général d'Agde, abbé de Grand-Champ, ordre de Cîteaux,\r\n+diocèse de Chartres. L'évêque, en succédant dans cette chambre aux\r\n+malades de l'hôpital, y avait trouvé ces portraits et les y avait\r\n+laissés. C'étaient des prêtres, probablement des donateurs: deux motifs\r\n+pour qu'il les respectât. Tout ce qu'il savait de ces deux personnages,\r\n+c'est qu'ils avaient été nommés par le roi, l'un à son évêché, l'autre à \r\n+son bénéfice, le même jour, le 27 avril 1785. Madame Magloire ayant\r\n+décroché les tableaux pour en secouer la poussière, l'évêque avait\r\n+trouvé cette particularité écrite d'une encre blanchâtre sur un petit\r\n+carré de papier jauni par le temps, collé avec quatre pains à cacheter\r\n+derrière le portrait de l'abbé de Grand-Champ.\r\n+\r\n+Il avait à sa fenêtre un antique rideau de grosse étoffe de laine qui\r\n+finit par devenir tellement vieux que, pour éviter la dépense d'un neuf,\r\n+madame Magloire fut obligée de faire une grande couture au beau milieu.\r\n+Cette couture dessinait une croix. L'évêque le faisait souvent\r\n+remarquer.\r\n+\r\n+--Comme cela fait bien! disait-il.\r\n+\r\n+Toutes les chambres de la maison, au rez-de-chaussée ainsi qu'au\r\n+premier, sans exception, étaient blanchies au lait de chaux, ce qui est\r\n+une mode de caserne et d'hôpital.\r\n+\r\n+Cependant, dans les dernières années, madame Magloire retrouva, comme on\r\n+le verra plus loin, sous le papier badigeonné, des peintures qui\r\n+ornaient l'appartement de mademoiselle Baptistine. Avant d'être\r\n+l'hôpital, cette maison avait été le parloir aux bourgeois. De là cette\r\n+décoration. Les chambres étaient pavées de briques rouges qu'on lavait\r\n+toutes les semaines, avec des nattes de paille tressée devant tous les\r\n+lits. Du reste, ce logis, tenu par deux femmes, était du haut en bas\r\n+d'une propreté exquise. C'était le seul luxe que l'évêque permit. Il\r\n+disait:\r\n+\r\n+--Cela ne prend rien aux pauvres.\r\n+\r\n+Il faut convenir cependant qu'il lui restait de ce qu'il avait possédé\r\n+jadis six couverts d'argent et une grande cuiller à soupe que madame\r\n+Magloire regardait tous les jours avec bonheur reluire splendidement sur\r\n+la grosse nappe de toile blanche. Et comme nous peignons ici l'évêque de\r\n+Digne tel qu'il était, nous devons ajouter qu'il lui était arrivé plus\r\n+d'une fois de dire:\r\n+\r\n+--Je renoncerais difficilement à manger dans de l'argenterie.\r\n+\r\n+Il faut ajouter à cette argenterie deux gros flambeaux d'argent massif\r\n+qui lui venaient de l'héritage d'une grand'tante. Ces flambeaux\r\n+portaient deux bougies de cire et figuraient habituellement sur la\r\n+cheminée de l'évêque. Quand il avait quelqu'un à dîner, madame Magloire\r\n+allumait les deux bougies et mettait les deux flambeaux sur la table.\r\n+\r\n+Il y avait dans la chambre même de l'évêque, à la tête de son lit, un\r\n+petit placard dans lequel madame Magloire serrait chaque soir les six\r\n+couverts d'argent et la grande cuiller. Il faut dire qu'on n'en ôtait\r\n+jamais la clef.\r\n+\r\n+Le jardin, un peu gâté par les constructions assez laides dont nous\r\n+avons parlé, se composait de quatre allées en croix rayonnant autour\r\n+d'un puisard; une autre allée faisait tout le tour du jardin et\r\n+cheminait le long du mur blanc dont il était enclos. Ces allées\r\n+laissaient entre elles quatre carrés bordés de buis. Dans trois, madame\r\n+Magloire cultivait des légumes; dans le quatrième, l'évêque avait mis\r\n+des fleurs. Il y avait çà et là quelques arbres fruitiers.\r\n+\r\n+Une fois madame Magloire lui avait dit avec une sorte de malice douce:\r\n+\r\n+--Monseigneur, vous qui tirez parti de tout, voilà pourtant un carré\r\n+inutile. Il vaudrait mieux avoir là des salades que des bouquets.\r\n+\r\n+--Madame Magloire, répondit l'évêque, vous vous trompez. Le beau est\r\n+aussi utile que l'utile.\r\n+\r\n+Il ajouta après un silence:\r\n+\r\n+--Plus peut-être.\r\n+\r\n+Ce carré, composé de trois ou quatre plates-bandes, occupait M. l'évêque\r\n+presque autant que ses livres. Il y passait volontiers une heure ou\r\n+deux, coupant, sarclant, et piquant çà et là des trous en terre où il\r\n+mettait des graines. Il n'était pas aussi hostile aux insectes qu'un\r\n+jardinier l'eût voulu. Du reste, aucune prétention à la botanique; il\r\n+ignorait les groupes et le solidisme; il ne cherchait pas le moins du\r\n+monde à décider entre Tournefort et la méthode naturelle; il ne prenait\r\n+parti ni pour les utricules contre les cotylédons, ni pour Jussieu\r\n+contre Linné. Il n'étudiait pas les plantes; il aimait les fleurs. Il\r\n+respectait beaucoup les savants, il respectait encore plus les\r\n+ignorants, et, sans jamais manquer à ces deux respects, il arrosait ses\r\n+plates-bandes chaque soir d'été avec un arrosoir de fer-blanc peint en\r\n+vert.\r\n+\r\n+La maison n'avait pas une porte qui fermât à clef. La porte de la salle\r\n+à manger qui, nous l'avons dit, donnait de plain-pied sur la place de la\r\n+cathédrale, était jadis armée de serrures et de verrous comme une porte\r\n+de prison. L'évêque avait fait ôter toutes ces ferrures, et cette porte,\r\n+la nuit comme le jour, n'était fermée qu'au loquet. Le premier passant\r\n+venu, à quelque heure que ce fût, n'avait qu'à la pousser. Dans les\r\n+commencements, les deux femmes avaient été fort tourmentées de cette\r\n+porte jamais close; mais M. de Digne leur avait dit:\r\n+\r\n+--Faites mettre des verrous à vos chambres, si cela vous plaît.\r\n+\r\n+Elles avaient fini par partager sa confiance ou du moins par faire comme\r\n+si elles la partageaient. Madame Magloire seule avait de temps en temps\r\n+des frayeurs. Pour ce qui est de l'évêque, on peut trouver sa pensée\r\n+expliquée ou du moins indiquée dans ces trois lignes écrites par lui sur\r\n+la marge d'une bible: «Voici la nuance: la porte du médecin ne doit\r\n+jamais être fermée; la porte du prêtre doit toujours être ouverte.» Sur\r\n+un autre livre, intitulé _Philosophie de la science médicale_, il avait\r\n+écrit cette autre note: «Est-ce que je ne suis pas médecin comme eux?\r\n+Moi aussi j'ai mes malades; d'abord j'ai les leurs, qu'ils appellent les\r\n+malades; et puis j'ai les miens, que j'appelle les malheureux.»\r\n+\r\n+Ailleurs encore il avait écrit: «Ne demandez pas son nom à qui vous\r\n+demande un gîte. C'est surtout celui-là que son nom embarrasse qui a\r\n+besoin d'asile.»\r\n+\r\n+Il advint qu'un digne curé, je ne sais plus si c'était le curé de\r\n+Couloubroux ou le curé de Pompierry, s'avisa de lui demander un jour,\r\n+probablement à l'instigation de madame Magloire, si Monseigneur était\r\n+bien sûr de ne pas commettre jusqu'à un certain point une imprudence en\r\n+laissant jour et nuit sa porte ouverte à la disposition de qui voulait\r\n+entrer, et s'il ne craignait pas enfin qu'il n'arrivât quelque malheur\r\n+dans une maison si peu gardée. L'évêque lui toucha l'épaule avec une\r\n+gravité douce et lui dit:--_Nisi Dominus custodierit domum, in vanum\r\n+vigilant qui custodiunt eam_.\r\n+\r\n+Puis il parla d'autre chose.\r\n+\r\n+Il disait assez volontiers:\r\n+\r\n+--Il y a la bravoure du prêtre comme il y a la bravoure du colonel de\r\n+dragons. Seulement, ajoutait-il, la nôtre doit être tranquille.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VII\r\n+\r\n+Cravatte\r\n+\r\n+\r\n+Ici se place naturellement un fait que nous ne devons pas omettre, car\r\n+il est de ceux qui font le mieux voir quel homme c'était que M. l'évêque\r\n+de Digne.\r\n+\r\n+Après la destruction de la bande de Gaspard Bès qui avait infesté les\r\n+gorges d'Ollioules, un de ses lieutenants, Cravatte, se réfugia dans la\r\n+montagne. Il se cacha quelque temps avec ses bandits, reste de la troupe\r\n+de Gaspard Bès, dans le comté de Nice, puis gagna le Piémont, et tout à \r\n+coup reparut en France, du côté de Barcelonnette. On le vit à Jauziers\r\n+d'abord, puis aux Tuiles. Il se cacha dans les cavernes du\r\n+Joug-de-l'Aigle, et de là il descendait vers les hameaux et les villages\r\n+par les ravins de l'Ubaye et de l'Ubayette. Il osa même pousser jusqu'à \r\n+Embrun, pénétra une nuit dans la cathédrale et dévalisa la sacristie.\r\n+Ses brigandages désolaient le pays. On mit la gendarmerie à ses\r\n+trousses, mais en vain. Il échappait toujours; quelquefois il résistait\r\n+de vive force. C'était un hardi misérable. Au milieu de toute cette\r\n+terreur, l'évêque arriva. Il faisait sa tournée. Au Chastelar, le maire\r\n+vint le trouver et l'engagea à rebrousser chemin. Cravatte tenait la\r\n+montagne jusqu'à l'Arche, et au-delà . Il y avait danger, même avec une\r\n+escorte. C'était exposer inutilement trois ou quatre malheureux\r\n+gendarmes.\r\n+\r\n+--Aussi, dit l'évêque, je compte aller sans escorte.\r\n+\r\n+--Y pensez-vous, monseigneur? s'écria le maire.\r\n+\r\n+--J'y pense tellement, que je refuse absolument les gendarmes et que je\r\n+vais partir dans une heure.\r\n+\r\n+--Partir?\r\n+\r\n+--Partir.\r\n+\r\n+--Seul?\r\n+\r\n+--Seul.\r\n+\r\n+--Monseigneur! vous ne ferez pas cela.\r\n+\r\n+--Il y a là , dans la montagne, reprit l'évêque, une humble petite\r\n+commune grande comme ça, que je n'ai pas vue depuis trois ans. Ce sont\r\n+mes bons amis. De doux et honnêtes bergers. Ils possèdent une chèvre sur\r\n+trente qu'ils gardent. Ils font de fort jolis cordons de laine de\r\n+diverses couleurs, et ils jouent des airs de montagne sur de petites\r\n+flûtes à six trous. Ils ont besoin qu'on leur parle de temps en temps du\r\n+bon Dieu. Que diraient-ils d'un évêque qui a peur? Que diraient-ils si\r\n+je n'y allais pas?\r\n+\r\n+--Mais, monseigneur, les brigands! Si vous rencontrez les brigands!\r\n+\r\n+--Tiens, dit l'évêque, j'y songe. Vous avez raison. Je puis les\r\n+rencontrer. Eux aussi doivent avoir besoin qu'on leur parle du bon Dieu.\r\n+\r\n+--Monseigneur! mais c'est une bande! c'est un troupeau de loups!\r\n+\r\n+--Monsieur le maire, c'est peut-être précisément de ce troupeau que\r\n+Jésus me fait le pasteur. Qui sait les voies de la Providence?\r\n+\r\n+--Monseigneur, ils vous dévaliseront.\r\n+\r\n+--Je n'ai rien.\r\n+\r\n+--Ils vous tueront.\r\n+\r\n+--Un vieux bonhomme de prêtre qui passe en marmottant ses momeries? Bah!\r\n+à quoi bon?\r\n+\r\n+--Ah! mon Dieu! si vous alliez les rencontrer!\r\n+\r\n+--Je leur demanderai l'aumône pour mes pauvres.\r\n+\r\n+--Monseigneur, n'y allez pas, au nom du ciel! vous exposez votre vie.\r\n+\r\n+--Monsieur le maire, dit l'évêque, n'est-ce décidément que cela? Je ne\r\n+suis pas en ce monde pour garder ma vie, mais pour garder les âmes.\r\n+\r\n+Il fallut le laisser faire. Il partit, accompagné seulement d'un enfant\r\n+qui s'offrit à lui servir de guide. Son obstination fit bruit dans le\r\n+pays, et effraya très fort.\r\n+\r\n+Il ne voulut emmener ni sa soeur ni madame Magloire. Il traversa la\r\n+montagne à mulet, ne rencontra personne, et arriva sain et sauf chez ses\r\n+«bons amis» les bergers. Il y resta quinze jours, prêchant,\r\n+administrant, enseignant, moralisant. Lorsqu'il fut proche de son\r\n+départ, il résolut de chanter pontificalement un _Te Deum_. Il en parla\r\n+au curé. Mais comment faire? pas d'ornements épiscopaux. On ne pouvait\r\n+mettre à sa disposition qu'une chétive sacristie de village avec\r\n+quelques vieilles chasubles de damas usé ornées de galons faux.\r\n+\r\n+--Bah! dit l'évêque. Monsieur le curé, annonçons toujours au prône notre\r\n+_Te Deum_. Cela s'arrangera.\r\n+\r\n+On chercha dans les églises d'alentour. Toutes les magnificences de ces\r\n+humbles paroisses réunies n'auraient pas suffi à vêtir convenablement un\r\n+chantre de cathédrale. Comme on était dans cet embarras, une grande\r\n+caisse fut apportée et déposée au presbytère pour M. l'évêque par deux\r\n+cavaliers inconnus qui repartirent sur-le-champ. On ouvrit la caisse;\r\n+elle contenait une chape de drap d'or, une mitre ornée de diamants, une\r\n+croix archiépiscopale, une crosse magnifique, tous les vêtements\r\n+pontificaux volés un mois auparavant au trésor de Notre-Dame d'Embrun.\r\n+Dans la caisse, il y avait un papier sur lequel étaient écrits ces mots:\r\n+_Cravatte à monseigneur Bienvenu_.\r\n+\r\n+--Quand je disais que cela s'arrangerait! dit l'évêque.\r\n+\r\n+Puis il ajouta en souriant:\r\n+\r\n+--À qui se contente d'un surplis de curé, Dieu envoie une chape\r\n+d'archevêque.\r\n+\r\n+--Monseigneur, murmura le curé en hochant la tête avec un sourire, Dieu,\r\n+ou le diable.\r\n+\r\n+L'évêque regarda fixement le curé et reprit avec autorité:\r\n+\r\n+--Dieu!\r\n+\r\n+Quand il revint au Chastelar, et tout le long de la route, on venait le\r\n+regarder par curiosité. Il retrouva au presbytère du Chastelar\r\n+mademoiselle Baptistine et madame Magloire qui l'attendaient, et il dit\r\n+à sa soeur:\r\n+\r\n+--Eh bien, avais-je raison? Le pauvre prêtre est allé chez ces pauvres\r\n+montagnards les mains vides, il en revient les mains pleines. J'étais\r\n+parti n'emportant que ma confiance en Dieu; je rapporte le trésor d'une\r\n+cathédrale.\r\n+\r\n+Le soir, avant de se coucher, il dit encore:\r\n+\r\n+--Ne craignons jamais les voleurs ni les meurtriers. Ce sont là les\r\n+dangers du dehors, les petits dangers. Craignons-nous nous-mêmes. Les\r\n+préjugés, voilà les voleurs; les vices, voilà les meurtriers. Les grands\r\n+dangers sont au dedans de nous. Qu'importe ce qui menace notre tête ou\r\n+notre bourse! Ne songeons qu'à ce qui menace notre âme.\r\n+\r\n+Puis se tournant vers sa soeur:\r\n+\r\n+--Ma soeur, de la part du prêtre jamais de précaution contre le\r\n+prochain. Ce que le prochain fait, Dieu le permet. Bornons-nous à prier\r\n+Dieu quand nous croyons qu'un danger arrive sur nous. Prions-le, non\r\n+pour nous, mais pour que notre frère ne tombe pas en faute à notre\r\n+occasion.\r\n+\r\n+Du reste, les événements étaient rares dans son existence. Nous\r\n+racontons ceux que nous savons; mais d'ordinaire il passait sa vie à \r\n+faire toujours les mêmes choses aux mêmes moments. Un mois de son année\r\n+ressemblait à une heure de sa journée.\r\n+\r\n+Quant à ce que devint «le trésor» de la cathédrale d'Embrun, on nous\r\n+embarrasserait de nous interroger là -dessus. C'étaient là de bien belles\r\n+choses, et bien tentantes, et bien bonnes à voler au profit des\r\n+malheureux. Volées, elles l'étaient déjà d'ailleurs. La moitié de\r\n+l'aventure était accomplie; il ne restait plus qu'à changer la direction\r\n+du vol, et qu'à lui faire faire un petit bout de chemin du côté des\r\n+pauvres. Nous n'affirmons rien du reste à ce sujet. Seulement on a\r\n+trouvé dans les papiers de l'évêque une note assez obscure qui se\r\n+rapporte peut-être à cette affaire, et qui est ainsi conçue: _La\r\n+question est de savoir si cela doit faire retour à la cathédrale ou à \r\n+l'hôpital_.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VIII\r\n+\r\n+Philosophie après boire\r\n+\r\n+\r\n+Le sénateur dont il a été parlé plus haut était un homme entendu qui\r\n+avait fait son chemin avec une rectitude inattentive à toutes ces\r\n+rencontres qui font obstacle et qu'on nomme conscience, foi jurée,\r\n+justice, devoir; il avait marché droit à son but et sans broncher une\r\n+seule fois dans la ligne de son avancement et de son intérêt. C'était un\r\n+ancien procureur, attendri par le succès, pas méchant homme du tout,\r\n+rendant tous les petits services qu'il pouvait à ses fils, à ses\r\n+gendres, à ses parents, même à des amis; ayant sagement pris de la vie\r\n+les bons côtés, les bonnes occasions, les bonnes aubaines. Le reste lui\r\n+semblait assez bête. Il était spirituel, et juste assez lettré pour se\r\n+croire un disciple d'Épicure en n'étant peut-être qu'un produit de\r\n+Pigault-Lebrun. Il riait volontiers, et agréablement, des choses\r\n+infinies et éternelles, et des «billevesées du bonhomme évêque». Il en\r\n+riait quelquefois, avec une aimable autorité, devant M. Myriel lui-même,\r\n+qui écoutait.\r\n+\r\n+À je ne sais plus quelle cérémonie demi-officielle, le comte*** (ce\r\n+sénateur) et M. Myriel durent dîner chez le préfet. Au dessert, le\r\n+sénateur, un peu égayé, quoique toujours digne, s'écria:\r\n+\r\n+--Parbleu, monsieur l'évêque, causons. Un sénateur et un évêque se\r\n+regardent difficilement sans cligner de l'oeil. Nous sommes deux\r\n+augures. Je vais vous faire un aveu. J'ai ma philosophie.\r\n+\r\n+--Et vous avez raison, répondit l'évêque. Comme on fait sa philosophie\r\n+on se couche. Vous êtes sur le lit de pourpre, monsieur le sénateur.\r\n+\r\n+Le sénateur, encouragé, reprit:\r\n+\r\n+--Soyons bons enfants.\r\n+\r\n+--Bons diables même, dit l'évêque.\r\n+\r\n+--Je vous déclare, reprit le sénateur, que le marquis d'Argens, Pyrrhon,\r\n+Hobbes et M. Naigeon ne sont pas des maroufles. J'ai dans ma\r\n+bibliothèque tous mes philosophes dorés sur tranche.\r\n+\r\n+--Comme vous-même, monsieur le comte, interrompit l'évêque.\r\n+\r\n+Le sénateur poursuivit:\r\n+\r\n+--Je hais Diderot; c'est un idéologue, un déclamateur et un\r\n+révolutionnaire, au fond croyant en Dieu, et plus bigot que Voltaire.\r\n+Voltaire s'est moqué de Needham, et il a eu tort; car les anguilles de\r\n+Needham prouvent que Dieu est inutile. Une goutte de vinaigre dans une\r\n+cuillerée de pâte de farine supplée le _fiat lux_. Supposez la goutte\r\n+plus grosse et la cuillerée plus grande, vous avez le monde. L'homme,\r\n+c'est l'anguille. Alors à quoi bon le Père éternel? Monsieur l'évêque,\r\n+l'hypothèse Jéhovah me fatigue. Elle n'est bonne qu'à produire des gens\r\n+maigres qui songent creux. À bas ce grand Tout qui me tracasse! Vive\r\n+Zéro qui me laisse tranquille! De vous à moi, et pour vider mon sac, et\r\n+pour me confesser à mon pasteur comme il convient, je vous avoue que\r\n+j'ai du bon sens. Je ne suis pas fou de votre Jésus qui prêche à tout\r\n+bout de champ le renoncement et le sacrifice. Conseil d'avare à des\r\n+gueux. Renoncement! pourquoi? Sacrifice! à quoi? Je ne vois pas qu'un\r\n+loup s'immole au bonheur d'un autre loup. Restons donc dans la nature.\r\n+Nous sommes au sommet; ayons la philosophie supérieure. Que sert d'être\r\n+en haut, si l'on ne voit pas plus loin que le bout du nez des autres?\r\n+Vivons gaîment. La vie, c'est tout. Que l'homme ait un autre avenir,\r\n+ailleurs, là -haut, là -bas, quelque part, je n'en crois pas un traître\r\n+mot. Ah! l'on me recommande le sacrifice et le renoncement, je dois\r\n+prendre garde à tout ce que je fais, il faut que je me casse la tête sur\r\n+le bien et le mal, sur le juste et l'injuste, sur le _fas_ et le\r\n+_nefas_. Pourquoi? parce que j'aurai à rendre compte de mes actions.\r\n+Quand? après ma mort. Quel bon rêve! Après ma mort, bien fin qui me\r\n+pincera. Faites donc saisir une poignée de cendre par une main d'ombre.\r\n+Disons le vrai, nous qui sommes des initiés et qui avons levé la jupe\r\n+d'Isis: il n'y a ni bien, ni mal; il y a de la végétation. Cherchons le\r\n+réel. Creusons tout à fait. Allons au fond, que diable! Il faut flairer\r\n+la vérité, fouiller sous terre, et la saisir. Alors elle vous donne des\r\n+joies exquises. Alors vous devenez fort, et vous riez. Je suis carré par\r\n+la base, moi. Monsieur l'évêque, l'immortalité de l'homme est un\r\n+écoute-s'il-pleut. Oh! la charmante promesse! Fiez-vous-y. Le bon billet\r\n+qu'a Adam! On est âme, on sera ange, on aura des ailes bleues aux\r\n+omoplates. Aidez-moi donc, n'est-ce pas Tertullien qui dit que les\r\n+bienheureux iront d'un astre à l'autre? Soit. On sera les sauterelles\r\n+des étoiles. Et puis, on verra Dieu. Ta ta ta. Fadaises que tous ces\r\n+paradis. Dieu est une sonnette monstre. Je ne dirais point cela dans le\r\n+_Moniteur_, parbleu! mais je le chuchote entre amis. _Inter pocula_.\r\n+Sacrifier la terre au paradis, c'est lâcher la proie pour l'ombre. Être\r\n+dupe de l'infini! pas si bête. Je suis néant. Je m'appelle monsieur le\r\n+comte Néant, sénateur. Étais-je avant ma naissance? Non. Serai-je après\r\n+ma mort? Non. Que suis-je? un peu de poussière agrégée par un organisme.\r\n+Qu'ai-je à faire sur cette terre? J'ai le choix. Souffrir ou jouir. Où\r\n+me mènera la souffrance? Au néant. Mais j'aurai souffert. Où me mènera\r\n+la jouissance? Au néant. Mais j'aurai joui. Mon choix est fait. Il faut\r\n+être mangeant ou mangé. Je mange. Mieux vaut être la dent que l'herbe.\r\n+Telle est ma sagesse. Après quoi, va comme je te pousse, le fossoyeur\r\n+est là , le Panthéon pour nous autres, tout tombe dans le grand trou.\r\n+Fin. _Finis_. Liquidation totale. Ceci est l'endroit de\r\n+l'évanouissement. La mort est morte, croyez-moi. Qu'il y ait là \r\n+quelqu'un qui ait quelque chose à me dire, je ris d'y songer. Invention\r\n+de nourrices. Croquemitaine pour les enfants, Jéhovah pour les hommes.\r\n+Non, notre lendemain est de la nuit. Derrière la tombe, il n'y a plus\r\n+que des néants égaux. Vous avez été Sardanapale, vous avez été Vincent\r\n+de Paul, cela fait le même rien. Voilà le vrai. Donc vivez, par-dessus\r\n+tout. Usez de votre moi pendant que vous le tenez. En vérité, je vous le\r\n+dis, monsieur l'évêque, j'ai ma philosophie, et j'ai mes philosophes. Je\r\n+ne me laisse pas enguirlander par des balivernes. Après ça, il faut bien\r\n+quelque chose à ceux qui sont en bas, aux va-nu-pieds, aux gagne-petit,\r\n+aux misérables. On leur donne à gober les légendes, les chimères, l'âme,\r\n+l'immortalité, le paradis, les étoiles. Ils mâchent cela. Ils le mettent\r\n+sur leur pain sec. Qui n'a rien a le bon Dieu. C'est bien le moins. Je\r\n+n'y fais point obstacle, mais je garde pour moi monsieur Naigeon. Le bon\r\n+Dieu est bon pour le peuple.\r\n+\r\n+L'évêque battit des mains.\r\n+\r\n+--Voilà parler! s'écria-t-il. L'excellente chose, et vraiment\r\n+merveilleuse, que ce matérialisme-là ! Ne l'a pas qui veut. Ah! quand on\r\n+l'a, on n'est plus dupe; on ne se laisse pas bêtement exiler comme\r\n+Caton, ni lapider comme Étienne, ni brûler vif comme Jeanne d'Arc. Ceux\r\n+qui ont réussi à se procurer ce matérialisme admirable ont la joie de se\r\n+sentir irresponsables, et de penser qu'ils peuvent dévorer tout, sans\r\n+inquiétude, les places, les sinécures, les dignités, le pouvoir bien ou\r\n+mal acquis, les palinodies lucratives, les trahisons utiles, les\r\n+savoureuses capitulations de conscience, et qu'ils entreront dans la\r\n+tombe, leur digestion faite. Comme c'est agréable! Je ne dis pas cela\r\n+pour vous, monsieur le sénateur. Cependant il m'est impossible de ne\r\n+point vous féliciter. Vous autres grands seigneurs, vous avez, vous le\r\n+dites, une philosophie à vous et pour vous, exquise, raffinée,\r\n+accessible aux riches seuls, bonne à toutes les sauces, assaisonnant\r\n+admirablement les voluptés de la vie. Cette philosophie est prise dans\r\n+les profondeurs et déterrée par des chercheurs spéciaux. Mais vous êtes\r\n+bons princes, et vous ne trouvez pas mauvais que la croyance au bon Dieu\r\n+soit la philosophie du peuple, à peu près comme l'oie aux marrons est la\r\n+dinde aux truffes du pauvre.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IX\r\n+\r\n+Le frère raconté par la soeur\r\n+\r\n+\r\n+Pour donner une idée du ménage intérieur de M. l'évêque de Digne et de\r\n+la façon dont ces deux saintes filles subordonnaient leurs actions,\r\n+leurs pensées, même leurs instincts de femmes aisément effrayées, aux\r\n+habitudes et aux intentions de l'évêque, sans qu'il eût même à prendre\r\n+la peine de parler pour les exprimer, nous ne pouvons mieux faire que de\r\n+transcrire ici une lettre de mademoiselle Baptistine à madame la\r\n+vicomtesse de Boischevron, son amie d'enfance. Cette lettre est entre\r\n+nos mains.\r\n+\r\n+«Digne, 16 décembre 18....\r\n+\r\n+«Ma bonne madame, pas un jour ne se passe sans que nous parlions de\r\n+vous. C'est assez notre habitude, mais il y a une raison de plus.\r\n+Figurez-vous qu'en lavant et époussetant les plafonds et les murs,\r\n+madame Magloire a fait des découvertes; maintenant nos deux chambres\r\n+tapissées de vieux papier blanchi à la chaux ne dépareraient pas un\r\n+château dans le genre du vôtre. Madame Magloire a déchiré tout le\r\n+papier. Il y avait des choses dessous. Mon salon, où il n'y a pas de\r\n+meubles, et dont nous nous servons pour étendre le linge après les\r\n+lessives, a quinze pieds de haut, dix-huit de large carrés, un plafond\r\n+peint anciennement avec dorure, des solives comme chez vous. C'était\r\n+recouvert d'une toile, du temps que c'était l'hôpital. Enfin des\r\n+boiseries du temps de nos grand'mères. Mais c'est ma chambre qu'il faut\r\n+voir. Madame Magloire a découvert, sous au moins dix papiers collés\r\n+dessus, des peintures, sans être bonnes, qui peuvent se supporter. C'est\r\n+Télémaque reçu chevalier par Minerve, c'est lui encore dans les jardins.\r\n+Le nom m'échappe. Enfin où les dames romaines se rendaient une seule\r\n+nuit. Que vous dirai-je? j'ai des romains, des romaines (_ici un mot\r\n+illisible_), et toute la suite. Madame Magloire a débarbouillé tout\r\n+cela, et cet été elle va réparer quelques petites avaries, revenir le\r\n+tout, et ma chambre sera un vrai musée. Elle a trouvé aussi dans un coin\r\n+du grenier deux consoles en bois, genre ancien. On demandait deux écus\r\n+de six livres pour les redorer, mais il vaut bien mieux donner cela aux\r\n+pauvres; d'ailleurs c'est fort laid, et j'aimerais mieux une table ronde\r\n+en acajou.\r\n+\r\n+«Je suis toujours bien heureuse. Mon frère est si bon. Il donne tout ce\r\n+qu'il a aux indigents et aux malades. Nous sommes très gênés. Le pays\r\n+est dur l'hiver, et il faut bien faire quelque chose pour ceux qui\r\n+manquent. Nous sommes à peu près chauffés et éclairés. Vous voyez que ce\r\n+sont de grandes douceurs.\r\n+\r\n+«Mon frère a ses habitudes à lui. Quand il cause, il dit qu'un évêque\r\n+doit être ainsi. Figurez-vous que la porte de la maison n'est jamais\r\n+fermée. Entre qui veut, et l'on est tout de suite chez mon frère. Il ne\r\n+craint rien, même la nuit. C'est là sa bravoure à lui, comme il dit.\r\n+\r\n+«Il ne veut pas que je craigne pour lui, ni que madame Magloire craigne.\r\n+Il s'expose à tous les dangers, et il ne veut même pas que nous ayons\r\n+l'air de nous en apercevoir. Il faut savoir le comprendre.\r\n+\r\n+«Il sort par la pluie, il marche dans l'eau, il voyage en hiver. Il n'a\r\n+pas peur de la nuit, des routes suspectes ni des rencontres.\r\n+\r\n+«L'an dernier, il est allé tout seul dans un pays de voleurs. Il n'a pas\r\n+voulu nous emmener. Il est resté quinze jours absent. À son retour, il\r\n+n'avait rien eu, on le croyait mort, et il se portait bien, et il a dit:\r\n+\u0022Voilà comme on m'a volé!\u0022 Et il a ouvert une malle pleine de tous les\r\n+bijoux de la cathédrale d'Embrun, que les voleurs lui avaient donnés.\r\n+\r\n+«Cette fois-là , en revenant, comme j'étais allée à sa rencontre à deux\r\n+lieues avec d'autres de ses amis, je n'ai pu m'empêcher de le gronder un\r\n+peu, en ayant soin de ne parler que pendant que la voiture faisait du\r\n+bruit, afin que personne autre ne pût entendre.\r\n+\r\n+«Dans les premiers temps, je me disais: il n'y a pas de dangers qui\r\n+l'arrêtent, il est terrible. À présent j'ai fini par m'y accoutumer. Je\r\n+fais signe à madame Magloire pour qu'elle ne le contrarie pas. Il se\r\n+risque comme il veut. Moi j'emmène madame Magloire, je rentre dans ma\r\n+chambre, je prie pour lui, et je m'endors. Je suis tranquille, parce que\r\n+je sais bien que s'il lui arrivait malheur, ce serait ma fin. Je m'en\r\n+irais au bon Dieu avec mon frère et mon évêque. Madame Magloire a eu\r\n+plus de peine que moi à s'habituer à ce qu'elle appelait ses\r\n+imprudences. Mais à présent le pli est pris. Nous prions toutes les\r\n+deux, nous avons peur ensemble, et nous nous endormons. Le diable\r\n+entrerait dans la maison qu'on le laisserait faire. Après tout, que\r\n+craignons-nous dans cette maison? Il y a toujours quelqu'un avec nous,\r\n+qui est le plus fort. Le diable peut y passer, mais le bon Dieu\r\n+l'habite.\r\n+\r\n+«Voilà qui me suffit. Mon frère n'a plus même besoin de me dire un mot\r\n+maintenant. Je le comprends sans qu'il parle, et nous nous abandonnons à \r\n+la Providence.\r\n+\r\n+«Voilà comme il faut être avec un homme qui a du grand dans l'esprit.\r\n+\r\n+«J'ai questionné mon frère pour le renseignement que vous me demandez\r\n+sur la famille de Faux. Vous savez comme il sait tout et comme il a des\r\n+souvenirs, car il est toujours très bon royaliste. C'est de vrai une\r\n+très ancienne famille normande de la généralité de Caen. Il y a cinq\r\n+cents ans d'un Raoul de Faux, d'un Jean de Faux et d'un Thomas de Faux,\r\n+qui étaient des gentilshommes, dont un seigneur de Rochefort. Le dernier\r\n+était Guy-Étienne-Alexandre, et était maître de camp, et quelque chose\r\n+dans les chevaux-légers de Bretagne. Sa fille Marie-Louise a épousé\r\n+Adrien-Charles de Gramont, fils du duc Louis de Gramont, pair de France,\r\n+colonel des gardes françaises et lieutenant général des armées. On écrit\r\n+Faux, Fauq et Faoucq.\r\n+\r\n+«Bonne madame, recommandez-nous aux prières de votre saint parent, M. le\r\n+cardinal. Quant à votre chère Sylvanie, elle a bien fait de ne pas\r\n+prendre les courts instants qu'elle passe près de vous pour m'écrire.\r\n+Elle se porte bien, travaille selon vos désirs, m'aime toujours. C'est\r\n+tout ce que je veux. Son souvenir par vous m'est arrivé. Je m'en trouve\r\n+heureuse. Ma santé n'est pas trop mauvaise, et cependant je maigris tous\r\n+les jours davantage. Adieu, le papier me manque et me force de vous\r\n+quitter. Mille bonnes choses.\r\n+\r\n+«Baptistine.\r\n+\r\n+«P. S. Madame votre belle-soeur est toujours ici avec sa jeune famille.\r\n+Votre petit-neveu est charmant. Savez-vous qu'il a cinq ans bientôt!\r\n+Hier il a vu passer un cheval auquel on avait mis des genouillères, et\r\n+il disait: \u0022Qu'est-ce qu'il a donc aux genoux?\u0022 Il est si gentil, cet\r\n+enfant! Son petit frère traîne un vieux balai dans l'appartement comme\r\n+une voiture, et dit: \u0022Hu!\u0022\r\n+\r\n+»Comme on le voit par cette lettre, ces deux femmes savaient se plier\r\n+aux façons d'être de l'évêque avec ce génie particulier de la femme qui\r\n+comprend l'homme mieux que l'homme ne se comprend. L'évêque de Digne,\r\n+sous cet air doux et candide qui ne se démentait jamais, faisait parfois\r\n+des choses grandes, hardies et magnifiques, sans paraître même s'en\r\n+douter. Elles en tremblaient, mais elles le laissaient faire.\r\n+Quelquefois madame Magloire essayait une remontrance avant; jamais\r\n+pendant ni après. Jamais on ne le troublait, ne fût-ce que par un signe,\r\n+dans une action commencée. À de certains moments, sans qu'il eût besoin\r\n+de le dire, lorsqu'il n'en avait peut-être pas lui-même conscience, tant\r\n+sa simplicité était parfaite, elles sentaient vaguement qu'il agissait\r\n+comme évêque; alors elles n'étaient plus que deux ombres dans la maison.\r\n+Elles le servaient passivement, et, si c'était obéir que de disparaître,\r\n+elles disparaissaient. Elles savaient, avec une admirable délicatesse\r\n+d'instinct, que certaines sollicitudes peuvent gêner. Aussi, même le\r\n+croyant en péril, elles comprenaient, je ne dis pas sa pensée, mais sa\r\n+nature, jusqu'au point de ne plus veiller sur lui. Elles le confiaient à \r\n+Dieu.\r\n+\r\n+D'ailleurs Baptistine disait, comme on vient de le lire, que la fin de\r\n+son frère serait la sienne. Madame Magloire ne le disait pas, mais elle\r\n+le savait.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre X\r\n+\r\n+L'évêque en présence d'une lumière inconnue\r\n+\r\n+\r\n+À une époque un peu postérieure à la date de la lettre citée dans les\r\n+pages précédentes, il fit une chose, à en croire toute la ville, plus\r\n+risquée encore que sa promenade à travers les montagnes des bandits. Il\r\n+y avait près de Digne, dans la campagne, un homme qui vivait solitaire.\r\n+Cet homme, disons tout de suite le gros mot, était un ancien\r\n+conventionnel. Il se nommait G.\r\n+\r\n+On parlait du conventionnel G. dans le petit monde de Digne avec une\r\n+sorte d'horreur. Un conventionnel, vous figurez-vous cela? Cela existait\r\n+du temps qu'on se tutoyait et qu'on disait: citoyen. Cet homme était à \r\n+peu près un monstre. Il n'avait pas voté la mort du roi, mais presque.\r\n+C'était un quasi-régicide. Il avait été terrible. Comment, au retour des\r\n+princes légitimes, n'avait-on pas traduit cet homme-là devant une cour\r\n+prévôtale? On ne lui eût pas coupé la tête, si vous voulez, il faut de\r\n+la clémence, soit; mais un bon bannissement à vie. Un exemple enfin!\r\n+etc., etc. C'était un athée d'ailleurs, comme tous ces\r\n+gens-là .--Commérages des oies sur le vautour.\r\n+\r\n+Était-ce du reste un vautour que G.? Oui, si l'on en jugeait par ce\r\n+qu'il y avait de farouche dans sa solitude. N'ayant pas voté la mort du\r\n+roi, il n'avait pas été compris dans les décrets d'exil et avait pu\r\n+rester en France.\r\n+\r\n+Il habitait, à trois quarts d'heure de la ville, loin de tout hameau,\r\n+loin de tout chemin, on ne sait quel repli perdu d'un vallon très\r\n+sauvage. Il avait là , disait-on, une espèce de champ, un trou, un\r\n+repaire. Pas de voisins; pas même de passants. Depuis qu'il demeurait\r\n+dans ce vallon, le sentier qui y conduisait avait disparu sous l'herbe.\r\n+On parlait de cet endroit-là comme de la maison du bourreau. Pourtant\r\n+l'évêque songeait, et de temps en temps regardait l'horizon à l'endroit\r\n+où un bouquet d'arbres marquait le vallon du vieux conventionnel, et il\r\n+disait:\r\n+\r\n+--Il y a là une âme qui est seule.\r\n+\r\n+Et au fond de sa pensée il ajoutait: «Je lui dois ma visite.»\r\n+\r\n+Mais, avouons-le, cette idée, au premier abord naturelle, lui\r\n+apparaissait, après un moment de réflexion, comme étrange et impossible,\r\n+et presque repoussante. Car, au fond, il partageait l'impression\r\n+générale, et le conventionnel lui inspirait, sans qu'il s'en rendît\r\n+clairement compte, ce sentiment qui est comme la frontière de la haine\r\n+et qu'exprime si bien le mot éloignement.\r\n+\r\n+Toutefois, la gale de la brebis doit-elle faire reculer le pasteur? Non.\r\n+Mais quelle brebis!\r\n+\r\n+Le bon évêque était perplexe. Quelquefois il allait de ce côté-là , puis\r\n+il revenait. Un jour enfin le bruit se répandit dans la ville qu'une\r\n+façon de jeune pâtre qui servait le conventionnel G. dans sa bauge était\r\n+venu chercher un médecin; que le vieux scélérat se mourait, que la\r\n+paralysie le gagnait, et qu'il ne passerait pas la nuit.\r\n+\r\n+--Dieu merci! ajoutaient quelques-uns.\r\n+\r\n+L'évêque prit son bâton, mit son pardessus à cause de sa soutane un peu\r\n+trop usée, comme nous l'avons dit, et aussi à cause du vent du soir qui\r\n+ne devait pas tarder à souffler, et partit.\r\n+\r\n+Le soleil déclinait et touchait presque à l'horizon, quand l'évêque\r\n+arriva à l'endroit excommunié. Il reconnut avec un certain battement de\r\n+coeur qu'il était près de la tanière. Il enjamba un fossé, franchit une\r\n+haie, leva un échalier, entra dans un courtil délabré, fit quelques pas\r\n+assez hardiment, et tout à coup, au fond de la friche, derrière une\r\n+haute broussaille, il aperçut la caverne.\r\n+\r\n+C'était une cabane toute basse, indigente, petite et propre, avec une\r\n+treille clouée à la façade.\r\n+\r\n+Devant la porte, dans une vieille chaise à roulettes, fauteuil du\r\n+paysan, il y avait un homme en cheveux blancs qui souriait au soleil.\r\n+\r\n+Près du vieillard assis se tenait debout un jeune garçon, le petit\r\n+pâtre. Il tendait au vieillard une jatte de lait.\r\n+\r\n+Pendant que l'évêque regardait, le vieillard éleva la voix:\r\n+\r\n+--Merci, dit-il, je n'ai plus besoin de rien.\r\n+\r\n+Et son sourire quitta le soleil pour s'arrêter sur l'enfant.\r\n+\r\n+L'évêque s'avança. Au bruit qu'il fit en marchant, le vieux homme assis\r\n+tourna la tête, et son visage exprima toute la quantité de surprise\r\n+qu'on peut avoir après une longue vie.\r\n+\r\n+--Depuis que je suis ici, dit-il, voilà la première fois qu'on entre\r\n+chez moi. Qui êtes-vous, monsieur?\r\n+\r\n+L'évêque répondit:\r\n+\r\n+--Je me nomme Bienvenu Myriel.\r\n+\r\n+--Bienvenu Myriel! j'ai entendu prononcer ce nom. Est-ce que c'est vous\r\n+que le peuple appelle monseigneur Bienvenu?\r\n+\r\n+--C'est moi.\r\n+\r\n+Le vieillard reprit avec un demi-sourire:\r\n+\r\n+--En ce cas, vous êtes mon évêque?\r\n+\r\n+--Un peu.\r\n+\r\n+--Entrez, monsieur.\r\n+\r\n+Le conventionnel tendit la main à l'évêque, mais l'évêque ne la prit\r\n+pas. L'évêque se borna à dire:\r\n+\r\n+--Je suis satisfait de voir qu'on m'avait trompé. Vous ne me semblez,\r\n+certes, pas malade.\r\n+\r\n+--Monsieur, répondit le vieillard, je vais guérir.\r\n+\r\n+Il fit une pause et dit:\r\n+\r\n+--Je mourrai dans trois heures.\r\n+\r\n+Puis il reprit:\r\n+\r\n+--Je suis un peu médecin; je sais de quelle façon la dernière heure\r\n+vient. Hier, je n'avais que les pieds froids; aujourd'hui, le froid a\r\n+gagné les genoux; maintenant je le sens qui monte jusqu'à la ceinture;\r\n+quand il sera au coeur, je m'arrêterai. Le soleil est beau, n'est-ce\r\n+pas? je me suis fait rouler dehors pour jeter un dernier coup d'oeil sur\r\n+les choses, vous pouvez me parler, cela ne me fatigue point. Vous faites\r\n+bien de venir regarder un homme qui va mourir. Il est bon que ce\r\n+moment-là ait des témoins. On a des manies; j'aurais voulu aller jusqu'à \r\n+l'aube. Mais je sais que j'en ai à peine pour trois heures. Il fera\r\n+nuit. Au fait, qu'importe! Finir est une affaire simple. On n'a pas\r\n+besoin du matin pour cela. Soit. Je mourrai à la belle étoile.\r\n+\r\n+Le vieillard se tourna vers le pâtre.\r\n+\r\n+--Toi, va te coucher. Tu as veillé l'autre nuit. Tu es fatigué.\r\n+\r\n+L'enfant rentra dans la cabane.\r\n+\r\n+Le vieillard le suivit des yeux et ajouta comme se parlant à lui-même:\r\n+\r\n+--Pendant qu'il dormira, je mourrai. Les deux sommeils peuvent faire bon\r\n+voisinage.\r\n+\r\n+L'évêque n'était pas ému comme il semble qu'il aurait pu l'être. Il ne\r\n+croyait pas sentir Dieu dans cette façon de mourir. Disons tout, car les\r\n+petites contradictions des grands coeurs veulent être indiquées comme le\r\n+reste, lui qui, dans l'occasion, riait si volontiers de Sa Grandeur, il\r\n+était quelque peu choqué de ne pas être appelé monseigneur, et il était\r\n+presque tenté de répliquer: citoyen. Il lui vint une velléité de\r\n+familiarité bourrue, assez ordinaire aux médecins et aux prêtres, mais\r\n+qui ne lui était pas habituelle, à lui. Cet homme, après tout, ce\r\n+conventionnel, ce représentant du peuple, avait été un puissant de la\r\n+terre; pour la première fois de sa vie peut-être, l'évêque se sentit en\r\n+humeur de sévérité.\r\n+\r\n+Le conventionnel cependant le considérait avec une cordialité modeste,\r\n+où l'on eût pu démêler l'humilité qui sied quand on est si près de sa\r\n+mise en poussière.\r\n+\r\n+L'évêque, de son côté, quoiqu'il se gardât ordinairement de la\r\n+curiosité, laquelle, selon lui, était contiguë à l'offense, ne pouvait\r\n+s'empêcher d'examiner le conventionnel avec une attention qui, n'ayant\r\n+pas sa source dans la sympathie, lui eût été probablement reprochée par\r\n+sa conscience vis-à -vis de tout autre homme. Un conventionnel lui\r\n+faisait un peu l'effet d'être hors la loi, même hors la loi de charité.\r\n+\r\n+G., calme, le buste presque droit, la voix vibrante, était un de ces\r\n+grands octogénaires qui font l'étonnement du physiologiste. La\r\n+révolution a eu beaucoup de ces hommes proportionnés à l'époque. On\r\n+sentait dans ce vieillard l'homme à l'épreuve. Si près de sa fin, il\r\n+avait conservé tous les gestes de la santé. Il y avait dans son coup\r\n+d'oeil clair, dans son accent ferme, dans son robuste mouvement\r\n+d'épaules, de quoi déconcerter la mort. Azraël, l'ange mahométan du\r\n+sépulcre, eût rebroussé chemin et eût cru se tromper de porte. G.\r\n+semblait mourir parce qu'il le voulait bien. Il y avait de la liberté\r\n+dans son agonie. Les jambes seulement étaient immobiles. Les ténèbres le\r\n+tenaient par là . Les pieds étaient morts et froids, et la tête vivait de\r\n+toute la puissance de la vie et paraissait en pleine lumière. G., en ce\r\n+grave moment, ressemblait à ce roi du conte oriental, chair par en haut,\r\n+marbre par en bas.\r\n+\r\n+Une pierre était là . L'évêque s'y assit. L'exorde fut _ex abrupto_.\r\n+\r\n+--Je vous félicite, dit-il du ton dont on réprimande. Vous n'avez\r\n+toujours pas voté la mort du roi.\r\n+\r\n+Le conventionnel ne parut pas remarquer le sous-entendu amer caché dans\r\n+ce mot: toujours. Il répondit. Tout sourire avait disparu de sa face.\r\n+\r\n+--Ne me félicitez pas trop, monsieur; j'ai voté la fin du tyran.\r\n+\r\n+C'était l'accent austère en présence de l'accent sévère.\r\n+\r\n+--Que voulez-vous dire? reprit l'évêque.\r\n+\r\n+--Je veux dire que l'homme a un tyran, l'ignorance. J'ai voté la fin de\r\n+ce tyran-là . Ce tyran-là a engendré la royauté qui est l'autorité prise\r\n+dans le faux, tandis que la science est l'autorité prise dans le vrai.\r\n+L'homme ne doit être gouverné que par la science.\r\n+\r\n+--Et la conscience, ajouta l'évêque.\r\n+\r\n+--C'est la même chose. La conscience, c'est la quantité de science innée\r\n+que nous avons en nous.\r\n+\r\n+Monseigneur Bienvenu écoutait, un peu étonné, ce langage très nouveau\r\n+pour lui. Le conventionnel poursuivit:\r\n+\r\n+--Quant à Louis XVI, j'ai dit non. Je ne me crois pas le droit de tuer\r\n+un homme; mais je me sens le devoir d'exterminer le mal. J'ai voté la\r\n+fin du tyran. C'est-à -dire la fin de la prostitution pour la femme, la\r\n+fin de l'esclavage pour l'homme, la fin de la nuit pour l'enfant. En\r\n+votant la république, j'ai voté cela. J'ai voté la fraternité, la\r\n+concorde, l'aurore! J'ai aidé à la chute des préjugés et des erreurs.\r\n+Les écroulements des erreurs et des préjugés font de la lumière. Nous\r\n+avons fait tomber le vieux monde, nous autres, et le vieux monde, vase\r\n+des misères, en se renversant sur le genre humain, est devenu une urne\r\n+de joie.\r\n+\r\n+--Joie mêlée, dit l'évêque.\r\n+\r\n+--Vous pourriez dire joie troublée, et aujourd'hui, après ce fatal\r\n+retour du passé qu'on nomme 1814, joie disparue. Hélas, l'oeuvre a été\r\n+incomplète, j'en conviens; nous avons démoli l'ancien régime dans les\r\n+faits, nous n'avons pu entièrement le supprimer dans les idées. Détruire\r\n+les abus, cela ne suffit pas; il faut modifier les moeurs. Le moulin n'y\r\n+est plus, le vent y est encore.\r\n+\r\n+--Vous avez démoli. Démolir peut être utile; mais je me défie d'une\r\n+démolition compliquée de colère.\r\n+\r\n+--Le droit a sa colère, monsieur l'évêque, et la colère du droit est un\r\n+élément du progrès. N'importe, et quoi qu'on en dise, la révolution\r\n+française est le plus puissant pas du genre humain depuis l'avènement du\r\n+Christ. Incomplète, soit; mais sublime. Elle a dégagé toutes les\r\n+inconnues sociales. Elle a adouci les esprits; elle a calmé, apaisé,\r\n+éclairé; elle a fait couler sur la terre des flots de civilisation. Elle\r\n+a été bonne. La révolution française, c'est le sacre de l'humanité.\r\n+\r\n+L'évêque ne put s'empêcher de murmurer:\r\n+\r\n+--Oui? 93!\r\n+\r\n+Le conventionnel se dressa sur sa chaise avec une solennité presque\r\n+lugubre, et, autant qu'un mourant peut s'écrier, il s'écria:\r\n+\r\n+--Ah! vous y voilà ! 93! J'attendais ce mot-là . Un nuage s'est formé\r\n+pendant quinze cents ans. Au bout de quinze siècles, il a crevé. Vous\r\n+faites le procès au coup de tonnerre.\r\n+\r\n+L'évêque sentit, sans se l'avouer peut-être, que quelque chose en lui\r\n+était atteint. Pourtant il fit bonne contenance. Il répondit:\r\n+\r\n+--Le juge parle au nom de la justice; le prêtre parle au nom de la\r\n+pitié, qui n'est autre chose qu'une justice plus élevée. Un coup de\r\n+tonnerre ne doit pas se tromper.\r\n+\r\n+Et il ajouta en regardant fixement le conventionnel.\r\n+\r\n+--Louis XVII?\r\n+\r\n+Le conventionnel étendit la main et saisit le bras de l'évêque:\r\n+\r\n+--Louis XVII! Voyons, sur qui pleurez-vous? Est-ce sur l'enfant\r\n+innocent? alors, soit. Je pleure avec vous. Est-ce sur l'enfant royal?\r\n+je demande à réfléchir. Pour moi, le frère de Cartouche, enfant\r\n+innocent, pendu sous les aisselles en place de Grève jusqu'à ce que mort\r\n+s'ensuive, pour le seul crime d'avoir été le frère de Cartouche, n'est\r\n+pas moins douloureux que le petit-fils de Louis XV, enfant innocent,\r\n+martyrisé dans la tour du Temple pour le seul crime d'avoir été le\r\n+petit-fils de Louis XV.\r\n+\r\n+--Monsieur, dit l'évêque, je n'aime pas ces rapprochements de noms.\r\n+\r\n+--Cartouche? Louis XV? pour lequel des deux réclamez-vous?\r\n+\r\n+Il y eut un moment de silence. L'évêque regrettait presque d'être venu,\r\n+et pourtant il se sentait vaguement et étrangement ébranlé.\r\n+\r\n+Le conventionnel reprit:\r\n+\r\n+--Ah! monsieur le prêtre, vous n'aimez pas les crudités du vrai. Christ\r\n+les aimait, lui. Il prenait une verge et il époussetait le temple. Son\r\n+fouet plein d'éclairs était un rude diseur de vérités. Quand il\r\n+s'écriait: _Sinite parvulos_..., il ne distinguait pas entre les petits\r\n+enfants. Il ne se fût pas gêné de rapprocher le dauphin de Barabbas du\r\n+dauphin d'Hérode. Monsieur, l'innocence est sa couronne à elle-même.\r\n+L'innocence n'a que faire d'être altesse. Elle est aussi auguste\r\n+déguenillée que fleurdelysée.\r\n+\r\n+--C'est vrai, dit l'évêque à voix basse.\r\n+\r\n+--J'insiste, continua le conventionnel G. Vous m'avez nommé Louis XVII.\r\n+Entendons-nous. Pleurons-nous sur tous les innocents, sur tous les\r\n+martyrs, sur tous les enfants, sur ceux d'en bas comme sur ceux d'en\r\n+haut? J'en suis. Mais alors, je vous l'ai dit, il faut remonter plus\r\n+haut que 93, et c'est avant Louis XVII qu'il faut commencer nos larmes.\r\n+Je pleurerai sur les enfants des rois avec vous, pourvu que vous\r\n+pleuriez avec moi sur les petits du peuple.\r\n+\r\n+--Je pleure sur tous, dit l'évêque.\r\n+\r\n+--Également! s'écria G., et si la balance doit pencher, que ce soit du\r\n+côté du peuple. Il y a plus longtemps qu'il souffre.\r\n+\r\n+Il y eut encore un silence. Ce fut le conventionnel qui le rompit. Il se\r\n+souleva sur un coude, prit entre son pouce et son index replié un peu de\r\n+sa joue, comme on fait machinalement lorsqu'on interroge et qu'on juge,\r\n+et interpella l'évêque avec un regard plein de toutes les énergies de\r\n+l'agonie. Ce fut presque une explosion.\r\n+\r\n+--Oui, monsieur, il y a longtemps que le peuple souffre. Et puis, tenez,\r\n+ce n'est pas tout cela, que venez-vous me questionner et me parler de\r\n+Louis XVII? Je ne vous connais pas, moi. Depuis que je suis dans ce\r\n+pays, j'ai vécu dans cet enclos, seul, ne mettant pas les pieds dehors,\r\n+ne vient personne que cet enfant qui m'aide. Votre nom est, il est vrai,\r\n+arrivé confusément jusqu'à moi, et, je dois le dire, pas très mal\r\n+prononcé; mais cela ne signifie rien; les gens habiles ont tant de\r\n+manières d'en faire accroire à ce brave bonhomme de peuple. À propos, je\r\n+n'ai pas entendu le bruit de votre voiture, vous l'aurez sans doute\r\n+laissée derrière le taillis, là -bas, à l'embranchement de la route. Je\r\n+ne vous connais pas, vous dis-je. Vous m'avez dit que vous étiez\r\n+l'évêque, mais cela ne me renseigne point sur votre personne morale. En\r\n+somme, je vous répète ma question. Qui êtes-vous? Vous êtes un évêque,\r\n+c'est-à -dire un prince de l'église, un de ces hommes dorés, armoriés,\r\n+rentés, qui ont de grosses prébendes--l'évêché de Digne, quinze mille\r\n+francs de fixe, dix mille francs de casuel, total, vingt-cinq mille\r\n+francs--, qui ont des cuisines, qui ont des livrées, qui font bonne\r\n+chère, qui mangent des poules d'eau le vendredi, qui se pavanent,\r\n+laquais devant, laquais derrière, en berline de gala, et qui ont des\r\n+palais, et qui roulent carrosse au nom de Jésus-Christ qui allait pieds\r\n+nus! Vous êtes un prélat; rentes, palais, chevaux, valets, bonne table,\r\n+toutes les sensualités de la vie, vous avez cela comme les autres, et\r\n+comme les autres vous en jouissez, c'est bien, mais cela en dit trop ou\r\n+pas assez; cela ne m'éclaire pas sur votre valeur intrinsèque et\r\n+essentielle, à vous qui venez avec la prétention probable de m'apporter\r\n+de la sagesse. À qui est-ce que je parle? Qui êtes-vous?\r\n+\r\n+L'évêque baissa la tête et répondit:\r\n+\r\n+--_Vermis sum_.\r\n+\r\n+--Un ver de terre en carrosse! grommela le conventionnel.\r\n+\r\n+C'était le tour du conventionnel d'être hautain, et de l'évêque d'être\r\n+humble.\r\n+\r\n+L'évêque reprit avec douceur.\r\n+\r\n+--Monsieur, soit. Mais expliquez-moi en quoi mon carrosse, qui est là à \r\n+deux pas derrière les arbres, en quoi ma bonne table et les poules d'eau\r\n+que je mange le vendredi, en quoi mes vingt-cinq mille livres de rentes,\r\n+en quoi mon palais et mes laquais prouvent que la pitié n'est pas une\r\n+vertu, que la clémence n'est pas un devoir, et que 93 n'a pas été\r\n+inexorable.\r\n+\r\n+Le conventionnel passa la main sur son front comme pour en écarter un\r\n+nuage.\r\n+\r\n+--Avant de vous répondre, dit-il, je vous prie de me pardonner. Je viens\r\n+d'avoir un tort, monsieur. Vous êtes chez moi, vous êtes mon hôte. Je\r\n+vous dois courtoisie. Vous discutez mes idées, il sied que je me borne à \r\n+combattre vos raisonnements. Vos richesses et vos jouissances sont des\r\n+avantages que j'ai contre vous dans le débat, mais il est de bon goût de\r\n+ne pas m'en servir. Je vous promets de ne plus en user.\r\n+\r\n+--Je vous remercie, dit l'évêque.\r\n+\r\n+G. reprit:\r\n+\r\n+--Revenons à l'explication que vous me demandiez. Où en étions-nous? Que\r\n+me disiez-vous? que 93 a été inexorable?\r\n+\r\n+--Inexorable, oui, dit l'évêque. Que pensez-vous de Marat battant des\r\n+mains à la guillotine?\r\n+\r\n+--Que pensez-vous de Bossuet chantant le _Te Deum_ sur les dragonnades?\r\n+\r\n+La réponse était dure, mais elle allait au but avec la rigidité d'une\r\n+pointe d'acier. L'évêque en tressaillit; il ne lui vint aucune riposte,\r\n+mais il était froissé de cette façon de nommer Bossuet. Les meilleurs\r\n+esprits ont leurs fétiches, et parfois se sentent vaguement meurtris des\r\n+manques de respect de la logique.\r\n+\r\n+Le conventionnel commençait à haleter; l'asthme de l'agonie, qui se mêle\r\n+aux derniers souffles, lui entrecoupait la voix; cependant il avait\r\n+encore une parfaite lucidité d'âme dans les yeux. Il continua:\r\n+\r\n+--Disons encore quelques mots çà et là , je veux bien. En dehors de la\r\n+révolution qui, prise dans son ensemble, est une immense affirmation\r\n+humaine, 93, hélas! est une réplique. Vous le trouvez inexorable, mais\r\n+toute la monarchie, monsieur? Carrier est un bandit; mais quel nom\r\n+donnez-vous à Montrevel? Fouquier-Tinville est un gueux, mais quel est\r\n+votre avis sur Lamoignon-Bâville? Maillard est affreux, mais\r\n+Saulx-Tavannes, s'il vous plaît? Le père Duchêne est féroce, mais quelle\r\n+épithète m'accorderez-vous pour le père Letellier? Jourdan-Coupe-Tête\r\n+est un monstre, mais moindre que M. le marquis de Louvois. Monsieur,\r\n+monsieur, je plains Marie-Antoinette, archiduchesse et reine, mais je\r\n+plains aussi cette pauvre femme huguenote qui, en 1685, sous Louis le\r\n+Grand, monsieur, allaitant son enfant, fut liée, nue jusqu'à la\r\n+ceinture, à un poteau, l'enfant tenu à distance; le sein se gonflait de\r\n+lait et le coeur d'angoisse. Le petit, affamé et pâle, voyait ce sein,\r\n+agonisait et criait, et le bourreau disait à la femme, mère et nourrice:\r\n+«Abjure!» lui donnant à choisir entre la mort de son enfant et la mort\r\n+de sa conscience. Que dites-vous de ce supplice de Tantale accommodé à \r\n+une mère? Monsieur, retenez bien ceci: la révolution française a eu ses\r\n+raisons. Sa colère sera absoute par l'avenir. Son résultat, c'est le\r\n+monde meilleur. De ses coups les plus terribles, il sort une caresse\r\n+pour le genre humain. J'abrège. Je m'arrête, j'ai trop beau jeu.\r\n+D'ailleurs je me meurs.\r\n+\r\n+Et, cessant de regarder l'évêque, le conventionnel acheva sa pensée en\r\n+ces quelques mots tranquilles:\r\n+\r\n+--Oui, les brutalités du progrès s'appellent révolutions. Quand elles\r\n+sont finies, on reconnaît ceci: que le genre humain a été rudoyé, mais\r\n+qu'il a marché.\r\n+\r\n+Le conventionnel ne se doutait pas qu'il venait d'emporter\r\n+successivement l'un après l'autre tous les retranchements intérieurs de\r\n+l'évêque. Il en restait un pourtant, et de ce retranchement, suprême\r\n+ressource de la résistance de monseigneur Bienvenu, sortit cette parole\r\n+où reparut presque toute la rudesse du commencement:\r\n+\r\n+--Le progrès doit croire en Dieu. Le bien ne peut pas avoir de serviteur\r\n+impie. C'est un mauvais conducteur du genre humain que celui qui est\r\n+athée.\r\n+\r\n+Le vieux représentant du peuple ne répondit pas. Il eut un tremblement.\r\n+Il regarda le ciel, et une larme germa lentement dans ce regard. Quand\r\n+la paupière fut pleine, la larme coula le long de sa joue livide, et il\r\n+dit presque en bégayant, bas et se parlant à lui-même, l'oeil perdu dans\r\n+les profondeurs:\r\n+\r\n+--O toi! ô idéal! toi seul existes!\r\n+\r\n+L'évêque eut une sorte d'inexprimable commotion. Après un silence, le\r\n+vieillard leva un doigt vers le ciel, et dit:\r\n+\r\n+--L'infini est. Il est là . Si l'infini n'avait pas de moi, le moi serait\r\n+sa borne; il ne serait pas infini; en d'autres termes, il ne serait pas.\r\n+Or il est. Donc il a un moi. Ce moi de l'infini, c'est Dieu.\r\n+\r\n+Le mourant avait prononcé ces dernières paroles d'une voix haute et avec\r\n+le frémissement de l'extase, comme s'il voyait quelqu'un. Quand il eut\r\n+parlé, ses yeux se fermèrent. L'effort l'avait épuisé. Il était évident\r\n+qu'il venait de vivre en une minute les quelques heures qui lui\r\n+restaient. Ce qu'il venait de dire l'avait approché de celui qui est\r\n+dans la mort. L'instant suprême arrivait.\r\n+\r\n+L'évêque le comprit, le moment pressait, c'était comme prêtre qu'il\r\n+était venu; de l'extrême froideur, il était passé par degrés à l'émotion\r\n+extrême; il regarda ces yeux fermés, il prit cette vieille main ridée et\r\n+glacée, et se pencha vers le moribond:\r\n+\r\n+--Cette heure est celle de Dieu. Ne trouvez-vous pas qu'il serait\r\n+regrettable que nous nous fussions rencontrés en vain?\r\n+\r\n+Le conventionnel rouvrit les yeux. Une gravité où il y avait de l'ombre\r\n+s'empreignit sur son visage.\r\n+\r\n+--Monsieur l'évêque, dit-il, avec une lenteur qui venait peut-être plus\r\n+encore de la dignité de l'âme que de la défaillance des forces, j'ai\r\n+passé ma vie dans la méditation, l'étude et la contemplation. J'avais\r\n+soixante ans quand mon pays m'a appelé, et m'a ordonné de me mêler de\r\n+ses affaires. J'ai obéi. Il y avait des abus, je les ai combattus; il y\r\n+avait des tyrannies, je les ai détruites; il y avait des droits et des\r\n+principes, je les ai proclamés et confessés. Le territoire était envahi,\r\n+je l'ai défendu; la France était menacée, j'ai offert ma poitrine. Je\r\n+n'étais pas riche; je suis pauvre. J'ai été l'un des maîtres de l'État,\r\n+les caves du Trésor étaient encombrées d'espèces au point qu'on était\r\n+forcé d'étançonner les murs, prêts à se fendre sous le poids de l'or et\r\n+de l'argent, je dînais rue de l'Arbre-Sec à vingt-deux sous par tête.\r\n+J'ai secouru les opprimés, j'ai soulagé les souffrants. J'ai déchiré la\r\n+nappe de l'autel, c'est vrai; mais c'était pour panser les blessures de\r\n+la patrie. J'ai toujours soutenu la marche en avant du genre humain vers\r\n+la lumière, et j'ai résisté quelquefois au progrès sans pitié. J'ai,\r\n+dans l'occasion, protégé mes propres adversaires, vous autres. Et il y a\r\n+à Peteghem en Flandre, à l'endroit même où les rois mérovingiens avaient\r\n+leur palais d'été, un couvent d'urbanistes, l'abbaye de Sainte-Claire en\r\n+Beaulieu, que j'ai sauvé en 1793. J'ai fait mon devoir selon mes forces,\r\n+et le bien que j'ai pu. Après quoi j'ai été chassé, traqué, poursuivi,\r\n+persécuté, noirci, raillé, conspué, maudit, proscrit. Depuis bien des\r\n+années déjà , avec mes cheveux blancs, je sens que beaucoup de gens se\r\n+croient sur moi le droit de mépris, j'ai pour la pauvre foule ignorante\r\n+visage de damné, et j'accepte, ne haïssant personne, l'isolement de la\r\n+haine. Maintenant, j'ai quatre-vingt-six ans; je vais mourir. Qu'est-ce\r\n+que vous venez me demander?\r\n+\r\n+--Votre bénédiction, dit l'évêque.\r\n+\r\n+Et il s'agenouilla.\r\n+\r\n+Quand l'évêque releva la tête, la face du conventionnel était devenue\r\n+auguste. Il venait d'expirer.\r\n+\r\n+L'évêque rentra chez lui profondément absorbé dans on ne sait quelles\r\n+pensées. Il passa toute la nuit en prière. Le lendemain, quelques braves\r\n+curieux essayèrent de lui parler du conventionnel G.; il se borna à \r\n+montrer le ciel. À partir de ce moment, il redoubla de tendresse et de\r\n+fraternité pour les petits et les souffrants.\r\n+\r\n+Toute allusion à ce «vieux scélérat de G.» le faisait tomber dans une\r\n+préoccupation singulière. Personne ne pourrait dire que le passage de\r\n+cet esprit devant le sien et le reflet de cette grande conscience sur la\r\n+sienne ne fût pas pour quelque chose dans son approche de la perfection.\r\n+\r\n+Cette «visite pastorale» fut naturellement une occasion de bourdonnement\r\n+pour les petites coteries locales:\r\n+\r\n+--Était-ce la place d'un évêque que le chevet d'un tel mourant? Il n'y\r\n+avait évidemment pas de conversion à attendre. Tous ces révolutionnaires\r\n+sont relaps. Alors pourquoi y aller? Qu'a-t-il été regarder là ? Il\r\n+fallait donc qu'il fût bien curieux d'un emportement d'âme par le\r\n+diable.\r\n+\r\n+Un jour, une douairière, de la variété impertinente qui se croit\r\n+spirituelle, lui adressa cette saillie:\r\n+\r\n+--Monseigneur, on demande quand Votre Grandeur aura le bonnet rouge.\r\n+\r\n+--Oh! oh! voilà une grosse couleur, répondit l'évêque. Heureusement que\r\n+ceux qui la méprisent dans un bonnet la vénèrent dans un chapeau.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XI\r\n+\r\n+Une restriction\r\n+\r\n+\r\n+On risquerait fort de se tromper si l'on concluait de là que monseigneur\r\n+Bienvenu fût «un évêque philosophe» ou «un curé patriote». Sa rencontre,\r\n+ce qu'on pourrait presque appeler sa conjonction avec le conventionnel\r\n+G., lui laissa une sorte d'étonnement qui le rendit plus doux encore.\r\n+Voilà tout.\r\n+\r\n+Quoique monseigneur Bienvenu n'ait été rien moins qu'un homme politique,\r\n+c'est peut-être ici le lieu d'indiquer, très brièvement, quelle fut son\r\n+attitude dans les événements d'alors, en supposant que monseigneur\r\n+Bienvenu ait jamais songé à avoir une attitude. Remontons donc en\r\n+arrière de quelques années.\r\n+\r\n+Quelque temps après l'élévation de M. Myriel à l'épiscopat, l'empereur\r\n+l'avait fait baron de l'empire, en même temps que plusieurs autres\r\n+évêques. L'arrestation du pape eut lieu, comme on sait, dans la nuit du\r\n+5 au 6 juillet 1809; à cette occasion, M. Myriel fut appelé par Napoléon\r\n+au synode des évêques de France et d'Italie convoqué à Paris. Ce synode\r\n+se tint à Notre-Dame et s'assembla pour la première fois le 15 juin 1811\r\n+sous la présidence de M. le cardinal Fesch. M. Myriel fut du nombre des\r\n+quatre-vingt-quinze évêques qui s'y rendirent. Mais il n'assista qu'à \r\n+une séance et à trois ou quatre conférences particulières. Évêque d'un\r\n+diocèse montagnard, vivant si près de la nature, dans la rusticité et le\r\n+dénuement, il paraît qu'il apportait parmi ces personnages éminents des\r\n+idées qui changeaient la température de l'assemblée. Il revint bien vite\r\n+à Digne. On le questionna sur ce prompt retour, il répondit:\r\n+\r\n+--Je les gênais. L'air du dehors leur venait par moi. Je leur faisais\r\n+l'effet d'une porte ouverte.\r\n+\r\n+Une autre fois il dit:\r\n+\r\n+--Que voulez-vous? ces messeigneurs-là sont des princes. Moi, je ne suis\r\n+qu'un pauvre évêque paysan.\r\n+\r\n+Le fait est qu'il avait déplu. Entre autres choses étranges, il lui\r\n+serait échappé de dire, un soir qu'il se trouvait chez un de ses\r\n+collègues les plus qualifiés:\r\n+\r\n+--Les belles pendules! les beaux tapis! les belles livrées! Ce doit être\r\n+bien importun! Oh! que je ne voudrais pas avoir tout ce superflu-là à me\r\n+crier sans cesse aux oreilles: Il y a des gens qui ont faim! il y a des\r\n+gens qui ont froid! il y a des pauvres! il y a des pauvres!\r\n+\r\n+Disons-le en passant, ce ne serait pas une haine intelligente que la\r\n+haine du luxe. Cette haine impliquerait la haine des arts. Cependant,\r\n+chez les gens d'église, en dehors de la représentation et des\r\n+cérémonies, le luxe est un tort. Il semble révéler des habitudes peu\r\n+réellement charitables. Un prêtre opulent est un contre-sens. Le prêtre\r\n+doit se tenir près des pauvres. Or peut-on toucher sans cesse, et nuit\r\n+et jour, à toutes les détresses, à toutes les infortunes, à toutes les\r\n+indigences, sans avoir soi-même sur soi un peu de cette sainte misère,\r\n+comme la poussière du travail? Se figure-t-on un homme qui est près d'un\r\n+brasier, et qui n'a pas chaud? Se figure-t-on un ouvrier qui travaille\r\n+sans cesse à une fournaise, et qui n'a ni un cheveu brûlé, ni un ongle\r\n+noirci, ni une goutte de sueur, ni un grain de cendre au visage? La\r\n+première preuve de la charité chez le prêtre, chez l'évêque surtout,\r\n+c'est la pauvreté. C'était là sans doute ce que pensait M. l'évêque de\r\n+Digne.\r\n+\r\n+Il ne faudrait pas croire d'ailleurs qu'il partageait sur certains\r\n+points délicats ce que nous appellerions «les idées du siècle». Il se\r\n+mêlait peu aux querelles théologiques du moment et se taisait sur les\r\n+questions où sont compromis l'Église et l'État; mais si on l'eût\r\n+beaucoup pressé, il paraît qu'on l'eût trouvé plutôt ultramontain que\r\n+gallican. Comme nous faisons un portrait et que nous ne voulons rien\r\n+cacher, nous sommes forcé d'ajouter qu'il fut glacial pour Napoléon\r\n+déclinant. À partir de 1813, il adhéra ou il applaudit à toutes les\r\n+manifestations hostiles. Il refusa de le voir à son passage au retour de\r\n+l'île d'Elbe, et s'abstint d'ordonner dans son diocèse les prières\r\n+publiques pour l'empereur pendant les Cent-Jours.\r\n+\r\n+Outre sa soeur, mademoiselle Baptistine, il avait deux frères: l'un\r\n+général, l'autre préfet. Il écrivait assez souvent à tous les deux. Il\r\n+tint quelque temps rigueur au premier, parce qu'ayant un commandement en\r\n+Provence, à l'époque du débarquement de Cannes, le général s'était mis à \r\n+la tête de douze cents hommes et avait poursuivi l'empereur comme\r\n+quelqu'un qui veut le laisser échapper. Sa correspondance resta plus\r\n+affectueuse pour l'autre frère, l'ancien préfet, brave et digne homme\r\n+qui vivait retiré à Paris, rue Cassette.\r\n+\r\n+Monseigneur Bienvenu eut donc, aussi lui, son heure d'esprit de parti,\r\n+son heure d'amertume, son nuage. L'ombre des passions du moment traversa\r\n+ce doux et grand esprit occupé des choses éternelles. Certes, un pareil\r\n+homme eût mérité de n'avoir pas d'opinions politiques. Qu'on ne se\r\n+méprenne pas sur notre pensée, nous ne confondons point ce qu'on appelle\r\n+«opinions politiques» avec la grande aspiration au progrès, avec la\r\n+sublime foi patriotique, démocratique et humaine, qui, de nos jours,\r\n+doit être le fond même de toute intelligence généreuse. Sans approfondir\r\n+des questions qui ne touchent qu'indirectement au sujet de ce livre,\r\n+nous disons simplement ceci: Il eût été beau que monseigneur Bienvenu\r\n+n'eût pas été royaliste et que son regard ne se fût pas détourné un seul\r\n+instant de cette contemplation sereine où l'on voit rayonner\r\n+distinctement, au-dessus du va-et-vient orageux des choses humaines, ces\r\n+trois pures lumières, la Vérité, la Justice, la Charité.\r\n+\r\n+Tout en convenant que ce n'était point pour une fonction politique que\r\n+Dieu avait créé monseigneur Bienvenu, nous eussions compris et admiré la\r\n+protestation au nom du droit et de la liberté, l'opposition fière, la\r\n+résistance périlleuse et juste à Napoléon tout-puissant. Mais ce qui\r\n+nous plaît vis-à -vis de ceux qui montent nous plaît moins vis-à -vis de\r\n+ceux qui tombent. Nous n'aimons le combat que tant qu'il y a danger; et,\r\n+dans tous les cas, les combattants de la première heure ont seuls le\r\n+droit d'être les exterminateurs de la dernière. Qui n'a pas été\r\n+accusateur opiniâtre pendant la prospérité doit se taire devant\r\n+l'écroulement. Le dénonciateur du succès est le seul légitime justicier\r\n+de la chute. Quant à nous, lorsque la Providence s'en mêle et frappe,\r\n+nous la laissons faire. 1812 commence à nous désarmer. En 1813, la lâche\r\n+rupture de silence de ce corps législatif taciturne enhardi par les\r\n+catastrophes n'avait que de quoi indigner, et c'était un tort\r\n+d'applaudir; en 1814, devant ces maréchaux trahissant, devant ce sénat\r\n+passant d'une fange à l'autre, insultant après avoir divinisé, devant\r\n+cette idolâtrie lâchant pied et crachant sur l'idole, c'était un devoir\r\n+de détourner la tête; en 1815, comme les suprêmes désastres étaient dans\r\n+l'air, comme la France avait le frisson de leur approche sinistre, comme\r\n+on pouvait vaguement distinguer Waterloo ouvert devant Napoléon, la\r\n+douloureuse acclamation de l'armée et du peuple au condamné du destin\r\n+n'avait rien de risible, et, toute réserve faite sur le despote, un\r\n+coeur comme l'évêque de Digne n'eût peut-être pas dû méconnaître ce\r\n+qu'avait d'auguste et de touchant, au bord de l'abîme, l'étroit\r\n+embrassement d'une grande nation et d'un grand homme.\r\n+\r\n+À cela près, il était et il fut, en toute chose, juste, vrai, équitable,\r\n+intelligent, humble et digne; bienfaisant, et bienveillant, ce qui est\r\n+une autre bienfaisance. C'était un prêtre, un sage, et un homme. Même,\r\n+il faut le dire, dans cette opinion politique que nous venons de lui\r\n+reprocher et que nous sommes disposé à juger presque sévèrement, il\r\n+était tolérant et facile, peut-être plus que nous qui parlons ici.--Le\r\n+portier de la maison de ville avait été placé là par l'empereur. C'était\r\n+un vieux sous-officier de la vieille garde, légionnaire d'Austerlitz,\r\n+bonapartiste comme l'aigle. Il échappait dans l'occasion à ce pauvre\r\n+diable de ces paroles peu réfléchies que la loi d'alors qualifiait\r\n+_propos séditieux_. Depuis que le profil impérial avait disparu de la\r\n+légion d'honneur, il ne s'habillait jamais _dans l'ordonnance_, comme il\r\n+disait, afin de ne pas être forcé de porter sa croix. Il avait ôté\r\n+lui-même dévotement l'effigie impériale de la croix que Napoléon lui\r\n+avait donnée, cela faisait un trou, et il n'avait rien voulu mettre à la\r\n+place. «Plutôt mourir, disait-il, que de porter sur mon coeur les trois\r\n+crapauds!» Il raillait volontiers tout haut Louis XVIII. «Vieux goutteux\r\n+à guêtres d'anglais!» disait-il, «qu'il s'en aille en Prusse avec son\r\n+salsifis!» Heureux de réunir dans la même imprécation les deux choses\r\n+qu'il détestait le plus, la Prusse et l'Angleterre. Il en fit tant qu'il\r\n+perdit sa place. Le voilà sans pain sur le pavé avec femme et enfants.\r\n+L'évêque le fit venir, le gronda doucement, et le nomma suisse de la\r\n+cathédrale.\r\n+\r\n+M. Myriel était dans le diocèse le vrai pasteur, l'ami de tous. En neuf\r\n+ans, à force de saintes actions et de douces manières, monseigneur\r\n+Bienvenu avait rempli la ville de Digne d'une sorte de vénération tendre\r\n+et filiale. Sa conduite même envers Napoléon avait été acceptée et comme\r\n+tacitement pardonnée par le peuple, bon troupeau faible, qui adorait son\r\n+empereur, mais qui aimait son évêque.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XII\r\n+\r\n+Solitude de monseigneur Bienvenu\r\n+\r\n+\r\n+Il y a presque toujours autour d'un évêque une escouade de petits abbés\r\n+comme autour d'un général une volée de jeunes officiers. C'est là ce que\r\n+ce charmant saint François de Sales appelle quelque part «les prêtres\r\n+blancs-becs». Toute carrière a ses aspirants qui font cortège aux\r\n+arrivés. Pas une puissance qui n'ait son entourage; pas une fortune qui\r\n+n'ait sa cour. Les chercheurs d'avenir tourbillonnent autour du présent\r\n+splendide. Toute métropole a son état-major. Tout évêque un peu influent\r\n+a près de lui sa patrouille de chérubins séminaristes, qui fait la ronde\r\n+et maintient le bon ordre dans le palais épiscopal, et qui monte la\r\n+garde autour du sourire de monseigneur. Agréer à un évêque, c'est le\r\n+pied à l'étrier pour un sous-diacre. Il faut bien faire son chemin;\r\n+l'apostolat ne dédaigne pas le canonicat.\r\n+\r\n+De même qu'il y a ailleurs les gros bonnets, il y a dans l'église les\r\n+grosses mitres. Ce sont les évêques bien en cour, riches, rentés,\r\n+habiles, acceptés du monde, sachant prier, sans doute, mais sachant\r\n+aussi solliciter, peu scrupuleux de faire faire antichambre en leur\r\n+personne à tout un diocèse, traits d'union entre la sacristie et la\r\n+diplomatie, plutôt abbés que prêtres, plutôt prélats qu'évêques. Heureux\r\n+qui les approche! Gens en crédit qu'ils sont, ils font pleuvoir autour\r\n+d'eux, sur les empressés et les favorisés, et sur toute cette jeunesse\r\n+qui sait plaire, les grasses paroisses, les prébendes, les\r\n+archidiaconats, les aumôneries et les fonctions cathédrales, en\r\n+attendant les dignités épiscopales. En avançant eux-mêmes, ils font\r\n+progresser leurs satellites; c'est tout un système solaire en marche.\r\n+Leur rayonnement empourpre leur suite. Leur prospérité s'émiette sur la\r\n+cantonade en bonnes petites promotions. Plus grand diocèse au patron,\r\n+plus grosse cure au favori. Et puis Rome est là . Un évêque qui sait\r\n+devenir archevêque, un archevêque qui sait devenir cardinal, vous emmène\r\n+comme conclaviste, vous entrez dans la rote, vous avez le pallium, vous\r\n+voilà auditeur, vous voilà camérier, vous voilà monsignor, et de la\r\n+Grandeur à Imminence il n'y a qu'un pas, et entre Imminence et la\r\n+Sainteté il n'y a que la fumée d'un scrutin. Toute calotte peut rêver la\r\n+tiare. Le prêtre est de nos jours le seul homme qui puisse régulièrement\r\n+devenir roi; et quel roi! le roi suprême. Aussi quelle pépinière\r\n+d'aspirations qu'un séminaire! Que d'enfants de choeur rougissants, que\r\n+de jeunes abbés ont sur la tête le pot au lait de Perrette! Comme\r\n+l'ambition s'intitule aisément vocation, qui sait? de bonne foi\r\n+peut-être et se trompant elle-même, béate qu'elle est!\r\n+\r\n+Monseigneur Bienvenu, humble, pauvre, particulier, n'était pas compté\r\n+parmi les grosses mitres. Cela était visible à l'absence complète de\r\n+jeunes prêtres autour de lui. On a vu qu'à Paris «il n'avait pas pris».\r\n+Pas un avenir ne songeait à se greffer sur ce vieillard solitaire. Pas\r\n+une ambition en herbe ne faisait la folie de verdir à son ombre. Ses\r\n+chanoines et ses grands vicaires étaient de bons vieux hommes, un peu\r\n+peuple comme lui, murés comme lui dans ce diocèse sans issue sur le\r\n+cardinafat, et qui ressemblaient à leur évêque, avec cette différence\r\n+qu'eux étaient finis, et que lui était achevé.\r\n+\r\n+On sentait si bien l'impossibilité de croître près de monseigneur\r\n+Bienvenu qu'à peine sortis du séminaire, les jeunes gens ordonnés par\r\n+lui se faisaient recommander aux archevêques d'Aix ou d'Auch, et s'en\r\n+allaient bien vite. Car enfin, nous le répétons, on veut être poussé. Un\r\n+saint qui vit dans un excès d'abnégation est un voisinage dangereux; il\r\n+pourrait bien vous communiquer par contagion une pauvreté incurable,\r\n+l'ankylose des articulations utiles à l'avancement, et, en somme, plus\r\n+de renoncement que vous n'en voulez; et l'on fuit cette vertu galeuse.\r\n+De là l'isolement de monseigneur Bienvenu. Nous vivons dans une société\r\n+sombre. Réussir, voilà l'enseignement qui tombe goutte à goutte de la\r\n+corruption en surplomb.\r\n+\r\n+Soit dit en passant, c'est une chose assez hideuse que le succès. Sa\r\n+fausse ressemblance avec le mérite trompe les hommes. Pour la foule, la\r\n+réussite a presque le même profil que la suprématie. Le succès, ce\r\n+ménechme du talent, a une dupe: l'histoire. Juvénal et Tacite seuls en\r\n+bougonnent. De nos jours, une philosophie à peu près officielle est\r\n+entrée en domesticité chez lui, porte la livrée du succès, et fait le\r\n+service de son antichambre. Réussissez: théorie. Prospérité suppose\r\n+Capacité. Gagnez à la loterie, vous voilà un habile homme. Qui triomphe\r\n+est vénéré. Naissez coiffé, tout est là . Ayez de la chance, vous aurez\r\n+le reste; soyez heureux, on vous croira grand. En dehors des cinq ou six\r\n+exceptions immenses qui font l'éclat d'un siècle, l'admiration\r\n+contemporaine n'est guère que myopie. Dorure est or. Être le premier\r\n+venu, cela ne gâte rien, pourvu qu'on soit le parvenu. Le vulgaire est\r\n+un vieux Narcisse qui s'adore lui-même et qui applaudit le vulgaire.\r\n+Cette faculté énorme par laquelle on est Moïse, Eschyle, Dante,\r\n+Michel-Ange ou Napoléon, la multitude la décerne d'emblée et par\r\n+acclamation à quiconque atteint son but dans quoi que ce soit. Qu'un\r\n+notaire se transfigure en député, qu'un faux Corneille fasse _Tiridate_,\r\n+qu'un eunuque parvienne à posséder un harem, qu'un Prud'homme militaire\r\n+gagne par accident la bataille décisive d'une époque, qu'un apothicaire\r\n+invente les semelles de carton pour l'armée de Sambre-et-Meuse et se\r\n+construise, avec ce carton vendu pour du cuir, quatre cent mille livres\r\n+de rente, qu'un porte-balle épouse l'usure et la fasse accoucher de sept\r\n+ou huit millions dont il est le père et dont elle est la mère, qu'un\r\n+prédicateur devienne évêque par le nasillement, qu'un intendant de bonne\r\n+maison soit si riche en sortant de service qu'on le fasse ministre des\r\n+finances, les hommes appellent cela Génie, de même qu'ils appellent\r\n+Beauté la figure de Mousqueton et Majesté l'encolure de Claude. Ils\r\n+confondent avec les constellations de l'abîme les étoiles que font dans\r\n+la vase molle du bourbier les pattes des canards.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XIII\r\n+\r\n+Ce qu'il croyait\r\n+\r\n+\r\n+Au point de vue de l'orthodoxie, nous n'avons point à sonder M. l'évêque\r\n+de Digne. Devant une telle âme, nous ne nous sentons en humeur que de\r\n+respect. La conscience du juste doit être crue sur parole. D'ailleurs,\r\n+de certaines natures étant données, nous admettons le développement\r\n+possible de toutes les beautés de la vertu humaine dans une croyance\r\n+différente de la nôtre.\r\n+\r\n+Que pensait-il de ce dogme-ci ou de ce mystère-là ? Ces secrets du for\r\n+intérieur ne sont connus que de la tombe où les âmes entrent nues. Ce\r\n+dont nous sommes certain, c'est que jamais les difficultés de foi ne se\r\n+résolvaient pour lui en hypocrisie. Aucune pourriture n'est possible au\r\n+diamant. Il croyait le plus qu'il pouvait. _Credo in Patrem_,\r\n+s'écriait-il souvent. Puisant d'ailleurs dans les bonnes oeuvres cette\r\n+quantité de satisfaction qui suffit à la conscience, et qui vous dit\r\n+tout bas: «Tu es avec Dieu.»\r\n+\r\n+Ce que nous croyons devoir noter, c'est que, en dehors, pour ainsi dire,\r\n+et au-delà de sa foi, l'évêque avait un excès d'amour. C'est par là ,\r\n+_quia multum amavit_, qu'il était jugé vulnérable par les «hommes\r\n+sérieux», les «personnes graves» et les «gens raisonnables»; locutions\r\n+favorites de notre triste monde où l'égoïsme reçoit le mot d'ordre du\r\n+pédantisme. Qu'était-ce que cet excès d'amour? C'était une bienveillance\r\n+sereine, débordant les hommes, comme nous l'avons indiqué déjà , et, dans\r\n+l'occasion, s'étendant jusqu'aux choses. Il vivait sans dédain. Il était\r\n+indulgent pour la création de Dieu. Tout homme, même le meilleur, a en\r\n+lui une dureté irréfléchie qu'il tient en réserve pour l'animal.\r\n+L'évêque de Digne n'avait point cette dureté-là , particulière à beaucoup\r\n+de prêtres pourtant. Il n'allait pas jusqu'au bramine, mais il semblait\r\n+avoir médité cette parole de l'Ecclésiaste: «Sait-on où va l'âme des\r\n+animaux?» Les laideurs de l'aspect, les difformités de l'instinct, ne le\r\n+troublaient pas et ne l'indignaient pas. Il en était ému, presque\r\n+attendri. Il semblait que, pensif, il en allât chercher, au-delà de la\r\n+vie apparente, la cause, l'explication ou l'excuse. Il semblait par\r\n+moments demander à Dieu des commutations. Il examinait sans colère, et\r\n+avec l'oeil du linguiste qui déchiffre un palimpseste, la quantité de\r\n+chaos qui est encore dans la nature. Cette rêverie faisait parfois\r\n+sortir de lui des mots étranges. Un matin, il était dans son jardin; il\r\n+se croyait seul, mais sa soeur marchait derrière lui sans qu'il la vît;\r\n+tout à coup, il s'arrêta, et il regarda quelque chose à terre; c'était\r\n+une grosse araignée, noire, velue, horrible. Sa soeur l'entendit qui\r\n+disait:\r\n+\r\n+--Pauvre bête! ce n'est pas sa faute.\r\n+\r\n+Pourquoi ne pas dire ces enfantillages presque divins de la bonté?\r\n+Puérilités, soit; mais ces puérilités sublimes ont été celles de saint\r\n+François d'Assise et de Marc-Aurèle. Un jour il se donna une entorse\r\n+pour n'avoir pas voulu écraser une fourmi.\r\n+\r\n+Ainsi vivait cet homme juste. Quelquefois, il s'endormait dans son\r\n+jardin, et alors il n'était rien de plus vénérable.\r\n+\r\n+Monseigneur Bienvenu avait été jadis, à en croire les récits sur sa\r\n+jeunesse et même sur sa virilité, un homme passionné, peut-être violent.\r\n+Sa mansuétude universelle était moins un instinct de nature que le\r\n+résultat d'une grande conviction filtrée dans son coeur à travers la vie\r\n+et lentement tombée en lui, pensée à pensée; car, dans un caractère\r\n+comme dans un rocher, il peut y avoir des trous de gouttes d'eau. Ces\r\n+creusements-là sont ineffaçables; ces formations-là sont\r\n+indestructibles.\r\n+\r\n+En 1815, nous croyons l'avoir dit, il atteignit soixante-quinze ans,\r\n+mais il n'en paraissait pas avoir plus de soixante. Il n'était pas\r\n+grand; il avait quelque embonpoint, et, pour le combattre, il faisait\r\n+volontiers de longues marches à pied, il avait le pas ferme et n'était\r\n+que fort peu courbé, détail d'où nous ne prétendons rien conclure;\r\n+Grégoire XVI, à quatre-vingts ans, se tenait droit et souriant, ce qui\r\n+ne l'empêchait pas d'être un mauvais évêque. Monseigneur Bienvenu avait\r\n+ce que le peuple appelle «une belle tête», mais si aimable qu'on\r\n+oubliait qu'elle était belle.\r\n+\r\n+Quand il causait avec cette santé enfantine qui était une de ses grâces,\r\n+et dont nous avons déjà parlé, on se sentait à l'aise près de lui, il\r\n+semblait que de toute sa personne il sortît de la joie. Son teint coloré\r\n+et frais, toutes ses dents bien blanches qu'il avait conservées et que\r\n+son rire faisait voir, lui donnaient cet air ouvert et facile qui fait\r\n+dire d'un homme: «C'est un bon enfant», et d'un vieillard: «C'est un\r\n+bonhomme». C'était, on s'en souvient, l'effet qu'il avait fait à \r\n+Napoléon. Au premier abord, et pour qui le voyait pour la première fois,\r\n+ce n'était guère qu'un bonhomme en effet. Mais si l'on restait quelques\r\n+heures près de lui, et pour peu qu'on le vît pensif, le bonhomme se\r\n+transfigurait peu à peu et prenait je ne sais quoi d'imposant; son front\r\n+large et sérieux, auguste par les cheveux blancs, devenait auguste aussi\r\n+par la méditation; la majesté se dégageait de cette bonté, sans que la\r\n+bonté cessât de rayonner; on éprouvait quelque chose de l'émotion qu'on\r\n+aurait si l'on voyait un ange souriant ouvrir lentement ses ailes sans\r\n+cesser de sourire. Le respect, un respect inexprimable, vous pénétrait\r\n+par degrés et vous montait au coeur, et l'on sentait qu'on avait devant\r\n+soi une de ces âmes fortes, éprouvées et indulgentes, où la pensée est\r\n+si grande qu'elle ne peut plus être que douce.\r\n+\r\n+Comme on l'a vu, la prière, la célébration des offices religieux,\r\n+l'aumône, la consolation aux affligés, la culture d'un coin de terre, la\r\n+fraternité, la frugalité, l'hospitalité, le renoncement, la confiance,\r\n+l'étude, le travail remplissaient chacune des journées de sa vie.\r\n+_Remplissaient_ est bien le mot, et certes cette journée de l'évêque\r\n+était bien pleine jusqu'aux bords de bonnes pensées, de bonnes paroles\r\n+et de bonnes actions. Cependant elle n'était pas complète si le temps\r\n+froid ou pluvieux l'empêchait d'aller passer, le soir, quand les deux\r\n+femmes s'étaient retirées, une heure ou deux dans son jardin avant de\r\n+s'endormir. Il semblait que ce fût une sorte de rite pour lui de se\r\n+préparer au sommeil par la méditation en présence des grands spectacles\r\n+du ciel nocturne. Quelquefois, à une heure même assez avancée de la\r\n+nuit, si les deux vieilles filles ne dormaient pas, elles l'entendaient\r\n+marcher lentement dans les allées. Il était là , seul avec lui-même,\r\n+recueilli, paisible, adorant, comparant la sérénité de son coeur à la\r\n+sérénité de l'éther, ému dans les ténèbres par les splendeurs visibles\r\n+des constellations et les splendeurs invisibles de Dieu, ouvrant son âme\r\n+aux pensées qui tombent de l'inconnu. Dans ces moments-là , offrant son\r\n+coeur à l'heure où les fleurs nocturnes offrent leur parfum, allumé\r\n+comme une lampe au centre de la nuit étoilée, se répandant en extase au\r\n+milieu du rayonnement universel de la création, il n'eût pu peut-être\r\n+dire lui-même ce qui se passait dans son esprit, il sentait quelque\r\n+chose s'envoler hors de lui et quelque chose descendre en lui.\r\n+Mystérieux échanges des gouffres de l'âme avec les gouffres de\r\n+l'univers!\r\n+\r\n+Il songeait à la grandeur et à la présence de Dieu; à l'éternité future,\r\n+étrange mystère; à l'éternité passée, mystère plus étrange encore; à \r\n+tous les infinis qui s'enfonçaient sous ses yeux dans tous les sens; et,\r\n+sans chercher à comprendre l'incompréhensible, il le regardait. Il\r\n+n'étudiait pas Dieu, il s'en éblouissait. Il considérait ces magnifiques\r\n+rencontres des atomes qui donnent des aspects à la matière, révèlent les\r\n+forces en les constatant, créent les individualités dans l'unité, les\r\n+proportions dans l'étendue, l'innombrable dans l'infini, et par la\r\n+lumière produisent la beauté. Ces rencontres se nouent et se dénouent\r\n+sans cesse; de là la vie et la mort. Il s'asseyait sur un banc de bois\r\n+adossé à une treille décrépite, et il regardait les astres à travers les\r\n+silhouettes chétives et rachitiques de ses arbres fruitiers. Ce quart\r\n+d'arpent, si pauvrement planté, si encombré de masures et de hangars,\r\n+lui était cher et lui suffisait.\r\n+\r\n+Que fallait-il de plus à ce vieillard, qui partageait le loisir de sa\r\n+vie, où il y avait si peu de loisir, entre le jardinage le jour et la\r\n+contemplation la nuit? Cet étroit enclos, ayant les cieux pour plafond,\r\n+n'était-ce pas assez pour pouvoir adorer Dieu tour à tour dans ses\r\n+oeuvres les plus charmantes et dans ses oeuvres les plus sublimes?\r\n+N'est-ce pas là tout, en effet, et que désirer au-delà ? Un petit jardin\r\n+pour se promener, et l'immensité pour rêver. À ses pieds ce qu'on peut\r\n+cultiver et cueillir; sur sa tête ce qu'on peut étudier et méditer;\r\n+quelques fleurs sur la terre et toutes les étoiles dans le ciel.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XIV\r\n+\r\n+Ce qu'il pensait\r\n+\r\n+\r\n+Un dernier mot.\r\n+\r\n+Comme cette nature de détails pourrait, particulièrement au moment où\r\n+nous sommes, et pour nous servir d'une expression actuellement à la\r\n+mode, donner à l'évêque de Digne une certaine physionomie «panthéiste»,\r\n+et faire croire, soit à son blâme, soit à sa louange, qu'il y avait en\r\n+lui une de ces philosophies personnelles, propres à notre siècle, qui\r\n+germent quelquefois dans les esprits solitaires et s'y construisent et y\r\n+grandissent jusqu'à y remplacer les religions, nous insistons sur ceci\r\n+que pas un de ceux qui ont connu monseigneur Bienvenu ne se fût cru\r\n+autorisé à penser rien de pareil. Ce qui éclairait cet homme, c'était le\r\n+coeur. Sa sagesse était faite de la lumière qui vient de là .\r\n+\r\n+Point de systèmes, beaucoup d'oeuvres. Les spéculations abstruses\r\n+contiennent du vertige; rien n'indique qu'il hasardât son esprit dans\r\n+les apocalypses. L'apôtre peut être hardi, mais l'évêque doit être\r\n+timide. Il se fût probablement fait scrupule de sonder trop avant de\r\n+certains problèmes réservés en quelque sorte aux grands esprits\r\n+terribles. Il y a de l'horreur sacrée sous les porches de l'énigme; ces\r\n+ouvertures sombres sont là béantes, mais quelque chose vous dit, à vous\r\n+passant de la vie, qu'on n'entre pas. Malheur à qui y pénètre! Les\r\n+génies, dans les profondeurs inouïes de l'abstraction et de la\r\n+spéculation pure, situés pour ainsi dire au-dessus des dogmes, proposent\r\n+leurs idées à Dieu. Leur prière offre audacieusement la discussion. Leur\r\n+adoration interroge. Ceci est la religion directe, pleine d'anxiété et\r\n+de responsabilité pour qui en tente les escarpements.\r\n+\r\n+La méditation humaine n'a point de limite. À ses risques et périls, elle\r\n+analyse et creuse son propre éblouissement. On pourrait presque dire\r\n+que, par une sorte de réaction splendide, elle en éblouit la nature; le\r\n+mystérieux monde qui nous entoure rend ce qu'il reçoit, il est probable\r\n+que les contemplateurs sont contemplés. Quoi qu'il en soit, il y a sur\r\n+la terre des hommes--sont-ce des hommes?--qui aperçoivent distinctement\r\n+au fond des horizons du rêve les hauteurs de l'absolu, et qui ont la\r\n+vision terrible de la montagne infinie. Monseigneur Bienvenu n'était\r\n+point de ces hommes-là , monseigneur Bienvenu n'était pas un génie. Il\r\n+eût redouté ces sublimités d'où quelques-uns, très grands même, comme\r\n+Swedenborg et Pascal, ont glissé dans la démence. Certes, ces puissantes\r\n+rêveries ont leur utilité morale, et par ces routes ardues on s'approche\r\n+de la perfection idéale. Lui, il prenait le sentier qui abrège:\r\n+l'évangile. Il n'essayait point de faire faire à sa chasuble les plis du\r\n+manteau d'Élie, il ne projetait aucun rayon d'avenir sur le roulis\r\n+ténébreux des événements, il ne cherchait pas à condenser en flamme la\r\n+lueur des choses, il n'avait rien du prophète et rien du mage. Cette âme\r\n+simple aimait, voilà tout.\r\n+\r\n+Qu'il dilatât la prière jusqu'à une aspiration surhumaine, cela est\r\n+probable; mais on ne peut pas plus prier trop qu'aimer trop; et, si\r\n+c'était une hérésie de prier au-delà des textes, sainte Thérèse et saint\r\n+Jérôme seraient des hérétiques.\r\n+\r\n+Il se penchait sur ce qui gémit et sur ce qui expie. L'univers lui\r\n+apparaissait comme une immense maladie; il sentait partout de la fièvre,\r\n+il auscultait partout de la souffrance, et, sans chercher à deviner\r\n+l'énigme, il tâchait de panser la plaie. Le redoutable spectacle des\r\n+choses créées développait en lui l'attendrissement; il n'était occupé\r\n+qu'à trouver pour lui-même et à inspirer aux autres la meilleure manière\r\n+de plaindre et de soulager. Ce qui existe était pour ce bon et rare\r\n+prêtre un sujet permanent de tristesse cherchant à consoler.\r\n+\r\n+Il y a des hommes qui travaillent à l'extraction de l'or; lui, il\r\n+travaillait à l'extraction de la pitié. L'universelle misère était sa\r\n+mine. La douleur partout n'était qu'une occasion de bonté toujours.\r\n+_Aimez-vous les uns les autres;_ il déclarait cela complet, ne\r\n+souhaitait rien de plus, et c'était là toute sa doctrine. Un jour, cet\r\n+homme qui se croyait «philosophe», ce sénateur, déjà nommé, dit à \r\n+l'évêque:\r\n+\r\n+--Mais voyez donc le spectacle du monde; guerre de tous contre tous; le\r\n+plus fort a le plus d'esprit. Votre _aimez-vous les uns les autres_ est\r\n+une bêtise.\r\n+\r\n+--Eh bien, répondit monseigneur Bienvenu sans disputer, si c'est une\r\n+bêtise, l'âme doit s'y enfermer comme la perle dans l'huître.\r\n+\r\n+Il s'y enfermait donc, il y vivait, il s'en satisfaisait absolument,\r\n+laissant de côté les questions prodigieuses qui attirent et qui\r\n+épouvantent, les perspectives insondables de l'abstraction, les\r\n+précipices de la métaphysique, toutes ces profondeurs convergentes, pour\r\n+l'apôtre à Dieu, pour l'athée au néant: la destinée, le bien et le mal,\r\n+la guerre de l'être contre l'être, la conscience de l'homme, le\r\n+somnambulisme pensif de l'animal, la transformation par la mort, la\r\n+récapitulation d'existences que contient le tombeau, la greffe\r\n+incompréhensible des amours successifs sur le moi persistant, l'essence,\r\n+la substance, le Nil et l'Ens, l'âme, la nature, la liberté, la\r\n+nécessité; problèmes à pic, épaisseurs sinistres, où se penchent les\r\n+gigantesques archanges de l'esprit humain; formidables abîmes que\r\n+Lucrèce, Manou, saint Paul et Dante contemplent avec cet oeil fulgurant\r\n+qui semble, en regardant fixement l'infini, y faire éclore des étoiles.\r\n+\r\n+Monseigneur Bienvenu était simplement un homme qui constatait du dehors\r\n+les questions mystérieuses sans les scruter, sans les agiter, et sans en\r\n+troubler son propre esprit, et qui avait dans l'âme le grave respect de\r\n+l'ombre.\r\n+\r\n+\r\n+\r\n+\r\n+Livre deuxième--La chute\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre I\r\n+\r\n+Le soir d'un jour de marche\r\n+\r\n+\r\n+Dans les premiers jours du mois d'octobre 1815, une heure environ avant\r\n+le coucher du soleil, un homme qui voyageait à pied entrait dans la\r\n+petite ville de Digne. Les rares habitants qui se trouvaient en ce moment\r\n+à leurs fenêtres ou sur le seuil de leurs maisons regardaient ce\r\n+voyageur avec une sorte d'inquiétude. Il était difficile de rencontrer\r\n+un passant d'un aspect plus misérable. C'était un homme de moyenne\r\n+taille, trapu et robuste, dans la force de l'âge. Il pouvait avoir\r\n+quarante-six ou quarante-huit ans. Une casquette à visière de cuir\r\n+rabattue cachait en partie son visage, brûlé par le soleil et le hâle,\r\n+et ruisselant de sueur. Sa chemise de grosse toile jaune, rattachée au\r\n+col par une petite ancre d'argent, laissait voir sa poitrine velue; il\r\n+avait une cravate tordue en corde, un pantalon de coutil bleu, usé et\r\n+râpé, blanc à un genou, troué à l'autre, une vieille blouse grise en\r\n+haillons, rapiécée à l'un des coudes d'un morceau de drap vert cousu\r\n+avec de la ficelle, sur le dos un sac de soldat fort plein, bien bouclé\r\n+et tout neuf, à la main un énorme bâton noueux, les pieds sans bas dans\r\n+des souliers ferrés, la tête tondue et la barbe longue.\r\n+\r\n+La sueur, la chaleur, le voyage à pied, la poussière, ajoutaient je ne\r\n+sais quoi de sordide à cet ensemble délabré.\r\n+\r\n+Les cheveux étaient ras, et pourtant hérissés; car ils commençaient à \r\n+pousser un peu, et semblaient n'avoir pas été coupés depuis quelque\r\n+temps.\r\n+\r\n+Personne ne le connaissait. Ce n'était évidemment qu'un passant. D'où\r\n+venait-il? Du midi. Des bords de la mer peut-être. Car il faisait son\r\n+entrée dans Digne par la même rue qui, sept mois auparavant, avait vu\r\n+passer l'empereur Napoléon allant de Cannes à Paris. Cet homme avait dû\r\n+marcher tout le jour. Il paraissait très fatigué. Des femmes de l'ancien\r\n+bourg qui est au bas de la ville l'avaient vu s'arrêter sous les arbres\r\n+du boulevard Gassendi et boire à la fontaine qui est à l'extrémité de la\r\n+promenade. Il fallait qu'il eût bien soif, car des enfants qui le\r\n+suivaient le virent encore s'arrêter, et boire, deux cents pas plus\r\n+loin, à la fontaine de la place du marché.\r\n+\r\n+Arrivé au coin de la rue Poichevert, il tourna à gauche et se dirigea\r\n+vers la mairie. Il y entra, puis sortit un quart d'heure après. Un\r\n+gendarme était assis près de la porte sur le banc de pierre où le\r\n+général Drouot monta le 4 mars pour lire à la foule effarée des\r\n+habitants de Digne la proclamation du golfe Juan. L'homme ôta sa\r\n+casquette et salua humblement le gendarme.\r\n+\r\n+Le gendarme, sans répondre à son salut, le regarda avec attention, le\r\n+suivit quelque temps des yeux, puis entra dans la maison de ville.\r\n+\r\n+Il y avait alors à Digne une belle auberge à l'enseigne de _la\r\n+Croix-de-Colbas_. Cette auberge avait pour hôtelier un nommé Jacquin\r\n+Labarre, homme considéré dans la ville pour sa parenté avec un autre\r\n+Labarre, qui tenait à Grenoble l'auberge des _Trois-Dauphins_ et qui\r\n+avait servi dans les guides. Lors du débarquement de l'empereur,\r\n+beaucoup de bruits avaient couru dans le pays sur cette auberge des\r\n+_Trois-Dauphins_. On contait que le général Bertrand, déguisé en\r\n+charretier, y avait fait de fréquents voyages au mois de janvier, et\r\n+qu'il y avait distribué des croix d'honneur à des soldats et des\r\n+poignées de napoléons à des bourgeois. La réalité est que l'empereur,\r\n+entré dans Grenoble, avait refusé de s'installer à l'hôtel de la\r\n+préfecture; il avait remercié le maire en disant: _Je vais chez un brave\r\n+homme que je connais_, et il était allé aux _Trois-Dauphins_. Cette\r\n+gloire du Labarre des _Trois-Dauphins_ se reflétait à vingt-cinq lieues\r\n+de distance jusque sur le Labarre de la _Croix-de-Colbas_. On disait de\r\n+lui dans la ville: _C'est le cousin de celui de Grenoble_.\r\n+\r\n+L'homme se dirigea vers cette auberge, qui était la meilleure du pays.\r\n+Il entra dans la cuisine, laquelle s'ouvrait de plain-pied sur la rue.\r\n+Tous les fourneaux étaient allumés; un grand feu flambait gaîment dans\r\n+la cheminée. L'hôte, qui était en même temps le chef, allait de l'âtre\r\n+aux casseroles, fort occupé et surveillant un excellent dîner destiné à \r\n+des rouliers qu'on entendait rire et parler à grand bruit dans une salle\r\n+voisine. Quiconque a voyagé sait que personne ne fait meilleure chère\r\n+que les rouliers. Une marmotte grasse, flanquée de perdrix blanches et\r\n+de coqs de bruyère, tournait sur une longue broche devant le feu; sur\r\n+les fourneaux cuisaient deux grosses carpes du lac de Lauzet et une\r\n+truite du lac d'Alloz.\r\n+\r\n+L'hôte, entendant la porte s'ouvrir et entrer un nouveau venu, dit sans\r\n+lever les yeux de ses fourneaux:\r\n+\r\n+--Que veut monsieur?\r\n+\r\n+--Manger et coucher, dit l'homme.\r\n+\r\n+--Rien de plus facile, reprit l'hôte.\r\n+\r\n+En ce moment il tourna la tête, embrassa d'un coup d'oeil tout\r\n+l'ensemble du voyageur, et ajouta:\r\n+\r\n+--... en payant.\r\n+\r\n+L'homme tira une grosse bourse de cuir de la poche de sa blouse et\r\n+répondit:\r\n+\r\n+--J'ai de l'argent.\r\n+\r\n+--En ce cas on est à vous, dit l'hôte.\r\n+\r\n+L'homme remit sa bourse en poche, se déchargea de son sac, le posa à \r\n+terre près de la porte, garda son bâton à la main, et alla s'asseoir sur\r\n+une escabelle basse près du feu. Digne est dans la montagne. Les soirées\r\n+d'octobre y sont froides.\r\n+\r\n+Cependant, tout en allant et venant, l'homme considérait le voyageur.\r\n+\r\n+--Dîne-t-on bientôt? dit l'homme.\r\n+\r\n+--Tout à l'heure, dit l'hôte.\r\n+\r\n+Pendant que le nouveau venu se chauffait, le dos tourné, le digne\r\n+aubergiste Jacquin Labarre tira un crayon de sa poche, puis il déchira\r\n+le coin d'un vieux journal qui traînait sur une petite table près de la\r\n+fenêtre. Sur la marge blanche il écrivit une ligne ou deux, plia sans\r\n+cacheter et remit ce chiffon de papier à un enfant qui paraissait lui\r\n+servir tout à la fois de marmiton et de laquais. L'aubergiste dit un mot\r\n+à l'oreille du marmiton, et l'enfant partit en courant dans la direction\r\n+de la mairie.\r\n+\r\n+Le voyageur n'avait rien vu de tout cela.\r\n+\r\n+Il demanda encore une fois:\r\n+\r\n+--Dîne-t-on bientôt?\r\n+\r\n+--Tout à l'heure, dit l'hôte.\r\n+\r\n+L'enfant revint. Il rapportait le papier. L'hôte le déplia avec\r\n+empressement, comme quelqu'un qui attend une réponse. Il parut lire\r\n+attentivement, puis hocha la tête, et resta un moment pensif. Enfin il\r\n+fit un pas vers le voyageur qui semblait plongé dans des réflexions peu\r\n+sereines.\r\n+\r\n+--Monsieur, dit-il, je ne puis vous recevoir.\r\n+\r\n+L'homme se dressa à demi sur son séant.\r\n+\r\n+--Comment! Avez-vous peur que je ne paye pas? Voulez-vous que je paye\r\n+d'avance? J'ai de l'argent, vous dis-je.\r\n+\r\n+--Ce n'est pas cela.\r\n+\r\n+--Quoi donc?\r\n+\r\n+--Vous avez de l'argent....\r\n+\r\n+--Oui, dit l'homme.\r\n+\r\n+--Et moi, dit l'hôte, je n'ai pas de chambre.\r\n+\r\n+L'homme reprit tranquillement:\r\n+\r\n+--Mettez-moi à l'écurie.\r\n+\r\n+--Je ne puis.\r\n+\r\n+--Pourquoi?\r\n+\r\n+--Les chevaux prennent toute la place.\r\n+\r\n+--Eh bien, repartit l'homme, un coin dans le grenier. Une botte de\r\n+paille. Nous verrons cela après dîner.\r\n+\r\n+--Je ne puis vous donner à dîner.\r\n+\r\n+Cette déclaration, faite d'un ton mesuré, mais ferme, parut grave à \r\n+l'étranger. Il se leva.\r\n+\r\n+--Ah bah! mais je meurs de faim, moi. J'ai marché dès le soleil levé.\r\n+J'ai fait douze lieues. Je paye. Je veux manger.\r\n+\r\n+--Je n'ai rien, dit l'hôte.\r\n+\r\n+L'homme éclata de rire et se tourna vers la cheminée et les fourneaux.\r\n+\r\n+--Rien! et tout cela?\r\n+\r\n+--Tout cela m'est retenu.\r\n+\r\n+--Par qui?\r\n+\r\n+--Par ces messieurs les rouliers.\r\n+\r\n+--Combien sont-ils?\r\n+\r\n+--Douze.\r\n+\r\n+--Il y a là à manger pour vingt.\r\n+\r\n+--Ils ont tout retenu et tout payé d'avance.\r\n+\r\n+L'homme se rassit et dit sans hausser la voix:\r\n+\r\n+--Je suis à l'auberge, j'ai faim, et je reste.\r\n+\r\n+L'hôte alors se pencha à son oreille, et lui dit d'un accent qui le fit\r\n+tressaillir:\r\n+\r\n+--Allez-vous en.\r\n+\r\n+Le voyageur était courbé en cet instant et poussait quelques braises\r\n+dans le feu avec le bout ferré de son bâton, il se retourna vivement,\r\n+et, comme il ouvrait la bouche pour répliquer, l'hôte le regarda\r\n+fixement et ajouta toujours à voix basse:\r\n+\r\n+--Tenez, assez de paroles comme cela. Voulez-vous que je vous dise votre\r\n+nom? Vous vous appelez Jean Valjean. Maintenant voulez-vous que je vous\r\n+dise qui vous êtes? En vous voyant entrer, je me suis douté de quelque\r\n+chose, j'ai envoyé à la mairie, et voici ce qu'on m'a répondu.\r\n+Savez-vous lire?\r\n+\r\n+En parlant ainsi il tendait à l'étranger, tout déplié, le papier qui\r\n+venait de voyager de l'auberge à la mairie, et de la mairie à l'auberge.\r\n+L'homme y jeta un regard. L'aubergiste reprit après un silence:\r\n+\r\n+--J'ai l'habitude d'être poli avec tout le monde. Allez-vous-en.\r\n+\r\n+L'homme baissa la tête, ramassa le sac qu'il avait déposé à terre, et\r\n+s'en alla. Il prit la grande rue. Il marchait devant lui au hasard,\r\n+rasant de près les maisons, comme un homme humilié et triste. Il ne se\r\n+retourna pas une seule fois. S'il s'était retourné, il aurait vu\r\n+l'aubergiste de la _Croix-de-Colbas_ sur le seuil de sa porte, entouré\r\n+de tous les voyageurs de son auberge et de tous les passants de la rue,\r\n+parlant vivement et le désignant du doigt, et, aux regards de défiance\r\n+et d'effroi du groupe, il aurait deviné qu'avant peu son arrivée serait\r\n+l'événement de toute la ville.\r\n+\r\n+Il ne vit rien de tout cela. Les gens accablés ne regardent pas derrière\r\n+eux. Ils ne savent que trop que le mauvais sort les suit.\r\n+\r\n+Il chemina ainsi quelque temps, marchant toujours, allant à l'aventure\r\n+par des rues qu'il ne connaissait pas, oubliant la fatigue, comme cela\r\n+arrive dans la tristesse. Tout à coup il sentit vivement la faim. La\r\n+nuit approchait. Il regarda autour de lui pour voir s'il ne découvrirait\r\n+pas quelque gîte.\r\n+\r\n+La belle hôtellerie s'était fermée pour lui; il cherchait quelque\r\n+cabaret bien humble, quelque bouge bien pauvre.\r\n+\r\n+Précisément une lumière s'allumait au bout de la rue; une branche de\r\n+pin, pendue à une potence en fer, se dessinait sur le ciel blanc du\r\n+crépuscule. Il y alla.\r\n+\r\n+C'était en effet un cabaret. Le cabaret qui est dans la rue de Chaffaut.\r\n+\r\n+Le voyageur s'arrêta un moment, et regarda par la vitre l'intérieur de\r\n+la salle basse du cabaret, éclairée par une petite lampe sur une table\r\n+et par un grand feu dans la cheminée. Quelques hommes y buvaient. L'hôte\r\n+se chauffait. La flamme faisait bruire une marmite de fer accrochée à la\r\n+crémaillère.\r\n+\r\n+On entre dans ce cabaret, qui est aussi une espèce d'auberge, par deux\r\n+portes. L'une donne sur la rue, l'autre s'ouvre sur une petite cour\r\n+pleine de fumier.\r\n+\r\n+Le voyageur n'osa pas entrer par la porte de la rue. Il se glissa dans\r\n+la cour, s'arrêta encore, puis leva timidement le loquet et poussa la\r\n+porte.\r\n+\r\n+--Qui va là ? dit le maître.\r\n+\r\n+--Quelqu'un qui voudrait souper et coucher.\r\n+\r\n+--C'est bon. Ici on soupe et on couche.\r\n+\r\n+Il entra. Tous les gens qui buvaient se retournèrent. La lampe\r\n+l'éclairait d'un côté, le feu de l'autre. On l'examina quelque temps\r\n+pendant qu'il défaisait son sac.\r\n+\r\n+L'hôte lui dit:\r\n+\r\n+--Voilà du feu. Le souper cuit dans la marmite. Venez vous chauffer,\r\n+camarade.\r\n+\r\n+Il alla s'asseoir près de l'âtre. Il allongea devant le feu ses pieds\r\n+meurtris par la fatigue; une bonne odeur sortait de la marmite. Tout ce\r\n+qu'on pouvait distinguer de son visage sous sa casquette baissée prit\r\n+une vague apparence de bien-être mêlée à cet autre aspect si poignant\r\n+que donne l'habitude de la souffrance.\r\n+\r\n+C'était d'ailleurs un profil ferme, énergique et triste. Cette\r\n+physionomie était étrangement composée; elle commençait par paraître\r\n+humble et finissait par sembler sévère. L'oeil luisait sous les sourcils\r\n+comme un feu sous une broussaille.\r\n+\r\n+Cependant un des hommes attablés était un poissonnier qui, avant\r\n+d'entrer au cabaret de la rue de Chaffaut, était allé mettre son cheval\r\n+à l'écurie chez Labarre. Le hasard faisait que le matin même il avait\r\n+rencontré cet étranger de mauvaise mine, cheminant entre Bras dasse\r\n+et... j'ai oublié le nom. (Je crois que c'est Escoublon). Or, en le\r\n+rencontrant, l'homme, qui paraissait déjà très fatigué, lui avait\r\n+demandé de le prendre en croupe; à quoi le poissonnier n'avait répondu\r\n+qu'en doublant le pas. Ce poissonnier faisait partie, une demi-heure\r\n+auparavant, du groupe qui entourait Jacquin Labarre, et lui-même avait\r\n+raconté sa désagréable rencontre du matin aux gens de _la\r\n+Croix-de-Colbas_. Il fit de sa place au cabaretier un signe\r\n+imperceptible. Le cabaretier vint à lui. Ils échangèrent quelques\r\n+paroles à voix basse. L'homme était retombé dans ses réflexions.\r\n+\r\n+Le cabaretier revint à la cheminée, posa brusquement sa main sur\r\n+l'épaule de l'homme, et lui dit:\r\n+\r\n+--Tu vas t'en aller d'ici.\r\n+\r\n+L'étranger se retourna et répondit avec douceur.\r\n+\r\n+--Ah! vous savez?\r\n+\r\n+--Oui.\r\n+\r\n+--On m'a renvoyé de l'autre auberge.\r\n+\r\n+--Et l'on te chasse de celle-ci.\r\n+\r\n+--Où voulez-vous que j'aille?\r\n+\r\n+--Ailleurs.\r\n+\r\n+L'homme prit son bâton et son sac, et s'en alla.\r\n+\r\n+Comme il sortait, quelques enfants, qui l'avaient suivi depuis _la\r\n+Croix-de-Colbas_ et qui semblaient l'attendre, lui jetèrent des pierres.\r\n+Il revint sur ses pas avec colère et les menaça de son bâton; les\r\n+enfants se dispersèrent comme une volée d'oiseaux.\r\n+\r\n+Il passa devant la prison. À la porte pendait une chaîne de fer attachée\r\n+à une cloche. Il sonna.\r\n+\r\n+Un guichet s'ouvrit.\r\n+\r\n+--Monsieur le guichetier, dit-il en ôtant respectueusement sa casquette,\r\n+voudriez-vous bien m'ouvrir et me loger pour cette nuit?\r\n+\r\n+Une voix répondit:\r\n+\r\n+--Une prison n'est pas une auberge. Faites-vous arrêter. On vous\r\n+ouvrira.\r\n+\r\n+Le guichet se referma.\r\n+\r\n+Il entra dans une petite rue où il y a beaucoup de jardins. Quelques-uns\r\n+ne sont enclos que de haies, ce qui égaye la rue. Parmi ces jardins et\r\n+ces haies, il vit une petite maison d'un seul étage dont la fenêtre\r\n+était éclairée. Il regarda par cette vitre comme il avait fait pour le\r\n+cabaret. C'était une grande chambre blanchie à la chaux, avec un lit\r\n+drapé d'indienne imprimée, et un berceau dans un coin, quelques chaises\r\n+de bois et un fusil à deux coups accroché au mur. Une table était servie\r\n+au milieu de la chambre. Une lampe de cuivre éclairait la nappe de\r\n+grosse toile blanche, le broc d'étain luisant comme l'argent et plein de\r\n+vin et la soupière brune qui fumait. À cette table était assis un homme\r\n+d'une quarantaine d'années, à la figure joyeuse et ouverte, qui faisait\r\n+sauter un petit enfant sur ses genoux. Près de lui, une femme toute\r\n+jeune allaitait un autre enfant. Le père riait, l'enfant riait, la mère\r\n+souriait.\r\n+\r\n+L'étranger resta un moment rêveur devant ce spectacle doux et calmant.\r\n+Que se passait-il en lui? Lui seul eût pu le dire. Il est probable qu'il\r\n+pensa que cette maison joyeuse serait hospitalière, et que là où il\r\n+voyait tant de bonheur il trouverait peut-être un peu de pitié.\r\n+\r\n+Il frappa au carreau un petit coup très faible.\r\n+\r\n+On n'entendit pas.\r\n+\r\n+Il frappa un second coup.\r\n+\r\n+Il entendit la femme qui disait:\r\n+\r\n+--Mon homme, il me semble qu'on frappe.\r\n+\r\n+--Non, répondit le mari.\r\n+\r\n+Il frappa un troisième coup.\r\n+\r\n+Le mari se leva, prit la lampe, et alla à la porte qu'il ouvrit.\r\n+\r\n+C'était un homme de haute taille, demi-paysan, demi-artisan. Il portait\r\n+un vaste tablier de cuir qui montait jusqu'à son épaule gauche, et dans\r\n+lequel faisaient ventre un marteau, un mouchoir rouge, une poire à \r\n+poudre, toutes sortes d'objets que la ceinture retenait comme dans une\r\n+poche. Il renversait la tête en arrière; sa chemise largement ouverte et\r\n+rabattue montrait son cou de taureau, blanc et nu. Il avait d'épais\r\n+sourcils, d'énormes favoris noirs, les yeux à fleur de tête, le bas du\r\n+visage en museau, et sur tout cela cet air d'être chez soi qui est une\r\n+chose inexprimable.\r\n+\r\n+--Monsieur, dit le voyageur, pardon. En payant, pourriez-vous me donner\r\n+une assiettée de soupe et un coin pour dormir dans ce hangar qui est là \r\n+dans ce jardin? Dites, pourriez-vous? En payant?\r\n+\r\n+--Qui êtes-vous? demanda le maître du logis.\r\n+\r\n+L'homme répondit:\r\n+\r\n+--J'arrive de Puy-Moisson. J'ai marché toute la journée. J'ai fait douze\r\n+lieues. Pourriez-vous? En payant?\r\n+\r\n+--Je ne refuserais pas, dit le paysan, de loger quelqu'un de bien qui\r\n+payerait. Mais pourquoi n'allez-vous pas à l'auberge.\r\n+\r\n+--Il n'y a pas de place.\r\n+\r\n+--Bah! pas possible. Ce n'est pas jour de foire ni de marché. Êtes-vous\r\n+allé chez Labarre?\r\n+\r\n+--Oui.\r\n+\r\n+--Eh bien?\r\n+\r\n+Le voyageur répondit avec embarras:\r\n+\r\n+--Je ne sais pas, il ne m'a pas reçu.\r\n+\r\n+--Êtes-vous allé chez chose, de la rue de Chaffaut?\r\n+\r\n+L'embarras de l'étranger croissait. Il balbutia:\r\n+\r\n+--Il ne m'a pas reçu non plus.\r\n+\r\n+Le visage du paysan prit une expression de défiance, il regarda le\r\n+nouveau venu de la tête aux pieds, et tout à coup il s'écria avec une\r\n+sorte de frémissement:\r\n+\r\n+--Est-ce que vous seriez l'homme?...\r\n+\r\n+Il jeta un nouveau coup d'oeil sur l'étranger, fit trois pas en arrière,\r\n+posa la lampe sur la table et décrocha son fusil du mur.\r\n+\r\n+Cependant aux paroles du paysan: _Est-ce que vous seriez l'homme?..._ la\r\n+femme s'était levée, avait pris ses deux enfants dans ses bras et\r\n+s'était réfugiée précipitamment derrière son mari, regardant l'étranger\r\n+avec épouvante, la gorge nue, les yeux effarés, en murmurant tout bas:_\r\n+Tso-maraude_.\r\n+\r\n+Tout cela se fit en moins de temps qu'il ne faut pour se le figurer.\r\n+Après avoir examiné quelques instants l'homme comme on examine une\r\n+vipère, le maître du logis revint à la porte et dit:\r\n+\r\n+--Va-t'en.\r\n+\r\n+--Par grâce, reprit l'homme, un verre d'eau.\r\n+\r\n+--Un coup de fusil! dit le paysan.\r\n+\r\n+Puis il referma la porte violemment, et l'homme l'entendit tirer deux\r\n+gros verrous. Un moment après, la fenêtre se ferma au volet, et un bruit\r\n+de barre de fer qu'on posait parvint au dehors.\r\n+\r\n+La nuit continuait de tomber. Le vent froid des Alpes soufflait. À la\r\n+lueur du jour expirant, l'étranger aperçut dans un des jardins qui\r\n+bordent la rue une sorte de hutte qui lui parut maçonnée en mottes de\r\n+gazon. Il franchit résolument une barrière de bois et se trouva dans le\r\n+jardin. Il s'approcha de la hutte; elle avait pour porte une étroite\r\n+ouverture très basse et elle ressemblait à ces constructions que les\r\n+cantonniers se bâtissent au bord des routes. Il pensa sans doute que\r\n+c'était en effet le logis d'un cantonnier; il souffrait du froid et de\r\n+la faim; il s'était résigné à la faim, mais c'était du moins là un abri\r\n+contre le froid. Ces sortes de logis ne sont habituellement pas occupés\r\n+la nuit. Il se coucha à plat ventre et se glissa dans la hutte. Il y\r\n+faisait chaud, et il y trouva un assez bon lit de paille. Il resta un\r\n+moment étendu sur ce lit, sans pouvoir faire un mouvement tant il était\r\n+fatigué. Puis, comme son sac sur son dos le gênait et que c'était\r\n+d'ailleurs un oreiller tout trouvé, il se mit à déboucler une des\r\n+courroies. En ce moment un grondement farouche se fit entendre. Il leva\r\n+les yeux. La tête d'un dogue énorme se dessinait dans l'ombre à \r\n+l'ouverture de la hutte.\r\n+\r\n+C'était la niche d'un chien.\r\n+\r\n+Il était lui-même vigoureux et redoutable; il s'arma de son bâton, il se\r\n+fit de son sac un bouclier, et sortit de la niche comme il put, non sans\r\n+élargir les déchirures de ses haillons.\r\n+\r\n+Il sortit également du jardin, mais à reculons, obligé, pour tenir le\r\n+dogue en respect, d'avoir recours à cette manoeuvre du bâton que les\r\n+maîtres en ce genre d'escrime appellent _la rose couverte_.\r\n+\r\n+Quand il eut, non sans peine, repassé la barrière et qu'il se retrouva\r\n+dans la rue, seul, sans gîte, sans toit, sans abri, chassé même de ce\r\n+lit de paille et de cette niche misérable, il se laissa tomber plutôt\r\n+qu'il ne s'assit sur une pierre, et il paraît qu'un passant qui\r\n+traversait l'entendit s'écrier:\r\n+\r\n+--Je ne suis pas même un chien!\r\n+\r\n+Bientôt il se releva et se remit à marcher. Il sortit de la ville,\r\n+espérant trouver quelque arbre ou quelque meule dans les champs, et s'y\r\n+abriter.\r\n+\r\n+Il chemina ainsi quelque temps, la tête toujours baissée. Quand il se\r\n+sentit loin de toute habitation humaine, il leva les yeux et chercha\r\n+autour de lui. Il était dans un champ; il avait devant lui une de ces\r\n+collines basses couvertes de chaume coupé ras, qui après la moisson\r\n+ressemblent à des têtes tondues.\r\n+\r\n+L'horizon était tout noir; ce n'était pas seulement le sombre de la\r\n+nuit; c'étaient des nuages très bas qui semblaient s'appuyer sur la\r\n+colline même et qui montaient, emplissant tout le ciel. Cependant, comme\r\n+la lune allait se lever et qu'il flottait encore au zénith un reste de\r\n+clarté crépusculaire, ces nuages formaient au haut du ciel une sorte de\r\n+voûte blanchâtre d'où tombait sur la terre une lueur.\r\n+\r\n+La terre était donc plus éclairée que le ciel, ce qui est un effet\r\n+particulièrement sinistre, et la colline, d'un pauvre et chétif contour,\r\n+se dessinait vague et blafarde sur l'horizon ténébreux. Tout cet\r\n+ensemble était hideux, petit, lugubre et borné. Rien dans le champ ni\r\n+sur la colline qu'un arbre difforme qui se tordait en frissonnant à \r\n+quelques pas du voyageur.\r\n+\r\n+Cet homme était évidemment très loin d'avoir de ces délicates habitudes\r\n+d'intelligence et d'esprit qui font qu'on est sensible aux aspects\r\n+mystérieux des choses; cependant il y avait dans ce ciel, dans cette\r\n+colline, dans cette plaine et dans cet arbre, quelque chose de si\r\n+profondément désolé qu'après un moment d'immobilité et de rêverie, il\r\n+rebroussa chemin brusquement. Il y a des instants où la nature semble\r\n+hostile.\r\n+\r\n+Il revint sur ses pas. Les portes de Digne étaient fermées. Digne, qui a\r\n+soutenu des sièges dans les guerres de religion, était encore entourée\r\n+en 1815 de vieilles murailles flanquées de tours carrées qu'on a\r\n+démolies depuis. Il passa par une brèche et rentra dans la ville.\r\n+\r\n+Il pouvait être huit heures du soir. Comme il ne connaissait pas les\r\n+rues, il recommença sa promenade à l'aventure.\r\n+\r\n+Il parvint ainsi à la préfecture, puis au séminaire. En passant sur la\r\n+place de la cathédrale, il montra le poing à l'église.\r\n+\r\n+Il y a au coin de cette place une imprimerie. C'est là que furent\r\n+imprimées pour la première fois les proclamations de l'empereur et de la\r\n+garde impériale à l'armée, apportées de l'île d'Elbe et dictées par\r\n+Napoléon lui-même.\r\n+\r\n+Épuisé de fatigue et n'espérant plus rien, il se coucha sur le banc de\r\n+pierre qui est à la porte de cette imprimerie.\r\n+\r\n+Une vieille femme sortait de l'église en ce moment. Elle vit cet homme\r\n+étendu dans l'ombre.\r\n+\r\n+--Que faites-vous là , mon ami? dit-elle.\r\n+\r\n+Il répondit durement et avec colère:\r\n+\r\n+--Vous le voyez, bonne femme, je me couche.\r\n+\r\n+La bonne femme, bien digne de ce nom en effet, était madame la marquise\r\n+de R.\r\n+\r\n+--Sur ce banc? reprit-elle.\r\n+\r\n+--J'ai eu pendant dix-neuf ans un matelas de bois, dit l'homme, j'ai\r\n+aujourd'hui un matelas de pierre.\r\n+\r\n+--Vous avez été soldat?\r\n+\r\n+--Oui, bonne femme. Soldat.\r\n+\r\n+--Pourquoi n'allez-vous pas à l'auberge?\r\n+\r\n+--Parce que je n'ai pas d'argent.\r\n+\r\n+--Hélas, dit madame de R., je n'ai dans ma bourse que quatre sous.\r\n+\r\n+--Donnez toujours.\r\n+\r\n+L'homme prit les quatre sous. Madame de R. continua:\r\n+\r\n+--Vous ne pouvez vous loger avec si peu dans une auberge. Avez-vous\r\n+essayé pourtant? Il est impossible que vous passiez ainsi la nuit. Vous\r\n+avez sans doute froid et faim. On aurait pu vous loger par charité.\r\n+\r\n+--J'ai frappé à toutes les portes.\r\n+\r\n+--Eh bien?\r\n+\r\n+--Partout on m'a chassé.\r\n+\r\n+La «bonne femme» toucha le bras de l'homme et lui montra de l'autre côté\r\n+de la place une petite maison basse à côté de l'évêché.\r\n+\r\n+--Vous avez, reprit-elle, frappé à toutes les portes?\r\n+\r\n+--Oui.\r\n+\r\n+--Avez-vous frappé à celle-là ?\r\n+\r\n+--Non.\r\n+\r\n+--Frappez-y.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre II\r\n+\r\n+La prudence conseillée à la sagesse\r\n+\r\n+\r\n+Ce soir-là , M. l'évêque de Digne, après sa promenade en ville, était\r\n+resté assez tard enfermé dans sa chambre. Il s'occupait d'un grand\r\n+travail sur les _Devoirs_, lequel est malheureusement demeuré inachevé.\r\n+Il dépouillait soigneusement tout ce que les Pères et les Docteurs ont\r\n+dit sur cette grave matière. Son livre était divisé en deux parties;\r\n+premièrement les devoirs de tous, deuxièmement les devoirs de chacun,\r\n+selon la classe à laquelle il appartient. Les devoirs de tous sont les\r\n+grands devoirs. Il y en a quatre. Saint Matthieu les indique: devoirs\r\n+envers Dieu (Matth., VI), devoirs envers soi-même (Matth., V, 29, 30),\r\n+devoirs envers le prochain (Matth., VII, 12), devoirs envers les\r\n+créatures (Matth., VI, 20, 25). Pour les autres devoirs, l'évêque les\r\n+avait trouvés indiqués et prescrits ailleurs; aux souverains et aux\r\n+sujets, dans l'Épître aux Romains; aux magistrats, aux épouses, aux\r\n+mères et aux jeunes hommes, par saint Pierre; aux maris, aux pères, aux\r\n+enfants et aux serviteurs, dans l'Épître aux Éphésiens; aux fidèles,\r\n+dans l'Épître aux Hébreux; aux vierges, dans l'Épître aux Corinthiens.\r\n+Il faisait laborieusement de toutes ces prescriptions un ensemble\r\n+harmonieux qu'il voulait présenter aux âmes.\r\n+\r\n+Il travaillait encore à huit heures, écrivant assez incommodément sur de\r\n+petits carrés de papier avec un gros livre ouvert sur ses genoux, quand\r\n+madame Magloire entra, selon son habitude, pour prendre l'argenterie\r\n+dans le placard près du lit. Un moment après, l'évêque, sentant que le\r\n+couvert était mis et que sa soeur l'attendait peut-être, ferma son\r\n+livre, se leva de sa table et entra dans la salle à manger.\r\n+\r\n+La salle à manger était une pièce oblongue à cheminée, avec porte sur la\r\n+rue (nous l'avons dit), et fenêtre sur le jardin.\r\n+\r\n+Madame Magloire achevait en effet de mettre le couvert.\r\n+\r\n+Tout en vaquant au service, elle causait avec mademoiselle Baptistine.\r\n+\r\n+Une lampe était sur la table; la table était près de la cheminée. Un\r\n+assez bon feu était allumé.\r\n+\r\n+On peut se figurer facilement ces deux femmes qui avaient toutes deux\r\n+passé soixante ans: madame Magloire petite, grasse, vive; mademoiselle\r\n+Baptistine, douce, mince, frêle, un peu plus grande que son frère, vêtue\r\n+d'une robe de soie puce, couleur à la mode en 1806, qu'elle avait\r\n+achetée alors à Paris et qui lui durait encore. Pour emprunter des\r\n+locutions vulgaires qui ont le mérite de dire avec un seul mot une idée\r\n+qu'une page suffirait à peine à exprimer, madame Magloire avait l'air\r\n+d'une _paysanne_ et mademoiselle Baptistine d'une _dame_. Madame\r\n+Magloire avait un bonnet blanc à tuyaux, au cou une jeannette d'or, le\r\n+seul bijou de femme qu'il y eût dans la maison, un fichu très blanc\r\n+sortant de la robe de bure noire à manches larges et courtes, un tablier\r\n+de toile de coton à carreaux rouges et verts, noué à la ceinture d'un\r\n+ruban vert, avec pièce d'estomac pareille rattachée par deux épingles\r\n+aux deux coins d'en haut, aux pieds de gros souliers et des bas jaunes\r\n+comme les femmes de Marseille. La robe de mademoiselle Baptistine était\r\n+coupée sur les patrons de 1806, taille courte, fourreau étroit, manches\r\n+à épaulettes, avec pattes et boutons. Elle cachait ses cheveux gris sous\r\n+une perruque frisée dite à _l'enfant_. Madame Magloire avait l'air\r\n+intelligent, vif et bon; les deux angles de sa bouche inégalement\r\n+relevés et la lèvre supérieure plus grosse que la lèvre inférieure lui\r\n+donnaient quelque chose de bourru et d'impérieux. Tant que monseigneur\r\n+se taisait, elle lui parlait résolument avec un mélange de respect et de\r\n+liberté; mais dès que monseigneur parlait, on a vu cela, elle obéissait\r\n+passivement comme mademoiselle. Mademoiselle Baptistine ne parlait même\r\n+pas. Elle se bornait à obéir et à complaire. Même quand elle était\r\n+jeune, elle n'était pas jolie, elle avait de gros yeux bleus à fleur de\r\n+tête et le nez long et busqué; mais tout son visage, toute sa personne,\r\n+nous l'avons dit en commençant, respiraient une ineffable bonté. Elle\r\n+avait toujours été prédestinée à la mansuétude; mais la foi, la charité,\r\n+l'espérance, ces trois vertus qui chauffent doucement l'âme, avaient\r\n+élevé peu à peu cette mansuétude jusqu'à la sainteté. La nature n'en\r\n+avait fait qu'une brebis, la religion en avait fait un ange. Pauvre\r\n+sainte fille! doux souvenir disparu! Mademoiselle Baptistine a depuis\r\n+raconté tant de fois ce qui s'était passé à l'évêché cette soirée-là ,\r\n+que plusieurs personnes qui vivent encore s'en rappellent les moindres\r\n+détails.\r\n+\r\n+Au moment où M. l'évêque entra, madame Magloire parlait avec quelque\r\n+vivacité. Elle entretenait _mademoiselle_ d'un sujet qui lui était\r\n+familier et auquel l'évêque était accoutumé. Il s'agissait du loquet de\r\n+la porte d'entrée.\r\n+\r\n+Il paraît que, tout en allant faire quelques provisions pour le souper,\r\n+madame Magloire avait entendu dire des choses en divers lieux. On\r\n+parlait d'un rôdeur de mauvaise mine; qu'un vagabond suspect serait\r\n+arrivé, qu'il devait être quelque part dans la ville, et qu'il se\r\n+pourrait qu'il y eût de méchantes rencontres pour ceux qui s'aviseraient\r\n+de rentrer tard chez eux cette nuit-là . Que la police était bien mal\r\n+faite du reste, attendu que M. le préfet et M. le maire ne s'aimaient\r\n+pas, et cherchaient à se nuire en faisant arriver des événements. Que\r\n+c'était donc aux gens sages à faire la police eux-mêmes et à se bien\r\n+garder, et qu'il faudrait avoir soin de dûment clore, verrouiller et\r\n+barricader sa maison, _et de bien fermer ses portes_.\r\n+\r\n+Madame Magloire appuya sur ce dernier mot; mais l'évêque venait de sa\r\n+chambre où il avait eu assez froid, il s'était assis devant la cheminée\r\n+et se chauffait, et puis il pensait à autre chose. Il ne releva pas le\r\n+mot à effet que madame Magloire venait de laisser tomber. Elle le\r\n+répéta. Alors, mademoiselle Baptistine, voulant satisfaire madame\r\n+Magloire sans déplaire à son frère, se hasarda à dire timidement:\r\n+\r\n+--Mon frère, entendez-vous ce que dit madame Magloire?\r\n+\r\n+--J'en ai entendu vaguement quelque chose, répondit l'évêque.\r\n+\r\n+Puis tournant à demi sa chaise, mettant ses deux mains sur ses genoux,\r\n+et levant vers la vieille servante son visage cordial et facilement\r\n+joyeux, que le feu éclairait d'en bas:\r\n+\r\n+--Voyons. Qu'y a-t-il? qu'y a-t-il? Nous sommes donc dans quelque gros\r\n+danger?\r\n+\r\n+Alors madame Magloire recommença toute l'histoire, en l'exagérant\r\n+quelque peu, sans s'en douter. Il paraîtrait qu'un bohémien, un\r\n+va-nu-pieds, une espèce de mendiant dangereux serait en ce moment dans\r\n+la ville. Il s'était présenté pour loger chez Jacquin Labarre qui\r\n+n'avait pas voulu le recevoir. On l'avait vu arriver par le boulevard\r\n+Gassendi et rôder dans les rues à la brume. Un homme de sac et de corde\r\n+avec une figure terrible.\r\n+\r\n+--Vraiment? dit l'évêque.\r\n+\r\n+Ce consentement à l'interroger encouragea madame Magloire; cela lui\r\n+semblait indiquer que l'évêque n'était pas loin de s'alarmer; elle\r\n+poursuivit triomphante:\r\n+\r\n+--Oui, monseigneur. C'est comme cela. Il y aura quelque malheur cette\r\n+nuit dans la ville. Tout le monde le dit. Avec cela que la police est si\r\n+mal faite (répétition inutile). Vivre dans un pays de montagnes, et\r\n+n'avoir pas même de lanternes la nuit dans les rues! On sort. Des fours,\r\n+quoi! Et je dis, monseigneur, et mademoiselle que voilà dit comme moi....\r\n+\r\n+--Moi, interrompit la soeur, je ne dis rien. Ce que mon frère fait est\r\n+bien fait.\r\n+\r\n+Madame Magloire continua comme s'il n'y avait pas eu de protestation:\r\n+\r\n+--Nous disons que cette maison-ci n'est pas sûre du tout; que, si\r\n+monseigneur le permet, je vais aller dire à Paulin Musebois, le\r\n+serrurier, qu'il vienne remettre les anciens verrous de la porte; on les\r\n+a là , c'est une minute; et je dis qu'il faut des verrous, monseigneur,\r\n+ne serait-ce que pour cette nuit; car je dis qu'une porte qui s'ouvre du\r\n+dehors avec un loquet, par le premier passant venu, rien n'est plus\r\n+terrible; avec cela que monseigneur a l'habitude de toujours dire\r\n+d'entrer, et que d'ailleurs, même au milieu de la nuit, ô mon Dieu! on\r\n+n'a pas besoin d'en demander la permission....\r\n+\r\n+En ce moment, on frappa à la porte un coup assez violent.\r\n+\r\n+--Entrez, dit l'évêque.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre III\r\n+\r\n+Héroïsme de l'obéissance passive\r\n+\r\n+\r\n+La porte s'ouvrit.\r\n+\r\n+Elle s'ouvrit vivement, toute grande, comme si quelqu'un la poussait\r\n+avec énergie et résolution.\r\n+\r\n+Un homme entra.\r\n+\r\n+Cet homme, nous le connaissons déjà . C'est le voyageur que nous avons vu\r\n+tout à l'heure errer cherchant un gîte.\r\n+\r\n+Il entra, fit un pas, et s'arrêta, laissant la porte ouverte derrière\r\n+lui. Il avait son sac sur l'épaule, son bâton à la main, une expression\r\n+rude, hardie, fatiguée et violente dans les yeux. Le feu de la cheminée\r\n+l'éclairait. Il était hideux. C'était une sinistre apparition.\r\n+\r\n+Madame Magloire n'eut pas même la force de jeter un cri. Elle\r\n+tressaillit, et resta béante.\r\n+\r\n+Mademoiselle Baptistine se retourna, aperçut l'homme qui entrait et se\r\n+dressa à demi d'effarement, puis, ramenant peu à peu sa tête vers la\r\n+cheminée, elle se mit à regarder son frère et son visage redevint\r\n+profondément calme et serein.\r\n+\r\n+L'évêque fixait sur l'homme un oeil tranquille.\r\n+\r\n+Comme il ouvrait la bouche, sans doute pour demander au nouveau venu ce\r\n+qu'il désirait, l'homme appuya ses deux mains à la fois sur son bâton,\r\n+promena ses yeux tour à tour sur le vieillard et les femmes, et, sans\r\n+attendre que l'évêque parlât, dit d'une voix haute:\r\n+\r\n+--Voici. Je m'appelle Jean Valjean. Je suis un galérien. J'ai passé\r\n+dix-neuf ans au bagne. Je suis libéré depuis quatre jours et en route\r\n+pour Pontarlier qui est ma destination. Quatre jours et que je marche\r\n+depuis Toulon. Aujourd'hui, j'ai fait douze lieues à pied. Ce soir, en\r\n+arrivant dans ce pays, j'ai été dans une auberge, on m'a renvoyé à cause\r\n+de mon passeport jaune que j'avais montré à la mairie. Il avait fallu.\r\n+J'ai été à une autre auberge. On m'a dit: Va-t-en! Chez l'un, chez\r\n+l'autre. Personne n'a voulu de moi. J'ai été à la prison, le guichetier\r\n+n'a pas ouvert. J'ai été dans la niche d'un chien. Ce chien m'a mordu et\r\n+m'a chassé, comme s'il avait été un homme. On aurait dit qu'il savait\r\n+qui j'étais. Je m'en suis allé dans les champs pour coucher à la belle\r\n+étoile. Il n'y avait pas d'étoile. J'ai pensé qu'il pleuvrait, et qu'il\r\n+n'y avait pas de bon Dieu pour empêcher de pleuvoir, et je suis rentré\r\n+dans la ville pour y trouver le renfoncement d'une porte. Là , dans la\r\n+place, j'allais me coucher sur une pierre. Une bonne femme m'a montré\r\n+votre maison et m'a dit: «Frappe là ». J'ai frappé. Qu'est-ce que c'est\r\n+ici? Êtes-vous une auberge? J'ai de l'argent. Ma masse. Cent neuf francs\r\n+quinze sous que j'ai gagnés au bagne par mon travail en dix-neuf ans. Je\r\n+payerai. Qu'est-ce que cela me fait? J'ai de l'argent. Je suis très\r\n+fatigué, douze lieues à pied, j'ai bien faim. Voulez-vous que je reste?\r\n+\r\n+--Madame Magloire, dit l'évêque, vous mettrez un couvert de plus.\r\n+\r\n+L'homme fit trois pas et s'approcha de la lampe qui était sur la table.\r\n+\r\n+--Tenez, reprit-il, comme s'il n'avait pas bien compris, ce n'est pas\r\n+ça. Avez-vous entendu? Je suis un galérien. Un forçat. Je viens des\r\n+galères.\r\n+\r\n+Il tira de sa poche une grande feuille de papier jaune qu'il déplia.\r\n+\r\n+--Voilà mon passeport. Jaune, comme vous voyez. Cela sert à me faire\r\n+chasser de partout où je suis. Voulez-vous lire? Je sais lire, moi. J'ai\r\n+appris au bagne. Il y a une école pour ceux qui veulent. Tenez, voilà ce\r\n+qu'on a mis sur le passeport: «Jean Valjean, forçat libéré, natif\r\n+de...--cela vous est égal...--Est resté dix-neuf ans au bagne. Cinq ans\r\n+pour vol avec effraction. Quatorze ans pour avoir tenté de s'évader\r\n+quatre fois. Cet homme est très dangereux.»--Voilà ! Tout le monde m'a\r\n+jeté dehors. Voulez-vous me recevoir, vous? Est-ce une auberge?\r\n+Voulez-vous me donner à manger et à coucher? Avez-vous une écurie?\r\n+\r\n+--Madame Magloire, dit l'évêque, vous mettrez des draps blancs au lit de\r\n+l'alcôve.\r\n+\r\n+Nous avons déjà expliqué de quelle nature était l'obéissance des deux\r\n+femmes.\r\n+\r\n+Madame Magloire sortit pour exécuter ces ordres. L'évêque se tourna vers\r\n+l'homme.\r\n+\r\n+--Monsieur, asseyez-vous et chauffez-vous. Nous allons souper dans un\r\n+instant, et l'on fera votre lit pendant que vous souperez.\r\n+\r\n+Ici l'homme comprit tout à fait. L'expression de son visage, jusqu'alors\r\n+sombre et dure, s'empreignit de stupéfaction, de doute, de joie, et\r\n+devint extraordinaire. Il se mit à balbutier comme un homme fou:\r\n+\r\n+--Vrai? quoi? vous me gardez? vous ne me chassez pas! un forçat! Vous\r\n+m'appelez monsieur! vous ne me tutoyez pas! Va-t-en, chien! qu'on me dit\r\n+toujours. Je croyais bien que vous me chasseriez. Aussi j'avais dit tout\r\n+de suite qui je suis. Oh! la brave femme qui m'a enseigné ici! Je vais\r\n+souper! un lit! Un lit avec des matelas et des draps! comme tout le\r\n+monde! il y a dix-neuf ans que je n'ai couché dans un lit! Vous voulez\r\n+bien que je ne m'en aille pas! Vous êtes de dignes gens! D'ailleurs j'ai\r\n+de l'argent. Je payerai bien. Pardon, monsieur l'aubergiste, comment\r\n+vous appelez-vous? Je payerai tout ce qu'on voudra. Vous êtes un brave\r\n+homme. Vous êtes aubergiste, n'est-ce pas?\r\n+\r\n+--Je suis, dit l'évêque, un prêtre qui demeure ici.\r\n+\r\n+--Un prêtre! reprit l'homme. Oh! un brave homme de prêtre! Alors vous ne\r\n+me demandez pas d'argent? Le curé, n'est-ce pas? le curé de cette grande\r\n+église? Tiens! c'est vrai, que je suis bête! je n'avais pas vu votre\r\n+calotte!\r\n+\r\n+Tout en parlant, il avait déposé son sac et son bâton dans un coin, puis\r\n+remis son passeport dans sa poche, et il s'était assis. Mademoiselle\r\n+Baptistine le considérait avec douceur. Il continua:\r\n+\r\n+--Vous êtes humain, monsieur le curé. Vous n'avez pas de mépris. C'est\r\n+bien bon un bon prêtre. Alors vous n'avez pas besoin que je paye?\r\n+\r\n+--Non, dit l'évêque, gardez votre argent. Combien avez-vous? ne\r\n+m'avez-vous pas dit cent neuf francs?\r\n+\r\n+--Quinze sous, ajouta l'homme.\r\n+\r\n+--Cent neuf francs quinze sous. Et combien de temps avez-vous mis à \r\n+gagner cela?\r\n+\r\n+--Dix-neuf ans.\r\n+\r\n+--Dix-neuf ans!\r\n+\r\n+L'évêque soupira profondément.\r\n+\r\n+L'homme poursuivit:\r\n+\r\n+--J'ai encore tout mon argent. Depuis quatre jours je n'ai dépensé que\r\n+vingt-cinq sous que j'ai gagnés en aidant à décharger des voitures à \r\n+Grasse. Puisque vous êtes abbé, je vais vous dire, nous avions un\r\n+aumônier au bagne. Et puis un jour j'ai vu un évêque. Monseigneur, qu'on\r\n+appelle. C'était l'évêque de la Majore, à Marseille. C'est le curé qui\r\n+est sur les curés. Vous savez, pardon, je dis mal cela, mais pour moi,\r\n+c'est si loin!--Vous comprenez, nous autres! Il a dit la messe au milieu\r\n+du bagne, sur un autel, il avait une chose pointue, en or, sur la tête.\r\n+Au grand jour de midi, cela brillait. Nous étions en rang. Des trois\r\n+côtés. Avec les canons, mèche allumée, en face de nous. Nous ne voyions\r\n+pas bien. Il a parlé, mais il était trop au fond, nous n'entendions pas.\r\n+Voilà ce que c'est qu'un évêque.\r\n+\r\n+Pendant qu'il parlait, l'évêque était allé pousser la porte qui était\r\n+restée toute grande ouverte.\r\n+\r\n+Madame Magloire rentra. Elle apportait un couvert qu'elle mit sur la\r\n+table.\r\n+\r\n+--Madame Magloire, dit l'évêque, mettez ce couvert le plus près possible\r\n+du feu.\r\n+\r\n+Et se tournant vers son hôte:\r\n+\r\n+--Le vent de nuit est dur dans les Alpes. Vous devez avoir froid,\r\n+monsieur?\r\n+\r\n+Chaque fois qu'il disait ce mot monsieur, avec sa voix doucement grave\r\n+et de si bonne compagnie, le visage de l'homme s'illuminait. Monsieur à \r\n+un forçat, c'est un verre d'eau à un naufragé de la Méduse. L'ignominie\r\n+a soif de considération.\r\n+\r\n+--Voici, reprit l'évêque, une lampe qui éclaire bien mal.\r\n+\r\n+Madame Magloire comprit, et elle alla chercher sur la cheminée de la\r\n+chambre à coucher de monseigneur les deux chandeliers d'argent qu'elle\r\n+posa sur la table tout allumés.\r\n+\r\n+--Monsieur le curé, dit l'homme, vous êtes bon. Vous ne me méprisez pas.\r\n+Vous me recevez chez vous. Vous allumez vos cierges pour moi. Je ne vous\r\n+ai pourtant pas caché d'où je viens et que je suis un homme malheureux.\r\n+\r\n+L'évêque, assis près de lui, lui toucha doucement la main.\r\n+\r\n+--Vous pouviez ne pas me dire qui vous étiez.\r\n+\r\n+Ce n'est pas ici ma maison, c'est la maison de Jésus-Christ. Cette porte\r\n+ne demande pas à celui qui entre s'il a un nom, mais s'il a une douleur.\r\n+Vous souffrez; vous avez faim et soif; soyez le bienvenu. Et ne me\r\n+remerciez pas, ne me dites pas que je vous reçois chez moi. Personne\r\n+n'est ici chez soi, excepté celui qui a besoin d'un asile. Je vous le\r\n+dis à vous qui passez, vous êtes ici chez vous plus que moi-même. Tout\r\n+ce qui est ici est à vous. Qu'ai-je besoin de savoir votre nom?\r\n+D'ailleurs, avant que vous me le disiez, vous en avez un que je savais.\r\n+\r\n+L'homme ouvrit des yeux étonnés.\r\n+\r\n+--Vrai? vous saviez comment je m'appelle?\r\n+\r\n+--Oui, répondit l'évêque, vous vous appelez mon frère.\r\n+\r\n+--Tenez, monsieur le curé! s'écria l'homme, j'avais bien faim en entrant\r\n+ici; mais vous êtes si bon qu'à présent je ne sais plus ce que j'ai;\r\n+cela m'a passé.\r\n+\r\n+L'évêque le regarda et lui dit:\r\n+\r\n+--Vous avez bien souffert?\r\n+\r\n+--Oh! la casaque rouge, le boulet au pied, une planche pour dormir, le\r\n+chaud, le froid, le travail, la chiourme, les coups de bâton! La double\r\n+chaîne pour rien. Le cachot pour un mot. Même malade au lit, la chaîne.\r\n+Les chiens, les chiens sont plus heureux! Dix-neuf ans! J'en ai\r\n+quarante-six. À présent, le passeport jaune! Voilà .\r\n+\r\n+--Oui, reprit l'évêque, vous sortez d'un lieu de tristesse. Écoutez. Il\r\n+y aura plus de joie au ciel pour le visage en larmes d'un pécheur\r\n+repentant que pour la robe blanche de cent justes. Si vous sortez de ce\r\n+lieu douloureux avec des pensées de haine et de colère contre les\r\n+hommes, vous êtes digne de pitié; si vous en sortez avec des pensées de\r\n+bienveillance, de douceur et de paix, vous valez mieux qu'aucun de nous.\r\n+\r\n+Cependant madame Magloire avait servi le souper. Une soupe faite avec de\r\n+l'eau, de l'huile, du pain et du sel, un peu de lard, un morceau de\r\n+viande de mouton, des figues, un fromage frais, et un gros pain de\r\n+seigle. Elle avait d'elle-même ajouté à l'ordinaire de M. l'évêque une\r\n+bouteille de vieux vin de Mauves.\r\n+\r\n+Le visage de l'évêque prit tout à coup cette expression de gaîté propre\r\n+aux natures hospitalières:\r\n+\r\n+--À table! dit-il vivement.\r\n+\r\n+Comme il en avait coutume lorsque quelque étranger soupait avec lui, il\r\n+fit asseoir l'homme à sa droite. Mademoiselle Baptistine, parfaitement\r\n+paisible et naturelle, prit place à sa gauche.\r\n+\r\n+L'évêque dit le bénédicité, puis servit lui-même la soupe, selon son\r\n+habitude. L'homme se mit à manger avidement.\r\n+\r\n+Tout à coup l'évêque dit:\r\n+\r\n+--Mais il me semble qu'il manque quelque chose sur cette table.\r\n+\r\n+Madame Magloire en effet n'avait mis que les trois couverts absolument\r\n+nécessaires. Or c'était l'usage de la maison, quand l'évêque avait\r\n+quelqu'un à souper, de disposer sur la nappe les six couverts d'argent,\r\n+étalage innocent. Ce gracieux semblant de luxe était une sorte\r\n+d'enfantillage plein de charme dans cette maison douce et sévère qui\r\n+élevait la pauvreté jusqu'à la dignité.\r\n+\r\n+Madame Magloire comprit l'observation, sortit sans dire un mot, et un\r\n+moment après les trois couverts réclamés par l'évêque brillaient sur la\r\n+nappe, symétriquement arrangés devant chacun des trois convives.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IV\r\n+\r\n+Détails sur les fromageries de Pontarlier\r\n+\r\n+\r\n+Maintenant, pour donner une idée de ce qui se passa à cette table, nous\r\n+ne saurions mieux faire que de transcrire ici un passage d'une lettre de\r\n+mademoiselle Baptistine à madame de Boischevron, où la conversation du\r\n+forçat et de l'évêque est racontée avec une minutie naïve:\r\n+\r\n+ * * * * *\r\n+\r\n+«...Cet homme ne faisait aucune attention à personne. Il mangeait avec\r\n+une voracité d'affamé. Cependant, après la soupe, il a dit:\r\n+\r\n+«--Monsieur le curé du bon Dieu, tout ceci est encore bien trop bon pour\r\n+moi, mais je dois dire que les rouliers qui n'ont pas voulu me laisser\r\n+manger avec eux font meilleure chère que vous.\r\n+\r\n+«Entre nous, l'observation m'a un peu choquée. Mon frère a répondu:\r\n+\r\n+«--Ils ont plus de fatigue que moi.\r\n+\r\n+«--Non, a repris cet homme, ils ont plus d'argent. Vous êtes pauvre. Je\r\n+vois bien. Vous n'êtes peut-être pas même curé. Êtes-vous curé\r\n+seulement? Ah! par exemple, si le bon Dieu était juste, vous devriez\r\n+bien être curé.\r\n+\r\n+«--Le bon Dieu est plus que juste, a dit mon frère.\r\n+\r\n+«Un moment après il a ajouté:\r\n+\r\n+«--Monsieur Jean Valjean, c'est à Pontarlier que vous allez?\r\n+\r\n+«--Avec itinéraire obligé.\r\n+\r\n+«Je crois bien que c'est comme cela que l'homme a dit. Puis il a\r\n+continué:\r\n+\r\n+«--Il faut que je sois en route demain à la pointe du jour. Il fait dur\r\n+voyager. Si les nuits sont froides, les journées sont chaudes.\r\n+\r\n+«--Vous allez là , a repris mon frère, dans un bon pays. À la révolution,\r\n+ma famille a été ruinée, je me suis réfugié en Franche-Comté d'abord, et\r\n+j'y ai vécu quelque temps du travail de mes bras. J'avais de la bonne\r\n+volonté. J'ai trouvé à m'y occuper. On n'a qu'à choisir. Il y a des\r\n+papeteries, des tanneries, des distilleries, des huileries, des\r\n+fabriques d'horlogerie en grand, des fabriques d'acier, des fabriques de\r\n+cuivre, au moins vingt usines de fer, dont quatre à Lods, à Châtillon, à \r\n+Audincourt et à Beure qui sont très considérables....\r\n+\r\n+«Je crois ne pas me tromper et que ce sont bien là les noms que mon\r\n+frère a cités, puis il s'est interrompu et m'a adressé la parole:\r\n+\r\n+«--Chère soeur, n'avons-nous pas des parents dans ce pays-là ?\r\n+\r\n+«J'ai répondu:\r\n+\r\n+«--Nous en avions, entre autres M. de Lucenet qui était capitaine des\r\n+portes à Pontarlier dans l'ancien régime.\r\n+\r\n+«--Oui, a repris mon frère, mais en 93 on n'avait plus de parents, on\r\n+n'avait que ses bras. J'ai travaillé. Ils ont dans le pays de\r\n+Pontarlier, où vous allez, monsieur Valjean, une industrie toute\r\n+patriarcale et toute charmante, ma soeur. Ce sont leurs fromageries\r\n+qu'ils appellent fruitières.\r\n+\r\n+«Alors mon frère, tout en faisant manger cet homme, lui a expliqué très\r\n+en détail ce que c'étaient que les fruitières de Pontarlier;--qu'on en\r\n+distinguait deux sortes:--les _grosses granges_, qui sont aux riches, et\r\n+où il y a quarante ou cinquante vaches, lesquelles produisent sept à \r\n+huit milliers de fromages par été; les _fruitières d'association_, qui\r\n+sont aux pauvres; ce sont les paysans de la moyenne montagne qui mettent\r\n+leurs vaches en commun et partagent les produits.--Ils prennent à leurs\r\n+gages un fromager qu'ils appellent le grurin;--le grurin reçoit le lait\r\n+des associés trois fois par jour et marque les quantités sur une taille\r\n+double;--c'est vers la fin d'avril que le travail des fromageries\r\n+commence; c'est vers la mi-juin que les fromagers conduisent leurs\r\n+vaches dans la montagne.\r\n+\r\n+«L'homme se ranimait tout en mangeant. Mon frère lui faisait boire de ce\r\n+bon vin de Mauves dont il ne boit pas lui-même parce qu'il dit que c'est\r\n+du vin cher. Mon frère lui disait tous ces détails avec cette gaîté\r\n+aisée que vous lui connaissez, entremêlant ses paroles de façons\r\n+gracieuses pour moi. Il est beaucoup revenu sur ce bon état de grurin,\r\n+comme s'il eût souhaité que cet homme comprît, sans le lui conseiller\r\n+directement et durement, que ce serait un asile pour lui. Une chose m'a\r\n+frappée. Cet homme était ce que je vous ai dit. Eh bien! mon frère,\r\n+pendant tout le souper, ni de toute la soirée, à l'exception de quelques\r\n+paroles sur Jésus quand il est entré, n'a pas dit un mot qui pût\r\n+rappeler à cet homme qui il était ni apprendre à cet homme qui était mon\r\n+frère. C'était bien une occasion en apparence de faire un peu de sermon\r\n+et d'appuyer l'évêque sur le galérien pour laisser la marque du passage.\r\n+Il eût paru peut-être à un autre que c'était le cas, ayant ce malheureux\r\n+sous la main, de lui nourrir l'âme en même temps que le corps et de lui\r\n+faire quelque reproche assaisonné de morale et de conseil, ou bien un\r\n+peu de commisération avec exhortation de se mieux conduire à l'avenir.\r\n+Mon frère ne lui a même pas demandé de quel pays il était, ni son\r\n+histoire. Car dans son histoire il y a sa faute, et mon frère semblait\r\n+éviter tout ce qui pouvait l'en faire souvenir. C'est au point qu'à un\r\n+certain moment, comme mon frère parlait des montagnards de Pontarlier,\r\n+qui ont _un doux travail près du ciel et qui_, ajoutait-il, _sont\r\n+heureux parce qu'ils sont innocents_, il s'est arrêté court, craignant\r\n+qu'il n'y eût dans ce mot qui lui échappait quelque chose qui pût\r\n+froisser l'homme. À force d'y réfléchir, je crois avoir compris ce qui\r\n+se passait dans le coeur de mon frère. Il pensait sans doute que cet\r\n+homme, qui s'appelle Jean Valjean, n'avait que trop sa misère présente à \r\n+l'esprit, que le mieux était de l'en distraire, et de lui faire croire,\r\n+ne fût-ce qu'un moment, qu'il était une personne comme une autre, en\r\n+étant pour lui tout ordinaire. N'est-ce pas là en effet bien entendre la\r\n+charité? N'y a-t-il pas, bonne madame, quelque chose de vraiment\r\n+évangélique dans cette délicatesse qui s'abstient de sermon, de morale\r\n+et d'allusion, et la meilleure pitié, quand un homme a un point\r\n+douloureux, n'est-ce pas de n'y point toucher du tout? Il m'a semblé que\r\n+ce pouvait être là la pensée intérieure de mon frère. Dans tous les cas,\r\n+ce que je puis dire, c'est que, s'il a eu toutes ces idées, il n'en a\r\n+rien marqué, même pour moi; il a été d'un bout à l'autre le même homme\r\n+que tous les soirs, et il a soupé avec ce Jean Valjean du même air et de\r\n+la même façon qu'il aurait soupé avec M. Gédéon Le Prévost ou avec M. le\r\n+curé de la paroisse.\r\n+\r\n+«Vers la fin, comme nous étions aux figues, on a cogné à la porte.\r\n+C'était la mère Gerbaud avec son petit dans ses bras. Mon frère a baisé\r\n+l'enfant au front, et m'a emprunté quinze sous que j'avais sur moi pour\r\n+les donner à la mère Gerbaud. L'homme pendant ce temps-là ne faisait pas\r\n+grande attention. Il ne parlait plus et paraissait très fatigué. La\r\n+pauvre vieille Gerbaud partie, mon frère a dit les grâces, puis il s'est\r\n+tourné vers cet homme, et il lui a dit: Vous devez avoir bien besoin de\r\n+votre lit. Madame Magloire a enlevé le couvert bien vite. J'ai compris\r\n+qu'il fallait nous retirer pour laisser dormir ce voyageur, et nous\r\n+sommes montées toutes les deux. J'ai cependant envoyé madame Magloire un\r\n+instant après porter sur le lit de cet homme une peau de chevreuil de la\r\n+Forêt-Noire qui est dans ma chambre. Les nuits sont glaciales, et cela\r\n+tient chaud. C'est dommage que cette peau soit vieille; tout le poil\r\n+s'en va. Mon frère l'a achetée du temps qu'il était en Allemagne, à \r\n+Tottlingen, près des sources du Danube, ainsi que le petit couteau à \r\n+manche d'ivoire dont je me sers à table.\r\n+\r\n+«Madame Magloire est remontée presque tout de suite, nous nous sommes\r\n+mises à prier Dieu dans le salon où l'on étend le linge, et puis nous\r\n+sommes rentrées chacune dans notre chambre sans nous rien dire.»\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre V\r\n+\r\n+Tranquillité\r\n+\r\n+\r\n+Après avoir donné le bonsoir à sa soeur, monseigneur Bienvenu prit sur\r\n+la table un des deux flambeaux d'argent, remit l'autre à son hôte, et\r\n+lui dit:\r\n+\r\n+--Monsieur, je vais vous conduire à votre chambre.\r\n+\r\n+L'homme le suivit.\r\n+\r\n+Comme on a pu le remarquer dans ce qui a été dit plus haut, le logis\r\n+était distribué de telle sorte que, pour passer dans l'oratoire où était\r\n+l'alcôve ou pour en sortir, il fallait traverser la chambre à coucher de\r\n+l'évêque.\r\n+\r\n+Au moment où ils traversaient cette chambre, madame Magloire serrait\r\n+l'argenterie dans le placard qui était au chevet du lit. C'était le\r\n+dernier soin qu'elle prenait chaque soir avant de s'aller coucher.\r\n+\r\n+L'évêque installa son hôte dans l'alcôve. Un lit blanc et frais y était\r\n+dressé. L'homme posa le flambeau sur une petite table.\r\n+\r\n+--Allons, dit l'évêque, faites une bonne nuit. Demain matin, avant de\r\n+partir, vous boirez une tasse de lait de nos vaches tout chaud.\r\n+\r\n+--Merci, monsieur l'abbé, dit l'homme.\r\n+\r\n+À peine eut-il prononcé ces paroles pleines de paix que, tout à coup et\r\n+sans transition, il eut un mouvement étrange et qui eût glacé\r\n+d'épouvante les deux saintes filles si elles en eussent été témoins.\r\n+Aujourd'hui même il nous est difficile de nous rendre compte de ce qui\r\n+le poussait en ce moment. Voulait-il donner un avertissement ou jeter\r\n+une menace? Obéissait-il simplement à une sorte d'impulsion instinctive\r\n+et obscure pour lui-même? Il se tourna brusquement vers le vieillard,\r\n+croisa les bras, et, fixant sur son hôte un regard sauvage, il s'écria\r\n+d'une voix rauque:\r\n+\r\n+--Ah çà ! décidément! vous me logez chez vous près de vous comme cela!\r\n+\r\n+Il s'interrompit et ajouta avec un rire où il y avait quelque chose de\r\n+monstrueux:\r\n+\r\n+--Avez-vous bien fait toutes vos réflexions? Qui est-ce qui vous dit que\r\n+je n'ai pas assassiné?\r\n+\r\n+L'évêque leva les yeux vers le plafond et répondit:\r\n+\r\n+--Cela regarde le bon Dieu.\r\n+\r\n+Puis, gravement et remuant les lèvres comme quelqu'un qui prie ou qui se\r\n+parle à lui-même, il dressa les deux doigts de sa main droite et bénit\r\n+l'homme qui ne se courba pas, et, sans tourner la tête et sans regarder\r\n+derrière lui, il rentra dans sa chambre.\r\n+\r\n+Quand l'alcôve était habitée, un grand rideau de serge tiré de part en\r\n+part dans l'oratoire cachait l'autel. L'évêque s'agenouilla en passant\r\n+devant ce rideau et fit une courte prière.\r\n+\r\n+Un moment après, il était dans son jardin, marchant, rêvant,\r\n+contemplant, l'âme et la pensée tout entières à ces grandes choses\r\n+mystérieuses que Dieu montre la nuit aux yeux qui restent ouverts.\r\n+\r\n+Quant à l'homme, il était vraiment si fatigué qu'il n'avait même pas\r\n+profité de ces bons draps blancs. Il avait soufflé sa bougie avec sa\r\n+narine à la manière des forçats et s'était laissé tomber tout habillé\r\n+sur le lit, où il s'était tout de suite profondément endormi.\r\n+\r\n+Minuit sonnait comme l'évêque rentrait de son jardin dans son\r\n+appartement.\r\n+\r\n+Quelques minutes après, tout dormait dans la petite maison.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VI\r\n+\r\n+Jean Valjean\r\n+\r\n+\r\n+Vers le milieu de la nuit, Jean Valjean se réveilla.\r\n+\r\n+Jean Valjean était d'une pauvre famille de paysans de la Brie. Dans son\r\n+enfance, il n'avait pas appris à lire. Quand il eut l'âge d'homme, il\r\n+était émondeur à Faverolles. Sa mère s'appelait Jeanne Mathieu; son père\r\n+s'appelait Jean Valjean, ou Vlajean, sobriquet probablement, et\r\n+contraction de _Voilà Jean_.\r\n+\r\n+Jean Valjean était d'un caractère pensif sans être triste, ce qui est le\r\n+propre des natures affectueuses. Somme toute, pourtant, c'était quelque\r\n+chose d'assez endormi et d'assez insignifiant, en apparence du moins,\r\n+que Jean Valjean. Il avait perdu en très bas âge son père et sa mère. Sa\r\n+mère était morte d'une fièvre de lait mal soignée. Son père, émondeur\r\n+comme lui, s'était tué en tombant d'un arbre. Il n'était resté à Jean\r\n+Valjean qu'une soeur plus âgée que lui, veuve, avec sept enfants, filles\r\n+et garçons. Cette soeur avait élevé Jean Valjean, et tant qu'elle eut\r\n+son mari elle logea et nourrit son jeune frère. Le mari mourut. L'aîné\r\n+des sept enfants avait huit ans, le dernier un an. Jean Valjean venait\r\n+d'atteindre, lui, sa vingt-cinquième année. Il remplaça le père, et\r\n+soutint à son tour sa soeur qui l'avait élevé. Cela se fit simplement,\r\n+comme un devoir, même avec quelque chose de bourru de la part de Jean\r\n+Valjean. Sa jeunesse se dépensait ainsi dans un travail rude et mal\r\n+payé. On ne lui avait jamais connu de «bonne amie» dans le pays. Il\r\n+n'avait pas eu le temps d'être amoureux.\r\n+\r\n+Le soir il rentrait fatigué et mangeait sa soupe sans dire un mot. Sa\r\n+soeur, mère Jeanne, pendant qu'il mangeait, lui prenait souvent dans son\r\n+écuelle le meilleur de son repas, le morceau de viande, la tranche de\r\n+lard le coeur de chou, pour le donner à quelqu'un de ses enfants; lui,\r\n+mangeant toujours, penché sur la table, presque la tête dans sa soupe,\r\n+ses longs cheveux tombant autour de son écuelle et cachant ses yeux,\r\n+avait l'air de ne rien voir et laissait faire. Il y avait à Faverolles,\r\n+pas loin de la chaumière Valjean, de l'autre côté de la ruelle, une\r\n+fermière appelée Marie-Claude; les enfants Valjean, habituellement\r\n+affamés, allaient quelquefois emprunter au nom de leur mère une pinte de\r\n+lait à Marie-Claude, qu'ils buvaient derrière une haie ou dans quelque\r\n+coin d'allée, s'arrachant le pot, et si hâtivement que les petites\r\n+filles s'en répandaient sur leur tablier et dans leur goulotte. La mère,\r\n+si elle eût su cette maraude, eût sévèrement corrigé les délinquants.\r\n+Jean Valjean, brusque et bougon, payait en arrière de la mère la pinte\r\n+de lait à Marie-Claude, et les enfants n'étaient pas punis.\r\n+\r\n+Il gagnait dans la saison de l'émondage vingt-quatre sous par jour, puis\r\n+il se louait comme moissonneur, comme manoeuvre, comme garçon de ferme\r\n+bouvier, comme homme de peine. Il faisait ce qu'il pouvait. Sa soeur\r\n+travaillait de son côté, mais que faire avec sept petits enfants?\r\n+C'était un triste groupe que la misère enveloppa et étreignit peu à peu.\r\n+Il arriva qu'un hiver fut rude. Jean n'eut pas d'ouvrage. La famille\r\n+n'eut pas de pain. Pas de pain. À la lettre. Sept enfants! Un dimanche\r\n+soir, Maubert Isabeau, boulanger sur la place de l'Église, à Faverolles,\r\n+se disposait à se coucher, lorsqu'il entendit un coup violent dans la\r\n+devanture grillée et vitrée de sa boutique. Il arriva à temps pour voir\r\n+un bras passé à travers un trou fait d'un coup de poing dans la grille\r\n+et dans la vitre. Le bras saisit un pain et l'emporta. Isabeau sortit en\r\n+hâte; le voleur s'enfuyait à toutes jambes; Isabeau courut après lui et\r\n+l'arrêta. Le voleur avait jeté le pain, mais il avait encore le bras\r\n+ensanglanté. C'était Jean Valjean.\r\n+\r\n+Ceci se passait en 1795. Jean Valjean fut traduit devant les tribunaux\r\n+du temps «pour vol avec effraction la nuit dans une maison habitée». Il\r\n+avait un fusil dont il se servait mieux que tireur au monde, il était\r\n+quelque peu braconnier; ce qui lui nuisit. Il y a contre les braconniers\r\n+un préjugé légitime. Le braconnier, de même que le contrebandier, côtoie\r\n+de fort près le brigand. Pourtant, disons-le en passant, il y a encore\r\n+un abîme entre ces races d'hommes et le hideux assassin des villes. Le\r\n+braconnier vit dans la forêt; le contrebandier vit dans la montagne ou\r\n+sur la mer. Les villes font des hommes féroces parce qu'elles font des\r\n+hommes corrompus. La montagne, la mer, la forêt, font des hommes\r\n+sauvages. Elles développent le côté farouche, mais souvent sans détruire\r\n+le côté humain.\r\n+\r\n+Jean Valjean fut déclaré coupable. Les termes du code étaient formels.\r\n+Il y a dans notre civilisation des heures redoutables; ce sont les\r\n+moments où la pénalité prononce un naufrage. Quelle minute funèbre que\r\n+celle où la société s'éloigne et consomme l'irréparable abandon d'un\r\n+être pensant! Jean Valjean fut condamné à cinq ans de galères.\r\n+\r\n+Le 22 avril 1796, on cria dans Paris la victoire de Montenotte remportée\r\n+par le général en chef de l'année d'Italie, que le message du Directoire\r\n+aux Cinq-Cents, du 2 floréal an IV, appelle Buona-Parte; ce même jour\r\n+une grande chaîne fut ferrée à Bicêtre. Jean Valjean fit partie de cette\r\n+chaîne. Un ancien guichetier de la prison, qui a près de\r\n+quatre-vingt-dix ans aujourd'hui, se souvient encore parfaitement de ce\r\n+malheureux qui fut ferré à l'extrémité du quatrième cordon dans l'angle\r\n+nord de la cour. Il était assis à terre comme tous les autres. Il\r\n+paraissait ne rien comprendre à sa position, sinon qu'elle était\r\n+horrible. Il est probable qu'il y démêlait aussi, à travers les vagues\r\n+idées d'un pauvre homme ignorant de tout, quelque chose d'excessif.\r\n+Pendant qu'on rivait à grands coups de marteau derrière sa tête le\r\n+boulon de son carcan, il pleurait, les larmes l'étouffaient, elles\r\n+l'empêchaient de parler, il parvenait seulement à dire de temps en\r\n+temps: _J'étais émondeur à Faverolles_. Puis, tout en sanglotant, il\r\n+élevait sa main droite et l'abaissait graduellement sept fois comme s'il\r\n+touchait successivement sept têtes inégales, et par ce geste on devinait\r\n+que la chose quelconque qu'il avait faite, il l'avait faite pour vêtir\r\n+et nourrir sept petits enfants.\r\n+\r\n+Il partit pour Toulon. Il y arriva après un voyage de vingt-sept jours,\r\n+sur une charrette, la chaîne au cou. À Toulon, il fut revêtu de la\r\n+casaque rouge. Tout s'effaça de ce qui avait été sa vie, jusqu'à son\r\n+nom; il ne fut même plus Jean Valjean; il fut le numéro 24601. Que\r\n+devint la soeur? que devinrent les sept enfants? Qui est-ce qui s'occupe\r\n+de cela? Que devient la poignée de feuilles du jeune arbre scié par le\r\n+pied?\r\n+\r\n+C'est toujours la même histoire. Ces pauvres êtres vivants, ces\r\n+créatures de Dieu, sans appui désormais, sans guide, sans asile, s'en\r\n+allèrent au hasard, qui sait même? chacun de leur côté peut-être, et\r\n+s'enfoncèrent peu à peu dans cette froide brume où s'engloutissent les\r\n+destinées solitaires, moines ténèbres où disparaissent successivement\r\n+tant de têtes infortunées dans la sombre marche du genre humain. Ils\r\n+quittèrent le pays. Le clocher de ce qui avait été leur village les\r\n+oublia; la borne de ce qui avait été leur champ les oublia; après\r\n+quelques années de séjour au bagne, Jean Valjean lui-même les oublia.\r\n+Dans ce coeur où il y avait eu une plaie, il y eut une cicatrice. Voilà \r\n+tout. À peine, pendant tout le temps qu'il passa à Toulon, entendit-il\r\n+parler une seule fois de sa soeur. C'était, je crois, vers la fin de la\r\n+quatrième année de sa captivité. Je ne sais plus par quelle voie ce\r\n+renseignement lui parvint. Quelqu'un, qui les avait connus au pays,\r\n+avait vu sa soeur. Elle était à Paris. Elle habitait une pauvre rue près\r\n+de Saint-Sulpice, la rue du Geindre. Elle n'avait plus avec elle qu'un\r\n+enfant, un petit garçon, le dernier. Où étaient les six autres? Elle ne\r\n+le savait peut-être pas elle-même. Tous les matins elle allait à une\r\n+imprimerie rue du Sabot, n° 3, où elle était plieuse et brocheuse. Il\r\n+fallait être là à six heures du matin, bien avant le jour l'hiver. Dans\r\n+la maison de l'imprimerie il y avait une école, elle menait à cette\r\n+école son petit garçon qui avait sept ans. Seulement, comme elle entrait\r\n+à l'imprimerie à six heures et que l'école n'ouvrait qu'à sept, il\r\n+fallait que l'enfant attendît, dans la cour, que l'école ouvrit, une\r\n+heure; l'hiver, une heure de nuit, en plein air. On ne voulait pas que\r\n+l'enfant entrât dans l'imprimerie, parce qu'il gênait, disait-on. Les\r\n+ouvriers voyaient le matin en passant ce pauvre petit être assis sur le\r\n+pavé, tombant de sommeil, et souvent endormi dans l'ombre, accroupi et\r\n+plié sur son panier. Quand il pleuvait, une vieille femme, la portière,\r\n+en avait pitié; elle le recueillait dans son bouge où il n'y avait qu'un\r\n+grabat, un rouet et deux chaises de bois, et le petit dormait là dans un\r\n+coin, se serrant contre le chat pour avoir moins froid. À sept heures,\r\n+l'école ouvrait et il y entrait. Voilà ce qu'on dit à Jean Valjean. On\r\n+l'en entretint un jour, ce fut un moment, un éclair, comme une fenêtre\r\n+brusquement ouverte sur la destinée de ces êtres qu'il avait aimés, puis\r\n+tout se referma; il n'en entendit plus parler, et ce fut pour jamais.\r\n+Plus rien n'arriva d'eux à lui; jamais il ne les revit, jamais il ne les\r\n+rencontra, et, dans la suite de cette douloureuse histoire, on ne les\r\n+retrouvera plus.\r\n+\r\n+Vers la fin de cette quatrième année, le tour d'évasion de Jean Valjean\r\n+arriva. Ses camarades l'aidèrent comme cela se fait dans ce triste lieu.\r\n+Il s'évada. Il erra deux jours en liberté dans les champs; si c'est être\r\n+libre que d'être traqué; de tourner la tête à chaque instant; de\r\n+tressaillir au moindre bruit; d'avoir peur de tout, du toit qui fume, de\r\n+l'homme qui passe, du chien qui aboie, du cheval qui galope, de l'heure\r\n+qui sonne, du jour parce qu'on voit, de la nuit parce qu'on ne voit pas,\r\n+de la route, du sentier, du buisson, du sommeil. Le soir du second jour,\r\n+il fut repris. Il n'avait ni mangé ni dormi depuis trente-six heures. Le\r\n+tribunal maritime le condamna pour ce délit à une prolongation de trois\r\n+ans, ce qui lui fit huit ans. La sixième année, ce fut encore son tour\r\n+de s'évader; il en usa, mais il ne put consommer sa fuite. Il avait\r\n+manqué à l'appel. On tira le coup de canon, et à la nuit les gens de\r\n+ronde le trouvèrent caché sous la quille d'un vaisseau en construction;\r\n+il résista aux gardes-chiourme qui le saisirent. Évasion et rébellion.\r\n+Ce fait prévu par le code spécial fut puni d'une aggravation de cinq\r\n+ans, dont deux ans de double chaîne. Treize ans. La dixième année, son\r\n+tour revint, il en profita encore. Il ne réussit pas mieux. Trois ans\r\n+pour cette nouvelle tentative. Seize ans. Enfin, ce fut, je crois,\r\n+pendant la treizième année qu'il essaya une dernière fois et ne réussit\r\n+qu'à se faire reprendre après quatre heures d'absence. Trois ans pour\r\n+ces quatre heures. Dix-neuf ans. En octobre 1815 il fut libéré; il était\r\n+entré là en 1796 pour avoir cassé un carreau et pris un pain.\r\n+\r\n+Place pour une courte parenthèse. C'est la seconde fois que, dans ses\r\n+études sur la question pénale et sur la damnation par la loi, l'auteur\r\n+de ce livre rencontre le vol d'un pain, comme point de départ du\r\n+désastre d'une destinée. Claude Gueux avait volé un pain; Jean Valjean\r\n+avait volé un pain. Une statistique anglaise constate qu'à Londres\r\n+quatre vols sur cinq ont pour cause immédiate la faim.\r\n+\r\n+Jean Valjean était entré au bagne sanglotant et frémissant; il en sortit\r\n+impassible. Il y était entré désespéré; il en sortit sombre.\r\n+\r\n+Que s'était-il passé dans cette âme?\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VII\r\n+\r\n+Le dedans du désespoir\r\n+\r\n+\r\n+Essayons de le dire.\r\n+\r\n+Il faut bien que la société regarde ces choses puisque c'est elle qui\r\n+les fait.\r\n+\r\n+C'était, nous l'avons dit, un ignorant; mais ce n'était pas un imbécile.\r\n+La lumière naturelle était allumée en lui. Le malheur, qui a aussi sa\r\n+clarté, augmenta le peu de jour qu'il y avait dans cet esprit. Sous le\r\n+bâton, sous la chaîne, au cachot, à la fatigue, sous l'ardent soleil du\r\n+bagne, sur le lit de planches des forçats, il se replia en sa conscience\r\n+et réfléchit.\r\n+\r\n+Il se constitua tribunal.\r\n+\r\n+Il commença par se juger lui-même.\r\n+\r\n+Il reconnut qu'il n'était pas un innocent injustement puni. Il s'avoua\r\n+qu'il avait commis une action extrême et blâmable; qu'on ne lui eût\r\n+peut-être pas refusé ce pain s'il l'avait demandé; que dans tous les cas\r\n+il eût mieux valu l'attendre, soit de la pitié, soit du travail; que ce\r\n+n'est pas tout à fait une raison sans réplique de dire: peut-on attendre\r\n+quand on a faim? que d'abord il est très rare qu'on meure littéralement\r\n+de faim; ensuite que, malheureusement ou heureusement, l'homme est ainsi\r\n+fait qu'il peut souffrir longtemps et beaucoup, moralement et\r\n+physiquement, sans mourir; qu'il fallait donc de la patience; que cela\r\n+eût mieux valu même pour ces pauvres petits enfants; que c'était un acte\r\n+de folie, à lui, malheureux homme chétif, de prendre violemment au\r\n+collet la société tout entière et de se figurer qu'on sort de la misère\r\n+par le vol; que c'était, dans tous les cas, une mauvaise porte pour\r\n+sortir de la misère que celle par où l'on entre dans l'infamie; enfin\r\n+qu'il avait eu tort.\r\n+\r\n+Puis il se demanda:\r\n+\r\n+S'il était le seul qui avait eu tort dans sa fatale histoire? Si d'abord\r\n+ce n'était pas une chose grave qu'il eût, lui travailleur, manqué de\r\n+travail, lui laborieux, manqué de pain. Si, ensuite, la faute commise et\r\n+avouée, le châtiment n'avait pas été féroce et outré. S'il n'y avait pas\r\n+plus d'abus de la part de la loi dans la peine qu'il n'y avait eu d'abus\r\n+de la part du coupable dans la faute. S'il n'y avait pas excès de poids\r\n+dans un des plateaux de la balance, celui où est l'expiation. Si la\r\n+surcharge de la peine n'était point l'effacement du délit, et n'arrivait\r\n+pas à ce résultat: de retourner la situation, de remplacer la faute du\r\n+délinquant par la faute de la répression, de faire du coupable la\r\n+victime et du débiteur le créancier, et de mettre définitivement le\r\n+droit du côté de celui-là même qui l'avait violé. Si cette peine,\r\n+compliquée des aggravations successives pour les tentatives d'évasion,\r\n+ne finissait pas par être une sorte d'attentat du plus fort sur le plus\r\n+faible, un crime de la société sur l'individu, un crime qui recommençait\r\n+tous les jours, un crime qui durait dix-neuf ans.\r\n+\r\n+Il se demanda si la société humaine pouvait avoir le droit de faire\r\n+également subir à ses membres, dans un cas son imprévoyance\r\n+déraisonnable, et dans l'autre cas sa prévoyance impitoyable, et de\r\n+saisir à jamais un pauvre homme entre un défaut et un excès, défaut de\r\n+travail, excès de châtiment. S'il n'était pas exorbitant que la société\r\n+traitât ainsi précisément ses membres les plus mal dotés dans la\r\n+répartition de biens que fait le hasard, et par conséquent les plus\r\n+dignes de ménagements.\r\n+\r\n+Ces questions faites et résolues, il jugea la société et la condamna.\r\n+\r\n+Il la condamna sans haine.\r\n+\r\n+Il la fit responsable du sort qu'il subissait, et se dit qu'il\r\n+n'hésiterait peut-être pas à lui en demander compte un jour. Il se\r\n+déclara à lui-même qu'il n'y avait pas équilibre entre le dommage qu'il\r\n+avait causé et le dommage qu'on lui causait; il conclut enfin que son\r\n+châtiment n'était pas, à la vérité, une injustice, mais qu'à coup sûr\r\n+c'était une iniquité.\r\n+\r\n+La colère peut être folle et absurde; on peut être irrité à tort; on\r\n+n'est indigné que lorsqu'on a raison au fond par quelque côté. Jean\r\n+Valjean se sentait indigné. Et puis, la société humaine ne lui avait\r\n+fait que du mal. Jamais il n'avait vu d'elle que ce visage courroucé\r\n+qu'elle appelle sa justice et qu'elle montre à ceux qu'elle frappe. Les\r\n+hommes ne l'avaient touché que pour le meurtrir. Tout contact avec eux\r\n+lui avait été un coup. Jamais, depuis son enfance, depuis sa mère,\r\n+depuis sa soeur, jamais il n'avait rencontré une parole amie et un\r\n+regard bienveillant. De souffrance en souffrance il arriva peu à peu à \r\n+cette conviction que la vie était une guerre; et que dans cette guerre\r\n+il était le vaincu. Il n'avait d'autre arme que sa haine. Il résolut de\r\n+l'aiguiser au bagne et de l'emporter en s'en allant.\r\n+\r\n+Il y avait à Toulon une école pour la chiourme tenue par des frères\r\n+ignorantins où l'on enseignait le plus nécessaire à ceux de ces\r\n+malheureux qui avaient de la bonne volonté. Il fut du nombre des hommes\r\n+de bonne volonté. Il alla à l'école à quarante ans, et apprit à lire, à \r\n+écrire, à compter. Il sentit que fortifier son intelligence, c'était\r\n+fortifier sa haine. Dans certains cas, l'instruction et la lumière\r\n+peuvent servir de rallonge au mal.\r\n+\r\n+Cela est triste à dire, après avoir jugé la société qui avait fait son\r\n+malheur, il jugea la providence qui avait fait la société.\r\n+\r\n+Il la condamna aussi.\r\n+\r\n+Ainsi, pendant ces dix-neuf ans de torture et d'esclavage, cette âme\r\n+monta et tomba en même temps. Il y entra de la lumière d'un côté et des\r\n+ténèbres de l'autre.\r\n+\r\n+Jean Valjean n'était pas, on l'a vu, d'une nature mauvaise. Il était\r\n+encore bon lorsqu'il arriva au bagne. Il y condamna la société et sentit\r\n+qu'il devenait méchant, il y condamna la providence et sentit qu'il\r\n+devenait impie.\r\n+\r\n+Ici il est difficile de ne pas méditer un instant.\r\n+\r\n+La nature humaine se transforme-t-elle ainsi de fond en comble et tout à \r\n+fait? L'homme créé bon par Dieu peut-il être fait méchant par l'homme?\r\n+L'âme peut-elle être refaite tout d'une pièce par la destinée, et\r\n+devenir mauvaise, la destinée étant mauvaise? Le coeur peut-il devenir\r\n+difforme et contracter des laideurs et des infirmités incurables sous la\r\n+pression d'un malheur disproportionné, comme la colonne vertébrale sous\r\n+une voûte trop basse? N'y a-t-il pas dans toute âme humaine, n'y\r\n+avait-il pas dans l'âme de Jean Valjean en particulier, une première\r\n+étincelle, un élément divin, incorruptible dans ce monde, immortel dans\r\n+l'autre, que le bien peut développer, attiser, allumer, enflammer et\r\n+faire rayonner splendidement, et que le mal ne peut jamais entièrement\r\n+éteindre?\r\n+\r\n+Questions graves et obscures, à la dernière desquelles tout\r\n+physiologiste eût probablement répondu non, et sans hésiter, s'il eût vu\r\n+à Toulon, aux heures de repos qui étaient pour Jean Valjean des heures\r\n+de rêverie, assis, les bras croisés, sur la barre de quelque cabestan,\r\n+le bout de sa chaîne enfoncé dans sa poche pour l'empêcher de traîner,\r\n+ce galérien morne, sérieux, silencieux et pensif, paria des lois qui\r\n+regardait l'homme avec colère, damné de la civilisation qui regardait le\r\n+ciel avec sévérité.\r\n+\r\n+Certes, et nous ne voulons pas le dissimuler, le physiologiste\r\n+observateur eût vu là une misère irrémédiable, il eût plaint peut-être\r\n+ce malade du fait de la loi, mais il n'eût pas même essayé de\r\n+traitement; il eût détourné le regard des cavernes qu'il aurait\r\n+entrevues dans cette âme; et, comme Dante de la porte de l'enfer, il eût\r\n+effacé de cette existence le mot que le doigt de Dieu écrit pourtant sur\r\n+le front de tout homme: _Espérance_!\r\n+\r\n+Cet état de son âme que nous avons tenté d'analyser était-il aussi\r\n+parfaitement clair pour Jean Valjean que nous avons essayé de le rendre\r\n+pour ceux qui nous lisent? Jean Valjean voyait-il distinctement, après\r\n+leur formation, et avait-il vu distinctement, à mesure qu'ils se\r\n+formaient, tous les éléments dont se composait sa misère morale? Cet\r\n+homme rude et illettré s'était-il bien nettement rendu compte de la\r\n+succession d'idées par laquelle il était, degré à degré, monté et\r\n+descendu jusqu'aux lugubres aspects qui étaient depuis tant d'années\r\n+déjà l'horizon intérieur de son esprit? Avait-il bien conscience de tout\r\n+ce qui s'était passé en lui et de tout ce qui s'y remuait? C'est ce que\r\n+nous n'oserions dire; c'est même ce que nous ne croyons pas. Il y avait\r\n+trop d'ignorance dans Jean Valjean pour que, même après tant de malheur,\r\n+il n'y restât pas beaucoup de vague. Par moments il ne savait pas même\r\n+bien au juste ce qu'il éprouvait. Jean Valjean était dans les ténèbres;\r\n+il souffrait dans les ténèbres; il haïssait dans les ténèbres; on eût pu\r\n+dire qu'il haïssait devant lui. Il vivait habituellement dans cette\r\n+ombre, tâtonnant comme un aveugle et comme un rêveur. Seulement, par\r\n+intervalles, il lui venait tout à coup, de lui-même ou du dehors, une\r\n+secousse de colère, un surcroît de souffrance, un pâle et rapide éclair\r\n+qui illuminait toute son âme, et faisait brusquement apparaître partout\r\n+autour de lui, en avant et en arrière, aux lueurs d'une lumière\r\n+affreuse, les hideux précipices et les sombres perspectives de sa\r\n+destinée.\r\n+\r\n+L'éclair passé, la nuit retombait, et où était-il? il ne le savait plus.\r\n+\r\n+Le propre des peines de cette nature, dans lesquelles domine ce qui est\r\n+impitoyable, c'est-à -dire ce qui est abrutissant, c'est de transformer\r\n+peu à peu, par une sorte de transfiguration stupide, un homme en une\r\n+bête fauve. Quelquefois en une bête féroce. Les tentatives d'évasion de\r\n+Jean Valjean, successives et obstinées, suffiraient à prouver cet\r\n+étrange travail fait par la loi sur l'âme humaine. Jean Valjean eût\r\n+renouvelé ces tentatives, si parfaitement inutiles et folles, autant de\r\n+fois que l'occasion s'en fût présentée, sans songer un instant au\r\n+résultat, ni aux expériences déjà faites. Il s'échappait impétueusement\r\n+comme le loup qui trouve la cage ouverte. L'instinct lui disait:\r\n+sauve-toi! Le raisonnement lui eût dit: reste! Mais, devant une\r\n+tentation si violente, le raisonnement avait disparu; il n'y avait plus\r\n+que l'instinct. La bête seule agissait. Quand il était repris, les\r\n+nouvelles sévérités qu'on lui infligeait ne servaient qu'à l'effarer\r\n+davantage.\r\n+\r\n+Un détail que nous ne devons pas omettre, c'est qu'il était d'une force\r\n+physique dont n'approchait pas un des habitants du bagne. À la fatigue,\r\n+pour filer un câble, pour virer un cabestan, Jean Valjean valait quatre\r\n+hommes. Il soulevait et soutenait parfois d'énormes poids sur son dos,\r\n+et remplaçait dans l'occasion cet instrument qu'on appelle cric et qu'on\r\n+appelait jadis orgueil, d'où a pris nom, soit dit en passant, la rue\r\n+Montorgueil près des halles de Paris. Ses camarades l'avaient surnommé\r\n+Jean-le-Cric. Une fois, comme on réparait le balcon de l'hôtel de ville\r\n+de Toulon, une des admirables cariatides de Puget qui soutiennent ce\r\n+balcon se descella et faillit tomber. Jean Valjean, qui se trouvait là ,\r\n+soutint de l'épaule la cariatide et donna le temps aux ouvriers\r\n+d'arriver.\r\n+\r\n+Sa souplesse dépassait encore sa vigueur. Certains forçats, rêveurs\r\n+perpétuels d'évasions, finissent par faire de la force et de l'adresse\r\n+combinées une véritable science. C'est la science des muscles. Toute une\r\n+statique mystérieuse est quotidiennement pratiquée par les prisonniers,\r\n+ces éternels envieux des mouches et des oiseaux. Gravir une verticale,\r\n+et trouver des points d'appui là où l'on voit à peine une saillie, était\r\n+un jeu pour Jean Valjean. Étant donné un angle de mur, avec la tension\r\n+de son dos et de ses jarrets, avec ses coudes et ses talons emboîtés\r\n+dans les aspérités de la pierre, il se hissait comme magiquement à un\r\n+troisième étage. Quelquefois il montait ainsi jusqu'au toit du bagne.\r\n+\r\n+Il parlait peu. Il ne riait pas. Il fallait quelque émotion extrême pour\r\n+lui arracher, une ou deux fois l'an, ce lugubre rire du forçat qui est\r\n+comme un écho du rire du démon. À le voir, il semblait occupé à regarder\r\n+continuellement quelque chose de terrible.\r\n+\r\n+Il était absorbé en effet.\r\n+\r\n+À travers les perceptions maladives d'une nature incomplète et d'une\r\n+intelligence accablée, il sentait confusément qu'une chose monstrueuse\r\n+était sur lui. Dans cette pénombre obscure et blafarde où il rampait,\r\n+chaque fois qu'il tournait le cou et qu'il essayait d'élever son regard,\r\n+il voyait, avec une terreur mêlée de rage, s'échafauder, s'étager et\r\n+monter à perte de vue au-dessus de lui, avec des escarpements horribles,\r\n+une sorte d'entassement effrayant de choses, de lois, de préjugés,\r\n+d'hommes et de faits, dont les contours lui échappaient, dont la masse\r\n+l'épouvantait, et qui n'était autre chose que cette prodigieuse pyramide\r\n+que nous appelons la civilisation. Il distinguait çà et là dans cet\r\n+ensemble fourmillant et difforme, tantôt près de lui, tantôt loin et sur\r\n+des plateaux inaccessibles, quelque groupe, quelque détail vivement\r\n+éclairé, ici l'argousin et son bâton, ici le gendarme et son sabre,\r\n+là -bas l'archevêque mitré, tout en haut, dans une sorte de soleil,\r\n+l'empereur couronné et éblouissant. Il lui semblait que ces splendeurs\r\n+lointaines, loin de dissiper sa nuit, la rendaient plus funèbre et plus\r\n+noire. Tout cela, lois, préjugés, faits, hommes, choses, allait et\r\n+venait au-dessus de lui, selon le mouvement compliqué et mystérieux que\r\n+Dieu imprime à la civilisation, marchant sur lui et l'écrasant avec je\r\n+ne sais quoi de paisible dans la cruauté et d'inexorable dans\r\n+l'indifférence. Âmes tombées au fond de l'infortune possible, malheureux\r\n+hommes perdus au plus bas de ces limbes où l'on ne regarde plus, les\r\n+réprouvés de la loi sentent peser de tout son poids sur leur tête cette\r\n+société humaine, si formidable pour qui est dehors, si effroyable pour\r\n+qui est dessous.\r\n+\r\n+Dans cette situation, Jean Valjean songeait, et quelle pouvait être la\r\n+nature de sa rêverie?\r\n+\r\n+Si le grain de mil sous la meule avait des pensées, il penserait sans\r\n+doute ce que pensait Jean Valjean.\r\n+\r\n+Toutes ces choses, réalités pleines de spectres, fantasmagories pleines\r\n+de réalités, avaient fini par lui créer une sorte d'état intérieur\r\n+presque inexprimable.\r\n+\r\n+Par moments, au milieu de son travail du bagne, il s'arrêtait. Il se\r\n+mettait à penser. Sa raison, à la fois plus mûre et plus troublée\r\n+qu'autrefois, se révoltait. Tout ce qui lui était arrivé lui paraissait\r\n+absurde; tout ce qui l'entourait lui paraissait impossible. Il se\r\n+disait: c'est un rêve. Il regardait l'argousin debout à quelques pas de\r\n+lui; l'argousin lui semblait un fantôme; tout à coup le fantôme lui\r\n+donnait un coup de bâton.\r\n+\r\n+La nature visible existait à peine pour lui. Il serait presque vrai de\r\n+dire qu'il n'y avait point pour Jean Valjean de soleil, ni de beaux\r\n+jours d'été, ni de ciel rayonnant, ni de fraîches aubes d'avril. Je ne\r\n+sais quel jour de soupirail éclairait habituellement son âme.\r\n+\r\n+Pour résumer, en terminant, ce qui peut être résumé et traduit en\r\n+résultats positifs dans tout ce que nous venons d'indiquer, nous nous\r\n+bornerons à constater qu'en dix-neuf ans, Jean Valjean, l'inoffensif\r\n+émondeur de Faverolles, le redoutable galérien de Toulon, était devenu\r\n+capable, grâce à la manière dont le bagne l'avait façonné, de deux\r\n+espèces de mauvaises actions: premièrement, d'une mauvaise action\r\n+rapide, irréfléchie, pleine d'étourdissement, toute d'instinct, sorte de\r\n+représaille pour le mal souffert; deuxièmement, d'une mauvaise action\r\n+grave, sérieuse, débattue en conscience et méditée avec les idées\r\n+fausses que peut donner un pareil malheur. Ses préméditations passaient\r\n+par les trois phases successives que les natures d'une certaine trempe\r\n+peuvent seules parcourir, raisonnement, volonté, obstination. Il avait\r\n+pour mobiles l'indignation habituelle, l'amertume de l'âme, le profond\r\n+sentiment des iniquités subies, la réaction, même contre les bons, les\r\n+innocents et les justes, s'il y en a. Le point de départ comme le point\r\n+d'arrivée de toutes ses pensées était la haine de la loi humaine; cette\r\n+haine qui, si elle n'est arrêtée dans son développement par quelque\r\n+incident providentiel, devient, dans un temps donné, la haine de la\r\n+société, puis la haine du genre humain, puis la haine de la création, et\r\n+se traduit par un vague et incessant et brutal désir de nuire, n'importe\r\n+à qui, à un être vivant quelconque. Comme on voit, ce n'était pas sans\r\n+raison que le passeport qualifiait Jean Valjean d'_homme très\r\n+dangereux_.\r\n+\r\n+D'année en année, cette âme s'était desséchée de plus en plus,\r\n+lentement, mais fatalement. À coeur sec, oeil sec. À sa sortie du bagne,\r\n+il y avait dix-neuf ans qu'il n'avait versé une larme.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VIII\r\n+\r\n+L'onde et l'ombre\r\n+\r\n+\r\n+Un homme à la mer!\r\n+\r\n+Qu'importe! le navire ne s'arrête pas. Le vent souffle, ce sombre\r\n+navire-là a une route qu'il est forcé de continuer. Il passe.\r\n+\r\n+L'homme disparaît, puis reparaît, il plonge et remonte à la surface, il\r\n+appelle, il tend les bras, on ne l'entend pas; le navire, frissonnant\r\n+sous l'ouragan, est tout à sa manoeuvre, les matelots et les passagers\r\n+ne voient même plus l'homme submergé; sa misérable tête n'est qu'un\r\n+point dans l'énormité des vagues. Il jette des cris désespérés dans les\r\n+profondeurs. Quel spectre que cette voile qui s'en va! Il la regarde, il\r\n+la regarde frénétiquement. Elle s'éloigne, elle blêmit, elle décroît. Il\r\n+était là tout à l'heure, il était de l'équipage, il allait et venait sur\r\n+le pont avec les autres, il avait sa part de respiration et de soleil,\r\n+il était un vivant. Maintenant, que s'est-il donc passé? Il a glissé, il\r\n+est tombé, c'est fini.\r\n+\r\n+Il est dans l'eau monstrueuse. Il n'a plus sous les pieds que de la\r\n+fuite et de l'écroulement. Les flots déchirés et déchiquetés par le vent\r\n+l'environnent hideusement, les roulis de l'abîme l'emportent, tous les\r\n+haillons de l'eau s'agitent autour de sa tête, une populace de vagues\r\n+crache sur lui, de confuses ouvertures le dévorent à demi; chaque fois\r\n+qu'il enfonce, il entrevoit des précipices pleins de nuit; d'affreuses\r\n+végétations inconnues le saisissent, lui nouent les pieds, le tirent à \r\n+elles; il sent qu'il devient abîme, il fait partie de l'écume, les flots\r\n+se le jettent de l'un à l'autre, il boit l'amertume, l'océan lâche\r\n+s'acharne à le noyer, l'énormité joue avec son agonie. Il semble que\r\n+toute cette eau soit de la haine.\r\n+\r\n+Il lutte pourtant, il essaie de se défendre, il essaie de se soutenir,\r\n+il fait effort, il nage. Lui, cette pauvre force tout de suite épuisée,\r\n+il combat l'inépuisable.\r\n+\r\n+Où donc est le navire? Là -bas. À peine visible dans les pâles ténèbres\r\n+de l'horizon.\r\n+\r\n+Les rafales soufflent; toutes les écumes l'accablent. Il lève les yeux\r\n+et ne voit que les lividités des nuages. Il assiste, agonisant, à \r\n+l'immense démence de la mer. Il est supplicié par cette folie. Il entend\r\n+des bruits étrangers à l'homme qui semblent venir d'au delà de la terre\r\n+et d'on ne sait quel dehors effrayant.\r\n+\r\n+Il y a des oiseaux dans les nuées, de même qu'il y a des anges au-dessus\r\n+des détresses humaines, mais que peuvent-ils pour lui? Cela vole, chante\r\n+et plane, et lui, il râle.\r\n+\r\n+Il se sent enseveli à la fois par ces deux infinis, l'océan et le ciel;\r\n+l'un est une tombe, l'autre est un linceul.\r\n+\r\n+La nuit descend, voilà des heures qu'il nage, ses forces sont à bout; ce\r\n+navire, cette chose lointaine où il y avait des hommes, s'est effacé; il\r\n+est seul dans le formidable gouffre crépusculaire, il enfonce, il se\r\n+roidit, il se tord, il sent au-dessous de lui les vagues monstres de\r\n+l'invisible; il appelle.\r\n+\r\n+Il n'y a plus d'hommes. Où est Dieu?\r\n+\r\n+Il appelle. Quelqu'un! quelqu'un! Il appelle toujours.\r\n+\r\n+Rien à l'horizon. Rien au ciel.\r\n+\r\n+Il implore l'étendue, la vague, l'algue, l'écueil; cela est sourd. Il\r\n+supplie la tempête; la tempête imperturbable n'obéit qu'à l'infini.\r\n+\r\n+Autour de lui, l'obscurité, la brume, la solitude, le tumulte orageux et\r\n+inconscient, le plissement indéfini des eaux farouches. En lui l'horreur\r\n+et la fatigue. Sous lui la chute. Pas de point d'appui. Il songe aux\r\n+aventures ténébreuses du cadavre dans l'ombre illimitée. Le froid sans\r\n+fond le paralyse. Ses mains se crispent et se ferment et prennent du\r\n+néant. Vents, nuées, tourbillons, souffles, étoiles inutiles! Que faire?\r\n+Le désespéré s'abandonne, qui est las prend le parti de mourir, il se\r\n+laisse faire, il se laisse aller, il lâche prise, et le voilà qui roule\r\n+à jamais dans les profondeurs lugubres de l'engloutissement.\r\n+\r\n+Ô marche implacable des sociétés humaines! Pertes d'hommes et d'âmes\r\n+chemin faisant! Océan où tombe tout ce que laisse tomber la loi!\r\n+Disparition sinistre du secours! ô mort morale!\r\n+\r\n+La mer, c'est l'inexorable nuit sociale où la pénalité jette ses damnés.\r\n+La mer, c'est l'immense misère.\r\n+\r\n+L'âme, à vau-l'eau dans ce gouffre, peut devenir un cadavre. Qui la\r\n+ressuscitera?\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IX\r\n+\r\n+Nouveaux griefs\r\n+\r\n+\r\n+Quand vint l'heure de la sortie du bagne, quand Jean Valjean entendit à \r\n+son oreille ce mot étrange: _tu es libre_! le moment fut invraisemblable\r\n+et inouï, un rayon de vive lumière, un rayon de la vraie lumière des\r\n+vivants pénétra subitement en lui. Mais ce rayon ne tarda point à pâlir.\r\n+Jean Valjean avait été ébloui de l'idée de la liberté. Il avait cru à \r\n+une vie nouvelle. Il vit bien vite ce que c'était qu'une liberté à \r\n+laquelle on donne un passeport jaune.\r\n+\r\n+Et autour de cela bien des amertumes. Il avait calculé que sa masse,\r\n+pendant son séjour au bagne, aurait dû s'élever à cent soixante et onze\r\n+francs. Il est juste d'ajouter qu'il avait oublié de faire entrer dans\r\n+ses calculs le repos forcé des dimanches et fêtes qui, pour dix-neuf\r\n+ans, entraînait une diminution de vingt-quatre francs environ. Quoi\r\n+qu'il en fût, cette masse avait été réduite, par diverses retenues\r\n+locales, à la somme de cent neuf francs quinze sous, qui lui avait été\r\n+comptée à sa sortie.\r\n+\r\n+Il n'y avait rien compris, et se croyait lésé. Disons le mot, volé.\r\n+\r\n+Le lendemain de sa libération, à Grasse, il vit devant la porte d'une\r\n+distillerie de fleurs d'oranger des hommes qui déchargeaient des\r\n+ballots. Il offrit ses services. La besogne pressait, on les accepta. Il\r\n+se mit à l'ouvrage. Il était intelligent, robuste et adroit; il faisait\r\n+de son mieux; le maître paraissait content. Pendant qu'il travaillait,\r\n+un gendarme passa, le remarqua, et lui demanda ses papiers. Il fallut\r\n+montrer le passeport jaune. Cela fait, Jean Valjean reprit son travail.\r\n+Un peu auparavant, il avait questionné l'un des ouvriers sur ce qu'ils\r\n+gagnaient à cette besogne par jour; on lui avait répondu: _trente sous_.\r\n+Le soir venu, comme il était forcé de repartir le lendemain matin, il se\r\n+présenta devant le maître de la distillerie et le pria de le payer. Le\r\n+maître ne proféra pas une parole, et lui remit vingt-cinq sous. Il\r\n+réclama. On lui répondit: cela est assez bon pour toi. Il insista. Le\r\n+maître le regarda entre les deux yeux et lui dit: _Gare le bloc_.\r\n+\r\n+Là encore il se considéra comme volé.\r\n+\r\n+La société, l'état, en lui diminuant sa masse, l'avait volé en grand.\r\n+Maintenant, c'était le tour de l'individu qui le volait en petit.\r\n+\r\n+Libération n'est pas délivrance. On sort du bagne, mais non de la\r\n+condamnation. Voilà ce qui lui était arrivé à Grasse. On a vu de quelle\r\n+façon il avait été accueilli à Digne.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre X\r\n+\r\n+L'homme réveillé\r\n+\r\n+\r\n+Donc, comme deux heures du matin sonnaient à l'horloge de la cathédrale,\r\n+Jean Valjean se réveilla.\r\n+\r\n+Ce qui le réveilla, c'est que le lit était trop bon. Il y avait vingt\r\n+ans bientôt qu'il n'avait couché dans un lit, et quoiqu'il ne se fût pas\r\n+déshabillé, la sensation était trop nouvelle pour ne pas troubler son\r\n+sommeil.\r\n+\r\n+Il avait dormi plus de quatre heures. Sa fatigue était passée. Il était\r\n+accoutumé à ne pas donner beaucoup d'heures au repos.\r\n+\r\n+Il ouvrit les yeux et regarda un moment dans l'obscurité autour de lui,\r\n+puis il les referma pour se rendormir.\r\n+\r\n+Quand beaucoup de sensations diverses ont agité la journée, quand des\r\n+choses préoccupent l'esprit, on s'endort, mais on ne se rendort pas. Le\r\n+sommeil vient plus aisément qu'il ne revient. C'est ce qui arriva à Jean\r\n+Valjean. Il ne put se rendormir, et il se mit à penser.\r\n+\r\n+Il était dans un de ces moments où les idées qu'on a dans l'esprit sont\r\n+troubles. Il avait une sorte de va-et-vient obscur dans le cerveau. Ses\r\n+souvenirs anciens et ses souvenirs immédiats y flottaient pêle-mêle et\r\n+s'y croisaient confusément, perdant leurs formes, se grossissant\r\n+démesurément, puis disparaissant tout à coup comme dans une eau fangeuse\r\n+et agitée. Beaucoup de pensées lui venaient, mais il y en avait une qui\r\n+se représentait continuellement et qui chassait toutes les autres. Cette\r\n+pensée, nous allons la dire tout de suite:--Il avait remarqué les six\r\n+couverts d'argent et la grande cuiller que madame Magloire avait posés\r\n+sur la table.\r\n+\r\n+Ces six couverts d'argent l'obsédaient.--Ils étaient là .--À quelques\r\n+pas.--À l'instant où il avait traversé la chambre d'à côté pour venir\r\n+dans celle où il était, la vieille servante les mettait dans un petit\r\n+placard à la tête du lit.--Il avait bien remarqué ce placard.--À droite,\r\n+en entrant par la salle à manger.--Ils étaient massifs.--Et de vieille\r\n+argenterie.--Avec la grande cuiller, on en tirerait au moins deux cents\r\n+francs.--Le double de ce qu'il avait gagné en dix-neuf ans.--Il est\r\n+vrai qu'il eût gagné davantage si l'_administration_ ne l'avait pas\r\n+_volé_.\r\n+\r\n+Son esprit oscilla toute une grande heure dans des fluctuations\r\n+auxquelles se mêlait bien quelque lutte. Trois heures sonnèrent. Il\r\n+rouvrit les yeux, se dressa brusquement sur son séant, étendit le bras\r\n+et tâta son havresac qu'il avait jeté dans le coin de l'alcôve, puis il\r\n+laissa pendre ses jambes et poser ses pieds à terre, et se trouva,\r\n+presque sans savoir comment, assis sur son lit.\r\n+\r\n+Il resta un certain temps rêveur dans cette attitude qui eût eu quelque\r\n+chose de sinistre pour quelqu'un qui l'eût aperçu ainsi dans cette\r\n+ombre, seul éveillé dans la maison endormie. Tout à coup il se baissa,\r\n+ôta ses souliers et les posa doucement sur la natte près du lit, puis il\r\n+reprit sa posture de rêverie et redevint immobile.\r\n+\r\n+Au milieu de cette méditation hideuse, les idées que nous venons\r\n+d'indiquer remuaient sans relâche son cerveau, entraient, sortaient,\r\n+rentraient, faisaient sur lui une sorte de pesée; et puis il songeait\r\n+aussi, sans savoir pourquoi, et avec cette obstination machinale de la\r\n+rêverie, à un forçat nommé Brevet qu'il avait connu au bagne, et dont le\r\n+pantalon n'était retenu que par une seule bretelle de coton tricoté. Le\r\n+dessin en damier de cette bretelle lui revenait sans cesse à l'esprit.\r\n+\r\n+Il demeurait dans cette situation, et y fût peut-être resté indéfiniment\r\n+jusqu'au lever du jour, si l'horloge n'eût sonné un coup--le quart ou la\r\n+demie. Il sembla que ce coup lui eût dit: allons!\r\n+\r\n+Il se leva debout, hésita encore un moment, et écouta; tout se taisait\r\n+dans la maison; alors il marcha droit et à petits pas vers la fenêtre\r\n+qu'il entrevoyait. La nuit n'était pas très obscure; c'était une pleine\r\n+lune sur laquelle couraient de larges nuées chassées par le vent. Cela\r\n+faisait au dehors des alternatives d'ombre et de clarté, des éclipses,\r\n+puis des éclaircies, et au dedans une sorte de crépuscule. Ce\r\n+crépuscule, suffisant pour qu'on pût se guider, intermittent à cause des\r\n+nuages, ressemblait à l'espèce de lividité qui tombe d'un soupirail de\r\n+cave devant lequel vont et viennent des passants. Arrivé à la fenêtre,\r\n+Jean Valjean l'examina. Elle était sans barreaux, donnait sur le jardin\r\n+et n'était fermée, selon la mode du pays, que d'une petite clavette. Il\r\n+l'ouvrit, mais, comme un air froid et vif entra brusquement dans la\r\n+chambre, il la referma tout de suite. Il regarda le jardin de ce regard\r\n+attentif qui étudie plus encore qu'il ne regarde. Le jardin était enclos\r\n+d'un mur blanc assez bas, facile à escalader. Au fond, au-delà , il\r\n+distingua des têtes d'arbres également espacées, ce qui indiquait que ce\r\n+mur séparait le jardin d'une avenue ou d'une ruelle plantée.\r\n+\r\n+Ce coup d'oeil jeté, il fit le mouvement d'un homme déterminé, marcha à \r\n+son alcôve, prit son havresac, l'ouvrit, le fouilla, en tira quelque\r\n+chose qu'il posa sur le lit, mit ses souliers dans une des poches,\r\n+referma le tout, chargea le sac sur ses épaules, se couvrit de sa\r\n+casquette dont il baissa la visière sur ses yeux, chercha son bâton en\r\n+tâtonnant, et l'alla poser dans l'angle de la fenêtre, puis revint au\r\n+lit et saisit résolument l'objet qu'il y avait déposé. Cela ressemblait\r\n+à une barre de fer courte, aiguisée comme un épieu à l'une de ses\r\n+extrémités.\r\n+\r\n+Il eût été difficile de distinguer dans les ténèbres pour quel emploi\r\n+avait pu être façonné ce morceau de fer. C'était peut-être un levier?\r\n+C'était peut-être une massue?\r\n+\r\n+Au jour on eût pu reconnaître que ce n'était autre chose qu'un\r\n+chandelier de mineur. On employait alors quelquefois les forçats à \r\n+extraire de la roche des hautes collines qui environnent Toulon, et il\r\n+n'était pas rare qu'ils eussent à leur disposition des outils de mineur.\r\n+Les chandeliers des mineurs sont en fer massif, terminés à leur\r\n+extrémité inférieure par une pointe au moyen de laquelle on les enfonce\r\n+dans le rocher.\r\n+\r\n+Il prit ce chandelier dans sa main droite, et retenant son haleine,\r\n+assourdissant son pas, il se dirigea vers la porte de la chambre\r\n+voisine, celle de l'évêque, comme on sait. Arrivé à cette porte, il la\r\n+trouva entrebâillée. L'évêque ne l'avait point fermée.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XI\r\n+\r\n+Ce qu'il fait\r\n+\r\n+\r\n+Jean Valjean écouta. Aucun bruit.\r\n+\r\n+Il poussa la porte.\r\n+\r\n+Il la poussa du bout du doigt, légèrement, avec cette douceur furtive et\r\n+inquiète d'un chat qui veut entrer.\r\n+\r\n+La porte céda à la pression et fit un mouvement imperceptible et\r\n+silencieux qui élargit un peu l'ouverture.\r\n+\r\n+Il attendit un moment, puis poussa la porte une seconde fois, plus\r\n+hardiment. Elle continua de céder en silence. L'ouverture était assez\r\n+grande maintenant pour qu'il pût passer. Mais il y avait près de la\r\n+porte une petite table qui faisait avec elle un angle gênant et qui\r\n+barrait l'entrée.\r\n+\r\n+Jean Valjean reconnut la difficulté. Il fallait à toute force que\r\n+l'ouverture fût encore élargie.\r\n+\r\n+Il prit son parti, et poussa une troisième fois la porte, plus\r\n+énergiquement que les deux premières. Cette fois il y eut un gond mal\r\n+huilé qui jeta tout à coup dans cette obscurité un cri rauque et\r\n+prolongé.\r\n+\r\n+Jean Valjean tressaillit. Le bruit de ce gond sonna dans son oreille\r\n+avec quelque chose d'éclatant et de formidable comme le clairon du\r\n+jugement dernier. Dans les grossissements fantastiques de la première\r\n+minute, il se figura presque que ce gond venait de s'animer et de\r\n+prendre tout à coup une vie terrible, et qu'il aboyait comme un chien\r\n+pour avertir tout le monde et réveiller les gens endormis.\r\n+\r\n+Il s'arrêta, frissonnant, éperdu, et retomba de la pointe du pied sur le\r\n+talon. Il entendait ses artères battre dans ses tempes comme deux\r\n+marteaux de forge, et il lui semblait que son souffle sortait de sa\r\n+poitrine avec le bruit du vent qui sort d'une caverne. Il lui paraissait\r\n+impossible que l'horrible clameur de ce gond irrité n'eût pas ébranlé\r\n+toute la maison comme une secousse de tremblement de terre; la porte,\r\n+poussée par lui, avait pris l'alarme et avait appelé; le vieillard\r\n+allait se lever, les deux vieilles femmes allaient crier, on viendrait à \r\n+l'aide; avant un quart d'heure, la ville serait en rumeur et la\r\n+gendarmerie sur pied. Un moment il se crut perdu.\r\n+\r\n+Il demeura où il était, pétrifié comme la statue de sel, n'osant faire\r\n+un mouvement.\r\n+\r\n+Quelques minutes s'écoulèrent. La porte s'était ouverte toute grande. Il\r\n+se hasarda à regarder dans la chambre. Rien n'y avait bougé. Il prêta\r\n+l'oreille. Rien ne remuait dans la maison. Le bruit du gond rouillé\r\n+n'avait éveillé personne. Ce premier danger était passé, mais il y avait\r\n+encore en lui un affreux tumulte. Il ne recula pas pourtant. Même quand\r\n+il s'était cru perdu, il n'avait pas reculé. Il ne songea plus qu'à \r\n+finir vite. Il fit un pas et entra dans la chambre.\r\n+\r\n+Cette chambre était dans un calme parfait. On y distinguait çà et là des\r\n+formes confuses et vagues qui, au jour, étaient des papiers épars sur\r\n+une table, des in-folio ouverts, des volumes empilés sur un tabouret, un\r\n+fauteuil chargé de vêtements, un prie-Dieu, et qui à cette heure\r\n+n'étaient plus que des coins ténébreux et des places blanchâtres. Jean\r\n+Valjean avança avec précaution en évitant de se heurter aux meubles. Il\r\n+entendait au fond de la chambre la respiration égale et tranquille de\r\n+l'évêque endormi.\r\n+\r\n+Il s'arrêta tout à coup. Il était près du lit. Il y était arrivé plus\r\n+tôt qu'il n'aurait cru.\r\n+\r\n+La nature mêle quelquefois ses effets et ses spectacles à nos actions\r\n+avec une espèce d'à -propos sombre et intelligent, comme si elle voulait\r\n+nous faire réfléchir. Depuis près d'une demi-heure un grand nuage\r\n+couvrait le ciel. Au moment où Jean Valjean s'arrêta en face du lit, ce\r\n+nuage se déchira, comme s'il l'eût fait exprès, et un rayon de lune,\r\n+traversant la longue fenêtre, vint éclairer subitement le visage pâle de\r\n+l'évêque. Il dormait paisiblement. Il était presque vêtu dans son lit, à \r\n+cause des nuits froides des Basses-Alpes, d'un vêtement de laine brune\r\n+qui lui couvrait les bras jusqu'aux poignets. Sa tête était renversée\r\n+sur l'oreiller dans l'attitude abandonnée du repos; il laissait pendre\r\n+hors du lit sa main ornée de l'anneau pastoral et d'où étaient tombées\r\n+tant de bonnes oeuvres et de saintes actions. Toute sa face s'illuminait\r\n+d'une vague expression de satisfaction, d'espérance et de béatitude.\r\n+C'était plus qu'un sourire et presque un rayonnement. Il y avait sur son\r\n+front l'inexprimable réverbération d'une lumière qu'on ne voyait pas.\r\n+L'âme des justes pendant le sommeil contemple un ciel mystérieux.\r\n+\r\n+Un reflet de ce ciel était sur l'évêque.\r\n+\r\n+C'était en même temps une transparence lumineuse, car ce ciel était au\r\n+dedans de lui. Ce ciel, c'était sa conscience.\r\n+\r\n+Au moment où le rayon de lune vint se superposer, pour ainsi dire, à \r\n+cette clarté intérieure, l'évêque endormi apparut comme dans une gloire.\r\n+Cela pourtant resta doux et voilé d'un demi-jour ineffable. Cette lune\r\n+dans le ciel, cette nature assoupie, ce jardin sans un frisson, cette\r\n+maison si calme, l'heure, le moment, le silence, ajoutaient je ne sais\r\n+quoi de solennel et d'indicible au vénérable repos de ce sage, et\r\n+enveloppaient d'une sorte d'auréole majestueuse et sereine ces cheveux\r\n+blancs et ces yeux fermés, cette figure où tout était espérance et où\r\n+tout était confiance, cette tête de vieillard et ce sommeil d'enfant.\r\n+\r\n+Il y avait presque de la divinité dans cet homme ainsi auguste à son\r\n+insu. Jean Valjean, lui, était dans l'ombre, son chandelier de fer à la\r\n+main, debout, immobile, effaré de ce vieillard lumineux. Jamais il\r\n+n'avait rien vu de pareil. Cette confiance l'épouvantait. Le monde moral\r\n+n'a pas de plus grand spectacle que celui-là : une conscience troublée et\r\n+inquiète, parvenue au bord d'une mauvaise action, et contemplant le\r\n+sommeil d'un juste.\r\n+\r\n+Ce sommeil, dans cet isolement, et avec un voisin tel que lui, avait\r\n+quelque chose de sublime qu'il sentait vaguement, mais impérieusement.\r\n+\r\n+Nul n'eût pu dire ce qui se passait en lui, pas même lui. Pour essayer\r\n+de s'en rendre compte, il faut rêver ce qu'il y a de plus violent en\r\n+présence de ce qu'il y a de plus doux. Sur son visage même on n'eût rien\r\n+pu distinguer avec certitude. C'était une sorte d'étonnement hagard. Il\r\n+regardait cela. Voilà tout. Mais quelle était sa pensée? Il eût été\r\n+impossible de le deviner. Ce qui était évident, c'est qu'il était ému et\r\n+bouleversé. Mais de quelle nature était cette émotion?\r\n+\r\n+Son oeil ne se détachait pas du vieillard. La seule chose qui se\r\n+dégageât clairement de son attitude et de sa physionomie, c'était une\r\n+étrange indécision. On eût dit qu'il hésitait entre les deux abîmes,\r\n+celui où l'on se perd et celui où l'on se sauve. Il semblait prêt à \r\n+briser ce crâne ou à baiser cette main.\r\n+\r\n+Au bout de quelques instants, son bras gauche se leva lentement vers son\r\n+front, et il ôta sa casquette, puis son bras retomba avec la même\r\n+lenteur, et Jean Valjean rentra dans sa contemplation, sa casquette dans\r\n+la main gauche, sa massue dans la main droite, ses cheveux hérissés sur\r\n+sa tête farouche.\r\n+\r\n+L'évêque continuait de dormir dans une paix profonde sous ce regard\r\n+effrayant. Un reflet de lune faisait confusément visible au-dessus de la\r\n+cheminée le crucifix qui semblait leur ouvrir les bras à tous les deux,\r\n+avec une bénédiction pour l'un et un pardon pour l'autre.\r\n+\r\n+Tout à coup Jean Valjean remit sa casquette sur son front, puis marcha\r\n+rapidement, le long du lit, sans regarder l'évêque, droit au placard\r\n+qu'il entrevoyait près du chevet; il leva le chandelier de fer comme\r\n+pour forcer la serrure; la clef y était; il l'ouvrit; la première chose\r\n+qui lui apparut fut le panier d'argenterie; il le prit, traversa la\r\n+chambre à grands pas sans précaution et sans s'occuper du bruit, gagna\r\n+la porte, rentra dans l'oratoire, ouvrit la fenêtre, saisit un bâton,\r\n+enjamba l'appui du rez-de-chaussée, mit l'argenterie dans son sac, jeta\r\n+le panier, franchit le jardin, sauta par-dessus le mur comme un tigre,\r\n+et s'enfuit.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XII\r\n+\r\n+L'évêque travaille\r\n+\r\n+\r\n+Le lendemain, au soleil levant, monseigneur Bienvenu se promenait dans\r\n+son jardin. Madame Magloire accourut vers lui toute bouleversée.\r\n+\r\n+--Monseigneur, monseigneur, cria-t-elle, votre grandeur sait-elle où est\r\n+le panier d'argenterie?\r\n+\r\n+--Oui, dit l'évêque.\r\n+\r\n+--Jésus-Dieu soit béni! reprit-elle. Je ne savais ce qu'il était devenu.\r\n+\r\n+L'évêque venait de ramasser le panier dans une plate-bande. Il le\r\n+présenta à madame Magloire.\r\n+\r\n+--Le voilà .\r\n+\r\n+--Eh bien? dit-elle. Rien dedans! et l'argenterie?\r\n+\r\n+--Ah! repartit l'évêque. C'est donc l'argenterie qui vous occupe? Je ne\r\n+sais où elle est.\r\n+\r\n+--Grand bon Dieu! elle est volée! C'est l'homme d'hier soir qui l'a\r\n+volée!\r\n+\r\n+En un clin d'oeil, avec toute sa vivacité de vieille alerte, madame\r\n+Magloire courut à l'oratoire, entra dans l'alcôve et revint vers\r\n+l'évêque. L'évêque venait de se baisser et considérait en soupirant un\r\n+plant de cochléaria des Guillons que le panier avait brisé en tombant à \r\n+travers la plate-bande. Il se redressa au cri de madame Magloire.\r\n+\r\n+--Monseigneur, l'homme est parti! l'argenterie est volée!\r\n+\r\n+Tout en poussant cette exclamation, ses yeux tombaient sur un angle du\r\n+jardin où l'on voyait des traces d'escalade. Le chevron du mur avait été\r\n+arraché.\r\n+\r\n+--Tenez! c'est par là qu'il s'en est allé. Il a sauté dans la ruelle\r\n+Cochefilet! Ah! l'abomination! Il nous a volé notre argenterie!\r\n+\r\n+L'évêque resta un moment silencieux, puis leva son oeil sérieux, et dit\r\n+à madame Magloire avec douceur:\r\n+\r\n+--Et d'abord, cette argenterie était-elle à nous?\r\n+\r\n+Madame Magloire resta interdite. Il y eut encore un silence, puis\r\n+l'évêque continua:\r\n+\r\n+--Madame Magloire, je détenais à tort et depuis longtemps cette\r\n+argenterie. Elle était aux pauvres. Qu'était-ce que cet homme? Un pauvre\r\n+évidemment.\r\n+\r\n+--Hélas Jésus! repartit madame Magloire. Ce n'est pas pour moi ni pour\r\n+mademoiselle. Cela nous est bien égal. Mais c'est pour monseigneur. Dans\r\n+quoi monseigneur va-t-il manger maintenant?\r\n+\r\n+L'évêque la regarda d'un air étonné.\r\n+\r\n+--Ah çà mais! est-ce qu'il n'y a pas des couverts d'étain?\r\n+\r\n+Madame Magloire haussa les épaules.\r\n+\r\n+--L'étain a une odeur.\r\n+\r\n+--Alors, des couverts de fer.\r\n+\r\n+Madame Magloire fit une grimace significative.\r\n+\r\n+--Le fer a un goût.\r\n+\r\n+--Eh bien, dit l'évêque, des couverts de bois.\r\n+\r\n+Quelques instants après, il déjeunait à cette même table où Jean Valjean\r\n+s'était assis la veille. Tout en déjeunant, monseigneur Bienvenu faisait\r\n+gaîment remarquer à sa soeur qui ne disait rien et à madame Magloire qui\r\n+grommelait sourdement qu'il n'est nullement besoin d'une cuiller ni\r\n+d'une fourchette, même en bois, pour tremper un morceau de pain dans une\r\n+tasse de lait.\r\n+\r\n+--Aussi a-t-on idée! disait madame Magloire toute seule en allant et\r\n+venant, recevoir un homme comme cela! et le loger à côté de soi! et quel\r\n+bonheur encore qu'il n'ait fait que voler! Ah mon Dieu! cela fait frémir\r\n+quand on songe!\r\n+\r\n+Comme le frère et la soeur allaient se lever de table, on frappa à la\r\n+porte.\r\n+\r\n+--Entrez, dit l'évêque.\r\n+\r\n+La porte s'ouvrit. Un groupe étrange et violent apparut sur le seuil.\r\n+Trois hommes en tenaient un quatrième au collet. Les trois hommes\r\n+étaient des gendarmes; l'autre était Jean Valjean.\r\n+\r\n+Un brigadier de gendarmerie, qui semblait conduire le groupe, était près\r\n+de la porte. Il entra et s'avança vers l'évêque en faisant le salut\r\n+militaire.\r\n+\r\n+--Monseigneur... dit-il.\r\n+\r\n+À ce mot Jean Valjean, qui était morne et semblait abattu, releva la\r\n+tête d'un air stupéfait.\r\n+\r\n+--Monseigneur! murmura-t-il. Ce n'est donc pas le curé?...\r\n+\r\n+--Silence! dit un gendarme. C'est monseigneur l'évêque.\r\n+\r\n+Cependant monseigneur Bienvenu s'était approché aussi vivement que son\r\n+grand âge le lui permettait.\r\n+\r\n+--Ah! vous voilà ! s'écria-t-il en regardant Jean Valjean. Je suis aise\r\n+de vous voir. Et bien mais! je vous avais donné les chandeliers aussi,\r\n+qui sont en argent comme le reste et dont vous pourrez bien avoir deux\r\n+cents francs. Pourquoi ne les avez-vous pas emportés avec vos couverts?\r\n+\r\n+Jean Valjean ouvrit les yeux et regarda le vénérable évêque avec une\r\n+expression qu'aucune langue humaine ne pourrait rendre.\r\n+\r\n+--Monseigneur, dit le brigadier de gendarmerie, ce que cet homme disait\r\n+était donc vrai? Nous l'avons rencontré. Il allait comme quelqu'un qui\r\n+s'en va. Nous l'avons arrêté pour voir. Il avait cette argenterie....\r\n+\r\n+--Et il vous a dit, interrompit l'évêque en souriant, qu'elle lui avait\r\n+été donnée par un vieux bonhomme de prêtre chez lequel il avait passé la\r\n+nuit? Je vois la chose. Et vous l'avez ramené ici? C'est une méprise.\r\n+\r\n+--Comme cela, reprit le brigadier, nous pouvons le laisser aller?\r\n+\r\n+--Sans doute, répondit l'évêque.\r\n+\r\n+Les gendarmes lâchèrent Jean Valjean qui recula.\r\n+\r\n+--Est-ce que c'est vrai qu'on me laisse? dit-il d'une voix presque\r\n+inarticulée et comme s'il parlait dans le sommeil.\r\n+\r\n+--Oui, on te laisse, tu n'entends donc pas? dit un gendarme.\r\n+\r\n+--Mon ami, reprit l'évêque, avant de vous en aller, voici vos\r\n+chandeliers. Prenez-les.\r\n+\r\n+Il alla à la cheminée, prit les deux flambeaux d'argent et les apporta à \r\n+Jean Valjean. Les deux femmes le regardaient faire sans un mot, sans un\r\n+geste, sans un regard qui pût déranger l'évêque.\r\n+\r\n+Jean Valjean tremblait de tous ses membres. Il prit les deux chandeliers\r\n+machinalement et d'un air égaré.\r\n+\r\n+--Maintenant, dit l'évêque, allez en paix.\r\n+\r\n+--À propos, quand vous reviendrez, mon ami, il est inutile de passer par\r\n+le jardin. Vous pourrez toujours entrer et sortir par la porte de la\r\n+rue. Elle n'est fermée qu'au loquet jour et nuit.\r\n+\r\n+Puis se tournant vers la gendarmerie:\r\n+\r\n+--Messieurs, vous pouvez vous retirer.\r\n+\r\n+Les gendarmes s'éloignèrent.\r\n+\r\n+Jean Valjean était comme un homme qui va s'évanouir.\r\n+\r\n+L'évêque s'approcha de lui, et lui dit à voix basse:\r\n+\r\n+--N'oubliez pas, n'oubliez jamais que vous m'avez promis d'employer cet\r\n+argent à devenir honnête homme.\r\n+\r\n+Jean Valjean, qui n'avait aucun souvenir d'avoir rien promis, resta\r\n+interdit. L'évêque avait appuyé sur ces paroles en les prononçant. Il\r\n+reprit avec une sorte de solennité:\r\n+\r\n+--Jean Valjean, mon frère, vous n'appartenez plus au mal, mais au bien.\r\n+C'est votre âme que je vous achète; je la retire aux pensées noires et à \r\n+l'esprit de perdition, et je la donne à Dieu.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XIII\r\n+\r\n+Petit-Gervais\r\n+\r\n+\r\n+Jean Valjean sortit de la ville comme s'il s'échappait. Il se mit à \r\n+marcher en toute hâte dans les champs, prenant les chemins et les\r\n+sentiers qui se présentaient sans s'apercevoir qu'il revenait à chaque\r\n+instant sur ses pas. Il erra ainsi toute la matinée, n'ayant pas mangé\r\n+et n'ayant pas faim. Il était en proie à une foule de sensations\r\n+nouvelles. Il se sentait une sorte de colère; il ne savait contre qui.\r\n+Il n'eût pu dire s'il était touché ou humilié. Il lui venait par moments\r\n+un attendrissement étrange qu'il combattait et auquel il opposait\r\n+l'endurcissement de ses vingt dernières années. Cet état le fatiguait.\r\n+Il voyait avec inquiétude s'ébranler au dedans de lui l'espèce de calme\r\n+affreux que l'injustice de son malheur lui avait donné. Il se demandait\r\n+qu'est-ce qui remplacerait cela. Parfois il eût vraiment mieux aimé être\r\n+en prison avec les gendarmes, et que les choses ne se fussent point\r\n+passées ainsi; cela l'eût moins agité. Bien que la saison fut assez\r\n+avancée, il y avait encore çà et là dans les haies quelques fleurs\r\n+tardives dont l'odeur, qu'il traversait en marchant, lui rappelait des\r\n+souvenirs d'enfance. Ces souvenirs lui étaient presque insupportables,\r\n+tant il y avait longtemps qu'ils ne lui étaient apparus.\r\n+\r\n+Des pensées inexprimables s'amoncelèrent ainsi en lui toute la journée.\r\n+\r\n+Comme le soleil déclinait au couchant, allongeant sur le sol l'ombre du\r\n+moindre caillou, Jean Valjean était assis derrière un buisson dans une\r\n+grande plaine rousse absolument déserte. Il n'y avait à l'horizon que\r\n+les Alpes. Pas même le clocher d'un village lointain. Jean Valjean\r\n+pouvait être à trois lieues de Digne. Un sentier qui coupait la plaine\r\n+passait à quelques pas du buisson.\r\n+\r\n+Au milieu de cette méditation qui n'eût pas peu contribué à rendre ses\r\n+haillons effrayants pour quelqu'un qui l'eût rencontré, il entendit un\r\n+bruit joyeux.\r\n+\r\n+Il tourna la tête, et vit venir par le sentier un petit savoyard d'une\r\n+dizaine d'années qui chantait, sa vielle au flanc et sa boîte à marmotte\r\n+sur le dos; un de ces doux et gais enfants qui vont de pays en pays,\r\n+laissant voir leurs genoux par les trous de leur pantalon.\r\n+\r\n+Tout en chantant l'enfant interrompait de temps en temps sa marche et\r\n+jouait aux osselets avec quelques pièces de monnaie qu'il avait dans sa\r\n+main, toute sa fortune probablement. Parmi cette monnaie il y avait une\r\n+pièce de quarante sous. L'enfant s'arrêta à côté du buisson sans voir\r\n+Jean Valjean et fit sauter sa poignée de sous que jusque-là il avait\r\n+reçue avec assez d'adresse tout entière sur le dos de sa main.\r\n+\r\n+Cette fois la pièce de quarante sous lui échappa, et vint rouler vers la\r\n+broussaille jusqu'à Jean Valjean.\r\n+\r\n+Jean Valjean posa le pied dessus.\r\n+\r\n+Cependant l'enfant avait suivi sa pièce du regard, et l'avait vu.\r\n+\r\n+Il ne s'étonna point et marcha droit à l'homme.\r\n+\r\n+C'était un lieu absolument solitaire. Aussi loin que le regard pouvait\r\n+s'étendre, il n'y avait personne dans la plaine ni dans le sentier. On\r\n+n'entendait que les petits cris faibles d'une nuée d'oiseaux de passage\r\n+qui traversaient le ciel à une hauteur immense. L'enfant tournait le dos\r\n+au soleil qui lui mettait des fils d'or dans les cheveux et qui\r\n+empourprait d'une lueur sanglante la face sauvage de Jean Valjean.\r\n+\r\n+--Monsieur, dit le petit savoyard, avec cette confiance de l'enfance qui\r\n+se compose d'ignorance et d'innocence,--ma pièce?\r\n+\r\n+--Comment t'appelles-tu? dit Jean Valjean.\r\n+\r\n+--Petit-Gervais, monsieur.\r\n+\r\n+--Va-t'en, dit Jean Valjean.\r\n+\r\n+--Monsieur, reprit l'enfant, rendez-moi ma pièce.\r\n+\r\n+Jean Valjean baissa la tête et ne répondit pas.\r\n+\r\n+L'enfant recommença:\r\n+\r\n+--Ma pièce, monsieur!\r\n+\r\n+L'oeil de Jean Valjean resta fixé à terre.\r\n+\r\n+--Ma pièce! cria l'enfant, ma pièce blanche! mon argent! Il semblait que\r\n+Jean Valjean n'entendit point. L'enfant le prit au collet de sa blouse\r\n+et le secoua. Et en même temps il faisait effort pour déranger le gros\r\n+soulier ferré posé sur son trésor.\r\n+\r\n+--Je veux ma pièce! ma pièce de quarante sous!\r\n+\r\n+L'enfant pleurait. La tête de Jean Valjean se releva. Il était toujours\r\n+assis. Ses yeux étaient troubles. Il considéra l'enfant avec une sorte\r\n+d'étonnement, puis il étendit la main vers son bâton et cria d'une voix\r\n+terrible:\r\n+\r\n+--Qui est là ?\r\n+\r\n+--Moi, monsieur, répondit l'enfant. Petit-Gervais! moi! moi! Rendez-moi\r\n+mes quarante sous, s'il vous plaît! Ôtez votre pied, monsieur, s'il vous\r\n+plaît!\r\n+\r\n+Puis irrité, quoique tout petit, et devenant presque menaçant:\r\n+\r\n+--Ah, çà , ôterez-vous votre pied? Ôtez donc votre pied, voyons.\r\n+\r\n+--Ah! c'est encore toi! dit Jean Valjean, et se dressant brusquement\r\n+tout debout, le pied toujours sur la pièce d'argent, il ajouta:--Veux-tu\r\n+bien te sauver!\r\n+\r\n+L'enfant effaré le regarda, puis commença à trembler de la tête aux\r\n+pieds, et, après quelques secondes de stupeur, se mit à s'enfuir en\r\n+courant de toutes ses forces sans oser tourner le cou ni jeter un cri.\r\n+\r\n+Cependant à une certaine distance l'essoufflement le força de s'arrêter,\r\n+et Jean Valjean, à travers sa rêverie, l'entendit qui sanglotait.\r\n+\r\n+Au bout de quelques instants l'enfant avait disparu. Le soleil s'était\r\n+couché. L'ombre se faisait autour de Jean Valjean. Il n'avait pas mangé\r\n+de la journée; il est probable qu'il avait la fièvre.\r\n+\r\n+Il était resté debout, et n'avait pas changé d'attitude depuis que\r\n+l'enfant s'était enfui. Son souffle soulevait sa poitrine à des\r\n+intervalles longs et inégaux. Son regard, arrêté à dix ou douze pas\r\n+devant lui, semblait étudier avec une attention profonde la forme d'un\r\n+vieux tesson de faïence bleue tombé dans l'herbe. Tout à coup il\r\n+tressaillit; il venait de sentir le froid du soir.\r\n+\r\n+Il raffermit sa casquette sur son front, chercha machinalement à croiser\r\n+et à boutonner sa blouse, fit un pas, et se baissa pour reprendre à \r\n+terre son bâton. En ce moment il aperçut la pièce de quarante sous que\r\n+son pied avait à demi enfoncée dans la terre et qui brillait parmi les\r\n+cailloux.\r\n+\r\n+Ce fut comme une commotion galvanique. Qu'est-ce que c'est que ça?\r\n+dit-il entre ses dents. Il recula de trois pas, puis s'arrêta, sans\r\n+pouvoir détacher son regard de ce point que son pied avait foulé\r\n+l'instant d'auparavant, comme si cette chose qui luisait là dans\r\n+l'obscurité eût été un oeil ouvert fixé sur lui.\r\n+\r\n+Au bout de quelques minutes, il s'élança convulsivement vers la pièce\r\n+d'argent, la saisit, et, se redressant, se mit à regarder au loin dans\r\n+la plaine, jetant à la fois ses yeux vers tous les points de l'horizon,\r\n+debout et frissonnant comme une bête fauve effarée qui cherche un asile.\r\n+\r\n+Il ne vit rien. La nuit tombait, la plaine était froide et vague, de\r\n+grandes brumes violettes montaient dans la clarté crépusculaire.\r\n+\r\n+Il dit: «Ah!» et se mit à marcher rapidement dans une certaine\r\n+direction, du côté où l'enfant avait disparu. Après une centaine de pas,\r\n+il s'arrêta, regarda, et ne vit rien.\r\n+\r\n+Alors il cria de toute sa force: «Petit-Gervais! Petit-Gervais!»\r\n+\r\n+Il se tut, et attendit.\r\n+\r\n+Rien ne répondit.\r\n+\r\n+La campagne était déserte et morne. Il était environné de l'étendue. Il\r\n+n'y avait rien autour de lui qu'une ombre où se perdait son regard et un\r\n+silence où sa voix se perdait.\r\n+\r\n+Une bise glaciale soufflait, et donnait aux choses autour de lui une\r\n+sorte de vie lugubre. Des arbrisseaux secouaient leurs petits bras\r\n+maigres avec une furie incroyable. On eût dit qu'ils menaçaient et\r\n+poursuivaient quelqu'un.\r\n+\r\n+Il recommença à marcher, puis il se mit à courir, et de temps en temps\r\n+il s'arrêtait, et criait dans cette solitude, avec une voix qui était ce\r\n+qu'on pouvait entendre de plus formidable et de plus désolé:\r\n+«Petit-Gervais! Petit-Gervais!»\r\n+\r\n+Certes, si l'enfant l'eût entendu, il eût eu peur et se fût bien gardé\r\n+de se montrer. Mais l'enfant était sans doute déjà bien loin.\r\n+\r\n+Il rencontra un prêtre qui était à cheval. Il alla à lui et lui dit:\r\n+\r\n+--Monsieur le curé, avez-vous vu passer un enfant?\r\n+\r\n+--Non, dit le prêtre.\r\n+\r\n+--Un nommé Petit-Gervais?\r\n+\r\n+--Je n'ai vu personne.\r\n+\r\n+Il tira deux pièces de cinq francs de sa sacoche et les remit au prêtre.\r\n+\r\n+--Monsieur le curé, voici pour vos pauvres.--Monsieur le curé, c'est un\r\n+petit d'environ dix ans qui a une marmotte, je crois, et une vielle. Il\r\n+allait. Un de ces savoyards, vous savez?\r\n+\r\n+--Je ne l'ai point vu.\r\n+\r\n+--Petit-Gervais? il n'est point des villages d'ici? pouvez-vous me dire?\r\n+\r\n+--Si c'est comme vous dites, mon ami, c'est un petit enfant étranger.\r\n+Cela passe dans le pays. On ne les connaît pas.\r\n+\r\n+Jean Valjean prit violemment deux autres écus de cinq francs qu'il donna\r\n+au prêtre.\r\n+\r\n+--Pour vos pauvres, dit-il.\r\n+\r\n+Puis il ajouta avec égarement:\r\n+\r\n+--Monsieur l'abbé, faites-moi arrêter. Je suis un voleur.\r\n+\r\n+Le prêtre piqua des deux et s'enfuit très effrayé.\r\n+\r\n+Jean Valjean se remit à courir dans la direction qu'il avait d'abord\r\n+prise.\r\n+\r\n+Il fit de la sorte un assez long chemin, regardant, appelant, criant,\r\n+mais il ne rencontra plus personne. Deux ou trois fois il courut dans la\r\n+plaine vers quelque chose qui lui faisait l'effet d'un être couché ou\r\n+accroupi; ce n'étaient que des broussailles ou des roches à fleur de\r\n+terre. Enfin, à un endroit où trois sentiers se croisaient, il s'arrêta.\r\n+La lune s'était levée. Il promena sa vue au loin et appela une dernière\r\n+fois: «Petit-Gervais! Petit-Gervais! Petit-Gervais!» Son cri s'éteignit\r\n+dans la brume, sans même éveiller un écho. Il murmura encore:\r\n+«Petit-Gervais!» mais d'une voix faible et presque inarticulée. Ce fut\r\n+là son dernier effort; ses jarrets fléchirent brusquement sous lui comme\r\n+si une puissance invisible l'accablait tout à coup du poids de sa\r\n+mauvaise conscience; il tomba épuisé sur une grosse pierre, les poings\r\n+dans ses cheveux et le visage dans ses genoux, et il cria: «Je suis un\r\n+misérable!»\r\n+\r\n+Alors son coeur creva et il se mit à pleurer. C'était la première fois\r\n+qu'il pleurait depuis dix-neuf ans.\r\n+\r\n+Quand Jean Valjean était sorti de chez l'évêque, on l'a vu, il était\r\n+hors de tout ce qui avait été sa pensée jusque-là . Il ne pouvait se\r\n+rendre compte de ce qui se passait en lui. Il se raidissait contre\r\n+l'action angélique et contre les douces paroles du vieillard. «Vous\r\n+m'avez promis de devenir honnête homme. Je vous achète votre âme. Je la\r\n+retire à l'esprit de perversité et je la donne au bon Dieu.» Cela lui\r\n+revenait sans cesse. Il opposait à cette indulgence céleste l'orgueil,\r\n+qui est en nous comme la forteresse du mal. Il sentait indistinctement\r\n+que le pardon de ce prêtre était le plus grand assaut et la plus\r\n+formidable attaque dont il eût encore été ébranlé; que son\r\n+endurcissement serait définitif s'il résistait à cette clémence; que,\r\n+s'il cédait, il faudrait renoncer à cette haine dont les actions des\r\n+autres hommes avaient rempli son âme pendant tant d'années, et qui lui\r\n+plaisait; que cette fois il fallait vaincre ou être vaincu, et que la\r\n+lutte, une lutte colossale et décisive, était engagée entre sa\r\n+méchanceté à lui et la bonté de cet homme.\r\n+\r\n+En présence de toutes ces lueurs, il allait comme un homme ivre. Pendant\r\n+qu'il marchait ainsi, les yeux hagards, avait-il une perception\r\n+distincte de ce qui pourrait résulter pour lui de son aventure à Digne?\r\n+Entendait-il tous ces bourdonnements mystérieux qui avertissent ou\r\n+importunent l'esprit à de certains moments de la vie? Une voix lui\r\n+disait-elle à l'oreille qu'il venait de traverser l'heure solennelle de\r\n+sa destinée, qu'il n'y avait plus de milieu pour lui, que si désormais\r\n+il n'était pas le meilleur des hommes il en serait le pire, qu'il\r\n+fallait pour ainsi dire que maintenant il montât plus haut que l'évêque\r\n+ou retombât plus bas que le galérien, que s'il voulait devenir bon il\r\n+fallait qu'il devînt ange; que s'il voulait rester méchant il fallait\r\n+qu'il devînt monstre?\r\n+\r\n+Ici encore il faut se faire ces questions que nous nous sommes déjà \r\n+faites ailleurs, recueillait-il confusément quelque ombre de tout ceci\r\n+dans sa pensée? Certes, le malheur, nous l'avons dit, fait l'éducation\r\n+de l'intelligence; cependant il est douteux que Jean Valjean fût en état\r\n+de démêler tout ce que nous indiquons ici. Si ces idées lui arrivaient,\r\n+il les entrevoyait plutôt qu'il ne les voyait, et elles ne réussissaient\r\n+qu'à le jeter dans un trouble insupportable et presque douloureux. Au\r\n+sortir de cette chose difforme et noire qu'on appelle le bagne, l'évêque\r\n+lui avait fait mal à l'âme comme une clarté trop vive lui eût fait mal\r\n+aux yeux en sortant des ténèbres. La vie future, la vie possible qui\r\n+s'offrait désormais à lui toute pure et toute rayonnante le remplissait\r\n+de frémissements et d'anxiété. Il ne savait vraiment plus où il en\r\n+était. Comme une chouette qui verrait brusquement se lever le soleil, le\r\n+forçat avait été ébloui et comme aveuglé par la vertu.\r\n+\r\n+Ce qui était certain, ce dont il ne se doutait pas, c'est qu'il n'était\r\n+déjà plus le même homme, c'est que tout était changé en lui, c'est qu'il\r\n+n'était plus en son pouvoir de faire que l'évêque ne lui eût pas parlé\r\n+et ne l'eût pas touché.\r\n+\r\n+Dans cette situation d'esprit, il avait rencontré Petit-Gervais et lui\r\n+avait volé ses quarante sous. Pourquoi? Il n'eût assurément pu\r\n+l'expliquer; était-ce un dernier effet et comme un suprême effort des\r\n+mauvaises pensées qu'il avait apportées du bagne, un reste d'impulsion,\r\n+un résultat de ce qu'on appelle en statique la _force acquise_? C'était\r\n+cela, et c'était aussi peut-être moins encore que cela. Disons-le\r\n+simplement, ce n'était pas lui qui avait volé, ce n'était pas l'homme,\r\n+c'était la bête qui, par habitude et par instinct, avait stupidement\r\n+posé le pied sur cet argent, pendant que l'intelligence se débattait au\r\n+milieu de tant d'obsessions inouïes et nouvelles. Quand l'intelligence\r\n+se réveilla et vit cette action de la brute, Jean Valjean recula avec\r\n+angoisse et poussa un cri d'épouvante.\r\n+\r\n+C'est que, phénomène étrange et qui n'était possible que dans la\r\n+situation où il était, en volant cet argent à cet enfant, il avait fait\r\n+une chose dont il n'était déjà plus capable.\r\n+\r\n+Quoi qu'il en soit, cette dernière mauvaise action eut sur lui un effet\r\n+décisif; elle traversa brusquement ce chaos qu'il avait dans\r\n+l'intelligence et le dissipa, mit d'un côté les épaisseurs obscures et\r\n+de l'autre la lumière, et agit sur son âme, dans l'état où elle se\r\n+trouvait, comme de certains réactifs chimiques agissent sur un mélange\r\n+trouble en précipitant un élément et en clarifiant l'autre.\r\n+\r\n+Tout d'abord, avant même de s'examiner et de réfléchir, éperdu, comme\r\n+quelqu'un qui cherche à se sauver, il tâcha de retrouver l'enfant pour\r\n+lui rendre son argent, puis, quand il reconnut que cela était inutile et\r\n+impossible, il s'arrêta désespéré. Au moment où il s'écria: «je suis un\r\n+misérable!» il venait de s'apercevoir tel qu'il était, et il était déjà \r\n+à ce point séparé de lui-même, qu'il lui semblait qu'il n'était plus\r\n+qu'un fantôme, et qu'il avait là devant lui, en chair et en os, le bâton\r\n+à la main, la blouse sur les reins, son sac rempli d'objets volés sur le\r\n+dos, avec son visage résolu et morne, avec sa pensée pleine de projets\r\n+abominables, le hideux galérien Jean Valjean.\r\n+\r\n+L'excès du malheur, nous l'avons remarqué, l'avait fait en quelque sorte\r\n+visionnaire. Ceci fut donc comme une vision. Il vit véritablement ce\r\n+Jean Valjean, cette face sinistre devant lui. Il fut presque au moment\r\n+de se demander qui était cet homme, et il en eut horreur.\r\n+\r\n+Son cerveau était dans un de ces moments violents et pourtant\r\n+affreusement calmes où la rêverie est si profonde qu'elle absorbe la\r\n+réalité. On ne voit plus les objets qu'on a autour de soi, et l'on voit\r\n+comme en dehors de soi les figures qu'on a dans l'esprit.\r\n+\r\n+Il se contempla donc, pour ainsi dire, face à face, et en même temps, à \r\n+travers cette hallucination, il voyait dans une profondeur mystérieuse\r\n+une sorte de lumière qu'il prit d'abord pour un flambeau. En regardant\r\n+avec plus d'attention cette lumière qui apparaissait à sa conscience, il\r\n+reconnut qu'elle avait la forme humaine, et que ce flambeau était\r\n+l'évêque.\r\n+\r\n+Sa conscience considéra tour à tour ces deux hommes ainsi placés devant\r\n+elle, l'évêque et Jean Valjean. Il n'avait pas fallu moins que le\r\n+premier pour détremper le second. Par un de ces effets singuliers qui\r\n+sont propres à ces sortes d'extases, à mesure que sa rêverie se\r\n+prolongeait, l'évêque grandissait et resplendissait à ses yeux, Jean\r\n+Valjean s'amoindrissait et s'effaçait. À un certain moment il ne fut\r\n+plus qu'une ombre. Tout à coup il disparut. L'évêque seul était resté.\r\n+\r\n+Il remplissait toute l'âme de ce misérable d'un rayonnement magnifique.\r\n+Jean Valjean pleura longtemps. Il pleura à chaudes larmes, il pleura à \r\n+sanglots, avec plus de faiblesse qu'une femme, avec plus d'effroi qu'un\r\n+enfant.\r\n+\r\n+Pendant qu'il pleurait, le jour se faisait de plus en plus dans son\r\n+cerveau, un jour extraordinaire, un jour ravissant et terrible à la\r\n+fois. Sa vie passée, sa première faute, sa longue expiation, son\r\n+abrutissement extérieur, son endurcissement intérieur, sa mise en\r\n+liberté réjouie par tant de plans de vengeance, ce qui lui était arrivé\r\n+chez l'évêque, la dernière chose qu'il avait faite, ce vol de quarante\r\n+sous à un enfant, crime d'autant plus lâche et d'autant plus monstrueux\r\n+qu'il venait après le pardon de l'évêque, tout cela lui revint et lui\r\n+apparut, clairement, mais dans une clarté qu'il n'avait jamais vue\r\n+jusque-là . Il regarda sa vie, et elle lui parut horrible; son âme, et\r\n+elle lui parut affreuse. Cependant un jour doux était sur cette vie et\r\n+sur cette âme. Il lui semblait qu'il voyait Satan à la lumière du\r\n+paradis.\r\n+\r\n+Combien d'heures pleura-t-il ainsi? que fit-il après avoir pleuré? où\r\n+alla-t-il? on ne l'a jamais su. Il paraît seulement avéré que, dans\r\n+cette même nuit, le voiturier qui faisait à cette époque le service de\r\n+Grenoble et qui arrivait à Digne vers trois heures du matin, vit en\r\n+traversant la rue de l'évêché un homme dans l'attitude de la prière, à \r\n+genoux sur le pavé, dans l'ombre, devant la porte de monseigneur\r\n+Bienvenu.\r\n+\r\n+\r\n+\r\n+\r\n+Livre troisième--En l'année 1817\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre I\r\n+\r\n+L'année 1817\r\n+\r\n+\r\n+1817 est l'année que Louis XVIII, avec un certain aplomb royal qui ne\r\n+manquait pas de fierté, qualifiait la vingt-deuxième de son règne. C'est\r\n+l'année où M. Bruguière de Sorsum était célèbre. Toutes les boutiques\r\n+des perruquiers, espérant la poudre et le retour de l'oiseau royal,\r\n+étaient badigeonnées d'azur et fleurdelysées. C'était le temps candide\r\n+où le comte Lynch siégeait tous les dimanches comme marguillier au banc\r\n+d'oeuvre de Saint-Germain-des-Prés en habit de pair de France, avec son\r\n+cordon rouge et son long nez, et cette majesté de profil particulière à \r\n+un homme qui a fait une action d'éclat. L'action d'éclat commise par M.\r\n+Lynch était ceci: avoir, étant maire de Bordeaux, le 12 mars 1814, donné\r\n+la ville un peu trop tôt à M. le duc d'Angoulême. De là sa pairie. En\r\n+1817, la mode engloutissait les petits garçons de quatre à six ans sous\r\n+de vastes casquettes en cuir maroquiné à oreillons assez ressemblantes à \r\n+des mitres d'esquimaux. L'armée française était vêtue de blanc, à \r\n+l'autrichienne; les régiments s'appelaient légions; au lieu de chiffres\r\n+ils portaient les noms des départements. Napoléon était à Sainte-Hélène,\r\n+et, comme l'Angleterre lui refusait du drap vert, il faisait retourner\r\n+ses vieux habits. En 1817, Pellegrini chantait, mademoiselle Bigottini\r\n+dansait; Potier régnait; Odry n'existait pas encore. Madame Saqui\r\n+succédait à Forioso. Il y avait encore des Prussiens en France. M.\r\n+Delalot était un personnage. La légitimité venait de s'affirmer en\r\n+coupant le poing, puis la tête, à Pleignier, à Carbonneau et à Tolleron.\r\n+Le prince de Talleyrand, grand chambellan, et l'abbé Louis, ministre\r\n+désigné des finances, se regardaient en riant du rire de deux augures;\r\n+tous deux avaient célébré, le 14 juillet 1790, la messe de la Fédération\r\n+au Champ de Mars; Talleyrand l'avait dite comme évêque, Louis l'avait\r\n+servie comme diacre. En 1817, dans les contre-allées de ce même Champ de\r\n+Mars, on apercevait de gros cylindres de bois, gisant sous la pluie,\r\n+pourrissant dans l'herbe, peints en bleu avec des traces d'aigles et\r\n+d'abeilles dédorées. C'étaient les colonnes qui, deux ans auparavant,\r\n+avaient soutenu l'estrade de l'empereur au Champ-de-Mai. Elles étaient\r\n+noircies çà et là de la brûlure du bivouac des Autrichiens baraqués près\r\n+du Gros-Caillou. Deux ou trois de ces colonnes avaient disparu dans les\r\n+feux de ces bivouacs et avaient chauffé les larges mains des\r\n+_kaiserlicks_. Le Champ de Mai avait eu cela de remarquable qu'il avait\r\n+été tenu au mois de juin et au Champ de Mars. En cette année 1817, deux\r\n+choses étaient populaires: le Voltaire-Touquet et la tabatière à la\r\n+Charte. L'émotion parisienne la plus récente était le crime de Dautun\r\n+qui avait jeté la tête de son frère dans le bassin du Marché-aux-Fleurs.\r\n+On commençait à faire au ministère de la marine une enquête sur cette\r\n+fatale frégate de la Méduse qui devait couvrir de honte Chaumareix et de\r\n+gloire Géricault. Le colonel Selves allait en Égypte pour y devenir\r\n+Soliman pacha. Le palais des Thermes, rue de la Harpe, servait de\r\n+boutique à un tonnelier. On voyait encore sur la plate-forme de la tour\r\n+octogone de l'hôtel de Cluny la petite logette en planches qui avait\r\n+servi d'observatoire à Messier, astronome de la marine sous Louis XVI.\r\n+La duchesse de Duras lisait à trois ou quatre amis, dans son boudoir\r\n+meublé d'X en satin bleu ciel, _Ourika_ inédite. On grattait les N au\r\n+Louvre. Le pont d'Austerlitz abdiquait et s'intitulait pont du Jardin du\r\n+Roi, double énigme qui déguisait à la fois le pont d'Austerlitz et le\r\n+jardin des Plantes. Louis XVIII, préoccupé, tout en annotant du coin de\r\n+l'ongle Horace, des héros qui se font empereurs et des sabotiers qui se\r\n+font dauphins, avait deux soucis: Napoléon et Mathurin Bruneau.\r\n+L'académie française donnait pour sujet de prix: _Le bonheur que procure\r\n+l'étude_. M. Bellart était officiellement éloquent. On voyait germer à \r\n+son ombre ce futur avocat général de Broè, promis aux sarcasmes de\r\n+Paul-Louis Courier. Il y avait un faux Chateaubriand appelé Marchangy,\r\n+en attendant qu'il y eut un faux Marchangy appelé d'Arlincourt. _Claire\r\n+d'Albe_ et _Malek-Adel_ étaient des chefs-d'oeuvre; madame Cottin était\r\n+déclarée le premier écrivain de l'époque. L'institut laissait rayer de\r\n+sa liste l'académicien Napoléon Bonaparte. Une ordonnance royale\r\n+érigeait Angoulême en école de marine, car, le duc d'Angoulême étant\r\n+grand amiral, il était évident que la ville d'Angoulême avait de droit\r\n+toutes les qualités d'un port de mer, sans quoi le principe monarchique\r\n+eût été entamé. On agitait en conseil des ministres la question de\r\n+savoir si l'on devait tolérer les vignettes représentant des voltiges\r\n+qui assaisonnaient les affiches de Franconi et qui attroupaient les\r\n+polissons des rues. M. Paër, auteur de l'_Agnese_, bonhomme à la face\r\n+carrée qui avait une verrue sur la joue, dirigeait les petits concerts\r\n+intimes de la marquise de Sassenaye, rue de la Ville-l'Évêque. Toutes\r\n+les jeunes filles chantaient _l'Ermite de Saint-Avelle_, paroles\r\n+d'Edmond Géraud. _Le Nain jaune_ se transformait en _Miroir_. Le café\r\n+Lemblin tenait pour l'empereur contre le café Valois qui tenait pour les\r\n+Bourbons. On venait de marier à une princesse de Sicile M. le duc de\r\n+Berry, déjà regardé du fond de l'ombre par Louvel. Il y avait un an que\r\n+madame de Staël était morte. Les gardes du corps sifflaient mademoiselle\r\n+Mars. Les grands journaux étaient tout petits. Le format était\r\n+restreint, mais la liberté était grande. _Le Constitutionnel_ était\r\n+constitutionnel. _La Minerve_ appelait Chateaubriand _Chateaubriant_. Ce\r\n+_t_ faisait beaucoup rire les bourgeois aux dépens du grand écrivain.\r\n+Dans des journaux vendus, des journalistes prostitués insultaient les\r\n+proscrits de 1815; David n'avait plus de talent, Arnault n'avait plus\r\n+d'esprit, Carnot n'avait plus de probité; Soult n'avait gagné aucune\r\n+bataille; il est vrai que Napoléon n'avait plus de génie. Personne\r\n+n'ignore qu'il est assez rare que les lettres adressées par la poste à \r\n+un exilé lui parviennent, les polices se faisant un religieux devoir de\r\n+les intercepter. Le fait n'est point nouveau; Descartes, banni, s'en\r\n+plaignait. Or, David ayant, dans un journal belge, montré quelque humeur\r\n+de ne pas recevoir les lettres qu'on lui écrivait, ceci paraissait\r\n+plaisant aux feuilles royalistes qui bafouaient à cette occasion le\r\n+proscrit. Dire: _les régicides_, ou dire: _les votants_, dire: _les\r\n+ennemis_, ou dire: _les alliés_, dire: _Napoléon_, ou dire: _Buonaparte_,\r\n+cela séparait deux hommes plus qu'un abîme. Tous les gens de bons sens\r\n+convenaient que l'ère des révolutions était à jamais fermée par le roi\r\n+Louis XVIII, surnommé «l'immortel auteur de la charte». Au terre-plein\r\n+du Pont-Neuf, on sculptait le mot _Redivivus_, sur le piédestal qui\r\n+attendait la statue de Henri IV. M. Piet ébauchait, rue Thérèse, n° 4,\r\n+son conciliabule pour consolider la monarchie. Les chefs de la droite\r\n+disaient dans les conjonctures graves: «Il faut écrire à Bacot». MM.\r\n+Canuel, O'Mahony et de Chappedelaine esquissaient, un peu approuvés de\r\n+Monsieur, ce qui devait être plus tard «la conspiration du bord de\r\n+l'eau». L'Épingle Noire complotait de son côté. Delaverderie s'abouchait\r\n+avec Trogoff. M. Decazes, esprit dans une certaine mesure libéral,\r\n+dominait. Chateaubriand, debout tous les matins devant sa fenêtre du n°\r\n+27 de la rue Saint-Dominique, en pantalon à pieds et en pantoufles, ses\r\n+cheveux gris coiffés d'un madras, les yeux fixés sur un miroir, une\r\n+trousse complète de chirurgien dentiste ouverte devant lui, se curait\r\n+les dents, qu'il avait charmantes, tout en dictant des variantes de _la\r\n+Monarchie selon la Charte_ à M. Pilorge, son secrétaire. La critique\r\n+faisant autorité préférait Lafon à Talma. M. de Féletz signait A.; M.\r\n+Hoffmann signait Z. Charles Nodier écrivait _Thérèse Aubert_. Le divorce\r\n+était aboli. Les lycées s'appelaient collèges. Les collégiens, ornés au\r\n+collet d'une fleur de lys d'or, s'y gourmaient à propos du roi de Rome.\r\n+La contre-police du château dénonçait à son altesse royale Madame le\r\n+portrait, partout exposé, de M. le duc d'Orléans, lequel avait meilleure\r\n+mine en uniforme de colonel général des houzards que M. le duc de Berry\r\n+en uniforme de colonel général des dragons; grave inconvénient. La ville\r\n+de Paris faisait redorer à ses frais le dôme des Invalides. Les hommes\r\n+sérieux se demandaient ce que ferait, dans telle ou telle occasion, M.\r\n+de Trinquelague; M. Clausel de Montals se séparait, sur divers points,\r\n+de M. Clausel de Coussergues; M. de Salaberry n'était pas content. Le\r\n+comédien Picard, qui était de l'Académie dont le comédien Molière\r\n+n'avait pu être, faisait jouer _les deux Philibert_ à l'Odéon, sur le\r\n+fronton duquel l'arrachement des lettres laissait encore lire\r\n+distinctement: THÉÂTRE DE L'IMPÉRATRICE. On prenait parti pour ou contre\r\n+Cugnet de Montarlot. Fabvier était factieux; Bavoux était\r\n+révolutionnaire. Le libraire Pélicier publiait une édition de Voltaire,\r\n+sous ce titre: _OEuvres de Voltaire_, de l'Académie française. «Cela\r\n+fait venir les acheteurs», disait cet éditeur naïf. L'opinion générale\r\n+était que M. Charles Loyson, serait le génie du siècle; l'envie\r\n+commençait à le mordre, signe de gloire; et l'on faisait sur lui ce\r\n+vers:\r\n+\r\n+_Même quand Loyson vole, on sent qu'il a des pattes._\r\n+\r\n+Le cardinal Fesch refusant de se démettre, M. de Pins, archevêque\r\n+d'Amasie, administrait le diocèse de Lyon. La querelle de la vallée des\r\n+Dappes commençait entre la Suisse et la France par un mémoire du\r\n+capitaine Dufour, depuis général. Saint-Simon, ignoré, échafaudait son\r\n+rêve sublime. Il y avait à l'académie des sciences un Fourier célèbre\r\n+que la postérité a oublié et dans je ne sais quel grenier un Fourier\r\n+obscur dont l'avenir se souviendra. Lord Byron commençait à poindre; une\r\n+note d'un poème de Millevoye l'annonçait à la France en ces termes: _un\r\n+certain lord Baron_. David d'Angers s'essayait à pétrir le marbre.\r\n+L'abbé Caron parlait avec éloge, en petit comité de séminaristes, dans\r\n+le cul-de-sac des Feuillantines, d'un prêtre inconnu nommé Félicité\r\n+Robert qui a été plus tard Lamennais. Une chose qui fumait et clapotait\r\n+sur la Seine avec le bruit d'un chien qui nage allait et venait sous les\r\n+fenêtres des Tuileries, du pont Royal au pont Louis XV c'était une\r\n+mécanique bonne à pas grand'chose, une espèce de joujou, une rêverie\r\n+d'inventeur songe-creux, une utopie: un bateau à vapeur. Les Parisiens\r\n+regardaient cette inutilité avec indifférence. M. de Vaublanc,\r\n+réformateur de l'Institut par coup d'État, ordonnance et fournée, auteur\r\n+distingué de plusieurs académiciens, après en avoir fait, ne pouvait\r\n+parvenir à l'être. Le faubourg Saint-Germain et la pavillon Marsan\r\n+souhaitaient pour préfet de police M. Delaveau, à cause de sa dévotion.\r\n+Dupuytren et Récamier se prenaient de querelle à l'amphithéâtre de\r\n+l'École de médecine et se menaçaient du poing à propos de la divinité de\r\n+Jésus-Christ. Cuvier, un oeil sur la Genèse et l'autre sur la nature,\r\n+s'efforçait de plaire à la réaction bigote en mettant les fossiles\r\n+d'accord avec les textes et en faisant flatter Moïse par les\r\n+mastodontes. M. François de Neufchâteau, louable cultivateur de la\r\n+mémoire de Parmentier, faisait mille efforts pour que _pomme de terre_\r\n+fût prononcée _parmentière_, et n'y réussissait point. L'abbé Grégoire,\r\n+ancien évêque, ancien conventionnel, ancien sénateur, était passé dans\r\n+la polémique royaliste à l'état «d'infâme Grégoire». Cette locution que\r\n+nous venons d'employer: _passer à l'état de_, était dénoncée comme\r\n+néologisme par M. Royer-Collard. On pouvait distinguer encore à sa\r\n+blancheur, sous la troisième arche du pont d'Iéna, la pierre neuve avec\r\n+laquelle, deux ans auparavant, on avait bouché le trou de mine pratiqué\r\n+par Blücher pour faire sauter le pont. La justice appelait à sa barre un\r\n+homme qui, en voyant entrer le comte d'Artois à Notre-Dame, avait dit\r\n+tout haut: _Sapristi! je regrette le temps où je voyais Bonaparte et\r\n+Talma entrer bras dessus bras dessous au Bal-Sauvage_. Propos séditieux.\r\n+Six mois de prison. Des traîtres se montraient déboutonnés; des hommes\r\n+qui avaient passé à l'ennemi la veille d'une bataille ne cachaient rien\r\n+de la récompense et marchaient impudiquement en plein soleil dans le\r\n+cynisme des richesses et des dignités; des déserteurs de Ligny et des\r\n+Quatre-Bras, dans le débraillé de leur turpitude payée, étalaient leur\r\n+dévouement monarchique tout nu; oubliant ce qui est écrit en Angleterre\r\n+sur la muraille intérieure des water-closets publics: _Please adjust\r\n+your dress before leaving_.\r\n+\r\n+Voilà , pêle-mêle, ce qui surnage confusément de l'année 1817, oubliée\r\n+aujourd'hui. L'histoire néglige presque toutes ces particularités, et ne\r\n+peut faire autrement; l'infini l'envahirait. Pourtant ces détails, qu'on\r\n+appelle à tort petits--il n'y a ni petits faits dans l'humanité, ni\r\n+petites feuilles dans la végétation--sont utiles. C'est de la\r\n+physionomie des années que se compose la figure des siècles.\r\n+\r\n+En cette année 1817, quatre jeunes Parisiens firent «une bonne farce».\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre II\r\n+\r\n+Double quatuor\r\n+\r\n+\r\n+Ces Parisiens étaient l'un de Toulouse, l'autre de Limoges, le troisième\r\n+de Cahors et le quatrième de Montauban; mais ils étaient étudiants, et\r\n+qui dit étudiant dit parisien; étudier à Paris, c'est naître à Paris.\r\n+\r\n+Ces jeunes gens étaient insignifiants; tout le monde a vu ces\r\n+figures-là ; quatre échantillons du premier venu; ni bons ni mauvais, ni\r\n+savants ni ignorants, ni des génies ni des imbéciles; beaux de ce\r\n+charmant avril qu'on appelle vingt ans. C'étaient quatre Oscars\r\n+quelconques, car à cette époque les Arthurs n'existaient pas encore.\r\n+_Brûlez pour lui les parfums d'Arabie_, s'écriait la romance, _Oscar\r\n+s'avance, Oscar, je vais le voir!_ On sortait d'Ossian, l'élégance était\r\n+scandinave et calédonienne, le genre anglais pur ne devait prévaloir que\r\n+plus tard, et le premier des Arthurs, Wellington, venait à peine de\r\n+gagner la bataille de Waterloo.\r\n+\r\n+Ces Oscars s'appelaient l'un Félix Tholomyès, de Toulouse; l'autre\r\n+Listolier, de Cahors; l'autre Fameuil, de Limoges; le dernier\r\n+Blachevelle, de Montauban. Naturellement chacun avait sa maîtresse.\r\n+Blachevelle aimait Favourite, ainsi nommée parce qu'elle était allée en\r\n+Angleterre; Listolier adorait Dahlia, qui avait pris pour nom de guerre\r\n+un nom de fleur; Fameuil idolâtrait Zéphine, abrégé de Joséphine;\r\n+Tholomyès avait Fantine, dite la Blonde à cause de ses beaux cheveux\r\n+couleur de soleil.\r\n+\r\n+Favourite, Dahlia, Zéphine et Fantine étaient quatre ravissantes filles,\r\n+parfumées et radieuses, encore un peu ouvrières, n'ayant pas tout à fait\r\n+quitté leur aiguille, dérangées par les amourettes, mais ayant sur le\r\n+visage un reste de la sérénité du travail et dans l'âme cette fleur\r\n+d'honnêteté qui dans la femme survit à la première chute. Il y avait une\r\n+des quatre qu'on appelait la jeune, parce qu'elle était la cadette; et\r\n+une qu'on appelait la vieille. La vieille avait vingt-trois ans. Pour ne\r\n+rien celer, les trois premières étaient plus expérimentées, plus\r\n+insouciantes et plus envolées dans le bruit de la vie que Fantine la\r\n+Blonde, qui en était à sa première illusion.\r\n+\r\n+Dahlia, Zéphine, et surtout Favourite, n'en auraient pu dire autant. Il\r\n+y avait déjà plus d'un épisode à leur roman à peine commencé, et\r\n+l'amoureux, qui s'appelait Adolphe au premier chapitre, se trouvait être\r\n+Alphonse au second, et Gustave au troisième. Pauvreté et coquetterie\r\n+sont deux conseillères fatales, l'une gronde, l'autre flatte; et les\r\n+belles filles du peuple les ont toutes les deux qui leur parlent bas à \r\n+l'oreille, chacune de son côté. Ces âmes mal gardées écoutent. De là les\r\n+chutes qu'elles font et les pierres qu'on leur jette. On les accable\r\n+avec la splendeur de tout ce qui est immaculé et inaccessible. Hélas! si\r\n+la _Yungfrau_ avait faim?\r\n+\r\n+Favourite, ayant été en Angleterre, avait pour admiratrices Zéphine et\r\n+Dahlia. Elle avait eu de très bonne heure un chez-soi. Son père était un\r\n+vieux professeur de mathématiques brutal et qui gasconnait; point marié,\r\n+courant le cachet malgré l'âge. Ce professeur, étant jeune, avait vu un\r\n+jour la robe d'une femme de chambre s'accrocher à un garde-cendre; il\r\n+était tombé amoureux de cet accident. Il en était résulté Favourite.\r\n+Elle rencontrait de temps en temps son père, qui la saluait. Un matin,\r\n+une vieille femme à l'air béguin était entrée chez elle et lui avait\r\n+dit:\r\n+\r\n+--Vous ne me connaissez pas, mademoiselle?\r\n+\r\n+--Non.\r\n+\r\n+--Je suis ta mère.\r\n+\r\n+Puis la vieille avait ouvert le buffet, bu et mangé, fait apporter un\r\n+matelas qu'elle avait, et s'était installée. Cette mère, grognon et\r\n+dévote, ne parlait jamais à Favourite, restait des heures sans souffler\r\n+mot, déjeunait, dînait et soupait comme quatre, et descendait faire\r\n+salon chez le portier, où elle disait du mal de sa fille.\r\n+\r\n+Ce qui avait entraîné Dahlia vers Listolier, vers d'autres peut-être,\r\n+vers l'oisiveté, c'était d'avoir de trop jolis ongles roses. Comment\r\n+faire travailler ces ongles-là ? Qui veut rester vertueuse ne doit pas\r\n+avoir pitié de ses mains. Quant à Zéphine, elle avait conquis Fameuil\r\n+par sa petite manière mutine et caressante de dire: «Oui, monsieur».\r\n+\r\n+Les jeunes gens étant camarades, les jeunes filles étaient amies. Ces\r\n+amours-là sont toujours doublés de ces amitiés-là .\r\n+\r\n+Sage et philosophe, c'est deux; et ce qui le prouve, c'est que, toutes\r\n+réserves faites sur ces petits ménages irréguliers, Favourite, Zéphine\r\n+et Dahlia étaient des filles philosophes, et Fantine une fille sage.\r\n+\r\n+Sage, dira-t-on? et Tholomyès? Salomon répondrait que l'amour fait\r\n+partie de la sagesse. Nous nous bornons à dire que l'amour de Fantine\r\n+était un premier amour, un amour unique, un amour fidèle.\r\n+\r\n+Elle était la seule des quatre qui ne fût tutoyée que par un seul.\r\n+\r\n+Fantine était un de ces êtres comme il en éclôt, pour ainsi dire, au\r\n+fond du peuple. Sortie des plus insondables épaisseurs de l'ombre\r\n+sociale, elle avait au front le signe de l'anonyme et de l'inconnu. Elle\r\n+était née à Montreuil-sur-mer. De quels parents? Qui pourrait le dire?\r\n+On ne lui avait jamais connu ni père ni mère. Elle se nommait Fantine.\r\n+Pourquoi Fantine? On ne lui avait jamais connu d'autre nom. À l'époque\r\n+de sa naissance, le Directoire existait encore. Point de nom de famille,\r\n+elle n'avait pas de famille; point de nom de baptême, l'église n'était\r\n+plus là . Elle s'appela comme il plut au premier passant qui la rencontra\r\n+toute petite, allant pieds nus dans la rue. Elle reçut un nom comme elle\r\n+recevait l'eau des nuées sur son front quand il pleuvait. On l'appela la\r\n+petite Fantine. Personne n'en savait davantage. Cette créature humaine\r\n+était venue dans la vie comme cela. À dix ans, Fantine quitta la ville\r\n+et s'alla mettre en service chez des fermiers des environs. À quinze\r\n+ans, elle vint à Paris \u0022chercher fortune\u0022. Fantine était belle et resta\r\n+pure le plus longtemps qu'elle put. C'était une jolie blonde avec de\r\n+belles dents. Elle avait de l'or et des perles pour dot, mais son or\r\n+était sur sa tête et ses perles étaient dans sa bouche.\r\n+\r\n+Elle travailla pour vivre; puis, toujours pour vivre, car le coeur a sa\r\n+faim aussi, elle aima.\r\n+\r\n+Elle aima Tholomyès.\r\n+\r\n+Amourette pour lui, passion pour elle. Les rues du quartier latin,\r\n+qu'emplit le fourmillement des étudiants et des grisettes, virent le\r\n+commencement de ce songe. Fantine, dans ces dédales de la colline du\r\n+Panthéon, où tant d'aventures se nouent et se dénouent, avait fui\r\n+longtemps Tholomyès, mais de façon à le rencontrer toujours. Il y a une\r\n+manière d'éviter qui ressemble à chercher. Bref, l'églogue eut lieu.\r\n+\r\n+Blachevelle, Listolier et Fameuil formaient une sorte de groupe dont\r\n+Tholomyès était la tête. C'était lui qui avait l'esprit.\r\n+\r\n+Tholomyès était l'antique étudiant vieux; il était riche; il avait\r\n+quatre mille francs de rente; quatre mille francs de rente, splendide\r\n+scandale sur la montagne Sainte-Geneviève. Tholomyès était un viveur de\r\n+trente ans, mal conservé. Il était ridé et édenté; et il ébauchait une\r\n+calvitie dont il disait lui-même sans tristesse: _crâne à trente ans,\r\n+genou à quarante_. Il digérait médiocrement, et il lui était venu un\r\n+larmoiement à un oeil. Mais à mesure que sa jeunesse s'éteignait, il\r\n+allumait sa gaîté; il remplaçait ses dents par des lazzis, ses cheveux\r\n+par la joie, sa santé par l'ironie, et son oeil qui pleurait riait sans\r\n+cesse. Il était délabré, mais tout en fleurs. Sa jeunesse, pliant bagage\r\n+bien avant l'âge, battait en retraite en bon ordre, éclatait de rire, et\r\n+l'on n'y voyait que du feu. Il avait eu une pièce refusée au Vaudeville.\r\n+Il faisait çà et là des vers quelconques. En outre, il doutait\r\n+supérieurement de toute chose, grande force aux yeux des faibles. Donc,\r\n+étant ironique et chauve, il était le chef. _Iron_ est un mot anglais\r\n+qui veut dire fer. Serait-ce de là que viendrait ironie?\r\n+\r\n+Un jour Tholomyès prit à part les trois autres, fît un geste d'oracle,\r\n+et leur dit:\r\n+\r\n+--Il y a bientôt un an que Fantine, Dahlia, Zéphine et Favourite nous\r\n+demandent de leur faire une surprise. Nous la leur avons promise\r\n+solennellement. Elles nous en parlent toujours, à moi surtout. De même\r\n+qu'à Naples les vieilles femmes crient à saint Janvier: _Faccia\r\n+gialluta, fa o miracolo_. Face jaune, fais ton miracle! nos belles me\r\n+disent sans cesse: «Tholomyès, quand accoucheras-tu de ta surprise?» En\r\n+même temps nos parents nous écrivent. Scie des deux côtés. Le moment me\r\n+semble venu. Causons.\r\n+\r\n+Sur ce, Tholomyès baissa la voix, et articula mystérieusement quelque\r\n+chose de si gai qu'un vaste et enthousiaste ricanement sortit des quatre\r\n+bouches à la fois et que Blachevelle s'écria:\r\n+\r\n+--Ça, c'est une idée!\r\n+\r\n+Un estaminet plein de fumée se présenta, ils y entrèrent, et le reste de\r\n+leur conférence se perdit dans l'ombre.\r\n+\r\n+Le résultat de ces ténèbres fut une éblouissante partie de plaisir qui\r\n+eut lieu le dimanche suivant, les quatre jeunes gens invitant les quatre\r\n+jeunes filles.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre III\r\n+\r\n+Quatre à quatre\r\n+\r\n+\r\n+Ce qu'était une partie de campagne d'étudiants et de grisettes, il y a\r\n+quarante-cinq ans, on se le représente malaisément aujourd'hui. Paris\r\n+n'a plus les mêmes environs; la figure de ce qu'on pourrait appeler la\r\n+vie circumparisienne a complètement changé depuis un demi-siècle; où il\r\n+y avait le coucou, il y a le wagon; où il y avait la patache, il y a le\r\n+bateau à vapeur; on dit aujourd'hui Fécamp comme on disait Saint-Cloud.\r\n+Le Paris de 1862 est une ville qui a la France pour banlieue.\r\n+\r\n+Les quatre couples accomplirent consciencieusement toutes les folies\r\n+champêtres possibles alors. On entrait dans les vacances, et c'était une\r\n+chaude et claire journée d'été. La veille, Favourite, la seule qui sût\r\n+écrire, avait écrit ceci à Tholomyès au nom des quatre: «C'est un bonne\r\n+heure de sortir de bonheur.» C'est pourquoi ils se levèrent à cinq\r\n+heures du matin. Puis ils allèrent à Saint-Cloud par le coche,\r\n+regardèrent la cascade à sec, et s'écrièrent: «Cela doit être bien beau\r\n+quand il y a de l'eau!» déjeunèrent à la _Tête-Noire_, où Castaing\r\n+n'avait pas encore passé, se payèrent une partie de bagues au quinconce\r\n+du grand bassin, montèrent à la lanterne de Diogène, jouèrent des\r\n+macarons à la roulette du pont de Sèvres, cueillirent des bouquets à \r\n+Puteaux, achetèrent des mirlitons à Neuilly, mangèrent partout des\r\n+chaussons de pommes, furent parfaitement heureux.\r\n+\r\n+Les jeunes filles bruissaient et bavardaient comme des fauvettes\r\n+échappées. C'était un délire. Elles donnaient par moments de petites\r\n+tapes aux jeunes gens. Ivresse matinale de la vie! Adorables années!\r\n+L'aile des libellules frissonne. Oh! qui que vous soyez, vous\r\n+souvenez-vous? Avez-vous marché dans les broussailles, en écartant les\r\n+branches à cause de la tête charmante qui vient derrière vous? Avez-vous\r\n+glissé en riant sur quelque talus mouillé par la pluie avec une femme\r\n+aimée qui vous retient par la main et qui s'écrie: «Ah! mes brodequins\r\n+tout neufs! dans quel état ils sont!»\r\n+\r\n+Disons tout de suite que cette joyeuse contrariété, une ondée, manqua à \r\n+cette compagnie de belle humeur, quoique Favourite eût dit en partant,\r\n+avec un accent magistral et maternel: _Les limaces se promènent dans les\r\n+sentiers. Signe de pluie, mes enfants_.\r\n+\r\n+Toutes quatre étaient follement jolies. Un bon vieux poète classique,\r\n+alors en renom, un bonhomme qui avait une Éléonore, M. le chevalier de\r\n+Labouïsse, errant ce jour-là sous les marronniers de Saint-Cloud, les\r\n+vit passer vers dix heures du matin; il s'écria: _Il y en a une de\r\n+trop_, songeant aux Grâces. Favourite, l'amie de Blachevelle, celle de\r\n+vingt-trois ans, la vieille, courait en avant sous les grandes branches\r\n+vertes, sautait les fossés, enjambait éperdument les buissons, et\r\n+présidait cette gaîté avec une verve de jeune faunesse. Zéphine et\r\n+Dahlia, que le hasard avait faites belles de façon qu'elles se faisaient\r\n+valoir en se rapprochant et se complétaient, ne se quittaient point, par\r\n+instinct de coquetterie plus encore que par amitié, et, appuyées l'une à \r\n+l'autre, prenaient des poses anglaises; les premiers _keepsakes_\r\n+venaient de paraître, la mélancolie pointait pour les femmes, comme,\r\n+plus tard, le byronisme pour les hommes, et les cheveux du sexe tendre\r\n+commençaient à s'éplorer. Zéphine et Dahlia étaient coiffées en\r\n+rouleaux. Listolier et Fameuil, engagés dans une discussion sur leurs\r\n+professeurs, expliquaient à Fantine la différence qu'il y avait entre M.\r\n+Delvincourt et M. Blondeau.\r\n+\r\n+Blachevelle semblait avoir été créé expressément pour porter sur son\r\n+bras le dimanche le châle-ternaux boiteux de Favourite.\r\n+\r\n+Tholomyès suivait, dominant le groupe. Il était très gai, mais on\r\n+sentait en lui le gouvernement; il y avait de la dictature dans sa\r\n+jovialité; son ornement principal était un pantalon jambes-d'éléphant,\r\n+en nankin, avec sous-pieds de tresse de cuivre; il avait un puissant\r\n+rotin de deux cents francs à la main, et, comme il se permettait tout,\r\n+une chose étrange appelée cigare, à la bouche. Rien n'étant sacré pour\r\n+lui, il fumait.\r\n+\r\n+--Ce Tholomyès est étonnant, disaient les autres avec vénération. Quels\r\n+pantalons! quelle énergie!\r\n+\r\n+Quant à Fantine, c'était la joie. Ses dents splendides avaient\r\n+évidemment reçu de Dieu une fonction, le rire. Elle portait à sa main\r\n+plus volontiers que sur sa tête son petit chapeau de paille cousue, aux\r\n+longues brides blanches. Ses épais cheveux blonds, enclins à flotter et\r\n+facilement dénoués et qu'il fallait rattacher sans cesse, semblaient\r\n+faits pour la fuite de Galatée sous les saules. Ses lèvres roses\r\n+babillaient avec enchantement. Les coins de sa bouche voluptueusement\r\n+relevés, comme aux mascarons antiques d'Érigone, avaient l'air\r\n+d'encourager les audaces; mais ses longs cils pleins d'ombre\r\n+s'abaissaient discrètement sur ce brouhaha du bas du visage comme pour\r\n+mettre le holà . Toute sa toilette avait on ne sait quoi de chantant et\r\n+de flambant. Elle avait une robe de barège mauve, de petits\r\n+souliers-cothurnes mordorés dont les rubans traçaient des X sur son fin\r\n+bas blanc à jour, et cette espèce de spencer en mousseline, invention\r\n+marseillaise, dont le nom, canezou, corruption du mot _quinze août_\r\n+prononcé à la Canebière, signifie beau temps, chaleur et midi. Les trois\r\n+autres, moins timides, nous l'avons dit, étaient décolletées tout net,\r\n+ce qui, l'été, sous des chapeaux couverts de fleurs, a beaucoup de grâce\r\n+et d'agacerie; mais, à côté de ces ajustements hardis, le canezou de la\r\n+blonde Fantine, avec ses transparences, ses indiscrétions et ses\r\n+réticences, cachant et montrant à la fois, semblait une trouvaille\r\n+provocante de la décence, et la fameuse cour d'amour, présidée par la\r\n+vicomtesse de Cette aux yeux vert de mer, eût peut-être donné le prix de\r\n+la coquetterie à ce canezou qui concourait pour la chasteté. Le plus\r\n+naïf est quelquefois le plus savant. Cela arrive.\r\n+\r\n+Éclatante de face, délicate de profil, les yeux d'un bleu profond, les\r\n+paupières grasses, les pieds cambrés et petits, les poignets et les\r\n+chevilles admirablement emboîtés, la peau blanche laissant voir çà et là \r\n+les arborescences azurées des veines, la joue puérile et franche, le cou\r\n+robuste des Junons éginétiques, la nuque forte et souple, les épaules\r\n+modelées comme par Coustou, ayant au centre une voluptueuse fossette\r\n+visible à travers la mousseline; une gaîté glacée de rêverie;\r\n+sculpturale et exquise; telle était Fantine; et l'on devinait sous ces\r\n+chiffons une statue, et dans cette statue une âme.\r\n+\r\n+Fantine était belle, sans trop le savoir. Les rares songeurs, prêtres\r\n+mystérieux du beau, qui confrontent silencieusement toute chose à la\r\n+perfection, eussent entrevu en cette petite ouvrière, à travers la\r\n+transparence de la grâce parisienne, l'antique euphonie sacrée. Cette\r\n+fille de l'ombre avait de la race. Elle était belle sous les deux\r\n+espèces, qui sont le style et le rythme. Le style est la forme de\r\n+l'idéal; le rythme en est le mouvement.\r\n+\r\n+Nous avons dit que Fantine était la joie, Fantine était aussi la pudeur.\r\n+\r\n+Pour un observateur qui l'eût étudiée attentivement, ce qui se dégageait\r\n+d'elle, à travers toute cette ivresse de l'âge, de la saison et de\r\n+l'amourette, c'était une invincible expression de retenue et de\r\n+modestie. Elle restait un peu étonnée. Ce chaste étonnement-là est la\r\n+nuance qui sépare Psyché de Vénus. Fantine avait les longs doigts blancs\r\n+et fins de la vestale qui remue les cendres du feu sacré avec une\r\n+épingle d'or. Quoiqu'elle n'eût rien refusé, on ne le verra que trop, à \r\n+Tholomyès, son visage, au repos, était souverainement virginal; une\r\n+sorte de dignité sérieuse et presque austère l'envahissait soudainement\r\n+à de certaines heures, et rien n'était singulier et troublant comme de\r\n+voir la gaîté s'y éteindre si vite et le recueillement y succéder sans\r\n+transition à l'épanouissement. Cette gravité subite, parfois sévèrement\r\n+accentuée, ressemblait au dédain d'une déesse. Son front, son nez et son\r\n+menton offraient cet équilibre de ligne, très distinct de l'équilibre de\r\n+proportion, et d'où résulte l'harmonie du visage; dans l'intervalle si\r\n+caractéristique qui sépare la base du nez de la lèvre supérieure, elle\r\n+avait ce pli imperceptible et charmant, signe mystérieux de la chasteté\r\n+qui rendit Barberousse amoureux d'une Diane trouvée dans les fouilles\r\n+d'Icône.\r\n+\r\n+L'amour est une faute; soit. Fantine était l'innocence surnageant sur la\r\n+faute.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IV\r\n+\r\n+Tholomyès est si joyeux qu'il chante une chanson espagnole\r\n+\r\n+\r\n+Cette journée-là était d'un bout à l'autre faite d'aurore. Toute la\r\n+nature semblait avoir congé, et rire. Les parterres de Saint-Cloud\r\n+embaumaient; le souffle de la Seine remuait vaguement les feuilles;\r\n+les branches gesticulaient dans le vent; les abeilles mettaient les\r\n+jasmins au pillage; toute une bohème de papillons s'ébattait dans les\r\n+achillées, les trèfles et les folles avoines; il y avait dans l'auguste\r\n+parc du roi de France un tas de vagabonds, les oiseaux.\r\n+\r\n+Les quatre joyeux couples, mêlés au soleil, aux champs, aux fleurs, aux\r\n+arbres, resplendissaient.\r\n+\r\n+Et, dans cette communauté de paradis, parlant, chantant, courant,\r\n+dansant, chassant aux papillons, cueillant des liserons, mouillant leurs\r\n+bas à jour roses dans les hautes herbes, fraîches, folles, point\r\n+méchantes, toutes recevaient un peu çà et là les baisers de tous,\r\n+excepté Fantine, enfermée dans sa vague résistance rêveuse et farouche,\r\n+et qui aimait.\r\n+\r\n+--Toi, lui disait Favourite, tu as toujours l'air chose.\r\n+\r\n+Ce sont là les joies. Ces passages de couples heureux sont un appel\r\n+profond à la vie et à la nature, et font sortir de tout la caresse et la\r\n+lumière. Il y avait une fois une fée qui fit les prairies et les arbres\r\n+exprès pour les amoureux. De là cette éternelle école buissonnière des\r\n+amants qui recommence sans cesse et qui durera tant qu'il y aura des\r\n+buissons et des écoliers. De là la popularité du printemps parmi les\r\n+penseurs. Le patricien et le gagne-petit, le duc et pair et le robin,\r\n+les gens de la cour et les gens de la ville, comme on parlait autrefois,\r\n+tous sont sujets de cette fée. On rit, on se cherche, il y a dans l'air\r\n+une clarté d'apothéose, quelle transfiguration que d'aimer! Les clercs\r\n+de notaire sont des dieux. Et les petits cris, les poursuites dans\r\n+l'herbe, les tailles prises au vol, ces jargons qui sont des mélodies,\r\n+ces adorations qui éclatent dans la façon de dire une syllabe, ces\r\n+cerises arrachées d'une bouche à l'autre, tout cela flamboie et passe\r\n+dans des gloires célestes. Les belles filles font un doux gaspillage\r\n+d'elles-mêmes. On croit que cela ne finira jamais. Les philosophes, les\r\n+poètes, les peintres regardent ces extases et ne savent qu'en faire,\r\n+tant cela les éblouit. Le départ pour Cythère! s'écrie Watteau; Lancret,\r\n+le peintre de la roture, contemple ses bourgeois envolés dans le bleu;\r\n+Diderot tend les bras à toutes ces amourettes, et d'Urfé y mêle des\r\n+druides.\r\n+\r\n+Après le déjeuner les quatre couples étaient allés voir, dans ce qu'on\r\n+appelait alors le carré du roi, une plante nouvellement arrivée de\r\n+l'Inde, dont le nom nous échappe en ce moment, et qui à cette époque\r\n+attirait tout Paris à Saint-Cloud; c'était un bizarre et charmant\r\n+arbrisseau haut sur tige, dont les innombrables branches fines comme des\r\n+fils, ébouriffées, sans feuilles, étaient couvertes d'un million de\r\n+petites rosettes blanches; ce qui faisait que l'arbuste avait l'air\r\n+d'une chevelure pouilleuse de fleurs. Il y avait toujours foule à \r\n+l'admirer.\r\n+\r\n+L'arbuste vu, Tholomyès s'était écrié: «J'offre des ânes!» et, prix fait\r\n+avec un ânier, ils étaient revenus par Vanves et Issy. À Issy, incident.\r\n+Le parc, Bien National possédé à cette époque par le munitionnaire\r\n+Bourguin, était d'aventure tout grand ouvert. Ils avaient franchi la\r\n+grille, visité l'anachorète mannequin dans sa grotte, essayé les petits\r\n+effets mystérieux du fameux cabinet des miroirs, lascif traquenard digne\r\n+d'un satyre devenu millionnaire ou de Turcaret métamorphosé en Priape.\r\n+Ils avaient robustement secoué le grand filet balançoire attaché aux\r\n+deux châtaigniers célébrés par l'abbé de Bernis. Tout en y balançant ces\r\n+belles l'une après l'autre, ce qui faisait, parmi les rires universels,\r\n+des plis de jupe envolée où Greuze eût trouvé son compte, le toulousain\r\n+Tholomyès, quelque peu espagnol, Toulouse est cousine de Tolosa,\r\n+chantait, sur une mélopée mélancolique, la vieille chanson _gallega_\r\n+probablement inspirée par quelque belle fille lancée à toute volée sur\r\n+une corde entre deux arbres:\r\n+\r\n+ _Soy de Badajoz._\r\n+ _Amor me llama._\r\n+ _Toda mi alma_\r\n+ _Es en mi ojos_\r\n+ _Porque enseñas_\r\n+ _À tus piernas._\r\n+\r\n+Fantine seule refusa de se balancer.\r\n+\r\n+--Je n'aime pas qu'on ait du genre comme ça, murmura assez aigrement\r\n+Favourite.\r\n+\r\n+Les ânes quittés, joie nouvelle; on passa la Seine en bateau, et de\r\n+Passy, à pied, ils gagnèrent la barrière de l'Étoile. Ils étaient, on\r\n+s'en souvient, debout depuis cinq heures du matin; mais, bah! _il n'y a\r\n+pas de lassitude le dimanche_, disait Favourite; _le dimanche, la\r\n+fatigue ne travaille pas_. Vers trois heures les quatre couples, effarés\r\n+de bonheur, dégringolaient aux montagnes russes, édifice singulier qui\r\n+occupait alors les hauteurs Beaujon et dont on apercevait la ligne\r\n+serpentante au-dessus des arbres des Champs-Élysées.\r\n+\r\n+De temps en temps Favourite s'écriait:\r\n+\r\n+--Et la surprise? je demande la surprise.\r\n+\r\n+--Patience, répondait Tholomyès.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre V\r\n+\r\n+Chez Bombarda\r\n+\r\n+\r\n+Les montagnes russes épuisées, on avait songé au dîner; et le radieux\r\n+huitain, enfin un peu las, s'était échoué au cabaret Bombarda,\r\n+succursale qu'avait établie aux Champs-Élysées ce fameux restaurateur\r\n+Bombarda, dont on voyait alors l'enseigne rue de Rivoli à côté du\r\n+passage Delorme.\r\n+\r\n+Une chambre grande, mais laide, avec alcôve et lit au fond (vu la\r\n+plénitude du cabaret le dimanche, il avait fallu accepter ce gîte); deux\r\n+fenêtres d'où l'on pouvait contempler, à travers les ormes, le quai et\r\n+la rivière; un magnifique rayon d'août effleurant les fenêtres; deux\r\n+tables; sur l'une une triomphante montagne de bouquets mêlés à des\r\n+chapeaux d'hommes et de femmes; à l'autre les quatre couples attablés\r\n+autour d'un joyeux encombrement de plats, d'assiettes, de verres et de\r\n+bouteilles; des cruchons de bière mêlés à des flacons de vin; peu\r\n+d'ordre sur la table, quelque désordre dessous;\r\n+\r\n+ _Ils faisaient sous la table_\r\n+ _Un bruit, un trique-trac de pieds épouvantable_\r\n+\r\n+dit Molière.\r\n+\r\n+Voilà où en était vers quatre heures et demie du soir la bergerade\r\n+commencée à cinq heures du matin. Le soleil déclinait, l'appétit\r\n+s'éteignait.\r\n+\r\n+Les Champs-Élysées, pleins de soleil et de foule, n'étaient que lumière\r\n+et poussière, deux choses dont se compose la gloire. Les chevaux de\r\n+Marly, ces marbres hennissants, se cabraient dans un nuage d'or. Les\r\n+carrosses allaient et venaient. Un escadron de magnifiques gardes du\r\n+corps, clairon en tête, descendait l'avenue de Neuilly; le drapeau\r\n+blanc, vaguement rose au soleil couchant, flottait sur le dôme des\r\n+Tuileries. La place de la Concorde, redevenue alors place Louis XV,\r\n+regorgeait de promeneurs contents. Beaucoup portaient la fleur de lys\r\n+d'argent suspendue au ruban blanc moiré qui, en 1817, n'avait pas encore\r\n+tout à fait disparu des boutonnières. Çà et là au milieu des passants\r\n+faisant cercle et applaudissant, des rondes de petites filles jetaient\r\n+au vent une bourrée bourbonienne alors célèbre, destinée à foudroyer les\r\n+Cent-Jours, et qui avait pour ritournelle:\r\n+\r\n+ _Rendez-nous notre père de Gand,_\r\n+ _Rendez-nous notre père._\r\n+\r\n+Des tas de faubouriens endimanchés, parfois même fleurdelysés comme les\r\n+bourgeois, épars dans le grand carré et dans le carré Marigny, jouaient\r\n+aux bagues et tournaient sur les chevaux de bois; d'autres buvaient;\r\n+quelques-uns, apprentis imprimeurs, avaient des bonnets de papier; on\r\n+entendait leurs rires. Tout était radieux. C'était un temps de paix\r\n+incontestable et de profonde sécurité royaliste; c'était l'époque où un\r\n+rapport intime et spécial du préfet de police Anglès au roi sur les\r\n+faubourgs de Paris se terminait par ces lignes: «Tout bien considéré,\r\n+sire, il n'y a rien à craindre de ces gens-là . Ils sont insouciants et\r\n+indolents comme des chats. Le bas peuple des provinces est remuant,\r\n+celui de Paris ne l'est pas. Ce sont tous petits hommes. Sire, il en\r\n+faudrait deux bout à bout pour faire un de vos grenadiers. Il n'y a\r\n+point de crainte du côté de la populace de la capitale. Il est\r\n+remarquable que la taille a encore décru dans cette population depuis\r\n+cinquante ans; et le peuple des faubourgs de Paris est plus petit\r\n+qu'avant la révolution. Il n'est point dangereux. En somme, c'est de la\r\n+canaille bonne.»\r\n+\r\n+Qu'un chat puisse se changer en lion, les préfets de police ne le\r\n+croient pas possible; cela est pourtant, et c'est là le miracle du\r\n+peuple de Paris. Le chat d'ailleurs, si méprisé du comte Anglès, avait\r\n+l'estime des républiques antiques; il incarnait à leurs yeux la liberté,\r\n+et, comme pour servir de pendant à la Minerve aptère du Pirée, il y\r\n+avait sur la place publique de Corinthe le colosse de bronze d'un chat.\r\n+La police naïve de la restauration voyait trop «en beau» le peuple de\r\n+Paris. Ce n'est point, autant qu'on le croit, de la «canaille bonne». Le\r\n+Parisien est au Français ce que l'Athénien était au Grec; personne ne\r\n+dort mieux que lui, personne n'est plus franchement frivole et paresseux\r\n+que lui, personne mieux que lui n'a l'air d'oublier; qu'on ne s'y fie\r\n+pas pourtant; il est propre à toute sorte de nonchalance, mais, quand il\r\n+y a de la gloire au bout, il est admirable à toute espèce de furie.\r\n+Donnez-lui une pique, il fera le 10 août; donnez-lui un fusil, vous\r\n+aurez Austerlitz. Il est le point d'appui de Napoléon et la ressource de\r\n+Danton. S'agit-il de la patrie? il s'enrôle; s'agit-il de la liberté? il\r\n+dépave. Gare! ses cheveux pleins de colère sont épiques; sa blouse se\r\n+drape en chlamyde. Prenez garde. De la première rue Greneta venue, il\r\n+fera des fourches caudines. Si l'heure sonne, ce faubourien va grandir,\r\n+ce petit homme va se lever, et il regardera d'une façon terrible, et son\r\n+souffle deviendra tempête, et il sortira de cette pauvre poitrine grêle\r\n+assez de vent pour déranger les plis des Alpes. C'est grâce au\r\n+faubourien de Paris que la révolution, mêlée aux armées, conquiert\r\n+l'Europe. Il chante, c'est sa joie. Proportionnez sa chanson à sa\r\n+nature, et vous verrez! Tant qu'il n'a pour refrain que la Carmagnole,\r\n+il ne renverse que Louis XVI; faites-lui chanter la Marseillaise, il\r\n+délivrera le monde.\r\n+\r\n+Cette note écrite en marge du rapport Anglès, nous revenons à nos quatre\r\n+couples. Le dîner, comme nous l'avons dit, s'achevait.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VI\r\n+\r\n+Chapitre où l'on s'adore\r\n+\r\n+\r\n+Propos de table et propos d'amour; les uns sont aussi insaisissables que\r\n+les autres; les propos d'amour sont des nuées, les propos de table sont\r\n+des fumées.\r\n+\r\n+Fameuil et Dahlia fredonnaient; Tholomyès buvait; Zéphine riait, Fantine\r\n+souriait. Listolier soufflait dans une trompette de bois achetée à \r\n+Saint-Cloud. Favourite regardait tendrement Blachevelle et disait:\r\n+\r\n+--Blachevelle, je t'adore.\r\n+\r\n+Ceci amena une question de Blachevelle:\r\n+\r\n+--Qu'est-ce que tu ferais, Favourite, si je cessais de t'aimer?\r\n+\r\n+--Moi! s'écria Favourite. Ah! ne dis pas cela, même pour rire! Si tu\r\n+cessais de m'aimer, je te sauterais après, je te grifferais, je te\r\n+gratignerais, je te jetterais de l'eau, je te ferais arrêter.\r\n+\r\n+Blachevelle sourit avec la fatuité voluptueuse d'un homme chatouillé à \r\n+l'amour-propre. Favourite reprit:\r\n+\r\n+--Oui, je crierais à la garde! Ah! je me gênerais par exemple! Canaille!\r\n+\r\n+Blachevelle, extasié, se renversa sur sa chaise et ferma\r\n+orgueilleusement les deux yeux.\r\n+\r\n+Dahlia, tout en mangeant, dit bas à Favourite dans le brouhaha:\r\n+\r\n+--Tu l'idolâtres donc bien, ton Blachevelle?\r\n+\r\n+--Moi, je le déteste, répondit Favourite du même ton en ressaisissant sa\r\n+fourchette. Il est avare. J'aime le petit d'en face de chez moi. Il est\r\n+très bien, ce jeune homme-là , le connais-tu? On voit qu'il a le genre\r\n+d'être acteur. J'aime les acteurs. Sitôt qu'il rentre, sa mère dit: «Ah!\r\n+mon Dieu! ma tranquillité est perdue. Le voilà qui va crier. Mais, mon\r\n+ami, tu me casses la tête!» Parce qu'il va dans la maison, dans des\r\n+greniers à rats, dans des trous noirs, si haut qu'il peut monter,--et\r\n+chanter, et déclamer, est-ce que je sais, moi? qu'on l'entend d'en bas!\r\n+Il gagne déjà vingt sous par jour chez un avoué à écrire de la chicane.\r\n+Il est fils d'un ancien chantre de Saint-Jacques-du-Haut-Pas. Ah! il est\r\n+très bien. Il m'idolâtre tant qu'un jour qu'il me voyait faire de la\r\n+pâte pour des crêpes, il m'a dit: _Mamselle, faites des beignets de vos\r\n+gants et je les mangerai_. Il n'y a que les artistes pour dire des\r\n+choses comme ça. Ah! il est très bien. Je suis en train d'être insensée\r\n+de ce petit-là . C'est égal, je dis à Blachevelle que je l'adore. Comme\r\n+je mens! Hein? comme je mens!\r\n+\r\n+Favourite fit une pause, et continua:\r\n+\r\n+--Dahlia, vois-tu, je suis triste. Il n'a fait que pleuvoir tout l'été,\r\n+le vent m'agace, le vent ne décolère pas, Blachevelle est très pingre,\r\n+c'est à peine s'il y a des petits pois au marché, on ne sait que manger,\r\n+j'ai le spleen, comme disent les Anglais, le beurre est si cher! et\r\n+puis, vois, c'est une horreur, nous dînons dans un endroit où il y a un\r\n+lit, ça me dégoûte de la vie.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VII\r\n+\r\n+Sagesse de Tholomyès\r\n+\r\n+\r\n+Cependant, tandis que quelques-uns chantaient, les autres causaient\r\n+tumultueusement, et tous ensemble; ce n'était plus que du bruit.\r\n+Tholomyès intervint:\r\n+\r\n+--Ne parlons point au hasard ni trop vite, s'écria-t-il. Méditons si\r\n+nous voulons être éblouissants. Trop d'improvisation vide bêtement\r\n+l'esprit. Bière qui coule n'amasse point de mousse. Messieurs, pas de\r\n+hâte. Mêlons la majesté à la ripaille; mangeons avec recueillement;\r\n+festinons lentement. Ne nous pressons pas. Voyez le printemps; s'il se\r\n+dépêche, il est flambé, c'est-à -dire gelé. L'excès de zèle perd les\r\n+pêchers et les abricotiers. L'excès de zèle tue la grâce et la joie des\r\n+bons dîners. Pas de zèle, messieurs! Grimod de la Reynière est de l'avis\r\n+de Talleyrand.\r\n+\r\n+Une sourde rébellion gronda dans le groupe.\r\n+\r\n+--Tholomyès, laisse-nous tranquilles, dit Blachevelle.\r\n+\r\n+--À bas le tyran! dit Fameuil.\r\n+\r\n+--Bombarda, Bombance et Bamboche! cria Listolier.\r\n+\r\n+--Le dimanche existe, reprit Fameuil.\r\n+\r\n+--Nous sommes sobres, ajouta Listolier.\r\n+\r\n+--Tholomyès, fit Blachevelle, contemple mon calme.\r\n+\r\n+--Tu en es le marquis, répondit Tholomyès.\r\n+\r\n+Ce médiocre jeu de mots fit l'effet d'une pierre dans une mare. Le\r\n+marquis de Montcalm était un royaliste alors célèbre. Toutes les\r\n+grenouilles se turent.\r\n+\r\n+--Amis, s'écria Tholomyès, de l'accent d'un homme qui ressaisit\r\n+l'empire, remettez-vous. Il ne faut pas que trop de stupeur accueille ce\r\n+calembour tombé du ciel. Tout ce qui tombe de la sorte n'est pas\r\n+nécessairement digne d'enthousiasme et de respect. Le calembour est la\r\n+fiente de l'esprit qui vole. Le lazzi tombe n'importe où; et l'esprit,\r\n+après la ponte d'une bêtise, s'enfonce dans l'azur. Une tache blanchâtre\r\n+qui s'aplatit sur le rocher n'empêche pas le condor de planer. Loin de\r\n+moi l'insulte au calembour! Je l'honore dans la proportion de ses\r\n+mérites; rien de plus. Tout ce qu'il y a de plus auguste, de plus\r\n+sublime et de plus charmant dans l'humanité, et peut-être hors de\r\n+l'humanité, a fait des jeux de mots. Jésus-Christ a fait un calembour\r\n+sur saint Pierre, Moïse sur Isaac, Eschyle sur Polynice, Cléopâtre sur\r\n+Octave. Et notez que ce calembour de Cléopâtre a précédé la bataille\r\n+d'Actium, et que, sans lui, personne ne se souviendrait de la ville de\r\n+Toryne, nom grec qui signifie cuiller à pot. Cela concédé, je reviens à \r\n+mon exhortation. Mes frères, je le répète, pas de zèle, pas de\r\n+tohu-bohu, pas d'excès, même en pointes, gaîtés, liesses et jeux de\r\n+mots. Écoutez-moi, j'ai la prudence d'Amphiaraüs et la calvitie de\r\n+César. Il faut une limite, même aux rébus. _Est modus in rebus_. Il faut\r\n+une limite, même aux dîners. Vous aimez les chaussons aux pommes,\r\n+mesdames, n'en abusez pas. Il faut, même en chaussons, du bon sens et de\r\n+l'art. La gloutonnerie châtie le glouton. Gula punit Gulax.\r\n+L'indigestion est chargée par le bon Dieu de faire de la morale aux\r\n+estomacs. Et, retenez ceci: chacune de nos passions, même l'amour, a un\r\n+estomac qu'il ne faut pas trop remplir. En toute chose il faut écrire à \r\n+temps le mot _finis_, il faut se contenir, quand cela devient urgent,\r\n+tirer le verrou sur son appétit, mettre au violon sa fantaisie et se\r\n+mener soi-même au poste. Le sage est celui qui sait à un moment donné\r\n+opérer sa propre arrestation. Ayez quelque confiance en moi. Parce que\r\n+j'ai fait un peu mon droit, à ce que me disent mes examens, parce que je\r\n+sais la différence qu'il y a entre la question mue et la question\r\n+pendante, parce que j'ai soutenu une thèse en latin sur la manière dont\r\n+on donnait la torture à Rome au temps où Munatius Demens était questeur\r\n+du Parricide, parce que je vais être docteur, à ce qu'il paraît, il ne\r\n+s'ensuit pas de toute nécessité que je sois un imbécile. Je vous\r\n+recommande la modération dans vos désirs. Vrai comme je m'appelle Félix\r\n+Tholomyès, je parle bien. Heureux celui qui, lorsque l'heure a sonné,\r\n+prend un parti héroïque, et abdique comme Sylla, ou Origène!\r\n+\r\n+Favourite écoutait avec une attention profonde.\r\n+\r\n+--Félix! dit-elle, quel joli mot! j'aime ce nom-là . C'est en latin. Ça\r\n+veut dire Prosper.\r\n+\r\n+Tholomyès poursuivit:\r\n+\r\n+--Quirites, gentlemen, Caballeros, mes amis! voulez-vous ne sentir aucun\r\n+aiguillon et vous passer de lit nuptial et braver l'amour? Rien de plus\r\n+simple. Voici la recette: la limonade, l'exercice outré, le travail\r\n+forcé, éreintez-vous, traînez des blocs, ne dormez pas, veillez,\r\n+gorgez-vous de boissons nitreuses et de tisanes de nymphaeas, savourez\r\n+des émulsions de pavots et d'agnuscastus, assaisonnez-moi cela d'une\r\n+diète sévère, crevez de faim, et joignez-y les bains froids, les\r\n+ceintures d'herbes, l'application d'une plaque de plomb, les lotions\r\n+avec la liqueur de Saturne et les fomentations avec l'oxycrat.\r\n+\r\n+--J'aime mieux une femme, dit Listolier.\r\n+\r\n+--La femme! reprit Tholomyès, méfiez-vous-en. Malheur à celui qui se\r\n+livre au coeur changeant de la femme! La femme est perfide et tortueuse.\r\n+Elle déteste le serpent par jalousie de métier. Le serpent, c'est la\r\n+boutique en face.\r\n+\r\n+--Tholomyès, cria Blachevelle, tu es ivre!\r\n+\r\n+--Pardieu! dit Tholomyès.\r\n+\r\n+--Alors sois gai, reprit Blachevelle.\r\n+\r\n+Et, remplissant son verre, il se leva:\r\n+\r\n+--Gloire au vin! _Nunc te, Bacche, canam_! Pardon, mesdemoiselles, c'est\r\n+de l'espagnol. Et la preuve, señoras, la voici: tel peuple, telle\r\n+futaille. L'arrobe de Castille contient seize litres, le cantaro\r\n+d'Alicante douze, l'almude des Canaries vingt-cinq, le cuartin des\r\n+Baléares vingt-six, la botte du czar Pierre trente. Vive ce czar qui\r\n+était grand, et vive sa botte qui était plus grande encore! Mesdames, un\r\n+conseil d'ami: trompez-vous de voisin, si bon vous semble. Le propre de\r\n+l'amour, c'est d'errer. L'amourette n'est pas faite pour s'accroupir et\r\n+s'abrutir comme une servante anglaise qui a le calus du scrobage aux\r\n+genoux. Elle n'est pas faite pour cela, elle erre gaîment, la douce\r\n+amourette! On a dit: l'erreur est humaine; moi je dis: l'erreur est\r\n+amoureuse. Mesdames, je vous idolâtre toutes. Ô Zéphine, ô Joséphine,\r\n+figure plus que chiffonnée, vous seriez charmante, si vous n'étiez de\r\n+travers. Vous avez l'air d'un joli visage sur lequel, par mégarde, on\r\n+s'est assis. Quant à Favourite, ô nymphes et muses! un jour que\r\n+Blachevelle passait le ruisseau de la rue Guérin-Boisseau, il vit une\r\n+belle fille aux bas blancs et bien tirés qui montrait ses jambes. Ce\r\n+prologue lui plut, et Blachevelle aima. Celle qu'il aima était\r\n+Favourite. Ô Favourite, tu as des lèvres ioniennes. Il y avait un\r\n+peintre grec, appelé Euphorion, qu'on avait surnommé le peintre des\r\n+lèvres. Ce Grec seul eût été digne de peindre ta bouche! Écoute! avant\r\n+toi, il n'y avait pas de créature digne de ce nom. Tu es faite pour\r\n+recevoir la pomme comme Vénus ou pour la manger comme Ève. La beauté\r\n+commence à toi. Je viens de parler d'Ève, c'est toi qui l'as créée. Tu\r\n+mérites le brevet d'invention de la jolie femme. Ô Favourite, je cesse\r\n+de vous tutoyer, parce que je passe de la poésie à la prose. Vous\r\n+parliez de mon nom tout à l'heure. Cela m'a attendri; mais, qui que nous\r\n+soyons, méfions-nous des noms. Ils peuvent se tromper. Je me nomme Félix\r\n+et ne suis pas heureux. Les mots sont des menteurs. N'acceptons pas\r\n+aveuglément les indications qu'ils nous donnent. Ce serait une erreur\r\n+d'écrire à Liège pour avoir des bouchons et à Pau pour avoir des gants.\r\n+Miss Dahlia, à votre place, je m'appellerais Rosa. Il faut que la fleur\r\n+sente bon et que la femme ait de l'esprit. Je ne dis rien de Fantine,\r\n+c'est une songeuse, une rêveuse, une pensive, une sensitive; c'est un\r\n+fantôme ayant la forme d'une nymphe et la pudeur d'une nonne, qui se\r\n+fourvoie dans la vie de grisette, mais qui se réfugie dans les\r\n+illusions, et qui chante, et qui prie, et qui regarde l'azur sans trop\r\n+savoir ce qu'elle voit ni ce qu'elle fait, et qui, les yeux au ciel,\r\n+erre dans un jardin où il y a plus d'oiseaux qu'il n'en existe! Ô\r\n+Fantine, sache ceci: moi Tholomyès, je suis une illusion; mais elle ne\r\n+m'entend même pas, la blonde fille des chimères! Du reste, tout en elle\r\n+est fraîcheur, suavité, jeunesse, douce clarté matinale. Ô Fantine,\r\n+fille digne de vous appeler marguerite ou perle, vous êtes une femme du\r\n+plus bel orient. Mesdames, un deuxième conseil: ne vous mariez point; le\r\n+mariage est une greffe; cela prend bien ou mal; fuyez ce risque. Mais,\r\n+bah! qu'est-ce que je chante là ? Je perds mes paroles. Les filles sont\r\n+incurables sur l'épousaille; et tout ce que nous pouvons dire, nous\r\n+autres sages, n'empêchera point les giletières et les piqueuses de\r\n+bottines de rêver des maris enrichis de diamants. Enfin, soit; mais,\r\n+belles, retenez ceci: vous mangez trop de sucre. Vous n'avez qu'un tort,\r\n+ô femmes, c'est de grignoter du sucre. Ô sexe rongeur, tes jolies\r\n+petites dents blanches adorent le sucre. Or, écoutez bien, le sucre est\r\n+un sel. Tout sel est desséchant. Le sucre est le plus desséchant de tous\r\n+les sels. Il pompe à travers les veines les liquides du sang; de là la\r\n+coagulation, puis la solidification du sang; de là les tubercules dans\r\n+le poumon; de là la mort. Et c'est pourquoi le diabète confine à la\r\n+phthisie. Donc ne croquez pas de sucre, et vous vivrez! Je me tourne\r\n+vers les hommes. Messieurs, faites des conquêtes. Pillez-vous les uns\r\n+aux autres sans remords vos bien-aimées. Chassez-croisez. En amour, il\r\n+n'y a pas d'amis. Partout où il y a une jolie femme l'hostilité est\r\n+ouverte. Pas de quartier, guerre à outrance! Une jolie femme est un\r\n+casus belli; une jolie femme est un flagrant délit. Toutes les invasions\r\n+de l'histoire sont déterminées par des cotillons. La femme est le droit\r\n+de l'homme. Romulus a enlevé les Sabines, Guillaume a enlevé les\r\n+Saxonnes, César a enlevé les Romaines. L'homme qui n'est pas aimé plane\r\n+comme un vautour sur les amantes d'autrui; et quant à moi, à tous ces\r\n+infortunés qui sont veufs, je jette la proclamation sublime de Bonaparte\r\n+à l'armée d'Italie: «Soldats, vous manquez de tout. L'ennemi en a.»\r\n+\r\n+Tholomyès s'interrompit.\r\n+\r\n+--Souffle, Tholomyès, dit Blachevelle.\r\n+\r\n+En même temps, Blachevelle, appuyé de Listolier et de Fameuil, entonna\r\n+sur un air de complainte une de ces chansons d'atelier composées des\r\n+premiers mots venus, rimées richement et pas du tout, vides de sens\r\n+comme le geste de l'arbre et le bruit du vent, qui naissent de la vapeur\r\n+des pipes et se dissipent et s'envolent avec elle. Voici par quel\r\n+couplet le groupe donna la réplique à la harangue de Tholomyès:\r\n+\r\n+Les pères dindons donnèrent de l'argent à un agent pour que mons\r\n+Clermont-Tonnerre fût fait pape à la Saint-Jean; Mais Clermont ne put\r\n+pas être fait pape, n'étant pas prêtre.\r\n+\r\n+Alors leur agent rageant leur rapporta leur argent.\r\n+\r\n+Ceci n'était pas fait pour calmer l'improvisation de Tholomyès; il vida\r\n+son verre, le remplit, et recommença.\r\n+\r\n+--À bas la sagesse! oubliez tout ce que j'ai dit. Ne soyons ni prudes,\r\n+ni prudents, ni prud'hommes. Je porte un toast à l'allégresse; soyons\r\n+allègres! Complétons notre cours de droit par la folie et la nourriture.\r\n+Indigestion et digeste. Que Justinien soit le mâle et que Ripaille soit\r\n+la femelle! Joie dans les profondeurs! Vis, ô création! Le monde est un\r\n+gros diamant! Je suis heureux. Les oiseaux sont étonnants. Quelle fête\r\n+partout! Le rossignol est un Elleviou gratis. Été, je te salue. Ô\r\n+Luxembourg, ô Géorgiques de la rue Madame et de l'allée de\r\n+l'Observatoire! Ô pioupious rêveurs! ô toutes ces bonnes charmantes qui,\r\n+tout en gardant des enfants, s'amusent à en ébaucher! Les pampas de\r\n+l'Amérique me plairaient, si je n'avais les arcades de l'Odéon. Mon âme\r\n+s'envole dans les forêts vierges et dans les savanes. Tout est beau. Les\r\n+mouches bourdonnent dans les rayons. Le soleil a éternué le colibri.\r\n+Embrasse-moi, Fantine!\r\n+\r\n+Il se trompa, et embrassa Favourite.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VIII\r\n+\r\n+Mort d'un cheval\r\n+\r\n+\r\n+--On dîne mieux chez Edon que chez Bombarda, s'écria Zéphine.\r\n+\r\n+--Je préfère Bombarda à Edon, déclara Blachevelle. Il a plus de luxe.\r\n+C'est plus asiatique. Voyez la salle d'en bas. Il y a des glaces sur les\r\n+murs.\r\n+\r\n+--J'en aime mieux dans mon assiette, dit Favourite.\r\n+\r\n+Blachevelle insista:\r\n+\r\n+--Regardez les couteaux. Les manches sont en argent chez Bombarda, et en\r\n+os chez Edon. Or, l'argent est plus précieux que l'os.\r\n+\r\n+--Excepté pour ceux qui ont un menton d'argent, observa Tholomyès.\r\n+\r\n+Il regardait en cet instant-là le dôme des Invalides, visible des\r\n+fenêtres de Bombarda.\r\n+\r\n+Il y eut une pause.\r\n+\r\n+--Tholomyès, cria Fameuil, tout à l'heure, Listolier et moi, nous avions\r\n+une discussion.\r\n+\r\n+--Une discussion est bonne, répondit Tholomyès, une querelle vaut mieux.\r\n+\r\n+--Nous disputions philosophie.\r\n+\r\n+--Soit.\r\n+\r\n+--Lequel préfères-tu de Descartes ou de Spinosa?\r\n+\r\n+--Désaugiers, dit Tholomyès.\r\n+\r\n+Cet arrêt rendu, il but et reprit:\r\n+\r\n+--Je consens à vivre. Tout n'est pas fini sur la terre, puisqu'on peut\r\n+encore déraisonner. J'en rends grâces aux dieux immortels. On ment, mais\r\n+on rit. On affirme, mais on doute. L'inattendu jaillit du syllogisme.\r\n+C'est beau. Il est encore ici-bas des humains qui savent joyeusement\r\n+ouvrir et fermer la boîte à surprises du paradoxe. Ceci, mesdames, que\r\n+vous buvez d'un air tranquille, est du vin de Madère, sachez-le, du cru\r\n+de Coural das Freiras qui est à trois cent dix-sept toises au-dessus du\r\n+niveau de la mer! Attention en buvant! trois cent dix-sept toises! et\r\n+monsieur Bombarda, le magnifique restaurateur, vous donne ces trois cent\r\n+dix-sept toises pour quatre francs cinquante centimes!\r\n+\r\n+Fameuil interrompit de nouveau:\r\n+\r\n+--Tholomyès, tes opinions font loi. Quel est ton auteur favori?\r\n+\r\n+--Ber....\r\n+\r\n+--Quin?\r\n+\r\n+--Non. Choux.\r\n+\r\n+Et Tholomyès poursuivit:\r\n+\r\n+--Honneur à Bombarda! il égalerait Munophis d'Elephanta s'il pouvait me\r\n+cueillir une almée, et Thygélion de Chéronée s'il pouvait m'apporter une\r\n+hétaïre! car, ô mesdames, il y avait des Bombarda en Grèce et en Égypte.\r\n+C'est Apulée qui nous l'apprend. Hélas! toujours les mêmes choses et\r\n+rien de nouveau. Plus rien d'inédit dans la création du créateur! _Nil\r\n+sub sole novum_, dit Salomon; _amor omnibus idem_, dit Virgile; et\r\n+Carabine monte avec Carabin dans la galiote de Saint-Cloud, comme\r\n+Aspasie s'embarquait avec Périclès sur la flotte de Samos. Un dernier\r\n+mot. Savez-vous ce que c'était qu'Aspasie, mesdames? Quoiqu'elle vécût\r\n+dans un temps où les femmes n'avaient pas encore d'âme, c'était une âme;\r\n+une âme d'une nuance rose et pourpre, plus embrasée que le feu, plus\r\n+franche que l'aurore. Aspasie était une créature en qui se touchaient\r\n+les deux extrêmes de la femme; c'était la prostituée déesse. Socrate,\r\n+plus Manon Lescaut. Aspasie fut créée pour le cas où il faudrait une\r\n+catin à Prométhée.\r\n+\r\n+Tholomyès, lancé, se serait difficilement arrêté, si un cheval ne se fût\r\n+abattu sur le quai en cet instant-là même. Du choc, la charrette et\r\n+l'orateur restèrent court. C'était une jument beauceronne, vieille et\r\n+maigre et digne de l'équarrisseur, qui traînait une charrette fort\r\n+lourde. Parvenue devant Bombarda, la bête, épuisée et accablée, avait\r\n+refusé d'aller plus loin. Cet incident avait fait de la foule. À peine\r\n+le charretier, jurant et indigné, avait-il eu le temps de prononcer avec\r\n+l'énergie convenable le mot sacramentel: _mâtin_! appuyé d'un implacable\r\n+coup de fouet, que la haridelle était tombée pour ne plus se relever. Au\r\n+brouhaha des passants, les gais auditeurs de Tholomyès tournèrent la\r\n+tête, et Tholomyès en profita pour clore son allocution par cette\r\n+strophe mélancolique:\r\n+\r\n+ _Elle était de ce monde où coucous et carrosses_\r\n+ _Ont le même destin,_\r\n+ _Et, rosse, elle a vécu ce que vivent les rosses,_\r\n+ _L'espace d'un: mâtin!_\r\n+\r\n+--Pauvre cheval, soupira Fantine.\r\n+\r\n+Et Dahlia s'écria:\r\n+\r\n+--Voilà Fantine qui va se mettre à plaindre les chevaux! Peut-on être\r\n+fichue bête comme ça!\r\n+\r\n+En ce moment, Favourite, croisant les bras et renversant la tête en\r\n+arrière, regarda résolûment Tholomyès et dit:\r\n+\r\n+--Ah çà ! et la surprise?\r\n+\r\n+--Justement. L'instant est arrivé, répondit Tholomyès. Messieurs,\r\n+l'heure de la surprise a sonné. Mesdames, attendez-nous un moment.\r\n+\r\n+--Cela commence par un baiser, dit Blachevelle.\r\n+\r\n+--Sur le front, ajouta Tholomyès.\r\n+\r\n+Chacun déposa gravement un baiser sur le front de sa maîtresse; puis ils\r\n+se dirigèrent vers la porte tous les quatre à la file, en mettant leur\r\n+doigt sur la bouche.\r\n+\r\n+Favourite battit des mains à leur sortie.\r\n+\r\n+--C'est déjà amusant, dit-elle.\r\n+\r\n+--Ne soyez pas trop longtemps, murmura Fantine. Nous vous attendons.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IX\r\n+\r\n+Fin joyeuse de la joie\r\n+\r\n+\r\n+Les jeunes filles, restées seules, s'accoudèrent deux à deux sur l'appui\r\n+des fenêtres, jasant, penchant leur tête et se parlant d'une croisée à \r\n+l'autre.\r\n+\r\n+Elles virent les jeunes gens sortir du cabaret Bombarda bras dessus bras\r\n+dessous; ils se retournèrent, leur firent des signes en riant, et\r\n+disparurent dans cette poudreuse cohue du dimanche qui envahit\r\n+hebdomadairement les Champs-Élysées.\r\n+\r\n+--Ne soyez pas longtemps! cria Fantine.\r\n+\r\n+--Que vont-ils nous rapporter? dit Zéphine.\r\n+\r\n+--Pour sûr ce sera joli, dit Dahlia.\r\n+\r\n+--Moi, reprit Favourite, je veux que ce soit en or.\r\n+\r\n+Elles furent bientôt distraites par le mouvement du bord de l'eau\r\n+qu'elles distinguaient dans les branches des grands arbres et qui les\r\n+divertissait fort. C'était l'heure du départ des malles-poste et des\r\n+diligences. Presque toutes les messageries du midi et de l'ouest\r\n+passaient alors par les Champs-Élysées. La plupart suivaient le quai et\r\n+sortaient par la barrière de Passy. De minute en minute, quelque grosse\r\n+voiture peinte en jaune et en noir, pesamment chargée, bruyamment\r\n+attelée, difforme à force de malles, de bâches et de valises, pleine de\r\n+têtes tout de suite disparues, broyant la chaussée, changeant tous les\r\n+pavés en briquets, se ruait à travers la foule avec toutes les\r\n+étincelles d'une forge, de la poussière pour fumée, et un air de furie.\r\n+Ce vacarme réjouissait les jeunes filles. Favourite s'exclamait:\r\n+\r\n+--Quel tapage! on dirait des tas de chaînes qui s'envolent.\r\n+\r\n+Il arriva une fois qu'une de ces voitures qu'on distinguait\r\n+difficilement dans l'épaisseur des ormes, s'arrêta un moment, puis\r\n+repartit au galop. Cela étonna Fantine.\r\n+\r\n+--C'est particulier! dit-elle. Je croyais que la diligence ne s'arrêtait\r\n+jamais. Favourite haussa les épaules.\r\n+\r\n+--Cette Fantine est surprenante. Je viens la voir par curiosité. Elle\r\n+s'éblouit des choses les plus simples. Une supposition; je suis un\r\n+voyageur, je dis à la diligence: je vais en avant, vous me prendrez sur\r\n+le quai en passant. La diligence passe, me voit, s'arrête, et me prend.\r\n+Cela se fait tous les jours. Tu ne connais pas la vie, ma chère.\r\n+\r\n+Un certain temps s'écoula ainsi. Tout à coup Favourite eut le mouvement\r\n+de quelqu'un qui se réveille.\r\n+\r\n+--Eh bien, fit-elle, et la surprise?\r\n+\r\n+--À propos, oui, reprit Dahlia, la fameuse surprise?\r\n+\r\n+--Ils sont bien longtemps! dit Fantine.\r\n+\r\n+Comme Fantine achevait ce soupir, le garçon qui avait servi le dîner\r\n+entra. Il tenait à la main quelque chose qui ressemblait à une lettre.\r\n+\r\n+--Qu'est-ce que cela? demanda Favourite.\r\n+\r\n+Le garçon répondit:\r\n+\r\n+--C'est un papier que ces messieurs ont laissé pour ces dames.\r\n+\r\n+--Pourquoi ne l'avoir pas apporté tout de suite?\r\n+\r\n+--Parce que ces messieurs, reprit le garçon, ont commandé de ne le\r\n+remettre à ces dames qu'au bout d'une heure.\r\n+\r\n+Favourite arracha le papier des mains du garçon. C'était une lettre en\r\n+effet.\r\n+\r\n+--Tiens! dit-elle. Il n'y a pas d'adresse. Mais voici ce qui est écrit\r\n+dessus:\r\n+\r\n+Ceci est la surprise.\r\n+\r\n+Elle décacheta vivement la lettre, l'ouvrit et lut (elle savait lire):\r\n+\r\n+«Ô nos amantes!\r\n+\r\n+«Sachez que nous avons des parents. Des parents, vous ne connaissez pas\r\n+beaucoup ça. Ça s'appelle des pères et mères dans le code civil, puéril\r\n+et honnête. Or, ces parents gémissent, ces vieillards nous réclament,\r\n+ces bons hommes et ces bonnes femmes nous appellent enfants prodigues,\r\n+ils souhaitent nos retours, et nous offrent de tuer des veaux. Nous leur\r\n+obéissons, étant vertueux. À l'heure où vous lirez ceci, cinq chevaux\r\n+fougueux nous rapporteront à nos papas et à nos mamans. Nous fichons le\r\n+camp, comme dit Bossuet. Nous partons, nous sommes partis. Nous fuyons\r\n+dans les bras de Laffitte et sur les ailes de Caillard. La diligence de\r\n+Toulouse nous arrache à l'abîme, et l'abîme c'est vous, ô nos belles\r\n+petites! Nous rentrons dans la société, dans le devoir et dans l'ordre,\r\n+au grand trot, à raison de trois lieues à l'heure. Il importe à la\r\n+patrie que nous soyons, comme tout le monde, préfets, pères de famille,\r\n+gardes champêtres et conseillers d'État. Vénérez-nous. Nous nous\r\n+sacrifions. Pleurez-nous rapidement et remplacez-nous vite. Si cette\r\n+lettre vous déchire, rendez-le-lui. Adieu.\r\n+\r\n+«Pendant près de deux ans, nous vous avons rendues heureuses. Ne nous en\r\n+gardez pas rancune.\r\n+\r\n+«Signé: Blachevelle.\r\n+\r\n+«Fameuil.\r\n+\r\n+«Listolier.\r\n+\r\n+«Félix Tholomyès\r\n+\r\n+«Post-scriptum. Le dîner est payé.»\r\n+\r\n+Les quatre jeunes filles se regardèrent.\r\n+\r\n+Favourite rompit la première le silence.\r\n+\r\n+--Eh bien! s'écria-t-elle, c'est tout de même une bonne farce.\r\n+\r\n+--C'est très drôle, dit Zéphine.\r\n+\r\n+--Ce doit être Blachevelle qui a eu cette idée-là , reprit Favourite. Ça\r\n+me rend amoureuse de lui. Sitôt parti, sitôt aimé. Voilà l'histoire.\r\n+\r\n+--Non, dit Dahlia, c'est une idée à Tholomyès. Ça se reconnaît.\r\n+\r\n+--En ce cas, reprit Favourite, mort à Blachevelle et vive Tholomyès!\r\n+\r\n+--Vive Tholomyès! crièrent Dahlia et Zéphine.\r\n+\r\n+Et elles éclatèrent de rire.\r\n+\r\n+Fantine rit comme les autres.\r\n+\r\n+Une heure après, quand elle fut rentrée dans sa chambre, elle pleura.\r\n+C'était, nous l'avons dit, son premier amour; elle s'était donnée à ce\r\n+Tholomyès comme à un mari, et la pauvre fille avait un enfant.\r\n+\r\n+\r\n+\r\n+\r\n+Livre quatrième--Confier, c'est quelquefois livrer\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre I\r\n+\r\n+Une mère qui en rencontre une autre\r\n+\r\n+\r\n+Il y avait, dans le premier quart de ce siècle, à Montfermeil, près de\r\n+Paris, une façon de gargote qui n'existe plus aujourd'hui. Cette gargote\r\n+était tenue par des gens appelés Thénardier, mari et femme. Elle était\r\n+située dans la ruelle du Boulanger. On voyait au-dessus de la porte une\r\n+planche clouée à plat sur le mur. Sur cette planche était peint quelque\r\n+chose qui ressemblait à un homme portant sur son dos un autre homme,\r\n+lequel avait de grosses épaulettes de général dorées avec de larges\r\n+étoiles argentées; des taches rouges figuraient du sang; le reste du\r\n+tableau était de la fumée et représentait probablement une bataille. Au\r\n+bas on lisait cette inscription: _Au Sergent de Waterloo._\r\n+\r\n+Rien n'est plus ordinaire qu'un tombereau ou une charrette à la porte\r\n+d'une auberge. Cependant le véhicule ou, pour mieux dire, le fragment de\r\n+véhicule qui encombrait la rue devant la gargote du Sergent de Waterloo,\r\n+un soir du printemps de 1818, eût certainement attiré par sa masse\r\n+l'attention d'un peintre qui eût passé là .\r\n+\r\n+C'était l'avant-train d'un de ces fardiers, usités dans les pays de\r\n+forêts, et qui servent à charrier des madriers et des troncs d'arbres.\r\n+Cet avant-train se composait d'un massif essieu de fer à pivot où\r\n+s'emboîtait un lourd timon, et que supportaient deux roues démesurées.\r\n+Tout cet ensemble était trapu, écrasant et difforme. On eût dit l'affût\r\n+d'un canon géant. Les ornières avaient donné aux roues, aux jantes, aux\r\n+moyeux, à l'essieu et au timon, une couche de vase, hideux badigeonnage\r\n+jaunâtre assez semblable à celui dont on orne volontiers les\r\n+cathédrales. Le bois disparaissait sous la boue et le fer sous la\r\n+rouille. Sous l'essieu pendait en draperie une grosse chaîne digne de\r\n+Goliath forçat. Cette chaîne faisait songer, non aux poutres qu'elle\r\n+avait fonction de transporter, mais aux mastodontes et aux mammons\r\n+qu'elle eût pu atteler; elle avait un air de bagne, mais de bagne\r\n+cyclopéen et surhumain, et elle semblait détachée de quelque monstre.\r\n+Homère y eût lié Polyphème et Shakespeare Caliban.\r\n+\r\n+Pourquoi cet avant-train de fardier était-il à cette place dans la rue?\r\n+D'abord, pour encombrer la rue; ensuite pour achever de se rouiller. Il\r\n+y a dans le vieil ordre social une foule d'institutions qu'on trouve de\r\n+la sorte sur son passage en plein air et qui n'ont pas pour être là \r\n+d'autres raisons.\r\n+\r\n+Le centre de la chaîne pendait sous l'essieu assez près de terre, et sur\r\n+la courbure, comme sur la corde d'une balançoire, étaient assises et\r\n+groupées, ce soir-là , dans un entrelacement exquis, deux petites filles,\r\n+l'une d'environ deux ans et demi, l'autre de dix-huit mois, la plus\r\n+petite dans les bras de la plus grande. Un mouchoir savamment noué les\r\n+empêchait de tomber. Une mère avait vu cette effroyable chaîne, et avait\r\n+dit: Tiens! voilà un joujou pour mes enfants.\r\n+\r\n+Les deux enfants, du reste gracieusement attifées, et avec quelque\r\n+recherche, rayonnaient; on eût dit deux roses dans de la ferraille;\r\n+leurs yeux étaient un triomphe; leurs fraîches joues riaient. L'une\r\n+était châtain, l'autre était brune. Leurs naïfs visages étaient deux\r\n+étonnements ravis; un buisson fleuri qui était près de là envoyait aux\r\n+passants des parfums qui semblaient venir d'elles; celle de dix-huit\r\n+mois montrait son gentil ventre nu avec cette chaste indécence de la\r\n+petitesse.\r\n+\r\n+Au-dessus et autour de ces deux têtes délicates, pétries dans le bonheur\r\n+et trempées dans la lumière, le gigantesque avant-train, noir de\r\n+rouille, presque terrible, tout enchevêtré de courbes et d'angles\r\n+farouches, s'arrondissait comme un porche de caverne. À quelques pas,\r\n+accroupie sur le seuil de l'auberge, la mère, femme d'un aspect peu\r\n+avenant du reste, mais touchante en ce moment-là , balançait les deux\r\n+enfants au moyen d'une longue ficelle, les couvant des yeux de peur\r\n+d'accident avec cette expression animale et céleste propre à la\r\n+maternité; à chaque va-et-vient, les hideux anneaux jetaient un bruit\r\n+strident qui ressemblait à un cri de colère; les petites filles\r\n+s'extasiaient, le soleil couchant se mêlait à cette joie, et rien\r\n+n'était charmant comme ce caprice du hasard, qui avait fait d'une chaîne\r\n+de titans une escarpolette de chérubins.\r\n+\r\n+Tout en berçant ses deux petites, la mère chantonnait d'une voix fausse\r\n+une romance alors célèbre:\r\n+\r\n+ _Il le faut, disait un guerrier._\r\n+\r\n+Sa chanson et la contemplation de ses filles l'empêchaient d'entendre et\r\n+de voir ce qui se passait dans la rue.\r\n+\r\n+Cependant quelqu'un s'était approché d'elle, comme elle commençait le\r\n+premier couplet de la romance, et tout à coup elle entendit une voix qui\r\n+disait très près de son oreille:\r\n+\r\n+--Vous avez là deux jolis enfants, madame, répondit la mère, continuant\r\n+sa romance:\r\n+\r\n+ _À la belle et tendre Imogine._\r\n+\r\n+répondit la mère, continuant sa romance, puis elle tourna la tête.\r\n+\r\n+Une femme était devant elle, à quelques pas. Cette femme, elle aussi,\r\n+avait un enfant qu'elle portait dans ses bras.\r\n+\r\n+Elle portait en outre un assez gros sac de nuit qui semblait fort lourd.\r\n+\r\n+L'enfant de cette femme était un des plus divins êtres qu'on pût voir.\r\n+C'était une fille de deux à trois ans. Elle eût pu jouter avec les deux\r\n+autres pour la coquetterie de l'ajustement; elle avait un bavolet de\r\n+linge fin, des rubans à sa brassière et de la valenciennes à son bonnet.\r\n+Le pli de sa jupe relevée laissait voir sa cuisse blanche, potelée et\r\n+ferme. Elle était admirablement rose et bien portante. La belle petite\r\n+donnait envie de mordre dans les pommes de ses joues. On ne pouvait rien\r\n+dire de ses yeux, sinon qu'ils devaient être très grands et qu'ils\r\n+avaient des cils magnifiques. Elle dormait.\r\n+\r\n+Elle dormait de ce sommeil d'absolue confiance propre à son âge. Les\r\n+bras des mères sont faits de tendresse; les enfants y dorment\r\n+profondément.\r\n+\r\n+Quant à la mère, l'aspect en était pauvre et triste. Elle avait la mise\r\n+d'une ouvrière qui tend à redevenir paysanne. Elle était jeune.\r\n+Était-elle belle? peut-être; mais avec cette mise il n'y paraissait pas.\r\n+Ses cheveux, d'où s'échappait une mèche blonde, semblaient fort épais,\r\n+mais disparaissaient sévèrement sous une coiffe de béguine, laide,\r\n+serrée, étroite, et nouée au menton. Le rire montre les belles dents\r\n+quand on en a; mais elle ne riait point. Ses yeux ne semblaient pas être\r\n+secs depuis très longtemps. Elle était pâle; elle avait l'air très lasse\r\n+et un peu malade; elle regardait sa fille endormie dans ses bras avec\r\n+cet air particulier d'une mère qui a nourri son enfant. Un large\r\n+mouchoir bleu, comme ceux où se mouchent les invalides, plié en fichu,\r\n+masquait lourdement sa taille. Elle avait les mains hâlées et toutes\r\n+piquées de taches de rousseur, l'index durci et déchiqueté par\r\n+l'aiguille, une Mante brune de laine bourrue, une robe de toile et de\r\n+gros souliers. C'était Fantine.\r\n+\r\n+C'était Fantine. Difficile à reconnaître. Pourtant, à l'examiner\r\n+attentivement, elle avait toujours sa beauté. Un pli triste, qui\r\n+ressemblait à un commencement d'ironie, ridait sa joue droite. Quant à \r\n+sa toilette, cette aérienne toilette de mousseline et de rubans qui\r\n+semblait faite avec de la gaîté, de la folie et de la musique, pleine de\r\n+grelots et parfumée de lilas, elle s'était évanouie comme ces beaux\r\n+givres éclatants qu'on prend pour des diamants au soleil; ils fondent et\r\n+laissent la branche toute noire.\r\n+\r\n+Dix mois s'étaient écoulés depuis «la bonne farce».\r\n+\r\n+Que s'était-il passé pendant ces dix mois? on le devine.\r\n+\r\n+Après l'abandon, la gêne. Fantine avait tout de suite perdu de vue\r\n+Favourite, Zéphine et Dahlia; le lien, brisé du côté des hommes, s'était\r\n+défait du côté des femmes; on les eût bien étonnées, quinze jours après,\r\n+si on leur eût dit qu'elles étaient amies; cela n'avait plus de raison\r\n+d'être. Fantine était restée seule. Le père de son enfant parti,--hélas!\r\n+ces ruptures-là sont irrévocables,--elle se trouva absolument isolée,\r\n+avec l'habitude du travail de moins et le goût du plaisir de plus.\r\n+Entraînée par sa liaison avec Tholomyès à dédaigner le petit métier\r\n+qu'elle savait, elle avait négligé ses débouchés; ils s'étaient fermés.\r\n+Nulle ressource. Fantine savait à peine lire et ne savait pas écrire; on\r\n+lui avait seulement appris dans son enfance à signer son nom; elle avait\r\n+fait écrire par un écrivain public une lettre à Tholomyès, puis une\r\n+seconde, puis une troisième. Tholomyès n'avait répondu à aucune. Un\r\n+jour, Fantine entendit des commères dire en regardant sa fille:\r\n+\r\n+--Est-ce qu'on prend ces enfants-là au sérieux? on hausse les épaules de\r\n+ces enfants-là !\r\n+\r\n+Alors elle songea à Tholomyès qui haussait les épaules de son enfant et\r\n+qui ne prenait pas cet être innocent au sérieux; et son coeur devint\r\n+sombre à l'endroit de cet homme. Quel parti prendre pourtant? Elle ne\r\n+savait plus à qui s'adresser. Elle avait commis une faute, mais le fond\r\n+de sa nature, on s'en souvient, était pudeur et vertu. Elle sentit\r\n+vaguement qu'elle était à la veille de tomber dans la détresse, et de\r\n+glisser dans le pire. Il fallait du courage; elle en eut, et se roidit.\r\n+L'idée lui vint de retourner dans sa ville natale, à Montreuil-sur-mer.\r\n+Là quelqu'un peut-être la connaîtrait et lui donnerait du travail. Oui;\r\n+mais il faudrait cacher sa faute. Et elle entrevoyait confusément la\r\n+nécessité possible d'une séparation plus douloureuse encore que la\r\n+première. Son coeur se serra, mais elle prit sa résolution. Fantine, on\r\n+le verra, avait la farouche bravoure de la vie.\r\n+\r\n+Elle avait déjà vaillamment renoncé à la parure, s'était vêtue de toile,\r\n+et avait mis toute sa soie, tous ses chiffons, tous ses rubans et toutes\r\n+ses dentelles sur sa fille, seule vanité qui lui restât, et sainte\r\n+celle-là . Elle vendit tout ce qu'elle avait, ce qui lui produisit deux\r\n+cents francs; ses petites dettes payées, elle n'eut plus que\r\n+quatre-vingts francs environ. À vingt-deux ans, par une belle matinée de\r\n+printemps, elle quittait Paris, emportant son enfant sur son dos.\r\n+Quelqu'un qui les eût vues passer toutes les deux eût pitié. Cette femme\r\n+n'avait au monde que cet enfant, et cet enfant n'avait au monde que\r\n+cette femme. Fantine avait nourri sa fille; cela lui avait fatigué la\r\n+poitrine, et elle toussait un peu.\r\n+\r\n+Nous n'aurons plus occasion de parler de M. Félix Tholomyès.\r\n+Bornons-nous à dire que, vingt ans plus tard, sous le roi\r\n+Louis-Philippe, c'était un gros avoué de province, influent et riche,\r\n+électeur sage et juré très sévère; toujours homme de plaisir.\r\n+\r\n+Vers le milieu du jour, après avoir, pour se reposer, cheminé de temps\r\n+en temps, moyennant trois ou quatre sous par lieue, dans ce qu'on\r\n+appelait alors les Petites Voitures des Environs de Paris, Fantine se\r\n+trouvait à Montfermeil, dans la ruelle du Boulanger.\r\n+\r\n+Comme elle passait devant l'auberge Thénardier, les deux petites filles,\r\n+enchantées sur leur escarpolette monstre, avaient été pour elle une\r\n+sorte d'éblouissement, et elle s'était arrêtée devant cette vision de\r\n+joie.\r\n+\r\n+Il y a des charmes. Ces deux petites filles en furent un pour cette\r\n+mère.\r\n+\r\n+Elle les considérait, toute émue. La présence des anges est une annonce\r\n+de paradis. Elle crut voir au dessus de cette auberge le mystérieux ICI\r\n+de la providence. Ces deux petites étaient si évidemment heureuses! Elle\r\n+les regardait, elle les admirait, tellement attendrie qu'au moment où la\r\n+mère reprenait haleine entre deux vers de sa chanson, elle ne put\r\n+s'empêcher de lui dire ce mot qu'on vient de lire:\r\n+\r\n+--Vous avez là deux jolis enfants, madame.\r\n+\r\n+Les créatures les plus féroces sont désarmées par la caresse à leurs\r\n+petits. La mère leva la tête et remercia, et fit asseoir la passante sur\r\n+le banc de la porte, elle-même étant sur le seuil. Les deux femmes\r\n+causèrent.\r\n+\r\n+--Je m'appelle madame Thénardier, dit la mère des deux petites. Nous\r\n+tenons cette auberge.\r\n+\r\n+Puis, toujours à sa romance, elle reprit entre ses dents:\r\n+\r\n+ _Il le faut, je suis chevalier,_\r\n+ _Et je pars pour la Palestine._\r\n+\r\n+Cette madame Thénardier était une femme rousse, charnue, anguleuse; le\r\n+type femme-à -soldat dans toute sa disgrâce. Et, chose bizarre, avec un\r\n+air penché qu'elle devait à des lectures romanesques. C'était une\r\n+minaudière hommasse. De vieux romans qui se sont éraillés sur des\r\n+imaginations de gargotières ont de ces effets-là . Elle était jeune\r\n+encore; elle avait à peine trente ans. Si cette femme, qui était\r\n+accroupie, se fût tenue droite, peut-être sa haute taille et sa carrure\r\n+de colosse ambulant propre aux foires, eussent-elles dès l'abord\r\n+effarouché la voyageuse, troublé sa confiance, et fait évanouir ce que\r\n+nous avons à raconter. Une personne qui est assise au lieu d'être\r\n+debout, les destinées tiennent à cela.\r\n+\r\n+La voyageuse raconta son histoire, un peu modifiée:\r\n+\r\n+Qu'elle était ouvrière; que son mari était mort; que le travail lui\r\n+manquait à Paris, et qu'elle allait en chercher ailleurs; dans son pays;\r\n+qu'elle avait quitté Paris, le matin même, à pied; que, comme elle\r\n+portait son enfant, se sentant fatiguée, et ayant rencontré la voiture\r\n+de Villemomble, elle y était montée; que de Villemomble elle était venue\r\n+à Montfermeil à pied, que la petite avait un peu marché, mais pas\r\n+beaucoup, c'est si jeune, et qu'il avait fallu la prendre, et que le\r\n+bijou s'était endormi.\r\n+\r\n+Et sur ce mot elle donna à sa fille un baiser passionné qui la réveilla.\r\n+L'enfant ouvrit les yeux, de grands yeux bleus comme ceux de sa mère, et\r\n+regarda, quoi? rien, tout, avec cet air sérieux et quelquefois sévère\r\n+des petits enfants, qui est un mystère de leur lumineuse innocence\r\n+devant nos crépuscules de vertus. On dirait qu'ils se sentent anges et\r\n+qu'ils nous savent hommes. Puis l'enfant se mit à rire, et, quoique la\r\n+mère la retint, glissa à terre avec l'indomptable énergie d'un petit\r\n+être qui veut courir. Tout à coup elle aperçut les deux autres sur leur\r\n+balançoire, s'arrêta court, et tira la langue, signe d'admiration.\r\n+\r\n+La mère Thénardier détacha ses filles, les fit descendre de\r\n+l'escarpolette, et dit:\r\n+\r\n+--Amusez-vous toutes les trois.\r\n+\r\n+Ces âges-là s'apprivoisent vite, et au bout d'une minute les petites\r\n+Thénardier jouaient avec la nouvelle venue à faire des trous dans la\r\n+terre, plaisir immense.\r\n+\r\n+Cette nouvelle venue était très gaie; la bonté de la mère est écrite\r\n+dans la gaîté du marmot; elle avait pris un brin de bois qui lui servait\r\n+de pelle, et elle creusait énergiquement une fosse bonne pour une\r\n+mouche. Ce que fait le fossoyeur devient riant, fait par l'enfant.\r\n+\r\n+Les deux femmes continuaient de causer.\r\n+\r\n+--Comment s'appelle votre mioche?\r\n+\r\n+--Cosette.\r\n+\r\n+Cosette, lisez Euphrasie. La petite se nommait Euphrasie. Mais\r\n+d'Euphrasie la mère avait fait Cosette, par ce doux et gracieux instinct\r\n+des mères et du peuple qui change Josefa en Pepita et Françoise en\r\n+Sillette. C'est là un genre de dérivés qui dérange et déconcerte toute\r\n+la science des étymologistes. Nous avons connu une grand'mère qui avait\r\n+réussi à faire de Théodore, Gnon.\r\n+\r\n+--Quel âge a-t-elle?\r\n+\r\n+--Elle va sur trois ans.\r\n+\r\n+--C'est comme mon aînée.\r\n+\r\n+Cependant les trois petites filles étaient groupées dans une posture\r\n+d'anxiété profonde et de béatitude; un événement avait lieu; un gros ver\r\n+venait de sortir de terre; et elles avaient peur, et elles étaient en\r\n+extase.\r\n+\r\n+Leurs fronts radieux se touchaient; on eût dit trois têtes dans une\r\n+auréole.\r\n+\r\n+--Les enfants, s'écria la mère Thénardier, comme ça se connaît tout de\r\n+suite! les voilà qu'on jurerait trois soeurs!\r\n+\r\n+Ce mot fut l'étincelle qu'attendait probablement l'autre mère. Elle\r\n+saisit la main de la Thénardier, la regarda fixement, et lui dit:\r\n+\r\n+--Voulez-vous me garder mon enfant?\r\n+\r\n+La Thénardier eut un de ces mouvements surpris qui ne sont ni le\r\n+consentement ni le refus.\r\n+\r\n+La mère de Cosette poursuivit:\r\n+\r\n+--Voyez-vous, je ne peux pas emmener ma fille au pays. L'ouvrage ne le\r\n+permet pas. Avec un enfant, on ne trouve pas à se placer. Ils sont si\r\n+ridicules dans ce pays-là . C'est le bon Dieu qui m'a fait passer devant\r\n+votre auberge. Quand j'ai vu vos petites si jolies et si propres et si\r\n+contentes, cela m'a bouleversée. J'ai dit: voilà une bonne mère. C'est\r\n+ça; ça fera trois soeurs. Et puis, je ne serai pas longtemps à revenir.\r\n+Voulez-vous me garder mon enfant?\r\n+\r\n+--Il faudrait voir, dit la Thénardier.\r\n+\r\n+--Je donnerais six francs par mois.\r\n+\r\n+Ici une voix d'homme cria du fond de la gargote:\r\n+\r\n+--Pas à moins de sept francs. Et six mois payés d'avance.\r\n+\r\n+--Six fois sept quarante-deux, dit la Thénardier.\r\n+\r\n+--Je les donnerai, dit la mère.\r\n+\r\n+--Et quinze francs en dehors pour les premiers frais, ajouta la voix\r\n+d'homme.\r\n+\r\n+--Total cinquante-sept francs, dit la madame Thénardier. Et à travers\r\n+ces chiffres, elle chantonnait vaguement:\r\n+\r\n+_Il le faut, disait un guerrier._\r\n+\r\n+--Je les donnerai, dit la mère, j'ai quatre-vingts francs. Il me restera\r\n+de quoi aller au pays. En allant à pied. Je gagnerai de l'argent là -bas,\r\n+et dès que j'en aurai un peu, je reviendrai chercher l'amour.\r\n+\r\n+La voix d'homme reprit:\r\n+\r\n+--La petite a un trousseau?\r\n+\r\n+--C'est mon mari, dit la Thénardier.\r\n+\r\n+--Sans doute elle a un trousseau, le pauvre trésor. J'ai bien vu que\r\n+c'était votre mari. Et un beau trousseau encore! un trousseau insensé.\r\n+Tout par douzaines; et des robes de soie comme une dame. Il est là dans\r\n+mon sac de nuit.\r\n+\r\n+--Il faudra le donner, repartit la voix d'homme.\r\n+\r\n+--Je crois bien que je le donnerai! dit la mère. Ce serait cela qui\r\n+serait drôle si je laissais ma fille toute nue!\r\n+\r\n+La face du maître apparut.\r\n+\r\n+--C'est bon, dit-il.\r\n+\r\n+Le marché fut conclu. La mère passa la nuit à l'auberge, donna son\r\n+argent et laissa son enfant, renoua son sac de nuit dégonflé du\r\n+trousseau et léger désormais, et partit le lendemain matin, comptant\r\n+revenir bientôt. On arrange tranquillement ces départs-là , mais ce sont\r\n+des désespoirs.\r\n+\r\n+Une voisine des Thénardier rencontra cette mère comme elle s'en allait,\r\n+et s'en revint en disant:\r\n+\r\n+--Je viens de voir une femme qui pleure dans la rue, que c'est un\r\n+déchirement.\r\n+\r\n+Quand la mère de Cosette fut partie, l'homme dit à la femme:\r\n+\r\n+--Cela va me payer mon effet de cent dix francs qui échoit demain. Il me\r\n+manquait cinquante francs. Sais-tu que j'aurais eu l'huissier et un\r\n+protêt? Tu as fait là une bonne souricière avec tes petites.\r\n+\r\n+--Sans m'en douter, dit la femme.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre II\r\n+\r\n+Première esquisse de deux figures louches\r\n+\r\n+\r\n+La souris prise était bien chétive; mais le chat se réjouit même d'une\r\n+souris maigre. Qu'était-ce que les Thénardier?\r\n+\r\n+Disons-en un mot dès à présent. Nous compléterons le croquis plus tard.\r\n+\r\n+Ces êtres appartenaient à cette classe bâtarde composée de gens\r\n+grossiers parvenus et de gens intelligents déchus, qui est entre la\r\n+classe dite moyenne et la classe dite inférieure, et qui combine\r\n+quelques-uns des défauts de la seconde avec presque tous les vices de la\r\n+première, sans avoir le généreux élan de l'ouvrier ni l'ordre honnête du\r\n+bourgeois.\r\n+\r\n+C'étaient de ces natures naines qui, si quelque feu sombre les chauffe\r\n+par hasard, deviennent facilement monstrueuses. Il y avait dans la femme\r\n+le fond d'une brute et dans l'homme l'étoffe d'un gueux. Tous deux\r\n+étaient au plus haut degré susceptibles de l'espèce de hideux progrès\r\n+qui se fait dans le sens du mal. Il existe des âmes écrevisses reculant\r\n+continuellement vers les ténèbres, rétrogradant dans la vie plutôt\r\n+qu'elles n'y avancent, employant l'expérience à augmenter leur\r\n+difformité, empirant sans cesse, et s'empreignant de plus en plus d'une\r\n+noirceur croissante. Cet homme et cette femme étaient de ces âmes-là .\r\n+\r\n+Le Thénardier particulièrement était gênant pour le physionomiste. On\r\n+n'a qu'à regarder certains hommes pour s'en défier, on les sent\r\n+ténébreux à leurs deux extrémités. Ils sont inquiets derrière eux et\r\n+menaçants devant eux. Il y a en eux de l'inconnu. On ne peut pas plus\r\n+répondre de ce qu'ils ont fait que de ce qu'ils feront. L'ombre qu'ils\r\n+ont dans le regard les dénonce. Rien qu'en les entendant dire un mot ou\r\n+qu'en les voyant faire un geste on entrevoit de sombres secrets dans\r\n+leur passé et de sombres mystères dans leur avenir.\r\n+\r\n+Ce Thénardier, s'il fallait l'en croire, avait été soldat; sergent,\r\n+disait-il; il avait fait probablement la campagne de 1815, et s'était\r\n+même comporté assez bravement, à ce qu'il paraît. Nous verrons plus tard\r\n+ce qu'il en était. L'enseigne de son cabaret était une allusion à l'un\r\n+de ses faits d'armes. Il l'avait peinte lui-même, car il savait faire un\r\n+peu de tout; mal.\r\n+\r\n+C'était l'époque où l'antique roman classique, qui, après avoir été\r\n+_Clélie_, n'était plus que _Lodoïska_, toujours noble, mais de plus en\r\n+plus vulgaire, tombé de mademoiselle de Scudéri à madame\r\n+Barthélemy-Hadot, et de madame de Lafayette à madame Bournon-Malarme,\r\n+incendiait l'âme aimante des portières de Paris et ravageait même un peu\r\n+la banlieue. Madame Thénardier était juste assez intelligente pour lire\r\n+ces espèces de livres. Elle s'en nourrissait. Elle y noyait ce qu'elle\r\n+avait de cervelle; cela lui avait donné, tant qu'elle avait été très\r\n+jeune, et même un peu plus tard, une sorte d'attitude pensive près de\r\n+son mari, coquin d'une certaine profondeur, ruffian lettré à la\r\n+grammaire près, grossier et fin en même temps, mais, en fait de\r\n+sentimentalisme, lisant Pigault-Lebrun, et pour «tout ce qui touche le\r\n+sexe», comme il disait dans son jargon, butor correct et sans mélange.\r\n+Sa femme avait quelque douze ou quinze ans de moins que lui. Plus tard,\r\n+quand les cheveux romanesquement pleureurs commencèrent à grisonner,\r\n+quand la Mégère se dégagea de la Paméla, la Thénardier ne fut plus\r\n+qu'une grosse méchante femme ayant savouré des romans bêtes. Or on ne\r\n+lit pas impunément des niaiseries. Il en résulta que sa fille aînée se\r\n+nomma Eponine. Quant à la cadette, la pauvre petite faillit se nommer\r\n+Gulnare; elle dut à je ne sais quelle heureuse diversion faite par un\r\n+roman de Ducray-Duminil, de ne s'appeler qu'Azelma.\r\n+\r\n+Au reste, pour le dire en passant, tout n'est pas ridicule et\r\n+superficiel dans cette curieuse époque à laquelle nous faisons ici\r\n+allusion, et qu'on pourrait appeler l'anarchie des noms de baptême. À\r\n+côté de l'élément romanesque, que nous venons d'indiquer, il y a le\r\n+symptôme social. Il n'est pas rare aujourd'hui que le garçon bouvier se\r\n+nomme Arthur, Alfred ou Alphonse, et que le vicomte--s'il y a encore des\r\n+vicomtes--se nomme Thomas, Pierre ou Jacques. Ce déplacement qui met le\r\n+nom «élégant» sur le plébéien et le nom campagnard sur l'aristocrate\r\n+n'est autre chose qu'un remous d'égalité. L'irrésistible pénétration du\r\n+souffle nouveau est là comme en tout. Sous cette discordance apparente,\r\n+il y a une chose grande et profonde: la révolution française.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre III\r\n+\r\n+L'Alouette\r\n+\r\n+\r\n+Il ne suffit pas d'être méchant pour prospérer. La gargote allait mal.\r\n+\r\n+Grâce aux cinquante-sept francs de la voyageuse, Thénardier avait pu\r\n+éviter un protêt et faire honneur à sa signature. Le mois suivant ils\r\n+eurent encore besoin d'argent; la femme porta à Paris et engagea au\r\n+Mont-de-Piété le trousseau de Cosette pour une somme de soixante francs.\r\n+Dès que cette somme fut dépensée, les Thénardier s'accoutumèrent à ne\r\n+plus voir dans la petite fille qu'un enfant qu'ils avaient chez eux par\r\n+charité, et la traitèrent en conséquence. Comme elle n'avait plus de\r\n+trousseau, on l'habilla des vieilles jupes et des vieilles chemises des\r\n+petites Thénardier, c'est-à -dire de haillons.\r\n+\r\n+On la nourrit des restes de tout le monde, un peu mieux que le chien et\r\n+un peu plus mal que le chat. Le chat et le chien étaient du reste ses\r\n+commensaux habituels; Cosette mangeait avec eux sous la table dans une\r\n+écuelle de bois pareille à la leur. La mère qui s'était fixée, comme on\r\n+le verra plus tard, à Montreuil-sur-mer, écrivait, ou, pour mieux dire,\r\n+faisait écrire tous les mois afin d'avoir des nouvelles de son enfant.\r\n+Les Thénardier répondaient invariablement: Cosette est à merveille. Les\r\n+six premiers mois révolus, la mère envoya sept francs pour le septième\r\n+mois, et continua assez exactement ses envois de mois en mois. L'année\r\n+n'était pas finie que le Thénardier dit:\r\n+\r\n+--Une belle grâce qu'elle nous fait là ! que veut-elle que nous fassions\r\n+avec ses sept francs?\r\n+\r\n+Et il écrivit pour exiger douze francs. La mère, à laquelle ils\r\n+persuadaient que son enfant était heureuse \u0022et venait bien\u0022, se soumit\r\n+et envoya les douze francs.\r\n+\r\n+Certaines natures ne peuvent aimer d'un côté sans haïr de l'autre. La\r\n+mère Thénardier aimait passionnément ses deux filles à elle, ce qui fit\r\n+qu'elle détesta l'étrangère. Il est triste de songer que l'amour d'une\r\n+mère peut avoir de vilains aspects. Si peu de place que Cosette tînt\r\n+chez elle, il lui semblait que cela était pris aux siens, et que cette\r\n+petite diminuait l'air que ses filles respiraient. Cette femme, comme\r\n+beaucoup de femmes de sa sorte, avait une somme de caresses et une somme\r\n+de coups et d'injures à dépenser chaque jour. Si elle n'avait pas eu\r\n+Cosette, il est certain que ses filles, tout idolâtrées qu'elles\r\n+étaient, auraient tout reçu; mais l'étrangère leur rendit le service de\r\n+détourner les coups sur elle. Ses filles n'eurent que les caresses.\r\n+Cosette ne faisait pas un mouvement qui ne fît pleuvoir sur sa tête une\r\n+grêle de châtiments violents et immérités. Doux être faible qui ne\r\n+devait rien comprendre à ce monde ni à Dieu, sans cesse punie, grondée,\r\n+rudoyée, battue et voyant à côté d'elle deux petites créatures comme\r\n+elle, qui vivaient dans un rayon d'aurore!\r\n+\r\n+La Thénardier étant méchante pour Cosette, Éponine et Azelma furent\r\n+méchantes. Les enfants, à cet âge, ne sont que des exemplaires de la\r\n+mère. Le format est plus petit, voilà tout.\r\n+\r\n+Une année s'écoula, puis une autre.\r\n+\r\n+On disait dans le village:\r\n+\r\n+--Ces Thénardier sont de braves gens. Ils ne sont pas riches, et ils\r\n+élèvent un pauvre enfant qu'on leur a abandonné chez eux!\r\n+\r\n+On croyait Cosette oubliée par sa mère.\r\n+\r\n+Cependant le Thénardier, ayant appris par on ne sait quelles voies\r\n+obscures que l'enfant était probablement bâtard et que la mère ne\r\n+pouvait l'avouer, exigea quinze francs par mois, disant que «la\r\n+créature» grandissait et «_mangeait_», et menaçant de la renvoyer.\r\n+«Quelle ne m'embête pas! s'écriait-il, je lui bombarde son mioche tout\r\n+au beau milieu de ses cachotteries. Il me faut de l'augmentation.» La\r\n+mère paya les quinze francs.\r\n+\r\n+D'année en année, l'enfant grandit, et sa misère aussi.\r\n+\r\n+Tant que Cosette fut toute petite, elle fut le souffre-douleur des deux\r\n+autres enfants; dès qu'elle se mit à se développer un peu, c'est-à -dire\r\n+avant même qu'elle eût cinq ans, elle devint la servante de la maison.\r\n+\r\n+Cinq ans, dira-t-on, c'est invraisemblable. Hélas, c'est vrai. La\r\n+souffrance sociale commence à tout âge.\r\n+\r\n+N'avons-nous pas vu, récemment, le procès d'un nommé Dumolard, orphelin\r\n+devenu bandit, qui, dès l'âge de cinq ans, disent les documents\r\n+officiels, étant seul au monde «travaillait pour vivre, et volait.»\r\n+\r\n+On fit faire à Cosette les commissions, balayer les chambres, la cour,\r\n+la rue, laver la vaisselle, porter même des fardeaux. Les Thénardier se\r\n+crurent d'autant plus autorisés à agir ainsi que la mère qui était\r\n+toujours à Montreuil-sur-mer commença à mal payer. Quelques mois\r\n+restèrent en souffrance.\r\n+\r\n+Si cette mère fût revenue à Montfermeil au bout de ces trois années,\r\n+elle n'eût point reconnu son enfant. Cosette, si jolie et si fraîche à \r\n+son arrivée dans cette maison, était maintenant maigre et blême. Elle\r\n+avait je ne sais quelle allure inquiète. Sournoise! disaient les\r\n+Thénardier.\r\n+\r\n+L'injustice l'avait faite hargneuse et la misère l'avait rendue laide.\r\n+Il ne lui restait plus que ses beaux yeux qui faisaient peine, parce\r\n+que, grands comme ils étaient, il semblait qu'on y vît une plus grande\r\n+quantité de tristesse.\r\n+\r\n+C'était une chose navrante de voir, l'hiver, ce pauvre enfant, qui\r\n+n'avait pas encore six ans, grelottant sous de vieilles loques de toile\r\n+trouées, balayer la rue avant le jour avec un énorme balai dans ses\r\n+petites mains rouges et une larme dans ses grands yeux.\r\n+\r\n+Dans le pays on l'appelait l'Alouette. Le peuple, qui aime les figures,\r\n+s'était plu à nommer de ce nom ce petit être pas plus gros qu'un oiseau,\r\n+tremblant, effarouché et frissonnant, éveillé le premier chaque matin\r\n+dans la maison et dans le village, toujours dans la rue ou dans les\r\n+champs avant l'aube. Seulement la pauvre Alouette ne chantait jamais.\r\n+\r\n+\r\n+\r\n+\r\n+Livre cinquième--La descente\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre I\r\n+\r\n+Histoire d'un progrès dans les verroteries noires\r\n+\r\n+\r\n+Cette mère cependant qui, au dire des gens de Montfermeil, semblait\r\n+avoir abandonné son enfant, que devenait-elle? où était-elle? que\r\n+faisait-elle?\r\n+\r\n+Après avoir laissé sa petite Cosette aux Thénardier, elle avait continué\r\n+son chemin et était arrivée à Montreuil-sur-mer.\r\n+\r\n+C'était, on se le rappelle, en 1818.\r\n+\r\n+Fantine avait quitté sa province depuis une dizaine d'années.\r\n+Montreuil-sur-mer avait changé d'aspect. Tandis que Fantine descendait\r\n+lentement de misère en misère, sa ville natale avait prospéré.\r\n+\r\n+Depuis deux ans environ, il s'y était accompli un de ces faits\r\n+industriels qui sont les grands événements des petits pays.\r\n+\r\n+Ce détail importe, et nous croyons utile de le développer; nous dirions\r\n+presque, de le souligner.\r\n+\r\n+De temps immémorial, Montreuil-sur-mer avait pour industrie spéciale\r\n+l'imitation des jais anglais et des verroteries noires d'Allemagne.\r\n+Cette industrie avait toujours végété, à cause de la cherté des matières\r\n+premières qui réagissait sur la main-d'oeuvre. Au moment où Fantine\r\n+revint à Montreuil-sur-mer, une transformation inouïe s'était opérée\r\n+dans cette production des «articles noirs». Vers la fin de 1815, un\r\n+homme, un inconnu, était venu s'établir dans la ville et avait eu l'idée\r\n+de substituer, dans cette fabrication, la gomme laque à la résine et,\r\n+pour les bracelets en particulier, les coulants en tôle simplement\r\n+rapprochée aux coulants en tôle soudée. Ce tout petit changement avait\r\n+été une révolution.\r\n+\r\n+Ce tout petit changement en effet avait prodigieusement réduit le prix\r\n+de la matière première, ce qui avait permis, premièrement, d'élever le\r\n+prix de la main-d'oeuvre, bienfait pour le pays; deuxièmement,\r\n+d'améliorer la fabrication, avantage pour le consommateur;\r\n+troisièmement, de vendre à meilleur marché tout en triplant le bénéfice,\r\n+profit pour le manufacturier.\r\n+\r\n+Ainsi pour une idée trois résultats.\r\n+\r\n+En moins de trois ans, l'auteur de ce procédé était devenu riche, ce qui\r\n+est bien, et avait tout fait riche autour de lui, ce qui est mieux. Il\r\n+était étranger au département. De son origine, on ne savait rien; de ses\r\n+commencements, peu de chose.\r\n+\r\n+On contait qu'il était venu dans la ville avec fort peu d'argent,\r\n+quelques centaines de francs tout au plus.\r\n+\r\n+C'est de ce mince capital, mis au service d'une idée ingénieuse, fécondé\r\n+par l'ordre et par la pensée, qu'il avait tiré sa fortune et la fortune\r\n+de tout ce pays.\r\n+\r\n+À son arrivée à Montreuil-sur-mer, il n'avait que les vêtements, la\r\n+tournure et le langage d'un ouvrier.\r\n+\r\n+Il paraît que, le jour même où il faisait obscurément son entrée dans la\r\n+petite ville de Montreuil-sur-mer, à la tombée d'un soir de décembre, le\r\n+sac au dos et le bâton d'épine à la main, un gros incendie venait\r\n+d'éclater à la maison commune. Cet homme s'était jeté dans le feu, et\r\n+avait sauvé, au péril de sa vie, deux enfants qui se trouvaient être\r\n+ceux du capitaine de gendarmerie; ce qui fait qu'on n'avait pas songé à \r\n+lui demander son passeport. Depuis lors, on avait su son nom. Il\r\n+s'appelait le _père Madeleine_.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre II\r\n+\r\n+M. Madeleine\r\n+\r\n+\r\n+C'était un homme d'environ cinquante ans, qui avait l'air préoccupé et\r\n+qui était bon. Voilà tout ce qu'on en pouvait dire.\r\n+\r\n+Grâce aux progrès rapides de cette industrie qu'il avait si\r\n+admirablement remaniée, Montreuil-sur-mer était devenu un centre\r\n+d'affaires considérable. L'Espagne, qui consomme beaucoup de jais noir,\r\n+y commandait chaque année des achats immenses. Montreuil-sur-mer, pour\r\n+ce commerce, faisait presque concurrence à Londres et à Berlin. Les\r\n+bénéfices du père Madeleine étaient tels que, dès la deuxième année, il\r\n+avait pu bâtir une grande fabrique dans laquelle il y avait deux vastes\r\n+ateliers, l'un pour les hommes, l'autre pour les femmes. Quiconque avait\r\n+faim pouvait s'y présenter, et était sûr de trouver là de l'emploi et du\r\n+pain. Le père Madeleine demandait aux hommes de la bonne volonté, aux\r\n+femmes des moeurs pures, à tous de la probité. Il avait divisé les\r\n+ateliers afin de séparer les sexes et que les filles et les femmes\r\n+pussent rester sages. Sur ce point, il était inflexible. C'était le seul\r\n+où il fût en quelque sorte intolérant. Il était d'autant plus fondé à \r\n+cette sévérité que, Montreuil-sur-mer étant une ville de garnison, les\r\n+occasions de corruption abondaient. Du reste sa venue avait été un\r\n+bienfait, et sa présence était une providence. Avant l'arrivée du père\r\n+Madeleine, tout languissait dans le pays; maintenant tout y vivait de la\r\n+vie saine du travail. Une forte circulation échauffait tout et pénétrait\r\n+partout. Le chômage et la misère étaient inconnus. Il n'y avait pas de\r\n+poche si obscure où il n'y eût un peu d'argent, pas de logis si pauvre\r\n+où il n'y eût un peu de joie.\r\n+\r\n+Le père Madeleine employait tout le monde. Il n'exigeait qu'une chose:\r\n+soyez honnête homme! soyez honnête fille!\r\n+\r\n+Comme nous l'avons dit, au milieu de cette activité dont il était la\r\n+cause et le pivot, le père Madeleine faisait sa fortune, mais, chose\r\n+assez singulière dans un simple homme de commerce, il ne paraissait\r\n+point que ce fût là son principal souci. Il semblait qu'il songeât\r\n+beaucoup aux autres et peu à lui. En 1820, on lui connaissait une somme\r\n+de six cent trente mille francs placée à son nom chez Laffitte; mais\r\n+avant de se réserver ces six cent trente mille francs, il avait dépensé\r\n+plus d'un million pour la ville et pour les pauvres.\r\n+\r\n+L'hôpital était mal doté; il y avait fondé dix lits. Montreuil-sur-mer\r\n+est divisé en ville haute et ville basse. La ville basse, qu'il\r\n+habitait, n'avait qu'une école, méchante masure qui tombait en ruine; il\r\n+en avait construit deux, une pour les filles, l'autre pour les garçons.\r\n+Il allouait de ses deniers aux deux instituteurs une indemnité double de\r\n+leur maigre traitement officiel, et un jour, à quelqu'un qui s'en\r\n+étonnait, il dit: «Les deux premiers fonctionnaires de l'état, c'est la\r\n+nourrice et le maître d'école.» Il avait créé à ses frais une salle\r\n+d'asile, chose alors presque inconnue en France, et une caisse de\r\n+secours pour les ouvriers vieux et infirmes. Sa manufacture étant un\r\n+centre, un nouveau quartier où il y avait bon nombre de familles\r\n+indigentes avait rapidement surgi autour de lui; il y avait établi une\r\n+pharmacie gratuite.\r\n+\r\n+Dans les premiers temps, quand on le vit commencer, les bonnes âmes\r\n+dirent: C'est un gaillard qui veut s'enrichir. Quand on le vit enrichir\r\n+le pays avant de s'enrichir lui-même, les mêmes bonnes âmes dirent:\r\n+C'est un ambitieux. Cela semblait d'autant plus probable que cet homme\r\n+était religieux, et même pratiquait dans une certaine mesure, chose fort\r\n+bien vue à cette époque. Il allait régulièrement entendre une basse\r\n+messe tous les dimanches. Le député local, qui flairait partout des\r\n+concurrences, ne tarda pas à s'inquiéter de cette religion. Ce député,\r\n+qui avait été membre du corps législatif de l'empire, partageait les\r\n+idées religieuses d'un père de l'oratoire connu sous le nom de Fouché,\r\n+duc d'Otrante, dont il avait été la créature et l'ami. À huis clos il\r\n+riait de Dieu doucement. Mais quand il vit le riche manufacturier\r\n+Madeleine aller à la basse messe de sept heures, il entrevit un candidat\r\n+possible, et résolut de le dépasser; il prit un confesseur jésuite et\r\n+alla à la grand'messe et à vêpres. L'ambition en ce temps-là était, dans\r\n+l'acception directe du mot, une course au clocher. Les pauvres\r\n+profitèrent de cette terreur comme le bon Dieu, car l'honorable député\r\n+fonda aussi deux lits à l'hôpital; ce qui fit douze.\r\n+\r\n+Cependant en 1819 le bruit se répandit un matin dans la ville que, sur\r\n+la présentation de M. le préfet, et en considération des services rendus\r\n+au pays, le père Madeleine allait être nommé par le roi maire de\r\n+Montreuil-sur-mer. Ceux qui avaient déclaré ce nouveau venu «un\r\n+ambitieux», saisirent avec transport cette occasion que tous les hommes\r\n+souhaitent de s'écrier: «Là ! qu'est-ce que nous avions dit?» Tout\r\n+Montreuil-sur-mer fut en rumeur. Le bruit était fondé. Quelques jours\r\n+après, la nomination parut dans _le Moniteur_. Le lendemain, le père\r\n+Madeleine refusa.\r\n+\r\n+Dans cette même année 1819, les produits du nouveau procédé inventé par\r\n+Madeleine figurèrent à l'exposition de l'industrie; sur le rapport du\r\n+jury, le roi nomma l'inventeur chevalier de la Légion d'honneur.\r\n+Nouvelle rumeur dans la petite ville. Eh bien! c'est la croix qu'il\r\n+voulait! Le père Madeleine refusa la croix.\r\n+\r\n+Décidément cet homme était une énigme. Les bonnes âmes se tirèrent\r\n+d'affaire en disant: Après tout, c'est une espèce d'aventurier.\r\n+\r\n+On l'a vu, le pays lui devait beaucoup, les pauvres lui devaient tout;\r\n+il était si utile qu'il avait bien fallu qu'on finît par l'honorer, et\r\n+il était si doux qu'il avait bien fallu qu'on finît par l'aimer; ses\r\n+ouvriers en particulier l'adoraient, et il portait cette adoration avec\r\n+une sorte de gravité mélancolique. Quand il fut constaté riche, «les\r\n+personnes de la société» le saluèrent, et on l'appela dans la ville\r\n+monsieur Madeleine; ses ouvriers et les enfants continuèrent de\r\n+l'appeler _le père Madeleine_, et c'était la chose qui le faisait le\r\n+mieux sourire. À mesure qu'il montait, les invitations pleuvaient sur\r\n+lui. «La société» le réclamait. Les petits salons guindés de\r\n+Montreuil-sur-mer qui, bien entendu, se fussent dans les premiers temps\r\n+fermés à l'artisan, s'ouvrirent à deux battants au millionnaire. On lui\r\n+fit mille avances. Il refusa.\r\n+\r\n+Cette fois encore les bonnes âmes ne furent point empêchées.\r\n+\r\n+--C'est un homme ignorant et de basse éducation. On ne sait d'où cela\r\n+sort. Il ne saurait pas se tenir dans le monde. Il n'est pas du tout\r\n+prouvé qu'il sache lire.\r\n+\r\n+Quand on l'avait vu gagner de l'argent, on avait dit: c'est un marchand.\r\n+Quand on l'avait vu semer son argent, on avait dit: c'est un ambitieux.\r\n+Quand on l'avait vu repousser les honneurs, on avait dit: c'est un\r\n+aventurier. Quand on le vit repousser le monde, on dit: c'est une brute.\r\n+\r\n+En 1820, cinq ans après son arrivée à Montreuil-sur-mer, les services\r\n+qu'il avait rendus au pays étaient si éclatants, le voeu de la contrée\r\n+fut tellement unanime, que le roi le nomma de nouveau maire de la ville.\r\n+Il refusa encore, mais le préfet résista à son refus, tous les notables\r\n+vinrent le prier, le peuple en pleine rue le suppliait, l'insistance fut\r\n+si vive qu'il finit par accepter. On remarqua que ce qui parut surtout\r\n+le déterminer, ce fut l'apostrophe presque irritée d'une vieille femme\r\n+du peuple qui lui cria du seuil de sa porte avec humeur: _Un bon maire,\r\n+c'est utile. Est-ce qu'on recule devant du bien qu'on peut faire?_\r\n+\r\n+Ce fut là la troisième phase de son ascension. Le père Madeleine était\r\n+devenu monsieur Madeleine, monsieur Madeleine devint monsieur le maire.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre III\r\n+\r\n+Sommes déposées chez Laffitte\r\n+\r\n+\r\n+Du reste, il était demeuré aussi simple que le premier jour. Il avait\r\n+les cheveux gris, l'oeil sérieux, le teint hâlé d'un ouvrier, le visage\r\n+pensif d'un philosophe. Il portait habituellement un chapeau à bords\r\n+larges et une longue redingote de gros drap, boutonnée jusqu'au menton.\r\n+Il remplissait ses fonctions de maire, mais hors de là il vivait\r\n+solitaire. Il parlait à peu de monde. Il se dérobait aux politesses,\r\n+saluait de côté, s'esquivait vite, souriait pour se dispenser de causer,\r\n+donnait pour se dispenser de sourire. Les femmes disaient de lui: Quel\r\n+bon ours! Son plaisir était de se promener dans les champs.\r\n+\r\n+Il prenait ses repas toujours seul, avec un livre ouvert devant lui où\r\n+il lisait. Il avait une petite bibliothèque bien faite. Il aimait les\r\n+livres; les livres sont des amis froids et sûrs. À mesure que le loisir\r\n+lui venait avec la fortune, il semblait qu'il en profitât pour cultiver\r\n+son esprit. Depuis qu'il était à Montreuil-sur-mer, on remarquait que\r\n+d'année en année son langage devenait plus poli, plus choisi et plus\r\n+doux.\r\n+\r\n+Il emportait volontiers un fusil dans ses promenades, mais il s'en\r\n+servait rarement. Quand cela lui arrivait par aventure, il avait un tir\r\n+infaillible qui effrayait. Jamais il ne tuait un animal inoffensif.\r\n+Jamais il ne tirait un petit oiseau. Quoiqu'il ne fût plus jeune, on\r\n+contait qu'il était d'une force prodigieuse. Il offrait un coup de main\r\n+à qui en avait besoin, relevait un cheval, poussait à une roue\r\n+embourbée, arrêtait par les cornes un taureau échappé. Il avait toujours\r\n+ses poches pleines de monnaie en sortant et vides en rentrant. Quand il\r\n+passait dans un village, les marmots déguenillés couraient joyeusement\r\n+après lui et l'entouraient comme une nuée de moucherons.\r\n+\r\n+On croyait deviner qu'il avait dû vivre jadis de la vie des champs, car\r\n+il avait toutes sortes de secrets utiles qu'il enseignait aux paysans.\r\n+Il leur apprenait à détruire la teigne des blés en aspergeant le grenier\r\n+et en inondant les fentes du plancher d'une dissolution de sel commun,\r\n+et à chasser les charançons en suspendant partout, aux murs et aux\r\n+toits, dans les héberges et dans les maisons, de l'orviot en fleur. Il\r\n+avait des \u0022recettes\u0022 pour extirper d'un champ la luzette, la nielle, la\r\n+vesce, la gaverolle, la queue-de-renard, toutes les herbes parasites qui\r\n+mangent le blé. Il défendait une lapinière contre les rats rien qu'avec\r\n+l'odeur d'un petit cochon de Barbarie qu'il y mettait. Un jour il voyait\r\n+des gens du pays très occupés à arracher des orties. Il regarda ce tas\r\n+de plantes déracinées et déjà desséchées, et dit:\r\n+\r\n+--C'est mort. Cela serait pourtant bon si l'on savait s'en servir. Quand\r\n+l'ortie est jeune, la feuille est un légume excellent; quand elle\r\n+vieillit, elle a des filaments et des fibres comme le chanvre et le lin.\r\n+La toile d'ortie vaut la toile de chanvre. Hachée, l'ortie est bonne\r\n+pour la volaille; broyée, elle est bonne pour les bêtes à cornes. La\r\n+graine de l'ortie mêlée au fourrage donne du luisant au poil des\r\n+animaux; la racine mêlée au sel produit une belle couleur jaune. C'est\r\n+du reste un excellent foin qu'on peut faucher deux fois. Et que faut-il\r\n+à l'ortie? Peu de terre, nul soin, nulle culture. Seulement la graine\r\n+tombe à mesure qu'elle mûrit, et est difficile à récolter. Voilà tout.\r\n+Avec quelque peine qu'on prendrait, l'ortie serait utile; on la néglige,\r\n+elle devient nuisible. Alors on la tue. Que d'hommes ressemblent à \r\n+l'ortie!\r\n+\r\n+Il ajouta après un silence:\r\n+\r\n+--Mes amis, retenez ceci, il n'y a ni mauvaises herbes ni mauvais\r\n+hommes. Il n'y a que de mauvais cultivateurs.\r\n+\r\n+Les enfants l'aimaient encore parce qu'il savait faire de charmants\r\n+petits ouvrages avec de la paille et des noix de coco.\r\n+\r\n+Quand il voyait la porte d'une église tendue de noir, il entrait; il\r\n+recherchait un enterrement comme d'autres recherchent un baptême. Le\r\n+veuvage et le malheur d'autrui l'attiraient à cause de sa grande\r\n+douceur; il se mêlait aux amis en deuil, aux familles vêtues de noir,\r\n+aux prêtres gémissant autour d'un cercueil. Il semblait donner\r\n+volontiers pour texte à ses pensées ces psalmodies funèbres pleines de\r\n+la vision d'un autre monde. L'oeil au ciel, il écoutait, avec une sorte\r\n+d'aspiration vers tous les mystères de l'infini, ces voix tristes qui\r\n+chantent sur le bord de l'abîme obscur de la mort.\r\n+\r\n+Il faisait une foule de bonnes actions en se cachant comme on se cache\r\n+pour les mauvaises. Il pénétrait à la dérobée, le soir, dans les\r\n+maisons; il montait furtivement des escaliers. Un pauvre diable, en\r\n+rentrant dans son galetas, trouvait que sa porte avait été ouverte,\r\n+quelquefois même forcée, dans son absence. Le pauvre homme se récriait:\r\n+quelque malfaiteur est venu! Il entrait, et la première chose qu'il\r\n+voyait, c'était une pièce d'or oubliée sur un meuble. \u0022Le malfaiteur\u0022\r\n+qui était venu, c'était le père Madeleine.\r\n+\r\n+Il était affable et triste. Le peuple disait: «Voilà un homme riche qui\r\n+n'a pas l'air fier. Voilà un homme heureux qui n'a pas l'air content.»\r\n+\r\n+Quelques-uns prétendaient que c'était un personnage mystérieux, et\r\n+affirmaient qu'on n'entrait jamais dans sa chambre, laquelle était une\r\n+vraie cellule d'anachorète meublée de sabliers ailés et enjolivée de\r\n+tibias en croix et de têtes de mort. Cela se disait beaucoup, si bien\r\n+que quelques jeunes femmes élégantes et malignes de Montreuil-sur-mer\r\n+vinrent chez lui un jour, et lui demandèrent:\r\n+\r\n+--Monsieur le maire, montrez-nous donc votre chambre. On dit que c'est\r\n+une grotte.\r\n+\r\n+Il sourit, et les introduisit sur-le-champ dans cette «grotte». Elles\r\n+furent bien punies de leur curiosité. C'était une chambre garnie tout\r\n+bonnement de meubles d'acajou assez laids comme tous les meubles de ce\r\n+genre et tapissée de papier à douze sous. Elles n'y purent rien\r\n+remarquer que deux flambeaux de forme vieillie qui étaient sur la\r\n+cheminée et qui avaient l'air d'être en argent, «car ils étaient\r\n+contrôlés». Observation pleine de l'esprit des petites villes.\r\n+\r\n+On n'en continua pas moins de dire que personne ne pénétrait dans cette\r\n+chambre et que c'était une caverne d'ermite, un rêvoir, un trou, un\r\n+tombeau.\r\n+\r\n+On se chuchotait aussi qu'il avait des sommes «immenses» déposées chez\r\n+Laffitte, avec cette particularité qu'elles étaient toujours à sa\r\n+disposition immédiate, de telle sorte, ajoutait-on, que M. Madeleine\r\n+pourrait arriver un matin chez Laffitte, signer un reçu et emporter ses\r\n+deux ou trois millions en dix minutes. Dans la réalité ces «deux ou\r\n+trois millions» se réduisaient, nous l'avons dit, à six cent trente ou\r\n+quarante mille francs.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IV\r\n+\r\n+M. Madeleine en deuil\r\n+\r\n+\r\n+Au commencement de 1821, les journaux annoncèrent la mort de M. Myriel,\r\n+évêque de Digne, «surnommé _monseigneur Bienvenu_», et trépassé en odeur\r\n+de sainteté à l'âge de quatre-vingt-deux ans.\r\n+\r\n+L'évêque de Digne, pour ajouter ici un détail que les journaux omirent,\r\n+était, quand il mourut, depuis plusieurs années aveugle, et content\r\n+d'être aveugle, sa soeur étant près de lui.\r\n+\r\n+Disons-le en passant, être aveugle et être aimé, c'est en effet, sur\r\n+cette terre où rien n'est complet, une des formes les plus étrangement\r\n+exquises du bonheur. Avoir continuellement à ses côtés une femme, une\r\n+fille, une soeur, un être charmant, qui est là parce que vous avez\r\n+besoin d'elle et parce qu'elle ne peut se passer de vous, se savoir\r\n+indispensable à qui nous est nécessaire, pouvoir incessamment mesurer\r\n+son affection à la quantité de présence qu'elle nous donne, et se dire:\r\n+puisqu'elle me consacre tout son temps, c'est que j'ai tout son coeur;\r\n+voir la pensée à défaut de la figure, constater la fidélité d'un être\r\n+dans l'éclipse du monde, percevoir le frôlement d'une robe comme un\r\n+bruit d'ailes, l'entendre aller et venir, sortir, rentrer, parler,\r\n+chanter, et songer qu'on est le centre de ces pas, de cette parole, de\r\n+ce chant, manifester à chaque minute sa propre attraction, se sentir\r\n+d'autant plus puissant qu'on est plus infirme, devenir dans l'obscurité,\r\n+et par l'obscurité, l'astre autour duquel gravite cet ange, peu de\r\n+félicités égalent celle-là . Le suprême bonheur de la vie, c'est la\r\n+conviction qu'on est aimé; aimé pour soi-même, disons mieux, aimé malgré\r\n+soi-même; cette conviction, l'aveugle l'a. Dans cette détresse, être\r\n+servi, c'est être caressé. Lui manque-t-il quelque chose? Non. Ce n'est\r\n+point perdre la lumière qu'avoir l'amour. Et quel amour! un amour\r\n+entièrement fait de vertu. Il n'y a point de cécité où il y a certitude.\r\n+L'âme à tâtons cherche l'âme, et la trouve. Et cette âme trouvée et\r\n+prouvée est une femme. Une main vous soutient, c'est la sienne; une\r\n+bouche effleure votre front, c'est sa bouche; vous entendez une\r\n+respiration tout près de vous, c'est elle. Tout avoir d'elle, depuis son\r\n+culte jusqu'à sa pitié, n'être jamais quitté, avoir cette douce\r\n+faiblesse qui vous secourt, s'appuyer sur ce roseau inébranlable,\r\n+toucher de ses mains la providence et pouvoir la prendre dans ses bras,\r\n+Dieu palpable, quel ravissement! Le coeur, cette céleste fleur obscure,\r\n+entre dans un épanouissement mystérieux. On ne donnerait pas cette ombre\r\n+pour toute la clarté. L'âme ange est là , sans cesse là ; si elle\r\n+s'éloigne, c'est pour revenir; elle s'efface comme le rêve et reparaît\r\n+comme la réalité. On sent de la chaleur qui approche, la voilà . On\r\n+déborde de sérénité, de gaîté et d'extase; on est un rayonnement dans la\r\n+nuit. Et mille petits soins. Des riens qui sont énormes dans ce vide.\r\n+Les plus ineffables accents de la voix féminine employés à vous bercer,\r\n+et suppléant pour vous à l'univers évanoui. On est caressé avec de\r\n+l'âme. On ne voit rien, mais on se sent adoré. C'est un paradis de\r\n+ténèbres.\r\n+\r\n+C'est de ce paradis que monseigneur Bienvenu était passé à l'autre.\r\n+\r\n+L'annonce de sa mort fut reproduite par le journal local de\r\n+Montreuil-sur-mer. M. Madeleine parut le lendemain tout en noir avec un\r\n+crêpe à son chapeau.\r\n+\r\n+On remarqua dans la ville ce deuil, et l'on jasa. Cela parut une lueur\r\n+sur l'origine de M. Madeleine. On en conclut qu'il avait quelque\r\n+alliance avec le vénérable évêque. _Il drape pour l'évêque de Digne_,\r\n+dirent les salons; cela rehaussa fort M. Madeleine, et lui donna\r\n+subitement et d'emblée une certaine considération dans le monde noble de\r\n+Montreuil-sur-mer. Le microscopique faubourg Saint-Germain de l'endroit\r\n+songea à faire cesser la quarantaine de M. Madeleine, parent probable\r\n+d'un évêque. M. Madeleine s'aperçut de l'avancement qu'il obtenait à \r\n+plus de révérences des vieilles femmes et à plus de sourires des jeunes.\r\n+Un soir, une doyenne de ce petit grand monde-là , curieuse par droit\r\n+d'ancienneté, se hasarda à lui demander:\r\n+\r\n+--Monsieur le maire est sans doute cousin du feu évêque de Digne?\r\n+\r\n+Il dit:\r\n+\r\n+--Non, madame.\r\n+\r\n+--Mais, reprit la douairière, vous en portez le deuil?\r\n+\r\n+Il répondit:\r\n+\r\n+--C'est que dans ma jeunesse j'ai été laquais dans sa famille.\r\n+\r\n+Une remarque qu'on faisait encore, c'est que, chaque fois qu'il passait\r\n+dans la ville un jeune savoyard courant le pays et cherchant des\r\n+cheminées à ramoner, M. le maire le faisait appeler, lui demandait son\r\n+nom, et lui donnait de l'argent. Les petits savoyards se le disaient, et\r\n+il en passait beaucoup.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre V\r\n+\r\n+Vagues éclairs à l'horizon\r\n+\r\n+\r\n+Peu à peu, et avec le temps, toutes les oppositions étaient tombées. Il\r\n+y avait eu d'abord contre M. Madeleine, sorte de loi que subissent\r\n+toujours ceux qui s'élèvent, des noirceurs et des calomnies, puis ce ne\r\n+fut plus que des méchancetés, puis ce ne fut que des malices, puis cela\r\n+s'évanouit tout à fait; le respect devint complet, unanime, cordial, et\r\n+il arriva un moment, vers 1821, où ce mot: monsieur le maire, fut\r\n+prononcé à Montreuil-sur-mer presque du même accent que ce mot:\r\n+monseigneur l'évêque, était prononcé à Digne en 1815. On venait de dix\r\n+lieues à la ronde consulter M. Madeleine. Il terminait les différends,\r\n+il empêchait les procès, il réconciliait les ennemis. Chacun le prenait\r\n+pour juge de son bon droit. Il semblait qu'il eût pour âme le livre de\r\n+la loi naturelle. Ce fut comme une contagion de vénération qui, en six\r\n+ou sept ans et de proche en proche, gagna tout le pays.\r\n+\r\n+Un seul homme, dans la ville et dans l'arrondissement, se déroba\r\n+absolument à cette contagion, et, quoi que fît le père Madeleine, y\r\n+demeura rebelle, comme si une sorte d'instinct, incorruptible et\r\n+imperturbable, l'éveillait et l'inquiétait. Il semblerait en effet qu'il\r\n+existe dans certains hommes un véritable instinct bestial, pur et\r\n+intègre comme tout instinct, qui crée les antipathies et les sympathies,\r\n+qui sépare fatalement une nature d'une autre nature, qui n'hésite pas,\r\n+qui ne se trouble, ne se tait et ne se dément jamais, clair dans son\r\n+obscurité, infaillible, impérieux, réfractaire à tous les conseils de\r\n+l'intelligence et à tous les dissolvants de la raison, et qui, de\r\n+quelque façon que les destinées soient faites, avertit secrètement\r\n+l'homme-chien de la présence de l'homme-chat, et l'homme-renard de la\r\n+présence de l'homme-lion.\r\n+\r\n+Souvent, quand M. Madeleine passait dans une rue, calme, affectueux,\r\n+entouré des bénédictions de tous, il arrivait qu'un homme de haute\r\n+taille, vêtu d'une redingote gris de fer, armé d'une grosse canne et\r\n+coiffé d'un chapeau rabattu, se retournait brusquement derrière lui, et\r\n+le suivait des yeux jusqu'à ce qu'il eût disparu, croisant les bras,\r\n+secouant lentement la tête, et haussant sa lèvre supérieure avec sa\r\n+lèvre inférieure jusqu'à son nez, sorte de grimace significative qui\r\n+pourrait se traduire par: «Mais qu'est-ce que c'est que cet\r\n+homme-là ?--Pour sûr je l'ai vu quelque part.--En tout cas, je ne suis\r\n+toujours pas sa dupe.»\r\n+\r\n+Ce personnage, grave d'une gravité presque menaçante, était de ceux qui,\r\n+même rapidement entrevus, préoccupent l'observateur.\r\n+\r\n+Il se nommait Javert, et il était de la police.\r\n+\r\n+Il remplissait à Montreuil-sur-mer les fonctions pénibles, mais utiles,\r\n+d'inspecteur. Il n'avait pas vu les commencements de Madeleine. Javert\r\n+devait le poste qu'il occupait à la protection de M. Chabouillet, le\r\n+secrétaire du ministre d'État, comte Anglès, alors préfet de police à \r\n+Paris. Quand Javert était arrivé à Montreuil-sur-mer, la fortune du\r\n+grand manufacturier était déjà faite, et le père Madeleine était devenu\r\n+monsieur Madeleine.\r\n+\r\n+Certains officiers de police ont une physionomie à part et qui se\r\n+complique d'un air de bassesse mêlé à un air d'autorité. Javert avait\r\n+cette physionomie, moins la bassesse.\r\n+\r\n+Dans notre conviction, si les âmes étaient visibles aux yeux, on verrait\r\n+distinctement cette chose étrange que chacun des individus de l'espèce\r\n+humaine correspond à quelqu'une des espèces de la création animale; et\r\n+l'on pourrait reconnaître aisément cette vérité à peine entrevue par le\r\n+penseur, que, depuis l'huître jusqu'à l'aigle, depuis le porc jusqu'au\r\n+tigre, tous les animaux sont dans l'homme et que chacun d'eux est dans\r\n+un homme. Quelquefois même plusieurs d'entre eux à la fois.\r\n+\r\n+Les animaux ne sont autre chose que les figures de nos vertus et de nos\r\n+vices, errantes devant nos yeux, les fantômes visibles de nos âmes. Dieu\r\n+nous les montre pour nous faire réfléchir. Seulement, comme les animaux\r\n+ne sont que des ombres, Dieu ne les a point faits éducables dans le sens\r\n+complet du mot; à quoi bon? Au contraire, nos âmes étant des réalités et\r\n+ayant une fin qui leur est propre, Dieu leur a donné l'intelligence,\r\n+c'est-à -dire l'éducation possible. L'éducation sociale bien faite peut\r\n+toujours tirer d'une âme, quelle qu'elle soit, l'utilité qu'elle\r\n+contient.\r\n+\r\n+Ceci soit dit, bien entendu, au point de vue restreint de la vie\r\n+terrestre apparente, et sans préjuger la question profonde de la\r\n+personnalité antérieure et ultérieure des êtres qui ne sont pas l'homme.\r\n+Le moi visible n'autorise en aucune façon le penseur à nier le moi\r\n+latent. Cette réserve faite, passons.\r\n+\r\n+Maintenant, si l'on admet un moment avec nous que dans tout homme il y a\r\n+une des espèces animales de la création, il nous sera facile de dire ce\r\n+que c'était que l'officier de paix Javert.\r\n+\r\n+Les paysans asturiens sont convaincus que dans toute portée de louve il\r\n+y a un chien, lequel est tué par la mère, sans quoi en grandissant il\r\n+dévorerait les autres petits.\r\n+\r\n+Donnez une face humaine à ce chien fils d'une louve, et ce sera Javert.\r\n+\r\n+Javert était né dans une prison d'une tireuse de cartes dont le mari\r\n+était aux galères. En grandissant, il pensa qu'il était en dehors de la\r\n+société et désespéra d'y rentrer jamais. Il remarqua que la société\r\n+maintient irrémissiblement en dehors d'elle deux classes d'hommes, ceux\r\n+qui l'attaquent et ceux qui la gardent; il n'avait le choix qu'entre ces\r\n+deux classes; en même temps il se sentait je ne sais quel fond de\r\n+rigidité, de régularité et de probité, compliqué d'une inexprimable\r\n+haine pour cette race de bohèmes dont il était. Il entra dans la police.\r\n+\r\n+Il y réussit. À quarante ans il était inspecteur.\r\n+\r\n+Il avait dans sa jeunesse été employé dans les chiourmes du midi.\r\n+\r\n+Avant d'aller plus loin, entendons-nous sur ce mot face humaine que nous\r\n+appliquions tout à l'heure à Javert.\r\n+\r\n+La face humaine de Javert consistait en un nez camard, avec deux\r\n+profondes narines vers lesquelles montaient sur ses deux joues d'énormes\r\n+favoris. On se sentait mal à l'aise la première fois qu'on voyait ces\r\n+deux forêts et ces deux cavernes. Quand Javert riait, ce qui était rare\r\n+et terrible, ses lèvres minces s'écartaient, et laissaient voir, non\r\n+seulement ses dents, mais ses gencives, et il se faisait autour de son\r\n+nez un plissement épaté et sauvage comme sur un mufle de bête fauve.\r\n+Javert sérieux était un dogue; lorsqu'il riait, c'était un tigre. Du\r\n+reste, peu de crâne, beaucoup de mâchoire, les cheveux cachant le front\r\n+et tombant sur les sourcils, entre les deux yeux un froncement central\r\n+permanent comme une étoile de colère, le regard obscur, la bouche pincée\r\n+et redoutable, l'air du commandement féroce.\r\n+\r\n+Cet homme était composé de deux sentiments très simples, et relativement\r\n+très bons, mais qu'il faisait presque mauvais à force de les exagérer:\r\n+le respect de l'autorité, la haine de la rébellion; et à ses yeux le\r\n+vol, le meurtre, tous les crimes, n'étaient que des formes de la\r\n+rébellion. Il enveloppait dans une sorte de foi aveugle et profonde tout\r\n+ce qui a une fonction dans l'État, depuis le premier ministre jusqu'au\r\n+garde champêtre. Il couvrait de mépris, d'aversion et de dégoût tout ce\r\n+qui avait franchi une fois le seuil légal du mal. Il était absolu et\r\n+n'admettait pas d'exceptions. D'une part il disait:\r\n+\r\n+--Le fonctionnaire ne peut se tromper; le magistrat n'a jamais tort.\r\n+\r\n+D'autre part il disait:\r\n+\r\n+--Ceux-ci sont irrémédiablement perdus. Rien de bon n'en peut sortir.\r\n+\r\n+Il partageait pleinement l'opinion de ces esprits extrêmes qui\r\n+attribuent à la loi humaine je ne sais quel pouvoir de faire ou, si l'on\r\n+veut, de constater des damnés, et qui mettent un Styx au bas de la\r\n+société. Il était stoïque, sérieux, austère; rêveur triste; humble et\r\n+hautain comme les fanatiques. Son regard était une vrille. Cela était\r\n+froid et cela perçait. Toute sa vie tenait dans ces deux mots: veiller\r\n+et surveiller. Il avait introduit la ligne droite dans ce qu'il y a de\r\n+plus tortueux au monde; il avait la conscience de son utilité, la\r\n+religion de ses fonctions, et il était espion comme on est prêtre.\r\n+Malheur à qui tombait sous sa main! Il eût arrêté son père s'évadant du\r\n+bagne et dénoncé sa mère en rupture de ban. Et il l'eût fait avec cette\r\n+sorte de satisfaction intérieure que donne la vertu. Avec cela une vie\r\n+de privations, l'isolement, l'abnégation, la chasteté, jamais une\r\n+distraction. C'était le devoir implacable, la police comprise comme les\r\n+Spartiates comprenaient Sparte, un guet impitoyable, une honnêteté\r\n+farouche, un mouchard marmoréen, Brutus dans Vidocq.\r\n+\r\n+Toute la personne de Javert exprimait l'homme qui épie et qui se dérobe.\r\n+L'école mystique de Joseph de Maistre, laquelle à cette époque\r\n+assaisonnait de haute cosmogonie ce qu'on appelait les journaux ultras,\r\n+n'eût pas manqué de dire que Javert était un symbole. On ne voyait pas\r\n+son front qui disparaissait sous son chapeau, on ne voyait pas ses yeux\r\n+qui se perdaient sous ses sourcils, on ne voyait pas son menton qui\r\n+plongeait dans sa cravate, on ne voyait pas ses mains qui rentraient\r\n+dans ses manches, on ne voyait pas sa canne qu'il portait sous sa\r\n+redingote. Mais l'occasion venue, on voyait tout à coup sortir de toute\r\n+cette ombre, comme d'une embuscade, un front anguleux et étroit, un\r\n+regard funeste, un menton menaçant, des mains énormes; et un gourdin\r\n+monstrueux.\r\n+\r\n+À ses moments de loisir, qui étaient peu fréquents, tout en haïssant les\r\n+livres, il lisait; ce qui fait qu'il n'était pas complètement illettré.\r\n+Cela se reconnaissait à quelque emphase dans la parole.\r\n+\r\n+Il n'avait aucun vice, nous l'avons dit. Quand il était content de lui,\r\n+il s'accordait une prise de tabac. Il tenait à l'humanité par là .\r\n+\r\n+On comprendra sans peine que Javert était l'effroi de toute cette classe\r\n+que la statistique annuelle du ministère de la justice désigne sous la\r\n+rubrique: _Gens sans aveu_. Le nom de Javert prononcé les mettait en\r\n+déroute; la face de Javert apparaissant les pétrifiait.\r\n+\r\n+Tel était cet homme formidable.\r\n+\r\n+Javert était comme un oeil toujours fixé sur M. Madeleine. Oeil plein de\r\n+soupçon et de conjectures. M. Madeleine avait fini par s'en apercevoir,\r\n+mais il sembla que cela fût insignifiant pour lui. Il ne fit pas même\r\n+une question à Javert, il ne le cherchait ni ne l'évitait, et il\r\n+portait, sans paraître y faire attention, ce regard gênant et presque\r\n+pesant. Il traitait Javert comme tout le monde, avec aisance et bonté.\r\n+\r\n+À quelques paroles échappées à Javert, on devinait qu'il avait recherché\r\n+secrètement, avec cette curiosité qui tient à la race et où il entre\r\n+autant d'instinct que de volonté, toutes les traces antérieures que le\r\n+père Madeleine avait pu laisser ailleurs. Il paraissait savoir, et il\r\n+disait parfois à mots couverts, que quelqu'un avait pris certaines\r\n+informations dans un certain pays sur une certaine famille disparue. Une\r\n+fois il lui arriva de dire, se parlant à lui-même:\r\n+\r\n+--Je crois que je le tiens!\r\n+\r\n+Puis il resta trois jours pensif sans prononcer une parole. Il paraît\r\n+que le fil qu'il croyait tenir s'était rompu. Du reste, et ceci est le\r\n+correctif nécessaire à ce que le sens de certains mots pourrait\r\n+présenter de trop absolu, il ne peut y avoir rien de vraiment\r\n+infaillible dans une créature humaine, et le propre de l'instinct est\r\n+précisément de pouvoir être troublé, dépisté et dérouté. Sans quoi il\r\n+serait supérieur à l'intelligence, et la bête se trouverait avoir une\r\n+meilleure lumière que l'homme.\r\n+\r\n+Javert était évidemment quelque peu déconcerté par le complet naturel et\r\n+la tranquillité de M. Madeleine.\r\n+\r\n+Un jour pourtant son étrange manière d'être parut faire impression sur\r\n+M. Madeleine. Voici à quelle occasion.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VI\r\n+\r\n+Le père Fauchelevent\r\n+\r\n+\r\n+M. Madeleine passait un matin dans une ruelle non pavée de\r\n+Montreuil-sur-mer. Il entendit du bruit et vit un groupe à quelque\r\n+distance. Il y alla. Un vieux homme, nommé le père Fauchelevent, venait\r\n+de tomber sous sa charrette dont le cheval s'était abattu.\r\n+\r\n+Ce Fauchelevent était un des rares ennemis qu'eût encore M. Madeleine à \r\n+cette époque. Lorsque Madeleine était arrivé dans le pays, Fauchelevent,\r\n+ancien tabellion et paysan presque lettré, avait un commerce qui\r\n+commençait à aller mal. Fauchelevent avait vu ce simple ouvrier qui\r\n+s'enrichissait, tandis que lui, maître, se ruinait. Cela l'avait rempli\r\n+de jalousie, et il avait fait ce qu'il avait pu en toute occasion pour\r\n+nuire à Madeleine. Puis la faillite était venue, et, vieux, n'ayant plus\r\n+à lui qu'une charrette et un cheval, sans famille et sans enfants du\r\n+reste, pour vivre il s'était fait charretier.\r\n+\r\n+Le cheval avait les deux cuisses cassées et ne pouvait se relever. Le\r\n+vieillard était engagé entre les roues. La chute avait été tellement\r\n+malheureuse que toute la voiture pesait sur sa poitrine. La charrette\r\n+était assez lourdement chargée. Le père Fauchelevent poussait des râles\r\n+lamentables. On avait essayé de le tirer, mais en vain. Un effort\r\n+désordonné, une aide maladroite, une secousse à faux pouvaient\r\n+l'achever. Il était impossible de le dégager autrement qu'en soulevant\r\n+la voiture par-dessous. Javert, qui était survenu au moment de\r\n+l'accident, avait envoyé chercher un cric.\r\n+\r\n+M. Madeleine arriva. On s'écarta avec respect.\r\n+\r\n+--À l'aide! criait le vieux Fauchelevent. Qui est-ce qui est bon enfant\r\n+pour sauver le vieux?\r\n+\r\n+M. Madeleine se tourna vers les assistants:\r\n+\r\n+--A-t-on un cric?\r\n+\r\n+--On en est allé quérir un, répondit un paysan.\r\n+\r\n+--Dans combien de temps l'aura-t-on?\r\n+\r\n+--On est allé au plus près, au lieu Flachot, où il y a un maréchal; mais\r\n+c'est égal, il faudra bien un bon quart d'heure.\r\n+\r\n+--Un quart d'heure! s'écria Madeleine.\r\n+\r\n+Il avait plu la veille, le sol était détrempé, la charrette s'enfonçait\r\n+dans la terre à chaque instant et comprimait de plus en plus la poitrine\r\n+du vieux charretier. Il était évident qu'avant cinq minutes il aurait\r\n+les côtes brisées.\r\n+\r\n+--Il est impossible d'attendre un quart d'heure, dit Madeleine aux\r\n+paysans qui regardaient.\r\n+\r\n+--Il faut bien!\r\n+\r\n+--Mais il ne sera plus temps! Vous ne voyez donc pas que la charrette\r\n+s'enfonce?\r\n+\r\n+--Dame!\r\n+\r\n+--Écoutez, reprit Madeleine, il y a encore assez de place sous la\r\n+voiture pour qu'un homme s'y glisse et la soulève avec son dos. Rien\r\n+qu'une demi-minute, et l'on tirera le pauvre homme. Y a-t-il ici\r\n+quelqu'un qui ait des reins et du coeur? Cinq louis d'or à gagner!\r\n+\r\n+Personne ne bougea dans le groupe.\r\n+\r\n+--Dix louis, dit Madeleine.\r\n+\r\n+Les assistants baissaient les yeux. Un d'eux murmura:\r\n+\r\n+--Il faudrait être diablement fort. Et puis, on risque de se faire\r\n+écraser!\r\n+\r\n+--Allons! recommença Madeleine, vingt louis! Même silence.\r\n+\r\n+--Ce n'est pas la bonne volonté qui leur manque, dit une voix.\r\n+\r\n+M. Madeleine se retourna, et reconnut Javert. Il ne l'avait pas aperçu\r\n+en arrivant. Javert continua:\r\n+\r\n+--C'est la force. Il faudrait être un terrible homme pour faire la chose\r\n+de lever une voiture comme cela sur son dos.\r\n+\r\n+Puis, regardant fixement M. Madeleine, il poursuivit en appuyant sur\r\n+chacun des mots qu'il prononçait:\r\n+\r\n+--Monsieur Madeleine, je n'ai jamais connu qu'un seul homme capable de\r\n+faire ce que vous demandez là .\r\n+\r\n+Madeleine tressaillit.\r\n+\r\n+Javert ajouta avec un air d'indifférence, mais sans quitter des yeux\r\n+Madeleine:\r\n+\r\n+--C'était un forçat.\r\n+\r\n+--Ah! dit Madeleine.\r\n+\r\n+--Du bagne de Toulon.\r\n+\r\n+Madeleine devint pâle.\r\n+\r\n+Cependant la charrette continuait à s'enfoncer lentement. Le père\r\n+Fauchelevent râlait et hurlait:\r\n+\r\n+--J'étouffe! Ça me brise les côtes! Un cric! quelque chose! Ah!\r\n+\r\n+Madeleine regarda autour de lui:\r\n+\r\n+--Il n'y a donc personne qui veuille gagner vingt louis et sauver la vie\r\n+à ce pauvre vieux?\r\n+\r\n+Aucun des assistants ne remua. Javert reprit:\r\n+\r\n+--Je n'ai jamais connu qu'un homme qui pût remplacer un cric. C'était ce\r\n+forçat.\r\n+\r\n+--Ah! voilà que ça m'écrase! cria le vieillard.\r\n+\r\n+Madeleine leva la tête, rencontra l'oeil de faucon de Javert toujours\r\n+attaché sur lui, regarda les paysans immobiles, et sourit tristement.\r\n+Puis, sans dire une parole, il tomba à genoux, et avant même que la\r\n+foule eût eu le temps de jeter un cri, il était sous la voiture.\r\n+\r\n+Il y eut un affreux moment d'attente et de silence.\r\n+\r\n+On vit Madeleine presque à plat ventre sous ce poids effrayant essayer\r\n+deux fois en vain de rapprocher ses coudes de ses genoux. On lui cria:\r\n+\r\n+--Père Madeleine! retirez-vous de là !\r\n+\r\n+Le vieux Fauchelevent lui-même lui dit:\r\n+\r\n+--Monsieur Madeleine! allez-vous-en! C'est qu'il faut que je meure,\r\n+voyez-vous! Laissez-moi! Vous allez vous faire écraser aussi!\r\n+\r\n+Madeleine ne répondit pas.\r\n+\r\n+Les assistants haletaient. Les roues avaient continué de s'enfoncer, et\r\n+il était déjà devenu presque impossible que Madeleine sortît de dessous\r\n+la voiture.\r\n+\r\n+Tout à coup on vit l'énorme masse s'ébranler, la charrette se soulevait\r\n+lentement, les roues sortaient à demi de l'ornière. On entendit une voix\r\n+étouffée qui criait:\r\n+\r\n+--Dépêchez-vous! aidez!\r\n+\r\n+C'était Madeleine qui venait de faire un dernier effort.\r\n+\r\n+Ils se précipitèrent. Le dévouement d'un seul avait donné de la force et\r\n+du courage à tous. La charrette fut enlevée par vingt bras. Le vieux\r\n+Fauchelevent était sauvé.\r\n+\r\n+Madeleine se releva. Il était blême, quoique ruisselant de sueur. Ses\r\n+habits étaient déchirés et couverts de boue. Tous pleuraient. Le\r\n+vieillard lui baisait les genoux et l'appelait le bon Dieu. Lui, il\r\n+avait sur le visage je ne sais quelle expression de souffrance heureuse\r\n+et céleste, et il fixait son oeil tranquille sur Javert qui le regardait\r\n+toujours.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VII\r\n+\r\n+Fauchelevent devient jardinier à Paris\r\n+\r\n+\r\n+Fauchelevent s'était démis la rotule dans sa chute. Le père Madeleine le\r\n+fit transporter dans une infirmerie qu'il avait établie pour ses\r\n+ouvriers dans le bâtiment même de sa fabrique et qui était desservie par\r\n+deux soeurs de charité. Le lendemain matin, le vieillard trouva un\r\n+billet de mille francs sur sa table de nuit, avec ce mot de la main du\r\n+père Madeleine: _Je vous achète votre charrette et votre cheval_. La\r\n+charrette était brisée et le cheval était mort. Fauchelevent guérit,\r\n+mais son genou resta ankylosé. M. Madeleine, par les recommandations des\r\n+soeurs et de son curé, fit placer le bonhomme comme jardinier dans un\r\n+couvent de femmes du quartier Saint-Antoine à Paris.\r\n+\r\n+Quelque temps après, M. Madeleine fut nommé maire. La première fois que\r\n+Javert vit M. Madeleine revêtu de l'écharpe qui lui donnait toute\r\n+autorité sur la ville, il éprouva cette sorte de frémissement\r\n+qu'éprouverait un dogue qui flairerait un loup sous les habits de son\r\n+maître. À partir de ce moment, il l'évita le plus qu'il put. Quand les\r\n+besoins du service l'exigeaient impérieusement et qu'il ne pouvait faire\r\n+autrement que de se trouver avec M. le maire, il lui parlait avec un\r\n+respect profond.\r\n+\r\n+Cette prospérité créée à Montreuil-sur-mer par le père Madeleine avait,\r\n+outre les signes visibles que nous avons indiqués, un autre symptôme\r\n+qui, pour n'être pas visible, n'était pas moins significatif. Ceci ne\r\n+trompe jamais.\r\n+\r\n+Quand la population souffre, quand le travail manque, quand le commerce\r\n+est nul, le contribuable résiste à l'impôt par pénurie, épuise et\r\n+dépasse les délais, et l'état dépense beaucoup d'argent en frais de\r\n+contrainte et de rentrée. Quand le travail abonde, quand le pays est\r\n+heureux et riche, l'impôt se paye aisément et coûte peu à l'état. On\r\n+peut dire que la misère et la richesse publiques ont un thermomètre\r\n+infaillible, les frais de perception de l'impôt. En sept ans, les frais\r\n+de perception de l'impôt s'étaient réduits des trois quarts dans\r\n+l'arrondissement de Montreuil-sur-mer, ce qui faisait fréquemment citer\r\n+cet arrondissement entre tous par M. de Villèle, alors ministre des\r\n+finances.\r\n+\r\n+Telle était la situation du pays, lorsque Fantine y revint. Personne ne\r\n+se souvenait plus d'elle. Heureusement la porte de la fabrique de M.\r\n+Madeleine était comme un visage ami. Elle s'y présenta, et fut admise\r\n+dans l'atelier des femmes. Le métier était tout nouveau pour Fantine,\r\n+elle n'y pouvait être bien adroite, elle ne tirait donc de sa journée de\r\n+travail que peu de chose, mais enfin cela suffisait, le problème était\r\n+résolu, elle gagnait sa vie.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VIII\r\n+\r\n+Madame Victurnien dépense trente-cinq francs pour la morale\r\n+\r\n+\r\n+Quand Fantine vit qu'elle vivait, elle eut un moment de joie. Vivre\r\n+honnêtement de son travail, quelle grâce du ciel! Le goût du travail lui\r\n+revint vraiment. Elle acheta un miroir, se réjouit d'y regarder sa\r\n+jeunesse, ses beaux cheveux et ses belles dents, oublia beaucoup de\r\n+choses, ne songea plus qu'à sa Cosette et à l'avenir possible, et fut\r\n+presque heureuse. Elle loua une petite chambre et la meubla à crédit sur\r\n+son travail futur; reste de ses habitudes de désordre.\r\n+\r\n+Ne pouvant pas dire qu'elle était mariée, elle s'était bien gardée,\r\n+comme nous l'avons déjà fait entrevoir, de parler de sa petite fille.\r\n+\r\n+En ces commencements, on l'a vu, elle payait exactement les Thénardier.\r\n+Comme elle ne savait que signer, elle était obligée de leur écrire par\r\n+un écrivain public.\r\n+\r\n+Elle écrivait souvent. Cela fut remarqué. On commença à dire tout bas\r\n+dans l'atelier des femmes que Fantine «écrivait des lettres» et qu'«elle\r\n+avait des allures».\r\n+\r\n+Il n'y a rien de tel pour épier les actions des gens que ceux qu'elles\r\n+ne regardent pas.--Pourquoi ce monsieur ne vient-il jamais qu'à la\r\n+brune? pourquoi monsieur un tel n'accroche-t-il jamais sa clef au clou\r\n+le jeudi? pourquoi prend-il toujours les petites rues? pourquoi madame\r\n+descend-elle toujours de son fiacre avant d'arriver à la maison?\r\n+pourquoi envoie-t-elle acheter un cahier de papier à lettres, quand elle\r\n+en a «plein sa papeterie?» etc., etc.--Il existe des êtres qui, pour\r\n+connaître le mot de ces énigmes, lesquelles leur sont du reste\r\n+parfaitement indifférentes, dépensent plus d'argent, prodiguent plus de\r\n+temps, se donnent plus de peine qu'il n'en faudrait pour dix bonnes\r\n+actions; et cela, gratuitement, pour le plaisir, sans être payés de la\r\n+curiosité autrement que par la curiosité. Ils suivront celui-ci ou\r\n+celle-là des jours entiers, feront faction des heures à des coins de\r\n+rue, sous des portes d'allées, la nuit, par le froid et par la pluie,\r\n+corrompront des commissionnaires, griseront des cochers de fiacre et des\r\n+laquais, achèteront une femme de chambre, feront acquisition d'un\r\n+portier. Pourquoi? pour rien. Pur acharnement de voir, de savoir et de\r\n+pénétrer. Pure démangeaison de dire. Et souvent ces secrets connus, ces\r\n+mystères publiés, ces énigmes éclairées du grand jour, entraînent des\r\n+catastrophes, des duels, des faillites, des familles ruinées, des\r\n+existences brisées, à la grande joie de ceux qui ont «tout découvert»\r\n+sans intérêt et par pur instinct. Chose triste.\r\n+\r\n+Certaines personnes sont méchantes uniquement par besoin de parler. Leur\r\n+conversation, causerie dans le salon, bavardage dans l'antichambre, est\r\n+comme ces cheminées qui usent vite le bois; il leur faut beaucoup de\r\n+combustible; et le combustible, c'est le prochain.\r\n+\r\n+On observa donc Fantine.\r\n+\r\n+Avec cela, plus d'une était jalouse de ses cheveux blonds et de ses\r\n+dents blanches. On constata que dans l'atelier, au milieu des autres,\r\n+elle se détournait souvent pour essuyer une larme. C'étaient les moments\r\n+où elle songeait à son enfant; peut-être aussi à l'homme qu'elle avait\r\n+aimé.\r\n+\r\n+C'est un douloureux labeur que la rupture des sombres attaches du passé.\r\n+\r\n+On constata qu'elle écrivait, au moins deux fois par mois, toujours à la\r\n+même adresse, et qu'elle affranchissait la lettre. On parvint à se\r\n+procurer l'adresse: _Monsieur, Monsieur Thénardier, aubergiste, à \r\n+Montfermeil_. On fit jaser au cabaret l'écrivain public, vieux bonhomme\r\n+qui ne pouvait pas emplir son estomac de vin rouge sans vider sa poche\r\n+aux secrets. Bref, on sut que Fantine avait un enfant. «Ce devait être\r\n+une espèce de fille.» Il se trouva une commère qui fit le voyage de\r\n+Montfermeil, parla aux Thénardier, et dit à son retour: «Pour mes\r\n+trente-cinq francs, j'en ai eu le coeur net. J'ai vu l'enfant!»\r\n+\r\n+La commère qui fit cela était une gorgone appelée madame Victurnien,\r\n+gardienne et portière de la vertu de tout le monde. Madame Victurnien\r\n+avait cinquante-six ans, et doublait le masque de la laideur du masque\r\n+de la vieillesse. Voix chevrotante, esprit capricant. Cette vieille\r\n+femme avait été jeune, chose étonnante. Dans sa jeunesse, en plein 93,\r\n+elle avait épousé un moine échappé du cloître en bonnet rouge et passé\r\n+des bernardins aux jacobins. Elle était sèche, rêche, revêche, pointue,\r\n+épineuse, presque venimeuse; tout en se souvenant de son moine dont elle\r\n+était veuve, et qui l'avait fort domptée et pliée. C'était une ortie où\r\n+l'on voyait le froissement du froc. À la restauration, elle s'était\r\n+faite bigote, et si énergiquement que les prêtres lui avaient pardonné\r\n+son moine. Elle avait un petit bien qu'elle léguait bruyamment à une\r\n+communauté religieuse. Elle était fort bien vue à l'évêché d'Arras.\r\n+Cette madame Victurnien donc alla à Montfermeil, et revint en disant:\r\n+«J'ai vu l'enfant».\r\n+\r\n+Tout cela prit du temps. Fantine était depuis plus d'un an à la\r\n+fabrique, lorsqu'un matin la surveillante de l'atelier lui remit, de la\r\n+part de M. le maire, cinquante francs, en lui disant qu'elle ne faisait\r\n+plus partie de l'atelier et en l'engageant, de la part de M. le maire, à \r\n+quitter le pays.\r\n+\r\n+C'était précisément dans ce même mois que les Thénardier, après avoir\r\n+demandé douze francs au lieu de six, venaient d'exiger quinze francs au\r\n+lieu de douze.\r\n+\r\n+Fantine fut atterrée. Elle ne pouvait s'en aller du pays, elle devait\r\n+son loyer et ses meubles. Cinquante francs ne suffisaient pas pour\r\n+acquitter cette dette. Elle balbutia quelques mots suppliants. La\r\n+surveillante lui signifia qu'elle eût à sortir sur-le-champ de\r\n+l'atelier. Fantine n'était du reste qu'une ouvrière médiocre. Accablée\r\n+de honte plus encore que de désespoir, elle quitta l'atelier et rentra\r\n+dans sa chambre. Sa faute était donc maintenant connue de tous!\r\n+\r\n+Elle ne se sentit plus la force de dire un mot. On lui conseilla de voir\r\n+M. le maire; elle n'osa pas. M. le maire lui donnait cinquante francs,\r\n+parce qu'il était bon, et la chassait, parce qu'il était juste. Elle\r\n+plia sous cet arrêt.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IX\r\n+\r\n+Succès de Madame Victurnien\r\n+\r\n+\r\n+La veuve du moine fut donc bonne à quelque chose.\r\n+\r\n+Du reste, M. Madeleine n'avait rien su de tout cela. Ce sont là de ces\r\n+combinaisons d'événements dont la vie est pleine. M. Madeleine avait\r\n+pour habitude de n'entrer presque jamais dans l'atelier des femmes. Il\r\n+avait mis à la tête de cet atelier une vieille fille, que le curé lui\r\n+avait donnée, et il avait toute confiance dans cette surveillante,\r\n+personne vraiment respectable, ferme, équitable, intègre, remplie de la\r\n+charité qui consiste à donner, mais n'ayant pas au même degré la charité\r\n+qui consiste à comprendre et à pardonner. M. Madeleine se remettait de\r\n+tout sur elle. Les meilleurs hommes sont souvent forcés de déléguer leur\r\n+autorité. C'est dans cette pleine puissance et avec la conviction\r\n+qu'elle faisait bien, que la surveillante avait instruit le procès,\r\n+jugé, condamné et exécuté Fantine.\r\n+\r\n+Quant aux cinquante francs, elle les avait donnés sur une somme que M.\r\n+Madeleine lui confiait pour aumônes et secours aux ouvrières et dont\r\n+elle ne rendait pas compte.\r\n+\r\n+Fantine s'offrit comme servante dans le pays; elle alla d'une maison à \r\n+l'autre. Personne ne voulut d'elle. Elle n'avait pu quitter la ville. Le\r\n+marchand fripier auquel elle devait ses meubles, quels meubles! lui\r\n+avait dit: «Si vous vous en allez, je vous fais arrêter comme voleuse.»\r\n+Le propriétaire auquel elle devait son loyer, lui avait dit:\r\n+\r\n+«Vous êtes jeune et jolie, vous pouvez payer.» Elle partagea les\r\n+cinquante francs entre le propriétaire et le fripier, rendit au marchand\r\n+les trois quarts de son mobilier, ne garda que le nécessaire, et se\r\n+trouva sans travail, sans état, n'ayant plus que son lit, et devant\r\n+encore environ cent francs.\r\n+\r\n+Elle se mit à coudre de grosses chemises pour les soldats de la\r\n+garnison, et gagnait douze sous par jour. Sa fille lui en coûtait dix.\r\n+C'est en ce moment qu'elle commença à mal payer les Thénardier.\r\n+\r\n+Cependant une vieille femme qui lui allumait sa chandelle quand elle\r\n+rentrait le soir, lui enseigna l'art de vivre dans la misère. Derrière\r\n+vivre de peu, il y a vivre de rien. Ce sont deux chambres; la première\r\n+est obscure, la seconde est noire.\r\n+\r\n+Fantine apprit comment on se passe tout à fait de feu en hiver, comment\r\n+on renonce à un oiseau qui vous mange un liard de millet tous les deux\r\n+jours, comment on fait de son jupon sa couverture et de sa couverture\r\n+son jupon, comment on ménage sa chandelle en prenant son repas à la\r\n+lumière de la fenêtre d'en face. On ne sait pas tout ce que certains\r\n+êtres faibles, qui ont vieilli dans le dénûment et l'honnêteté, savent\r\n+tirer d'un sou. Cela finit par être un talent. Fantine acquit ce sublime\r\n+talent et reprit un peu de courage.\r\n+\r\n+À cette époque, elle disait à une voisine:\r\n+\r\n+--Bah! je me dis: en ne dormant que cinq heures et en travaillant tout\r\n+le reste à mes coutures, je parviendrai bien toujours à gagner à peu\r\n+près du pain. Et puis, quand on est triste, on mange moins. Eh bien! des\r\n+souffrances, des inquiétudes, un peu de pain d'un côté, des chagrins de\r\n+l'autre, tout cela me nourrira.\r\n+\r\n+Dans cette détresse, avoir sa petite fille eût été un étrange bonheur.\r\n+Elle songea à la faire venir. Mais quoi! lui faire partager son\r\n+dénûment! Et puis, elle devait aux Thénardier! comment s'acquitter? Et\r\n+le voyage! comment le payer?\r\n+\r\n+La vieille qui lui avait donné ce qu'on pourrait appeler des leçons de\r\n+vie indigente était une sainte fille nommée Marguerite, dévote de la\r\n+bonne dévotion, pauvre, et charitable pour les pauvres et même pour les\r\n+riches, sachant tout juste assez écrire pour signer _Margueritte_, et\r\n+croyant en Dieu, ce qui est la science.\r\n+\r\n+Il y a beaucoup de ces vertus-là en bas; un jour elles seront en haut.\r\n+Cette vie a un lendemain.\r\n+\r\n+Dans les premiers temps, Fantine avait été si honteuse qu'elle n'avait\r\n+pas osé sortir. Quand elle était dans la rue, elle devinait qu'on se\r\n+retournait derrière elle et qu'on la montrait du doigt; tout le monde la\r\n+regardait et personne ne la saluait; le mépris âcre et froid des\r\n+passants lui pénétrait dans la chair et dans l'âme comme une bise.\r\n+\r\n+Dans les petites villes, il semble qu'une malheureuse soit nue sous les\r\n+sarcasmes et la curiosité de tous. À Paris, du moins, personne ne vous\r\n+connaît, et cette obscurité est un vêtement. Oh! comme elle eût souhaité\r\n+venir à Paris! Impossible.\r\n+\r\n+Il fallut bien s'accoutumer à la déconsidération, comme elle s'était\r\n+accoutumée à l'indigence. Peu à peu elle en prit son parti. Après deux\r\n+ou trois mois elle secoua la honte et se remit à sortir comme si de rien\r\n+n'était.\r\n+\r\n+--Cela m'est bien égal, dit-elle.\r\n+\r\n+Elle alla et vint, la tête haute, avec un sourire amer, et sentit\r\n+qu'elle devenait effrontée.\r\n+\r\n+Madame Victurnien quelquefois la voyait passer de sa fenêtre, remarquait\r\n+la détresse de «cette créature», grâce à elle \u0022remise à sa place\u0022, et se\r\n+félicitait. Les méchants ont un bonheur noir.\r\n+\r\n+L'excès du travail fatiguait Fantine, et la petite toux sèche qu'elle\r\n+avait augmenta. Elle disait quelquefois à sa voisine Marguerite: «Tâtez\r\n+donc comme mes mains sont chaudes.»\r\n+\r\n+Cependant le matin, quand elle peignait avec un vieux peigne cassé ses\r\n+beaux cheveux qui ruisselaient comme de la soie floche, elle avait une\r\n+minute de coquetterie heureuse.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre X\r\n+\r\n+Suite du succès\r\n+\r\n+\r\n+Elle avait été congédiée vers la fin de l'hiver; l'été se passa, mais\r\n+l'hiver revint. Jours courts, moins de travail. L'hiver, point de\r\n+chaleur, point de lumière, point de midi, le soir touche au matin,\r\n+brouillard, crépuscule, la fenêtre est grise, on n'y voit pas clair. Le\r\n+ciel est un soupirail. Toute la journée est une cave. Le soleil a l'air\r\n+d'un pauvre. L'affreuse saison! L'hiver change en pierre l'eau du ciel\r\n+et le coeur de l'homme. Ses créanciers la harcelaient.\r\n+\r\n+Fantine gagnait trop peu. Ses dettes avaient grossi. Les Thénardier, mal\r\n+payés, lui écrivaient à chaque instant des lettres dont le contenu la\r\n+désolait et dont le port la ruinait. Un jour ils lui écrivirent que sa\r\n+petite Cosette était toute nue par le froid qu'il faisait, qu'elle avait\r\n+besoin d'une jupe de laine, et qu'il fallait au moins que la mère\r\n+envoyât dix francs pour cela. Elle reçut la lettre, et la froissa dans\r\n+ses mains tout le jour. Le soir elle entra chez un barbier qui habitait\r\n+le coin de la rue, et défit son peigne. Ses admirables cheveux blonds\r\n+lui tombèrent jusqu'aux reins.\r\n+\r\n+--Les beaux cheveux! s'écria le barbier.\r\n+\r\n+--Combien m'en donneriez-vous? dit-elle.\r\n+\r\n+--Dix francs.\r\n+\r\n+--Coupez-les.\r\n+\r\n+Elle acheta une jupe de tricot et l'envoya aux Thénardier.\r\n+\r\n+Cette jupe fit les Thénardier furieux. C'était de l'argent qu'ils\r\n+voulaient. Ils donnèrent la jupe à Eponine. La pauvre Alouette continua\r\n+de frissonner.\r\n+\r\n+Fantine pensa: «Mon enfant n'a plus froid. Je l'ai habillée de mes\r\n+cheveux.» Elle mettait de petits bonnets ronds qui cachaient sa tête\r\n+tondue et avec lesquels elle était encore jolie.\r\n+\r\n+Un travail ténébreux se faisait dans le coeur de Fantine. Quand elle vit\r\n+qu'elle ne pouvait plus se coiffer, elle commença à tout prendre en\r\n+haine autour d'elle. Elle avait longtemps partagé la vénération de tous\r\n+pour le père Madeleine; cependant, à force de se répéter que c'était lui\r\n+qui l'avait chassée, et qu'il était la cause de son malheur, elle en\r\n+vint à le haïr lui aussi, lui surtout. Quand elle passait devant la\r\n+fabrique aux heures où les ouvriers sont sur la porte, elle affectait de\r\n+rire et de chanter.\r\n+\r\n+Une vieille ouvrière qui la vit une fois chanter et rire de cette façon\r\n+dit:\r\n+\r\n+--Voilà une fille qui finira mal.\r\n+\r\n+Elle prit un amant, le premier venu, un homme qu'elle n'aimait pas, par\r\n+bravade, avec la rage dans le coeur. C'était un misérable, une espèce de\r\n+musicien mendiant, un oisif gueux, qui la battait, et qui la quitta\r\n+comme elle l'avait pris, avec dégoût. Elle adorait son enfant.\r\n+\r\n+Plus elle descendait, plus tout devenait sombre autour d'elle plus ce\r\n+doux petit ange rayonnait dans le fond de son âme. Elle disait. Quand je\r\n+serai riche, j'aurai ma Cosette avec moi; et elle riait. La toux ne la\r\n+quittait pas, et elle avait des sueurs dans le dos.\r\n+\r\n+Un jour elle reçut des Thénardier une lettre ainsi conçue:\r\n+\r\n+«Cosette est malade d'une maladie qui est dans le pays. Une fièvre\r\n+miliaire, qu'ils appellent. Il faut des drogues chères. Cela nous ruine\r\n+et nous ne pouvons plus payer. Si vous ne nous envoyez pas quarante\r\n+francs avant huit jours, la petite est morte.»\r\n+\r\n+Elle se mit à rire aux éclats, et elle dit à sa vieille voisine:\r\n+\r\n+--Ah! ils sont bons! quarante francs! que ça! ça fait deux napoléons! Où\r\n+veulent-ils que je les prenne? Sont-ils bêtes, ces paysans!\r\n+\r\n+Cependant elle alla dans l'escalier près d'une lucarne et relut la\r\n+lettre.\r\n+\r\n+Puis elle descendit l'escalier et sortit en courant et en sautant, riant\r\n+toujours. Quelqu'un qui la rencontra lui dit:\r\n+\r\n+--Qu'est-ce que vous avez donc à être si gaie?\r\n+\r\n+Elle répondit:\r\n+\r\n+--C'est une bonne bêtise que viennent de m'écrire des gens de la\r\n+campagne. Ils me demandent quarante francs. Paysans, va!\r\n+\r\n+Comme elle passait sur la place, elle vit beaucoup de monde qui\r\n+entourait une voiture de forme bizarre sur l'impériale de laquelle\r\n+pérorait tout debout un homme vêtu de rouge. C'était un bateleur\r\n+dentiste en tournée, qui offrait au public des râteliers complets, des\r\n+opiats, des poudres et des élixirs.\r\n+\r\n+Fantine se mêla au groupe et se mit à rire comme les autres de cette\r\n+harangue où il y avait de l'argot pour la canaille et du jargon pour les\r\n+gens comme il faut. L'arracheur de dents vit cette belle fille qui\r\n+riait, et s'écria tout à coup:\r\n+\r\n+--Vous avez de jolies dents, la fille qui riez là . Si vous voulez me\r\n+vendre vos deux palettes, je vous donne de chaque un napoléon d'or.\r\n+\r\n+--Qu'est-ce que c'est que ça, mes palettes? demanda Fantine.\r\n+\r\n+--Les palettes, reprit le professeur dentiste, c'est les dents de\r\n+devant, les deux d'en haut.\r\n+\r\n+--Quelle horreur! s'écria Fantine.\r\n+\r\n+--Deux napoléons! grommela une vieille édentée qui était là . Qu'en voilà \r\n+une qui est heureuse!\r\n+\r\n+Fantine s'enfuit, et se boucha les oreilles pour ne pas entendre la voix\r\n+enrouée de l'homme qui lui criait: Réfléchissez, la belle! deux\r\n+napoléons, ça peut servir. Si le coeur vous en dit, venez ce soir à \r\n+l'auberge du _Tillac d'argent_, vous m'y trouverez.\r\n+\r\n+Fantine rentra, elle était furieuse et conta la chose à sa bonne voisine\r\n+Marguerite:\r\n+\r\n+--Comprenez-vous cela? ne voilà -t-il pas un abominable homme? comment\r\n+laisse-t-on des gens comme cela aller dans le pays! M'arracher mes deux\r\n+dents de devant! mais je serais horrible! Les cheveux repoussent, mais\r\n+les dents! Ah! le monstre d'homme! j'aimerais mieux me jeter d'un\r\n+cinquième la tête la première sur le pavé! Il m'a dit qu'il serait ce\r\n+soir au _Tillac d'argent_.\r\n+\r\n+--Et qu'est-ce qu'il offrait? demanda Marguerite.\r\n+\r\n+--Deux napoléons.\r\n+\r\n+--Cela fait quarante francs.\r\n+\r\n+--Oui, dit Fantine, cela fait quarante francs.\r\n+\r\n+Elle resta pensive, et se mit à son ouvrage. Au bout d'un quart d'heure,\r\n+elle quitta sa couture et alla relire la lettre des Thénardier sur\r\n+l'escalier.\r\n+\r\n+En rentrant, elle dit à Marguerite qui travaillait près d'elle:\r\n+\r\n+--Qu'est-ce que c'est donc que cela, une fièvre miliaire? Savez-vous?\r\n+\r\n+--Oui, répondit la vieille fille, c'est une maladie.\r\n+\r\n+--Ça a donc besoin de beaucoup de drogues?\r\n+\r\n+--Oh! des drogues terribles.\r\n+\r\n+--Où ça vous prend-il?\r\n+\r\n+--C'est une maladie qu'on a comme ça.\r\n+\r\n+--Cela attaque donc les enfants?\r\n+\r\n+--Surtout les enfants.\r\n+\r\n+--Est-ce qu'on en meurt?\r\n+\r\n+--Très bien, dit Marguerite.\r\n+\r\n+Fantine sortit et alla encore une fois relire la lettre sur l'escalier.\r\n+\r\n+Le soir elle descendit, et on la vit qui se dirigeait du côté de la rue\r\n+de Paris où sont les auberges.\r\n+\r\n+Le lendemain matin, comme Marguerite entrait dans la chambre de Fantine\r\n+avant le jour, car elles travaillaient toujours ensemble et de cette\r\n+façon n'allumaient qu'une chandelle pour deux, elle trouva Fantine\r\n+assise sur son lit, pâle, glacée. Elle ne s'était pas couchée. Son\r\n+bonnet était tombé sur ses genoux. La chandelle avait brûlé toute la\r\n+nuit et était presque entièrement consumée.\r\n+\r\n+Marguerite s'arrêta sur le seuil, pétrifiée de cet énorme désordre, et\r\n+s'écria:\r\n+\r\n+--Seigneur! la chandelle qui est toute brûlée! il s'est passé des\r\n+événements!\r\n+\r\n+Puis elle regarda Fantine qui tournait vers elle sa tête sans cheveux.\r\n+\r\n+Fantine depuis la veille avait vieilli de dix ans.\r\n+\r\n+--Jésus! fit Marguerite, qu'est-ce que vous avez, Fantine?\r\n+\r\n+--Je n'ai rien, répondit Fantine. Au contraire. Mon enfant ne mourra pas\r\n+de cette affreuse maladie, faute de secours. Je suis contente.\r\n+\r\n+En parlant ainsi, elle montrait à la vieille fille deux napoléons qui\r\n+brillaient sur la table.\r\n+\r\n+--Ah, Jésus Dieu! dit Marguerite. Mais c'est une fortune! Où avez-vous\r\n+eu ces louis d'or?\r\n+\r\n+--Je les ai eus, répondit Fantine.\r\n+\r\n+En même temps elle sourit. La chandelle éclairait son visage. C'était un\r\n+sourire sanglant. Une salive rougeâtre lui souillait le coin des lèvres,\r\n+et elle avait un trou noir dans la bouche.\r\n+\r\n+Les deux dents étaient arrachées.\r\n+\r\n+Elle envoya les quarante francs à Montfermeil.\r\n+\r\n+Du reste c'était une ruse des Thénardier pour avoir de l'argent. Cosette\r\n+n'était pas malade.\r\n+\r\n+Fantine jeta son miroir par la fenêtre. Depuis longtemps elle avait\r\n+quitté sa cellule du second pour une mansarde fermée d'un loquet sous le\r\n+toit; un de ces galetas dont le plafond fait angle avec le plancher et\r\n+vous heurte à chaque instant la tête. Le pauvre ne peut aller au fond de\r\n+sa chambre comme au fond de sa destinée qu'en se courbant de plus en\r\n+plus. Elle n'avait plus de lit, il lui restait une loque qu'elle\r\n+appelait sa couverture, un matelas à terre et une chaise dépaillée. Un\r\n+petit rosier qu'elle avait s'était désséché dans un coin, oublié. Dans\r\n+l'autre coin, il y avait un pot à beurre à mettre l'eau, qui gelait\r\n+l'hiver, et où les différents niveaux de l'eau restaient longtemps\r\n+marqués par des cercles de glace. Elle avait perdu la honte, elle perdit\r\n+la coquetterie. Dernier signe. Elle sortait avec des bonnets sales. Soit\r\n+faute de temps, soit indifférence, elle ne raccommodait plus son linge.\r\n+À mesure que les talons s'usaient, elle tirait ses bas dans ses\r\n+souliers. Cela se voyait à de certains plis perpendiculaires. Elle\r\n+rapiéçait son corset, vieux et usé, avec des morceaux de calicot qui se\r\n+déchiraient au moindre mouvement. Les gens auxquels elle devait, lui\r\n+faisaient «des scènes», et ne lui laissaient aucun repos. Elle les\r\n+trouvait dans la rue, elle les retrouvait dans son escalier. Elle\r\n+passait des nuits à pleurer et à songer. Elle avait les yeux très\r\n+brillants, et elle sentait une douleur fixe dans l'épaule, vers le haut\r\n+de l'omoplate gauche. Elle toussait beaucoup. Elle haïssait profondément\r\n+le père Madeleine, et ne se plaignait pas. Elle cousait dix-sept heures\r\n+par jour; mais un entrepreneur du travail des prisons, qui faisait\r\n+travailler les prisonnières au rabais, fit tout à coup baisser les prix,\r\n+ce qui réduisit la journée des ouvrières libres à neuf sous. Dix-sept\r\n+heures de travail, et neuf sous par jour! Ses créanciers étaient plus\r\n+impitoyables que jamais. Le fripier, qui avait repris presque tous les\r\n+meubles, lui disait sans cesse: Quand me payeras-tu, coquine? Que\r\n+voulait-on d'elle, bon Dieu! Elle se sentait traquée et il se\r\n+développait en elle quelque chose de la bête farouche. Vers le même\r\n+temps, le Thénardier lui écrivit que décidément il avait attendu avec\r\n+beaucoup trop de bonté, et qu'il lui fallait cent francs, tout de suite;\r\n+sinon qu'il mettrait à la porte la petite Cosette, toute convalescente\r\n+de sa grande maladie, par le froid, par les chemins, et qu'elle\r\n+deviendrait ce qu'elle pourrait, et qu'elle crèverait, si elle voulait.\r\n+«Cent francs, songea Fantine! Mais où y a-t-il un état à gagner cent\r\n+sous par jour?»\r\n+\r\n+--Allons! dit-elle, vendons le reste.\r\n+\r\n+L'infortunée se fit fille publique.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XI\r\n+\r\n+_Christus nos liberavit_\r\n+\r\n+\r\n+Qu'est-ce que c'est que cette histoire de Fantine? C'est la société\r\n+achetant une esclave.\r\n+\r\n+À qui? À la misère.\r\n+\r\n+À la faim, au froid, à l'isolement, à l'abandon, au dénûment. Marché\r\n+douloureux. Une âme pour un morceau de pain. La misère offre, la société\r\n+accepte.\r\n+\r\n+La sainte loi de Jésus-Christ gouverne notre civilisation, mais elle ne\r\n+la pénètre pas encore. On dit que l'esclavage a disparu de la\r\n+civilisation européenne. C'est une erreur. Il existe toujours, mais il\r\n+ne pèse plus que sur la femme, et il s'appelle prostitution.\r\n+\r\n+Il pèse sur la femme, c'est-à -dire sur la grâce, sur la faiblesse, sur\r\n+la beauté, sur la maternité. Ceci n'est pas une des moindres hontes de\r\n+l'homme.\r\n+\r\n+Au point de ce douloureux drame où nous sommes arrivés, il ne reste plus\r\n+rien à Fantine de ce qu'elle a été autrefois. Elle est devenue marbre en\r\n+devenant boue. Qui la touche a froid. Elle passe, elle vous subit et\r\n+elle vous ignore; elle est la figure déshonorée et sévère. La vie et\r\n+l'ordre social lui ont dit leur dernier mot. Il lui est arrivé tout ce\r\n+qui lui arrivera. Elle a tout ressenti, tout supporté, tout éprouvé,\r\n+tout souffert, tout perdu, tout pleuré. Elle est résignée de cette\r\n+résignation qui ressemble à l'indifférence comme la mort ressemble au\r\n+sommeil. Elle n'évite plus rien. Elle ne craint plus rien. Tombe sur\r\n+elle toute la nuée et passe sur elle tout l'océan! que lui importe!\r\n+c'est une éponge imbibée.\r\n+\r\n+Elle le croit du moins, mais c'est une erreur de s'imaginer qu'on épuise\r\n+le sort et qu'on touche le fond de quoi que ce soit.\r\n+\r\n+Hélas! qu'est-ce que toutes ces destinées ainsi poussées pêle-mêle? où\r\n+vont-elles? pourquoi sont-elles ainsi?\r\n+\r\n+Celui qui sait cela voit toute l'ombre.\r\n+\r\n+Il est seul. Il s'appelle Dieu.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XII\r\n+\r\n+Le désoeuvrement de M. Bamatabois\r\n+\r\n+\r\n+Il y a dans toutes les petites villes, et il y avait à Montreuil-sur-mer\r\n+en particulier, une classe de jeunes gens qui grignotent quinze cents\r\n+livres de rente en province du même air dont leurs pareils dévorent à \r\n+Paris deux cent mille francs par an. Ce sont des êtres de la grande\r\n+espèce neutre; hongres, parasites, nuls, qui ont un peu de terre, un peu\r\n+de sottise et un peu d'esprit, qui seraient des rustres dans un salon et\r\n+se croient des gentilshommes au cabaret, qui disent: mes prés, mes bois,\r\n+mes paysans, sifflent les actrices du théâtre pour prouver qu'ils sont\r\n+gens de goût, querellent les officiers de la garnison pour montrer\r\n+qu'ils sont gens de guerre, chassent, fument, bâillent, boivent, sentent\r\n+le tabac, jouent au billard, regardent les voyageurs descendre de\r\n+diligence, vivent au café, dînent à l'auberge, ont un chien qui mange\r\n+les os sous la table et une maîtresse qui pose les plats dessus,\r\n+tiennent à un sou, exagèrent les modes, admirent la tragédie, méprisent\r\n+les femmes, usent leurs vieilles bottes, copient Londres à travers Paris\r\n+et Paris à travers Pont-à -Mousson, vieillissent hébétés, ne travaillent\r\n+pas, ne servent à rien et ne nuisent pas à grand'chose.\r\n+\r\n+M. Félix Tholomyès, resté dans sa province et n'ayant jamais vu Paris,\r\n+serait un de ces hommes-là .\r\n+\r\n+S'ils étaient plus riches, on dirait: ce sont des élégants; s'ils\r\n+étaient plus pauvres, on dirait: ce sont des fainéants. Ce sont tout\r\n+simplement des désoeuvrés. Parmi ces désoeuvrés, il y a des ennuyeux,\r\n+des ennuyés, des rêvasseurs, et quelques drôles.\r\n+\r\n+Dans ce temps-là , un élégant se composait d'un grand col, d'une grande\r\n+cravate, d'une montre à breloques, de trois gilets superposés de\r\n+couleurs différentes, le bleu et le rouge en dedans, d'un habit couleur\r\n+olive à taille courte, à queue de morue, à double rangée de boutons\r\n+d'argent serrés les uns contre les autres et montant jusque sur\r\n+l'épaule, et d'un pantalon olive plus clair, orné sur les deux coutures\r\n+d'un nombre de côtes indéterminé, mais toujours impair, variant de une à \r\n+onze, limite qui n'était jamais franchie. Ajoutez à cela des\r\n+souliers-bottes avec de petits fers au talon, un chapeau à haute forme\r\n+et à bords étroits, des cheveux en touffe, une énorme canne, et une\r\n+conversation rehaussée des calembours de Potier. Sur le tout des éperons\r\n+et des moustaches. À cette époque, des moustaches voulaient dire\r\n+bourgeois et des éperons voulaient dire piéton.\r\n+\r\n+L'élégant de province portait les éperons plus longs et les moustaches\r\n+plus farouches. C'était le temps de la lutte des républiques de\r\n+l'Amérique méridionale contre le roi d'Espagne, de Bolivar contre\r\n+Morillo. Les chapeaux à petits bords étaient royalistes et se nommaient\r\n+des morillos; les libéraux portaient des chapeaux à larges bords qui\r\n+s'appelaient des bolivars.\r\n+\r\n+Huit ou dix mois donc après ce qui a été raconté dans les pages\r\n+précédentes, vers les premiers jours de janvier 1823, un soir qu'il\r\n+avait neigé, un de ces élégants, un de ces désoeuvrés, un \u0022bien\r\n+pensant\u0022, car il avait un morillo, de plus chaudement enveloppé d'un de\r\n+ces grands manteaux qui complétaient dans les temps froids le costume à \r\n+la mode, se divertissait à harceler une créature qui rôdait en robe de\r\n+bal et toute décolletée avec des fleurs sur la tête devant la vitre du\r\n+café des officiers. Cet élégant fumait, car c'était décidément la mode.\r\n+\r\n+Chaque fois que cette femme passait devant lui, il lui jetait, avec une\r\n+bouffée de la fumée de son cigare, quelque apostrophe qu'il croyait\r\n+spirituelle et gaie, comme:--Que tu es laide!--Veux-tu te cacher!--Tu\r\n+n'as pas de dents! etc., etc.--Ce monsieur s'appelait monsieur\r\n+Bamatabois. La femme, triste spectre paré qui allait et venait sur la\r\n+neige, ne lui répondait pas, ne le regardait même pas, et n'en\r\n+accomplissait pas moins en silence et avec une régularité sombre sa\r\n+promenade qui la ramenait de cinq minutes en cinq minutes sous le\r\n+sarcasme, comme le soldat condamné qui revient sous les verges. Ce peu\r\n+d'effet piqua sans doute l'oisif qui, profitant d'un moment où elle se\r\n+retournait, s'avança derrière elle à pas de loup et en étouffant son\r\n+rire, se baissa, prit sur le pavé une poignée de neige et la lui plongea\r\n+brusquement dans le dos entre ses deux épaules nues. La fille poussa un\r\n+rugissement, se tourna, bondit comme une panthère, et se rua sur\r\n+l'homme, lui enfonçant ses ongles dans le visage, avec les plus\r\n+effroyables paroles qui puissent tomber du corps de garde dans le\r\n+ruisseau. Ces injures, vomies d'une voix enrouée par l'eau-de-vie,\r\n+sortaient hideusement d'une bouche à laquelle manquaient en effet les\r\n+deux dents de devant. C'était la Fantine.\r\n+\r\n+Au bruit que cela fit, les officiers sortirent en foule du café, les\r\n+passants s'amassèrent, et il se forma un grand cercle riant, huant et\r\n+applaudissant, autour de ce tourbillon composé de deux êtres où l'on\r\n+avait peine à reconnaître un homme et une femme, l'homme se débattant,\r\n+son chapeau à terre, la femme frappant des pieds et des poings,\r\n+décoiffée, hurlant, sans dents et sans cheveux, livide de colère,\r\n+horrible. Tout à coup un homme de haute taille sortit vivement de la\r\n+foule, saisit la femme à son corsage de satin couvert de boue, et lui\r\n+dit: Suis-moi!\r\n+\r\n+La femme leva la tête; sa voix furieuse s'éteignit subitement. Ses yeux\r\n+étaient vitreux, de livide elle était devenue pâle, et elle tremblait\r\n+d'un tremblement de terreur. Elle avait reconnu Javert.\r\n+\r\n+L'élégant avait profité de l'incident pour s'esquiver.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XIII\r\n+\r\n+Solution de quelques questions de police municipale\r\n+\r\n+\r\n+Javert écarta les assistants, rompit le cercle et se mit à marcher à grands\r\n+pas vers le bureau de police qui est à l'extrémité de la place, traînant\r\n+après lui la misérable. Elle se laissait faire machinalement. Ni lui ni\r\n+elle ne disaient un mot. La nuée des spectateurs, au paroxysme de la\r\n+joie, suivait avec des quolibets. La suprême misère, occasion\r\n+d'obscénités. Arrivé au bureau de police qui était une salle basse\r\n+chauffée par un poêle et gardée par un poste, avec une porte vitrée et\r\n+grillée sur la rue, Javert ouvrit la porte, entra avec Fantine, et\r\n+referma la porte derrière lui, au grand désappointement des curieux qui\r\n+se haussèrent sur la pointe du pied et allongèrent le cou devant la\r\n+vitre trouble du corps de garde, cherchant à voir. La curiosité est une\r\n+gourmandise. Voir, c'est dévorer.\r\n+\r\n+En entrant, la Fantine alla tomber dans un coin, immobile et muette,\r\n+accroupie comme une chienne qui a peur.\r\n+\r\n+Le sergent du poste apporta une chandelle allumée sur une table. Javert\r\n+s'assit, tira de sa poche une feuille de papier timbré et se mit à \r\n+écrire.\r\n+\r\n+Ces classes de femmes sont entièrement remises par nos lois à la\r\n+discrétion de la police. Elle en fait ce qu'elle veut, les punit comme\r\n+bon lui semble, et confisque à son gré ces deux tristes choses qu'elles\r\n+appellent leur industrie et leur liberté. Javert était impassible; son\r\n+visage sérieux ne trahissait aucune émotion. Pourtant il était gravement\r\n+et profondément préoccupé. C'était un de ces moments où il exerçait sans\r\n+contrôle, mais avec tous les scrupules d'une conscience sévère, son\r\n+redoutable pouvoir discrétionnaire. En cet instant, il le sentait, son\r\n+escabeau d'agent de police était un tribunal. Il jugeait. Il jugeait, et\r\n+il condamnait. Il appelait tout ce qu'il pouvait avoir d'idées dans\r\n+l'esprit autour de la grande chose qu'il faisait. Plus il examinait le\r\n+fait de cette fille, plus il se sentait révolté. Il était évident qu'il\r\n+venait de voir commettre un crime. Il venait de voir, là dans la rue, la\r\n+société, représentée par un propriétaire-électeur, insultée et attaquée\r\n+par une créature en dehors de tout. Une prostituée avait attenté à un\r\n+bourgeois. Il avait vu cela, lui Javert. Il écrivait en silence.\r\n+\r\n+Quand il eut fini, il signa, plia le papier et dit au sergent du poste,\r\n+en le lui remettant:\r\n+\r\n+--Prenez trois hommes, et menez cette fille au bloc.\r\n+\r\n+Puis se tournant vers la Fantine:\r\n+\r\n+--Tu en as pour six mois.\r\n+\r\n+La malheureuse tressaillit.\r\n+\r\n+--Six mois! six mois de prison! Six mois à gagner sept sous par jour!\r\n+Mais que deviendra Cosette? ma fille! ma fille! Mais je dois encore plus\r\n+de cent francs aux Thénardier, monsieur l'inspecteur, savez-vous cela?\r\n+\r\n+Elle se traîna sur la dalle mouillée par les bottes boueuses de tous ces\r\n+hommes, sans se lever, joignant les mains, faisant de grands pas avec\r\n+ses genoux.\r\n+\r\n+--Monsieur Javert, dit-elle, je vous demande grâce. Je vous assure que\r\n+je n'ai pas eu tort. Si vous aviez vu le commencement, vous auriez vu!\r\n+je vous jure le bon Dieu que je n'ai pas eu tort. C'est ce monsieur le\r\n+bourgeois que je ne connais pas qui m'a mis de la neige dans le dos.\r\n+Est-ce qu'on a le droit de nous mettre de la neige dans le dos quand\r\n+nous passons comme cela tranquillement sans faire de mal à personne?\r\n+Cela m'a saisie. Je suis un peu malade, voyez-vous! Et puis il y avait\r\n+déjà un peu de temps qu'il me disait des raisons. Tu es laide! tu n'as\r\n+pas de dents! Je le sais bien que je n'ai plus mes dents. Je ne faisais\r\n+rien, moi; je disais: c'est un monsieur qui s'amuse. J'étais honnête\r\n+avec lui, je ne lui parlais pas. C'est à cet instant-là qu'il m'a mis de\r\n+la neige. Monsieur Javert, mon bon monsieur l'inspecteur! est-ce qu'il\r\n+n'y a personne là qui ait vu pour vous dire que c'est bien vrai? J'ai\r\n+peut-être eu tort de me fâcher. Vous savez, dans le premier moment, on\r\n+n'est pas maître. On a des vivacités. Et puis, quelque chose de si froid\r\n+qu'on vous met dans le dos à l'heure que vous ne vous y attendez pas!\r\n+J'ai eu tort d'abîmer le chapeau de ce monsieur. Pourquoi s'est-il en\r\n+allé? Je lui demanderais pardon. Oh! mon Dieu, cela me serait bien égal\r\n+de lui demander pardon. Faites-moi grâce pour aujourd'hui cette fois,\r\n+monsieur Javert. Tenez, vous ne savez pas ça, dans les prisons on ne\r\n+gagne que sept sous, ce n'est pas la faute du gouvernement, mais on\r\n+gagne sept sous, et figurez-vous que j'ai cent francs à payer, ou\r\n+autrement on me renverra ma petite. Ô mon Dieu! je ne peux pas l'avoir\r\n+avec moi. C'est si vilain ce que je fais! Ô ma Cosette, ô mon petit ange\r\n+de la bonne sainte Vierge, qu'est-ce qu'elle deviendra, pauvre loup! Je\r\n+vais vous dire, c'est les Thénardier, des aubergistes, des paysans, ça\r\n+n'a pas de raisonnement. Il leur faut de l'argent. Ne me mettez pas en\r\n+prison! Voyez-vous, c'est une petite qu'on mettrait à même sur la grande\r\n+route, va comme tu pourras, en plein coeur d'hiver, il faut avoir pitié\r\n+de cette chose-là , mon bon monsieur Javert. Si c'était plus grand, ça\r\n+gagnerait sa vie, mais ça ne peut pas, à ces âges-là . Je ne suis pas une\r\n+mauvaise femme au fond. Ce n'est pas la lâcheté et la gourmandise qui\r\n+ont fait de moi ça. J'ai bu de l'eau-de-vie, c'est par misère. Je ne\r\n+l'aime pas, mais cela étourdit. Quand j'étais plus heureuse, on n'aurait\r\n+eu qu'à regarder dans mes armoires, on aurait bien vu que je n'étais pas\r\n+une femme coquette qui a du désordre. J'avais du linge, beaucoup de\r\n+linge. Ayez pitié de moi, monsieur Javert!\r\n+\r\n+Elle parlait ainsi, brisée en deux, secouée par les sanglots, aveuglée\r\n+par les larmes, la gorge nue, se tordant les mains, toussant d'une toux\r\n+sèche et courte, balbutiant tout doucement avec la voix de l'agonie. La\r\n+grande douleur est un rayon divin et terrible qui transfigure les\r\n+misérables. À ce moment-là , la Fantine était redevenue belle. À de\r\n+certains instants, elle s'arrêtait et baisait tendrement le bas de la\r\n+redingote du mouchard. Elle eût attendri un coeur de granit, mais on\r\n+n'attendrit pas un coeur de bois.\r\n+\r\n+--Allons! dit Javert, je t'ai écoutée. As-tu bien tout dit? Marche à \r\n+présent! Tu as tes six mois; _le Père éternel en personne n'y pourrait\r\n+plus rien_.\r\n+\r\n+À cette solennelle parole, Le Père éternel en personne n'y pourrait plus\r\n+rien, elle comprit que l'arrêt était prononcé. Elle s'affaissa sur\r\n+elle-même en murmurant:\r\n+\r\n+--Grâce!\r\n+\r\n+Javert tourna le dos.\r\n+\r\n+Les soldats la saisirent par les bras.\r\n+\r\n+Depuis quelques minutes, un homme était entré sans qu'on eût pris garde\r\n+à lui. Il avait refermé la porte, s'y était adossé, et avait entendu les\r\n+prières désespérées de la Fantine. Au moment où les soldats mirent la\r\n+main sur la malheureuse, qui ne voulait pas se lever, il fit un pas,\r\n+sortit de l'ombre, et dit:\r\n+\r\n+--Un instant, s'il vous plaît!\r\n+\r\n+Javert leva les yeux et reconnut M. Madeleine. Il ôta son chapeau, et\r\n+saluant avec une sorte de gaucherie fâchée:\r\n+\r\n+--Pardon, monsieur le maire....\r\n+\r\n+Ce mot, monsieur le maire, fit sur la Fantine un effet étrange. Elle se\r\n+dressa debout tout d'une pièce comme un spectre qui sort de terre,\r\n+repoussa les soldats des deux bras, marcha droit à M. Madeleine avant\r\n+qu'on eût pu la retenir, et le regardant fixement, l'air égaré, elle\r\n+cria:\r\n+\r\n+--Ah! c'est donc toi qui es monsieur le maire!\r\n+\r\n+Puis elle éclata de rire et lui cracha au visage.\r\n+\r\n+M. Madeleine s'essuya le visage, et dit:\r\n+\r\n+--Inspecteur Javert, mettez cette femme en liberté.\r\n+\r\n+Javert se sentit au moment de devenir fou. Il éprouvait en cet instant,\r\n+coup sur coup, et presque mêlées ensemble, les plus violentes émotions\r\n+qu'il eût ressenties de sa vie. Voir une fille publique cracher au\r\n+visage d'un maire, cela était une chose si monstrueuse que, dans ses\r\n+suppositions les plus effroyables, il eût regardé comme un sacrilège de\r\n+le croire possible. D'un autre côté, dans le fond de sa pensée, il\r\n+faisait confusément un rapprochement hideux entre ce qu'était cette\r\n+femme et ce que pouvait être ce maire, et alors il entrevoyait avec\r\n+horreur je ne sais quoi de tout simple dans ce prodigieux attentat. Mais\r\n+quand il vit ce maire, ce magistrat, s'essuyer tranquillement le visage\r\n+et dire: _mettez cette femme en liberté_, il eut comme un éblouissement\r\n+de stupeur; la pensée et la parole lui manquèrent également; la somme de\r\n+l'étonnement possible était dépassée pour lui. Il resta muet.\r\n+\r\n+Ce mot n'avait pas porté un coup moins étrange à la Fantine. Elle leva\r\n+son bras nu et se cramponna à la clef du poêle comme une personne qui\r\n+chancelle. Cependant elle regardait tout autour d'elle et elle se mit à \r\n+parler à voix basse, comme si elle se parlait à elle-même.\r\n+\r\n+--En liberté! qu'on me laisse aller! que je n'aille pas en prison six\r\n+mois! Qui est-ce qui a dit cela? Il n'est pas possible qu'on ait dit\r\n+cela. J'ai mal entendu. Ça ne peut pas être ce monstre de maire! Est-ce\r\n+que c'est vous, mon bon monsieur Javert, qui avez dit qu'on me mette en\r\n+liberté? Oh! voyez-vous! je vais vous dire et vous me laisserez aller.\r\n+Ce monstre de maire, ce vieux gredin de maire, c'est lui qui est cause\r\n+de tout. Figurez-vous, monsieur Javert, qu'il m'a chassée! à cause d'un\r\n+tas de gueuses qui tiennent des propos dans l'atelier. Si ce n'est pas\r\n+là une horreur! renvoyer une pauvre fille qui fait honnêtement son\r\n+ouvrage! Alors je n'ai plus gagné assez, et tout le malheur est venu.\r\n+D'abord il y a une amélioration que ces messieurs de la police devraient\r\n+bien faire, ce serait d'empêcher les entrepreneurs des prisons de faire\r\n+du tort aux pauvres gens. Je vais vous expliquer cela, voyez-vous. Vous\r\n+gagnez douze sous dans les chemises, cela tombe à neuf sous, il n'y a\r\n+plus moyen de vivre. Il faut donc devenir ce qu'on peut. Moi, j'avais ma\r\n+petite Cosette, j'ai bien été forcée de devenir une mauvaise femme. Vous\r\n+comprenez à présent, que c'est ce gueux de maire qui a tout fait le mal.\r\n+Après cela, j'ai piétiné le chapeau de ce monsieur bourgeois devant le\r\n+café des officiers. Mais lui, il m'avait perdu toute ma robe avec sa\r\n+neige. Nous autres, nous n'avons qu'une robe de soie, pour le soir.\r\n+Voyez-vous, je n'ai jamais fait de mal exprès, vrai, monsieur Javert, et\r\n+je vois partout des femmes bien plus méchantes que moi qui sont bien\r\n+plus heureuses. Ô monsieur Javert, c'est vous qui avez dit qu'on me\r\n+mette dehors, n'est-ce pas? Prenez des informations, parlez à mon\r\n+propriétaire, maintenant je paye mon terme, on vous dira bien que je\r\n+suis honnête. Ah! mon Dieu, je vous demande pardon, j'ai touché, sans\r\n+faire attention, à la clef du poêle, et cela fait fumer.\r\n+\r\n+M. Madeleine l'écoutait avec une attention profonde. Pendant qu'elle\r\n+parlait, il avait fouillé dans son gilet, en avait tiré sa bourse et\r\n+l'avait ouverte. Elle était vide. Il l'avait remise dans sa poche. Il\r\n+dit à la Fantine:\r\n+\r\n+--Combien avez-vous dit que vous deviez?\r\n+\r\n+La Fantine, qui ne regardait que Javert, se retourna de son côté:\r\n+\r\n+--Est-ce que je te parle à toi!\r\n+\r\n+Puis s'adressant aux soldats:\r\n+\r\n+--Dites donc, vous autres, avez-vous vu comme je te vous lui ai craché à \r\n+la figure? Ah! vieux scélérat de maire, tu viens ici pour me faire peur,\r\n+mais je n'ai pas peur de toi. J'ai peur de monsieur Javert. J'ai peur de\r\n+mon bon monsieur Javert!\r\n+\r\n+En parlant ainsi elle se retourna vers l'inspecteur:\r\n+\r\n+--Avec ça, voyez-vous, monsieur l'inspecteur, il faut être juste. Je\r\n+comprends que vous êtes juste, monsieur l'inspecteur. Au fait, c'est\r\n+tout simple, un homme qui joue à mettre un peu de neige dans le dos\r\n+d'une femme, ça les faisait rire, les officiers, il faut bien qu'on se\r\n+divertisse à quelque chose, nous autres nous sommes là pour qu'on\r\n+s'amuse, quoi! Et puis, vous, vous venez, vous êtes bien forcé de mettre\r\n+l'ordre, vous emmenez la femme qui a tort, mais en y réfléchissant,\r\n+comme vous êtes bon, vous dites qu'on me mette en liberté, c'est pour la\r\n+petite, parce que six mois en prison, cela m'empêcherait de nourrir mon\r\n+enfant. Seulement n'y reviens plus, coquine! Oh! je n'y reviendrai plus,\r\n+monsieur Javert! on me fera tout ce qu'on voudra maintenant, je ne\r\n+bougerai plus. Seulement, aujourd'hui, voyez-vous, j'ai crié parce que\r\n+cela m'a fait mal, je ne m'attendais pas du tout à cette neige de ce\r\n+monsieur, et puis, je vous ai dit, je ne me porte pas très bien, je\r\n+tousse, j'ai là dans l'estomac comme une boule qui me brûle, que le\r\n+médecin me dit: soignez-vous. Tenez, tâtez, donnez votre main, n'ayez\r\n+pas peur, c'est ici.\r\n+\r\n+Elle ne pleurait plus, sa voix était caressante, elle appuyait sur sa\r\n+gorge blanche et délicate la grosse main rude de Javert, et elle le\r\n+regardait en souriant.\r\n+\r\n+Tout à coup elle rajusta vivement le désordre de ses vêtements, fit\r\n+retomber les plis de sa robe qui en se traînant s'était relevée presque\r\n+à la hauteur du genou, et marcha vers la porte en disant à demi-voix aux\r\n+soldats avec un signe de tête amical:\r\n+\r\n+--Les enfants, monsieur l'inspecteur a dit qu'on me lâche, je m'en vas.\r\n+\r\n+Elle mit la main sur le loquet. Un pas de plus, elle était dans la rue.\r\n+\r\n+Javert jusqu'à cet instant était resté debout, immobile, l'oeil fixé à \r\n+terre, posé de travers au milieu de cette scène comme une statue\r\n+dérangée qui attend qu'on la mette quelque part.\r\n+\r\n+Le bruit que fit le loquet le réveilla. Il releva la tête avec une\r\n+expression d'autorité souveraine, expression toujours d'autant plus\r\n+effrayante que le pouvoir se trouve placé plus bas, féroce chez la bête\r\n+fauve, atroce chez l'homme de rien.\r\n+\r\n+--Sergent, cria-t-il, vous ne voyez pas que cette drôlesse s'en va! Qui\r\n+est-ce qui vous a dit de la laisser aller?\r\n+\r\n+--Moi, dit Madeleine.\r\n+\r\n+La Fantine à la voix de Javert avait tremblé et lâché le loquet comme un\r\n+voleur pris lâche l'objet volé. À la voix de Madeleine, elle se\r\n+retourna, et à partir de ce moment, sans qu'elle prononçât un mot, sans\r\n+qu'elle osât même laisser sortir son souffle librement, son regard alla\r\n+tour à tour de Madeleine à Javert et de Javert à Madeleine, selon que\r\n+c'était l'un ou l'autre qui parlait.\r\n+\r\n+Il était évident qu'il fallait que Javert eût été, comme on dit, «jeté\r\n+hors des gonds» pour qu'il se fût permis d'apostropher le sergent comme\r\n+il l'avait fait, après l'invitation du maire de mettre Fantine en\r\n+liberté. En était-il venu à oublier la présence de monsieur le maire?\r\n+Avait-il fini par se déclarer à lui-même qu'il était impossible qu'une\r\n+«autorité» eût donné un pareil ordre, et que bien certainement monsieur\r\n+le maire avait dû dire sans le vouloir une chose pour une autre? Ou\r\n+bien, devant les énormités dont il était témoin depuis deux heures, se\r\n+disait-il qu'il fallait revenir aux suprêmes résolutions, qu'il était\r\n+nécessaire que le petit se fit grand, que le mouchard se transformât en\r\n+magistrat, que l'homme de police devînt homme de justice, et qu'en cette\r\n+extrémité prodigieuse l'ordre, la loi, la morale, le gouvernement, la\r\n+société tout entière, se personnifiaient en lui Javert?\r\n+\r\n+Quoi qu'il en soit, quand M. Madeleine eut dit ce moi qu'on vient\r\n+d'entendre, on vit l'inspecteur de police Javert se tourner vers\r\n+monsieur le maire, pâle, froid, les lèvres bleues, le regard désespéré,\r\n+tout le corps agité d'un tremblement imperceptible, et, chose inouïe,\r\n+lui dire, l'oeil baissé, mais la voix ferme:\r\n+\r\n+--Monsieur le maire, cela ne se peut pas.\r\n+\r\n+--Comment? dit M. Madeleine.\r\n+\r\n+--Cette malheureuse a insulté un bourgeois.\r\n+\r\n+--Inspecteur Javert, repartit M. Madeleine avec un accent conciliant et\r\n+calme, écoutez. Vous êtes un honnête homme, et je ne fais nulle\r\n+difficulté de m'expliquer avec vous. Voici le vrai. Je passais sur la\r\n+place comme vous emmeniez cette femme, il y avait encore des groupes, je\r\n+me suis informé, j'ai tout su, c'est le bourgeois qui a eu tort et qui,\r\n+en bonne police, eût dû être arrêté.\r\n+\r\n+Javert reprit:\r\n+\r\n+--Cette misérable vient d'insulter monsieur le maire.\r\n+\r\n+--Ceci me regarde, dit M. Madeleine. Mon injure est à moi peut-être.\r\n+J'en puis faire ce que je veux.\r\n+\r\n+--Je demande pardon à monsieur le maire. Son injure n'est pas à lui,\r\n+elle est à la justice.\r\n+\r\n+--Inspecteur Javert, répliqua M. Madeleine, la première justice, c'est\r\n+la conscience. J'ai entendu cette femme. Je sais ce que je fais.\r\n+\r\n+--Et moi, monsieur le maire, je ne sais pas ce que je vois.\r\n+\r\n+--Alors contentez-vous d'obéir.\r\n+\r\n+--J'obéis à mon devoir. Mon devoir veut que cette femme fasse six mois\r\n+de prison.\r\n+\r\n+M. Madeleine répondit avec douceur:\r\n+\r\n+--Écoutez bien ceci. Elle n'en fera pas un jour.\r\n+\r\n+À cette parole décisive, Javert osa regarder le maire fixement, et lui\r\n+dit, mais avec un son de voix toujours profondément respectueux:\r\n+\r\n+--Je suis au désespoir de résister à monsieur le maire, c'est la\r\n+première fois de ma vie, mais il daignera me permettre de lui faire\r\n+observer que je suis dans la limite de mes attributions. Je reste,\r\n+puisque monsieur le maire le veut, dans le fait du bourgeois. J'étais\r\n+là . C'est cette fille qui s'est jetée sur monsieur Bamatabois, qui est\r\n+électeur et propriétaire de cette belle maison à balcon qui fait le coin\r\n+de l'esplanade, à trois étages et toute en pierre de taille. Enfin, il y\r\n+a des choses dans ce monde! Quoi qu'il en soit, monsieur le maire, cela,\r\n+c'est un fait de police de la rue qui me regarde, et je retiens la femme\r\n+Fantine.\r\n+\r\n+Alors M. Madeleine croisa les bras et dit avec une voix sévère que\r\n+personne dans la ville n'avait encore entendue:\r\n+\r\n+--Le fait dont vous parlez est un fait de police municipale. Aux termes\r\n+des articles neuf, onze, quinze et soixante-six du code d'instruction\r\n+criminelle, j'en suis juge. J'ordonne que cette femme soit mise en\r\n+liberté.\r\n+\r\n+Javert voulut tenter un dernier effort.\r\n+\r\n+--Mais, monsieur le maire....\r\n+\r\n+--Je vous rappelle, à vous, l'article quatre-vingt-un de la loi du 13\r\n+décembre 1799 sur la détention arbitraire.\r\n+\r\n+--Monsieur le maire, permettez....\r\n+\r\n+--Plus un mot.\r\n+\r\n+--Pourtant....\r\n+\r\n+--Sortez, dit M. Madeleine.\r\n+\r\n+Javert reçut le coup, debout, de face, et en pleine poitrine comme un\r\n+soldat russe. Il salua jusqu'à terre monsieur le maire, et sortit.\r\n+\r\n+Fantine se rangea de la porte et le regarda avec stupeur passer devant\r\n+elle.\r\n+\r\n+Cependant elle aussi était en proie à un bouleversement étrange. Elle\r\n+venait de se voir en quelque sorte disputée par deux puissances\r\n+opposées. Elle avait vu lutter devant ses yeux deux hommes tenant dans\r\n+leurs mains sa liberté, sa vie, son âme, son enfant; l'un de ces hommes\r\n+la tirait du côté de l'ombre, l'autre la ramenait vers la lumière. Dans\r\n+cette lutte, entrevue à travers les grossissements de l'épouvante, ces\r\n+deux hommes lui étaient apparus comme deux géants; l'un parlait comme\r\n+son démon, l'autre parlait comme son bon ange. L'ange avait vaincu le\r\n+démon, et, chose qui la faisait frissonner de la tête aux pieds, cet\r\n+ange, ce libérateur, c'était précisément l'homme qu'elle abhorrait, ce\r\n+maire qu'elle avait si longtemps considéré comme l'auteur de tous ses\r\n+maux, ce Madeleine! et au moment même où elle venait de l'insulter d'une\r\n+façon hideuse, il la sauvait! S'était-elle donc trompée? Devait-elle\r\n+donc changer toute son âme?... Elle ne savait, elle tremblait. Elle\r\n+écoutait éperdue, elle regardait effarée, et à chaque parole que disait\r\n+M. Madeleine, elle sentait fondre et s'écrouler en elle les affreuses\r\n+ténèbres de la haine et naître dans son coeur je ne sais quoi de\r\n+réchauffant et d'ineffable qui était de la joie, de la confiance et de\r\n+l'amour.\r\n+\r\n+Quand Javert fut sorti, M. Madeleine se tourna vers elle, et lui dit\r\n+avec une voix lente, ayant peine à parler comme un homme sérieux qui ne\r\n+veut pas pleurer:\r\n+\r\n+--Je vous ai entendue. Je ne savais rien de ce que vous avez dit. Je\r\n+crois que c'est vrai, et je sens que c'est vrai. J'ignorais même que\r\n+vous eussiez quitté mes ateliers. Pourquoi ne vous êtes-vous pas\r\n+adressée à moi? Mais voici: je payerai vos dettes, je ferai venir votre\r\n+enfant, ou vous irez la rejoindre. Vous vivrez ici, à Paris, où vous\r\n+voudrez. Je me charge de votre enfant et de vous. Vous ne travaillerez\r\n+plus, si vous voulez. Je vous donnerai tout l'argent qu'il vous faudra.\r\n+Vous redeviendrez honnête en redevenant heureuse. Et même, écoutez, je\r\n+vous le déclare dès à présent, si tout est comme vous le dites, et je\r\n+n'en doute pas, vous n'avez jamais cessé d'être vertueuse et sainte\r\n+devant Dieu. Oh! pauvre femme!\r\n+\r\n+C'en était plus que la pauvre Fantine n'en pouvait supporter. Avoir\r\n+Cosette! sortir de cette vie infâme! vivre libre, riche, heureuse,\r\n+honnête, avec Cosette! voir brusquement s'épanouir au milieu de sa\r\n+misère toutes ces réalités du paradis! Elle regarda comme hébétée cet\r\n+homme qui lui parlait, et ne put que jeter deux ou trois sanglots: oh!\r\n+oh! oh! Ses jarrets plièrent, elle se mit à genoux devant M. Madeleine,\r\n+et, avant qu'il eût pu l'en empêcher, il sentit qu'elle lui prenait la\r\n+main et que ses lèvres s'y posaient.\r\n+\r\n+Puis elle s'évanouit.\r\n+\r\n+\r\n+\r\n+\r\n+Livre sixième--Javert\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre I\r\n+\r\n+Commencement du repos\r\n+\r\n+\r\n+M. Madeleine fit transporter la Fantine à cette infirmerie qu'il avait\r\n+dans sa propre maison. Il la confia aux soeurs qui la mirent au lit. Une\r\n+fièvre ardente était survenue. Elle passa une partie de la nuit à \r\n+délirer et à parler haut. Cependant elle finit par s'endormir.\r\n+\r\n+Le lendemain vers midi Fantine se réveilla, elle entendit une\r\n+respiration tout près de son lit, elle écarta son rideau et vit M.\r\n+Madeleine debout qui regardait quelque chose au-dessus de sa tête. Ce\r\n+regard était plein de pitié et d'angoisse et suppliait. Elle en suivit\r\n+la direction et vit qu'il s'adressait à un crucifix cloué au mur.\r\n+\r\n+M. Madeleine était désormais transfiguré aux yeux de Fantine. Il lui\r\n+paraissait enveloppé de lumière. Il était absorbé dans une sorte de\r\n+prière. Elle le considéra longtemps sans oser l'interrompre. Enfin elle\r\n+lui dit timidement:\r\n+\r\n+--Que faites-vous donc là ?\r\n+\r\n+M. Madeleine était à cette place depuis une heure. Il attendait que\r\n+Fantine se réveillât. Il lui prit la main, lui tâta le pouls, et\r\n+répondit:\r\n+\r\n+--Comment êtes-vous?\r\n+\r\n+--Bien, j'ai dormi, dit-elle, je crois que je vais mieux. Ce ne sera\r\n+rien.\r\n+\r\n+Lui reprit, répondant à la question qu'elle lui avait adressée d'abord,\r\n+comme s'il ne faisait que de l'entendre:\r\n+\r\n+--Je priais le martyr qui est là -haut.\r\n+\r\n+Et il ajouta dans sa pensée: «Pour la martyre qui est ici-bas.»\r\n+\r\n+M. Madeleine avait passé la nuit et la matinée à s'informer. Il savait\r\n+tout maintenant. Il connaissait dans tous ses poignants détails\r\n+l'histoire de Fantine. Il continua:\r\n+\r\n+--Vous avez bien souffert, pauvre mère. Oh! ne vous plaignez pas, vous\r\n+avez à présent la dot des élus. C'est de cette façon que les hommes font\r\n+des anges. Ce n'est point leur faute; ils ne savent pas s'y prendre\r\n+autrement. Voyez-vous, cet enfer dont vous sortez est la première forme\r\n+du ciel. Il fallait commencer par là .\r\n+\r\n+Il soupira profondément. Elle cependant lui souriait avec ce sublime\r\n+sourire auquel il manquait deux dents.\r\n+\r\n+Javert dans cette même nuit avait écrit une lettre. Il remit lui-même\r\n+cette lettre le lendemain matin au bureau de poste de Montreuil-sur-mer.\r\n+Elle était pour Paris, et la suscription portait: À _monsieur\r\n+Chabouillet, secrétaire de monsieur le préfet de police_. Comme\r\n+l'affaire du corps de garde s'était ébruitée, la directrice du bureau de\r\n+poste et quelques autres personnes qui virent la lettre avant le départ\r\n+et qui reconnurent l'écriture de Javert sur l'adresse, pensèrent que\r\n+c'était sa démission qu'il envoyait.\r\n+\r\n+M. Madeleine se hâta d'écrire aux Thénardier. Fantine leur devait cent\r\n+vingt francs. Il leur envoya trois cents francs en leur disant de se\r\n+payer sur cette somme, et d'amener tout de suite l'enfant à \r\n+Montreuil-sur-mer où sa mère malade la réclamait.\r\n+\r\n+Ceci éblouit le Thénardier.\r\n+\r\n+--Diable! dit-il à sa femme, ne lâchons pas l'enfant. Voilà que cette\r\n+mauviette va devenir une vache à lait. Je devine. Quelque jocrisse se\r\n+sera amouraché de la mère.\r\n+\r\n+Il riposta par un mémoire de cinq cents et quelques francs fort bien\r\n+fait. Dans ce mémoire figuraient pour plus de trois cents francs deux\r\n+notes incontestables, l'une d'un médecin, l'autre d'un apothicaire,\r\n+lesquels avaient soigné et médicamenté dans deux longues maladies\r\n+Éponine et Azelma. Cosette, nous l'avons dit, n'avait pas été malade. Ce\r\n+fut l'affaire d'une toute petite substitution de noms. Thénardier mit au\r\n+bas du mémoire: _reçu à compte trois cents francs_.\r\n+\r\n+M. Madeleine envoya tout de suite trois cents autres francs et écrivit:\r\n+Dépêchez-vous d'amener Cosette.\r\n+\r\n+--Christi! dit le Thénardier, ne lâchons pas l'enfant.\r\n+\r\n+Cependant Fantine ne se rétablissait point. Elle était toujours à \r\n+l'infirmerie. Les soeurs n'avaient d'abord reçu et soigné «cette fille»\r\n+qu'avec répugnance. Qui a vu les bas-reliefs de Reims se souvient du\r\n+gonflement de la lèvre inférieure des vierges sages regardant les\r\n+vierges folles. Cet antique mépris des vestales pour les ambulaïes est\r\n+un des plus profonds instincts de la dignité féminine; les soeurs\r\n+l'avaient éprouvé, avec le redoublement qu'ajoute la religion. Mais, en\r\n+peu de jours, Fantine les avait désarmées. Elle avait toutes sortes de\r\n+paroles humbles et douces, et la mère qui était en elle attendrissait.\r\n+Un jour les soeurs l'entendirent qui disait à travers la fièvre:\r\n+\r\n+--J'ai été une pécheresse, mais quand j'aurai mon enfant près de moi,\r\n+cela voudra dire que Dieu m'a pardonné. Pendant que j'étais dans le mal,\r\n+je n'aurais pas voulu avoir ma Cosette avec moi, je n'aurais pas pu\r\n+supporter ses yeux étonnés et tristes. C'était pour elle pourtant que je\r\n+faisais le mal, et c'est ce qui fait que Dieu me pardonne. Je sentirai\r\n+la bénédiction du bon Dieu quand Cosette sera ici. Je la regarderai,\r\n+cela me fera du bien de voir cette innocente. Elle ne sait rien du tout.\r\n+C'est un ange, voyez-vous, mes soeurs. À cet âge-là , les ailes, ça n'est\r\n+pas encore tombé.\r\n+\r\n+M. Madeleine l'allait voir deux fois par jour, et chaque fois elle lui\r\n+demandait:\r\n+\r\n+--Verrai-je bientôt ma Cosette?\r\n+\r\n+Il lui répondait:\r\n+\r\n+--Peut-être demain matin. D'un moment à l'autre elle arrivera, je\r\n+l'attends.\r\n+\r\n+Et le visage pâle de la mère rayonnait.\r\n+\r\n+--Oh! disait-elle, comme je vais être heureuse!\r\n+\r\n+Nous venons de dire qu'elle ne se rétablissait pas. Au contraire, son\r\n+état semblait s'aggraver de semaine en semaine. Cette poignée de neige\r\n+appliquée à nu sur la peau entre les deux omoplates avait déterminé une\r\n+suppression subite de transpiration à la suite de laquelle la maladie\r\n+qu'elle couvait depuis plusieurs années finit par se déclarer\r\n+violemment. On commençait alors à suivre pour l'étude et le traitement\r\n+des maladies de poitrine les belles indications de Laennec. Le médecin\r\n+ausculta Fantine et hocha la tête.\r\n+\r\n+M. Madeleine dit au médecin:\r\n+\r\n+--Eh bien?\r\n+\r\n+--N'a-t-elle pas un enfant qu'elle désire voir? dit le médecin.\r\n+\r\n+--Oui.\r\n+\r\n+--Eh bien, hâtez-vous de le faire venir.\r\n+\r\n+M. Madeleine eut un tressaillement.\r\n+\r\n+Fantine lui demanda:\r\n+\r\n+--Qu'a dit le médecin?\r\n+\r\n+M. Madeleine s'efforça de sourire.\r\n+\r\n+--Il a dit de faire venir bien vite votre enfant. Que cela vous rendra\r\n+la santé.\r\n+\r\n+--Oh! reprit-elle, il a raison! Mais qu'est-ce qu'ils ont donc ces\r\n+Thénardier à me garder ma Cosette! Oh! elle va venir. Voici enfin que je\r\n+vois le bonheur tout près de moi!\r\n+\r\n+Le Thénardier cependant ne «lâchait pas l'enfant» et donnait cent\r\n+mauvaises raisons. Cosette était un peu souffrante pour se mettre en\r\n+route l'hiver. Et puis il y avait un reste de petites dettes criardes\r\n+dans le pays dont il rassemblait les factures, etc., etc.\r\n+\r\n+--J'enverrai quelqu'un chercher Cosette, dit le père Madeleine. S'il le\r\n+faut, j'irai moi-même.\r\n+\r\n+Il écrivit sous la dictée de Fantine cette lettre qu'il lui fit signer:\r\n+\r\n+«Monsieur Thénardier,\r\n+\r\n+«Vous remettrez Cosette à la personne.\r\n+\r\n+«On vous payera toutes les petites choses.\r\n+\r\n+«J'ai l'honneur de vous saluer avec considération.\r\n+\r\n+«Fantine.»\r\n+\r\n+Sur ces entrefaites, il survint un grave incident. Nous avons beau\r\n+tailler de notre mieux le bloc mystérieux dont notre vie est faite, la\r\n+veine noire de la destinée y reparaît toujours.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre II\r\n+\r\n+Comment Jean peut devenir Champ\r\n+\r\n+\r\n+Un matin, M. Madeleine était dans son cabinet, occupé à régler d'avance\r\n+quelques affaires pressantes de la mairie pour le cas où il se\r\n+déciderait à ce voyage de Montfermeil, lorsqu'on vint lui dire que\r\n+l'inspecteur de police Javert demandait à lui parler. En entendant\r\n+prononcer ce nom, M. Madeleine ne put se défendre d'une impression\r\n+désagréable. Depuis l'aventure du bureau de police, Javert l'avait plus\r\n+que jamais évité, et M. Madeleine ne l'avait point revu.\r\n+\r\n+--Faites entrer, dit-il.\r\n+\r\n+Javert entra.\r\n+\r\n+M. Madeleine était resté assis près de la cheminée, une plume à la main,\r\n+l'oeil sur un dossier qu'il feuilletait et qu'il annotait, et qui\r\n+contenait des procès-verbaux de contraventions à la police de la voirie.\r\n+Il ne se dérangea point pour Javert. Il ne pouvait s'empêcher de songer\r\n+à la pauvre Fantine, et il lui convenait d'être glacial.\r\n+\r\n+Javert salua respectueusement M. le maire qui lui tournait le dos. M. le\r\n+maire ne le regarda pas et continua d'annoter son dossier.\r\n+\r\n+Javert fit deux ou trois pas dans le cabinet, et s'arrêta sans rompre le\r\n+silence. Un physionomiste qui eût été familier avec la nature de Javert,\r\n+qui eût étudié depuis longtemps ce sauvage au service de la\r\n+civilisation, ce composé bizarre du Romain, du Spartiate, du moine et du\r\n+caporal, cet espion incapable d'un mensonge, ce mouchard vierge, un\r\n+physionomiste qui eût su sa secrète et ancienne aversion pour M.\r\n+Madeleine, son conflit avec le maire au sujet de la Fantine, et qui eût\r\n+considéré Javert en ce moment, se fût dit: que s'est-il passé? Il était\r\n+évident, pour qui eût connu cette conscience droite, claire, sincère,\r\n+probe, austère et féroce, que Javert sortait de quelque grand événement\r\n+intérieur. Javert n'avait rien dans l'âme qu'il ne l'eût aussi sur le\r\n+visage. Il était, comme les gens violents, sujet aux revirements\r\n+brusques. Jamais sa physionomie n'avait été plus étrange et plus\r\n+inattendue. En entrant, il s'était incliné devant M. Madeleine avec un\r\n+regard où il n'y avait ni rancune, ni colère, ni défiance, il s'était\r\n+arrêté à quelques pas derrière le fauteuil du maire; et maintenant il se\r\n+tenait là , debout, dans une attitude presque disciplinaire, avec la\r\n+rudesse naïve et froide d'un homme qui n'a jamais été doux et qui a\r\n+toujours été patient; il attendait, sans dire un mot, sans faire un\r\n+mouvement, dans une humilité vraie et dans une résignation tranquille,\r\n+qu'il plût à monsieur le maire de se retourner, calme, sérieux, le\r\n+chapeau à la main, les yeux baissés, avec une expression qui tenait le\r\n+milieu entre le soldat devant son officier et le coupable devant son\r\n+juge. Tous les sentiments comme tous les souvenirs qu'on eût pu lui\r\n+supposer avaient disparu. Il n'y avait plus rien sur ce visage\r\n+impénétrable et simple comme le granit, qu'une morne tristesse. Toute sa\r\n+personne respirait l'abaissement et la fermeté, et je ne sais quel\r\n+accablement courageux.\r\n+\r\n+Enfin M. le maire posa sa plume et se tourna à demi.\r\n+\r\n+--Eh bien! qu'est-ce? qu'y a-t-il, Javert?\r\n+\r\n+Javert demeura un instant silencieux comme s'il se recueillait, puis\r\n+éleva la voix avec une sorte de solennité triste qui n'excluait pourtant\r\n+pas la simplicité:\r\n+\r\n+--Il y a, monsieur le maire, qu'un acte coupable a été commis.\r\n+\r\n+--Quel acte?\r\n+\r\n+--Un agent inférieur de l'autorité a manqué de respect à un magistrat de\r\n+la façon la plus grave. Je viens, comme c'est mon devoir, porter le fait\r\n+à votre connaissance.\r\n+\r\n+--Quel est cet agent? demanda M. Madeleine.\r\n+\r\n+--Moi, dit Javert.\r\n+\r\n+--Vous?\r\n+\r\n+--Moi.\r\n+\r\n+--Et quel est le magistrat qui aurait à se plaindre de l'agent?\r\n+\r\n+--Vous, monsieur le maire.\r\n+\r\n+M. Madeleine se dressa sur son fauteuil. Javert poursuivit, l'air sévère\r\n+et les yeux toujours baissés:\r\n+\r\n+--Monsieur le maire, je viens vous prier de vouloir bien provoquer près\r\n+de l'autorité ma destitution.\r\n+\r\n+M. Madeleine stupéfait ouvrit la bouche. Javert l'interrompit.\r\n+\r\n+--Vous direz, j'aurais pu donner ma démission, mais cela ne suffit pas.\r\n+Donner sa démission, c'est honorable. J'ai failli, je dois être puni. Il\r\n+faut que je sois chassé.\r\n+\r\n+Et après une pause, il ajouta:\r\n+\r\n+--Monsieur le maire, vous avez été sévère pour moi l'autre jour\r\n+injustement. Soyez-le aujourd'hui justement.\r\n+\r\n+--Ah çà ! pourquoi? s'écria M. Madeleine. Quel est ce galimatias?\r\n+qu'est-ce que cela veut dire? où y a-t-il un acte coupable commis contre\r\n+moi par vous? qu'est-ce que vous m'avez fait? quels torts avez-vous\r\n+envers moi? Vous vous accusez, vous voulez être remplacé....\r\n+\r\n+--Chassé, dit Javert.\r\n+\r\n+--Chassé, soit. C'est fort bien. Je ne comprends pas.\r\n+\r\n+--Vous allez comprendre, monsieur le maire.\r\n+\r\n+Javert soupira du fond de sa poitrine et reprit toujours froidement et\r\n+tristement:\r\n+\r\n+--Monsieur le maire, il y a six semaines, à la suite de cette scène pour\r\n+cette fille, j'étais furieux, je vous ai dénoncé.\r\n+\r\n+--Dénoncé!\r\n+\r\n+--À la préfecture de police de Paris.\r\n+\r\n+M. Madeleine, qui ne riait pas beaucoup plus souvent que Javert, se mit\r\n+à rire.\r\n+\r\n+--Comme maire ayant empiété sur la police?\r\n+\r\n+--Comme ancien forçat.\r\n+\r\n+Le maire devint livide.\r\n+\r\n+Javert, qui n'avait pas levé les yeux, continua:\r\n+\r\n+--Je le croyais. Depuis longtemps j'avais des idées.\r\n+\r\n+Une ressemblance, des renseignements que vous avez fait prendre à \r\n+Faverolles, votre force des reins, l'aventure du vieux Fauchelevent,\r\n+votre adresse au tir, votre jambe qui traîne un peu, est-ce que je sais,\r\n+moi? des bêtises! mais enfin je vous prenais pour un nommé Jean Valjean.\r\n+\r\n+--Un nommé?... Comment dites-vous ce nom-là ?\r\n+\r\n+--Jean Valjean. C'est un forçat que j'avais vu il y a vingt ans quand\r\n+j'étais adjudant-garde-chiourme à Toulon. En sortant du bagne, ce Jean\r\n+Valjean avait, à ce qu'il paraît, volé chez un évêque, puis il avait\r\n+commis un autre vol à main armée, dans un chemin public, sur un petit\r\n+savoyard. Depuis huit ans il s'était dérobé, on ne sait comment, et on\r\n+le cherchait. Moi je m'étais figuré... Enfin, j'ai fait cette chose! La\r\n+colère m'a décidé, je vous ai dénoncé à la préfecture.\r\n+\r\n+M. Madeleine, qui avait ressaisi le dossier depuis quelques instants,\r\n+reprit avec un accent de parfaite indifférence:\r\n+\r\n+--Et que vous a-t-on répondu?\r\n+\r\n+--Que j'étais fou.\r\n+\r\n+--Eh bien?\r\n+\r\n+--Eh bien, on avait raison.\r\n+\r\n+--C'est heureux que vous le reconnaissiez!\r\n+\r\n+--Il faut bien, puisque le véritable Jean Valjean est trouvé.\r\n+\r\n+La feuille que tenait M. Madeleine lui échappa des mains, il leva la\r\n+tête, regarda fixement Javert, et dit avec un accent inexprimable:\r\n+\r\n+--Ah!\r\n+\r\n+Javert poursuivit:\r\n+\r\n+--Voilà ce que c'est, monsieur le maire. Il paraît qu'il y avait dans le\r\n+pays, du côté d'Ailly-le-Haut-Clocher, une espèce de bonhomme qu'on\r\n+appelait le père Champmathieu. C'était très misérable. On n'y faisait\r\n+pas attention. Ces gens-là , on ne sait pas de quoi cela vit.\r\n+Dernièrement, cet automne, le père Champmathieu a été arrêté pour un vol\r\n+de pommes à cidre, commis chez...--enfin n'importe! Il y a eu vol, mur\r\n+escaladé, branches de l'arbre cassées. On a arrêté mon Champmathieu. Il\r\n+avait encore la branche de pommier à la main. On coffre le drôle.\r\n+Jusqu'ici ce n'est pas beaucoup plus qu'une affaire correctionnelle.\r\n+Mais voici qui est de la providence. La geôle étant en mauvais état,\r\n+monsieur le juge d'instruction trouve à propos de faire transférer\r\n+Champmathieu à Arras où est la prison départementale. Dans cette prison\r\n+d'Arras, il y a un ancien forçat nommé Brevet qui est détenu pour je ne\r\n+sais quoi et qu'on a fait guichetier de chambrée parce qu'il se conduit\r\n+bien. Monsieur le maire, Champmathieu n'est pas plus tôt débarqué que\r\n+voilà Brevet qui s'écrie: «Eh mais! je connais cet homme-là . C'est un\r\n+fagot. Regardez-moi donc, bonhomme! Vous êtes Jean Valjean!--Jean\r\n+Valjean! qui ça Jean Valjean? Le Champmathieu joue l'étonné.--Ne fais\r\n+donc pas le sinvre, dit Brevet. Tu es Jean Valjean! Tu as été au bagne\r\n+de Toulon. Il y a vingt ans. Nous y étions ensemble.--Le Champmathieu\r\n+nie. Parbleu! vous comprenez. On approfondit. On me fouille cette\r\n+aventure-là . Voici ce qu'on trouve: ce Champmathieu, il y a une\r\n+trentaine d'années, a été ouvrier émondeur d'arbres dans plusieurs pays,\r\n+notamment à Faverolles. Là on perd sa trace. Longtemps après, on le\r\n+revoit en Auvergne, puis à Paris, où il dit avoir été charron et avoir\r\n+eu une fille blanchisseuse, mais cela n'est pas prouvé; enfin dans ce\r\n+pays-ci. Or, avant d'aller au bagne pour vol qualifié, qu'était Jean\r\n+Valjean? émondeur. Où? à Faverolles. Autre fait. Ce Valjean s'appelait\r\n+de son nom de baptême Jean et sa mère se nommait de son nom de famille\r\n+Mathieu. Quoi de plus naturel que de penser qu'en sortant du bagne il\r\n+aura pris le nom de sa mère pour se cacher et se sera fait appeler Jean\r\n+Mathieu? Il va en Auvergne. De _Jean_ la prononciation du pays fait\r\n+_Chan_, on l'appelle Chan Mathieu. Notre homme se laisse faire et le\r\n+voilà transformé en Champmathieu. Vous me suivez, n'est-ce pas? On\r\n+s'informe à Faverolles. La famille de Jean Valjean n'y est plus. On ne\r\n+sait plus où elle est. Vous savez, dans ces classes-là , il y a souvent\r\n+de ces évanouissements d'une famille. On cherche, on ne trouve plus\r\n+rien. Ces gens-là , quand ce n'est pas de la boue, c'est de la poussière.\r\n+Et puis, comme le commencement de ces histoires date de trente ans, il\r\n+n'y a plus personne à Faverolles qui ait connu Jean Valjean. On\r\n+s'informe à Toulon. Avec Brevet, il n'y a plus que deux forçats qui\r\n+aient vu Jean Valjean. Ce sont les condamnés à vie Cochepaille et\r\n+Chenildieu. On les extrait du bagne et on les fait venir. On les\r\n+confronte au prétendu Champmathieu. Ils n'hésitent pas. Pour eux comme\r\n+pour Brevet, c'est Jean Valjean. Même âge, il a cinquante-quatre ans,\r\n+même taille, même air, même homme enfin, c'est lui. C'est en ce\r\n+moment-là même que j'envoyais ma dénonciation à la préfecture de Paris.\r\n+On me répond que je perds l'esprit et que Jean Valjean est à Arras au\r\n+pouvoir de la justice. Vous concevez si cela m'étonne, moi qui croyais\r\n+tenir ici ce même Jean Valjean! J'écris à monsieur le juge\r\n+d'instruction. Il me fait venir, on m'amène le Champmathieu....\r\n+\r\n+--Eh bien? interrompit M. Madeleine.\r\n+\r\n+Javert répondit avec son visage incorruptible et triste:\r\n+\r\n+--Monsieur le maire, la vérité est la vérité. J'en suis fâché, mais\r\n+c'est cet homme-là qui est Jean Valjean. Moi aussi je l'ai reconnu.\r\n+\r\n+M. Madeleine reprit d'une voix très basse:\r\n+\r\n+--Vous êtes sûr?\r\n+\r\n+Javert se mit à rire de ce rire douloureux qui échappe à une conviction\r\n+profonde:\r\n+\r\n+--Oh, sûr!\r\n+\r\n+Il demeura un moment pensif, prenant machinalement des pincées de poudre\r\n+de bois dans la sébille à sécher l'encre qui était sur la table, et il\r\n+ajouta:\r\n+\r\n+--Et même, maintenant que je vois le vrai Jean Valjean, je ne comprends\r\n+pas comment j'ai pu croire autre chose. Je vous demande pardon, monsieur\r\n+le maire.\r\n+\r\n+En adressant cette parole suppliante et grave à celui qui, six semaines\r\n+auparavant, l'avait humilié en plein corps de garde et lui avait dit:\r\n+«sortez!» Javert, cet homme hautain, était à son insu plein de\r\n+simplicité et de dignité. M. Madeleine ne répondit à sa prière que par\r\n+cette question brusque:\r\n+\r\n+--Et que dit cet homme?\r\n+\r\n+--Ah, dame! monsieur le maire, l'affaire est mauvaise. Si c'est Jean\r\n+Valjean, il y a récidive. Enjamber un mur, casser une branche, chiper\r\n+des pommes, pour un enfant, c'est une polissonnerie; pour un homme,\r\n+c'est un délit; pour un forçat, c'est un crime. Escalade et vol, tout y\r\n+est. Ce n'est plus la police correctionnelle, c'est la cour d'assises.\r\n+Ce n'est plus quelques jours de prison, ce sont les galères à \r\n+perpétuité. Et puis, il y a l'affaire du petit savoyard que j'espère\r\n+bien qui reviendra. Diable! il y a de quoi se débattre, n'est-ce pas?\r\n+Oui, pour un autre que Jean Valjean. Mais Jean Valjean est un sournois.\r\n+C'est encore là que je le reconnais. Un autre sentirait que cela\r\n+chauffe; il se démènerait, il crierait, la bouilloire chante devant le\r\n+feu, il ne voudrait pas être Jean Valjean, et caetera. Lui, il n'a pas\r\n+l'air de comprendre, il dit: Je suis Champmathieu, je ne sors pas de là !\r\n+Il a l'air étonné, il fait la brute, c'est bien mieux. Oh! le drôle est\r\n+habile. Mais c'est égal, les preuves sont là . Il est reconnu par quatre\r\n+personnes, le vieux coquin sera condamné. C'est porté aux assises, à \r\n+Arras. Je vais y aller pour témoigner. Je suis cité.\r\n+\r\n+M. Madeleine s'était remis à son bureau, avait ressaisi son dossier, et\r\n+le feuilletait tranquillement, lisant et écrivant tour à tour comme un\r\n+homme affairé. Il se tourna vers Javert:\r\n+\r\n+--Assez, Javert. Au fait, tous ces détails m'intéressent fort peu. Nous\r\n+perdons notre temps, et nous avons des affaires pressées. Javert, vous\r\n+allez vous rendre sur-le-champ chez la bonne femme Buseaupied qui vend\r\n+des herbes là -bas au coin de la rue Saint-Saulve. Vous lui direz de\r\n+déposer sa plainte contre le charretier Pierre Chesnelong. Cet homme est\r\n+un brutal qui a failli écraser cette femme et son enfant. Il faut qu'il\r\n+soit puni. Vous irez ensuite chez M. Charcellay, rue\r\n+Montre-de-Champigny. Il se plaint qu'il y a une gouttière de la maison\r\n+voisine qui verse l'eau de la pluie chez lui, et qui affouille les\r\n+fondations de sa maison. Après vous constaterez des contraventions de\r\n+police qu'on me signale rue Guibourg chez la veuve Doris, et rue du\r\n+Garraud-Blanc chez madame Renée Le Bossé, et vous dresserez\r\n+procès-verbal. Mais je vous donne là beaucoup de besogne. N'allez-vous\r\n+pas être absent? ne m'avez-vous pas dit que vous alliez à Arras pour\r\n+cette affaire dans huit ou dix jours?...\r\n+\r\n+--Plus tôt que cela, monsieur le maire.\r\n+\r\n+--Quel jour donc?\r\n+\r\n+--Mais je croyais avoir dit à monsieur le maire que cela se jugeait\r\n+demain et que je partais par la diligence cette nuit.\r\n+\r\n+M. Madeleine fit un mouvement imperceptible.\r\n+\r\n+--Et combien de temps durera l'affaire?\r\n+\r\n+--Un jour tout au plus. L'arrêt sera prononcé au plus tard demain dans\r\n+la nuit. Mais je n'attendrai pas l'arrêt, qui ne peut manquer. Sitôt ma\r\n+déposition faite, je reviendrai ici.\r\n+\r\n+--C'est bon, dit M. Madeleine.\r\n+\r\n+Et il congédia Javert d'un signe de main. Javert ne s'en alla pas.\r\n+\r\n+--Pardon, monsieur le maire, dit-il.\r\n+\r\n+--Qu'est-ce encore? demanda M. Madeleine.\r\n+\r\n+--Monsieur le maire, il me reste une chose à vous rappeler.\r\n+\r\n+--Laquelle?\r\n+\r\n+--C'est que je dois être destitué.\r\n+\r\n+M. Madeleine se leva.\r\n+\r\n+--Javert, vous êtes un homme d'honneur, et je vous estime. Vous vous\r\n+exagérez votre faute. Ceci d'ailleurs est encore une offense qui me\r\n+concerne. Javert, vous êtes digne de monter et non de descendre.\r\n+J'entends que vous gardiez votre place.\r\n+\r\n+Javert regarda M. Madeleine avec sa prunelle candide au fond de laquelle\r\n+il semblait qu'on vit cette conscience peu éclairée, mais rigide et\r\n+chaste, et il dit d'une voix tranquille:\r\n+\r\n+--Monsieur le maire, je ne puis vous accorder cela.\r\n+\r\n+--Je vous répète, répliqua M. Madeleine, que la chose me regarde.\r\n+\r\n+Mais Javert, attentif à sa seule pensée, continua:\r\n+\r\n+--Quant à exagérer, je n'exagère point. Voici comment je raisonne. Je\r\n+vous ai soupçonné injustement. Cela, ce n'est rien. C'est notre droit à \r\n+nous autres de soupçonner, quoiqu'il y ait pourtant abus à soupçonner\r\n+au-dessus de soi. Mais, sans preuves, dans un accès de colère, dans le\r\n+but de me venger, je vous ai dénoncé comme forçat, vous, un homme\r\n+respectable, un maire, un magistrat! ceci est grave. Très grave. J'ai\r\n+offensé l'autorité dans votre personne, moi, agent de l'autorité! Si\r\n+l'un de mes subordonnés avait fait ce que j'ai fait, je l'aurais déclaré\r\n+indigne du service, et chassé. Eh bien?\r\n+\r\n+Tenez, monsieur le maire, encore un mot. J'ai souvent été sévère dans ma\r\n+vie. Pour les autres. C'était juste. Je faisais bien. Maintenant, si je\r\n+n'étais pas sévère pour moi, tout ce que j'ai fait de juste deviendrait\r\n+injuste.\r\n+\r\n+Est-ce que je dois m'épargner plus que les autres? Non. Quoi! je\r\n+n'aurais été bon qu'à châtier autrui, et pas moi! mais je serais un\r\n+misérable! mais ceux qui disent: ce gueux de Javert! auraient raison!\r\n+Monsieur le maire, je ne souhaite pas que vous me traitiez avec bonté,\r\n+votre bonté m'a fait faire assez de mauvais sang quand elle était pour\r\n+les autres. Je n'en veux pas pour moi. La bonté qui consiste à donner\r\n+raison à la fille publique contre le bourgeois, à l'agent de police\r\n+contre le maire, à celui qui est en bas contre celui qui est en haut,\r\n+c'est ce que j'appelle de la mauvaise bonté. C'est avec cette bonté-là \r\n+que la société se désorganise. Mon Dieu! c'est bien facile d'être bon,\r\n+le malaisé c'est d'être juste. Allez! si vous aviez été ce que je\r\n+croyais, je n'aurais pas été bon pour vous, moi! vous auriez vu!\r\n+Monsieur le maire, je dois me traiter comme je traiterais tout autre.\r\n+Quand je réprimais des malfaiteurs, quand je sévissais sur des gredins,\r\n+je me suis souvent dit à moi-même: toi, si tu bronches, si jamais je te\r\n+prends en faute, sois tranquille!--J'ai bronché, je me prends en faute,\r\n+tant pis! Allons, renvoyé, cassé, chassé! c'est bon. J'ai des bras, je\r\n+travaillerai à la terre, cela m'est égal. Monsieur le maire, le bien du\r\n+service veut un exemple. Je demande simplement la destitution de\r\n+l'inspecteur Javert.\r\n+\r\n+Tout cela était prononcé d'un accent humble, fier, désespéré et\r\n+convaincu qui donnait je ne sais quelle grandeur bizarre à cet étrange\r\n+honnête homme.\r\n+\r\n+--Nous verrons, fit M. Madeleine.\r\n+\r\n+Et il lui tendit la main.\r\n+\r\n+Javert recula, et dit d'un ton farouche:\r\n+\r\n+--Pardon, monsieur le maire, mais cela ne doit pas être. Un maire ne\r\n+donne pas la main à un mouchard.\r\n+\r\n+Il ajouta entre ses dents:\r\n+\r\n+--Mouchard, oui; du moment où j'ai médusé de la police, je ne suis plus\r\n+qu'un mouchard. Puis il salua profondément, et se dirigea vers la porte.\r\n+Là il se retourna, et, les yeux toujours baissés:\r\n+\r\n+--Monsieur le maire, dit-il, je continuerai le service jusqu'à ce que je\r\n+sois remplacé.\r\n+\r\n+Il sortit. M. Madeleine resta rêveur, écoutant ce pas ferme et assuré\r\n+qui s'éloignait sur le pavé du corridor.\r\n+\r\n+\r\n+\r\n+\r\n+Livre septième--L'affaire Champmathieu\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre I\r\n+\r\n+La soeur Simplice\r\n+\r\n+\r\n+Les incidents qu'on va lire n'ont pas tous été connus à \r\n+Montreuil-sur-mer, mais le peu qui en a percé a laissé dans cette ville\r\n+un tel souvenir, que ce serait une grave lacune dans ce livre si nous ne\r\n+les racontions dans leurs moindres détails.\r\n+\r\n+Dans ces détails, le lecteur rencontrera deux ou trois circonstances\r\n+invraisemblables que nous maintenons par respect pour la vérité.\r\n+\r\n+Dans l'après-midi qui suivit la visite de Javert, M. Madeleine alla voir\r\n+la Fantine comme d'habitude.\r\n+\r\n+Avant de pénétrer près de Fantine, il fit demander la soeur Simplice.\r\n+Les deux religieuses qui faisaient le service de l'infirmerie, dames\r\n+lazaristes comme toutes les soeurs de charité, s'appelaient soeur\r\n+Perpétue et soeur Simplice.\r\n+\r\n+La soeur Perpétue était la première villageoise venue, grossièrement\r\n+soeur de charité, entrée chez Dieu comme on entre en place. Elle était\r\n+religieuse comme on est cuisinière. Ce type n'est point très rare. Les\r\n+ordres monastiques acceptent volontiers cette lourde poterie paysanne,\r\n+aisément façonnée en capucin ou en ursuline. Ces rusticités s'utilisent\r\n+pour les grosses besognes de la dévotion. La transition d'un bouvier à \r\n+un carme n'a rien de heurté; l'un devient l'autre sans grand travail; le\r\n+fond commun d'ignorance du village et du cloître est une préparation\r\n+toute faite, et met tout de suite le campagnard de plain-pied avec le\r\n+moine. Un peu d'ampleur au sarrau, et voilà un froc. La soeur Perpétue\r\n+était une forte religieuse, de Marines, près Pontoise, patoisant,\r\n+psalmodiant, bougonnant, sucrant la tisane selon le bigotisme ou\r\n+l'hypocrisie du grabataire, brusquant les malades, bourrue avec les\r\n+mourants, leur jetant presque Dieu au visage, lapidant l'agonie avec des\r\n+prières en colère, hardie, honnête et rougeaude.\r\n+\r\n+La soeur Simplice était blanche d'une blancheur de cire. Près de soeur\r\n+Perpétue, c'était le cierge à côté de la chandelle. Vincent de Paul a\r\n+divinement fixé la figure de la soeur de charité dans ces admirables\r\n+paroles où il mêle tant de liberté à tant de servitude: «Elles n'auront\r\n+pour monastère que la maison des malades, pour cellule qu'une chambre de\r\n+louage, pour chapelle que l'église de leur paroisse, pour cloître que\r\n+les rues de la ville ou les salles des hôpitaux, pour clôture que\r\n+l'obéissance, pour grille que la crainte de Dieu, pour voile que la\r\n+modestie.» Cet idéal était vivant dans la soeur Simplice. Personne n'eût\r\n+pu dire l'âge de la soeur Simplice; elle n'avait jamais été jeune et\r\n+semblait ne devoir jamais être vieille. C'était une personne--nous\r\n+n'osons dire une femme--calme, austère, de bonne compagnie, froide, et\r\n+qui n'avait jamais menti. Elle était si douce qu'elle paraissait\r\n+fragile; plus solide d'ailleurs que le granit. Elle touchait aux\r\n+malheureux avec de charmants doigts fins et purs. Il y avait, pour ainsi\r\n+dire, du silence dans sa parole; elle parlait juste le nécessaire, et\r\n+elle avait un son de voix qui eût tout à la fois édifié un confessionnal\r\n+et enchanté un salon. Cette délicatesse s'accommodait de la robe de\r\n+bure, trouvant à ce rude contact un rappel continuel du ciel et de Dieu.\r\n+Insistons sur un détail. N'avoir jamais menti, n'avoir jamais dit, pour\r\n+un intérêt quelconque, même indifféremment, une chose qui ne fût la\r\n+vérité, la sainte vérité, c'était le trait distinctif de la soeur\r\n+Simplice; c'était l'accent de sa vertu. Elle était presque célèbre dans\r\n+la congrégation pour cette véracité imperturbable. L'abbé Sicard parle\r\n+de la soeur Simplice dans une lettre au sourd-muet Massieu. Si sincères,\r\n+si loyaux et si purs que nous soyons, nous avons tous sur notre candeur\r\n+au moins la fêlure du petit mensonge innocent. Elle, point. Petit\r\n+mensonge, mensonge innocent, est-ce que cela existe? Mentir, c'est\r\n+l'absolu du mal. Peu mentir n'est pas possible; celui qui ment, ment\r\n+tout le mensonge; mentir, c'est la face même du démon; Satan a deux\r\n+noms, il s'appelle Satan et il s'appelle Mensonge. Voilà ce qu'elle\r\n+pensait. Et comme elle pensait, elle pratiquait. Il en résultait cette\r\n+blancheur dont nous avons parlé, blancheur qui couvrait de son\r\n+rayonnement même ses lèvres et ses yeux. Son sourire était blanc, son\r\n+regard était blanc. Il n'y avait pas une toile d'araignée, pas un grain\r\n+de poussière à la vitre de cette conscience. En entrant dans l'obédience\r\n+de saint Vincent de Paul, elle avait pris le nom de Simplice par choix\r\n+spécial. Simplice de Sicile, on le sait, est cette sainte qui aima mieux\r\n+se laisser arracher les deux seins que de répondre, étant née à \r\n+Syracuse, qu'elle était née à Ségeste, mensonge qui la sauvait. Cette\r\n+patronne convenait à cette âme.\r\n+\r\n+La soeur Simplice, en entrant dans l'ordre, avait deux défauts dont elle\r\n+s'était peu à peu corrigée; elle avait eu le goût des friandises et elle\r\n+avait aimé à recevoir des lettres. Elle ne lisait jamais qu'un livre de\r\n+prières en gros caractères et en latin. Elle ne comprenait pas le latin,\r\n+mais elle comprenait le livre.\r\n+\r\n+La pieuse fille avait pris en affection Fantine, y sentant probablement\r\n+de la vertu latente, et s'était dévouée à la soigner presque\r\n+exclusivement.\r\n+\r\n+M. Madeleine emmena à part la soeur Simplice et lui recommanda Fantine\r\n+avec un accent singulier dont la soeur se souvint plus tard.\r\n+\r\n+En quittant la soeur, il s'approcha de Fantine.\r\n+\r\n+Fantine attendait chaque jour l'apparition de M. Madeleine comme on\r\n+attend un rayon de chaleur et de joie. Elle disait aux soeurs:\r\n+\r\n+--Je ne vis que lorsque monsieur le maire est là .\r\n+\r\n+Elle avait ce jour-là beaucoup de fièvre. Dès qu'elle vit M. Madeleine,\r\n+elle lui demanda:\r\n+\r\n+--Et Cosette?\r\n+\r\n+Il répondit en souriant:\r\n+\r\n+--Bientôt.\r\n+\r\n+M. Madeleine fut avec Fantine comme à l'ordinaire. Seulement il resta\r\n+une heure au lieu d'une demi-heure, au grand contentement de Fantine. Il\r\n+fît mille instances à tout le monde pour que rien ne manquât à la\r\n+malade. On remarqua qu'il y eut un moment où son visage devint très\r\n+sombre. Mais cela s'expliqua quand on sut que le médecin s'était penché\r\n+à son oreille et lui avait dit:\r\n+\r\n+--Elle baisse beaucoup.\r\n+\r\n+Puis il rentra à la mairie, et le garçon de bureau le vit examiner avec\r\n+attention une carte routière de France qui était suspendue dans son\r\n+cabinet. Il écrivit quelques chiffres au crayon sur un papier.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre II\r\n+\r\n+Perspicacité de maître Scaufflaire\r\n+\r\n+\r\n+De la mairie il se rendit au bout de la ville chez un Flamand, maître\r\n+Scaufflaër, francisé Scaufflaire, qui louait des chevaux et des\r\n+«cabriolets à volonté».\r\n+\r\n+Pour aller chez ce Scaufflaire, le plus court était de prendre une rue\r\n+peu fréquentée où était le presbytère de la paroisse que M. Madeleine\r\n+habitait. Le curé était, disait-on, un homme digne et respectable, et de\r\n+bon conseil. À l'instant où M. Madeleine arriva devant le presbytère, il\r\n+n'y avait dans la rue qu'un passant, et ce passant remarqua ceci: M. le\r\n+maire, après avoir dépassé la maison curiale, s'arrêta, demeura\r\n+immobile, puis revint sur ses pas et rebroussa chemin jusqu'à la porte\r\n+du presbytère, qui était une porte bâtarde avec marteau de fer. Il mit\r\n+vivement la main au marteau, et le souleva; puis il s'arrêta de nouveau,\r\n+et resta court, et comme pensif, et, après quelques secondes, au lieu de\r\n+laisser bruyamment retomber le marteau, il le reposa doucement et reprit\r\n+son chemin avec une sorte de hâte qu'il n'avait pas auparavant.\r\n+\r\n+M. Madeleine trouva maître Scaufflaire chez lui occupé à repiquer un\r\n+harnais.\r\n+\r\n+--Maître Scaufflaire, demanda-t-il, avez-vous un bon cheval?\r\n+\r\n+--Monsieur le maire, dit le Flamand, tous mes chevaux sont bons.\r\n+Qu'entendez-vous par un bon cheval?\r\n+\r\n+--J'entends un cheval qui puisse faire vingt lieues en un jour.\r\n+\r\n+--Diable! fit le Flamand, vingt lieues!\r\n+\r\n+--Oui.\r\n+\r\n+--Attelé à un cabriolet?\r\n+\r\n+--Oui.\r\n+\r\n+--Et combien de temps se reposera-t-il après la course?\r\n+\r\n+--Il faut qu'il puisse au besoin repartir le lendemain.\r\n+\r\n+--Pour refaire le même trajet?\r\n+\r\n+--Oui.\r\n+\r\n+--Diable! diable! et c'est vingt lieues? M. Madeleine tira de sa poche\r\n+le papier où il avait crayonné des chiffres. Il les montra au Flamand.\r\n+C'étaient les chiffres 5, 6, 8-1/2.\r\n+\r\n+--Vous voyez, dit-il. Total, dix-neuf et demi, autant dire vingt lieues.\r\n+\r\n+--Monsieur le maire, reprit le Flamand, j'ai votre affaire. Mon petit\r\n+cheval blanc. Vous avez dû le voir passer quelquefois. C'est une petite\r\n+bête du bas Boulonnais. C'est plein de feu. On a voulu d'abord en faire\r\n+un cheval de selle. Bah! il ruait, il flanquait tout le monde par terre.\r\n+On le croyait vicieux, on ne savait qu'en faire. Je l'ai acheté. Je l'ai\r\n+mis au cabriolet. Monsieur, c'est cela qu'il voulait; il est doux comme\r\n+une fille, il va le vent. Ah! par exemple, il ne faudrait pas lui monter\r\n+sur le dos. Ce n'est pas son idée d'être cheval de selle. Chacun a son\r\n+ambition. Tirer, oui, porter, non; il faut croire qu'il s'est dit ça.\r\n+\r\n+--Et il fera la course?\r\n+\r\n+--Vos vingt lieues. Toujours au grand trot, et en moins de huit heures.\r\n+Mais voici à quelles conditions.\r\n+\r\n+--Dites.\r\n+\r\n+--Premièrement, vous le ferez souffler une heure à moitié chemin; il\r\n+mangera, et on sera là pendant qu'il mangera pour empêcher le garçon de\r\n+l'auberge de lui voler son avoine; car j'ai remarqué que dans les\r\n+auberges l'avoine est plus souvent bue par les garçons d'écurie que\r\n+mangée par les chevaux.\r\n+\r\n+--On sera là .\r\n+\r\n+--Deuxièmement.... Est-ce pour monsieur le maire le cabriolet?\r\n+\r\n+--Oui.\r\n+\r\n+--Monsieur le maire sait conduire?\r\n+\r\n+--Oui.\r\n+\r\n+--Eh bien, monsieur le maire voyagera seul et sans bagage afin de ne\r\n+point charger le cheval.\r\n+\r\n+--Convenu.\r\n+\r\n+--Mais monsieur le maire, n'ayant personne avec lui, sera obligé de\r\n+prendre la peine de surveiller lui-même l'avoine.\r\n+\r\n+--C'est dit.\r\n+\r\n+--Il me faudra trente francs par jour. Les jours de repos payés. Pas un\r\n+liard de moins, et la nourriture de la bête à la charge de monsieur le\r\n+maire.\r\n+\r\n+M. Madeleine tira trois napoléons de sa bourse et les mit sur la table.\r\n+\r\n+--Voilà deux jours d'avance.\r\n+\r\n+--Quatrièmement, pour une course pareille sur cabriolet serait trop\r\n+lourd et fatiguerait le cheval. Il faudrait que monsieur le maire\r\n+consentît à voyager dans un petit tilbury que j'ai.\r\n+\r\n+--J'y consens.\r\n+\r\n+--C'est léger, mais c'est découvert.\r\n+\r\n+--Cela m'est égal.\r\n+\r\n+--Monsieur le maire a-t-il réfléchi que nous sommes en hiver?...\r\n+\r\n+M. Madeleine ne répondit pas. Le Flamand reprit:\r\n+\r\n+--Qu'il fait très froid?\r\n+\r\n+M. Madeleine garda le silence. Maître Scaufflaire continua:\r\n+\r\n+--Qu'il peut pleuvoir?\r\n+\r\n+M. Madeleine leva la tête et dit:\r\n+\r\n+--Le tilbury et le cheval seront devant ma porte demain à quatre heures\r\n+et demie du matin.\r\n+\r\n+--C'est entendu, monsieur le maire, répondit Scaufflaire, puis, grattant\r\n+avec l'ongle de son pouce une tache qui était dans le bois de la table,\r\n+il reprit de cet air insouciant que les Flamands savent si bien mêler à \r\n+leur finesse:\r\n+\r\n+--Mais voilà que j'y songe à présent! monsieur le maire ne me dit pas où\r\n+il va. Où est-ce que va monsieur le maire?\r\n+\r\n+Il ne songeait pas à autre chose depuis le commencement de la\r\n+conversation, mais il ne savait pourquoi il n'avait pas osé faire cette\r\n+question.\r\n+\r\n+--Votre cheval a-t-il de bonnes jambes de devant? dit M. Madeleine.\r\n+\r\n+--Oui, monsieur le maire. Vous le soutiendrez un peu dans les descentes.\r\n+Y a-t-il beaucoup de descentes d'ici où vous allez?\r\n+\r\n+--N'oubliez pas d'être à ma porte à quatre heures et demie du matin,\r\n+très précises, répondit M. Madeleine; et il sortit.\r\n+\r\n+Le Flamand resta «tout bête», comme il disait lui-même quelque temps\r\n+après.\r\n+\r\n+Monsieur le maire était sorti depuis deux ou trois minutes, lorsque la\r\n+porte se rouvrit; c'était M. le maire. Il avait toujours le même air\r\n+impassible et préoccupé.\r\n+\r\n+--Monsieur Scaufflaire, dit-il, à quelle somme estimez-vous le cheval et\r\n+le tilbury que vous me louerez, l'un portant l'autre?\r\n+\r\n+--L'un traînant l'autre, monsieur le maire, dit le Flamand avec un gros\r\n+rire.\r\n+\r\n+--Soit. Eh bien!\r\n+\r\n+--Est-ce que monsieur le maire veut me les acheter?\r\n+\r\n+--Non, mais à tout événement, je veux vous les garantir. À mon retour\r\n+vous me rendrez la somme. Combien estimez-vous cabriolet et cheval?\r\n+\r\n+--À cinq cents francs, monsieur le maire.\r\n+\r\n+--Les voici.\r\n+\r\n+M. Madeleine posa un billet de banque sur la table, puis sortit et cette\r\n+fois ne rentra plus.\r\n+\r\n+Maître Scaufflaire regretta affreusement de n'avoir point dit mille\r\n+francs. Du reste le cheval et le tilbury, en bloc, valaient cent écus.\r\n+\r\n+Le Flamand appela sa femme, et lui conta la chose. Où diable monsieur le\r\n+maire peut-il aller? Ils tinrent conseil.\r\n+\r\n+--Il va à Paris, dit la femme.\r\n+\r\n+--Je ne crois pas, dit le mari.\r\n+\r\n+M. Madeleine avait oublié sur la cheminée le papier où il avait tracé\r\n+des chiffres. Le Flamand le prit et l'étudia.\r\n+\r\n+--Cinq, six, huit et demi? cela doit marquer des relais de poste.\r\n+\r\n+Il se tourna vers sa femme.\r\n+\r\n+--J'ai trouvé.\r\n+\r\n+--Comment?\r\n+\r\n+--Il y a cinq lieues d'ici à Hesdin, six de Hesdin à Saint-Pol, huit et\r\n+demie de Saint-Pol à Arras. Il va à Arras.\r\n+\r\n+Cependant M. Madeleine était rentré chez lui.\r\n+\r\n+Pour revenir de chez maître Scaufflaire, il avait pris le plus long,\r\n+comme si la porte du presbytère avait été pour lui une tentation, et\r\n+qu'il eût voulu l'éviter. Il était monté dans sa chambre et s'y était\r\n+enfermé, ce qui n'avait rien que de simple, car il se couchait\r\n+volontiers de bonne heure. Pourtant la concierge de la fabrique, qui\r\n+était en même temps l'unique servante de M. Madeleine, observa que sa\r\n+lumière s'éteignit à huit heures et demie, et elle le dit au caissier\r\n+qui rentrait, en ajoutant:\r\n+\r\n+--Est-ce que monsieur le maire est malade? je lui ai trouvé l'air un peu\r\n+singulier.\r\n+\r\n+Ce caissier habitait une chambre située précisément au-dessous de la\r\n+chambre de M. Madeleine. Il ne prit point garde aux paroles de la\r\n+portière, se coucha et s'endormit. Vers minuit, il se réveilla\r\n+brusquement; il avait entendu à travers son sommeil un bruit au-dessus\r\n+de sa tête. Il écouta. C'était un pas qui allait et venait, comme si\r\n+l'on marchait dans la chambre en haut. Il écouta plus attentivement, et\r\n+reconnut le pas de M. Madeleine. Cela lui parut étrange; habituellement\r\n+aucun bruit ne se faisait dans la chambre de M. Madeleine avant l'heure\r\n+de son lever. Un moment après le caissier entendit quelque chose qui\r\n+ressemblait à une armoire qu'on ouvre et qu'on referme. Puis on dérangea\r\n+un meuble, il y eut un silence, et le pas recommença. Le caissier se\r\n+dressa sur son séant, s'éveilla tout à fait, regarda, et à travers les\r\n+vitres de sa croisée aperçut sur le mur d'en face la réverbération\r\n+rougeâtre d'une fenêtre éclairée. À la direction des rayons, ce ne\r\n+pouvait être que la fenêtre de la chambre de M. Madeleine. La\r\n+réverbération tremblait comme si elle venait plutôt d'un feu allumé que\r\n+d'une lumière. L'ombre des châssis vitrés ne s'y dessinait pas, ce qui\r\n+indiquait que la fenêtre était toute grande ouverte. Par le froid qu'il\r\n+faisait, cette fenêtre ouverte était surprenante. Le caissier se\r\n+rendormit. Une heure ou deux après, il se réveilla encore. Le même pas,\r\n+lent et régulier, allait et venait toujours au-dessus de sa tête.\r\n+\r\n+La réverbération se dessinait toujours sur le mur, mais elle était\r\n+maintenant pâle et paisible comme le reflet d'une lampe ou d'une bougie.\r\n+La fenêtre était toujours ouverte. Voici ce qui se passait dans la\r\n+chambre de M. Madeleine.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre III\r\n+\r\n+Une tempête sous un crâne\r\n+\r\n+\r\n+Le lecteur a sans doute deviné que M. Madeleine n'est autre que Jean\r\n+Valjean.\r\n+\r\n+Nous avons déjà regardé dans les profondeurs de cette conscience; le\r\n+moment est venu d'y regarder encore. Nous ne le faisons pas sans émotion\r\n+et sans tremblement. Il n'existe rien de plus terrifiant que cette sorte\r\n+de contemplation. L'oeil de l'esprit ne peut trouver nulle part plus\r\n+d'éblouissements ni plus de ténèbres que dans l'homme; il ne peut se\r\n+fixer sur aucune chose qui soit plus redoutable, plus compliquée, plus\r\n+mystérieuse et plus infinie. Il y a un spectacle plus grand que la mer,\r\n+c'est le ciel; il y a un spectacle plus grand que le ciel, c'est\r\n+l'intérieur de l'âme.\r\n+\r\n+Faire le poème de la conscience humaine, ne fût-ce qu'à propos d'un seul\r\n+homme, ne fût-ce qu'à propos du plus infime des hommes, ce serait fondre\r\n+toutes les épopées dans une épopée supérieure et définitive. La\r\n+conscience, c'est le chaos des chimères, des convoitises et des\r\n+tentatives, la fournaise des rêves, l'antre des idées dont on a honte;\r\n+c'est le pandémonium des sophismes, c'est le champ de bataille des\r\n+passions. À de certaines heures, pénétrez à travers la face livide d'un\r\n+être humain qui réfléchit, et regardez derrière, regardez dans cette\r\n+âme, regardez dans cette obscurité. Il y a là , sous le silence\r\n+extérieur, des combats de géants comme dans Homère, des mêlées de\r\n+dragons et d'hydres et des nuées de fantômes comme dans Milton, des\r\n+spirales visionnaires comme chez Dante. Chose sombre que cet infini que\r\n+tout homme porte en soi et auquel il mesure avec désespoir les volontés\r\n+de son cerveau et les actions de sa vie!\r\n+\r\n+Alighieri rencontra un jour une sinistre porte devant laquelle il\r\n+hésita. En voici une aussi devant nous, au seuil de laquelle nous\r\n+hésitons. Entrons pourtant.\r\n+\r\n+Nous n'avons que peu de chose à ajouter à ce que le lecteur connaît déjà \r\n+de ce qui était arrivé à Jean Valjean depuis l'aventure de\r\n+Petit-Gervais. À partir de ce moment, on l'a vu, il fut un autre homme.\r\n+Ce que l'évêque avait voulu faire de lui, il l'exécuta. Ce fut plus\r\n+qu'une transformation, ce fut une transfiguration.\r\n+\r\n+Il réussit à disparaître, vendit l'argenterie de l'évêque, ne gardant\r\n+que les flambeaux, comme souvenir, se glissa de ville en ville, traversa\r\n+la France, vint à Montreuil-sur-mer, eut l'idée que nous avons dite,\r\n+accomplit ce que nous avons raconté, parvint à se faire insaisissable et\r\n+inaccessible, et désormais, établi à Montreuil-sur-mer, heureux de\r\n+sentir sa conscience attristée par son passé et la première moitié de\r\n+son existence démentie par la dernière, il vécut paisible, rassuré et\r\n+espérant, n'ayant plus que deux pensées: cacher son nom, et sanctifier\r\n+sa vie; échapper aux hommes, et revenir à Dieu.\r\n+\r\n+Ces deux pensées étaient si étroitement mêlées dans son esprit qu'elles\r\n+n'en formaient qu'une seule; elles étaient toutes deux également\r\n+absorbantes et impérieuses, et dominaient ses moindres actions.\r\n+D'ordinaire elles étaient d'accord pour régler la conduite de sa vie;\r\n+elles le tournaient vers l'ombre; elles le faisaient bienveillant et\r\n+simple; elles lui conseillaient les mêmes choses. Quelquefois cependant\r\n+il y avait conflit entre elles. Dans ce cas-là , on s'en souvient,\r\n+l'homme que tout le pays de Montreuil-sur-mer appelait M. Madeleine ne\r\n+balançait pas à sacrifier la première à la seconde, sa sécurité à sa\r\n+vertu. Ainsi, en dépit de toute réserve et de toute prudence, il avait\r\n+gardé les chandeliers de l'évêque, porté son deuil, appelé et interrogé\r\n+tous les petits savoyards qui passaient, pris des renseignements sur les\r\n+familles de Faverolles, et sauvé la vie au vieux Fauchelevent, malgré\r\n+les inquiétantes insinuations de Javert. Il semblait, nous l'avons déjà \r\n+remarqué, qu'il pensât, à l'exemple de tous ceux qui ont été sages,\r\n+saints et justes, que son premier devoir n'était pas envers lui.\r\n+\r\n+Toutefois, il faut le dire, jamais rien de pareil ne s'était encore\r\n+présenté. Jamais les deux idées qui gouvernaient le malheureux homme\r\n+dont nous racontons les souffrances n'avaient engagé une lutte si\r\n+sérieuse. Il le comprit confusément, mais profondément, dès les\r\n+premières paroles que prononça Javert, en entrant dans son cabinet.\r\n+\r\n+Au moment où fut si étrangement articulé ce nom qu'il avait enseveli\r\n+sous tant d'épaisseurs, il fut saisi de stupeur et comme enivré par la\r\n+sinistre bizarrerie de sa destinée, et, à travers cette stupeur, il eut\r\n+ce tressaillement qui précède les grandes secousses; il se courba comme\r\n+un chêne à l'approche d'un orage, comme un soldat à l'approche d'un\r\n+assaut. Il sentit venir sur sa tête des ombres pleines de foudres et\r\n+d'éclairs. Tout en écoutant parler Javert, il eut une première pensée\r\n+d'aller, de courir, de se dénoncer, de tirer ce Champmathieu de prison\r\n+et de s'y mettre; cela fut douloureux et poignant comme une incision\r\n+dans la chair vive, puis cela passa, et il se dit: «Voyons! voyons!» Il\r\n+réprima ce premier mouvement généreux et recula devant l'héroïsme.\r\n+\r\n+Sans doute, il serait beau qu'après les saintes paroles de l'évêque,\r\n+après tant d'années de repentir et d'abnégation, au milieu d'une\r\n+pénitence admirablement commencée, cet homme, même en présence d'une si\r\n+terrible conjoncture, n'eût pas bronché un instant et eût continué de\r\n+marcher du même pas vers ce précipice ouvert au fond duquel était le\r\n+ciel; cela serait beau, mais cela ne fut pas ainsi. Il faut bien que\r\n+nous rendions compte des choses qui s'accomplissaient dans cette âme, et\r\n+nous ne pouvons dire que ce qui y était. Ce qui l'emporta tout d'abord,\r\n+ce fut l'instinct de la conservation; il rallia en hâte ses idées,\r\n+étouffa ses émotions, considéra la présence de Javert, ce grand péril,\r\n+ajourna toute résolution avec la fermeté de l'épouvante, s'étourdit sur\r\n+ce qu'il y avait à faire, et reprit son calme comme un lutteur ramasse\r\n+son bouclier.\r\n+\r\n+Le reste de la journée il fut dans cet état, un tourbillon au dedans,\r\n+une tranquillité profonde au dehors; il ne prit que ce qu'on pourrait\r\n+appeler «les mesures conservatoires». Tout était encore confus et se\r\n+heurtait dans son cerveau; le trouble y était tel qu'il ne voyait\r\n+distinctement la forme d'aucune idée; et lui-même n'aurait pu rien dire\r\n+de lui-même, si ce n'est qu'il venait de recevoir un grand coup. Il se\r\n+rendit comme d'habitude près du lit de douleur de Fantine et prolongea\r\n+sa visite, par un instinct de bonté, se disant qu'il fallait agir ainsi\r\n+et la bien recommander aux soeurs pour le cas où il arriverait qu'il eût\r\n+à s'absenter. Il sentit vaguement qu'il faudrait peut-être aller à \r\n+Arras, et, sans être le moins du monde décidé à ce voyage, il se dit\r\n+qu'à l'abri de tout soupçon comme il l'était, il n'y avait point\r\n+d'inconvénient à être témoin de ce qui se passerait, et il retint le\r\n+tilbury de Scaufflaire, afin d'être préparé à tout événement.\r\n+\r\n+Il dîna avec assez d'appétit.\r\n+\r\n+Rentré dans sa chambre il se recueillit.\r\n+\r\n+Il examina la situation et la trouva inouïe; tellement inouïe qu'au\r\n+milieu de sa rêverie, par je ne sais quelle impulsion d'anxiété presque\r\n+inexplicable, il se leva de sa chaise et ferma sa porte au verrou. Il\r\n+craignait qu'il n'entrât encore quelque chose. Il se barricadait contre\r\n+le possible.\r\n+\r\n+Un moment après il souffla sa lumière. Elle le gênait.\r\n+\r\n+Il lui semblait qu'on pouvait le voir.\r\n+\r\n+Qui, on?\r\n+\r\n+Hélas! ce qu'il voulait mettre à la porte était entré ce qu'il voulait\r\n+aveugler, le regardait. Sa conscience.\r\n+\r\n+Sa conscience, c'est-à -dire Dieu.\r\n+\r\n+Pourtant, dans le premier moment, il se fit illusion; il eut un\r\n+sentiment de sûreté et de solitude; le verrou tiré, il se crut\r\n+imprenable; la chandelle éteinte, il se sentit invisible. Alors il prit\r\n+possession de lui-même; il posa ses coudes sur la table, appuya la tête\r\n+sur sa main, et se mit à songer dans les ténèbres.\r\n+\r\n+--Où en suis-je?--Est-ce que je ne rêve pas? Que m'a-t-on dit?--Est-il\r\n+bien vrai que j'aie vu ce Javert et qu'il m'ait parlé ainsi?--Que peut\r\n+être ce Champmathieu?--Il me ressemble donc?--Est-ce possible?--Quand\r\n+je pense qu'hier j'étais si tranquille et si loin de me douter de\r\n+rien!--Qu'est-ce que je faisais donc hier à pareille heure?--Qu'y a-t-il\r\n+dans cet incident?--Comment se dénouera-t-il?--Que faire?\r\n+\r\n+Voilà dans quelle tourmente il était. Son cerveau avait perdu la force\r\n+de retenir ses idées, elles passaient comme des ondes, et il prenait son\r\n+front dans ses deux mains pour les arrêter.\r\n+\r\n+De ce tumulte qui bouleversait sa volonté et sa raison, et dont il\r\n+cherchait à tirer une évidence et une résolution, rien ne se dégageait\r\n+que l'angoisse.\r\n+\r\n+Sa tête était brûlante. Il alla à la fenêtre et l'ouvrit toute grande.\r\n+Il n'y avait pas d'étoiles au ciel. Il revint s'asseoir près de la\r\n+table.\r\n+\r\n+La première heure s'écoula ainsi.\r\n+\r\n+Peu à peu cependant des linéaments vagues commencèrent à se former et à \r\n+se fixer dans sa méditation, et il put entrevoir avec la précision de la\r\n+réalité, non l'ensemble de la situation, mais quelques détails.\r\n+\r\n+Il commença par reconnaître que, si extraordinaire et si critique que\r\n+fût cette situation, il en était tout à fait le maître.\r\n+\r\n+Sa stupeur ne fit que s'en accroître.\r\n+\r\n+Indépendamment du but sévère et religieux que se proposaient ses\r\n+actions, tout ce qu'il avait fait jusqu'à ce jour n'était autre chose\r\n+qu'un trou qu'il creusait pour y enfouir son nom. Ce qu'il avait\r\n+toujours le plus redouté, dans ses heures de repli sur lui-même, dans\r\n+ses nuits d'insomnie, c'était d'entendre jamais prononcer ce nom; il se\r\n+disait que ce serait là pour lui la fin de tout; que le jour où ce nom\r\n+reparaîtrait, il ferait évanouir autour de lui sa vie nouvelle, et qui\r\n+sait même peut-être? au dedans de lui sa nouvelle âme. Il frémissait de\r\n+la seule pensée que c'était possible. Certes, si quelqu'un lui eût dit\r\n+en ces moments-là qu'une heure viendrait où ce nom retentirait à son\r\n+oreille, où ce hideux mot, Jean Valjean, sortirait tout à coup de la\r\n+nuit et se dresserait devant lui, où cette lumière formidable faite pour\r\n+dissiper le mystère dont il s'enveloppait resplendirait subitement sur\r\n+sa tête; et que ce nom ne le menacerait pas, que cette lumière ne\r\n+produirait qu'une obscurité plus épaisse, que ce voile déchiré\r\n+accroîtrait le mystère; que ce tremblement de terre consoliderait son\r\n+édifice, que ce prodigieux incident n'aurait d'autre résultat, si bon\r\n+lui semblait, à lui, que de rendre son existence à la fois plus claire\r\n+et plus impénétrable, et que, de sa confrontation avec le fantôme de\r\n+Jean Valjean, le bon et digne bourgeois monsieur Madeleine sortirait\r\n+plus honoré, plus paisible et plus respecté que jamais,--si quelqu'un\r\n+lui eût dit cela, il eût hoché la tête et regardé ces paroles comme\r\n+insensées. Eh bien! tout cela venait précisément d'arriver, tout cet\r\n+entassement de l'impossible était un fait, et Dieu avait permis que ces\r\n+choses folles devinssent des choses réelles!\r\n+\r\n+Sa rêverie continuait de s'éclaircir. Il se rendait de plus en plus\r\n+compte de sa position. Il lui semblait qu'il venait de s'éveiller de je\r\n+ne sais quel sommeil, et qu'il se trouvait glissant sur une pente au\r\n+milieu de la nuit, debout, frissonnant, reculant en vain, sur le bord\r\n+extrême d'un abîme. Il entrevoyait distinctement dans l'ombre un\r\n+inconnu, un étranger, que la destinée prenait pour lui et poussait dans\r\n+le gouffre à sa place. Il fallait, pour que le gouffre se refermât, que\r\n+quelqu'un y tombât, lui ou l'autre.\r\n+\r\n+Il n'avait qu'à laisser faire.\r\n+\r\n+La clarté devint complète, et il s'avoua ceci:--Que sa place était vide\r\n+aux galères, qu'il avait beau faire, qu'elle l'y attendait toujours, que\r\n+le vol de Petit-Gervais l'y ramenait, que cette place vide l'attendrait\r\n+et l'attirerait jusqu'à ce qu'il y fût, que cela était inévitable et\r\n+fatal.--Et puis il se dit:--Qu'en ce moment il avait un remplaçant,\r\n+qu'il paraissait qu'un nommé Champmathieu avait cette mauvaise chance,\r\n+et que, quant à lui, présent désormais au bagne dans la personne de ce\r\n+Champmathieu, présent dans la société sous le nom de M. Madeleine, il\r\n+n'avait plus rien à redouter, pourvu qu'il n'empêchât pas les hommes de\r\n+sceller sur la tête de ce Champmathieu cette pierre de l'infamie qui,\r\n+comme la pierre du sépulcre, tombe une fois et ne se relève jamais.\r\n+\r\n+Tout cela était si violent et si étrange qu'il se fit soudain en lui\r\n+cette espèce de mouvement indescriptible qu'aucun homme n'éprouve plus\r\n+de deux ou trois fois dans sa vie, sorte de convulsion de la conscience\r\n+qui remue tout ce que le coeur a de douteux, qui se compose d'ironie, de\r\n+joie et de désespoir, et qu'on pourrait appeler un éclat de rire\r\n+intérieur.\r\n+\r\n+Il ralluma brusquement sa bougie.\r\n+\r\n+--Eh bien quoi! se dit-il, de quoi est-ce que j'ai peur? qu'est-ce que\r\n+j'ai à songer comme cela? Me voilà sauvé. Tout est fini. Je n'avais plus\r\n+qu'une porte entr'ouverte par laquelle mon passé pouvait faire irruption\r\n+dans ma vie; cette porte, la voilà murée! à jamais! Ce Javert qui me\r\n+trouble depuis si longtemps, ce redoutable instinct qui semblait m'avoir\r\n+deviné, qui m'avait deviné, pardieu! et qui me suivait partout, cet\r\n+affreux chien de chasse toujours en arrêt sur moi, le voilà dérouté,\r\n+occupé ailleurs, absolument dépisté! Il est satisfait désormais, il me\r\n+laissera tranquille, il tient son Jean Valjean! Qui sait même, il est\r\n+probable qu'il voudra quitter la ville! Et tout cela s'est fait sans\r\n+moi! Et je n'y suis pour rien! Ah çà , mais! qu'est-ce qu'il y a de\r\n+malheureux dans ceci? Des gens qui me verraient, parole d'honneur!\r\n+croiraient qu'il m'est arrivé une catastrophe! Après tout, s'il y a du\r\n+mal pour quelqu'un, ce n'est aucunement de ma faute. C'est la providence\r\n+qui a tout fait. C'est qu'elle veut cela apparemment!\r\n+\r\n+Ai-je le droit de déranger ce qu'elle arrange? Qu'est-ce que je demande\r\n+à présent? De quoi est-ce que je vais me mêler? Cela ne me regarde pas.\r\n+Comment! je ne suis pas content! Mais qu'est-ce qu'il me faut donc? Le\r\n+but auquel j'aspire depuis tant d'années, le songe de mes nuits, l'objet\r\n+de mes prières au ciel, la sécurité, je l'atteins! C'est Dieu qui le\r\n+veut. Je n'ai rien à faire contre la volonté de Dieu. Et pourquoi Dieu\r\n+le veut-il? Pour que je continue ce que j'ai commencé, pour que je fasse\r\n+le bien, pour que je sois un jour un grand et encourageant exemple, pour\r\n+qu'il soit dit qu'il y a eu enfin un peu de bonheur attaché à cette\r\n+pénitence que j'ai subie et à cette vertu où je suis revenu! Vraiment je\r\n+ne comprends pas pourquoi j'ai eu peur tantôt d'entrer chez ce brave\r\n+curé et de tout lui raconter comme à un confesseur, et de lui demander\r\n+conseil, c'est évidemment là ce qu'il m'aurait dit. C'est décidé,\r\n+laissons aller les choses! laissons faire le bon Dieu!\r\n+\r\n+Il se parlait ainsi dans les profondeurs de sa conscience, penché sur ce\r\n+qu'on pourrait appeler son propre abîme. Il se leva de sa chaise, et se\r\n+mit à marcher dans la chambre.--Allons, dit-il, n'y pensons plus. Voilà \r\n+une résolution prise!--Mais il ne sentit aucune joie.\r\n+\r\n+Au contraire.\r\n+\r\n+On n'empêche pas plus la pensée de revenir à une idée que la mer de\r\n+revenir à un rivage. Pour le matelot, cela s'appelle la marée; pour le\r\n+coupable, cela s'appelle le remords. Dieu soulève l'âme comme l'océan.\r\n+\r\n+Au bout de peu d'instants, il eut beau faire, il reprit ce sombre\r\n+dialogue dans lequel c'était lui qui parlait et lui qui écoutait, disant\r\n+ce qu'il eût voulu taire, écoutant ce qu'il n'eût pas voulu entendre,\r\n+cédant à cette puissance mystérieuse qui lui disait: pense! comme elle\r\n+disait il y a deux mille ans à un autre condamné, marche!\r\n+\r\n+Avant d'aller plus loin et pour être pleinement compris, insistons sur\r\n+une observation nécessaire.\r\n+\r\n+Il est certain qu'on se parle à soi-même, il n'est pas un être pensant\r\n+qui ne l'ait éprouvé. On peut dire même que le verbe n'est jamais un\r\n+plus magnifique mystère que lorsqu'il va, dans l'intérieur d'un homme,\r\n+de la pensée à la conscience et qu'il retourne de la conscience à la\r\n+pensée. C'est dans ce sens seulement qu'il faut entendre les mots\r\n+souvent employés dans ce chapitre, il dit, il s'écria. On se dit, on se\r\n+parle, on s'écrie en soi-même, sans que le silence extérieur soit rompu.\r\n+Il y a un grand tumulte; tout parle en nous, excepté la bouche. Les\r\n+réalités de l'âme, pour n'être point visibles et palpables, n'en sont\r\n+pas moins des réalités.\r\n+\r\n+Il se demanda donc où il en était. Il s'interrogea sur cette «résolution\r\n+prise». Il se confessa à lui-même que tout ce qu'il venait d'arranger\r\n+dans son esprit était monstrueux, que «laisser aller les choses, laisser\r\n+faire le bon Dieu», c'était tout simplement horrible. Laisser\r\n+s'accomplir cette méprise de la destinée et des hommes, ne pas\r\n+l'empêcher, s'y prêter par son silence, ne rien faire enfin, c'était\r\n+faire tout! c'était le dernier degré de l'indignité hypocrite! c'était\r\n+un crime bas, lâche, sournois, abject, hideux!\r\n+\r\n+Pour la première fois depuis huit années, le malheureux homme venait de\r\n+sentir la saveur amère d'une mauvaise pensée et d'une mauvaise action.\r\n+\r\n+Il la recracha avec dégoût.\r\n+\r\n+Il continua de se questionner. Il se demanda sévèrement ce qu'il avait\r\n+entendu par ceci: \u0022Mon but est atteint!\u0022 Il se déclara que sa vie avait\r\n+un but en effet. Mais quel but? cacher son nom? tromper la police?\r\n+Était-ce pour une chose si petite qu'il avait fait tout ce qu'il avait\r\n+fait? Est-ce qu'il n'avait pas un autre but, qui était le grand, qui\r\n+était le vrai? Sauver, non sa personne, mais son âme. Redevenir honnête\r\n+et bon. Être un juste! est-ce que ce n'était pas là surtout, là \r\n+uniquement, ce qu'il avait toujours voulu, ce que l'évêque lui avait\r\n+ordonné?--Fermer la porte à son passé? Mais il ne la fermait pas, grand\r\n+Dieu! il la rouvrait en faisant une action infâme! mais il redevenait un\r\n+voleur, et le plus odieux des voleurs! il volait à un autre son\r\n+existence, sa vie, sa paix, sa place au soleil! il devenait un assassin!\r\n+il tuait, il tuait moralement un misérable homme, il lui infligeait\r\n+cette affreuse mort vivante, cette mort à ciel ouvert, qu'on appelle le\r\n+bagne! Au contraire, se livrer, sauver cet homme frappé d'une si lugubre\r\n+erreur, reprendre son nom, redevenir par devoir le forçat Jean Valjean,\r\n+c'était là vraiment achever sa résurrection, et fermer à jamais l'enfer\r\n+d'où il sortait! Y retomber en apparence, c'était en sortir en réalité!\r\n+Il fallait faire cela! il n'avait rien fait s'il ne faisait pas cela!\r\n+toute sa vie était inutile, toute sa pénitence était perdue, et il n'y\r\n+avait plus qu'à dire: à quoi bon? Il sentait que l'évêque était là , que\r\n+l'évêque était d'autant plus présent qu'il était mort, que l'évêque le\r\n+regardait fixement, que désormais le maire Madeleine avec toutes ses\r\n+vertus lui serait abominable, et que le galérien Jean Valjean serait\r\n+admirable et pur devant lui. Que les hommes voyaient son masque, mais\r\n+que l'évêque voyait sa face. Que les hommes voyaient sa vie, mais que\r\n+l'évêque voyait sa conscience. Il fallait donc aller à Arras, délivrer\r\n+le faux Jean Valjean, dénoncer le véritable! Hélas! c'était là le plus\r\n+grand des sacrifices, la plus poignante des victoires, le dernier pas à \r\n+franchir; mais il le fallait. Douloureuse destinée! il n'entrerait dans\r\n+la sainteté aux yeux de Dieu que s'il rentrait dans l'infamie aux yeux\r\n+des hommes!\r\n+\r\n+--Eh bien, dit-il, prenons ce parti! faisons notre devoir! sauvons cet\r\n+homme!\r\n+\r\n+Il prononça ces paroles à haute voix, sans s'apercevoir qu'il parlait\r\n+tout haut.\r\n+\r\n+Il prit ses livres, les vérifia et les mit en ordre. Il jeta au feu une\r\n+liasse de créances qu'il avait sur de petits commerçants gênés. Il\r\n+écrivit une lettre qu'il cacheta et sur l'enveloppe de laquelle on\r\n+aurait pu lire, s'il y avait eu quelqu'un dans sa chambre en cet\r\n+instant: _À Monsieur Laffitte, banquier, rue d'Artois, à Paris_.\r\n+\r\n+Il tira d'un secrétaire un portefeuille qui contenait quelques billets\r\n+de banque et le passeport dont il s'était servi cette même année pour\r\n+aller aux élections.\r\n+\r\n+Qui l'eût vu pendant qu'il accomplissait ces divers actes auxquels se\r\n+mêlait une méditation si grave, ne se fût pas douté de ce qui se passait\r\n+en lui. Seulement par moments ses lèvres remuaient; dans d'autres\r\n+instants il relevait la tête et fixait son regard sur un point\r\n+quelconque de la muraille, comme s'il y avait précisément là quelque\r\n+chose qu'il voulait éclaircir ou interroger.\r\n+\r\n+La lettre à M. Laffitte terminée, il la mit dans sa poche ainsi que le\r\n+portefeuille, et recommença à marcher.\r\n+\r\n+Sa rêverie n'avait point dévié. Il continuait de voir clairement son\r\n+devoir écrit en lettres lumineuses qui flamboyaient devant ses yeux et\r\n+se déplaçaient avec son regard:--_Va! nomme-toi! dénonce-toi!_\r\n+\r\n+Il voyait de même, et comme si elles se fussent mues devant lui avec des\r\n+formes sensibles, les deux idées qui avaient été jusque-là la double\r\n+règle de sa vie: cacher son nom, sanctifier son âme. Pour la première\r\n+fois, elles lui apparaissaient absolument distinctes, et il voyait la\r\n+différence qui les séparait. Il reconnaissait que l'une de ces idées\r\n+était nécessairement bonne, tandis que l'autre pouvait devenir mauvaise;\r\n+que celle-là était le dévouement et que celle-ci était la personnalité;\r\n+que l'une disait: le _prochain_, et que l'autre disait: _moi_; que l'une\r\n+venait de la lumière et que l'autre venait de la nuit.\r\n+\r\n+Elles se combattaient, il les voyait se combattre. À mesure qu'il\r\n+songeait, elles avaient grandi devant l'oeil de son esprit; elles\r\n+avaient maintenant des statures colossales; et il lui semblait qu'il\r\n+voyait lutter au dedans de lui-même, dans cet infini dont nous parlions\r\n+tout à l'heure, au milieu des obscurités et des lueurs, une déesse et\r\n+une géante.\r\n+\r\n+Il était plein d'épouvante, mais il lui semblait que la bonne pensée\r\n+l'emportait.\r\n+\r\n+Il sentait qu'il touchait à l'autre moment décisif de sa conscience et\r\n+de sa destinée; que l'évêque avait marqué la première phase de sa vie\r\n+nouvelle, et que ce Champmathieu en marquait la seconde. Après la grande\r\n+crise, la grande épreuve.\r\n+\r\n+Cependant la fièvre, un instant apaisée, lui revenait peu à peu. Mille\r\n+pensées le traversaient, mais elles continuaient de le fortifier dans sa\r\n+résolution.\r\n+\r\n+Un moment il s'était dit:--qu'il prenait peut-être la chose trop\r\n+vivement, qu'après tout ce Champmathieu n'était pas intéressant, qu'en\r\n+somme il avait volé.\r\n+\r\n+Il se répondit:--Si cet homme a en effet volé quelques pommes, c'est un\r\n+mois de prison. Il y a loin de là aux galères. Et qui sait même? a-t-il\r\n+volé? est-ce prouvé? Le nom de Jean Valjean l'accable et semble\r\n+dispenser de preuves. Les procureurs du roi n'agissent-ils pas\r\n+habituellement ainsi? On le croit voleur, parce qu'on le sait forçat.\r\n+\r\n+Dans un autre instant, cette idée lui vint que, lorsqu'il se serait\r\n+dénoncé, peut-être on considérerait l'héroïsme de son action, et sa vie\r\n+honnête depuis sept ans, et ce qu'il avait fait pour le pays, et qu'on\r\n+lui ferait grâce.\r\n+\r\n+Mais cette supposition s'évanouit bien vite, et il sourit amèrement en\r\n+songeant que le vol des quarante sous à Petit-Gervais le faisait\r\n+récidiviste, que cette affaire reparaîtrait certainement et, aux termes\r\n+précis de la loi, le ferait passible des travaux forcés à perpétuité.\r\n+\r\n+Il se détourna de toute illusion, se détacha de plus en plus de la terre\r\n+et chercha la consolation et la force ailleurs. Il se dit qu'il fallait\r\n+faire son devoir; que peut-être même ne serait-il pas plus malheureux\r\n+après avoir fait son devoir qu'après l'avoir éludé; que s'il _laissait\r\n+faire_, s'il restait à Montreuil-sur-mer, sa considération, sa bonne\r\n+renommée, ses bonnes oeuvres, la déférence, la vénération, sa charité,\r\n+sa richesse, sa popularité, sa vertu, seraient assaisonnées d'un crime;\r\n+et quel goût auraient toutes ces choses saintes liées à cette chose\r\n+hideuse! tandis que, s'il accomplissait son sacrifice, au bagne, au\r\n+poteau, au carcan, au bonnet vert, au travail sans relâche, à la honte\r\n+sans pitié, il se mêlerait une idée céleste!\r\n+\r\n+Enfin il se dit qu'il y avait nécessité, que sa destinée était ainsi\r\n+faite, qu'il n'était pas maître de déranger les arrangements d'en haut,\r\n+que dans tous les cas il fallait choisir: ou la vertu au dehors et\r\n+l'abomination au dedans, ou la sainteté au dedans et l'infamie au\r\n+dehors.\r\n+\r\n+À remuer tant d'idées lugubres, son courage ne défaillait pas, mais son\r\n+cerveau se fatiguait. Il commençait à penser malgré lui à d'autres\r\n+choses, à des choses indifférentes. Ses artères battaient violemment\r\n+dans ses tempes. Il allait et venait toujours. Minuit sonna d'abord à la\r\n+paroisse, puis à la maison de ville. Il compta les douze coups aux deux\r\n+horloges, et il compara le son des deux cloches. Il se rappela à cette\r\n+occasion que quelques jours auparavant il avait vu chez un marchand de\r\n+ferrailles une vieille cloche à vendre sur laquelle ce nom était écrit:\r\n+_Antoine Albin de Romainville_.\r\n+\r\n+Il avait froid. Il alluma un peu de feu. Il ne songea pas à fermer la\r\n+fenêtre.\r\n+\r\n+Cependant il était retombé dans sa stupeur. Il lui fallait faire un\r\n+assez grand effort pour se rappeler à quoi il songeait avant que minuit\r\n+sonnât. Il y parvint enfin.\r\n+\r\n+--Ah! oui, se dit-il, j'avais pris la résolution de me dénoncer.\r\n+\r\n+Et puis tout à coup il pensa à la Fantine.\r\n+\r\n+--Tiens! dit-il, et cette pauvre femme!\r\n+\r\n+Ici une crise nouvelle se déclara.\r\n+\r\n+Fantine, apparaissant brusquement dans sa rêverie, y fut comme un rayon\r\n+d'une lumière inattendue. Il lui sembla que tout changeait d'aspect\r\n+autour de lui, il s'écria:\r\n+\r\n+--Ah çà , mais! jusqu'ici je n'ai considéré que moi! je n'ai eu égard\r\n+qu'à ma convenance! Il me convient de me taire ou de me\r\n+dénoncer,--cacher ma personne ou sauver mon âme,--être un magistrat\r\n+méprisable et respecté ou un galérien infâme et vénérable, c'est moi,\r\n+c'est toujours moi, ce n'est que moi! Mais, mon Dieu, c'est de l'égoïsme\r\n+tout cela! Ce sont des formes diverses de l'égoïsme, mais c'est de\r\n+l'égoïsme! Si je songeais un peu aux autres? La première sainteté est de\r\n+penser à autrui. Voyons, examinons. Moi excepté, moi effacé, moi oublié,\r\n+qu'arrivera-t-il de tout ceci?--Si je me dénonce? on me prend. On lâche\r\n+ce Champmathieu, on me remet aux galères, c'est bien. Et puis? Que se\r\n+passe-t-il ici? Ah! ici, il y a un pays, une ville, des fabriques, une\r\n+industrie, des ouvriers, des hommes, des femmes, des vieux grands-pères,\r\n+des enfants, des pauvres gens! J'ai créé tout ceci, je fais vivre tout\r\n+cela; partout où il y a une cheminée qui fume, c'est moi qui ai mis le\r\n+tison dans le feu et la viande dans la marmite; j'ai fait l'aisance, la\r\n+circulation, le crédit; avant moi il n'y avait rien; j'ai relevé,\r\n+vivifié, animé, fécondé, stimulé, enrichi tout le pays; moi de moins,\r\n+c'est l'âme de moins. Je m'ôte, tout meurt.--Et cette femme qui a tant\r\n+souffert, qui a tant de mérites dans sa chute, dont j'ai causé sans le\r\n+vouloir tout le malheur! Et cet enfant que je voulais aller chercher,\r\n+que j'ai promis à la mère! Est-ce que je ne dois pas aussi quelque chose\r\n+à cette femme, en réparation du mal que je lui ai fait? Si je disparais,\r\n+qu'arrive-t-il? La mère meurt. L'enfant devient ce qu'il peut. Voilà ce\r\n+qui se passe, si je me dénonce.--Si je ne me dénonce pas? Voyons, si je\r\n+ne me dénonce pas? Après s'être fait cette question, il s'arrêta; il eut\r\n+comme un moment d'hésitation et de tremblement; mais ce moment dura peu,\r\n+et il se répondit avec calme:\r\n+\r\n+--Eh bien, cet homme va aux galères, c'est vrai, mais, que diable! il a\r\n+volé! J'ai beau me dire qu'il n'a pas volé, il a volé! Moi, je reste\r\n+ici, je continue. Dans dix ans j'aurai gagné dix millions, je les\r\n+répands dans le pays, je n'ai rien à moi, qu'est-ce que cela me fait? Ce\r\n+n'est pas pour moi ce que je fais! La prospérité de tous va croissant,\r\n+les industries s'éveillent et s'excitent, les manufactures et les usines\r\n+se multiplient, les familles, cent familles, mille familles! sont\r\n+heureuses; la contrée se peuple; il naît des villages où il n'y a que\r\n+des fermes, il naît des fermes où il n'y a rien; la misère disparaît, et\r\n+avec la misère disparaissent la débauche, la prostitution, le vol, le\r\n+meurtre, tous les vices, tous les crimes! Et cette pauvre mère élève son\r\n+enfant! et voilà tout un pays riche et honnête! Ah çà , j'étais fou,\r\n+j'étais absurde, qu'est-ce que je parlais donc de me dénoncer? Il faut\r\n+faire attention, vraiment, et ne rien précipiter. Quoi! parce qu'il\r\n+m'aura plu de faire le grand et le généreux,--c'est du mélodrame, après\r\n+tout!--parce que je n'aurai songé qu'à moi, qu'à moi seul, quoi! pour\r\n+sauver d'une punition peut-être un peu exagérée, mais juste au fond, on\r\n+ne sait qui, un voleur, un drôle évidemment, il faudra que tout un pays\r\n+périsse! il faudra qu'une pauvre femme crève à l'hôpital! qu'une pauvre\r\n+petite fille crève sur le pavé! comme des chiens! Ah! mais c'est\r\n+abominable! Sans même que la mère ait revu son enfant! sans que l'enfant\r\n+ait presque connu sa mère! Et tout ça pour ce vieux gredin de voleur de\r\n+pommes qui, à coup sûr, a mérité les galères pour autre chose, si ce\r\n+n'est pour cela! Beaux scrupules qui sauvent un coupable et qui\r\n+sacrifient des innocents, qui sauvent un vieux vagabond, lequel n'a plus\r\n+que quelques années à vivre au bout du compte et ne sera guère plus\r\n+malheureux au bagne que dans sa masure, et qui sacrifient toute une\r\n+population, mères, femmes, enfants! Cette pauvre petite Cosette qui n'a\r\n+que moi au monde et qui est sans doute en ce moment toute bleue de froid\r\n+dans le bouge de ces Thénardier! Voilà encore des canailles ceux-là ! Et\r\n+je manquerais à mes devoirs envers tous ces pauvres êtres! Et je m'en\r\n+irais me dénoncer! Et je ferais cette inepte sottise! Mettons tout au\r\n+pis. Supposons qu'il y ait une mauvaise action pour moi dans ceci et que\r\n+ma conscience me la reproche un jour, accepter, pour le bien d'autrui,\r\n+ces reproches qui ne chargent que moi, cette mauvaise action qui ne\r\n+compromet que mon âme, c'est là qu'est le dévouement, c'est là qu'est la\r\n+vertu.\r\n+\r\n+Il se leva, il se remit à marcher. Cette fois il lui semblait qu'il\r\n+était content. On ne trouve les diamants que dans les ténèbres de la\r\n+terre; on ne trouve les vérités que dans les profondeurs de la pensée.\r\n+Il lui semblait qu'après être descendu dans ces profondeurs, après avoir\r\n+longtemps tâtonné au plus noir de ces ténèbres, il venait enfin de\r\n+trouver un de ces diamants, une de ces vérités, et qu'il la tenait dans\r\n+sa main; et il s'éblouissait à la regarder.\r\n+\r\n+--Oui, pensa-t-il, c'est cela. Je suis dans le vrai. J'ai la solution.\r\n+Il faut finir par s'en tenir à quelque chose. Mon parti est pris.\r\n+Laissons faire! Ne vacillons plus, ne reculons plus. Ceci est dans\r\n+l'intérêt de tous, non dans le mien. Je suis Madeleine, je reste\r\n+Madeleine. Malheur à celui qui est Jean Valjean! Ce n'est plus moi. Je\r\n+ne connais pas cet homme, je ne sais plus ce que c'est, s'il se trouve\r\n+que quelqu'un est Jean Valjean à cette heure, qu'il s'arrange! cela ne\r\n+me regarde pas. C'est un nom de fatalité qui flotte dans la nuit, s'il\r\n+s'arrête et s'abat sur une tête, tant pis pour elle!\r\n+\r\n+Il se regarda dans le petit miroir qui était sur sa cheminée, et dit:\r\n+\r\n+--Tiens! cela m'a soulagé de prendre une résolution! Je suis tout autre\r\n+à présent.\r\n+\r\n+Il marcha encore quelques pas, puis il s'arrêta court:\r\n+\r\n+--Allons! dit-il, il ne faut hésiter devant aucune des conséquences de\r\n+la résolution prise. Il y a encore des fils qui m'attachent à ce Jean\r\n+Valjean. Il faut les briser! Il y a ici, dans cette chambre même, des\r\n+objets qui m'accuseraient, des choses muettes qui seraient des témoins,\r\n+c'est dit, il faut que tout cela disparaisse.\r\n+\r\n+Il fouilla dans sa poche, en tira sa bourse, l'ouvrit, et y prit une\r\n+petite clef.\r\n+\r\n+Il introduisit cette clef dans une serrure dont on voyait à peine le\r\n+trou, perdu qu'il était dans les nuances les plus sombres du dessin qui\r\n+couvrait le papier collé sur le mur. Une cachette s'ouvrit, une espèce\r\n+de fausse armoire ménagée entre l'angle de la muraille et le manteau de\r\n+la cheminée. Il n'y avait dans cette cachette que quelques guenilles, un\r\n+sarrau de toile bleue, un vieux pantalon, un vieux havresac, et un gros\r\n+bâton d'épine ferré aux deux bouts. Ceux qui avaient vu Jean Valjean à \r\n+l'époque où il traversait Digne, en octobre 1815, eussent aisément\r\n+reconnu toutes les pièces de ce misérable accoutrement.\r\n+\r\n+Il les avait conservées comme il avait conservé les chandeliers\r\n+d'argent, pour se rappeler toujours son point de départ. Seulement il\r\n+cachait ceci qui venait du bagne, et il laissait voir les flambeaux qui\r\n+venaient de l'évêque.\r\n+\r\n+Il jeta un regard furtif vers la porte, comme s'il eût craint qu'elle ne\r\n+s'ouvrît malgré le verrou qui la fermait; puis d'un mouvement vif et\r\n+brusque et d'une seule brassée, sans même donner un coup d'oeil à ces\r\n+choses qu'il avait si religieusement et si périlleusement gardées\r\n+pendant tant d'années, il prit tout, haillons, bâton, havresac, et jeta\r\n+tout au feu. Il referma la fausse armoire, et, redoublant de\r\n+précautions, désormais inutiles puisqu'elle était vide, en cacha la\r\n+porte derrière un gros meuble qu'il y poussa.\r\n+\r\n+Au bout de quelques secondes, la chambre et le mur d'en face furent\r\n+éclairés d'une grande réverbération rouge et tremblante. Tout brûlait.\r\n+Le bâton d'épine pétillait et jetait des étincelles jusqu'au milieu de\r\n+la chambre.\r\n+\r\n+Le havresac, en se consumant avec d'affreux chiffons qu'il contenait,\r\n+avait mis à nu quelque chose qui brillait dans la cendre. En se\r\n+penchant, on eût aisément reconnu une pièce d'argent. Sans doute la\r\n+pièce de quarante sous volée au petit savoyard.\r\n+\r\n+Lui ne regardait pas le feu et marchait, allant et venant toujours du\r\n+même pas.\r\n+\r\n+Tout à coup ses yeux tombèrent sur les deux flambeaux d'argent que la\r\n+réverbération faisait reluire vaguement sur la cheminée.\r\n+\r\n+--Tiens! pensa-t-il, tout Jean Valjean est encore là -dedans. Il faut\r\n+aussi détruire cela.\r\n+\r\n+Il prit les deux flambeaux.\r\n+\r\n+Il y avait assez de feu pour qu'on pût les déformer promptement et en\r\n+faire une sorte de lingot méconnaissable.\r\n+\r\n+Il se pencha sur le foyer et s'y chauffa un instant. Il eut un vrai\r\n+bien-être.--La bonne chaleur! dit-il.\r\n+\r\n+Il remua le brasier avec un des deux chandeliers. Une minute de plus, et\r\n+ils étaient dans le feu. En ce moment il lui sembla qu'il entendait une\r\n+voix qui criait au dedans de lui:\r\n+\r\n+--Jean Valjean! Jean Valjean!\r\n+\r\n+Ses cheveux se dressèrent, il devint comme un homme qui écoute une chose\r\n+terrible.\r\n+\r\n+--Oui, c'est cela, achève! disait la voix. Complète ce que tu fais!\r\n+détruis ces flambeaux! anéantis ce souvenir! oublie l'évêque! oublie\r\n+tout! perds ce Champmathieu! va, c'est bien. Applaudis-toi! Ainsi, c'est\r\n+convenu, c'est résolu, c'est dit, voilà un homme, voilà un vieillard qui\r\n+ne sait ce qu'on lui veut, qui n'a rien fait peut-être, un innocent,\r\n+dont ton nom fait tout le malheur, sur qui ton nom pèse comme un crime,\r\n+qui va être pris pour toi, qui va être condamné, qui va finir ses jours\r\n+dans l'abjection et dans l'horreur! c'est bien. Sois honnête homme, toi.\r\n+Reste monsieur le maire, reste honorable et honoré, enrichis la ville,\r\n+nourris des indigents, élève des orphelins, vis heureux, vertueux et\r\n+admiré, et pendant ce temps-là , pendant que tu seras ici dans la joie et\r\n+dans la lumière, il y aura quelqu'un qui aura ta casaque rouge, qui\r\n+portera ton nom dans l'ignominie et qui traînera ta chaîne au bagne!\r\n+Oui, c'est bien arrangé ainsi! Ah! misérable!\r\n+\r\n+La sueur lui coulait du front. Il attachait sur les flambeaux un oeil\r\n+hagard. Cependant ce qui parlait en lui n'avait pas fini. La voix\r\n+continuait:\r\n+\r\n+--Jean Valjean! il y aura autour de toi beaucoup de voix qui feront un\r\n+grand bruit, qui parleront bien haut, et qui te béniront, et une seule\r\n+que personne n'entendra et qui te maudira dans les ténèbres. Eh bien!\r\n+écoute, infâme! toutes ces bénédictions retomberont avant d'arriver au\r\n+ciel, et il n'y aura que la malédiction qui montera jusqu'à Dieu! Cette\r\n+voix, d'abord toute faible et qui s'était élevée du plus obscur de sa\r\n+conscience, était devenue par degrés éclatante et formidable, et il\r\n+l'entendait maintenant à son oreille. Il lui semblait qu'elle était\r\n+sortie de lui-même et qu'elle parlait à présent en dehors de lui. Il\r\n+crut entendre les dernières paroles si distinctement qu'il regarda dans\r\n+la chambre avec une sorte de terreur.\r\n+\r\n+--Y a-t-il quelqu'un ici? demanda-t-il à haute voix, et tout égaré.\r\n+\r\n+Puis il reprit avec un rire qui ressemblait au rire d'un idiot:\r\n+\r\n+--Que je suis bête! il ne peut y avoir personne.\r\n+\r\n+Il y avait quelqu'un; mais celui qui y était n'était pas de ceux que\r\n+l'oeil humain peut voir.\r\n+\r\n+Il posa les flambeaux sur la cheminée.\r\n+\r\n+Alors il reprit cette marche monotone et lugubre qui troublait dans ses\r\n+rêves et réveillait en sursaut l'homme endormi au-dessous de lui.\r\n+\r\n+Cette marche le soulageait et l'enivrait en même temps. Il semble que\r\n+parfois dans les occasions suprêmes on se remue pour demander conseil à \r\n+tout ce qu'on peut rencontrer en se déplaçant. Au bout de quelques\r\n+instants il ne savait plus où il en était.\r\n+\r\n+Il reculait maintenant avec une égale épouvante devant les deux\r\n+résolutions qu'il avait prises tour à tour. Les deux idées qui le\r\n+conseillaient lui paraissaient aussi funestes l'une que l'autre.--Quelle\r\n+fatalité! quelle rencontre que ce Champmathieu pris pour lui! Être\r\n+précipité justement par le moyen que la providence paraissait d'abord\r\n+avoir employé pour l'affermir!\r\n+\r\n+Il y eut un moment où il considéra l'avenir. Se dénoncer, grand Dieu! se\r\n+livrer! Il envisagea avec un immense désespoir tout ce qu'il faudrait\r\n+quitter, tout ce qu'il faudrait reprendre. Il faudrait donc dire adieu à \r\n+cette existence si bonne, si pure, si radieuse, à ce respect de tous, à \r\n+l'honneur, à la liberté! Il n'irait plus se promener dans les champs, il\r\n+n'entendrait plus chanter les oiseaux au mois de mai, il ne ferait plus\r\n+l'aumône aux petits enfants! Il ne sentirait plus la douceur des regards\r\n+de reconnaissance et d'amour fixés sur lui! Il quitterait cette maison\r\n+qu'il avait bâtie, cette chambre, cette petite chambre! Tout lui\r\n+paraissait charmant à cette heure. Il ne lirait plus dans ces livres, il\r\n+n'écrirait plus sur cette petite table de bois blanc! Sa vieille\r\n+portière, la seule servante qu'il eût, ne lui monterait plus son café le\r\n+matin. Grand Dieu! au lieu de cela, la chiourme, le carcan, la veste\r\n+rouge, la chaîne au pied, la fatigue, le cachot, le lit de camp, toutes\r\n+ces horreurs connues! À son âge, après avoir été ce qu'il était! Si\r\n+encore il était jeune! Mais, vieux, être tutoyé par le premier venu,\r\n+être fouillé par le garde-chiourme, recevoir le coup de bâton de\r\n+l'argousin! avoir les pieds nus dans des souliers ferrés! tendre matin\r\n+et soir sa jambe au marteau du rondier qui visite la manille! subir la\r\n+curiosité des étrangers auxquels on dirait: _Celui-là , c'est le fameux\r\n+Jean Valjean, qui a été maire à Montreuil-sur-mer_! Le soir, ruisselant\r\n+de sueur, accablé de lassitude, le bonnet vert sur les yeux, remonter\r\n+deux à deux, sous le fouet du sergent, l'escalier-échelle du bagne\r\n+flottant! Oh! quelle misère! La destinée peut-elle donc être méchante\r\n+comme un être intelligent et devenir monstrueuse comme le coeur humain!\r\n+\r\n+Et, quoi qu'il fît, il retombait toujours sur ce poignant dilemme qui\r\n+était au fond de sa rêverie:--rester dans le paradis, et y devenir\r\n+démon! rentrer dans l'enfer, et y devenir ange!\r\n+\r\n+Que faire, grand Dieu! que faire?\r\n+\r\n+La tourmente dont il était sorti avec tant de peine se déchaîna de\r\n+nouveau en lui. Ses idées recommencèrent à se mêler. Elles prirent ce je\r\n+ne sais quoi de stupéfié et de machinal qui est propre au désespoir. Ce\r\n+nom de Romainville lui revenait sans cesse à l'esprit avec deux vers\r\n+d'une chanson qu'il avait entendue autrefois. Il songeait que\r\n+Romainville est un petit bois près Paris où les jeunes gens amoureux\r\n+vont cueillir des lilas au mois d'avril.\r\n+\r\n+Il chancelait au dehors comme au dedans. Il marchait comme un petit\r\n+enfant qu'on laisse aller seul.\r\n+\r\n+À de certains moments, luttant contre sa lassitude, il faisait effort\r\n+pour ressaisir son intelligence. Il tâchait de se poser une dernière\r\n+fois, et définitivement, le problème sur lequel il était en quelque\r\n+sorte tombé d'épuisement. Faut-il se dénoncer? Faut-il se taire?--Il ne\r\n+réussissait à rien voir de distinct. Les vagues aspects de tous les\r\n+raisonnements ébauchés par sa rêverie tremblaient et se dissipaient l'un\r\n+après l'autre en fumée. Seulement il sentait que, à quelque parti qu'il\r\n+s'arrêtât, nécessairement, et sans qu'il fût possible d'y échapper,\r\n+quelque chose de lui allait mourir; qu'il entrait dans un sépulcre à \r\n+droite comme à gauche; qu'il accomplissait une agonie, l'agonie de son\r\n+bonheur ou l'agonie de sa vertu.\r\n+\r\n+Hélas! toutes ses irrésolutions l'avaient repris. Il n'était pas plus\r\n+avancé qu'au commencement.\r\n+\r\n+Ainsi se débattait sous l'angoisse cette malheureuse âme. Dix-huit cents\r\n+ans avant cet homme infortuné, l'être mystérieux, en qui se résument\r\n+toutes les saintetés et toutes les souffrances de l'humanité, avait\r\n+aussi lui, pendant que les oliviers frémissaient au vent farouche de\r\n+l'infini, longtemps écarté de la main l'effrayant calice qui lui\r\n+apparaissait ruisselant d'ombre et débordant de ténèbres dans des\r\n+profondeurs pleines d'étoiles.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IV\r\n+\r\n+Formes que prend la souffrance pendant le sommeil\r\n+\r\n+\r\n+Trois heures du matin venaient de sonner, et il y avait cinq heures\r\n+qu'il marchait ainsi, presque sans interruption lorsqu'il se laissa\r\n+tomber sur sa chaise.\r\n+\r\n+Il s'y endormit et fit un rêve.\r\n+\r\n+Ce rêve, comme la plupart des rêves, ne se rapportait à la situation que\r\n+par je ne sais quoi de funeste et de poignant, mais il lui fit\r\n+impression. Ce cauchemar le frappa tellement que plus tard il l'a écrit.\r\n+C'est un des papiers écrits de sa main qu'il a laissés. Nous croyons\r\n+devoir transcrire ici cette chose textuellement.\r\n+\r\n+Quel que soit ce rêve, l'histoire de cette nuit serait incomplète si\r\n+nous l'omettions. C'est la sombre aventure d'une âme malade.\r\n+\r\n+Le voici. Sur l'enveloppe nous trouvons cette ligne écrite: _Le rêve que\r\n+j'ai eu cette nuit-là ._\r\n+\r\n+«J'étais dans une campagne. Une grande campagne triste où il n'y avait\r\n+pas d'herbe. Il ne me semblait pas qu'il fît jour ni qu'il fît nuit.\r\n+\r\n+«Je me promenais avec mon frère, le frère de mes années d'enfance, ce\r\n+frère auquel je dois dire que je ne pense jamais et dont je ne me\r\n+souviens presque plus.\r\n+\r\n+«Nous causions, et nous rencontrions des passants. Nous parlions d'une\r\n+voisine que nous avions eue autrefois, et qui, depuis qu'elle demeurait\r\n+sur la rue, travaillait la fenêtre toujours ouverte. Tout en causant,\r\n+nous avions froid à cause de cette fenêtre ouverte.\r\n+\r\n+«Il n'y avait pas d'arbres dans la campagne.\r\n+\r\n+«Nous vîmes un homme qui passa près de nous. C'était un homme tout nu,\r\n+couleur de cendre, monté sur un cheval couleur de terre. L'homme n'avait\r\n+pas de cheveux; on voyait son crâne et des veines sur son crâne. Il\r\n+tenait à la main une baguette qui était souple comme un sarment de vigne\r\n+et lourde comme du fer. Ce cavalier passa et ne nous dit rien.\r\n+\r\n+«Mon frère me dit: Prenons par le chemin creux.\r\n+\r\n+«Il y avait un chemin creux où l'on ne voyait pas une broussaille ni un\r\n+brin de mousse. Tout était couleur de terre, même le ciel. Au bout de\r\n+quelques pas, on ne me répondit plus quand je parlais. Je m'aperçus que\r\n+mon frère n'était plus avec moi.\r\n+\r\n+«J'entrai dans un village que je vis. Je songeai que ce devait être là \r\n+Romainville (pourquoi Romainville?).\r\n+\r\n+«La première rue où j'entrai était déserte. J'entrai dans une seconde\r\n+rue. Derrière l'angle que faisaient les deux rues, il y avait un homme\r\n+debout contre le mur. Je dis à cet homme:--Quel est ce pays? où suis-je?\r\n+L'homme ne répondit pas. Je vis la porte d'une maison ouverte, j'y\r\n+entrai.\r\n+\r\n+«La première chambre était déserte. J'entrai dans la seconde. Derrière\r\n+la porte de cette chambre, il y avait un homme debout contre le mur. Je\r\n+demandai à cet homme:--À qui est cette maison? où suis-je? L'homme ne\r\n+répondit pas. La maison avait un jardin.\r\n+\r\n+«Je sortis de la maison et j'entrai dans le jardin. Le jardin était\r\n+désert. Derrière le premier arbre, je trouvai un homme qui se tenait\r\n+debout. Je dis à cet homme:--Quel est ce jardin? où suis-je? L'homme ne\r\n+répondit pas.\r\n+\r\n+«J'errai dans le village, et je m'aperçus que c'était une ville. Toutes\r\n+les rues étaient désertes, toutes les portes étaient ouvertes. Aucun\r\n+être vivant ne passait dans les rues, ne marchait dans les chambres ou\r\n+ne se promenait dans les jardins. Mais il y avait derrière chaque angle\r\n+de mur, derrière chaque porte, derrière chaque arbre, un homme debout\r\n+qui se taisait. On n'en voyait jamais qu'un à la fois. Ces hommes me\r\n+regardaient passer.\r\n+\r\n+«Je sortis de la ville et je me mis à marcher dans les champs.\r\n+\r\n+«Au bout de quelque temps, je me retournai, et je vis une grande foule\r\n+qui venait derrière moi. Je reconnus tous les hommes que j'avais vus\r\n+dans la ville. Ils avaient des têtes étranges. Ils ne semblaient pas se\r\n+hâter, et cependant ils marchaient plus vite que moi. Ils ne faisaient\r\n+aucun bruit en marchant. En un instant, cette foule me rejoignit et\r\n+m'entoura. Les visages de ces hommes étaient couleur de terre.\r\n+\r\n+«Alors le premier que j'avais vu et questionné en entrant dans la ville\r\n+me dit:--Où allez-vous? Est-ce que vous ne savez pas que vous êtes mort\r\n+depuis longtemps?\r\n+\r\n+«J'ouvris la bouche pour répondre, et je m'aperçus qu'il n'y avait\r\n+personne autour de moi.»\r\n+\r\n+Il se réveilla. Il était glacé. Un vent qui était froid comme le vent du\r\n+matin faisait tourner dans leurs gonds les châssis de la croisée restée\r\n+ouverte. Le feu s'était éteint. La bougie touchait à sa fin. Il était\r\n+encore nuit noire.\r\n+\r\n+Il se leva, il alla à la fenêtre. Il n'y avait toujours pas d'étoiles au\r\n+ciel.\r\n+\r\n+De sa fenêtre on voyait la cour de la maison et la rue. Un bruit sec et\r\n+dur qui résonna tout à coup sur le sol lui fit baisser les yeux.\r\n+\r\n+Il vit au-dessous de lui deux étoiles rouges dont les rayons\r\n+s'allongeaient et se raccourcissaient bizarrement dans l'ombre.\r\n+\r\n+Comme sa pensée était encore à demi submergée dans la brume des\r\n+rêves.--tiens! songea-t-il, il n'y en a pas dans le ciel. Elles sont sur\r\n+la terre maintenant.\r\n+\r\n+Cependant ce trouble se dissipa, un second bruit pareil au premier\r\n+acheva de le réveiller; il regarda, et il reconnut que ces deux étoiles\r\n+étaient les lanternes d'une voiture. À la clarté qu'elles jetaient, il\r\n+put distinguer la forme de cette voiture. C'était un tilbury attelé d'un\r\n+petit cheval blanc. Le bruit qu'il avait entendu, c'étaient les coups de\r\n+pied du cheval sur le pavé.\r\n+\r\n+--Qu'est-ce que c'est que cette voiture? se dit-il. Qui est-ce qui vient\r\n+donc si matin? En ce moment on frappa un petit coup à la porte de sa\r\n+chambre.\r\n+\r\n+Il frissonna de la tête aux pieds, et cria d'une voix terrible:\r\n+\r\n+--Qui est là ?\r\n+\r\n+Quelqu'un répondit:\r\n+\r\n+--Moi, monsieur le maire.\r\n+\r\n+Il reconnut la voix de la vieille femme, sa portière.\r\n+\r\n+--Eh bien, reprit-il, qu'est-ce que c'est?\r\n+\r\n+--Monsieur le maire, il est tout à l'heure cinq heures du matin.\r\n+\r\n+--Qu'est-ce que cela me fait?\r\n+\r\n+--Monsieur le maire, c'est le cabriolet.\r\n+\r\n+--Quel cabriolet?\r\n+\r\n+--Le tilbury.\r\n+\r\n+--Quel tilbury?\r\n+\r\n+--Est-ce que monsieur le maire n'a pas fait demander un tilbury?\r\n+\r\n+--Non, dit-il.\r\n+\r\n+--Le cocher dit qu'il vient chercher monsieur le maire.\r\n+\r\n+--Quel cocher?\r\n+\r\n+--Le cocher de M. Scaufflaire.\r\n+\r\n+--M. Scaufflaire?\r\n+\r\n+Ce nom le fit tressaillir comme si un éclair lui eût passé devant la\r\n+face.\r\n+\r\n+--Ah! oui! reprit-il, M. Scaufflaire.\r\n+\r\n+Si la vieille femme l'eût pu voir en ce moment, elle eût été épouvantée.\r\n+\r\n+Il se fit un assez long silence. Il examinait d'un air stupide la flamme\r\n+de la bougie et prenait autour de la mèche de la cire brûlante qu'il\r\n+roulait dans ses doigts.\r\n+\r\n+La vieille attendait. Elle se hasarda pourtant à élever encore la voix:\r\n+\r\n+--Monsieur le maire, que faut-il que je réponde?\r\n+\r\n+--Dites que c'est bien, et que je descends.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre V\r\n+\r\n+Bâtons dans les roues\r\n+\r\n+\r\n+Le service des postes d'Arras à Montreuil-sur-mer se faisait encore à \r\n+cette époque par de petites malles du temps de l'empire. Ces malles\r\n+étaient des cabriolets à deux roues, tapissés de cuir fauve au dedans,\r\n+suspendus sur des ressorts à pompe, et n'ayant que deux places, l'une\r\n+pour le courrier, l'autre pour le voyageur. Les roues étaient armées de\r\n+ces longs moyeux offensifs qui tiennent les autres voitures à distance\r\n+et qu'on voit encore sur les routes d'Allemagne. Le coffre aux dépêches,\r\n+immense boîte oblongue, était placé derrière le cabriolet et faisait\r\n+corps avec lui. Ce coffre était peint en noir et le cabriolet en jaune.\r\n+\r\n+Ces voitures, auxquelles rien ne ressemble aujourd'hui, avaient je ne\r\n+sais quoi de difforme et de bossu, et, quand on les voyait passer de\r\n+loin et ramper dans quelque route à l'horizon, elles ressemblaient à ces\r\n+insectes qu'on appelle, je crois, termites, et qui, avec un petit\r\n+corsage, traînent un gros arrière-train. Elles allaient, du reste, fort\r\n+vite. La malle partie d'Arras toutes les nuits à une heure, après le\r\n+passage du courrier de Paris, arrivait à Montreuil-sur-mer un peu avant\r\n+cinq heures du matin.\r\n+\r\n+Cette nuit-là , la malle qui descendait à Montreuil-sur-mer par la route\r\n+de Hesdin accrocha, au tournant d'une rue, au moment où elle entrait\r\n+dans la ville, un petit tilbury attelé d'un cheval blanc, qui venait en\r\n+sens inverse et dans lequel il n'y avait qu'une personne, un homme\r\n+enveloppé d'un manteau. La roue du tilbury reçut un choc assez rude. Le\r\n+courrier cria à cet homme d'arrêter, mais le voyageur n'écouta pas, et\r\n+continua sa route au grand trot.\r\n+\r\n+--Voilà un homme diablement pressé! dit le courrier.\r\n+\r\n+L'homme qui se hâtait ainsi, c'est celui que nous venons de voir se\r\n+débattre dans des convulsions dignes à coup sûr de pitié.\r\n+\r\n+Où allait-il? Il n'eût pu le dire. Pourquoi se hâtait-il? Il ne savait.\r\n+Il allait au hasard devant lui. Où? À Arras sans doute; mais il allait\r\n+peut-être ailleurs aussi. Par moments il le sentait, et il tressaillait.\r\n+\r\n+Il s'enfonçait dans cette nuit comme dans un gouffre. Quelque chose le\r\n+poussait, quelque chose l'attirait. Ce qui se passait en lui, personne\r\n+ne pourrait le dire, tous le comprendront. Quel homme n'est entré, au\r\n+moins une fois en sa vie, dans cette obscure caverne de l'inconnu?\r\n+\r\n+Du reste il n'avait rien résolu, rien décidé, rien arrêté, rien fait.\r\n+Aucun des actes de sa conscience n'avait été définitif. Il était plus\r\n+que jamais comme au premier moment. Pourquoi allait-il à Arras?\r\n+\r\n+Il se répétait ce qu'il s'était déjà dit en retenant le cabriolet de\r\n+Scaufflaire,--que, quel que dût être le résultat, il n'y avait aucun\r\n+inconvénient à voir de ses yeux, à juger les choses par lui-même;--que\r\n+cela même était prudent, qu'il fallait savoir ce qui se passerait; qu'on\r\n+ne pouvait rien décider sans avoir observé et scruté;--que de loin on se\r\n+faisait des montagnes de tout; qu'au bout du compte, lorsqu'il aurait vu\r\n+ce Champmathieu, quelque misérable, sa conscience serait probablement\r\n+fort soulagée de le laisser aller au bagne à sa place;--qu'à la vérité\r\n+il y aurait là Javert, et ce Brevet, ce Chenildieu, ce Cochepaille,\r\n+anciens forçats qui l'avaient connu; mais qu'à coup sûr ils ne le\r\n+reconnaîtraient pas;--bah! quelle idée!--que Javert en était à cent\r\n+lieues;--que toutes les conjectures et toutes les suppositions étaient\r\n+fixées sur ce Champmathieu, et que rien n'est entêté comme les\r\n+suppositions et les conjectures;--qu'il n'y avait donc aucun danger. Que\r\n+sans doute c'était un moment noir, mais qu'il en sortirait;--qu'après\r\n+tout il tenait sa destinée, si mauvaise qu'elle voulût être, dans sa\r\n+main;--qu'il en était le maître. Il se cramponnait à cette pensée.\r\n+\r\n+Au fond, pour tout dire, il eût mieux aimé ne point aller à Arras.\r\n+\r\n+Cependant il y allait.\r\n+\r\n+Tout en songeant, il fouettait le cheval, lequel trottait de ce bon trot\r\n+réglé et sûr qui fait deux lieues et demie à l'heure.\r\n+\r\n+À mesure que le cabriolet avançait, il sentait quelque chose en lui qui\r\n+reculait.\r\n+\r\n+Au point du jour il était en rase campagne; la ville de\r\n+Montreuil-sur-mer était assez loin derrière lui. Il regarda l'horizon\r\n+blanchir; il regarda, sans les voir, passer devant ses yeux toutes les\r\n+froides figures d'une aube d'hiver. Le matin a ses spectres comme le\r\n+soir. Il ne les voyait pas, mais, à son insu, et par une sorte de\r\n+pénétration presque physique, ces noires silhouettes d'arbres et de\r\n+collines ajoutaient à l'état violent de son âme je ne sais quoi de morne\r\n+et de sinistre.\r\n+\r\n+Chaque fois qu'il passait devant une de ces maisons isolées qui côtoient\r\n+parfois les routes, il se disait: il y a pourtant là -dedans des gens qui\r\n+dorment!\r\n+\r\n+Le trot du cheval, les grelots du harnais, les roues sur le pavé,\r\n+faisaient un bruit doux et monotone. Ces choses-là sont charmantes quand\r\n+on est joyeux et lugubres quand on est triste. Il était grand jour\r\n+lorsqu'il arriva à Hesdin. Il s'arrêta devant une auberge pour laisser\r\n+souffler le cheval et lui faire donner l'avoine.\r\n+\r\n+Ce cheval était, comme l'avait dit Scaufflaire, de cette petite race du\r\n+Boulonnais qui a trop de tête, trop de ventre et pas assez d'encolure,\r\n+mais qui a le poitrail ouvert, la croupe large, la jambe sèche et fine\r\n+et le pied solide; race laide, mais robuste et saine. L'excellente bête\r\n+avait fait cinq lieues en deux heures et n'avait pas une goutte de sueur\r\n+sur la croupe.\r\n+\r\n+Il n'était pas descendu du tilbury. Le garçon d'écurie qui apportait\r\n+l'avoine se baissa tout à coup et examina la roue de gauche.\r\n+\r\n+--Allez-vous loin comme cela? dit cet homme.\r\n+\r\n+Il répondit, presque sans sortir de sa rêverie:\r\n+\r\n+--Pourquoi?\r\n+\r\n+--Venez-vous de loin? reprit le garçon.\r\n+\r\n+--De cinq lieues d'ici.\r\n+\r\n+--Ah!\r\n+\r\n+--Pourquoi dites-vous: ah?\r\n+\r\n+Le garçon se pencha de nouveau, resta un moment silencieux, l'oeil fixé\r\n+sur la roue, puis se redressa en disant:\r\n+\r\n+--C'est que voilà une roue qui vient de faire cinq lieues, c'est\r\n+possible, mais qui à coup sûr ne fera pas maintenant un quart de lieue.\r\n+\r\n+Il sauta à bas du tilbury.\r\n+\r\n+--Que dites-vous là , mon ami?\r\n+\r\n+--Je dis que c'est un miracle que vous ayez fait cinq lieues sans\r\n+rouler, vous et votre cheval, dans quelque fossé de la grande route.\r\n+Regardez plutôt.\r\n+\r\n+La roue en effet était gravement endommagée. Le choc de la malle-poste\r\n+avait fendu deux rayons et labouré le moyeu dont l'écrou ne tenait plus.\r\n+\r\n+--Mon ami, dit-il au garçon d'écurie, il y a un charron ici?\r\n+\r\n+--Sans doute, monsieur.\r\n+\r\n+--Rendez-moi le service de l'aller chercher.\r\n+\r\n+--Il est là , à deux pas. Hé! maître Bourgaillard!\r\n+\r\n+Maître Bourgaillard, le charron, était sur le seuil de sa porte. Il vint\r\n+examiner la roue et fit la grimace d'un chirurgien qui considère une\r\n+jambe cassée.\r\n+\r\n+--Pouvez-vous raccommoder cette roue sur-le-champ?\r\n+\r\n+--Oui, monsieur.\r\n+\r\n+--Quand pourrai-je repartir?\r\n+\r\n+--Demain.\r\n+\r\n+--Demain!\r\n+\r\n+--Il y a une grande journée d'ouvrage. Est-ce que monsieur est pressé?\r\n+\r\n+--Très pressé. Il faut que je reparte dans une heure au plus tard.\r\n+\r\n+--Impossible, monsieur.\r\n+\r\n+--Je payerai tout ce qu'on voudra.\r\n+\r\n+--Impossible.\r\n+\r\n+--Eh bien! dans deux heures.\r\n+\r\n+--Impossible pour aujourd'hui. Il faut refaire deux rais et un moyeu.\r\n+Monsieur ne pourra repartir avant demain.\r\n+\r\n+--L'affaire que j'ai ne peut attendre à demain. Si, au lieu de\r\n+raccommoder cette roue, on la remplaçait?\r\n+\r\n+--Comment cela?\r\n+\r\n+--Vous êtes charron?\r\n+\r\n+--Sans doute, monsieur.\r\n+\r\n+--Est-ce que vous n'auriez pas une roue à me vendre? Je pourrais\r\n+repartir tout de suite.\r\n+\r\n+--Une roue de rechange?\r\n+\r\n+--Oui.\r\n+\r\n+--Je n'ai pas une roue toute faite pour votre cabriolet. Deux roues font\r\n+la paire. Deux roues ne vont pas ensemble au hasard.\r\n+\r\n+--En ce cas, vendez-moi une paire de roues.\r\n+\r\n+--Monsieur, toutes les roues ne vont pas à tous les essieux.\r\n+\r\n+--Essayez toujours.\r\n+\r\n+--C'est inutile, monsieur. Je n'ai à vendre que des roues de charrette.\r\n+Nous sommes un petit pays ici.\r\n+\r\n+--Auriez-vous un cabriolet à me louer?\r\n+\r\n+Le maître charron, du premier coup d'oeil, avait reconnu que le tilbury\r\n+était une voiture de louage. Il haussa les épaules.\r\n+\r\n+--Vous les arrangez bien, les cabriolets qu'on vous loue! j'en aurais un\r\n+que je ne vous le louerais pas.\r\n+\r\n+--Eh bien, à me vendre?\r\n+\r\n+--Je n'en ai pas.\r\n+\r\n+--Quoi! pas une carriole? Je ne suis pas difficile, comme vous voyez.\r\n+\r\n+--Nous sommes un petit pays. J'ai bien là sous la remise, ajouta le\r\n+charron, une vieille calèche qui est à un bourgeois de la ville qui me\r\n+l'a donnée en garde et qui s'en sert tous les trente-six du mois. Je\r\n+vous la louerais bien, qu'est-ce que cela me fait? mais il ne faudrait\r\n+pas que le bourgeois la vît passer; et puis, c'est une calèche, il\r\n+faudrait deux chevaux.\r\n+\r\n+--Je prendrai des chevaux de poste.\r\n+\r\n+--Où va monsieur?\r\n+\r\n+--À Arras.\r\n+\r\n+--Et monsieur veut arriver aujourd'hui?\r\n+\r\n+--Mais oui.\r\n+\r\n+--En prenant des chevaux de poste?\r\n+\r\n+--Pourquoi pas?\r\n+\r\n+--Est-il égal à monsieur d'arriver cette nuit à quatre heures du matin?\r\n+\r\n+--Non certes.\r\n+\r\n+--C'est que, voyez-vous bien, il y a une chose à dire, en prenant des\r\n+chevaux de poste....\r\n+\r\n+--Monsieur a son passeport?\r\n+\r\n+--Oui.\r\n+\r\n+--Eh bien, en prenant des chevaux de poste, monsieur n'arrivera pas à \r\n+Arras avant demain. Nous sommes un chemin de traverse. Les relais sont\r\n+mal servis, les chevaux sont aux champs. C'est la saison des grandes\r\n+charrues qui commence, il faut de forts attelages, et l'on prend les\r\n+chevaux partout, à la poste comme ailleurs. Monsieur attendra au moins\r\n+trois ou quatre heures à chaque relais. Et puis on va au pas. Il y a\r\n+beaucoup de côtes à monter.\r\n+\r\n+--Allons, j'irai à cheval. Dételez le cabriolet. On me vendra bien une\r\n+selle dans le pays.\r\n+\r\n+--Sans doute. Mais ce cheval-ci endure-t-il la selle?\r\n+\r\n+--C'est vrai, vous m'y faites penser. Il ne l'endure pas.\r\n+\r\n+--Alors....\r\n+\r\n+--Mais je trouverai bien dans le village un cheval à louer?\r\n+\r\n+--Un cheval pour aller à Arras d'une traite!\r\n+\r\n+--Oui.\r\n+\r\n+--Il faudrait un cheval comme on n'en a pas dans nos endroits. Il\r\n+faudrait l'acheter d'abord, car on ne vous connaît pas. Mais ni à vendre\r\n+ni à louer, ni pour cinq cents francs, ni pour mille, vous ne le\r\n+trouveriez pas!\r\n+\r\n+--Comment faire?\r\n+\r\n+--Le mieux, là , en honnête homme, c'est que je raccommode la roue et que\r\n+vous remettiez votre voyage à demain.\r\n+\r\n+--Demain il sera trop tard.\r\n+\r\n+--Dame!\r\n+\r\n+--N'y a-t-il pas la malle-poste qui va à Arras? Quand passe-t-elle?\r\n+\r\n+--La nuit prochaine. Les deux malles font le service la nuit, celle qui\r\n+monte comme celle qui descend.\r\n+\r\n+--Comment! il vous faut une journée pour raccommoder cette roue?\r\n+\r\n+--Une journée, et une bonne!\r\n+\r\n+--En mettant deux ouvriers?\r\n+\r\n+--En en mettant dix!\r\n+\r\n+--Si on liait les rayons avec des cordes?\r\n+\r\n+--Les rayons, oui; le moyeu, non. Et puis la jante aussi est en mauvais\r\n+état.\r\n+\r\n+--Y a-t-il un loueur de voitures dans la ville?\r\n+\r\n+--Non.\r\n+\r\n+--Y a-t-il un autre charron?\r\n+\r\n+Le garçon d'écurie et le maître charron répondirent en même temps en\r\n+hochant la tête.\r\n+\r\n+--Non.\r\n+\r\n+Il sentit une immense joie.\r\n+\r\n+Il était évident que la providence s'en mêlait. C'était elle qui avait\r\n+brisé la roue du tilbury et qui l'arrêtait en route. Il ne s'était pas\r\n+rendu à cette espèce de première sommation; il venait de faire tous les\r\n+efforts possibles pour continuer son voyage; il avait loyalement et\r\n+scrupuleusement épuisé tous les moyens; il n'avait reculé ni devant la\r\n+saison, ni devant la fatigue, ni devant la dépense; il n'avait rien à se\r\n+reprocher. S'il n'allait pas plus loin, cela ne le regardait plus. Ce\r\n+n'était plus sa faute, c'était, non le fait de sa conscience, mais le\r\n+fait de la providence.\r\n+\r\n+Il respira. Il respira librement et à pleine poitrine pour la première\r\n+fois depuis la visite de Javert. Il lui semblait que le poignet de fer\r\n+qui lui serrait le coeur depuis vingt heures venait de le lâcher.\r\n+\r\n+Il lui paraissait que maintenant Dieu était pour lui, et se déclarait.\r\n+\r\n+Il se dit qu'il avait fait tout ce qu'il pouvait, et qu'à présent il\r\n+n'avait qu'à revenir sur ses pas, tranquillement.\r\n+\r\n+Si sa conversation avec le charron eût eu lieu dans une chambre de\r\n+l'auberge, elle n'eût point eu de témoins, personne ne l'eût entendue,\r\n+les choses en fussent restées là , et il est probable que nous n'aurions\r\n+eu à raconter aucun des événements qu'on va lire; mais cette\r\n+conversation s'était faite dans la rue. Tout colloque dans la rue\r\n+produit inévitablement un cercle. Il y a toujours des gens qui ne\r\n+demandent qu'à être spectateurs. Pendant qu'il questionnait le charron,\r\n+quelques allants et venants s'étaient arrêtés autour d'eux. Après avoir\r\n+écouté pendant quelques minutes, un jeune garçon, auquel personne\r\n+n'avait pris garde, s'était détaché du groupe en courant.\r\n+\r\n+Au moment où le voyageur, après la délibération intérieure que nous\r\n+venons d'indiquer, prenait la résolution de rebrousser chemin, cet\r\n+enfant revenait. Il était accompagné d'une vieille femme.\r\n+\r\n+--Monsieur, dit la femme, mon garçon me dit que vous avez envie de louer\r\n+un cabriolet. Cette simple parole, prononcée par une vieille femme que\r\n+conduisait un enfant, lui fit ruisseler la sueur dans les reins. Il crut\r\n+voir la main qui l'avait lâché reparaître dans l'ombre derrière lui,\r\n+toute prête à le reprendre.\r\n+\r\n+Il répondit:\r\n+\r\n+--Oui, bonne femme, je cherche un cabriolet à louer.\r\n+\r\n+Et il se hâta d'ajouter:\r\n+\r\n+--Mais il n'y en a pas dans le pays.\r\n+\r\n+--Si fait, dit la vieille.\r\n+\r\n+--Où ça donc? reprit le charron.\r\n+\r\n+--Chez moi, répliqua la vieille.\r\n+\r\n+Il tressaillit. La main fatale l'avait ressaisi.\r\n+\r\n+La vieille avait en effet sous un hangar une façon de carriole en osier.\r\n+Le charron et le garçon d'auberge, désolés que le voyageur leur\r\n+échappât, intervinrent.\r\n+\r\n+--C'était une affreuse guimbarde,--cela était posé à cru sur\r\n+l'essieu,--il est vrai que les banquettes étaient suspendues à \r\n+l'intérieur avec des lanières de cuir,--il pleuvait dedans,--les roues\r\n+étaient rouillées et rongées d'humidité,--cela n'irait pas beaucoup plus\r\n+loin que le tilbury,--une vraie patache!--Ce monsieur aurait bien tort\r\n+de s'y embarquer,--etc., etc.\r\n+\r\n+Tout cela était vrai, mais cette guimbarde, cette patache, cette chose,\r\n+quelle qu'elle fût, roulait sur ses deux roues et pouvait aller à Arras.\r\n+\r\n+Il paya ce qu'on voulut, laissa le tilbury à réparer chez le charron\r\n+pour l'y retrouver à son retour, fit atteler le cheval blanc à la\r\n+carriole, y monta, et reprit la route qu'il suivait depuis le matin.\r\n+\r\n+Au moment où la carriole s'ébranla, il s'avoua qu'il avait eu l'instant\r\n+d'auparavant une certaine joie de songer qu'il n'irait point où il\r\n+allait. Il examina cette joie avec une sorte de colère et la trouva\r\n+absurde. Pourquoi de la joie à revenir en arrière? Après tout, il\r\n+faisait ce voyage librement. Personne ne l'y forçait. Et, certainement,\r\n+rien n'arriverait que ce qu'il voudrait bien.\r\n+\r\n+Comme il sortait de Hesdin, il entendit une voix qui lui criait:\r\n+arrêtez! arrêtez! Il arrêta la carriole d'un mouvement vif dans lequel\r\n+il y avait encore je ne sais quoi de fébrile et de convulsif qui\r\n+ressemblait à de l'espérance.\r\n+\r\n+C'était le petit garçon de la vieille.\r\n+\r\n+--Monsieur, dit-il, c'est moi qui vous ai procuré la carriole.\r\n+\r\n+--Eh bien!\r\n+\r\n+--Vous ne m'avez rien donné.\r\n+\r\n+Lui qui donnait à tous et si facilement, il trouva cette prétention\r\n+exorbitante et presque odieuse.\r\n+\r\n+--Ah! c'est toi, drôle? dit-il, tu n'auras rien!\r\n+\r\n+Il fouetta le cheval et repartit au grand trot.\r\n+\r\n+Il avait perdu beaucoup de temps à Hesdin, il eût voulu le rattraper. Le\r\n+petit cheval était courageux et tirait comme deux; mais on était au mois\r\n+de février, il avait plu, les routes étaient mauvaises. Et puis, ce\r\n+n'était plus le tilbury. La carriole était dure et très lourde. Avec\r\n+cela force montées.\r\n+\r\n+Il mit près de quatre heures pour aller de Hesdin à Saint-Pol. Quatre\r\n+heures pour cinq lieues.\r\n+\r\n+À Saint-Pol il détela à la première auberge venue, et fit mener le\r\n+cheval à l'écurie. Comme il l'avait promis à Scaufflaire, il se tint\r\n+près du râtelier pendant que le cheval mangeait. Il songeait à des\r\n+choses tristes et confuses.\r\n+\r\n+La femme de l'aubergiste entre dans l'écurie.\r\n+\r\n+--Est-ce que monsieur ne veut pas déjeuner?\r\n+\r\n+--Tiens, c'est vrai, dit-il, j'ai même bon appétit. Il suivit cette\r\n+femme qui avait une figure fraîche et réjouie. Elle le conduisit dans\r\n+une salle basse où il y avait des tables ayant pour nappes des toiles\r\n+cirées.\r\n+\r\n+--Dépêchez-vous, reprit-il, il faut que je reparte. Je suis pressé.\r\n+\r\n+Une grosse servante flamande mit son couvert en toute hâte. Il regardait\r\n+cette fille avec un sentiment de bien-être.\r\n+\r\n+--C'est là ce que j'avais, pensa-t-il. Je n'avais pas déjeuné.\r\n+\r\n+On le servit. Il se jeta sur le pain, mordit une bouchée, puis le reposa\r\n+lentement sur la table et n'y toucha plus.\r\n+\r\n+Un routier mangeait à une autre table. Il dit à cet homme:\r\n+\r\n+--Pourquoi leur pain est-il donc si amer?\r\n+\r\n+Le routier était allemand et n'entendit pas.\r\n+\r\n+Il retourna dans l'écurie près du cheval.\r\n+\r\n+Une heure après, il avait quitté Saint-Pol et se dirigeait vers Tinques\r\n+qui n'est qu'à cinq lieues d'Arras.\r\n+\r\n+Que faisait-il pendant ce trajet? À quoi pensait-il? Comme le matin, il\r\n+regardait passer les arbres, les toits de chaume, les champs cultivés,\r\n+et les évanouissements du paysage qui se disloque à chaque coude du\r\n+chemin. C'est là une contemplation qui suffit quelquefois à l'âme et qui\r\n+la dispense presque de penser. Voir mille objets pour la première et\r\n+pour la dernière fois, quoi de plus mélancolique et de plus profond!\r\n+Voyager, c'est naître et mourir à chaque instant. Peut-être, dans la\r\n+région la plus vague de son esprit, faisait-il des rapprochements entre\r\n+ces horizons changeants et l'existence humaine. Toutes les choses de la\r\n+vie sont perpétuellement en fuite devant nous. Les obscurcissements et\r\n+les clartés s'entremêlent: après un éblouissement, une éclipse; on\r\n+regarde, on se hâte, on tend les mains pour saisir ce qui passe; chaque\r\n+événement est un tournant de la route; et tout à coup on est vieux. On\r\n+sent comme une secousse, tout est noir, on distingue une porte obscure,\r\n+ce sombre cheval de la vie qui vous traînait s'arrête, et l'on voit\r\n+quelqu'un de voilé et d'inconnu qui le dételle dans les ténèbres.\r\n+\r\n+Le crépuscule tombait au moment où des enfants qui sortaient de l'école\r\n+regardèrent ce voyageur entrer dans Tinques. Il est vrai qu'on était\r\n+encore aux jours courts de l'année. Il ne s'arrêta pas à Tinques. Comme\r\n+il débouchait du village, un cantonnier qui empierrait la route dressa\r\n+la tête et dit:\r\n+\r\n+--Voilà un cheval bien fatigué.\r\n+\r\n+La pauvre bête en effet n'allait plus qu'au pas.\r\n+\r\n+--Est-ce que vous allez à Arras? ajouta le cantonnier.\r\n+\r\n+--Oui.\r\n+\r\n+--Si vous allez de ce train, vous n'y arriverez pas de bonne heure.\r\n+\r\n+Il arrêta le cheval et demanda au cantonnier:\r\n+\r\n+--Combien y a-t-il encore d'ici à Arras?\r\n+\r\n+--Près de sept grandes lieues.\r\n+\r\n+--Comment cela? le livre de poste ne marque que cinq lieues et un quart.\r\n+\r\n+--Ah! reprit le cantonnier, vous ne savez donc pas que la route est en\r\n+réparation? Vous allez la trouver coupée à un quart d'heure d'ici. Pas\r\n+moyen d'aller plus loin.\r\n+\r\n+--Vraiment.\r\n+\r\n+--Vous prendrez à gauche, le chemin qui va à Carency, vous passerez la\r\n+rivière; et, quand vous serez à Camblin, vous tournerez à droite; c'est\r\n+la route de Mont-Saint-Éloy qui va à Arras.\r\n+\r\n+--Mais voilà la nuit, je me perdrai.\r\n+\r\n+--Vous n'êtes pas du pays?\r\n+\r\n+--Non.\r\n+\r\n+--Avec ça, c'est tout chemins de traverse. Tenez, Monsieur, reprit le\r\n+cantonnier, voulez-vous que je vous donne un conseil? Votre cheval est\r\n+las, rentrez dans Tinques. Il y a une bonne auberge. Couchez-y. Vous\r\n+irez demain à Arras.\r\n+\r\n+--Il faut que j'y sois ce soir.\r\n+\r\n+--C'est différent. Alors allez tout de même à cette auberge et prenez-y\r\n+un cheval de renfort. Le garçon du cheval vous guidera dans la traverse.\r\n+\r\n+Il suivit le conseil du cantonnier, rebroussa chemin, et une demi-heure\r\n+après il repassait au même endroit, mais au grand trot, avec un bon\r\n+cheval de renfort. Un garçon d'écurie qui s'intitulait postillon était\r\n+assis sur le brancard de la carriole.\r\n+\r\n+Cependant il sentait qu'il perdait du temps.\r\n+\r\n+Il faisait tout à fait nuit.\r\n+\r\n+Ils s'engagèrent dans la traverse. La route devint affreuse. La carriole\r\n+tombait d'une ornière dans l'autre. Il dit au postillon:\r\n+\r\n+--Toujours au trot, et double pourboire.\r\n+\r\n+Dans un cahot le palonnier cassa.\r\n+\r\n+--Monsieur, dit le postillon, voilà le palonnier cassé, je ne sais plus\r\n+comment atteler mon cheval, cette route-ci est bien mauvaise la nuit; si\r\n+vous vouliez revenir coucher à Tinques, nous pourrions être demain matin\r\n+de bonne heure à Arras.\r\n+\r\n+Il répondit:\r\n+\r\n+--As-tu un bout de corde et un couteau?\r\n+\r\n+--Oui, monsieur.\r\n+\r\n+Il coupa une branche d'arbre et en fit un palonnier.\r\n+\r\n+Ce fut encore une perte de vingt minutes; mais ils repartirent au galop.\r\n+\r\n+La plaine était ténébreuse. Des brouillards bas, courts et noirs\r\n+rampaient sur les collines et s'en arrachaient comme des fumées. Il y\r\n+avait des lueurs blanchâtres dans les nuages. Un grand vent qui venait\r\n+de la mer faisait dans tous les coins de l'horizon le bruit de quelqu'un\r\n+qui remue des meubles. Tout ce qu'on entrevoyait avait des attitudes de\r\n+terreur. Que de choses frissonnent sous ces vastes souffles de la nuit!\r\n+\r\n+Le froid le pénétrait. Il n'avait pas mangé depuis la veille. Il se\r\n+rappelait vaguement son autre course nocturne dans la grande plaine aux\r\n+environs de Digne. Il y avait huit ans; et cela lui semblait hier.\r\n+\r\n+Une heure sonna à quelque clocher lointain. Il demanda au garçon:\r\n+\r\n+--Quelle est cette heure?\r\n+\r\n+--Sept heures, monsieur. Nous serons à Arras à huit. Nous n'avons plus\r\n+que trois lieues. En ce moment il fit pour la première fois cette\r\n+réflexion--en trouvant étrange qu'elle ne lui fût pas venue plus\r\n+tôt--que c'était peut-être inutile, toute la peine qu'il prenait; qu'il\r\n+ne savait seulement pas l'heure du procès; qu'il aurait dû au moins s'en\r\n+informer; qu'il était extravagant d'aller ainsi devant soi sans savoir\r\n+si cela servirait à quelque chose.--Puis il ébaucha quelques calculs\r\n+dans son esprit:--qu'ordinairement les séances des cours d'assises\r\n+commençaient à neuf heures du matin;--que cela ne devait pas être long,\r\n+cette affaire-là ;--que le vol de pommes, ce serait très court;--qu'il\r\n+n'y aurait plus ensuite qu'une question d'identité;--quatre ou cinq\r\n+dépositions, peu de chose à dire pour les avocats;--qu'il allait\r\n+arriver lorsque tout serait fini!\r\n+\r\n+Le postillon fouettait les chevaux. Ils avaient passé la rivière et\r\n+laissé derrière eux Mont-Saint-Éloy.\r\n+\r\n+La nuit devenait de plus en plus profonde.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VI\r\n+\r\n+La soeur Simplice mise à l'épreuve\r\n+\r\n+\r\n+Cependant, en ce moment-là même, Fantine était dans la joie.\r\n+\r\n+Elle avait passé une très mauvaise nuit. Toux affreuse, redoublement de\r\n+fièvre; elle avait eu des songes. Le matin, à la visite du médecin, elle\r\n+délirait. Il avait eu l'air alarmé et avait recommandé qu'on le prévînt\r\n+dès que M. Madeleine viendrait.\r\n+\r\n+Toute la matinée elle fut morne, parla peu, et fit des plis à ses draps\r\n+en murmurant à voix basse des calculs qui avaient l'air d'être des\r\n+calculs de distances. Ses yeux étaient caves et fixes. Ils paraissaient\r\n+presque éteints, et puis, par moments, ils se rallumaient et\r\n+resplendissaient comme des étoiles. Il semble qu'aux approches d'une\r\n+certaine heure sombre, la clarté du ciel emplisse ceux que quitte la\r\n+clarté de la terre.\r\n+\r\n+Chaque fois que la soeur Simplice lui demandait comment elle se\r\n+trouvait, elle répondait invariablement:\r\n+\r\n+--Bien. Je voudrais voir monsieur Madeleine.\r\n+\r\n+Quelques mois auparavant, à ce moment où Fantine venait de perdre sa\r\n+dernière pudeur, sa dernière honte et sa dernière joie, elle était\r\n+l'ombre d'elle-même; maintenant elle en était le spectre. Le mal\r\n+physique avait complété l'oeuvre du mal moral. Cette créature de\r\n+vingt-cinq ans avait le front ridé, les joues flasques, les narines\r\n+pincées, les dents déchaussées, le teint plombé, le cou osseux, les\r\n+clavicules saillantes, les membres chétifs, la peau terreuse, et ses\r\n+cheveux blonds poussaient mêlés de cheveux gris. Hélas! comme la maladie\r\n+improvise la vieillesse! À midi, le médecin revint, il fit quelques\r\n+prescriptions, s'informa si M. le maire avait paru à l'infirmerie, et\r\n+branla la tête.\r\n+\r\n+M. Madeleine venait d'habitude à trois heures voir la malade. Comme\r\n+l'exactitude était de la bonté, il était exact.\r\n+\r\n+Vers deux heures et demie, Fantine commença à s'agiter. Dans l'espace de\r\n+vingt minutes, elle demanda plus de dix fois à la religieuse:\r\n+\r\n+--Ma soeur, quelle heure est-il?\r\n+\r\n+Trois heures sonnèrent. Au troisième coup, Fantine se dressa sur son\r\n+séant, elle qui d'ordinaire pouvait à peine remuer dans son lit; elle\r\n+joignit dans une sorte d'étreinte convulsive ses deux mains décharnées\r\n+et jaunes, et la religieuse entendit sortir de sa poitrine un de ces\r\n+soupirs profonds qui semblent soulever un accablement. Puis Fantine se\r\n+tourna et regarda la porte.\r\n+\r\n+Personne n'entra; la porte ne s'ouvrit point.\r\n+\r\n+Elle resta ainsi un quart d'heure, l'oeil attaché sur la porte, immobile\r\n+et comme retenant son haleine. La soeur n'osait lui parler. L'église\r\n+sonna trois heures un quart. Fantine se laissa retomber sur l'oreiller.\r\n+\r\n+Elle ne dit rien et se remit à faire des plis à son drap. La demi-heure\r\n+passa, puis l'heure. Personne ne vint.\r\n+\r\n+Chaque fois que l'horloge sonnait, Fantine se dressait et regardait du\r\n+côté de la porte, puis elle retombait.\r\n+\r\n+On voyait clairement sa pensée, mais elle ne prononçait aucun nom, elle\r\n+ne se plaignait pas, elle n'accusait pas. Seulement elle toussait d'une\r\n+façon lugubre. On eût dit que quelque chose d'obscur s'abaissait sur\r\n+elle. Elle était livide et avait les lèvres bleues. Elle souriait par\r\n+moments.\r\n+\r\n+Cinq heures sonnèrent. Alors la soeur l'entendit qui disait très bas et\r\n+doucement:\r\n+\r\n+--Mais puisque je m'en vais demain, il a tort de ne pas venir\r\n+aujourd'hui!\r\n+\r\n+La soeur Simplice elle-même était surprise du retard de M. Madeleine.\r\n+\r\n+Cependant Fantine regardait le ciel de son lit. Elle avait l'air de\r\n+chercher à se rappeler quelque chose. Tout à coup elle se mit à chanter\r\n+d'une voix faible comme un souffle. La religieuse écouta. Voici ce que\r\n+Fantine chantait:\r\n+\r\n+ _Nous achèterons de bien belles choses_\r\n+ _En nous promenant le long des faubourgs._\r\n+ _Les bleuets sont bleus, les roses sont roses,_\r\n+ _Les bleuets sont bleus, j'aime mes amours._\r\n+ _La vierge Marie auprès de mon poêle_\r\n+ _Est venue hier en manteau brodé,_\r\n+ _Et m'a dit:--Voici, caché sous mon voile,_\r\n+ _Le petit qu'un jour tu m'as demandé._\r\n+ _Courez à la ville, ayez de la toile,_\r\n+ _Achetez du fil, achetez un dé._\r\n+ _Nous achèterons de bien belles choses_\r\n+ _En nous promenant le long des faubourgs._\r\n+ _Bonne sainte Vierge, auprès de mon poêle_\r\n+ _J'ai mis un berceau de rubans orné_\r\n+ _Dieu me donnerait sa plus belle étoile,_\r\n+ _J'aime mieux l'enfant que tu m'as donné._\r\n+ --_Madame, que faire avec cette toile?_\r\n+ --_Faites un trousseau pour mon nouveau-né._\r\n+ _Les bleuets sont bleus, les roses sont roses,_\r\n+ _Les bleuets sont bleus, j'aime mes amours._\r\n+ --_Lavez cette toile._\r\n+ --_Où?_--_Dans la rivière._\r\n+ _Faites-en, sans rien gâter ni salir,_\r\n+ _Une belle jupe avec sa brassière_\r\n+ _Que je veux broder et de fleurs emplir._\r\n+ --_L'enfant n'est plus là , madame, qu'en faire?_\r\n+ --_Faites-en un drap pour m'ensevelir._\r\n+ _Nous achèterons de bien belles choses_\r\n+ _En nous promenant le long des faubourgs._\r\n+ _Les bleuets sont bleus, les roses sont roses,_\r\n+ _Les bleuets sont bleus, j'aime mes amours._\r\n+\r\n+Cette chanson était une vieille romance de berceuse avec laquelle\r\n+autrefois elle endormait sa petite Cosette, et qui ne s'était pas\r\n+offerte à son esprit depuis cinq ans qu'elle n'avait plus son enfant.\r\n+Elle chantait cela d'une voix si triste et sur un air si doux que\r\n+c'était à faire pleurer, même une religieuse. La soeur, habituée aux\r\n+choses austères, sentit une larme lui venir.\r\n+\r\n+L'horloge sonna six heures. Fantine ne parut pas entendre. Elle semblait\r\n+ne plus faire attention à aucune chose autour d'elle.\r\n+\r\n+La soeur Simplice envoya une fille de service s'informer près de la\r\n+portière de la fabrique si M. le maire était rentré et s'il ne monterait\r\n+pas bientôt à l'infirmerie. La fille revint au bout de quelques minutes.\r\n+\r\n+Fantine était toujours immobile et paraissait attentive à des idées\r\n+qu'elle avait.\r\n+\r\n+La servante raconta très bas à la soeur Simplice que M. le maire était\r\n+parti le matin même avant six heures dans un petit tilbury attelé d'un\r\n+cheval blanc, par le froid qu'il faisait, qu'il était parti seul, pas\r\n+même de cocher, qu'on ne savait pas le chemin qu'il avait pris, que des\r\n+personnes disaient l'avoir vu tourner par la route d'Arras, que d'autres\r\n+assuraient l'avoir rencontré sur la route de Paris. Qu'en s'en allant il\r\n+avait été comme à l'ordinaire très doux, et qu'il avait seulement dit à \r\n+la portière qu'on ne l'attendît pas cette nuit.\r\n+\r\n+Pendant que les deux femmes, le dos tourné au lit de la Fantine,\r\n+chuchotaient, la soeur questionnant, la servante conjecturant, la\r\n+Fantine, avec cette vivacité fébrile de certaines maladies organiques\r\n+qui mêle les mouvements libres de la santé à l'effrayante maigreur de la\r\n+mort, s'était mise à genoux sur son lit, ses deux poings crispés appuyés\r\n+sur le traversin, et, la tête passée par l'intervalle des rideaux, elle\r\n+écoutait. Tout à coup elle cria:\r\n+\r\n+--Vous parlez là de monsieur Madeleine! pourquoi parlez-vous tout bas?\r\n+Qu'est-ce qu'il fait? Pourquoi ne vient-il pas?\r\n+\r\n+Sa voix était si brusque et si rauque que les deux femmes crurent\r\n+entendre une voix d'homme; elles se retournèrent effrayées.\r\n+\r\n+--Répondez donc! cria Fantine.\r\n+\r\n+La servante balbutia:\r\n+\r\n+--La portière m'a dit qu'il ne pourrait pas venir aujourd'hui.\r\n+\r\n+--Mon enfant, dit la soeur, tenez-vous tranquille, recouchez-vous.\r\n+\r\n+Fantine, sans changer d'attitude, reprit d'une voix haute et avec un\r\n+accent tout à la fois impérieux et déchirant:\r\n+\r\n+--Il ne pourra venir? Pourquoi cela? Vous savez la raison. Vous la\r\n+chuchotiez là entre vous. Je veux la savoir.\r\n+\r\n+La servante se hâta de dire à l'oreille de la religieuse:\r\n+\r\n+--Répondez qu'il est occupé au conseil municipal.\r\n+\r\n+La soeur Simplice rougit légèrement; c'était un mensonge que la servante\r\n+lui proposait. D'un autre côté il lui semblait bien que dire la vérité à \r\n+la malade ce serait sans doute lui porter un coup terrible et que cela\r\n+était grave dans l'état où était Fantine. Cette rougeur dura peu. La\r\n+soeur leva sur Fantine son oeil calme et triste, et dit:\r\n+\r\n+--Monsieur le maire est parti.\r\n+\r\n+Fantine se redressa et s'assit sur ses talons. Ses yeux étincelèrent.\r\n+Une joie inouïe rayonna sur cette physionomie douloureuse.\r\n+\r\n+--Parti! s'écria-t-elle. Il est allé chercher Cosette!\r\n+\r\n+Puis elle tendit ses deux mains vers le ciel et tout son visage devint\r\n+ineffable. Ses lèvres remuaient; elle priait à voix basse.\r\n+\r\n+Quand sa prière fut finie:\r\n+\r\n+--Ma soeur, dit-elle, je veux bien me recoucher, je vais faire tout ce\r\n+qu'on voudra; tout à l'heure j'ai été méchante, je vous demande pardon\r\n+d'avoir parlé si haut, c'est très mal de parler haut, je le sais bien,\r\n+ma bonne soeur, mais voyez-vous, je suis très contente. Le bon Dieu est\r\n+bon, monsieur Madeleine est bon, figurez-vous qu'il est allé chercher ma\r\n+petite Cosette à Montfermeil.\r\n+\r\n+Elle se recoucha, aida la religieuse à arranger l'oreiller et baisa une\r\n+petite croix d'argent qu'elle avait au cou et que la soeur Simplice lui\r\n+avait donnée.\r\n+\r\n+--Mon enfant, dit la soeur, tâchez de reposer maintenant, et ne parlez\r\n+plus.\r\n+\r\n+Fantine prit dans ses mains moites la main de la soeur, qui souffrait de\r\n+lui sentir cette sueur.\r\n+\r\n+--Il est parti ce matin pour aller à Paris. Au fait il n'a pas même\r\n+besoin de passer par Paris. Montfermeil, c'est un peu à gauche en\r\n+venant. Vous rappelez-vous comme il me disait hier quand je lui parlais\r\n+de Cosette: bientôt, bientôt? C'est une surprise qu'il veut me faire.\r\n+Vous savez? il m'avait fait signer une lettre pour la reprendre aux\r\n+Thénardier. Ils n'auront rien à dire, pas vrai? Ils rendront Cosette.\r\n+Puisqu'ils sont payés. Les autorités ne souffriraient pas qu'on garde un\r\n+enfant quand on est payé. Ma soeur, ne me faites pas signe qu'il ne faut\r\n+pas que je parle. Je suis extrêmement heureuse, je vais très bien, je\r\n+n'ai plus de mal du tout, je vais revoir Cosette, j'ai même très faim.\r\n+Il y a près de cinq ans que je ne l'ai vue. Vous ne vous figurez pas,\r\n+vous, comme cela vous tient, les enfants! Et puis elle sera si gentille,\r\n+vous verrez! Si vous saviez, elle a de si jolis petits doigts roses!\r\n+D'abord elle aura de très belles mains. À un an, elle avait des mains\r\n+ridicules. Ainsi!--Elle doit être grande à présent. Cela vous a sept\r\n+ans. C'est une demoiselle. Je l'appelle Cosette, mais elle s'appelle\r\n+Euphrasie. Tenez, ce matin, je regardais de la poussière qui était sur\r\n+la cheminée et j'avais bien l'idée comme cela que je reverrais bientôt\r\n+Cosette. Mon Dieu! comme on a tort d'être des années sans voir ses\r\n+enfants! on devrait bien réfléchir que la vie n'est pas éternelle! Oh!\r\n+comme il est bon d'être parti, monsieur le maire! C'est vrai ça, qu'il\r\n+fait bien froid? avait-il son manteau au moins? Il sera ici demain,\r\n+n'est-ce pas? Ce sera demain fête. Demain matin, ma soeur, vous me ferez\r\n+penser à mettre mon petit bonnet qui a de la dentelle. Montfermeil,\r\n+c'est un pays. J'ai fait cette route-là , à pied, dans le temps. Il y a\r\n+eu bien loin pour moi. Mais les diligences vont très vite! Il sera ici\r\n+demain avec Cosette. Combien y a-t-il d'ici Montfermeil?\r\n+\r\n+La soeur, qui n'avait aucune idée des distances, répondit:\r\n+\r\n+--Oh! je crois bien qu'il pourra être ici demain.\r\n+\r\n+--Demain! demain! dit Fantine, je verrai Cosette demain! Voyez-vous,\r\n+bonne soeur du bon Dieu, je ne suis plus malade. Je suis folle. Je\r\n+danserais, si on voulait.\r\n+\r\n+Quelqu'un qui l'eût vue un quart d'heure auparavant n'y eût rien\r\n+compris. Elle était maintenant toute rose, elle parlait d'une voix vive\r\n+et naturelle, toute sa figure n'était qu'un sourire. Par moments elle\r\n+riait en se parlant tout bas. Joie de mère, c'est presque joie d'enfant.\r\n+\r\n+--Eh bien, reprit la religieuse, vous voilà heureuse, obéissez-moi, ne\r\n+parlez plus.\r\n+\r\n+Fantine posa sa tête sur l'oreiller et dit à demi-voix:\r\n+\r\n+--Oui, recouche-toi, sois sage puisque tu vas avoir ton enfant. Elle a\r\n+raison, soeur Simplice. Tous ceux qui sont ici ont raison.\r\n+\r\n+Et puis, sans bouger, sans remuer la tête, elle se mit à regarder\r\n+partout avec ses yeux tout grands ouverts et un air joyeux, et elle ne\r\n+dit plus rien.\r\n+\r\n+La soeur referma ses rideaux, espérant qu'elle s'assoupirait.\r\n+\r\n+Entre sept et huit heures le médecin vint. N'entendant aucun bruit, il\r\n+crut que Fantine dormait, entra doucement et s'approcha du lit sur la\r\n+pointe du pied. Il entrouvrit les rideaux, et à la lueur de la veilleuse\r\n+il vit les grands yeux calmes de Fantine qui le regardaient.\r\n+\r\n+Elle lui dit:\r\n+\r\n+--Monsieur, n'est-ce pas, on me laissera la coucher à côté de moi dans\r\n+un petit lit?\r\n+\r\n+Le médecin crut qu'elle délirait. Elle ajouta:\r\n+\r\n+--Regardez plutôt, il y a juste de la place.\r\n+\r\n+Le médecin prit à part la soeur Simplice qui lui expliqua la chose, que\r\n+M. Madeleine était absent pour un jour ou deux, et que, dans le doute,\r\n+on n'avait pas cru devoir détromper la malade qui croyait monsieur le\r\n+maire parti pour Montfermeil; qu'il était possible en somme qu'elle eût\r\n+deviné juste. Le médecin approuva.\r\n+\r\n+Il se rapprocha du lit de Fantine, qui reprit:\r\n+\r\n+--C'est que, voyez-vous, le matin, quand elle s'éveillera, je lui dirai\r\n+bonjour à ce pauvre chat, et la nuit, moi qui ne dors pas, je\r\n+l'entendrai dormir. Sa petite respiration si douce, cela me fera du\r\n+bien.\r\n+\r\n+--Donnez-moi votre main, dit le médecin.\r\n+\r\n+Elle tendit son bras, et s'écria en riant.\r\n+\r\n+--Ah! tiens! au fait, c'est vrai, vous ne savez pas c'est que je suis\r\n+guérie. Cosette arrive demain.\r\n+\r\n+Le médecin fut surpris. Elle était mieux. L'oppression était moindre. Le\r\n+pouls avait repris de la force. Une sorte de vie survenue tout à coup\r\n+ranimait ce pauvre être épuisé.\r\n+\r\n+--Monsieur le docteur, reprit-elle, la soeur vous a-t-elle dit que\r\n+monsieur le maire était allé chercher le chiffon?\r\n+\r\n+Le médecin recommanda le silence et qu'on évitât toute émotion pénible.\r\n+Il prescrivit une infusion de quinquina pur, et, pour le cas où la\r\n+fièvre reprendrait dans la nuit, une potion calmante. En s'en allant, il\r\n+dit à la soeur:\r\n+\r\n+--Cela va mieux. Si le bonheur voulait qu'en effet monsieur le maire\r\n+arrivât demain avec l'enfant, qui sait? il y a des crises si étonnantes,\r\n+on a vu de grandes joies arrêter court des maladies; je sais bien que\r\n+celle-ci est une maladie organique, et bien avancée, mais c'est un tel\r\n+mystère que tout cela! Nous la sauverions peut-être.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VII\r\n+\r\n+Le voyageur arrivé prend ses précautions pour repartir.\r\n+\r\n+\r\n+Il était près de huit heures du soir quand la carriole que nous avons\r\n+laissée en route entra sous la porte cochère de l'hôtel de la Poste\r\n+à Arras. L'homme que nous avons suivi jusqu'à ce moment en descendit,\r\n+répondit d'un air distrait aux empressements des gens de l'auberge,\r\n+renvoya le cheval de renfort, et conduisit lui-même le petit cheval\r\n+blanc à l'écurie; puis il poussa la porte d'une salle de billard qui\r\n+était au rez-de-chaussée, s'y assit, et s'accouda sur une table. Il\r\n+avait mis quatorze heures à ce trajet qu'il comptait faire en six.\r\n+Il se rendait la justice que ce n'était pas sa faute; mais au fond il\r\n+n'en était pas fâché.\r\n+\r\n+La maîtresse de l'hôtel entra.\r\n+\r\n+--Monsieur couche-t-il? monsieur soupe-t-il?\r\n+\r\n+Il fit un signe de tête négatif.\r\n+\r\n+--Le garçon d'écurie dit que le cheval de monsieur est bien fatigué!\r\n+\r\n+Ici il rompit le silence.\r\n+\r\n+--Est-ce que le cheval ne pourra pas repartir demain matin?\r\n+\r\n+--Oh! monsieur! il lui faut au moins deux jours de repos.\r\n+\r\n+Il demanda:\r\n+\r\n+--N'est-ce pas ici le bureau de poste?\r\n+\r\n+--Oui, monsieur.\r\n+\r\n+L'hôtesse le mena à ce bureau; il montra son passeport et s'informa s'il\r\n+y avait moyen de revenir cette nuit même à Montreuil-sur-mer par la\r\n+malle; la place à côté du courrier était justement vacante; il la retint\r\n+et la paya.\r\n+\r\n+--Monsieur, dit le buraliste, ne manquez pas d'être ici pour partir à \r\n+une heure précise du matin.\r\n+\r\n+Cela fait, il sortit de l'hôtel et se mit à marcher dans la ville.\r\n+\r\n+Il ne connaissait pas Arras, les rues étaient obscures, et il allait au\r\n+hasard. Cependant il semblait s'obstiner à ne pas demander son chemin\r\n+aux passants. Il traversa la petite rivière Crinchon et se trouva dans\r\n+un dédale de ruelles étroites où il se perdit. Un bourgeois cheminait\r\n+avec un falot. Après quelque hésitation, il prit le parti de s'adresser\r\n+à ce bourgeois, non sans avoir d'abord regardé devant et derrière lui,\r\n+comme s'il craignait que quelqu'un n'entendit la question qu'il allait\r\n+faire.\r\n+\r\n+--Monsieur, dit-il, le palais de justice, s'il vous plaît?\r\n+\r\n+--Vous n'êtes pas de la ville, monsieur? répondit le bourgeois qui était\r\n+un assez vieux homme, eh bien, suivez-moi. Je vais précisément du côté\r\n+du palais de justice, c'est-à -dire du côté de l'hôtel de la préfecture.\r\n+Car on répare en ce moment le palais, et provisoirement les tribunaux\r\n+ont leurs audiences à la préfecture.\r\n+\r\n+--Est-ce là , demanda-t-il, qu'on tient les assises?\r\n+\r\n+--Sans doute, monsieur. Voyez-vous, ce qui est la préfecture aujourd'hui\r\n+était l'évêché avant la révolution. Monsieur de Conzié, qui était évêque\r\n+en quatre-vingt-deux, y a fait bâtir une grande salle. C'est dans cette\r\n+grande salle qu'on juge.\r\n+\r\n+Chemin faisant, le bourgeois lui dit:\r\n+\r\n+--Si c'est un procès que monsieur veut voir, il est un peu tard.\r\n+Ordinairement les séances finissent à six heures.\r\n+\r\n+Cependant, comme ils arrivaient sur la grande place, le bourgeois lui\r\n+montra quatre longues fenêtres éclairées sur la façade d'un vaste\r\n+bâtiment ténébreux.\r\n+\r\n+--Ma foi, monsieur, vous arrivez à temps, vous avez du bonheur.\r\n+Voyez-vous ces quatre fenêtres? c'est la cour d'assises. Il y a de la\r\n+lumière. Donc ce n'est pas fini. L'affaire aura traîné en longueur et on\r\n+fait une audience du soir. Vous vous intéressez à cette affaire? Est-ce\r\n+que c'est un procès criminel? Est-ce que vous êtes témoin?\r\n+\r\n+Il répondit:\r\n+\r\n+--Je ne viens pour aucune affaire, j'ai seulement à parler à un avocat.\r\n+\r\n+--C'est différent, dit le bourgeois. Tenez, monsieur, voici la porte. Où\r\n+est le factionnaire. Vous n'aurez qu'à monter le grand escalier.\r\n+\r\n+Il se conforma aux indications du bourgeois, et, quelques minutes après,\r\n+il était dans une salle où il y avait beaucoup de monde et où des\r\n+groupes mêlés d'avocats en robe chuchotaient çà et là .\r\n+\r\n+C'est toujours une chose qui serre le coeur de voir ces attroupements\r\n+d'hommes vêtus de noir qui murmurent entre eux à voix basse sur le seuil\r\n+des chambres de justice. Il est rare que la charité et la pitié sortent\r\n+de toutes ces paroles. Ce qui en sort le plus souvent, ce sont des\r\n+condamnations faites d'avance. Tous ces groupes semblent à l'observateur\r\n+qui passe et qui rêve autant de ruches sombres où des espèces d'esprits\r\n+bourdonnants construisent en commun toutes sortes d'édifices ténébreux.\r\n+\r\n+Cette salle, spacieuse et éclairée d'une seule lampe, était une ancienne\r\n+antichambre de l'évêché et servait de salle des pas perdus. Une porte à \r\n+deux battants, fermée en ce moment, la séparait de la grande chambre où\r\n+siégeait la cour d'assises.\r\n+\r\n+L'obscurité était telle qu'il ne craignit pas de s'adresser au premier\r\n+avocat qu'il rencontra.\r\n+\r\n+--Monsieur, dit-il, où en est-on?\r\n+\r\n+--C'est fini, dit l'avocat.\r\n+\r\n+--Fini!\r\n+\r\n+Ce mot fut répété d'un tel accent que l'avocat se retourna.\r\n+\r\n+--Pardon, monsieur, vous êtes peut-être un parent?\r\n+\r\n+--Non. Je ne connais personne ici. Et y a-t-il eu condamnation?\r\n+\r\n+--Sans doute. Cela n'était guère possible autrement.\r\n+\r\n+--Aux travaux forcés?...\r\n+\r\n+--À perpétuité.\r\n+\r\n+Il reprit d'une voix tellement faible qu'on l'entendait à peine:\r\n+\r\n+--L'identité a donc été constatée?\r\n+\r\n+--Quelle identité? répondit l'avocat. Il n'y avait pas d'identité à \r\n+constater. L'affaire était simple. Cette femme avait tué son enfant,\r\n+l'infanticide a été prouvé, le jury a écarté la préméditation, on l'a\r\n+condamnée à vie.\r\n+\r\n+--C'est donc une femme? dit-il.\r\n+\r\n+--Mais sûrement. La fille Limosin. De quoi me parlez-vous donc?\r\n+\r\n+--De rien. Mais puisque c'est fini, comment se fait-il que la salle soit\r\n+encore éclairée?\r\n+\r\n+--C'est pour l'autre affaire qu'on a commencée il y a à peu près deux\r\n+heures.\r\n+\r\n+--Quelle autre affaire?\r\n+\r\n+--Oh! celle-là est claire aussi. C'est une espèce de gueux, un\r\n+récidiviste, un galérien, qui a volé. Je ne sais plus trop son nom. En\r\n+voilà un qui vous a une mine de bandit. Rien que pour avoir cette\r\n+figure-là , je l'enverrais aux galères.\r\n+\r\n+--Monsieur, demanda-t-il, y a-t-il moyen de pénétrer dans la salle?\r\n+\r\n+--Je ne crois vraiment pas. Il y a beaucoup de foule. Cependant\r\n+l'audience est suspendue. Il y a des gens qui sont sortis, et, à la\r\n+reprise de l'audience, vous pourrez essayer.\r\n+\r\n+--Par où entre-t-on?\r\n+\r\n+--Par cette grande porte.\r\n+\r\n+L'avocat le quitta. En quelques instants, il avait éprouvé, presque en\r\n+même temps, presque mêlées, toutes les émotions possibles. Les paroles\r\n+de cet indifférent lui avaient tour à tour traversé le coeur comme des\r\n+aiguilles de glace et comme des lames de feu. Quand il vit que rien\r\n+n'était terminé, il respira; mais il n'eût pu dire si ce qu'il\r\n+ressentait était du contentement ou de la douleur.\r\n+\r\n+Il s'approcha de plusieurs groupes et il écouta ce qu'on disait. Le rôle\r\n+de la session étant très chargé, le président avait indiqué pour ce même\r\n+jour deux affaires simples et courtes. On avait commencé par\r\n+l'infanticide, et maintenant on en était au forçat, au récidiviste, au\r\n+\u0022cheval de retour\u0022. Cet homme avait volé des pommes, mais cela ne\r\n+paraissait pas bien prouvé; ce qui était prouvé, c'est qu'il avait été\r\n+déjà aux galères à Toulon. C'est ce qui faisait son affaire mauvaise. Du\r\n+reste, l'interrogatoire de l'homme était terminé et les dépositions des\r\n+témoins; mais il y avait encore les plaidoiries de l'avocat et le\r\n+réquisitoire du ministère public; cela ne devait guère finir avant\r\n+minuit. L'homme serait probablement condamné; l'avocat général était\r\n+très bon--et ne manquait pas ses accusés--c'était un garçon d'esprit qui\r\n+faisait des vers.\r\n+\r\n+Un huissier se tenait debout près de la porte qui communiquait avec la\r\n+salle des assises. Il demanda à cet huissier:\r\n+\r\n+--Monsieur, la porte va-t-elle bientôt s'ouvrir?\r\n+\r\n+--Elle ne s'ouvrira pas, dit l'huissier.\r\n+\r\n+--Comment! on ne l'ouvrira pas à la reprise de l'audience? est-ce que\r\n+l'audience n'est pas suspendue?\r\n+\r\n+--L'audience vient d'être reprise, répondit l'huissier, mais la porte ne\r\n+se rouvrira pas.\r\n+\r\n+--Pourquoi?\r\n+\r\n+--Parce que la salle est pleine.\r\n+\r\n+--Quoi? il n'y a plus une place?\r\n+\r\n+--Plus une seule. La porte est fermée. Personne ne peut plus entrer.\r\n+\r\n+L'huissier ajouta après un silence:\r\n+\r\n+--Il y a bien encore deux ou trois places derrière monsieur le\r\n+président, mais monsieur le président n'y admet que les fonctionnaires\r\n+publics.\r\n+\r\n+Cela dit, l'huissier lui tourna le dos.\r\n+\r\n+Il se retira la tête baissée, traversa l'antichambre et redescendit\r\n+l'escalier lentement, comme hésitant à chaque marche. Il est probable\r\n+qu'il tenait conseil avec lui-même. Le violent combat qui se livrait en\r\n+lui depuis la veille n'était pas fini; et, à chaque instant, il en\r\n+traversait quelque nouvelle péripétie. Arrivé sur le palier de\r\n+l'escalier, il s'adossa à la rampe et croisa les bras. Tout à coup il\r\n+ouvrit sa redingote, prit son portefeuille, en tira un crayon, déchira\r\n+une feuille, et écrivit rapidement sur cette feuille à la lueur du\r\n+réverbère cette ligne:--_M. Madeleine, maire de Montreuil-sur-mer_.\r\n+Puis il remonta l'escalier à grands pas, fendit la foule, marcha droit à \r\n+l'huissier, lui remit le papier, et lui dit avec autorité:\r\n+\r\n+--Portez ceci à monsieur le président.\r\n+\r\n+L'huissier prit le papier, y jeta un coup d'oeil et obéit.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre VIII\r\n+\r\n+Entrée de faveur\r\n+\r\n+\r\n+Sans qu'il s'en doutât, le maire de Montreuil-sur-mer avait une sorte de\r\n+célébrité. Depuis sept ans que sa réputation de vertu remplissait tout\r\n+le bas Boulonnais, elle avait fini par franchir les limites d'un petit\r\n+pays et s'était répandue dans les deux ou trois départements voisins.\r\n+Outre le service considérable qu'il avait rendu au chef-lieu en y\r\n+restaurant l'industrie des verroteries noires, il n'était pas une des\r\n+cent quarante et une communes de l'arrondissement de Montreuil-sur-mer\r\n+qui ne lui dût quelque bienfait. Il avait su même au besoin aider et\r\n+féconder les industries des autres arrondissements. C'est ainsi qu'il\r\n+avait dans l'occasion soutenu de son crédit et de ses fonds la fabrique\r\n+de tulle de Boulogne, la filature de lin à la mécanique de Frévent et la\r\n+manufacture hydraulique de toiles de Boubers-sur-Canche. Partout on\r\n+prononçait avec vénération le nom de M. Madeleine. Arras et Douai\r\n+enviaient son maire à l'heureuse petite ville de Montreuil-sur-mer.\r\n+\r\n+Le conseiller à la cour royale de Douai, qui présidait cette session des\r\n+assises à Arras, connaissait comme tout le monde ce nom si profondément\r\n+et si universellement honoré. Quand l'huissier, ouvrant discrètement la\r\n+porte qui communiquait de la chambre du conseil à l'audience, se pencha\r\n+derrière le fauteuil du président et lui remit le papier où était écrite\r\n+la ligne qu'on vient de lire, en ajoutant: _Ce monsieur désire assister\r\n+à l'audience_, le président fit un vif mouvement de déférence, saisit\r\n+une plume, écrivit quelques mots au bas du papier, et le rendit à \r\n+l'huissier en lui disant: Faites entrer.\r\n+\r\n+L'homme malheureux dont nous racontons l'histoire était resté près de la\r\n+porte de la salle à la même place et dans la même attitude où l'huissier\r\n+l'avait quitté. Il entendit, à travers sa rêverie, quelqu'un qui lui\r\n+disait: Monsieur veut-il bien me faire l'honneur de me suivre? C'était\r\n+ce même huissier qui lui avait tourné le dos l'instant d'auparavant et\r\n+qui maintenant le saluait jusqu'à terre. L'huissier en même temps lui\r\n+remit le papier. Il le déplia, et, comme il se rencontrait qu'il était\r\n+près de la lampe, il put lire:\r\n+\r\n+«Le président de la cour d'assises présente son respect à M. Madeleine.»\r\n+\r\n+Il froissa le papier entre ses mains, comme si ces quelques mots eussent\r\n+eu pour lui un arrière-goût étrange et amer.\r\n+\r\n+Il suivit l'huissier.\r\n+\r\n+Quelques minutes après, il se trouvait seul dans une espèce de cabinet\r\n+lambrissé, d'un aspect sévère, éclairé par deux bougies posées sur une\r\n+table à tapis vert. Il avait encore dans l'oreille les dernières paroles\r\n+de l'huissier qui venait de le quitter--«Monsieur, vous voici dans la\r\n+chambre du conseil; vous n'avez qu'à tourner le bouton de cuivre de\r\n+cette porte, et vous vous trouverez dans l'audience derrière le fauteuil\r\n+de monsieur le président.»--Ces paroles se mêlaient dans sa pensée à un\r\n+souvenir vague de corridors étroits et d'escaliers noirs qu'il venait de\r\n+parcourir.\r\n+\r\n+L'huissier l'avait laissé seul. Le moment suprême était arrivé. Il\r\n+cherchait à se recueillir sans pouvoir y parvenir. C'est surtout aux\r\n+heures où l'on aurait le plus besoin de les rattacher aux réalités\r\n+poignantes de la vie que tous les fils de la pensée se rompent dans le\r\n+cerveau. Il était dans l'endroit même où les juges délibèrent et\r\n+condamnent. Il regardait avec une tranquillité stupide cette chambre\r\n+paisible et redoutable où tant d'existences avaient été brisées, où son\r\n+nom allait retentir tout à l'heure, et que sa destinée traversait en ce\r\n+moment. Il regardait la muraille, puis il se regardait lui-même,\r\n+s'étonnant que ce fût cette chambre et que ce fût lui.\r\n+\r\n+Il n'avait pas mangé depuis plus de vingt-quatre heures, il était brisé\r\n+par les cahots de la carriole, mais il ne le sentait pas; il lui\r\n+semblait qu'il ne sentait rien.\r\n+\r\n+Il s'approcha d'un cadre noir qui était accroché au mur et qui contenait\r\n+sous verre une vieille lettre autographe de Jean-Nicolas Pache, maire de\r\n+Paris et ministre, datée, sans doute par erreur, du _9 juin an II_, et\r\n+dans laquelle Pache envoyait à la commune la liste des ministres et des\r\n+députés tenus en arrestation chez eux. Un témoin qui l'eût pu voir et\r\n+qui l'eût observé en cet instant eût sans doute imaginé Fantine et\r\n+Cosette.\r\n+\r\n+Tout en rêvant, il se retourna, et ses yeux rencontrèrent le bouton de\r\n+cuivre de la porte qui le séparait de la salle des assises. Il avait\r\n+presque oublié cette porte. Son regard, d'abord calme, s'y arrêta, resta\r\n+attaché à ce bouton de cuivre, puis devint effaré et fixe, et\r\n+s'empreignit peu à peu d'épouvante. Des gouttes de sueur lui sortaient\r\n+d'entre les cheveux et ruisselaient sur ses tempes.\r\n+\r\n+À un certain moment, il fit avec une sorte d'autorité mêlée de rébellion\r\n+ce geste indescriptible qui veut dire et qui dit si bien: _Pardieu! qui\r\n+est-ce qui m'y force?_ Puis il se tourna vivement, vit devant lui la\r\n+porte par laquelle il était entré, y alla, l'ouvrit, et sortit. Il\r\n+n'était plus dans cette chambre, il était dehors, dans un corridor, un\r\n+corridor long, étroit, coupé de degrés et de guichets, faisant toutes\r\n+sortes d'angles, éclairé çà et là de réverbères pareils à des veilleuses\r\n+de malades, le corridor par où il était venu. Il respira, il écouta;\r\n+aucun bruit derrière lui, aucun bruit devant lui; il se mit à fuir comme\r\n+si on le poursuivait.\r\n+\r\n+Quand il eut doublé plusieurs des coudes de ce couloir, il écouta\r\n+encore. C'était toujours le même silence et la même ombre autour de lui.\r\n+Il était essoufflé, il chancelait, il s'appuya au mur. La pierre était\r\n+froide, sa sueur était glacée sur son front, il se redressa en\r\n+frissonnant.\r\n+\r\n+Alors, là , seul, debout dans cette obscurité, tremblant de froid et\r\n+d'autre chose peut-être, il songea.\r\n+\r\n+Il avait songé toute la nuit, il avait songé toute la journée; il\r\n+n'entendait plus en lui qu'une voix qui disait: hélas!\r\n+\r\n+Un quart d'heure s'écoula ainsi. Enfin, il pencha la tête, soupira avec\r\n+angoisse, laissa pendre ses bras, et revint sur ses pas. Il marchait\r\n+lentement et comme accablé. Il semblait que quelqu'un l'eût atteint dans\r\n+sa fuite et le ramenât.\r\n+\r\n+Il rentra dans la chambre du conseil. La première chose qu'il aperçut,\r\n+ce fut la gâchette de la porte. Cette gâchette, ronde et en cuivre poli,\r\n+resplendissait pour lui comme une effroyable étoile. Il la regardait\r\n+comme une brebis regarderait l'oeil d'un tigre.\r\n+\r\n+Ses yeux ne pouvaient s'en détacher.\r\n+\r\n+De temps en temps il faisait un pas et se rapprochait de la porte.\r\n+\r\n+S'il eût écouté, il eût entendu, comme une sorte de murmure confus, le\r\n+bruit de la salle voisine; mais il n'écoutait pas, et il n'entendait\r\n+pas.\r\n+\r\n+Tout à coup, sans qu'il sût lui-même comment, il se trouva près de la\r\n+porte. Il saisit convulsivement le bouton; la porte s'ouvrit.\r\n+\r\n+Il était dans la salle d'audience.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IX\r\n+\r\n+Un lieu où des convictions sont en train de se former\r\n+\r\n+\r\n+Il fit un pas, referma machinalement la porte derrière lui, et resta\r\n+debout, considérant ce qu'il voyait.\r\n+\r\n+C'était une assez vaste enceinte à peine éclairée, tantôt pleine de\r\n+rumeur, tantôt pleine de silence, où tout l'appareil d'un procès\r\n+criminel se développait avec sa gravité mesquine et lugubre au milieu de\r\n+la foule.\r\n+\r\n+À un bout de la salle, celui où il se trouvait, des juges à l'air\r\n+distrait, en robe usée, se rongeant les ongles ou fermant les paupières;\r\n+à l'autre bout, une foule en haillons; des avocats dans toutes sortes\r\n+d'attitudes; des soldats au visage honnête et dur; de vieilles boiseries\r\n+tachées, un plafond sale, des tables couvertes d'une serge plutôt jaune\r\n+que verte, des portes noircies par les mains; à des clous plantés dans\r\n+le lambris, des quinquets d'estaminet donnant plus de fumée que de\r\n+clarté; sur les tables, des chandelles dans des chandeliers de cuivre;\r\n+l'obscurité, la laideur, la tristesse; et de tout cela se dégageait une\r\n+impression austère et auguste, car on y sentait cette grande chose\r\n+humaine qu'on appelle la loi et cette grande chose divine qu'on appelle\r\n+la justice.\r\n+\r\n+Personne dans cette foule ne fit attention à lui. Tous les regards\r\n+convergeaient vers un point unique, un banc de bois adossé à une petite\r\n+porte, le long de la muraille, à gauche du président. Sur ce banc, que\r\n+plusieurs chandelles éclairaient, il y avait un homme entre deux\r\n+gendarmes.\r\n+\r\n+Cet homme, c'était l'homme.\r\n+\r\n+Il ne le chercha pas, il le vit. Ses yeux allèrent là naturellement,\r\n+comme s'ils avaient su d'avance où était cette figure.\r\n+\r\n+Il crut se voir lui-même, vieilli, non pas sans doute absolument\r\n+semblable de visage, mais tout pareil d'attitude et d'aspect, avec ces\r\n+cheveux hérissés, avec cette prunelle fauve et inquiète, avec cette\r\n+blouse, tel qu'il était le jour où il entrait à Digne, plein de haine et\r\n+cachant dans son âme ce hideux trésor de pensées affreuses qu'il avait\r\n+mis dix-neuf ans à ramasser sur le pavé du bagne.\r\n+\r\n+Il se dit avec un frémissement:\r\n+\r\n+--Mon Dieu! est-ce que je redeviendrai ainsi?\r\n+\r\n+Cet être paraissait au moins soixante ans. Il avait je ne sais quoi de\r\n+rude, de stupide et d'effarouché.\r\n+\r\n+Au bruit de la porte, on s'était rangé pour lui faire place, le\r\n+président avait tourné la tête, et comprenant que le personnage qui\r\n+venait d'entrer était M. le maire de Montreuil-sur-mer, il l'avait\r\n+salué. L'avocat général, qui avait vu M. Madeleine à Montreuil-sur-mer\r\n+où des opérations de son ministère l'avaient plus d'une fois appelé, le\r\n+reconnut, et salua également. Lui s'en aperçut à peine. Il était en\r\n+proie à une sorte d'hallucination; il regardait.\r\n+\r\n+Des juges, un greffier, des gendarmes, une foule de têtes cruellement\r\n+curieuses, il avait déjà vu cela une fois, autrefois, il y avait\r\n+vingt-sept ans. Ces choses funestes, il les retrouvait; elles étaient\r\n+là , elles remuaient, elles existaient. Ce n'était plus un effort de sa\r\n+mémoire, un mirage de sa pensée, c'étaient de vrais gendarmes et de\r\n+vrais juges, une vraie foule et de vrais hommes en chair et en os. C'en\r\n+était fait, il voyait reparaître et revivre autour de lui, avec tout ce\r\n+que la réalité a de formidable, les aspects monstrueux de son passé.\r\n+\r\n+Tout cela était béant devant lui.\r\n+\r\n+Il en eut horreur, il ferma les yeux, et s'écria au plus profond de son\r\n+âme: jamais!\r\n+\r\n+Et par un jeu tragique de la destinée qui faisait trembler toutes ses\r\n+idées et le rendait presque fou, c'était un autre lui-même qui était là !\r\n+Cet homme qu'on jugeait, tous l'appelaient Jean Valjean!\r\n+\r\n+Il avait sous les yeux, vision inouïe, une sorte de représentation du\r\n+moment le plus horrible de sa vie, jouée par son fantôme.\r\n+\r\n+Tout y était, c'était le même appareil, la même heure de nuit, presque\r\n+les mêmes faces de juges, de soldats et de spectateurs. Seulement,\r\n+au-dessus de la tête du président, il y avait un crucifix, chose qui\r\n+manquait aux tribunaux du temps de sa condamnation. Quand on l'avait\r\n+jugé, Dieu était absent.\r\n+\r\n+Une chaise était derrière lui; il s'y laissa tomber, terrifié de l'idée\r\n+qu'on pouvait le voir. Quand il fut assis, il profita d'une pile de\r\n+cartons qui était sur le bureau des juges pour dérober son visage à \r\n+toute la salle. Il pouvait maintenant voir sans être vu. Peu à peu il se\r\n+remit. Il rentra pleinement dans le sentiment du réel; il arriva à cette\r\n+phase de calme où l'on peut écouter.\r\n+\r\n+M. Bamatabois était au nombre des jurés. Il chercha Javert, mais il ne\r\n+le vit pas. Le banc des témoins lui était caché par la table du\r\n+greffier. Et puis, nous venons de le dire, la salle était à peine\r\n+éclairée.\r\n+\r\n+Au moment où il était entré, l'avocat de l'accusé achevait sa\r\n+plaidoirie. L'attention de tous était excitée au plus haut point;\r\n+l'affaire durait depuis trois heures. Depuis trois heures, cette foule\r\n+regardait plier peu à peu sous le poids d'une vraisemblance terrible un\r\n+homme, un inconnu, une espèce d'être misérable, profondément stupide ou\r\n+profondément habile. Cet homme, on le sait déjà , était un vagabond qui\r\n+avait été trouvé dans un champ, emportant une branche chargée de pommes\r\n+mûres, cassée à un pommier dans un clos voisin, appelé le clos Pierron.\r\n+Qui était cet homme? Une enquête avait eu lieu; des témoins venaient\r\n+d'être entendus, ils avaient été unanimes, des lumières avaient jailli\r\n+de tout le débat. L'accusation disait:\r\n+\r\n+--Nous ne tenons pas seulement un voleur de fruits, un maraudeur; nous\r\n+tenons là , dans notre main, un bandit, un relaps en rupture de ban, un\r\n+ancien forçat, un scélérat des plus dangereux, un malfaiteur appelé Jean\r\n+Valjean que la justice recherche depuis longtemps, et qui, il y a huit\r\n+ans, en sortant du bagne de Toulon, a commis un vol de grand chemin à \r\n+main armée sur la personne d'un enfant savoyard appelé Petit-Gervais,\r\n+crime prévu par l'article 383 du code pénal, pour lequel nous nous\r\n+réservons de le poursuivre ultérieurement, quand l'identité sera\r\n+judiciairement acquise. Il vient de commettre un nouveau vol. C'est un\r\n+cas de récidive. Condamnez-le pour le fait nouveau; il sera jugé plus\r\n+tard pour le fait ancien.\r\n+\r\n+Devant cette accusation, devant l'unanimité des témoins, l'accusé\r\n+paraissait surtout étonné. Il faisait des gestes et des signes qui\r\n+voulaient dire non, ou bien il considérait le plafond. Il parlait avec\r\n+peine, répondait avec embarras, mais de la tête aux pieds toute sa\r\n+personne niait. Il était comme un idiot en présence de toutes ces\r\n+intelligences rangées en bataille autour de lui, et comme un étranger au\r\n+milieu de cette société qui le saisissait. Cependant il y allait pour\r\n+lui de l'avenir le plus menaçant, la vraisemblance croissait à chaque\r\n+minute, et toute cette foule regardait avec plus d'anxiété que lui-même\r\n+cette sentence pleine de calamités qui penchait sur lui de plus en plus.\r\n+Une éventualité laissait même entrevoir, outre le bagne, la peine de\r\n+mort possible, si l'identité était reconnue et si l'affaire\r\n+Petit-Gervais se terminait plus tard par une condamnation. Qu'était-ce\r\n+que cet homme? De quelle nature était son apathie? Etait-ce imbécillité\r\n+ou ruse? Comprenait-il trop, ou ne comprenait-il pas du tout? Questions\r\n+qui divisaient la foule et semblaient partager le jury. Il y avait dans\r\n+ce procès ce qui effraye et ce qui intrigue; le drame n'était pas\r\n+seulement sombre, il était obscur. Le défenseur avait assez bien plaidé,\r\n+dans cette langue de province qui a longtemps constitué l'éloquence du\r\n+barreau et dont usaient jadis tous les avocats, aussi bien à Paris qu'à \r\n+Romorantin ou à Montbrison, et qui aujourd'hui, étant devenue classique,\r\n+n'est plus guère parlée que par les orateurs officiels du parquet,\r\n+auxquels elle convient par sa sonorité grave et son allure majestueuse;\r\n+langue où un mari s'appelle un époux, une femme, une épouse, Paris, le\r\n+centre des arts et de la civilisation, le roi, le monarque, monseigneur\r\n+l'évêque, un saint pontife, l'avocat général, l'éloquent interprète de\r\n+la vindicte, la plaidoirie, les accents qu'on vient d'entendre, le\r\n+siècle de Louis XIV, le grand siècle, un théâtre, le temple de\r\n+Melpomène, la famille régnante, l'auguste sang de nos rois, un concert,\r\n+une solennité musicale, monsieur le général commandant le département,\r\n+l'illustre guerrier qui, etc., les élèves du séminaire, ces tendres\r\n+lévites, les erreurs imputées aux journaux, l'imposture qui distille son\r\n+venin dans les colonnes de ces organes, etc., etc.--L'avocat donc avait\r\n+commencé par s'expliquer sur le vol des pommes,--chose malaisée en beau\r\n+style; mais Bénigne Bossuet lui-même a été obligé de faire allusion à \r\n+une poule en pleine oraison funèbre, et il s'en est tiré avec pompe.\r\n+L'avocat avait établi que le vol de pommes n'était pas matériellement\r\n+prouvé.--Son client, qu'en sa qualité de défenseur, il persistait à \r\n+appeler Champmathieu, n'avait été vu de personne escaladant le mur ou\r\n+cassant la branche. On l'avait arrêté nanti de cette branche (que\r\n+l'avocat appelait plus volontiers rameau); mais il disait l'avoir\r\n+trouvée à terre et ramassée. Où était la preuve du contraire?--Sans\r\n+doute cette branche avait été cassée et dérobée après escalade, puis\r\n+jetée là par le maraudeur alarmé; sans doute il y avait un voleur. Mais\r\n+qu'est-ce qui prouvait que ce voleur était Champmathieu? Une seule\r\n+chose. Sa qualité d'ancien forçat. L'avocat ne niait pas que cette\r\n+qualité ne parût malheureusement bien constatée; l'accusé avait résidé à \r\n+Faverolles; l'accusé y avait été émondeur; le nom de Champmathieu\r\n+pouvait bien avoir pour origine Jean Mathieu; tout cela était vrai;\r\n+enfin quatre témoins reconnaissaient sans hésiter et positivement\r\n+Champmathieu pour être le galérien Jean Valjean; à ces indications, à \r\n+ces témoignages, l'avocat ne pouvait opposer que la dénégation de son\r\n+client, dénégation intéressée; mais en supposant qu'il fût le forçat\r\n+Jean Valjean, cela prouvait-il qu'il fût le voleur des pommes? C'était\r\n+une présomption, tout au plus; non une preuve. L'accusé, cela était\r\n+vrai, et le défenseur «dans sa bonne foi» devait en convenir, avait\r\n+adopté «un mauvais système de défense»--Il s'obstinait à nier tout, le\r\n+vol et sa qualité de forçat. Un aveu sur ce dernier point eût mieux\r\n+valu, à coup sûr, et lui eût concilié l'indulgence de ses juges;\r\n+l'avocat le lui avait conseillé; mais l'accusé s'y était refusé\r\n+obstinément, croyant sans doute sauver tout en n'avouant rien. C'était\r\n+un tort; mais ne fallait-il pas considérer la brièveté de cette\r\n+intelligence? Cet homme était visiblement stupide. Un long malheur au\r\n+bagne, une longue misère hors du bagne, l'avaient abruti, etc., etc. Il\r\n+se défendait mal, était-ce une raison pour le condamner? Quant à \r\n+l'affaire Petit-Gervais, l'avocat n'avait pas à la discuter, elle\r\n+n'était point dans la cause. L'avocat concluait en suppliant le jury et\r\n+la cour, si l'identité de Jean Valjean leur paraissait évidente, de lui\r\n+appliquer les peines de police qui s'adressent au condamné en rupture de\r\n+ban, et non le châtiment épouvantable qui frappe le forçat récidiviste.\r\n+\r\n+L'avocat général répliqua au défenseur. Il fut violent et fleuri, comme\r\n+sont habituellement les avocats généraux.\r\n+\r\n+Il félicita le défenseur de sa «loyauté», et profita habilement de cette\r\n+loyauté. Il atteignit l'accusé par toutes les concessions que l'avocat\r\n+avait faites. L'avocat semblait accorder que l'accusé était Jean\r\n+Valjean. Il en prit acte. Cet homme était donc Jean Valjean. Ceci était\r\n+acquis à l'accusation et ne pouvait plus se contester. Ici, par une\r\n+habile antonomase, remontant aux sources et aux causes de la\r\n+criminalité, l'avocat général tonna contre l'immoralité de l'école\r\n+romantique, alors à son aurore sous le nom d'école satanique que lui\r\n+avaient décerné les critiques de l'Oriflamme et de la Quotidienne, il\r\n+attribua, non sans vraisemblance, à l'influence de cette littérature\r\n+perverse le délit de Champmathieu, ou pour mieux dire, de Jean Valjean.\r\n+Ces considérations épuisées, il passa à Jean Valjean lui-même.\r\n+Qu'était-ce que Jean Valjean? Description de Jean Valjean. Un monstre\r\n+vomi, etc. Le modèle de ces sortes de descriptions est dans le récit de\r\n+Théramène, lequel n'est pas utile à la tragédie, mais rend tous les\r\n+jours de grands services à l'éloquence judiciaire. L'auditoire et les\r\n+jurés «frémirent». La description achevée, l'avocat général reprit, dans\r\n+un mouvement oratoire fait pour exciter au plus haut point le lendemain\r\n+matin l'enthousiasme du Journal de la Préfecture:\r\n+\r\n+Et c'est un pareil homme, etc., etc., etc., vagabond, mendiant, sans\r\n+moyens d'existence, etc., etc.,--accoutumé par sa vie passée aux actions\r\n+coupables et peu corrigé par son séjour au bagne, comme le prouve le\r\n+crime commis sur Petit-Gervais, etc., etc.,--c'est un homme pareil qui,\r\n+trouvé sur la voie publique en flagrant délit de vol, à quelques pas\r\n+d'un mur escaladé, tenant encore à la main l'objet volé, nie le flagrant\r\n+délit, le vol, l'escalade, nie tout, nie jusqu'à son nom, nie jusqu'à \r\n+son identité! Outre cent autres preuves sur lesquelles nous ne revenons\r\n+pas, quatre témoins le reconnaissent, Javert, l'intègre inspecteur de\r\n+police Javert, et trois de ses anciens compagnons d'ignominie, les\r\n+forçats Brevet, Chenildieu et Cochepaille. Qu'oppose-t-il à cette\r\n+unanimité foudroyante? Il nie. Quel endurcissement! Vous ferez justice,\r\n+messieurs les jurés, etc., etc.\r\n+\r\n+Pendant que l'avocat général parlait, l'accusé écoutait, la bouche\r\n+ouverte, avec une sorte d'étonnement où il entrait bien quelque\r\n+admiration. Il était évidemment surpris qu'un homme pût parler comme\r\n+cela. De temps en temps, aux moments les plus «énergiques» du\r\n+réquisitoire, dans ces instants où l'éloquence, qui ne peut se contenir,\r\n+déborde dans un flux d'épithètes flétrissantes et enveloppe l'accusé\r\n+comme un orage, il remuait lentement la tête de droite à gauche et de\r\n+gauche à droite, sorte de protestation triste et muette dont il se\r\n+contentait depuis le commencement des débats. Deux ou trois fois les\r\n+spectateurs placés le plus près de lui l'entendirent dire à demi-voix:\r\n+\r\n+--Voilà ce que c'est, de n'avoir pas demandé à M. Baloup!\r\n+\r\n+L'avocat général fit remarquer au jury cette attitude hébétée, calculée\r\n+évidemment, qui dénotait, non l'imbécillité, mais l'adresse, la ruse,\r\n+l'habitude de tromper la justice, et qui mettait dans tout son jour «la\r\n+profonde perversité» de cet homme. Il termina en faisant ses réserves\r\n+pour l'affaire Petit-Gervais, et en réclamant une condamnation sévère.\r\n+\r\n+C'était, pour l'instant, on s'en souvient, les travaux forcés à \r\n+perpétuité.\r\n+\r\n+Le défenseur se leva, commença par complimenter «monsieur l'avocat\r\n+général» sur son «admirable parole», puis répliqua comme il put, mais il\r\n+faiblissait; le terrain évidemment se dérobait sous lui.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre X\r\n+\r\n+Le système de dénégations\r\n+\r\n+\r\n+L'instant de clore les débats était venu. Le président fit lever\r\n+l'accusé et lui adressa la question d'usage:\r\n+\r\n+--Avez-vous quelque chose à ajouter à votre défense?\r\n+\r\n+L'homme, debout, roulant dans ses mains un affreux bonnet qu'il avait,\r\n+sembla ne pas entendre.\r\n+\r\n+Le président répéta la question.\r\n+\r\n+Cette fois l'homme entendit. Il parut comprendre, il fit le mouvement de\r\n+quelqu'un qui se réveille, promena ses yeux autour de lui, regarda le\r\n+public, les gendarmes, son avocat, les jurés, la cour, posa son poing\r\n+monstrueux sur le rebord de la boiserie placée devant son banc, regarda\r\n+encore, et tout à coup, fixant sont regard sur l'avocat général, il se\r\n+mit à parler. Ce fut comme une éruption. Il sembla, à la façon dont les\r\n+paroles s'échappaient de sa bouche, incohérentes, impétueuses, heurtées,\r\n+pêle-mêle, qu'elles s'y pressaient toutes à la fois pour sortir en même\r\n+temps. Il dit:\r\n+\r\n+--J'ai à dire ça. Que j'ai été charron à Paris, même que c'était chez\r\n+monsieur Baloup. C'est un état dur. Dans la chose de charron, on\r\n+travaille toujours en plein air, dans des cours, sous des hangars chez\r\n+les bons maîtres, jamais dans des ateliers fermés, parce qu'il faut des\r\n+espaces, voyez-vous. L'hiver, on a si froid qu'on se bat les bras pour\r\n+se réchauffer; mais les maîtres ne veulent pas, ils disent que cela perd\r\n+du temps. Manier du fer quand il y a de la glace entre les pavés, c'est\r\n+rude. Ça vous use vite un homme. On est vieux tout jeune dans cet\r\n+état-là . À quarante ans, un homme est fini. Moi, j'en avais\r\n+cinquante-trois, j'avais bien du mal. Et puis c'est si méchant les\r\n+ouvriers! Quand un bonhomme n'est plus jeune, on vous l'appelle pour\r\n+tout vieux serin, vieille bête! Je ne gagnais plus que trente sous par\r\n+jour, on me payait le moins cher qu'on pouvait, les maîtres profitaient\r\n+de mon âge. Avec ça, j'avais ma fille qui était blanchisseuse à la\r\n+rivière. Elle gagnait un peu de son côté. À nous deux, cela allait. Elle\r\n+avait de la peine aussi. Toute la journée dans un baquet jusqu'à \r\n+mi-corps, à la pluie, à la neige, avec le vent qui vous coupe la figure;\r\n+quand il gèle, c'est tout de même, il faut laver; il y a des personnes\r\n+qui n'ont pas beaucoup de linge et qui attendent après; si on ne lavait\r\n+pas, on perdrait des pratiques. Les planches sont mal jointes et il vous\r\n+tombe des gouttes d'eau partout. On a ses jupes toutes mouillées, dessus\r\n+et dessous. Ça pénètre. Elle a aussi travaillé au lavoir des\r\n+Enfants-Rouges, où l'eau arrive par des robinets. On n'est pas dans le\r\n+baquet. On lave devant soi au robinet et on rince derrière soi dans le\r\n+bassin. Comme c'est fermé, on a moins froid au corps. Mais il y a une\r\n+buée d'eau chaude qui est terrible et qui vous perd les yeux. Elle\r\n+revenait à sept heures du soir, et se couchait bien vite; elle était si\r\n+fatiguée. Son mari la battait. Elle est morte. Nous n'avons pas été bien\r\n+heureux. C'était une brave fille qui n'allait pas au bal, qui était bien\r\n+tranquille. Je me rappelle un mardi gras où elle était couchée à huit\r\n+heures. Voilà . Je dis vrai. Vous n'avez qu'à demander. Ah, bien oui,\r\n+demander! que je suis bête! Paris, c'est un gouffre. Qui est-ce qui\r\n+connaît le père Champmathieu? Pourtant je vous dis monsieur Baloup.\r\n+Voyez chez monsieur Baloup. Après ça, je ne sais pas ce qu'on me veut.\r\n+\r\n+L'homme se tut, et resta debout. Il avait dit ces choses d'une voix\r\n+haute, rapide, rauque, dure et enrouée, avec une sorte de naïveté\r\n+irritée et sauvage. Une fois il s'était interrompu pour saluer quelqu'un\r\n+dans la foule. Les espèces d'affirmations qu'il semblait jeter au hasard\r\n+devant lui, lui venaient comme des hoquets, et il ajoutait à chacune\r\n+d'elles le geste d'un bûcheron qui fend du bois. Quand il eut fini,\r\n+l'auditoire éclata de rire. Il regarda le public, et voyant qu'on riait,\r\n+et ne comprenant pas, il se mit à rire lui-même.\r\n+\r\n+Cela était sinistre.\r\n+\r\n+Le président, homme attentif et bienveillant, éleva la voix.\r\n+\r\n+Il rappela à «messieurs les jurés» que «le sieur Baloup, l'ancien maître\r\n+charron chez lequel l'accusé disait avoir servi, avait été inutilement\r\n+cité. Il était en faillite, et n'avait pu être retrouvé.» Puis se\r\n+tournant vers l'accusé, il l'engagea à écouter ce qu'il allait lui dire\r\n+et ajouta:\r\n+\r\n+--Vous êtes dans une situation où il faut réfléchir. Les présomptions\r\n+les plus graves pèsent sur vous et peuvent entraîner des conséquences\r\n+capitales. Accusé, dans votre intérêt, je vous interpelle une dernière\r\n+fois, expliquez-vous clairement sur ces deux faits:--Premièrement,\r\n+avez-vous, oui ou non, franchi le mur du clos Pierron, cassé la branche\r\n+et volé les pommes, c'est-à -dire commis le crime de vol avec escalade?\r\n+Deuxièmement, oui ou non, êtes-vous le forçat libéré Jean Valjean?\r\n+\r\n+L'accusé secoua la tête d'un air capable, comme un homme qui a bien\r\n+compris et qui sait ce qu'il va répondre. Il ouvrit la bouche, se tourna\r\n+vers le président et dit:\r\n+\r\n+--D'abord....\r\n+\r\n+Puis il regarda son bonnet, il regarda le plafond, et se tut.\r\n+\r\n+--Accusé, reprit l'avocat général d'une voix sévère, faites attention.\r\n+Vous ne répondez à rien de ce qu'on vous demande. Votre trouble vous\r\n+condamne. Il est évident que vous ne vous appelez pas Champmathieu, que\r\n+vous êtes le forçat Jean Valjean caché d'abord sous le nom de Jean\r\n+Mathieu qui était le nom de sa mère, que vous êtes allé en Auvergne, que\r\n+vous êtes né à Faverolles où vous avez été émondeur. Il est évident que\r\n+vous avez volé avec escalade des pommes mûres dans le clos Pierron.\r\n+Messieurs les jurés apprécieront.\r\n+\r\n+L'accusé avait fini par se rasseoir; il se leva brusquement quand\r\n+l'avocat général eut fini, et s'écria:\r\n+\r\n+--Vous êtes très méchant, vous! Voilà ce que je voulais dire. Je ne\r\n+trouvais pas d'abord. Je n'ai rien volé. Je suis un homme qui ne mange\r\n+pas tous les jours. Je venais d'Ailly, je marchais dans le pays après\r\n+une ondée qui avait fait la campagne toute jaune, même que les mares\r\n+débordaient et qu'il ne sortait plus des sables que de petits brins\r\n+d'herbe au bord de la route, j'ai trouvé une branche cassée par terre où\r\n+il y avait des pommes, j'ai ramassé la branche sans savoir qu'elle me\r\n+ferait arriver de la peine. Il y a trois mois que je suis en prison et\r\n+qu'on me trimballe. Après ça, je ne peux pas dire, on parle contre moi,\r\n+on me dit: répondez! le gendarme, qui est bon enfant, me pousse le coude\r\n+et me dit tout bas: réponds donc. Je ne sais pas expliquer, moi, je n'ai\r\n+pas fait les études, je suis un pauvre homme. Voilà ce qu'on a tort de\r\n+ne pas voir. Je n'ai pas volé, j'ai ramassé par terre des choses qu'il y\r\n+avait. Vous dites Jean Valjean, Jean Mathieu! Je ne connais pas ces\r\n+personnes-là . C'est des villageois. J'ai travaillé chez monsieur Baloup,\r\n+boulevard de l'Hôpital. Je m'appelle Champmathieu. Vous êtes bien malins\r\n+de me dire où je suis né. Moi, je l'ignore. Tout le monde n'a pas des\r\n+maisons pour y venir au monde. Ce serait trop commode. Je crois que mon\r\n+père et ma mère étaient des gens qui allaient sur les routes. Je ne sais\r\n+pas d'ailleurs. Quand j'étais enfant, on m'appelait Petit, maintenant,\r\n+on m'appelle Vieux. Voilà mes noms de baptême. Prenez ça comme vous\r\n+voudrez. J'ai été en Auvergne, j'ai été à Faverolles, pardi! Eh bien?\r\n+est-ce qu'on ne peut pas avoir été en Auvergne et avoir été à Faverolles\r\n+sans avoir été aux galères? Je vous dis que je n'ai pas volé, et que je\r\n+suis le père Champmathieu. J'ai été chez monsieur Baloup, j'ai été\r\n+domicilié. Vous m'ennuyez avec vos bêtises à la fin! Pourquoi donc\r\n+est-ce que le monde est après moi comme des acharnés!\r\n+\r\n+L'avocat général était demeuré debout; il s'adressa au président:\r\n+\r\n+--Monsieur le président, en présence des dénégations confuses, mais fort\r\n+habiles de l'accusé, qui voudrait bien se faire passer pour idiot, mais\r\n+qui n'y parviendra pas--nous l'en prévenons--nous requérons qu'il vous\r\n+plaise et qu'il plaise à la cour appeler de nouveau dans cette enceinte\r\n+les condamnés Brevet, Cochepaille et Chenildieu et l'inspecteur de\r\n+police Javert, et les interpeller une dernière fois sur l'identité de\r\n+l'accusé avec le forçat Jean Valjean.\r\n+\r\n+--Je fais remarquer à monsieur l'avocat général, dit le président, que\r\n+l'inspecteur de police Javert, rappelé par ses fonctions au chef-lieu\r\n+d'un arrondissement voisin, a quitté l'audience et même la ville,\r\n+aussitôt sa déposition faite. Nous lui en avons accordé l'autorisation,\r\n+avec l'agrément de monsieur l'avocat général et du défenseur de\r\n+l'accusé.\r\n+\r\n+--C'est juste, monsieur le président, reprit l'avocat général. En\r\n+l'absence du sieur Javert, je crois devoir rappeler à messieurs les\r\n+jurés ce qu'il a dit ici-même, il y a peu d'heures. Javert est un homme\r\n+estimé qui honore par sa rigoureuse et stricte probité des fonctions\r\n+inférieures, mais importantes. Voici en quels termes il a déposé:--«Je\r\n+n'ai pas même besoin des présomptions morales et des preuves matérielles\r\n+qui démentent les dénégations de l'accusé. Je le reconnais parfaitement.\r\n+Cet homme ne s'appelle pas Champmathieu; c'est un ancien forçat très\r\n+méchant et très redouté nommé Jean Valjean. On ne l'a libéré à \r\n+l'expiration de sa peine qu'avec un extrême regret. Il a subi dix-neuf\r\n+ans de travaux forcés pour vol qualifié. Il avait cinq ou six fois tenté\r\n+de s'évader. Outre le vol Petit-Gervais et le vol Pierron, je le\r\n+soupçonne encore d'un vol commis chez sa grandeur le défunt évêque de\r\n+Digne. Je l'ai souvent vu, à l'époque où j'étais adjudant garde-chiourme\r\n+au bagne de Toulon. Je répète que je le reconnais parfaitement.» Cette\r\n+déclaration si précise parut produire une vive impression sur le public\r\n+et le jury. L'avocat général termina en insistant pour qu'à défaut de\r\n+Javert, les trois témoins Brevet, Chenildieu et Cochepaille fussent\r\n+entendus de nouveau et interpellés solennellement.\r\n+\r\n+Le président transmit un ordre à un huissier, et un moment après la\r\n+porte de la chambre des témoins s'ouvrit. L'huissier, accompagné d'un\r\n+gendarme prêt à lui prêter main-forte, introduisit le condamné Brevet.\r\n+L'auditoire était en suspens et toutes les poitrines palpitaient comme\r\n+si elles n'eussent eu qu'une seule âme.\r\n+\r\n+L'ancien forçat Brevet portait la veste noire et grise des maisons\r\n+centrales. Brevet était un personnage d'une soixantaine d'années qui\r\n+avait une espèce de figure d'homme d'affaires et l'air d'un coquin. Cela\r\n+va quelquefois ensemble. Il était devenu, dans la prison où de nouveaux\r\n+méfaits l'avaient ramené, quelque chose comme guichetier. C'était un\r\n+homme dont les chefs disaient: Il cherche à se rendre utile. Les\r\n+aumôniers portaient bon témoignage de ses habitudes religieuses. Il ne\r\n+faut pas oublier que ceci se passait sous la restauration.\r\n+\r\n+--Brevet, dit le président, vous avez subi une condamnation infamante et\r\n+vous ne pouvez prêter serment....\r\n+\r\n+Brevet baissa les yeux.\r\n+\r\n+--Cependant, reprit le président, même dans l'homme que la loi a\r\n+dégradé, il peut rester, quand la pitié divine le permet, un sentiment\r\n+d'honneur et d'équité. C'est à ce sentiment que je fais appel à cette\r\n+heure décisive. S'il existe encore en vous, et je l'espère, réfléchissez\r\n+avant de me répondre, considérez d'une part cet homme qu'un mot de vous\r\n+peut perdre, d'autre part la justice qu'un mot de vous peut éclairer.\r\n+L'instant est solennel, et il est toujours temps de vous rétracter, si\r\n+vous croyez vous être trompé.--Accusé, levez-vous.\r\n+\r\n+--Brevet, regardez bien l'accusé, recueillez vos souvenirs, et\r\n+dites-nous, en votre âme et conscience, si vous persistez à reconnaître\r\n+cet homme pour votre ancien camarade de bagne Jean Valjean.\r\n+\r\n+Brevet regarda l'accusé, puis se retourna vers la cour.\r\n+\r\n+--Oui, monsieur le président. C'est moi qui l'ai reconnu le premier et\r\n+je persiste. Cet homme est Jean Valjean. Entré à Toulon en 1796 et sorti\r\n+en 1815. Je suis sorti l'an d'après. Il a l'air d'une brute maintenant,\r\n+alors ce serait que l'âge l'a abruti; au bagne il était sournois. Je le\r\n+reconnais positivement.\r\n+\r\n+--Allez vous asseoir, dit le président. Accusé, restez debout.\r\n+\r\n+On introduisit Chenildieu, forçat à vie, comme l'indiquaient sa casaque\r\n+rouge et son bonnet vert. Il subissait sa peine au bagne de Toulon, d'où\r\n+on l'avait extrait pour cette affaire. C'était un petit homme d'environ\r\n+cinquante ans, vif, ridé, chétif, jaune, effronté, fiévreux, qui avait\r\n+dans tous ses membres et dans toute sa personne une sorte de faiblesse\r\n+maladive et dans le regard une force immense. Ses compagnons du bagne\r\n+l'avaient surnommé Je-nie-Dieu.\r\n+\r\n+Le président lui adressa à peu près les mêmes paroles qu'à Brevet. Au\r\n+moment où il lui rappela que son infamie lui ôtait le droit de prêter\r\n+serment, Chenildieu leva la tête et regarda la foule en face. Le\r\n+président l'invita à se recueillir et lui demanda, comme à Brevet, s'il\r\n+persistait à reconnaître l'accusé.\r\n+\r\n+Chenildieu éclata de rire.\r\n+\r\n+--Pardine! si je le reconnais! nous avons été cinq ans attachés à la\r\n+même chaîne. Tu boudes donc, mon vieux?\r\n+\r\n+--Allez vous asseoir, dit le président.\r\n+\r\n+L'huissier amena Cochepaille. Cet autre condamné à perpétuité, venu du\r\n+bagne et vêtu de rouge comme Chenildieu, était un paysan de Lourdes et\r\n+un demi-ours des Pyrénées. Il avait gardé des troupeaux dans la\r\n+montagne, et de pâtre il avait glissé brigand. Cochepaille n'était pas\r\n+moins sauvage et paraissait plus stupide encore que l'accusé. C'était un\r\n+de ces malheureux hommes que la nature a ébauchés en bêtes fauves et que\r\n+la société termine en galériens.\r\n+\r\n+Le président essaya de le remuer par quelques paroles pathétiques et\r\n+graves et lui demanda, comme aux deux autres, s'il persistait, sans\r\n+hésitation et sans trouble, à reconnaître l'homme debout devant lui.\r\n+\r\n+--C'est Jean Valjean, dit Cochepaille. Même qu'on l'appelait\r\n+Jean-le-Cric, tant il était fort.\r\n+\r\n+Chacune des affirmations de ces trois hommes, évidemment sincères et de\r\n+bonne foi, avait soulevé dans l'auditoire un murmure de fâcheux augure\r\n+pour l'accusé, murmure qui croissait et se prolongeait plus longtemps\r\n+chaque fois qu'une déclaration nouvelle venait s'ajouter à la\r\n+précédente. L'accusé, lui, les avait écoutées avec ce visage étonné qui,\r\n+selon l'accusation, était son principal moyen de défense. À la première,\r\n+les gendarmes ses voisins l'avaient entendu grommeler entre ses dents:\r\n+Ah bien! en voilà un! Après la seconde il dit un peu plus haut, d'un air\r\n+presque satisfait: Bon! À la troisième il s'écria: Fameux!\r\n+\r\n+Le président l'interpella.\r\n+\r\n+--Accusé, vous avez entendu. Qu'avez-vous à dire?\r\n+\r\n+Il répondit:\r\n+\r\n+--Je dis--Fameux!\r\n+\r\n+Une rumeur éclata dans le public et gagna presque le jury. Il était\r\n+évident que l'homme était perdu.\r\n+\r\n+--Huissiers, dit le président, faites faire silence. Je vais clore les\r\n+débats.\r\n+\r\n+En ce moment un mouvement se fit tout à côté du président. On entendit\r\n+une voix qui criait:\r\n+\r\n+--Brevet, Chenildieu, Cochepaille! regardez de ce côté-ci.\r\n+\r\n+Tous ceux qui entendirent cette voix se sentirent glacés, tant elle\r\n+était lamentable et terrible. Les yeux se tournèrent vers le point d'où\r\n+elle venait. Un homme, placé parmi les spectateurs privilégiés qui\r\n+étaient assis derrière la cour, venait de se lever, avait poussé la\r\n+porte à hauteur d'appui qui séparait le tribunal du prétoire, et était\r\n+debout au milieu de la salle. Le président, l'avocat général, M.\r\n+Bamatabois, vingt personnes, le reconnurent, et s'écrièrent à la fois:\r\n+\r\n+--Monsieur Madeleine!\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre XI\r\n+\r\n+Champmathieu de plus en plus étonné\r\n+\r\n+\r\n+C'était lui en effet. La lampe du greffier éclairait son visage. Il\r\n+tenait son chapeau à la main, il n'y avait aucun désordre dans ses\r\n+vêtements, sa redingote était boutonnée avec soin. Il était très pâle et\r\n+il tremblait légèrement. Ses cheveux, gris encore au moment de son\r\n+arrivée à Arras, étaient maintenant tout à fait blancs. Ils avaient\r\n+blanchi depuis une heure qu'il était là .\r\n+\r\n+Toutes les têtes se dressèrent. La sensation fut indescriptible. Il y\r\n+eut dans l'auditoire un instant d'hésitation. La voix avait été si\r\n+poignante, l'homme qui était là paraissait si calme, qu'au premier abord\r\n+on ne comprit pas. On se demanda qui avait crié. On ne pouvait croire\r\n+que ce fût cet homme tranquille qui eût jeté ce cri effrayant.\r\n+\r\n+Cette indécision ne dura que quelques secondes. Avant même que le\r\n+président et l'avocat général eussent pu dire un mot, avant que les\r\n+gendarmes et les huissiers eussent pu faire un geste, l'homme que tous\r\n+appelaient encore en ce moment M. Madeleine s'était avancé vers les\r\n+témoins Cochepaille, Brevet et Chenildieu.\r\n+\r\n+--Vous ne me reconnaissez pas? dit-il.\r\n+\r\n+Tous trois demeurèrent interdits et indiquèrent par un signe de tête\r\n+qu'ils ne le connaissaient point. Cochepaille intimidé fit le salut\r\n+militaire. M. Madeleine se tourna vers les jurés et vers la cour et dit\r\n+d'une voix douce:\r\n+\r\n+--Messieurs les jurés, faites relâcher l'accusé. Monsieur le président,\r\n+faites-moi arrêter. L'homme que vous cherchez, ce n'est pas lui, c'est\r\n+moi. Je suis Jean Valjean. Pas une bouche ne respirait. À la première\r\n+commotion de l'étonnement avait succédé un silence de sépulcre. On\r\n+sentait dans la salle cette espèce de terreur religieuse qui saisit la\r\n+foule lorsque quelque chose de grand s'accomplit.\r\n+\r\n+Cependant le visage du président s'était empreint de sympathie et de\r\n+tristesse; il avait échangé un signe rapide avec l'avocat et quelques\r\n+paroles à voix basse avec les conseillers assesseurs. Il s'adressa au\r\n+public, et demanda avec un accent qui fut compris de tous:\r\n+\r\n+--Y a-t-il un médecin ici?\r\n+\r\n+L'avocat général prit la parole:\r\n+\r\n+--Messieurs les jurés, l'incident si étrange et si inattendu qui trouble\r\n+l'audience ne nous inspire, ainsi qu'à vous, qu'un sentiment que nous\r\n+n'avons pas besoin d'exprimer. Vous connaissez tous, au moins de\r\n+réputation, l'honorable M. Madeleine, maire de Montreuil-sur-mer. S'il y\r\n+a un médecin dans l'auditoire, nous nous joignons à monsieur le\r\n+président pour le prier de vouloir bien assister monsieur Madeleine et\r\n+le reconduire à sa demeure.\r\n+\r\n+M. Madeleine ne laissa point achever l'avocat général.\r\n+\r\n+Il l'interrompit d'un accent plein de mansuétude et d'autorité. Voici\r\n+les paroles qu'il prononça; les voici littéralement, telles qu'elles\r\n+furent écrites immédiatement après l'audience par un des témoins de\r\n+cette scène; telles qu'elles sont encore dans l'oreille de ceux qui les\r\n+ont entendues, il y a près de quarante ans aujourd'hui.\r\n+\r\n+--Je vous remercie, monsieur l'avocat général, mais je ne suis pas fou.\r\n+Vous allez voir. Vous étiez sur le point de commettre une grande erreur,\r\n+lâchez cet homme, j'accomplis un devoir, je suis ce malheureux condamné.\r\n+Je suis le seul qui voie clair ici, et je vous dis la vérité. Ce que je\r\n+fais en ce moment, Dieu, qui est là -haut, le regarde, et cela suffit.\r\n+Vous pouvez me prendre, puisque me voilà . J'avais pourtant fait de mon\r\n+mieux. Je me suis caché sous un nom; je suis devenu riche, je suis\r\n+devenu maire; j'ai voulu rentrer parmi les honnêtes gens. Il paraît que\r\n+cela ne se peut pas. Enfin, il y a bien des choses que je ne puis pas\r\n+dire, je ne vais pas vous raconter ma vie, un jour on saura. J'ai volé\r\n+monseigneur l'évêque, cela est vrai; j'ai volé Petit-Gervais, cela est\r\n+vrai. On a eu raison de vous dire que Jean Valjean était un malheureux\r\n+très méchant. Toute la faute n'est peut-être pas à lui. Écoutez,\r\n+messieurs les juges, un homme aussi abaissé que moi n'a pas de\r\n+remontrance à faire à la providence ni de conseil à donner à la société;\r\n+mais, voyez-vous, l'infamie d'où j'avais essayé de sortir est une chose\r\n+nuisible. Les galères font le galérien. Recueillez cela, si vous voulez.\r\n+\r\n+Avant le bagne, j'étais un pauvre paysan très peu intelligent, une\r\n+espèce d'idiot; le bagne m'a changé. J'étais stupide, je suis devenu\r\n+méchant; j'étais bûche, je suis devenu tison. Plus tard l'indulgence et\r\n+la bonté m'ont sauvé, comme la sévérité m'avait perdu. Mais, pardon,\r\n+vous ne pouvez pas comprendre ce que je dis là . Vous trouverez chez moi,\r\n+dans les cendres de la cheminée, la pièce de quarante sous que j'ai\r\n+volée il y a sept ans à Petit-Gervais. Je n'ai plus rien à ajouter.\r\n+Prenez-moi. Mon Dieu! monsieur l'avocat général remue la tête, vous\r\n+dites: M. Madeleine est devenu fou, vous ne me croyez pas! Voilà qui est\r\n+affligeant. N'allez point condamner cet homme au moins! Quoi! ceux-ci ne\r\n+me reconnaissent pas! Je voudrais que Javert fût ici. Il me\r\n+reconnaîtrait, lui!\r\n+\r\n+Rien ne pourrait rendre ce qu'il y avait de mélancolie bienveillante et\r\n+sombre dans l'accent qui accompagnait ces paroles.\r\n+\r\n+Il se tourna vers les trois forçats:\r\n+\r\n+--Eh bien, je vous reconnais, moi! Brevet! vous rappelez-vous?...\r\n+\r\n+Il s'interrompit, hésita un moment, et dit:\r\n+\r\n+--Te rappelles-tu ces bretelles en tricot à damier que tu avais au\r\n+bagne?\r\n+\r\n+Brevet eut comme une secousse de surprise et le regarda de la tête aux\r\n+pieds d'un air effrayé. Lui continua:\r\n+\r\n+--Chenildieu, qui te surnommais toi-même Je-nie-Dieu, tu as toute\r\n+l'épaule droite brûlée profondément, parce que tu t'es couché un jour\r\n+l'épaule sur un réchaud plein de braise, pour effacer les trois lettres\r\n+T. F. P., qu'on y voit toujours cependant. Réponds, est-ce vrai?\r\n+\r\n+--C'est vrai, dit Chenildieu.\r\n+\r\n+Il s'adressa à Cochepaille:\r\n+\r\n+--Cochepaille, tu as près de la saignée du bras gauche une date gravée\r\n+en lettres bleues avec de la poudre brûlée. Cette date, c'est celle du\r\n+débarquement de l'empereur à Cannes, _1er mars 1815_. Relève ta manche.\r\n+\r\n+Cochepaille releva sa manche, tous les regards se penchèrent autour de\r\n+lui sur son bras nu. Un gendarme approcha une lampe; la date y était.\r\n+\r\n+Le malheureux homme se tourna vers l'auditoire et vers les juges avec un\r\n+sourire dont ceux qui l'ont vu sont encore navrés lorsqu'ils y songent.\r\n+C'était le sourire du triomphe, c'était aussi le sourire du désespoir.\r\n+\r\n+--Vous voyez bien, dit-il, que je suis Jean Valjean.\r\n+\r\n+Il n'y avait plus dans cette enceinte ni juges, ni accusateurs, ni\r\n+gendarmes; il n'y avait que des yeux fixes et des coeurs émus. Personne\r\n+ne se rappelait plus le rôle que chacun pouvait avoir à jouer; l'avocat\r\n+général oubliait qu'il était là pour requérir, le président qu'il était\r\n+là pour présider, le défenseur qu'il était là pour défendre. Chose\r\n+frappante, aucune question ne fut faite, aucune autorité n'intervint. Le\r\n+propre des spectacles sublimes, c'est de prendre toutes les âmes et de\r\n+faire de tous les témoins des spectateurs. Aucun peut-être ne se rendait\r\n+compte de ce qu'il éprouvait; aucun, sans doute, ne se disait qu'il\r\n+voyait resplendir là une grande lumière; tous intérieurement se\r\n+sentaient éblouis.\r\n+\r\n+Il était évident qu'on avait sous les yeux Jean Valjean. Cela rayonnait.\r\n+L'apparition de cet homme avait suffi pour remplir de clarté cette\r\n+aventure si obscure le moment d'auparavant. Sans qu'il fût besoin\r\n+d'aucune explication désormais, toute cette foule, comme par une sorte\r\n+de révélation électrique, comprit tout de suite et d'un seul coup d'oeil\r\n+cette simple et magnifique histoire d'un homme qui se livrait pour qu'un\r\n+autre homme ne fût pas condamné à sa place. Les détails, les\r\n+hésitations, les petites résistances possibles se perdirent dans ce\r\n+vaste fait lumineux.\r\n+\r\n+Impression qui passa vite, mais qui dans l'instant fut irrésistible.\r\n+\r\n+--Je ne veux pas déranger davantage l'audience, reprit Jean Valjean. Je\r\n+m'en vais, puisqu'on ne m'arrête pas. J'ai plusieurs choses à faire.\r\n+Monsieur l'avocat général sait qui je suis, il sait où je vais, il me\r\n+fera arrêter quand il voudra.\r\n+\r\n+Il se dirigea vers la porte de sortie. Pas une voix ne s'éleva, pas un\r\n+bras ne s'étendit pour l'empêcher. Tous s'écartèrent. Il avait en ce\r\n+moment ce je ne sais quoi de divin qui fait que les multitudes reculent\r\n+et se rangent devant un homme. Il traversa la foule à pas lents. On n'a\r\n+jamais su qui ouvrit la porte, mais il est certain que la porte se\r\n+trouva ouverte lorsqu'il y parvint. Arrivé là , il se retourna et dit:\r\n+\r\n+--Monsieur l'avocat général, je reste à votre disposition.\r\n+\r\n+Puis il s'adressa à l'auditoire:\r\n+\r\n+--Vous tous, tous ceux qui sont ici, vous me trouvez digne de pitié,\r\n+n'est-ce pas? Mon Dieu! quand je pense à ce que j'ai été sur le point de\r\n+faire, je me trouve digne d'envie. Cependant j'aurais mieux aimé que\r\n+tout ceci n'arrivât pas.\r\n+\r\n+Il sortit, et la porte se referma comme elle avait été ouverte, car ceux\r\n+qui font de certaines choses souveraines sont toujours sûrs d'être\r\n+servis par quelqu'un dans la foule.\r\n+\r\n+Moins d'une heure après, le verdict du jury déchargeait de toute\r\n+accusation le nommé Champmathieu; et Champmathieu, mis en liberté\r\n+immédiatement, s'en allait stupéfait, croyant tous les hommes fous et ne\r\n+comprenant rien à cette vision.\r\n+\r\n+\r\n+\r\n+\r\n+Livre huitième--Contre-coup\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre I\r\n+\r\n+Dans quel miroir M. Madeleine regarde ses cheveux\r\n+\r\n+\r\n+Le jour commençait à poindre. Fantine avait eu une nuit de fièvre et\r\n+d'insomnie, pleine d'ailleurs d'images heureuses; au matin, elle\r\n+s'endormit. La soeur Simplice qui l'avait veillée profita de ce sommeil\r\n+pour aller préparer une nouvelle potion de quinquina. La digne soeur\r\n+était depuis quelques instants dans le laboratoire de l'infirmerie,\r\n+penchée sur ses drogues et sur ses fioles et regardant de très près à \r\n+cause de cette brume que le crépuscule répand sur les objets. Tout à \r\n+coup elle tourna la tête et fit un léger cri. M. Madeleine était devant\r\n+elle. Il venait d'entrer silencieusement.\r\n+\r\n+--C'est vous, monsieur le maire! s'écria-t-elle.\r\n+\r\n+Il répondit, à voix basse:\r\n+\r\n+--Comment va cette pauvre femme?\r\n+\r\n+--Pas mal en ce moment. Mais nous avons été bien inquiets, allez!\r\n+\r\n+Elle lui expliqua ce qui s'était passé, que Fantine était bien mal la\r\n+veille et que maintenant elle était mieux, parce qu'elle croyait que\r\n+monsieur le maire était allé chercher son enfant à Montfermeil. La soeur\r\n+n'osa pas interroger monsieur le maire, mais elle vit bien à son air que\r\n+ce n'était point de là qu'il venait.\r\n+\r\n+--Tout cela est bien, dit-il, vous avez eu raison de ne pas la\r\n+détromper.\r\n+\r\n+--Oui, reprit la soeur, mais maintenant, monsieur le maire, qu'elle va\r\n+vous voir et qu'elle ne verra pas son enfant, que lui dirons-nous?\r\n+\r\n+Il resta un moment rêveur.\r\n+\r\n+--Dieu nous inspirera, dit-il.\r\n+\r\n+--On ne pourrait cependant pas mentir, murmura la soeur à demi-voix.\r\n+\r\n+Le plein jour s'était fait dans la chambre. Il éclairait en face le\r\n+visage de M. Madeleine. Le hasard fit que la soeur leva les yeux.\r\n+\r\n+--Mon Dieu, monsieur! s'écria-t-elle, que vous est-il donc arrivé? vos\r\n+cheveux sont tout blancs!\r\n+\r\n+--Blancs! dit-il.\r\n+\r\n+La soeur Simplice n'avait point de miroir; elle fouilla dans une trousse\r\n+et en tira une petite glace dont se servait le médecin de l'infirmerie\r\n+pour constater qu'un malade était mort et ne respirait plus. M.\r\n+Madeleine prit la glace, y considéra ses cheveux, et dit:\r\n+\r\n+--Tiens!\r\n+\r\n+Il prononça ce mot avec indifférence et comme s'il pensait à autre\r\n+chose.\r\n+\r\n+La soeur se sentit glacée par je ne sais quoi d'inconnu qu'elle\r\n+entrevoyait dans tout ceci.\r\n+\r\n+Il demanda:\r\n+\r\n+--Puis-je la voir?\r\n+\r\n+--Est-ce que monsieur le maire ne lui fera pas revenir son enfant? dit\r\n+la soeur, osant à peine hasarder une question.\r\n+\r\n+--Sans doute, mais il faut au moins deux ou trois jours.\r\n+\r\n+--Si elle ne voyait pas monsieur le maire d'ici là , reprit timidement la\r\n+soeur, elle ne saurait pas que monsieur le maire est de retour, il\r\n+serait aisé de lui faire prendre patience, et quand l'enfant arriverait\r\n+elle penserait tout naturellement que monsieur le maire est arrivé avec\r\n+l'enfant. On n'aurait pas de mensonge à faire.\r\n+\r\n+M. Madeleine parut réfléchir quelques instants, puis il dit avec sa\r\n+gravité calme:\r\n+\r\n+--Non, ma soeur, il faut que je la voie. Je suis peut-être pressé.\r\n+\r\n+La religieuse ne sembla pas remarquer ce mot «peut-être», qui donnait un\r\n+sens obscur et singulier aux paroles de M. le maire. Elle répondit en\r\n+baissant les yeux et la voix respectueusement:\r\n+\r\n+--En ce cas, elle repose, mais monsieur le maire peut entrer.\r\n+\r\n+Il fit quelques observations sur une porte qui fermait mal, et dont le\r\n+bruit pouvait réveiller la malade, puis il entra dans la chambre de\r\n+Fantine, s'approcha du lit et entrouvrit les rideaux. Elle dormait. Son\r\n+souffle sortait de sa poitrine avec ce bruit tragique qui est propre à \r\n+ces maladies, et qui navre les pauvres mères lorsqu'elles veillent la\r\n+nuit près de leur enfant condamné et endormi. Mais cette respiration\r\n+pénible troublait à peine une sorte de sérénité ineffable, répandue sur\r\n+son visage, qui la transfigurait dans son sommeil. Sa pâleur était\r\n+devenue de la blancheur; ses joues étaient vermeilles. Ses longs cils\r\n+blonds, la seule beauté qui lui fût restée de sa virginité et de sa\r\n+jeunesse, palpitaient tout en demeurant clos et baissés. Toute sa\r\n+personne tremblait de je ne sais quel déploiement d'ailes prêtes à \r\n+s'entrouvrir et à l'emporter, qu'on sentait frémir, mais qu'on ne voyait\r\n+pas. À la voir ainsi, on n'eût jamais pu croire que c'était là une\r\n+malade presque désespérée. Elle ressemblait plutôt à ce qui va s'envoler\r\n+qu'à ce qui va mourir.\r\n+\r\n+La branche, lorsqu'une main s'approche pour détacher la fleur,\r\n+frissonne, et semble à la fois se dérober et s'offrir. Le corps humain a\r\n+quelque chose de ce tressaillement, quand arrive l'instant où les doigts\r\n+mystérieux de la mort vont cueillir l'âme.\r\n+\r\n+M. Madeleine resta quelque temps immobile près de ce lit, regardant tour\r\n+à tour la malade et le crucifix, comme il faisait deux mois auparavant,\r\n+le jour où il était venu pour la première fois la voir dans cet asile.\r\n+Ils étaient encore là tous les deux dans la même attitude, elle dormant,\r\n+lui priant; seulement maintenant, depuis ces deux mois écoulés, elle\r\n+avait des cheveux gris et lui des cheveux blancs.\r\n+\r\n+La soeur n'était pas entrée avec lui. Il se tenait près de ce lit,\r\n+debout, le doigt sur la bouche, comme s'il y eût eu dans la chambre\r\n+quelqu'un à faire taire.\r\n+\r\n+Elle ouvrit les yeux, le vit, et dit paisiblement, avec un sourire:\r\n+\r\n+--Et Cosette?\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre II\r\n+\r\n+Fantine heureuse\r\n+\r\n+\r\n+Elle n'eut pas un mouvement de surprise, ni un mouvement de joie; elle\r\n+était la joie même. Cette simple question: «Et Cosette?» fut faite avec\r\n+une foi si profonde, avec tant de certitude, avec une absence si\r\n+complète d'inquiétude et de doute, qu'il ne trouva pas une parole. Elle\r\n+continua:\r\n+\r\n+--Je savais que vous étiez là . Je dormais, mais je vous voyais. Il y a\r\n+longtemps que je vous vois. Je vous ai suivi des yeux toute la nuit.\r\n+Vous étiez dans une gloire et vous aviez autour de vous toutes sortes de\r\n+figures célestes.\r\n+\r\n+Il leva son regard vers le crucifix.\r\n+\r\n+--Mais, reprit-elle, dites-moi donc où est Cosette? Pourquoi ne l'avoir\r\n+pas mise sur mon lit pour le moment où je m'éveillerais?\r\n+\r\n+Il répondit machinalement quelque chose qu'il n'a jamais pu se rappeler\r\n+plus tard.\r\n+\r\n+Heureusement le médecin, averti, était survenu. Il vint en aide à M.\r\n+Madeleine.\r\n+\r\n+--Mon enfant, dit le médecin, calmez-vous. Votre enfant est là .\r\n+\r\n+Les yeux de Fantine s'illuminèrent et couvrirent de clarté tout son\r\n+visage. Elle joignit les mains avec une expression qui contenait tout ce\r\n+que la prière peut avoir à la fois de plus violent et de plus doux.\r\n+\r\n+--Oh! s'écria-t-elle, apportez-la-moi!\r\n+\r\n+Touchante illusion de mère! Cosette était toujours pour elle le petit\r\n+enfant qu'on apporte.\r\n+\r\n+--Pas encore, reprit le médecin, pas en ce moment. Vous avez un reste de\r\n+fièvre. La vue de votre enfant vous agiterait et vous ferait du mal. Il\r\n+faut d'abord vous guérir. Elle l'interrompit impétueusement.\r\n+\r\n+--Mais je suis guérie! je vous dis que je suis guérie! Est-il âne, ce\r\n+médecin! Ah çà ! je veux voir mon enfant, moi!\r\n+\r\n+--Vous voyez, dit le médecin, comme vous vous emportez. Tant que vous\r\n+serez ainsi, je m'opposerai à ce que vous ayez votre enfant. Il ne\r\n+suffit pas de la voir, il faut vivre pour elle. Quand vous serez\r\n+raisonnable, je vous l'amènerai moi-même.\r\n+\r\n+La pauvre mère courba la tête.\r\n+\r\n+--Monsieur le médecin, je vous demande pardon, je vous demande vraiment\r\n+bien pardon. Autrefois, je n'aurais pas parlé comme je viens de faire,\r\n+il m'est arrivé tant de malheurs que quelquefois je ne sais plus ce que\r\n+je dis. Je comprends, vous craignez l'émotion, j'attendrai tant que vous\r\n+voudrez, mais je vous jure que cela ne m'aurait pas fait de mal de voir\r\n+ma fille. Je la vois, je ne la quitte pas des yeux depuis hier au soir.\r\n+Savez-vous? on me l'apporterait maintenant que je me mettrais à lui\r\n+parler doucement. Voilà tout. Est-ce que ce n'est pas bien naturel que\r\n+j'aie envie de voir mon enfant qu'on a été me chercher exprès à \r\n+Montfermeil? Je ne suis pas en colère. Je sais bien que je vais être\r\n+heureuse. Toute la nuit j'ai vu des choses blanches et des personnes qui\r\n+me souriaient. Quand monsieur le médecin voudra, il m'apportera ma\r\n+Cosette. Je n'ai plus de fièvre, puisque je suis guérie; je sens bien\r\n+que je n'ai plus rien du tout; mais je vais faire comme si j'étais\r\n+malade et ne pas bouger pour faire plaisir aux dames d'ici. Quand on\r\n+verra que je suis bien tranquille, on dira: il faut lui donner son\r\n+enfant.\r\n+\r\n+M. Madeleine s'était assis sur une chaise qui était à côté du lit. Elle\r\n+se tourna vers lui; elle faisait visiblement effort pour paraître calme\r\n+et «bien sage», comme elle disait dans cet affaiblissement de la maladie\r\n+qui ressemble à l'enfance, afin que, la voyant si paisible, on ne fît\r\n+pas difficulté de lui amener Cosette. Cependant, tout en se contenant,\r\n+elle ne pouvait s'empêcher d'adresser à M. Madeleine mille questions.\r\n+\r\n+--Avez-vous fait un bon voyage, monsieur le maire? Oh! comme vous êtes\r\n+bon d'avoir été me la chercher! Dites-moi seulement comment elle est.\r\n+A-t-elle bien supporté la route? Hélas! elle ne me reconnaîtra pas!\r\n+Depuis le temps, elle m'a oubliée, pauvre chou! Les enfants, cela n'a\r\n+pas de mémoire. C'est comme des oiseaux. Aujourd'hui cela voit une chose\r\n+et demain une autre, et cela ne pense plus à rien. Avait-elle du linge\r\n+blanc seulement? Ces Thénardier la tenaient-ils proprement? Comment la\r\n+nourrissait-on? Oh! comme j'ai souffert, si vous saviez! de me faire\r\n+toutes ces questions-là dans le temps de ma misère! Maintenant, c'est\r\n+passé. Je suis joyeuse. Oh! que je voudrais donc la voir! Monsieur le\r\n+maire, l'avez-vous trouvée jolie? N'est-ce pas qu'elle est belle, ma\r\n+fille? Vous devez avoir eu bien froid dans cette diligence! Est-ce qu'on\r\n+ne pourrait pas l'amener rien qu'un petit moment? On la remporterait\r\n+tout de suite après. Dites! vous qui êtes le maître, si vous vouliez!\r\n+\r\n+Il lui prit la main:\r\n+\r\n+--Cosette est belle, dit-il, Cosette se porte bien, vous la verrez\r\n+bientôt, mais apaisez-vous. Vous parlez trop vivement, et puis vous\r\n+sortez vos bras du lit, et cela vous fait tousser.\r\n+\r\n+En effet, des quintes de toux interrompaient Fantine presque à chaque\r\n+mot.\r\n+\r\n+Fantine ne murmura pas, elle craignait d'avoir compromis par quelques\r\n+plaintes trop passionnées la confiance qu'elle voulait inspirer, et elle\r\n+se mit à dire des paroles indifférentes.\r\n+\r\n+--C'est assez joli, Montfermeil, n'est-ce-pas? L'été, on va y faire des\r\n+parties de plaisir. Ces Thénardier font-ils de bonnes affaires? Il ne\r\n+passe pas grand monde dans leur pays. C'est une espèce de gargote que\r\n+cette auberge-là .\r\n+\r\n+M. Madeleine lui tenait toujours la main, il la considérait avec\r\n+anxiété; il était évident qu'il était venu pour lui dire des choses\r\n+devant lesquelles sa pensée hésitait maintenant. Le médecin, sa visite\r\n+faite, s'était retiré. La soeur Simplice était seule restée auprès\r\n+d'eux.\r\n+\r\n+Cependant, au milieu de ce silence, Fantine s'écria:\r\n+\r\n+--Je l'entends! mon Dieu! je l'entends!\r\n+\r\n+Elle étendit le bras pour qu'on se tût autour d'elle, retint son\r\n+souffle, et se mit à écouter avec ravissement.\r\n+\r\n+Il y avait un enfant qui jouait dans la cour; l'enfant de la portière ou\r\n+d'une ouvrière quelconque. C'est là un de ces hasards qu'on retrouve\r\n+toujours et qui semblent faire partie de la mystérieuse mise en scène\r\n+des événements lugubres. L'enfant, c'était une petite fille, allait,\r\n+venait, courait pour se réchauffer, riait et chantait à haute voix.\r\n+Hélas! à quoi les jeux des enfants ne se mêlent-ils pas! C'était cette\r\n+petite fille que Fantine entendait chanter.\r\n+\r\n+--Oh! reprit-elle, c'est ma Cosette! je reconnais sa voix!\r\n+\r\n+L'enfant s'éloigna comme il était venu, la voix s'éteignit, Fantine\r\n+écouta encore quelque temps, puis son visage s'assombrit, et M.\r\n+Madeleine l'entendit qui disait à voix basse:\r\n+\r\n+--Comme ce médecin est méchant de ne pas me laisser voir ma fille! Il a\r\n+une mauvaise figure, cet homme-là !\r\n+\r\n+Cependant le fond riant de ses idées revint. Elle continua de se parler\r\n+à elle-même, la tête sur l'oreiller.\r\n+\r\n+--Comme nous allons être heureuses! Nous aurons un petit jardin,\r\n+d'abord! M. Madeleine me l'a promis. Ma fille jouera dans le jardin.\r\n+Elle doit savoir ses lettres maintenant. Je la ferai épeler. Elle courra\r\n+dans l'herbe après les papillons. Je la regarderai. Et puis elle fera sa\r\n+première communion. Ah çà ! quand fera-t-elle sa première communion? Elle\r\n+se mit à compter sur ses doigts.\r\n+\r\n+--... Un, deux, trois, quatre... elle a sept ans. Dans cinq ans. Elle\r\n+aura un voile blanc, des bas à jour, elle aura l'air d'une petite femme.\r\n+Ô ma bonne soeur, vous ne savez pas comme je suis bête, voilà que je\r\n+pense à la première communion de ma fille! Et elle se mit à rire.\r\n+\r\n+Il avait quitté la main de Fantine. Il écoutait ces paroles comme on\r\n+écoute un vent qui souffle, les yeux à terre, l'esprit plongé dans des\r\n+réflexions sans fond. Tout à coup elle cessa de parler, cela lui fit\r\n+lever machinalement la tête. Fantine était devenue effrayante.\r\n+\r\n+Elle ne parlait plus, elle ne respirait plus; elle s'était soulevée à \r\n+demi sur son séant, son épaule maigre sortait de sa chemise, son visage,\r\n+radieux le moment d'auparavant, était blême, et elle paraissait fixer\r\n+sur quelque chose de formidable, devant elle, à l'autre extrémité de la\r\n+chambre, son oeil agrandi par la terreur.\r\n+\r\n+--Mon Dieu! s'écria-t-il. Qu'avez-vous, Fantine?\r\n+\r\n+Elle ne répondit pas, elle ne quitta point des yeux l'objet quelconque\r\n+qu'elle semblait voir, elle lui toucha le bras d'une main et de l'autre\r\n+lui fit signe de regarder derrière lui.\r\n+\r\n+Il se retourna, et vit Javert.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre III\r\n+\r\n+Javert content\r\n+\r\n+\r\n+Voici ce qui s'était passé.\r\n+\r\n+Minuit et demi venait de sonner, quand M. Madeleine était sorti de la\r\n+salle des assises d'Arras. Il était rentré à son auberge juste à temps\r\n+pour repartir par la malle-poste où l'on se rappelle qu'il avait retenu\r\n+sa place. Un peu avant six heures du matin, il était arrivé à \r\n+Montreuil-sur-mer, et son premier soin avait été de jeter à la poste sa\r\n+lettre à M. Laffitte, puis d'entrer à l'infirmerie et de voir Fantine.\r\n+\r\n+Cependant, à peine avait-il quitté la salle d'audience de la cour\r\n+d'assises, que l'avocat général, revenu du premier saisissement, avait\r\n+pris la parole pour déplorer l'acte de folie de l'honorable maire de\r\n+Montreuil-sur-mer, déclarer que ses convictions n'étaient en rien\r\n+modifiées par cet incident bizarre qui s'éclaircirait plus tard, et\r\n+requérir, en attendant, la condamnation de ce Champmathieu, évidemment\r\n+le vrai Jean Valjean. La persistance de l'avocat général était\r\n+visiblement en contradiction avec le sentiment de tous, du public, de la\r\n+cour et du jury. Le défenseur avait eu peu de peine à réfuter cette\r\n+harangue et à établir que, par suite des révélations de M. Madeleine,\r\n+c'est-à -dire du vrai Jean Valjean, la face de l'affaire était\r\n+bouleversée de fond en comble, et que le jury n'avait plus devant les\r\n+yeux qu'un innocent. L'avocat avait tiré de là quelques épiphonèmes,\r\n+malheureusement peu neufs, sur les erreurs judiciaires, etc., etc., le\r\n+président dans son résumé s'était joint au défenseur, et le jury en\r\n+quelques minutes avait mis hors de cause Champmathieu.\r\n+\r\n+Cependant il fallait un Jean Valjean à l'avocat général, et, n'ayant\r\n+plus Champmathieu, il prit Madeleine.\r\n+\r\n+Immédiatement après la mise en liberté de Champmathieu, l'avocat général\r\n+s'enferma avec le président. Ils conférèrent «de la nécessité de se\r\n+saisir de la personne de M. le maire de Montreuil-sur-mer». Cette\r\n+phrase, où il y a beaucoup de _de_, est de M. l'avocat général,\r\n+entièrement écrite de sa main sur la minute de son rapport au procureur\r\n+général. La première émotion passée, le président fit peu d'objections.\r\n+Il fallait bien que justice eût son cours. Et puis, pour tout dire,\r\n+quoique le président fût homme bon et assez intelligent, il était en\r\n+même temps fort royaliste et presque ardent, et il avait été choqué que\r\n+le maire de Montreuil-sur-mer, en parlant du débarquement à Cannes, eût\r\n+dit l'_empereur_ et non _Buonaparte_.\r\n+\r\n+L'ordre d'arrestation fut donc expédié. L'avocat général l'envoya à \r\n+Montreuil-sur-mer par un exprès, à franc étrier, et en chargea\r\n+l'inspecteur de police Javert.\r\n+\r\n+On sait que Javert était revenu à Montreuil-sur-mer immédiatement après\r\n+avoir fait sa déposition.\r\n+\r\n+Javert se levait au moment où l'exprès lui remit l'ordre d'arrestation\r\n+et le mandat d'amener.\r\n+\r\n+L'exprès était lui-même un homme de police fort entendu qui, en deux\r\n+mots, mit Javert au fait de ce qui était arrivé à Arras. L'ordre\r\n+d'arrestation, signé de l'avocat général, était ainsi\r\n+conçu:--L'inspecteur Javert appréhendera au corps le sieur Madeleine,\r\n+maire de Montreuil-sur-mer, qui, dans l'audience de ce jour, a été\r\n+reconnu pour être le forçat libéré Jean Valjean.\r\n+\r\n+Quelqu'un qui n'eût pas connu Javert et qui l'eût vu au moment où il\r\n+pénétra dans l'antichambre de l'infirmerie n'eût pu rien deviner de ce\r\n+qui se passait, et lui eût trouvé l'air le plus ordinaire du monde. Il\r\n+était froid, calme, grave, avait ses cheveux gris parfaitement lissés\r\n+sur les tempes et venait de monter l'escalier avec sa lenteur\r\n+habituelle. Quelqu'un qui l'eût connu à fond et qui l'eût examiné\r\n+attentivement eût frémi. La boucle de son col de cuir, au lieu d'être\r\n+sur sa nuque, était sur son oreille gauche. Ceci révélait une agitation\r\n+inouïe.\r\n+\r\n+Javert était un caractère complet, ne laissant faire de pli ni à son\r\n+devoir, ni à son uniforme; méthodique avec les scélérats, rigide avec\r\n+les boutons de son habit.\r\n+\r\n+Pour qu'il eût mal mis la boucle de son col, il fallait qu'il y eût en\r\n+lui une de ces émotions qu'on pourrait appeler des tremblements de terre\r\n+intérieurs.\r\n+\r\n+Il était venu simplement, avait requis un caporal et quatre soldats au\r\n+poste voisin, avait laissé les soldats dans la cour, et s'était fait\r\n+indiquer la chambre de Fantine par la portière sans défiance, accoutumée\r\n+qu'elle était à voir des gens armés demander monsieur le maire.\r\n+\r\n+Arrivé à la chambre de Fantine, Javert tourna la clef, poussa la porte\r\n+avec une douceur de garde-malade ou de mouchard, et entra.\r\n+\r\n+À proprement parler, il n'entra pas. Il se tint debout dans la porte\r\n+entrebâillée, le chapeau sur la tête, la main gauche dans sa redingote\r\n+fermée jusqu'au menton. Dans le pli du coude on pouvait voir le pommeau\r\n+de plomb de son énorme canne, laquelle disparaissait derrière lui.\r\n+\r\n+Il resta ainsi près d'une minute sans qu'on s'aperçût de sa présence.\r\n+Tout à coup Fantine leva les yeux, le vit, et fit retourner M.\r\n+Madeleine.\r\n+\r\n+À l'instant où le regard de Madeleine rencontra le regard de Javert,\r\n+Javert, sans bouger, sans remuer, sans approcher, devint épouvantable.\r\n+Aucun sentiment humain ne réussit à être effroyable comme la joie.\r\n+\r\n+Ce fut le visage d'un démon qui vient de retrouver son damné.\r\n+\r\n+La certitude de tenir enfin Jean Valjean fit apparaître sur sa\r\n+physionomie tout ce qu'il avait dans l'âme. Le fond remué monta à la\r\n+surface. L'humiliation d'avoir un peu perdu la piste et de s'être mépris\r\n+quelques minutes sur ce Champmathieu, s'effaçait sous l'orgueil d'avoir\r\n+si bien deviné d'abord et d'avoir eu si longtemps un instinct juste. Le\r\n+contentement de Javert éclata dans son attitude souveraine. La\r\n+difformité du triomphe s'épanouit sur ce front étroit. Ce fut tout le\r\n+déploiement d'horreur que peut donner une figure satisfaite.\r\n+\r\n+Javert en ce moment était au ciel. Sans qu'il s'en rendit nettement\r\n+compte, mais pourtant avec une intuition confuse de sa nécessité et de\r\n+son succès, il personnifiait, lui Javert, la justice, la lumière et la\r\n+vérité dans leur fonction céleste d'écrasement du mal. Il avait derrière\r\n+lui et autour de lui, à une profondeur infinie, l'autorité, la raison,\r\n+la chose jugée, la conscience légale, la vindicte publique, toutes les\r\n+étoiles; il protégeait l'ordre, il faisait sortir de la loi la foudre,\r\n+il vengeait la société, il prêtait main-forte à l'absolu; il se dressait\r\n+dans une gloire; il y avait dans sa victoire un reste de défi et de\r\n+combat; debout, altier, éclatant, il étalait en plein azur la bestialité\r\n+surhumaine d'un archange féroce; l'ombre redoutable de l'action qu'il\r\n+accomplissait faisait visible à son poing crispé le vague flamboiement\r\n+de l'épée sociale; heureux et indigné, il tenait sous son talon le\r\n+crime, le vice, la rébellion, la perdition, l'enfer, il rayonnait, il\r\n+exterminait, il souriait et il y avait une incontestable grandeur dans\r\n+ce saint Michel monstrueux.\r\n+\r\n+Javert, effroyable, n'avait rien d'ignoble.\r\n+\r\n+La probité, la sincérité, la candeur, la conviction, l'idée du devoir,\r\n+sont des choses qui, en se trompant, peuvent devenir hideuses, mais qui,\r\n+même hideuses, restent grandes; leur majesté, propre à la conscience\r\n+humaine, persiste dans l'horreur. Ce sont des vertus qui ont un vice,\r\n+l'erreur. L'impitoyable joie honnête d'un fanatique en pleine atrocité\r\n+conserve on ne sait quel rayonnement lugubrement vénérable. Sans qu'il\r\n+s'en doutât, Javert, dans son bonheur formidable, était à plaindre comme\r\n+tout ignorant qui triomphe. Rien n'était poignant et terrible comme\r\n+cette figure où se montrait ce qu'on pourrait appeler tout le mauvais du\r\n+bon.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre IV\r\n+\r\n+L'autorité reprend ses droits\r\n+\r\n+\r\n+La Fantine n'avait point vu Javert depuis le jour où M. le maire l'avait\r\n+arrachée à cet homme. Son cerveau malade ne se rendit compte de rien,\r\n+seulement elle ne douta pas qu'il ne revint la chercher. Elle ne put\r\n+supporter cette figure affreuse, elle se sentit expirer, elle cacha son\r\n+visage de ses deux mains et cria avec angoisse:\r\n+\r\n+--Monsieur Madeleine, sauvez-moi!\r\n+\r\n+Jean Valjean--nous ne le nommerons plus désormais autrement--s'était\r\n+levé. Il dit à Fantine de sa voix la plus douce et la plus calme:\r\n+\r\n+--Soyez tranquille. Ce n'est pas pour vous qu'il vient.\r\n+\r\n+Puis il s'adressa à Javert et lui dit:\r\n+\r\n+--Je sais ce que vous voulez.\r\n+\r\n+Javert répondit:\r\n+\r\n+--Allons, vite!\r\n+\r\n+Il y eut dans l'inflexion qui accompagna ces deux mots je ne sais quoi\r\n+de fauve et de frénétique. Javert ne dit pas: «Allons, vite!» il dit:\r\n+«Allonouaite!» Aucune orthographe ne pourrait rendre l'accent dont cela\r\n+fut prononcé; ce n'était plus une parole humaine, c'était un\r\n+rugissement.\r\n+\r\n+Il ne fit point comme d'habitude; il n'entra point en matière; il\r\n+n'exhiba point de mandat d'amener. Pour lui, Jean Valjean était une\r\n+sorte de combattant mystérieux et insaisissable, un lutteur ténébreux\r\n+qu'il étreignait depuis cinq ans sans pouvoir le renverser. Cette\r\n+arrestation n'était pas un commencement, mais une fin. Il se borna à \r\n+dire: «Allons, vite!»\r\n+\r\n+En parlant ainsi, il ne fit point un pas; il lança sur Jean Valjean ce\r\n+regard qu'il jetait comme un crampon, et avec lequel il avait coutume de\r\n+tirer violemment les misérables à lui.\r\n+\r\n+C'était ce regard que la Fantine avait senti pénétrer jusque dans la\r\n+moelle de ses os deux mois auparavant.\r\n+\r\n+Au cri de Javert, Fantine avait rouvert les yeux. Mais M. le maire était\r\n+là . Que pouvait-elle craindre?\r\n+\r\n+Javert avança au milieu de la chambre et cria:\r\n+\r\n+--Ah çà ! viendras-tu?\r\n+\r\n+La malheureuse regarda autour d'elle. Il n'y avait personne que la\r\n+religieuse et monsieur le maire. À qui pouvait s'adresser ce tutoiement\r\n+abject? elle seulement. Elle frissonna.\r\n+\r\n+Alors elle vit une chose inouïe, tellement inouïe que jamais rien de\r\n+pareil ne lui était apparu dans les plus noirs délires de la fièvre.\r\n+\r\n+Elle vit le mouchard Javert saisir au collet monsieur le maire; elle vit\r\n+monsieur le maire courber la tête. Il lui sembla que le monde\r\n+s'évanouissait.\r\n+\r\n+Javert, en effet, avait pris Jean Valjean au collet.\r\n+\r\n+--Monsieur le maire! cria Fantine.\r\n+\r\n+Javert éclata de rire, de cet affreux rire qui lui déchaussait toutes\r\n+les dents.\r\n+\r\n+--Il n'y a plus de monsieur le maire ici!\r\n+\r\n+Jean Valjean n'essaya pas de déranger la main qui tenait le col de sa\r\n+redingote. Il dit:\r\n+\r\n+--Javert....\r\n+\r\n+Javert l'interrompit:\r\n+\r\n+--Appelle-moi monsieur l'inspecteur.\r\n+\r\n+--Monsieur, reprit Jean Valjean, je voudrais vous dire un mot en\r\n+particulier.\r\n+\r\n+--Tout haut! parle tout haut! répondit Javert; on me parle tout haut à \r\n+moi!\r\n+\r\n+Jean Valjean continua en baissant la voix:\r\n+\r\n+--C'est une prière que j'ai à vous faire....\r\n+\r\n+--Je te dis de parler tout haut.\r\n+\r\n+--Mais cela ne doit être entendu que de vous seul....\r\n+\r\n+--Qu'est-ce que cela me fait? je n'écoute pas!\r\n+\r\n+Jean Valjean se tourna vers lui et lui dit rapidement et très bas:\r\n+\r\n+--Accordez-moi trois jours! trois jours pour aller chercher l'enfant de\r\n+cette malheureuse femme! Je payerai ce qu'il faudra. Vous\r\n+m'accompagnerez si vous voulez.\r\n+\r\n+--Tu veux rire! cria Javert. Ah çà ! je ne te croyais pas bête! Tu me\r\n+demandes trois jours pour t'en aller! Tu dis que c'est pour aller\r\n+chercher l'enfant de cette fille! Ah! ah! c'est bon! voilà qui est bon!\r\n+Fantine eut un tremblement.\r\n+\r\n+--Mon enfant! s'écria-t-elle, aller chercher mon enfant! Elle n'est donc\r\n+pas ici! Ma soeur, répondez-moi, où est Cosette? Je veux mon enfant!\r\n+Monsieur Madeleine! monsieur le maire!\r\n+\r\n+Javert frappa du pied.\r\n+\r\n+--Voilà l'autre, à présent! Te tairas-tu, drôlesse! Gredin de pays où\r\n+les galériens sont magistrats et où les filles publiques sont soignées\r\n+comme des comtesses! Ah mais! tout ça va changer; il était temps!\r\n+\r\n+Il regarda fixement Fantine et ajouta en reprenant à poignée la cravate,\r\n+la chemise et le collet de Jean Valjean:\r\n+\r\n+--Je te dis qu'il n'y a point de monsieur Madeleine et qu'il n'y a point\r\n+de monsieur le maire. Il y a un voleur, il y a un brigand, il y a un\r\n+forçat appelé Jean Valjean! c'est lui que je tiens! voilà ce qu'il y a!\r\n+\r\n+Fantine se dressa en sursaut, appuyée sur ses bras roides et sur ses\r\n+deux mains, elle regarda Jean Valjean, elle regarda Javert, elle regarda\r\n+la religieuse, elle ouvrit la bouche comme pour parler, un râle sortit\r\n+du fond de sa gorge, ses dents claquèrent, elle étendit les bras avec\r\n+angoisse, ouvrant convulsivement les mains, et cherchant autour d'elle\r\n+comme quelqu'un qui se noie, puis elle s'affaissa subitement sur\r\n+l'oreiller. Sa tête heurta le chevet du lit et vint retomber sur sa\r\n+poitrine, la bouche béante, les yeux ouverts et éteints.\r\n+\r\n+Elle était morte.\r\n+\r\n+Jean Valjean posa sa main sur la main de Javert qui le tenait, et\r\n+l'ouvrit comme il eût ouvert la main d'un enfant, puis il dit à Javert:\r\n+\r\n+--Vous avez tué cette femme.\r\n+\r\n+--Finirons-nous! cria Javert furieux. Je ne suis pas ici pour entendre\r\n+des raisons. Économisons tout ça. La garde est en bas. Marchons tout de\r\n+suite, ou les poucettes!\r\n+\r\n+Il y avait dans un coin de la chambre un vieux lit en fer en assez\r\n+mauvais état qui servait de lit de camp aux soeurs quand elles\r\n+veillaient. Jean Valjean alla à ce lit, disloqua en un clin d'oeil le\r\n+chevet déjà fort délabré, chose facile à des muscles comme les siens,\r\n+saisit à poigne-main la maîtresse-tringle, et considéra Javert. Javert\r\n+recula vers la porte.\r\n+\r\n+Jean Valjean, sa barre de fer au poing, marcha lentement vers le lit de\r\n+Fantine. Quand il y fut parvenu, il se retourna, et dit à Javert d'une\r\n+voix qu'on entendait à peine:\r\n+\r\n+--Je ne vous conseille pas de me déranger en ce moment.\r\n+\r\n+Ce qui est certain, c'est que Javert tremblait.\r\n+\r\n+Il eut l'idée d'aller appeler la garde, mais Jean Valjean pouvait\r\n+profiter de cette minute pour s'évader. Il resta donc, saisit sa canne\r\n+par le petit bout, et s'adossa au chambranle de la porte sans quitter du\r\n+regard Jean Valjean.\r\n+\r\n+Jean Valjean posa son coude sur la pomme du chevet du lit et son front\r\n+sur sa main, et se mit à contempler Fantine immobile et étendue. Il\r\n+demeura ainsi, absorbé, muet, et ne songeant évidemment plus à aucune\r\n+chose de cette vie. Il n'y avait plus rien sur son visage et dans son\r\n+attitude qu'une inexprimable pitié. Après quelques instants de cette\r\n+rêverie, il se pencha vers Fantine et lui parla à voix basse.\r\n+\r\n+Que lui dit-il? Que pouvait dire cet homme qui était réprouvé à cette\r\n+femme qui était morte? Qu'était-ce que ces paroles? Personne sur la\r\n+terre ne les a entendues. La morte les entendit-elle? Il y a des\r\n+illusions touchantes qui sont peut-être des réalités sublimes. Ce qui\r\n+est hors de doute, c'est que la soeur Simplice, unique témoin de la\r\n+chose qui se passait, a souvent raconté qu'au moment où Jean Valjean\r\n+parla à l'oreille de Fantine, elle vit distinctement poindre un\r\n+ineffable sourire sur ces lèvres pâles et dans ces prunelles vagues,\r\n+pleines de l'étonnement du tombeau.\r\n+\r\n+Jean Valjean prit dans ses deux mains la tête de Fantine et l'arrangea\r\n+sur l'oreiller comme une mère eût fait pour son enfant, il lui rattacha\r\n+le cordon de sa chemise et rentra ses cheveux sous son bonnet. Cela\r\n+fait, il lui ferma les yeux.\r\n+\r\n+La face de Fantine en cet instant semblait étrangement éclairée.\r\n+\r\n+La mort, c'est l'entrée dans la grande lueur.\r\n+\r\n+La main de Fantine pendait hors du lit. Jean Valjean s'agenouilla devant\r\n+cette main, la souleva doucement, et la baisa.\r\n+\r\n+Puis il se redressa, et, se tournant vers Javert:\r\n+\r\n+--Maintenant, dit-il, je suis à vous.\r\n+\r\n+\r\n+\r\n+\r\n+Chapitre V\r\n+\r\n+Tombeau convenable\r\n+\r\n+\r\n+Javert déposa Jean Valjean à la prison de la ville.\r\n+\r\n+L'arrestation de M. Madeleine produisit à Montreuil-sur-mer une\r\n+sensation, ou pour mieux dire une commotion extraordinaire. Nous sommes\r\n+triste de ne pouvoir dissimuler que sur ce seul mot: _c'était un\r\n+galérien_, tout le monde à peu près l'abandonna. En moins de deux heures\r\n+tout le bien qu'il avait fait fut oublié, et ce ne fut plus «qu'un\r\n+galérien». Il est juste de dire qu'on ne connaissait pas encore les\r\n+détails de l'événement d'Arras. Toute la journée on entendait dans\r\n+toutes les parties de la ville des conversations comme celle-ci:\r\n+\r\n+--Vous ne savez pas? c'était un forçat libéré! Qui ça?--Le maire.--Bah!\r\n+M. Madeleine?--Oui. Vraiment?--Il ne s'appelait pas Madeleine, il a un\r\n+affreux nom, Béjean, Bojean, Boujean.--Ah, mon Dieu!--Il est\r\n+arrêté.--Arrêté!--En prison à la prison de la ville, en attendant qu'on\r\n+le transfère.--Qu'on le transfère! On va le transférer! Où va-t-on le\r\n+transférer?--Il va passer aux assises pour un vol de grand chemin qu'il\r\n+a fait autrefois.--Eh bien! je m'en doutais. Cet homme était trop bon,\r\n+trop parfait, trop confit. Il refusait la croix, il donnait des sous à \r\n+tous les petits drôles qu'il rencontrait. J'ai toujours pensé qu'il y\r\n+avait là -dessous quelque mauvaise histoire.\r\n+\r\n+«Les salons» surtout abondèrent dans ce sens.\r\n+\r\n+Une vieille dame, abonnée au _Drapeau blanc_, fit cette réflexion dont\r\n+il est presque impossible de sonder la profondeur:\r\n+\r\n+--Je n'en suis pas fâchée. Cela apprendra aux buonapartistes!\r\n+\r\n+C'est ainsi que ce fantôme qui s'était appelé M. Madeleine se dissipa à \r\n+Montreuil-sur-mer. Trois ou quatre personnes seulement dans toute la\r\n+ville restèrent fidèles à cette mémoire. La vieille portière qui l'avait\r\n+servi fut du nombre. Le soir de ce même jour, cette digne vieille était\r\n+assise dans sa loge, encore tout effarée et réfléchissant tristement. La\r\n+fabrique avait été fermée toute la journée, la porte cochère était\r\n+verrouillée, la rue était déserte. Il n'y avait dans la maison que deux\r\n+religieuses, soeur Perpétue et soeur Simplice, qui veillaient près du\r\n+corps de Fantine.\r\n+\r\n+Vers l'heure où M. Madeleine avait coutume de rentrer, la brave portière\r\n+se leva machinalement, prit la clef de la chambre de M. Madeleine dans\r\n+un tiroir et le bougeoir dont il se servait tous les soirs pour monter\r\n+chez lui, puis elle accrocha la clef au clou où il la prenait\r\n+d'habitude, et plaça le bougeoir à côté, comme si elle l'attendait.\r\n+Ensuite elle se rassit sur sa chaise et se remit à songer. La pauvre\r\n+bonne vieille avait fait tout cela sans en avoir conscience.\r\n+\r\n+Ce ne fut qu'au bout de plus de deux heures qu'elle sortit de sa rêverie\r\n+et s'écria: «Tiens! mon bon Dieu Jésus! moi qui ai mis sa clef au clou!»\r\n+\r\n+En ce moment la vitre de la loge s'ouvrit, une main passa par\r\n+l'ouverture, saisit la clef et le bougeoir et alluma la bougie à la\r\n+chandelle qui brûlait.\r\n+\r\n+La portière leva les yeux et resta béante, avec un cri dans le gosier\r\n+qu'elle retint. Elle connaissait cette main, ce bras, cette manche de\r\n+redingote.\r\n+\r\n+C'était M. Madeleine.\r\n+\r\n+Elle fut quelques secondes avant de pouvoir parler, saisie, comme elle\r\n+le disait elle-même plus tard en racontant son aventure.\r\n+\r\n+--Mon Dieu, monsieur le maire, s'écria-t-elle enfin, je vous croyais....\r\n+\r\n+Elle s'arrêta, la fin de sa phrase eût manqué de respect au\r\n+commencement. Jean Valjean était toujours pour elle monsieur le maire.\r\n+\r\n+Il acheva sa pensée.\r\n+\r\n+--En prison, dit-il. J'y étais. J'ai brisé un barreau d'une fenêtre, je\r\n+me suis laissé tomber du haut d'un toit, et me voici. Je monte à ma\r\n+chambre, allez me chercher la soeur Simplice. Elle est sans doute près\r\n+de cette pauvre femme.\r\n+\r\n+La vieille obéit en toute hâte.\r\n+\r\n+Il ne lui fit aucune recommandation; il était bien sûr qu'elle le\r\n+garderait mieux qu'il ne se garderait lui-même.\r\n+\r\n+On n'a jamais su comment il avait réussi à pénétrer dans la cour sans\r\n+faire ouvrir la porte cochère. Il avait, et portait toujours sur lui, un\r\n+passe-partout qui ouvrait une petite porte latérale; mais on avait dû le\r\n+fouiller et lui prendre son passe-partout. Ce point n'a pas été\r\n+éclairci.\r\n+\r\n+Il monta l'escalier qui conduisait à sa chambre. Arrivé en haut, il\r\n+laissa son bougeoir sur les dernières marches de l'escalier, ouvrit sa\r\n+porte avec peu de bruit, et alla fermer à tâtons sa fenêtre et son\r\n+volet, puis il revint prendre sa bougie et rentra dans sa chambre.\r\n+\r\n+La précaution était utile; on se souvient que sa fenêtre pouvait être\r\n+aperçue de la rue. Il jeta un coup d'oeil autour de lui, sur sa table,\r\n+sur sa chaise, sur son lit qui n'avait pas été défait depuis trois\r\n+jours. Il ne restait aucune trace du désordre de l'avant-dernière nuit.\r\n+La portière avait «fait la chambre». Seulement elle avait ramassé dans\r\n+les cendres et posé proprement sur la table les deux bouts du bâton\r\n+ferré et la pièce de quarante sous noircie par le feu.\r\n+\r\n+Il prit une feuille de papier sur laquelle il écrivit: _Voici les deux\r\n+bouts de mon bâton ferré et la pièce de quarante sous volée à \r\n+Petit-Gervais dont j'ai parlé à la cour d'assises_, et il posa sur cette\r\n+feuille la pièce d'argent et les deux morceaux de fer, de façon que ce\r\n+fût la première chose qu'on aperçût en entrant dans la chambre. Il tira\r\n+d'une armoire une vieille chemise à lui qu'il déchira. Cela fit quelques\r\n+morceaux de toile dans lesquels il emballa les deux flambeaux d'argent.\r\n+Du reste il n'avait ni hâte ni agitation, et, tout en emballant les\r\n+chandeliers de l'évêque, il mordait dans un morceau de pain noir. Il est\r\n+probable que c'était le pain de la prison qu'il avait emporté en\r\n+s'évadant.\r\n+\r\n+Ceci a été constaté par les miettes de pain qui furent trouvées sur le\r\n+carreau de la chambre, lorsque la justice plus tard fit une\r\n+perquisition.\r\n+\r\n+On frappa deux petits coups à la porte.\r\n+\r\n+--Entrez, dit-il.\r\n+\r\n+C'était la soeur Simplice.\r\n+\r\n+Elle était pâle, elle avait les yeux rouges, la chandelle qu'elle tenait\r\n+vacillait dans sa main. Les violences de la destinée ont cela de\r\n+particulier que, si perfectionnés ou si refroidis que nous soyons, elles\r\n+nous tirent du fond des entrailles la nature humaine et la forcent de\r\n+reparaître au dehors. Dans les émotions de cette journée, la religieuse\r\n+était redevenue femme. Elle avait pleuré, et elle tremblait.\r\n+\r\n+Jean Valjean venait d'écrire quelques lignes sur un papier qu'il tendit\r\n+à la religieuse en disant:\r\n+\r\n+--Ma soeur, vous remettrez ceci à monsieur le curé.\r\n+\r\n+Le papier était déplié. Elle y jeta les yeux.\r\n+\r\n+--Vous pouvez lire, dit-il.\r\n+\r\n+Elle lut.--«Je prie monsieur le curé de veiller sur tout ce que je\r\n+laisse ici. Il voudra bien payer là -dessus les frais de mon procès et\r\n+l'enterrement de la femme qui est morte aujourd'hui. Le reste sera aux\r\n+pauvres.»\r\n+\r\n+La soeur voulut parler, mais elle put à peine balbutier quelques sons\r\n+inarticulés. Elle parvint cependant à dire:\r\n+\r\n+--Est-ce que monsieur le maire ne désire pas revoir une dernière fois\r\n+cette pauvre malheureuse?\r\n+\r\n+--Non, dit-il, on est à ma poursuite, on n'aurait qu'à m'arrêter dans sa\r\n+chambre, cela la troublerait.\r\n+\r\n+Il achevait à peine qu'un grand bruit se fit dans l'escalier. Ils\r\n+entendirent un tumulte de pas qui montaient, et la vieille portière qui\r\n+disait de sa voix la plus haute et la plus perçante:\r\n+\r\n+--Mon bon monsieur, je vous jure le bon Dieu qu'il n'est entré personne\r\n+ici de toute la journée ni de toute la soirée, que même je n'ai pas\r\n+quitté ma porte!\r\n+\r\n+Un homme répondit:\r\n+\r\n+--Cependant il y a de la lumière dans cette chambre.\r\n+\r\n+Ils reconnurent la voix de Javert.\r\n+\r\n+La chambre était disposée de façon que la porte en s'ouvrant masquait\r\n+l'angle du mur à droite. Jean Valjean souffla la bougie et se mit dans\r\n+cet angle.\r\n+\r\n+La soeur Simplice tomba à genoux près de la table.\r\n+\r\n+La porte s'ouvrit.\r\n+\r\n+Javert entra.\r\n+\r\n+On entendait le chuchotement de plusieurs hommes et les protestations de\r\n+la portière dans le corridor.\r\n+\r\n+La religieuse ne leva pas les yeux. Elle priait.\r\n+\r\n+La chandelle était sur la cheminée et ne donnait que peu de clarté.\r\n+\r\n+Javert aperçut la soeur et s'arrêta interdit.\r\n+\r\n+On se rappelle que le fond même de Javert, son élément, son milieu\r\n+respirable, c'était la vénération de toute autorité. Il était tout d'une\r\n+pièce et n'admettait ni objection, ni restriction. Pour lui, bien\r\n+entendu, l'autorité ecclésiastique était la première de toutes. Il était\r\n+religieux, superficiel et correct sur ce point comme sur tous. À ses\r\n+yeux un prêtre était un esprit qui ne se trompe pas, une religieuse\r\n+était une créature qui ne pèche pas. C'étaient des âmes murées à ce\r\n+monde avec une seule porte qui ne s'ouvrait jamais que pour laisser\r\n+sortir la vérité.\r\n+\r\n+En apercevant la soeur, son premier mouvement fut de se retirer.\r\n+\r\n+Cependant il y avait aussi un autre devoir qui le tenait, et qui le\r\n+poussait impérieusement en sens inverse. Son second mouvement fut de\r\n+rester, et de hasarder au moins une question.\r\n+\r\n+C'était cette soeur Simplice qui n'avait menti de sa vie. Javert le\r\n+savait, et la vénérait particulièrement à cause de cela.\r\n+\r\n+--Ma soeur, dit-il, êtes-vous seule dans cette chambre?\r\n+\r\n+Il y eut un moment affreux pendant lequel la pauvre portière se sentit\r\n+défaillir.\r\n+\r\n+La soeur leva les yeux et répondit:\r\n+\r\n+--Oui.\r\n+\r\n+--Ainsi, reprit Javert, excusez-moi si j'insiste, c'est mon devoir, vous\r\n+n'avez pas vu ce soir une personne, un homme. Il s'est évadé, nous le\r\n+cherchons, ce nommé Jean Valjean, vous ne l'avez pas vu?\r\n+\r\n+La soeur répondit:\r\n+\r\n+--Non.\r\n+\r\n+Elle mentit. Elle mentit deux fois de suite, coup sur coup, sans\r\n+hésiter, rapidement, comme on se dévoue.\r\n+\r\n+--Pardon, dit Javert, et il se retira en saluant profondément.\r\n+\r\n+Ô sainte fille! vous n'êtes plus de ce monde depuis beaucoup d'années;\r\n+vous avez rejoint dans la lumière vos soeurs les vierges et vos frères\r\n+les anges; que ce mensonge vous soit compté dans le paradis!\r\n+\r\n+L'affirmation de la soeur fut pour Javert quelque chose de si décisif\r\n+qu'il ne remarqua même pas la singularité de cette bougie qu'on venait\r\n+de souffler et qui fumait sur la table.\r\n+\r\n+Une heure après, un homme, marchant à travers les arbres et les brumes,\r\n+s'éloignait rapidement de Montreuil-sur-mer dans la direction de Paris.\r\n+Cet homme était Jean Valjean. Il a été établi, par le témoignage de deux\r\n+ou trois rouliers qui l'avaient rencontré, qu'il portait un paquet et\r\n+qu'il était vêtu d'une blouse. Où avait-il pris cette blouse? On ne l'a\r\n+jamais su. Cependant un vieux ouvrier était mort quelques jours\r\n+auparavant à l'infirmerie de la fabrique, ne laissant que sa blouse.\r\n+C'était peut-être celle-là .\r\n+\r\n+Un dernier mot sur Fantine.\r\n+\r\n+Nous avons tous une mère, la terre. On rendit Fantine à cette mère.\r\n+\r\n+Le curé crut bien faire, et fit bien peut-être, en réservant, sur ce que\r\n+Jean Valjean avait laissé, le plus d'argent possible aux pauvres. Après\r\n+tout, de qui s'agissait-il? d'un forçat et d'une fille publique. C'est\r\n+pourquoi il simplifia l'enterrement de Fantine, et le réduisit à ce\r\n+strict nécessaire qu'on appelle la fosse commune.\r\n+\r\n+Fantine fut donc enterrée dans ce coin gratis du cimetière qui est à \r\n+tous et à personne, et où l'on perd les pauvres. Heureusement Dieu sait\r\n+où retrouver l'âme. On coucha Fantine dans les ténèbres parmi les\r\n+premiers os venus; elle subit la promiscuité des cendres. Elle fut jetée\r\n+à la fosse publique. Sa tombe ressembla à son lit.\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+End of the Project Gutenberg EBook of Les misérables Tome I, by Victor Hugo\r\n+\r\n+*** END OF THIS PROJECT GUTENBERG EBOOK LES MISÉRABLES TOME I ***\r\n+\r\n+***** This file should be named 17489-8.txt or 17489-8.zip *****\r\n+This and all associated files of various formats will be found in:\r\n+ http://www.gutenberg.org/1/7/4/8/17489/\r\n+\r\n+Produced by www.ebooksgratuits.com and Chuck Greif\r\n+\r\n+Updated editions will replace the previous one--the old editions\r\n+will be renamed.\r\n+\r\n+Creating the works from public domain print editions means that no\r\n+one owns a United States copyright in these works, so the Foundation\r\n+(and you!) can copy and distribute it in the United States without\r\n+permission and without paying copyright royalties. Special rules,\r\n+set forth in the General Terms of Use part of this license, apply to\r\n+copying and distributing Project Gutenberg-tm electronic works to\r\n+protect the PROJECT GUTENBERG-tm concept and trademark. Project\r\n+Gutenberg is a registered trademark, and may not be used if you\r\n+charge for the eBooks, unless you receive specific permission. If you\r\n+do not charge anything for copies of this eBook, complying with the\r\n+rules is very easy. You may use this eBook for nearly any purpose\r\n+such as creation of derivative works, reports, performances and\r\n+research. They may be modified and printed and given away--you may do\r\n+practically ANYTHING with public domain eBooks. Redistribution is\r\n+subject to the trademark license, especially commercial\r\n+redistribution.\r\n+\r\n+\r\n+\r\n+*** START: FULL LICENSE ***\r\n+\r\n+THE FULL PROJECT GUTENBERG LICENSE\r\n+PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK\r\n+\r\n+To protect the Project Gutenberg-tm mission of promoting the free\r\n+distribution of electronic works, by using or distributing this work\r\n+(or any other work associated in any way with the phrase \u0022Project\r\n+Gutenberg\u0022), you agree to comply with all the terms of the Full Project\r\n+Gutenberg-tm License (available with this file or online at\r\n+http://gutenberg.org/license).\r\n+\r\n+\r\n+Section 1. General Terms of Use and Redistributing Project Gutenberg-tm\r\n+electronic works\r\n+\r\n+1.A. By reading or using any part of this Project Gutenberg-tm\r\n+electronic work, you indicate that you have read, understand, agree to\r\n+and accept all the terms of this license and intellectual property\r\n+(trademark/copyright) agreement. If you do not agree to abide by all\r\n+the terms of this agreement, you must cease using and return or destroy\r\n+all copies of Project Gutenberg-tm electronic works in your possession.\r\n+If you paid a fee for obtaining a copy of or access to a Project\r\n+Gutenberg-tm electronic work and you do not agree to be bound by the\r\n+terms of this agreement, you may obtain a refund from the person or\r\n+entity to whom you paid the fee as set forth in paragraph 1.E.8.\r\n+\r\n+1.B. \u0022Project Gutenberg\u0022 is a registered trademark. It may only be\r\n+used on or associated in any way with an electronic work by people who\r\n+agree to be bound by the terms of this agreement. There are a few\r\n+things that you can do with most Project Gutenberg-tm electronic works\r\n+even without complying with the full terms of this agreement. See\r\n+paragraph 1.C below. There are a lot of things you can do with Project\r\n+Gutenberg-tm electronic works if you follow the terms of this agreement\r\n+and help preserve free future access to Project Gutenberg-tm electronic\r\n+works. See paragraph 1.E below.\r\n+\r\n+1.C. The Project Gutenberg Literary Archive Foundation (\u0022the Foundation\u0022\r\n+or PGLAF), owns a compilation copyright in the collection of Project\r\n+Gutenberg-tm electronic works. Nearly all the individual works in the\r\n+collection are in the public domain in the United States. If an\r\n+individual work is in the public domain in the United States and you are\r\n+located in the United States, we do not claim a right to prevent you from\r\n+copying, distributing, performing, displaying or creating derivative\r\n+works based on the work as long as all references to Project Gutenberg\r\n+are removed. Of course, we hope that you will support the Project\r\n+Gutenberg-tm mission of promoting free access to electronic works by\r\n+freely sharing Project Gutenberg-tm works in compliance with the terms of\r\n+this agreement for keeping the Project Gutenberg-tm name associated with\r\n+the work. You can easily comply with the terms of this agreement by\r\n+keeping this work in the same format with its attached full Project\r\n+Gutenberg-tm License when you share it without charge with others.\r\n+\r\n+1.D. The copyright laws of the place where you are located also govern\r\n+what you can do with this work. Copyright laws in most countries are in\r\n+a constant state of change. If you are outside the United States, check\r\n+the laws of your country in addition to the terms of this agreement\r\n+before downloading, copying, displaying, performing, distributing or\r\n+creating derivative works based on this work or any other Project\r\n+Gutenberg-tm work. The Foundation makes no representations concerning\r\n+the copyright status of any work in any country outside the United\r\n+States.\r\n+\r\n+1.E. Unless you have removed all references to Project Gutenberg:\r\n+\r\n+1.E.1. The following sentence, with active links to, or other immediate\r\n+access to, the full Project Gutenberg-tm License must appear prominently\r\n+whenever any copy of a Project Gutenberg-tm work (any work on which the\r\n+phrase \u0022Project Gutenberg\u0022 appears, or with which the phrase \u0022Project\r\n+Gutenberg\u0022 is associated) is accessed, displayed, performed, viewed,\r\n+copied or distributed:\r\n+\r\n+This eBook is for the use of anyone anywhere at no cost and with\r\n+almost no restrictions whatsoever. You may copy it, give it away or\r\n+re-use it under the terms of the Project Gutenberg License included\r\n+with this eBook or online at www.gutenberg.org\r\n+\r\n+1.E.2. If an individual Project Gutenberg-tm electronic work is derived\r\n+from the public domain (does not contain a notice indicating that it is\r\n+posted with permission of the copyright holder), the work can be copied\r\n+and distributed to anyone in the United States without paying any fees\r\n+or charges. If you are redistributing or providing access to a work\r\n+with the phrase \u0022Project Gutenberg\u0022 associated with or appearing on the\r\n+work, you must comply either with the requirements of paragraphs 1.E.1\r\n+through 1.E.7 or obtain permission for the use of the work and the\r\n+Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or\r\n+1.E.9.\r\n+\r\n+1.E.3. If an individual Project Gutenberg-tm electronic work is posted\r\n+with the permission of the copyright holder, your use and distribution\r\n+must comply with both paragraphs 1.E.1 through 1.E.7 and any additional\r\n+terms imposed by the copyright holder. Additional terms will be linked\r\n+to the Project Gutenberg-tm License for all works posted with the\r\n+permission of the copyright holder found at the beginning of this work.\r\n+\r\n+1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm\r\n+License terms from this work, or any files containing a part of this\r\n+work or any other work associated with Project Gutenberg-tm.\r\n+\r\n+1.E.5. Do not copy, display, perform, distribute or redistribute this\r\n+electronic work, or any part of this electronic work, without\r\n+prominently displaying the sentence set forth in paragraph 1.E.1 with\r\n+active links or immediate access to the full terms of the Project\r\n+Gutenberg-tm License.\r\n+\r\n+1.E.6. You may convert to and distribute this work in any binary,\r\n+compressed, marked up, nonproprietary or proprietary form, including any\r\n+word processing or hypertext form. However, if you provide access to or\r\n+distribute copies of a Project Gutenberg-tm work in a format other than\r\n+\u0022Plain Vanilla ASCII\u0022 or other format used in the official version\r\n+posted on the official Project Gutenberg-tm web site (www.gutenberg.org),\r\n+you must, at no additional cost, fee or expense to the user, provide a\r\n+copy, a means of exporting a copy, or a means of obtaining a copy upon\r\n+request, of the work in its original \u0022Plain Vanilla ASCII\u0022 or other\r\n+form. Any alternate format must include the full Project Gutenberg-tm\r\n+License as specified in paragraph 1.E.1.\r\n+\r\n+1.E.7. Do not charge a fee for access to, viewing, displaying,\r\n+performing, copying or distributing any Project Gutenberg-tm works\r\n+unless you comply with paragraph 1.E.8 or 1.E.9.\r\n+\r\n+1.E.8. You may charge a reasonable fee for copies of or providing\r\n+access to or distributing Project Gutenberg-tm electronic works provided\r\n+that\r\n+\r\n+- You pay a royalty fee of 20% of the gross profits you derive from\r\n+ the use of Project Gutenberg-tm works calculated using the method\r\n+ you already use to calculate your applicable taxes. The fee is\r\n+ owed to the owner of the Project Gutenberg-tm trademark, but he\r\n+ has agreed to donate royalties under this paragraph to the\r\n+ Project Gutenberg Literary Archive Foundation. Royalty payments\r\n+ must be paid within 60 days following each date on which you\r\n+ prepare (or are legally required to prepare) your periodic tax\r\n+ returns. Royalty payments should be clearly marked as such and\r\n+ sent to the Project Gutenberg Literary Archive Foundation at the\r\n+ address specified in Section 4, \u0022Information about donations to\r\n+ the Project Gutenberg Literary Archive Foundation.\u0022\r\n+\r\n+- You provide a full refund of any money paid by a user who notifies\r\n+ you in writing (or by e-mail) within 30 days of receipt that s/he\r\n+ does not agree to the terms of the full Project Gutenberg-tm\r\n+ License. You must require such a user to return or\r\n+ destroy all copies of the works possessed in a physical medium\r\n+ and discontinue all use of and all access to other copies of\r\n+ Project Gutenberg-tm works.\r\n+\r\n+- You provide, in accordance with paragraph 1.F.3, a full refund of any\r\n+ money paid for a work or a replacement copy, if a defect in the\r\n+ electronic work is discovered and reported to you within 90 days\r\n+ of receipt of the work.\r\n+\r\n+- You comply with all other terms of this agreement for free\r\n+ distribution of Project Gutenberg-tm works.\r\n+\r\n+1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm\r\n+electronic work or group of works on different terms than are set\r\n+forth in this agreement, you must obtain permission in writing from\r\n+both the Project Gutenberg Literary Archive Foundation and Michael\r\n+Hart, the owner of the Project Gutenberg-tm trademark. Contact the\r\n+Foundation as set forth in Section 3 below.\r\n+\r\n+1.F.\r\n+\r\n+1.F.1. Project Gutenberg volunteers and employees expend considerable\r\n+effort to identify, do copyright research on, transcribe and proofread\r\n+public domain works in creating the Project Gutenberg-tm\r\n+collection. Despite these efforts, Project Gutenberg-tm electronic\r\n+works, and the medium on which they may be stored, may contain\r\n+\u0022Defects,\u0022 such as, but not limited to, incomplete, inaccurate or\r\n+corrupt data, transcription errors, a copyright or other intellectual\r\n+property infringement, a defective or damaged disk or other medium, a\r\n+computer virus, or computer codes that damage or cannot be read by\r\n+your equipment.\r\n+\r\n+1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the \u0022Right\r\n+of Replacement or Refund\u0022 described in paragraph 1.F.3, the Project\r\n+Gutenberg Literary Archive Foundation, the owner of the Project\r\n+Gutenberg-tm trademark, and any other party distributing a Project\r\n+Gutenberg-tm electronic work under this agreement, disclaim all\r\n+liability to you for damages, costs and expenses, including legal\r\n+fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT\r\n+LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE\r\n+PROVIDED IN PARAGRAPH F3. YOU AGREE THAT THE FOUNDATION, THE\r\n+TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE\r\n+LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR\r\n+INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH\r\n+DAMAGE.\r\n+\r\n+1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a\r\n+defect in this electronic work within 90 days of receiving it, you can\r\n+receive a refund of the money (if any) you paid for it by sending a\r\n+written explanation to the person you received the work from. If you\r\n+received the work on a physical medium, you must return the medium with\r\n+your written explanation. The person or entity that provided you with\r\n+the defective work may elect to provide a replacement copy in lieu of a\r\n+refund. If you received the work electronically, the person or entity\r\n+providing it to you may choose to give you a second opportunity to\r\n+receive the work electronically in lieu of a refund. If the second copy\r\n+is also defective, you may demand a refund in writing without further\r\n+opportunities to fix the problem.\r\n+\r\n+1.F.4. Except for the limited right of replacement or refund set forth\r\n+in paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO OTHER\r\n+WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\r\n+WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE.\r\n+\r\n+1.F.5. Some states do not allow disclaimers of certain implied\r\n+warranties or the exclusion or limitation of certain types of damages.\r\n+If any disclaimer or limitation set forth in this agreement violates the\r\n+law of the state applicable to this agreement, the agreement shall be\r\n+interpreted to make the maximum disclaimer or limitation permitted by\r\n+the applicable state law. The invalidity or unenforceability of any\r\n+provision of this agreement shall not void the remaining provisions.\r\n+\r\n+1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the\r\n+trademark owner, any agent or employee of the Foundation, anyone\r\n+providing copies of Project Gutenberg-tm electronic works in accordance\r\n+with this agreement, and any volunteers associated with the production,\r\n+promotion and distribution of Project Gutenberg-tm electronic works,\r\n+harmless from all liability, costs and expenses, including legal fees,\r\n+that arise directly or indirectly from any of the following which you do\r\n+or cause to occur: (a) distribution of this or any Project Gutenberg-tm\r\n+work, (b) alteration, modification, or additions or deletions to any\r\n+Project Gutenberg-tm work, and (c) any Defect you cause.\r\n+\r\n+\r\n+Section 2. Information about the Mission of Project Gutenberg-tm\r\n+\r\n+Project Gutenberg-tm is synonymous with the free distribution of\r\n+electronic works in formats readable by the widest variety of computers\r\n+including obsolete, old, middle-aged and new computers. It exists\r\n+because of the efforts of hundreds of volunteers and donations from\r\n+people in all walks of life.\r\n+\r\n+Volunteers and financial support to provide volunteers with the\r\n+assistance they need, is critical to reaching Project Gutenberg-tm's\r\n+goals and ensuring that the Project Gutenberg-tm collection will\r\n+remain freely available for generations to come. In 2001, the Project\r\n+Gutenberg Literary Archive Foundation was created to provide a secure\r\n+and permanent future for Project Gutenberg-tm and future generations.\r\n+To learn more about the Project Gutenberg Literary Archive Foundation\r\n+and how your efforts and donations can help, see Sections 3 and 4\r\n+and the Foundation web page at http://www.pglaf.org.\r\n+\r\n+\r\n+Section 3. Information about the Project Gutenberg Literary Archive\r\n+Foundation\r\n+\r\n+The Project Gutenberg Literary Archive Foundation is a non profit\r\n+501(c)(3) educational corporation organized under the laws of the\r\n+state of Mississippi and granted tax exempt status by the Internal\r\n+Revenue Service. The Foundation's EIN or federal tax identification\r\n+number is 64-6221541. Its 501(c)(3) letter is posted at\r\n+http://pglaf.org/fundraising. Contributions to the Project Gutenberg\r\n+Literary Archive Foundation are tax deductible to the full extent\r\n+permitted by U.S. federal laws and your state's laws.\r\n+\r\n+The Foundation's principal office is located at 4557 Melan Dr. S.\r\n+Fairbanks, AK, 99712., but its volunteers and employees are scattered\r\n+throughout numerous locations. Its business office is located at\r\n+809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email\r\n+business@pglaf.org. Email contact links and up to date contact\r\n+information can be found at the Foundation's web site and official\r\n+page at http://pglaf.org\r\n+\r\n+For additional contact information:\r\n+ Dr. Gregory B. Newby\r\n+ Chief Executive and Director\r\n+ gbnewby@pglaf.org\r\n+\r\n+Section 4. Information about Donations to the Project Gutenberg\r\n+Literary Archive Foundation\r\n+\r\n+Project Gutenberg-tm depends upon and cannot survive without wide\r\n+spread public support and donations to carry out its mission of\r\n+increasing the number of public domain and licensed works that can be\r\n+freely distributed in machine readable form accessible by the widest\r\n+array of equipment including outdated equipment. Many small donations\r\n+($1 to $5,000) are particularly important to maintaining tax exempt\r\n+status with the IRS.\r\n+\r\n+The Foundation is committed to complying with the laws regulating\r\n+charities and charitable donations in all 50 states of the United\r\n+States. Compliance requirements are not uniform and it takes a\r\n+considerable effort, much paperwork and many fees to meet and keep up\r\n+with these requirements. We do not solicit donations in locations\r\n+where we have not received written confirmation of compliance. To\r\n+SEND DONATIONS or determine the status of compliance for any\r\n+particular state visit http://pglaf.org\r\n+\r\n+While we cannot and do not solicit contributions from states where we\r\n+have not met the solicitation requirements, we know of no prohibition\r\n+against accepting unsolicited donations from donors in such states who\r\n+approach us with offers to donate.\r\n+\r\n+International donations are gratefully accepted, but we cannot make\r\n+any statements concerning tax treatment of donations received from\r\n+outside the United States. U.S. laws alone swamp our small staff.\r\n+\r\n+Please check the Project Gutenberg Web pages for current donation\r\n+methods and addresses. Donations are accepted in a number of other\r\n+ways including checks, online payments and credit card\r\n+donations. To donate, please visit: http://pglaf.org/donate\r\n+\r\n+\r\n+Section 5. General Information About Project Gutenberg-tm electronic\r\n+works.\r\n+\r\n+Professor Michael S. Hart is the originator of the Project Gutenberg-tm\r\n+concept of a library of electronic works that could be freely shared\r\n+with anyone. For thirty years, he produced and distributed Project\r\n+Gutenberg-tm eBooks with only a loose network of volunteer support.\r\n+\r\n+Project Gutenberg-tm eBooks are often created from several printed\r\n+editions, all of which are confirmed as Public Domain in the U.S.\r\n+unless a copyright notice is included. Thus, we do not necessarily\r\n+keep eBooks in compliance with any particular paper edition.\r\n+\r\n+Most people start at our Web site which has the main PG search facility:\r\n+\r\n+ http://www.gutenberg.org\r\n+\r\n+This Web site includes information about Project Gutenberg-tm,\r\n+including how to make donations to the Project Gutenberg Literary\r\n+Archive Foundation, how to help produce our new eBooks, and how to\r\n+subscribe to our email newsletter to hear about new eBooks.\r\n+\r\n+*** END: FULL LICENSE ***\r\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-fts/main.c b/minimal-examples-lowlevel/api-tests/api-test-fts/main.c\nnew file mode 100644\nindex 0000000..d21a19b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-fts/main.c\n@@ -0,0 +1,230 @@\n+/*\n+ * lws-api-test-fts - lws full-text search api test\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#if defined(LWS_HAS_GETOPT_LONG) || defined(WIN32)\n+#include \u003cgetopt.h\u003e\n+#endif\n+#include \u003cfcntl.h\u003e\n+\n+#if defined(LWS_HAS_GETOPT_LONG) || defined(WIN32)\n+static struct option options[] \u003d {\n+\t{ \u0022help\u0022,\tno_argument,\t\tNULL, 'h' },\n+\t{ \u0022createindex\u0022, no_argument,\t\tNULL, 'c' },\n+\t{ \u0022index\u0022,\trequired_argument,\tNULL, 'i' },\n+\t{ \u0022debug\u0022,\trequired_argument,\tNULL, 'd' },\n+\t{ \u0022file\u0022,\trequired_argument,\tNULL, 'f' },\n+\t{ \u0022lines\u0022,\trequired_argument,\tNULL, 'l' },\n+\t{ NULL, 0, 0, 0 }\n+};\n+#endif\n+\n+static const char *index_filepath \u003d \u0022/tmp/lws-fts-test-index\u0022;\n+static char filepath[256];\n+\n+int main(int argc, char **argv)\n+{\n+\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tint fd, fi, ft, createindex \u003d 0, flags \u003d LWSFTS_F_QUERY_AUTOCOMPLETE;\n+\tstruct lws_fts_search_params params;\n+\tstruct lws_fts_result *result;\n+\tstruct lws_fts_file *jtf;\n+\tstruct lws_fts *t;\n+\tchar buf[16384];\n+\n+\tdo {\n+#if defined(LWS_HAS_GETOPT_LONG) || defined(WIN32)\n+\t\tn \u003d getopt_long(argc, argv, \u0022hd:i:cfl\u0022, options, NULL);\n+#else\n+ n \u003d getopt(argc, argv, \u0022hd:i:cfl\u0022);\n+#endif\n+\t\tif (n \u003c 0)\n+\t\t\tcontinue;\n+\t\tswitch (n) {\n+\t\tcase 'i':\n+\t\t\tstrncpy(filepath, optarg, sizeof(filepath) - 1);\n+\t\t\tfilepath[sizeof(filepath) - 1] \u003d '\u005c0';\n+\t\t\tindex_filepath \u003d filepath;\n+\t\t\tbreak;\n+\t\tcase 'd':\n+\t\t\tlogs \u003d atoi(optarg);\n+\t\t\tbreak;\n+\t\tcase 'c':\n+\t\t\tcreateindex \u003d 1;\n+\t\t\tbreak;\n+\t\tcase 'f':\n+\t\t\tflags \u0026\u003d ~LWSFTS_F_QUERY_AUTOCOMPLETE;\n+\t\t\tflags |\u003d LWSFTS_F_QUERY_FILES;\n+\t\t\tbreak;\n+\t\tcase 'l':\n+\t\t\tflags |\u003d LWSFTS_F_QUERY_FILES |\n+\t\t\t\t LWSFTS_F_QUERY_FILE_LINES;\n+\t\t\tbreak;\n+\t\tcase 'h':\n+\t\t\tfprintf(stderr,\n+\t\t\t\t\u0022Usage: %s [--createindex]\u0022\n+\t\t\t\t\t\u0022[--index\u003d\u003cindex filepath\u003e] \u0022\n+\t\t\t\t\t\u0022[-d \u003clog bitfield\u003e] file1 file2 \u005cn\u0022,\n+\t\t\t\t\targv[0]);\n+\t\t\texit(1);\n+\t\t}\n+\t} while (n \u003e\u003d 0);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: full-text search\u005cn\u0022);\n+\n+\tif (createindex) {\n+\n+\t\tlwsl_notice(\u0022Creating index\u005cn\u0022);\n+\n+\t\t/*\n+\t\t * create an index by shifting through argv and indexing each\n+\t\t * file given there into a single combined index\n+\t\t */\n+\n+\t\tft \u003d open(index_filepath, O_CREAT | O_WRONLY | O_TRUNC, 0600);\n+\t\tif (ft \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: can't open index %s\u005cn\u0022, __func__,\n+\t\t\t\t index_filepath);\n+\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t\tt \u003d lws_fts_create(ft);\n+\t\tif (!t) {\n+\t\t\tlwsl_err(\u0022%s: Unable to allocate trie\u005cn\u0022, __func__);\n+\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\twhile (optind \u003c argc) {\n+\n+\t\t\tfi \u003d lws_fts_file_index(t, argv[optind],\n+\t\t\t\t\t\t(int)strlen(argv[optind]), 1);\n+\t\t\tif (fi \u003c 0) {\n+\t\t\t\tlwsl_err(\u0022%s: Failed to get file idx for %s\u005cn\u0022,\n+\t\t\t\t\t __func__, argv[optind]);\n+\n+\t\t\t\tgoto bail1;\n+\t\t\t}\n+\n+\t\t\tfd \u003d open(argv[optind], O_RDONLY);\n+\t\t\tif (fd \u003c 0) {\n+\t\t\t\tlwsl_err(\u0022unable to open %s for read\u005cn\u0022,\n+\t\t\t\t\t\targv[optind]);\n+\t\t\t\tgoto bail;\n+\t\t\t}\n+\n+\t\t\tdo {\n+\t\t\t\tint n \u003d (int)read(fd, buf, sizeof(buf));\n+\n+\t\t\t\tif (n \u003c\u003d 0)\n+\t\t\t\t\tbreak;\n+\n+\t\t\t\tif (lws_fts_fill(t, (uint32_t)fi, buf, (size_t)n)) {\n+\t\t\t\t\tlwsl_err(\u0022%s: lws_fts_fill failed\u005cn\u0022,\n+\t\t\t\t\t\t __func__);\n+\t\t\t\t\tclose(fd);\n+\n+\t\t\t\t\tgoto bail;\n+\t\t\t\t}\n+\n+\t\t\t} while (1);\n+\n+\t\t\tclose(fd);\n+\t\t\toptind++;\n+\t\t}\n+\n+\t\tif (lws_fts_serialize(t)) {\n+\t\t\tlwsl_err(\u0022%s: serialize failed\u005cn\u0022, __func__);\n+\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t\tlws_fts_destroy(\u0026t);\n+\t\tclose(ft);\n+\n+\t\treturn 0;\n+\t}\n+\n+\t/*\n+\t * shift through argv searching for each token\n+\t */\n+\n+\tjtf \u003d lws_fts_open(index_filepath);\n+\tif (!jtf)\n+\t\tgoto bail;\n+\n+\twhile (optind \u003c argc) {\n+\n+\t\tstruct lws_fts_result_autocomplete *ac;\n+\t\tstruct lws_fts_result_filepath *fp;\n+\t\tuint32_t *l, n;\n+\n+\t\tmemset(\u0026params, 0, sizeof(params));\n+\n+\t\tparams.needle \u003d argv[optind];\n+\t\tparams.flags \u003d flags;\n+\t\tparams.max_autocomplete \u003d 20;\n+\t\tparams.max_files \u003d 20;\n+\n+\t\tresult \u003d lws_fts_search(jtf, \u0026params);\n+\n+\t\tif (!result) {\n+\t\t\tlwsl_err(\u0022%s: search failed\u005cn\u0022, __func__);\n+\t\t\tlws_fts_close(jtf);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t\tac \u003d result-\u003eautocomplete_head;\n+\t\tfp \u003d result-\u003efilepath_head;\n+\n+\t\tif (!ac)\n+\t\t\tlwsl_notice(\u0022%s: no autocomplete results\u005cn\u0022, __func__);\n+\n+\t\twhile (ac) {\n+\t\t\tlwsl_notice(\u0022%s: AC %s: %d agg hits\u005cn\u0022, __func__,\n+\t\t\t\t((char *)(ac + 1)), ac-\u003einstances);\n+\n+\t\t\tac \u003d ac-\u003enext;\n+\t\t}\n+\n+\t\tif (!fp)\n+\t\t\tlwsl_notice(\u0022%s: no filepath results\u005cn\u0022, __func__);\n+\n+\t\twhile (fp) {\n+\t\t\tlwsl_notice(\u0022%s: %s: (%d lines) %d hits \u005cn\u0022, __func__,\n+\t\t\t\t(((char *)(fp + 1)) + fp-\u003ematches_length),\n+\t\t\t\tfp-\u003elines_in_file, fp-\u003ematches);\n+\n+\t\t\tif (fp-\u003ematches_length) {\n+\t\t\t\tl \u003d (uint32_t *)(fp + 1);\n+\t\t\t\tn \u003d 0;\n+\t\t\t\twhile ((int)n++ \u003c fp-\u003ematches)\n+\t\t\t\t\tlwsl_notice(\u0022 %d\u005cn\u0022, *l++);\n+\t\t\t}\n+\t\t\tfp \u003d fp-\u003enext;\n+\t\t}\n+\n+\t\tlwsac_free(\u0026params.results_head);\n+\n+\t\toptind++;\n+\t}\n+\n+\tlws_fts_close(jtf);\n+\n+\treturn 0;\n+\n+bail1:\n+\tclose(ft);\n+bail:\n+\tlwsl_user(\u0022FAILED\u005cn\u0022);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-fts/the-picture-of-dorian-gray.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/the-picture-of-dorian-gray.txt\nnew file mode 100644\nindex 0000000..f4ffc49\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-fts/the-picture-of-dorian-gray.txt\n@@ -0,0 +1,8904 @@\n+The Project Gutenberg EBook of The Picture of Dorian Gray, by Oscar Wilde\r\n+\r\n+This eBook is for the use of anyone anywhere at no cost and with\r\n+almost no restrictions whatsoever. You may copy it, give it away or\r\n+re-use it under the terms of the Project Gutenberg License included\r\n+with this eBook or online at www.gutenberg.net\r\n+\r\n+\r\n+Title: The Picture of Dorian Gray\r\n+\r\n+Author: Oscar Wilde\r\n+\r\n+Release Date: June 9, 2008 [EBook #174]\r\n+[This file last updated on July 2, 2011]\r\n+[This file last updated on July 23, 2014]\r\n+\r\n+\r\n+Language: English\r\n+\r\n+\r\n+*** START OF THIS PROJECT GUTENBERG EBOOK THE PICTURE OF DORIAN GRAY ***\r\n+\r\n+\r\n+\r\n+\r\n+Produced by Judith Boss. HTML version by Al Haines.\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+The Picture of Dorian Gray\r\n+\r\n+by\r\n+\r\n+Oscar Wilde\r\n+\r\n+\r\n+\r\n+\r\n+THE PREFACE\r\n+\r\n+The artist is the creator of beautiful things. To reveal art and\r\n+conceal the artist is art's aim. The critic is he who can translate\r\n+into another manner or a new material his impression of beautiful\r\n+things.\r\n+\r\n+The highest as the lowest form of criticism is a mode of autobiography.\r\n+Those who find ugly meanings in beautiful things are corrupt without\r\n+being charming. This is a fault.\r\n+\r\n+Those who find beautiful meanings in beautiful things are the\r\n+cultivated. For these there is hope. They are the elect to whom\r\n+beautiful things mean only beauty.\r\n+\r\n+There is no such thing as a moral or an immoral book. Books are well\r\n+written, or badly written. That is all.\r\n+\r\n+The nineteenth century dislike of realism is the rage of Caliban seeing\r\n+his own face in a glass.\r\n+\r\n+The nineteenth century dislike of romanticism is the rage of Caliban\r\n+not seeing his own face in a glass. The moral life of man forms part\r\n+of the subject-matter of the artist, but the morality of art consists\r\n+in the perfect use of an imperfect medium. No artist desires to prove\r\n+anything. Even things that are true can be proved. No artist has\r\n+ethical sympathies. An ethical sympathy in an artist is an\r\n+unpardonable mannerism of style. No artist is ever morbid. The artist\r\n+can express everything. Thought and language are to the artist\r\n+instruments of an art. Vice and virtue are to the artist materials for\r\n+an art. From the point of view of form, the type of all the arts is\r\n+the art of the musician. From the point of view of feeling, the\r\n+actor's craft is the type. All art is at once surface and symbol.\r\n+Those who go beneath the surface do so at their peril. Those who read\r\n+the symbol do so at their peril. It is the spectator, and not life,\r\n+that art really mirrors. Diversity of opinion about a work of art\r\n+shows that the work is new, complex, and vital. When critics disagree,\r\n+the artist is in accord with himself. We can forgive a man for making\r\n+a useful thing as long as he does not admire it. The only excuse for\r\n+making a useless thing is that one admires it intensely.\r\n+\r\n+ All art is quite useless.\r\n+\r\n+ OSCAR WILDE\r\n+\r\n+\r\n+\r\n+\r\n+CHAPTER 1\r\n+\r\n+The studio was filled with the rich odour of roses, and when the light\r\n+summer wind stirred amidst the trees of the garden, there came through\r\n+the open door the heavy scent of the lilac, or the more delicate\r\n+perfume of the pink-flowering thorn.\r\n+\r\n+From the corner of the divan of Persian saddle-bags on which he was\r\n+lying, smoking, as was his custom, innumerable cigarettes, Lord Henry\r\n+Wotton could just catch the gleam of the honey-sweet and honey-coloured\r\n+blossoms of a laburnum, whose tremulous branches seemed hardly able to\r\n+bear the burden of a beauty so flamelike as theirs; and now and then\r\n+the fantastic shadows of birds in flight flitted across the long\r\n+tussore-silk curtains that were stretched in front of the huge window,\r\n+producing a kind of momentary Japanese effect, and making him think of\r\n+those pallid, jade-faced painters of Tokyo who, through the medium of\r\n+an art that is necessarily immobile, seek to convey the sense of\r\n+swiftness and motion. The sullen murmur of the bees shouldering their\r\n+way through the long unmown grass, or circling with monotonous\r\n+insistence round the dusty gilt horns of the straggling woodbine,\r\n+seemed to make the stillness more oppressive. The dim roar of London\r\n+was like the bourdon note of a distant organ.\r\n+\r\n+In the centre of the room, clamped to an upright easel, stood the\r\n+full-length portrait of a young man of extraordinary personal beauty,\r\n+and in front of it, some little distance away, was sitting the artist\r\n+himself, Basil Hallward, whose sudden disappearance some years ago\r\n+caused, at the time, such public excitement and gave rise to so many\r\n+strange conjectures.\r\n+\r\n+As the painter looked at the gracious and comely form he had so\r\n+skilfully mirrored in his art, a smile of pleasure passed across his\r\n+face, and seemed about to linger there. But he suddenly started up,\r\n+and closing his eyes, placed his fingers upon the lids, as though he\r\n+sought to imprison within his brain some curious dream from which he\r\n+feared he might awake.\r\n+\r\n+\u0022It is your best work, Basil, the best thing you have ever done,\u0022 said\r\n+Lord Henry languidly. \u0022You must certainly send it next year to the\r\n+Grosvenor. The Academy is too large and too vulgar. Whenever I have\r\n+gone there, there have been either so many people that I have not been\r\n+able to see the pictures, which was dreadful, or so many pictures that\r\n+I have not been able to see the people, which was worse. The Grosvenor\r\n+is really the only place.\u0022\r\n+\r\n+\u0022I don't think I shall send it anywhere,\u0022 he answered, tossing his head\r\n+back in that odd way that used to make his friends laugh at him at\r\n+Oxford. \u0022No, I won't send it anywhere.\u0022\r\n+\r\n+Lord Henry elevated his eyebrows and looked at him in amazement through\r\n+the thin blue wreaths of smoke that curled up in such fanciful whorls\r\n+from his heavy, opium-tainted cigarette. \u0022Not send it anywhere? My\r\n+dear fellow, why? Have you any reason? What odd chaps you painters\r\n+are! You do anything in the world to gain a reputation. As soon as\r\n+you have one, you seem to want to throw it away. It is silly of you,\r\n+for there is only one thing in the world worse than being talked about,\r\n+and that is not being talked about. A portrait like this would set you\r\n+far above all the young men in England, and make the old men quite\r\n+jealous, if old men are ever capable of any emotion.\u0022\r\n+\r\n+\u0022I know you will laugh at me,\u0022 he replied, \u0022but I really can't exhibit\r\n+it. I have put too much of myself into it.\u0022\r\n+\r\n+Lord Henry stretched himself out on the divan and laughed.\r\n+\r\n+\u0022Yes, I knew you would; but it is quite true, all the same.\u0022\r\n+\r\n+\u0022Too much of yourself in it! Upon my word, Basil, I didn't know you\r\n+were so vain; and I really can't see any resemblance between you, with\r\n+your rugged strong face and your coal-black hair, and this young\r\n+Adonis, who looks as if he was made out of ivory and rose-leaves. Why,\r\n+my dear Basil, he is a Narcissus, and you--well, of course you have an\r\n+intellectual expression and all that. But beauty, real beauty, ends\r\n+where an intellectual expression begins. Intellect is in itself a mode\r\n+of exaggeration, and destroys the harmony of any face. The moment one\r\n+sits down to think, one becomes all nose, or all forehead, or something\r\n+horrid. Look at the successful men in any of the learned professions.\r\n+How perfectly hideous they are! Except, of course, in the Church. But\r\n+then in the Church they don't think. A bishop keeps on saying at the\r\n+age of eighty what he was told to say when he was a boy of eighteen,\r\n+and as a natural consequence he always looks absolutely delightful.\r\n+Your mysterious young friend, whose name you have never told me, but\r\n+whose picture really fascinates me, never thinks. I feel quite sure of\r\n+that. He is some brainless beautiful creature who should be always\r\n+here in winter when we have no flowers to look at, and always here in\r\n+summer when we want something to chill our intelligence. Don't flatter\r\n+yourself, Basil: you are not in the least like him.\u0022\r\n+\r\n+\u0022You don't understand me, Harry,\u0022 answered the artist. \u0022Of course I am\r\n+not like him. I know that perfectly well. Indeed, I should be sorry\r\n+to look like him. You shrug your shoulders? I am telling you the\r\n+truth. There is a fatality about all physical and intellectual\r\n+distinction, the sort of fatality that seems to dog through history the\r\n+faltering steps of kings. It is better not to be different from one's\r\n+fellows. The ugly and the stupid have the best of it in this world.\r\n+They can sit at their ease and gape at the play. If they know nothing\r\n+of victory, they are at least spared the knowledge of defeat. They\r\n+live as we all should live--undisturbed, indifferent, and without\r\n+disquiet. They neither bring ruin upon others, nor ever receive it\r\n+from alien hands. Your rank and wealth, Harry; my brains, such as they\r\n+are--my art, whatever it may be worth; Dorian Gray's good looks--we\r\n+shall all suffer for what the gods have given us, suffer terribly.\u0022\r\n+\r\n+\u0022Dorian Gray? Is that his name?\u0022 asked Lord Henry, walking across the\r\n+studio towards Basil Hallward.\r\n+\r\n+\u0022Yes, that is his name. I didn't intend to tell it to you.\u0022\r\n+\r\n+\u0022But why not?\u0022\r\n+\r\n+\u0022Oh, I can't explain. When I like people immensely, I never tell their\r\n+names to any one. It is like surrendering a part of them. I have\r\n+grown to love secrecy. It seems to be the one thing that can make\r\n+modern life mysterious or marvellous to us. The commonest thing is\r\n+delightful if one only hides it. When I leave town now I never tell my\r\n+people where I am going. If I did, I would lose all my pleasure. It\r\n+is a silly habit, I dare say, but somehow it seems to bring a great\r\n+deal of romance into one's life. I suppose you think me awfully\r\n+foolish about it?\u0022\r\n+\r\n+\u0022Not at all,\u0022 answered Lord Henry, \u0022not at all, my dear Basil. You\r\n+seem to forget that I am married, and the one charm of marriage is that\r\n+it makes a life of deception absolutely necessary for both parties. I\r\n+never know where my wife is, and my wife never knows what I am doing.\r\n+When we meet--we do meet occasionally, when we dine out together, or go\r\n+down to the Duke's--we tell each other the most absurd stories with the\r\n+most serious faces. My wife is very good at it--much better, in fact,\r\n+than I am. She never gets confused over her dates, and I always do.\r\n+But when she does find me out, she makes no row at all. I sometimes\r\n+wish she would; but she merely laughs at me.\u0022\r\n+\r\n+\u0022I hate the way you talk about your married life, Harry,\u0022 said Basil\r\n+Hallward, strolling towards the door that led into the garden. \u0022I\r\n+believe that you are really a very good husband, but that you are\r\n+thoroughly ashamed of your own virtues. You are an extraordinary\r\n+fellow. You never say a moral thing, and you never do a wrong thing.\r\n+Your cynicism is simply a pose.\u0022\r\n+\r\n+\u0022Being natural is simply a pose, and the most irritating pose I know,\u0022\r\n+cried Lord Henry, laughing; and the two young men went out into the\r\n+garden together and ensconced themselves on a long bamboo seat that\r\n+stood in the shade of a tall laurel bush. The sunlight slipped over\r\n+the polished leaves. In the grass, white daisies were tremulous.\r\n+\r\n+After a pause, Lord Henry pulled out his watch. \u0022I am afraid I must be\r\n+going, Basil,\u0022 he murmured, \u0022and before I go, I insist on your\r\n+answering a question I put to you some time ago.\u0022\r\n+\r\n+\u0022What is that?\u0022 said the painter, keeping his eyes fixed on the ground.\r\n+\r\n+\u0022You know quite well.\u0022\r\n+\r\n+\u0022I do not, Harry.\u0022\r\n+\r\n+\u0022Well, I will tell you what it is. I want you to explain to me why you\r\n+won't exhibit Dorian Gray's picture. I want the real reason.\u0022\r\n+\r\n+\u0022I told you the real reason.\u0022\r\n+\r\n+\u0022No, you did not. You said it was because there was too much of\r\n+yourself in it. Now, that is childish.\u0022\r\n+\r\n+\u0022Harry,\u0022 said Basil Hallward, looking him straight in the face, \u0022every\r\n+portrait that is painted with feeling is a portrait of the artist, not\r\n+of the sitter. The sitter is merely the accident, the occasion. It is\r\n+not he who is revealed by the painter; it is rather the painter who, on\r\n+the coloured canvas, reveals himself. The reason I will not exhibit\r\n+this picture is that I am afraid that I have shown in it the secret of\r\n+my own soul.\u0022\r\n+\r\n+Lord Henry laughed. \u0022And what is that?\u0022 he asked.\r\n+\r\n+\u0022I will tell you,\u0022 said Hallward; but an expression of perplexity came\r\n+over his face.\r\n+\r\n+\u0022I am all expectation, Basil,\u0022 continued his companion, glancing at him.\r\n+\r\n+\u0022Oh, there is really very little to tell, Harry,\u0022 answered the painter;\r\n+\u0022and I am afraid you will hardly understand it. Perhaps you will\r\n+hardly believe it.\u0022\r\n+\r\n+Lord Henry smiled, and leaning down, plucked a pink-petalled daisy from\r\n+the grass and examined it. \u0022I am quite sure I shall understand it,\u0022 he\r\n+replied, gazing intently at the little golden, white-feathered disk,\r\n+\u0022and as for believing things, I can believe anything, provided that it\r\n+is quite incredible.\u0022\r\n+\r\n+The wind shook some blossoms from the trees, and the heavy\r\n+lilac-blooms, with their clustering stars, moved to and fro in the\r\n+languid air. A grasshopper began to chirrup by the wall, and like a\r\n+blue thread a long thin dragon-fly floated past on its brown gauze\r\n+wings. Lord Henry felt as if he could hear Basil Hallward's heart\r\n+beating, and wondered what was coming.\r\n+\r\n+\u0022The story is simply this,\u0022 said the painter after some time. \u0022Two\r\n+months ago I went to a crush at Lady Brandon's. You know we poor\r\n+artists have to show ourselves in society from time to time, just to\r\n+remind the public that we are not savages. With an evening coat and a\r\n+white tie, as you told me once, anybody, even a stock-broker, can gain\r\n+a reputation for being civilized. Well, after I had been in the room\r\n+about ten minutes, talking to huge overdressed dowagers and tedious\r\n+academicians, I suddenly became conscious that some one was looking at\r\n+me. I turned half-way round and saw Dorian Gray for the first time.\r\n+When our eyes met, I felt that I was growing pale. A curious sensation\r\n+of terror came over me. I knew that I had come face to face with some\r\n+one whose mere personality was so fascinating that, if I allowed it to\r\n+do so, it would absorb my whole nature, my whole soul, my very art\r\n+itself. I did not want any external influence in my life. You know\r\n+yourself, Harry, how independent I am by nature. I have always been my\r\n+own master; had at least always been so, till I met Dorian Gray.\r\n+Then--but I don't know how to explain it to you. Something seemed to\r\n+tell me that I was on the verge of a terrible crisis in my life. I had\r\n+a strange feeling that fate had in store for me exquisite joys and\r\n+exquisite sorrows. I grew afraid and turned to quit the room. It was\r\n+not conscience that made me do so: it was a sort of cowardice. I take\r\n+no credit to myself for trying to escape.\u0022\r\n+\r\n+\u0022Conscience and cowardice are really the same things, Basil.\r\n+Conscience is the trade-name of the firm. That is all.\u0022\r\n+\r\n+\u0022I don't believe that, Harry, and I don't believe you do either.\r\n+However, whatever was my motive--and it may have been pride, for I used\r\n+to be very proud--I certainly struggled to the door. There, of course,\r\n+I stumbled against Lady Brandon. 'You are not going to run away so\r\n+soon, Mr. Hallward?' she screamed out. You know her curiously shrill\r\n+voice?\u0022\r\n+\r\n+\u0022Yes; she is a peacock in everything but beauty,\u0022 said Lord Henry,\r\n+pulling the daisy to bits with his long nervous fingers.\r\n+\r\n+\u0022I could not get rid of her. She brought me up to royalties, and\r\n+people with stars and garters, and elderly ladies with gigantic tiaras\r\n+and parrot noses. She spoke of me as her dearest friend. I had only\r\n+met her once before, but she took it into her head to lionize me. I\r\n+believe some picture of mine had made a great success at the time, at\r\n+least had been chattered about in the penny newspapers, which is the\r\n+nineteenth-century standard of immortality. Suddenly I found myself\r\n+face to face with the young man whose personality had so strangely\r\n+stirred me. We were quite close, almost touching. Our eyes met again.\r\n+It was reckless of me, but I asked Lady Brandon to introduce me to him.\r\n+Perhaps it was not so reckless, after all. It was simply inevitable.\r\n+We would have spoken to each other without any introduction. I am sure\r\n+of that. Dorian told me so afterwards. He, too, felt that we were\r\n+destined to know each other.\u0022\r\n+\r\n+\u0022And how did Lady Brandon describe this wonderful young man?\u0022 asked his\r\n+companion. \u0022I know she goes in for giving a rapid _precis_ of all her\r\n+guests. I remember her bringing me up to a truculent and red-faced old\r\n+gentleman covered all over with orders and ribbons, and hissing into my\r\n+ear, in a tragic whisper which must have been perfectly audible to\r\n+everybody in the room, the most astounding details. I simply fled. I\r\n+like to find out people for myself. But Lady Brandon treats her guests\r\n+exactly as an auctioneer treats his goods. She either explains them\r\n+entirely away, or tells one everything about them except what one wants\r\n+to know.\u0022\r\n+\r\n+\u0022Poor Lady Brandon! You are hard on her, Harry!\u0022 said Hallward\r\n+listlessly.\r\n+\r\n+\u0022My dear fellow, she tried to found a _salon_, and only succeeded in\r\n+opening a restaurant. How could I admire her? But tell me, what did\r\n+she say about Mr. Dorian Gray?\u0022\r\n+\r\n+\u0022Oh, something like, 'Charming boy--poor dear mother and I absolutely\r\n+inseparable. Quite forget what he does--afraid he--doesn't do\r\n+anything--oh, yes, plays the piano--or is it the violin, dear Mr.\r\n+Gray?' Neither of us could help laughing, and we became friends at\r\n+once.\u0022\r\n+\r\n+\u0022Laughter is not at all a bad beginning for a friendship, and it is far\r\n+the best ending for one,\u0022 said the young lord, plucking another daisy.\r\n+\r\n+Hallward shook his head. \u0022You don't understand what friendship is,\r\n+Harry,\u0022 he murmured--\u0022or what enmity is, for that matter. You like\r\n+every one; that is to say, you are indifferent to every one.\u0022\r\n+\r\n+\u0022How horribly unjust of you!\u0022 cried Lord Henry, tilting his hat back\r\n+and looking up at the little clouds that, like ravelled skeins of\r\n+glossy white silk, were drifting across the hollowed turquoise of the\r\n+summer sky. \u0022Yes; horribly unjust of you. I make a great difference\r\n+between people. I choose my friends for their good looks, my\r\n+acquaintances for their good characters, and my enemies for their good\r\n+intellects. A man cannot be too careful in the choice of his enemies.\r\n+I have not got one who is a fool. They are all men of some\r\n+intellectual power, and consequently they all appreciate me. Is that\r\n+very vain of me? I think it is rather vain.\u0022\r\n+\r\n+\u0022I should think it was, Harry. But according to your category I must\r\n+be merely an acquaintance.\u0022\r\n+\r\n+\u0022My dear old Basil, you are much more than an acquaintance.\u0022\r\n+\r\n+\u0022And much less than a friend. A sort of brother, I suppose?\u0022\r\n+\r\n+\u0022Oh, brothers! I don't care for brothers. My elder brother won't die,\r\n+and my younger brothers seem never to do anything else.\u0022\r\n+\r\n+\u0022Harry!\u0022 exclaimed Hallward, frowning.\r\n+\r\n+\u0022My dear fellow, I am not quite serious. But I can't help detesting my\r\n+relations. I suppose it comes from the fact that none of us can stand\r\n+other people having the same faults as ourselves. I quite sympathize\r\n+with the rage of the English democracy against what they call the vices\r\n+of the upper orders. The masses feel that drunkenness, stupidity, and\r\n+immorality should be their own special property, and that if any one of\r\n+us makes an ass of himself, he is poaching on their preserves. When\r\n+poor Southwark got into the divorce court, their indignation was quite\r\n+magnificent. And yet I don't suppose that ten per cent of the\r\n+proletariat live correctly.\u0022\r\n+\r\n+\u0022I don't agree with a single word that you have said, and, what is\r\n+more, Harry, I feel sure you don't either.\u0022\r\n+\r\n+Lord Henry stroked his pointed brown beard and tapped the toe of his\r\n+patent-leather boot with a tasselled ebony cane. \u0022How English you are\r\n+Basil! That is the second time you have made that observation. If one\r\n+puts forward an idea to a true Englishman--always a rash thing to\r\n+do--he never dreams of considering whether the idea is right or wrong.\r\n+The only thing he considers of any importance is whether one believes\r\n+it oneself. Now, the value of an idea has nothing whatsoever to do\r\n+with the sincerity of the man who expresses it. Indeed, the\r\n+probabilities are that the more insincere the man is, the more purely\r\n+intellectual will the idea be, as in that case it will not be coloured\r\n+by either his wants, his desires, or his prejudices. However, I don't\r\n+propose to discuss politics, sociology, or metaphysics with you. I\r\n+like persons better than principles, and I like persons with no\r\n+principles better than anything else in the world. Tell me more about\r\n+Mr. Dorian Gray. How often do you see him?\u0022\r\n+\r\n+\u0022Every day. I couldn't be happy if I didn't see him every day. He is\r\n+absolutely necessary to me.\u0022\r\n+\r\n+\u0022How extraordinary! I thought you would never care for anything but\r\n+your art.\u0022\r\n+\r\n+\u0022He is all my art to me now,\u0022 said the painter gravely. \u0022I sometimes\r\n+think, Harry, that there are only two eras of any importance in the\r\n+world's history. The first is the appearance of a new medium for art,\r\n+and the second is the appearance of a new personality for art also.\r\n+What the invention of oil-painting was to the Venetians, the face of\r\n+Antinous was to late Greek sculpture, and the face of Dorian Gray will\r\n+some day be to me. It is not merely that I paint from him, draw from\r\n+him, sketch from him. Of course, I have done all that. But he is much\r\n+more to me than a model or a sitter. I won't tell you that I am\r\n+dissatisfied with what I have done of him, or that his beauty is such\r\n+that art cannot express it. There is nothing that art cannot express,\r\n+and I know that the work I have done, since I met Dorian Gray, is good\r\n+work, is the best work of my life. But in some curious way--I wonder\r\n+will you understand me?--his personality has suggested to me an\r\n+entirely new manner in art, an entirely new mode of style. I see\r\n+things differently, I think of them differently. I can now recreate\r\n+life in a way that was hidden from me before. 'A dream of form in days\r\n+of thought'--who is it who says that? I forget; but it is what Dorian\r\n+Gray has been to me. The merely visible presence of this lad--for he\r\n+seems to me little more than a lad, though he is really over\r\n+twenty--his merely visible presence--ah! I wonder can you realize all\r\n+that that means? Unconsciously he defines for me the lines of a fresh\r\n+school, a school that is to have in it all the passion of the romantic\r\n+spirit, all the perfection of the spirit that is Greek. The harmony of\r\n+soul and body--how much that is! We in our madness have separated the\r\n+two, and have invented a realism that is vulgar, an ideality that is\r\n+void. Harry! if you only knew what Dorian Gray is to me! You remember\r\n+that landscape of mine, for which Agnew offered me such a huge price\r\n+but which I would not part with? It is one of the best things I have\r\n+ever done. And why is it so? Because, while I was painting it, Dorian\r\n+Gray sat beside me. Some subtle influence passed from him to me, and\r\n+for the first time in my life I saw in the plain woodland the wonder I\r\n+had always looked for and always missed.\u0022\r\n+\r\n+\u0022Basil, this is extraordinary! I must see Dorian Gray.\u0022\r\n+\r\n+Hallward got up from the seat and walked up and down the garden. After\r\n+some time he came back. \u0022Harry,\u0022 he said, \u0022Dorian Gray is to me simply\r\n+a motive in art. You might see nothing in him. I see everything in\r\n+him. He is never more present in my work than when no image of him is\r\n+there. He is a suggestion, as I have said, of a new manner. I find\r\n+him in the curves of certain lines, in the loveliness and subtleties of\r\n+certain colours. That is all.\u0022\r\n+\r\n+\u0022Then why won't you exhibit his portrait?\u0022 asked Lord Henry.\r\n+\r\n+\u0022Because, without intending it, I have put into it some expression of\r\n+all this curious artistic idolatry, of which, of course, I have never\r\n+cared to speak to him. He knows nothing about it. He shall never know\r\n+anything about it. But the world might guess it, and I will not bare\r\n+my soul to their shallow prying eyes. My heart shall never be put\r\n+under their microscope. There is too much of myself in the thing,\r\n+Harry--too much of myself!\u0022\r\n+\r\n+\u0022Poets are not so scrupulous as you are. They know how useful passion\r\n+is for publication. Nowadays a broken heart will run to many editions.\u0022\r\n+\r\n+\u0022I hate them for it,\u0022 cried Hallward. \u0022An artist should create\r\n+beautiful things, but should put nothing of his own life into them. We\r\n+live in an age when men treat art as if it were meant to be a form of\r\n+autobiography. We have lost the abstract sense of beauty. Some day I\r\n+will show the world what it is; and for that reason the world shall\r\n+never see my portrait of Dorian Gray.\u0022\r\n+\r\n+\u0022I think you are wrong, Basil, but I won't argue with you. It is only\r\n+the intellectually lost who ever argue. Tell me, is Dorian Gray very\r\n+fond of you?\u0022\r\n+\r\n+The painter considered for a few moments. \u0022He likes me,\u0022 he answered\r\n+after a pause; \u0022I know he likes me. Of course I flatter him\r\n+dreadfully. I find a strange pleasure in saying things to him that I\r\n+know I shall be sorry for having said. As a rule, he is charming to\r\n+me, and we sit in the studio and talk of a thousand things. Now and\r\n+then, however, he is horribly thoughtless, and seems to take a real\r\n+delight in giving me pain. Then I feel, Harry, that I have given away\r\n+my whole soul to some one who treats it as if it were a flower to put\r\n+in his coat, a bit of decoration to charm his vanity, an ornament for a\r\n+summer's day.\u0022\r\n+\r\n+\u0022Days in summer, Basil, are apt to linger,\u0022 murmured Lord Henry.\r\n+\u0022Perhaps you will tire sooner than he will. It is a sad thing to think\r\n+of, but there is no doubt that genius lasts longer than beauty. That\r\n+accounts for the fact that we all take such pains to over-educate\r\n+ourselves. In the wild struggle for existence, we want to have\r\n+something that endures, and so we fill our minds with rubbish and\r\n+facts, in the silly hope of keeping our place. The thoroughly\r\n+well-informed man--that is the modern ideal. And the mind of the\r\n+thoroughly well-informed man is a dreadful thing. It is like a\r\n+_bric-a-brac_ shop, all monsters and dust, with everything priced above\r\n+its proper value. I think you will tire first, all the same. Some day\r\n+you will look at your friend, and he will seem to you to be a little\r\n+out of drawing, or you won't like his tone of colour, or something.\r\n+You will bitterly reproach him in your own heart, and seriously think\r\n+that he has behaved very badly to you. The next time he calls, you\r\n+will be perfectly cold and indifferent. It will be a great pity, for\r\n+it will alter you. What you have told me is quite a romance, a romance\r\n+of art one might call it, and the worst of having a romance of any kind\r\n+is that it leaves one so unromantic.\u0022\r\n+\r\n+\u0022Harry, don't talk like that. As long as I live, the personality of\r\n+Dorian Gray will dominate me. You can't feel what I feel. You change\r\n+too often.\u0022\r\n+\r\n+\u0022Ah, my dear Basil, that is exactly why I can feel it. Those who are\r\n+faithful know only the trivial side of love: it is the faithless who\r\n+know love's tragedies.\u0022 And Lord Henry struck a light on a dainty\r\n+silver case and began to smoke a cigarette with a self-conscious and\r\n+satisfied air, as if he had summed up the world in a phrase. There was\r\n+a rustle of chirruping sparrows in the green lacquer leaves of the ivy,\r\n+and the blue cloud-shadows chased themselves across the grass like\r\n+swallows. How pleasant it was in the garden! And how delightful other\r\n+people's emotions were!--much more delightful than their ideas, it\r\n+seemed to him. One's own soul, and the passions of one's\r\n+friends--those were the fascinating things in life. He pictured to\r\n+himself with silent amusement the tedious luncheon that he had missed\r\n+by staying so long with Basil Hallward. Had he gone to his aunt's, he\r\n+would have been sure to have met Lord Goodbody there, and the whole\r\n+conversation would have been about the feeding of the poor and the\r\n+necessity for model lodging-houses. Each class would have preached the\r\n+importance of those virtues, for whose exercise there was no necessity\r\n+in their own lives. The rich would have spoken on the value of thrift,\r\n+and the idle grown eloquent over the dignity of labour. It was\r\n+charming to have escaped all that! As he thought of his aunt, an idea\r\n+seemed to strike him. He turned to Hallward and said, \u0022My dear fellow,\r\n+I have just remembered.\u0022\r\n+\r\n+\u0022Remembered what, Harry?\u0022\r\n+\r\n+\u0022Where I heard the name of Dorian Gray.\u0022\r\n+\r\n+\u0022Where was it?\u0022 asked Hallward, with a slight frown.\r\n+\r\n+\u0022Don't look so angry, Basil. It was at my aunt, Lady Agatha's. She\r\n+told me she had discovered a wonderful young man who was going to help\r\n+her in the East End, and that his name was Dorian Gray. I am bound to\r\n+state that she never told me he was good-looking. Women have no\r\n+appreciation of good looks; at least, good women have not. She said\r\n+that he was very earnest and had a beautiful nature. I at once\r\n+pictured to myself a creature with spectacles and lank hair, horribly\r\n+freckled, and tramping about on huge feet. I wish I had known it was\r\n+your friend.\u0022\r\n+\r\n+\u0022I am very glad you didn't, Harry.\u0022\r\n+\r\n+\u0022Why?\u0022\r\n+\r\n+\u0022I don't want you to meet him.\u0022\r\n+\r\n+\u0022You don't want me to meet him?\u0022\r\n+\r\n+\u0022No.\u0022\r\n+\r\n+\u0022Mr. Dorian Gray is in the studio, sir,\u0022 said the butler, coming into\r\n+the garden.\r\n+\r\n+\u0022You must introduce me now,\u0022 cried Lord Henry, laughing.\r\n+\r\n+The painter turned to his servant, who stood blinking in the sunlight.\r\n+\u0022Ask Mr. Gray to wait, Parker: I shall be in in a few moments.\u0022 The\r\n+man bowed and went up the walk.\r\n+\r\n+Then he looked at Lord Henry. \u0022Dorian Gray is my dearest friend,\u0022 he\r\n+said. \u0022He has a simple and a beautiful nature. Your aunt was quite\r\n+right in what she said of him. Don't spoil him. Don't try to\r\n+influence him. Your influence would be bad. The world is wide, and\r\n+has many marvellous people in it. Don't take away from me the one\r\n+person who gives to my art whatever charm it possesses: my life as an\r\n+artist depends on him. Mind, Harry, I trust you.\u0022 He spoke very\r\n+slowly, and the words seemed wrung out of him almost against his will.\r\n+\r\n+\u0022What nonsense you talk!\u0022 said Lord Henry, smiling, and taking Hallward\r\n+by the arm, he almost led him into the house.\r\n+\r\n+\r\n+\r\n+CHAPTER 2\r\n+\r\n+As they entered they saw Dorian Gray. He was seated at the piano, with\r\n+his back to them, turning over the pages of a volume of Schumann's\r\n+\u0022Forest Scenes.\u0022 \u0022You must lend me these, Basil,\u0022 he cried. \u0022I want\r\n+to learn them. They are perfectly charming.\u0022\r\n+\r\n+\u0022That entirely depends on how you sit to-day, Dorian.\u0022\r\n+\r\n+\u0022Oh, I am tired of sitting, and I don't want a life-sized portrait of\r\n+myself,\u0022 answered the lad, swinging round on the music-stool in a\r\n+wilful, petulant manner. When he caught sight of Lord Henry, a faint\r\n+blush coloured his cheeks for a moment, and he started up. \u0022I beg your\r\n+pardon, Basil, but I didn't know you had any one with you.\u0022\r\n+\r\n+\u0022This is Lord Henry Wotton, Dorian, an old Oxford friend of mine. I\r\n+have just been telling him what a capital sitter you were, and now you\r\n+have spoiled everything.\u0022\r\n+\r\n+\u0022You have not spoiled my pleasure in meeting you, Mr. Gray,\u0022 said Lord\r\n+Henry, stepping forward and extending his hand. \u0022My aunt has often\r\n+spoken to me about you. You are one of her favourites, and, I am\r\n+afraid, one of her victims also.\u0022\r\n+\r\n+\u0022I am in Lady Agatha's black books at present,\u0022 answered Dorian with a\r\n+funny look of penitence. \u0022I promised to go to a club in Whitechapel\r\n+with her last Tuesday, and I really forgot all about it. We were to\r\n+have played a duet together--three duets, I believe. I don't know what\r\n+she will say to me. I am far too frightened to call.\u0022\r\n+\r\n+\u0022Oh, I will make your peace with my aunt. She is quite devoted to you.\r\n+And I don't think it really matters about your not being there. The\r\n+audience probably thought it was a duet. When Aunt Agatha sits down to\r\n+the piano, she makes quite enough noise for two people.\u0022\r\n+\r\n+\u0022That is very horrid to her, and not very nice to me,\u0022 answered Dorian,\r\n+laughing.\r\n+\r\n+Lord Henry looked at him. Yes, he was certainly wonderfully handsome,\r\n+with his finely curved scarlet lips, his frank blue eyes, his crisp\r\n+gold hair. There was something in his face that made one trust him at\r\n+once. All the candour of youth was there, as well as all youth's\r\n+passionate purity. One felt that he had kept himself unspotted from\r\n+the world. No wonder Basil Hallward worshipped him.\r\n+\r\n+\u0022You are too charming to go in for philanthropy, Mr. Gray--far too\r\n+charming.\u0022 And Lord Henry flung himself down on the divan and opened\r\n+his cigarette-case.\r\n+\r\n+The painter had been busy mixing his colours and getting his brushes\r\n+ready. He was looking worried, and when he heard Lord Henry's last\r\n+remark, he glanced at him, hesitated for a moment, and then said,\r\n+\u0022Harry, I want to finish this picture to-day. Would you think it\r\n+awfully rude of me if I asked you to go away?\u0022\r\n+\r\n+Lord Henry smiled and looked at Dorian Gray. \u0022Am I to go, Mr. Gray?\u0022\r\n+he asked.\r\n+\r\n+\u0022Oh, please don't, Lord Henry. I see that Basil is in one of his sulky\r\n+moods, and I can't bear him when he sulks. Besides, I want you to tell\r\n+me why I should not go in for philanthropy.\u0022\r\n+\r\n+\u0022I don't know that I shall tell you that, Mr. Gray. It is so tedious a\r\n+subject that one would have to talk seriously about it. But I\r\n+certainly shall not run away, now that you have asked me to stop. You\r\n+don't really mind, Basil, do you? You have often told me that you\r\n+liked your sitters to have some one to chat to.\u0022\r\n+\r\n+Hallward bit his lip. \u0022If Dorian wishes it, of course you must stay.\r\n+Dorian's whims are laws to everybody, except himself.\u0022\r\n+\r\n+Lord Henry took up his hat and gloves. \u0022You are very pressing, Basil,\r\n+but I am afraid I must go. I have promised to meet a man at the\r\n+Orleans. Good-bye, Mr. Gray. Come and see me some afternoon in Curzon\r\n+Street. I am nearly always at home at five o'clock. Write to me when\r\n+you are coming. I should be sorry to miss you.\u0022\r\n+\r\n+\u0022Basil,\u0022 cried Dorian Gray, \u0022if Lord Henry Wotton goes, I shall go,\r\n+too. You never open your lips while you are painting, and it is\r\n+horribly dull standing on a platform and trying to look pleasant. Ask\r\n+him to stay. I insist upon it.\u0022\r\n+\r\n+\u0022Stay, Harry, to oblige Dorian, and to oblige me,\u0022 said Hallward,\r\n+gazing intently at his picture. \u0022It is quite true, I never talk when I\r\n+am working, and never listen either, and it must be dreadfully tedious\r\n+for my unfortunate sitters. I beg you to stay.\u0022\r\n+\r\n+\u0022But what about my man at the Orleans?\u0022\r\n+\r\n+The painter laughed. \u0022I don't think there will be any difficulty about\r\n+that. Sit down again, Harry. And now, Dorian, get up on the platform,\r\n+and don't move about too much, or pay any attention to what Lord Henry\r\n+says. He has a very bad influence over all his friends, with the\r\n+single exception of myself.\u0022\r\n+\r\n+Dorian Gray stepped up on the dais with the air of a young Greek\r\n+martyr, and made a little _moue_ of discontent to Lord Henry, to whom he\r\n+had rather taken a fancy. He was so unlike Basil. They made a\r\n+delightful contrast. And he had such a beautiful voice. After a few\r\n+moments he said to him, \u0022Have you really a very bad influence, Lord\r\n+Henry? As bad as Basil says?\u0022\r\n+\r\n+\u0022There is no such thing as a good influence, Mr. Gray. All influence\r\n+is immoral--immoral from the scientific point of view.\u0022\r\n+\r\n+\u0022Why?\u0022\r\n+\r\n+\u0022Because to influence a person is to give him one's own soul. He does\r\n+not think his natural thoughts, or burn with his natural passions. His\r\n+virtues are not real to him. His sins, if there are such things as\r\n+sins, are borrowed. He becomes an echo of some one else's music, an\r\n+actor of a part that has not been written for him. The aim of life is\r\n+self-development. To realize one's nature perfectly--that is what each\r\n+of us is here for. People are afraid of themselves, nowadays. They\r\n+have forgotten the highest of all duties, the duty that one owes to\r\n+one's self. Of course, they are charitable. They feed the hungry and\r\n+clothe the beggar. But their own souls starve, and are naked. Courage\r\n+has gone out of our race. Perhaps we never really had it. The terror\r\n+of society, which is the basis of morals, the terror of God, which is\r\n+the secret of religion--these are the two things that govern us. And\r\n+yet--\u0022\r\n+\r\n+\u0022Just turn your head a little more to the right, Dorian, like a good\r\n+boy,\u0022 said the painter, deep in his work and conscious only that a look\r\n+had come into the lad's face that he had never seen there before.\r\n+\r\n+\u0022And yet,\u0022 continued Lord Henry, in his low, musical voice, and with\r\n+that graceful wave of the hand that was always so characteristic of\r\n+him, and that he had even in his Eton days, \u0022I believe that if one man\r\n+were to live out his life fully and completely, were to give form to\r\n+every feeling, expression to every thought, reality to every dream--I\r\n+believe that the world would gain such a fresh impulse of joy that we\r\n+would forget all the maladies of mediaevalism, and return to the\r\n+Hellenic ideal--to something finer, richer than the Hellenic ideal, it\r\n+may be. But the bravest man amongst us is afraid of himself. The\r\n+mutilation of the savage has its tragic survival in the self-denial\r\n+that mars our lives. We are punished for our refusals. Every impulse\r\n+that we strive to strangle broods in the mind and poisons us. The body\r\n+sins once, and has done with its sin, for action is a mode of\r\n+purification. Nothing remains then but the recollection of a pleasure,\r\n+or the luxury of a regret. The only way to get rid of a temptation is\r\n+to yield to it. Resist it, and your soul grows sick with longing for\r\n+the things it has forbidden to itself, with desire for what its\r\n+monstrous laws have made monstrous and unlawful. It has been said that\r\n+the great events of the world take place in the brain. It is in the\r\n+brain, and the brain only, that the great sins of the world take place\r\n+also. You, Mr. Gray, you yourself, with your rose-red youth and your\r\n+rose-white boyhood, you have had passions that have made you afraid,\r\n+thoughts that have filled you with terror, day-dreams and sleeping\r\n+dreams whose mere memory might stain your cheek with shame--\u0022\r\n+\r\n+\u0022Stop!\u0022 faltered Dorian Gray, \u0022stop! you bewilder me. I don't know\r\n+what to say. There is some answer to you, but I cannot find it. Don't\r\n+speak. Let me think. Or, rather, let me try not to think.\u0022\r\n+\r\n+For nearly ten minutes he stood there, motionless, with parted lips and\r\n+eyes strangely bright. He was dimly conscious that entirely fresh\r\n+influences were at work within him. Yet they seemed to him to have\r\n+come really from himself. The few words that Basil's friend had said\r\n+to him--words spoken by chance, no doubt, and with wilful paradox in\r\n+them--had touched some secret chord that had never been touched before,\r\n+but that he felt was now vibrating and throbbing to curious pulses.\r\n+\r\n+Music had stirred him like that. Music had troubled him many times.\r\n+But music was not articulate. It was not a new world, but rather\r\n+another chaos, that it created in us. Words! Mere words! How\r\n+terrible they were! How clear, and vivid, and cruel! One could not\r\n+escape from them. And yet what a subtle magic there was in them! They\r\n+seemed to be able to give a plastic form to formless things, and to\r\n+have a music of their own as sweet as that of viol or of lute. Mere\r\n+words! Was there anything so real as words?\r\n+\r\n+Yes; there had been things in his boyhood that he had not understood.\r\n+He understood them now. Life suddenly became fiery-coloured to him.\r\n+It seemed to him that he had been walking in fire. Why had he not\r\n+known it?\r\n+\r\n+With his subtle smile, Lord Henry watched him. He knew the precise\r\n+psychological moment when to say nothing. He felt intensely\r\n+interested. He was amazed at the sudden impression that his words had\r\n+produced, and, remembering a book that he had read when he was sixteen,\r\n+a book which had revealed to him much that he had not known before, he\r\n+wondered whether Dorian Gray was passing through a similar experience.\r\n+He had merely shot an arrow into the air. Had it hit the mark? How\r\n+fascinating the lad was!\r\n+\r\n+Hallward painted away with that marvellous bold touch of his, that had\r\n+the true refinement and perfect delicacy that in art, at any rate comes\r\n+only from strength. He was unconscious of the silence.\r\n+\r\n+\u0022Basil, I am tired of standing,\u0022 cried Dorian Gray suddenly. \u0022I must\r\n+go out and sit in the garden. The air is stifling here.\u0022\r\n+\r\n+\u0022My dear fellow, I am so sorry. When I am painting, I can't think of\r\n+anything else. But you never sat better. You were perfectly still.\r\n+And I have caught the effect I wanted--the half-parted lips and the\r\n+bright look in the eyes. I don't know what Harry has been saying to\r\n+you, but he has certainly made you have the most wonderful expression.\r\n+I suppose he has been paying you compliments. You mustn't believe a\r\n+word that he says.\u0022\r\n+\r\n+\u0022He has certainly not been paying me compliments. Perhaps that is the\r\n+reason that I don't believe anything he has told me.\u0022\r\n+\r\n+\u0022You know you believe it all,\u0022 said Lord Henry, looking at him with his\r\n+dreamy languorous eyes. \u0022I will go out to the garden with you. It is\r\n+horribly hot in the studio. Basil, let us have something iced to\r\n+drink, something with strawberries in it.\u0022\r\n+\r\n+\u0022Certainly, Harry. Just touch the bell, and when Parker comes I will\r\n+tell him what you want. I have got to work up this background, so I\r\n+will join you later on. Don't keep Dorian too long. I have never been\r\n+in better form for painting than I am to-day. This is going to be my\r\n+masterpiece. It is my masterpiece as it stands.\u0022\r\n+\r\n+Lord Henry went out to the garden and found Dorian Gray burying his\r\n+face in the great cool lilac-blossoms, feverishly drinking in their\r\n+perfume as if it had been wine. He came close to him and put his hand\r\n+upon his shoulder. \u0022You are quite right to do that,\u0022 he murmured.\r\n+\u0022Nothing can cure the soul but the senses, just as nothing can cure the\r\n+senses but the soul.\u0022\r\n+\r\n+The lad started and drew back. He was bareheaded, and the leaves had\r\n+tossed his rebellious curls and tangled all their gilded threads.\r\n+There was a look of fear in his eyes, such as people have when they are\r\n+suddenly awakened. His finely chiselled nostrils quivered, and some\r\n+hidden nerve shook the scarlet of his lips and left them trembling.\r\n+\r\n+\u0022Yes,\u0022 continued Lord Henry, \u0022that is one of the great secrets of\r\n+life--to cure the soul by means of the senses, and the senses by means\r\n+of the soul. You are a wonderful creation. You know more than you\r\n+think you know, just as you know less than you want to know.\u0022\r\n+\r\n+Dorian Gray frowned and turned his head away. He could not help liking\r\n+the tall, graceful young man who was standing by him. His romantic,\r\n+olive-coloured face and worn expression interested him. There was\r\n+something in his low languid voice that was absolutely fascinating.\r\n+His cool, white, flowerlike hands, even, had a curious charm. They\r\n+moved, as he spoke, like music, and seemed to have a language of their\r\n+own. But he felt afraid of him, and ashamed of being afraid. Why had\r\n+it been left for a stranger to reveal him to himself? He had known\r\n+Basil Hallward for months, but the friendship between them had never\r\n+altered him. Suddenly there had come some one across his life who\r\n+seemed to have disclosed to him life's mystery. And, yet, what was\r\n+there to be afraid of? He was not a schoolboy or a girl. It was\r\n+absurd to be frightened.\r\n+\r\n+\u0022Let us go and sit in the shade,\u0022 said Lord Henry. \u0022Parker has brought\r\n+out the drinks, and if you stay any longer in this glare, you will be\r\n+quite spoiled, and Basil will never paint you again. You really must\r\n+not allow yourself to become sunburnt. It would be unbecoming.\u0022\r\n+\r\n+\u0022What can it matter?\u0022 cried Dorian Gray, laughing, as he sat down on\r\n+the seat at the end of the garden.\r\n+\r\n+\u0022It should matter everything to you, Mr. Gray.\u0022\r\n+\r\n+\u0022Why?\u0022\r\n+\r\n+\u0022Because you have the most marvellous youth, and youth is the one thing\r\n+worth having.\u0022\r\n+\r\n+\u0022I don't feel that, Lord Henry.\u0022\r\n+\r\n+\u0022No, you don't feel it now. Some day, when you are old and wrinkled\r\n+and ugly, when thought has seared your forehead with its lines, and\r\n+passion branded your lips with its hideous fires, you will feel it, you\r\n+will feel it terribly. Now, wherever you go, you charm the world.\r\n+Will it always be so? ... You have a wonderfully beautiful face, Mr.\r\n+Gray. Don't frown. You have. And beauty is a form of genius--is\r\n+higher, indeed, than genius, as it needs no explanation. It is of the\r\n+great facts of the world, like sunlight, or spring-time, or the\r\n+reflection in dark waters of that silver shell we call the moon. It\r\n+cannot be questioned. It has its divine right of sovereignty. It\r\n+makes princes of those who have it. You smile? Ah! when you have lost\r\n+it you won't smile.... People say sometimes that beauty is only\r\n+superficial. That may be so, but at least it is not so superficial as\r\n+thought is. To me, beauty is the wonder of wonders. It is only\r\n+shallow people who do not judge by appearances. The true mystery of\r\n+the world is the visible, not the invisible.... Yes, Mr. Gray, the\r\n+gods have been good to you. But what the gods give they quickly take\r\n+away. You have only a few years in which to live really, perfectly,\r\n+and fully. When your youth goes, your beauty will go with it, and then\r\n+you will suddenly discover that there are no triumphs left for you, or\r\n+have to content yourself with those mean triumphs that the memory of\r\n+your past will make more bitter than defeats. Every month as it wanes\r\n+brings you nearer to something dreadful. Time is jealous of you, and\r\n+wars against your lilies and your roses. You will become sallow, and\r\n+hollow-cheeked, and dull-eyed. You will suffer horribly.... Ah!\r\n+realize your youth while you have it. Don't squander the gold of your\r\n+days, listening to the tedious, trying to improve the hopeless failure,\r\n+or giving away your life to the ignorant, the common, and the vulgar.\r\n+These are the sickly aims, the false ideals, of our age. Live! Live\r\n+the wonderful life that is in you! Let nothing be lost upon you. Be\r\n+always searching for new sensations. Be afraid of nothing.... A new\r\n+Hedonism--that is what our century wants. You might be its visible\r\n+symbol. With your personality there is nothing you could not do. The\r\n+world belongs to you for a season.... The moment I met you I saw that\r\n+you were quite unconscious of what you really are, of what you really\r\n+might be. There was so much in you that charmed me that I felt I must\r\n+tell you something about yourself. I thought how tragic it would be if\r\n+you were wasted. For there is such a little time that your youth will\r\n+last--such a little time. The common hill-flowers wither, but they\r\n+blossom again. The laburnum will be as yellow next June as it is now.\r\n+In a month there will be purple stars on the clematis, and year after\r\n+year the green night of its leaves will hold its purple stars. But we\r\n+never get back our youth. The pulse of joy that beats in us at twenty\r\n+becomes sluggish. Our limbs fail, our senses rot. We degenerate into\r\n+hideous puppets, haunted by the memory of the passions of which we were\r\n+too much afraid, and the exquisite temptations that we had not the\r\n+courage to yield to. Youth! Youth! There is absolutely nothing in\r\n+the world but youth!\u0022\r\n+\r\n+Dorian Gray listened, open-eyed and wondering. The spray of lilac fell\r\n+from his hand upon the gravel. A furry bee came and buzzed round it\r\n+for a moment. Then it began to scramble all over the oval stellated\r\n+globe of the tiny blossoms. He watched it with that strange interest\r\n+in trivial things that we try to develop when things of high import\r\n+make us afraid, or when we are stirred by some new emotion for which we\r\n+cannot find expression, or when some thought that terrifies us lays\r\n+sudden siege to the brain and calls on us to yield. After a time the\r\n+bee flew away. He saw it creeping into the stained trumpet of a Tyrian\r\n+convolvulus. The flower seemed to quiver, and then swayed gently to\r\n+and fro.\r\n+\r\n+Suddenly the painter appeared at the door of the studio and made\r\n+staccato signs for them to come in. They turned to each other and\r\n+smiled.\r\n+\r\n+\u0022I am waiting,\u0022 he cried. \u0022Do come in. The light is quite perfect,\r\n+and you can bring your drinks.\u0022\r\n+\r\n+They rose up and sauntered down the walk together. Two green-and-white\r\n+butterflies fluttered past them, and in the pear-tree at the corner of\r\n+the garden a thrush began to sing.\r\n+\r\n+\u0022You are glad you have met me, Mr. Gray,\u0022 said Lord Henry, looking at\r\n+him.\r\n+\r\n+\u0022Yes, I am glad now. I wonder shall I always be glad?\u0022\r\n+\r\n+\u0022Always! That is a dreadful word. It makes me shudder when I hear it.\r\n+Women are so fond of using it. They spoil every romance by trying to\r\n+make it last for ever. It is a meaningless word, too. The only\r\n+difference between a caprice and a lifelong passion is that the caprice\r\n+lasts a little longer.\u0022\r\n+\r\n+As they entered the studio, Dorian Gray put his hand upon Lord Henry's\r\n+arm. \u0022In that case, let our friendship be a caprice,\u0022 he murmured,\r\n+flushing at his own boldness, then stepped up on the platform and\r\n+resumed his pose.\r\n+\r\n+Lord Henry flung himself into a large wicker arm-chair and watched him.\r\n+The sweep and dash of the brush on the canvas made the only sound that\r\n+broke the stillness, except when, now and then, Hallward stepped back\r\n+to look at his work from a distance. In the slanting beams that\r\n+streamed through the open doorway the dust danced and was golden. The\r\n+heavy scent of the roses seemed to brood over everything.\r\n+\r\n+After about a quarter of an hour Hallward stopped painting, looked for\r\n+a long time at Dorian Gray, and then for a long time at the picture,\r\n+biting the end of one of his huge brushes and frowning. \u0022It is quite\r\n+finished,\u0022 he cried at last, and stooping down he wrote his name in\r\n+long vermilion letters on the left-hand corner of the canvas.\r\n+\r\n+Lord Henry came over and examined the picture. It was certainly a\r\n+wonderful work of art, and a wonderful likeness as well.\r\n+\r\n+\u0022My dear fellow, I congratulate you most warmly,\u0022 he said. \u0022It is the\r\n+finest portrait of modern times. Mr. Gray, come over and look at\r\n+yourself.\u0022\r\n+\r\n+The lad started, as if awakened from some dream.\r\n+\r\n+\u0022Is it really finished?\u0022 he murmured, stepping down from the platform.\r\n+\r\n+\u0022Quite finished,\u0022 said the painter. \u0022And you have sat splendidly\r\n+to-day. I am awfully obliged to you.\u0022\r\n+\r\n+\u0022That is entirely due to me,\u0022 broke in Lord Henry. \u0022Isn't it, Mr.\r\n+Gray?\u0022\r\n+\r\n+Dorian made no answer, but passed listlessly in front of his picture\r\n+and turned towards it. When he saw it he drew back, and his cheeks\r\n+flushed for a moment with pleasure. A look of joy came into his eyes,\r\n+as if he had recognized himself for the first time. He stood there\r\n+motionless and in wonder, dimly conscious that Hallward was speaking to\r\n+him, but not catching the meaning of his words. The sense of his own\r\n+beauty came on him like a revelation. He had never felt it before.\r\n+Basil Hallward's compliments had seemed to him to be merely the\r\n+charming exaggeration of friendship. He had listened to them, laughed\r\n+at them, forgotten them. They had not influenced his nature. Then had\r\n+come Lord Henry Wotton with his strange panegyric on youth, his\r\n+terrible warning of its brevity. That had stirred him at the time, and\r\n+now, as he stood gazing at the shadow of his own loveliness, the full\r\n+reality of the description flashed across him. Yes, there would be a\r\n+day when his face would be wrinkled and wizen, his eyes dim and\r\n+colourless, the grace of his figure broken and deformed. The scarlet\r\n+would pass away from his lips and the gold steal from his hair. The\r\n+life that was to make his soul would mar his body. He would become\r\n+dreadful, hideous, and uncouth.\r\n+\r\n+As he thought of it, a sharp pang of pain struck through him like a\r\n+knife and made each delicate fibre of his nature quiver. His eyes\r\n+deepened into amethyst, and across them came a mist of tears. He felt\r\n+as if a hand of ice had been laid upon his heart.\r\n+\r\n+\u0022Don't you like it?\u0022 cried Hallward at last, stung a little by the\r\n+lad's silence, not understanding what it meant.\r\n+\r\n+\u0022Of course he likes it,\u0022 said Lord Henry. \u0022Who wouldn't like it? It\r\n+is one of the greatest things in modern art. I will give you anything\r\n+you like to ask for it. I must have it.\u0022\r\n+\r\n+\u0022It is not my property, Harry.\u0022\r\n+\r\n+\u0022Whose property is it?\u0022\r\n+\r\n+\u0022Dorian's, of course,\u0022 answered the painter.\r\n+\r\n+\u0022He is a very lucky fellow.\u0022\r\n+\r\n+\u0022How sad it is!\u0022 murmured Dorian Gray with his eyes still fixed upon\r\n+his own portrait. \u0022How sad it is! I shall grow old, and horrible, and\r\n+dreadful. But this picture will remain always young. It will never be\r\n+older than this particular day of June.... If it were only the other\r\n+way! If it were I who was to be always young, and the picture that was\r\n+to grow old! For that--for that--I would give everything! Yes, there\r\n+is nothing in the whole world I would not give! I would give my soul\r\n+for that!\u0022\r\n+\r\n+\u0022You would hardly care for such an arrangement, Basil,\u0022 cried Lord\r\n+Henry, laughing. \u0022It would be rather hard lines on your work.\u0022\r\n+\r\n+\u0022I should object very strongly, Harry,\u0022 said Hallward.\r\n+\r\n+Dorian Gray turned and looked at him. \u0022I believe you would, Basil.\r\n+You like your art better than your friends. I am no more to you than a\r\n+green bronze figure. Hardly as much, I dare say.\u0022\r\n+\r\n+The painter stared in amazement. It was so unlike Dorian to speak like\r\n+that. What had happened? He seemed quite angry. His face was flushed\r\n+and his cheeks burning.\r\n+\r\n+\u0022Yes,\u0022 he continued, \u0022I am less to you than your ivory Hermes or your\r\n+silver Faun. You will like them always. How long will you like me?\r\n+Till I have my first wrinkle, I suppose. I know, now, that when one\r\n+loses one's good looks, whatever they may be, one loses everything.\r\n+Your picture has taught me that. Lord Henry Wotton is perfectly right.\r\n+Youth is the only thing worth having. When I find that I am growing\r\n+old, I shall kill myself.\u0022\r\n+\r\n+Hallward turned pale and caught his hand. \u0022Dorian! Dorian!\u0022 he cried,\r\n+\u0022don't talk like that. I have never had such a friend as you, and I\r\n+shall never have such another. You are not jealous of material things,\r\n+are you?--you who are finer than any of them!\u0022\r\n+\r\n+\u0022I am jealous of everything whose beauty does not die. I am jealous of\r\n+the portrait you have painted of me. Why should it keep what I must\r\n+lose? Every moment that passes takes something from me and gives\r\n+something to it. Oh, if it were only the other way! If the picture\r\n+could change, and I could be always what I am now! Why did you paint\r\n+it? It will mock me some day--mock me horribly!\u0022 The hot tears welled\r\n+into his eyes; he tore his hand away and, flinging himself on the\r\n+divan, he buried his face in the cushions, as though he was praying.\r\n+\r\n+\u0022This is your doing, Harry,\u0022 said the painter bitterly.\r\n+\r\n+Lord Henry shrugged his shoulders. \u0022It is the real Dorian Gray--that\r\n+is all.\u0022\r\n+\r\n+\u0022It is not.\u0022\r\n+\r\n+\u0022If it is not, what have I to do with it?\u0022\r\n+\r\n+\u0022You should have gone away when I asked you,\u0022 he muttered.\r\n+\r\n+\u0022I stayed when you asked me,\u0022 was Lord Henry's answer.\r\n+\r\n+\u0022Harry, I can't quarrel with my two best friends at once, but between\r\n+you both you have made me hate the finest piece of work I have ever\r\n+done, and I will destroy it. What is it but canvas and colour? I will\r\n+not let it come across our three lives and mar them.\u0022\r\n+\r\n+Dorian Gray lifted his golden head from the pillow, and with pallid\r\n+face and tear-stained eyes, looked at him as he walked over to the deal\r\n+painting-table that was set beneath the high curtained window. What\r\n+was he doing there? His fingers were straying about among the litter\r\n+of tin tubes and dry brushes, seeking for something. Yes, it was for\r\n+the long palette-knife, with its thin blade of lithe steel. He had\r\n+found it at last. He was going to rip up the canvas.\r\n+\r\n+With a stifled sob the lad leaped from the couch, and, rushing over to\r\n+Hallward, tore the knife out of his hand, and flung it to the end of\r\n+the studio. \u0022Don't, Basil, don't!\u0022 he cried. \u0022It would be murder!\u0022\r\n+\r\n+\u0022I am glad you appreciate my work at last, Dorian,\u0022 said the painter\r\n+coldly when he had recovered from his surprise. \u0022I never thought you\r\n+would.\u0022\r\n+\r\n+\u0022Appreciate it? I am in love with it, Basil. It is part of myself. I\r\n+feel that.\u0022\r\n+\r\n+\u0022Well, as soon as you are dry, you shall be varnished, and framed, and\r\n+sent home. Then you can do what you like with yourself.\u0022 And he walked\r\n+across the room and rang the bell for tea. \u0022You will have tea, of\r\n+course, Dorian? And so will you, Harry? Or do you object to such\r\n+simple pleasures?\u0022\r\n+\r\n+\u0022I adore simple pleasures,\u0022 said Lord Henry. \u0022They are the last refuge\r\n+of the complex. But I don't like scenes, except on the stage. What\r\n+absurd fellows you are, both of you! I wonder who it was defined man\r\n+as a rational animal. It was the most premature definition ever given.\r\n+Man is many things, but he is not rational. I am glad he is not, after\r\n+all--though I wish you chaps would not squabble over the picture. You\r\n+had much better let me have it, Basil. This silly boy doesn't really\r\n+want it, and I really do.\u0022\r\n+\r\n+\u0022If you let any one have it but me, Basil, I shall never forgive you!\u0022\r\n+cried Dorian Gray; \u0022and I don't allow people to call me a silly boy.\u0022\r\n+\r\n+\u0022You know the picture is yours, Dorian. I gave it to you before it\r\n+existed.\u0022\r\n+\r\n+\u0022And you know you have been a little silly, Mr. Gray, and that you\r\n+don't really object to being reminded that you are extremely young.\u0022\r\n+\r\n+\u0022I should have objected very strongly this morning, Lord Henry.\u0022\r\n+\r\n+\u0022Ah! this morning! You have lived since then.\u0022\r\n+\r\n+There came a knock at the door, and the butler entered with a laden\r\n+tea-tray and set it down upon a small Japanese table. There was a\r\n+rattle of cups and saucers and the hissing of a fluted Georgian urn.\r\n+Two globe-shaped china dishes were brought in by a page. Dorian Gray\r\n+went over and poured out the tea. The two men sauntered languidly to\r\n+the table and examined what was under the covers.\r\n+\r\n+\u0022Let us go to the theatre to-night,\u0022 said Lord Henry. \u0022There is sure\r\n+to be something on, somewhere. I have promised to dine at White's, but\r\n+it is only with an old friend, so I can send him a wire to say that I\r\n+am ill, or that I am prevented from coming in consequence of a\r\n+subsequent engagement. I think that would be a rather nice excuse: it\r\n+would have all the surprise of candour.\u0022\r\n+\r\n+\u0022It is such a bore putting on one's dress-clothes,\u0022 muttered Hallward.\r\n+\u0022And, when one has them on, they are so horrid.\u0022\r\n+\r\n+\u0022Yes,\u0022 answered Lord Henry dreamily, \u0022the costume of the nineteenth\r\n+century is detestable. It is so sombre, so depressing. Sin is the\r\n+only real colour-element left in modern life.\u0022\r\n+\r\n+\u0022You really must not say things like that before Dorian, Harry.\u0022\r\n+\r\n+\u0022Before which Dorian? The one who is pouring out tea for us, or the\r\n+one in the picture?\u0022\r\n+\r\n+\u0022Before either.\u0022\r\n+\r\n+\u0022I should like to come to the theatre with you, Lord Henry,\u0022 said the\r\n+lad.\r\n+\r\n+\u0022Then you shall come; and you will come, too, Basil, won't you?\u0022\r\n+\r\n+\u0022I can't, really. I would sooner not. I have a lot of work to do.\u0022\r\n+\r\n+\u0022Well, then, you and I will go alone, Mr. Gray.\u0022\r\n+\r\n+\u0022I should like that awfully.\u0022\r\n+\r\n+The painter bit his lip and walked over, cup in hand, to the picture.\r\n+\u0022I shall stay with the real Dorian,\u0022 he said, sadly.\r\n+\r\n+\u0022Is it the real Dorian?\u0022 cried the original of the portrait, strolling\r\n+across to him. \u0022Am I really like that?\u0022\r\n+\r\n+\u0022Yes; you are just like that.\u0022\r\n+\r\n+\u0022How wonderful, Basil!\u0022\r\n+\r\n+\u0022At least you are like it in appearance. But it will never alter,\u0022\r\n+sighed Hallward. \u0022That is something.\u0022\r\n+\r\n+\u0022What a fuss people make about fidelity!\u0022 exclaimed Lord Henry. \u0022Why,\r\n+even in love it is purely a question for physiology. It has nothing to\r\n+do with our own will. Young men want to be faithful, and are not; old\r\n+men want to be faithless, and cannot: that is all one can say.\u0022\r\n+\r\n+\u0022Don't go to the theatre to-night, Dorian,\u0022 said Hallward. \u0022Stop and\r\n+dine with me.\u0022\r\n+\r\n+\u0022I can't, Basil.\u0022\r\n+\r\n+\u0022Why?\u0022\r\n+\r\n+\u0022Because I have promised Lord Henry Wotton to go with him.\u0022\r\n+\r\n+\u0022He won't like you the better for keeping your promises. He always\r\n+breaks his own. I beg you not to go.\u0022\r\n+\r\n+Dorian Gray laughed and shook his head.\r\n+\r\n+\u0022I entreat you.\u0022\r\n+\r\n+The lad hesitated, and looked over at Lord Henry, who was watching them\r\n+from the tea-table with an amused smile.\r\n+\r\n+\u0022I must go, Basil,\u0022 he answered.\r\n+\r\n+\u0022Very well,\u0022 said Hallward, and he went over and laid down his cup on\r\n+the tray. \u0022It is rather late, and, as you have to dress, you had\r\n+better lose no time. Good-bye, Harry. Good-bye, Dorian. Come and see\r\n+me soon. Come to-morrow.\u0022\r\n+\r\n+\u0022Certainly.\u0022\r\n+\r\n+\u0022You won't forget?\u0022\r\n+\r\n+\u0022No, of course not,\u0022 cried Dorian.\r\n+\r\n+\u0022And ... Harry!\u0022\r\n+\r\n+\u0022Yes, Basil?\u0022\r\n+\r\n+\u0022Remember what I asked you, when we were in the garden this morning.\u0022\r\n+\r\n+\u0022I have forgotten it.\u0022\r\n+\r\n+\u0022I trust you.\u0022\r\n+\r\n+\u0022I wish I could trust myself,\u0022 said Lord Henry, laughing. \u0022Come, Mr.\r\n+Gray, my hansom is outside, and I can drop you at your own place.\r\n+Good-bye, Basil. It has been a most interesting afternoon.\u0022\r\n+\r\n+As the door closed behind them, the painter flung himself down on a\r\n+sofa, and a look of pain came into his face.\r\n+\r\n+\r\n+\r\n+CHAPTER 3\r\n+\r\n+At half-past twelve next day Lord Henry Wotton strolled from Curzon\r\n+Street over to the Albany to call on his uncle, Lord Fermor, a genial\r\n+if somewhat rough-mannered old bachelor, whom the outside world called\r\n+selfish because it derived no particular benefit from him, but who was\r\n+considered generous by Society as he fed the people who amused him.\r\n+His father had been our ambassador at Madrid when Isabella was young\r\n+and Prim unthought of, but had retired from the diplomatic service in a\r\n+capricious moment of annoyance on not being offered the Embassy at\r\n+Paris, a post to which he considered that he was fully entitled by\r\n+reason of his birth, his indolence, the good English of his dispatches,\r\n+and his inordinate passion for pleasure. The son, who had been his\r\n+father's secretary, had resigned along with his chief, somewhat\r\n+foolishly as was thought at the time, and on succeeding some months\r\n+later to the title, had set himself to the serious study of the great\r\n+aristocratic art of doing absolutely nothing. He had two large town\r\n+houses, but preferred to live in chambers as it was less trouble, and\r\n+took most of his meals at his club. He paid some attention to the\r\n+management of his collieries in the Midland counties, excusing himself\r\n+for this taint of industry on the ground that the one advantage of\r\n+having coal was that it enabled a gentleman to afford the decency of\r\n+burning wood on his own hearth. In politics he was a Tory, except when\r\n+the Tories were in office, during which period he roundly abused them\r\n+for being a pack of Radicals. He was a hero to his valet, who bullied\r\n+him, and a terror to most of his relations, whom he bullied in turn.\r\n+Only England could have produced him, and he always said that the\r\n+country was going to the dogs. His principles were out of date, but\r\n+there was a good deal to be said for his prejudices.\r\n+\r\n+When Lord Henry entered the room, he found his uncle sitting in a rough\r\n+shooting-coat, smoking a cheroot and grumbling over _The Times_. \u0022Well,\r\n+Harry,\u0022 said the old gentleman, \u0022what brings you out so early? I\r\n+thought you dandies never got up till two, and were not visible till\r\n+five.\u0022\r\n+\r\n+\u0022Pure family affection, I assure you, Uncle George. I want to get\r\n+something out of you.\u0022\r\n+\r\n+\u0022Money, I suppose,\u0022 said Lord Fermor, making a wry face. \u0022Well, sit\r\n+down and tell me all about it. Young people, nowadays, imagine that\r\n+money is everything.\u0022\r\n+\r\n+\u0022Yes,\u0022 murmured Lord Henry, settling his button-hole in his coat; \u0022and\r\n+when they grow older they know it. But I don't want money. It is only\r\n+people who pay their bills who want that, Uncle George, and I never pay\r\n+mine. Credit is the capital of a younger son, and one lives charmingly\r\n+upon it. Besides, I always deal with Dartmoor's tradesmen, and\r\n+consequently they never bother me. What I want is information: not\r\n+useful information, of course; useless information.\u0022\r\n+\r\n+\u0022Well, I can tell you anything that is in an English Blue Book, Harry,\r\n+although those fellows nowadays write a lot of nonsense. When I was in\r\n+the Diplomatic, things were much better. But I hear they let them in\r\n+now by examination. What can you expect? Examinations, sir, are pure\r\n+humbug from beginning to end. If a man is a gentleman, he knows quite\r\n+enough, and if he is not a gentleman, whatever he knows is bad for him.\u0022\r\n+\r\n+\u0022Mr. Dorian Gray does not belong to Blue Books, Uncle George,\u0022 said\r\n+Lord Henry languidly.\r\n+\r\n+\u0022Mr. Dorian Gray? Who is he?\u0022 asked Lord Fermor, knitting his bushy\r\n+white eyebrows.\r\n+\r\n+\u0022That is what I have come to learn, Uncle George. Or rather, I know\r\n+who he is. He is the last Lord Kelso's grandson. His mother was a\r\n+Devereux, Lady Margaret Devereux. I want you to tell me about his\r\n+mother. What was she like? Whom did she marry? You have known nearly\r\n+everybody in your time, so you might have known her. I am very much\r\n+interested in Mr. Gray at present. I have only just met him.\u0022\r\n+\r\n+\u0022Kelso's grandson!\u0022 echoed the old gentleman. \u0022Kelso's grandson! ...\r\n+Of course.... I knew his mother intimately. I believe I was at her\r\n+christening. She was an extraordinarily beautiful girl, Margaret\r\n+Devereux, and made all the men frantic by running away with a penniless\r\n+young fellow--a mere nobody, sir, a subaltern in a foot regiment, or\r\n+something of that kind. Certainly. I remember the whole thing as if\r\n+it happened yesterday. The poor chap was killed in a duel at Spa a few\r\n+months after the marriage. There was an ugly story about it. They\r\n+said Kelso got some rascally adventurer, some Belgian brute, to insult\r\n+his son-in-law in public--paid him, sir, to do it, paid him--and that\r\n+the fellow spitted his man as if he had been a pigeon. The thing was\r\n+hushed up, but, egad, Kelso ate his chop alone at the club for some\r\n+time afterwards. He brought his daughter back with him, I was told,\r\n+and she never spoke to him again. Oh, yes; it was a bad business. The\r\n+girl died, too, died within a year. So she left a son, did she? I had\r\n+forgotten that. What sort of boy is he? If he is like his mother, he\r\n+must be a good-looking chap.\u0022\r\n+\r\n+\u0022He is very good-looking,\u0022 assented Lord Henry.\r\n+\r\n+\u0022I hope he will fall into proper hands,\u0022 continued the old man. \u0022He\r\n+should have a pot of money waiting for him if Kelso did the right thing\r\n+by him. His mother had money, too. All the Selby property came to\r\n+her, through her grandfather. Her grandfather hated Kelso, thought him\r\n+a mean dog. He was, too. Came to Madrid once when I was there. Egad,\r\n+I was ashamed of him. The Queen used to ask me about the English noble\r\n+who was always quarrelling with the cabmen about their fares. They\r\n+made quite a story of it. I didn't dare show my face at Court for a\r\n+month. I hope he treated his grandson better than he did the jarvies.\u0022\r\n+\r\n+\u0022I don't know,\u0022 answered Lord Henry. \u0022I fancy that the boy will be\r\n+well off. He is not of age yet. He has Selby, I know. He told me so.\r\n+And ... his mother was very beautiful?\u0022\r\n+\r\n+\u0022Margaret Devereux was one of the loveliest creatures I ever saw,\r\n+Harry. What on earth induced her to behave as she did, I never could\r\n+understand. She could have married anybody she chose. Carlington was\r\n+mad after her. She was romantic, though. All the women of that family\r\n+were. The men were a poor lot, but, egad! the women were wonderful.\r\n+Carlington went on his knees to her. Told me so himself. She laughed\r\n+at him, and there wasn't a girl in London at the time who wasn't after\r\n+him. And by the way, Harry, talking about silly marriages, what is\r\n+this humbug your father tells me about Dartmoor wanting to marry an\r\n+American? Ain't English girls good enough for him?\u0022\r\n+\r\n+\u0022It is rather fashionable to marry Americans just now, Uncle George.\u0022\r\n+\r\n+\u0022I'll back English women against the world, Harry,\u0022 said Lord Fermor,\r\n+striking the table with his fist.\r\n+\r\n+\u0022The betting is on the Americans.\u0022\r\n+\r\n+\u0022They don't last, I am told,\u0022 muttered his uncle.\r\n+\r\n+\u0022A long engagement exhausts them, but they are capital at a\r\n+steeplechase. They take things flying. I don't think Dartmoor has a\r\n+chance.\u0022\r\n+\r\n+\u0022Who are her people?\u0022 grumbled the old gentleman. \u0022Has she got any?\u0022\r\n+\r\n+Lord Henry shook his head. \u0022American girls are as clever at concealing\r\n+their parents, as English women are at concealing their past,\u0022 he said,\r\n+rising to go.\r\n+\r\n+\u0022They are pork-packers, I suppose?\u0022\r\n+\r\n+\u0022I hope so, Uncle George, for Dartmoor's sake. I am told that\r\n+pork-packing is the most lucrative profession in America, after\r\n+politics.\u0022\r\n+\r\n+\u0022Is she pretty?\u0022\r\n+\r\n+\u0022She behaves as if she was beautiful. Most American women do. It is\r\n+the secret of their charm.\u0022\r\n+\r\n+\u0022Why can't these American women stay in their own country? They are\r\n+always telling us that it is the paradise for women.\u0022\r\n+\r\n+\u0022It is. That is the reason why, like Eve, they are so excessively\r\n+anxious to get out of it,\u0022 said Lord Henry. \u0022Good-bye, Uncle George.\r\n+I shall be late for lunch, if I stop any longer. Thanks for giving me\r\n+the information I wanted. I always like to know everything about my\r\n+new friends, and nothing about my old ones.\u0022\r\n+\r\n+\u0022Where are you lunching, Harry?\u0022\r\n+\r\n+\u0022At Aunt Agatha's. I have asked myself and Mr. Gray. He is her latest\r\n+_protege_.\u0022\r\n+\r\n+\u0022Humph! tell your Aunt Agatha, Harry, not to bother me any more with\r\n+her charity appeals. I am sick of them. Why, the good woman thinks\r\n+that I have nothing to do but to write cheques for her silly fads.\u0022\r\n+\r\n+\u0022All right, Uncle George, I'll tell her, but it won't have any effect.\r\n+Philanthropic people lose all sense of humanity. It is their\r\n+distinguishing characteristic.\u0022\r\n+\r\n+The old gentleman growled approvingly and rang the bell for his\r\n+servant. Lord Henry passed up the low arcade into Burlington Street\r\n+and turned his steps in the direction of Berkeley Square.\r\n+\r\n+So that was the story of Dorian Gray's parentage. Crudely as it had\r\n+been told to him, it had yet stirred him by its suggestion of a\r\n+strange, almost modern romance. A beautiful woman risking everything\r\n+for a mad passion. A few wild weeks of happiness cut short by a\r\n+hideous, treacherous crime. Months of voiceless agony, and then a\r\n+child born in pain. The mother snatched away by death, the boy left to\r\n+solitude and the tyranny of an old and loveless man. Yes; it was an\r\n+interesting background. It posed the lad, made him more perfect, as it\r\n+were. Behind every exquisite thing that existed, there was something\r\n+tragic. Worlds had to be in travail, that the meanest flower might\r\n+blow.... And how charming he had been at dinner the night before, as\r\n+with startled eyes and lips parted in frightened pleasure he had sat\r\n+opposite to him at the club, the red candleshades staining to a richer\r\n+rose the wakening wonder of his face. Talking to him was like playing\r\n+upon an exquisite violin. He answered to every touch and thrill of the\r\n+bow.... There was something terribly enthralling in the exercise of\r\n+influence. No other activity was like it. To project one's soul into\r\n+some gracious form, and let it tarry there for a moment; to hear one's\r\n+own intellectual views echoed back to one with all the added music of\r\n+passion and youth; to convey one's temperament into another as though\r\n+it were a subtle fluid or a strange perfume: there was a real joy in\r\n+that--perhaps the most satisfying joy left to us in an age so limited\r\n+and vulgar as our own, an age grossly carnal in its pleasures, and\r\n+grossly common in its aims.... He was a marvellous type, too, this lad,\r\n+whom by so curious a chance he had met in Basil's studio, or could be\r\n+fashioned into a marvellous type, at any rate. Grace was his, and the\r\n+white purity of boyhood, and beauty such as old Greek marbles kept for\r\n+us. There was nothing that one could not do with him. He could be\r\n+made a Titan or a toy. What a pity it was that such beauty was\r\n+destined to fade! ... And Basil? From a psychological point of view,\r\n+how interesting he was! The new manner in art, the fresh mode of\r\n+looking at life, suggested so strangely by the merely visible presence\r\n+of one who was unconscious of it all; the silent spirit that dwelt in\r\n+dim woodland, and walked unseen in open field, suddenly showing\r\n+herself, Dryadlike and not afraid, because in his soul who sought for\r\n+her there had been wakened that wonderful vision to which alone are\r\n+wonderful things revealed; the mere shapes and patterns of things\r\n+becoming, as it were, refined, and gaining a kind of symbolical value,\r\n+as though they were themselves patterns of some other and more perfect\r\n+form whose shadow they made real: how strange it all was! He\r\n+remembered something like it in history. Was it not Plato, that artist\r\n+in thought, who had first analyzed it? Was it not Buonarotti who had\r\n+carved it in the coloured marbles of a sonnet-sequence? But in our own\r\n+century it was strange.... Yes; he would try to be to Dorian Gray\r\n+what, without knowing it, the lad was to the painter who had fashioned\r\n+the wonderful portrait. He would seek to dominate him--had already,\r\n+indeed, half done so. He would make that wonderful spirit his own.\r\n+There was something fascinating in this son of love and death.\r\n+\r\n+Suddenly he stopped and glanced up at the houses. He found that he had\r\n+passed his aunt's some distance, and, smiling to himself, turned back.\r\n+When he entered the somewhat sombre hall, the butler told him that they\r\n+had gone in to lunch. He gave one of the footmen his hat and stick and\r\n+passed into the dining-room.\r\n+\r\n+\u0022Late as usual, Harry,\u0022 cried his aunt, shaking her head at him.\r\n+\r\n+He invented a facile excuse, and having taken the vacant seat next to\r\n+her, looked round to see who was there. Dorian bowed to him shyly from\r\n+the end of the table, a flush of pleasure stealing into his cheek.\r\n+Opposite was the Duchess of Harley, a lady of admirable good-nature and\r\n+good temper, much liked by every one who knew her, and of those ample\r\n+architectural proportions that in women who are not duchesses are\r\n+described by contemporary historians as stoutness. Next to her sat, on\r\n+her right, Sir Thomas Burdon, a Radical member of Parliament, who\r\n+followed his leader in public life and in private life followed the\r\n+best cooks, dining with the Tories and thinking with the Liberals, in\r\n+accordance with a wise and well-known rule. The post on her left was\r\n+occupied by Mr. Erskine of Treadley, an old gentleman of considerable\r\n+charm and culture, who had fallen, however, into bad habits of silence,\r\n+having, as he explained once to Lady Agatha, said everything that he\r\n+had to say before he was thirty. His own neighbour was Mrs. Vandeleur,\r\n+one of his aunt's oldest friends, a perfect saint amongst women, but so\r\n+dreadfully dowdy that she reminded one of a badly bound hymn-book.\r\n+Fortunately for him she had on the other side Lord Faudel, a most\r\n+intelligent middle-aged mediocrity, as bald as a ministerial statement\r\n+in the House of Commons, with whom she was conversing in that intensely\r\n+earnest manner which is the one unpardonable error, as he remarked once\r\n+himself, that all really good people fall into, and from which none of\r\n+them ever quite escape.\r\n+\r\n+\u0022We are talking about poor Dartmoor, Lord Henry,\u0022 cried the duchess,\r\n+nodding pleasantly to him across the table. \u0022Do you think he will\r\n+really marry this fascinating young person?\u0022\r\n+\r\n+\u0022I believe she has made up her mind to propose to him, Duchess.\u0022\r\n+\r\n+\u0022How dreadful!\u0022 exclaimed Lady Agatha. \u0022Really, some one should\r\n+interfere.\u0022\r\n+\r\n+\u0022I am told, on excellent authority, that her father keeps an American\r\n+dry-goods store,\u0022 said Sir Thomas Burdon, looking supercilious.\r\n+\r\n+\u0022My uncle has already suggested pork-packing, Sir Thomas.\u0022\r\n+\r\n+\u0022Dry-goods! What are American dry-goods?\u0022 asked the duchess, raising\r\n+her large hands in wonder and accentuating the verb.\r\n+\r\n+\u0022American novels,\u0022 answered Lord Henry, helping himself to some quail.\r\n+\r\n+The duchess looked puzzled.\r\n+\r\n+\u0022Don't mind him, my dear,\u0022 whispered Lady Agatha. \u0022He never means\r\n+anything that he says.\u0022\r\n+\r\n+\u0022When America was discovered,\u0022 said the Radical member--and he began to\r\n+give some wearisome facts. Like all people who try to exhaust a\r\n+subject, he exhausted his listeners. The duchess sighed and exercised\r\n+her privilege of interruption. \u0022I wish to goodness it never had been\r\n+discovered at all!\u0022 she exclaimed. \u0022Really, our girls have no chance\r\n+nowadays. It is most unfair.\u0022\r\n+\r\n+\u0022Perhaps, after all, America never has been discovered,\u0022 said Mr.\r\n+Erskine; \u0022I myself would say that it had merely been detected.\u0022\r\n+\r\n+\u0022Oh! but I have seen specimens of the inhabitants,\u0022 answered the\r\n+duchess vaguely. \u0022I must confess that most of them are extremely\r\n+pretty. And they dress well, too. They get all their dresses in\r\n+Paris. I wish I could afford to do the same.\u0022\r\n+\r\n+\u0022They say that when good Americans die they go to Paris,\u0022 chuckled Sir\r\n+Thomas, who had a large wardrobe of Humour's cast-off clothes.\r\n+\r\n+\u0022Really! And where do bad Americans go to when they die?\u0022 inquired the\r\n+duchess.\r\n+\r\n+\u0022They go to America,\u0022 murmured Lord Henry.\r\n+\r\n+Sir Thomas frowned. \u0022I am afraid that your nephew is prejudiced\r\n+against that great country,\u0022 he said to Lady Agatha. \u0022I have travelled\r\n+all over it in cars provided by the directors, who, in such matters,\r\n+are extremely civil. I assure you that it is an education to visit it.\u0022\r\n+\r\n+\u0022But must we really see Chicago in order to be educated?\u0022 asked Mr.\r\n+Erskine plaintively. \u0022I don't feel up to the journey.\u0022\r\n+\r\n+Sir Thomas waved his hand. \u0022Mr. Erskine of Treadley has the world on\r\n+his shelves. We practical men like to see things, not to read about\r\n+them. The Americans are an extremely interesting people. They are\r\n+absolutely reasonable. I think that is their distinguishing\r\n+characteristic. Yes, Mr. Erskine, an absolutely reasonable people. I\r\n+assure you there is no nonsense about the Americans.\u0022\r\n+\r\n+\u0022How dreadful!\u0022 cried Lord Henry. \u0022I can stand brute force, but brute\r\n+reason is quite unbearable. There is something unfair about its use.\r\n+It is hitting below the intellect.\u0022\r\n+\r\n+\u0022I do not understand you,\u0022 said Sir Thomas, growing rather red.\r\n+\r\n+\u0022I do, Lord Henry,\u0022 murmured Mr. Erskine, with a smile.\r\n+\r\n+\u0022Paradoxes are all very well in their way....\u0022 rejoined the baronet.\r\n+\r\n+\u0022Was that a paradox?\u0022 asked Mr. Erskine. \u0022I did not think so. Perhaps\r\n+it was. Well, the way of paradoxes is the way of truth. To test\r\n+reality we must see it on the tight rope. When the verities become\r\n+acrobats, we can judge them.\u0022\r\n+\r\n+\u0022Dear me!\u0022 said Lady Agatha, \u0022how you men argue! I am sure I never can\r\n+make out what you are talking about. Oh! Harry, I am quite vexed with\r\n+you. Why do you try to persuade our nice Mr. Dorian Gray to give up\r\n+the East End? I assure you he would be quite invaluable. They would\r\n+love his playing.\u0022\r\n+\r\n+\u0022I want him to play to me,\u0022 cried Lord Henry, smiling, and he looked\r\n+down the table and caught a bright answering glance.\r\n+\r\n+\u0022But they are so unhappy in Whitechapel,\u0022 continued Lady Agatha.\r\n+\r\n+\u0022I can sympathize with everything except suffering,\u0022 said Lord Henry,\r\n+shrugging his shoulders. \u0022I cannot sympathize with that. It is too\r\n+ugly, too horrible, too distressing. There is something terribly\r\n+morbid in the modern sympathy with pain. One should sympathize with\r\n+the colour, the beauty, the joy of life. The less said about life's\r\n+sores, the better.\u0022\r\n+\r\n+\u0022Still, the East End is a very important problem,\u0022 remarked Sir Thomas\r\n+with a grave shake of the head.\r\n+\r\n+\u0022Quite so,\u0022 answered the young lord. \u0022It is the problem of slavery,\r\n+and we try to solve it by amusing the slaves.\u0022\r\n+\r\n+The politician looked at him keenly. \u0022What change do you propose,\r\n+then?\u0022 he asked.\r\n+\r\n+Lord Henry laughed. \u0022I don't desire to change anything in England\r\n+except the weather,\u0022 he answered. \u0022I am quite content with philosophic\r\n+contemplation. But, as the nineteenth century has gone bankrupt\r\n+through an over-expenditure of sympathy, I would suggest that we should\r\n+appeal to science to put us straight. The advantage of the emotions is\r\n+that they lead us astray, and the advantage of science is that it is\r\n+not emotional.\u0022\r\n+\r\n+\u0022But we have such grave responsibilities,\u0022 ventured Mrs. Vandeleur\r\n+timidly.\r\n+\r\n+\u0022Terribly grave,\u0022 echoed Lady Agatha.\r\n+\r\n+Lord Henry looked over at Mr. Erskine. \u0022Humanity takes itself too\r\n+seriously. It is the world's original sin. If the caveman had known\r\n+how to laugh, history would have been different.\u0022\r\n+\r\n+\u0022You are really very comforting,\u0022 warbled the duchess. \u0022I have always\r\n+felt rather guilty when I came to see your dear aunt, for I take no\r\n+interest at all in the East End. For the future I shall be able to\r\n+look her in the face without a blush.\u0022\r\n+\r\n+\u0022A blush is very becoming, Duchess,\u0022 remarked Lord Henry.\r\n+\r\n+\u0022Only when one is young,\u0022 she answered. \u0022When an old woman like myself\r\n+blushes, it is a very bad sign. Ah! Lord Henry, I wish you would tell\r\n+me how to become young again.\u0022\r\n+\r\n+He thought for a moment. \u0022Can you remember any great error that you\r\n+committed in your early days, Duchess?\u0022 he asked, looking at her across\r\n+the table.\r\n+\r\n+\u0022A great many, I fear,\u0022 she cried.\r\n+\r\n+\u0022Then commit them over again,\u0022 he said gravely. \u0022To get back one's\r\n+youth, one has merely to repeat one's follies.\u0022\r\n+\r\n+\u0022A delightful theory!\u0022 she exclaimed. \u0022I must put it into practice.\u0022\r\n+\r\n+\u0022A dangerous theory!\u0022 came from Sir Thomas's tight lips. Lady Agatha\r\n+shook her head, but could not help being amused. Mr. Erskine listened.\r\n+\r\n+\u0022Yes,\u0022 he continued, \u0022that is one of the great secrets of life.\r\n+Nowadays most people die of a sort of creeping common sense, and\r\n+discover when it is too late that the only things one never regrets are\r\n+one's mistakes.\u0022\r\n+\r\n+A laugh ran round the table.\r\n+\r\n+He played with the idea and grew wilful; tossed it into the air and\r\n+transformed it; let it escape and recaptured it; made it iridescent\r\n+with fancy and winged it with paradox. The praise of folly, as he went\r\n+on, soared into a philosophy, and philosophy herself became young, and\r\n+catching the mad music of pleasure, wearing, one might fancy, her\r\n+wine-stained robe and wreath of ivy, danced like a Bacchante over the\r\n+hills of life, and mocked the slow Silenus for being sober. Facts fled\r\n+before her like frightened forest things. Her white feet trod the huge\r\n+press at which wise Omar sits, till the seething grape-juice rose round\r\n+her bare limbs in waves of purple bubbles, or crawled in red foam over\r\n+the vat's black, dripping, sloping sides. It was an extraordinary\r\n+improvisation. He felt that the eyes of Dorian Gray were fixed on him,\r\n+and the consciousness that amongst his audience there was one whose\r\n+temperament he wished to fascinate seemed to give his wit keenness and\r\n+to lend colour to his imagination. He was brilliant, fantastic,\r\n+irresponsible. He charmed his listeners out of themselves, and they\r\n+followed his pipe, laughing. Dorian Gray never took his gaze off him,\r\n+but sat like one under a spell, smiles chasing each other over his lips\r\n+and wonder growing grave in his darkening eyes.\r\n+\r\n+At last, liveried in the costume of the age, reality entered the room\r\n+in the shape of a servant to tell the duchess that her carriage was\r\n+waiting. She wrung her hands in mock despair. \u0022How annoying!\u0022 she\r\n+cried. \u0022I must go. I have to call for my husband at the club, to take\r\n+him to some absurd meeting at Willis's Rooms, where he is going to be\r\n+in the chair. If I am late he is sure to be furious, and I couldn't\r\n+have a scene in this bonnet. It is far too fragile. A harsh word\r\n+would ruin it. No, I must go, dear Agatha. Good-bye, Lord Henry, you\r\n+are quite delightful and dreadfully demoralizing. I am sure I don't\r\n+know what to say about your views. You must come and dine with us some\r\n+night. Tuesday? Are you disengaged Tuesday?\u0022\r\n+\r\n+\u0022For you I would throw over anybody, Duchess,\u0022 said Lord Henry with a\r\n+bow.\r\n+\r\n+\u0022Ah! that is very nice, and very wrong of you,\u0022 she cried; \u0022so mind you\r\n+come\u0022; and she swept out of the room, followed by Lady Agatha and the\r\n+other ladies.\r\n+\r\n+When Lord Henry had sat down again, Mr. Erskine moved round, and taking\r\n+a chair close to him, placed his hand upon his arm.\r\n+\r\n+\u0022You talk books away,\u0022 he said; \u0022why don't you write one?\u0022\r\n+\r\n+\u0022I am too fond of reading books to care to write them, Mr. Erskine. I\r\n+should like to write a novel certainly, a novel that would be as lovely\r\n+as a Persian carpet and as unreal. But there is no literary public in\r\n+England for anything except newspapers, primers, and encyclopaedias.\r\n+Of all people in the world the English have the least sense of the\r\n+beauty of literature.\u0022\r\n+\r\n+\u0022I fear you are right,\u0022 answered Mr. Erskine. \u0022I myself used to have\r\n+literary ambitions, but I gave them up long ago. And now, my dear\r\n+young friend, if you will allow me to call you so, may I ask if you\r\n+really meant all that you said to us at lunch?\u0022\r\n+\r\n+\u0022I quite forget what I said,\u0022 smiled Lord Henry. \u0022Was it all very bad?\u0022\r\n+\r\n+\u0022Very bad indeed. In fact I consider you extremely dangerous, and if\r\n+anything happens to our good duchess, we shall all look on you as being\r\n+primarily responsible. But I should like to talk to you about life.\r\n+The generation into which I was born was tedious. Some day, when you\r\n+are tired of London, come down to Treadley and expound to me your\r\n+philosophy of pleasure over some admirable Burgundy I am fortunate\r\n+enough to possess.\u0022\r\n+\r\n+\u0022I shall be charmed. A visit to Treadley would be a great privilege.\r\n+It has a perfect host, and a perfect library.\u0022\r\n+\r\n+\u0022You will complete it,\u0022 answered the old gentleman with a courteous\r\n+bow. \u0022And now I must bid good-bye to your excellent aunt. I am due at\r\n+the Athenaeum. It is the hour when we sleep there.\u0022\r\n+\r\n+\u0022All of you, Mr. Erskine?\u0022\r\n+\r\n+\u0022Forty of us, in forty arm-chairs. We are practising for an English\r\n+Academy of Letters.\u0022\r\n+\r\n+Lord Henry laughed and rose. \u0022I am going to the park,\u0022 he cried.\r\n+\r\n+As he was passing out of the door, Dorian Gray touched him on the arm.\r\n+\u0022Let me come with you,\u0022 he murmured.\r\n+\r\n+\u0022But I thought you had promised Basil Hallward to go and see him,\u0022\r\n+answered Lord Henry.\r\n+\r\n+\u0022I would sooner come with you; yes, I feel I must come with you. Do\r\n+let me. And you will promise to talk to me all the time? No one talks\r\n+so wonderfully as you do.\u0022\r\n+\r\n+\u0022Ah! I have talked quite enough for to-day,\u0022 said Lord Henry, smiling.\r\n+\u0022All I want now is to look at life. You may come and look at it with\r\n+me, if you care to.\u0022\r\n+\r\n+\r\n+\r\n+CHAPTER 4\r\n+\r\n+One afternoon, a month later, Dorian Gray was reclining in a luxurious\r\n+arm-chair, in the little library of Lord Henry's house in Mayfair. It\r\n+was, in its way, a very charming room, with its high panelled\r\n+wainscoting of olive-stained oak, its cream-coloured frieze and ceiling\r\n+of raised plasterwork, and its brickdust felt carpet strewn with silk,\r\n+long-fringed Persian rugs. On a tiny satinwood table stood a statuette\r\n+by Clodion, and beside it lay a copy of Les Cent Nouvelles, bound for\r\n+Margaret of Valois by Clovis Eve and powdered with the gilt daisies\r\n+that Queen had selected for her device. Some large blue china jars and\r\n+parrot-tulips were ranged on the mantelshelf, and through the small\r\n+leaded panes of the window streamed the apricot-coloured light of a\r\n+summer day in London.\r\n+\r\n+Lord Henry had not yet come in. He was always late on principle, his\r\n+principle being that punctuality is the thief of time. So the lad was\r\n+looking rather sulky, as with listless fingers he turned over the pages\r\n+of an elaborately illustrated edition of Manon Lescaut that he had\r\n+found in one of the book-cases. The formal monotonous ticking of the\r\n+Louis Quatorze clock annoyed him. Once or twice he thought of going\r\n+away.\r\n+\r\n+At last he heard a step outside, and the door opened. \u0022How late you\r\n+are, Harry!\u0022 he murmured.\r\n+\r\n+\u0022I am afraid it is not Harry, Mr. Gray,\u0022 answered a shrill voice.\r\n+\r\n+He glanced quickly round and rose to his feet. \u0022I beg your pardon. I\r\n+thought--\u0022\r\n+\r\n+\u0022You thought it was my husband. It is only his wife. You must let me\r\n+introduce myself. I know you quite well by your photographs. I think\r\n+my husband has got seventeen of them.\u0022\r\n+\r\n+\u0022Not seventeen, Lady Henry?\u0022\r\n+\r\n+\u0022Well, eighteen, then. And I saw you with him the other night at the\r\n+opera.\u0022 She laughed nervously as she spoke, and watched him with her\r\n+vague forget-me-not eyes. She was a curious woman, whose dresses\r\n+always looked as if they had been designed in a rage and put on in a\r\n+tempest. She was usually in love with somebody, and, as her passion\r\n+was never returned, she had kept all her illusions. She tried to look\r\n+picturesque, but only succeeded in being untidy. Her name was\r\n+Victoria, and she had a perfect mania for going to church.\r\n+\r\n+\u0022That was at Lohengrin, Lady Henry, I think?\u0022\r\n+\r\n+\u0022Yes; it was at dear Lohengrin. I like Wagner's music better than\r\n+anybody's. It is so loud that one can talk the whole time without other\r\n+people hearing what one says. That is a great advantage, don't you\r\n+think so, Mr. Gray?\u0022\r\n+\r\n+The same nervous staccato laugh broke from her thin lips, and her\r\n+fingers began to play with a long tortoise-shell paper-knife.\r\n+\r\n+Dorian smiled and shook his head: \u0022I am afraid I don't think so, Lady\r\n+Henry. I never talk during music--at least, during good music. If one\r\n+hears bad music, it is one's duty to drown it in conversation.\u0022\r\n+\r\n+\u0022Ah! that is one of Harry's views, isn't it, Mr. Gray? I always hear\r\n+Harry's views from his friends. It is the only way I get to know of\r\n+them. But you must not think I don't like good music. I adore it, but\r\n+I am afraid of it. It makes me too romantic. I have simply worshipped\r\n+pianists--two at a time, sometimes, Harry tells me. I don't know what\r\n+it is about them. Perhaps it is that they are foreigners. They all\r\n+are, ain't they? Even those that are born in England become foreigners\r\n+after a time, don't they? It is so clever of them, and such a\r\n+compliment to art. Makes it quite cosmopolitan, doesn't it? You have\r\n+never been to any of my parties, have you, Mr. Gray? You must come. I\r\n+can't afford orchids, but I spare no expense in foreigners. They make\r\n+one's rooms look so picturesque. But here is Harry! Harry, I came in\r\n+to look for you, to ask you something--I forget what it was--and I\r\n+found Mr. Gray here. We have had such a pleasant chat about music. We\r\n+have quite the same ideas. No; I think our ideas are quite different.\r\n+But he has been most pleasant. I am so glad I've seen him.\u0022\r\n+\r\n+\u0022I am charmed, my love, quite charmed,\u0022 said Lord Henry, elevating his\r\n+dark, crescent-shaped eyebrows and looking at them both with an amused\r\n+smile. \u0022So sorry I am late, Dorian. I went to look after a piece of\r\n+old brocade in Wardour Street and had to bargain for hours for it.\r\n+Nowadays people know the price of everything and the value of nothing.\u0022\r\n+\r\n+\u0022I am afraid I must be going,\u0022 exclaimed Lady Henry, breaking an\r\n+awkward silence with her silly sudden laugh. \u0022I have promised to drive\r\n+with the duchess. Good-bye, Mr. Gray. Good-bye, Harry. You are\r\n+dining out, I suppose? So am I. Perhaps I shall see you at Lady\r\n+Thornbury's.\u0022\r\n+\r\n+\u0022I dare say, my dear,\u0022 said Lord Henry, shutting the door behind her\r\n+as, looking like a bird of paradise that had been out all night in the\r\n+rain, she flitted out of the room, leaving a faint odour of\r\n+frangipanni. Then he lit a cigarette and flung himself down on the\r\n+sofa.\r\n+\r\n+\u0022Never marry a woman with straw-coloured hair, Dorian,\u0022 he said after a\r\n+few puffs.\r\n+\r\n+\u0022Why, Harry?\u0022\r\n+\r\n+\u0022Because they are so sentimental.\u0022\r\n+\r\n+\u0022But I like sentimental people.\u0022\r\n+\r\n+\u0022Never marry at all, Dorian. Men marry because they are tired; women,\r\n+because they are curious: both are disappointed.\u0022\r\n+\r\n+\u0022I don't think I am likely to marry, Harry. I am too much in love.\r\n+That is one of your aphorisms. I am putting it into practice, as I do\r\n+everything that you say.\u0022\r\n+\r\n+\u0022Who are you in love with?\u0022 asked Lord Henry after a pause.\r\n+\r\n+\u0022With an actress,\u0022 said Dorian Gray, blushing.\r\n+\r\n+Lord Henry shrugged his shoulders. \u0022That is a rather commonplace\r\n+_debut_.\u0022\r\n+\r\n+\u0022You would not say so if you saw her, Harry.\u0022\r\n+\r\n+\u0022Who is she?\u0022\r\n+\r\n+\u0022Her name is Sibyl Vane.\u0022\r\n+\r\n+\u0022Never heard of her.\u0022\r\n+\r\n+\u0022No one has. People will some day, however. She is a genius.\u0022\r\n+\r\n+\u0022My dear boy, no woman is a genius. Women are a decorative sex. They\r\n+never have anything to say, but they say it charmingly. Women\r\n+represent the triumph of matter over mind, just as men represent the\r\n+triumph of mind over morals.\u0022\r\n+\r\n+\u0022Harry, how can you?\u0022\r\n+\r\n+\u0022My dear Dorian, it is quite true. I am analysing women at present, so\r\n+I ought to know. The subject is not so abstruse as I thought it was.\r\n+I find that, ultimately, there are only two kinds of women, the plain\r\n+and the coloured. The plain women are very useful. If you want to\r\n+gain a reputation for respectability, you have merely to take them down\r\n+to supper. The other women are very charming. They commit one\r\n+mistake, however. They paint in order to try and look young. Our\r\n+grandmothers painted in order to try and talk brilliantly. _Rouge_ and\r\n+_esprit_ used to go together. That is all over now. As long as a woman\r\n+can look ten years younger than her own daughter, she is perfectly\r\n+satisfied. As for conversation, there are only five women in London\r\n+worth talking to, and two of these can't be admitted into decent\r\n+society. However, tell me about your genius. How long have you known\r\n+her?\u0022\r\n+\r\n+\u0022Ah! Harry, your views terrify me.\u0022\r\n+\r\n+\u0022Never mind that. How long have you known her?\u0022\r\n+\r\n+\u0022About three weeks.\u0022\r\n+\r\n+\u0022And where did you come across her?\u0022\r\n+\r\n+\u0022I will tell you, Harry, but you mustn't be unsympathetic about it.\r\n+After all, it never would have happened if I had not met you. You\r\n+filled me with a wild desire to know everything about life. For days\r\n+after I met you, something seemed to throb in my veins. As I lounged\r\n+in the park, or strolled down Piccadilly, I used to look at every one\r\n+who passed me and wonder, with a mad curiosity, what sort of lives they\r\n+led. Some of them fascinated me. Others filled me with terror. There\r\n+was an exquisite poison in the air. I had a passion for sensations....\r\n+Well, one evening about seven o'clock, I determined to go out in search\r\n+of some adventure. I felt that this grey monstrous London of ours,\r\n+with its myriads of people, its sordid sinners, and its splendid sins,\r\n+as you once phrased it, must have something in store for me. I fancied\r\n+a thousand things. The mere danger gave me a sense of delight. I\r\n+remembered what you had said to me on that wonderful evening when we\r\n+first dined together, about the search for beauty being the real secret\r\n+of life. I don't know what I expected, but I went out and wandered\r\n+eastward, soon losing my way in a labyrinth of grimy streets and black\r\n+grassless squares. About half-past eight I passed by an absurd little\r\n+theatre, with great flaring gas-jets and gaudy play-bills. A hideous\r\n+Jew, in the most amazing waistcoat I ever beheld in my life, was\r\n+standing at the entrance, smoking a vile cigar. He had greasy\r\n+ringlets, and an enormous diamond blazed in the centre of a soiled\r\n+shirt. 'Have a box, my Lord?' he said, when he saw me, and he took off\r\n+his hat with an air of gorgeous servility. There was something about\r\n+him, Harry, that amused me. He was such a monster. You will laugh at\r\n+me, I know, but I really went in and paid a whole guinea for the\r\n+stage-box. To the present day I can't make out why I did so; and yet if\r\n+I hadn't--my dear Harry, if I hadn't--I should have missed the greatest\r\n+romance of my life. I see you are laughing. It is horrid of you!\u0022\r\n+\r\n+\u0022I am not laughing, Dorian; at least I am not laughing at you. But you\r\n+should not say the greatest romance of your life. You should say the\r\n+first romance of your life. You will always be loved, and you will\r\n+always be in love with love. A _grande passion_ is the privilege of\r\n+people who have nothing to do. That is the one use of the idle classes\r\n+of a country. Don't be afraid. There are exquisite things in store\r\n+for you. This is merely the beginning.\u0022\r\n+\r\n+\u0022Do you think my nature so shallow?\u0022 cried Dorian Gray angrily.\r\n+\r\n+\u0022No; I think your nature so deep.\u0022\r\n+\r\n+\u0022How do you mean?\u0022\r\n+\r\n+\u0022My dear boy, the people who love only once in their lives are really\r\n+the shallow people. What they call their loyalty, and their fidelity,\r\n+I call either the lethargy of custom or their lack of imagination.\r\n+Faithfulness is to the emotional life what consistency is to the life\r\n+of the intellect--simply a confession of failure. Faithfulness! I\r\n+must analyse it some day. The passion for property is in it. There\r\n+are many things that we would throw away if we were not afraid that\r\n+others might pick them up. But I don't want to interrupt you. Go on\r\n+with your story.\u0022\r\n+\r\n+\u0022Well, I found myself seated in a horrid little private box, with a\r\n+vulgar drop-scene staring me in the face. I looked out from behind the\r\n+curtain and surveyed the house. It was a tawdry affair, all Cupids and\r\n+cornucopias, like a third-rate wedding-cake. The gallery and pit were\r\n+fairly full, but the two rows of dingy stalls were quite empty, and\r\n+there was hardly a person in what I suppose they called the\r\n+dress-circle. Women went about with oranges and ginger-beer, and there\r\n+was a terrible consumption of nuts going on.\u0022\r\n+\r\n+\u0022It must have been just like the palmy days of the British drama.\u0022\r\n+\r\n+\u0022Just like, I should fancy, and very depressing. I began to wonder\r\n+what on earth I should do when I caught sight of the play-bill. What\r\n+do you think the play was, Harry?\u0022\r\n+\r\n+\u0022I should think 'The Idiot Boy', or 'Dumb but Innocent'. Our fathers\r\n+used to like that sort of piece, I believe. The longer I live, Dorian,\r\n+the more keenly I feel that whatever was good enough for our fathers is\r\n+not good enough for us. In art, as in politics, _les grandperes ont\r\n+toujours tort_.\u0022\r\n+\r\n+\u0022This play was good enough for us, Harry. It was Romeo and Juliet. I\r\n+must admit that I was rather annoyed at the idea of seeing Shakespeare\r\n+done in such a wretched hole of a place. Still, I felt interested, in\r\n+a sort of way. At any rate, I determined to wait for the first act.\r\n+There was a dreadful orchestra, presided over by a young Hebrew who sat\r\n+at a cracked piano, that nearly drove me away, but at last the\r\n+drop-scene was drawn up and the play began. Romeo was a stout elderly\r\n+gentleman, with corked eyebrows, a husky tragedy voice, and a figure\r\n+like a beer-barrel. Mercutio was almost as bad. He was played by the\r\n+low-comedian, who had introduced gags of his own and was on most\r\n+friendly terms with the pit. They were both as grotesque as the\r\n+scenery, and that looked as if it had come out of a country-booth. But\r\n+Juliet! Harry, imagine a girl, hardly seventeen years of age, with a\r\n+little, flowerlike face, a small Greek head with plaited coils of\r\n+dark-brown hair, eyes that were violet wells of passion, lips that were\r\n+like the petals of a rose. She was the loveliest thing I had ever seen\r\n+in my life. You said to me once that pathos left you unmoved, but that\r\n+beauty, mere beauty, could fill your eyes with tears. I tell you,\r\n+Harry, I could hardly see this girl for the mist of tears that came\r\n+across me. And her voice--I never heard such a voice. It was very low\r\n+at first, with deep mellow notes that seemed to fall singly upon one's\r\n+ear. Then it became a little louder, and sounded like a flute or a\r\n+distant hautboy. In the garden-scene it had all the tremulous ecstasy\r\n+that one hears just before dawn when nightingales are singing. There\r\n+were moments, later on, when it had the wild passion of violins. You\r\n+know how a voice can stir one. Your voice and the voice of Sibyl Vane\r\n+are two things that I shall never forget. When I close my eyes, I hear\r\n+them, and each of them says something different. I don't know which to\r\n+follow. Why should I not love her? Harry, I do love her. She is\r\n+everything to me in life. Night after night I go to see her play. One\r\n+evening she is Rosalind, and the next evening she is Imogen. I have\r\n+seen her die in the gloom of an Italian tomb, sucking the poison from\r\n+her lover's lips. I have watched her wandering through the forest of\r\n+Arden, disguised as a pretty boy in hose and doublet and dainty cap.\r\n+She has been mad, and has come into the presence of a guilty king, and\r\n+given him rue to wear and bitter herbs to taste of. She has been\r\n+innocent, and the black hands of jealousy have crushed her reedlike\r\n+throat. I have seen her in every age and in every costume. Ordinary\r\n+women never appeal to one's imagination. They are limited to their\r\n+century. No glamour ever transfigures them. One knows their minds as\r\n+easily as one knows their bonnets. One can always find them. There is\r\n+no mystery in any of them. They ride in the park in the morning and\r\n+chatter at tea-parties in the afternoon. They have their stereotyped\r\n+smile and their fashionable manner. They are quite obvious. But an\r\n+actress! How different an actress is! Harry! why didn't you tell me\r\n+that the only thing worth loving is an actress?\u0022\r\n+\r\n+\u0022Because I have loved so many of them, Dorian.\u0022\r\n+\r\n+\u0022Oh, yes, horrid people with dyed hair and painted faces.\u0022\r\n+\r\n+\u0022Don't run down dyed hair and painted faces. There is an extraordinary\r\n+charm in them, sometimes,\u0022 said Lord Henry.\r\n+\r\n+\u0022I wish now I had not told you about Sibyl Vane.\u0022\r\n+\r\n+\u0022You could not have helped telling me, Dorian. All through your life\r\n+you will tell me everything you do.\u0022\r\n+\r\n+\u0022Yes, Harry, I believe that is true. I cannot help telling you things.\r\n+You have a curious influence over me. If I ever did a crime, I would\r\n+come and confess it to you. You would understand me.\u0022\r\n+\r\n+\u0022People like you--the wilful sunbeams of life--don't commit crimes,\r\n+Dorian. But I am much obliged for the compliment, all the same. And\r\n+now tell me--reach me the matches, like a good boy--thanks--what are\r\n+your actual relations with Sibyl Vane?\u0022\r\n+\r\n+Dorian Gray leaped to his feet, with flushed cheeks and burning eyes.\r\n+\u0022Harry! Sibyl Vane is sacred!\u0022\r\n+\r\n+\u0022It is only the sacred things that are worth touching, Dorian,\u0022 said\r\n+Lord Henry, with a strange touch of pathos in his voice. \u0022But why\r\n+should you be annoyed? I suppose she will belong to you some day.\r\n+When one is in love, one always begins by deceiving one's self, and one\r\n+always ends by deceiving others. That is what the world calls a\r\n+romance. You know her, at any rate, I suppose?\u0022\r\n+\r\n+\u0022Of course I know her. On the first night I was at the theatre, the\r\n+horrid old Jew came round to the box after the performance was over and\r\n+offered to take me behind the scenes and introduce me to her. I was\r\n+furious with him, and told him that Juliet had been dead for hundreds\r\n+of years and that her body was lying in a marble tomb in Verona. I\r\n+think, from his blank look of amazement, that he was under the\r\n+impression that I had taken too much champagne, or something.\u0022\r\n+\r\n+\u0022I am not surprised.\u0022\r\n+\r\n+\u0022Then he asked me if I wrote for any of the newspapers. I told him I\r\n+never even read them. He seemed terribly disappointed at that, and\r\n+confided to me that all the dramatic critics were in a conspiracy\r\n+against him, and that they were every one of them to be bought.\u0022\r\n+\r\n+\u0022I should not wonder if he was quite right there. But, on the other\r\n+hand, judging from their appearance, most of them cannot be at all\r\n+expensive.\u0022\r\n+\r\n+\u0022Well, he seemed to think they were beyond his means,\u0022 laughed Dorian.\r\n+\u0022By this time, however, the lights were being put out in the theatre,\r\n+and I had to go. He wanted me to try some cigars that he strongly\r\n+recommended. I declined. The next night, of course, I arrived at the\r\n+place again. When he saw me, he made me a low bow and assured me that\r\n+I was a munificent patron of art. He was a most offensive brute,\r\n+though he had an extraordinary passion for Shakespeare. He told me\r\n+once, with an air of pride, that his five bankruptcies were entirely\r\n+due to 'The Bard,' as he insisted on calling him. He seemed to think\r\n+it a distinction.\u0022\r\n+\r\n+\u0022It was a distinction, my dear Dorian--a great distinction. Most\r\n+people become bankrupt through having invested too heavily in the prose\r\n+of life. To have ruined one's self over poetry is an honour. But when\r\n+did you first speak to Miss Sibyl Vane?\u0022\r\n+\r\n+\u0022The third night. She had been playing Rosalind. I could not help\r\n+going round. I had thrown her some flowers, and she had looked at\r\n+me--at least I fancied that she had. The old Jew was persistent. He\r\n+seemed determined to take me behind, so I consented. It was curious my\r\n+not wanting to know her, wasn't it?\u0022\r\n+\r\n+\u0022No; I don't think so.\u0022\r\n+\r\n+\u0022My dear Harry, why?\u0022\r\n+\r\n+\u0022I will tell you some other time. Now I want to know about the girl.\u0022\r\n+\r\n+\u0022Sibyl? Oh, she was so shy and so gentle. There is something of a\r\n+child about her. Her eyes opened wide in exquisite wonder when I told\r\n+her what I thought of her performance, and she seemed quite unconscious\r\n+of her power. I think we were both rather nervous. The old Jew stood\r\n+grinning at the doorway of the dusty greenroom, making elaborate\r\n+speeches about us both, while we stood looking at each other like\r\n+children. He would insist on calling me 'My Lord,' so I had to assure\r\n+Sibyl that I was not anything of the kind. She said quite simply to\r\n+me, 'You look more like a prince. I must call you Prince Charming.'\u0022\r\n+\r\n+\u0022Upon my word, Dorian, Miss Sibyl knows how to pay compliments.\u0022\r\n+\r\n+\u0022You don't understand her, Harry. She regarded me merely as a person\r\n+in a play. She knows nothing of life. She lives with her mother, a\r\n+faded tired woman who played Lady Capulet in a sort of magenta\r\n+dressing-wrapper on the first night, and looks as if she had seen\r\n+better days.\u0022\r\n+\r\n+\u0022I know that look. It depresses me,\u0022 murmured Lord Henry, examining\r\n+his rings.\r\n+\r\n+\u0022The Jew wanted to tell me her history, but I said it did not interest\r\n+me.\u0022\r\n+\r\n+\u0022You were quite right. There is always something infinitely mean about\r\n+other people's tragedies.\u0022\r\n+\r\n+\u0022Sibyl is the only thing I care about. What is it to me where she came\r\n+from? From her little head to her little feet, she is absolutely and\r\n+entirely divine. Every night of my life I go to see her act, and every\r\n+night she is more marvellous.\u0022\r\n+\r\n+\u0022That is the reason, I suppose, that you never dine with me now. I\r\n+thought you must have some curious romance on hand. You have; but it\r\n+is not quite what I expected.\u0022\r\n+\r\n+\u0022My dear Harry, we either lunch or sup together every day, and I have\r\n+been to the opera with you several times,\u0022 said Dorian, opening his\r\n+blue eyes in wonder.\r\n+\r\n+\u0022You always come dreadfully late.\u0022\r\n+\r\n+\u0022Well, I can't help going to see Sibyl play,\u0022 he cried, \u0022even if it is\r\n+only for a single act. I get hungry for her presence; and when I think\r\n+of the wonderful soul that is hidden away in that little ivory body, I\r\n+am filled with awe.\u0022\r\n+\r\n+\u0022You can dine with me to-night, Dorian, can't you?\u0022\r\n+\r\n+He shook his head. \u0022To-night she is Imogen,\u0022 he answered, \u0022and\r\n+to-morrow night she will be Juliet.\u0022\r\n+\r\n+\u0022When is she Sibyl Vane?\u0022\r\n+\r\n+\u0022Never.\u0022\r\n+\r\n+\u0022I congratulate you.\u0022\r\n+\r\n+\u0022How horrid you are! She is all the great heroines of the world in\r\n+one. She is more than an individual. You laugh, but I tell you she\r\n+has genius. I love her, and I must make her love me. You, who know\r\n+all the secrets of life, tell me how to charm Sibyl Vane to love me! I\r\n+want to make Romeo jealous. I want the dead lovers of the world to\r\n+hear our laughter and grow sad. I want a breath of our passion to stir\r\n+their dust into consciousness, to wake their ashes into pain. My God,\r\n+Harry, how I worship her!\u0022 He was walking up and down the room as he\r\n+spoke. Hectic spots of red burned on his cheeks. He was terribly\r\n+excited.\r\n+\r\n+Lord Henry watched him with a subtle sense of pleasure. How different\r\n+he was now from the shy frightened boy he had met in Basil Hallward's\r\n+studio! His nature had developed like a flower, had borne blossoms of\r\n+scarlet flame. Out of its secret hiding-place had crept his soul, and\r\n+desire had come to meet it on the way.\r\n+\r\n+\u0022And what do you propose to do?\u0022 said Lord Henry at last.\r\n+\r\n+\u0022I want you and Basil to come with me some night and see her act. I\r\n+have not the slightest fear of the result. You are certain to\r\n+acknowledge her genius. Then we must get her out of the Jew's hands.\r\n+She is bound to him for three years--at least for two years and eight\r\n+months--from the present time. I shall have to pay him something, of\r\n+course. When all that is settled, I shall take a West End theatre and\r\n+bring her out properly. She will make the world as mad as she has made\r\n+me.\u0022\r\n+\r\n+\u0022That would be impossible, my dear boy.\u0022\r\n+\r\n+\u0022Yes, she will. She has not merely art, consummate art-instinct, in\r\n+her, but she has personality also; and you have often told me that it\r\n+is personalities, not principles, that move the age.\u0022\r\n+\r\n+\u0022Well, what night shall we go?\u0022\r\n+\r\n+\u0022Let me see. To-day is Tuesday. Let us fix to-morrow. She plays\r\n+Juliet to-morrow.\u0022\r\n+\r\n+\u0022All right. The Bristol at eight o'clock; and I will get Basil.\u0022\r\n+\r\n+\u0022Not eight, Harry, please. Half-past six. We must be there before the\r\n+curtain rises. You must see her in the first act, where she meets\r\n+Romeo.\u0022\r\n+\r\n+\u0022Half-past six! What an hour! It will be like having a meat-tea, or\r\n+reading an English novel. It must be seven. No gentleman dines before\r\n+seven. Shall you see Basil between this and then? Or shall I write to\r\n+him?\u0022\r\n+\r\n+\u0022Dear Basil! I have not laid eyes on him for a week. It is rather\r\n+horrid of me, as he has sent me my portrait in the most wonderful\r\n+frame, specially designed by himself, and, though I am a little jealous\r\n+of the picture for being a whole month younger than I am, I must admit\r\n+that I delight in it. Perhaps you had better write to him. I don't\r\n+want to see him alone. He says things that annoy me. He gives me good\r\n+advice.\u0022\r\n+\r\n+Lord Henry smiled. \u0022People are very fond of giving away what they need\r\n+most themselves. It is what I call the depth of generosity.\u0022\r\n+\r\n+\u0022Oh, Basil is the best of fellows, but he seems to me to be just a bit\r\n+of a Philistine. Since I have known you, Harry, I have discovered\r\n+that.\u0022\r\n+\r\n+\u0022Basil, my dear boy, puts everything that is charming in him into his\r\n+work. The consequence is that he has nothing left for life but his\r\n+prejudices, his principles, and his common sense. The only artists I\r\n+have ever known who are personally delightful are bad artists. Good\r\n+artists exist simply in what they make, and consequently are perfectly\r\n+uninteresting in what they are. A great poet, a really great poet, is\r\n+the most unpoetical of all creatures. But inferior poets are\r\n+absolutely fascinating. The worse their rhymes are, the more\r\n+picturesque they look. The mere fact of having published a book of\r\n+second-rate sonnets makes a man quite irresistible. He lives the\r\n+poetry that he cannot write. The others write the poetry that they\r\n+dare not realize.\u0022\r\n+\r\n+\u0022I wonder is that really so, Harry?\u0022 said Dorian Gray, putting some\r\n+perfume on his handkerchief out of a large, gold-topped bottle that\r\n+stood on the table. \u0022It must be, if you say it. And now I am off.\r\n+Imogen is waiting for me. Don't forget about to-morrow. Good-bye.\u0022\r\n+\r\n+As he left the room, Lord Henry's heavy eyelids drooped, and he began\r\n+to think. Certainly few people had ever interested him so much as\r\n+Dorian Gray, and yet the lad's mad adoration of some one else caused\r\n+him not the slightest pang of annoyance or jealousy. He was pleased by\r\n+it. It made him a more interesting study. He had been always\r\n+enthralled by the methods of natural science, but the ordinary\r\n+subject-matter of that science had seemed to him trivial and of no\r\n+import. And so he had begun by vivisecting himself, as he had ended by\r\n+vivisecting others. Human life--that appeared to him the one thing\r\n+worth investigating. Compared to it there was nothing else of any\r\n+value. It was true that as one watched life in its curious crucible of\r\n+pain and pleasure, one could not wear over one's face a mask of glass,\r\n+nor keep the sulphurous fumes from troubling the brain and making the\r\n+imagination turbid with monstrous fancies and misshapen dreams. There\r\n+were poisons so subtle that to know their properties one had to sicken\r\n+of them. There were maladies so strange that one had to pass through\r\n+them if one sought to understand their nature. And, yet, what a great\r\n+reward one received! How wonderful the whole world became to one! To\r\n+note the curious hard logic of passion, and the emotional coloured life\r\n+of the intellect--to observe where they met, and where they separated,\r\n+at what point they were in unison, and at what point they were at\r\n+discord--there was a delight in that! What matter what the cost was?\r\n+One could never pay too high a price for any sensation.\r\n+\r\n+He was conscious--and the thought brought a gleam of pleasure into his\r\n+brown agate eyes--that it was through certain words of his, musical\r\n+words said with musical utterance, that Dorian Gray's soul had turned\r\n+to this white girl and bowed in worship before her. To a large extent\r\n+the lad was his own creation. He had made him premature. That was\r\n+something. Ordinary people waited till life disclosed to them its\r\n+secrets, but to the few, to the elect, the mysteries of life were\r\n+revealed before the veil was drawn away. Sometimes this was the effect\r\n+of art, and chiefly of the art of literature, which dealt immediately\r\n+with the passions and the intellect. But now and then a complex\r\n+personality took the place and assumed the office of art, was indeed,\r\n+in its way, a real work of art, life having its elaborate masterpieces,\r\n+just as poetry has, or sculpture, or painting.\r\n+\r\n+Yes, the lad was premature. He was gathering his harvest while it was\r\n+yet spring. The pulse and passion of youth were in him, but he was\r\n+becoming self-conscious. It was delightful to watch him. With his\r\n+beautiful face, and his beautiful soul, he was a thing to wonder at.\r\n+It was no matter how it all ended, or was destined to end. He was like\r\n+one of those gracious figures in a pageant or a play, whose joys seem\r\n+to be remote from one, but whose sorrows stir one's sense of beauty,\r\n+and whose wounds are like red roses.\r\n+\r\n+Soul and body, body and soul--how mysterious they were! There was\r\n+animalism in the soul, and the body had its moments of spirituality.\r\n+The senses could refine, and the intellect could degrade. Who could\r\n+say where the fleshly impulse ceased, or the psychical impulse began?\r\n+How shallow were the arbitrary definitions of ordinary psychologists!\r\n+And yet how difficult to decide between the claims of the various\r\n+schools! Was the soul a shadow seated in the house of sin? Or was the\r\n+body really in the soul, as Giordano Bruno thought? The separation of\r\n+spirit from matter was a mystery, and the union of spirit with matter\r\n+was a mystery also.\r\n+\r\n+He began to wonder whether we could ever make psychology so absolute a\r\n+science that each little spring of life would be revealed to us. As it\r\n+was, we always misunderstood ourselves and rarely understood others.\r\n+Experience was of no ethical value. It was merely the name men gave to\r\n+their mistakes. Moralists had, as a rule, regarded it as a mode of\r\n+warning, had claimed for it a certain ethical efficacy in the formation\r\n+of character, had praised it as something that taught us what to follow\r\n+and showed us what to avoid. But there was no motive power in\r\n+experience. It was as little of an active cause as conscience itself.\r\n+All that it really demonstrated was that our future would be the same\r\n+as our past, and that the sin we had done once, and with loathing, we\r\n+would do many times, and with joy.\r\n+\r\n+It was clear to him that the experimental method was the only method by\r\n+which one could arrive at any scientific analysis of the passions; and\r\n+certainly Dorian Gray was a subject made to his hand, and seemed to\r\n+promise rich and fruitful results. His sudden mad love for Sibyl Vane\r\n+was a psychological phenomenon of no small interest. There was no\r\n+doubt that curiosity had much to do with it, curiosity and the desire\r\n+for new experiences, yet it was not a simple, but rather a very complex\r\n+passion. What there was in it of the purely sensuous instinct of\r\n+boyhood had been transformed by the workings of the imagination,\r\n+changed into something that seemed to the lad himself to be remote from\r\n+sense, and was for that very reason all the more dangerous. It was the\r\n+passions about whose origin we deceived ourselves that tyrannized most\r\n+strongly over us. Our weakest motives were those of whose nature we\r\n+were conscious. It often happened that when we thought we were\r\n+experimenting on others we were really experimenting on ourselves.\r\n+\r\n+While Lord Henry sat dreaming on these things, a knock came to the\r\n+door, and his valet entered and reminded him it was time to dress for\r\n+dinner. He got up and looked out into the street. The sunset had\r\n+smitten into scarlet gold the upper windows of the houses opposite.\r\n+The panes glowed like plates of heated metal. The sky above was like a\r\n+faded rose. He thought of his friend's young fiery-coloured life and\r\n+wondered how it was all going to end.\r\n+\r\n+When he arrived home, about half-past twelve o'clock, he saw a telegram\r\n+lying on the hall table. He opened it and found it was from Dorian\r\n+Gray. It was to tell him that he was engaged to be married to Sibyl\r\n+Vane.\r\n+\r\n+\r\n+\r\n+CHAPTER 5\r\n+\r\n+\u0022Mother, Mother, I am so happy!\u0022 whispered the girl, burying her face\r\n+in the lap of the faded, tired-looking woman who, with back turned to\r\n+the shrill intrusive light, was sitting in the one arm-chair that their\r\n+dingy sitting-room contained. \u0022I am so happy!\u0022 she repeated, \u0022and you\r\n+must be happy, too!\u0022\r\n+\r\n+Mrs. Vane winced and put her thin, bismuth-whitened hands on her\r\n+daughter's head. \u0022Happy!\u0022 she echoed, \u0022I am only happy, Sibyl, when I\r\n+see you act. You must not think of anything but your acting. Mr.\r\n+Isaacs has been very good to us, and we owe him money.\u0022\r\n+\r\n+The girl looked up and pouted. \u0022Money, Mother?\u0022 she cried, \u0022what does\r\n+money matter? Love is more than money.\u0022\r\n+\r\n+\u0022Mr. Isaacs has advanced us fifty pounds to pay off our debts and to\r\n+get a proper outfit for James. You must not forget that, Sibyl. Fifty\r\n+pounds is a very large sum. Mr. Isaacs has been most considerate.\u0022\r\n+\r\n+\u0022He is not a gentleman, Mother, and I hate the way he talks to me,\u0022\r\n+said the girl, rising to her feet and going over to the window.\r\n+\r\n+\u0022I don't know how we could manage without him,\u0022 answered the elder\r\n+woman querulously.\r\n+\r\n+Sibyl Vane tossed her head and laughed. \u0022We don't want him any more,\r\n+Mother. Prince Charming rules life for us now.\u0022 Then she paused. A\r\n+rose shook in her blood and shadowed her cheeks. Quick breath parted\r\n+the petals of her lips. They trembled. Some southern wind of passion\r\n+swept over her and stirred the dainty folds of her dress. \u0022I love\r\n+him,\u0022 she said simply.\r\n+\r\n+\u0022Foolish child! foolish child!\u0022 was the parrot-phrase flung in answer.\r\n+The waving of crooked, false-jewelled fingers gave grotesqueness to the\r\n+words.\r\n+\r\n+The girl laughed again. The joy of a caged bird was in her voice. Her\r\n+eyes caught the melody and echoed it in radiance, then closed for a\r\n+moment, as though to hide their secret. When they opened, the mist of\r\n+a dream had passed across them.\r\n+\r\n+Thin-lipped wisdom spoke at her from the worn chair, hinted at\r\n+prudence, quoted from that book of cowardice whose author apes the name\r\n+of common sense. She did not listen. She was free in her prison of\r\n+passion. Her prince, Prince Charming, was with her. She had called on\r\n+memory to remake him. She had sent her soul to search for him, and it\r\n+had brought him back. His kiss burned again upon her mouth. Her\r\n+eyelids were warm with his breath.\r\n+\r\n+Then wisdom altered its method and spoke of espial and discovery. This\r\n+young man might be rich. If so, marriage should be thought of.\r\n+Against the shell of her ear broke the waves of worldly cunning. The\r\n+arrows of craft shot by her. She saw the thin lips moving, and smiled.\r\n+\r\n+Suddenly she felt the need to speak. The wordy silence troubled her.\r\n+\u0022Mother, Mother,\u0022 she cried, \u0022why does he love me so much? I know why\r\n+I love him. I love him because he is like what love himself should be.\r\n+But what does he see in me? I am not worthy of him. And yet--why, I\r\n+cannot tell--though I feel so much beneath him, I don't feel humble. I\r\n+feel proud, terribly proud. Mother, did you love my father as I love\r\n+Prince Charming?\u0022\r\n+\r\n+The elder woman grew pale beneath the coarse powder that daubed her\r\n+cheeks, and her dry lips twitched with a spasm of pain. Sybil rushed\r\n+to her, flung her arms round her neck, and kissed her. \u0022Forgive me,\r\n+Mother. I know it pains you to talk about our father. But it only\r\n+pains you because you loved him so much. Don't look so sad. I am as\r\n+happy to-day as you were twenty years ago. Ah! let me be happy for\r\n+ever!\u0022\r\n+\r\n+\u0022My child, you are far too young to think of falling in love. Besides,\r\n+what do you know of this young man? You don't even know his name. The\r\n+whole thing is most inconvenient, and really, when James is going away\r\n+to Australia, and I have so much to think of, I must say that you\r\n+should have shown more consideration. However, as I said before, if he\r\n+is rich ...\u0022\r\n+\r\n+\u0022Ah! Mother, Mother, let me be happy!\u0022\r\n+\r\n+Mrs. Vane glanced at her, and with one of those false theatrical\r\n+gestures that so often become a mode of second nature to a\r\n+stage-player, clasped her in her arms. At this moment, the door opened\r\n+and a young lad with rough brown hair came into the room. He was\r\n+thick-set of figure, and his hands and feet were large and somewhat\r\n+clumsy in movement. He was not so finely bred as his sister. One\r\n+would hardly have guessed the close relationship that existed between\r\n+them. Mrs. Vane fixed her eyes on him and intensified her smile. She\r\n+mentally elevated her son to the dignity of an audience. She felt sure\r\n+that the _tableau_ was interesting.\r\n+\r\n+\u0022You might keep some of your kisses for me, Sibyl, I think,\u0022 said the\r\n+lad with a good-natured grumble.\r\n+\r\n+\u0022Ah! but you don't like being kissed, Jim,\u0022 she cried. \u0022You are a\r\n+dreadful old bear.\u0022 And she ran across the room and hugged him.\r\n+\r\n+James Vane looked into his sister's face with tenderness. \u0022I want you\r\n+to come out with me for a walk, Sibyl. I don't suppose I shall ever\r\n+see this horrid London again. I am sure I don't want to.\u0022\r\n+\r\n+\u0022My son, don't say such dreadful things,\u0022 murmured Mrs. Vane, taking up\r\n+a tawdry theatrical dress, with a sigh, and beginning to patch it. She\r\n+felt a little disappointed that he had not joined the group. It would\r\n+have increased the theatrical picturesqueness of the situation.\r\n+\r\n+\u0022Why not, Mother? I mean it.\u0022\r\n+\r\n+\u0022You pain me, my son. I trust you will return from Australia in a\r\n+position of affluence. I believe there is no society of any kind in\r\n+the Colonies--nothing that I would call society--so when you have made\r\n+your fortune, you must come back and assert yourself in London.\u0022\r\n+\r\n+\u0022Society!\u0022 muttered the lad. \u0022I don't want to know anything about\r\n+that. I should like to make some money to take you and Sibyl off the\r\n+stage. I hate it.\u0022\r\n+\r\n+\u0022Oh, Jim!\u0022 said Sibyl, laughing, \u0022how unkind of you! But are you\r\n+really going for a walk with me? That will be nice! I was afraid you\r\n+were going to say good-bye to some of your friends--to Tom Hardy, who\r\n+gave you that hideous pipe, or Ned Langton, who makes fun of you for\r\n+smoking it. It is very sweet of you to let me have your last\r\n+afternoon. Where shall we go? Let us go to the park.\u0022\r\n+\r\n+\u0022I am too shabby,\u0022 he answered, frowning. \u0022Only swell people go to the\r\n+park.\u0022\r\n+\r\n+\u0022Nonsense, Jim,\u0022 she whispered, stroking the sleeve of his coat.\r\n+\r\n+He hesitated for a moment. \u0022Very well,\u0022 he said at last, \u0022but don't be\r\n+too long dressing.\u0022 She danced out of the door. One could hear her\r\n+singing as she ran upstairs. Her little feet pattered overhead.\r\n+\r\n+He walked up and down the room two or three times. Then he turned to\r\n+the still figure in the chair. \u0022Mother, are my things ready?\u0022 he asked.\r\n+\r\n+\u0022Quite ready, James,\u0022 she answered, keeping her eyes on her work. For\r\n+some months past she had felt ill at ease when she was alone with this\r\n+rough stern son of hers. Her shallow secret nature was troubled when\r\n+their eyes met. She used to wonder if he suspected anything. The\r\n+silence, for he made no other observation, became intolerable to her.\r\n+She began to complain. Women defend themselves by attacking, just as\r\n+they attack by sudden and strange surrenders. \u0022I hope you will be\r\n+contented, James, with your sea-faring life,\u0022 she said. \u0022You must\r\n+remember that it is your own choice. You might have entered a\r\n+solicitor's office. Solicitors are a very respectable class, and in\r\n+the country often dine with the best families.\u0022\r\n+\r\n+\u0022I hate offices, and I hate clerks,\u0022 he replied. \u0022But you are quite\r\n+right. I have chosen my own life. All I say is, watch over Sibyl.\r\n+Don't let her come to any harm. Mother, you must watch over her.\u0022\r\n+\r\n+\u0022James, you really talk very strangely. Of course I watch over Sibyl.\u0022\r\n+\r\n+\u0022I hear a gentleman comes every night to the theatre and goes behind to\r\n+talk to her. Is that right? What about that?\u0022\r\n+\r\n+\u0022You are speaking about things you don't understand, James. In the\r\n+profession we are accustomed to receive a great deal of most gratifying\r\n+attention. I myself used to receive many bouquets at one time. That\r\n+was when acting was really understood. As for Sibyl, I do not know at\r\n+present whether her attachment is serious or not. But there is no\r\n+doubt that the young man in question is a perfect gentleman. He is\r\n+always most polite to me. Besides, he has the appearance of being\r\n+rich, and the flowers he sends are lovely.\u0022\r\n+\r\n+\u0022You don't know his name, though,\u0022 said the lad harshly.\r\n+\r\n+\u0022No,\u0022 answered his mother with a placid expression in her face. \u0022He\r\n+has not yet revealed his real name. I think it is quite romantic of\r\n+him. He is probably a member of the aristocracy.\u0022\r\n+\r\n+James Vane bit his lip. \u0022Watch over Sibyl, Mother,\u0022 he cried, \u0022watch\r\n+over her.\u0022\r\n+\r\n+\u0022My son, you distress me very much. Sibyl is always under my special\r\n+care. Of course, if this gentleman is wealthy, there is no reason why\r\n+she should not contract an alliance with him. I trust he is one of the\r\n+aristocracy. He has all the appearance of it, I must say. It might be\r\n+a most brilliant marriage for Sibyl. They would make a charming\r\n+couple. His good looks are really quite remarkable; everybody notices\r\n+them.\u0022\r\n+\r\n+The lad muttered something to himself and drummed on the window-pane\r\n+with his coarse fingers. He had just turned round to say something\r\n+when the door opened and Sibyl ran in.\r\n+\r\n+\u0022How serious you both are!\u0022 she cried. \u0022What is the matter?\u0022\r\n+\r\n+\u0022Nothing,\u0022 he answered. \u0022I suppose one must be serious sometimes.\r\n+Good-bye, Mother; I will have my dinner at five o'clock. Everything is\r\n+packed, except my shirts, so you need not trouble.\u0022\r\n+\r\n+\u0022Good-bye, my son,\u0022 she answered with a bow of strained stateliness.\r\n+\r\n+She was extremely annoyed at the tone he had adopted with her, and\r\n+there was something in his look that had made her feel afraid.\r\n+\r\n+\u0022Kiss me, Mother,\u0022 said the girl. Her flowerlike lips touched the\r\n+withered cheek and warmed its frost.\r\n+\r\n+\u0022My child! my child!\u0022 cried Mrs. Vane, looking up to the ceiling in\r\n+search of an imaginary gallery.\r\n+\r\n+\u0022Come, Sibyl,\u0022 said her brother impatiently. He hated his mother's\r\n+affectations.\r\n+\r\n+They went out into the flickering, wind-blown sunlight and strolled\r\n+down the dreary Euston Road. The passersby glanced in wonder at the\r\n+sullen heavy youth who, in coarse, ill-fitting clothes, was in the\r\n+company of such a graceful, refined-looking girl. He was like a common\r\n+gardener walking with a rose.\r\n+\r\n+Jim frowned from time to time when he caught the inquisitive glance of\r\n+some stranger. He had that dislike of being stared at, which comes on\r\n+geniuses late in life and never leaves the commonplace. Sibyl,\r\n+however, was quite unconscious of the effect she was producing. Her\r\n+love was trembling in laughter on her lips. She was thinking of Prince\r\n+Charming, and, that she might think of him all the more, she did not\r\n+talk of him, but prattled on about the ship in which Jim was going to\r\n+sail, about the gold he was certain to find, about the wonderful\r\n+heiress whose life he was to save from the wicked, red-shirted\r\n+bushrangers. For he was not to remain a sailor, or a supercargo, or\r\n+whatever he was going to be. Oh, no! A sailor's existence was\r\n+dreadful. Fancy being cooped up in a horrid ship, with the hoarse,\r\n+hump-backed waves trying to get in, and a black wind blowing the masts\r\n+down and tearing the sails into long screaming ribands! He was to\r\n+leave the vessel at Melbourne, bid a polite good-bye to the captain,\r\n+and go off at once to the gold-fields. Before a week was over he was to\r\n+come across a large nugget of pure gold, the largest nugget that had\r\n+ever been discovered, and bring it down to the coast in a waggon\r\n+guarded by six mounted policemen. The bushrangers were to attack them\r\n+three times, and be defeated with immense slaughter. Or, no. He was\r\n+not to go to the gold-fields at all. They were horrid places, where\r\n+men got intoxicated, and shot each other in bar-rooms, and used bad\r\n+language. He was to be a nice sheep-farmer, and one evening, as he was\r\n+riding home, he was to see the beautiful heiress being carried off by a\r\n+robber on a black horse, and give chase, and rescue her. Of course,\r\n+she would fall in love with him, and he with her, and they would get\r\n+married, and come home, and live in an immense house in London. Yes,\r\n+there were delightful things in store for him. But he must be very\r\n+good, and not lose his temper, or spend his money foolishly. She was\r\n+only a year older than he was, but she knew so much more of life. He\r\n+must be sure, also, to write to her by every mail, and to say his\r\n+prayers each night before he went to sleep. God was very good, and\r\n+would watch over him. She would pray for him, too, and in a few years\r\n+he would come back quite rich and happy.\r\n+\r\n+The lad listened sulkily to her and made no answer. He was heart-sick\r\n+at leaving home.\r\n+\r\n+Yet it was not this alone that made him gloomy and morose.\r\n+Inexperienced though he was, he had still a strong sense of the danger\r\n+of Sibyl's position. This young dandy who was making love to her could\r\n+mean her no good. He was a gentleman, and he hated him for that, hated\r\n+him through some curious race-instinct for which he could not account,\r\n+and which for that reason was all the more dominant within him. He was\r\n+conscious also of the shallowness and vanity of his mother's nature,\r\n+and in that saw infinite peril for Sibyl and Sibyl's happiness.\r\n+Children begin by loving their parents; as they grow older they judge\r\n+them; sometimes they forgive them.\r\n+\r\n+His mother! He had something on his mind to ask of her, something that\r\n+he had brooded on for many months of silence. A chance phrase that he\r\n+had heard at the theatre, a whispered sneer that had reached his ears\r\n+one night as he waited at the stage-door, had set loose a train of\r\n+horrible thoughts. He remembered it as if it had been the lash of a\r\n+hunting-crop across his face. His brows knit together into a wedge-like\r\n+furrow, and with a twitch of pain he bit his underlip.\r\n+\r\n+\u0022You are not listening to a word I am saying, Jim,\u0022 cried Sibyl, \u0022and I\r\n+am making the most delightful plans for your future. Do say something.\u0022\r\n+\r\n+\u0022What do you want me to say?\u0022\r\n+\r\n+\u0022Oh! that you will be a good boy and not forget us,\u0022 she answered,\r\n+smiling at him.\r\n+\r\n+He shrugged his shoulders. \u0022You are more likely to forget me than I am\r\n+to forget you, Sibyl.\u0022\r\n+\r\n+She flushed. \u0022What do you mean, Jim?\u0022 she asked.\r\n+\r\n+\u0022You have a new friend, I hear. Who is he? Why have you not told me\r\n+about him? He means you no good.\u0022\r\n+\r\n+\u0022Stop, Jim!\u0022 she exclaimed. \u0022You must not say anything against him. I\r\n+love him.\u0022\r\n+\r\n+\u0022Why, you don't even know his name,\u0022 answered the lad. \u0022Who is he? I\r\n+have a right to know.\u0022\r\n+\r\n+\u0022He is called Prince Charming. Don't you like the name. Oh! you silly\r\n+boy! you should never forget it. If you only saw him, you would think\r\n+him the most wonderful person in the world. Some day you will meet\r\n+him--when you come back from Australia. You will like him so much.\r\n+Everybody likes him, and I ... love him. I wish you could come to the\r\n+theatre to-night. He is going to be there, and I am to play Juliet.\r\n+Oh! how I shall play it! Fancy, Jim, to be in love and play Juliet!\r\n+To have him sitting there! To play for his delight! I am afraid I may\r\n+frighten the company, frighten or enthrall them. To be in love is to\r\n+surpass one's self. Poor dreadful Mr. Isaacs will be shouting 'genius'\r\n+to his loafers at the bar. He has preached me as a dogma; to-night he\r\n+will announce me as a revelation. I feel it. And it is all his, his\r\n+only, Prince Charming, my wonderful lover, my god of graces. But I am\r\n+poor beside him. Poor? What does that matter? When poverty creeps in\r\n+at the door, love flies in through the window. Our proverbs want\r\n+rewriting. They were made in winter, and it is summer now; spring-time\r\n+for me, I think, a very dance of blossoms in blue skies.\u0022\r\n+\r\n+\u0022He is a gentleman,\u0022 said the lad sullenly.\r\n+\r\n+\u0022A prince!\u0022 she cried musically. \u0022What more do you want?\u0022\r\n+\r\n+\u0022He wants to enslave you.\u0022\r\n+\r\n+\u0022I shudder at the thought of being free.\u0022\r\n+\r\n+\u0022I want you to beware of him.\u0022\r\n+\r\n+\u0022To see him is to worship him; to know him is to trust him.\u0022\r\n+\r\n+\u0022Sibyl, you are mad about him.\u0022\r\n+\r\n+She laughed and took his arm. \u0022You dear old Jim, you talk as if you\r\n+were a hundred. Some day you will be in love yourself. Then you will\r\n+know what it is. Don't look so sulky. Surely you should be glad to\r\n+think that, though you are going away, you leave me happier than I have\r\n+ever been before. Life has been hard for us both, terribly hard and\r\n+difficult. But it will be different now. You are going to a new\r\n+world, and I have found one. Here are two chairs; let us sit down and\r\n+see the smart people go by.\u0022\r\n+\r\n+They took their seats amidst a crowd of watchers. The tulip-beds\r\n+across the road flamed like throbbing rings of fire. A white\r\n+dust--tremulous cloud of orris-root it seemed--hung in the panting air.\r\n+The brightly coloured parasols danced and dipped like monstrous\r\n+butterflies.\r\n+\r\n+She made her brother talk of himself, his hopes, his prospects. He\r\n+spoke slowly and with effort. They passed words to each other as\r\n+players at a game pass counters. Sibyl felt oppressed. She could not\r\n+communicate her joy. A faint smile curving that sullen mouth was all\r\n+the echo she could win. After some time she became silent. Suddenly\r\n+she caught a glimpse of golden hair and laughing lips, and in an open\r\n+carriage with two ladies Dorian Gray drove past.\r\n+\r\n+She started to her feet. \u0022There he is!\u0022 she cried.\r\n+\r\n+\u0022Who?\u0022 said Jim Vane.\r\n+\r\n+\u0022Prince Charming,\u0022 she answered, looking after the victoria.\r\n+\r\n+He jumped up and seized her roughly by the arm. \u0022Show him to me.\r\n+Which is he? Point him out. I must see him!\u0022 he exclaimed; but at\r\n+that moment the Duke of Berwick's four-in-hand came between, and when\r\n+it had left the space clear, the carriage had swept out of the park.\r\n+\r\n+\u0022He is gone,\u0022 murmured Sibyl sadly. \u0022I wish you had seen him.\u0022\r\n+\r\n+\u0022I wish I had, for as sure as there is a God in heaven, if he ever does\r\n+you any wrong, I shall kill him.\u0022\r\n+\r\n+She looked at him in horror. He repeated his words. They cut the air\r\n+like a dagger. The people round began to gape. A lady standing close\r\n+to her tittered.\r\n+\r\n+\u0022Come away, Jim; come away,\u0022 she whispered. He followed her doggedly\r\n+as she passed through the crowd. He felt glad at what he had said.\r\n+\r\n+When they reached the Achilles Statue, she turned round. There was\r\n+pity in her eyes that became laughter on her lips. She shook her head\r\n+at him. \u0022You are foolish, Jim, utterly foolish; a bad-tempered boy,\r\n+that is all. How can you say such horrible things? You don't know\r\n+what you are talking about. You are simply jealous and unkind. Ah! I\r\n+wish you would fall in love. Love makes people good, and what you said\r\n+was wicked.\u0022\r\n+\r\n+\u0022I am sixteen,\u0022 he answered, \u0022and I know what I am about. Mother is no\r\n+help to you. She doesn't understand how to look after you. I wish now\r\n+that I was not going to Australia at all. I have a great mind to chuck\r\n+the whole thing up. I would, if my articles hadn't been signed.\u0022\r\n+\r\n+\u0022Oh, don't be so serious, Jim. You are like one of the heroes of those\r\n+silly melodramas Mother used to be so fond of acting in. I am not\r\n+going to quarrel with you. I have seen him, and oh! to see him is\r\n+perfect happiness. We won't quarrel. I know you would never harm any\r\n+one I love, would you?\u0022\r\n+\r\n+\u0022Not as long as you love him, I suppose,\u0022 was the sullen answer.\r\n+\r\n+\u0022I shall love him for ever!\u0022 she cried.\r\n+\r\n+\u0022And he?\u0022\r\n+\r\n+\u0022For ever, too!\u0022\r\n+\r\n+\u0022He had better.\u0022\r\n+\r\n+She shrank from him. Then she laughed and put her hand on his arm. He\r\n+was merely a boy.\r\n+\r\n+At the Marble Arch they hailed an omnibus, which left them close to\r\n+their shabby home in the Euston Road. It was after five o'clock, and\r\n+Sibyl had to lie down for a couple of hours before acting. Jim\r\n+insisted that she should do so. He said that he would sooner part with\r\n+her when their mother was not present. She would be sure to make a\r\n+scene, and he detested scenes of every kind.\r\n+\r\n+In Sybil's own room they parted. There was jealousy in the lad's\r\n+heart, and a fierce murderous hatred of the stranger who, as it seemed\r\n+to him, had come between them. Yet, when her arms were flung round his\r\n+neck, and her fingers strayed through his hair, he softened and kissed\r\n+her with real affection. There were tears in his eyes as he went\r\n+downstairs.\r\n+\r\n+His mother was waiting for him below. She grumbled at his\r\n+unpunctuality, as he entered. He made no answer, but sat down to his\r\n+meagre meal. The flies buzzed round the table and crawled over the\r\n+stained cloth. Through the rumble of omnibuses, and the clatter of\r\n+street-cabs, he could hear the droning voice devouring each minute that\r\n+was left to him.\r\n+\r\n+After some time, he thrust away his plate and put his head in his\r\n+hands. He felt that he had a right to know. It should have been told\r\n+to him before, if it was as he suspected. Leaden with fear, his mother\r\n+watched him. Words dropped mechanically from her lips. A tattered\r\n+lace handkerchief twitched in her fingers. When the clock struck six,\r\n+he got up and went to the door. Then he turned back and looked at her.\r\n+Their eyes met. In hers he saw a wild appeal for mercy. It enraged\r\n+him.\r\n+\r\n+\u0022Mother, I have something to ask you,\u0022 he said. Her eyes wandered\r\n+vaguely about the room. She made no answer. \u0022Tell me the truth. I\r\n+have a right to know. Were you married to my father?\u0022\r\n+\r\n+She heaved a deep sigh. It was a sigh of relief. The terrible moment,\r\n+the moment that night and day, for weeks and months, she had dreaded,\r\n+had come at last, and yet she felt no terror. Indeed, in some measure\r\n+it was a disappointment to her. The vulgar directness of the question\r\n+called for a direct answer. The situation had not been gradually led\r\n+up to. It was crude. It reminded her of a bad rehearsal.\r\n+\r\n+\u0022No,\u0022 she answered, wondering at the harsh simplicity of life.\r\n+\r\n+\u0022My father was a scoundrel then!\u0022 cried the lad, clenching his fists.\r\n+\r\n+She shook her head. \u0022I knew he was not free. We loved each other very\r\n+much. If he had lived, he would have made provision for us. Don't\r\n+speak against him, my son. He was your father, and a gentleman.\r\n+Indeed, he was highly connected.\u0022\r\n+\r\n+An oath broke from his lips. \u0022I don't care for myself,\u0022 he exclaimed,\r\n+\u0022but don't let Sibyl.... It is a gentleman, isn't it, who is in love\r\n+with her, or says he is? Highly connected, too, I suppose.\u0022\r\n+\r\n+For a moment a hideous sense of humiliation came over the woman. Her\r\n+head drooped. She wiped her eyes with shaking hands. \u0022Sibyl has a\r\n+mother,\u0022 she murmured; \u0022I had none.\u0022\r\n+\r\n+The lad was touched. He went towards her, and stooping down, he kissed\r\n+her. \u0022I am sorry if I have pained you by asking about my father,\u0022 he\r\n+said, \u0022but I could not help it. I must go now. Good-bye. Don't forget\r\n+that you will have only one child now to look after, and believe me\r\n+that if this man wrongs my sister, I will find out who he is, track him\r\n+down, and kill him like a dog. I swear it.\u0022\r\n+\r\n+The exaggerated folly of the threat, the passionate gesture that\r\n+accompanied it, the mad melodramatic words, made life seem more vivid\r\n+to her. She was familiar with the atmosphere. She breathed more\r\n+freely, and for the first time for many months she really admired her\r\n+son. She would have liked to have continued the scene on the same\r\n+emotional scale, but he cut her short. Trunks had to be carried down\r\n+and mufflers looked for. The lodging-house drudge bustled in and out.\r\n+There was the bargaining with the cabman. The moment was lost in\r\n+vulgar details. It was with a renewed feeling of disappointment that\r\n+she waved the tattered lace handkerchief from the window, as her son\r\n+drove away. She was conscious that a great opportunity had been\r\n+wasted. She consoled herself by telling Sibyl how desolate she felt\r\n+her life would be, now that she had only one child to look after. She\r\n+remembered the phrase. It had pleased her. Of the threat she said\r\n+nothing. It was vividly and dramatically expressed. She felt that\r\n+they would all laugh at it some day.\r\n+\r\n+\r\n+\r\n+CHAPTER 6\r\n+\r\n+\u0022I suppose you have heard the news, Basil?\u0022 said Lord Henry that\r\n+evening as Hallward was shown into a little private room at the Bristol\r\n+where dinner had been laid for three.\r\n+\r\n+\u0022No, Harry,\u0022 answered the artist, giving his hat and coat to the bowing\r\n+waiter. \u0022What is it? Nothing about politics, I hope! They don't\r\n+interest me. There is hardly a single person in the House of Commons\r\n+worth painting, though many of them would be the better for a little\r\n+whitewashing.\u0022\r\n+\r\n+\u0022Dorian Gray is engaged to be married,\u0022 said Lord Henry, watching him\r\n+as he spoke.\r\n+\r\n+Hallward started and then frowned. \u0022Dorian engaged to be married!\u0022 he\r\n+cried. \u0022Impossible!\u0022\r\n+\r\n+\u0022It is perfectly true.\u0022\r\n+\r\n+\u0022To whom?\u0022\r\n+\r\n+\u0022To some little actress or other.\u0022\r\n+\r\n+\u0022I can't believe it. Dorian is far too sensible.\u0022\r\n+\r\n+\u0022Dorian is far too wise not to do foolish things now and then, my dear\r\n+Basil.\u0022\r\n+\r\n+\u0022Marriage is hardly a thing that one can do now and then, Harry.\u0022\r\n+\r\n+\u0022Except in America,\u0022 rejoined Lord Henry languidly. \u0022But I didn't say\r\n+he was married. I said he was engaged to be married. There is a great\r\n+difference. I have a distinct remembrance of being married, but I have\r\n+no recollection at all of being engaged. I am inclined to think that I\r\n+never was engaged.\u0022\r\n+\r\n+\u0022But think of Dorian's birth, and position, and wealth. It would be\r\n+absurd for him to marry so much beneath him.\u0022\r\n+\r\n+\u0022If you want to make him marry this girl, tell him that, Basil. He is\r\n+sure to do it, then. Whenever a man does a thoroughly stupid thing, it\r\n+is always from the noblest motives.\u0022\r\n+\r\n+\u0022I hope the girl is good, Harry. I don't want to see Dorian tied to\r\n+some vile creature, who might degrade his nature and ruin his\r\n+intellect.\u0022\r\n+\r\n+\u0022Oh, she is better than good--she is beautiful,\u0022 murmured Lord Henry,\r\n+sipping a glass of vermouth and orange-bitters. \u0022Dorian says she is\r\n+beautiful, and he is not often wrong about things of that kind. Your\r\n+portrait of him has quickened his appreciation of the personal\r\n+appearance of other people. It has had that excellent effect, amongst\r\n+others. We are to see her to-night, if that boy doesn't forget his\r\n+appointment.\u0022\r\n+\r\n+\u0022Are you serious?\u0022\r\n+\r\n+\u0022Quite serious, Basil. I should be miserable if I thought I should\r\n+ever be more serious than I am at the present moment.\u0022\r\n+\r\n+\u0022But do you approve of it, Harry?\u0022 asked the painter, walking up and\r\n+down the room and biting his lip. \u0022You can't approve of it, possibly.\r\n+It is some silly infatuation.\u0022\r\n+\r\n+\u0022I never approve, or disapprove, of anything now. It is an absurd\r\n+attitude to take towards life. We are not sent into the world to air\r\n+our moral prejudices. I never take any notice of what common people\r\n+say, and I never interfere with what charming people do. If a\r\n+personality fascinates me, whatever mode of expression that personality\r\n+selects is absolutely delightful to me. Dorian Gray falls in love with\r\n+a beautiful girl who acts Juliet, and proposes to marry her. Why not?\r\n+If he wedded Messalina, he would be none the less interesting. You\r\n+know I am not a champion of marriage. The real drawback to marriage is\r\n+that it makes one unselfish. And unselfish people are colourless.\r\n+They lack individuality. Still, there are certain temperaments that\r\n+marriage makes more complex. They retain their egotism, and add to it\r\n+many other egos. They are forced to have more than one life. They\r\n+become more highly organized, and to be highly organized is, I should\r\n+fancy, the object of man's existence. Besides, every experience is of\r\n+value, and whatever one may say against marriage, it is certainly an\r\n+experience. I hope that Dorian Gray will make this girl his wife,\r\n+passionately adore her for six months, and then suddenly become\r\n+fascinated by some one else. He would be a wonderful study.\u0022\r\n+\r\n+\u0022You don't mean a single word of all that, Harry; you know you don't.\r\n+If Dorian Gray's life were spoiled, no one would be sorrier than\r\n+yourself. You are much better than you pretend to be.\u0022\r\n+\r\n+Lord Henry laughed. \u0022The reason we all like to think so well of others\r\n+is that we are all afraid for ourselves. The basis of optimism is\r\n+sheer terror. We think that we are generous because we credit our\r\n+neighbour with the possession of those virtues that are likely to be a\r\n+benefit to us. We praise the banker that we may overdraw our account,\r\n+and find good qualities in the highwayman in the hope that he may spare\r\n+our pockets. I mean everything that I have said. I have the greatest\r\n+contempt for optimism. As for a spoiled life, no life is spoiled but\r\n+one whose growth is arrested. If you want to mar a nature, you have\r\n+merely to reform it. As for marriage, of course that would be silly,\r\n+but there are other and more interesting bonds between men and women.\r\n+I will certainly encourage them. They have the charm of being\r\n+fashionable. But here is Dorian himself. He will tell you more than I\r\n+can.\u0022\r\n+\r\n+\u0022My dear Harry, my dear Basil, you must both congratulate me!\u0022 said the\r\n+lad, throwing off his evening cape with its satin-lined wings and\r\n+shaking each of his friends by the hand in turn. \u0022I have never been so\r\n+happy. Of course, it is sudden--all really delightful things are. And\r\n+yet it seems to me to be the one thing I have been looking for all my\r\n+life.\u0022 He was flushed with excitement and pleasure, and looked\r\n+extraordinarily handsome.\r\n+\r\n+\u0022I hope you will always be very happy, Dorian,\u0022 said Hallward, \u0022but I\r\n+don't quite forgive you for not having let me know of your engagement.\r\n+You let Harry know.\u0022\r\n+\r\n+\u0022And I don't forgive you for being late for dinner,\u0022 broke in Lord\r\n+Henry, putting his hand on the lad's shoulder and smiling as he spoke.\r\n+\u0022Come, let us sit down and try what the new _chef_ here is like, and then\r\n+you will tell us how it all came about.\u0022\r\n+\r\n+\u0022There is really not much to tell,\u0022 cried Dorian as they took their\r\n+seats at the small round table. \u0022What happened was simply this. After\r\n+I left you yesterday evening, Harry, I dressed, had some dinner at that\r\n+little Italian restaurant in Rupert Street you introduced me to, and\r\n+went down at eight o'clock to the theatre. Sibyl was playing Rosalind.\r\n+Of course, the scenery was dreadful and the Orlando absurd. But Sibyl!\r\n+You should have seen her! When she came on in her boy's clothes, she\r\n+was perfectly wonderful. She wore a moss-coloured velvet jerkin with\r\n+cinnamon sleeves, slim, brown, cross-gartered hose, a dainty little\r\n+green cap with a hawk's feather caught in a jewel, and a hooded cloak\r\n+lined with dull red. She had never seemed to me more exquisite. She\r\n+had all the delicate grace of that Tanagra figurine that you have in\r\n+your studio, Basil. Her hair clustered round her face like dark leaves\r\n+round a pale rose. As for her acting--well, you shall see her\r\n+to-night. She is simply a born artist. I sat in the dingy box\r\n+absolutely enthralled. I forgot that I was in London and in the\r\n+nineteenth century. I was away with my love in a forest that no man\r\n+had ever seen. After the performance was over, I went behind and spoke\r\n+to her. As we were sitting together, suddenly there came into her eyes\r\n+a look that I had never seen there before. My lips moved towards hers.\r\n+We kissed each other. I can't describe to you what I felt at that\r\n+moment. It seemed to me that all my life had been narrowed to one\r\n+perfect point of rose-coloured joy. She trembled all over and shook\r\n+like a white narcissus. Then she flung herself on her knees and kissed\r\n+my hands. I feel that I should not tell you all this, but I can't help\r\n+it. Of course, our engagement is a dead secret. She has not even told\r\n+her own mother. I don't know what my guardians will say. Lord Radley\r\n+is sure to be furious. I don't care. I shall be of age in less than a\r\n+year, and then I can do what I like. I have been right, Basil, haven't\r\n+I, to take my love out of poetry and to find my wife in Shakespeare's\r\n+plays? Lips that Shakespeare taught to speak have whispered their\r\n+secret in my ear. I have had the arms of Rosalind around me, and\r\n+kissed Juliet on the mouth.\u0022\r\n+\r\n+\u0022Yes, Dorian, I suppose you were right,\u0022 said Hallward slowly.\r\n+\r\n+\u0022Have you seen her to-day?\u0022 asked Lord Henry.\r\n+\r\n+Dorian Gray shook his head. \u0022I left her in the forest of Arden; I\r\n+shall find her in an orchard in Verona.\u0022\r\n+\r\n+Lord Henry sipped his champagne in a meditative manner. \u0022At what\r\n+particular point did you mention the word marriage, Dorian? And what\r\n+did she say in answer? Perhaps you forgot all about it.\u0022\r\n+\r\n+\u0022My dear Harry, I did not treat it as a business transaction, and I did\r\n+not make any formal proposal. I told her that I loved her, and she\r\n+said she was not worthy to be my wife. Not worthy! Why, the whole\r\n+world is nothing to me compared with her.\u0022\r\n+\r\n+\u0022Women are wonderfully practical,\u0022 murmured Lord Henry, \u0022much more\r\n+practical than we are. In situations of that kind we often forget to\r\n+say anything about marriage, and they always remind us.\u0022\r\n+\r\n+Hallward laid his hand upon his arm. \u0022Don't, Harry. You have annoyed\r\n+Dorian. He is not like other men. He would never bring misery upon\r\n+any one. His nature is too fine for that.\u0022\r\n+\r\n+Lord Henry looked across the table. \u0022Dorian is never annoyed with me,\u0022\r\n+he answered. \u0022I asked the question for the best reason possible, for\r\n+the only reason, indeed, that excuses one for asking any\r\n+question--simple curiosity. I have a theory that it is always the\r\n+women who propose to us, and not we who propose to the women. Except,\r\n+of course, in middle-class life. But then the middle classes are not\r\n+modern.\u0022\r\n+\r\n+Dorian Gray laughed, and tossed his head. \u0022You are quite incorrigible,\r\n+Harry; but I don't mind. It is impossible to be angry with you. When\r\n+you see Sibyl Vane, you will feel that the man who could wrong her\r\n+would be a beast, a beast without a heart. I cannot understand how any\r\n+one can wish to shame the thing he loves. I love Sibyl Vane. I want\r\n+to place her on a pedestal of gold and to see the world worship the\r\n+woman who is mine. What is marriage? An irrevocable vow. You mock at\r\n+it for that. Ah! don't mock. It is an irrevocable vow that I want to\r\n+take. Her trust makes me faithful, her belief makes me good. When I\r\n+am with her, I regret all that you have taught me. I become different\r\n+from what you have known me to be. I am changed, and the mere touch of\r\n+Sibyl Vane's hand makes me forget you and all your wrong, fascinating,\r\n+poisonous, delightful theories.\u0022\r\n+\r\n+\u0022And those are ...?\u0022 asked Lord Henry, helping himself to some salad.\r\n+\r\n+\u0022Oh, your theories about life, your theories about love, your theories\r\n+about pleasure. All your theories, in fact, Harry.\u0022\r\n+\r\n+\u0022Pleasure is the only thing worth having a theory about,\u0022 he answered\r\n+in his slow melodious voice. \u0022But I am afraid I cannot claim my theory\r\n+as my own. It belongs to Nature, not to me. Pleasure is Nature's\r\n+test, her sign of approval. When we are happy, we are always good, but\r\n+when we are good, we are not always happy.\u0022\r\n+\r\n+\u0022Ah! but what do you mean by good?\u0022 cried Basil Hallward.\r\n+\r\n+\u0022Yes,\u0022 echoed Dorian, leaning back in his chair and looking at Lord\r\n+Henry over the heavy clusters of purple-lipped irises that stood in the\r\n+centre of the table, \u0022what do you mean by good, Harry?\u0022\r\n+\r\n+\u0022To be good is to be in harmony with one's self,\u0022 he replied, touching\r\n+the thin stem of his glass with his pale, fine-pointed fingers.\r\n+\u0022Discord is to be forced to be in harmony with others. One's own\r\n+life--that is the important thing. As for the lives of one's\r\n+neighbours, if one wishes to be a prig or a Puritan, one can flaunt\r\n+one's moral views about them, but they are not one's concern. Besides,\r\n+individualism has really the higher aim. Modern morality consists in\r\n+accepting the standard of one's age. I consider that for any man of\r\n+culture to accept the standard of his age is a form of the grossest\r\n+immorality.\u0022\r\n+\r\n+\u0022But, surely, if one lives merely for one's self, Harry, one pays a\r\n+terrible price for doing so?\u0022 suggested the painter.\r\n+\r\n+\u0022Yes, we are overcharged for everything nowadays. I should fancy that\r\n+the real tragedy of the poor is that they can afford nothing but\r\n+self-denial. Beautiful sins, like beautiful things, are the privilege\r\n+of the rich.\u0022\r\n+\r\n+\u0022One has to pay in other ways but money.\u0022\r\n+\r\n+\u0022What sort of ways, Basil?\u0022\r\n+\r\n+\u0022Oh! I should fancy in remorse, in suffering, in ... well, in the\r\n+consciousness of degradation.\u0022\r\n+\r\n+Lord Henry shrugged his shoulders. \u0022My dear fellow, mediaeval art is\r\n+charming, but mediaeval emotions are out of date. One can use them in\r\n+fiction, of course. But then the only things that one can use in\r\n+fiction are the things that one has ceased to use in fact. Believe me,\r\n+no civilized man ever regrets a pleasure, and no uncivilized man ever\r\n+knows what a pleasure is.\u0022\r\n+\r\n+\u0022I know what pleasure is,\u0022 cried Dorian Gray. \u0022It is to adore some\r\n+one.\u0022\r\n+\r\n+\u0022That is certainly better than being adored,\u0022 he answered, toying with\r\n+some fruits. \u0022Being adored is a nuisance. Women treat us just as\r\n+humanity treats its gods. They worship us, and are always bothering us\r\n+to do something for them.\u0022\r\n+\r\n+\u0022I should have said that whatever they ask for they had first given to\r\n+us,\u0022 murmured the lad gravely. \u0022They create love in our natures. They\r\n+have a right to demand it back.\u0022\r\n+\r\n+\u0022That is quite true, Dorian,\u0022 cried Hallward.\r\n+\r\n+\u0022Nothing is ever quite true,\u0022 said Lord Henry.\r\n+\r\n+\u0022This is,\u0022 interrupted Dorian. \u0022You must admit, Harry, that women give\r\n+to men the very gold of their lives.\u0022\r\n+\r\n+\u0022Possibly,\u0022 he sighed, \u0022but they invariably want it back in such very\r\n+small change. That is the worry. Women, as some witty Frenchman once\r\n+put it, inspire us with the desire to do masterpieces and always\r\n+prevent us from carrying them out.\u0022\r\n+\r\n+\u0022Harry, you are dreadful! I don't know why I like you so much.\u0022\r\n+\r\n+\u0022You will always like me, Dorian,\u0022 he replied. \u0022Will you have some\r\n+coffee, you fellows? Waiter, bring coffee, and _fine-champagne_, and\r\n+some cigarettes. No, don't mind the cigarettes--I have some. Basil, I\r\n+can't allow you to smoke cigars. You must have a cigarette. A\r\n+cigarette is the perfect type of a perfect pleasure. It is exquisite,\r\n+and it leaves one unsatisfied. What more can one want? Yes, Dorian,\r\n+you will always be fond of me. I represent to you all the sins you\r\n+have never had the courage to commit.\u0022\r\n+\r\n+\u0022What nonsense you talk, Harry!\u0022 cried the lad, taking a light from a\r\n+fire-breathing silver dragon that the waiter had placed on the table.\r\n+\u0022Let us go down to the theatre. When Sibyl comes on the stage you will\r\n+have a new ideal of life. She will represent something to you that you\r\n+have never known.\u0022\r\n+\r\n+\u0022I have known everything,\u0022 said Lord Henry, with a tired look in his\r\n+eyes, \u0022but I am always ready for a new emotion. I am afraid, however,\r\n+that, for me at any rate, there is no such thing. Still, your\r\n+wonderful girl may thrill me. I love acting. It is so much more real\r\n+than life. Let us go. Dorian, you will come with me. I am so sorry,\r\n+Basil, but there is only room for two in the brougham. You must follow\r\n+us in a hansom.\u0022\r\n+\r\n+They got up and put on their coats, sipping their coffee standing. The\r\n+painter was silent and preoccupied. There was a gloom over him. He\r\n+could not bear this marriage, and yet it seemed to him to be better\r\n+than many other things that might have happened. After a few minutes,\r\n+they all passed downstairs. He drove off by himself, as had been\r\n+arranged, and watched the flashing lights of the little brougham in\r\n+front of him. A strange sense of loss came over him. He felt that\r\n+Dorian Gray would never again be to him all that he had been in the\r\n+past. Life had come between them.... His eyes darkened, and the\r\n+crowded flaring streets became blurred to his eyes. When the cab drew\r\n+up at the theatre, it seemed to him that he had grown years older.\r\n+\r\n+\r\n+\r\n+CHAPTER 7\r\n+\r\n+For some reason or other, the house was crowded that night, and the fat\r\n+Jew manager who met them at the door was beaming from ear to ear with\r\n+an oily tremulous smile. He escorted them to their box with a sort of\r\n+pompous humility, waving his fat jewelled hands and talking at the top\r\n+of his voice. Dorian Gray loathed him more than ever. He felt as if\r\n+he had come to look for Miranda and had been met by Caliban. Lord\r\n+Henry, upon the other hand, rather liked him. At least he declared he\r\n+did, and insisted on shaking him by the hand and assuring him that he\r\n+was proud to meet a man who had discovered a real genius and gone\r\n+bankrupt over a poet. Hallward amused himself with watching the faces\r\n+in the pit. The heat was terribly oppressive, and the huge sunlight\r\n+flamed like a monstrous dahlia with petals of yellow fire. The youths\r\n+in the gallery had taken off their coats and waistcoats and hung them\r\n+over the side. They talked to each other across the theatre and shared\r\n+their oranges with the tawdry girls who sat beside them. Some women\r\n+were laughing in the pit. Their voices were horribly shrill and\r\n+discordant. The sound of the popping of corks came from the bar.\r\n+\r\n+\u0022What a place to find one's divinity in!\u0022 said Lord Henry.\r\n+\r\n+\u0022Yes!\u0022 answered Dorian Gray. \u0022It was here I found her, and she is\r\n+divine beyond all living things. When she acts, you will forget\r\n+everything. These common rough people, with their coarse faces and\r\n+brutal gestures, become quite different when she is on the stage. They\r\n+sit silently and watch her. They weep and laugh as she wills them to\r\n+do. She makes them as responsive as a violin. She spiritualizes them,\r\n+and one feels that they are of the same flesh and blood as one's self.\u0022\r\n+\r\n+\u0022The same flesh and blood as one's self! Oh, I hope not!\u0022 exclaimed\r\n+Lord Henry, who was scanning the occupants of the gallery through his\r\n+opera-glass.\r\n+\r\n+\u0022Don't pay any attention to him, Dorian,\u0022 said the painter. \u0022I\r\n+understand what you mean, and I believe in this girl. Any one you love\r\n+must be marvellous, and any girl who has the effect you describe must\r\n+be fine and noble. To spiritualize one's age--that is something worth\r\n+doing. If this girl can give a soul to those who have lived without\r\n+one, if she can create the sense of beauty in people whose lives have\r\n+been sordid and ugly, if she can strip them of their selfishness and\r\n+lend them tears for sorrows that are not their own, she is worthy of\r\n+all your adoration, worthy of the adoration of the world. This\r\n+marriage is quite right. I did not think so at first, but I admit it\r\n+now. The gods made Sibyl Vane for you. Without her you would have\r\n+been incomplete.\u0022\r\n+\r\n+\u0022Thanks, Basil,\u0022 answered Dorian Gray, pressing his hand. \u0022I knew that\r\n+you would understand me. Harry is so cynical, he terrifies me. But\r\n+here is the orchestra. It is quite dreadful, but it only lasts for\r\n+about five minutes. Then the curtain rises, and you will see the girl\r\n+to whom I am going to give all my life, to whom I have given everything\r\n+that is good in me.\u0022\r\n+\r\n+A quarter of an hour afterwards, amidst an extraordinary turmoil of\r\n+applause, Sibyl Vane stepped on to the stage. Yes, she was certainly\r\n+lovely to look at--one of the loveliest creatures, Lord Henry thought,\r\n+that he had ever seen. There was something of the fawn in her shy\r\n+grace and startled eyes. A faint blush, like the shadow of a rose in a\r\n+mirror of silver, came to her cheeks as she glanced at the crowded\r\n+enthusiastic house. She stepped back a few paces and her lips seemed\r\n+to tremble. Basil Hallward leaped to his feet and began to applaud.\r\n+Motionless, and as one in a dream, sat Dorian Gray, gazing at her.\r\n+Lord Henry peered through his glasses, murmuring, \u0022Charming! charming!\u0022\r\n+\r\n+The scene was the hall of Capulet's house, and Romeo in his pilgrim's\r\n+dress had entered with Mercutio and his other friends. The band, such\r\n+as it was, struck up a few bars of music, and the dance began. Through\r\n+the crowd of ungainly, shabbily dressed actors, Sibyl Vane moved like a\r\n+creature from a finer world. Her body swayed, while she danced, as a\r\n+plant sways in the water. The curves of her throat were the curves of\r\n+a white lily. Her hands seemed to be made of cool ivory.\r\n+\r\n+Yet she was curiously listless. She showed no sign of joy when her\r\n+eyes rested on Romeo. The few words she had to speak--\r\n+\r\n+ Good pilgrim, you do wrong your hand too much,\r\n+ Which mannerly devotion shows in this;\r\n+ For saints have hands that pilgrims' hands do touch,\r\n+ And palm to palm is holy palmers' kiss--\r\n+\r\n+with the brief dialogue that follows, were spoken in a thoroughly\r\n+artificial manner. The voice was exquisite, but from the point of view\r\n+of tone it was absolutely false. It was wrong in colour. It took away\r\n+all the life from the verse. It made the passion unreal.\r\n+\r\n+Dorian Gray grew pale as he watched her. He was puzzled and anxious.\r\n+Neither of his friends dared to say anything to him. She seemed to\r\n+them to be absolutely incompetent. They were horribly disappointed.\r\n+\r\n+Yet they felt that the true test of any Juliet is the balcony scene of\r\n+the second act. They waited for that. If she failed there, there was\r\n+nothing in her.\r\n+\r\n+She looked charming as she came out in the moonlight. That could not\r\n+be denied. But the staginess of her acting was unbearable, and grew\r\n+worse as she went on. Her gestures became absurdly artificial. She\r\n+overemphasized everything that she had to say. The beautiful passage--\r\n+\r\n+ Thou knowest the mask of night is on my face,\r\n+ Else would a maiden blush bepaint my cheek\r\n+ For that which thou hast heard me speak to-night--\r\n+\r\n+was declaimed with the painful precision of a schoolgirl who has been\r\n+taught to recite by some second-rate professor of elocution. When she\r\n+leaned over the balcony and came to those wonderful lines--\r\n+\r\n+ Although I joy in thee,\r\n+ I have no joy of this contract to-night:\r\n+ It is too rash, too unadvised, too sudden;\r\n+ Too like the lightning, which doth cease to be\r\n+ Ere one can say, \u0022It lightens.\u0022 Sweet, good-night!\r\n+ This bud of love by summer's ripening breath\r\n+ May prove a beauteous flower when next we meet--\r\n+\r\n+she spoke the words as though they conveyed no meaning to her. It was\r\n+not nervousness. Indeed, so far from being nervous, she was absolutely\r\n+self-contained. It was simply bad art. She was a complete failure.\r\n+\r\n+Even the common uneducated audience of the pit and gallery lost their\r\n+interest in the play. They got restless, and began to talk loudly and\r\n+to whistle. The Jew manager, who was standing at the back of the\r\n+dress-circle, stamped and swore with rage. The only person unmoved was\r\n+the girl herself.\r\n+\r\n+When the second act was over, there came a storm of hisses, and Lord\r\n+Henry got up from his chair and put on his coat. \u0022She is quite\r\n+beautiful, Dorian,\u0022 he said, \u0022but she can't act. Let us go.\u0022\r\n+\r\n+\u0022I am going to see the play through,\u0022 answered the lad, in a hard\r\n+bitter voice. \u0022I am awfully sorry that I have made you waste an\r\n+evening, Harry. I apologize to you both.\u0022\r\n+\r\n+\u0022My dear Dorian, I should think Miss Vane was ill,\u0022 interrupted\r\n+Hallward. \u0022We will come some other night.\u0022\r\n+\r\n+\u0022I wish she were ill,\u0022 he rejoined. \u0022But she seems to me to be simply\r\n+callous and cold. She has entirely altered. Last night she was a\r\n+great artist. This evening she is merely a commonplace mediocre\r\n+actress.\u0022\r\n+\r\n+\u0022Don't talk like that about any one you love, Dorian. Love is a more\r\n+wonderful thing than art.\u0022\r\n+\r\n+\u0022They are both simply forms of imitation,\u0022 remarked Lord Henry. \u0022But\r\n+do let us go. Dorian, you must not stay here any longer. It is not\r\n+good for one's morals to see bad acting. Besides, I don't suppose you\r\n+will want your wife to act, so what does it matter if she plays Juliet\r\n+like a wooden doll? She is very lovely, and if she knows as little\r\n+about life as she does about acting, she will be a delightful\r\n+experience. There are only two kinds of people who are really\r\n+fascinating--people who know absolutely everything, and people who know\r\n+absolutely nothing. Good heavens, my dear boy, don't look so tragic!\r\n+The secret of remaining young is never to have an emotion that is\r\n+unbecoming. Come to the club with Basil and myself. We will smoke\r\n+cigarettes and drink to the beauty of Sibyl Vane. She is beautiful.\r\n+What more can you want?\u0022\r\n+\r\n+\u0022Go away, Harry,\u0022 cried the lad. \u0022I want to be alone. Basil, you must\r\n+go. Ah! can't you see that my heart is breaking?\u0022 The hot tears came\r\n+to his eyes. His lips trembled, and rushing to the back of the box, he\r\n+leaned up against the wall, hiding his face in his hands.\r\n+\r\n+\u0022Let us go, Basil,\u0022 said Lord Henry with a strange tenderness in his\r\n+voice, and the two young men passed out together.\r\n+\r\n+A few moments afterwards the footlights flared up and the curtain rose\r\n+on the third act. Dorian Gray went back to his seat. He looked pale,\r\n+and proud, and indifferent. The play dragged on, and seemed\r\n+interminable. Half of the audience went out, tramping in heavy boots\r\n+and laughing. The whole thing was a _fiasco_. The last act was played\r\n+to almost empty benches. The curtain went down on a titter and some\r\n+groans.\r\n+\r\n+As soon as it was over, Dorian Gray rushed behind the scenes into the\r\n+greenroom. The girl was standing there alone, with a look of triumph\r\n+on her face. Her eyes were lit with an exquisite fire. There was a\r\n+radiance about her. Her parted lips were smiling over some secret of\r\n+their own.\r\n+\r\n+When he entered, she looked at him, and an expression of infinite joy\r\n+came over her. \u0022How badly I acted to-night, Dorian!\u0022 she cried.\r\n+\r\n+\u0022Horribly!\u0022 he answered, gazing at her in amazement. \u0022Horribly! It\r\n+was dreadful. Are you ill? You have no idea what it was. You have no\r\n+idea what I suffered.\u0022\r\n+\r\n+The girl smiled. \u0022Dorian,\u0022 she answered, lingering over his name with\r\n+long-drawn music in her voice, as though it were sweeter than honey to\r\n+the red petals of her mouth. \u0022Dorian, you should have understood. But\r\n+you understand now, don't you?\u0022\r\n+\r\n+\u0022Understand what?\u0022 he asked, angrily.\r\n+\r\n+\u0022Why I was so bad to-night. Why I shall always be bad. Why I shall\r\n+never act well again.\u0022\r\n+\r\n+He shrugged his shoulders. \u0022You are ill, I suppose. When you are ill\r\n+you shouldn't act. You make yourself ridiculous. My friends were\r\n+bored. I was bored.\u0022\r\n+\r\n+She seemed not to listen to him. She was transfigured with joy. An\r\n+ecstasy of happiness dominated her.\r\n+\r\n+\u0022Dorian, Dorian,\u0022 she cried, \u0022before I knew you, acting was the one\r\n+reality of my life. It was only in the theatre that I lived. I\r\n+thought that it was all true. I was Rosalind one night and Portia the\r\n+other. The joy of Beatrice was my joy, and the sorrows of Cordelia\r\n+were mine also. I believed in everything. The common people who acted\r\n+with me seemed to me to be godlike. The painted scenes were my world.\r\n+I knew nothing but shadows, and I thought them real. You came--oh, my\r\n+beautiful love!--and you freed my soul from prison. You taught me what\r\n+reality really is. To-night, for the first time in my life, I saw\r\n+through the hollowness, the sham, the silliness of the empty pageant in\r\n+which I had always played. To-night, for the first time, I became\r\n+conscious that the Romeo was hideous, and old, and painted, that the\r\n+moonlight in the orchard was false, that the scenery was vulgar, and\r\n+that the words I had to speak were unreal, were not my words, were not\r\n+what I wanted to say. You had brought me something higher, something\r\n+of which all art is but a reflection. You had made me understand what\r\n+love really is. My love! My love! Prince Charming! Prince of life!\r\n+I have grown sick of shadows. You are more to me than all art can ever\r\n+be. What have I to do with the puppets of a play? When I came on\r\n+to-night, I could not understand how it was that everything had gone\r\n+from me. I thought that I was going to be wonderful. I found that I\r\n+could do nothing. Suddenly it dawned on my soul what it all meant.\r\n+The knowledge was exquisite to me. I heard them hissing, and I smiled.\r\n+What could they know of love such as ours? Take me away, Dorian--take\r\n+me away with you, where we can be quite alone. I hate the stage. I\r\n+might mimic a passion that I do not feel, but I cannot mimic one that\r\n+burns me like fire. Oh, Dorian, Dorian, you understand now what it\r\n+signifies? Even if I could do it, it would be profanation for me to\r\n+play at being in love. You have made me see that.\u0022\r\n+\r\n+He flung himself down on the sofa and turned away his face. \u0022You have\r\n+killed my love,\u0022 he muttered.\r\n+\r\n+She looked at him in wonder and laughed. He made no answer. She came\r\n+across to him, and with her little fingers stroked his hair. She knelt\r\n+down and pressed his hands to her lips. He drew them away, and a\r\n+shudder ran through him.\r\n+\r\n+Then he leaped up and went to the door. \u0022Yes,\u0022 he cried, \u0022you have\r\n+killed my love. You used to stir my imagination. Now you don't even\r\n+stir my curiosity. You simply produce no effect. I loved you because\r\n+you were marvellous, because you had genius and intellect, because you\r\n+realized the dreams of great poets and gave shape and substance to the\r\n+shadows of art. You have thrown it all away. You are shallow and\r\n+stupid. My God! how mad I was to love you! What a fool I have been!\r\n+You are nothing to me now. I will never see you again. I will never\r\n+think of you. I will never mention your name. You don't know what you\r\n+were to me, once. Why, once ... Oh, I can't bear to think of it! I\r\n+wish I had never laid eyes upon you! You have spoiled the romance of\r\n+my life. How little you can know of love, if you say it mars your art!\r\n+Without your art, you are nothing. I would have made you famous,\r\n+splendid, magnificent. The world would have worshipped you, and you\r\n+would have borne my name. What are you now? A third-rate actress with\r\n+a pretty face.\u0022\r\n+\r\n+The girl grew white, and trembled. She clenched her hands together,\r\n+and her voice seemed to catch in her throat. \u0022You are not serious,\r\n+Dorian?\u0022 she murmured. \u0022You are acting.\u0022\r\n+\r\n+\u0022Acting! I leave that to you. You do it so well,\u0022 he answered\r\n+bitterly.\r\n+\r\n+She rose from her knees and, with a piteous expression of pain in her\r\n+face, came across the room to him. She put her hand upon his arm and\r\n+looked into his eyes. He thrust her back. \u0022Don't touch me!\u0022 he cried.\r\n+\r\n+A low moan broke from her, and she flung herself at his feet and lay\r\n+there like a trampled flower. \u0022Dorian, Dorian, don't leave me!\u0022 she\r\n+whispered. \u0022I am so sorry I didn't act well. I was thinking of you\r\n+all the time. But I will try--indeed, I will try. It came so suddenly\r\n+across me, my love for you. I think I should never have known it if\r\n+you had not kissed me--if we had not kissed each other. Kiss me again,\r\n+my love. Don't go away from me. I couldn't bear it. Oh! don't go\r\n+away from me. My brother ... No; never mind. He didn't mean it. He\r\n+was in jest.... But you, oh! can't you forgive me for to-night? I will\r\n+work so hard and try to improve. Don't be cruel to me, because I love\r\n+you better than anything in the world. After all, it is only once that\r\n+I have not pleased you. But you are quite right, Dorian. I should\r\n+have shown myself more of an artist. It was foolish of me, and yet I\r\n+couldn't help it. Oh, don't leave me, don't leave me.\u0022 A fit of\r\n+passionate sobbing choked her. She crouched on the floor like a\r\n+wounded thing, and Dorian Gray, with his beautiful eyes, looked down at\r\n+her, and his chiselled lips curled in exquisite disdain. There is\r\n+always something ridiculous about the emotions of people whom one has\r\n+ceased to love. Sibyl Vane seemed to him to be absurdly melodramatic.\r\n+Her tears and sobs annoyed him.\r\n+\r\n+\u0022I am going,\u0022 he said at last in his calm clear voice. \u0022I don't wish\r\n+to be unkind, but I can't see you again. You have disappointed me.\u0022\r\n+\r\n+She wept silently, and made no answer, but crept nearer. Her little\r\n+hands stretched blindly out, and appeared to be seeking for him. He\r\n+turned on his heel and left the room. In a few moments he was out of\r\n+the theatre.\r\n+\r\n+Where he went to he hardly knew. He remembered wandering through dimly\r\n+lit streets, past gaunt, black-shadowed archways and evil-looking\r\n+houses. Women with hoarse voices and harsh laughter had called after\r\n+him. Drunkards had reeled by, cursing and chattering to themselves\r\n+like monstrous apes. He had seen grotesque children huddled upon\r\n+door-steps, and heard shrieks and oaths from gloomy courts.\r\n+\r\n+As the dawn was just breaking, he found himself close to Covent Garden.\r\n+The darkness lifted, and, flushed with faint fires, the sky hollowed\r\n+itself into a perfect pearl. Huge carts filled with nodding lilies\r\n+rumbled slowly down the polished empty street. The air was heavy with\r\n+the perfume of the flowers, and their beauty seemed to bring him an\r\n+anodyne for his pain. He followed into the market and watched the men\r\n+unloading their waggons. A white-smocked carter offered him some\r\n+cherries. He thanked him, wondered why he refused to accept any money\r\n+for them, and began to eat them listlessly. They had been plucked at\r\n+midnight, and the coldness of the moon had entered into them. A long\r\n+line of boys carrying crates of striped tulips, and of yellow and red\r\n+roses, defiled in front of him, threading their way through the huge,\r\n+jade-green piles of vegetables. Under the portico, with its grey,\r\n+sun-bleached pillars, loitered a troop of draggled bareheaded girls,\r\n+waiting for the auction to be over. Others crowded round the swinging\r\n+doors of the coffee-house in the piazza. The heavy cart-horses slipped\r\n+and stamped upon the rough stones, shaking their bells and trappings.\r\n+Some of the drivers were lying asleep on a pile of sacks. Iris-necked\r\n+and pink-footed, the pigeons ran about picking up seeds.\r\n+\r\n+After a little while, he hailed a hansom and drove home. For a few\r\n+moments he loitered upon the doorstep, looking round at the silent\r\n+square, with its blank, close-shuttered windows and its staring blinds.\r\n+The sky was pure opal now, and the roofs of the houses glistened like\r\n+silver against it. From some chimney opposite a thin wreath of smoke\r\n+was rising. It curled, a violet riband, through the nacre-coloured air.\r\n+\r\n+In the huge gilt Venetian lantern, spoil of some Doge's barge, that\r\n+hung from the ceiling of the great, oak-panelled hall of entrance,\r\n+lights were still burning from three flickering jets: thin blue petals\r\n+of flame they seemed, rimmed with white fire. He turned them out and,\r\n+having thrown his hat and cape on the table, passed through the library\r\n+towards the door of his bedroom, a large octagonal chamber on the\r\n+ground floor that, in his new-born feeling for luxury, he had just had\r\n+decorated for himself and hung with some curious Renaissance tapestries\r\n+that had been discovered stored in a disused attic at Selby Royal. As\r\n+he was turning the handle of the door, his eye fell upon the portrait\r\n+Basil Hallward had painted of him. He started back as if in surprise.\r\n+Then he went on into his own room, looking somewhat puzzled. After he\r\n+had taken the button-hole out of his coat, he seemed to hesitate.\r\n+Finally, he came back, went over to the picture, and examined it. In\r\n+the dim arrested light that struggled through the cream-coloured silk\r\n+blinds, the face appeared to him to be a little changed. The\r\n+expression looked different. One would have said that there was a\r\n+touch of cruelty in the mouth. It was certainly strange.\r\n+\r\n+He turned round and, walking to the window, drew up the blind. The\r\n+bright dawn flooded the room and swept the fantastic shadows into dusky\r\n+corners, where they lay shuddering. But the strange expression that he\r\n+had noticed in the face of the portrait seemed to linger there, to be\r\n+more intensified even. The quivering ardent sunlight showed him the\r\n+lines of cruelty round the mouth as clearly as if he had been looking\r\n+into a mirror after he had done some dreadful thing.\r\n+\r\n+He winced and, taking up from the table an oval glass framed in ivory\r\n+Cupids, one of Lord Henry's many presents to him, glanced hurriedly\r\n+into its polished depths. No line like that warped his red lips. What\r\n+did it mean?\r\n+\r\n+He rubbed his eyes, and came close to the picture, and examined it\r\n+again. There were no signs of any change when he looked into the\r\n+actual painting, and yet there was no doubt that the whole expression\r\n+had altered. It was not a mere fancy of his own. The thing was\r\n+horribly apparent.\r\n+\r\n+He threw himself into a chair and began to think. Suddenly there\r\n+flashed across his mind what he had said in Basil Hallward's studio the\r\n+day the picture had been finished. Yes, he remembered it perfectly.\r\n+He had uttered a mad wish that he himself might remain young, and the\r\n+portrait grow old; that his own beauty might be untarnished, and the\r\n+face on the canvas bear the burden of his passions and his sins; that\r\n+the painted image might be seared with the lines of suffering and\r\n+thought, and that he might keep all the delicate bloom and loveliness\r\n+of his then just conscious boyhood. Surely his wish had not been\r\n+fulfilled? Such things were impossible. It seemed monstrous even to\r\n+think of them. And, yet, there was the picture before him, with the\r\n+touch of cruelty in the mouth.\r\n+\r\n+Cruelty! Had he been cruel? It was the girl's fault, not his. He had\r\n+dreamed of her as a great artist, had given his love to her because he\r\n+had thought her great. Then she had disappointed him. She had been\r\n+shallow and unworthy. And, yet, a feeling of infinite regret came over\r\n+him, as he thought of her lying at his feet sobbing like a little\r\n+child. He remembered with what callousness he had watched her. Why\r\n+had he been made like that? Why had such a soul been given to him?\r\n+But he had suffered also. During the three terrible hours that the\r\n+play had lasted, he had lived centuries of pain, aeon upon aeon of\r\n+torture. His life was well worth hers. She had marred him for a\r\n+moment, if he had wounded her for an age. Besides, women were better\r\n+suited to bear sorrow than men. They lived on their emotions. They\r\n+only thought of their emotions. When they took lovers, it was merely\r\n+to have some one with whom they could have scenes. Lord Henry had told\r\n+him that, and Lord Henry knew what women were. Why should he trouble\r\n+about Sibyl Vane? She was nothing to him now.\r\n+\r\n+But the picture? What was he to say of that? It held the secret of\r\n+his life, and told his story. It had taught him to love his own\r\n+beauty. Would it teach him to loathe his own soul? Would he ever look\r\n+at it again?\r\n+\r\n+No; it was merely an illusion wrought on the troubled senses. The\r\n+horrible night that he had passed had left phantoms behind it.\r\n+Suddenly there had fallen upon his brain that tiny scarlet speck that\r\n+makes men mad. The picture had not changed. It was folly to think so.\r\n+\r\n+Yet it was watching him, with its beautiful marred face and its cruel\r\n+smile. Its bright hair gleamed in the early sunlight. Its blue eyes\r\n+met his own. A sense of infinite pity, not for himself, but for the\r\n+painted image of himself, came over him. It had altered already, and\r\n+would alter more. Its gold would wither into grey. Its red and white\r\n+roses would die. For every sin that he committed, a stain would fleck\r\n+and wreck its fairness. But he would not sin. The picture, changed or\r\n+unchanged, would be to him the visible emblem of conscience. He would\r\n+resist temptation. He would not see Lord Henry any more--would not, at\r\n+any rate, listen to those subtle poisonous theories that in Basil\r\n+Hallward's garden had first stirred within him the passion for\r\n+impossible things. He would go back to Sibyl Vane, make her amends,\r\n+marry her, try to love her again. Yes, it was his duty to do so. She\r\n+must have suffered more than he had. Poor child! He had been selfish\r\n+and cruel to her. The fascination that she had exercised over him\r\n+would return. They would be happy together. His life with her would\r\n+be beautiful and pure.\r\n+\r\n+He got up from his chair and drew a large screen right in front of the\r\n+portrait, shuddering as he glanced at it. \u0022How horrible!\u0022 he murmured\r\n+to himself, and he walked across to the window and opened it. When he\r\n+stepped out on to the grass, he drew a deep breath. The fresh morning\r\n+air seemed to drive away all his sombre passions. He thought only of\r\n+Sibyl. A faint echo of his love came back to him. He repeated her\r\n+name over and over again. The birds that were singing in the\r\n+dew-drenched garden seemed to be telling the flowers about her.\r\n+\r\n+\r\n+\r\n+CHAPTER 8\r\n+\r\n+It was long past noon when he awoke. His valet had crept several times\r\n+on tiptoe into the room to see if he was stirring, and had wondered\r\n+what made his young master sleep so late. Finally his bell sounded,\r\n+and Victor came in softly with a cup of tea, and a pile of letters, on\r\n+a small tray of old Sevres china, and drew back the olive-satin\r\n+curtains, with their shimmering blue lining, that hung in front of the\r\n+three tall windows.\r\n+\r\n+\u0022Monsieur has well slept this morning,\u0022 he said, smiling.\r\n+\r\n+\u0022What o'clock is it, Victor?\u0022 asked Dorian Gray drowsily.\r\n+\r\n+\u0022One hour and a quarter, Monsieur.\u0022\r\n+\r\n+How late it was! He sat up, and having sipped some tea, turned over\r\n+his letters. One of them was from Lord Henry, and had been brought by\r\n+hand that morning. He hesitated for a moment, and then put it aside.\r\n+The others he opened listlessly. They contained the usual collection\r\n+of cards, invitations to dinner, tickets for private views, programmes\r\n+of charity concerts, and the like that are showered on fashionable\r\n+young men every morning during the season. There was a rather heavy\r\n+bill for a chased silver Louis-Quinze toilet-set that he had not yet\r\n+had the courage to send on to his guardians, who were extremely\r\n+old-fashioned people and did not realize that we live in an age when\r\n+unnecessary things are our only necessities; and there were several\r\n+very courteously worded communications from Jermyn Street money-lenders\r\n+offering to advance any sum of money at a moment's notice and at the\r\n+most reasonable rates of interest.\r\n+\r\n+After about ten minutes he got up, and throwing on an elaborate\r\n+dressing-gown of silk-embroidered cashmere wool, passed into the\r\n+onyx-paved bathroom. The cool water refreshed him after his long\r\n+sleep. He seemed to have forgotten all that he had gone through. A\r\n+dim sense of having taken part in some strange tragedy came to him once\r\n+or twice, but there was the unreality of a dream about it.\r\n+\r\n+As soon as he was dressed, he went into the library and sat down to a\r\n+light French breakfast that had been laid out for him on a small round\r\n+table close to the open window. It was an exquisite day. The warm air\r\n+seemed laden with spices. A bee flew in and buzzed round the\r\n+blue-dragon bowl that, filled with sulphur-yellow roses, stood before\r\n+him. He felt perfectly happy.\r\n+\r\n+Suddenly his eye fell on the screen that he had placed in front of the\r\n+portrait, and he started.\r\n+\r\n+\u0022Too cold for Monsieur?\u0022 asked his valet, putting an omelette on the\r\n+table. \u0022I shut the window?\u0022\r\n+\r\n+Dorian shook his head. \u0022I am not cold,\u0022 he murmured.\r\n+\r\n+Was it all true? Had the portrait really changed? Or had it been\r\n+simply his own imagination that had made him see a look of evil where\r\n+there had been a look of joy? Surely a painted canvas could not alter?\r\n+The thing was absurd. It would serve as a tale to tell Basil some day.\r\n+It would make him smile.\r\n+\r\n+And, yet, how vivid was his recollection of the whole thing! First in\r\n+the dim twilight, and then in the bright dawn, he had seen the touch of\r\n+cruelty round the warped lips. He almost dreaded his valet leaving the\r\n+room. He knew that when he was alone he would have to examine the\r\n+portrait. He was afraid of certainty. When the coffee and cigarettes\r\n+had been brought and the man turned to go, he felt a wild desire to\r\n+tell him to remain. As the door was closing behind him, he called him\r\n+back. The man stood waiting for his orders. Dorian looked at him for\r\n+a moment. \u0022I am not at home to any one, Victor,\u0022 he said with a sigh.\r\n+The man bowed and retired.\r\n+\r\n+Then he rose from the table, lit a cigarette, and flung himself down on\r\n+a luxuriously cushioned couch that stood facing the screen. The screen\r\n+was an old one, of gilt Spanish leather, stamped and wrought with a\r\n+rather florid Louis-Quatorze pattern. He scanned it curiously,\r\n+wondering if ever before it had concealed the secret of a man's life.\r\n+\r\n+Should he move it aside, after all? Why not let it stay there? What\r\n+was the use of knowing? If the thing was true, it was terrible. If it\r\n+was not true, why trouble about it? But what if, by some fate or\r\n+deadlier chance, eyes other than his spied behind and saw the horrible\r\n+change? What should he do if Basil Hallward came and asked to look at\r\n+his own picture? Basil would be sure to do that. No; the thing had to\r\n+be examined, and at once. Anything would be better than this dreadful\r\n+state of doubt.\r\n+\r\n+He got up and locked both doors. At least he would be alone when he\r\n+looked upon the mask of his shame. Then he drew the screen aside and\r\n+saw himself face to face. It was perfectly true. The portrait had\r\n+altered.\r\n+\r\n+As he often remembered afterwards, and always with no small wonder, he\r\n+found himself at first gazing at the portrait with a feeling of almost\r\n+scientific interest. That such a change should have taken place was\r\n+incredible to him. And yet it was a fact. Was there some subtle\r\n+affinity between the chemical atoms that shaped themselves into form\r\n+and colour on the canvas and the soul that was within him? Could it be\r\n+that what that soul thought, they realized?--that what it dreamed, they\r\n+made true? Or was there some other, more terrible reason? He\r\n+shuddered, and felt afraid, and, going back to the couch, lay there,\r\n+gazing at the picture in sickened horror.\r\n+\r\n+One thing, however, he felt that it had done for him. It had made him\r\n+conscious how unjust, how cruel, he had been to Sibyl Vane. It was not\r\n+too late to make reparation for that. She could still be his wife.\r\n+His unreal and selfish love would yield to some higher influence, would\r\n+be transformed into some nobler passion, and the portrait that Basil\r\n+Hallward had painted of him would be a guide to him through life, would\r\n+be to him what holiness is to some, and conscience to others, and the\r\n+fear of God to us all. There were opiates for remorse, drugs that\r\n+could lull the moral sense to sleep. But here was a visible symbol of\r\n+the degradation of sin. Here was an ever-present sign of the ruin men\r\n+brought upon their souls.\r\n+\r\n+Three o'clock struck, and four, and the half-hour rang its double\r\n+chime, but Dorian Gray did not stir. He was trying to gather up the\r\n+scarlet threads of life and to weave them into a pattern; to find his\r\n+way through the sanguine labyrinth of passion through which he was\r\n+wandering. He did not know what to do, or what to think. Finally, he\r\n+went over to the table and wrote a passionate letter to the girl he had\r\n+loved, imploring her forgiveness and accusing himself of madness. He\r\n+covered page after page with wild words of sorrow and wilder words of\r\n+pain. There is a luxury in self-reproach. When we blame ourselves, we\r\n+feel that no one else has a right to blame us. It is the confession,\r\n+not the priest, that gives us absolution. When Dorian had finished the\r\n+letter, he felt that he had been forgiven.\r\n+\r\n+Suddenly there came a knock to the door, and he heard Lord Henry's\r\n+voice outside. \u0022My dear boy, I must see you. Let me in at once. I\r\n+can't bear your shutting yourself up like this.\u0022\r\n+\r\n+He made no answer at first, but remained quite still. The knocking\r\n+still continued and grew louder. Yes, it was better to let Lord Henry\r\n+in, and to explain to him the new life he was going to lead, to quarrel\r\n+with him if it became necessary to quarrel, to part if parting was\r\n+inevitable. He jumped up, drew the screen hastily across the picture,\r\n+and unlocked the door.\r\n+\r\n+\u0022I am so sorry for it all, Dorian,\u0022 said Lord Henry as he entered.\r\n+\u0022But you must not think too much about it.\u0022\r\n+\r\n+\u0022Do you mean about Sibyl Vane?\u0022 asked the lad.\r\n+\r\n+\u0022Yes, of course,\u0022 answered Lord Henry, sinking into a chair and slowly\r\n+pulling off his yellow gloves. \u0022It is dreadful, from one point of\r\n+view, but it was not your fault. Tell me, did you go behind and see\r\n+her, after the play was over?\u0022\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022I felt sure you had. Did you make a scene with her?\u0022\r\n+\r\n+\u0022I was brutal, Harry--perfectly brutal. But it is all right now. I am\r\n+not sorry for anything that has happened. It has taught me to know\r\n+myself better.\u0022\r\n+\r\n+\u0022Ah, Dorian, I am so glad you take it in that way! I was afraid I\r\n+would find you plunged in remorse and tearing that nice curly hair of\r\n+yours.\u0022\r\n+\r\n+\u0022I have got through all that,\u0022 said Dorian, shaking his head and\r\n+smiling. \u0022I am perfectly happy now. I know what conscience is, to\r\n+begin with. It is not what you told me it was. It is the divinest\r\n+thing in us. Don't sneer at it, Harry, any more--at least not before\r\n+me. I want to be good. I can't bear the idea of my soul being\r\n+hideous.\u0022\r\n+\r\n+\u0022A very charming artistic basis for ethics, Dorian! I congratulate you\r\n+on it. But how are you going to begin?\u0022\r\n+\r\n+\u0022By marrying Sibyl Vane.\u0022\r\n+\r\n+\u0022Marrying Sibyl Vane!\u0022 cried Lord Henry, standing up and looking at him\r\n+in perplexed amazement. \u0022But, my dear Dorian--\u0022\r\n+\r\n+\u0022Yes, Harry, I know what you are going to say. Something dreadful\r\n+about marriage. Don't say it. Don't ever say things of that kind to\r\n+me again. Two days ago I asked Sibyl to marry me. I am not going to\r\n+break my word to her. She is to be my wife.\u0022\r\n+\r\n+\u0022Your wife! Dorian! ... Didn't you get my letter? I wrote to you this\r\n+morning, and sent the note down by my own man.\u0022\r\n+\r\n+\u0022Your letter? Oh, yes, I remember. I have not read it yet, Harry. I\r\n+was afraid there might be something in it that I wouldn't like. You\r\n+cut life to pieces with your epigrams.\u0022\r\n+\r\n+\u0022You know nothing then?\u0022\r\n+\r\n+\u0022What do you mean?\u0022\r\n+\r\n+Lord Henry walked across the room, and sitting down by Dorian Gray,\r\n+took both his hands in his own and held them tightly. \u0022Dorian,\u0022 he\r\n+said, \u0022my letter--don't be frightened--was to tell you that Sibyl Vane\r\n+is dead.\u0022\r\n+\r\n+A cry of pain broke from the lad's lips, and he leaped to his feet,\r\n+tearing his hands away from Lord Henry's grasp. \u0022Dead! Sibyl dead!\r\n+It is not true! It is a horrible lie! How dare you say it?\u0022\r\n+\r\n+\u0022It is quite true, Dorian,\u0022 said Lord Henry, gravely. \u0022It is in all\r\n+the morning papers. I wrote down to you to ask you not to see any one\r\n+till I came. There will have to be an inquest, of course, and you must\r\n+not be mixed up in it. Things like that make a man fashionable in\r\n+Paris. But in London people are so prejudiced. Here, one should never\r\n+make one's _debut_ with a scandal. One should reserve that to give an\r\n+interest to one's old age. I suppose they don't know your name at the\r\n+theatre? If they don't, it is all right. Did any one see you going\r\n+round to her room? That is an important point.\u0022\r\n+\r\n+Dorian did not answer for a few moments. He was dazed with horror.\r\n+Finally he stammered, in a stifled voice, \u0022Harry, did you say an\r\n+inquest? What did you mean by that? Did Sibyl--? Oh, Harry, I can't\r\n+bear it! But be quick. Tell me everything at once.\u0022\r\n+\r\n+\u0022I have no doubt it was not an accident, Dorian, though it must be put\r\n+in that way to the public. It seems that as she was leaving the\r\n+theatre with her mother, about half-past twelve or so, she said she had\r\n+forgotten something upstairs. They waited some time for her, but she\r\n+did not come down again. They ultimately found her lying dead on the\r\n+floor of her dressing-room. She had swallowed something by mistake,\r\n+some dreadful thing they use at theatres. I don't know what it was,\r\n+but it had either prussic acid or white lead in it. I should fancy it\r\n+was prussic acid, as she seems to have died instantaneously.\u0022\r\n+\r\n+\u0022Harry, Harry, it is terrible!\u0022 cried the lad.\r\n+\r\n+\u0022Yes; it is very tragic, of course, but you must not get yourself mixed\r\n+up in it. I see by _The Standard_ that she was seventeen. I should have\r\n+thought she was almost younger than that. She looked such a child, and\r\n+seemed to know so little about acting. Dorian, you mustn't let this\r\n+thing get on your nerves. You must come and dine with me, and\r\n+afterwards we will look in at the opera. It is a Patti night, and\r\n+everybody will be there. You can come to my sister's box. She has got\r\n+some smart women with her.\u0022\r\n+\r\n+\u0022So I have murdered Sibyl Vane,\u0022 said Dorian Gray, half to himself,\r\n+\u0022murdered her as surely as if I had cut her little throat with a knife.\r\n+Yet the roses are not less lovely for all that. The birds sing just as\r\n+happily in my garden. And to-night I am to dine with you, and then go\r\n+on to the opera, and sup somewhere, I suppose, afterwards. How\r\n+extraordinarily dramatic life is! If I had read all this in a book,\r\n+Harry, I think I would have wept over it. Somehow, now that it has\r\n+happened actually, and to me, it seems far too wonderful for tears.\r\n+Here is the first passionate love-letter I have ever written in my\r\n+life. Strange, that my first passionate love-letter should have been\r\n+addressed to a dead girl. Can they feel, I wonder, those white silent\r\n+people we call the dead? Sibyl! Can she feel, or know, or listen?\r\n+Oh, Harry, how I loved her once! It seems years ago to me now. She\r\n+was everything to me. Then came that dreadful night--was it really\r\n+only last night?--when she played so badly, and my heart almost broke.\r\n+She explained it all to me. It was terribly pathetic. But I was not\r\n+moved a bit. I thought her shallow. Suddenly something happened that\r\n+made me afraid. I can't tell you what it was, but it was terrible. I\r\n+said I would go back to her. I felt I had done wrong. And now she is\r\n+dead. My God! My God! Harry, what shall I do? You don't know the\r\n+danger I am in, and there is nothing to keep me straight. She would\r\n+have done that for me. She had no right to kill herself. It was\r\n+selfish of her.\u0022\r\n+\r\n+\u0022My dear Dorian,\u0022 answered Lord Henry, taking a cigarette from his case\r\n+and producing a gold-latten matchbox, \u0022the only way a woman can ever\r\n+reform a man is by boring him so completely that he loses all possible\r\n+interest in life. If you had married this girl, you would have been\r\n+wretched. Of course, you would have treated her kindly. One can\r\n+always be kind to people about whom one cares nothing. But she would\r\n+have soon found out that you were absolutely indifferent to her. And\r\n+when a woman finds that out about her husband, she either becomes\r\n+dreadfully dowdy, or wears very smart bonnets that some other woman's\r\n+husband has to pay for. I say nothing about the social mistake, which\r\n+would have been abject--which, of course, I would not have allowed--but\r\n+I assure you that in any case the whole thing would have been an\r\n+absolute failure.\u0022\r\n+\r\n+\u0022I suppose it would,\u0022 muttered the lad, walking up and down the room\r\n+and looking horribly pale. \u0022But I thought it was my duty. It is not\r\n+my fault that this terrible tragedy has prevented my doing what was\r\n+right. I remember your saying once that there is a fatality about good\r\n+resolutions--that they are always made too late. Mine certainly were.\u0022\r\n+\r\n+\u0022Good resolutions are useless attempts to interfere with scientific\r\n+laws. Their origin is pure vanity. Their result is absolutely _nil_.\r\n+They give us, now and then, some of those luxurious sterile emotions\r\n+that have a certain charm for the weak. That is all that can be said\r\n+for them. They are simply cheques that men draw on a bank where they\r\n+have no account.\u0022\r\n+\r\n+\u0022Harry,\u0022 cried Dorian Gray, coming over and sitting down beside him,\r\n+\u0022why is it that I cannot feel this tragedy as much as I want to? I\r\n+don't think I am heartless. Do you?\u0022\r\n+\r\n+\u0022You have done too many foolish things during the last fortnight to be\r\n+entitled to give yourself that name, Dorian,\u0022 answered Lord Henry with\r\n+his sweet melancholy smile.\r\n+\r\n+The lad frowned. \u0022I don't like that explanation, Harry,\u0022 he rejoined,\r\n+\u0022but I am glad you don't think I am heartless. I am nothing of the\r\n+kind. I know I am not. And yet I must admit that this thing that has\r\n+happened does not affect me as it should. It seems to me to be simply\r\n+like a wonderful ending to a wonderful play. It has all the terrible\r\n+beauty of a Greek tragedy, a tragedy in which I took a great part, but\r\n+by which I have not been wounded.\u0022\r\n+\r\n+\u0022It is an interesting question,\u0022 said Lord Henry, who found an\r\n+exquisite pleasure in playing on the lad's unconscious egotism, \u0022an\r\n+extremely interesting question. I fancy that the true explanation is\r\n+this: It often happens that the real tragedies of life occur in such\r\n+an inartistic manner that they hurt us by their crude violence, their\r\n+absolute incoherence, their absurd want of meaning, their entire lack\r\n+of style. They affect us just as vulgarity affects us. They give us\r\n+an impression of sheer brute force, and we revolt against that.\r\n+Sometimes, however, a tragedy that possesses artistic elements of\r\n+beauty crosses our lives. If these elements of beauty are real, the\r\n+whole thing simply appeals to our sense of dramatic effect. Suddenly\r\n+we find that we are no longer the actors, but the spectators of the\r\n+play. Or rather we are both. We watch ourselves, and the mere wonder\r\n+of the spectacle enthralls us. In the present case, what is it that\r\n+has really happened? Some one has killed herself for love of you. I\r\n+wish that I had ever had such an experience. It would have made me in\r\n+love with love for the rest of my life. The people who have adored\r\n+me--there have not been very many, but there have been some--have\r\n+always insisted on living on, long after I had ceased to care for them,\r\n+or they to care for me. They have become stout and tedious, and when I\r\n+meet them, they go in at once for reminiscences. That awful memory of\r\n+woman! What a fearful thing it is! And what an utter intellectual\r\n+stagnation it reveals! One should absorb the colour of life, but one\r\n+should never remember its details. Details are always vulgar.\u0022\r\n+\r\n+\u0022I must sow poppies in my garden,\u0022 sighed Dorian.\r\n+\r\n+\u0022There is no necessity,\u0022 rejoined his companion. \u0022Life has always\r\n+poppies in her hands. Of course, now and then things linger. I once\r\n+wore nothing but violets all through one season, as a form of artistic\r\n+mourning for a romance that would not die. Ultimately, however, it did\r\n+die. I forget what killed it. I think it was her proposing to\r\n+sacrifice the whole world for me. That is always a dreadful moment.\r\n+It fills one with the terror of eternity. Well--would you believe\r\n+it?--a week ago, at Lady Hampshire's, I found myself seated at dinner\r\n+next the lady in question, and she insisted on going over the whole\r\n+thing again, and digging up the past, and raking up the future. I had\r\n+buried my romance in a bed of asphodel. She dragged it out again and\r\n+assured me that I had spoiled her life. I am bound to state that she\r\n+ate an enormous dinner, so I did not feel any anxiety. But what a lack\r\n+of taste she showed! The one charm of the past is that it is the past.\r\n+But women never know when the curtain has fallen. They always want a\r\n+sixth act, and as soon as the interest of the play is entirely over,\r\n+they propose to continue it. If they were allowed their own way, every\r\n+comedy would have a tragic ending, and every tragedy would culminate in\r\n+a farce. They are charmingly artificial, but they have no sense of\r\n+art. You are more fortunate than I am. I assure you, Dorian, that not\r\n+one of the women I have known would have done for me what Sibyl Vane\r\n+did for you. Ordinary women always console themselves. Some of them\r\n+do it by going in for sentimental colours. Never trust a woman who\r\n+wears mauve, whatever her age may be, or a woman over thirty-five who\r\n+is fond of pink ribbons. It always means that they have a history.\r\n+Others find a great consolation in suddenly discovering the good\r\n+qualities of their husbands. They flaunt their conjugal felicity in\r\n+one's face, as if it were the most fascinating of sins. Religion\r\n+consoles some. Its mysteries have all the charm of a flirtation, a\r\n+woman once told me, and I can quite understand it. Besides, nothing\r\n+makes one so vain as being told that one is a sinner. Conscience makes\r\n+egotists of us all. Yes; there is really no end to the consolations\r\n+that women find in modern life. Indeed, I have not mentioned the most\r\n+important one.\u0022\r\n+\r\n+\u0022What is that, Harry?\u0022 said the lad listlessly.\r\n+\r\n+\u0022Oh, the obvious consolation. Taking some one else's admirer when one\r\n+loses one's own. In good society that always whitewashes a woman. But\r\n+really, Dorian, how different Sibyl Vane must have been from all the\r\n+women one meets! There is something to me quite beautiful about her\r\n+death. I am glad I am living in a century when such wonders happen.\r\n+They make one believe in the reality of the things we all play with,\r\n+such as romance, passion, and love.\u0022\r\n+\r\n+\u0022I was terribly cruel to her. You forget that.\u0022\r\n+\r\n+\u0022I am afraid that women appreciate cruelty, downright cruelty, more\r\n+than anything else. They have wonderfully primitive instincts. We\r\n+have emancipated them, but they remain slaves looking for their\r\n+masters, all the same. They love being dominated. I am sure you were\r\n+splendid. I have never seen you really and absolutely angry, but I can\r\n+fancy how delightful you looked. And, after all, you said something to\r\n+me the day before yesterday that seemed to me at the time to be merely\r\n+fanciful, but that I see now was absolutely true, and it holds the key\r\n+to everything.\u0022\r\n+\r\n+\u0022What was that, Harry?\u0022\r\n+\r\n+\u0022You said to me that Sibyl Vane represented to you all the heroines of\r\n+romance--that she was Desdemona one night, and Ophelia the other; that\r\n+if she died as Juliet, she came to life as Imogen.\u0022\r\n+\r\n+\u0022She will never come to life again now,\u0022 muttered the lad, burying his\r\n+face in his hands.\r\n+\r\n+\u0022No, she will never come to life. She has played her last part. But\r\n+you must think of that lonely death in the tawdry dressing-room simply\r\n+as a strange lurid fragment from some Jacobean tragedy, as a wonderful\r\n+scene from Webster, or Ford, or Cyril Tourneur. The girl never really\r\n+lived, and so she has never really died. To you at least she was\r\n+always a dream, a phantom that flitted through Shakespeare's plays and\r\n+left them lovelier for its presence, a reed through which Shakespeare's\r\n+music sounded richer and more full of joy. The moment she touched\r\n+actual life, she marred it, and it marred her, and so she passed away.\r\n+Mourn for Ophelia, if you like. Put ashes on your head because\r\n+Cordelia was strangled. Cry out against Heaven because the daughter of\r\n+Brabantio died. But don't waste your tears over Sibyl Vane. She was\r\n+less real than they are.\u0022\r\n+\r\n+There was a silence. The evening darkened in the room. Noiselessly,\r\n+and with silver feet, the shadows crept in from the garden. The\r\n+colours faded wearily out of things.\r\n+\r\n+After some time Dorian Gray looked up. \u0022You have explained me to\r\n+myself, Harry,\u0022 he murmured with something of a sigh of relief. \u0022I\r\n+felt all that you have said, but somehow I was afraid of it, and I\r\n+could not express it to myself. How well you know me! But we will not\r\n+talk again of what has happened. It has been a marvellous experience.\r\n+That is all. I wonder if life has still in store for me anything as\r\n+marvellous.\u0022\r\n+\r\n+\u0022Life has everything in store for you, Dorian. There is nothing that\r\n+you, with your extraordinary good looks, will not be able to do.\u0022\r\n+\r\n+\u0022But suppose, Harry, I became haggard, and old, and wrinkled? What\r\n+then?\u0022\r\n+\r\n+\u0022Ah, then,\u0022 said Lord Henry, rising to go, \u0022then, my dear Dorian, you\r\n+would have to fight for your victories. As it is, they are brought to\r\n+you. No, you must keep your good looks. We live in an age that reads\r\n+too much to be wise, and that thinks too much to be beautiful. We\r\n+cannot spare you. And now you had better dress and drive down to the\r\n+club. We are rather late, as it is.\u0022\r\n+\r\n+\u0022I think I shall join you at the opera, Harry. I feel too tired to eat\r\n+anything. What is the number of your sister's box?\u0022\r\n+\r\n+\u0022Twenty-seven, I believe. It is on the grand tier. You will see her\r\n+name on the door. But I am sorry you won't come and dine.\u0022\r\n+\r\n+\u0022I don't feel up to it,\u0022 said Dorian listlessly. \u0022But I am awfully\r\n+obliged to you for all that you have said to me. You are certainly my\r\n+best friend. No one has ever understood me as you have.\u0022\r\n+\r\n+\u0022We are only at the beginning of our friendship, Dorian,\u0022 answered Lord\r\n+Henry, shaking him by the hand. \u0022Good-bye. I shall see you before\r\n+nine-thirty, I hope. Remember, Patti is singing.\u0022\r\n+\r\n+As he closed the door behind him, Dorian Gray touched the bell, and in\r\n+a few minutes Victor appeared with the lamps and drew the blinds down.\r\n+He waited impatiently for him to go. The man seemed to take an\r\n+interminable time over everything.\r\n+\r\n+As soon as he had left, he rushed to the screen and drew it back. No;\r\n+there was no further change in the picture. It had received the news\r\n+of Sibyl Vane's death before he had known of it himself. It was\r\n+conscious of the events of life as they occurred. The vicious cruelty\r\n+that marred the fine lines of the mouth had, no doubt, appeared at the\r\n+very moment that the girl had drunk the poison, whatever it was. Or\r\n+was it indifferent to results? Did it merely take cognizance of what\r\n+passed within the soul? He wondered, and hoped that some day he would\r\n+see the change taking place before his very eyes, shuddering as he\r\n+hoped it.\r\n+\r\n+Poor Sibyl! What a romance it had all been! She had often mimicked\r\n+death on the stage. Then Death himself had touched her and taken her\r\n+with him. How had she played that dreadful last scene? Had she cursed\r\n+him, as she died? No; she had died for love of him, and love would\r\n+always be a sacrament to him now. She had atoned for everything by the\r\n+sacrifice she had made of her life. He would not think any more of\r\n+what she had made him go through, on that horrible night at the\r\n+theatre. When he thought of her, it would be as a wonderful tragic\r\n+figure sent on to the world's stage to show the supreme reality of\r\n+love. A wonderful tragic figure? Tears came to his eyes as he\r\n+remembered her childlike look, and winsome fanciful ways, and shy\r\n+tremulous grace. He brushed them away hastily and looked again at the\r\n+picture.\r\n+\r\n+He felt that the time had really come for making his choice. Or had\r\n+his choice already been made? Yes, life had decided that for\r\n+him--life, and his own infinite curiosity about life. Eternal youth,\r\n+infinite passion, pleasures subtle and secret, wild joys and wilder\r\n+sins--he was to have all these things. The portrait was to bear the\r\n+burden of his shame: that was all.\r\n+\r\n+A feeling of pain crept over him as he thought of the desecration that\r\n+was in store for the fair face on the canvas. Once, in boyish mockery\r\n+of Narcissus, he had kissed, or feigned to kiss, those painted lips\r\n+that now smiled so cruelly at him. Morning after morning he had sat\r\n+before the portrait wondering at its beauty, almost enamoured of it, as\r\n+it seemed to him at times. Was it to alter now with every mood to\r\n+which he yielded? Was it to become a monstrous and loathsome thing, to\r\n+be hidden away in a locked room, to be shut out from the sunlight that\r\n+had so often touched to brighter gold the waving wonder of its hair?\r\n+The pity of it! the pity of it!\r\n+\r\n+For a moment, he thought of praying that the horrible sympathy that\r\n+existed between him and the picture might cease. It had changed in\r\n+answer to a prayer; perhaps in answer to a prayer it might remain\r\n+unchanged. And yet, who, that knew anything about life, would\r\n+surrender the chance of remaining always young, however fantastic that\r\n+chance might be, or with what fateful consequences it might be fraught?\r\n+Besides, was it really under his control? Had it indeed been prayer\r\n+that had produced the substitution? Might there not be some curious\r\n+scientific reason for it all? If thought could exercise its influence\r\n+upon a living organism, might not thought exercise an influence upon\r\n+dead and inorganic things? Nay, without thought or conscious desire,\r\n+might not things external to ourselves vibrate in unison with our moods\r\n+and passions, atom calling to atom in secret love or strange affinity?\r\n+But the reason was of no importance. He would never again tempt by a\r\n+prayer any terrible power. If the picture was to alter, it was to\r\n+alter. That was all. Why inquire too closely into it?\r\n+\r\n+For there would be a real pleasure in watching it. He would be able to\r\n+follow his mind into its secret places. This portrait would be to him\r\n+the most magical of mirrors. As it had revealed to him his own body,\r\n+so it would reveal to him his own soul. And when winter came upon it,\r\n+he would still be standing where spring trembles on the verge of\r\n+summer. When the blood crept from its face, and left behind a pallid\r\n+mask of chalk with leaden eyes, he would keep the glamour of boyhood.\r\n+Not one blossom of his loveliness would ever fade. Not one pulse of\r\n+his life would ever weaken. Like the gods of the Greeks, he would be\r\n+strong, and fleet, and joyous. What did it matter what happened to the\r\n+coloured image on the canvas? He would be safe. That was everything.\r\n+\r\n+He drew the screen back into its former place in front of the picture,\r\n+smiling as he did so, and passed into his bedroom, where his valet was\r\n+already waiting for him. An hour later he was at the opera, and Lord\r\n+Henry was leaning over his chair.\r\n+\r\n+\r\n+\r\n+CHAPTER 9\r\n+\r\n+As he was sitting at breakfast next morning, Basil Hallward was shown\r\n+into the room.\r\n+\r\n+\u0022I am so glad I have found you, Dorian,\u0022 he said gravely. \u0022I called\r\n+last night, and they told me you were at the opera. Of course, I knew\r\n+that was impossible. But I wish you had left word where you had really\r\n+gone to. I passed a dreadful evening, half afraid that one tragedy\r\n+might be followed by another. I think you might have telegraphed for\r\n+me when you heard of it first. I read of it quite by chance in a late\r\n+edition of _The Globe_ that I picked up at the club. I came here at once\r\n+and was miserable at not finding you. I can't tell you how\r\n+heart-broken I am about the whole thing. I know what you must suffer.\r\n+But where were you? Did you go down and see the girl's mother? For a\r\n+moment I thought of following you there. They gave the address in the\r\n+paper. Somewhere in the Euston Road, isn't it? But I was afraid of\r\n+intruding upon a sorrow that I could not lighten. Poor woman! What a\r\n+state she must be in! And her only child, too! What did she say about\r\n+it all?\u0022\r\n+\r\n+\u0022My dear Basil, how do I know?\u0022 murmured Dorian Gray, sipping some\r\n+pale-yellow wine from a delicate, gold-beaded bubble of Venetian glass\r\n+and looking dreadfully bored. \u0022I was at the opera. You should have\r\n+come on there. I met Lady Gwendolen, Harry's sister, for the first\r\n+time. We were in her box. She is perfectly charming; and Patti sang\r\n+divinely. Don't talk about horrid subjects. If one doesn't talk about\r\n+a thing, it has never happened. It is simply expression, as Harry\r\n+says, that gives reality to things. I may mention that she was not the\r\n+woman's only child. There is a son, a charming fellow, I believe. But\r\n+he is not on the stage. He is a sailor, or something. And now, tell\r\n+me about yourself and what you are painting.\u0022\r\n+\r\n+\u0022You went to the opera?\u0022 said Hallward, speaking very slowly and with a\r\n+strained touch of pain in his voice. \u0022You went to the opera while\r\n+Sibyl Vane was lying dead in some sordid lodging? You can talk to me\r\n+of other women being charming, and of Patti singing divinely, before\r\n+the girl you loved has even the quiet of a grave to sleep in? Why,\r\n+man, there are horrors in store for that little white body of hers!\u0022\r\n+\r\n+\u0022Stop, Basil! I won't hear it!\u0022 cried Dorian, leaping to his feet.\r\n+\u0022You must not tell me about things. What is done is done. What is\r\n+past is past.\u0022\r\n+\r\n+\u0022You call yesterday the past?\u0022\r\n+\r\n+\u0022What has the actual lapse of time got to do with it? It is only\r\n+shallow people who require years to get rid of an emotion. A man who\r\n+is master of himself can end a sorrow as easily as he can invent a\r\n+pleasure. I don't want to be at the mercy of my emotions. I want to\r\n+use them, to enjoy them, and to dominate them.\u0022\r\n+\r\n+\u0022Dorian, this is horrible! Something has changed you completely. You\r\n+look exactly the same wonderful boy who, day after day, used to come\r\n+down to my studio to sit for his picture. But you were simple,\r\n+natural, and affectionate then. You were the most unspoiled creature\r\n+in the whole world. Now, I don't know what has come over you. You\r\n+talk as if you had no heart, no pity in you. It is all Harry's\r\n+influence. I see that.\u0022\r\n+\r\n+The lad flushed up and, going to the window, looked out for a few\r\n+moments on the green, flickering, sun-lashed garden. \u0022I owe a great\r\n+deal to Harry, Basil,\u0022 he said at last, \u0022more than I owe to you. You\r\n+only taught me to be vain.\u0022\r\n+\r\n+\u0022Well, I am punished for that, Dorian--or shall be some day.\u0022\r\n+\r\n+\u0022I don't know what you mean, Basil,\u0022 he exclaimed, turning round. \u0022I\r\n+don't know what you want. What do you want?\u0022\r\n+\r\n+\u0022I want the Dorian Gray I used to paint,\u0022 said the artist sadly.\r\n+\r\n+\u0022Basil,\u0022 said the lad, going over to him and putting his hand on his\r\n+shoulder, \u0022you have come too late. Yesterday, when I heard that Sibyl\r\n+Vane had killed herself--\u0022\r\n+\r\n+\u0022Killed herself! Good heavens! is there no doubt about that?\u0022 cried\r\n+Hallward, looking up at him with an expression of horror.\r\n+\r\n+\u0022My dear Basil! Surely you don't think it was a vulgar accident? Of\r\n+course she killed herself.\u0022\r\n+\r\n+The elder man buried his face in his hands. \u0022How fearful,\u0022 he\r\n+muttered, and a shudder ran through him.\r\n+\r\n+\u0022No,\u0022 said Dorian Gray, \u0022there is nothing fearful about it. It is one\r\n+of the great romantic tragedies of the age. As a rule, people who act\r\n+lead the most commonplace lives. They are good husbands, or faithful\r\n+wives, or something tedious. You know what I mean--middle-class virtue\r\n+and all that kind of thing. How different Sibyl was! She lived her\r\n+finest tragedy. She was always a heroine. The last night she\r\n+played--the night you saw her--she acted badly because she had known\r\n+the reality of love. When she knew its unreality, she died, as Juliet\r\n+might have died. She passed again into the sphere of art. There is\r\n+something of the martyr about her. Her death has all the pathetic\r\n+uselessness of martyrdom, all its wasted beauty. But, as I was saying,\r\n+you must not think I have not suffered. If you had come in yesterday\r\n+at a particular moment--about half-past five, perhaps, or a quarter to\r\n+six--you would have found me in tears. Even Harry, who was here, who\r\n+brought me the news, in fact, had no idea what I was going through. I\r\n+suffered immensely. Then it passed away. I cannot repeat an emotion.\r\n+No one can, except sentimentalists. And you are awfully unjust, Basil.\r\n+You come down here to console me. That is charming of you. You find\r\n+me consoled, and you are furious. How like a sympathetic person! You\r\n+remind me of a story Harry told me about a certain philanthropist who\r\n+spent twenty years of his life in trying to get some grievance\r\n+redressed, or some unjust law altered--I forget exactly what it was.\r\n+Finally he succeeded, and nothing could exceed his disappointment. He\r\n+had absolutely nothing to do, almost died of _ennui_, and became a\r\n+confirmed misanthrope. And besides, my dear old Basil, if you really\r\n+want to console me, teach me rather to forget what has happened, or to\r\n+see it from a proper artistic point of view. Was it not Gautier who\r\n+used to write about _la consolation des arts_? I remember picking up a\r\n+little vellum-covered book in your studio one day and chancing on that\r\n+delightful phrase. Well, I am not like that young man you told me of\r\n+when we were down at Marlow together, the young man who used to say\r\n+that yellow satin could console one for all the miseries of life. I\r\n+love beautiful things that one can touch and handle. Old brocades,\r\n+green bronzes, lacquer-work, carved ivories, exquisite surroundings,\r\n+luxury, pomp--there is much to be got from all these. But the artistic\r\n+temperament that they create, or at any rate reveal, is still more to\r\n+me. To become the spectator of one's own life, as Harry says, is to\r\n+escape the suffering of life. I know you are surprised at my talking\r\n+to you like this. You have not realized how I have developed. I was a\r\n+schoolboy when you knew me. I am a man now. I have new passions, new\r\n+thoughts, new ideas. I am different, but you must not like me less. I\r\n+am changed, but you must always be my friend. Of course, I am very\r\n+fond of Harry. But I know that you are better than he is. You are not\r\n+stronger--you are too much afraid of life--but you are better. And how\r\n+happy we used to be together! Don't leave me, Basil, and don't quarrel\r\n+with me. I am what I am. There is nothing more to be said.\u0022\r\n+\r\n+The painter felt strangely moved. The lad was infinitely dear to him,\r\n+and his personality had been the great turning point in his art. He\r\n+could not bear the idea of reproaching him any more. After all, his\r\n+indifference was probably merely a mood that would pass away. There\r\n+was so much in him that was good, so much in him that was noble.\r\n+\r\n+\u0022Well, Dorian,\u0022 he said at length, with a sad smile, \u0022I won't speak to\r\n+you again about this horrible thing, after to-day. I only trust your\r\n+name won't be mentioned in connection with it. The inquest is to take\r\n+place this afternoon. Have they summoned you?\u0022\r\n+\r\n+Dorian shook his head, and a look of annoyance passed over his face at\r\n+the mention of the word \u0022inquest.\u0022 There was something so crude and\r\n+vulgar about everything of the kind. \u0022They don't know my name,\u0022 he\r\n+answered.\r\n+\r\n+\u0022But surely she did?\u0022\r\n+\r\n+\u0022Only my Christian name, and that I am quite sure she never mentioned\r\n+to any one. She told me once that they were all rather curious to\r\n+learn who I was, and that she invariably told them my name was Prince\r\n+Charming. It was pretty of her. You must do me a drawing of Sibyl,\r\n+Basil. I should like to have something more of her than the memory of\r\n+a few kisses and some broken pathetic words.\u0022\r\n+\r\n+\u0022I will try and do something, Dorian, if it would please you. But you\r\n+must come and sit to me yourself again. I can't get on without you.\u0022\r\n+\r\n+\u0022I can never sit to you again, Basil. It is impossible!\u0022 he exclaimed,\r\n+starting back.\r\n+\r\n+The painter stared at him. \u0022My dear boy, what nonsense!\u0022 he cried.\r\n+\u0022Do you mean to say you don't like what I did of you? Where is it?\r\n+Why have you pulled the screen in front of it? Let me look at it. It\r\n+is the best thing I have ever done. Do take the screen away, Dorian.\r\n+It is simply disgraceful of your servant hiding my work like that. I\r\n+felt the room looked different as I came in.\u0022\r\n+\r\n+\u0022My servant has nothing to do with it, Basil. You don't imagine I let\r\n+him arrange my room for me? He settles my flowers for me\r\n+sometimes--that is all. No; I did it myself. The light was too strong\r\n+on the portrait.\u0022\r\n+\r\n+\u0022Too strong! Surely not, my dear fellow? It is an admirable place for\r\n+it. Let me see it.\u0022 And Hallward walked towards the corner of the\r\n+room.\r\n+\r\n+A cry of terror broke from Dorian Gray's lips, and he rushed between\r\n+the painter and the screen. \u0022Basil,\u0022 he said, looking very pale, \u0022you\r\n+must not look at it. I don't wish you to.\u0022\r\n+\r\n+\u0022Not look at my own work! You are not serious. Why shouldn't I look\r\n+at it?\u0022 exclaimed Hallward, laughing.\r\n+\r\n+\u0022If you try to look at it, Basil, on my word of honour I will never\r\n+speak to you again as long as I live. I am quite serious. I don't\r\n+offer any explanation, and you are not to ask for any. But, remember,\r\n+if you touch this screen, everything is over between us.\u0022\r\n+\r\n+Hallward was thunderstruck. He looked at Dorian Gray in absolute\r\n+amazement. He had never seen him like this before. The lad was\r\n+actually pallid with rage. His hands were clenched, and the pupils of\r\n+his eyes were like disks of blue fire. He was trembling all over.\r\n+\r\n+\u0022Dorian!\u0022\r\n+\r\n+\u0022Don't speak!\u0022\r\n+\r\n+\u0022But what is the matter? Of course I won't look at it if you don't\r\n+want me to,\u0022 he said, rather coldly, turning on his heel and going over\r\n+towards the window. \u0022But, really, it seems rather absurd that I\r\n+shouldn't see my own work, especially as I am going to exhibit it in\r\n+Paris in the autumn. I shall probably have to give it another coat of\r\n+varnish before that, so I must see it some day, and why not to-day?\u0022\r\n+\r\n+\u0022To exhibit it! You want to exhibit it?\u0022 exclaimed Dorian Gray, a\r\n+strange sense of terror creeping over him. Was the world going to be\r\n+shown his secret? Were people to gape at the mystery of his life?\r\n+That was impossible. Something--he did not know what--had to be done\r\n+at once.\r\n+\r\n+\u0022Yes; I don't suppose you will object to that. Georges Petit is going\r\n+to collect all my best pictures for a special exhibition in the Rue de\r\n+Seze, which will open the first week in October. The portrait will\r\n+only be away a month. I should think you could easily spare it for\r\n+that time. In fact, you are sure to be out of town. And if you keep\r\n+it always behind a screen, you can't care much about it.\u0022\r\n+\r\n+Dorian Gray passed his hand over his forehead. There were beads of\r\n+perspiration there. He felt that he was on the brink of a horrible\r\n+danger. \u0022You told me a month ago that you would never exhibit it,\u0022 he\r\n+cried. \u0022Why have you changed your mind? You people who go in for\r\n+being consistent have just as many moods as others have. The only\r\n+difference is that your moods are rather meaningless. You can't have\r\n+forgotten that you assured me most solemnly that nothing in the world\r\n+would induce you to send it to any exhibition. You told Harry exactly\r\n+the same thing.\u0022 He stopped suddenly, and a gleam of light came into\r\n+his eyes. He remembered that Lord Henry had said to him once, half\r\n+seriously and half in jest, \u0022If you want to have a strange quarter of\r\n+an hour, get Basil to tell you why he won't exhibit your picture. He\r\n+told me why he wouldn't, and it was a revelation to me.\u0022 Yes, perhaps\r\n+Basil, too, had his secret. He would ask him and try.\r\n+\r\n+\u0022Basil,\u0022 he said, coming over quite close and looking him straight in\r\n+the face, \u0022we have each of us a secret. Let me know yours, and I shall\r\n+tell you mine. What was your reason for refusing to exhibit my\r\n+picture?\u0022\r\n+\r\n+The painter shuddered in spite of himself. \u0022Dorian, if I told you, you\r\n+might like me less than you do, and you would certainly laugh at me. I\r\n+could not bear your doing either of those two things. If you wish me\r\n+never to look at your picture again, I am content. I have always you\r\n+to look at. If you wish the best work I have ever done to be hidden\r\n+from the world, I am satisfied. Your friendship is dearer to me than\r\n+any fame or reputation.\u0022\r\n+\r\n+\u0022No, Basil, you must tell me,\u0022 insisted Dorian Gray. \u0022I think I have a\r\n+right to know.\u0022 His feeling of terror had passed away, and curiosity\r\n+had taken its place. He was determined to find out Basil Hallward's\r\n+mystery.\r\n+\r\n+\u0022Let us sit down, Dorian,\u0022 said the painter, looking troubled. \u0022Let us\r\n+sit down. And just answer me one question. Have you noticed in the\r\n+picture something curious?--something that probably at first did not\r\n+strike you, but that revealed itself to you suddenly?\u0022\r\n+\r\n+\u0022Basil!\u0022 cried the lad, clutching the arms of his chair with trembling\r\n+hands and gazing at him with wild startled eyes.\r\n+\r\n+\u0022I see you did. Don't speak. Wait till you hear what I have to say.\r\n+Dorian, from the moment I met you, your personality had the most\r\n+extraordinary influence over me. I was dominated, soul, brain, and\r\n+power, by you. You became to me the visible incarnation of that unseen\r\n+ideal whose memory haunts us artists like an exquisite dream. I\r\n+worshipped you. I grew jealous of every one to whom you spoke. I\r\n+wanted to have you all to myself. I was only happy when I was with\r\n+you. When you were away from me, you were still present in my art....\r\n+Of course, I never let you know anything about this. It would have\r\n+been impossible. You would not have understood it. I hardly\r\n+understood it myself. I only knew that I had seen perfection face to\r\n+face, and that the world had become wonderful to my eyes--too\r\n+wonderful, perhaps, for in such mad worships there is peril, the peril\r\n+of losing them, no less than the peril of keeping them.... Weeks and\r\n+weeks went on, and I grew more and more absorbed in you. Then came a\r\n+new development. I had drawn you as Paris in dainty armour, and as\r\n+Adonis with huntsman's cloak and polished boar-spear. Crowned with\r\n+heavy lotus-blossoms you had sat on the prow of Adrian's barge, gazing\r\n+across the green turbid Nile. You had leaned over the still pool of\r\n+some Greek woodland and seen in the water's silent silver the marvel of\r\n+your own face. And it had all been what art should be--unconscious,\r\n+ideal, and remote. One day, a fatal day I sometimes think, I\r\n+determined to paint a wonderful portrait of you as you actually are,\r\n+not in the costume of dead ages, but in your own dress and in your own\r\n+time. Whether it was the realism of the method, or the mere wonder of\r\n+your own personality, thus directly presented to me without mist or\r\n+veil, I cannot tell. But I know that as I worked at it, every flake\r\n+and film of colour seemed to me to reveal my secret. I grew afraid\r\n+that others would know of my idolatry. I felt, Dorian, that I had told\r\n+too much, that I had put too much of myself into it. Then it was that\r\n+I resolved never to allow the picture to be exhibited. You were a\r\n+little annoyed; but then you did not realize all that it meant to me.\r\n+Harry, to whom I talked about it, laughed at me. But I did not mind\r\n+that. When the picture was finished, and I sat alone with it, I felt\r\n+that I was right.... Well, after a few days the thing left my studio,\r\n+and as soon as I had got rid of the intolerable fascination of its\r\n+presence, it seemed to me that I had been foolish in imagining that I\r\n+had seen anything in it, more than that you were extremely good-looking\r\n+and that I could paint. Even now I cannot help feeling that it is a\r\n+mistake to think that the passion one feels in creation is ever really\r\n+shown in the work one creates. Art is always more abstract than we\r\n+fancy. Form and colour tell us of form and colour--that is all. It\r\n+often seems to me that art conceals the artist far more completely than\r\n+it ever reveals him. And so when I got this offer from Paris, I\r\n+determined to make your portrait the principal thing in my exhibition.\r\n+It never occurred to me that you would refuse. I see now that you were\r\n+right. The picture cannot be shown. You must not be angry with me,\r\n+Dorian, for what I have told you. As I said to Harry, once, you are\r\n+made to be worshipped.\u0022\r\n+\r\n+Dorian Gray drew a long breath. The colour came back to his cheeks,\r\n+and a smile played about his lips. The peril was over. He was safe\r\n+for the time. Yet he could not help feeling infinite pity for the\r\n+painter who had just made this strange confession to him, and wondered\r\n+if he himself would ever be so dominated by the personality of a\r\n+friend. Lord Henry had the charm of being very dangerous. But that\r\n+was all. He was too clever and too cynical to be really fond of.\r\n+Would there ever be some one who would fill him with a strange\r\n+idolatry? Was that one of the things that life had in store?\r\n+\r\n+\u0022It is extraordinary to me, Dorian,\u0022 said Hallward, \u0022that you should\r\n+have seen this in the portrait. Did you really see it?\u0022\r\n+\r\n+\u0022I saw something in it,\u0022 he answered, \u0022something that seemed to me very\r\n+curious.\u0022\r\n+\r\n+\u0022Well, you don't mind my looking at the thing now?\u0022\r\n+\r\n+Dorian shook his head. \u0022You must not ask me that, Basil. I could not\r\n+possibly let you stand in front of that picture.\u0022\r\n+\r\n+\u0022You will some day, surely?\u0022\r\n+\r\n+\u0022Never.\u0022\r\n+\r\n+\u0022Well, perhaps you are right. And now good-bye, Dorian. You have been\r\n+the one person in my life who has really influenced my art. Whatever I\r\n+have done that is good, I owe to you. Ah! you don't know what it cost\r\n+me to tell you all that I have told you.\u0022\r\n+\r\n+\u0022My dear Basil,\u0022 said Dorian, \u0022what have you told me? Simply that you\r\n+felt that you admired me too much. That is not even a compliment.\u0022\r\n+\r\n+\u0022It was not intended as a compliment. It was a confession. Now that I\r\n+have made it, something seems to have gone out of me. Perhaps one\r\n+should never put one's worship into words.\u0022\r\n+\r\n+\u0022It was a very disappointing confession.\u0022\r\n+\r\n+\u0022Why, what did you expect, Dorian? You didn't see anything else in the\r\n+picture, did you? There was nothing else to see?\u0022\r\n+\r\n+\u0022No; there was nothing else to see. Why do you ask? But you mustn't\r\n+talk about worship. It is foolish. You and I are friends, Basil, and\r\n+we must always remain so.\u0022\r\n+\r\n+\u0022You have got Harry,\u0022 said the painter sadly.\r\n+\r\n+\u0022Oh, Harry!\u0022 cried the lad, with a ripple of laughter. \u0022Harry spends\r\n+his days in saying what is incredible and his evenings in doing what is\r\n+improbable. Just the sort of life I would like to lead. But still I\r\n+don't think I would go to Harry if I were in trouble. I would sooner\r\n+go to you, Basil.\u0022\r\n+\r\n+\u0022You will sit to me again?\u0022\r\n+\r\n+\u0022Impossible!\u0022\r\n+\r\n+\u0022You spoil my life as an artist by refusing, Dorian. No man comes\r\n+across two ideal things. Few come across one.\u0022\r\n+\r\n+\u0022I can't explain it to you, Basil, but I must never sit to you again.\r\n+There is something fatal about a portrait. It has a life of its own.\r\n+I will come and have tea with you. That will be just as pleasant.\u0022\r\n+\r\n+\u0022Pleasanter for you, I am afraid,\u0022 murmured Hallward regretfully. \u0022And\r\n+now good-bye. I am sorry you won't let me look at the picture once\r\n+again. But that can't be helped. I quite understand what you feel\r\n+about it.\u0022\r\n+\r\n+As he left the room, Dorian Gray smiled to himself. Poor Basil! How\r\n+little he knew of the true reason! And how strange it was that,\r\n+instead of having been forced to reveal his own secret, he had\r\n+succeeded, almost by chance, in wresting a secret from his friend! How\r\n+much that strange confession explained to him! The painter's absurd\r\n+fits of jealousy, his wild devotion, his extravagant panegyrics, his\r\n+curious reticences--he understood them all now, and he felt sorry.\r\n+There seemed to him to be something tragic in a friendship so coloured\r\n+by romance.\r\n+\r\n+He sighed and touched the bell. The portrait must be hidden away at\r\n+all costs. He could not run such a risk of discovery again. It had\r\n+been mad of him to have allowed the thing to remain, even for an hour,\r\n+in a room to which any of his friends had access.\r\n+\r\n+\r\n+\r\n+CHAPTER 10\r\n+\r\n+When his servant entered, he looked at him steadfastly and wondered if\r\n+he had thought of peering behind the screen. The man was quite\r\n+impassive and waited for his orders. Dorian lit a cigarette and walked\r\n+over to the glass and glanced into it. He could see the reflection of\r\n+Victor's face perfectly. It was like a placid mask of servility.\r\n+There was nothing to be afraid of, there. Yet he thought it best to be\r\n+on his guard.\r\n+\r\n+Speaking very slowly, he told him to tell the house-keeper that he\r\n+wanted to see her, and then to go to the frame-maker and ask him to\r\n+send two of his men round at once. It seemed to him that as the man\r\n+left the room his eyes wandered in the direction of the screen. Or was\r\n+that merely his own fancy?\r\n+\r\n+After a few moments, in her black silk dress, with old-fashioned thread\r\n+mittens on her wrinkled hands, Mrs. Leaf bustled into the library. He\r\n+asked her for the key of the schoolroom.\r\n+\r\n+\u0022The old schoolroom, Mr. Dorian?\u0022 she exclaimed. \u0022Why, it is full of\r\n+dust. I must get it arranged and put straight before you go into it.\r\n+It is not fit for you to see, sir. It is not, indeed.\u0022\r\n+\r\n+\u0022I don't want it put straight, Leaf. I only want the key.\u0022\r\n+\r\n+\u0022Well, sir, you'll be covered with cobwebs if you go into it. Why, it\r\n+hasn't been opened for nearly five years--not since his lordship died.\u0022\r\n+\r\n+He winced at the mention of his grandfather. He had hateful memories\r\n+of him. \u0022That does not matter,\u0022 he answered. \u0022I simply want to see\r\n+the place--that is all. Give me the key.\u0022\r\n+\r\n+\u0022And here is the key, sir,\u0022 said the old lady, going over the contents\r\n+of her bunch with tremulously uncertain hands. \u0022Here is the key. I'll\r\n+have it off the bunch in a moment. But you don't think of living up\r\n+there, sir, and you so comfortable here?\u0022\r\n+\r\n+\u0022No, no,\u0022 he cried petulantly. \u0022Thank you, Leaf. That will do.\u0022\r\n+\r\n+She lingered for a few moments, and was garrulous over some detail of\r\n+the household. He sighed and told her to manage things as she thought\r\n+best. She left the room, wreathed in smiles.\r\n+\r\n+As the door closed, Dorian put the key in his pocket and looked round\r\n+the room. His eye fell on a large, purple satin coverlet heavily\r\n+embroidered with gold, a splendid piece of late seventeenth-century\r\n+Venetian work that his grandfather had found in a convent near Bologna.\r\n+Yes, that would serve to wrap the dreadful thing in. It had perhaps\r\n+served often as a pall for the dead. Now it was to hide something that\r\n+had a corruption of its own, worse than the corruption of death\r\n+itself--something that would breed horrors and yet would never die.\r\n+What the worm was to the corpse, his sins would be to the painted image\r\n+on the canvas. They would mar its beauty and eat away its grace. They\r\n+would defile it and make it shameful. And yet the thing would still\r\n+live on. It would be always alive.\r\n+\r\n+He shuddered, and for a moment he regretted that he had not told Basil\r\n+the true reason why he had wished to hide the picture away. Basil\r\n+would have helped him to resist Lord Henry's influence, and the still\r\n+more poisonous influences that came from his own temperament. The love\r\n+that he bore him--for it was really love--had nothing in it that was\r\n+not noble and intellectual. It was not that mere physical admiration\r\n+of beauty that is born of the senses and that dies when the senses\r\n+tire. It was such love as Michelangelo had known, and Montaigne, and\r\n+Winckelmann, and Shakespeare himself. Yes, Basil could have saved him.\r\n+But it was too late now. The past could always be annihilated.\r\n+Regret, denial, or forgetfulness could do that. But the future was\r\n+inevitable. There were passions in him that would find their terrible\r\n+outlet, dreams that would make the shadow of their evil real.\r\n+\r\n+He took up from the couch the great purple-and-gold texture that\r\n+covered it, and, holding it in his hands, passed behind the screen.\r\n+Was the face on the canvas viler than before? It seemed to him that it\r\n+was unchanged, and yet his loathing of it was intensified. Gold hair,\r\n+blue eyes, and rose-red lips--they all were there. It was simply the\r\n+expression that had altered. That was horrible in its cruelty.\r\n+Compared to what he saw in it of censure or rebuke, how shallow Basil's\r\n+reproaches about Sibyl Vane had been!--how shallow, and of what little\r\n+account! His own soul was looking out at him from the canvas and\r\n+calling him to judgement. A look of pain came across him, and he flung\r\n+the rich pall over the picture. As he did so, a knock came to the\r\n+door. He passed out as his servant entered.\r\n+\r\n+\u0022The persons are here, Monsieur.\u0022\r\n+\r\n+He felt that the man must be got rid of at once. He must not be\r\n+allowed to know where the picture was being taken to. There was\r\n+something sly about him, and he had thoughtful, treacherous eyes.\r\n+Sitting down at the writing-table he scribbled a note to Lord Henry,\r\n+asking him to send him round something to read and reminding him that\r\n+they were to meet at eight-fifteen that evening.\r\n+\r\n+\u0022Wait for an answer,\u0022 he said, handing it to him, \u0022and show the men in\r\n+here.\u0022\r\n+\r\n+In two or three minutes there was another knock, and Mr. Hubbard\r\n+himself, the celebrated frame-maker of South Audley Street, came in\r\n+with a somewhat rough-looking young assistant. Mr. Hubbard was a\r\n+florid, red-whiskered little man, whose admiration for art was\r\n+considerably tempered by the inveterate impecuniosity of most of the\r\n+artists who dealt with him. As a rule, he never left his shop. He\r\n+waited for people to come to him. But he always made an exception in\r\n+favour of Dorian Gray. There was something about Dorian that charmed\r\n+everybody. It was a pleasure even to see him.\r\n+\r\n+\u0022What can I do for you, Mr. Gray?\u0022 he said, rubbing his fat freckled\r\n+hands. \u0022I thought I would do myself the honour of coming round in\r\n+person. I have just got a beauty of a frame, sir. Picked it up at a\r\n+sale. Old Florentine. Came from Fonthill, I believe. Admirably\r\n+suited for a religious subject, Mr. Gray.\u0022\r\n+\r\n+\u0022I am so sorry you have given yourself the trouble of coming round, Mr.\r\n+Hubbard. I shall certainly drop in and look at the frame--though I\r\n+don't go in much at present for religious art--but to-day I only want a\r\n+picture carried to the top of the house for me. It is rather heavy, so\r\n+I thought I would ask you to lend me a couple of your men.\u0022\r\n+\r\n+\u0022No trouble at all, Mr. Gray. I am delighted to be of any service to\r\n+you. Which is the work of art, sir?\u0022\r\n+\r\n+\u0022This,\u0022 replied Dorian, moving the screen back. \u0022Can you move it,\r\n+covering and all, just as it is? I don't want it to get scratched\r\n+going upstairs.\u0022\r\n+\r\n+\u0022There will be no difficulty, sir,\u0022 said the genial frame-maker,\r\n+beginning, with the aid of his assistant, to unhook the picture from\r\n+the long brass chains by which it was suspended. \u0022And, now, where\r\n+shall we carry it to, Mr. Gray?\u0022\r\n+\r\n+\u0022I will show you the way, Mr. Hubbard, if you will kindly follow me.\r\n+Or perhaps you had better go in front. I am afraid it is right at the\r\n+top of the house. We will go up by the front staircase, as it is\r\n+wider.\u0022\r\n+\r\n+He held the door open for them, and they passed out into the hall and\r\n+began the ascent. The elaborate character of the frame had made the\r\n+picture extremely bulky, and now and then, in spite of the obsequious\r\n+protests of Mr. Hubbard, who had the true tradesman's spirited dislike\r\n+of seeing a gentleman doing anything useful, Dorian put his hand to it\r\n+so as to help them.\r\n+\r\n+\u0022Something of a load to carry, sir,\u0022 gasped the little man when they\r\n+reached the top landing. And he wiped his shiny forehead.\r\n+\r\n+\u0022I am afraid it is rather heavy,\u0022 murmured Dorian as he unlocked the\r\n+door that opened into the room that was to keep for him the curious\r\n+secret of his life and hide his soul from the eyes of men.\r\n+\r\n+He had not entered the place for more than four years--not, indeed,\r\n+since he had used it first as a play-room when he was a child, and then\r\n+as a study when he grew somewhat older. It was a large,\r\n+well-proportioned room, which had been specially built by the last Lord\r\n+Kelso for the use of the little grandson whom, for his strange likeness\r\n+to his mother, and also for other reasons, he had always hated and\r\n+desired to keep at a distance. It appeared to Dorian to have but\r\n+little changed. There was the huge Italian _cassone_, with its\r\n+fantastically painted panels and its tarnished gilt mouldings, in which\r\n+he had so often hidden himself as a boy. There the satinwood book-case\r\n+filled with his dog-eared schoolbooks. On the wall behind it was\r\n+hanging the same ragged Flemish tapestry where a faded king and queen\r\n+were playing chess in a garden, while a company of hawkers rode by,\r\n+carrying hooded birds on their gauntleted wrists. How well he\r\n+remembered it all! Every moment of his lonely childhood came back to\r\n+him as he looked round. He recalled the stainless purity of his boyish\r\n+life, and it seemed horrible to him that it was here the fatal portrait\r\n+was to be hidden away. How little he had thought, in those dead days,\r\n+of all that was in store for him!\r\n+\r\n+But there was no other place in the house so secure from prying eyes as\r\n+this. He had the key, and no one else could enter it. Beneath its\r\n+purple pall, the face painted on the canvas could grow bestial, sodden,\r\n+and unclean. What did it matter? No one could see it. He himself\r\n+would not see it. Why should he watch the hideous corruption of his\r\n+soul? He kept his youth--that was enough. And, besides, might not\r\n+his nature grow finer, after all? There was no reason that the future\r\n+should be so full of shame. Some love might come across his life, and\r\n+purify him, and shield him from those sins that seemed to be already\r\n+stirring in spirit and in flesh--those curious unpictured sins whose\r\n+very mystery lent them their subtlety and their charm. Perhaps, some\r\n+day, the cruel look would have passed away from the scarlet sensitive\r\n+mouth, and he might show to the world Basil Hallward's masterpiece.\r\n+\r\n+No; that was impossible. Hour by hour, and week by week, the thing\r\n+upon the canvas was growing old. It might escape the hideousness of\r\n+sin, but the hideousness of age was in store for it. The cheeks would\r\n+become hollow or flaccid. Yellow crow's feet would creep round the\r\n+fading eyes and make them horrible. The hair would lose its\r\n+brightness, the mouth would gape or droop, would be foolish or gross,\r\n+as the mouths of old men are. There would be the wrinkled throat, the\r\n+cold, blue-veined hands, the twisted body, that he remembered in the\r\n+grandfather who had been so stern to him in his boyhood. The picture\r\n+had to be concealed. There was no help for it.\r\n+\r\n+\u0022Bring it in, Mr. Hubbard, please,\u0022 he said, wearily, turning round.\r\n+\u0022I am sorry I kept you so long. I was thinking of something else.\u0022\r\n+\r\n+\u0022Always glad to have a rest, Mr. Gray,\u0022 answered the frame-maker, who\r\n+was still gasping for breath. \u0022Where shall we put it, sir?\u0022\r\n+\r\n+\u0022Oh, anywhere. Here: this will do. I don't want to have it hung up.\r\n+Just lean it against the wall. Thanks.\u0022\r\n+\r\n+\u0022Might one look at the work of art, sir?\u0022\r\n+\r\n+Dorian started. \u0022It would not interest you, Mr. Hubbard,\u0022 he said,\r\n+keeping his eye on the man. He felt ready to leap upon him and fling\r\n+him to the ground if he dared to lift the gorgeous hanging that\r\n+concealed the secret of his life. \u0022I shan't trouble you any more now.\r\n+I am much obliged for your kindness in coming round.\u0022\r\n+\r\n+\u0022Not at all, not at all, Mr. Gray. Ever ready to do anything for you,\r\n+sir.\u0022 And Mr. Hubbard tramped downstairs, followed by the assistant,\r\n+who glanced back at Dorian with a look of shy wonder in his rough\r\n+uncomely face. He had never seen any one so marvellous.\r\n+\r\n+When the sound of their footsteps had died away, Dorian locked the door\r\n+and put the key in his pocket. He felt safe now. No one would ever\r\n+look upon the horrible thing. No eye but his would ever see his shame.\r\n+\r\n+On reaching the library, he found that it was just after five o'clock\r\n+and that the tea had been already brought up. On a little table of\r\n+dark perfumed wood thickly incrusted with nacre, a present from Lady\r\n+Radley, his guardian's wife, a pretty professional invalid who had\r\n+spent the preceding winter in Cairo, was lying a note from Lord Henry,\r\n+and beside it was a book bound in yellow paper, the cover slightly torn\r\n+and the edges soiled. A copy of the third edition of _The St. James's\r\n+Gazette_ had been placed on the tea-tray. It was evident that Victor had\r\n+returned. He wondered if he had met the men in the hall as they were\r\n+leaving the house and had wormed out of them what they had been doing.\r\n+He would be sure to miss the picture--had no doubt missed it already,\r\n+while he had been laying the tea-things. The screen had not been set\r\n+back, and a blank space was visible on the wall. Perhaps some night he\r\n+might find him creeping upstairs and trying to force the door of the\r\n+room. It was a horrible thing to have a spy in one's house. He had\r\n+heard of rich men who had been blackmailed all their lives by some\r\n+servant who had read a letter, or overheard a conversation, or picked\r\n+up a card with an address, or found beneath a pillow a withered flower\r\n+or a shred of crumpled lace.\r\n+\r\n+He sighed, and having poured himself out some tea, opened Lord Henry's\r\n+note. It was simply to say that he sent him round the evening paper,\r\n+and a book that might interest him, and that he would be at the club at\r\n+eight-fifteen. He opened _The St. James's_ languidly, and looked through\r\n+it. A red pencil-mark on the fifth page caught his eye. It drew\r\n+attention to the following paragraph:\r\n+\r\n+\r\n+INQUEST ON AN ACTRESS.--An inquest was held this morning at the Bell\r\n+Tavern, Hoxton Road, by Mr. Danby, the District Coroner, on the body of\r\n+Sibyl Vane, a young actress recently engaged at the Royal Theatre,\r\n+Holborn. A verdict of death by misadventure was returned.\r\n+Considerable sympathy was expressed for the mother of the deceased, who\r\n+was greatly affected during the giving of her own evidence, and that of\r\n+Dr. Birrell, who had made the post-mortem examination of the deceased.\r\n+\r\n+\r\n+He frowned, and tearing the paper in two, went across the room and\r\n+flung the pieces away. How ugly it all was! And how horribly real\r\n+ugliness made things! He felt a little annoyed with Lord Henry for\r\n+having sent him the report. And it was certainly stupid of him to have\r\n+marked it with red pencil. Victor might have read it. The man knew\r\n+more than enough English for that.\r\n+\r\n+Perhaps he had read it and had begun to suspect something. And, yet,\r\n+what did it matter? What had Dorian Gray to do with Sibyl Vane's\r\n+death? There was nothing to fear. Dorian Gray had not killed her.\r\n+\r\n+His eye fell on the yellow book that Lord Henry had sent him. What was\r\n+it, he wondered. He went towards the little, pearl-coloured octagonal\r\n+stand that had always looked to him like the work of some strange\r\n+Egyptian bees that wrought in silver, and taking up the volume, flung\r\n+himself into an arm-chair and began to turn over the leaves. After a\r\n+few minutes he became absorbed. It was the strangest book that he had\r\n+ever read. It seemed to him that in exquisite raiment, and to the\r\n+delicate sound of flutes, the sins of the world were passing in dumb\r\n+show before him. Things that he had dimly dreamed of were suddenly\r\n+made real to him. Things of which he had never dreamed were gradually\r\n+revealed.\r\n+\r\n+It was a novel without a plot and with only one character, being,\r\n+indeed, simply a psychological study of a certain young Parisian who\r\n+spent his life trying to realize in the nineteenth century all the\r\n+passions and modes of thought that belonged to every century except his\r\n+own, and to sum up, as it were, in himself the various moods through\r\n+which the world-spirit had ever passed, loving for their mere\r\n+artificiality those renunciations that men have unwisely called virtue,\r\n+as much as those natural rebellions that wise men still call sin. The\r\n+style in which it was written was that curious jewelled style, vivid\r\n+and obscure at once, full of _argot_ and of archaisms, of technical\r\n+expressions and of elaborate paraphrases, that characterizes the work\r\n+of some of the finest artists of the French school of _Symbolistes_.\r\n+There were in it metaphors as monstrous as orchids and as subtle in\r\n+colour. The life of the senses was described in the terms of mystical\r\n+philosophy. One hardly knew at times whether one was reading the\r\n+spiritual ecstasies of some mediaeval saint or the morbid confessions\r\n+of a modern sinner. It was a poisonous book. The heavy odour of\r\n+incense seemed to cling about its pages and to trouble the brain. The\r\n+mere cadence of the sentences, the subtle monotony of their music, so\r\n+full as it was of complex refrains and movements elaborately repeated,\r\n+produced in the mind of the lad, as he passed from chapter to chapter,\r\n+a form of reverie, a malady of dreaming, that made him unconscious of\r\n+the falling day and creeping shadows.\r\n+\r\n+Cloudless, and pierced by one solitary star, a copper-green sky gleamed\r\n+through the windows. He read on by its wan light till he could read no\r\n+more. Then, after his valet had reminded him several times of the\r\n+lateness of the hour, he got up, and going into the next room, placed\r\n+the book on the little Florentine table that always stood at his\r\n+bedside and began to dress for dinner.\r\n+\r\n+It was almost nine o'clock before he reached the club, where he found\r\n+Lord Henry sitting alone, in the morning-room, looking very much bored.\r\n+\r\n+\u0022I am so sorry, Harry,\u0022 he cried, \u0022but really it is entirely your\r\n+fault. That book you sent me so fascinated me that I forgot how the\r\n+time was going.\u0022\r\n+\r\n+\u0022Yes, I thought you would like it,\u0022 replied his host, rising from his\r\n+chair.\r\n+\r\n+\u0022I didn't say I liked it, Harry. I said it fascinated me. There is a\r\n+great difference.\u0022\r\n+\r\n+\u0022Ah, you have discovered that?\u0022 murmured Lord Henry. And they passed\r\n+into the dining-room.\r\n+\r\n+\r\n+\r\n+CHAPTER 11\r\n+\r\n+For years, Dorian Gray could not free himself from the influence of\r\n+this book. Or perhaps it would be more accurate to say that he never\r\n+sought to free himself from it. He procured from Paris no less than\r\n+nine large-paper copies of the first edition, and had them bound in\r\n+different colours, so that they might suit his various moods and the\r\n+changing fancies of a nature over which he seemed, at times, to have\r\n+almost entirely lost control. The hero, the wonderful young Parisian\r\n+in whom the romantic and the scientific temperaments were so strangely\r\n+blended, became to him a kind of prefiguring type of himself. And,\r\n+indeed, the whole book seemed to him to contain the story of his own\r\n+life, written before he had lived it.\r\n+\r\n+In one point he was more fortunate than the novel's fantastic hero. He\r\n+never knew--never, indeed, had any cause to know--that somewhat\r\n+grotesque dread of mirrors, and polished metal surfaces, and still\r\n+water which came upon the young Parisian so early in his life, and was\r\n+occasioned by the sudden decay of a beau that had once, apparently,\r\n+been so remarkable. It was with an almost cruel joy--and perhaps in\r\n+nearly every joy, as certainly in every pleasure, cruelty has its\r\n+place--that he used to read the latter part of the book, with its\r\n+really tragic, if somewhat overemphasized, account of the sorrow and\r\n+despair of one who had himself lost what in others, and the world, he\r\n+had most dearly valued.\r\n+\r\n+For the wonderful beauty that had so fascinated Basil Hallward, and\r\n+many others besides him, seemed never to leave him. Even those who had\r\n+heard the most evil things against him--and from time to time strange\r\n+rumours about his mode of life crept through London and became the\r\n+chatter of the clubs--could not believe anything to his dishonour when\r\n+they saw him. He had always the look of one who had kept himself\r\n+unspotted from the world. Men who talked grossly became silent when\r\n+Dorian Gray entered the room. There was something in the purity of his\r\n+face that rebuked them. His mere presence seemed to recall to them the\r\n+memory of the innocence that they had tarnished. They wondered how one\r\n+so charming and graceful as he was could have escaped the stain of an\r\n+age that was at once sordid and sensual.\r\n+\r\n+Often, on returning home from one of those mysterious and prolonged\r\n+absences that gave rise to such strange conjecture among those who were\r\n+his friends, or thought that they were so, he himself would creep\r\n+upstairs to the locked room, open the door with the key that never left\r\n+him now, and stand, with a mirror, in front of the portrait that Basil\r\n+Hallward had painted of him, looking now at the evil and aging face on\r\n+the canvas, and now at the fair young face that laughed back at him\r\n+from the polished glass. The very sharpness of the contrast used to\r\n+quicken his sense of pleasure. He grew more and more enamoured of his\r\n+own beauty, more and more interested in the corruption of his own soul.\r\n+He would examine with minute care, and sometimes with a monstrous and\r\n+terrible delight, the hideous lines that seared the wrinkling forehead\r\n+or crawled around the heavy sensual mouth, wondering sometimes which\r\n+were the more horrible, the signs of sin or the signs of age. He would\r\n+place his white hands beside the coarse bloated hands of the picture,\r\n+and smile. He mocked the misshapen body and the failing limbs.\r\n+\r\n+There were moments, indeed, at night, when, lying sleepless in his own\r\n+delicately scented chamber, or in the sordid room of the little\r\n+ill-famed tavern near the docks which, under an assumed name and in\r\n+disguise, it was his habit to frequent, he would think of the ruin he\r\n+had brought upon his soul with a pity that was all the more poignant\r\n+because it was purely selfish. But moments such as these were rare.\r\n+That curiosity about life which Lord Henry had first stirred in him, as\r\n+they sat together in the garden of their friend, seemed to increase\r\n+with gratification. The more he knew, the more he desired to know. He\r\n+had mad hungers that grew more ravenous as he fed them.\r\n+\r\n+Yet he was not really reckless, at any rate in his relations to\r\n+society. Once or twice every month during the winter, and on each\r\n+Wednesday evening while the season lasted, he would throw open to the\r\n+world his beautiful house and have the most celebrated musicians of the\r\n+day to charm his guests with the wonders of their art. His little\r\n+dinners, in the settling of which Lord Henry always assisted him, were\r\n+noted as much for the careful selection and placing of those invited,\r\n+as for the exquisite taste shown in the decoration of the table, with\r\n+its subtle symphonic arrangements of exotic flowers, and embroidered\r\n+cloths, and antique plate of gold and silver. Indeed, there were many,\r\n+especially among the very young men, who saw, or fancied that they saw,\r\n+in Dorian Gray the true realization of a type of which they had often\r\n+dreamed in Eton or Oxford days, a type that was to combine something of\r\n+the real culture of the scholar with all the grace and distinction and\r\n+perfect manner of a citizen of the world. To them he seemed to be of\r\n+the company of those whom Dante describes as having sought to \u0022make\r\n+themselves perfect by the worship of beauty.\u0022 Like Gautier, he was one\r\n+for whom \u0022the visible world existed.\u0022\r\n+\r\n+And, certainly, to him life itself was the first, the greatest, of the\r\n+arts, and for it all the other arts seemed to be but a preparation.\r\n+Fashion, by which what is really fantastic becomes for a moment\r\n+universal, and dandyism, which, in its own way, is an attempt to assert\r\n+the absolute modernity of beauty, had, of course, their fascination for\r\n+him. His mode of dressing, and the particular styles that from time to\r\n+time he affected, had their marked influence on the young exquisites of\r\n+the Mayfair balls and Pall Mall club windows, who copied him in\r\n+everything that he did, and tried to reproduce the accidental charm of\r\n+his graceful, though to him only half-serious, fopperies.\r\n+\r\n+For, while he was but too ready to accept the position that was almost\r\n+immediately offered to him on his coming of age, and found, indeed, a\r\n+subtle pleasure in the thought that he might really become to the\r\n+London of his own day what to imperial Neronian Rome the author of the\r\n+Satyricon once had been, yet in his inmost heart he desired to be\r\n+something more than a mere _arbiter elegantiarum_, to be consulted on the\r\n+wearing of a jewel, or the knotting of a necktie, or the conduct of a\r\n+cane. He sought to elaborate some new scheme of life that would have\r\n+its reasoned philosophy and its ordered principles, and find in the\r\n+spiritualizing of the senses its highest realization.\r\n+\r\n+The worship of the senses has often, and with much justice, been\r\n+decried, men feeling a natural instinct of terror about passions and\r\n+sensations that seem stronger than themselves, and that they are\r\n+conscious of sharing with the less highly organized forms of existence.\r\n+But it appeared to Dorian Gray that the true nature of the senses had\r\n+never been understood, and that they had remained savage and animal\r\n+merely because the world had sought to starve them into submission or\r\n+to kill them by pain, instead of aiming at making them elements of a\r\n+new spirituality, of which a fine instinct for beauty was to be the\r\n+dominant characteristic. As he looked back upon man moving through\r\n+history, he was haunted by a feeling of loss. So much had been\r\n+surrendered! and to such little purpose! There had been mad wilful\r\n+rejections, monstrous forms of self-torture and self-denial, whose\r\n+origin was fear and whose result was a degradation infinitely more\r\n+terrible than that fancied degradation from which, in their ignorance,\r\n+they had sought to escape; Nature, in her wonderful irony, driving out\r\n+the anchorite to feed with the wild animals of the desert and giving to\r\n+the hermit the beasts of the field as his companions.\r\n+\r\n+Yes: there was to be, as Lord Henry had prophesied, a new Hedonism\r\n+that was to recreate life and to save it from that harsh uncomely\r\n+puritanism that is having, in our own day, its curious revival. It was\r\n+to have its service of the intellect, certainly, yet it was never to\r\n+accept any theory or system that would involve the sacrifice of any\r\n+mode of passionate experience. Its aim, indeed, was to be experience\r\n+itself, and not the fruits of experience, sweet or bitter as they might\r\n+be. Of the asceticism that deadens the senses, as of the vulgar\r\n+profligacy that dulls them, it was to know nothing. But it was to\r\n+teach man to concentrate himself upon the moments of a life that is\r\n+itself but a moment.\r\n+\r\n+There are few of us who have not sometimes wakened before dawn, either\r\n+after one of those dreamless nights that make us almost enamoured of\r\n+death, or one of those nights of horror and misshapen joy, when through\r\n+the chambers of the brain sweep phantoms more terrible than reality\r\n+itself, and instinct with that vivid life that lurks in all grotesques,\r\n+and that lends to Gothic art its enduring vitality, this art being, one\r\n+might fancy, especially the art of those whose minds have been troubled\r\n+with the malady of reverie. Gradually white fingers creep through the\r\n+curtains, and they appear to tremble. In black fantastic shapes, dumb\r\n+shadows crawl into the corners of the room and crouch there. Outside,\r\n+there is the stirring of birds among the leaves, or the sound of men\r\n+going forth to their work, or the sigh and sob of the wind coming down\r\n+from the hills and wandering round the silent house, as though it\r\n+feared to wake the sleepers and yet must needs call forth sleep from\r\n+her purple cave. Veil after veil of thin dusky gauze is lifted, and by\r\n+degrees the forms and colours of things are restored to them, and we\r\n+watch the dawn remaking the world in its antique pattern. The wan\r\n+mirrors get back their mimic life. The flameless tapers stand where we\r\n+had left them, and beside them lies the half-cut book that we had been\r\n+studying, or the wired flower that we had worn at the ball, or the\r\n+letter that we had been afraid to read, or that we had read too often.\r\n+Nothing seems to us changed. Out of the unreal shadows of the night\r\n+comes back the real life that we had known. We have to resume it where\r\n+we had left off, and there steals over us a terrible sense of the\r\n+necessity for the continuance of energy in the same wearisome round of\r\n+stereotyped habits, or a wild longing, it may be, that our eyelids\r\n+might open some morning upon a world that had been refashioned anew in\r\n+the darkness for our pleasure, a world in which things would have fresh\r\n+shapes and colours, and be changed, or have other secrets, a world in\r\n+which the past would have little or no place, or survive, at any rate,\r\n+in no conscious form of obligation or regret, the remembrance even of\r\n+joy having its bitterness and the memories of pleasure their pain.\r\n+\r\n+It was the creation of such worlds as these that seemed to Dorian Gray\r\n+to be the true object, or amongst the true objects, of life; and in his\r\n+search for sensations that would be at once new and delightful, and\r\n+possess that element of strangeness that is so essential to romance, he\r\n+would often adopt certain modes of thought that he knew to be really\r\n+alien to his nature, abandon himself to their subtle influences, and\r\n+then, having, as it were, caught their colour and satisfied his\r\n+intellectual curiosity, leave them with that curious indifference that\r\n+is not incompatible with a real ardour of temperament, and that,\r\n+indeed, according to certain modern psychologists, is often a condition\r\n+of it.\r\n+\r\n+It was rumoured of him once that he was about to join the Roman\r\n+Catholic communion, and certainly the Roman ritual had always a great\r\n+attraction for him. The daily sacrifice, more awful really than all\r\n+the sacrifices of the antique world, stirred him as much by its superb\r\n+rejection of the evidence of the senses as by the primitive simplicity\r\n+of its elements and the eternal pathos of the human tragedy that it\r\n+sought to symbolize. He loved to kneel down on the cold marble\r\n+pavement and watch the priest, in his stiff flowered dalmatic, slowly\r\n+and with white hands moving aside the veil of the tabernacle, or\r\n+raising aloft the jewelled, lantern-shaped monstrance with that pallid\r\n+wafer that at times, one would fain think, is indeed the \u0022_panis\r\n+caelestis_,\u0022 the bread of angels, or, robed in the garments of the\r\n+Passion of Christ, breaking the Host into the chalice and smiting his\r\n+breast for his sins. The fuming censers that the grave boys, in their\r\n+lace and scarlet, tossed into the air like great gilt flowers had their\r\n+subtle fascination for him. As he passed out, he used to look with\r\n+wonder at the black confessionals and long to sit in the dim shadow of\r\n+one of them and listen to men and women whispering through the worn\r\n+grating the true story of their lives.\r\n+\r\n+But he never fell into the error of arresting his intellectual\r\n+development by any formal acceptance of creed or system, or of\r\n+mistaking, for a house in which to live, an inn that is but suitable\r\n+for the sojourn of a night, or for a few hours of a night in which\r\n+there are no stars and the moon is in travail. Mysticism, with its\r\n+marvellous power of making common things strange to us, and the subtle\r\n+antinomianism that always seems to accompany it, moved him for a\r\n+season; and for a season he inclined to the materialistic doctrines of\r\n+the _Darwinismus_ movement in Germany, and found a curious pleasure in\r\n+tracing the thoughts and passions of men to some pearly cell in the\r\n+brain, or some white nerve in the body, delighting in the conception of\r\n+the absolute dependence of the spirit on certain physical conditions,\r\n+morbid or healthy, normal or diseased. Yet, as has been said of him\r\n+before, no theory of life seemed to him to be of any importance\r\n+compared with life itself. He felt keenly conscious of how barren all\r\n+intellectual speculation is when separated from action and experiment.\r\n+He knew that the senses, no less than the soul, have their spiritual\r\n+mysteries to reveal.\r\n+\r\n+And so he would now study perfumes and the secrets of their\r\n+manufacture, distilling heavily scented oils and burning odorous gums\r\n+from the East. He saw that there was no mood of the mind that had not\r\n+its counterpart in the sensuous life, and set himself to discover their\r\n+true relations, wondering what there was in frankincense that made one\r\n+mystical, and in ambergris that stirred one's passions, and in violets\r\n+that woke the memory of dead romances, and in musk that troubled the\r\n+brain, and in champak that stained the imagination; and seeking often\r\n+to elaborate a real psychology of perfumes, and to estimate the several\r\n+influences of sweet-smelling roots and scented, pollen-laden flowers;\r\n+of aromatic balms and of dark and fragrant woods; of spikenard, that\r\n+sickens; of hovenia, that makes men mad; and of aloes, that are said to\r\n+be able to expel melancholy from the soul.\r\n+\r\n+At another time he devoted himself entirely to music, and in a long\r\n+latticed room, with a vermilion-and-gold ceiling and walls of\r\n+olive-green lacquer, he used to give curious concerts in which mad\r\n+gipsies tore wild music from little zithers, or grave, yellow-shawled\r\n+Tunisians plucked at the strained strings of monstrous lutes, while\r\n+grinning Negroes beat monotonously upon copper drums and, crouching\r\n+upon scarlet mats, slim turbaned Indians blew through long pipes of\r\n+reed or brass and charmed--or feigned to charm--great hooded snakes and\r\n+horrible horned adders. The harsh intervals and shrill discords of\r\n+barbaric music stirred him at times when Schubert's grace, and Chopin's\r\n+beautiful sorrows, and the mighty harmonies of Beethoven himself, fell\r\n+unheeded on his ear. He collected together from all parts of the world\r\n+the strangest instruments that could be found, either in the tombs of\r\n+dead nations or among the few savage tribes that have survived contact\r\n+with Western civilizations, and loved to touch and try them. He had\r\n+the mysterious _juruparis_ of the Rio Negro Indians, that women are not\r\n+allowed to look at and that even youths may not see till they have been\r\n+subjected to fasting and scourging, and the earthen jars of the\r\n+Peruvians that have the shrill cries of birds, and flutes of human\r\n+bones such as Alfonso de Ovalle heard in Chile, and the sonorous green\r\n+jaspers that are found near Cuzco and give forth a note of singular\r\n+sweetness. He had painted gourds filled with pebbles that rattled when\r\n+they were shaken; the long _clarin_ of the Mexicans, into which the\r\n+performer does not blow, but through which he inhales the air; the\r\n+harsh _ture_ of the Amazon tribes, that is sounded by the sentinels who\r\n+sit all day long in high trees, and can be heard, it is said, at a\r\n+distance of three leagues; the _teponaztli_, that has two vibrating\r\n+tongues of wood and is beaten with sticks that are smeared with an\r\n+elastic gum obtained from the milky juice of plants; the _yotl_-bells of\r\n+the Aztecs, that are hung in clusters like grapes; and a huge\r\n+cylindrical drum, covered with the skins of great serpents, like the\r\n+one that Bernal Diaz saw when he went with Cortes into the Mexican\r\n+temple, and of whose doleful sound he has left us so vivid a\r\n+description. The fantastic character of these instruments fascinated\r\n+him, and he felt a curious delight in the thought that art, like\r\n+Nature, has her monsters, things of bestial shape and with hideous\r\n+voices. Yet, after some time, he wearied of them, and would sit in his\r\n+box at the opera, either alone or with Lord Henry, listening in rapt\r\n+pleasure to \u0022Tannhauser\u0022 and seeing in the prelude to that great work\r\n+of art a presentation of the tragedy of his own soul.\r\n+\r\n+On one occasion he took up the study of jewels, and appeared at a\r\n+costume ball as Anne de Joyeuse, Admiral of France, in a dress covered\r\n+with five hundred and sixty pearls. This taste enthralled him for\r\n+years, and, indeed, may be said never to have left him. He would often\r\n+spend a whole day settling and resettling in their cases the various\r\n+stones that he had collected, such as the olive-green chrysoberyl that\r\n+turns red by lamplight, the cymophane with its wirelike line of silver,\r\n+the pistachio-coloured peridot, rose-pink and wine-yellow topazes,\r\n+carbuncles of fiery scarlet with tremulous, four-rayed stars, flame-red\r\n+cinnamon-stones, orange and violet spinels, and amethysts with their\r\n+alternate layers of ruby and sapphire. He loved the red gold of the\r\n+sunstone, and the moonstone's pearly whiteness, and the broken rainbow\r\n+of the milky opal. He procured from Amsterdam three emeralds of\r\n+extraordinary size and richness of colour, and had a turquoise _de la\r\n+vieille roche_ that was the envy of all the connoisseurs.\r\n+\r\n+He discovered wonderful stories, also, about jewels. In Alphonso's\r\n+Clericalis Disciplina a serpent was mentioned with eyes of real\r\n+jacinth, and in the romantic history of Alexander, the Conqueror of\r\n+Emathia was said to have found in the vale of Jordan snakes \u0022with\r\n+collars of real emeralds growing on their backs.\u0022 There was a gem in\r\n+the brain of the dragon, Philostratus told us, and \u0022by the exhibition\r\n+of golden letters and a scarlet robe\u0022 the monster could be thrown into\r\n+a magical sleep and slain. According to the great alchemist, Pierre de\r\n+Boniface, the diamond rendered a man invisible, and the agate of India\r\n+made him eloquent. The cornelian appeased anger, and the hyacinth\r\n+provoked sleep, and the amethyst drove away the fumes of wine. The\r\n+garnet cast out demons, and the hydropicus deprived the moon of her\r\n+colour. The selenite waxed and waned with the moon, and the meloceus,\r\n+that discovers thieves, could be affected only by the blood of kids.\r\n+Leonardus Camillus had seen a white stone taken from the brain of a\r\n+newly killed toad, that was a certain antidote against poison. The\r\n+bezoar, that was found in the heart of the Arabian deer, was a charm\r\n+that could cure the plague. In the nests of Arabian birds was the\r\n+aspilates, that, according to Democritus, kept the wearer from any\r\n+danger by fire.\r\n+\r\n+The King of Ceilan rode through his city with a large ruby in his hand,\r\n+as the ceremony of his coronation. The gates of the palace of John the\r\n+Priest were \u0022made of sardius, with the horn of the horned snake\r\n+inwrought, so that no man might bring poison within.\u0022 Over the gable\r\n+were \u0022two golden apples, in which were two carbuncles,\u0022 so that the\r\n+gold might shine by day and the carbuncles by night. In Lodge's\r\n+strange romance 'A Margarite of America', it was stated that in the\r\n+chamber of the queen one could behold \u0022all the chaste ladies of the\r\n+world, inchased out of silver, looking through fair mirrours of\r\n+chrysolites, carbuncles, sapphires, and greene emeraults.\u0022 Marco Polo\r\n+had seen the inhabitants of Zipangu place rose-coloured pearls in the\r\n+mouths of the dead. A sea-monster had been enamoured of the pearl that\r\n+the diver brought to King Perozes, and had slain the thief, and mourned\r\n+for seven moons over its loss. When the Huns lured the king into the\r\n+great pit, he flung it away--Procopius tells the story--nor was it ever\r\n+found again, though the Emperor Anastasius offered five hundred-weight\r\n+of gold pieces for it. The King of Malabar had shown to a certain\r\n+Venetian a rosary of three hundred and four pearls, one for every god\r\n+that he worshipped.\r\n+\r\n+When the Duke de Valentinois, son of Alexander VI, visited Louis XII of\r\n+France, his horse was loaded with gold leaves, according to Brantome,\r\n+and his cap had double rows of rubies that threw out a great light.\r\n+Charles of England had ridden in stirrups hung with four hundred and\r\n+twenty-one diamonds. Richard II had a coat, valued at thirty thousand\r\n+marks, which was covered with balas rubies. Hall described Henry VIII,\r\n+on his way to the Tower previous to his coronation, as wearing \u0022a\r\n+jacket of raised gold, the placard embroidered with diamonds and other\r\n+rich stones, and a great bauderike about his neck of large balasses.\u0022\r\n+The favourites of James I wore ear-rings of emeralds set in gold\r\n+filigrane. Edward II gave to Piers Gaveston a suit of red-gold armour\r\n+studded with jacinths, a collar of gold roses set with\r\n+turquoise-stones, and a skull-cap _parseme_ with pearls. Henry II wore\r\n+jewelled gloves reaching to the elbow, and had a hawk-glove sewn with\r\n+twelve rubies and fifty-two great orients. The ducal hat of Charles\r\n+the Rash, the last Duke of Burgundy of his race, was hung with\r\n+pear-shaped pearls and studded with sapphires.\r\n+\r\n+How exquisite life had once been! How gorgeous in its pomp and\r\n+decoration! Even to read of the luxury of the dead was wonderful.\r\n+\r\n+Then he turned his attention to embroideries and to the tapestries that\r\n+performed the office of frescoes in the chill rooms of the northern\r\n+nations of Europe. As he investigated the subject--and he always had\r\n+an extraordinary faculty of becoming absolutely absorbed for the moment\r\n+in whatever he took up--he was almost saddened by the reflection of the\r\n+ruin that time brought on beautiful and wonderful things. He, at any\r\n+rate, had escaped that. Summer followed summer, and the yellow\r\n+jonquils bloomed and died many times, and nights of horror repeated the\r\n+story of their shame, but he was unchanged. No winter marred his face\r\n+or stained his flowerlike bloom. How different it was with material\r\n+things! Where had they passed to? Where was the great crocus-coloured\r\n+robe, on which the gods fought against the giants, that had been worked\r\n+by brown girls for the pleasure of Athena? Where the huge velarium\r\n+that Nero had stretched across the Colosseum at Rome, that Titan sail\r\n+of purple on which was represented the starry sky, and Apollo driving a\r\n+chariot drawn by white, gilt-reined steeds? He longed to see the\r\n+curious table-napkins wrought for the Priest of the Sun, on which were\r\n+displayed all the dainties and viands that could be wanted for a feast;\r\n+the mortuary cloth of King Chilperic, with its three hundred golden\r\n+bees; the fantastic robes that excited the indignation of the Bishop of\r\n+Pontus and were figured with \u0022lions, panthers, bears, dogs, forests,\r\n+rocks, hunters--all, in fact, that a painter can copy from nature\u0022; and\r\n+the coat that Charles of Orleans once wore, on the sleeves of which\r\n+were embroidered the verses of a song beginning \u0022_Madame, je suis tout\r\n+joyeux_,\u0022 the musical accompaniment of the words being wrought in gold\r\n+thread, and each note, of square shape in those days, formed with four\r\n+pearls. He read of the room that was prepared at the palace at Rheims\r\n+for the use of Queen Joan of Burgundy and was decorated with \u0022thirteen\r\n+hundred and twenty-one parrots, made in broidery, and blazoned with the\r\n+king's arms, and five hundred and sixty-one butterflies, whose wings\r\n+were similarly ornamented with the arms of the queen, the whole worked\r\n+in gold.\u0022 Catherine de Medicis had a mourning-bed made for her of\r\n+black velvet powdered with crescents and suns. Its curtains were of\r\n+damask, with leafy wreaths and garlands, figured upon a gold and silver\r\n+ground, and fringed along the edges with broideries of pearls, and it\r\n+stood in a room hung with rows of the queen's devices in cut black\r\n+velvet upon cloth of silver. Louis XIV had gold embroidered caryatides\r\n+fifteen feet high in his apartment. The state bed of Sobieski, King of\r\n+Poland, was made of Smyrna gold brocade embroidered in turquoises with\r\n+verses from the Koran. Its supports were of silver gilt, beautifully\r\n+chased, and profusely set with enamelled and jewelled medallions. It\r\n+had been taken from the Turkish camp before Vienna, and the standard of\r\n+Mohammed had stood beneath the tremulous gilt of its canopy.\r\n+\r\n+And so, for a whole year, he sought to accumulate the most exquisite\r\n+specimens that he could find of textile and embroidered work, getting\r\n+the dainty Delhi muslins, finely wrought with gold-thread palmates and\r\n+stitched over with iridescent beetles' wings; the Dacca gauzes, that\r\n+from their transparency are known in the East as \u0022woven air,\u0022 and\r\n+\u0022running water,\u0022 and \u0022evening dew\u0022; strange figured cloths from Java;\r\n+elaborate yellow Chinese hangings; books bound in tawny satins or fair\r\n+blue silks and wrought with _fleurs-de-lis_, birds and images; veils of\r\n+_lacis_ worked in Hungary point; Sicilian brocades and stiff Spanish\r\n+velvets; Georgian work, with its gilt coins, and Japanese _Foukousas_,\r\n+with their green-toned golds and their marvellously plumaged birds.\r\n+\r\n+He had a special passion, also, for ecclesiastical vestments, as indeed\r\n+he had for everything connected with the service of the Church. In the\r\n+long cedar chests that lined the west gallery of his house, he had\r\n+stored away many rare and beautiful specimens of what is really the\r\n+raiment of the Bride of Christ, who must wear purple and jewels and\r\n+fine linen that she may hide the pallid macerated body that is worn by\r\n+the suffering that she seeks for and wounded by self-inflicted pain.\r\n+He possessed a gorgeous cope of crimson silk and gold-thread damask,\r\n+figured with a repeating pattern of golden pomegranates set in\r\n+six-petalled formal blossoms, beyond which on either side was the\r\n+pine-apple device wrought in seed-pearls. The orphreys were divided\r\n+into panels representing scenes from the life of the Virgin, and the\r\n+coronation of the Virgin was figured in coloured silks upon the hood.\r\n+This was Italian work of the fifteenth century. Another cope was of\r\n+green velvet, embroidered with heart-shaped groups of acanthus-leaves,\r\n+from which spread long-stemmed white blossoms, the details of which\r\n+were picked out with silver thread and coloured crystals. The morse\r\n+bore a seraph's head in gold-thread raised work. The orphreys were\r\n+woven in a diaper of red and gold silk, and were starred with\r\n+medallions of many saints and martyrs, among whom was St. Sebastian.\r\n+He had chasubles, also, of amber-coloured silk, and blue silk and gold\r\n+brocade, and yellow silk damask and cloth of gold, figured with\r\n+representations of the Passion and Crucifixion of Christ, and\r\n+embroidered with lions and peacocks and other emblems; dalmatics of\r\n+white satin and pink silk damask, decorated with tulips and dolphins\r\n+and _fleurs-de-lis_; altar frontals of crimson velvet and blue linen; and\r\n+many corporals, chalice-veils, and sudaria. In the mystic offices to\r\n+which such things were put, there was something that quickened his\r\n+imagination.\r\n+\r\n+For these treasures, and everything that he collected in his lovely\r\n+house, were to be to him means of forgetfulness, modes by which he\r\n+could escape, for a season, from the fear that seemed to him at times\r\n+to be almost too great to be borne. Upon the walls of the lonely\r\n+locked room where he had spent so much of his boyhood, he had hung with\r\n+his own hands the terrible portrait whose changing features showed him\r\n+the real degradation of his life, and in front of it had draped the\r\n+purple-and-gold pall as a curtain. For weeks he would not go there,\r\n+would forget the hideous painted thing, and get back his light heart,\r\n+his wonderful joyousness, his passionate absorption in mere existence.\r\n+Then, suddenly, some night he would creep out of the house, go down to\r\n+dreadful places near Blue Gate Fields, and stay there, day after day,\r\n+until he was driven away. On his return he would sit in front of the\r\n+picture, sometimes loathing it and himself, but filled, at other\r\n+times, with that pride of individualism that is half the\r\n+fascination of sin, and smiling with secret pleasure at the misshapen\r\n+shadow that had to bear the burden that should have been his own.\r\n+\r\n+After a few years he could not endure to be long out of England, and\r\n+gave up the villa that he had shared at Trouville with Lord Henry, as\r\n+well as the little white walled-in house at Algiers where they had more\r\n+than once spent the winter. He hated to be separated from the picture\r\n+that was such a part of his life, and was also afraid that during his\r\n+absence some one might gain access to the room, in spite of the\r\n+elaborate bars that he had caused to be placed upon the door.\r\n+\r\n+He was quite conscious that this would tell them nothing. It was true\r\n+that the portrait still preserved, under all the foulness and ugliness\r\n+of the face, its marked likeness to himself; but what could they learn\r\n+from that? He would laugh at any one who tried to taunt him. He had\r\n+not painted it. What was it to him how vile and full of shame it\r\n+looked? Even if he told them, would they believe it?\r\n+\r\n+Yet he was afraid. Sometimes when he was down at his great house in\r\n+Nottinghamshire, entertaining the fashionable young men of his own rank\r\n+who were his chief companions, and astounding the county by the wanton\r\n+luxury and gorgeous splendour of his mode of life, he would suddenly\r\n+leave his guests and rush back to town to see that the door had not\r\n+been tampered with and that the picture was still there. What if it\r\n+should be stolen? The mere thought made him cold with horror. Surely\r\n+the world would know his secret then. Perhaps the world already\r\n+suspected it.\r\n+\r\n+For, while he fascinated many, there were not a few who distrusted him.\r\n+He was very nearly blackballed at a West End club of which his birth\r\n+and social position fully entitled him to become a member, and it was\r\n+said that on one occasion, when he was brought by a friend into the\r\n+smoking-room of the Churchill, the Duke of Berwick and another\r\n+gentleman got up in a marked manner and went out. Curious stories\r\n+became current about him after he had passed his twenty-fifth year. It\r\n+was rumoured that he had been seen brawling with foreign sailors in a\r\n+low den in the distant parts of Whitechapel, and that he consorted with\r\n+thieves and coiners and knew the mysteries of their trade. His\r\n+extraordinary absences became notorious, and, when he used to reappear\r\n+again in society, men would whisper to each other in corners, or pass\r\n+him with a sneer, or look at him with cold searching eyes, as though\r\n+they were determined to discover his secret.\r\n+\r\n+Of such insolences and attempted slights he, of course, took no notice,\r\n+and in the opinion of most people his frank debonair manner, his\r\n+charming boyish smile, and the infinite grace of that wonderful youth\r\n+that seemed never to leave him, were in themselves a sufficient answer\r\n+to the calumnies, for so they termed them, that were circulated about\r\n+him. It was remarked, however, that some of those who had been most\r\n+intimate with him appeared, after a time, to shun him. Women who had\r\n+wildly adored him, and for his sake had braved all social censure and\r\n+set convention at defiance, were seen to grow pallid with shame or\r\n+horror if Dorian Gray entered the room.\r\n+\r\n+Yet these whispered scandals only increased in the eyes of many his\r\n+strange and dangerous charm. His great wealth was a certain element of\r\n+security. Society--civilized society, at least--is never very ready to\r\n+believe anything to the detriment of those who are both rich and\r\n+fascinating. It feels instinctively that manners are of more\r\n+importance than morals, and, in its opinion, the highest respectability\r\n+is of much less value than the possession of a good _chef_. And, after\r\n+all, it is a very poor consolation to be told that the man who has\r\n+given one a bad dinner, or poor wine, is irreproachable in his private\r\n+life. Even the cardinal virtues cannot atone for half-cold _entrees_, as\r\n+Lord Henry remarked once, in a discussion on the subject, and there is\r\n+possibly a good deal to be said for his view. For the canons of good\r\n+society are, or should be, the same as the canons of art. Form is\r\n+absolutely essential to it. It should have the dignity of a ceremony,\r\n+as well as its unreality, and should combine the insincere character of\r\n+a romantic play with the wit and beauty that make such plays delightful\r\n+to us. Is insincerity such a terrible thing? I think not. It is\r\n+merely a method by which we can multiply our personalities.\r\n+\r\n+Such, at any rate, was Dorian Gray's opinion. He used to wonder at the\r\n+shallow psychology of those who conceive the ego in man as a thing\r\n+simple, permanent, reliable, and of one essence. To him, man was a\r\n+being with myriad lives and myriad sensations, a complex multiform\r\n+creature that bore within itself strange legacies of thought and\r\n+passion, and whose very flesh was tainted with the monstrous maladies\r\n+of the dead. He loved to stroll through the gaunt cold picture-gallery\r\n+of his country house and look at the various portraits of those whose\r\n+blood flowed in his veins. Here was Philip Herbert, described by\r\n+Francis Osborne, in his Memoires on the Reigns of Queen Elizabeth and\r\n+King James, as one who was \u0022caressed by the Court for his handsome\r\n+face, which kept him not long company.\u0022 Was it young Herbert's life\r\n+that he sometimes led? Had some strange poisonous germ crept from body\r\n+to body till it had reached his own? Was it some dim sense of that\r\n+ruined grace that had made him so suddenly, and almost without cause,\r\n+give utterance, in Basil Hallward's studio, to the mad prayer that had\r\n+so changed his life? Here, in gold-embroidered red doublet, jewelled\r\n+surcoat, and gilt-edged ruff and wristbands, stood Sir Anthony Sherard,\r\n+with his silver-and-black armour piled at his feet. What had this\r\n+man's legacy been? Had the lover of Giovanna of Naples bequeathed him\r\n+some inheritance of sin and shame? Were his own actions merely the\r\n+dreams that the dead man had not dared to realize? Here, from the\r\n+fading canvas, smiled Lady Elizabeth Devereux, in her gauze hood, pearl\r\n+stomacher, and pink slashed sleeves. A flower was in her right hand,\r\n+and her left clasped an enamelled collar of white and damask roses. On\r\n+a table by her side lay a mandolin and an apple. There were large\r\n+green rosettes upon her little pointed shoes. He knew her life, and\r\n+the strange stories that were told about her lovers. Had he something\r\n+of her temperament in him? These oval, heavy-lidded eyes seemed to\r\n+look curiously at him. What of George Willoughby, with his powdered\r\n+hair and fantastic patches? How evil he looked! The face was\r\n+saturnine and swarthy, and the sensual lips seemed to be twisted with\r\n+disdain. Delicate lace ruffles fell over the lean yellow hands that\r\n+were so overladen with rings. He had been a macaroni of the eighteenth\r\n+century, and the friend, in his youth, of Lord Ferrars. What of the\r\n+second Lord Beckenham, the companion of the Prince Regent in his\r\n+wildest days, and one of the witnesses at the secret marriage with Mrs.\r\n+Fitzherbert? How proud and handsome he was, with his chestnut curls\r\n+and insolent pose! What passions had he bequeathed? The world had\r\n+looked upon him as infamous. He had led the orgies at Carlton House.\r\n+The star of the Garter glittered upon his breast. Beside him hung the\r\n+portrait of his wife, a pallid, thin-lipped woman in black. Her blood,\r\n+also, stirred within him. How curious it all seemed! And his mother\r\n+with her Lady Hamilton face and her moist, wine-dashed lips--he knew\r\n+what he had got from her. He had got from her his beauty, and his\r\n+passion for the beauty of others. She laughed at him in her loose\r\n+Bacchante dress. There were vine leaves in her hair. The purple\r\n+spilled from the cup she was holding. The carnations of the painting\r\n+had withered, but the eyes were still wonderful in their depth and\r\n+brilliancy of colour. They seemed to follow him wherever he went.\r\n+\r\n+Yet one had ancestors in literature as well as in one's own race,\r\n+nearer perhaps in type and temperament, many of them, and certainly\r\n+with an influence of which one was more absolutely conscious. There\r\n+were times when it appeared to Dorian Gray that the whole of history\r\n+was merely the record of his own life, not as he had lived it in act\r\n+and circumstance, but as his imagination had created it for him, as it\r\n+had been in his brain and in his passions. He felt that he had known\r\n+them all, those strange terrible figures that had passed across the\r\n+stage of the world and made sin so marvellous and evil so full of\r\n+subtlety. It seemed to him that in some mysterious way their lives had\r\n+been his own.\r\n+\r\n+The hero of the wonderful novel that had so influenced his life had\r\n+himself known this curious fancy. In the seventh chapter he tells how,\r\n+crowned with laurel, lest lightning might strike him, he had sat, as\r\n+Tiberius, in a garden at Capri, reading the shameful books of\r\n+Elephantis, while dwarfs and peacocks strutted round him and the\r\n+flute-player mocked the swinger of the censer; and, as Caligula, had\r\n+caroused with the green-shirted jockeys in their stables and supped in\r\n+an ivory manger with a jewel-frontleted horse; and, as Domitian, had\r\n+wandered through a corridor lined with marble mirrors, looking round\r\n+with haggard eyes for the reflection of the dagger that was to end his\r\n+days, and sick with that ennui, that terrible _taedium vitae_, that comes\r\n+on those to whom life denies nothing; and had peered through a clear\r\n+emerald at the red shambles of the circus and then, in a litter of\r\n+pearl and purple drawn by silver-shod mules, been carried through the\r\n+Street of Pomegranates to a House of Gold and heard men cry on Nero\r\n+Caesar as he passed by; and, as Elagabalus, had painted his face with\r\n+colours, and plied the distaff among the women, and brought the Moon\r\n+from Carthage and given her in mystic marriage to the Sun.\r\n+\r\n+Over and over again Dorian used to read this fantastic chapter, and the\r\n+two chapters immediately following, in which, as in some curious\r\n+tapestries or cunningly wrought enamels, were pictured the awful and\r\n+beautiful forms of those whom vice and blood and weariness had made\r\n+monstrous or mad: Filippo, Duke of Milan, who slew his wife and\r\n+painted her lips with a scarlet poison that her lover might suck death\r\n+from the dead thing he fondled; Pietro Barbi, the Venetian, known as\r\n+Paul the Second, who sought in his vanity to assume the title of\r\n+Formosus, and whose tiara, valued at two hundred thousand florins, was\r\n+bought at the price of a terrible sin; Gian Maria Visconti, who used\r\n+hounds to chase living men and whose murdered body was covered with\r\n+roses by a harlot who had loved him; the Borgia on his white horse,\r\n+with Fratricide riding beside him and his mantle stained with the blood\r\n+of Perotto; Pietro Riario, the young Cardinal Archbishop of Florence,\r\n+child and minion of Sixtus IV, whose beauty was equalled only by his\r\n+debauchery, and who received Leonora of Aragon in a pavilion of white\r\n+and crimson silk, filled with nymphs and centaurs, and gilded a boy\r\n+that he might serve at the feast as Ganymede or Hylas; Ezzelin, whose\r\n+melancholy could be cured only by the spectacle of death, and who had a\r\n+passion for red blood, as other men have for red wine--the son of the\r\n+Fiend, as was reported, and one who had cheated his father at dice when\r\n+gambling with him for his own soul; Giambattista Cibo, who in mockery\r\n+took the name of Innocent and into whose torpid veins the blood of\r\n+three lads was infused by a Jewish doctor; Sigismondo Malatesta, the\r\n+lover of Isotta and the lord of Rimini, whose effigy was burned at Rome\r\n+as the enemy of God and man, who strangled Polyssena with a napkin, and\r\n+gave poison to Ginevra d'Este in a cup of emerald, and in honour of a\r\n+shameful passion built a pagan church for Christian worship; Charles\r\n+VI, who had so wildly adored his brother's wife that a leper had warned\r\n+him of the insanity that was coming on him, and who, when his brain had\r\n+sickened and grown strange, could only be soothed by Saracen cards\r\n+painted with the images of love and death and madness; and, in his\r\n+trimmed jerkin and jewelled cap and acanthuslike curls, Grifonetto\r\n+Baglioni, who slew Astorre with his bride, and Simonetto with his page,\r\n+and whose comeliness was such that, as he lay dying in the yellow\r\n+piazza of Perugia, those who had hated him could not choose but weep,\r\n+and Atalanta, who had cursed him, blessed him.\r\n+\r\n+There was a horrible fascination in them all. He saw them at night,\r\n+and they troubled his imagination in the day. The Renaissance knew of\r\n+strange manners of poisoning--poisoning by a helmet and a lighted\r\n+torch, by an embroidered glove and a jewelled fan, by a gilded pomander\r\n+and by an amber chain. Dorian Gray had been poisoned by a book. There\r\n+were moments when he looked on evil simply as a mode through which he\r\n+could realize his conception of the beautiful.\r\n+\r\n+\r\n+\r\n+CHAPTER 12\r\n+\r\n+It was on the ninth of November, the eve of his own thirty-eighth\r\n+birthday, as he often remembered afterwards.\r\n+\r\n+He was walking home about eleven o'clock from Lord Henry's, where he\r\n+had been dining, and was wrapped in heavy furs, as the night was cold\r\n+and foggy. At the corner of Grosvenor Square and South Audley Street,\r\n+a man passed him in the mist, walking very fast and with the collar of\r\n+his grey ulster turned up. He had a bag in his hand. Dorian\r\n+recognized him. It was Basil Hallward. A strange sense of fear, for\r\n+which he could not account, came over him. He made no sign of\r\n+recognition and went on quickly in the direction of his own house.\r\n+\r\n+But Hallward had seen him. Dorian heard him first stopping on the\r\n+pavement and then hurrying after him. In a few moments, his hand was\r\n+on his arm.\r\n+\r\n+\u0022Dorian! What an extraordinary piece of luck! I have been waiting for\r\n+you in your library ever since nine o'clock. Finally I took pity on\r\n+your tired servant and told him to go to bed, as he let me out. I am\r\n+off to Paris by the midnight train, and I particularly wanted to see\r\n+you before I left. I thought it was you, or rather your fur coat, as\r\n+you passed me. But I wasn't quite sure. Didn't you recognize me?\u0022\r\n+\r\n+\u0022In this fog, my dear Basil? Why, I can't even recognize Grosvenor\r\n+Square. I believe my house is somewhere about here, but I don't feel\r\n+at all certain about it. I am sorry you are going away, as I have not\r\n+seen you for ages. But I suppose you will be back soon?\u0022\r\n+\r\n+\u0022No: I am going to be out of England for six months. I intend to take\r\n+a studio in Paris and shut myself up till I have finished a great\r\n+picture I have in my head. However, it wasn't about myself I wanted to\r\n+talk. Here we are at your door. Let me come in for a moment. I have\r\n+something to say to you.\u0022\r\n+\r\n+\u0022I shall be charmed. But won't you miss your train?\u0022 said Dorian Gray\r\n+languidly as he passed up the steps and opened the door with his\r\n+latch-key.\r\n+\r\n+The lamplight struggled out through the fog, and Hallward looked at his\r\n+watch. \u0022I have heaps of time,\u0022 he answered. \u0022The train doesn't go\r\n+till twelve-fifteen, and it is only just eleven. In fact, I was on my\r\n+way to the club to look for you, when I met you. You see, I shan't\r\n+have any delay about luggage, as I have sent on my heavy things. All I\r\n+have with me is in this bag, and I can easily get to Victoria in twenty\r\n+minutes.\u0022\r\n+\r\n+Dorian looked at him and smiled. \u0022What a way for a fashionable painter\r\n+to travel! A Gladstone bag and an ulster! Come in, or the fog will\r\n+get into the house. And mind you don't talk about anything serious.\r\n+Nothing is serious nowadays. At least nothing should be.\u0022\r\n+\r\n+Hallward shook his head, as he entered, and followed Dorian into the\r\n+library. There was a bright wood fire blazing in the large open\r\n+hearth. The lamps were lit, and an open Dutch silver spirit-case\r\n+stood, with some siphons of soda-water and large cut-glass tumblers, on\r\n+a little marqueterie table.\r\n+\r\n+\u0022You see your servant made me quite at home, Dorian. He gave me\r\n+everything I wanted, including your best gold-tipped cigarettes. He is\r\n+a most hospitable creature. I like him much better than the Frenchman\r\n+you used to have. What has become of the Frenchman, by the bye?\u0022\r\n+\r\n+Dorian shrugged his shoulders. \u0022I believe he married Lady Radley's\r\n+maid, and has established her in Paris as an English dressmaker.\r\n+Anglomania is very fashionable over there now, I hear. It seems silly\r\n+of the French, doesn't it? But--do you know?--he was not at all a bad\r\n+servant. I never liked him, but I had nothing to complain about. One\r\n+often imagines things that are quite absurd. He was really very\r\n+devoted to me and seemed quite sorry when he went away. Have another\r\n+brandy-and-soda? Or would you like hock-and-seltzer? I always take\r\n+hock-and-seltzer myself. There is sure to be some in the next room.\u0022\r\n+\r\n+\u0022Thanks, I won't have anything more,\u0022 said the painter, taking his cap\r\n+and coat off and throwing them on the bag that he had placed in the\r\n+corner. \u0022And now, my dear fellow, I want to speak to you seriously.\r\n+Don't frown like that. You make it so much more difficult for me.\u0022\r\n+\r\n+\u0022What is it all about?\u0022 cried Dorian in his petulant way, flinging\r\n+himself down on the sofa. \u0022I hope it is not about myself. I am tired\r\n+of myself to-night. I should like to be somebody else.\u0022\r\n+\r\n+\u0022It is about yourself,\u0022 answered Hallward in his grave deep voice, \u0022and\r\n+I must say it to you. I shall only keep you half an hour.\u0022\r\n+\r\n+Dorian sighed and lit a cigarette. \u0022Half an hour!\u0022 he murmured.\r\n+\r\n+\u0022It is not much to ask of you, Dorian, and it is entirely for your own\r\n+sake that I am speaking. I think it right that you should know that\r\n+the most dreadful things are being said against you in London.\u0022\r\n+\r\n+\u0022I don't wish to know anything about them. I love scandals about other\r\n+people, but scandals about myself don't interest me. They have not got\r\n+the charm of novelty.\u0022\r\n+\r\n+\u0022They must interest you, Dorian. Every gentleman is interested in his\r\n+good name. You don't want people to talk of you as something vile and\r\n+degraded. Of course, you have your position, and your wealth, and all\r\n+that kind of thing. But position and wealth are not everything. Mind\r\n+you, I don't believe these rumours at all. At least, I can't believe\r\n+them when I see you. Sin is a thing that writes itself across a man's\r\n+face. It cannot be concealed. People talk sometimes of secret vices.\r\n+There are no such things. If a wretched man has a vice, it shows\r\n+itself in the lines of his mouth, the droop of his eyelids, the\r\n+moulding of his hands even. Somebody--I won't mention his name, but\r\n+you know him--came to me last year to have his portrait done. I had\r\n+never seen him before, and had never heard anything about him at the\r\n+time, though I have heard a good deal since. He offered an extravagant\r\n+price. I refused him. There was something in the shape of his fingers\r\n+that I hated. I know now that I was quite right in what I fancied\r\n+about him. His life is dreadful. But you, Dorian, with your pure,\r\n+bright, innocent face, and your marvellous untroubled youth--I can't\r\n+believe anything against you. And yet I see you very seldom, and you\r\n+never come down to the studio now, and when I am away from you, and I\r\n+hear all these hideous things that people are whispering about you, I\r\n+don't know what to say. Why is it, Dorian, that a man like the Duke of\r\n+Berwick leaves the room of a club when you enter it? Why is it that so\r\n+many gentlemen in London will neither go to your house or invite you to\r\n+theirs? You used to be a friend of Lord Staveley. I met him at dinner\r\n+last week. Your name happened to come up in conversation, in\r\n+connection with the miniatures you have lent to the exhibition at the\r\n+Dudley. Staveley curled his lip and said that you might have the most\r\n+artistic tastes, but that you were a man whom no pure-minded girl\r\n+should be allowed to know, and whom no chaste woman should sit in the\r\n+same room with. I reminded him that I was a friend of yours, and asked\r\n+him what he meant. He told me. He told me right out before everybody.\r\n+It was horrible! Why is your friendship so fatal to young men? There\r\n+was that wretched boy in the Guards who committed suicide. You were\r\n+his great friend. There was Sir Henry Ashton, who had to leave England\r\n+with a tarnished name. You and he were inseparable. What about Adrian\r\n+Singleton and his dreadful end? What about Lord Kent's only son and\r\n+his career? I met his father yesterday in St. James's Street. He\r\n+seemed broken with shame and sorrow. What about the young Duke of\r\n+Perth? What sort of life has he got now? What gentleman would\r\n+associate with him?\u0022\r\n+\r\n+\u0022Stop, Basil. You are talking about things of which you know nothing,\u0022\r\n+said Dorian Gray, biting his lip, and with a note of infinite contempt\r\n+in his voice. \u0022You ask me why Berwick leaves a room when I enter it.\r\n+It is because I know everything about his life, not because he knows\r\n+anything about mine. With such blood as he has in his veins, how could\r\n+his record be clean? You ask me about Henry Ashton and young Perth.\r\n+Did I teach the one his vices, and the other his debauchery? If Kent's\r\n+silly son takes his wife from the streets, what is that to me? If\r\n+Adrian Singleton writes his friend's name across a bill, am I his\r\n+keeper? I know how people chatter in England. The middle classes air\r\n+their moral prejudices over their gross dinner-tables, and whisper\r\n+about what they call the profligacies of their betters in order to try\r\n+and pretend that they are in smart society and on intimate terms with\r\n+the people they slander. In this country, it is enough for a man to\r\n+have distinction and brains for every common tongue to wag against him.\r\n+And what sort of lives do these people, who pose as being moral, lead\r\n+themselves? My dear fellow, you forget that we are in the native land\r\n+of the hypocrite.\u0022\r\n+\r\n+\u0022Dorian,\u0022 cried Hallward, \u0022that is not the question. England is bad\r\n+enough I know, and English society is all wrong. That is the reason\r\n+why I want you to be fine. You have not been fine. One has a right to\r\n+judge of a man by the effect he has over his friends. Yours seem to\r\n+lose all sense of honour, of goodness, of purity. You have filled them\r\n+with a madness for pleasure. They have gone down into the depths. You\r\n+led them there. Yes: you led them there, and yet you can smile, as\r\n+you are smiling now. And there is worse behind. I know you and Harry\r\n+are inseparable. Surely for that reason, if for none other, you should\r\n+not have made his sister's name a by-word.\u0022\r\n+\r\n+\u0022Take care, Basil. You go too far.\u0022\r\n+\r\n+\u0022I must speak, and you must listen. You shall listen. When you met\r\n+Lady Gwendolen, not a breath of scandal had ever touched her. Is there\r\n+a single decent woman in London now who would drive with her in the\r\n+park? Why, even her children are not allowed to live with her. Then\r\n+there are other stories--stories that you have been seen creeping at\r\n+dawn out of dreadful houses and slinking in disguise into the foulest\r\n+dens in London. Are they true? Can they be true? When I first heard\r\n+them, I laughed. I hear them now, and they make me shudder. What\r\n+about your country-house and the life that is led there? Dorian, you\r\n+don't know what is said about you. I won't tell you that I don't want\r\n+to preach to you. I remember Harry saying once that every man who\r\n+turned himself into an amateur curate for the moment always began by\r\n+saying that, and then proceeded to break his word. I do want to preach\r\n+to you. I want you to lead such a life as will make the world respect\r\n+you. I want you to have a clean name and a fair record. I want you to\r\n+get rid of the dreadful people you associate with. Don't shrug your\r\n+shoulders like that. Don't be so indifferent. You have a wonderful\r\n+influence. Let it be for good, not for evil. They say that you\r\n+corrupt every one with whom you become intimate, and that it is quite\r\n+sufficient for you to enter a house for shame of some kind to follow\r\n+after. I don't know whether it is so or not. How should I know? But\r\n+it is said of you. I am told things that it seems impossible to doubt.\r\n+Lord Gloucester was one of my greatest friends at Oxford. He showed me\r\n+a letter that his wife had written to him when she was dying alone in\r\n+her villa at Mentone. Your name was implicated in the most terrible\r\n+confession I ever read. I told him that it was absurd--that I knew you\r\n+thoroughly and that you were incapable of anything of the kind. Know\r\n+you? I wonder do I know you? Before I could answer that, I should\r\n+have to see your soul.\u0022\r\n+\r\n+\u0022To see my soul!\u0022 muttered Dorian Gray, starting up from the sofa and\r\n+turning almost white from fear.\r\n+\r\n+\u0022Yes,\u0022 answered Hallward gravely, and with deep-toned sorrow in his\r\n+voice, \u0022to see your soul. But only God can do that.\u0022\r\n+\r\n+A bitter laugh of mockery broke from the lips of the younger man. \u0022You\r\n+shall see it yourself, to-night!\u0022 he cried, seizing a lamp from the\r\n+table. \u0022Come: it is your own handiwork. Why shouldn't you look at\r\n+it? You can tell the world all about it afterwards, if you choose.\r\n+Nobody would believe you. If they did believe you, they would like me\r\n+all the better for it. I know the age better than you do, though you\r\n+will prate about it so tediously. Come, I tell you. You have\r\n+chattered enough about corruption. Now you shall look on it face to\r\n+face.\u0022\r\n+\r\n+There was the madness of pride in every word he uttered. He stamped\r\n+his foot upon the ground in his boyish insolent manner. He felt a\r\n+terrible joy at the thought that some one else was to share his secret,\r\n+and that the man who had painted the portrait that was the origin of\r\n+all his shame was to be burdened for the rest of his life with the\r\n+hideous memory of what he had done.\r\n+\r\n+\u0022Yes,\u0022 he continued, coming closer to him and looking steadfastly into\r\n+his stern eyes, \u0022I shall show you my soul. You shall see the thing\r\n+that you fancy only God can see.\u0022\r\n+\r\n+Hallward started back. \u0022This is blasphemy, Dorian!\u0022 he cried. \u0022You\r\n+must not say things like that. They are horrible, and they don't mean\r\n+anything.\u0022\r\n+\r\n+\u0022You think so?\u0022 He laughed again.\r\n+\r\n+\u0022I know so. As for what I said to you to-night, I said it for your\r\n+good. You know I have been always a stanch friend to you.\u0022\r\n+\r\n+\u0022Don't touch me. Finish what you have to say.\u0022\r\n+\r\n+A twisted flash of pain shot across the painter's face. He paused for\r\n+a moment, and a wild feeling of pity came over him. After all, what\r\n+right had he to pry into the life of Dorian Gray? If he had done a\r\n+tithe of what was rumoured about him, how much he must have suffered!\r\n+Then he straightened himself up, and walked over to the fire-place, and\r\n+stood there, looking at the burning logs with their frostlike ashes and\r\n+their throbbing cores of flame.\r\n+\r\n+\u0022I am waiting, Basil,\u0022 said the young man in a hard clear voice.\r\n+\r\n+He turned round. \u0022What I have to say is this,\u0022 he cried. \u0022You must\r\n+give me some answer to these horrible charges that are made against\r\n+you. If you tell me that they are absolutely untrue from beginning to\r\n+end, I shall believe you. Deny them, Dorian, deny them! Can't you see\r\n+what I am going through? My God! don't tell me that you are bad, and\r\n+corrupt, and shameful.\u0022\r\n+\r\n+Dorian Gray smiled. There was a curl of contempt in his lips. \u0022Come\r\n+upstairs, Basil,\u0022 he said quietly. \u0022I keep a diary of my life from day\r\n+to day, and it never leaves the room in which it is written. I shall\r\n+show it to you if you come with me.\u0022\r\n+\r\n+\u0022I shall come with you, Dorian, if you wish it. I see I have missed my\r\n+train. That makes no matter. I can go to-morrow. But don't ask me to\r\n+read anything to-night. All I want is a plain answer to my question.\u0022\r\n+\r\n+\u0022That shall be given to you upstairs. I could not give it here. You\r\n+will not have to read long.\u0022\r\n+\r\n+\r\n+\r\n+CHAPTER 13\r\n+\r\n+He passed out of the room and began the ascent, Basil Hallward\r\n+following close behind. They walked softly, as men do instinctively at\r\n+night. The lamp cast fantastic shadows on the wall and staircase. A\r\n+rising wind made some of the windows rattle.\r\n+\r\n+When they reached the top landing, Dorian set the lamp down on the\r\n+floor, and taking out the key, turned it in the lock. \u0022You insist on\r\n+knowing, Basil?\u0022 he asked in a low voice.\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022I am delighted,\u0022 he answered, smiling. Then he added, somewhat\r\n+harshly, \u0022You are the one man in the world who is entitled to know\r\n+everything about me. You have had more to do with my life than you\r\n+think\u0022; and, taking up the lamp, he opened the door and went in. A\r\n+cold current of air passed them, and the light shot up for a moment in\r\n+a flame of murky orange. He shuddered. \u0022Shut the door behind you,\u0022 he\r\n+whispered, as he placed the lamp on the table.\r\n+\r\n+Hallward glanced round him with a puzzled expression. The room looked\r\n+as if it had not been lived in for years. A faded Flemish tapestry, a\r\n+curtained picture, an old Italian _cassone_, and an almost empty\r\n+book-case--that was all that it seemed to contain, besides a chair and\r\n+a table. As Dorian Gray was lighting a half-burned candle that was\r\n+standing on the mantelshelf, he saw that the whole place was covered\r\n+with dust and that the carpet was in holes. A mouse ran scuffling\r\n+behind the wainscoting. There was a damp odour of mildew.\r\n+\r\n+\u0022So you think that it is only God who sees the soul, Basil? Draw that\r\n+curtain back, and you will see mine.\u0022\r\n+\r\n+The voice that spoke was cold and cruel. \u0022You are mad, Dorian, or\r\n+playing a part,\u0022 muttered Hallward, frowning.\r\n+\r\n+\u0022You won't? Then I must do it myself,\u0022 said the young man, and he tore\r\n+the curtain from its rod and flung it on the ground.\r\n+\r\n+An exclamation of horror broke from the painter's lips as he saw in the\r\n+dim light the hideous face on the canvas grinning at him. There was\r\n+something in its expression that filled him with disgust and loathing.\r\n+Good heavens! it was Dorian Gray's own face that he was looking at!\r\n+The horror, whatever it was, had not yet entirely spoiled that\r\n+marvellous beauty. There was still some gold in the thinning hair and\r\n+some scarlet on the sensual mouth. The sodden eyes had kept something\r\n+of the loveliness of their blue, the noble curves had not yet\r\n+completely passed away from chiselled nostrils and from plastic throat.\r\n+Yes, it was Dorian himself. But who had done it? He seemed to\r\n+recognize his own brushwork, and the frame was his own design. The\r\n+idea was monstrous, yet he felt afraid. He seized the lighted candle,\r\n+and held it to the picture. In the left-hand corner was his own name,\r\n+traced in long letters of bright vermilion.\r\n+\r\n+It was some foul parody, some infamous ignoble satire. He had never\r\n+done that. Still, it was his own picture. He knew it, and he felt as\r\n+if his blood had changed in a moment from fire to sluggish ice. His\r\n+own picture! What did it mean? Why had it altered? He turned and\r\n+looked at Dorian Gray with the eyes of a sick man. His mouth twitched,\r\n+and his parched tongue seemed unable to articulate. He passed his hand\r\n+across his forehead. It was dank with clammy sweat.\r\n+\r\n+The young man was leaning against the mantelshelf, watching him with\r\n+that strange expression that one sees on the faces of those who are\r\n+absorbed in a play when some great artist is acting. There was neither\r\n+real sorrow in it nor real joy. There was simply the passion of the\r\n+spectator, with perhaps a flicker of triumph in his eyes. He had taken\r\n+the flower out of his coat, and was smelling it, or pretending to do so.\r\n+\r\n+\u0022What does this mean?\u0022 cried Hallward, at last. His own voice sounded\r\n+shrill and curious in his ears.\r\n+\r\n+\u0022Years ago, when I was a boy,\u0022 said Dorian Gray, crushing the flower in\r\n+his hand, \u0022you met me, flattered me, and taught me to be vain of my\r\n+good looks. One day you introduced me to a friend of yours, who\r\n+explained to me the wonder of youth, and you finished a portrait of me\r\n+that revealed to me the wonder of beauty. In a mad moment that, even\r\n+now, I don't know whether I regret or not, I made a wish, perhaps you\r\n+would call it a prayer....\u0022\r\n+\r\n+\u0022I remember it! Oh, how well I remember it! No! the thing is\r\n+impossible. The room is damp. Mildew has got into the canvas. The\r\n+paints I used had some wretched mineral poison in them. I tell you the\r\n+thing is impossible.\u0022\r\n+\r\n+\u0022Ah, what is impossible?\u0022 murmured the young man, going over to the\r\n+window and leaning his forehead against the cold, mist-stained glass.\r\n+\r\n+\u0022You told me you had destroyed it.\u0022\r\n+\r\n+\u0022I was wrong. It has destroyed me.\u0022\r\n+\r\n+\u0022I don't believe it is my picture.\u0022\r\n+\r\n+\u0022Can't you see your ideal in it?\u0022 said Dorian bitterly.\r\n+\r\n+\u0022My ideal, as you call it...\u0022\r\n+\r\n+\u0022As you called it.\u0022\r\n+\r\n+\u0022There was nothing evil in it, nothing shameful. You were to me such\r\n+an ideal as I shall never meet again. This is the face of a satyr.\u0022\r\n+\r\n+\u0022It is the face of my soul.\u0022\r\n+\r\n+\u0022Christ! what a thing I must have worshipped! It has the eyes of a\r\n+devil.\u0022\r\n+\r\n+\u0022Each of us has heaven and hell in him, Basil,\u0022 cried Dorian with a\r\n+wild gesture of despair.\r\n+\r\n+Hallward turned again to the portrait and gazed at it. \u0022My God! If it\r\n+is true,\u0022 he exclaimed, \u0022and this is what you have done with your life,\r\n+why, you must be worse even than those who talk against you fancy you\r\n+to be!\u0022 He held the light up again to the canvas and examined it. The\r\n+surface seemed to be quite undisturbed and as he had left it. It was\r\n+from within, apparently, that the foulness and horror had come.\r\n+Through some strange quickening of inner life the leprosies of sin were\r\n+slowly eating the thing away. The rotting of a corpse in a watery\r\n+grave was not so fearful.\r\n+\r\n+His hand shook, and the candle fell from its socket on the floor and\r\n+lay there sputtering. He placed his foot on it and put it out. Then\r\n+he flung himself into the rickety chair that was standing by the table\r\n+and buried his face in his hands.\r\n+\r\n+\u0022Good God, Dorian, what a lesson! What an awful lesson!\u0022 There was no\r\n+answer, but he could hear the young man sobbing at the window. \u0022Pray,\r\n+Dorian, pray,\u0022 he murmured. \u0022What is it that one was taught to say in\r\n+one's boyhood? 'Lead us not into temptation. Forgive us our sins.\r\n+Wash away our iniquities.' Let us say that together. The prayer of\r\n+your pride has been answered. The prayer of your repentance will be\r\n+answered also. I worshipped you too much. I am punished for it. You\r\n+worshipped yourself too much. We are both punished.\u0022\r\n+\r\n+Dorian Gray turned slowly around and looked at him with tear-dimmed\r\n+eyes. \u0022It is too late, Basil,\u0022 he faltered.\r\n+\r\n+\u0022It is never too late, Dorian. Let us kneel down and try if we cannot\r\n+remember a prayer. Isn't there a verse somewhere, 'Though your sins be\r\n+as scarlet, yet I will make them as white as snow'?\u0022\r\n+\r\n+\u0022Those words mean nothing to me now.\u0022\r\n+\r\n+\u0022Hush! Don't say that. You have done enough evil in your life. My\r\n+God! Don't you see that accursed thing leering at us?\u0022\r\n+\r\n+Dorian Gray glanced at the picture, and suddenly an uncontrollable\r\n+feeling of hatred for Basil Hallward came over him, as though it had\r\n+been suggested to him by the image on the canvas, whispered into his\r\n+ear by those grinning lips. The mad passions of a hunted animal\r\n+stirred within him, and he loathed the man who was seated at the table,\r\n+more than in his whole life he had ever loathed anything. He glanced\r\n+wildly around. Something glimmered on the top of the painted chest\r\n+that faced him. His eye fell on it. He knew what it was. It was a\r\n+knife that he had brought up, some days before, to cut a piece of cord,\r\n+and had forgotten to take away with him. He moved slowly towards it,\r\n+passing Hallward as he did so. As soon as he got behind him, he seized\r\n+it and turned round. Hallward stirred in his chair as if he was going\r\n+to rise. He rushed at him and dug the knife into the great vein that\r\n+is behind the ear, crushing the man's head down on the table and\r\n+stabbing again and again.\r\n+\r\n+There was a stifled groan and the horrible sound of some one choking\r\n+with blood. Three times the outstretched arms shot up convulsively,\r\n+waving grotesque, stiff-fingered hands in the air. He stabbed him\r\n+twice more, but the man did not move. Something began to trickle on\r\n+the floor. He waited for a moment, still pressing the head down. Then\r\n+he threw the knife on the table, and listened.\r\n+\r\n+He could hear nothing, but the drip, drip on the threadbare carpet. He\r\n+opened the door and went out on the landing. The house was absolutely\r\n+quiet. No one was about. For a few seconds he stood bending over the\r\n+balustrade and peering down into the black seething well of darkness.\r\n+Then he took out the key and returned to the room, locking himself in\r\n+as he did so.\r\n+\r\n+The thing was still seated in the chair, straining over the table with\r\n+bowed head, and humped back, and long fantastic arms. Had it not been\r\n+for the red jagged tear in the neck and the clotted black pool that was\r\n+slowly widening on the table, one would have said that the man was\r\n+simply asleep.\r\n+\r\n+How quickly it had all been done! He felt strangely calm, and walking\r\n+over to the window, opened it and stepped out on the balcony. The wind\r\n+had blown the fog away, and the sky was like a monstrous peacock's\r\n+tail, starred with myriads of golden eyes. He looked down and saw the\r\n+policeman going his rounds and flashing the long beam of his lantern on\r\n+the doors of the silent houses. The crimson spot of a prowling hansom\r\n+gleamed at the corner and then vanished. A woman in a fluttering shawl\r\n+was creeping slowly by the railings, staggering as she went. Now and\r\n+then she stopped and peered back. Once, she began to sing in a hoarse\r\n+voice. The policeman strolled over and said something to her. She\r\n+stumbled away, laughing. A bitter blast swept across the square. The\r\n+gas-lamps flickered and became blue, and the leafless trees shook their\r\n+black iron branches to and fro. He shivered and went back, closing the\r\n+window behind him.\r\n+\r\n+Having reached the door, he turned the key and opened it. He did not\r\n+even glance at the murdered man. He felt that the secret of the whole\r\n+thing was not to realize the situation. The friend who had painted the\r\n+fatal portrait to which all his misery had been due had gone out of his\r\n+life. That was enough.\r\n+\r\n+Then he remembered the lamp. It was a rather curious one of Moorish\r\n+workmanship, made of dull silver inlaid with arabesques of burnished\r\n+steel, and studded with coarse turquoises. Perhaps it might be missed\r\n+by his servant, and questions would be asked. He hesitated for a\r\n+moment, then he turned back and took it from the table. He could not\r\n+help seeing the dead thing. How still it was! How horribly white the\r\n+long hands looked! It was like a dreadful wax image.\r\n+\r\n+Having locked the door behind him, he crept quietly downstairs. The\r\n+woodwork creaked and seemed to cry out as if in pain. He stopped\r\n+several times and waited. No: everything was still. It was merely\r\n+the sound of his own footsteps.\r\n+\r\n+When he reached the library, he saw the bag and coat in the corner.\r\n+They must be hidden away somewhere. He unlocked a secret press that\r\n+was in the wainscoting, a press in which he kept his own curious\r\n+disguises, and put them into it. He could easily burn them afterwards.\r\n+Then he pulled out his watch. It was twenty minutes to two.\r\n+\r\n+He sat down and began to think. Every year--every month, almost--men\r\n+were strangled in England for what he had done. There had been a\r\n+madness of murder in the air. Some red star had come too close to the\r\n+earth.... And yet, what evidence was there against him? Basil Hallward\r\n+had left the house at eleven. No one had seen him come in again. Most\r\n+of the servants were at Selby Royal. His valet had gone to bed....\r\n+Paris! Yes. It was to Paris that Basil had gone, and by the midnight\r\n+train, as he had intended. With his curious reserved habits, it would\r\n+be months before any suspicions would be roused. Months! Everything\r\n+could be destroyed long before then.\r\n+\r\n+A sudden thought struck him. He put on his fur coat and hat and went\r\n+out into the hall. There he paused, hearing the slow heavy tread of\r\n+the policeman on the pavement outside and seeing the flash of the\r\n+bull's-eye reflected in the window. He waited and held his breath.\r\n+\r\n+After a few moments he drew back the latch and slipped out, shutting\r\n+the door very gently behind him. Then he began ringing the bell. In\r\n+about five minutes his valet appeared, half-dressed and looking very\r\n+drowsy.\r\n+\r\n+\u0022I am sorry to have had to wake you up, Francis,\u0022 he said, stepping in;\r\n+\u0022but I had forgotten my latch-key. What time is it?\u0022\r\n+\r\n+\u0022Ten minutes past two, sir,\u0022 answered the man, looking at the clock and\r\n+blinking.\r\n+\r\n+\u0022Ten minutes past two? How horribly late! You must wake me at nine\r\n+to-morrow. I have some work to do.\u0022\r\n+\r\n+\u0022All right, sir.\u0022\r\n+\r\n+\u0022Did any one call this evening?\u0022\r\n+\r\n+\u0022Mr. Hallward, sir. He stayed here till eleven, and then he went away\r\n+to catch his train.\u0022\r\n+\r\n+\u0022Oh! I am sorry I didn't see him. Did he leave any message?\u0022\r\n+\r\n+\u0022No, sir, except that he would write to you from Paris, if he did not\r\n+find you at the club.\u0022\r\n+\r\n+\u0022That will do, Francis. Don't forget to call me at nine to-morrow.\u0022\r\n+\r\n+\u0022No, sir.\u0022\r\n+\r\n+The man shambled down the passage in his slippers.\r\n+\r\n+Dorian Gray threw his hat and coat upon the table and passed into the\r\n+library. For a quarter of an hour he walked up and down the room,\r\n+biting his lip and thinking. Then he took down the Blue Book from one\r\n+of the shelves and began to turn over the leaves. \u0022Alan Campbell, 152,\r\n+Hertford Street, Mayfair.\u0022 Yes; that was the man he wanted.\r\n+\r\n+\r\n+\r\n+CHAPTER 14\r\n+\r\n+At nine o'clock the next morning his servant came in with a cup of\r\n+chocolate on a tray and opened the shutters. Dorian was sleeping quite\r\n+peacefully, lying on his right side, with one hand underneath his\r\n+cheek. He looked like a boy who had been tired out with play, or study.\r\n+\r\n+The man had to touch him twice on the shoulder before he woke, and as\r\n+he opened his eyes a faint smile passed across his lips, as though he\r\n+had been lost in some delightful dream. Yet he had not dreamed at all.\r\n+His night had been untroubled by any images of pleasure or of pain.\r\n+But youth smiles without any reason. It is one of its chiefest charms.\r\n+\r\n+He turned round, and leaning upon his elbow, began to sip his\r\n+chocolate. The mellow November sun came streaming into the room. The\r\n+sky was bright, and there was a genial warmth in the air. It was\r\n+almost like a morning in May.\r\n+\r\n+Gradually the events of the preceding night crept with silent,\r\n+blood-stained feet into his brain and reconstructed themselves there\r\n+with terrible distinctness. He winced at the memory of all that he had\r\n+suffered, and for a moment the same curious feeling of loathing for\r\n+Basil Hallward that had made him kill him as he sat in the chair came\r\n+back to him, and he grew cold with passion. The dead man was still\r\n+sitting there, too, and in the sunlight now. How horrible that was!\r\n+Such hideous things were for the darkness, not for the day.\r\n+\r\n+He felt that if he brooded on what he had gone through he would sicken\r\n+or grow mad. There were sins whose fascination was more in the memory\r\n+than in the doing of them, strange triumphs that gratified the pride\r\n+more than the passions, and gave to the intellect a quickened sense of\r\n+joy, greater than any joy they brought, or could ever bring, to the\r\n+senses. But this was not one of them. It was a thing to be driven out\r\n+of the mind, to be drugged with poppies, to be strangled lest it might\r\n+strangle one itself.\r\n+\r\n+When the half-hour struck, he passed his hand across his forehead, and\r\n+then got up hastily and dressed himself with even more than his usual\r\n+care, giving a good deal of attention to the choice of his necktie and\r\n+scarf-pin and changing his rings more than once. He spent a long time\r\n+also over breakfast, tasting the various dishes, talking to his valet\r\n+about some new liveries that he was thinking of getting made for the\r\n+servants at Selby, and going through his correspondence. At some of\r\n+the letters, he smiled. Three of them bored him. One he read several\r\n+times over and then tore up with a slight look of annoyance in his\r\n+face. \u0022That awful thing, a woman's memory!\u0022 as Lord Henry had once\r\n+said.\r\n+\r\n+After he had drunk his cup of black coffee, he wiped his lips slowly\r\n+with a napkin, motioned to his servant to wait, and going over to the\r\n+table, sat down and wrote two letters. One he put in his pocket, the\r\n+other he handed to the valet.\r\n+\r\n+\u0022Take this round to 152, Hertford Street, Francis, and if Mr. Campbell\r\n+is out of town, get his address.\u0022\r\n+\r\n+As soon as he was alone, he lit a cigarette and began sketching upon a\r\n+piece of paper, drawing first flowers and bits of architecture, and\r\n+then human faces. Suddenly he remarked that every face that he drew\r\n+seemed to have a fantastic likeness to Basil Hallward. He frowned, and\r\n+getting up, went over to the book-case and took out a volume at hazard.\r\n+He was determined that he would not think about what had happened until\r\n+it became absolutely necessary that he should do so.\r\n+\r\n+When he had stretched himself on the sofa, he looked at the title-page\r\n+of the book. It was Gautier's Emaux et Camees, Charpentier's\r\n+Japanese-paper edition, with the Jacquemart etching. The binding was\r\n+of citron-green leather, with a design of gilt trellis-work and dotted\r\n+pomegranates. It had been given to him by Adrian Singleton. As he\r\n+turned over the pages, his eye fell on the poem about the hand of\r\n+Lacenaire, the cold yellow hand \u0022_du supplice encore mal lavee_,\u0022 with\r\n+its downy red hairs and its \u0022_doigts de faune_.\u0022 He glanced at his own\r\n+white taper fingers, shuddering slightly in spite of himself, and\r\n+passed on, till he came to those lovely stanzas upon Venice:\r\n+\r\n+ Sur une gamme chromatique,\r\n+ Le sein de perles ruisselant,\r\n+ La Venus de l'Adriatique\r\n+ Sort de l'eau son corps rose et blanc.\r\n+\r\n+ Les domes, sur l'azur des ondes\r\n+ Suivant la phrase au pur contour,\r\n+ S'enflent comme des gorges rondes\r\n+ Que souleve un soupir d'amour.\r\n+\r\n+ L'esquif aborde et me depose,\r\n+ Jetant son amarre au pilier,\r\n+ Devant une facade rose,\r\n+ Sur le marbre d'un escalier.\r\n+\r\n+\r\n+How exquisite they were! As one read them, one seemed to be floating\r\n+down the green water-ways of the pink and pearl city, seated in a black\r\n+gondola with silver prow and trailing curtains. The mere lines looked\r\n+to him like those straight lines of turquoise-blue that follow one as\r\n+one pushes out to the Lido. The sudden flashes of colour reminded him\r\n+of the gleam of the opal-and-iris-throated birds that flutter round the\r\n+tall honeycombed Campanile, or stalk, with such stately grace, through\r\n+the dim, dust-stained arcades. Leaning back with half-closed eyes, he\r\n+kept saying over and over to himself:\r\n+\r\n+ \u0022Devant une facade rose,\r\n+ Sur le marbre d'un escalier.\u0022\r\n+\r\n+The whole of Venice was in those two lines. He remembered the autumn\r\n+that he had passed there, and a wonderful love that had stirred him to\r\n+mad delightful follies. There was romance in every place. But Venice,\r\n+like Oxford, had kept the background for romance, and, to the true\r\n+romantic, background was everything, or almost everything. Basil had\r\n+been with him part of the time, and had gone wild over Tintoret. Poor\r\n+Basil! What a horrible way for a man to die!\r\n+\r\n+He sighed, and took up the volume again, and tried to forget. He read\r\n+of the swallows that fly in and out of the little _cafe_ at Smyrna where\r\n+the Hadjis sit counting their amber beads and the turbaned merchants\r\n+smoke their long tasselled pipes and talk gravely to each other; he\r\n+read of the Obelisk in the Place de la Concorde that weeps tears of\r\n+granite in its lonely sunless exile and longs to be back by the hot,\r\n+lotus-covered Nile, where there are Sphinxes, and rose-red ibises, and\r\n+white vultures with gilded claws, and crocodiles with small beryl eyes\r\n+that crawl over the green steaming mud; he began to brood over those\r\n+verses which, drawing music from kiss-stained marble, tell of that\r\n+curious statue that Gautier compares to a contralto voice, the \u0022_monstre\r\n+charmant_\u0022 that couches in the porphyry-room of the Louvre. But after a\r\n+time the book fell from his hand. He grew nervous, and a horrible fit\r\n+of terror came over him. What if Alan Campbell should be out of\r\n+England? Days would elapse before he could come back. Perhaps he\r\n+might refuse to come. What could he do then? Every moment was of\r\n+vital importance.\r\n+\r\n+They had been great friends once, five years before--almost\r\n+inseparable, indeed. Then the intimacy had come suddenly to an end.\r\n+When they met in society now, it was only Dorian Gray who smiled: Alan\r\n+Campbell never did.\r\n+\r\n+He was an extremely clever young man, though he had no real\r\n+appreciation of the visible arts, and whatever little sense of the\r\n+beauty of poetry he possessed he had gained entirely from Dorian. His\r\n+dominant intellectual passion was for science. At Cambridge he had\r\n+spent a great deal of his time working in the laboratory, and had taken\r\n+a good class in the Natural Science Tripos of his year. Indeed, he was\r\n+still devoted to the study of chemistry, and had a laboratory of his\r\n+own in which he used to shut himself up all day long, greatly to the\r\n+annoyance of his mother, who had set her heart on his standing for\r\n+Parliament and had a vague idea that a chemist was a person who made up\r\n+prescriptions. He was an excellent musician, however, as well, and\r\n+played both the violin and the piano better than most amateurs. In\r\n+fact, it was music that had first brought him and Dorian Gray\r\n+together--music and that indefinable attraction that Dorian seemed to\r\n+be able to exercise whenever he wished--and, indeed, exercised often\r\n+without being conscious of it. They had met at Lady Berkshire's the\r\n+night that Rubinstein played there, and after that used to be always\r\n+seen together at the opera and wherever good music was going on. For\r\n+eighteen months their intimacy lasted. Campbell was always either at\r\n+Selby Royal or in Grosvenor Square. To him, as to many others, Dorian\r\n+Gray was the type of everything that is wonderful and fascinating in\r\n+life. Whether or not a quarrel had taken place between them no one\r\n+ever knew. But suddenly people remarked that they scarcely spoke when\r\n+they met and that Campbell seemed always to go away early from any\r\n+party at which Dorian Gray was present. He had changed, too--was\r\n+strangely melancholy at times, appeared almost to dislike hearing\r\n+music, and would never himself play, giving as his excuse, when he was\r\n+called upon, that he was so absorbed in science that he had no time\r\n+left in which to practise. And this was certainly true. Every day he\r\n+seemed to become more interested in biology, and his name appeared once\r\n+or twice in some of the scientific reviews in connection with certain\r\n+curious experiments.\r\n+\r\n+This was the man Dorian Gray was waiting for. Every second he kept\r\n+glancing at the clock. As the minutes went by he became horribly\r\n+agitated. At last he got up and began to pace up and down the room,\r\n+looking like a beautiful caged thing. He took long stealthy strides.\r\n+His hands were curiously cold.\r\n+\r\n+The suspense became unbearable. Time seemed to him to be crawling with\r\n+feet of lead, while he by monstrous winds was being swept towards the\r\n+jagged edge of some black cleft of precipice. He knew what was waiting\r\n+for him there; saw it, indeed, and, shuddering, crushed with dank hands\r\n+his burning lids as though he would have robbed the very brain of sight\r\n+and driven the eyeballs back into their cave. It was useless. The\r\n+brain had its own food on which it battened, and the imagination, made\r\n+grotesque by terror, twisted and distorted as a living thing by pain,\r\n+danced like some foul puppet on a stand and grinned through moving\r\n+masks. Then, suddenly, time stopped for him. Yes: that blind,\r\n+slow-breathing thing crawled no more, and horrible thoughts, time being\r\n+dead, raced nimbly on in front, and dragged a hideous future from its\r\n+grave, and showed it to him. He stared at it. Its very horror made\r\n+him stone.\r\n+\r\n+At last the door opened and his servant entered. He turned glazed eyes\r\n+upon him.\r\n+\r\n+\u0022Mr. Campbell, sir,\u0022 said the man.\r\n+\r\n+A sigh of relief broke from his parched lips, and the colour came back\r\n+to his cheeks.\r\n+\r\n+\u0022Ask him to come in at once, Francis.\u0022 He felt that he was himself\r\n+again. His mood of cowardice had passed away.\r\n+\r\n+The man bowed and retired. In a few moments, Alan Campbell walked in,\r\n+looking very stern and rather pale, his pallor being intensified by his\r\n+coal-black hair and dark eyebrows.\r\n+\r\n+\u0022Alan! This is kind of you. I thank you for coming.\u0022\r\n+\r\n+\u0022I had intended never to enter your house again, Gray. But you said it\r\n+was a matter of life and death.\u0022 His voice was hard and cold. He\r\n+spoke with slow deliberation. There was a look of contempt in the\r\n+steady searching gaze that he turned on Dorian. He kept his hands in\r\n+the pockets of his Astrakhan coat, and seemed not to have noticed the\r\n+gesture with which he had been greeted.\r\n+\r\n+\u0022Yes: it is a matter of life and death, Alan, and to more than one\r\n+person. Sit down.\u0022\r\n+\r\n+Campbell took a chair by the table, and Dorian sat opposite to him.\r\n+The two men's eyes met. In Dorian's there was infinite pity. He knew\r\n+that what he was going to do was dreadful.\r\n+\r\n+After a strained moment of silence, he leaned across and said, very\r\n+quietly, but watching the effect of each word upon the face of him he\r\n+had sent for, \u0022Alan, in a locked room at the top of this house, a room\r\n+to which nobody but myself has access, a dead man is seated at a table.\r\n+He has been dead ten hours now. Don't stir, and don't look at me like\r\n+that. Who the man is, why he died, how he died, are matters that do\r\n+not concern you. What you have to do is this--\u0022\r\n+\r\n+\u0022Stop, Gray. I don't want to know anything further. Whether what you\r\n+have told me is true or not true doesn't concern me. I entirely\r\n+decline to be mixed up in your life. Keep your horrible secrets to\r\n+yourself. They don't interest me any more.\u0022\r\n+\r\n+\u0022Alan, they will have to interest you. This one will have to interest\r\n+you. I am awfully sorry for you, Alan. But I can't help myself. You\r\n+are the one man who is able to save me. I am forced to bring you into\r\n+the matter. I have no option. Alan, you are scientific. You know\r\n+about chemistry and things of that kind. You have made experiments.\r\n+What you have got to do is to destroy the thing that is upstairs--to\r\n+destroy it so that not a vestige of it will be left. Nobody saw this\r\n+person come into the house. Indeed, at the present moment he is\r\n+supposed to be in Paris. He will not be missed for months. When he is\r\n+missed, there must be no trace of him found here. You, Alan, you must\r\n+change him, and everything that belongs to him, into a handful of ashes\r\n+that I may scatter in the air.\u0022\r\n+\r\n+\u0022You are mad, Dorian.\u0022\r\n+\r\n+\u0022Ah! I was waiting for you to call me Dorian.\u0022\r\n+\r\n+\u0022You are mad, I tell you--mad to imagine that I would raise a finger to\r\n+help you, mad to make this monstrous confession. I will have nothing\r\n+to do with this matter, whatever it is. Do you think I am going to\r\n+peril my reputation for you? What is it to me what devil's work you\r\n+are up to?\u0022\r\n+\r\n+\u0022It was suicide, Alan.\u0022\r\n+\r\n+\u0022I am glad of that. But who drove him to it? You, I should fancy.\u0022\r\n+\r\n+\u0022Do you still refuse to do this for me?\u0022\r\n+\r\n+\u0022Of course I refuse. I will have absolutely nothing to do with it. I\r\n+don't care what shame comes on you. You deserve it all. I should not\r\n+be sorry to see you disgraced, publicly disgraced. How dare you ask\r\n+me, of all men in the world, to mix myself up in this horror? I should\r\n+have thought you knew more about people's characters. Your friend Lord\r\n+Henry Wotton can't have taught you much about psychology, whatever else\r\n+he has taught you. Nothing will induce me to stir a step to help you.\r\n+You have come to the wrong man. Go to some of your friends. Don't\r\n+come to me.\u0022\r\n+\r\n+\u0022Alan, it was murder. I killed him. You don't know what he had made\r\n+me suffer. Whatever my life is, he had more to do with the making or\r\n+the marring of it than poor Harry has had. He may not have intended\r\n+it, the result was the same.\u0022\r\n+\r\n+\u0022Murder! Good God, Dorian, is that what you have come to? I shall not\r\n+inform upon you. It is not my business. Besides, without my stirring\r\n+in the matter, you are certain to be arrested. Nobody ever commits a\r\n+crime without doing something stupid. But I will have nothing to do\r\n+with it.\u0022\r\n+\r\n+\u0022You must have something to do with it. Wait, wait a moment; listen to\r\n+me. Only listen, Alan. All I ask of you is to perform a certain\r\n+scientific experiment. You go to hospitals and dead-houses, and the\r\n+horrors that you do there don't affect you. If in some hideous\r\n+dissecting-room or fetid laboratory you found this man lying on a\r\n+leaden table with red gutters scooped out in it for the blood to flow\r\n+through, you would simply look upon him as an admirable subject. You\r\n+would not turn a hair. You would not believe that you were doing\r\n+anything wrong. On the contrary, you would probably feel that you were\r\n+benefiting the human race, or increasing the sum of knowledge in the\r\n+world, or gratifying intellectual curiosity, or something of that kind.\r\n+What I want you to do is merely what you have often done before.\r\n+Indeed, to destroy a body must be far less horrible than what you are\r\n+accustomed to work at. And, remember, it is the only piece of evidence\r\n+against me. If it is discovered, I am lost; and it is sure to be\r\n+discovered unless you help me.\u0022\r\n+\r\n+\u0022I have no desire to help you. You forget that. I am simply\r\n+indifferent to the whole thing. It has nothing to do with me.\u0022\r\n+\r\n+\u0022Alan, I entreat you. Think of the position I am in. Just before you\r\n+came I almost fainted with terror. You may know terror yourself some\r\n+day. No! don't think of that. Look at the matter purely from the\r\n+scientific point of view. You don't inquire where the dead things on\r\n+which you experiment come from. Don't inquire now. I have told you\r\n+too much as it is. But I beg of you to do this. We were friends once,\r\n+Alan.\u0022\r\n+\r\n+\u0022Don't speak about those days, Dorian--they are dead.\u0022\r\n+\r\n+\u0022The dead linger sometimes. The man upstairs will not go away. He is\r\n+sitting at the table with bowed head and outstretched arms. Alan!\r\n+Alan! If you don't come to my assistance, I am ruined. Why, they will\r\n+hang me, Alan! Don't you understand? They will hang me for what I\r\n+have done.\u0022\r\n+\r\n+\u0022There is no good in prolonging this scene. I absolutely refuse to do\r\n+anything in the matter. It is insane of you to ask me.\u0022\r\n+\r\n+\u0022You refuse?\u0022\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022I entreat you, Alan.\u0022\r\n+\r\n+\u0022It is useless.\u0022\r\n+\r\n+The same look of pity came into Dorian Gray's eyes. Then he stretched\r\n+out his hand, took a piece of paper, and wrote something on it. He\r\n+read it over twice, folded it carefully, and pushed it across the\r\n+table. Having done this, he got up and went over to the window.\r\n+\r\n+Campbell looked at him in surprise, and then took up the paper, and\r\n+opened it. As he read it, his face became ghastly pale and he fell\r\n+back in his chair. A horrible sense of sickness came over him. He\r\n+felt as if his heart was beating itself to death in some empty hollow.\r\n+\r\n+After two or three minutes of terrible silence, Dorian turned round and\r\n+came and stood behind him, putting his hand upon his shoulder.\r\n+\r\n+\u0022I am so sorry for you, Alan,\u0022 he murmured, \u0022but you leave me no\r\n+alternative. I have a letter written already. Here it is. You see\r\n+the address. If you don't help me, I must send it. If you don't help\r\n+me, I will send it. You know what the result will be. But you are\r\n+going to help me. It is impossible for you to refuse now. I tried to\r\n+spare you. You will do me the justice to admit that. You were stern,\r\n+harsh, offensive. You treated me as no man has ever dared to treat\r\n+me--no living man, at any rate. I bore it all. Now it is for me to\r\n+dictate terms.\u0022\r\n+\r\n+Campbell buried his face in his hands, and a shudder passed through him.\r\n+\r\n+\u0022Yes, it is my turn to dictate terms, Alan. You know what they are.\r\n+The thing is quite simple. Come, don't work yourself into this fever.\r\n+The thing has to be done. Face it, and do it.\u0022\r\n+\r\n+A groan broke from Campbell's lips and he shivered all over. The\r\n+ticking of the clock on the mantelpiece seemed to him to be dividing\r\n+time into separate atoms of agony, each of which was too terrible to be\r\n+borne. He felt as if an iron ring was being slowly tightened round his\r\n+forehead, as if the disgrace with which he was threatened had already\r\n+come upon him. The hand upon his shoulder weighed like a hand of lead.\r\n+It was intolerable. It seemed to crush him.\r\n+\r\n+\u0022Come, Alan, you must decide at once.\u0022\r\n+\r\n+\u0022I cannot do it,\u0022 he said, mechanically, as though words could alter\r\n+things.\r\n+\r\n+\u0022You must. You have no choice. Don't delay.\u0022\r\n+\r\n+He hesitated a moment. \u0022Is there a fire in the room upstairs?\u0022\r\n+\r\n+\u0022Yes, there is a gas-fire with asbestos.\u0022\r\n+\r\n+\u0022I shall have to go home and get some things from the laboratory.\u0022\r\n+\r\n+\u0022No, Alan, you must not leave the house. Write out on a sheet of\r\n+notepaper what you want and my servant will take a cab and bring the\r\n+things back to you.\u0022\r\n+\r\n+Campbell scrawled a few lines, blotted them, and addressed an envelope\r\n+to his assistant. Dorian took the note up and read it carefully. Then\r\n+he rang the bell and gave it to his valet, with orders to return as\r\n+soon as possible and to bring the things with him.\r\n+\r\n+As the hall door shut, Campbell started nervously, and having got up\r\n+from the chair, went over to the chimney-piece. He was shivering with a\r\n+kind of ague. For nearly twenty minutes, neither of the men spoke. A\r\n+fly buzzed noisily about the room, and the ticking of the clock was\r\n+like the beat of a hammer.\r\n+\r\n+As the chime struck one, Campbell turned round, and looking at Dorian\r\n+Gray, saw that his eyes were filled with tears. There was something in\r\n+the purity and refinement of that sad face that seemed to enrage him.\r\n+\u0022You are infamous, absolutely infamous!\u0022 he muttered.\r\n+\r\n+\u0022Hush, Alan. You have saved my life,\u0022 said Dorian.\r\n+\r\n+\u0022Your life? Good heavens! what a life that is! You have gone from\r\n+corruption to corruption, and now you have culminated in crime. In\r\n+doing what I am going to do--what you force me to do--it is not of your\r\n+life that I am thinking.\u0022\r\n+\r\n+\u0022Ah, Alan,\u0022 murmured Dorian with a sigh, \u0022I wish you had a thousandth\r\n+part of the pity for me that I have for you.\u0022 He turned away as he\r\n+spoke and stood looking out at the garden. Campbell made no answer.\r\n+\r\n+After about ten minutes a knock came to the door, and the servant\r\n+entered, carrying a large mahogany chest of chemicals, with a long coil\r\n+of steel and platinum wire and two rather curiously shaped iron clamps.\r\n+\r\n+\u0022Shall I leave the things here, sir?\u0022 he asked Campbell.\r\n+\r\n+\u0022Yes,\u0022 said Dorian. \u0022And I am afraid, Francis, that I have another\r\n+errand for you. What is the name of the man at Richmond who supplies\r\n+Selby with orchids?\u0022\r\n+\r\n+\u0022Harden, sir.\u0022\r\n+\r\n+\u0022Yes--Harden. You must go down to Richmond at once, see Harden\r\n+personally, and tell him to send twice as many orchids as I ordered,\r\n+and to have as few white ones as possible. In fact, I don't want any\r\n+white ones. It is a lovely day, Francis, and Richmond is a very pretty\r\n+place--otherwise I wouldn't bother you about it.\u0022\r\n+\r\n+\u0022No trouble, sir. At what time shall I be back?\u0022\r\n+\r\n+Dorian looked at Campbell. \u0022How long will your experiment take, Alan?\u0022\r\n+he said in a calm indifferent voice. The presence of a third person in\r\n+the room seemed to give him extraordinary courage.\r\n+\r\n+Campbell frowned and bit his lip. \u0022It will take about five hours,\u0022 he\r\n+answered.\r\n+\r\n+\u0022It will be time enough, then, if you are back at half-past seven,\r\n+Francis. Or stay: just leave my things out for dressing. You can\r\n+have the evening to yourself. I am not dining at home, so I shall not\r\n+want you.\u0022\r\n+\r\n+\u0022Thank you, sir,\u0022 said the man, leaving the room.\r\n+\r\n+\u0022Now, Alan, there is not a moment to be lost. How heavy this chest is!\r\n+I'll take it for you. You bring the other things.\u0022 He spoke rapidly\r\n+and in an authoritative manner. Campbell felt dominated by him. They\r\n+left the room together.\r\n+\r\n+When they reached the top landing, Dorian took out the key and turned\r\n+it in the lock. Then he stopped, and a troubled look came into his\r\n+eyes. He shuddered. \u0022I don't think I can go in, Alan,\u0022 he murmured.\r\n+\r\n+\u0022It is nothing to me. I don't require you,\u0022 said Campbell coldly.\r\n+\r\n+Dorian half opened the door. As he did so, he saw the face of his\r\n+portrait leering in the sunlight. On the floor in front of it the torn\r\n+curtain was lying. He remembered that the night before he had\r\n+forgotten, for the first time in his life, to hide the fatal canvas,\r\n+and was about to rush forward, when he drew back with a shudder.\r\n+\r\n+What was that loathsome red dew that gleamed, wet and glistening, on\r\n+one of the hands, as though the canvas had sweated blood? How horrible\r\n+it was!--more horrible, it seemed to him for the moment, than the\r\n+silent thing that he knew was stretched across the table, the thing\r\n+whose grotesque misshapen shadow on the spotted carpet showed him that\r\n+it had not stirred, but was still there, as he had left it.\r\n+\r\n+He heaved a deep breath, opened the door a little wider, and with\r\n+half-closed eyes and averted head, walked quickly in, determined that\r\n+he would not look even once upon the dead man. Then, stooping down and\r\n+taking up the gold-and-purple hanging, he flung it right over the\r\n+picture.\r\n+\r\n+There he stopped, feeling afraid to turn round, and his eyes fixed\r\n+themselves on the intricacies of the pattern before him. He heard\r\n+Campbell bringing in the heavy chest, and the irons, and the other\r\n+things that he had required for his dreadful work. He began to wonder\r\n+if he and Basil Hallward had ever met, and, if so, what they had\r\n+thought of each other.\r\n+\r\n+\u0022Leave me now,\u0022 said a stern voice behind him.\r\n+\r\n+He turned and hurried out, just conscious that the dead man had been\r\n+thrust back into the chair and that Campbell was gazing into a\r\n+glistening yellow face. As he was going downstairs, he heard the key\r\n+being turned in the lock.\r\n+\r\n+It was long after seven when Campbell came back into the library. He\r\n+was pale, but absolutely calm. \u0022I have done what you asked me to do,\u0022\r\n+he muttered. \u0022And now, good-bye. Let us never see each other again.\u0022\r\n+\r\n+\u0022You have saved me from ruin, Alan. I cannot forget that,\u0022 said Dorian\r\n+simply.\r\n+\r\n+As soon as Campbell had left, he went upstairs. There was a horrible\r\n+smell of nitric acid in the room. But the thing that had been sitting\r\n+at the table was gone.\r\n+\r\n+\r\n+\r\n+CHAPTER 15\r\n+\r\n+That evening, at eight-thirty, exquisitely dressed and wearing a large\r\n+button-hole of Parma violets, Dorian Gray was ushered into Lady\r\n+Narborough's drawing-room by bowing servants. His forehead was\r\n+throbbing with maddened nerves, and he felt wildly excited, but his\r\n+manner as he bent over his hostess's hand was as easy and graceful as\r\n+ever. Perhaps one never seems so much at one's ease as when one has to\r\n+play a part. Certainly no one looking at Dorian Gray that night could\r\n+have believed that he had passed through a tragedy as horrible as any\r\n+tragedy of our age. Those finely shaped fingers could never have\r\n+clutched a knife for sin, nor those smiling lips have cried out on God\r\n+and goodness. He himself could not help wondering at the calm of his\r\n+demeanour, and for a moment felt keenly the terrible pleasure of a\r\n+double life.\r\n+\r\n+It was a small party, got up rather in a hurry by Lady Narborough, who\r\n+was a very clever woman with what Lord Henry used to describe as the\r\n+remains of really remarkable ugliness. She had proved an excellent\r\n+wife to one of our most tedious ambassadors, and having buried her\r\n+husband properly in a marble mausoleum, which she had herself designed,\r\n+and married off her daughters to some rich, rather elderly men, she\r\n+devoted herself now to the pleasures of French fiction, French cookery,\r\n+and French _esprit_ when she could get it.\r\n+\r\n+Dorian was one of her especial favourites, and she always told him that\r\n+she was extremely glad she had not met him in early life. \u0022I know, my\r\n+dear, I should have fallen madly in love with you,\u0022 she used to say,\r\n+\u0022and thrown my bonnet right over the mills for your sake. It is most\r\n+fortunate that you were not thought of at the time. As it was, our\r\n+bonnets were so unbecoming, and the mills were so occupied in trying to\r\n+raise the wind, that I never had even a flirtation with anybody.\r\n+However, that was all Narborough's fault. He was dreadfully\r\n+short-sighted, and there is no pleasure in taking in a husband who\r\n+never sees anything.\u0022\r\n+\r\n+Her guests this evening were rather tedious. The fact was, as she\r\n+explained to Dorian, behind a very shabby fan, one of her married\r\n+daughters had come up quite suddenly to stay with her, and, to make\r\n+matters worse, had actually brought her husband with her. \u0022I think it\r\n+is most unkind of her, my dear,\u0022 she whispered. \u0022Of course I go and\r\n+stay with them every summer after I come from Homburg, but then an old\r\n+woman like me must have fresh air sometimes, and besides, I really wake\r\n+them up. You don't know what an existence they lead down there. It is\r\n+pure unadulterated country life. They get up early, because they have\r\n+so much to do, and go to bed early, because they have so little to\r\n+think about. There has not been a scandal in the neighbourhood since\r\n+the time of Queen Elizabeth, and consequently they all fall asleep\r\n+after dinner. You shan't sit next either of them. You shall sit by me\r\n+and amuse me.\u0022\r\n+\r\n+Dorian murmured a graceful compliment and looked round the room. Yes:\r\n+it was certainly a tedious party. Two of the people he had never seen\r\n+before, and the others consisted of Ernest Harrowden, one of those\r\n+middle-aged mediocrities so common in London clubs who have no enemies,\r\n+but are thoroughly disliked by their friends; Lady Ruxton, an\r\n+overdressed woman of forty-seven, with a hooked nose, who was always\r\n+trying to get herself compromised, but was so peculiarly plain that to\r\n+her great disappointment no one would ever believe anything against\r\n+her; Mrs. Erlynne, a pushing nobody, with a delightful lisp and\r\n+Venetian-red hair; Lady Alice Chapman, his hostess's daughter, a dowdy\r\n+dull girl, with one of those characteristic British faces that, once\r\n+seen, are never remembered; and her husband, a red-cheeked,\r\n+white-whiskered creature who, like so many of his class, was under the\r\n+impression that inordinate joviality can atone for an entire lack of\r\n+ideas.\r\n+\r\n+He was rather sorry he had come, till Lady Narborough, looking at the\r\n+great ormolu gilt clock that sprawled in gaudy curves on the\r\n+mauve-draped mantelshelf, exclaimed: \u0022How horrid of Henry Wotton to be\r\n+so late! I sent round to him this morning on chance and he promised\r\n+faithfully not to disappoint me.\u0022\r\n+\r\n+It was some consolation that Harry was to be there, and when the door\r\n+opened and he heard his slow musical voice lending charm to some\r\n+insincere apology, he ceased to feel bored.\r\n+\r\n+But at dinner he could not eat anything. Plate after plate went away\r\n+untasted. Lady Narborough kept scolding him for what she called \u0022an\r\n+insult to poor Adolphe, who invented the _menu_ specially for you,\u0022 and\r\n+now and then Lord Henry looked across at him, wondering at his silence\r\n+and abstracted manner. From time to time the butler filled his glass\r\n+with champagne. He drank eagerly, and his thirst seemed to increase.\r\n+\r\n+\u0022Dorian,\u0022 said Lord Henry at last, as the _chaud-froid_ was being handed\r\n+round, \u0022what is the matter with you to-night? You are quite out of\r\n+sorts.\u0022\r\n+\r\n+\u0022I believe he is in love,\u0022 cried Lady Narborough, \u0022and that he is\r\n+afraid to tell me for fear I should be jealous. He is quite right. I\r\n+certainly should.\u0022\r\n+\r\n+\u0022Dear Lady Narborough,\u0022 murmured Dorian, smiling, \u0022I have not been in\r\n+love for a whole week--not, in fact, since Madame de Ferrol left town.\u0022\r\n+\r\n+\u0022How you men can fall in love with that woman!\u0022 exclaimed the old lady.\r\n+\u0022I really cannot understand it.\u0022\r\n+\r\n+\u0022It is simply because she remembers you when you were a little girl,\r\n+Lady Narborough,\u0022 said Lord Henry. \u0022She is the one link between us and\r\n+your short frocks.\u0022\r\n+\r\n+\u0022She does not remember my short frocks at all, Lord Henry. But I\r\n+remember her very well at Vienna thirty years ago, and how _decolletee_\r\n+she was then.\u0022\r\n+\r\n+\u0022She is still _decolletee_,\u0022 he answered, taking an olive in his long\r\n+fingers; \u0022and when she is in a very smart gown she looks like an\r\n+_edition de luxe_ of a bad French novel. She is really wonderful, and\r\n+full of surprises. Her capacity for family affection is extraordinary.\r\n+When her third husband died, her hair turned quite gold from grief.\u0022\r\n+\r\n+\u0022How can you, Harry!\u0022 cried Dorian.\r\n+\r\n+\u0022It is a most romantic explanation,\u0022 laughed the hostess. \u0022But her\r\n+third husband, Lord Henry! You don't mean to say Ferrol is the fourth?\u0022\r\n+\r\n+\u0022Certainly, Lady Narborough.\u0022\r\n+\r\n+\u0022I don't believe a word of it.\u0022\r\n+\r\n+\u0022Well, ask Mr. Gray. He is one of her most intimate friends.\u0022\r\n+\r\n+\u0022Is it true, Mr. Gray?\u0022\r\n+\r\n+\u0022She assures me so, Lady Narborough,\u0022 said Dorian. \u0022I asked her\r\n+whether, like Marguerite de Navarre, she had their hearts embalmed and\r\n+hung at her girdle. She told me she didn't, because none of them had\r\n+had any hearts at all.\u0022\r\n+\r\n+\u0022Four husbands! Upon my word that is _trop de zele_.\u0022\r\n+\r\n+\u0022_Trop d'audace_, I tell her,\u0022 said Dorian.\r\n+\r\n+\u0022Oh! she is audacious enough for anything, my dear. And what is Ferrol\r\n+like? I don't know him.\u0022\r\n+\r\n+\u0022The husbands of very beautiful women belong to the criminal classes,\u0022\r\n+said Lord Henry, sipping his wine.\r\n+\r\n+Lady Narborough hit him with her fan. \u0022Lord Henry, I am not at all\r\n+surprised that the world says that you are extremely wicked.\u0022\r\n+\r\n+\u0022But what world says that?\u0022 asked Lord Henry, elevating his eyebrows.\r\n+\u0022It can only be the next world. This world and I are on excellent\r\n+terms.\u0022\r\n+\r\n+\u0022Everybody I know says you are very wicked,\u0022 cried the old lady,\r\n+shaking her head.\r\n+\r\n+Lord Henry looked serious for some moments. \u0022It is perfectly\r\n+monstrous,\u0022 he said, at last, \u0022the way people go about nowadays saying\r\n+things against one behind one's back that are absolutely and entirely\r\n+true.\u0022\r\n+\r\n+\u0022Isn't he incorrigible?\u0022 cried Dorian, leaning forward in his chair.\r\n+\r\n+\u0022I hope so,\u0022 said his hostess, laughing. \u0022But really, if you all\r\n+worship Madame de Ferrol in this ridiculous way, I shall have to marry\r\n+again so as to be in the fashion.\u0022\r\n+\r\n+\u0022You will never marry again, Lady Narborough,\u0022 broke in Lord Henry.\r\n+\u0022You were far too happy. When a woman marries again, it is because she\r\n+detested her first husband. When a man marries again, it is because he\r\n+adored his first wife. Women try their luck; men risk theirs.\u0022\r\n+\r\n+\u0022Narborough wasn't perfect,\u0022 cried the old lady.\r\n+\r\n+\u0022If he had been, you would not have loved him, my dear lady,\u0022 was the\r\n+rejoinder. \u0022Women love us for our defects. If we have enough of them,\r\n+they will forgive us everything, even our intellects. You will never\r\n+ask me to dinner again after saying this, I am afraid, Lady Narborough,\r\n+but it is quite true.\u0022\r\n+\r\n+\u0022Of course it is true, Lord Henry. If we women did not love you for\r\n+your defects, where would you all be? Not one of you would ever be\r\n+married. You would be a set of unfortunate bachelors. Not, however,\r\n+that that would alter you much. Nowadays all the married men live like\r\n+bachelors, and all the bachelors like married men.\u0022\r\n+\r\n+\u0022_Fin de siecle_,\u0022 murmured Lord Henry.\r\n+\r\n+\u0022_Fin du globe_,\u0022 answered his hostess.\r\n+\r\n+\u0022I wish it were _fin du globe_,\u0022 said Dorian with a sigh. \u0022Life is a\r\n+great disappointment.\u0022\r\n+\r\n+\u0022Ah, my dear,\u0022 cried Lady Narborough, putting on her gloves, \u0022don't\r\n+tell me that you have exhausted life. When a man says that one knows\r\n+that life has exhausted him. Lord Henry is very wicked, and I\r\n+sometimes wish that I had been; but you are made to be good--you look\r\n+so good. I must find you a nice wife. Lord Henry, don't you think\r\n+that Mr. Gray should get married?\u0022\r\n+\r\n+\u0022I am always telling him so, Lady Narborough,\u0022 said Lord Henry with a\r\n+bow.\r\n+\r\n+\u0022Well, we must look out for a suitable match for him. I shall go\r\n+through Debrett carefully to-night and draw out a list of all the\r\n+eligible young ladies.\u0022\r\n+\r\n+\u0022With their ages, Lady Narborough?\u0022 asked Dorian.\r\n+\r\n+\u0022Of course, with their ages, slightly edited. But nothing must be done\r\n+in a hurry. I want it to be what _The Morning Post_ calls a suitable\r\n+alliance, and I want you both to be happy.\u0022\r\n+\r\n+\u0022What nonsense people talk about happy marriages!\u0022 exclaimed Lord\r\n+Henry. \u0022A man can be happy with any woman, as long as he does not love\r\n+her.\u0022\r\n+\r\n+\u0022Ah! what a cynic you are!\u0022 cried the old lady, pushing back her chair\r\n+and nodding to Lady Ruxton. \u0022You must come and dine with me soon\r\n+again. You are really an admirable tonic, much better than what Sir\r\n+Andrew prescribes for me. You must tell me what people you would like\r\n+to meet, though. I want it to be a delightful gathering.\u0022\r\n+\r\n+\u0022I like men who have a future and women who have a past,\u0022 he answered.\r\n+\u0022Or do you think that would make it a petticoat party?\u0022\r\n+\r\n+\u0022I fear so,\u0022 she said, laughing, as she stood up. \u0022A thousand pardons,\r\n+my dear Lady Ruxton,\u0022 she added, \u0022I didn't see you hadn't finished your\r\n+cigarette.\u0022\r\n+\r\n+\u0022Never mind, Lady Narborough. I smoke a great deal too much. I am\r\n+going to limit myself, for the future.\u0022\r\n+\r\n+\u0022Pray don't, Lady Ruxton,\u0022 said Lord Henry. \u0022Moderation is a fatal\r\n+thing. Enough is as bad as a meal. More than enough is as good as a\r\n+feast.\u0022\r\n+\r\n+Lady Ruxton glanced at him curiously. \u0022You must come and explain that\r\n+to me some afternoon, Lord Henry. It sounds a fascinating theory,\u0022 she\r\n+murmured, as she swept out of the room.\r\n+\r\n+\u0022Now, mind you don't stay too long over your politics and scandal,\u0022\r\n+cried Lady Narborough from the door. \u0022If you do, we are sure to\r\n+squabble upstairs.\u0022\r\n+\r\n+The men laughed, and Mr. Chapman got up solemnly from the foot of the\r\n+table and came up to the top. Dorian Gray changed his seat and went\r\n+and sat by Lord Henry. Mr. Chapman began to talk in a loud voice about\r\n+the situation in the House of Commons. He guffawed at his adversaries.\r\n+The word _doctrinaire_--word full of terror to the British\r\n+mind--reappeared from time to time between his explosions. An\r\n+alliterative prefix served as an ornament of oratory. He hoisted the\r\n+Union Jack on the pinnacles of thought. The inherited stupidity of the\r\n+race--sound English common sense he jovially termed it--was shown to be\r\n+the proper bulwark for society.\r\n+\r\n+A smile curved Lord Henry's lips, and he turned round and looked at\r\n+Dorian.\r\n+\r\n+\u0022Are you better, my dear fellow?\u0022 he asked. \u0022You seemed rather out of\r\n+sorts at dinner.\u0022\r\n+\r\n+\u0022I am quite well, Harry. I am tired. That is all.\u0022\r\n+\r\n+\u0022You were charming last night. The little duchess is quite devoted to\r\n+you. She tells me she is going down to Selby.\u0022\r\n+\r\n+\u0022She has promised to come on the twentieth.\u0022\r\n+\r\n+\u0022Is Monmouth to be there, too?\u0022\r\n+\r\n+\u0022Oh, yes, Harry.\u0022\r\n+\r\n+\u0022He bores me dreadfully, almost as much as he bores her. She is very\r\n+clever, too clever for a woman. She lacks the indefinable charm of\r\n+weakness. It is the feet of clay that make the gold of the image\r\n+precious. Her feet are very pretty, but they are not feet of clay.\r\n+White porcelain feet, if you like. They have been through the fire,\r\n+and what fire does not destroy, it hardens. She has had experiences.\u0022\r\n+\r\n+\u0022How long has she been married?\u0022 asked Dorian.\r\n+\r\n+\u0022An eternity, she tells me. I believe, according to the peerage, it is\r\n+ten years, but ten years with Monmouth must have been like eternity,\r\n+with time thrown in. Who else is coming?\u0022\r\n+\r\n+\u0022Oh, the Willoughbys, Lord Rugby and his wife, our hostess, Geoffrey\r\n+Clouston, the usual set. I have asked Lord Grotrian.\u0022\r\n+\r\n+\u0022I like him,\u0022 said Lord Henry. \u0022A great many people don't, but I find\r\n+him charming. He atones for being occasionally somewhat overdressed by\r\n+being always absolutely over-educated. He is a very modern type.\u0022\r\n+\r\n+\u0022I don't know if he will be able to come, Harry. He may have to go to\r\n+Monte Carlo with his father.\u0022\r\n+\r\n+\u0022Ah! what a nuisance people's people are! Try and make him come. By\r\n+the way, Dorian, you ran off very early last night. You left before\r\n+eleven. What did you do afterwards? Did you go straight home?\u0022\r\n+\r\n+Dorian glanced at him hurriedly and frowned.\r\n+\r\n+\u0022No, Harry,\u0022 he said at last, \u0022I did not get home till nearly three.\u0022\r\n+\r\n+\u0022Did you go to the club?\u0022\r\n+\r\n+\u0022Yes,\u0022 he answered. Then he bit his lip. \u0022No, I don't mean that. I\r\n+didn't go to the club. I walked about. I forget what I did.... How\r\n+inquisitive you are, Harry! You always want to know what one has been\r\n+doing. I always want to forget what I have been doing. I came in at\r\n+half-past two, if you wish to know the exact time. I had left my\r\n+latch-key at home, and my servant had to let me in. If you want any\r\n+corroborative evidence on the subject, you can ask him.\u0022\r\n+\r\n+Lord Henry shrugged his shoulders. \u0022My dear fellow, as if I cared!\r\n+Let us go up to the drawing-room. No sherry, thank you, Mr. Chapman.\r\n+Something has happened to you, Dorian. Tell me what it is. You are\r\n+not yourself to-night.\u0022\r\n+\r\n+\u0022Don't mind me, Harry. I am irritable, and out of temper. I shall\r\n+come round and see you to-morrow, or next day. Make my excuses to Lady\r\n+Narborough. I shan't go upstairs. I shall go home. I must go home.\u0022\r\n+\r\n+\u0022All right, Dorian. I dare say I shall see you to-morrow at tea-time.\r\n+The duchess is coming.\u0022\r\n+\r\n+\u0022I will try to be there, Harry,\u0022 he said, leaving the room. As he\r\n+drove back to his own house, he was conscious that the sense of terror\r\n+he thought he had strangled had come back to him. Lord Henry's casual\r\n+questioning had made him lose his nerve for the moment, and he wanted\r\n+his nerve still. Things that were dangerous had to be destroyed. He\r\n+winced. He hated the idea of even touching them.\r\n+\r\n+Yet it had to be done. He realized that, and when he had locked the\r\n+door of his library, he opened the secret press into which he had\r\n+thrust Basil Hallward's coat and bag. A huge fire was blazing. He\r\n+piled another log on it. The smell of the singeing clothes and burning\r\n+leather was horrible. It took him three-quarters of an hour to consume\r\n+everything. At the end he felt faint and sick, and having lit some\r\n+Algerian pastilles in a pierced copper brazier, he bathed his hands and\r\n+forehead with a cool musk-scented vinegar.\r\n+\r\n+Suddenly he started. His eyes grew strangely bright, and he gnawed\r\n+nervously at his underlip. Between two of the windows stood a large\r\n+Florentine cabinet, made out of ebony and inlaid with ivory and blue\r\n+lapis. He watched it as though it were a thing that could fascinate\r\n+and make afraid, as though it held something that he longed for and yet\r\n+almost loathed. His breath quickened. A mad craving came over him.\r\n+He lit a cigarette and then threw it away. His eyelids drooped till\r\n+the long fringed lashes almost touched his cheek. But he still watched\r\n+the cabinet. At last he got up from the sofa on which he had been\r\n+lying, went over to it, and having unlocked it, touched some hidden\r\n+spring. A triangular drawer passed slowly out. His fingers moved\r\n+instinctively towards it, dipped in, and closed on something. It was a\r\n+small Chinese box of black and gold-dust lacquer, elaborately wrought,\r\n+the sides patterned with curved waves, and the silken cords hung with\r\n+round crystals and tasselled in plaited metal threads. He opened it.\r\n+Inside was a green paste, waxy in lustre, the odour curiously heavy and\r\n+persistent.\r\n+\r\n+He hesitated for some moments, with a strangely immobile smile upon his\r\n+face. Then shivering, though the atmosphere of the room was terribly\r\n+hot, he drew himself up and glanced at the clock. It was twenty\r\n+minutes to twelve. He put the box back, shutting the cabinet doors as\r\n+he did so, and went into his bedroom.\r\n+\r\n+As midnight was striking bronze blows upon the dusky air, Dorian Gray,\r\n+dressed commonly, and with a muffler wrapped round his throat, crept\r\n+quietly out of his house. In Bond Street he found a hansom with a good\r\n+horse. He hailed it and in a low voice gave the driver an address.\r\n+\r\n+The man shook his head. \u0022It is too far for me,\u0022 he muttered.\r\n+\r\n+\u0022Here is a sovereign for you,\u0022 said Dorian. \u0022You shall have another if\r\n+you drive fast.\u0022\r\n+\r\n+\u0022All right, sir,\u0022 answered the man, \u0022you will be there in an hour,\u0022 and\r\n+after his fare had got in he turned his horse round and drove rapidly\r\n+towards the river.\r\n+\r\n+\r\n+\r\n+CHAPTER 16\r\n+\r\n+A cold rain began to fall, and the blurred street-lamps looked ghastly\r\n+in the dripping mist. The public-houses were just closing, and dim men\r\n+and women were clustering in broken groups round their doors. From\r\n+some of the bars came the sound of horrible laughter. In others,\r\n+drunkards brawled and screamed.\r\n+\r\n+Lying back in the hansom, with his hat pulled over his forehead, Dorian\r\n+Gray watched with listless eyes the sordid shame of the great city, and\r\n+now and then he repeated to himself the words that Lord Henry had said\r\n+to him on the first day they had met, \u0022To cure the soul by means of the\r\n+senses, and the senses by means of the soul.\u0022 Yes, that was the\r\n+secret. He had often tried it, and would try it again now. There were\r\n+opium dens where one could buy oblivion, dens of horror where the\r\n+memory of old sins could be destroyed by the madness of sins that were\r\n+new.\r\n+\r\n+The moon hung low in the sky like a yellow skull. From time to time a\r\n+huge misshapen cloud stretched a long arm across and hid it. The\r\n+gas-lamps grew fewer, and the streets more narrow and gloomy. Once the\r\n+man lost his way and had to drive back half a mile. A steam rose from\r\n+the horse as it splashed up the puddles. The sidewindows of the hansom\r\n+were clogged with a grey-flannel mist.\r\n+\r\n+\u0022To cure the soul by means of the senses, and the senses by means of\r\n+the soul!\u0022 How the words rang in his ears! His soul, certainly, was\r\n+sick to death. Was it true that the senses could cure it? Innocent\r\n+blood had been spilled. What could atone for that? Ah! for that there\r\n+was no atonement; but though forgiveness was impossible, forgetfulness\r\n+was possible still, and he was determined to forget, to stamp the thing\r\n+out, to crush it as one would crush the adder that had stung one.\r\n+Indeed, what right had Basil to have spoken to him as he had done? Who\r\n+had made him a judge over others? He had said things that were\r\n+dreadful, horrible, not to be endured.\r\n+\r\n+On and on plodded the hansom, going slower, it seemed to him, at each\r\n+step. He thrust up the trap and called to the man to drive faster.\r\n+The hideous hunger for opium began to gnaw at him. His throat burned\r\n+and his delicate hands twitched nervously together. He struck at the\r\n+horse madly with his stick. The driver laughed and whipped up. He\r\n+laughed in answer, and the man was silent.\r\n+\r\n+The way seemed interminable, and the streets like the black web of some\r\n+sprawling spider. The monotony became unbearable, and as the mist\r\n+thickened, he felt afraid.\r\n+\r\n+Then they passed by lonely brickfields. The fog was lighter here, and\r\n+he could see the strange, bottle-shaped kilns with their orange,\r\n+fanlike tongues of fire. A dog barked as they went by, and far away in\r\n+the darkness some wandering sea-gull screamed. The horse stumbled in a\r\n+rut, then swerved aside and broke into a gallop.\r\n+\r\n+After some time they left the clay road and rattled again over\r\n+rough-paven streets. Most of the windows were dark, but now and then\r\n+fantastic shadows were silhouetted against some lamplit blind. He\r\n+watched them curiously. They moved like monstrous marionettes and made\r\n+gestures like live things. He hated them. A dull rage was in his\r\n+heart. As they turned a corner, a woman yelled something at them from\r\n+an open door, and two men ran after the hansom for about a hundred\r\n+yards. The driver beat at them with his whip.\r\n+\r\n+It is said that passion makes one think in a circle. Certainly with\r\n+hideous iteration the bitten lips of Dorian Gray shaped and reshaped\r\n+those subtle words that dealt with soul and sense, till he had found in\r\n+them the full expression, as it were, of his mood, and justified, by\r\n+intellectual approval, passions that without such justification would\r\n+still have dominated his temper. From cell to cell of his brain crept\r\n+the one thought; and the wild desire to live, most terrible of all\r\n+man's appetites, quickened into force each trembling nerve and fibre.\r\n+Ugliness that had once been hateful to him because it made things real,\r\n+became dear to him now for that very reason. Ugliness was the one\r\n+reality. The coarse brawl, the loathsome den, the crude violence of\r\n+disordered life, the very vileness of thief and outcast, were more\r\n+vivid, in their intense actuality of impression, than all the gracious\r\n+shapes of art, the dreamy shadows of song. They were what he needed\r\n+for forgetfulness. In three days he would be free.\r\n+\r\n+Suddenly the man drew up with a jerk at the top of a dark lane. Over\r\n+the low roofs and jagged chimney-stacks of the houses rose the black\r\n+masts of ships. Wreaths of white mist clung like ghostly sails to the\r\n+yards.\r\n+\r\n+\u0022Somewhere about here, sir, ain't it?\u0022 he asked huskily through the\r\n+trap.\r\n+\r\n+Dorian started and peered round. \u0022This will do,\u0022 he answered, and\r\n+having got out hastily and given the driver the extra fare he had\r\n+promised him, he walked quickly in the direction of the quay. Here and\r\n+there a lantern gleamed at the stern of some huge merchantman. The\r\n+light shook and splintered in the puddles. A red glare came from an\r\n+outward-bound steamer that was coaling. The slimy pavement looked like\r\n+a wet mackintosh.\r\n+\r\n+He hurried on towards the left, glancing back now and then to see if he\r\n+was being followed. In about seven or eight minutes he reached a small\r\n+shabby house that was wedged in between two gaunt factories. In one of\r\n+the top-windows stood a lamp. He stopped and gave a peculiar knock.\r\n+\r\n+After a little time he heard steps in the passage and the chain being\r\n+unhooked. The door opened quietly, and he went in without saying a\r\n+word to the squat misshapen figure that flattened itself into the\r\n+shadow as he passed. At the end of the hall hung a tattered green\r\n+curtain that swayed and shook in the gusty wind which had followed him\r\n+in from the street. He dragged it aside and entered a long low room\r\n+which looked as if it had once been a third-rate dancing-saloon. Shrill\r\n+flaring gas-jets, dulled and distorted in the fly-blown mirrors that\r\n+faced them, were ranged round the walls. Greasy reflectors of ribbed\r\n+tin backed them, making quivering disks of light. The floor was\r\n+covered with ochre-coloured sawdust, trampled here and there into mud,\r\n+and stained with dark rings of spilled liquor. Some Malays were\r\n+crouching by a little charcoal stove, playing with bone counters and\r\n+showing their white teeth as they chattered. In one corner, with his\r\n+head buried in his arms, a sailor sprawled over a table, and by the\r\n+tawdrily painted bar that ran across one complete side stood two\r\n+haggard women, mocking an old man who was brushing the sleeves of his\r\n+coat with an expression of disgust. \u0022He thinks he's got red ants on\r\n+him,\u0022 laughed one of them, as Dorian passed by. The man looked at her\r\n+in terror and began to whimper.\r\n+\r\n+At the end of the room there was a little staircase, leading to a\r\n+darkened chamber. As Dorian hurried up its three rickety steps, the\r\n+heavy odour of opium met him. He heaved a deep breath, and his\r\n+nostrils quivered with pleasure. When he entered, a young man with\r\n+smooth yellow hair, who was bending over a lamp lighting a long thin\r\n+pipe, looked up at him and nodded in a hesitating manner.\r\n+\r\n+\u0022You here, Adrian?\u0022 muttered Dorian.\r\n+\r\n+\u0022Where else should I be?\u0022 he answered, listlessly. \u0022None of the chaps\r\n+will speak to me now.\u0022\r\n+\r\n+\u0022I thought you had left England.\u0022\r\n+\r\n+\u0022Darlington is not going to do anything. My brother paid the bill at\r\n+last. George doesn't speak to me either.... I don't care,\u0022 he added\r\n+with a sigh. \u0022As long as one has this stuff, one doesn't want friends.\r\n+I think I have had too many friends.\u0022\r\n+\r\n+Dorian winced and looked round at the grotesque things that lay in such\r\n+fantastic postures on the ragged mattresses. The twisted limbs, the\r\n+gaping mouths, the staring lustreless eyes, fascinated him. He knew in\r\n+what strange heavens they were suffering, and what dull hells were\r\n+teaching them the secret of some new joy. They were better off than he\r\n+was. He was prisoned in thought. Memory, like a horrible malady, was\r\n+eating his soul away. From time to time he seemed to see the eyes of\r\n+Basil Hallward looking at him. Yet he felt he could not stay. The\r\n+presence of Adrian Singleton troubled him. He wanted to be where no\r\n+one would know who he was. He wanted to escape from himself.\r\n+\r\n+\u0022I am going on to the other place,\u0022 he said after a pause.\r\n+\r\n+\u0022On the wharf?\u0022\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022That mad-cat is sure to be there. They won't have her in this place\r\n+now.\u0022\r\n+\r\n+Dorian shrugged his shoulders. \u0022I am sick of women who love one.\r\n+Women who hate one are much more interesting. Besides, the stuff is\r\n+better.\u0022\r\n+\r\n+\u0022Much the same.\u0022\r\n+\r\n+\u0022I like it better. Come and have something to drink. I must have\r\n+something.\u0022\r\n+\r\n+\u0022I don't want anything,\u0022 murmured the young man.\r\n+\r\n+\u0022Never mind.\u0022\r\n+\r\n+Adrian Singleton rose up wearily and followed Dorian to the bar. A\r\n+half-caste, in a ragged turban and a shabby ulster, grinned a hideous\r\n+greeting as he thrust a bottle of brandy and two tumblers in front of\r\n+them. The women sidled up and began to chatter. Dorian turned his\r\n+back on them and said something in a low voice to Adrian Singleton.\r\n+\r\n+A crooked smile, like a Malay crease, writhed across the face of one of\r\n+the women. \u0022We are very proud to-night,\u0022 she sneered.\r\n+\r\n+\u0022For God's sake don't talk to me,\u0022 cried Dorian, stamping his foot on\r\n+the ground. \u0022What do you want? Money? Here it is. Don't ever talk\r\n+to me again.\u0022\r\n+\r\n+Two red sparks flashed for a moment in the woman's sodden eyes, then\r\n+flickered out and left them dull and glazed. She tossed her head and\r\n+raked the coins off the counter with greedy fingers. Her companion\r\n+watched her enviously.\r\n+\r\n+\u0022It's no use,\u0022 sighed Adrian Singleton. \u0022I don't care to go back.\r\n+What does it matter? I am quite happy here.\u0022\r\n+\r\n+\u0022You will write to me if you want anything, won't you?\u0022 said Dorian,\r\n+after a pause.\r\n+\r\n+\u0022Perhaps.\u0022\r\n+\r\n+\u0022Good night, then.\u0022\r\n+\r\n+\u0022Good night,\u0022 answered the young man, passing up the steps and wiping\r\n+his parched mouth with a handkerchief.\r\n+\r\n+Dorian walked to the door with a look of pain in his face. As he drew\r\n+the curtain aside, a hideous laugh broke from the painted lips of the\r\n+woman who had taken his money. \u0022There goes the devil's bargain!\u0022 she\r\n+hiccoughed, in a hoarse voice.\r\n+\r\n+\u0022Curse you!\u0022 he answered, \u0022don't call me that.\u0022\r\n+\r\n+She snapped her fingers. \u0022Prince Charming is what you like to be\r\n+called, ain't it?\u0022 she yelled after him.\r\n+\r\n+The drowsy sailor leaped to his feet as she spoke, and looked wildly\r\n+round. The sound of the shutting of the hall door fell on his ear. He\r\n+rushed out as if in pursuit.\r\n+\r\n+Dorian Gray hurried along the quay through the drizzling rain. His\r\n+meeting with Adrian Singleton had strangely moved him, and he wondered\r\n+if the ruin of that young life was really to be laid at his door, as\r\n+Basil Hallward had said to him with such infamy of insult. He bit his\r\n+lip, and for a few seconds his eyes grew sad. Yet, after all, what did\r\n+it matter to him? One's days were too brief to take the burden of\r\n+another's errors on one's shoulders. Each man lived his own life and\r\n+paid his own price for living it. The only pity was one had to pay so\r\n+often for a single fault. One had to pay over and over again, indeed.\r\n+In her dealings with man, destiny never closed her accounts.\r\n+\r\n+There are moments, psychologists tell us, when the passion for sin, or\r\n+for what the world calls sin, so dominates a nature that every fibre of\r\n+the body, as every cell of the brain, seems to be instinct with fearful\r\n+impulses. Men and women at such moments lose the freedom of their\r\n+will. They move to their terrible end as automatons move. Choice is\r\n+taken from them, and conscience is either killed, or, if it lives at\r\n+all, lives but to give rebellion its fascination and disobedience its\r\n+charm. For all sins, as theologians weary not of reminding us, are\r\n+sins of disobedience. When that high spirit, that morning star of\r\n+evil, fell from heaven, it was as a rebel that he fell.\r\n+\r\n+Callous, concentrated on evil, with stained mind, and soul hungry for\r\n+rebellion, Dorian Gray hastened on, quickening his step as he went, but\r\n+as he darted aside into a dim archway, that had served him often as a\r\n+short cut to the ill-famed place where he was going, he felt himself\r\n+suddenly seized from behind, and before he had time to defend himself,\r\n+he was thrust back against the wall, with a brutal hand round his\r\n+throat.\r\n+\r\n+He struggled madly for life, and by a terrible effort wrenched the\r\n+tightening fingers away. In a second he heard the click of a revolver,\r\n+and saw the gleam of a polished barrel, pointing straight at his head,\r\n+and the dusky form of a short, thick-set man facing him.\r\n+\r\n+\u0022What do you want?\u0022 he gasped.\r\n+\r\n+\u0022Keep quiet,\u0022 said the man. \u0022If you stir, I shoot you.\u0022\r\n+\r\n+\u0022You are mad. What have I done to you?\u0022\r\n+\r\n+\u0022You wrecked the life of Sibyl Vane,\u0022 was the answer, \u0022and Sibyl Vane\r\n+was my sister. She killed herself. I know it. Her death is at your\r\n+door. I swore I would kill you in return. For years I have sought\r\n+you. I had no clue, no trace. The two people who could have described\r\n+you were dead. I knew nothing of you but the pet name she used to call\r\n+you. I heard it to-night by chance. Make your peace with God, for\r\n+to-night you are going to die.\u0022\r\n+\r\n+Dorian Gray grew sick with fear. \u0022I never knew her,\u0022 he stammered. \u0022I\r\n+never heard of her. You are mad.\u0022\r\n+\r\n+\u0022You had better confess your sin, for as sure as I am James Vane, you\r\n+are going to die.\u0022 There was a horrible moment. Dorian did not know\r\n+what to say or do. \u0022Down on your knees!\u0022 growled the man. \u0022I give you\r\n+one minute to make your peace--no more. I go on board to-night for\r\n+India, and I must do my job first. One minute. That's all.\u0022\r\n+\r\n+Dorian's arms fell to his side. Paralysed with terror, he did not know\r\n+what to do. Suddenly a wild hope flashed across his brain. \u0022Stop,\u0022 he\r\n+cried. \u0022How long ago is it since your sister died? Quick, tell me!\u0022\r\n+\r\n+\u0022Eighteen years,\u0022 said the man. \u0022Why do you ask me? What do years\r\n+matter?\u0022\r\n+\r\n+\u0022Eighteen years,\u0022 laughed Dorian Gray, with a touch of triumph in his\r\n+voice. \u0022Eighteen years! Set me under the lamp and look at my face!\u0022\r\n+\r\n+James Vane hesitated for a moment, not understanding what was meant.\r\n+Then he seized Dorian Gray and dragged him from the archway.\r\n+\r\n+Dim and wavering as was the wind-blown light, yet it served to show him\r\n+the hideous error, as it seemed, into which he had fallen, for the face\r\n+of the man he had sought to kill had all the bloom of boyhood, all the\r\n+unstained purity of youth. He seemed little more than a lad of twenty\r\n+summers, hardly older, if older indeed at all, than his sister had been\r\n+when they had parted so many years ago. It was obvious that this was\r\n+not the man who had destroyed her life.\r\n+\r\n+He loosened his hold and reeled back. \u0022My God! my God!\u0022 he cried, \u0022and\r\n+I would have murdered you!\u0022\r\n+\r\n+Dorian Gray drew a long breath. \u0022You have been on the brink of\r\n+committing a terrible crime, my man,\u0022 he said, looking at him sternly.\r\n+\u0022Let this be a warning to you not to take vengeance into your own\r\n+hands.\u0022\r\n+\r\n+\u0022Forgive me, sir,\u0022 muttered James Vane. \u0022I was deceived. A chance\r\n+word I heard in that damned den set me on the wrong track.\u0022\r\n+\r\n+\u0022You had better go home and put that pistol away, or you may get into\r\n+trouble,\u0022 said Dorian, turning on his heel and going slowly down the\r\n+street.\r\n+\r\n+James Vane stood on the pavement in horror. He was trembling from head\r\n+to foot. After a little while, a black shadow that had been creeping\r\n+along the dripping wall moved out into the light and came close to him\r\n+with stealthy footsteps. He felt a hand laid on his arm and looked\r\n+round with a start. It was one of the women who had been drinking at\r\n+the bar.\r\n+\r\n+\u0022Why didn't you kill him?\u0022 she hissed out, putting haggard face quite\r\n+close to his. \u0022I knew you were following him when you rushed out from\r\n+Daly's. You fool! You should have killed him. He has lots of money,\r\n+and he's as bad as bad.\u0022\r\n+\r\n+\u0022He is not the man I am looking for,\u0022 he answered, \u0022and I want no man's\r\n+money. I want a man's life. The man whose life I want must be nearly\r\n+forty now. This one is little more than a boy. Thank God, I have not\r\n+got his blood upon my hands.\u0022\r\n+\r\n+The woman gave a bitter laugh. \u0022Little more than a boy!\u0022 she sneered.\r\n+\u0022Why, man, it's nigh on eighteen years since Prince Charming made me\r\n+what I am.\u0022\r\n+\r\n+\u0022You lie!\u0022 cried James Vane.\r\n+\r\n+She raised her hand up to heaven. \u0022Before God I am telling the truth,\u0022\r\n+she cried.\r\n+\r\n+\u0022Before God?\u0022\r\n+\r\n+\u0022Strike me dumb if it ain't so. He is the worst one that comes here.\r\n+They say he has sold himself to the devil for a pretty face. It's nigh\r\n+on eighteen years since I met him. He hasn't changed much since then.\r\n+I have, though,\u0022 she added, with a sickly leer.\r\n+\r\n+\u0022You swear this?\u0022\r\n+\r\n+\u0022I swear it,\u0022 came in hoarse echo from her flat mouth. \u0022But don't give\r\n+me away to him,\u0022 she whined; \u0022I am afraid of him. Let me have some\r\n+money for my night's lodging.\u0022\r\n+\r\n+He broke from her with an oath and rushed to the corner of the street,\r\n+but Dorian Gray had disappeared. When he looked back, the woman had\r\n+vanished also.\r\n+\r\n+\r\n+\r\n+CHAPTER 17\r\n+\r\n+A week later Dorian Gray was sitting in the conservatory at Selby\r\n+Royal, talking to the pretty Duchess of Monmouth, who with her husband,\r\n+a jaded-looking man of sixty, was amongst his guests. It was tea-time,\r\n+and the mellow light of the huge, lace-covered lamp that stood on the\r\n+table lit up the delicate china and hammered silver of the service at\r\n+which the duchess was presiding. Her white hands were moving daintily\r\n+among the cups, and her full red lips were smiling at something that\r\n+Dorian had whispered to her. Lord Henry was lying back in a\r\n+silk-draped wicker chair, looking at them. On a peach-coloured divan\r\n+sat Lady Narborough, pretending to listen to the duke's description of\r\n+the last Brazilian beetle that he had added to his collection. Three\r\n+young men in elaborate smoking-suits were handing tea-cakes to some of\r\n+the women. The house-party consisted of twelve people, and there were\r\n+more expected to arrive on the next day.\r\n+\r\n+\u0022What are you two talking about?\u0022 said Lord Henry, strolling over to\r\n+the table and putting his cup down. \u0022I hope Dorian has told you about\r\n+my plan for rechristening everything, Gladys. It is a delightful idea.\u0022\r\n+\r\n+\u0022But I don't want to be rechristened, Harry,\u0022 rejoined the duchess,\r\n+looking up at him with her wonderful eyes. \u0022I am quite satisfied with\r\n+my own name, and I am sure Mr. Gray should be satisfied with his.\u0022\r\n+\r\n+\u0022My dear Gladys, I would not alter either name for the world. They are\r\n+both perfect. I was thinking chiefly of flowers. Yesterday I cut an\r\n+orchid, for my button-hole. It was a marvellous spotted thing, as\r\n+effective as the seven deadly sins. In a thoughtless moment I asked\r\n+one of the gardeners what it was called. He told me it was a fine\r\n+specimen of _Robinsoniana_, or something dreadful of that kind. It is a\r\n+sad truth, but we have lost the faculty of giving lovely names to\r\n+things. Names are everything. I never quarrel with actions. My one\r\n+quarrel is with words. That is the reason I hate vulgar realism in\r\n+literature. The man who could call a spade a spade should be compelled\r\n+to use one. It is the only thing he is fit for.\u0022\r\n+\r\n+\u0022Then what should we call you, Harry?\u0022 she asked.\r\n+\r\n+\u0022His name is Prince Paradox,\u0022 said Dorian.\r\n+\r\n+\u0022I recognize him in a flash,\u0022 exclaimed the duchess.\r\n+\r\n+\u0022I won't hear of it,\u0022 laughed Lord Henry, sinking into a chair. \u0022From\r\n+a label there is no escape! I refuse the title.\u0022\r\n+\r\n+\u0022Royalties may not abdicate,\u0022 fell as a warning from pretty lips.\r\n+\r\n+\u0022You wish me to defend my throne, then?\u0022\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022I give the truths of to-morrow.\u0022\r\n+\r\n+\u0022I prefer the mistakes of to-day,\u0022 she answered.\r\n+\r\n+\u0022You disarm me, Gladys,\u0022 he cried, catching the wilfulness of her mood.\r\n+\r\n+\u0022Of your shield, Harry, not of your spear.\u0022\r\n+\r\n+\u0022I never tilt against beauty,\u0022 he said, with a wave of his hand.\r\n+\r\n+\u0022That is your error, Harry, believe me. You value beauty far too much.\u0022\r\n+\r\n+\u0022How can you say that? I admit that I think that it is better to be\r\n+beautiful than to be good. But on the other hand, no one is more ready\r\n+than I am to acknowledge that it is better to be good than to be ugly.\u0022\r\n+\r\n+\u0022Ugliness is one of the seven deadly sins, then?\u0022 cried the duchess.\r\n+\u0022What becomes of your simile about the orchid?\u0022\r\n+\r\n+\u0022Ugliness is one of the seven deadly virtues, Gladys. You, as a good\r\n+Tory, must not underrate them. Beer, the Bible, and the seven deadly\r\n+virtues have made our England what she is.\u0022\r\n+\r\n+\u0022You don't like your country, then?\u0022 she asked.\r\n+\r\n+\u0022I live in it.\u0022\r\n+\r\n+\u0022That you may censure it the better.\u0022\r\n+\r\n+\u0022Would you have me take the verdict of Europe on it?\u0022 he inquired.\r\n+\r\n+\u0022What do they say of us?\u0022\r\n+\r\n+\u0022That Tartuffe has emigrated to England and opened a shop.\u0022\r\n+\r\n+\u0022Is that yours, Harry?\u0022\r\n+\r\n+\u0022I give it to you.\u0022\r\n+\r\n+\u0022I could not use it. It is too true.\u0022\r\n+\r\n+\u0022You need not be afraid. Our countrymen never recognize a description.\u0022\r\n+\r\n+\u0022They are practical.\u0022\r\n+\r\n+\u0022They are more cunning than practical. When they make up their ledger,\r\n+they balance stupidity by wealth, and vice by hypocrisy.\u0022\r\n+\r\n+\u0022Still, we have done great things.\u0022\r\n+\r\n+\u0022Great things have been thrust on us, Gladys.\u0022\r\n+\r\n+\u0022We have carried their burden.\u0022\r\n+\r\n+\u0022Only as far as the Stock Exchange.\u0022\r\n+\r\n+She shook her head. \u0022I believe in the race,\u0022 she cried.\r\n+\r\n+\u0022It represents the survival of the pushing.\u0022\r\n+\r\n+\u0022It has development.\u0022\r\n+\r\n+\u0022Decay fascinates me more.\u0022\r\n+\r\n+\u0022What of art?\u0022 she asked.\r\n+\r\n+\u0022It is a malady.\u0022\r\n+\r\n+\u0022Love?\u0022\r\n+\r\n+\u0022An illusion.\u0022\r\n+\r\n+\u0022Religion?\u0022\r\n+\r\n+\u0022The fashionable substitute for belief.\u0022\r\n+\r\n+\u0022You are a sceptic.\u0022\r\n+\r\n+\u0022Never! Scepticism is the beginning of faith.\u0022\r\n+\r\n+\u0022What are you?\u0022\r\n+\r\n+\u0022To define is to limit.\u0022\r\n+\r\n+\u0022Give me a clue.\u0022\r\n+\r\n+\u0022Threads snap. You would lose your way in the labyrinth.\u0022\r\n+\r\n+\u0022You bewilder me. Let us talk of some one else.\u0022\r\n+\r\n+\u0022Our host is a delightful topic. Years ago he was christened Prince\r\n+Charming.\u0022\r\n+\r\n+\u0022Ah! don't remind me of that,\u0022 cried Dorian Gray.\r\n+\r\n+\u0022Our host is rather horrid this evening,\u0022 answered the duchess,\r\n+colouring. \u0022I believe he thinks that Monmouth married me on purely\r\n+scientific principles as the best specimen he could find of a modern\r\n+butterfly.\u0022\r\n+\r\n+\u0022Well, I hope he won't stick pins into you, Duchess,\u0022 laughed Dorian.\r\n+\r\n+\u0022Oh! my maid does that already, Mr. Gray, when she is annoyed with me.\u0022\r\n+\r\n+\u0022And what does she get annoyed with you about, Duchess?\u0022\r\n+\r\n+\u0022For the most trivial things, Mr. Gray, I assure you. Usually because\r\n+I come in at ten minutes to nine and tell her that I must be dressed by\r\n+half-past eight.\u0022\r\n+\r\n+\u0022How unreasonable of her! You should give her warning.\u0022\r\n+\r\n+\u0022I daren't, Mr. Gray. Why, she invents hats for me. You remember the\r\n+one I wore at Lady Hilstone's garden-party? You don't, but it is nice\r\n+of you to pretend that you do. Well, she made it out of nothing. All\r\n+good hats are made out of nothing.\u0022\r\n+\r\n+\u0022Like all good reputations, Gladys,\u0022 interrupted Lord Henry. \u0022Every\r\n+effect that one produces gives one an enemy. To be popular one must be\r\n+a mediocrity.\u0022\r\n+\r\n+\u0022Not with women,\u0022 said the duchess, shaking her head; \u0022and women rule\r\n+the world. I assure you we can't bear mediocrities. We women, as some\r\n+one says, love with our ears, just as you men love with your eyes, if\r\n+you ever love at all.\u0022\r\n+\r\n+\u0022It seems to me that we never do anything else,\u0022 murmured Dorian.\r\n+\r\n+\u0022Ah! then, you never really love, Mr. Gray,\u0022 answered the duchess with\r\n+mock sadness.\r\n+\r\n+\u0022My dear Gladys!\u0022 cried Lord Henry. \u0022How can you say that? Romance\r\n+lives by repetition, and repetition converts an appetite into an art.\r\n+Besides, each time that one loves is the only time one has ever loved.\r\n+Difference of object does not alter singleness of passion. It merely\r\n+intensifies it. We can have in life but one great experience at best,\r\n+and the secret of life is to reproduce that experience as often as\r\n+possible.\u0022\r\n+\r\n+\u0022Even when one has been wounded by it, Harry?\u0022 asked the duchess after\r\n+a pause.\r\n+\r\n+\u0022Especially when one has been wounded by it,\u0022 answered Lord Henry.\r\n+\r\n+The duchess turned and looked at Dorian Gray with a curious expression\r\n+in her eyes. \u0022What do you say to that, Mr. Gray?\u0022 she inquired.\r\n+\r\n+Dorian hesitated for a moment. Then he threw his head back and\r\n+laughed. \u0022I always agree with Harry, Duchess.\u0022\r\n+\r\n+\u0022Even when he is wrong?\u0022\r\n+\r\n+\u0022Harry is never wrong, Duchess.\u0022\r\n+\r\n+\u0022And does his philosophy make you happy?\u0022\r\n+\r\n+\u0022I have never searched for happiness. Who wants happiness? I have\r\n+searched for pleasure.\u0022\r\n+\r\n+\u0022And found it, Mr. Gray?\u0022\r\n+\r\n+\u0022Often. Too often.\u0022\r\n+\r\n+The duchess sighed. \u0022I am searching for peace,\u0022 she said, \u0022and if I\r\n+don't go and dress, I shall have none this evening.\u0022\r\n+\r\n+\u0022Let me get you some orchids, Duchess,\u0022 cried Dorian, starting to his\r\n+feet and walking down the conservatory.\r\n+\r\n+\u0022You are flirting disgracefully with him,\u0022 said Lord Henry to his\r\n+cousin. \u0022You had better take care. He is very fascinating.\u0022\r\n+\r\n+\u0022If he were not, there would be no battle.\u0022\r\n+\r\n+\u0022Greek meets Greek, then?\u0022\r\n+\r\n+\u0022I am on the side of the Trojans. They fought for a woman.\u0022\r\n+\r\n+\u0022They were defeated.\u0022\r\n+\r\n+\u0022There are worse things than capture,\u0022 she answered.\r\n+\r\n+\u0022You gallop with a loose rein.\u0022\r\n+\r\n+\u0022Pace gives life,\u0022 was the _riposte_.\r\n+\r\n+\u0022I shall write it in my diary to-night.\u0022\r\n+\r\n+\u0022What?\u0022\r\n+\r\n+\u0022That a burnt child loves the fire.\u0022\r\n+\r\n+\u0022I am not even singed. My wings are untouched.\u0022\r\n+\r\n+\u0022You use them for everything, except flight.\u0022\r\n+\r\n+\u0022Courage has passed from men to women. It is a new experience for us.\u0022\r\n+\r\n+\u0022You have a rival.\u0022\r\n+\r\n+\u0022Who?\u0022\r\n+\r\n+He laughed. \u0022Lady Narborough,\u0022 he whispered. \u0022She perfectly adores\r\n+him.\u0022\r\n+\r\n+\u0022You fill me with apprehension. The appeal to antiquity is fatal to us\r\n+who are romanticists.\u0022\r\n+\r\n+\u0022Romanticists! You have all the methods of science.\u0022\r\n+\r\n+\u0022Men have educated us.\u0022\r\n+\r\n+\u0022But not explained you.\u0022\r\n+\r\n+\u0022Describe us as a sex,\u0022 was her challenge.\r\n+\r\n+\u0022Sphinxes without secrets.\u0022\r\n+\r\n+She looked at him, smiling. \u0022How long Mr. Gray is!\u0022 she said. \u0022Let us\r\n+go and help him. I have not yet told him the colour of my frock.\u0022\r\n+\r\n+\u0022Ah! you must suit your frock to his flowers, Gladys.\u0022\r\n+\r\n+\u0022That would be a premature surrender.\u0022\r\n+\r\n+\u0022Romantic art begins with its climax.\u0022\r\n+\r\n+\u0022I must keep an opportunity for retreat.\u0022\r\n+\r\n+\u0022In the Parthian manner?\u0022\r\n+\r\n+\u0022They found safety in the desert. I could not do that.\u0022\r\n+\r\n+\u0022Women are not always allowed a choice,\u0022 he answered, but hardly had he\r\n+finished the sentence before from the far end of the conservatory came\r\n+a stifled groan, followed by the dull sound of a heavy fall. Everybody\r\n+started up. The duchess stood motionless in horror. And with fear in\r\n+his eyes, Lord Henry rushed through the flapping palms to find Dorian\r\n+Gray lying face downwards on the tiled floor in a deathlike swoon.\r\n+\r\n+He was carried at once into the blue drawing-room and laid upon one of\r\n+the sofas. After a short time, he came to himself and looked round\r\n+with a dazed expression.\r\n+\r\n+\u0022What has happened?\u0022 he asked. \u0022Oh! I remember. Am I safe here,\r\n+Harry?\u0022 He began to tremble.\r\n+\r\n+\u0022My dear Dorian,\u0022 answered Lord Henry, \u0022you merely fainted. That was\r\n+all. You must have overtired yourself. You had better not come down\r\n+to dinner. I will take your place.\u0022\r\n+\r\n+\u0022No, I will come down,\u0022 he said, struggling to his feet. \u0022I would\r\n+rather come down. I must not be alone.\u0022\r\n+\r\n+He went to his room and dressed. There was a wild recklessness of\r\n+gaiety in his manner as he sat at table, but now and then a thrill of\r\n+terror ran through him when he remembered that, pressed against the\r\n+window of the conservatory, like a white handkerchief, he had seen the\r\n+face of James Vane watching him.\r\n+\r\n+\r\n+\r\n+CHAPTER 18\r\n+\r\n+The next day he did not leave the house, and, indeed, spent most of the\r\n+time in his own room, sick with a wild terror of dying, and yet\r\n+indifferent to life itself. The consciousness of being hunted, snared,\r\n+tracked down, had begun to dominate him. If the tapestry did but\r\n+tremble in the wind, he shook. The dead leaves that were blown against\r\n+the leaded panes seemed to him like his own wasted resolutions and wild\r\n+regrets. When he closed his eyes, he saw again the sailor's face\r\n+peering through the mist-stained glass, and horror seemed once more to\r\n+lay its hand upon his heart.\r\n+\r\n+But perhaps it had been only his fancy that had called vengeance out of\r\n+the night and set the hideous shapes of punishment before him. Actual\r\n+life was chaos, but there was something terribly logical in the\r\n+imagination. It was the imagination that set remorse to dog the feet\r\n+of sin. It was the imagination that made each crime bear its misshapen\r\n+brood. In the common world of fact the wicked were not punished, nor\r\n+the good rewarded. Success was given to the strong, failure thrust\r\n+upon the weak. That was all. Besides, had any stranger been prowling\r\n+round the house, he would have been seen by the servants or the\r\n+keepers. Had any foot-marks been found on the flower-beds, the\r\n+gardeners would have reported it. Yes, it had been merely fancy.\r\n+Sibyl Vane's brother had not come back to kill him. He had sailed away\r\n+in his ship to founder in some winter sea. From him, at any rate, he\r\n+was safe. Why, the man did not know who he was, could not know who he\r\n+was. The mask of youth had saved him.\r\n+\r\n+And yet if it had been merely an illusion, how terrible it was to think\r\n+that conscience could raise such fearful phantoms, and give them\r\n+visible form, and make them move before one! What sort of life would\r\n+his be if, day and night, shadows of his crime were to peer at him from\r\n+silent corners, to mock him from secret places, to whisper in his ear\r\n+as he sat at the feast, to wake him with icy fingers as he lay asleep!\r\n+As the thought crept through his brain, he grew pale with terror, and\r\n+the air seemed to him to have become suddenly colder. Oh! in what a\r\n+wild hour of madness he had killed his friend! How ghastly the mere\r\n+memory of the scene! He saw it all again. Each hideous detail came\r\n+back to him with added horror. Out of the black cave of time, terrible\r\n+and swathed in scarlet, rose the image of his sin. When Lord Henry\r\n+came in at six o'clock, he found him crying as one whose heart will\r\n+break.\r\n+\r\n+It was not till the third day that he ventured to go out. There was\r\n+something in the clear, pine-scented air of that winter morning that\r\n+seemed to bring him back his joyousness and his ardour for life. But\r\n+it was not merely the physical conditions of environment that had\r\n+caused the change. His own nature had revolted against the excess of\r\n+anguish that had sought to maim and mar the perfection of its calm.\r\n+With subtle and finely wrought temperaments it is always so. Their\r\n+strong passions must either bruise or bend. They either slay the man,\r\n+or themselves die. Shallow sorrows and shallow loves live on. The\r\n+loves and sorrows that are great are destroyed by their own plenitude.\r\n+Besides, he had convinced himself that he had been the victim of a\r\n+terror-stricken imagination, and looked back now on his fears with\r\n+something of pity and not a little of contempt.\r\n+\r\n+After breakfast, he walked with the duchess for an hour in the garden\r\n+and then drove across the park to join the shooting-party. The crisp\r\n+frost lay like salt upon the grass. The sky was an inverted cup of\r\n+blue metal. A thin film of ice bordered the flat, reed-grown lake.\r\n+\r\n+At the corner of the pine-wood he caught sight of Sir Geoffrey\r\n+Clouston, the duchess's brother, jerking two spent cartridges out of\r\n+his gun. He jumped from the cart, and having told the groom to take\r\n+the mare home, made his way towards his guest through the withered\r\n+bracken and rough undergrowth.\r\n+\r\n+\u0022Have you had good sport, Geoffrey?\u0022 he asked.\r\n+\r\n+\u0022Not very good, Dorian. I think most of the birds have gone to the\r\n+open. I dare say it will be better after lunch, when we get to new\r\n+ground.\u0022\r\n+\r\n+Dorian strolled along by his side. The keen aromatic air, the brown\r\n+and red lights that glimmered in the wood, the hoarse cries of the\r\n+beaters ringing out from time to time, and the sharp snaps of the guns\r\n+that followed, fascinated him and filled him with a sense of delightful\r\n+freedom. He was dominated by the carelessness of happiness, by the\r\n+high indifference of joy.\r\n+\r\n+Suddenly from a lumpy tussock of old grass some twenty yards in front\r\n+of them, with black-tipped ears erect and long hinder limbs throwing it\r\n+forward, started a hare. It bolted for a thicket of alders. Sir\r\n+Geoffrey put his gun to his shoulder, but there was something in the\r\n+animal's grace of movement that strangely charmed Dorian Gray, and he\r\n+cried out at once, \u0022Don't shoot it, Geoffrey. Let it live.\u0022\r\n+\r\n+\u0022What nonsense, Dorian!\u0022 laughed his companion, and as the hare bounded\r\n+into the thicket, he fired. There were two cries heard, the cry of a\r\n+hare in pain, which is dreadful, the cry of a man in agony, which is\r\n+worse.\r\n+\r\n+\u0022Good heavens! I have hit a beater!\u0022 exclaimed Sir Geoffrey. \u0022What an\r\n+ass the man was to get in front of the guns! Stop shooting there!\u0022 he\r\n+called out at the top of his voice. \u0022A man is hurt.\u0022\r\n+\r\n+The head-keeper came running up with a stick in his hand.\r\n+\r\n+\u0022Where, sir? Where is he?\u0022 he shouted. At the same time, the firing\r\n+ceased along the line.\r\n+\r\n+\u0022Here,\u0022 answered Sir Geoffrey angrily, hurrying towards the thicket.\r\n+\u0022Why on earth don't you keep your men back? Spoiled my shooting for\r\n+the day.\u0022\r\n+\r\n+Dorian watched them as they plunged into the alder-clump, brushing the\r\n+lithe swinging branches aside. In a few moments they emerged, dragging\r\n+a body after them into the sunlight. He turned away in horror. It\r\n+seemed to him that misfortune followed wherever he went. He heard Sir\r\n+Geoffrey ask if the man was really dead, and the affirmative answer of\r\n+the keeper. The wood seemed to him to have become suddenly alive with\r\n+faces. There was the trampling of myriad feet and the low buzz of\r\n+voices. A great copper-breasted pheasant came beating through the\r\n+boughs overhead.\r\n+\r\n+After a few moments--that were to him, in his perturbed state, like\r\n+endless hours of pain--he felt a hand laid on his shoulder. He started\r\n+and looked round.\r\n+\r\n+\u0022Dorian,\u0022 said Lord Henry, \u0022I had better tell them that the shooting is\r\n+stopped for to-day. It would not look well to go on.\u0022\r\n+\r\n+\u0022I wish it were stopped for ever, Harry,\u0022 he answered bitterly. \u0022The\r\n+whole thing is hideous and cruel. Is the man ...?\u0022\r\n+\r\n+He could not finish the sentence.\r\n+\r\n+\u0022I am afraid so,\u0022 rejoined Lord Henry. \u0022He got the whole charge of\r\n+shot in his chest. He must have died almost instantaneously. Come;\r\n+let us go home.\u0022\r\n+\r\n+They walked side by side in the direction of the avenue for nearly\r\n+fifty yards without speaking. Then Dorian looked at Lord Henry and\r\n+said, with a heavy sigh, \u0022It is a bad omen, Harry, a very bad omen.\u0022\r\n+\r\n+\u0022What is?\u0022 asked Lord Henry. \u0022Oh! this accident, I suppose. My dear\r\n+fellow, it can't be helped. It was the man's own fault. Why did he\r\n+get in front of the guns? Besides, it is nothing to us. It is rather\r\n+awkward for Geoffrey, of course. It does not do to pepper beaters. It\r\n+makes people think that one is a wild shot. And Geoffrey is not; he\r\n+shoots very straight. But there is no use talking about the matter.\u0022\r\n+\r\n+Dorian shook his head. \u0022It is a bad omen, Harry. I feel as if\r\n+something horrible were going to happen to some of us. To myself,\r\n+perhaps,\u0022 he added, passing his hand over his eyes, with a gesture of\r\n+pain.\r\n+\r\n+The elder man laughed. \u0022The only horrible thing in the world is _ennui_,\r\n+Dorian. That is the one sin for which there is no forgiveness. But we\r\n+are not likely to suffer from it unless these fellows keep chattering\r\n+about this thing at dinner. I must tell them that the subject is to be\r\n+tabooed. As for omens, there is no such thing as an omen. Destiny\r\n+does not send us heralds. She is too wise or too cruel for that.\r\n+Besides, what on earth could happen to you, Dorian? You have\r\n+everything in the world that a man can want. There is no one who would\r\n+not be delighted to change places with you.\u0022\r\n+\r\n+\u0022There is no one with whom I would not change places, Harry. Don't\r\n+laugh like that. I am telling you the truth. The wretched peasant who\r\n+has just died is better off than I am. I have no terror of death. It\r\n+is the coming of death that terrifies me. Its monstrous wings seem to\r\n+wheel in the leaden air around me. Good heavens! don't you see a man\r\n+moving behind the trees there, watching me, waiting for me?\u0022\r\n+\r\n+Lord Henry looked in the direction in which the trembling gloved hand\r\n+was pointing. \u0022Yes,\u0022 he said, smiling, \u0022I see the gardener waiting for\r\n+you. I suppose he wants to ask you what flowers you wish to have on\r\n+the table to-night. How absurdly nervous you are, my dear fellow! You\r\n+must come and see my doctor, when we get back to town.\u0022\r\n+\r\n+Dorian heaved a sigh of relief as he saw the gardener approaching. The\r\n+man touched his hat, glanced for a moment at Lord Henry in a hesitating\r\n+manner, and then produced a letter, which he handed to his master.\r\n+\u0022Her Grace told me to wait for an answer,\u0022 he murmured.\r\n+\r\n+Dorian put the letter into his pocket. \u0022Tell her Grace that I am\r\n+coming in,\u0022 he said, coldly. The man turned round and went rapidly in\r\n+the direction of the house.\r\n+\r\n+\u0022How fond women are of doing dangerous things!\u0022 laughed Lord Henry.\r\n+\u0022It is one of the qualities in them that I admire most. A woman will\r\n+flirt with anybody in the world as long as other people are looking on.\u0022\r\n+\r\n+\u0022How fond you are of saying dangerous things, Harry! In the present\r\n+instance, you are quite astray. I like the duchess very much, but I\r\n+don't love her.\u0022\r\n+\r\n+\u0022And the duchess loves you very much, but she likes you less, so you\r\n+are excellently matched.\u0022\r\n+\r\n+\u0022You are talking scandal, Harry, and there is never any basis for\r\n+scandal.\u0022\r\n+\r\n+\u0022The basis of every scandal is an immoral certainty,\u0022 said Lord Henry,\r\n+lighting a cigarette.\r\n+\r\n+\u0022You would sacrifice anybody, Harry, for the sake of an epigram.\u0022\r\n+\r\n+\u0022The world goes to the altar of its own accord,\u0022 was the answer.\r\n+\r\n+\u0022I wish I could love,\u0022 cried Dorian Gray with a deep note of pathos in\r\n+his voice. \u0022But I seem to have lost the passion and forgotten the\r\n+desire. I am too much concentrated on myself. My own personality has\r\n+become a burden to me. I want to escape, to go away, to forget. It\r\n+was silly of me to come down here at all. I think I shall send a wire\r\n+to Harvey to have the yacht got ready. On a yacht one is safe.\u0022\r\n+\r\n+\u0022Safe from what, Dorian? You are in some trouble. Why not tell me\r\n+what it is? You know I would help you.\u0022\r\n+\r\n+\u0022I can't tell you, Harry,\u0022 he answered sadly. \u0022And I dare say it is\r\n+only a fancy of mine. This unfortunate accident has upset me. I have\r\n+a horrible presentiment that something of the kind may happen to me.\u0022\r\n+\r\n+\u0022What nonsense!\u0022\r\n+\r\n+\u0022I hope it is, but I can't help feeling it. Ah! here is the duchess,\r\n+looking like Artemis in a tailor-made gown. You see we have come back,\r\n+Duchess.\u0022\r\n+\r\n+\u0022I have heard all about it, Mr. Gray,\u0022 she answered. \u0022Poor Geoffrey is\r\n+terribly upset. And it seems that you asked him not to shoot the hare.\r\n+How curious!\u0022\r\n+\r\n+\u0022Yes, it was very curious. I don't know what made me say it. Some\r\n+whim, I suppose. It looked the loveliest of little live things. But I\r\n+am sorry they told you about the man. It is a hideous subject.\u0022\r\n+\r\n+\u0022It is an annoying subject,\u0022 broke in Lord Henry. \u0022It has no\r\n+psychological value at all. Now if Geoffrey had done the thing on\r\n+purpose, how interesting he would be! I should like to know some one\r\n+who had committed a real murder.\u0022\r\n+\r\n+\u0022How horrid of you, Harry!\u0022 cried the duchess. \u0022Isn't it, Mr. Gray?\r\n+Harry, Mr. Gray is ill again. He is going to faint.\u0022\r\n+\r\n+Dorian drew himself up with an effort and smiled. \u0022It is nothing,\r\n+Duchess,\u0022 he murmured; \u0022my nerves are dreadfully out of order. That is\r\n+all. I am afraid I walked too far this morning. I didn't hear what\r\n+Harry said. Was it very bad? You must tell me some other time. I\r\n+think I must go and lie down. You will excuse me, won't you?\u0022\r\n+\r\n+They had reached the great flight of steps that led from the\r\n+conservatory on to the terrace. As the glass door closed behind\r\n+Dorian, Lord Henry turned and looked at the duchess with his slumberous\r\n+eyes. \u0022Are you very much in love with him?\u0022 he asked.\r\n+\r\n+She did not answer for some time, but stood gazing at the landscape.\r\n+\u0022I wish I knew,\u0022 she said at last.\r\n+\r\n+He shook his head. \u0022Knowledge would be fatal. It is the uncertainty\r\n+that charms one. A mist makes things wonderful.\u0022\r\n+\r\n+\u0022One may lose one's way.\u0022\r\n+\r\n+\u0022All ways end at the same point, my dear Gladys.\u0022\r\n+\r\n+\u0022What is that?\u0022\r\n+\r\n+\u0022Disillusion.\u0022\r\n+\r\n+\u0022It was my _debut_ in life,\u0022 she sighed.\r\n+\r\n+\u0022It came to you crowned.\u0022\r\n+\r\n+\u0022I am tired of strawberry leaves.\u0022\r\n+\r\n+\u0022They become you.\u0022\r\n+\r\n+\u0022Only in public.\u0022\r\n+\r\n+\u0022You would miss them,\u0022 said Lord Henry.\r\n+\r\n+\u0022I will not part with a petal.\u0022\r\n+\r\n+\u0022Monmouth has ears.\u0022\r\n+\r\n+\u0022Old age is dull of hearing.\u0022\r\n+\r\n+\u0022Has he never been jealous?\u0022\r\n+\r\n+\u0022I wish he had been.\u0022\r\n+\r\n+He glanced about as if in search of something. \u0022What are you looking\r\n+for?\u0022 she inquired.\r\n+\r\n+\u0022The button from your foil,\u0022 he answered. \u0022You have dropped it.\u0022\r\n+\r\n+She laughed. \u0022I have still the mask.\u0022\r\n+\r\n+\u0022It makes your eyes lovelier,\u0022 was his reply.\r\n+\r\n+She laughed again. Her teeth showed like white seeds in a scarlet\r\n+fruit.\r\n+\r\n+Upstairs, in his own room, Dorian Gray was lying on a sofa, with terror\r\n+in every tingling fibre of his body. Life had suddenly become too\r\n+hideous a burden for him to bear. The dreadful death of the unlucky\r\n+beater, shot in the thicket like a wild animal, had seemed to him to\r\n+pre-figure death for himself also. He had nearly swooned at what Lord\r\n+Henry had said in a chance mood of cynical jesting.\r\n+\r\n+At five o'clock he rang his bell for his servant and gave him orders to\r\n+pack his things for the night-express to town, and to have the brougham\r\n+at the door by eight-thirty. He was determined not to sleep another\r\n+night at Selby Royal. It was an ill-omened place. Death walked there\r\n+in the sunlight. The grass of the forest had been spotted with blood.\r\n+\r\n+Then he wrote a note to Lord Henry, telling him that he was going up to\r\n+town to consult his doctor and asking him to entertain his guests in\r\n+his absence. As he was putting it into the envelope, a knock came to\r\n+the door, and his valet informed him that the head-keeper wished to see\r\n+him. He frowned and bit his lip. \u0022Send him in,\u0022 he muttered, after\r\n+some moments' hesitation.\r\n+\r\n+As soon as the man entered, Dorian pulled his chequebook out of a\r\n+drawer and spread it out before him.\r\n+\r\n+\u0022I suppose you have come about the unfortunate accident of this\r\n+morning, Thornton?\u0022 he said, taking up a pen.\r\n+\r\n+\u0022Yes, sir,\u0022 answered the gamekeeper.\r\n+\r\n+\u0022Was the poor fellow married? Had he any people dependent on him?\u0022\r\n+asked Dorian, looking bored. \u0022If so, I should not like them to be left\r\n+in want, and will send them any sum of money you may think necessary.\u0022\r\n+\r\n+\u0022We don't know who he is, sir. That is what I took the liberty of\r\n+coming to you about.\u0022\r\n+\r\n+\u0022Don't know who he is?\u0022 said Dorian, listlessly. \u0022What do you mean?\r\n+Wasn't he one of your men?\u0022\r\n+\r\n+\u0022No, sir. Never saw him before. Seems like a sailor, sir.\u0022\r\n+\r\n+The pen dropped from Dorian Gray's hand, and he felt as if his heart\r\n+had suddenly stopped beating. \u0022A sailor?\u0022 he cried out. \u0022Did you say\r\n+a sailor?\u0022\r\n+\r\n+\u0022Yes, sir. He looks as if he had been a sort of sailor; tattooed on\r\n+both arms, and that kind of thing.\u0022\r\n+\r\n+\u0022Was there anything found on him?\u0022 said Dorian, leaning forward and\r\n+looking at the man with startled eyes. \u0022Anything that would tell his\r\n+name?\u0022\r\n+\r\n+\u0022Some money, sir--not much, and a six-shooter. There was no name of any\r\n+kind. A decent-looking man, sir, but rough-like. A sort of sailor we\r\n+think.\u0022\r\n+\r\n+Dorian started to his feet. A terrible hope fluttered past him. He\r\n+clutched at it madly. \u0022Where is the body?\u0022 he exclaimed. \u0022Quick! I\r\n+must see it at once.\u0022\r\n+\r\n+\u0022It is in an empty stable in the Home Farm, sir. The folk don't like\r\n+to have that sort of thing in their houses. They say a corpse brings\r\n+bad luck.\u0022\r\n+\r\n+\u0022The Home Farm! Go there at once and meet me. Tell one of the grooms\r\n+to bring my horse round. No. Never mind. I'll go to the stables\r\n+myself. It will save time.\u0022\r\n+\r\n+In less than a quarter of an hour, Dorian Gray was galloping down the\r\n+long avenue as hard as he could go. The trees seemed to sweep past him\r\n+in spectral procession, and wild shadows to fling themselves across his\r\n+path. Once the mare swerved at a white gate-post and nearly threw him.\r\n+He lashed her across the neck with his crop. She cleft the dusky air\r\n+like an arrow. The stones flew from her hoofs.\r\n+\r\n+At last he reached the Home Farm. Two men were loitering in the yard.\r\n+He leaped from the saddle and threw the reins to one of them. In the\r\n+farthest stable a light was glimmering. Something seemed to tell him\r\n+that the body was there, and he hurried to the door and put his hand\r\n+upon the latch.\r\n+\r\n+There he paused for a moment, feeling that he was on the brink of a\r\n+discovery that would either make or mar his life. Then he thrust the\r\n+door open and entered.\r\n+\r\n+On a heap of sacking in the far corner was lying the dead body of a man\r\n+dressed in a coarse shirt and a pair of blue trousers. A spotted\r\n+handkerchief had been placed over the face. A coarse candle, stuck in\r\n+a bottle, sputtered beside it.\r\n+\r\n+Dorian Gray shuddered. He felt that his could not be the hand to take\r\n+the handkerchief away, and called out to one of the farm-servants to\r\n+come to him.\r\n+\r\n+\u0022Take that thing off the face. I wish to see it,\u0022 he said, clutching\r\n+at the door-post for support.\r\n+\r\n+When the farm-servant had done so, he stepped forward. A cry of joy\r\n+broke from his lips. The man who had been shot in the thicket was\r\n+James Vane.\r\n+\r\n+He stood there for some minutes looking at the dead body. As he rode\r\n+home, his eyes were full of tears, for he knew he was safe.\r\n+\r\n+\r\n+\r\n+CHAPTER 19\r\n+\r\n+\u0022There is no use your telling me that you are going to be good,\u0022 cried\r\n+Lord Henry, dipping his white fingers into a red copper bowl filled\r\n+with rose-water. \u0022You are quite perfect. Pray, don't change.\u0022\r\n+\r\n+Dorian Gray shook his head. \u0022No, Harry, I have done too many dreadful\r\n+things in my life. I am not going to do any more. I began my good\r\n+actions yesterday.\u0022\r\n+\r\n+\u0022Where were you yesterday?\u0022\r\n+\r\n+\u0022In the country, Harry. I was staying at a little inn by myself.\u0022\r\n+\r\n+\u0022My dear boy,\u0022 said Lord Henry, smiling, \u0022anybody can be good in the\r\n+country. There are no temptations there. That is the reason why\r\n+people who live out of town are so absolutely uncivilized.\r\n+Civilization is not by any means an easy thing to attain to. There are\r\n+only two ways by which man can reach it. One is by being cultured, the\r\n+other by being corrupt. Country people have no opportunity of being\r\n+either, so they stagnate.\u0022\r\n+\r\n+\u0022Culture and corruption,\u0022 echoed Dorian. \u0022I have known something of\r\n+both. It seems terrible to me now that they should ever be found\r\n+together. For I have a new ideal, Harry. I am going to alter. I\r\n+think I have altered.\u0022\r\n+\r\n+\u0022You have not yet told me what your good action was. Or did you say\r\n+you had done more than one?\u0022 asked his companion as he spilled into his\r\n+plate a little crimson pyramid of seeded strawberries and, through a\r\n+perforated, shell-shaped spoon, snowed white sugar upon them.\r\n+\r\n+\u0022I can tell you, Harry. It is not a story I could tell to any one\r\n+else. I spared somebody. It sounds vain, but you understand what I\r\n+mean. She was quite beautiful and wonderfully like Sibyl Vane. I\r\n+think it was that which first attracted me to her. You remember Sibyl,\r\n+don't you? How long ago that seems! Well, Hetty was not one of our\r\n+own class, of course. She was simply a girl in a village. But I\r\n+really loved her. I am quite sure that I loved her. All during this\r\n+wonderful May that we have been having, I used to run down and see her\r\n+two or three times a week. Yesterday she met me in a little orchard.\r\n+The apple-blossoms kept tumbling down on her hair, and she was\r\n+laughing. We were to have gone away together this morning at dawn.\r\n+Suddenly I determined to leave her as flowerlike as I had found her.\u0022\r\n+\r\n+\u0022I should think the novelty of the emotion must have given you a thrill\r\n+of real pleasure, Dorian,\u0022 interrupted Lord Henry. \u0022But I can finish\r\n+your idyll for you. You gave her good advice and broke her heart.\r\n+That was the beginning of your reformation.\u0022\r\n+\r\n+\u0022Harry, you are horrible! You mustn't say these dreadful things.\r\n+Hetty's heart is not broken. Of course, she cried and all that. But\r\n+there is no disgrace upon her. She can live, like Perdita, in her\r\n+garden of mint and marigold.\u0022\r\n+\r\n+\u0022And weep over a faithless Florizel,\u0022 said Lord Henry, laughing, as he\r\n+leaned back in his chair. \u0022My dear Dorian, you have the most curiously\r\n+boyish moods. Do you think this girl will ever be really content now\r\n+with any one of her own rank? I suppose she will be married some day\r\n+to a rough carter or a grinning ploughman. Well, the fact of having\r\n+met you, and loved you, will teach her to despise her husband, and she\r\n+will be wretched. From a moral point of view, I cannot say that I\r\n+think much of your great renunciation. Even as a beginning, it is\r\n+poor. Besides, how do you know that Hetty isn't floating at the\r\n+present moment in some starlit mill-pond, with lovely water-lilies\r\n+round her, like Ophelia?\u0022\r\n+\r\n+\u0022I can't bear this, Harry! You mock at everything, and then suggest\r\n+the most serious tragedies. I am sorry I told you now. I don't care\r\n+what you say to me. I know I was right in acting as I did. Poor\r\n+Hetty! As I rode past the farm this morning, I saw her white face at\r\n+the window, like a spray of jasmine. Don't let us talk about it any\r\n+more, and don't try to persuade me that the first good action I have\r\n+done for years, the first little bit of self-sacrifice I have ever\r\n+known, is really a sort of sin. I want to be better. I am going to be\r\n+better. Tell me something about yourself. What is going on in town?\r\n+I have not been to the club for days.\u0022\r\n+\r\n+\u0022The people are still discussing poor Basil's disappearance.\u0022\r\n+\r\n+\u0022I should have thought they had got tired of that by this time,\u0022 said\r\n+Dorian, pouring himself out some wine and frowning slightly.\r\n+\r\n+\u0022My dear boy, they have only been talking about it for six weeks, and\r\n+the British public are really not equal to the mental strain of having\r\n+more than one topic every three months. They have been very fortunate\r\n+lately, however. They have had my own divorce-case and Alan Campbell's\r\n+suicide. Now they have got the mysterious disappearance of an artist.\r\n+Scotland Yard still insists that the man in the grey ulster who left\r\n+for Paris by the midnight train on the ninth of November was poor\r\n+Basil, and the French police declare that Basil never arrived in Paris\r\n+at all. I suppose in about a fortnight we shall be told that he has\r\n+been seen in San Francisco. It is an odd thing, but every one who\r\n+disappears is said to be seen at San Francisco. It must be a\r\n+delightful city, and possess all the attractions of the next world.\u0022\r\n+\r\n+\u0022What do you think has happened to Basil?\u0022 asked Dorian, holding up his\r\n+Burgundy against the light and wondering how it was that he could\r\n+discuss the matter so calmly.\r\n+\r\n+\u0022I have not the slightest idea. If Basil chooses to hide himself, it\r\n+is no business of mine. If he is dead, I don't want to think about\r\n+him. Death is the only thing that ever terrifies me. I hate it.\u0022\r\n+\r\n+\u0022Why?\u0022 said the younger man wearily.\r\n+\r\n+\u0022Because,\u0022 said Lord Henry, passing beneath his nostrils the gilt\r\n+trellis of an open vinaigrette box, \u0022one can survive everything\r\n+nowadays except that. Death and vulgarity are the only two facts in\r\n+the nineteenth century that one cannot explain away. Let us have our\r\n+coffee in the music-room, Dorian. You must play Chopin to me. The man\r\n+with whom my wife ran away played Chopin exquisitely. Poor Victoria!\r\n+I was very fond of her. The house is rather lonely without her. Of\r\n+course, married life is merely a habit, a bad habit. But then one\r\n+regrets the loss even of one's worst habits. Perhaps one regrets them\r\n+the most. They are such an essential part of one's personality.\u0022\r\n+\r\n+Dorian said nothing, but rose from the table, and passing into the next\r\n+room, sat down to the piano and let his fingers stray across the white\r\n+and black ivory of the keys. After the coffee had been brought in, he\r\n+stopped, and looking over at Lord Henry, said, \u0022Harry, did it ever\r\n+occur to you that Basil was murdered?\u0022\r\n+\r\n+Lord Henry yawned. \u0022Basil was very popular, and always wore a\r\n+Waterbury watch. Why should he have been murdered? He was not clever\r\n+enough to have enemies. Of course, he had a wonderful genius for\r\n+painting. But a man can paint like Velasquez and yet be as dull as\r\n+possible. Basil was really rather dull. He only interested me once,\r\n+and that was when he told me, years ago, that he had a wild adoration\r\n+for you and that you were the dominant motive of his art.\u0022\r\n+\r\n+\u0022I was very fond of Basil,\u0022 said Dorian with a note of sadness in his\r\n+voice. \u0022But don't people say that he was murdered?\u0022\r\n+\r\n+\u0022Oh, some of the papers do. It does not seem to me to be at all\r\n+probable. I know there are dreadful places in Paris, but Basil was not\r\n+the sort of man to have gone to them. He had no curiosity. It was his\r\n+chief defect.\u0022\r\n+\r\n+\u0022What would you say, Harry, if I told you that I had murdered Basil?\u0022\r\n+said the younger man. He watched him intently after he had spoken.\r\n+\r\n+\u0022I would say, my dear fellow, that you were posing for a character that\r\n+doesn't suit you. All crime is vulgar, just as all vulgarity is crime.\r\n+It is not in you, Dorian, to commit a murder. I am sorry if I hurt\r\n+your vanity by saying so, but I assure you it is true. Crime belongs\r\n+exclusively to the lower orders. I don't blame them in the smallest\r\n+degree. I should fancy that crime was to them what art is to us,\r\n+simply a method of procuring extraordinary sensations.\u0022\r\n+\r\n+\u0022A method of procuring sensations? Do you think, then, that a man who\r\n+has once committed a murder could possibly do the same crime again?\r\n+Don't tell me that.\u0022\r\n+\r\n+\u0022Oh! anything becomes a pleasure if one does it too often,\u0022 cried Lord\r\n+Henry, laughing. \u0022That is one of the most important secrets of life.\r\n+I should fancy, however, that murder is always a mistake. One should\r\n+never do anything that one cannot talk about after dinner. But let us\r\n+pass from poor Basil. I wish I could believe that he had come to such\r\n+a really romantic end as you suggest, but I can't. I dare say he fell\r\n+into the Seine off an omnibus and that the conductor hushed up the\r\n+scandal. Yes: I should fancy that was his end. I see him lying now\r\n+on his back under those dull-green waters, with the heavy barges\r\n+floating over him and long weeds catching in his hair. Do you know, I\r\n+don't think he would have done much more good work. During the last\r\n+ten years his painting had gone off very much.\u0022\r\n+\r\n+Dorian heaved a sigh, and Lord Henry strolled across the room and began\r\n+to stroke the head of a curious Java parrot, a large, grey-plumaged\r\n+bird with pink crest and tail, that was balancing itself upon a bamboo\r\n+perch. As his pointed fingers touched it, it dropped the white scurf\r\n+of crinkled lids over black, glasslike eyes and began to sway backwards\r\n+and forwards.\r\n+\r\n+\u0022Yes,\u0022 he continued, turning round and taking his handkerchief out of\r\n+his pocket; \u0022his painting had quite gone off. It seemed to me to have\r\n+lost something. It had lost an ideal. When you and he ceased to be\r\n+great friends, he ceased to be a great artist. What was it separated\r\n+you? I suppose he bored you. If so, he never forgave you. It's a\r\n+habit bores have. By the way, what has become of that wonderful\r\n+portrait he did of you? I don't think I have ever seen it since he\r\n+finished it. Oh! I remember your telling me years ago that you had\r\n+sent it down to Selby, and that it had got mislaid or stolen on the\r\n+way. You never got it back? What a pity! it was really a\r\n+masterpiece. I remember I wanted to buy it. I wish I had now. It\r\n+belonged to Basil's best period. Since then, his work was that curious\r\n+mixture of bad painting and good intentions that always entitles a man\r\n+to be called a representative British artist. Did you advertise for\r\n+it? You should.\u0022\r\n+\r\n+\u0022I forget,\u0022 said Dorian. \u0022I suppose I did. But I never really liked\r\n+it. I am sorry I sat for it. The memory of the thing is hateful to\r\n+me. Why do you talk of it? It used to remind me of those curious\r\n+lines in some play--Hamlet, I think--how do they run?--\r\n+\r\n+ \u0022Like the painting of a sorrow,\r\n+ A face without a heart.\u0022\r\n+\r\n+Yes: that is what it was like.\u0022\r\n+\r\n+Lord Henry laughed. \u0022If a man treats life artistically, his brain is\r\n+his heart,\u0022 he answered, sinking into an arm-chair.\r\n+\r\n+Dorian Gray shook his head and struck some soft chords on the piano.\r\n+\u0022'Like the painting of a sorrow,'\u0022 he repeated, \u0022'a face without a\r\n+heart.'\u0022\r\n+\r\n+The elder man lay back and looked at him with half-closed eyes. \u0022By\r\n+the way, Dorian,\u0022 he said after a pause, \u0022'what does it profit a man if\r\n+he gain the whole world and lose--how does the quotation run?--his own\r\n+soul'?\u0022\r\n+\r\n+The music jarred, and Dorian Gray started and stared at his friend.\r\n+\u0022Why do you ask me that, Harry?\u0022\r\n+\r\n+\u0022My dear fellow,\u0022 said Lord Henry, elevating his eyebrows in surprise,\r\n+\u0022I asked you because I thought you might be able to give me an answer.\r\n+That is all. I was going through the park last Sunday, and close by\r\n+the Marble Arch there stood a little crowd of shabby-looking people\r\n+listening to some vulgar street-preacher. As I passed by, I heard the\r\n+man yelling out that question to his audience. It struck me as being\r\n+rather dramatic. London is very rich in curious effects of that kind.\r\n+A wet Sunday, an uncouth Christian in a mackintosh, a ring of sickly\r\n+white faces under a broken roof of dripping umbrellas, and a wonderful\r\n+phrase flung into the air by shrill hysterical lips--it was really very\r\n+good in its way, quite a suggestion. I thought of telling the prophet\r\n+that art had a soul, but that man had not. I am afraid, however, he\r\n+would not have understood me.\u0022\r\n+\r\n+\u0022Don't, Harry. The soul is a terrible reality. It can be bought, and\r\n+sold, and bartered away. It can be poisoned, or made perfect. There\r\n+is a soul in each one of us. I know it.\u0022\r\n+\r\n+\u0022Do you feel quite sure of that, Dorian?\u0022\r\n+\r\n+\u0022Quite sure.\u0022\r\n+\r\n+\u0022Ah! then it must be an illusion. The things one feels absolutely\r\n+certain about are never true. That is the fatality of faith, and the\r\n+lesson of romance. How grave you are! Don't be so serious. What have\r\n+you or I to do with the superstitions of our age? No: we have given\r\n+up our belief in the soul. Play me something. Play me a nocturne,\r\n+Dorian, and, as you play, tell me, in a low voice, how you have kept\r\n+your youth. You must have some secret. I am only ten years older than\r\n+you are, and I am wrinkled, and worn, and yellow. You are really\r\n+wonderful, Dorian. You have never looked more charming than you do\r\n+to-night. You remind me of the day I saw you first. You were rather\r\n+cheeky, very shy, and absolutely extraordinary. You have changed, of\r\n+course, but not in appearance. I wish you would tell me your secret.\r\n+To get back my youth I would do anything in the world, except take\r\n+exercise, get up early, or be respectable. Youth! There is nothing\r\n+like it. It's absurd to talk of the ignorance of youth. The only\r\n+people to whose opinions I listen now with any respect are people much\r\n+younger than myself. They seem in front of me. Life has revealed to\r\n+them her latest wonder. As for the aged, I always contradict the aged.\r\n+I do it on principle. If you ask them their opinion on something that\r\n+happened yesterday, they solemnly give you the opinions current in\r\n+1820, when people wore high stocks, believed in everything, and knew\r\n+absolutely nothing. How lovely that thing you are playing is! I\r\n+wonder, did Chopin write it at Majorca, with the sea weeping round the\r\n+villa and the salt spray dashing against the panes? It is marvellously\r\n+romantic. What a blessing it is that there is one art left to us that\r\n+is not imitative! Don't stop. I want music to-night. It seems to me\r\n+that you are the young Apollo and that I am Marsyas listening to you.\r\n+I have sorrows, Dorian, of my own, that even you know nothing of. The\r\n+tragedy of old age is not that one is old, but that one is young. I am\r\n+amazed sometimes at my own sincerity. Ah, Dorian, how happy you are!\r\n+What an exquisite life you have had! You have drunk deeply of\r\n+everything. You have crushed the grapes against your palate. Nothing\r\n+has been hidden from you. And it has all been to you no more than the\r\n+sound of music. It has not marred you. You are still the same.\u0022\r\n+\r\n+\u0022I am not the same, Harry.\u0022\r\n+\r\n+\u0022Yes, you are the same. I wonder what the rest of your life will be.\r\n+Don't spoil it by renunciations. At present you are a perfect type.\r\n+Don't make yourself incomplete. You are quite flawless now. You need\r\n+not shake your head: you know you are. Besides, Dorian, don't deceive\r\n+yourself. Life is not governed by will or intention. Life is a\r\n+question of nerves, and fibres, and slowly built-up cells in which\r\n+thought hides itself and passion has its dreams. You may fancy\r\n+yourself safe and think yourself strong. But a chance tone of colour\r\n+in a room or a morning sky, a particular perfume that you had once\r\n+loved and that brings subtle memories with it, a line from a forgotten\r\n+poem that you had come across again, a cadence from a piece of music\r\n+that you had ceased to play--I tell you, Dorian, that it is on things\r\n+like these that our lives depend. Browning writes about that\r\n+somewhere; but our own senses will imagine them for us. There are\r\n+moments when the odour of _lilas blanc_ passes suddenly across me, and I\r\n+have to live the strangest month of my life over again. I wish I could\r\n+change places with you, Dorian. The world has cried out against us\r\n+both, but it has always worshipped you. It always will worship you.\r\n+You are the type of what the age is searching for, and what it is\r\n+afraid it has found. I am so glad that you have never done anything,\r\n+never carved a statue, or painted a picture, or produced anything\r\n+outside of yourself! Life has been your art. You have set yourself to\r\n+music. Your days are your sonnets.\u0022\r\n+\r\n+Dorian rose up from the piano and passed his hand through his hair.\r\n+\u0022Yes, life has been exquisite,\u0022 he murmured, \u0022but I am not going to\r\n+have the same life, Harry. And you must not say these extravagant\r\n+things to me. You don't know everything about me. I think that if you\r\n+did, even you would turn from me. You laugh. Don't laugh.\u0022\r\n+\r\n+\u0022Why have you stopped playing, Dorian? Go back and give me the\r\n+nocturne over again. Look at that great, honey-coloured moon that\r\n+hangs in the dusky air. She is waiting for you to charm her, and if\r\n+you play she will come closer to the earth. You won't? Let us go to\r\n+the club, then. It has been a charming evening, and we must end it\r\n+charmingly. There is some one at White's who wants immensely to know\r\n+you--young Lord Poole, Bournemouth's eldest son. He has already copied\r\n+your neckties, and has begged me to introduce him to you. He is quite\r\n+delightful and rather reminds me of you.\u0022\r\n+\r\n+\u0022I hope not,\u0022 said Dorian with a sad look in his eyes. \u0022But I am tired\r\n+to-night, Harry. I shan't go to the club. It is nearly eleven, and I\r\n+want to go to bed early.\u0022\r\n+\r\n+\u0022Do stay. You have never played so well as to-night. There was\r\n+something in your touch that was wonderful. It had more expression\r\n+than I had ever heard from it before.\u0022\r\n+\r\n+\u0022It is because I am going to be good,\u0022 he answered, smiling. \u0022I am a\r\n+little changed already.\u0022\r\n+\r\n+\u0022You cannot change to me, Dorian,\u0022 said Lord Henry. \u0022You and I will\r\n+always be friends.\u0022\r\n+\r\n+\u0022Yet you poisoned me with a book once. I should not forgive that.\r\n+Harry, promise me that you will never lend that book to any one. It\r\n+does harm.\u0022\r\n+\r\n+\u0022My dear boy, you are really beginning to moralize. You will soon be\r\n+going about like the converted, and the revivalist, warning people\r\n+against all the sins of which you have grown tired. You are much too\r\n+delightful to do that. Besides, it is no use. You and I are what we\r\n+are, and will be what we will be. As for being poisoned by a book,\r\n+there is no such thing as that. Art has no influence upon action. It\r\n+annihilates the desire to act. It is superbly sterile. The books that\r\n+the world calls immoral are books that show the world its own shame.\r\n+That is all. But we won't discuss literature. Come round to-morrow. I\r\n+am going to ride at eleven. We might go together, and I will take you\r\n+to lunch afterwards with Lady Branksome. She is a charming woman, and\r\n+wants to consult you about some tapestries she is thinking of buying.\r\n+Mind you come. Or shall we lunch with our little duchess? She says\r\n+she never sees you now. Perhaps you are tired of Gladys? I thought\r\n+you would be. Her clever tongue gets on one's nerves. Well, in any\r\n+case, be here at eleven.\u0022\r\n+\r\n+\u0022Must I really come, Harry?\u0022\r\n+\r\n+\u0022Certainly. The park is quite lovely now. I don't think there have\r\n+been such lilacs since the year I met you.\u0022\r\n+\r\n+\u0022Very well. I shall be here at eleven,\u0022 said Dorian. \u0022Good night,\r\n+Harry.\u0022 As he reached the door, he hesitated for a moment, as if he\r\n+had something more to say. Then he sighed and went out.\r\n+\r\n+\r\n+\r\n+CHAPTER 20\r\n+\r\n+It was a lovely night, so warm that he threw his coat over his arm and\r\n+did not even put his silk scarf round his throat. As he strolled home,\r\n+smoking his cigarette, two young men in evening dress passed him. He\r\n+heard one of them whisper to the other, \u0022That is Dorian Gray.\u0022 He\r\n+remembered how pleased he used to be when he was pointed out, or stared\r\n+at, or talked about. He was tired of hearing his own name now. Half\r\n+the charm of the little village where he had been so often lately was\r\n+that no one knew who he was. He had often told the girl whom he had\r\n+lured to love him that he was poor, and she had believed him. He had\r\n+told her once that he was wicked, and she had laughed at him and\r\n+answered that wicked people were always very old and very ugly. What a\r\n+laugh she had!--just like a thrush singing. And how pretty she had\r\n+been in her cotton dresses and her large hats! She knew nothing, but\r\n+she had everything that he had lost.\r\n+\r\n+When he reached home, he found his servant waiting up for him. He sent\r\n+him to bed, and threw himself down on the sofa in the library, and\r\n+began to think over some of the things that Lord Henry had said to him.\r\n+\r\n+Was it really true that one could never change? He felt a wild longing\r\n+for the unstained purity of his boyhood--his rose-white boyhood, as\r\n+Lord Henry had once called it. He knew that he had tarnished himself,\r\n+filled his mind with corruption and given horror to his fancy; that he\r\n+had been an evil influence to others, and had experienced a terrible\r\n+joy in being so; and that of the lives that had crossed his own, it had\r\n+been the fairest and the most full of promise that he had brought to\r\n+shame. But was it all irretrievable? Was there no hope for him?\r\n+\r\n+Ah! in what a monstrous moment of pride and passion he had prayed that\r\n+the portrait should bear the burden of his days, and he keep the\r\n+unsullied splendour of eternal youth! All his failure had been due to\r\n+that. Better for him that each sin of his life had brought its sure\r\n+swift penalty along with it. There was purification in punishment.\r\n+Not \u0022Forgive us our sins\u0022 but \u0022Smite us for our iniquities\u0022 should be\r\n+the prayer of man to a most just God.\r\n+\r\n+The curiously carved mirror that Lord Henry had given to him, so many\r\n+years ago now, was standing on the table, and the white-limbed Cupids\r\n+laughed round it as of old. He took it up, as he had done on that\r\n+night of horror when he had first noted the change in the fatal\r\n+picture, and with wild, tear-dimmed eyes looked into its polished\r\n+shield. Once, some one who had terribly loved him had written to him a\r\n+mad letter, ending with these idolatrous words: \u0022The world is changed\r\n+because you are made of ivory and gold. The curves of your lips\r\n+rewrite history.\u0022 The phrases came back to his memory, and he repeated\r\n+them over and over to himself. Then he loathed his own beauty, and\r\n+flinging the mirror on the floor, crushed it into silver splinters\r\n+beneath his heel. It was his beauty that had ruined him, his beauty\r\n+and the youth that he had prayed for. But for those two things, his\r\n+life might have been free from stain. His beauty had been to him but a\r\n+mask, his youth but a mockery. What was youth at best? A green, an\r\n+unripe time, a time of shallow moods, and sickly thoughts. Why had he\r\n+worn its livery? Youth had spoiled him.\r\n+\r\n+It was better not to think of the past. Nothing could alter that. It\r\n+was of himself, and of his own future, that he had to think. James\r\n+Vane was hidden in a nameless grave in Selby churchyard. Alan Campbell\r\n+had shot himself one night in his laboratory, but had not revealed the\r\n+secret that he had been forced to know. The excitement, such as it\r\n+was, over Basil Hallward's disappearance would soon pass away. It was\r\n+already waning. He was perfectly safe there. Nor, indeed, was it the\r\n+death of Basil Hallward that weighed most upon his mind. It was the\r\n+living death of his own soul that troubled him. Basil had painted the\r\n+portrait that had marred his life. He could not forgive him that. It\r\n+was the portrait that had done everything. Basil had said things to\r\n+him that were unbearable, and that he had yet borne with patience. The\r\n+murder had been simply the madness of a moment. As for Alan Campbell,\r\n+his suicide had been his own act. He had chosen to do it. It was\r\n+nothing to him.\r\n+\r\n+A new life! That was what he wanted. That was what he was waiting\r\n+for. Surely he had begun it already. He had spared one innocent\r\n+thing, at any rate. He would never again tempt innocence. He would be\r\n+good.\r\n+\r\n+As he thought of Hetty Merton, he began to wonder if the portrait in\r\n+the locked room had changed. Surely it was not still so horrible as it\r\n+had been? Perhaps if his life became pure, he would be able to expel\r\n+every sign of evil passion from the face. Perhaps the signs of evil\r\n+had already gone away. He would go and look.\r\n+\r\n+He took the lamp from the table and crept upstairs. As he unbarred the\r\n+door, a smile of joy flitted across his strangely young-looking face\r\n+and lingered for a moment about his lips. Yes, he would be good, and\r\n+the hideous thing that he had hidden away would no longer be a terror\r\n+to him. He felt as if the load had been lifted from him already.\r\n+\r\n+He went in quietly, locking the door behind him, as was his custom, and\r\n+dragged the purple hanging from the portrait. A cry of pain and\r\n+indignation broke from him. He could see no change, save that in the\r\n+eyes there was a look of cunning and in the mouth the curved wrinkle of\r\n+the hypocrite. The thing was still loathsome--more loathsome, if\r\n+possible, than before--and the scarlet dew that spotted the hand seemed\r\n+brighter, and more like blood newly spilled. Then he trembled. Had it\r\n+been merely vanity that had made him do his one good deed? Or the\r\n+desire for a new sensation, as Lord Henry had hinted, with his mocking\r\n+laugh? Or that passion to act a part that sometimes makes us do things\r\n+finer than we are ourselves? Or, perhaps, all these? And why was the\r\n+red stain larger than it had been? It seemed to have crept like a\r\n+horrible disease over the wrinkled fingers. There was blood on the\r\n+painted feet, as though the thing had dripped--blood even on the hand\r\n+that had not held the knife. Confess? Did it mean that he was to\r\n+confess? To give himself up and be put to death? He laughed. He felt\r\n+that the idea was monstrous. Besides, even if he did confess, who\r\n+would believe him? There was no trace of the murdered man anywhere.\r\n+Everything belonging to him had been destroyed. He himself had burned\r\n+what had been below-stairs. The world would simply say that he was mad.\r\n+They would shut him up if he persisted in his story.... Yet it was\r\n+his duty to confess, to suffer public shame, and to make public\r\n+atonement. There was a God who called upon men to tell their sins to\r\n+earth as well as to heaven. Nothing that he could do would cleanse him\r\n+till he had told his own sin. His sin? He shrugged his shoulders.\r\n+The death of Basil Hallward seemed very little to him. He was thinking\r\n+of Hetty Merton. For it was an unjust mirror, this mirror of his soul\r\n+that he was looking at. Vanity? Curiosity? Hypocrisy? Had there\r\n+been nothing more in his renunciation than that? There had been\r\n+something more. At least he thought so. But who could tell? ... No.\r\n+There had been nothing more. Through vanity he had spared her. In\r\n+hypocrisy he had worn the mask of goodness. For curiosity's sake he\r\n+had tried the denial of self. He recognized that now.\r\n+\r\n+But this murder--was it to dog him all his life? Was he always to be\r\n+burdened by his past? Was he really to confess? Never. There was\r\n+only one bit of evidence left against him. The picture itself--that\r\n+was evidence. He would destroy it. Why had he kept it so long? Once\r\n+it had given him pleasure to watch it changing and growing old. Of\r\n+late he had felt no such pleasure. It had kept him awake at night.\r\n+When he had been away, he had been filled with terror lest other eyes\r\n+should look upon it. It had brought melancholy across his passions.\r\n+Its mere memory had marred many moments of joy. It had been like\r\n+conscience to him. Yes, it had been conscience. He would destroy it.\r\n+\r\n+He looked round and saw the knife that had stabbed Basil Hallward. He\r\n+had cleaned it many times, till there was no stain left upon it. It\r\n+was bright, and glistened. As it had killed the painter, so it would\r\n+kill the painter's work, and all that that meant. It would kill the\r\n+past, and when that was dead, he would be free. It would kill this\r\n+monstrous soul-life, and without its hideous warnings, he would be at\r\n+peace. He seized the thing, and stabbed the picture with it.\r\n+\r\n+There was a cry heard, and a crash. The cry was so horrible in its\r\n+agony that the frightened servants woke and crept out of their rooms.\r\n+Two gentlemen, who were passing in the square below, stopped and looked\r\n+up at the great house. They walked on till they met a policeman and\r\n+brought him back. The man rang the bell several times, but there was\r\n+no answer. Except for a light in one of the top windows, the house was\r\n+all dark. After a time, he went away and stood in an adjoining portico\r\n+and watched.\r\n+\r\n+\u0022Whose house is that, Constable?\u0022 asked the elder of the two gentlemen.\r\n+\r\n+\u0022Mr. Dorian Gray's, sir,\u0022 answered the policeman.\r\n+\r\n+They looked at each other, as they walked away, and sneered. One of\r\n+them was Sir Henry Ashton's uncle.\r\n+\r\n+Inside, in the servants' part of the house, the half-clad domestics\r\n+were talking in low whispers to each other. Old Mrs. Leaf was crying\r\n+and wringing her hands. Francis was as pale as death.\r\n+\r\n+After about a quarter of an hour, he got the coachman and one of the\r\n+footmen and crept upstairs. They knocked, but there was no reply.\r\n+They called out. Everything was still. Finally, after vainly trying\r\n+to force the door, they got on the roof and dropped down on to the\r\n+balcony. The windows yielded easily--their bolts were old.\r\n+\r\n+When they entered, they found hanging upon the wall a splendid portrait\r\n+of their master as they had last seen him, in all the wonder of his\r\n+exquisite youth and beauty. Lying on the floor was a dead man, in\r\n+evening dress, with a knife in his heart. He was withered, wrinkled,\r\n+and loathsome of visage. It was not till they had examined the rings\r\n+that they recognized who it was.\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+End of Project Gutenberg's The Picture of Dorian Gray, by Oscar Wilde\r\n+\r\n+*** END OF THIS PROJECT GUTENBERG EBOOK THE PICTURE OF DORIAN GRAY ***\r\n+\r\n+***** This file should be named 174.txt or 174.zip *****\r\n+This and all associated files of various formats will be found in:\r\n+ http://www.gutenberg.org/1/7/174/\r\n+\r\n+Produced by Judith Boss. HTML version by Al Haines.\r\n+\r\n+Updated editions will replace the previous one--the old editions\r\n+will be renamed.\r\n+\r\n+Creating the works from public domain print editions means that no\r\n+one owns a United States copyright in these works, so the Foundation\r\n+(and you!) can copy and distribute it in the United States without\r\n+permission and without paying copyright royalties. Special rules,\r\n+set forth in the General Terms of Use part of this license, apply to\r\n+copying and distributing Project Gutenberg-tm electronic works to\r\n+protect the PROJECT GUTENBERG-tm concept and trademark. Project\r\n+Gutenberg is a registered trademark, and may not be used if you\r\n+charge for the eBooks, unless you receive specific permission. If you\r\n+do not charge anything for copies of this eBook, complying with the\r\n+rules is very easy. You may use this eBook for nearly any purpose\r\n+such as creation of derivative works, reports, performances and\r\n+research. They may be modified and printed and given away--you may do\r\n+practically ANYTHING with public domain eBooks. Redistribution is\r\n+subject to the trademark license, especially commercial\r\n+redistribution.\r\n+\r\n+\r\n+\r\n+*** START: FULL LICENSE ***\r\n+\r\n+THE FULL PROJECT GUTENBERG LICENSE\r\n+PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK\r\n+\r\n+To protect the Project Gutenberg-tm mission of promoting the free\r\n+distribution of electronic works, by using or distributing this work\r\n+(or any other work associated in any way with the phrase \u0022Project\r\n+Gutenberg\u0022), you agree to comply with all the terms of the Full Project\r\n+Gutenberg-tm License (available with this file or online at\r\n+http://gutenberg.net/license).\r\n+\r\n+\r\n+Section 1. General Terms of Use and Redistributing Project Gutenberg-tm\r\n+electronic works\r\n+\r\n+1.A. By reading or using any part of this Project Gutenberg-tm\r\n+electronic work, you indicate that you have read, understand, agree to\r\n+and accept all the terms of this license and intellectual property\r\n+(trademark/copyright) agreement. If you do not agree to abide by all\r\n+the terms of this agreement, you must cease using and return or destroy\r\n+all copies of Project Gutenberg-tm electronic works in your possession.\r\n+If you paid a fee for obtaining a copy of or access to a Project\r\n+Gutenberg-tm electronic work and you do not agree to be bound by the\r\n+terms of this agreement, you may obtain a refund from the person or\r\n+entity to whom you paid the fee as set forth in paragraph 1.E.8.\r\n+\r\n+1.B. \u0022Project Gutenberg\u0022 is a registered trademark. It may only be\r\n+used on or associated in any way with an electronic work by people who\r\n+agree to be bound by the terms of this agreement. There are a few\r\n+things that you can do with most Project Gutenberg-tm electronic works\r\n+even without complying with the full terms of this agreement. See\r\n+paragraph 1.C below. There are a lot of things you can do with Project\r\n+Gutenberg-tm electronic works if you follow the terms of this agreement\r\n+and help preserve free future access to Project Gutenberg-tm electronic\r\n+works. See paragraph 1.E below.\r\n+\r\n+1.C. The Project Gutenberg Literary Archive Foundation (\u0022the Foundation\u0022\r\n+or PGLAF), owns a compilation copyright in the collection of Project\r\n+Gutenberg-tm electronic works. Nearly all the individual works in the\r\n+collection are in the public domain in the United States. If an\r\n+individual work is in the public domain in the United States and you are\r\n+located in the United States, we do not claim a right to prevent you from\r\n+copying, distributing, performing, displaying or creating derivative\r\n+works based on the work as long as all references to Project Gutenberg\r\n+are removed. Of course, we hope that you will support the Project\r\n+Gutenberg-tm mission of promoting free access to electronic works by\r\n+freely sharing Project Gutenberg-tm works in compliance with the terms of\r\n+this agreement for keeping the Project Gutenberg-tm name associated with\r\n+the work. You can easily comply with the terms of this agreement by\r\n+keeping this work in the same format with its attached full Project\r\n+Gutenberg-tm License when you share it without charge with others.\r\n+\r\n+1.D. The copyright laws of the place where you are located also govern\r\n+what you can do with this work. Copyright laws in most countries are in\r\n+a constant state of change. If you are outside the United States, check\r\n+the laws of your country in addition to the terms of this agreement\r\n+before downloading, copying, displaying, performing, distributing or\r\n+creating derivative works based on this work or any other Project\r\n+Gutenberg-tm work. The Foundation makes no representations concerning\r\n+the copyright status of any work in any country outside the United\r\n+States.\r\n+\r\n+1.E. Unless you have removed all references to Project Gutenberg:\r\n+\r\n+1.E.1. The following sentence, with active links to, or other immediate\r\n+access to, the full Project Gutenberg-tm License must appear prominently\r\n+whenever any copy of a Project Gutenberg-tm work (any work on which the\r\n+phrase \u0022Project Gutenberg\u0022 appears, or with which the phrase \u0022Project\r\n+Gutenberg\u0022 is associated) is accessed, displayed, performed, viewed,\r\n+copied or distributed:\r\n+\r\n+This eBook is for the use of anyone anywhere at no cost and with\r\n+almost no restrictions whatsoever. You may copy it, give it away or\r\n+re-use it under the terms of the Project Gutenberg License included\r\n+with this eBook or online at www.gutenberg.net\r\n+\r\n+1.E.2. If an individual Project Gutenberg-tm electronic work is derived\r\n+from the public domain (does not contain a notice indicating that it is\r\n+posted with permission of the copyright holder), the work can be copied\r\n+and distributed to anyone in the United States without paying any fees\r\n+or charges. If you are redistributing or providing access to a work\r\n+with the phrase \u0022Project Gutenberg\u0022 associated with or appearing on the\r\n+work, you must comply either with the requirements of paragraphs 1.E.1\r\n+through 1.E.7 or obtain permission for the use of the work and the\r\n+Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or\r\n+1.E.9.\r\n+\r\n+1.E.3. If an individual Project Gutenberg-tm electronic work is posted\r\n+with the permission of the copyright holder, your use and distribution\r\n+must comply with both paragraphs 1.E.1 through 1.E.7 and any additional\r\n+terms imposed by the copyright holder. Additional terms will be linked\r\n+to the Project Gutenberg-tm License for all works posted with the\r\n+permission of the copyright holder found at the beginning of this work.\r\n+\r\n+1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm\r\n+License terms from this work, or any files containing a part of this\r\n+work or any other work associated with Project Gutenberg-tm.\r\n+\r\n+1.E.5. Do not copy, display, perform, distribute or redistribute this\r\n+electronic work, or any part of this electronic work, without\r\n+prominently displaying the sentence set forth in paragraph 1.E.1 with\r\n+active links or immediate access to the full terms of the Project\r\n+Gutenberg-tm License.\r\n+\r\n+1.E.6. You may convert to and distribute this work in any binary,\r\n+compressed, marked up, nonproprietary or proprietary form, including any\r\n+word processing or hypertext form. However, if you provide access to or\r\n+distribute copies of a Project Gutenberg-tm work in a format other than\r\n+\u0022Plain Vanilla ASCII\u0022 or other format used in the official version\r\n+posted on the official Project Gutenberg-tm web site (www.gutenberg.net),\r\n+you must, at no additional cost, fee or expense to the user, provide a\r\n+copy, a means of exporting a copy, or a means of obtaining a copy upon\r\n+request, of the work in its original \u0022Plain Vanilla ASCII\u0022 or other\r\n+form. Any alternate format must include the full Project Gutenberg-tm\r\n+License as specified in paragraph 1.E.1.\r\n+\r\n+1.E.7. Do not charge a fee for access to, viewing, displaying,\r\n+performing, copying or distributing any Project Gutenberg-tm works\r\n+unless you comply with paragraph 1.E.8 or 1.E.9.\r\n+\r\n+1.E.8. You may charge a reasonable fee for copies of or providing\r\n+access to or distributing Project Gutenberg-tm electronic works provided\r\n+that\r\n+\r\n+- You pay a royalty fee of 20% of the gross profits you derive from\r\n+ the use of Project Gutenberg-tm works calculated using the method\r\n+ you already use to calculate your applicable taxes. The fee is\r\n+ owed to the owner of the Project Gutenberg-tm trademark, but he\r\n+ has agreed to donate royalties under this paragraph to the\r\n+ Project Gutenberg Literary Archive Foundation. Royalty payments\r\n+ must be paid within 60 days following each date on which you\r\n+ prepare (or are legally required to prepare) your periodic tax\r\n+ returns. Royalty payments should be clearly marked as such and\r\n+ sent to the Project Gutenberg Literary Archive Foundation at the\r\n+ address specified in Section 4, \u0022Information about donations to\r\n+ the Project Gutenberg Literary Archive Foundation.\u0022\r\n+\r\n+- You provide a full refund of any money paid by a user who notifies\r\n+ you in writing (or by e-mail) within 30 days of receipt that s/he\r\n+ does not agree to the terms of the full Project Gutenberg-tm\r\n+ License. You must require such a user to return or\r\n+ destroy all copies of the works possessed in a physical medium\r\n+ and discontinue all use of and all access to other copies of\r\n+ Project Gutenberg-tm works.\r\n+\r\n+- You provide, in accordance with paragraph 1.F.3, a full refund of any\r\n+ money paid for a work or a replacement copy, if a defect in the\r\n+ electronic work is discovered and reported to you within 90 days\r\n+ of receipt of the work.\r\n+\r\n+- You comply with all other terms of this agreement for free\r\n+ distribution of Project Gutenberg-tm works.\r\n+\r\n+1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm\r\n+electronic work or group of works on different terms than are set\r\n+forth in this agreement, you must obtain permission in writing from\r\n+both the Project Gutenberg Literary Archive Foundation and Michael\r\n+Hart, the owner of the Project Gutenberg-tm trademark. Contact the\r\n+Foundation as set forth in Section 3 below.\r\n+\r\n+1.F.\r\n+\r\n+1.F.1. Project Gutenberg volunteers and employees expend considerable\r\n+effort to identify, do copyright research on, transcribe and proofread\r\n+public domain works in creating the Project Gutenberg-tm\r\n+collection. Despite these efforts, Project Gutenberg-tm electronic\r\n+works, and the medium on which they may be stored, may contain\r\n+\u0022Defects,\u0022 such as, but not limited to, incomplete, inaccurate or\r\n+corrupt data, transcription errors, a copyright or other intellectual\r\n+property infringement, a defective or damaged disk or other medium, a\r\n+computer virus, or computer codes that damage or cannot be read by\r\n+your equipment.\r\n+\r\n+1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the \u0022Right\r\n+of Replacement or Refund\u0022 described in paragraph 1.F.3, the Project\r\n+Gutenberg Literary Archive Foundation, the owner of the Project\r\n+Gutenberg-tm trademark, and any other party distributing a Project\r\n+Gutenberg-tm electronic work under this agreement, disclaim all\r\n+liability to you for damages, costs and expenses, including legal\r\n+fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT\r\n+LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE\r\n+PROVIDED IN PARAGRAPH F3. YOU AGREE THAT THE FOUNDATION, THE\r\n+TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE\r\n+LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR\r\n+INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH\r\n+DAMAGE.\r\n+\r\n+1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a\r\n+defect in this electronic work within 90 days of receiving it, you can\r\n+receive a refund of the money (if any) you paid for it by sending a\r\n+written explanation to the person you received the work from. If you\r\n+received the work on a physical medium, you must return the medium with\r\n+your written explanation. The person or entity that provided you with\r\n+the defective work may elect to provide a replacement copy in lieu of a\r\n+refund. If you received the work electronically, the person or entity\r\n+providing it to you may choose to give you a second opportunity to\r\n+receive the work electronically in lieu of a refund. If the second copy\r\n+is also defective, you may demand a refund in writing without further\r\n+opportunities to fix the problem.\r\n+\r\n+1.F.4. Except for the limited right of replacement or refund set forth\r\n+in paragraph 1.F.3, this work is provided to you 'AS-IS' WITH NO OTHER\r\n+WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\r\n+WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE.\r\n+\r\n+1.F.5. Some states do not allow disclaimers of certain implied\r\n+warranties or the exclusion or limitation of certain types of damages.\r\n+If any disclaimer or limitation set forth in this agreement violates the\r\n+law of the state applicable to this agreement, the agreement shall be\r\n+interpreted to make the maximum disclaimer or limitation permitted by\r\n+the applicable state law. The invalidity or unenforceability of any\r\n+provision of this agreement shall not void the remaining provisions.\r\n+\r\n+1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the\r\n+trademark owner, any agent or employee of the Foundation, anyone\r\n+providing copies of Project Gutenberg-tm electronic works in accordance\r\n+with this agreement, and any volunteers associated with the production,\r\n+promotion and distribution of Project Gutenberg-tm electronic works,\r\n+harmless from all liability, costs and expenses, including legal fees,\r\n+that arise directly or indirectly from any of the following which you do\r\n+or cause to occur: (a) distribution of this or any Project Gutenberg-tm\r\n+work, (b) alteration, modification, or additions or deletions to any\r\n+Project Gutenberg-tm work, and (c) any Defect you cause.\r\n+\r\n+\r\n+Section 2. Information about the Mission of Project Gutenberg-tm\r\n+\r\n+Project Gutenberg-tm is synonymous with the free distribution of\r\n+electronic works in formats readable by the widest variety of computers\r\n+including obsolete, old, middle-aged and new computers. It exists\r\n+because of the efforts of hundreds of volunteers and donations from\r\n+people in all walks of life.\r\n+\r\n+Volunteers and financial support to provide volunteers with the\r\n+assistance they need, is critical to reaching Project Gutenberg-tm's\r\n+goals and ensuring that the Project Gutenberg-tm collection will\r\n+remain freely available for generations to come. In 2001, the Project\r\n+Gutenberg Literary Archive Foundation was created to provide a secure\r\n+and permanent future for Project Gutenberg-tm and future generations.\r\n+To learn more about the Project Gutenberg Literary Archive Foundation\r\n+and how your efforts and donations can help, see Sections 3 and 4\r\n+and the Foundation web page at http://www.pglaf.org.\r\n+\r\n+\r\n+Section 3. Information about the Project Gutenberg Literary Archive\r\n+Foundation\r\n+\r\n+The Project Gutenberg Literary Archive Foundation is a non profit\r\n+501(c)(3) educational corporation organized under the laws of the\r\n+state of Mississippi and granted tax exempt status by the Internal\r\n+Revenue Service. The Foundation's EIN or federal tax identification\r\n+number is 64-6221541. Its 501(c)(3) letter is posted at\r\n+http://pglaf.org/fundraising. Contributions to the Project Gutenberg\r\n+Literary Archive Foundation are tax deductible to the full extent\r\n+permitted by U.S. federal laws and your state's laws.\r\n+\r\n+The Foundation's principal office is located at 4557 Melan Dr. S.\r\n+Fairbanks, AK, 99712., but its volunteers and employees are scattered\r\n+throughout numerous locations. Its business office is located at\r\n+809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email\r\n+business@pglaf.org. Email contact links and up to date contact\r\n+information can be found at the Foundation's web site and official\r\n+page at http://pglaf.org\r\n+\r\n+For additional contact information:\r\n+ Dr. Gregory B. Newby\r\n+ Chief Executive and Director\r\n+ gbnewby@pglaf.org\r\n+\r\n+\r\n+Section 4. Information about Donations to the Project Gutenberg\r\n+Literary Archive Foundation\r\n+\r\n+Project Gutenberg-tm depends upon and cannot survive without wide\r\n+spread public support and donations to carry out its mission of\r\n+increasing the number of public domain and licensed works that can be\r\n+freely distributed in machine readable form accessible by the widest\r\n+array of equipment including outdated equipment. Many small donations\r\n+($1 to $5,000) are particularly important to maintaining tax exempt\r\n+status with the IRS.\r\n+\r\n+The Foundation is committed to complying with the laws regulating\r\n+charities and charitable donations in all 50 states of the United\r\n+States. Compliance requirements are not uniform and it takes a\r\n+considerable effort, much paperwork and many fees to meet and keep up\r\n+with these requirements. We do not solicit donations in locations\r\n+where we have not received written confirmation of compliance. To\r\n+SEND DONATIONS or determine the status of compliance for any\r\n+particular state visit http://pglaf.org\r\n+\r\n+While we cannot and do not solicit contributions from states where we\r\n+have not met the solicitation requirements, we know of no prohibition\r\n+against accepting unsolicited donations from donors in such states who\r\n+approach us with offers to donate.\r\n+\r\n+International donations are gratefully accepted, but we cannot make\r\n+any statements concerning tax treatment of donations received from\r\n+outside the United States. U.S. laws alone swamp our small staff.\r\n+\r\n+Please check the Project Gutenberg Web pages for current donation\r\n+methods and addresses. Donations are accepted in a number of other\r\n+ways including including checks, online payments and credit card\r\n+donations. To donate, please visit: http://pglaf.org/donate\r\n+\r\n+\r\n+Section 5. General Information About Project Gutenberg-tm electronic\r\n+works.\r\n+\r\n+Professor Michael S. Hart is the originator of the Project Gutenberg-tm\r\n+concept of a library of electronic works that could be freely shared\r\n+with anyone. For thirty years, he produced and distributed Project\r\n+Gutenberg-tm eBooks with only a loose network of volunteer support.\r\n+\r\n+\r\n+Project Gutenberg-tm eBooks are often created from several printed\r\n+editions, all of which are confirmed as Public Domain in the U.S.\r\n+unless a copyright notice is included. Thus, we do not necessarily\r\n+keep eBooks in compliance with any particular paper edition.\r\n+\r\n+\r\n+Most people start at our Web site which has the main PG search facility:\r\n+\r\n+ http://www.gutenberg.net\r\n+\r\n+This Web site includes information about Project Gutenberg-tm,\r\n+including how to make donations to the Project Gutenberg Literary\r\n+Archive Foundation, how to help produce our new eBooks, and how to\r\n+subscribe to our email newsletter to hear about new eBooks.\r\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-gencrypto/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/CMakeLists.txt\nnew file mode 100644\nindex 0000000..a3678d5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/CMakeLists.txt\n@@ -0,0 +1,28 @@\n+project(lws-api-test-gencrypto C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-gencrypto)\n+set(SRCS main.c lws-genaes.c lws-genec.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_GENCRYPTO 1 requirements)\n+require_lws_config(LWS_WITH_JOSE 1 requirements)\n+require_lws_config(USE_WOLFSSL 0 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\tadd_test(NAME api-test-gencrypto COMMAND lws-api-test-gencrypto)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-gencrypto/README.md b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/README.md\nnew file mode 100644\nindex 0000000..ab8ff0b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/README.md\n@@ -0,0 +1,26 @@\n+# lws api test gencrypto\n+\n+Demonstrates how to use and performs selftests for Generic Crypto,\n+which works the same whether the tls backend is OpenSSL or mbedTLS\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-gencrypto\n+[2018/12/05 08:30:27:1342] USER: LWS gencrypto apis tests\n+[2018/12/05 08:30:27:1343] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+[2018/12/05 08:30:27:1343] NOTICE: created client ssl context for default\n+[2018/12/05 08:30:27:1344] NOTICE: test_genaes: selftest OK\n+[2018/12/05 08:30:27:1344] USER: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genaes.c b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genaes.c\nnew file mode 100644\nindex 0000000..e7f2aa2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genaes.c\n@@ -0,0 +1,825 @@\n+/*\n+ * lws-api-test-gencrypto - lws-genaes\n+ *\n+ * Written in 2010-2018 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CBC))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cbc))\n+\n+static const uint8_t\n+\t/*\n+\t * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n+\t *\n+\t * openssl enc -aes256 \u005c\n+\t * -K \u00220123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210\u0022 \u005c\n+\t * -iv \u00220123456789abcdeffedcba9876543210\u0022\n+\t * -in plaintext.txt -out out.enc\n+\t *\n+\t */\n+\t*cbc256\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n+\tcbc256_enc[] \u003d {\n+\t\t0x2b, 0x5d, 0xb2, 0xa8, 0x5a, 0x5a, 0xf4, 0x2e,\n+\t\t0xf7, 0xf9, 0xc5, 0x3c, 0x73, 0xef, 0x40, 0x88,\n+\t}, cbc256_iv[] \u003d {\n+\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+\t}, cbc256_key[] \u003d {\n+\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+\t}\n+;\n+\n+static int\n+test_genaes_cbc(void)\n+{\n+\tstruct lws_genaes_ctx ctx;\n+\tstruct lws_gencrypto_keyelem e;\n+\tuint8_t res[32], res1[32];\n+\n+\t/*\n+\t * As part of a jwk, these are allocated. But here we just use one as\n+\t * a wrapper on a static binary key.\n+\t */\n+\te.buf \u003d (uint8_t *)cbc256_key;\n+\te.len \u003d sizeof(cbc256_key);\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_CBC, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, cbc256, 16, res, (uint8_t *)cbc256_iv,\n+\t\t\t NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy enc failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(cbc256_enc, res, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CBC, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, (uint8_t *)cbc256_iv,\n+\t\t\t NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy dec failed\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res1, 16);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(cbc256, res1, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n+\n+\treturn -1;\n+}\n+#endif\n+\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cfb128))\n+static const uint8_t\n+/*\n+ * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n+ *\n+ * openssl enc -aes-128-cfb \u005c\n+ * -K \u00220123456789abcdeffedcba9876543210\u0022 \u005c\n+ * -iv \u00220123456789abcdeffedcba9876543210\u0022\n+ * -in plaintext.txt -out out.enc\n+ *\n+ */\n+*cfb128\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n+cfb128_enc[] \u003d {\n+\t0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,\n+\t0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71\n+}, cfb128_iv[] \u003d {\n+\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+}, cfb128_key[] \u003d {\n+\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+};\n+\n+static int\n+test_genaes_cfb128(void)\n+{\n+\tstruct lws_genaes_ctx ctx;\n+\tstruct lws_gencrypto_keyelem e;\n+\tuint8_t res[32], res1[32];\n+\tsize_t iv_off \u003d 0;\n+\n+\te.buf \u003d (uint8_t *)cfb128_key;\n+\te.len \u003d sizeof(cfb128_key);\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_CFB128, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, cfb128, 16, res, (uint8_t *)cfb128_iv,\n+\t\t\t NULL, \u0026iv_off, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(cfb128_enc, res, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\tiv_off \u003d 0;\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CFB128, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, (uint8_t *)cfb128_iv,\n+\t\t\t NULL, \u0026iv_off, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(cfb128, res1, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res1, 16);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n+\n+\treturn -1;\n+}\n+#endif\n+\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cfb8))\n+\n+static const uint8_t\n+/*\n+ * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n+ *\n+ * openssl enc -aes-128-cfb8 \u005c\n+ * -K \u00220123456789abcdeffedcba9876543210\u0022 \u005c\n+ * -iv \u00220123456789abcdeffedcba9876543210\u0022\n+ * -in plaintext.txt -out out.enc\n+ *\n+ */\n+*cfb8\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n+cfb8_enc[] \u003d {\n+\t0xd2, 0x91, 0x06, 0x2d, 0x1b, 0x1e, 0x9b, 0x39,\n+\t0xa6, 0x65, 0x8e, 0xbe, 0x68, 0x32, 0x3d, 0xab\n+}, cfb8_iv[] \u003d {\n+\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+}, cfb8_key[] \u003d {\n+\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+};\n+\n+static int\n+test_genaes_cfb8(void)\n+{\n+\tstruct lws_genaes_ctx ctx;\n+\tstruct lws_gencrypto_keyelem e;\n+\tuint8_t res[32], res1[32];\n+\n+\te.buf \u003d (uint8_t *)cfb8_key;\n+\te.len \u003d sizeof(cfb8_key);\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_CFB8, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, cfb8, 16, res, (uint8_t *)cfb8_iv,\n+\t\t\t NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(cfb8_enc, res, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CFB8, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, (uint8_t *)cfb8_iv,\n+\t\t\t NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(cfb8, res1, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res1, 16);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n+\n+\treturn -1;\n+}\n+#endif\n+\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CTR))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ctr))\n+static const uint8_t\n+/*\n+ * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n+ *\n+ * openssl enc -aes-128-ctr \u005c\n+ * -K \u00220123456789abcdeffedcba9876543210\u0022 \u005c\n+ * -iv \u00220123456789abcdeffedcba9876543210\u0022\n+ * -in plaintext.txt -out out.enc\n+ *\n+ */\n+*ctr\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n+ctr_enc[] \u003d {\n+\t0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,\n+\t0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71\n+}, ctr_iv[] \u003d {\n+\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+}, ctr_key[] \u003d {\n+\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+};\n+\n+static int\n+test_genaes_ctr(void)\n+{\n+\tuint8_t nonce_counter[16], sb[16];\n+\tstruct lws_genaes_ctx ctx;\n+\tstruct lws_gencrypto_keyelem e;\n+\tuint8_t res[32], res1[32];\n+\tsize_t nc_off \u003d 0;\n+\n+\te.buf \u003d (uint8_t *)ctr_key;\n+\te.len \u003d sizeof(ctr_key);\n+\n+\tmemset(sb, 0, sizeof(nonce_counter));\n+\tmemcpy(nonce_counter, ctr_iv, sizeof(ctr_iv));\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_CTR, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, ctr, 16, res, nonce_counter, sb, \u0026nc_off, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(ctr_enc, res, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\tnc_off \u003d 0;\n+\tmemset(sb , 0, sizeof(nonce_counter));\n+\tmemcpy(nonce_counter, ctr_iv, sizeof(ctr_iv));\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CTR, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, nonce_counter, sb, \u0026nc_off, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(ctr, res1, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res1, 16);\n+\t\treturn -1;\n+\t}\n+\n+\tlws_explicit_bzero(sb, sizeof(sb));\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n+\n+\treturn -1;\n+}\n+#endif\n+\n+#if (defined(LWS_WITH_MBEDTLS)) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ecb))\n+static const uint8_t\n+/*\n+ * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n+ *\n+ * openssl enc -aes-128-ecb \u005c\n+ * -K \u00220123456789abcdeffedcba9876543210\u0022 \u005c\n+ * -in plaintext.txt -out out.enc\n+ *\n+ */\n+*ecb\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n+ecb_enc[] \u003d {\n+\t0xf3, 0xe5, 0x6c, 0x80, 0x3a, 0xf1, 0xc4, 0xa0,\n+\t0x7e, 0xdf, 0x86, 0x0f, 0x6d, 0xca, 0x5d, 0x36,\n+\t0x17, 0x22, 0x37, 0x42, 0x47, 0x41, 0x67, 0x7d,\n+\t0x99, 0x25, 0x02, 0x6b, 0x6b, 0x8f, 0x9c, 0x7f\n+}, ecb_key[] \u003d {\n+\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+};\n+\n+static int\n+test_genaes_ecb(void)\n+{\n+\tstruct lws_genaes_ctx ctx;\n+\tstruct lws_gencrypto_keyelem e;\n+\tuint8_t res[32], res1[32];\n+\n+\t/*\n+\t * As part of a jwk, these are allocated. But here we just use one as\n+\t * a wrapper on a static binary key.\n+\t */\n+\te.buf \u003d (uint8_t *)ecb_key;\n+\te.len \u003d sizeof(ecb_key);\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_ECB, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, ecb, 16, res, NULL, NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(ecb_enc, res, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_ECB, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, NULL, NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(ecb, res1, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n+\n+\treturn -1;\n+}\n+#endif\n+\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_OFB))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ofb))\n+static const uint8_t\n+\t/*\n+\t * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n+\t *\n+\t * openssl enc -aes-128-ofb \u005c\n+\t * -K \u00220123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210\u0022 \u005c\n+\t * -iv \u00220123456789abcdeffedcba9876543210\u0022\n+\t * -in plaintext.txt -out out.enc\n+\t *\n+\t */\n+\t*ofb\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n+\tofb_enc[] \u003d {\n+\t\t/* !!! ugh... openssl app produces this... */\n+\t\t// 0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,\n+\t\t// 0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71,\n+\t\t/* but both OpenSSL and mbedTLS produce this */\n+\t\t0x11, 0x33, 0x6D, 0xFC, 0x88, 0x4C, 0x28, 0xBA,\n+\t\t0xD0, 0xF2, 0x6C, 0xBC, 0xDE, 0x4A, 0x56, 0x20\n+\t}, ofb_iv[] \u003d {\n+\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+\t}, ofb_key[] \u003d {\n+\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n+\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n+\t}\n+;\n+static int\n+test_genaes_ofb(void)\n+{\n+\tstruct lws_genaes_ctx ctx;\n+\tstruct lws_gencrypto_keyelem e;\n+\tuint8_t res[32], res1[32];\n+\tsize_t iv_off \u003d 0;\n+\n+\te.buf \u003d (uint8_t *)ofb_key;\n+\te.len \u003d sizeof(ofb_key);\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_OFB, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, ofb, 16, res, (uint8_t *)ofb_iv, NULL,\n+\t\t\t \u0026iv_off, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(ofb_enc, res, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\tiv_off \u003d 0;\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_OFB, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, (uint8_t *)ofb_iv, NULL,\n+\t\t\t \u0026iv_off, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(ofb, res1, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n+\n+\treturn -1;\n+}\n+\n+#endif\n+\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_XTS))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_xts))\n+\n+static const uint8_t\n+\t/*\n+\t * Fedora openssl tool doesn't support xts... this data produced\n+\t * by testing on mbedtls + OpenSSL and getting the same result\n+\t *\n+\t * NOTICE that xts requires a double-length key... OpenSSL now checks\n+\t * the key for duplication so we use a random key\n+\t */\n+\t*xts\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n+\txts_enc[] \u003d {\n+\t\t0x87, 0x83, 0x20, 0x8B, 0x15, 0x89, 0xA1, 0x13,\n+\t\t0xDC, 0xEA, 0x82, 0xB6, 0xFF, 0x8D, 0x76, 0x3A\n+\t}, xts_key[] \u003d {\n+\t\t0xa4, 0xd6, 0xa2, 0x1a, 0x3b, 0x34, 0x34, 0x43,\n+\t\t0x9a, 0xe2, 0x6a, 0x01, 0x1c, 0x73, 0x80, 0x3b,\n+\t\t0xdd, 0xf6, 0xd4, 0x37, 0x5e, 0x0e, 0x1c, 0x72,\n+\t\t0x8e, 0xe5, 0x18, 0x69, 0xfd, 0x08, 0x40, 0x2b,\n+\t\t0x98, 0xf9, 0x75, 0xa8, 0x36, 0xd5, 0x0f, 0xa2,\n+\t\t0x20, 0x04, 0x43, 0xa7, 0x3a, 0xa6, 0x4a, 0xdc,\n+\t\t0xe9, 0x54, 0x50, 0xfa, 0x38, 0xad, 0x6d, 0x96,\n+\t\t0x5f, 0x31, 0x9e, 0xcd, 0x33, 0x08, 0xa0, 0x44\n+\t}\n+;\n+static int\n+test_genaes_xts(void)\n+{\n+\n+\tstruct lws_genaes_ctx ctx;\n+\tstruct lws_gencrypto_keyelem e;\n+\tuint8_t res[32], res1[32], data_unit[16];\n+\n+\tmemset(data_unit, 0, sizeof(data_unit));\n+\n+\te.buf \u003d (uint8_t *)xts_key;\n+\te.len \u003d sizeof(xts_key);\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_XTS, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, xts, 16, res, data_unit, NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(xts_enc, res, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_XTS, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, data_unit, NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(xts, res1, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n+\n+\treturn -1;\n+}\n+#endif\n+\n+static const uint8_t\n+\t/*\n+\t * https://csrc.nist.gov/CSRC/media/Projects/\n+\t * Cryptographic-Algorithm-Validation-Program/\n+\t * documents/mac/gcmtestvectors.zip\n+\t */\n+\n+\tgcm_ct[] \u003d {\n+\t\t0xf7, 0x26, 0x44, 0x13, 0xa8, 0x4c, 0x0e, 0x7c,\n+\t\t0xd5, 0x36, 0x86, 0x7e, 0xb9, 0xf2, 0x17, 0x36\n+\t}, gcm_iv[] \u003d {\n+\t\t0x99, 0xaa, 0x3e, 0x68, 0xed, 0x81, 0x73, 0xa0,\n+\t\t0xee, 0xd0, 0x66, 0x84\n+\t}, gcm_key[] \u003d {\n+\t\t0xee, 0xbc, 0x1f, 0x57, 0x48, 0x7f, 0x51, 0x92,\n+\t\t0x1c, 0x04, 0x65, 0x66, 0x5f, 0x8a, 0xe6, 0xd1,\n+\t\t0x65, 0x8b, 0xb2, 0x6d, 0xe6, 0xf8, 0xa0, 0x69,\n+\t\t0xa3, 0x52, 0x02, 0x93, 0xa5, 0x72, 0x07, 0x8f\n+\t}, gcm_pt[] \u003d {\n+\t\t0xf5, 0x6e, 0x87, 0x05, 0x5b, 0xc3, 0x2d, 0x0e,\n+\t\t0xeb, 0x31, 0xb2, 0xea, 0xcc, 0x2b, 0xf2, 0xa5\n+\t}, gcm_aad[] \u003d {\n+\t\t0x4d, 0x23, 0xc3, 0xce, 0xc3, 0x34, 0xb4, 0x9b,\n+\t\t0xdb, 0x37, 0x0c, 0x43, 0x7f, 0xec, 0x78, 0xde\n+\t}, gcm_tag[] \u003d {\n+\t\t0x67, 0xba, 0x05, 0x10, 0x26, 0x2a, 0xe4, 0x87,\n+\t\t0xd7, 0x37, 0xee, 0x62, 0x98, 0xf7, 0x7e, 0x0c\n+\t};\n+\n+static int\n+test_genaes_gcm(void)\n+{\n+\tuint8_t res[sizeof(gcm_ct)], tag[sizeof(gcm_tag)];\n+\tstruct lws_genaes_ctx ctx;\n+\tstruct lws_gencrypto_keyelem e;\n+\tsize_t iv_off \u003d 0;\n+\n+\te.buf \u003d (uint8_t *)gcm_key;\n+\te.len \u003d sizeof(gcm_key);\n+\n+\t/* Encrypt */\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_GCM, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\t/* first we set the iv and aad */\n+\n+\tiv_off \u003d sizeof(gcm_iv);\n+\tif (lws_genaes_crypt(\u0026ctx, gcm_aad, sizeof(gcm_aad), NULL,\n+\t\t\t (uint8_t *)gcm_iv, (uint8_t *)gcm_tag,\n+\t\t\t \u0026iv_off, sizeof(gcm_tag))) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt 1 failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, gcm_pt, sizeof(gcm_pt), res,\n+\t\t\t NULL, NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt 2 failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, tag, sizeof(tag))) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy enc failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(gcm_ct, res, sizeof(gcm_ct))) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, sizeof(gcm_ct));\n+\t\treturn -1;\n+\t}\n+\n+\n+\t/* Decrypt */\n+\n+\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_GCM, \u0026e, 0, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tiv_off \u003d sizeof(gcm_iv); /* initial call sets iv + aad + tag */\n+\tif (lws_genaes_crypt(\u0026ctx, gcm_aad, sizeof(gcm_aad), NULL,\n+\t\t\t (uint8_t *)gcm_iv, (uint8_t *)gcm_tag,\n+\t\t\t \u0026iv_off, sizeof(gcm_tag))) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt 1 failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_crypt(\u0026ctx, gcm_ct, sizeof(gcm_ct), res,\n+\t\t\t NULL, NULL, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt 2 failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_genaes_destroy(\u0026ctx, tag, sizeof(tag))) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_destroy dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(gcm_pt, res, sizeof(gcm_pt))) {\n+\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, sizeof(gcm_ct));\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n+\n+\treturn -1;\n+}\n+\n+int\n+test_genaes(struct lws_context *context)\n+{\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CBC))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cbc))\n+\tif (test_genaes_cbc())\n+\t\tgoto bail;\n+#endif\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cfb128))\n+\tif (test_genaes_cfb128())\n+\t\tgoto bail;\n+#endif\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cfb8))\n+\tif (test_genaes_cfb8())\n+\t\tgoto bail;\n+#endif\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CTR))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ctr))\n+\tif (test_genaes_ctr())\n+\t\tgoto bail;\n+#endif\n+#if (defined(LWS_WITH_MBEDTLS)) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ecb))\n+\tif (test_genaes_ecb())\n+\t\tgoto bail;\n+#endif\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_OFB))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ofb))\n+\tif (test_genaes_ofb())\n+\t\tgoto bail;\n+#endif\n+#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_XTS))) || \u005c\n+ (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_xts))\n+\tif (test_genaes_xts())\n+\t\tgoto bail;\n+#endif\n+\n+\tif (test_genaes_gcm())\n+\t\tgoto bail;\n+\n+\t/* end */\n+\n+\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genec.c b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genec.c\nnew file mode 100644\nindex 0000000..57ab78b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genec.c\n@@ -0,0 +1,132 @@\n+/*\n+ * lws-api-test-gencrypto - lws-genec\n+ *\n+ * Written in 2010-2018 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+static const uint8_t\n+\t*jwk_ec1 \u003d (uint8_t *)\n+\t\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u00224Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022use\u005c\u0022:\u005c\u0022enc\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u0022rfc7517-A.2-example private key\u005c\u0022}\u0022\n+;\n+\n+static int\n+test_genec1(struct lws_context *context)\n+{\n+\tstruct lws_genec_ctx ctx;\n+\tstruct lws_jwk jwk;\n+\tstruct lws_gencrypto_keyelem el[LWS_GENCRYPTO_EC_KEYEL_COUNT];\n+\t//uint8_t res[32], res1[32];\n+\tint n;\n+\n+\tmemset(el, 0, sizeof(el));\n+\n+\tif (lws_genecdh_create(\u0026ctx, context, NULL))\n+\t\treturn 1;\n+\n+\t/* let's create a new key */\n+\n+\tif (lws_genecdh_new_keypair(\u0026ctx, LDHS_OURS, \u0022P-256\u0022, el)) {\n+\t\tlwsl_err(\u0022%s: lws_genec_new_keypair failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_genec_dump(el);\n+\tlws_genec_destroy_elements(el);\n+\n+\tlws_genec_destroy(\u0026ctx);\n+\n+\tif (lws_jwk_import(\u0026jwk, NULL, NULL, (char *)jwk_ec1,\n+\t\t\t strlen((char *)jwk_ec1)) \u003c 0) {\n+\t\tlwsl_notice(\u0022Failed to decode JWK test key\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_jwk_dump(\u0026jwk);\n+\n+\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_EC) {\n+\t\tlws_jwk_destroy(\u0026jwk);\n+\t\tlwsl_err(\u0022%s: jwk is not an EC key\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_genecdh_create(\u0026ctx, context, NULL))\n+\t\treturn 1;\n+\n+\tn \u003d lws_genecdh_set_key(\u0026ctx, jwk.e, LDHS_OURS);\n+\tif (n) {\n+\t\tlws_jwk_destroy(\u0026jwk);\n+\t\tlwsl_err(\u0022%s: lws_genec_create failed: %d\u005cn\u0022, __func__, n);\n+\t\treturn 1;\n+\t}\n+#if 0\n+\tif (lws_genec_crypt(\u0026ctx, cbc256, 16, res, (uint8_t *)cbc256_iv,\n+\t\t\t NULL, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genec_crypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(cbc256_enc, res, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genec_crypt encoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_genec_destroy(\u0026ctx);\n+\n+\tif (lws_genec_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CBC, \u0026e, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genec_create dec failed\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_genec_crypt(\u0026ctx, res, 16, res1, (uint8_t *)cbc256_iv,\n+\t\t\t NULL, NULL)) {\n+\t\tlwsl_err(\u0022%s: lws_genec_crypt dec failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_timingsafe_bcmp(cbc256, res1, 16)) {\n+\t\tlwsl_err(\u0022%s: lws_genec_crypt decoding mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(res, 16);\n+\t\tgoto bail;\n+\t}\n+#endif\n+\tlws_genec_destroy(\u0026ctx);\n+\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\treturn 0;\n+\n+//bail:\n+//\tlws_genec_destroy(\u0026ctx);\n+\n+//\treturn -1;\n+}\n+\n+int\n+test_genec(struct lws_context *context)\n+{\n+\tif (test_genec1(context))\n+\t\tgoto bail;\n+\n+\t/* end */\n+\n+\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-gencrypto/main.c b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/main.c\nnew file mode 100644\nindex 0000000..8203190\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/main.c\n@@ -0,0 +1,50 @@\n+/*\n+ * lws-api-test-gencrypto\n+ *\n+ * Written in 2010-2018 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+int\n+test_genaes(struct lws_context *context);\n+int\n+test_genec(struct lws_context *context);\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint result \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS gencrypto apis tests\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tresult |\u003d test_genaes(context);\n+\tresult |\u003d test_genec(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, result ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-jose/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-jose/CMakeLists.txt\nnew file mode 100644\nindex 0000000..3a53382\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-jose/CMakeLists.txt\n@@ -0,0 +1,28 @@\n+project(lws-api-test-jose C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-jose)\n+set(SRCS main.c jwk.c jws.c jwe.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_JOSE 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (NOT (LWS_WITH_MBEDTLS AND NOT LWS_HAVE_mbedtls_internal_aes_encrypt))\n+\t\tadd_test(NAME api-test-jose COMMAND lws-api-test-jose)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-jose/README.md b/minimal-examples-lowlevel/api-tests/api-test-jose/README.md\nnew file mode 100644\nindex 0000000..74034c7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-jose/README.md\n@@ -0,0 +1,22 @@\n+# lws api test lwsac\n+\n+Demonstrates how to use and performs selftests for lwsac\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-lwsac\n+[2018/10/09 09:14:17:4834] USER: LWS API selftest: lwsac\n+[2018/10/09 09:14:17:4835] USER: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-jose/jwe.c b/minimal-examples-lowlevel/api-tests/api-test-jose/jwe.c\nnew file mode 100644\nindex 0000000..e403b2d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-jose/jwe.c\n@@ -0,0 +1,2297 @@\n+/*\n+ * lws-api-test-jose - RFC7516 jwe tests\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+/*\n+ * These are the inputs and outputs from the worked example in RFC7516\n+ * Appendix A.1 {\u0022alg\u0022:\u0022RSA-OAEP\u0022,\u0022enc\u0022:\u0022A256GCM\u0022}\n+ */\n+\n+\n+static char\n+\n+*ex_a1_ptext \u003d\n+\t\u0022The true sign of intelligence is not knowledge but imagination.\u0022,\n+\n+*ex_a1_compact \u003d\n+\t\u0022eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.\u0022\n+\t\u0022OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe\u0022\n+\t\u0022ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb\u0022\n+\t\u0022Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV\u0022\n+\t\u0022mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8\u0022\n+\t\u00221860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi\u0022\n+\t\u00226UklfCpIMfIjf7iGdXKHzg.\u0022\n+\t\u002248V1_ALb6US04U3b.\u0022\n+\t\u00225eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji\u0022\n+\t\u0022SdiwkIr3ajwQzaBtQD_A.\u0022\n+\t\u0022XFBoMYUZodetZdvTiFvSkQ\u0022,\n+\n+\t*ex_a1_jwk_json \u003d\n+\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u0022oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUW\u0022\n+\t\t\u0022cJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3S\u0022\n+\t\t\u0022psk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2a\u0022\n+\t\t\u0022sbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMS\u0022\n+\t\t\u0022tPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2dj\u0022\n+\t\t\u0022YgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-WY5N\u0022\n+\t\t\u0022WV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD9\u0022\n+\t\t\u00223Dt62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghk\u0022\n+\t\t\u0022qDp0Vqj3kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vl\u0022\n+\t\t\u0022t3UVe4WO3JkJOzlpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-VFs3VSnd\u0022\n+\t\t\u0022VTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022p\u005c\u0022:\u005c\u00221r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ-\u0022\n+\t\t\u0022SWxkbkmoEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lf\u0022\n+\t\t\u0022fNn03IXqWF5MDFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022q\u005c\u0022:\u005c\u0022wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBm\u0022\n+\t\t\u0022UDdaDYVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aX\u0022\n+\t\t\u0022IWxKwd4gvxFImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022ZK-YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KL\u0022\n+\t\t\u0022hMXvo-uz-KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827\u0022\n+\t\t\u0022rnpZzAJKpdhWAgqrXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCj\u0022\n+\t\t\u0022ywcMlYYg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDB\u0022\n+\t\t\u0022UfCAiJVeESOjJDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7\u0022\n+\t\t\u0022AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3\u0022\n+\t\t\u0022eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY\u005c\u0022\u0022\n+\t\u0022}\u0022\n+;\n+\n+static int\n+test_jwe_a1(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[2048], compact[2048];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, ex_a1_jwk_json,\n+\t\t\t strlen(ex_a1_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* converts a compact serialization to jws b64 + decoded maps */\n+\tif (lws_jws_compact_decode(ex_a1_compact, (int)strlen(ex_a1_compact),\n+\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64, temp,\n+\t\t\t\t \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c strlen(ex_a1_ptext) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a1_ptext,\n+\t\t\t (uint32_t)strlen(ex_a1_ptext))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ex_a1_ptext, strlen(ex_a1_ptext));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * Canned decrypt worked properly... let's also try encoding the\n+\t * plaintext ourselves and decoding that...\n+\t */\n+\tlws_jwe_destroy(\u0026jwe);\n+\ttemp_len \u003d sizeof(temp);\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, ex_a1_jwk_json,\n+\t\t\t strlen(ex_a1_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_gencrypto_jwe_alg_to_definition(\u0022RSA-OAEP\u0022, \u0026jwe.jose.alg)) {\n+\t\tlwsl_err(\u0022Unknown cipher alg \u005c\u0022RSA-OAEP\u005c\u0022\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\tif (lws_gencrypto_jwe_enc_to_definition(\u0022A256GCM\u0022, \u0026jwe.jose.enc_alg)) {\n+\t\tlwsl_err(\u0022Unknown payload enc alg \u005c\u0022A256GCM\u005c\u0022\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* we require a JOSE-formatted header to do the encryption */\n+\n+\tjwe.jws.map.buf[LJWS_JOSE] \u003d temp;\n+\tjwe.jws.map.len[LJWS_JOSE] \u003d (uint32_t)lws_snprintf(temp, (unsigned int)temp_len,\n+\t\t\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022%s\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022, \u0022RSA-OAEP\u0022, \u0022A256GCM\u0022);\n+\ttemp_len -\u003d (int)jwe.jws.map.len[LJWS_JOSE];\n+\n+\t/*\n+\t * dup the plaintext into the ciphertext element, it will be\n+\t * encrypted in-place to a ciphertext of the same length\n+\t */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tex_a1_ptext, strlen(ex_a1_ptext), 0)) {\n+\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* CEK size is determined by hash / hmac size */\n+\n+\tn \u003d lws_gencrypto_bits_to_bytes(jwe.jose.enc_alg-\u003ekeybits_fixed);\n+\tif (lws_jws_randomize_element(context, \u0026jwe.jws.map, LJWE_EKEY,\n+\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len, (unsigned int)n,\n+\t\t\t\t LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n+\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022,\n+\t\t\t __func__, n);\n+\t\tgoto bail;\n+\t}\n+\n+\t// puts(compact);\n+\n+\t/*\n+\t * Okay... what happens when we try to decode what we created?\n+\t */\n+\n+\tlws_jwe_destroy(\u0026jwe);\n+\tlws_jwe_init(\u0026jwe, context);\n+\ttemp_len \u003d sizeof(temp);\n+\n+\t/* converts a compact serialization to jws b64 + decoded maps */\n+\tif (lws_jws_compact_decode(compact, (int)strlen(compact), \u0026jwe.jws.map,\n+\t\t\t\t \u0026jwe.jws.map_b64, temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, ex_a1_jwk_json,\n+\t\t\t strlen(ex_a1_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: generated lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+\n+/* A.2. Example JWE using RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256\n+ *\n+ * This example encrypts the plaintext \u0022Live long and prosper.\u0022 to the\n+ * recipient using RSAES-PKCS1-v1_5 for key encryption and\n+ * AES_128_CBC_HMAC_SHA_256 for content encryption.\n+ */\n+\n+/* \u0022Live long and prosper.\u0022 */\n+static uint8_t\n+\n+ex_a2_ptext[] \u003d {\n+\t76, 105, 118, 101, 32, 108, 111, 110,\n+\t103, 32, 97, 110, 100, 32, 112, 114,\n+\t111, 115, 112, 101, 114, 46\n+}, *lws_jwe_ex_a2_jwk_json \u003d (uint8_t *)\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u0022sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1Wl\u0022\n+\t\t \u0022UzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDpre\u0022\n+\t\t \u0022cbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_\u0022\n+\t\t \u00227svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBI\u0022\n+\t\t \u0022Y2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU\u0022\n+\t\t \u00227-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022VFCWOqXr8nvZNyaaJLXdnNPXZKRaWCjkU5Q2egQQpTBMwhprMzWzpR8Sxq\u0022\n+\t\t \u00221OPThh_J6MUD8Z35wky9b8eEO0pwNS8xlh1lOFRRBoNqDIKVOku0aZb-ry\u0022\n+\t\t \u0022nq8cxjDTLZQ6Fz7jSjR1Klop-YKaUHc9GsEofQqYruPhzSA-QgajZGPbE_\u0022\n+\t\t \u00220ZaVDJHfyd7UUBUKunFMScbflYAAOYJqVIVwaYR5zWEEceUjNnTNo_CVSj\u0022\n+\t\t \u0022-VvXLO5VZfCUAVLgW4dpf1SrtZjSt34YLsRarSb127reG_DUwg9Ch-Kyvj\u0022\n+\t\t \u0022T1SkHgUWRVGcyly7uvVGRSDwsXypdrNinPA4jlhoNdizK2zF2CWQ\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022p\u005c\u0022:\u005c\u00229gY2w6I6S6L0juEKsbeDAwpd9WMfgqFoeA9vEyEUuk4kLwBKcoe1x4HG68\u0022\n+\t\t \u0022ik918hdDSE9vDQSccA3xXHOAFOPJ8R9EeIAbTi1VwBYnbTp87X-xcPWlEP\u0022\n+\t\t \u0022krdoUKW60tgs1aNd_Nnc9LEVVPMS390zbFxt8TN_biaBgelNgbC95sM\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022q\u005c\u0022:\u005c\u0022uKlCKvKv_ZJMVcdIs5vVSU_6cPtYI1ljWytExV_skstvRSNi9r66jdd9-y\u0022\n+\t\t \u0022BhVfuG4shsp2j7rGnIio901RBeHo6TPKWVVykPu1iYhQXw1jIABfw-MVsN\u0022\n+\t\t \u0022-3bQ76WLdt2SDxsHs7q7zPyUyHXmps7ycZ5c72wGkUwNOjYelmkiNS0\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022w0kZbV63cVRvVX6yk3C8cMxo2qCM4Y8nsq1lmMSYhG4EcL6FWbX5h9yuv\u0022\n+\t\t \u0022ngs4iLEFk6eALoUS4vIWEwcL4txw9LsWH_zKI-hwoReoP77cOdSL4AVcra\u0022\n+\t\t \u0022Hawlkpyd2TWjE5evgbhWtOxnZee3cXJBkAi64Ik6jZxbvk-RR3pEhnCs\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022o_8V14SezckO6CNLKs_btPdFiO9_kC1DsuUTd2LAfIIVeMZ7jn1Gus_Ff\u0022\n+\t\t \u00227B7IVx3p5KuBGOVF8L-qifLb6nQnLysgHDh132NDioZkhH7mI7hPG-PYE_\u0022\n+\t\t \u0022odApKdnqECHWw0J-F0JWnUd6D2B_1TvF9mXA2Qx-iGYn8OVV1Bsmp6qU\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlC\u0022\n+\t\t \u0022tUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZ\u0022\n+\t\t \u0022B9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+\n+*ex_a2_compact \u003d (uint8_t *)\n+\t\u0022eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0\u0022\n+\t\u0022.\u0022\n+\t\u0022UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm\u0022\n+\t\u00221NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7Pc\u0022\n+\t\u0022HALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIF\u0022\n+\t\u0022NPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8\u0022\n+\t\u0022rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv\u0022\n+\t\u0022-B3oWh2TbqmScqXMR4gp_A\u0022\n+\t\u0022.\u0022\n+\t\u0022AxY8DCtDaGlsbGljb3RoZQ\u0022\n+\t\u0022.\u0022\n+\t\u0022KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY\u0022\n+\t\u0022.\u0022\n+\t\u00229hH0vgRfYgPnAHOd8stkvw\u0022\n+;\n+\n+static int\n+test_jwe_a2(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[2048];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,\n+\t\t\t strlen((char *)lws_jwe_ex_a2_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* converts a compact serialization to jws b64 + decoded maps */\n+\tif (lws_jws_compact_decode((const char *)ex_a2_compact,\n+\t\t\t\t (int)strlen((char *)ex_a2_compact),\n+\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n+\t\t\t\t (char *)temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ex_a2_ptext) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a2_ptext,\n+\t\t\t sizeof(ex_a2_ptext))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ex_a2_ptext, sizeof(ex_a2_ptext));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+/* JWE creation using RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256\n+ *\n+ * This example encrypts a different, larger plaintext using the jwk key from\n+ * the test above, and AES_128_CBC_HMAC_SHA_256 for content encryption.\n+ */\n+\n+static const char *rsa256a128_jose \u003d\n+\t\t\u0022{ \u005c\u0022alg\u005c\u0022:\u005c\u0022RSA1_5\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A128CBC-HS256\u005c\u0022}\u0022;\n+\n+static uint8_t\n+\n+\t/* plaintext is 1024 bytes from /dev/urandom */\n+\n+ra_ptext_1024[] \u003d {\n+\t\t0xfe, 0xc6, 0x4f, 0x3e, 0x4a, 0x19, 0xe9, 0xd7,\n+\t\t0xc2, 0x13, 0xe7, 0xc5, 0x78, 0x6e, 0x71, 0xf6,\n+\t\t0x6e, 0xdd, 0x04, 0xaf, 0xaa, 0x4e, 0xa8, 0xad,\n+\t\t0xd8, 0xe0, 0xb3, 0x32, 0x97, 0x43, 0x7c, 0xd8,\n+\t\t0xd1, 0x5f, 0x56, 0xac, 0x70, 0xaf, 0x7d, 0x0b,\n+\t\t0x40, 0xa1, 0x96, 0x71, 0x7c, 0xc4, 0x4a, 0x37,\n+\t\t0x0b, 0xa6, 0x06, 0xb3, 0x8c, 0x87, 0xee, 0xb6,\n+\t\t0x15, 0xfe, 0xaa, 0x60, 0x7e, 0x7f, 0xdc, 0xb0,\n+\t\t0xff, 0x96, 0x4b, 0x30, 0x60, 0xcf, 0xc6, 0x5d,\n+\t\t0x09, 0x6a, 0x6f, 0x66, 0x0c, 0x5f, 0xb0, 0x6f,\n+\t\t0x61, 0xa6, 0x26, 0x02, 0xbd, 0x46, 0xda, 0xa3,\n+\t\t0x73, 0x19, 0x17, 0xff, 0xe0, 0x5f, 0x30, 0x72,\n+\t\t0x7d, 0x17, 0xd8, 0xb2, 0xbe, 0x84, 0x3e, 0x4d,\n+\t\t0x76, 0xbd, 0x62, 0x5d, 0x63, 0xfe, 0x11, 0x32,\n+\t\t0x11, 0x41, 0xdc, 0xed, 0x96, 0xfd, 0x31, 0x38,\n+\t\t0x6a, 0x84, 0x55, 0x7a, 0x33, 0x3f, 0x37, 0xc3,\n+\t\t0x37, 0x7b, 0xc1, 0xb7, 0x89, 0x00, 0x39, 0xa6,\n+\t\t0x94, 0x91, 0xb7, 0x19, 0x6b, 0x1d, 0x99, 0xeb,\n+\t\t0xf6, 0x10, 0xb9, 0xd2, 0xcd, 0x15, 0x0d, 0xbc,\n+\t\t0x24, 0x34, 0x9a, 0x52, 0x64, 0x21, 0x72, 0x1e,\n+\t\t0x9a, 0x00, 0xf2, 0xcf, 0xf1, 0x7d, 0x1a, 0x12,\n+\t\t0x8d, 0x39, 0xbc, 0xf9, 0x09, 0xfd, 0xd9, 0x22,\n+\t\t0x27, 0x28, 0xe1, 0x3a, 0x0b, 0x82, 0xba, 0x9a,\n+\t\t0xe5, 0x9d, 0xa8, 0x12, 0x6e, 0xf5, 0x4b, 0xc7,\n+\t\t0x2b, 0x9c, 0xdc, 0xfe, 0xf3, 0xe8, 0x74, 0x65,\n+\t\t0x3d, 0xe0, 0xaa, 0x64, 0xf3, 0x43, 0xa4, 0x88,\n+\t\t0xa8, 0xbe, 0x60, 0xdb, 0xfd, 0x2d, 0x3b, 0x84,\n+\t\t0x82, 0x8f, 0x4d, 0xbb, 0xe4, 0xa9, 0x59, 0xe3,\n+\t\t0x6c, 0x52, 0x45, 0xe4, 0x34, 0xdb, 0x28, 0x0e,\n+\t\t0x4a, 0x44, 0xb6, 0x9a, 0x25, 0x9b, 0x3b, 0xae,\n+\t\t0xe1, 0x12, 0x1d, 0x1c, 0x66, 0x7d, 0xb9, 0x5b,\n+\t\t0x5f, 0xc2, 0x4a, 0xaa, 0xd2, 0xe9, 0x65, 0xe2,\n+\t\t0x85, 0x6f, 0xf6, 0x67, 0x66, 0x8e, 0x0b, 0xd2,\n+\t\t0x60, 0xf8, 0x43, 0x60, 0x04, 0x9b, 0xa9, 0x3a,\n+\t\t0x6a, 0x3c, 0x02, 0x3c, 0x08, 0x9d, 0x60, 0x1c,\n+\t\t0xc4, 0x27, 0x3e, 0xff, 0xd0, 0x70, 0x94, 0x43,\n+\t\t0x3e, 0x9e, 0x69, 0x19, 0x22, 0xf0, 0xec, 0x26,\n+\t\t0x2d, 0xa5, 0x71, 0xf3, 0x92, 0x61, 0x95, 0xce,\n+\t\t0xc3, 0xc0, 0xa0, 0xc3, 0x98, 0x22, 0xdd, 0x32,\n+\t\t0x3c, 0x48, 0xcb, 0xd1, 0x61, 0xa0, 0xaa, 0x9a,\n+\t\t0x7e, 0x5a, 0xfa, 0x26, 0x46, 0x49, 0xfc, 0x9c,\n+\t\t0xaa, 0x21, 0x06, 0x45, 0xf1, 0xa0, 0xc9, 0xef,\n+\t\t0x6b, 0x89, 0xf2, 0x01, 0x20, 0x54, 0xfa, 0x0a,\n+\t\t0x23, 0xff, 0xbd, 0x64, 0x35, 0x94, 0xfd, 0x35,\n+\t\t0x70, 0x52, 0x94, 0x66, 0xc5, 0xd0, 0x27, 0xc1,\n+\t\t0x8f, 0x6d, 0xc4, 0xa3, 0x34, 0xc2, 0xea, 0xf0,\n+\t\t0xb3, 0x0d, 0x6c, 0x13, 0xb5, 0xc9, 0x6e, 0x5c,\n+\t\t0xeb, 0x8b, 0x7b, 0xf5, 0x21, 0x4c, 0xe3, 0xb7,\n+\t\t0x73, 0x6d, 0x07, 0xaa, 0x44, 0xc4, 0xba, 0xc5,\n+\t\t0xa5, 0x0e, 0x75, 0x28, 0xb7, 0x50, 0x22, 0x54,\n+\t\t0xa7, 0xe1, 0x2e, 0xfd, 0x20, 0xcd, 0xa4, 0x31,\n+\t\t0xa3, 0xb2, 0x73, 0x98, 0x7c, 0x3c, 0x8f, 0xa3,\n+\t\t0x40, 0x8a, 0xaf, 0x31, 0xfa, 0xf9, 0x70, 0x4d,\n+\t\t0x83, 0x10, 0xc4, 0xa0, 0x9c, 0xd6, 0xa3, 0xd5,\n+\t\t0x07, 0xaf, 0xaf, 0x35, 0x15, 0xd0, 0x84, 0x09,\n+\t\t0x20, 0x36, 0x88, 0xac, 0x6f, 0x16, 0x5e, 0x03,\n+\t\t0xa9, 0xfc, 0xb3, 0x2d, 0x01, 0x57, 0xb3, 0xed,\n+\t\t0x4b, 0x55, 0x2b, 0xbc, 0x92, 0x87, 0x3e, 0x27,\n+\t\t0xc4, 0x2c, 0x44, 0xac, 0x05, 0x5f, 0x26, 0xe7,\n+\t\t0xe9, 0xb0, 0x2d, 0x6b, 0x3c, 0x8c, 0xd2, 0xb4,\n+\t\t0x3c, 0xb4, 0x86, 0xfe, 0x68, 0x99, 0x2a, 0x42,\n+\t\t0xac, 0xa4, 0xb3, 0x89, 0x61, 0xb3, 0xd1, 0xdf,\n+\t\t0x9b, 0x58, 0xc7, 0x81, 0x62, 0x87, 0x26, 0x52,\n+\t\t0x51, 0xe7, 0x7d, 0x7c, 0x37, 0x14, 0xe5, 0x19,\n+\t\t0x28, 0x34, 0x3e, 0x95, 0x17, 0x36, 0x12, 0xf9,\n+\t\t0x5e, 0xc1, 0x3c, 0x9c, 0x28, 0x70, 0x06, 0xdf,\n+\t\t0xc4, 0x6d, 0x25, 0x04, 0x46, 0xe0, 0x95, 0xf0,\n+\t\t0xc8, 0x57, 0x48, 0x27, 0x26, 0xf3, 0xf7, 0x19,\n+\t\t0xbe, 0xea, 0xb4, 0xd4, 0x64, 0xaf, 0x67, 0x7c,\n+\t\t0xf5, 0xa9, 0xfb, 0x85, 0x4a, 0x43, 0x9c, 0x62,\n+\t\t0x06, 0x5e, 0x28, 0x2a, 0x7b, 0x1e, 0xb3, 0x07,\n+\t\t0xe7, 0x19, 0x32, 0xa4, 0x4e, 0xb4, 0xce, 0xe0,\n+\t\t0x92, 0x56, 0xf5, 0x10, 0xcb, 0x56, 0x34, 0x4b,\n+\t\t0x0d, 0xe1, 0xd3, 0x6d, 0xfe, 0xf0, 0x44, 0xf7,\n+\t\t0x22, 0x1d, 0x5e, 0x6b, 0xa7, 0xa5, 0x83, 0x2e,\n+\t\t0xeb, 0x14, 0xf2, 0xd7, 0x27, 0x5a, 0x2a, 0xd2,\n+\t\t0x55, 0x35, 0xe6, 0x7e, 0xd9, 0x3b, 0xac, 0x4e,\n+\t\t0x5a, 0x22, 0x46, 0xd5, 0x7b, 0x57, 0x9c, 0x58,\n+\t\t0xfe, 0xd0, 0xda, 0xbf, 0x7d, 0xe9, 0x8c, 0xb7,\n+\t\t0xba, 0x88, 0xf1, 0xc3, 0x82, 0x53, 0xc3, 0x66,\n+\t\t0x20, 0x51, 0x12, 0xd3, 0xf9, 0xaf, 0xe9, 0xcb,\n+\t\t0xc1, 0x7a, 0xe6, 0x22, 0x44, 0xa5, 0xdf, 0x18,\n+\t\t0xb3, 0x6e, 0x6c, 0xba, 0xf3, 0xc6, 0x24, 0x5a,\n+\t\t0x1c, 0x67, 0xa6, 0xa5, 0xb4, 0xb1, 0x35, 0xdf,\n+\t\t0x5a, 0x60, 0x5c, 0x0b, 0x66, 0xd3, 0x1f, 0x4e,\n+\t\t0x7c, 0xcb, 0x93, 0x7e, 0x2f, 0x6d, 0xbd, 0xce,\n+\t\t0x26, 0x52, 0x44, 0xee, 0xbb, 0xd8, 0x8f, 0xf2,\n+\t\t0x67, 0x38, 0x0d, 0x3b, 0xaa, 0x21, 0x73, 0xf8,\n+\t\t0x3b, 0x54, 0x9d, 0x4e, 0x5e, 0xf1, 0xa2, 0x18,\n+\t\t0x5a, 0xf1, 0x6c, 0x32, 0xbf, 0x0a, 0x73, 0x14,\n+\t\t0x48, 0x4f, 0x56, 0xc0, 0x87, 0x6d, 0x3b, 0x16,\n+\t\t0xcc, 0x3f, 0x44, 0x19, 0x85, 0x22, 0x43, 0x5f,\n+\t\t0x8c, 0x29, 0xbd, 0xa0, 0xce, 0x84, 0xd9, 0x4a,\n+\t\t0xcf, 0x00, 0x6b, 0x37, 0x35, 0xe0, 0xb3, 0xc9,\n+\t\t0xd1, 0x58, 0xd1, 0x1b, 0xc3, 0x6f, 0xe3, 0x50,\n+\t\t0xdb, 0xa6, 0x5e, 0x03, 0x18, 0xe5, 0xe2, 0xc1,\n+\t\t0x97, 0xd5, 0xf8, 0x42, 0x6f, 0xe6, 0x61, 0x80,\n+\t\t0xc9, 0x7c, 0xc6, 0x83, 0xf0, 0xad, 0x70, 0x13,\n+\t\t0x0e, 0x26, 0x75, 0xc0, 0x12, 0x23, 0x14, 0xef,\n+\t\t0x1f, 0xdf, 0xfd, 0x47, 0x99, 0x9f, 0x22, 0xf3,\n+\t\t0x57, 0x21, 0xdc, 0x38, 0xe4, 0x79, 0x87, 0x5b,\n+\t\t0x67, 0x66, 0xdd, 0x0b, 0xe0, 0xae, 0xb5, 0x97,\n+\t\t0xd8, 0xa6, 0x5d, 0x02, 0xcf, 0x6b, 0x84, 0x19,\n+\t\t0xc1, 0xbb, 0x25, 0xd2, 0x10, 0xb9, 0x63, 0xeb,\n+\t\t0x4b, 0x27, 0x8d, 0x05, 0x31, 0xce, 0x3b, 0x0c,\n+\t\t0x5f, 0xd4, 0x83, 0x47, 0xa4, 0x8b, 0xc4, 0x76,\n+\t\t0x33, 0x74, 0x1a, 0x07, 0xf8, 0x18, 0x82, 0x1c,\n+\t\t0x8e, 0x01, 0x75, 0x78, 0xea, 0xd9, 0x72, 0x61,\n+\t\t0x71, 0xa9, 0x09, 0x44, 0x7b, 0x0f, 0x12, 0xcf,\n+\t\t0x4c, 0x76, 0x7b, 0x69, 0xc8, 0x64, 0x98, 0x60,\n+\t\t0x45, 0xb6, 0xc7, 0x6b, 0xd8, 0x43, 0x99, 0x08,\n+\t\t0xc9, 0xd3, 0x6f, 0x01, 0x4f, 0x57, 0x6f, 0x49,\n+\t\t0x4f, 0x4f, 0x72, 0xa4, 0xa2, 0x45, 0xe1, 0x0e,\n+\t\t0xf2, 0x08, 0x3e, 0x67, 0xc3, 0x83, 0x5b, 0xb1,\n+\t\t0x24, 0xc0, 0xe0, 0x3a, 0xf5, 0x1f, 0xf2, 0x06,\n+\t\t0x4b, 0xa7, 0x6f, 0xd2, 0xb2, 0x81, 0x96, 0x91,\n+\t\t0x42, 0xb1, 0x53, 0x65, 0x3a, 0x12, 0xcd, 0x33,\n+\t\t0xb3, 0x7e, 0x79, 0xc0, 0x46, 0xf6, 0xd8, 0x4a,\n+\t\t0x22, 0x35, 0xb8, 0x3f, 0xe4, 0x08, 0x88, 0x49,\n+\t\t0x3c, 0x73, 0x9a, 0x44, 0xe3, 0x3b, 0xcc, 0xc4,\n+\t\t0xae, 0x7c, 0xbe, 0xfd, 0xa6, 0x4a, 0xd4, 0x26,\n+\t\t0x52, 0x58, 0x81, 0x30, 0x66, 0x44, 0x54, 0xc8,\n+\t\t0xe4, 0x7c, 0x5b, 0x63, 0x06, 0x60, 0x94, 0x62,\n+\t\t0xe5, 0x47, 0x45, 0xfb, 0x58, 0xf5, 0x6a, 0x7c,\n+\t\t0xb2, 0x35, 0x08, 0x03, 0x15, 0x68, 0xb3, 0x13,\n+\t\t0xa5, 0xbd, 0xf2, 0x1e, 0x2e, 0x1c, 0x8f, 0xc6,\n+\t\t0xc7, 0xd1, 0xa9, 0x64, 0x37, 0x2b, 0x23, 0xfa,\n+\t\t0x7e, 0x56, 0x22, 0xf0, 0x8a, 0xbd, 0xeb, 0x04\n+},\n+\n+r256a128_cek[] \u003d {\n+\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n+\t\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n+\t\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f\n+}\n+;\n+\n+static int\n+test_jwe_ra_ptext_1024(struct lws_context *context, char *jwk_txt, int jwk_len)\n+{\n+\tchar temp[4096], compact[4096];\n+\tstruct lws_jwe jwe;\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\t/* reuse the rsa private key from the JWE Appendix 2 test above */\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* dup the plaintext, it will be replaced in-situ by the ciphertext */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tra_ptext_1024, sizeof(ra_ptext_1024),\n+\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n+\t\t\t\t\t\t sizeof(ra_ptext_1024)))) {\n+\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* dup the cek, since it will be replaced by the encrypted key */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_EKEY,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tr256a128_cek, sizeof(r256a128_cek),\n+\t\t\t\tLWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n+\t\tlwsl_notice(\u0022%s: Not enough temp space for EKEY\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tjwe.jws.map.buf[LJWE_JOSE] \u003d rsa256a128_jose;\n+\tjwe.jws.map.len[LJWE_JOSE] \u003d (uint32_t)strlen(rsa256a128_jose);\n+\n+\tn \u003d lws_jwe_parse_jose(\u0026jwe.jose, jwe.jws.map.buf[LJWE_JOSE],\n+\t\t\t (int)jwe.jws.map.len[LJWE_JOSE],\n+\t\t\t lws_concat_temp(temp, temp_len), \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022, __func__, n);\n+\t\tgoto bail;\n+\t}\n+\n+\t// puts(compact);\n+\n+\tlws_jwe_destroy(\u0026jwe);\n+\tlws_jwe_init(\u0026jwe, context);\n+\ttemp_len \u003d sizeof(temp);\n+\n+\t/* now we created the encrypted version, see if we can decrypt it */\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_jws_compact_decode(compact, n, \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n+\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: failed to parse generated compact\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n+\t\t\t sizeof(ra_ptext_1024))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+static const char *rsa256a192_jose \u003d\n+\t\t\u0022{ \u005c\u0022alg\u005c\u0022:\u005c\u0022RSA1_5\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A192CBC-HS384\u005c\u0022}\u0022;\n+\n+static const uint8_t r256a192_cek[] \u003d {\n+\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n+\t\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n+\t\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\n+\t\t0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n+\t\t0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f\n+}\n+;\n+\n+static int\n+test_jwe_r256a192_ptext(struct lws_context *context, char *jwk_txt, int jwk_len)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[4096], compact[4096];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\t/* reuse the rsa private key from the JWE Appendix 2 test above */\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * dup the plaintext into the ciphertext element, it will be\n+\t * encrypted in-place to a ciphertext of the same length + padding\n+\t */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tra_ptext_1024, sizeof(ra_ptext_1024),\n+\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n+\t\t\t\t\t\t sizeof(ra_ptext_1024)))) {\n+\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* copy the cek, since it will be replaced by the encrypted key */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_EKEY,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tr256a192_cek, sizeof(r256a192_cek),\n+\t\t\t\tLWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n+\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tjwe.jws.map.buf[LJWE_JOSE] \u003d rsa256a192_jose;\n+\tjwe.jws.map.len[LJWE_JOSE] \u003d (uint32_t)strlen(rsa256a192_jose);\n+\n+\tn \u003d lws_jwe_parse_jose(\u0026jwe.jose, jwe.jws.map.buf[LJWE_JOSE],\n+\t\t\t (int)jwe.jws.map.len[LJWE_JOSE],\n+\t\t\t lws_concat_temp(temp, temp_len), \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022, __func__, n);\n+\t\tgoto bail;\n+\t}\n+\n+\t// puts(compact);\n+\n+\t/* now we created the encrypted version, see if we can decrypt it */\n+\n+\tlws_jwe_destroy(\u0026jwe);\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_jws_compact_decode(compact, n, \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n+\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: failed to parse generated compact\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n+\t\t\t sizeof(ra_ptext_1024))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+\n+static const char *rsa256a256_jose \u003d\n+\t\t\u0022{ \u005c\u0022alg\u005c\u0022:\u005c\u0022RSA1_5\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A256CBC-HS512\u005c\u0022}\u0022;\n+\n+static const uint8_t r256a256_cek[] \u003d {\n+\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n+\t\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n+\t\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\n+\t\t0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n+\t\t0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n+\t\t0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,\n+\t\t0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f\n+}\n+;\n+\n+static int\n+test_jwe_r256a256_ptext(struct lws_context *context, char *jwk_txt, int jwk_len)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[4096], compact[4096];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\t/* reuse the rsa private key from the JWE Appendix 2 test above */\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * dup the plaintext into the ciphertext element, it will be\n+\t * encrypted in-place to a ciphertext of the same length + padding\n+\t */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tra_ptext_1024, sizeof(ra_ptext_1024),\n+\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n+\t\t\t\t\t\t sizeof(ra_ptext_1024)))) {\n+\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* copy the cek, since it will be replaced by the encrypted key */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_EKEY,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tr256a256_cek, sizeof(r256a256_cek),\n+\t\t\t\tLWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n+\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tjwe.jws.map.buf[LJWE_JOSE] \u003d rsa256a256_jose;\n+\tjwe.jws.map.len[LJWE_JOSE] \u003d (uint32_t)strlen(rsa256a256_jose);\n+\n+\tn \u003d lws_jwe_parse_jose(\u0026jwe.jose, rsa256a256_jose,\n+\t\t\t (int)strlen(rsa256a256_jose),\n+\t\t\t lws_concat_temp(temp, temp_len), \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022, __func__, n);\n+\t\tgoto bail;\n+\t}\n+\n+\t// puts(compact);\n+\n+\t/* now we created the encrypted version, see if we can decrypt it */\n+\n+\tlws_jwe_destroy(\u0026jwe);\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_jws_compact_decode(compact, n, \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n+\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: failed to parse generated compact\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n+\t\t\t sizeof(ra_ptext_1024))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+/* produced by running the minimal example `lws-crypto-jwk -t RSA -b 2048 -c` */\n+\n+static const char *rsa_key_2048 \u003d\n+\t\u0022{\u0022\n+\t\t\u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022n\u005c\u0022:\u005c\u0022lBJdvUq-9_8hlcduIWuBjRb0tGzzAvS4foqoNCO7g-rOXMdeAcmq\u0022\n+\t\t \u0022aSzWTbkaGIc3L1I4-Q3TOZtxn2UhuDlShZRIhM6JCQuUVNVAF3TD7oXxHtZ\u0022\n+\t\t \u0022LJ7y_BqCUlrAmW31lu-nVmhY2G3xW26yXWUsDbCxz0hfLbVnXRSvVKLzYWm\u0022\n+\t\t \u0022_yyrFyEWfxB8peDocvKGh879z_aPCKE3PDOEl2AsgzYfpnWCLytkgnrTeL6\u0022\n+\t\t \u0022qY8HXxvvV-Jw-XMaRiwH0VldpIjs4DaoN35Kj1Ex7QOZznTkbYtMIqse8bR\u0022\n+\t\t \u0022LoR8Irkxbc5ncUAuX1KSV6lpPtelsA3RtEjJ4NHV-5eEABiYh8_CFQ\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022DDpguQ9RVQFMoJC5z2hlkvq91kvsXPv2Y9Dcki256xYlg55H7Pre\u0022\n+\t\t \u0022p__hahrABR2Jg6QVJhArt5ABjUnDQ_JL69HH6VvLD6RVVBTQ-FRBZ_3HYKY\u0022\n+\t\t \u0022Oynx5BA7tJm1BRatF5FkBCvq27i8nAc4vfjAb22o9CFvEW3FLaKAgOCncQ3\u0022\n+\t\t \u0022Tnbz9CddH89n7DXw4kBFI8q5ugF_aRIg5-i42W_hQinLaBhZ_zhAuE-nvlt\u0022\n+\t\t \u0022ZnhDal8cX3T60lNoUrDOlirqEOXKO3gXCHpm3csZ6nabHYD1UCyHOmi2RsR\u0022\n+\t\t \u0022pzjaiqjXdPbwPzQoh2DcYpavNrf1mtHiqTwLZDTJIRHWHufJzHf-sw\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u0022ySeC3FtvzduDEL-FX4JqbRN06PdBhUmosCkymmbBjriuLNpkGkG-\u0022\n+\t\t \u00221ex7r-M8neUBZbctmDdih6cpLZ8hjZv3eEDZ4b5Z2LqZnja4QvVoWLUs4Fb\u0022\n+\t\t \u0022NN_PxJCR5H28uUfT6ThxqT0Nb2enb8Dyp0Qxvd7eJUeYz6jOt7pEK-ErTB4\u0022\n+\t\t \u0022M\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u0022vHG2Pd6QUH7vFZjJtXwmlVnrz5tdJvUPQvz7ggeM69cqhf4vLajz\u0022\n+\t\t \u0022sqP9GhJr7bEkp6vKVdZGmfEdiFRD8cssIZq651oAO5Wr7zZd2mR_hG9jZx7\u0022\n+\t\t \u00228Davfuxr4SZNN-bmoxO6dbDi-X2c7fvMI2YeJwL4groNKyiosdUYILTrYRI\u0022\n+\t\t \u0022c\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022h5Gqf2rcokgEQGBjuigCJDtNuskRjoxDNV6-rRL99nt_X9lcR9n\u0022\n+\t\t \u0022xjOnRvowOyXeTBoN7JjCFpllBxm6ORYtNMO28KomIsimo6NmGPBJ7XfXVJe\u0022\n+\t\t \u0022k6bDBrX-l4_HeJJ1FM9SHvgDYsjGQxh-rKpIqWAYBf-yOD758e5T85vndnX\u0022\n+\t\t \u0022JM\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022K9LiB-dfdmjenw4mMp-JtYfw8Bn4gtvQzcpZjzbETgB-8iRXwm2\u0022\n+\t\t \u0022dJvk-HjcUhHWCyb-I0YeAacKKFK9MEconHDWIq87haPn4vyvMjcJ7aUgiPN\u0022\n+\t\t \u0022QW1_MVl8TA4xNvudi0Z__5-jYEB9nRG0fX0gbUQU-19_-uf-9o4WkE88fQj\u0022\n+\t\t \u0022bc\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022LEkTRqmomn9UiASeRfAKw-Z5q7cye9CSL4luSexFvA3Du7Oin-s\u0022\n+\t\t \u0022L9a7F3nJN4CuYzhtNMxQ0hM7k6ExzhDhXDlNRHxnNEDt81-CFRV98v7GVWV\u0022\n+\t\t \u0022SH1KnaKf9wgegxSSm-x536ki2SI8EN4k4qkqRF0iLVHZK7CgnWMbtt6tnpp\u0022\n+\t\t \u00223k\u005c\u0022\u0022\n+\t\u0022}\u0022;\n+/* produced by running the minimal example `lws-crypto-jwk -t RSA -b 4096 -c` */\n+\n+static const char *rsa_key_4096 \u003d\n+\t\u0022{\u0022\n+\t\t\u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022n\u005c\u0022:\u005c\u0022uiLBz1SUgd4eQ0okg6tlPdk9QUhTsqXmiJXygWVFgzT45E5_Rfkq\u0022\n+\t\t \u0022vZ2fwAqQ8DvxkDTUWiKpeXMpPRNWG5GxuBuq9n7xdA1vn1eQi8LoekB28dg\u0022\n+\t\t \u00223MwMfozVSKCzyxG1f81xPE5x3EMVhCcx6hshhlMEHkzNNhE07d-oRO87ZC0\u0022\n+\t\t \u0022z_5L3Vh03uJBXaDKVlsgHAazoHLhn6G4odqv-ro54T6Nx1eEtyTnMmFY5ND\u0022\n+\t\t \u0022V4rN0SjQvSefbZZtsrtby8Z0JmeyvynmDwOINj7FpmPmpFLoWGXntc2yxPP\u0022\n+\t\t \u00228SHnqfT9ESh94fxCMxRhDNohgpegRHyiYwj3M5ZYY6reCZYfOQONSWmc8yp\u0022\n+\t\t \u0022NBMJqj4LuJ2bTMGAFS17ZP4ZZWm5RP9ax100Dgk0yxP1UrybG5dCfJRQvHC\u0022\n+\t\t \u0022ncxG_aL6cSQu2o4fXqlJsNHxk3FjHtV_CMZ3tqvGTvwrs4yxvKwKv6r3fRh\u0022\n+\t\t \u0022KL01bGOePzp9THkHW2-lzVj6kUwnxBdHGZE6fcAnczOdp8ZIEdV1w6ThimC\u0022\n+\t\t \u0022m3Bw_TIyl3tkuxRWXpc_d6Q4iiSVKGKCvUvfAlESpTA4tIhQkij-T9FEoj2\u0022\n+\t\t \u0022WE2H1D35AKmjcfLCh6yszu8cmDNedn862pwnawE2RvRFAyuI113fLQeCbCz\u0022\n+\t\t \u0022tQ1JHuD8cnQt0hpGzReTa5UJ8OEOGIlyXNdWZyTpk\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022G2ZW582AT-6xvz-IiP5fuJ9EMloygeuEeEo0aMJO3X3cfoUknJkN\u0022\n+\t\t \u0022ZtyvYa5cgBSe3la8hKkyD9_5K9WvGP9VLTAbdk4g_m-k5QyXiU9PeAGJ0Nd\u0022\n+\t\t \u0022-Zqq4y0Zj2eil8u7Tz0fhFxay-zvG6VGZnsIcBTD2C7_jUwyoaqJA17A_CH\u0022\n+\t\t \u0022gU-ifMqS56VgMGdlKZmf7Cg7ZGzM1DoS6vZ9bbfgoczaw4OZVHlg9Cxa0NI\u0022\n+\t\t \u0022CDi1S-sJcTLGN_RLISKN5H0J54ZfzF6fUEn5kNykLTZrAvj2XV7g4UUOogn\u0022\n+\t\t \u00221cvjJYRcBVzTzQKcfxbqo2DvymDGFZbQM6pj80rYJ5HFPh2EapjggPN8hXp\u0022\n+\t\t \u0022NlTNDEvC84QFv0lo2E-0nVWQqcyHtXd431O1JH2h5X822zKjXxkaztQSCj9\u0022\n+\t\t \u0022YP7AdAeoxIaWOa3aO1vcwURH2WWaNV-_KXVkPJNzfo9-bGYwblMw_RIqIkN\u0022\n+\t\t \u0022BDayTb8rBuQHTCE_tSEHgoSnkityGpr8j_vgA-Fa-SqmdqUlbklVpwA_Mq_\u0022\n+\t\t \u0022UH7RCaqe91dWxRhS_7c85tFMRFCKOcaRXkwxEpP2LD1AYe8yvVQlr0Se8_d\u0022\n+\t\t \u0022RefuQcC-BECwMW-TCgR3VxAuL7ExNTYe4bhBD8WYXsHP7wDXWX2Q4v7IRzj\u0022\n+\t\t \u0022cfVIdpTNYuWEd69PvXBCuy75hmDniSmS3Xps3ItGU\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u0022961BtLSIZkHO7Vu1KfaA3urcwGpISKJiTSB5Nh6npxJr9mSjzv_f\u0022\n+\t\t \u0022e8VoxCX6CWGY0SEeQNUQ6ceTnAAxkSHtZJQGed598jBtxIexAWEE7oc9s9d\u0022\n+\t\t \u0022b0cWu4QWIVZYXrcOTEWmK1kWN4PXmnnQknrWQF49adn81BaOXqoL-tahe7f\u0022\n+\t\t \u0022faXzXe0RXuohK543ZKbuuHQ2TxqFG7CZpXiH_qn1Syao32u0V3iDFpmmCUV\u0022\n+\t\t \u0022h9O2JCzfo8sAosTrnQwC0pXz3Nvr_9Cnk6bMluJoMrwB1Ywg_DPQ1WvpYHO\u0022\n+\t\t \u0022URezEOqVC8Y3zrko199TMX2COKGNFgutVpnzxs2_h0PyINUmwrY4zQ\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u0022wGQRaxy_gBafbrVJy4f32O0a2FQHzmS--WgHhoteDoF6ZAajLcV0\u0022\n+\t\t \u0022GEvb-AVmFER1Wii62BFaFJOYQIegELvnBFFzD6oHJRX7bM4m36G8J_TC1o9\u0022\n+\t\t \u0022T1IFnxOpaoFDf4JWf2k7DCXClGg_zueyOD8fj8F6j2nqpOfytuLmikHcWMc\u0022\n+\t\t \u0022dGTHTCRtQmvOk3pm0uk2qR0cQb5L3Ocv45tCKr55tMc6Zx3DKkMt1kmUwd2\u0022\n+\t\t \u0022HFfk_0WM6R7q4LNGIjwl8dwiERppLKA8xao9i3jOOdFEfAD-Zqv8H-32cyH\u0022\n+\t\t \u0022Mg6Guo4tPNAYSzcsz8nbEYPtKVVm-PDuM2cx0iaKnS8BIK2XTbzc_Q\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022ZXLWIwp_hEMYWyjhP9r0VlqlKTtfeEDrOuQ-Qei0iz6EclwurK8\u0022\n+\t\t \u0022p_yyRCSb1D7qmOaLzHWMollllINUDeIsJDdWEAY8cz4L-sy1RV1tCBeHnaC\u0022\n+\t\t \u00226iMX5jb1Aw072y3T3qk4tDjxjWUHroh6bTCR8dckkJqNfaBAFKMlGNuyLIH\u0022\n+\t\t \u00223kSPUV3ivUM1d4NvhnJyz02HmjOgz9W-Uv65rJei_zJR9P2aCbAG00CEHXW\u0022\n+\t\t \u0022zJ_uT86VdxV11WTaHu8Abt94sER8Tv6jbuyLrUjJSs9VGew32xNcEhya4ZQ\u0022\n+\t\t \u0022VyimG8zri6fu7CDXXgPS8wtzB5ihl_c2ypnJQ4_GKrgEqwEAOrFqvUQ\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022uzlmngcm8R6S3qi7fL7_2fG7uyPjSN5P3uR21l8QFCu6kFbJO8S\u0022\n+\t\t \u00224muBP20hds4F_dlLGqXgRYo7TjpCtmztQsKoWv_ql41hGCfeAawa41WViqm\u0022\n+\t\t \u0022xmlxmrgzzRHsw1YhgZrNgTAz_E290EQT3Mbd0HnCZtbDMMNisIYAj_A3lwd\u0022\n+\t\t \u0022tbHOaYyXb0dSZ_nkSUVO05tQ2aGAo8Xtl5ih0NqaQR_XNhwW2pI0lsTB__D\u0022\n+\t\t \u002215tU-O5FSdJaq2ip8KNrBzmF8IYrDKTNykKWAKRdSEX_uFoLdD8t0mxn3SM\u0022\n+\t\t \u0022luffa8vdjXJfh3GiASmHUt3HcPOooQEAufoWBPVJWeGqCvWtRH8yYfQ\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022h-e9es5J49OUF48gSXUI8cynZ8ydv5cThXc1deV3mil_7_7Hg8E\u0022\n+\t\t \u0022jV3gAErO4l-irHJplFmHFZvU1ud4zs1gtBt5TA-EeeepYOHMSssWDvDK3WI\u0022\n+\t\t \u0022zsM6C3vcNTSkT-ihaSFmPWHCVwJ1R3auWfeI2In3at0jd4t-OK-cCcGZXb7\u0022\n+\t\t \u002290-EnyyDcdFTU9WfwVSOJffRGjoUYX8DexavClv7CBzPhpdUzGoeyarNaG4\u0022\n+\t\t \u0022z9MI8Q8txHyHgc_D70lZUum1cj0bZwgEj6yDzOPzSgUmICFJiLDDj93oPaI\u0022\n+\t\t \u0022v-5CQ_Ckju7icexc_kuuYTKBOLTj_vfaURnV3KCHul2UljUYOxkfeNQ\u005c\u0022\u0022\n+\t\u0022}\u0022;\n+\n+static const char *rsa_key_4096_no_optional \u003d\n+\t\u0022{\u0022\n+\t\t\u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022n\u005c\u0022:\u005c\u0022uiLBz1SUgd4eQ0okg6tlPdk9QUhTsqXmiJXygWVFgzT45E5_Rfkq\u0022\n+\t\t \u0022vZ2fwAqQ8DvxkDTUWiKpeXMpPRNWG5GxuBuq9n7xdA1vn1eQi8LoekB28dg\u0022\n+\t\t \u00223MwMfozVSKCzyxG1f81xPE5x3EMVhCcx6hshhlMEHkzNNhE07d-oRO87ZC0\u0022\n+\t\t \u0022z_5L3Vh03uJBXaDKVlsgHAazoHLhn6G4odqv-ro54T6Nx1eEtyTnMmFY5ND\u0022\n+\t\t \u0022V4rN0SjQvSefbZZtsrtby8Z0JmeyvynmDwOINj7FpmPmpFLoWGXntc2yxPP\u0022\n+\t\t \u00228SHnqfT9ESh94fxCMxRhDNohgpegRHyiYwj3M5ZYY6reCZYfOQONSWmc8yp\u0022\n+\t\t \u0022NBMJqj4LuJ2bTMGAFS17ZP4ZZWm5RP9ax100Dgk0yxP1UrybG5dCfJRQvHC\u0022\n+\t\t \u0022ncxG_aL6cSQu2o4fXqlJsNHxk3FjHtV_CMZ3tqvGTvwrs4yxvKwKv6r3fRh\u0022\n+\t\t \u0022KL01bGOePzp9THkHW2-lzVj6kUwnxBdHGZE6fcAnczOdp8ZIEdV1w6ThimC\u0022\n+\t\t \u0022m3Bw_TIyl3tkuxRWXpc_d6Q4iiSVKGKCvUvfAlESpTA4tIhQkij-T9FEoj2\u0022\n+\t\t \u0022WE2H1D35AKmjcfLCh6yszu8cmDNedn862pwnawE2RvRFAyuI113fLQeCbCz\u0022\n+\t\t \u0022tQ1JHuD8cnQt0hpGzReTa5UJ8OEOGIlyXNdWZyTpk\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022G2ZW582AT-6xvz-IiP5fuJ9EMloygeuEeEo0aMJO3X3cfoUknJkN\u0022\n+\t\t \u0022ZtyvYa5cgBSe3la8hKkyD9_5K9WvGP9VLTAbdk4g_m-k5QyXiU9PeAGJ0Nd\u0022\n+\t\t \u0022-Zqq4y0Zj2eil8u7Tz0fhFxay-zvG6VGZnsIcBTD2C7_jUwyoaqJA17A_CH\u0022\n+\t\t \u0022gU-ifMqS56VgMGdlKZmf7Cg7ZGzM1DoS6vZ9bbfgoczaw4OZVHlg9Cxa0NI\u0022\n+\t\t \u0022CDi1S-sJcTLGN_RLISKN5H0J54ZfzF6fUEn5kNykLTZrAvj2XV7g4UUOogn\u0022\n+\t\t \u00221cvjJYRcBVzTzQKcfxbqo2DvymDGFZbQM6pj80rYJ5HFPh2EapjggPN8hXp\u0022\n+\t\t \u0022NlTNDEvC84QFv0lo2E-0nVWQqcyHtXd431O1JH2h5X822zKjXxkaztQSCj9\u0022\n+\t\t \u0022YP7AdAeoxIaWOa3aO1vcwURH2WWaNV-_KXVkPJNzfo9-bGYwblMw_RIqIkN\u0022\n+\t\t \u0022BDayTb8rBuQHTCE_tSEHgoSnkityGpr8j_vgA-Fa-SqmdqUlbklVpwA_Mq_\u0022\n+\t\t \u0022UH7RCaqe91dWxRhS_7c85tFMRFCKOcaRXkwxEpP2LD1AYe8yvVQlr0Se8_d\u0022\n+\t\t \u0022RefuQcC-BECwMW-TCgR3VxAuL7ExNTYe4bhBD8WYXsHP7wDXWX2Q4v7IRzj\u0022\n+\t\t \u0022cfVIdpTNYuWEd69PvXBCuy75hmDniSmS3Xps3ItGU\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u0022961BtLSIZkHO7Vu1KfaA3urcwGpISKJiTSB5Nh6npxJr9mSjzv_f\u0022\n+\t\t \u0022e8VoxCX6CWGY0SEeQNUQ6ceTnAAxkSHtZJQGed598jBtxIexAWEE7oc9s9d\u0022\n+\t\t \u0022b0cWu4QWIVZYXrcOTEWmK1kWN4PXmnnQknrWQF49adn81BaOXqoL-tahe7f\u0022\n+\t\t \u0022faXzXe0RXuohK543ZKbuuHQ2TxqFG7CZpXiH_qn1Syao32u0V3iDFpmmCUV\u0022\n+\t\t \u0022h9O2JCzfo8sAosTrnQwC0pXz3Nvr_9Cnk6bMluJoMrwB1Ywg_DPQ1WvpYHO\u0022\n+\t\t \u0022URezEOqVC8Y3zrko199TMX2COKGNFgutVpnzxs2_h0PyINUmwrY4zQ\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u0022wGQRaxy_gBafbrVJy4f32O0a2FQHzmS--WgHhoteDoF6ZAajLcV0\u0022\n+\t\t \u0022GEvb-AVmFER1Wii62BFaFJOYQIegELvnBFFzD6oHJRX7bM4m36G8J_TC1o9\u0022\n+\t\t \u0022T1IFnxOpaoFDf4JWf2k7DCXClGg_zueyOD8fj8F6j2nqpOfytuLmikHcWMc\u0022\n+\t\t \u0022dGTHTCRtQmvOk3pm0uk2qR0cQb5L3Ocv45tCKr55tMc6Zx3DKkMt1kmUwd2\u0022\n+\t\t \u0022HFfk_0WM6R7q4LNGIjwl8dwiERppLKA8xao9i3jOOdFEfAD-Zqv8H-32cyH\u0022\n+\t\t \u0022Mg6Guo4tPNAYSzcsz8nbEYPtKVVm-PDuM2cx0iaKnS8BIK2XTbzc_Q\u005c\u0022\u0022\n+\t\u0022}\u0022;\n+\n+/* This is a compact JWE containing the plaintext ra_ptext_1024 for the key\n+ * lws_jwe_ex_a2_jwk_json... produced by test test above running on OpenSSL.\n+ */\n+\n+static char *jwe_compact_rsa_cbc_openssl \u003d\n+ \u0022eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.\u0022\n+ \u0022HgQBfAg2IUpExcs74-gtuSOciw6rxh2cc4x9MVRWDZKSvMqoBYKAxl6ebSxGTReHhbvhv2Rm8stKq\u0022\n+ \u0022OIROhWzTNGTQPnSRMzAm9x6ms39hAIGh1KCEZ47MRYkCN7hElfDVtczOCX3ZRsG9_qYEmzcY1aJ-4\u0022\n+ \u0022_LS3yeP0HfqKBmcfvjVLw-KqcUuHp5YXsZEvt28nA9uBlCN0ROWy_2Fs-zlQj8pDMWo5pZrffKTUX\u0022\n+ \u0022gUh_UJ9eC3qNyXtQSqUH-5vDeHPhxNnIJOsmJ5ZUAjxXPm-RJZRC9THg0DzGRZn9IqfP9qcanbcZ8\u0022\n+ \u0022iow7gjFh1EPp3MKlpZqDKbLLei1WZvz2_A.\u0022\n+ \u0022q4STtyu4yxZfH1HNDYlYcA.\u0022\n+ \u0022_uRfuwWO22_auSqXHORw_e_Q6PmbpC0sv0tefVKsj3Zqnh2qUBlj10kiWBMWoMMjqsClBO0nUoup4\u0022\n+ \u0022c7i1YSqxlCHliXru3athv_EYtg5qvC-z2co9NiFABHCHmBDrhj7CuKN5gqFDt1EbYMLwWtU3gOnQy\u0022\n+ \u0022dvnzfFcQs4_jKi6tRpQzbobrkkZ2p7Y_ltjA1Wmwqrp9O8DGSRnvcomqzGHcshuyxTkjLDzD8TSMR\u0022\n+ \u0022S1kp-miy5eDGAcp-ymWiUKN7gswy5FPjPQYzgs7Vc0n0R1ljepRHJiHaP61z_DKWXrCE6RqAVqnaw\u0022\n+ \u0022TjjVOXXKKF9pz9W7pZL8diLZ0Ueev6xk8wzRRsUChM5toQNzFLXsnzSDQSzfSKpRnLjYvosiEegyx\u0022\n+ \u0022RrwtQwEcNCXRj0aGxG6e_W79JdUJoi4blpTtrAVn_pk7SgRiU3aly1vso5tV_0kvMOcS6Hn38mqRQ\u0022\n+ \u0022PQxbdIpohi8C7FFabluZqGoiji8ZTM3v-2ib2vrBFj1YvoyPG1HXJsABINzo0xOkrMFNfN_oQrCSM\u0022\n+ \u0022Ij49N86GXmYOnu5jtZeSMXZIR2BAXnu0upXMsvtSjU8D-LJJChy0XNYoyuJar5P3YhDStdTfmn0z-\u0022\n+ \u0022XLwaIHWc1L9-rmW9CZey3HxCLKEnr7-FjXsXqzAArsFqn1X_sVR5HRHng5ioc7sUaRoC1S_k0XPVC\u0022\n+ \u0022qCjZvkbRry2cp2313DNwjl8SK-iZA0fVUZVPM7_eZfpEgB3bBTyamtAaqQeES6lcVEtpg176Mlh64\u0022\n+ \u00223JCAjroJPP4eqAA3JHnDgwlO-XhlLPTNNQ5FMLBC_dp41A-H3HFlbQUR6jX3k_H4Ggqtit50EIye3\u0022\n+ \u0022nnKb3emFn9KVyeZCYaBecYbicEIMKW7sWLbcE_cDGqkHZcMGTOQKRiLp-xwyEu89oDGAcGBYpmC_f\u0022\n+ \u0022iQ2qyFfe6tQK_5nPZbtW2mudiYZ-d0YIURSTp58S_n6w3wLDUEcuZtv-nhCaFVy8oUbAztkBIK6pu\u0022\n+ \u0022VamKhHVLkCtOGIdNJYbLKAedhK1lQVPbrvfcSDPPkhxSx9AjKqhKA3ZPMA_UXQb6p9c33tgi_MdZX\u0022\n+ \u0022-jRGXwGKWBCrv4UjttFLV-a5U7NgxQIIjwfAoutXtYardFw2d5nTJRqBrw06PSqaLzQi616_b-U0g\u0022\n+ \u00226bWxrFObIWrKODkGfQcXPXIQxW_4Vh6gR2GaHSi_A_5SGH0zsBtYxisbKXLK2HiZJOXBew4-am6c0\u0022\n+ \u0022R1jBh7QtOWpwrYWt0d_xxrWtKezeEp3FkrFkwWCgY9dT1uV8tKUuxeeGqshkrXifT4axttpkbi-qA\u0022\n+ \u0022eG_C6J-H29CPqScclD-A5LIg7k-KmA9hsWrXttAvoCSawNj1tv9JHq0jgP1yZytDW1DkWdCBY0au5\u0022\n+ \u00224.\u0022\n+ \u0022qqYQEaGx-lUHoO43fOXvKQ\u0022\n+;\n+\n+\n+static int\n+test_jwe_r256a128_jwe_openssl(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[2048];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,\n+\t\t\t strlen((char *)lws_jwe_ex_a2_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* converts a compact serialization to jws b64 + decoded maps */\n+\tif (lws_jws_compact_decode((const char *)jwe_compact_rsa_cbc_openssl,\n+\t\t\t\t (int)strlen((char *)jwe_compact_rsa_cbc_openssl),\n+\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n+\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n+\t\t\t sizeof(ra_ptext_1024))) {\n+\t\tlwsl_err(\u0022%s: plaintext RSA/AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+\n+/* This is a compact JWE containing the plaintext ra_ptext_1024 for the key\n+ * lws_jwe_ex_a2_jwk_json... produced by test test above running on mbedTLS.\n+ */\n+\n+static char\n+*jwe_compact_rsa_cbc_mbedtls \u003d\n+\t\u0022eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.Ptg-RZjEhY1dWg7T\u0022\n+\t\u0022v72rqRoHXBeory9ePCC5cfASTz8BH7IdSLQcPeBWHQsmd13TXPjo-dxnmkWkx9AyKdvy\u0022\n+\t\u0022K0A6oCnsP7KfbGzPwTy5eadpaaDZ3UyXIGmusLgiXGgDZ4d13voirbRQV9nQTPsagG_k\u0022\n+\t\u0022FGRI5dKzenG2WcbUhKG-uCmypzYqjNM3LqUzdH42jjjHFOBkmK_sWSZL7Uxqq8s08hkO\u0022\n+\t\u0022aXeUQyeM7Z8wm1bsZAvIfGri5LMcBS8P70AyENchlchZpTeACIOWk19ddLPUt-ruEcm0\u0022\n+\t\u0022zZV7Gjap7uG06a0m3VyR3vMpKkXnBHQxko-RICU2PDmELVXg0pZWTw.-VaaDaUiynH_t\u0022\n+\t\u0022sh2HqKISQ.vVE8j1TQinb4anJk0ArV9ccYdlUIO20vnMa7b-JGfQ7CFi_WVt6xNaqytB\u0022\n+\t\u0022QqiTHLtAxBDIV4m9Kwid-8Kcx7BmRqu-memxHztBSvBNOYWVPTxy5I2ORGLNEbPVrFYp\u0022\n+\t\u0022c2nm3TnHfr-_2fuw6_HEnyqv_c6ZyzU0-lHZ1pE5Cs-lrjnj4ibNcK6XHhrO3nxUjPMZ\u0022\n+\t\u0022rO-2B_tZwCxzKsFAqD_XGROvNGWXEgxgIr09MyuwKJnw2oZ0xOF_d3FVYjK5XMONgWPo\u0022\n+\t\u0022lyDmbP_XLSIUXbHmLxpDB5NPLN8SKRHbMV3_qw5rFRlak2C_XlR58P-Im1PQ8gMg7lgE\u0022\n+\t\u0022IFz2DrqF4sJA5TYbQG5KCdas0SfONlP1V692dufH5D30RGsiWNSrhiyDmUNC0SeB8VqA\u0022\n+\t\u0022bmc02pPGgzZHxa5-_xIHKm4h6fmnZFScjliBQ5W6smxQ6m2Kby0MkOdqlRYFn8qLYLmF\u0022\n+\t\u0022vmVNe_Q5-iLNobx-hyyeeExRXfzNOY0HHEKw67ipBWwqA0JGIggCWAFa0fpA-Wt7sNl_\u0022\n+\t\u0022gPy96nbwuXIuRoC3wuboUlDp9k2F1vC7VY6R9jdRk1VXT_O3liBIiUIRhZiqZZ75H2RV\u0022\n+\t\u0022pLYXGrvL5G9THdRcbsg3XUt-kF4vvGQAdNmPdRmuIG1DfGDmOZnXfrG8ckTvxoKBXdQZ\u0022\n+\t\u0022gfwfAQFgeHjltiWZTCSBV4464sn2qLZ1MP3Ku9bOjb72RCpIF60Cqssb8gTQyXQf48ZR\u0022\n+\t\u0022OBd242Q7Ae6PePmb_TcnG3jOguNUgmhj8iTU7QUz0uJWpJjMRPJ8vK8SnYEguGHer4qT\u0022\n+\t\u0022EocdMzRTTZB-Pr4-Ey0Hm0zeiFvjU0Qy6crjna6SKrgms4VAJT9LiicTYFPsmFBFQ0L1\u0022\n+\t\u0022BVDiZ3NTBIv_ajvzRpBNZ0IxEH5t6W3OY0223xUF3cq8c9HhwIxMf9a2-PmZ3mVWIRnU\u0022\n+\t\u0022nGegoVkzd2l6el8aw57v5KKYas4-EkovHntCZZ_hkZ1uHtezKq0EvjnT5xGWjPFjOZnh\u0022\n+\t\u0022veiozAsaMSSyTny6mcI-hjvcgd--7qlqWpt_BEkp9XVkP2k7eHLM9v4rL6hhk_n6yK3w\u0022\n+\t\u0022qKi0xDboxU5xjuBiGKb-E8um1MUEjuLqZanKSBsgU-Vwvw0gx1r-MG6BSlrgUlT2if5k\u0022\n+\t\u0022-Wfs6iVdpK7x1zZSsetp3NEjT4DUrfmp_E_CTXhOEP0AgzpQ4Ukx5bFN3gm5gyBZw1E8\u0022\n+\t\u0022q20Hs01OBcMJ9wenLEQVMvO_IEIkRNBMWEgoZ148As14LNOgdh1UBrF6W4pAUjYvA3WG\u0022\n+\t\u0022Zp7uG9ooDB1RF2aaeBqoLJflqIegsvsfaNNBDJ-U6i_jLG1FSlttEhJVdXll0gMSYlXD\u0022\n+\t\u0022O3BBil4eiUPfiksfOmsbwoIxc-3yPTivU3DPM.O_IaktJRbdV66zfhD0LQmw\u0022\n+;\n+\n+static int\n+test_jwe_r256a128_jwe_mbedtls(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[2048];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,\n+\t\t\t strlen((char *)lws_jwe_ex_a2_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* converts a compact serialization to jws b64 + decoded maps */\n+\tif (lws_jws_compact_decode((const char *)jwe_compact_rsa_cbc_mbedtls,\n+\t\t\t\t (int)strlen((char *)jwe_compact_rsa_cbc_mbedtls),\n+\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n+\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n+\t\t\t sizeof(ra_ptext_1024))) {\n+\t\tlwsl_err(\u0022%s: plaintext RSA/AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+\n+\n+/* A.3. Example JWE Using AES Key Wrap and AES_128_CBC_HMAC_SHA_256\n+ *\n+ * This example encrypts the plaintext \u0022Live long and prosper.\u0022 to the\n+ * recipient using AES Key Wrap for key encryption and\n+ * AES_128_CBC_HMAC_SHA_256 for content encryption.\n+ */\n+\n+/* \u0022Live long and prosper.\u0022 */\n+static uint8_t\n+\n+ex_a3_ptext[] \u003d {\n+\t76, 105, 118, 101, 32, 108, 111, 110,\n+\t103, 32, 97, 110, 100, 32, 112, 114,\n+\t111, 115, 112, 101, 114, 46\n+},\n+\n+*ex_a3_compact \u003d (uint8_t *)\n+\t\u0022eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0\u0022\n+\t\u0022.\u0022\n+\t\u00226KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ\u0022\n+\t\u0022.\u0022\n+\t\u0022AxY8DCtDaGlsbGljb3RoZQ\u0022\n+\t\u0022.\u0022\n+\t\u0022KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY\u0022\n+\t\u0022.\u0022\n+\t\u0022U0m_YmjN04DJvceFICbCVQ\u0022,\n+\n+*ex_a3_key \u003d (uint8_t *)\n+\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022k\u005c\u0022:\u005c\u0022GawgguFyGrWKav7AX4VKUg\u005c\u0022\u0022\n+\t\u0022}\u0022\n+;\n+\n+static int\n+test_jwe_a3(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[2048];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)ex_a3_key,\n+\t\t\t strlen((char *)ex_a3_key)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* converts a compact serialization to jws b64 + decoded maps */\n+\tif (lws_jws_compact_decode((const char *)ex_a3_compact,\n+\t\t\t\t (int)strlen((char *)ex_a3_compact),\n+\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64, temp,\n+\t\t\t\t \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ex_a3_ptext) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a3_ptext,\n+\t\t\t sizeof(ex_a3_ptext))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ex_a3_ptext, sizeof(ex_a3_ptext));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+/* JWA B.2. Test Cases for AES_192_CBC_HMAC_SHA_384\n+ *\n+ * Unfortunately JWA just gives this test case as hex literals, not\n+ * inside a JWE. So we have to prepare the inputs \u0022by hand\u0022.\n+ */\n+\n+static uint8_t\n+\n+jwa_b2_ptext[] \u003d {\n+\t0x41, 0x20, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72,\n+\t0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,\n+\t0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,\n+\t0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,\n+\t0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,\n+\t0x62, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65,\n+\t0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69,\n+\t0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,\n+\t0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74,\n+\t0x6f, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69,\n+\t0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,\n+\t0x68, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66,\n+\t0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x65,\n+\t0x6d, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,\n+\t0x75, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e,\n+\t0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65\n+},\n+\n+jwa_b2_rawkey[] \u003d {\n+\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n+\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n+\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\n+\t0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n+\t0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n+},\n+\n+jwa_b2_iv[] \u003d {\n+\t0x1a, 0xf3, 0x8c, 0x2d, 0xc2, 0xb9, 0x6f, 0xfd,\n+\t0xd8, 0x66, 0x94, 0x09, 0x23, 0x41, 0xbc, 0x04\n+},\n+\n+jwa_b2_e[] \u003d {\n+\t0xea, 0x65, 0xda, 0x6b, 0x59, 0xe6, 0x1e, 0xdb,\n+\t0x41, 0x9b, 0xe6, 0x2d, 0x19, 0x71, 0x2a, 0xe5,\n+\t0xd3, 0x03, 0xee, 0xb5, 0x00, 0x52, 0xd0, 0xdf,\n+\t0xd6, 0x69, 0x7f, 0x77, 0x22, 0x4c, 0x8e, 0xdb,\n+\t0x00, 0x0d, 0x27, 0x9b, 0xdc, 0x14, 0xc1, 0x07,\n+\t0x26, 0x54, 0xbd, 0x30, 0x94, 0x42, 0x30, 0xc6,\n+\t0x57, 0xbe, 0xd4, 0xca, 0x0c, 0x9f, 0x4a, 0x84,\n+\t0x66, 0xf2, 0x2b, 0x22, 0x6d, 0x17, 0x46, 0x21,\n+\t0x4b, 0xf8, 0xcf, 0xc2, 0x40, 0x0a, 0xdd, 0x9f,\n+\t0x51, 0x26, 0xe4, 0x79, 0x66, 0x3f, 0xc9, 0x0b,\n+\t0x3b, 0xed, 0x78, 0x7a, 0x2f, 0x0f, 0xfc, 0xbf,\n+\t0x39, 0x04, 0xbe, 0x2a, 0x64, 0x1d, 0x5c, 0x21,\n+\t0x05, 0xbf, 0xe5, 0x91, 0xba, 0xe2, 0x3b, 0x1d,\n+\t0x74, 0x49, 0xe5, 0x32, 0xee, 0xf6, 0x0a, 0x9a,\n+\t0xc8, 0xbb, 0x6c, 0x6b, 0x01, 0xd3, 0x5d, 0x49,\n+\t0x78, 0x7b, 0xcd, 0x57, 0xef, 0x48, 0x49, 0x27,\n+\t0xf2, 0x80, 0xad, 0xc9, 0x1a, 0xc0, 0xc4, 0xe7,\n+\t0x9c, 0x7b, 0x11, 0xef, 0xc6, 0x00, 0x54, 0xe3\n+},\n+\n+jwa_b2_a[] \u003d { /* \u0022The second principle of Auguste Kerckhoffs\u0022 */\n+\t0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f,\n+\t0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63,\n+\t0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20,\n+\t0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x65, 0x20,\n+\t0x4b, 0x65, 0x72, 0x63, 0x6b, 0x68, 0x6f, 0x66,\n+\t0x66, 0x73\n+},\n+\n+jwa_b2_tag[] \u003d {\n+\t0x84, 0x90, 0xac, 0x0e, 0x58, 0x94, 0x9b, 0xfe,\n+\t0x51, 0x87, 0x5d, 0x73, 0x3f, 0x93, 0xac, 0x20,\n+\t0x75, 0x16, 0x80, 0x39, 0xcc, 0xc7, 0x33, 0xd7\n+\n+}\n+;\n+\n+static int\n+test_jwa_b2(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tint n, ret \u003d -1;\n+\tchar buf[2048];\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\t/*\n+\t * normally all this is interpreted from the JWE blob. But we don't\n+\t * have JWE test vectors for AES_256_CBC_HMAC_SHA_512, just a standalone\n+\t * one. So we have to create it all by hand.\n+\t *\n+\t * See test_jwe_a3 above for a more normal usage pattern.\n+\t */\n+\n+\tlws_jwk_dup_oct(\u0026jwe.jwk, jwa_b2_rawkey, sizeof(jwa_b2_rawkey));\n+\n+\tmemcpy(buf, jwa_b2_e, sizeof(jwa_b2_e));\n+\n+\tjwe.jws.map.buf[LJWE_IV] \u003d (char *)jwa_b2_iv;\n+\tjwe.jws.map.len[LJWE_IV] \u003d sizeof(jwa_b2_iv);\n+\n+\tjwe.jws.map.buf[LJWE_CTXT] \u003d buf;\n+\tjwe.jws.map.len[LJWE_CTXT] \u003d sizeof(jwa_b2_e);\n+\n+\tjwe.jws.map.buf[LJWE_ATAG] \u003d (char *)jwa_b2_tag;\n+\tjwe.jws.map.len[LJWE_ATAG] \u003d sizeof(jwa_b2_tag);\n+\n+\t/*\n+\t * Normally this comes from the JOSE header. But this test vector\n+\t * doesn't have one... so...\n+\t */\n+\n+\tif (lws_gencrypto_jwe_alg_to_definition(\u0022A128KW\u0022, \u0026jwe.jose.alg))\n+\t\tgoto bail;\n+\tif (lws_gencrypto_jwe_enc_to_definition(\u0022A192CBC-HS384\u0022,\n+\t\t\t\t\t\t\u0026jwe.jose.enc_alg))\n+\t\tgoto bail;\n+\n+\tn \u003d lws_jwe_auth_and_decrypt_cbc_hs(\u0026jwe, jwa_b2_rawkey,\n+\t\t\t\t\t\t jwa_b2_a, sizeof(jwa_b2_a));\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_a_cbc_hs_decrypt failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(jwa_b2_ptext) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT],jwa_b2_ptext,\n+\t\t\t sizeof(jwa_b2_ptext))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(jwa_b2_ptext, sizeof(jwa_b2_ptext));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+\n+\n+/* JWA B.3. Test Cases for AES_256_CBC_HMAC_SHA_512\n+ *\n+ * Unfortunately JWA just gives this test case as hex literals, not\n+ * inside a JWE. So we have to prepare the inputs \u0022by hand\u0022.\n+ */\n+\n+static uint8_t\n+\n+jwa_b3_ptext[] \u003d {\n+\t0x41, 0x20, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72,\n+\t0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,\n+\t0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,\n+\t0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,\n+\t0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,\n+\t0x62, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65,\n+\t0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69,\n+\t0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,\n+\t0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74,\n+\t0x6f, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69,\n+\t0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,\n+\t0x68, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66,\n+\t0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x65,\n+\t0x6d, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,\n+\t0x75, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e,\n+\t0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65\n+},\n+\n+\n+jwa_b3_rawkey[] \u003d {\n+\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n+\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n+\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\n+\t0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n+\t0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n+\t0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,\n+\t0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f\n+},\n+\n+jwa_b3_iv[] \u003d {\n+\t0x1a, 0xf3, 0x8c, 0x2d, 0xc2, 0xb9, 0x6f, 0xfd,\n+\t0xd8, 0x66, 0x94, 0x09, 0x23, 0x41, 0xbc, 0x04\n+},\n+\n+jwa_b3_e[] \u003d {\n+\t0x4a, 0xff, 0xaa, 0xad, 0xb7, 0x8c, 0x31, 0xc5,\n+\t0xda, 0x4b, 0x1b, 0x59, 0x0d, 0x10, 0xff, 0xbd,\n+\t0x3d, 0xd8, 0xd5, 0xd3, 0x02, 0x42, 0x35, 0x26,\n+\t0x91, 0x2d, 0xa0, 0x37, 0xec, 0xbc, 0xc7, 0xbd,\n+\t0x82, 0x2c, 0x30, 0x1d, 0xd6, 0x7c, 0x37, 0x3b,\n+\t0xcc, 0xb5, 0x84, 0xad, 0x3e, 0x92, 0x79, 0xc2,\n+\t0xe6, 0xd1, 0x2a, 0x13, 0x74, 0xb7, 0x7f, 0x07,\n+\t0x75, 0x53, 0xdf, 0x82, 0x94, 0x10, 0x44, 0x6b,\n+\t0x36, 0xeb, 0xd9, 0x70, 0x66, 0x29, 0x6a, 0xe6,\n+\t0x42, 0x7e, 0xa7, 0x5c, 0x2e, 0x08, 0x46, 0xa1,\n+\t0x1a, 0x09, 0xcc, 0xf5, 0x37, 0x0d, 0xc8, 0x0b,\n+\t0xfe, 0xcb, 0xad, 0x28, 0xc7, 0x3f, 0x09, 0xb3,\n+\t0xa3, 0xb7, 0x5e, 0x66, 0x2a, 0x25, 0x94, 0x41,\n+\t0x0a, 0xe4, 0x96, 0xb2, 0xe2, 0xe6, 0x60, 0x9e,\n+\t0x31, 0xe6, 0xe0, 0x2c, 0xc8, 0x37, 0xf0, 0x53,\n+\t0xd2, 0x1f, 0x37, 0xff, 0x4f, 0x51, 0x95, 0x0b,\n+\t0xbe, 0x26, 0x38, 0xd0, 0x9d, 0xd7, 0xa4, 0x93,\n+\t0x09, 0x30, 0x80, 0x6d, 0x07, 0x03, 0xb1, 0xf6,\n+},\n+\n+jwa_b3_a[] \u003d { /* \u0022The second principle of Auguste Kerckhoffs\u0022 */\n+\t0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f,\n+\t0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63,\n+\t0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20,\n+\t0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x65, 0x20,\n+\t0x4b, 0x65, 0x72, 0x63, 0x6b, 0x68, 0x6f, 0x66,\n+\t0x66, 0x73\n+},\n+\n+jws_b3_tag[] \u003d {\n+\t0x4d, 0xd3, 0xb4, 0xc0, 0x88, 0xa7, 0xf4, 0x5c,\n+\t0x21, 0x68, 0x39, 0x64, 0x5b, 0x20, 0x12, 0xbf,\n+\t0x2e, 0x62, 0x69, 0xa8, 0xc5, 0x6a, 0x81, 0x6d,\n+\t0xbc, 0x1b, 0x26, 0x77, 0x61, 0x95, 0x5b, 0xc5\n+}\n+;\n+\n+static int\n+test_jwa_b3(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar buf[2048];\n+\tint n, ret \u003d -1;\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\t/*\n+\t * normally all this is interpreted from the JWE blob. But we don't\n+\t * have JWE test vectors for AES_256_CBC_HMAC_SHA_512, just a standalone\n+\t * one. So we have to create it all by hand.\n+\t *\n+\t * See test_jwe_a3 above for a more normal usage pattern.\n+\t */\n+\n+\tlws_jwk_dup_oct(\u0026jwe.jwk, jwa_b3_rawkey, sizeof(jwa_b3_rawkey));\n+\n+\tmemcpy(buf, jwa_b3_e, sizeof(jwa_b3_e));\n+\n+\tjwe.jws.map.buf[LJWE_IV] \u003d (char *)jwa_b3_iv;\n+\tjwe.jws.map.len[LJWE_IV] \u003d sizeof(jwa_b3_iv);\n+\n+\tjwe.jws.map.buf[LJWE_CTXT] \u003d buf;\n+\tjwe.jws.map.len[LJWE_CTXT] \u003d sizeof(jwa_b3_e);\n+\n+\tjwe.jws.map.buf[LJWE_ATAG] \u003d (char *)jws_b3_tag;\n+\tjwe.jws.map.len[LJWE_ATAG] \u003d sizeof(jws_b3_tag);\n+\n+\t/*\n+\t * Normally this comes from the JOSE header. But this test vector\n+\t * doesn't feature one...\n+\t */\n+\n+\tif (lws_gencrypto_jwe_alg_to_definition(\u0022A128KW\u0022, \u0026jwe.jose.alg))\n+\t\tgoto bail;\n+\tif (lws_gencrypto_jwe_enc_to_definition(\u0022A256CBC-HS512\u0022,\n+\t\t\t\t\t\t\u0026jwe.jose.enc_alg))\n+\t\tgoto bail;\n+\n+\tn \u003d lws_jwe_auth_and_decrypt_cbc_hs(\u0026jwe, jwa_b3_rawkey,\n+\t\t\t\t\t\t jwa_b3_a, sizeof(jwa_b3_a));\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_a_cbc_hs_decrypt failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(jwa_b3_ptext) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT],jwa_b3_ptext,\n+\t\t\t sizeof(jwa_b3_ptext))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(jwa_b3_ptext, sizeof(jwa_b3_ptext));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+/* JWA C. Example ECDH-ES Key Agreement Computation\n+ *\n+ * This example uses ECDH-ES Key Agreement and the Concat KDF to derive\n+ * the CEK in the manner described in Section 4.6. In this example, the\n+ * ECDH-ES Direct Key Agreement mode (\u0022alg\u0022 value \u0022ECDH-ES\u0022) is used to\n+ * produce an agreed-upon key for AES GCM with a 128-bit key (\u0022enc\u0022\n+ * value \u0022A128GCM\u0022).\n+ *\n+ * In this example, a producer Alice is encrypting content to a consumer\n+ * Bob. The producer (Alice) generates an ephemeral key for the key\n+ * agreement computation.\n+ *\n+ * JWA Appendix C where this comes from ONLY goes as far as to confirm the\n+ * direct derived key, it doesn't do any AES128-GCM.\n+ */\n+\n+static const char\n+\n+*ex_jwa_c_jose \u003d\n+\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022enc\u005c\u0022:\u005c\u0022A128GCM\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022apu\u005c\u0022:\u005c\u0022QWxpY2U\u005c\u0022,\u0022\t/* b64u(\u0022Alice\u0022) */\n+\t \u0022\u005c\u0022apv\u005c\u0022:\u005c\u0022Qm9i\u005c\u0022,\u0022\t/* b64u(\u0022Bob\u0022) */\n+\t \u0022\u005c\u0022epk\u005c\u0022:\u0022 /* public part of A's ephemeral key */\n+\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps\u005c\u0022\u0022\n+\t \u0022}\u0022\n+\t\u0022}\u0022\n+;\n+\n+static uint8_t\n+ex_jwa_c_z[] \u003d {\n+\t158, 86, 217, 29, 129, 113, 53, 211,\n+\t114, 131, 66, 131, 191, 132, 38, 156,\n+\t251, 49, 110, 163, 218, 128, 106, 72,\n+\t246, 218, 167, 121, 140, 254, 144, 196\n+},\n+ex_jwa_c_derived_key[] \u003d {\n+\t 86, 170, 141, 234, 248, 35, 109, 32,\n+\t 92, 34, 40, 205, 113, 167, 16, 26\n+};\n+\n+\n+static int\n+test_jwa_c(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[2048], *p;\n+\tint ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\t/*\n+\t * again the JWA Appendix C test vectors are not in the form of a\n+\t * complete JWE, but just the JWE JOSE header, so we must fake up the\n+\t * pieces and perform just the (normally internal) key agreement step\n+\t * for this test.\n+\t *\n+\t * See test_jwe_a3 above for a more normal usage pattern.\n+\t */\n+\n+\tif (lws_jwe_parse_jose(\u0026jwe.jose, ex_jwa_c_jose, (int)strlen(ex_jwa_c_jose),\n+\t\t\t temp, \u0026temp_len) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * The ephemeral key has been parsed into a jwk \u0022jwe.jose.jwk_ephemeral\u0022\n+\t *\n+\t * In this example, the ECDH-ES Direct Key Agreement mode (\u0022alg\u0022 value\n+\t * \u0022ECDH-ES\u0022) is used to produce an agreed-upon key for AES GCM with a\n+\t * 128-bit key (\u0022enc\u0022 value \u0022A128GCM\u0022).\n+\t */\n+\n+\tp \u003d lws_concat_temp(temp, temp_len);\n+\n+\tif (lws_jwa_concat_kdf(\u0026jwe, 1, (uint8_t *)p,\n+\t\t\t ex_jwa_c_z, sizeof(ex_jwa_c_z))) {\n+\t\tlwsl_err(\u0022%s: lws_jwa_concat_kdf failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (lws_timingsafe_bcmp(p, ex_jwa_c_derived_key,\n+\t\t\t sizeof(ex_jwa_c_derived_key))) {\n+\t\tlwsl_err(\u0022%s: ECDH-ES direct derived key wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ex_jwa_c_derived_key,\n+\t\t\t\t sizeof(ex_jwa_c_derived_key));\n+\t\tlwsl_hexdump_notice(p, sizeof(ex_jwa_c_derived_key));\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+\n+/*\n+ * ECDH-ES Homebrew Encryption test\n+ */\n+\n+static const char\n+\n+\t/* peer key */\n+\n+*ecdhes_t1_peer_p256_public_key \u003d /* as below but with d removed */\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022ySlIGttmXG80WPjDO01QaXg7oAzW3NE-a-GF0NDGk_E\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022i08k5z4ppqgtnLK8lh5qw4qp2FhxPdGjovgilajluuw\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+\n+*ecdhes_t1_peer_p256_private_key \u003d /* created by ./lws-crypto-jwk -t EC */\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022ldszv0_cGFMkjxaPspGCP6X0NAaVCVeK48oH4RzT2T0\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022ySlIGttmXG80WPjDO01QaXg7oAzW3NE-a-GF0NDGk_E\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022i08k5z4ppqgtnLK8lh5qw4qp2FhxPdGjovgilajluuw\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+\n+*ecdhes_t1_peer_p384_public_key \u003d /* as below but with d removed */\n+\t\u0022{\u005c\u0022crv\u005c\u0022:\u005c\u0022P-384\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022injKcygDoG1AuP044ct88r_2DNinHr1CGqy4q2Sy5yo034Y\u0022\n+\t\t \u00227yQ5_NT-lEUXrzlIW\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022y52QaJLhVm-ts8xa1jL8GkmwGm_dX6xV1PSq4s3pbwx2Hu9\u0022\n+\t\t \u0022X29z5WYcTPFOCPtwJ\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_peer_p384_private_key \u003d /* created by ./lws-crypto-jwk -t EC -v \u0022P-384\u0022 */\n+\t\u0022{\u005c\u0022crv\u005c\u0022:\u005c\u0022P-384\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022jYGze6ZwZxrflVx_I2lYWNf9GkfbeQNRwQCdtZhBlb85lk-\u0022\n+\t\t \u0022SAvaZuNiRUs_eWmPQ\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022injKcygDoG1AuP044ct88r_2DNinHr1CGqy4q2Sy5yo034Y\u0022\n+\t\t \u00227yQ5_NT-lEUXrzlIW\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022y52QaJLhVm-ts8xa1jL8GkmwGm_dX6xV1PSq4s3pbwx2Hu9\u0022\n+\t\t \u0022X29z5WYcTPFOCPtwJ\u005c\u0022}\u0022,\n+\n+ *ecdhes_t1_peer_p521_public_key \u003d /* as below but with d removed */\n+\t\u0022{\u005c\u0022crv\u005c\u0022:\u005c\u0022P-521\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022AYe0gAkPzzjeQW5Ek9tVrWdfi0u6k7LVUru-b2x7V9EM3d\u0022\n+\t\t \u0022L4SbQiS1p2j2gmZ2a6aDoKDRU_2E4u9EQrlswlty-g\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022AEAIIRkVL0WhtDlDSM7dciBtL1dOo5UPiW7ixIOv5K75Mo\u0022\n+\t\t \u0022uFNWO7cFmcxaCOn9459ex0giVyptmX_956C_DWabG6\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_peer_p521_private_key \u003d /* created by ./lws-crypto-jwk -t EC -v \u0022P-521\u0022 */\n+\t\u0022{\u005c\u0022crv\u005c\u0022:\u005c\u0022P-521\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022AUer7_-qJtQtDWN6CMeGB20rzTa648kpsfidTOu3lnn6__\u0022\n+\t\t \u0022yOXkMj1yTYUBjVOnUjGHiTU1rCGsw4CyF-1nDRe7SM\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022AYe0gAkPzzjeQW5Ek9tVrWdfi0u6k7LVUru-b2x7V9EM3d\u0022\n+\t\t \u0022L4SbQiS1p2j2gmZ2a6aDoKDRU_2E4u9EQrlswlty-g\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022AEAIIRkVL0WhtDlDSM7dciBtL1dOo5UPiW7ixIOv5K75Mo\u0022\n+\t\t \u0022uFNWO7cFmcxaCOn9459ex0giVyptmX_956C_DWabG6\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_jose_hdr_es_128 \u003d\n+\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A128CBC-HS256\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_jose_hdr_es_192 \u003d\n+\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A192CBC-HS384\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_jose_hdr_es_256 \u003d\n+\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A256CBC-HS512\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_jose_hdr_esakw128_128 \u003d\n+\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES+A128KW\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A128CBC-HS256\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_jose_hdr_esakw192_192 \u003d\n+\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES+A192KW\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A192CBC-HS384\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_jose_hdr_esakw256_256 \u003d\n+\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES+A256KW\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A256CBC-HS512\u005c\u0022}\u0022,\n+\n+*ecdhes_t1_plaintext \u003d\n+\t\u0022This test plaintext is exactly 64 bytes long when unencrypted...\u0022\n+;\n+\n+static int\n+test_ecdhes_t1(struct lws_context *context, const char *jose_hdr,\n+\t const char *peer_pubkey, const char *peer_privkey)\n+{\n+\tchar temp[3072], compact[2048];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\tstruct lws_jwe jwe;\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\t/* read and interpret our canned JOSE header, setting the algorithm */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWS_JOSE,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tjose_hdr, strlen(jose_hdr), 0))\n+\t\tgoto bail;\n+\n+\tif (lws_jwe_parse_jose(\u0026jwe.jose, jose_hdr, (int)strlen(jose_hdr),\n+\t\t\t temp, \u0026temp_len) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\t/* for ecdh-es encryption, we need the peer's pubkey */\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)peer_pubkey,\n+\t\t\t strlen((char *)peer_pubkey)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * dup the plaintext into the ciphertext element, it will be\n+\t * encrypted in-place to a ciphertext of the same length + padding\n+\t */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\tecdhes_t1_plaintext,\n+\t\t\t\tstrlen(ecdhes_t1_plaintext),\n+\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n+\t\t\t\t\t\tstrlen(ecdhes_t1_plaintext)))) {\n+\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * perform the actual encryption\n+\t */\n+\n+\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len), \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * format for output\n+\t */\n+\n+\tn \u003d lws_jwe_render_flattened(\u0026jwe, compact, sizeof(compact));\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022,\n+\t\t\t __func__, n);\n+\t\tgoto bail;\n+\t}\n+\n+\t// puts(compact);\n+\n+\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022,\n+\t\t\t __func__, n);\n+\t\tgoto bail;\n+\t}\n+\n+\t// puts(compact);\n+\n+\t/* okay, let's try to decrypt the whole thing, as the recipient\n+\t * getting the compact. jws-\u003ejwk needs to be our private key. */\n+\n+\tlws_jwe_destroy(\u0026jwe);\n+\ttemp_len \u003d sizeof(temp);\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)peer_privkey,\n+\t\t\t strlen((char *)peer_privkey)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* converts a compact serialization to jws b64 + decoded maps */\n+\tif (lws_jws_compact_decode(compact, (int)strlen(compact), \u0026jwe.jws.map,\n+\t\t\t\t \u0026jwe.jws.map_b64, temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: %s selftest failed +++++++++++++++++++\u005cn\u0022,\n+\t\t\t __func__, jose_hdr);\n+\telse\n+\t\tlwsl_notice(\u0022%s: %s selftest OK\u005cn\u0022, __func__, jose_hdr);\n+\n+\treturn ret;\n+}\n+\n+/* AES Key Wrap and AES_XXX_CBC_HMAC_SHA_YYY variations\n+ *\n+ * These were created using the node-jose node.js package\n+ */\n+static const char\n+\t*akw_ptext \u003d \u0022plaintext0123456\u0022,\n+\t*akw_ct_128_128 \u003d \u0022eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii\u0022\n+\t\u0022wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC\u0022\n+\t\u0022J9.h6oNSEgz3LwIMndEkPEa8H7_5zy0hh8TaU_1yWoNtu4Dh_WJpEgx9g.j7TYjj8wB0\u0022\n+\t\u0022RS6rclTWYmqw.zm3tPzuWhXoD7IsAWbA0xz-AJXvE9gydWPRBTaO40sQ.Okf7ttWDLPM\u0022\n+\t\u0022wIj1kUyUO_A\u0022,\n+\t*akw_ct_128_192 \u003d \u0022eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii\u0022\n+\t\u0022wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC\u0022\n+\t\u0022J9.XkRTu4nP3b0KZxXjkjdHEnbf6AWZUmFvpsqZLuLxKcrONqDUsnYasnVuo6U0QKRUm\u0022\n+\t\u0022cyBRtSPGW4.MzNxxoOp8JR2AHoLNve-vw.rdxgo6InRAxk3afG02_75l58u5m6KYHd3h\u0022\n+\t\u0022LH16ksnZE.v7BLKaRZIwhUPhhBRTd8yPwH0xa1fOft\u0022,\n+\t*akw_ct_128_256 \u003d \u0022eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi\u0022\n+\t\u0022wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC\u0022\n+\t\u0022J9.mueR-8XzXs2RyvzzvghpIpGS1mGl7vkSjJDF5zqhH8-ektBpCXSd7R7MS5nh2-Xf_\u0022\n+\t\u00228XDym1gn1QEQh5bDI3GPESnSN1TJR-h.g6plL_5L2BD8wcjZS7X79A.UTndfTFhGFaVZ\u0022\n+\t\u0022vWqPkV7dN00gckesd_7UylosVDqjwU.-rgi0jkYuCZDMwUVLxN6e6x8fXw2U0u4-vL8u\u0022\n+\t\u0022Kb__S8\u0022,\n+\t*akw_ct_192_128 \u003d \u0022eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii\u0022\n+\t\u0022wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS\u0022\n+\t\u0022J9.mEURnj2NvPa3TU0uR8mcm2cMd33Y6iYYZ_LFrYS_Gz49gcdxZpdk1Q.v3csq81X9o\u0022\n+\t\u0022mI-bcp6i-FTQ.EgroRqmqNfeH7XC9msLap1IGcqvc09SlnI4PO6RQqS0.hDi57mXD3vX\u0022\n+\t\u0022dx2r4Kwnv9w\u0022,\n+\t*akw_ct_192_192 \u003d \u0022eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii\u0022\n+\t\u0022wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS\u0022\n+\t\u0022J9.QHgtusQdP7Zvw9tsCZNkJyEmzg6KUaaIyTb2BXB0ng9mxSUIQ7y_6oqasYKBUJgBn\u0022\n+\t\u0022Koru-3CXOE.ZZXcGY35mmlAb4-IgA5XlQ.AuG2GRPeYJ80_4XoYAUgXbVY65ZQ689Grn\u0022\n+\t\u0022x8RCNQdfc.UjfgDr4z3PGQBdftWT2gqx1Egfd9PUR4\u0022,\n+\t*akw_ct_192_256 \u003d \u0022eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi\u0022\n+\t\u0022wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS\u0022\n+\t\u0022J9.G6DziymYyU3-6unIa-Oz-0lksH05OJFDZKkFuShMuoazEMZ5ZH2S_65qD-pjpf8aN\u0022\n+\t\u00222thOVOYT0mdtgFM0ARUfx8ZLhRFCcn1.yEKK4eARZIo9WtGVcQmgDQ.ovan2NXDmt_Ka\u0022\n+\t\u0022SsVJmhIMQqVz6meqz1oExfVcY8vdzA.R3T4lQIKX5cc2Ktv42e9u5PR--v_w2uK7F4Wp\u0022\n+\t\u0022Sr5SQ8\u0022,\n+\t*akw_ct_256_128 \u003d \u0022eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii\u0022\n+\t\u0022wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy\u0022\n+\t\u0022J9.ZLWrz5CE7Iav2db37VL9ZABeaRVrV9af-7-46Loc9M2D0SPSNtsxpg.ktk-VU8-5b\u0022\n+\t\u0022XRvW_A6IqDjQ.xZVIglOhadDBHUYuxPx6Wr_YzOo0qCDH24xVe58qP9Q.pO_tME930wO\u0022\n+\t\u0022u5fNJ8ubGrw\u0022,\n+\t*akw_ct_256_192 \u003d \u0022eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii\u0022\n+\t\u0022wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy\u0022\n+\t\u0022J9.fcblAVZ7VOXtyhymqxDBr-zgvId18p3AURNbhH5FmAvKNuUVU37xPkz6BrFopLP0J\u0022\n+\t\u0022jqXaTyyg1s.fprTe2e0esH2w7EnLEgBZQ.g1BI0U1aKSM_JBEp9jC4BxBaFXVG5BW4nl\u0022\n+\t\u0022bhX1MDeLo.XOLanrIkitLLDRONnfM05avahl_lJ_UY\u0022,\n+\t*akw_ct_256_256 \u003d \u0022eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi\u0022\n+\t\u0022wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy\u0022\n+\t\u0022J9.SpizfgtzQLJCCnYnUmNfiMMTyL8iIDi8OyUDrO00KJtfwJdNAcs-NuYQkLKx6PlDJ\u0022\n+\t\u0022IGjucT4-IuA8k_Oc752kq1BzTHMZ-Mo.go-e8xpQoCmLD5RBQw7ruA.WqkEdM6T1_z5F\u0022\n+\t\u0022C-8eGQfGjos7cHPy1ecZk1Ep-TYgXo.bZVHhIpe2PbjguQlK_afkYDlVmEtRAe3LUJUX\u0022\n+\t\u00224STOtU\u0022,\n+\t*akw_key_128 \u003d \u0022{\u005c\u0022k\u005c\u0022:\u005c\u0022JjVJVh8JsXvKf9qgHHWWBA\u005c\u0022,\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022}\u0022,\n+\t*akw_key_192 \u003d \u0022{\u005c\u0022k\u005c\u0022:\u005c\u0022BYF6urCMDRMKFXXRxXrDSVtW71AUZghj\u005c\u0022,\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022}\u0022,\n+\t*akw_key_256 \u003d \u0022{\u005c\u0022k\u005c\u0022:\u005c\u0022cSHyZXGEfnlgKud21cM6tAxRyXnK6xbWRTsyLUegTMk\u005c\u0022,\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022}\u0022\n+;\n+\n+static int\n+test_akw_decrypt(struct lws_context *context, const char *test_name,\n+\t\t const char *ciphertext, const char *key)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[2048];\n+\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, key, strlen(key)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* converts a compact serialization to jws b64 + decoded maps */\n+\tif (lws_jws_compact_decode(ciphertext, (int)strlen(ciphertext),\n+\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n+\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n+\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len), \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* allowing for trailing padding, confirm the plaintext */\n+\tif (jwe.jws.map.len[LJWE_CTXT] \u003c strlen(akw_ptext) ||\n+\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], akw_ptext,\n+\t\t\t (uint32_t)strlen(akw_ptext))) {\n+\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(akw_ptext, strlen(akw_ptext));\n+\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest %s failed +++++++++++++++++++\u005cn\u0022,\n+\t\t\t__func__, test_name);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest %s OK\u005cn\u0022, __func__, test_name);\n+\n+\treturn ret;\n+}\n+\n+static int\n+test_akw_encrypt(struct lws_context *context, const char *test_name,\n+\t\t const char *alg, const char *enc, const char *ciphertext,\n+\t\t const char *key, char *compact, int compact_len)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[4096];\n+\tint ret \u003d -1, n, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, key, strlen(key)) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_gencrypto_jwe_alg_to_definition(alg, \u0026jwe.jose.alg)) {\n+\t\tlwsl_err(\u0022Unknown cipher alg %s\u005cn\u0022, alg);\n+\t\tgoto bail;\n+\t}\n+\tif (lws_gencrypto_jwe_enc_to_definition(enc, \u0026jwe.jose.enc_alg)) {\n+\t\tlwsl_err(\u0022Unknown payload enc alg %s\u005cn\u0022, enc);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* we require a JOSE-formatted header to do the encryption */\n+\n+\tjwe.jws.map.buf[LJWS_JOSE] \u003d temp;\n+\tjwe.jws.map.len[LJWS_JOSE] \u003d (uint32_t)lws_snprintf(temp, (unsigned int)temp_len,\n+\t\t\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022%s\u005c\u0022, \u005c\u0022enc\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022, alg, enc);\n+\ttemp_len -\u003d (int)jwe.jws.map.len[LJWS_JOSE];\n+\n+\t/*\n+\t * dup the plaintext into the ciphertext element, it will be\n+\t * encrypted in-place to a ciphertext of the same length + padding\n+\t */\n+\n+\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n+\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n+\t\t\t\takw_ptext, strlen(akw_ptext),\n+\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n+\t\t\t\t\t\t\t strlen(akw_ptext)))) {\n+\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* CEK size is determined by hash / hmac size */\n+\n+\tn \u003d lws_gencrypto_bits_to_bytes(jwe.jose.enc_alg-\u003ekeybits_fixed);\n+\tif (lws_jws_randomize_element(context, \u0026jwe.jws.map, LJWE_EKEY,\n+\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len, (unsigned int)n,\n+\t\t\t\t LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n+\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t \u0026temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, (unsigned int)compact_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022,\n+\t\t\t __func__, n);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest %s failed +++++++++++++++++++\u005cn\u0022,\n+\t\t\t__func__, test_name);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest %s OK\u005cn\u0022, __func__, test_name);\n+\n+\treturn ret;\n+}\n+\n+/*\n+ * Check we can handle multi-recipient JWE\n+ */\n+\n+static char *complete \u003d\n+ \u0022{\u0022\n+ \u0022\u005c\u0022protected\u005c\u0022:\u0022\n+ \u0022\u005c\u0022eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0\u005c\u0022,\u0022\n+ \u0022\u005c\u0022unprotected\u005c\u0022:\u0022\n+ \u0022{\u005c\u0022jku\u005c\u0022:\u005c\u0022https://server.example.com/keys.jwks\u005c\u0022},\u0022\n+ \u0022\u005c\u0022recipients\u005c\u0022:[\u0022\n+\n+\t\u0022{\u005c\u0022header\u005c\u0022:\u0022\n+ \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022RSA1_5\u005c\u0022,\u005c\u0022kid\u005c\u0022:\u005c\u00222011-04-29\u005c\u0022},\u0022\n+ \u0022\u005c\u0022encrypted_key\u005c\u0022:\u0022\n+ \u0022\u005c\u0022UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-\u0022\n+ \u0022kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKx\u0022\n+ \u0022GHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3\u0022\n+ \u0022YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPh\u0022\n+ \u0022cCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPg\u0022\n+ \u0022wCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A\u005c\u0022},\u0022\n+\n+ \u0022{\u005c\u0022header\u005c\u0022:\u0022\n+ \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022A128KW\u005c\u0022,\u005c\u0022kid\u005c\u0022:\u005c\u00227\u005c\u0022},\u0022\n+ \u0022\u005c\u0022encrypted_key\u005c\u0022:\u0022\n+ \u0022\u005c\u00226KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ\u005c\u0022}],\u0022\n+\n+ \u0022\u005c\u0022iv\u005c\u0022:\u0022\n+ \u0022\u005c\u0022AxY8DCtDaGlsbGljb3RoZQ\u005c\u0022,\u0022\n+ \u0022\u005c\u0022ciphertext\u005c\u0022:\u0022\n+ \u0022\u005c\u0022KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY\u005c\u0022,\u0022\n+ \u0022\u005c\u0022tag\u005c\u0022:\u0022\n+ \u0022\u005c\u0022Mz-VPPyU4RlcuYv1IwIvzw\u005c\u0022\u0022\n+ \u0022}\u005c\u0022\u0022\n+;\n+\n+static int\n+test_jwe_json_complete(struct lws_context *context)\n+{\n+\tstruct lws_jwe jwe;\n+\tchar temp[4096];\n+\tint ret \u003d -1, temp_len \u003d sizeof(temp);\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\tif (lws_jwe_parse_jose(\u0026jwe.jose, complete, (int)strlen(complete),\n+\t\t\t temp, \u0026temp_len) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (jwe.jose.recipients !\u003d 2) {\n+\t\tlwsl_err(\u0022%s: wrong recipients count %d\u005cn\u0022, __func__,\n+\t\t\t jwe.jose.recipients);\n+\t\tgoto bail;\n+\t}\n+\n+\tret \u003d 0;\n+bail:\n+\tlws_jwe_destroy(\u0026jwe);\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022,\n+\t\t\t__func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+int\n+test_jwe(struct lws_context *context)\n+{\n+\tchar compact[4096];\n+\tint n \u003d 0;\n+\n+\tn |\u003d test_jwe_json_complete(context);\n+\n+\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_128,\n+\t\t\t ecdhes_t1_peer_p256_public_key,\n+\t\t\t ecdhes_t1_peer_p256_private_key);\n+\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_192,\n+\t\t\t ecdhes_t1_peer_p384_public_key,\n+\t\t\t ecdhes_t1_peer_p384_private_key);\n+\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_256,\n+\t\t\t ecdhes_t1_peer_p521_public_key,\n+\t\t\t ecdhes_t1_peer_p521_private_key);\n+\n+\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw128_128,\n+\t\t\t ecdhes_t1_peer_p256_public_key,\n+\t\t\t ecdhes_t1_peer_p256_private_key);\n+\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw192_192,\n+\t\t\t ecdhes_t1_peer_p384_public_key,\n+\t\t\t ecdhes_t1_peer_p384_private_key);\n+\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw256_256,\n+\t\t\t ecdhes_t1_peer_p521_public_key,\n+\t\t\t ecdhes_t1_peer_p521_private_key);\n+\n+\tn |\u003d test_jwe_a1(context);\n+\n+\tn |\u003d test_jwe_a2(context);\n+\n+\tn |\u003d test_jwe_ra_ptext_1024(context, (char *)lws_jwe_ex_a2_jwk_json,\n+\t\t\t\t (int)strlen((char *)lws_jwe_ex_a2_jwk_json));\n+\tn |\u003d test_jwe_r256a192_ptext(context, (char *)lws_jwe_ex_a2_jwk_json,\n+\t\t\t(int)strlen((char *)lws_jwe_ex_a2_jwk_json));\n+\tn |\u003d test_jwe_r256a256_ptext(context, (char *)lws_jwe_ex_a2_jwk_json,\n+\t\t\t(int)strlen((char *)lws_jwe_ex_a2_jwk_json));\n+\tn |\u003d test_jwe_ra_ptext_1024(context, (char *)rsa_key_2048,\n+\t\t\t(int)strlen((char *)rsa_key_2048));\n+\tn |\u003d test_jwe_r256a192_ptext(context, (char *)rsa_key_2048,\n+\t\t\t(int)strlen((char *)rsa_key_2048));\n+\tn |\u003d test_jwe_r256a256_ptext(context, (char *)rsa_key_2048,\n+\t\t\t(int)strlen((char *)rsa_key_2048));\n+\tn |\u003d test_jwe_ra_ptext_1024(context, (char *)rsa_key_4096,\n+\t\t\t(int)strlen((char *)rsa_key_4096));\n+\tn |\u003d test_jwe_r256a192_ptext(context, (char *)rsa_key_4096,\n+\t\t\t(int)strlen((char *)rsa_key_4096));\n+\tn |\u003d test_jwe_r256a256_ptext(context, (char *)rsa_key_4096,\n+\t\t\t(int)strlen((char *)rsa_key_4096));\n+\tn |\u003d test_jwe_ra_ptext_1024(context, (char *)rsa_key_4096_no_optional,\n+\t\t\t(int)strlen((char *)rsa_key_4096_no_optional));\n+\tn |\u003d test_jwe_r256a192_ptext(context, (char *)rsa_key_4096_no_optional,\n+\t\t\t(int)strlen((char *)rsa_key_4096_no_optional));\n+\tn |\u003d test_jwe_r256a256_ptext(context, (char *)rsa_key_4096_no_optional,\n+\t\t\t(int)strlen((char *)rsa_key_4096_no_optional));\n+\n+\t/* AESKW decrypt all variations */\n+\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a128kw_128\u0022, akw_ct_128_128, akw_key_128);\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a128kw_192\u0022, akw_ct_128_192, akw_key_128);\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a128kw_256\u0022, akw_ct_128_256, akw_key_128);\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a192kw_128\u0022, akw_ct_192_128, akw_key_192);\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a192kw_192\u0022, akw_ct_192_192, akw_key_192);\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a192kw_256\u0022, akw_ct_192_256, akw_key_192);\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a256kw_128\u0022, akw_ct_256_128, akw_key_256);\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a256kw_192\u0022, akw_ct_256_192, akw_key_256);\n+\tn |\u003d test_akw_decrypt(context, \u0022d-a256kw_256\u0022, akw_ct_256_256, akw_key_256);\n+\n+\t/* AESKW encrypt then confirm decrypt */\n+\n+\tif (!test_akw_encrypt(context, \u0022ed-128kw_128\u0022, \u0022A128KW\u0022, \u0022A128CBC-HS256\u0022,\n+\t\t\takw_ptext, akw_key_128, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-128kw_128\u0022, compact, akw_key_128);\n+\telse\n+\t\tn \u003d -1;\n+\tif (!test_akw_encrypt(context, \u0022ed-128kw_192\u0022, \u0022A128KW\u0022, \u0022A192CBC-HS384\u0022,\n+\t\t\takw_ptext, akw_key_128, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-128kw_192\u0022, compact, akw_key_128);\n+\telse\n+\t\tn \u003d -1;\n+\tif (!test_akw_encrypt(context, \u0022ed-128kw_256\u0022, \u0022A128KW\u0022, \u0022A256CBC-HS512\u0022,\n+\t\t\takw_ptext, akw_key_128, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-128kw_256\u0022, compact, akw_key_128);\n+\telse\n+\t\tn \u003d -1;\n+\n+\tif (!test_akw_encrypt(context, \u0022ed-192kw_128\u0022, \u0022A192KW\u0022, \u0022A128CBC-HS256\u0022,\n+\t\t\takw_ptext, akw_key_192, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-192kw_128\u0022, compact, akw_key_192);\n+\telse\n+\t\tn \u003d -1;\n+\tif (!test_akw_encrypt(context, \u0022ed-192kw_192\u0022, \u0022A192KW\u0022, \u0022A192CBC-HS384\u0022,\n+\t\t\takw_ptext, akw_key_192, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-192kw_192\u0022, compact, akw_key_192);\n+\telse\n+\t\tn \u003d -1;\n+\tif (!test_akw_encrypt(context, \u0022ed-192kw_256\u0022, \u0022A192KW\u0022, \u0022A256CBC-HS512\u0022,\n+\t\t\takw_ptext, akw_key_192, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-192kw_256\u0022, compact, akw_key_192);\n+\telse\n+\t\tn \u003d -1;\n+\n+\tif (!test_akw_encrypt(context, \u0022ed-256kw_128\u0022, \u0022A256KW\u0022, \u0022A128CBC-HS256\u0022,\n+\t\t\takw_ptext, akw_key_256, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-256kw_128\u0022, compact, akw_key_256);\n+\telse\n+\t\tn \u003d -1;\n+\tif (!test_akw_encrypt(context, \u0022ed-256kw_192\u0022, \u0022A256KW\u0022, \u0022A192CBC-HS384\u0022,\n+\t\t\takw_ptext, akw_key_256, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-256kw_192\u0022, compact, akw_key_256);\n+\telse\n+\t\tn \u003d -1;\n+\tif (!test_akw_encrypt(context, \u0022ed-256kw_256\u0022, \u0022A256KW\u0022, \u0022A256CBC-HS512\u0022,\n+\t\t\takw_ptext, akw_key_256, compact, sizeof(compact)))\n+\t\tn |\u003d test_akw_decrypt(context, \u0022ed-256kw_256\u0022, compact, akw_key_256);\n+\telse\n+\t\tn \u003d -1;\n+\n+\tn |\u003d test_jwe_r256a128_jwe_openssl(context);\n+\tn |\u003d test_jwe_r256a128_jwe_mbedtls(context);\n+\tn |\u003d test_jwe_a3(context);\n+\tn |\u003d test_jwa_b2(context);\n+\tn |\u003d test_jwa_b3(context);\n+\tn |\u003d test_jwa_c(context);\n+\n+\treturn n;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-jose/jwk.c b/minimal-examples-lowlevel/api-tests/api-test-jose/jwk.c\nnew file mode 100644\nindex 0000000..2f88ff5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-jose/jwk.c\n@@ -0,0 +1,350 @@\n+/*\n+ * lws-api-test-jose - RFC7517 jwk tests\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+static\n+uint8_t *lws_jwe_ex_a1_jwk_json \u003d (uint8_t *) /* EC + RSA public keys */\n+\t\u0022{\u005c\u0022keys\u005c\u0022:\u0022\n+\t \u0022[\u0022\n+\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u00224Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022use\u005c\u0022:\u005c\u0022enc\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u00221\u005c\u0022},\u0022\n+\n+\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022n\u005c\u0022: \u005c\u00220vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx\u0022\n+\t\u00224cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs\u0022\n+\t\u0022tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2\u0022\n+\t\u0022QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI\u0022\n+\t\u0022SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb\u0022\n+\t\u0022w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022alg\u005c\u0022:\u005c\u0022RS256\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u00222011-04-29\u005c\u0022}\u0022\n+\t \u0022]\u0022\n+\t\u0022}\u0022,\n+\n+*lws_jwe_ex_a2_jwk_json \u003d (uint8_t *) /* EC + RSA private keys */\n+\t\u0022{\u005c\u0022keys\u005c\u0022:\u0022\n+\t \u0022[\u0022\n+\t\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022x\u005c\u0022:\u005c\u0022MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022y\u005c\u0022:\u005c\u00224Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022use\u005c\u0022:\u005c\u0022enc\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022kid\u005c\u0022:\u005c\u00221\u005c\u0022},\u0022\n+\n+\t\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u00220vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4\u0022\n+\t \u0022cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMst\u0022\n+\t \u0022n64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2Q\u0022\n+\t \u0022vzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbIS\u0022\n+\t \u0022D08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw\u0022\n+\t \u00220Ls1jF44-csFCur-kEgU8awapJzKnqDKgw\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022X4cTteJY_gn4FYPsXB8rdXix5vwsg1FLN5E3EaG6RJoVH-HLLKD9\u0022\n+\t \u0022M7dx5oo7GURknchnrRweUkC7hT5fJLM0WbFAKNLWY2vv7B6NqXSzUvxT0_YSfqij\u0022\n+\t \u0022wp3RTzlBaCxWp4doFk5N2o8Gy_nHNKroADIkJ46pRUohsXywbReAdYaMwFs9tv8d\u0022\n+\t \u0022_cPVY3i07a3t8MN6TNwm0dSawm9v47UiCl3Sk5ZiG7xojPLu4sbg1U2jx4IBTNBz\u0022\n+\t \u0022nbJSzFHK66jT8bgkuqsk0GjskDJk19Z4qwjwbsnn4j2WBii3RL-Us2lGVkY8fkFz\u0022\n+\t \u0022me1z0HbIkfz0Y6mqnOYtqc0X4jfcKoAC8Q\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u002283i-7IvMGXoMXCskv73TKr8637FiO7Z27zv8oj6pbWUQyLPQBQxtPV\u0022\n+\t \u0022nwD20R-60eTDmD2ujnMt5PoqMrm8RfmNhVWDtjjMmCMjOpSXicFHj7XOuVIYQyqV\u0022\n+\t \u0022WlWEh6dN36GVZYk93N8Bc9vY41xy8B9RzzOGVQzXvNEvn7O0nVbfs\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u00223dfOR9cuYq-0S-mkFLzgItgMEfFzB2q3hWehMuG0oCuqnb3vobLyum\u0022\n+\t \u0022qjVZQO1dIrdwgTnCdpYzBcOfW5r370AFXjiWft_NGEiovonizhKpo9VVS78TzFgx\u0022\n+\t \u0022kIdrecRezsZ-1kYd_s1qDbxtkDEgfAITAG9LUnADun4vIcb6yelxk\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022G4sPXkc6Ya9y8oJW9_ILj4xuppu0lzi_H7VTkS8xj5SdX3coE0oim\u0022\n+\t \u0022YwxIi2emTAue0UOa5dpgFGyBJ4c8tQ2VF402XRugKDTP8akYhFo5tAA77Qe_Nmtu\u0022\n+\t \u0022YZc3C3m3I24G2GvR5sSDxUyAN2zq8Lfn9EUms6rY3Ob8YeiKkTiBj0\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022s9lAH9fggBsoFR8Oac2R_E2gw282rT2kGOAhvIllETE1efrA6huUU\u0022\n+\t \u0022vMfBcMpn8lqeW6vzznYY5SSQF7pMdC_agI3nG8Ibp1BUb0JUiraRNqUfLhcQb_d9\u0022\n+\t \u0022GF4Dh7e74WbRsobRonujTYN1xCaP6TO61jvWrX-L18txXw494Q_cgk\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022GyM_p6JrXySiz1toFgKbWV-JdI3jQ4ypu9rbMWx3rQJBfmt0FoYzg\u0022\n+\t \u0022UIZEVFEcOqwemRN81zoDAaa-Bk0KWNGDjJHZDdDmFhW3AN7lI-puxk_mHZGJ11rx\u0022\n+\t \u0022yR8O55XLSe3SPmRfKwZI6yU24ZxvQKFYItdldUKGzO6Ia6zTKhAVRU\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022alg\u005c\u0022:\u005c\u0022RS256\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022kid\u005c\u0022:\u005c\u00222011-04-29\u005c\u0022}\u0022\n+\t \u0022]\u0022\n+\t \u0022}\u0022,\n+*lws_jwe_ex_a3_jwk_json \u003d (uint8_t *) /* oct symmetric keys */\n+\t \u0022{\u005c\u0022keys\u005c\u0022:\u0022\n+\t \u0022[\u0022\n+\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022alg\u005c\u0022:\u005c\u0022A128KW\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022k\u005c\u0022:\u005c\u0022GawgguFyGrWKav7AX4VKUg\u005c\u0022},\u0022\n+\n+\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022k\u005c\u0022:\u005c\u0022AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75\u0022\n+\t\t\t\u0022aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u0022HMAC key used in JWS spec Appendix A.1 example\u005c\u0022}\u0022\n+\t \u0022]\u0022\n+\t \u0022}\u0022,\n+\n+*lws_jwe_ex_b_jwk_json \u003d (uint8_t *) /* x5c example (no parent JSON) */\n+\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022use\u005c\u0022:\u005c\u0022sig\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u00221b94c\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u0022vrjOfz9Ccdgx5nQudyhdoR17V-IubWMeOZCwX_jj0hgAsz2J_pqYW08\u0022\n+\t \u0022PLbK_PdiVGKPrqzmDIsLI7sA25VEnHU1uCLNwBuUiCO11_-7dYbsr4iJmG0Q\u0022\n+\t \u0022u2j8DsVyT1azpJC_NG84Ty5KKthuCaPod7iI7w0LK9orSMhBEwwZDCxTWq4a\u0022\n+\t \u0022YWAchc8t-emd9qOvWtVMDC2BXksRngh6X5bUYLy6AyHKvj-nUy1wgzjYQDwH\u0022\n+\t \u0022MTplCoLtU-o-8SNnZ1tmRoGE9uJkBLdh5gFENabWnU5m1ZqZPdwS-qo-meMv\u0022\n+\t \u0022VfJb6jJVWRpl2SUtCnYG2C32qvbWbjZ_jBPD5eunqsIo1vQ\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x5c\u005c\u0022:\u0022\n+\t \u0022[\u005c\u0022MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJB\u0022\n+\t \u0022gNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYD\u0022\n+\t \u0022VQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1\u0022\n+\t \u0022wYmVsbDAeFw0xMzAyMjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBg\u0022\n+\t \u0022NVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDV\u0022\n+\t \u0022QQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1w\u0022\n+\t \u0022YmVsbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64zn8/QnH\u0022\n+\t \u0022YMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9if6amFtPDy2yvz3YlRij66\u0022\n+\t \u0022s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+IiZhtELto/A7Fck9Ws6\u0022\n+\t \u0022SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quGmFgHIXPLfnpn\u0022\n+\t \u0022fajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6ZQqC7VPq\u0022\n+\t \u0022PvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyVVk\u0022\n+\t \u0022aZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BA\u0022\n+\t \u0022QUFAAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL\u0022\n+\t \u0022+9gGlqCz5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1\u0022\n+\t \u0022zFo+Owb1zxtp3PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL\u0022\n+\t \u00222Bo3UPGrpsHzUoaGpDftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo\u0022\n+\t \u00224tpzd5rFXhjRbg4zW9C+2qok+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTq\u0022\n+\t \u0022gawR+N5MDtdPTEQ0XfIBc2cJEUyMTY5MPvACWpkA6SdS4xSvdXK3IVfOWA\u003d\u003d\u005c\u0022]\u0022\n+\t \u0022}\u0022,\n+*lws_jwe_ex_c1_jwk_json \u003d (uint8_t *) /* RSA enc private key (no parent JSON) */\n+\t \u0022{\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u0022juliet@capulet.lit\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022use\u005c\u0022:\u005c\u0022enc\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u0022t6Q8PWSi1dkJj9hTP8hNYFlvadM7DflW9mWepOJhJ66w7nyoK1gPNqFMSQRy\u0022\n+\t \u0022O125Gp-TEkodhWr0iujjHVx7BcV0llS4w5ACGgPrcAd6ZcSR0-Iqom-QFcNP\u0022\n+\t \u00228Sjg086MwoqQU_LYywlAGZ21WSdS_PERyGFiNnj3QQlO8Yns5jCtLCRwLHL0\u0022\n+\t \u0022Pb1fEv45AuRIuUfVcPySBWYnDyGxvjYGDSM-AqWS9zIQ2ZilgT-GqUmipg0X\u0022\n+\t \u0022OC0Cc20rgLe2ymLHjpHciCKVAbY5-L32-lSeZO-Os6U15_aXrk9Gw8cPUaX1\u0022\n+\t \u0022_I8sLGuSiVdt3C_Fn2PZ3Z8i744FPFGGcG1qs2Wz-Q\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022GRtbIQmhOZtyszfgKdg4u_N-R_mZGU_9k7JQ_jn1DnfTuMdSNprTeaSTyWfS\u0022\n+\t \u0022NkuaAwnOEbIQVy1IQbWVV25NY3ybc_IhUJtfri7bAXYEReWaCl3hdlPKXy9U\u0022\n+\t \u0022vqPYGR0kIXTQRqns-dVJ7jahlI7LyckrpTmrM8dWBo4_PMaenNnPiQgO0xnu\u0022\n+\t \u0022ToxutRZJfJvG4Ox4ka3GORQd9CsCZ2vsUDmsXOfUENOyMqADC6p1M3h33tsu\u0022\n+\t \u0022rY15k9qMSpG9OX_IJAXmxzAh_tWiZOwk2K4yxH9tS3Lq1yX8C1EWmeRDkK2a\u0022\n+\t \u0022hecG85-oLKQt5VEpWHKmjOi_gJSdSgqcN96X52esAQ\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022p\u005c\u0022:\u005c\u00222rnSOV4hKSN8sS4CgcQHFbs08XboFDqKum3sc4h3GRxrTmQdl1ZK9uw-PIHf\u0022\n+\t \u0022QP0FkxXVrx-WE-ZEbrqivH_2iCLUS7wAl6XvARt1KkIaUxPPSYB9yk31s0Q8\u0022\n+\t \u0022UK96E3_OrADAYtAJs-M3JxCLfNgqh56HDnETTQhH3rCT5T3yJws\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022q\u005c\u0022:\u005c\u00221u_RiFDP7LBYh3N4GXLT9OpSKYP0uQZyiaZwBtOCBNJgQxaj10RWjsZu0c6I\u0022\n+\t \u0022edis4S7B_coSKB0Kj9PaPaBzg-IySRvvcQuPamQu66riMhjVtG6TlV8CLCYK\u0022\n+\t \u0022rYl52ziqK0E_ym2QnkwsUX7eYTB7LbAHRK9GqocDE5B0f808I4s\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022KkMTWqBUefVwZ2_Dbj1pPQqyHSHjj90L5x_MOzqYAJMcLMZtbUtwKqvVDq3\u0022\n+\t \u0022tbEo3ZIcohbDtt6SbfmWzggabpQxNxuBpoOOf_a_HgMXK_lhqigI4y_kqS1w\u0022\n+\t \u0022Y52IwjUn5rgRrJ-yYo1h41KR-vz2pYhEAeYrhttWtxVqLCRViD6c\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022AvfS0-gRxvn0bwJoMSnFxYcK1WnuEjQFluMGfwGitQBWtfZ1Er7t1xDkbN9\u0022\n+\t \u0022GQTB9yqpDoYaN06H7CFtrkxhJIBQaj6nkF5KKS3TQtQ5qCzkOkmxIe3KRbBy\u0022\n+\t \u0022mXxkb5qwUpX5ELD5xFc6FeiafWYY63TmmEAu_lRFCOJ3xDea-ots\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022lSQi-w9CpyUReMErP1RsBLk7wNtOvs5EQpPqmuMvqW57NBUczScEoPwmUqq\u0022\n+\t \u0022abu9V0-Py4dQ57_bapoKRu1R90bvuFnU63SHWEFglZQvJDMeAvmj4sm-Fp0o\u0022\n+\t \u0022Yu_neotgQ0hzbI5gry7ajdYy9-2lNx_76aBZoOUu9HCJ-UsfSOI8\u005c\u0022\u0022\n+\t \u0022}\u0022 /*,\n+lws_jwe_ex_c1_plaintext[] \u003d {\n+\t123, 34, 107, 116, 121, 34, 58, 34, 82, 83, 65, 34, 44, 34, 107,\n+\t105, 100, 34, 58, 34, 106, 117, 108, 105, 101, 116, 64, 99, 97, 112,\n+\t117, 108, 101, 116, 46, 108, 105, 116, 34, 44, 34, 117, 115, 101, 34,\n+\t58, 34, 101, 110, 99, 34, 44, 34, 110, 34, 58, 34, 116, 54, 81, 56,\n+\t80, 87, 83, 105, 49, 100, 107, 74, 106, 57, 104, 84, 80, 56, 104, 78,\n+\t89, 70, 108, 118, 97, 100, 77, 55, 68, 102, 108, 87, 57, 109, 87,\n+\t101, 112, 79, 74, 104, 74, 54, 54, 119, 55, 110, 121, 111, 75, 49,\n+\t103, 80, 78, 113, 70, 77, 83, 81, 82, 121, 79, 49, 50, 53, 71, 112,\n+\t45, 84, 69, 107, 111, 100, 104, 87, 114, 48, 105, 117, 106, 106, 72,\n+\t86, 120, 55, 66, 99, 86, 48, 108, 108, 83, 52, 119, 53, 65, 67, 71,\n+\t103, 80, 114, 99, 65, 100, 54, 90, 99, 83, 82, 48, 45, 73, 113, 111,\n+\t109, 45, 81, 70, 99, 78, 80, 56, 83, 106, 103, 48, 56, 54, 77, 119,\n+\t111, 113, 81, 85, 95, 76, 89, 121, 119, 108, 65, 71, 90, 50, 49, 87,\n+\t83, 100, 83, 95, 80, 69, 82, 121, 71, 70, 105, 78, 110, 106, 51, 81,\n+\t81, 108, 79, 56, 89, 110, 115, 53, 106, 67, 116, 76, 67, 82, 119, 76,\n+\t72, 76, 48, 80, 98, 49, 102, 69, 118, 52, 53, 65, 117, 82, 73, 117,\n+\t85, 102, 86, 99, 80, 121, 83, 66, 87, 89, 110, 68, 121, 71, 120, 118,\n+\t106, 89, 71, 68, 83, 77, 45, 65, 113, 87, 83, 57, 122, 73, 81, 50,\n+\t90, 105, 108, 103, 84, 45, 71, 113, 85, 109, 105, 112, 103, 48, 88,\n+\t79, 67, 48, 67, 99, 50, 48, 114, 103, 76, 101, 50, 121, 109, 76, 72,\n+\t106, 112, 72, 99, 105, 67, 75, 86, 65, 98, 89, 53, 45, 76, 51, 50,\n+\t45, 108, 83, 101, 90, 79, 45, 79, 115, 54, 85, 49, 53, 95, 97, 88,\n+\t114, 107, 57, 71, 119, 56, 99, 80, 85, 97, 88, 49, 95, 73, 56, 115,\n+\t76, 71, 117, 83, 105, 86, 100, 116, 51, 67, 95, 70, 110, 50, 80, 90,\n+\t51, 90, 56, 105, 55, 52, 52, 70, 80, 70, 71, 71, 99, 71, 49, 113,\n+\t115, 50, 87, 122, 45, 81, 34, 44, 34, 101, 34, 58, 34, 65, 81, 65,\n+\t66, 34, 44, 34, 100, 34, 58, 34, 71, 82, 116, 98, 73, 81, 109, 104,\n+\t79, 90, 116, 121, 115, 122, 102, 103, 75, 100, 103, 52, 117, 95, 78,\n+\t45, 82, 95, 109, 90, 71, 85, 95, 57, 107, 55, 74, 81, 95, 106, 110,\n+\t49, 68, 110, 102, 84, 117, 77, 100, 83, 78, 112, 114, 84, 101, 97,\n+\t83, 84, 121, 87, 102, 83, 78, 107, 117, 97, 65, 119, 110, 79, 69, 98,\n+\t73, 81, 86, 121, 49, 73, 81, 98, 87, 86, 86, 50, 53, 78, 89, 51, 121,\n+\t98, 99, 95, 73, 104, 85, 74, 116, 102, 114, 105, 55, 98, 65, 88, 89,\n+\t69, 82, 101, 87, 97, 67, 108, 51, 104, 100, 108, 80, 75, 88, 121, 57,\n+\t85, 118, 113, 80, 89, 71, 82, 48, 107, 73, 88, 84, 81, 82, 113, 110,\n+\t115, 45, 100, 86, 74, 55, 106, 97, 104, 108, 73, 55, 76, 121, 99,\n+\t107, 114, 112, 84, 109, 114, 77, 56, 100, 87, 66, 111, 52, 95, 80,\n+\t77, 97, 101, 110, 78, 110, 80, 105, 81, 103, 79, 48, 120, 110, 117,\n+\t84, 111, 120, 117, 116, 82, 90, 74, 102, 74, 118, 71, 52, 79, 120,\n+\t52, 107, 97, 51, 71, 79, 82, 81, 100, 57, 67, 115, 67, 90, 50, 118,\n+\t115, 85, 68, 109, 115, 88, 79, 102, 85, 69, 78, 79, 121, 77, 113, 65,\n+\t68, 67, 54, 112, 49, 77, 51, 104, 51, 51, 116, 115, 117, 114, 89, 49,\n+\t53, 107, 57, 113, 77, 83, 112, 71, 57, 79, 88, 95, 73, 74, 65, 88,\n+\t109, 120, 122, 65, 104, 95, 116, 87, 105, 90, 79, 119, 107, 50, 75,\n+\t52, 121, 120, 72, 57, 116, 83, 51, 76, 113, 49, 121, 88, 56, 67, 49,\n+\t69, 87, 109, 101, 82, 68, 107, 75, 50, 97, 104, 101, 99, 71, 56, 53,\n+\t45, 111, 76, 75, 81, 116, 53, 86, 69, 112, 87, 72, 75, 109, 106, 79,\n+\t105, 95, 103, 74, 83, 100, 83, 103, 113, 99, 78, 57, 54, 88, 53, 50,\n+\t101, 115, 65, 81, 34, 44, 34, 112, 34, 58, 34, 50, 114, 110, 83, 79,\n+\t86, 52, 104, 75, 83, 78, 56, 115, 83, 52, 67, 103, 99, 81, 72, 70,\n+\t98, 115, 48, 56, 88, 98, 111, 70, 68, 113, 75, 117, 109, 51, 115, 99,\n+\t52, 104, 51, 71, 82, 120, 114, 84, 109, 81, 100, 108, 49, 90, 75, 57,\n+\t117, 119, 45, 80, 73, 72, 102, 81, 80, 48, 70, 107, 120, 88, 86, 114,\n+\t120, 45, 87, 69, 45, 90, 69, 98, 114, 113, 105, 118, 72, 95, 50, 105,\n+\t67, 76, 85, 83, 55, 119, 65, 108, 54, 88, 118, 65, 82, 116, 49, 75,\n+\t107, 73, 97, 85, 120, 80, 80, 83, 89, 66, 57, 121, 107, 51, 49, 115,\n+\t48, 81, 56, 85, 75, 57, 54, 69, 51, 95, 79, 114, 65, 68, 65, 89, 116,\n+\t65, 74, 115, 45, 77, 51, 74, 120, 67, 76, 102, 78, 103, 113, 104, 53,\n+\t54, 72, 68, 110, 69, 84, 84, 81, 104, 72, 51, 114, 67, 84, 53, 84,\n+\t51, 121, 74, 119, 115, 34, 44, 34, 113, 34, 58, 34, 49, 117, 95, 82,\n+\t105, 70, 68, 80, 55, 76, 66, 89, 104, 51, 78, 52, 71, 88, 76, 84, 57,\n+\t79, 112, 83, 75, 89, 80, 48, 117, 81, 90, 121, 105, 97, 90, 119, 66,\n+\t116, 79, 67, 66, 78, 74, 103, 81, 120, 97, 106, 49, 48, 82, 87, 106,\n+\t115, 90, 117, 48, 99, 54, 73, 101, 100, 105, 115, 52, 83, 55, 66, 95,\n+\t99, 111, 83, 75, 66, 48, 75, 106, 57, 80, 97, 80, 97, 66, 122, 103,\n+\t45, 73, 121, 83, 82, 118, 118, 99, 81, 117, 80, 97, 109, 81, 117, 54,\n+\t54, 114, 105, 77, 104, 106, 86, 116, 71, 54, 84, 108, 86, 56, 67, 76,\n+\t67, 89, 75, 114, 89, 108, 53, 50, 122, 105, 113, 75, 48, 69, 95, 121,\n+\t109, 50, 81, 110, 107, 119, 115, 85, 88, 55, 101, 89, 84, 66, 55, 76,\n+\t98, 65, 72, 82, 75, 57, 71, 113, 111, 99, 68, 69, 53, 66, 48, 102,\n+\t56, 48, 56, 73, 52, 115, 34, 44, 34, 100, 112, 34, 58, 34, 75, 107,\n+\t77, 84, 87, 113, 66, 85, 101, 102, 86, 119, 90, 50, 95, 68, 98, 106,\n+\t49, 112, 80, 81, 113, 121, 72, 83, 72, 106, 106, 57, 48, 76, 53, 120,\n+\t95, 77, 79, 122, 113, 89, 65, 74, 77, 99, 76, 77, 90, 116, 98, 85,\n+\t116, 119, 75, 113, 118, 86, 68, 113, 51, 116, 98, 69, 111, 51, 90,\n+\t73, 99, 111, 104, 98, 68, 116, 116, 54, 83, 98, 102, 109, 87, 122,\n+\t103, 103, 97, 98, 112, 81, 120, 78, 120, 117, 66, 112, 111, 79, 79,\n+\t102, 95, 97, 95, 72, 103, 77, 88, 75, 95, 108, 104, 113, 105, 103,\n+\t73, 52, 121, 95, 107, 113, 83, 49, 119, 89, 53, 50, 73, 119, 106, 85,\n+\t110, 53, 114, 103, 82, 114, 74, 45, 121, 89, 111, 49, 104, 52, 49,\n+\t75, 82, 45, 118, 122, 50, 112, 89, 104, 69, 65, 101, 89, 114, 104,\n+\t116, 116, 87, 116, 120, 86, 113, 76, 67, 82, 86, 105, 68, 54, 99, 34,\n+\t44, 34, 100, 113, 34, 58, 34, 65, 118, 102, 83, 48, 45, 103, 82, 120,\n+\t118, 110, 48, 98, 119, 74, 111, 77, 83, 110, 70, 120, 89, 99, 75, 49,\n+\t87, 110, 117, 69, 106, 81, 70, 108, 117, 77, 71, 102, 119, 71, 105,\n+\t116, 81, 66, 87, 116, 102, 90, 49, 69, 114, 55, 116, 49, 120, 68,\n+\t107, 98, 78, 57, 71, 81, 84, 66, 57, 121, 113, 112, 68, 111, 89, 97,\n+\t78, 48, 54, 72, 55, 67, 70, 116, 114, 107, 120, 104, 74, 73, 66, 81,\n+\t97, 106, 54, 110, 107, 70, 53, 75, 75, 83, 51, 84, 81, 116, 81, 53,\n+\t113, 67, 122, 107, 79, 107, 109, 120, 73, 101, 51, 75, 82, 98, 66,\n+\t121, 109, 88, 120, 107, 98, 53, 113, 119, 85, 112, 88, 53, 69, 76,\n+\t68, 53, 120, 70, 99, 54, 70, 101, 105, 97, 102, 87, 89, 89, 54, 51,\n+\t84, 109, 109, 69, 65, 117, 95, 108, 82, 70, 67, 79, 74, 51, 120, 68,\n+\t101, 97, 45, 111, 116, 115, 34, 44, 34, 113, 105, 34, 58, 34, 108,\n+\t83, 81, 105, 45, 119, 57, 67, 112, 121, 85, 82, 101, 77, 69, 114, 80,\n+\t49, 82, 115, 66, 76, 107, 55, 119, 78, 116, 79, 118, 115, 53, 69, 81,\n+\t112, 80, 113, 109, 117, 77, 118, 113, 87, 53, 55, 78, 66, 85, 99,\n+\t122, 83, 99, 69, 111, 80, 119, 109, 85, 113, 113, 97, 98, 117, 57,\n+\t86, 48, 45, 80, 121, 52, 100, 81, 53, 55, 95, 98, 97, 112, 111, 75,\n+\t82, 117, 49, 82, 57, 48, 98, 118, 117, 70, 110, 85, 54, 51, 83, 72,\n+\t87, 69, 70, 103, 108, 90, 81, 118, 74, 68, 77, 101, 65, 118, 109,\n+\t106, 52, 115, 109, 45, 70, 112, 48, 111, 89, 117, 95, 110, 101, 111,\n+\t116, 103, 81, 48, 104, 122, 98, 73, 53, 103, 114, 121, 55, 97, 106,\n+\t100, 89, 121, 57, 45, 50, 108, 78, 120, 95, 55, 54, 97, 66, 90, 111,\n+\t79, 85, 117, 57, 72, 67, 74, 45, 85, 115, 102, 83, 79, 73, 56, 34,\n+\t125 } */\n+;\n+\n+static int\n+key_import_callback(struct lws_jwk *s, void *user)\n+{\n+\tlwsl_notice(\u0022%s: key type %d\u005cn\u0022, __func__, s-\u003ekty);\n+\n+\treturn 0;\n+}\n+\n+\n+int\n+test_jwk(struct lws_context *context)\n+{\n+\tstruct lws_jwk jwk;\n+\n+\t/* Test 1: A.1: Example public keys */\n+\n+\tif (lws_jwk_import(\u0026jwk, key_import_callback, NULL,\n+\t\t\t (char *)lws_jwe_ex_a1_jwk_json,\n+\t\t\t strlen((char *)lws_jwe_ex_a1_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022Failed to decode JWK test key\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\t/* Test 1: A.2: Example private keys */\n+\n+\tif (lws_jwk_import(\u0026jwk, key_import_callback, NULL,\n+\t\t\t (char *)lws_jwe_ex_a2_jwk_json,\n+\t\t\t strlen((char *)lws_jwe_ex_a2_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022Failed at A.2\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\t/* Test 1: A.3: Example symmetric keys */\n+\n+\tif (lws_jwk_import(\u0026jwk, key_import_callback, NULL,\n+\t\t\t (char *)lws_jwe_ex_a3_jwk_json,\n+\t\t\t strlen((char *)lws_jwe_ex_a3_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022Failed at A.3\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\t/* Test 1: B: Example x509 cert chain (no parent JSON) */\n+\n+\tif (lws_jwk_import(\u0026jwk, NULL, NULL, (char *)lws_jwe_ex_b_jwk_json,\n+\t\t\t strlen((char *)lws_jwe_ex_b_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022Failed at B\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\t/* Test 1: C.1: Example private key (no parent JSON) */\n+\n+\tif (lws_jwk_import(\u0026jwk, NULL, NULL,\n+\t\t\t (char *)lws_jwe_ex_c1_jwk_json,\n+\t\t\t strlen((char *)lws_jwe_ex_c1_jwk_json)) \u003c 0) {\n+\t\tlwsl_notice(\u0022Failed at B\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\t/* end */\n+\n+\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+\n+//bail:\n+//\tlws_jwk_destroy(\u0026jwk);\n+bail1:\n+\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n+\n+\treturn 1;\n+\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-jose/jws.c b/minimal-examples-lowlevel/api-tests/api-test-jose/jws.c\nnew file mode 100644\nindex 0000000..b6f8e69\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-jose/jws.c\n@@ -0,0 +1,962 @@\n+/*\n+ * lws-api-test-jose - RFC7515 jws tests\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+/*\n+ * JSON Web Signature is defined in RFC7515\n+ *\n+ * https://tools.ietf.org/html/rfc7515\n+ *\n+ * It's basically a way to wrap some JSON with a JSON \u0022header\u0022 describing the\n+ * crypto, and a signature, all in a BASE64 wrapper with elided terminating '\u003d'.\n+ *\n+ * The signature stays with the content, it serves a different purpose than eg\n+ * a TLS tunnel to transfer it.\n+ *\n+ */\n+\n+/* for none, the compact serialization format is b64u(jose hdr).b64u(payload) */\n+\n+static const char *none_cser \u003d\n+\t \u0022eyJhbGciOiJub25lIn0\u0022\n+\t \u0022.\u0022\n+\t \u0022eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt\u0022\n+\t \u0022cGxlLmNvbS9pc19yb290Ijp0cnVlfQ\u0022,\n+\t *none_jose \u003d \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022none\u005c\u0022}\u0022,\n+\t *none_payload\t\u003d \u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022joe\u005c\u0022,\u005cr\u005cn \u005c\u0022exp\u005c\u0022:1300819380,\u005cr\u005cn\u0022\n+\t\t\t \u0022 \u005c\u0022http://example.com/is_root\u005c\u0022:true}\u0022;\n+\n+int\n+test_jws_none(struct lws_context *context)\n+{\n+\tstruct lws_jws_map map;\n+\tstruct lws_jose jose;\n+\tchar temp[2048];\n+\tint n, temp_len \u003d sizeof(temp), ret \u003d -1;\n+\n+\tlws_jose_init(\u0026jose);\n+\n+\t/* A.5 Unsecured JSON \u0022none\u0022 RFC7515 worked example */\n+\n+\t/* decode the b64.b64[.b64] compact serialization blocks */\n+\tn \u003d lws_jws_compact_decode(none_cser, (int)strlen(none_cser), \u0026map, NULL,\n+\t\t\t\t temp, \u0026temp_len);\n+\tif (n !\u003d 2) {\n+\t\tlwsl_err(\u0022%s: concat_map failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* confirm the decoded JOSE header is exactly what we expect */\n+\t\tif (strncmp(none_jose, map.buf[LJWS_JOSE], map.len[LJWS_JOSE])) {\n+\t\t\tlwsl_err(\u0022%s: jose b64 decode wrong\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t/* parse the JOSE header */\n+\tif (lws_jws_parse_jose(\u0026jose, map.buf[LJWS_JOSE],\n+\t\t\t (int)map.len[LJWS_JOSE],\n+\t\t\t (char *)lws_concat_temp(temp, temp_len),\n+\t\t\t \u0026temp_len) \u003c 0 || !jose.alg) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* confirm we used the \u0022none\u0022 alg as expected from JOSE hdr */\n+\t\tif (strcmp(jose.alg-\u003ealg, \u0022none\u0022)) {\n+\t\t\tlwsl_err(\u0022%s: JOSE header has wrong alg\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t\t/* confirm the payload is literally what we expect */\n+\t\tif (strncmp(none_payload, map.buf[LJWS_PYLD],\n+\t\t\t\t\t map.len[LJWS_PYLD])) {\n+\t\t\tlwsl_err(\u0022%s: payload b64 decode wrong\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t/* end */\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_jose_destroy(\u0026jose);\n+\n+\tif (ret)\n+\t\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+\n+\n+static const char\n+\t *test1\t\u003d \u0022{\u005c\u0022typ\u005c\u0022:\u005c\u0022JWT\u005c\u0022,\u005cr\u005cn \u005c\u0022alg\u005c\u0022:\u005c\u0022HS256\u005c\u0022}\u0022,\n+\t *test1_enc\t\u003d \u0022eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9\u0022,\n+\t *test2\t\u003d \u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022joe\u005c\u0022,\u005cr\u005cn \u005c\u0022exp\u005c\u0022:1300819380,\u005cr\u005cn\u0022\n+\t\t\t \u0022 \u005c\u0022http://example.com/is_root\u005c\u0022:true}\u0022,\n+\t *test2_enc\t\u003d \u0022eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQ\u0022\n+\t\t\t \u0022ogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ\u0022,\n+\t *key_jwk\t\u003d \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022,\u005cr\u005cn\u0022\n+\t\t\t \u0022 \u005c\u0022k\u005c\u0022:\u005c\u0022AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQ\u0022\n+\t\t\t \u0022Lr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\u005c\u0022}\u0022,\n+\t *hash_enc\t\u003d \u0022dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk\u0022\n+;\n+\n+int\n+test_jws_HS256(struct lws_context *context)\n+{\n+\tchar buf[2048], temp[256], *p \u003d buf, *end \u003d buf + sizeof(buf) - 1, *enc_ptr;\n+\tuint8_t digest[LWS_GENHASH_LARGEST];\n+\tstruct lws_jws_map map;\n+\tint temp_len \u003d sizeof(temp);\n+\tstruct lws_genhmac_ctx ctx;\n+\tstruct lws_jose jose;\n+\tstruct lws_jwk jwk;\n+\tstruct lws_jws jws;\n+\tint n;\n+\n+\tlws_jose_init(\u0026jose);\n+\tlws_jws_init(\u0026jws, \u0026jwk, context);\n+\n+\t/* Test 1: SHA256 on RFC7515 worked example */\n+\n+\t/* parse the JOSE header */\n+\n+\tif (lws_jws_parse_jose(\u0026jose, test1, (int)strlen(test1), temp,\n+\t\t\t \u0026temp_len) \u003c 0 || !jose.alg) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* confirm we used the \u0022none\u0022 alg as expected from JOSE hdr */\n+\t\tif (strcmp(jose.alg-\u003ealg, \u0022HS256\u0022)) {\n+\t\t\tlwsl_err(\u0022%s: JOSE header has wrong alg\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t/* 1.1: import the JWK oct key */\n+\n+\tif (lws_jwk_import(\u0026jwk, NULL, NULL, key_jwk, strlen(key_jwk)) \u003c 0) {\n+\t\tlwsl_notice(\u0022Failed to decode JWK test key\u005cn\u0022);\n+\t\treturn -1;\n+\t}\n+\t\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_OCT) {\n+\t\t\tlwsl_err(\u0022%s: unexpected kty %d\u005cn\u0022, __func__, jwk.kty);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t/* 1.2: create JWS known hdr + known payload */\n+\n+\tn \u003d lws_jws_encode_section(test1, strlen(test1), 1, \u0026p, end);\n+\tif (n \u003c 0) {\n+\t\tgoto bail;\n+\t}\n+\n+\t\tif (strcmp(buf, test1_enc))\n+\t\t\tgoto bail;\n+\n+\tenc_ptr \u003d p + 1; /* + 1 skips the . */\n+\tn \u003d lws_jws_encode_section(test2, strlen(test2), 0, \u0026p, end);\n+\tif (n \u003c 0) {\n+\t\tgoto bail;\n+\t}\n+\n+\t\tif (strcmp(enc_ptr, test2_enc))\n+\t\t\tgoto bail;\n+\n+\t/* 1.3: use HMAC SHA-256 with known key on the hdr . payload */\n+\n+\tif (lws_genhmac_init(\u0026ctx, jose.alg-\u003ehmac_type,\n+\t\t\t jwk.e[LWS_GENCRYPTO_OCT_KEYEL_K].buf,\n+\t\t\t jwk.e[LWS_GENCRYPTO_OCT_KEYEL_K].len))\n+\t\tgoto bail;\n+\tif (lws_genhmac_update(\u0026ctx, (uint8_t *)buf, lws_ptr_diff_size_t(p, buf)))\n+\t\tgoto bail_destroy_hmac;\n+\tlws_genhmac_destroy(\u0026ctx, digest);\n+\n+\t/* 1.4: append a base64 encode of the computed HMAC digest */\n+\n+\tenc_ptr \u003d p + 1; /* + 1 skips the . */\n+\tn \u003d lws_jws_encode_section((const char *)digest, 32, 0, \u0026p, end);\n+\tif (n \u003c 0)\n+\t\tgoto bail;\n+\tif (strcmp(enc_ptr, hash_enc)) { /* check against known B64URL hash */\n+\t\tlwsl_err(\u0022%s: b64 enc of computed HMAC mismatches '%s' '%s'\u005cn\u0022,\n+\t\t\t __func__, enc_ptr, hash_enc);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* 1.5: Check we can agree the signature matches the payload */\n+\n+\tif (lws_jws_sig_confirm_compact_b64(buf, lws_ptr_diff_size_t(p, buf), \u0026map, \u0026jwk, context,\n+\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: confirm sig failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_jws_destroy(\u0026jws);\n+\tlws_jwk_destroy(\u0026jwk);\n+\tlws_jose_destroy(\u0026jose);\n+\n+\t/* end */\n+\n+\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+\n+bail_destroy_hmac:\n+\tlws_genhmac_destroy(\u0026ctx, NULL);\n+\n+bail:\n+\tlws_jws_destroy(\u0026jws);\n+\tlws_jwk_destroy(\u0026jwk);\n+\tlws_jose_destroy(\u0026jose);\n+\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n+\n+\treturn 1;\n+}\n+\n+\n+static const char\n+\t/* the key from worked example in RFC7515 A-2, as a JWK */\n+\t*rfc7515_rsa_key \u003d\n+\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n+\t\u0022 \u005c\u0022n\u005c\u0022:\u005c\u0022ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddx\u0022\n+\t\t \u0022HmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMs\u0022\n+\t\t \u0022D1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSH\u0022\n+\t\t \u0022SXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdV\u0022\n+\t\t \u0022MTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8\u0022\n+\t\t \u0022NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97I\u0022\n+\t\t\u0022jlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0\u0022\n+\t\t\u0022BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn\u0022\n+\t\t\u0022439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYT\u0022\n+\t\t\u0022CBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLh\u0022\n+\t\t\u0022BOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u00224BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdi\u0022\n+\t\t\u0022YrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPG\u0022\n+\t\t\u0022BY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u0022uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxa\u0022\n+\t\t\u0022ewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA\u0022\n+\t\t\u0022-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3Q\u0022\n+\t\t\u0022CLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb\u0022\n+\t\t\u002234MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa\u0022\n+\t\t\u00227I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-ky\u0022\n+\t\t\u0022NlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2o\u0022\n+\t\t\u0022y26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLU\u0022\n+\t\t\u0022W0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+\t*rfc7515_rsa_a1 \u003d /* the signed worked example in RFC7515 A-1 */\n+\t\u0022eyJhbGciOiJSUzI1NiJ9\u0022\n+\t\u0022.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt\u0022\n+\t\u0022cGxlLmNvbS9pc19yb290Ijp0cnVlfQ\u0022\n+\t\u0022.cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7\u0022\n+\t\u0022AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4\u0022\n+\t\u0022BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K\u0022\n+\t\u00220GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqv\u0022\n+\t\u0022hJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrB\u0022\n+\t\u0022p0igcN_IoypGlUPQGe77Rw\u0022\n+;\n+\n+int\n+test_jws_RS256(struct lws_context *context)\n+{\n+\tstruct lws_jws_map map;\n+\tstruct lws_jose jose;\n+\tstruct lws_jwk jwk;\n+\tstruct lws_jws jws;\n+\tchar temp[2048], *in;\n+\tint n, l, temp_len \u003d sizeof(temp);\n+\n+\tlws_jose_init(\u0026jose);\n+\tlws_jws_init(\u0026jws, \u0026jwk, context);\n+\n+\t/* Test 2: RS256 on RFC7515 worked example */\n+\n+\tif (lws_gencrypto_jws_alg_to_definition(\u0022RS256\u0022, \u0026jose.alg)) {\n+\t\tlwsl_err(\u0022%s: RS256 not supported\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* 2.1: import the jwk */\n+\n+\tif (lws_jwk_import(\u0026jwk, NULL, NULL,\n+\t\t\t rfc7515_rsa_key, strlen(rfc7515_rsa_key))) {\n+\t\tlwsl_notice(\u0022%s: 2.2: Failed to read JWK key\u005cn\u0022, __func__);\n+\t\tgoto bail2;\n+\t}\n+\n+\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_RSA) {\n+\t\tlwsl_err(\u0022%s: 2.2: kty: %d instead of RSA\u005cn\u0022, __func__, jwk.kty);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* 2.2: check the signature on the test packet from RFC7515 A-1 */\n+\n+\tif (lws_jws_sig_confirm_compact_b64(rfc7515_rsa_a1,\n+\t\t\t\t\t strlen(rfc7515_rsa_a1), \u0026map,\n+\t\t\t\t\t \u0026jwk, context, temp, \u0026temp_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: 2.2: confirm rsa sig failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_jws_b64_compact_map(rfc7515_rsa_a1, (int)strlen(rfc7515_rsa_a1),\n+\t\t\t\t \u0026jws.map_b64) !\u003d 3) {\n+\t\tlwsl_notice(\u0022%s: lws_jws_b64_compact_map failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* 2.3: generate our own signature for a copy of the test packet */\n+\n+\tin \u003d lws_concat_temp(temp, temp_len);\n+\tl \u003d (int)strlen(rfc7515_rsa_a1);\n+\tif (temp_len \u003c l + 1)\n+\t\tgoto bail;\n+\tmemcpy(in, rfc7515_rsa_a1, (unsigned int)l + 1);\n+\ttemp_len -\u003d l + 1;\n+\n+\tif (lws_jws_b64_compact_map(in, l, \u0026jws.map_b64) !\u003d 3) {\n+\t\tlwsl_notice(\u0022%s: lws_jws_b64_compact_map failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* overwrite the copy of the known b64 sig (it's all placed inside temp) */\n+\tn \u003d lws_jws_sign_from_b64(\u0026jose, \u0026jws,\n+\t\t\t\t (char *)jws.map_b64.buf[LJWS_SIG],\n+\t\t\t\t jws.map_b64.len[LJWS_SIG] + 8);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: failed signing test packet\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\tjws.map_b64.len[LJWS_SIG] \u003d (unsigned int)n;\n+\n+\t/* 2.4: confirm our signature can be verified */\n+\n+\tin[l] \u003d '\u005c0';\n+\tif (lws_jws_sig_confirm_compact_b64(in, (unsigned int)l, \u0026map, \u0026jwk,\n+\t\t\tcontext, lws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: 2.2: confirm rsa sig failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\t/* end */\n+\n+\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_jwk_destroy(\u0026jwk);\n+bail2:\n+\tlws_jws_destroy(\u0026jws);\n+\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n+\n+\treturn 1;\n+}\n+\n+static const char\n+\t*es256_jose \u003d \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ES256\u005c\u0022}\u0022,\n+\t*es256_payload\t\u003d \u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022joe\u005c\u0022,\u005cr\u005cn \u005c\u0022exp\u005c\u0022:1300819380,\u005cr\u005cn\u0022\n+\t\t\t \u0022 \u005c\u0022http://example.com/is_root\u005c\u0022:true}\u0022,\n+\t*es256_cser \u003d\n+\t \u0022eyJhbGciOiJFUzI1NiJ9\u0022\n+\t \u0022.\u0022\n+\t \u0022eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt\u0022\n+\t \u0022cGxlLmNvbS9pc19yb290Ijp0cnVlfQ\u0022\n+\t \u0022.\u0022\n+\t \u0022DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSA\u0022\n+\t \u0022pmWQxfKTUJqPP3-Kg6NU1Q\u0022,\n+\t*es256_jwk \u003d\n+\t\u0022{\u0022\n+\t\t\u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022x\u005c\u0022:\u005c\u0022f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022y\u005c\u0022:\u005c\u0022x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI\u005c\u0022\u0022\n+\t\u0022}\u0022\n+#if 0\n+\t\t\t,\n+\trfc7515_ec_a3_R[] \u003d {\n+\t\t 14, 209, 33, 83, 121, 99, 108, 72, 60, 47, 127, 21, 88,\n+\t\t 7, 212, 2, 163, 178, 40, 3, 58, 249, 124, 126, 23, 129,\n+\t\t154, 195, 22, 158, 166, 101\n+\t},\n+\trfc7515_ec_a3_S[] \u003d {\n+\t\t197, 10, 7, 211, 140, 60, 112, 229, 216, 241, 45, 175,\n+\t\t 8, 74, 84, 128, 166, 101, 144, 197, 242, 147, 80, 154,\n+\t\t143, 63, 127, 138, 131, 163, 84, 213\n+\t}\n+#endif\n+;\n+\n+int\n+test_jws_ES256(struct lws_context *context)\n+{\n+\tuint8_t digest[LWS_GENHASH_LARGEST];\n+\tstruct lws_genhash_ctx hash_ctx;\n+\tstruct lws_jws_map map;\n+\tstruct lws_jose jose;\n+\tstruct lws_jwk jwk;\n+\tstruct lws_jws jws;\n+\tchar temp[2048], *p;\n+\tint ret \u003d -1, l, n, temp_len \u003d sizeof(temp);\n+\n+\t/* A.3 \u0022ES256\u0022 RFC7515 worked example - verify */\n+\n+\tlws_jose_init(\u0026jose);\n+\n+\t/* decode the b64.b64[.b64] compact serialization blocks */\n+\tif (lws_jws_compact_decode(es256_cser, (int)strlen(es256_cser),\n+\t\t\t\t \u0026jws.map, \u0026jws.map_b64,\n+\t\t\t\t temp, \u0026temp_len) !\u003d 3) {\n+\t\tlwsl_err(\u0022%s: concat_map failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* confirm the decoded JOSE header is exactly what we expect */\n+\t\tif (jws.map.len[LJWS_JOSE] !\u003d strlen(es256_jose) ||\n+\t\t strncmp(es256_jose, jws.map.buf[LJWS_JOSE],\n+\t\t\t\t jws.map.len[LJWS_JOSE])) {\n+\t\t\tlwsl_err(\u0022%s: jose b64 decode wrong\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t\t/* confirm the decoded payload is exactly what we expect */\n+\t\tif (jws.map.len[LJWS_PYLD] !\u003d strlen(es256_payload) ||\n+\t\t strncmp(es256_payload, jws.map.buf[LJWS_PYLD],\n+\t\t\t\t\t jws.map.len[LJWS_PYLD])) {\n+\t\t\tlwsl_err(\u0022%s: payload b64 decode wrong\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t/* parse the JOSE header */\n+\tif (lws_jws_parse_jose(\u0026jose, jws.map.buf[LJWS_JOSE],\n+\t\t\t (int)jws.map.len[LJWS_JOSE],\n+\t\t\t (char *)lws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* confirm we used \u0022ES256\u0022 alg we expect from the JOSE hdr */\n+\t\tif (strcmp(jose.alg-\u003ealg, \u0022ES256\u0022)) {\n+\t\t\tlwsl_err(\u0022%s: JOSE header has wrong alg\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\tjws.jwk \u003d \u0026jwk;\n+\tjws.context \u003d context;\n+\n+\t/* import the ES256 jwk */\n+\tif (lws_jwk_import(\u0026jwk, NULL, NULL, es256_jwk, strlen(es256_jwk))) {\n+\t\tlwsl_notice(\u0022%s: Failed to read JWK key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* sanity */\n+\t\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_EC) {\n+\t\t\tlwsl_err(\u0022%s: kty: %d instead of EC\u005cn\u0022,\n+\t\t\t\t\t__func__, jwk.kty);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\tif (lws_jws_sig_confirm(\u0026jws.map_b64, \u0026jws.map, \u0026jwk, context) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: confirm EC sig failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* A.3 \u0022ES256\u0022 RFC7515 worked example - sign */\n+\n+\tl \u003d (int)strlen(es256_cser);\n+\tif (temp_len \u003c l + 1)\n+\t\tgoto bail1;\n+\tp \u003d lws_concat_temp(temp, temp_len);\n+\tmemcpy(p, es256_cser, (unsigned int)l + 1);\n+\ttemp_len -\u003d l + 1;\n+\n+\t/* scan the b64 compact serialization string to map the blocks */\n+\tif (lws_jws_b64_compact_map(p, l, \u0026jws.map_b64) !\u003d 3)\n+\t\tgoto bail1;\n+\n+\t/* create the hash of the protected b64 part */\n+\tif (lws_genhash_init(\u0026hash_ctx, jose.alg-\u003ehash_type) ||\n+\t lws_genhash_update(\u0026hash_ctx, jws.map_b64.buf[LJWS_JOSE],\n+\t\t\t jws.map_b64.len[LJWS_JOSE]) ||\n+\t lws_genhash_update(\u0026hash_ctx, \u0022.\u0022, 1) ||\n+\t lws_genhash_update(\u0026hash_ctx, jws.map_b64.buf[LJWS_PYLD],\n+\t\t\t jws.map_b64.len[LJWS_PYLD]) ||\n+\t lws_genhash_destroy(\u0026hash_ctx, digest)) {\n+\t\tlws_genhash_destroy(\u0026hash_ctx, NULL);\n+\n+\t\tgoto bail1;\n+\t}\n+\n+\tlwsl_hexdump(jws.map_b64.buf[LJWS_SIG], jws.map_b64.len[LJWS_SIG]);\n+\n+\t/* overwrite the copy of the known b64 sig (it's placed inside buf) */\n+\tn \u003d lws_jws_sign_from_b64(\u0026jose, \u0026jws,\n+\t\t\t\t (char *)jws.map_b64.buf[LJWS_SIG],\n+\t\t\t\t jws.map_b64.len[LJWS_SIG] + 8);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: failed signing test packet\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\tjws.map_b64.len[LJWS_SIG] \u003d (unsigned int)n;\n+\n+\tlwsl_hexdump(jws.map_b64.buf[LJWS_SIG], jws.map_b64.len[LJWS_SIG]);\n+\n+\t/* 2.4: confirm our generated signature can be verified */\n+\n+//\tlwsl_err(\u0022p %p, l %d\u005cn\u0022, p, (int)l);\n+\tp[l] \u003d '\u005c0';\n+\tif (lws_jws_sig_confirm_compact_b64(p, (unsigned int)l, \u0026map, \u0026jwk,\n+\t\t\tcontext, lws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: confirm our EC sig failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* end */\n+\tret \u003d 0;\n+\n+bail1:\n+\tlws_jwk_destroy(\u0026jwk);\n+\tlws_jose_destroy(\u0026jose);\n+\n+bail:\n+\tlwsl_notice(\u0022%s: selftest %s\u005cn\u0022, __func__, ret ? \u0022FAIL\u0022 : \u0022OK\u0022);\n+\n+\treturn ret;\n+}\n+\n+static const char\n+\t*es512_jose \u003d \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ES512\u005c\u0022}\u0022,\n+\t*es512_payload\t\u003d \u0022Payload\u0022,\n+\t*es512_cser \u003d\n+\t \u0022eyJhbGciOiJFUzUxMiJ9\u0022\n+\t \u0022.\u0022\n+\t \u0022UGF5bG9hZA\u0022\n+\t \u0022.\u0022\n+\t \u0022AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZq\u0022\n+\t \u0022wqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8Kp\u0022\n+\t \u0022EHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn\u0022,\n+\t*es512_jwk \u003d\n+\t \u0022{\u0022\n+\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-521\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_\u0022\n+\t \u0022NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDl\u0022\n+\t \u0022y79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPA\u0022\n+\t \u0022xerEzgdRhajnu0ferB0d53vM9mE15j2C\u005c\u0022\u0022\n+\t \u0022}\u0022\n+;\n+\n+int\n+test_jws_ES512(struct lws_context *context)\n+{\n+\tuint8_t digest[LWS_GENHASH_LARGEST];\n+\tstruct lws_genhash_ctx hash_ctx;\n+\tstruct lws_jws_map map;\n+\tstruct lws_jose jose;\n+\tstruct lws_jwk jwk;\n+\tstruct lws_jws jws;\n+\tchar temp[2048], *p;\n+\tint ret \u003d -1, l, n, temp_len \u003d sizeof(temp);\n+\n+\t/* A.4 \u0022ES512\u0022 RFC7515 worked example - verify */\n+\n+\tlws_jose_init(\u0026jose);\n+\n+\t/* decode the b64.b64[.b64] compact serialization blocks */\n+\tif (lws_jws_compact_decode(es512_cser, (int)strlen(es512_cser),\n+\t\t\t\t \u0026jws.map, \u0026jws.map_b64, temp,\n+\t\t\t\t \u0026temp_len) !\u003d 3) {\n+\t\tlwsl_err(\u0022%s: concat_map failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* confirm the decoded JOSE header is exactly what we expect */\n+\t\tif (jws.map.len[LJWS_JOSE] !\u003d strlen(es512_jose) ||\n+\t\t strncmp(es512_jose, jws.map.buf[LJWS_JOSE],\n+\t\t\t\t jws.map.len[LJWS_JOSE])) {\n+\t\t\tlwsl_err(\u0022%s: jose b64 decode wrong\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t\t/* confirm the decoded payload is exactly what we expect */\n+\t\tif (jws.map.len[LJWS_PYLD] !\u003d strlen(es512_payload) ||\n+\t\t strncmp(es512_payload, jws.map.buf[LJWS_PYLD],\n+\t\t\t\t\t jws.map.len[LJWS_PYLD])) {\n+\t\t\tlwsl_err(\u0022%s: payload b64 decode wrong\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t/* parse the JOSE header */\n+\tif (lws_jws_parse_jose(\u0026jose, jws.map.buf[LJWS_JOSE],\n+\t\t\t (int)jws.map.len[LJWS_JOSE],\n+\t\t\t lws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* confirm we used \u0022es512\u0022 alg we expect from the JOSE hdr */\n+\t\tif (strcmp(jose.alg-\u003ealg, \u0022ES512\u0022)) {\n+\t\t\tlwsl_err(\u0022%s: JOSE header has wrong alg\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\tjws.jwk \u003d \u0026jwk;\n+\tjws.context \u003d context;\n+\n+\t/* import the es512 jwk */\n+\tif (lws_jwk_import(\u0026jwk, NULL, NULL, es512_jwk, strlen(es512_jwk))) {\n+\t\tlwsl_notice(\u0022%s: Failed to read JWK key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t\t/* sanity */\n+\t\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_EC) {\n+\t\t\tlwsl_err(\u0022%s: kty: %d instead of EC\u005cn\u0022,\n+\t\t\t\t\t__func__, jwk.kty);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\tif (lws_jws_sig_confirm(\u0026jws.map_b64, \u0026jws.map, \u0026jwk, context) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: confirm EC sig failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* A.3 \u0022es512\u0022 RFC7515 worked example - sign */\n+\n+\tl \u003d (int)strlen(es512_cser);\n+\tif (temp_len \u003c l)\n+\t\tgoto bail1;\n+\tp \u003d lws_concat_temp(temp, temp_len);\n+\tmemcpy(p, es512_cser, (unsigned int)l + 1);\n+\ttemp_len -\u003d (l + 1);\n+\n+\t/* scan the b64 compact serialization string to map the blocks */\n+\tif (lws_jws_b64_compact_map(p, l, \u0026jws.map_b64) !\u003d 3)\n+\t\tgoto bail1;\n+\n+\t/* create the hash of the protected b64 part */\n+\tif (lws_genhash_init(\u0026hash_ctx, jose.alg-\u003ehash_type) ||\n+\t lws_genhash_update(\u0026hash_ctx, jws.map_b64.buf[LJWS_JOSE],\n+\t\t\t jws.map_b64.len[LJWS_JOSE]) ||\n+\t lws_genhash_update(\u0026hash_ctx, \u0022.\u0022, 1) ||\n+\t lws_genhash_update(\u0026hash_ctx, jws.map_b64.buf[LJWS_PYLD],\n+\t\t\t jws.map_b64.len[LJWS_PYLD]) ||\n+\t lws_genhash_destroy(\u0026hash_ctx, digest)) {\n+\t\tlws_genhash_destroy(\u0026hash_ctx, NULL);\n+\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* overwrite the copy of the known b64 sig (it's placed inside buf) */\n+\tn \u003d lws_jws_sign_from_b64(\u0026jose, \u0026jws,\n+\t\t\t\t (char *)jws.map_b64.buf[LJWS_SIG], 1024);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: failed signing test packet\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\tjws.map_b64.len[LJWS_SIG] \u003d (unsigned int)n;\n+\n+\t/* 2.4: confirm our generated signature can be verified */\n+\n+\tp[l] \u003d '\u005c0';\n+\n+\tif (lws_jws_sig_confirm_compact_b64(p, (unsigned int)l, \u0026map, \u0026jwk, context,\n+\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n+\t\tlwsl_notice(\u0022%s: confirm our ECDSA sig failed\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* jwt test */\n+\n+\t{\n+\t\tunsigned long long ull \u003d lws_now_secs();\n+\t\tchar buf[8192];\n+\t\tsize_t cml \u003d 2048, cml2 \u003d 2048;\n+\n+\t\tif (lws_jwt_sign_compact(context, \u0026jwk, \u0022ES512\u0022,\n+\t\t\t\t\t(char *)buf, \u0026cml2,\n+\t\t\t\t\t(char *)buf + 2048, 4096,\n+\t\t\t\t\t\u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022warmcat.com\u005c\u0022,\u005c\u0022aud\u005c\u0022:\u0022\n+\t\t\t\t\t\u0022\u005c\u0022https://libwebsockets.org/sai\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022iat\u005c\u0022:%llu,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022nbf\u005c\u0022:%llu,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022exp\u005c\u0022:%llu,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022sub\u005c\u0022:\u005c\u0022manage\u005c\u0022}\u0022, ull,\n+\t\t\t\t\tull - 60, ull + (30 * 24 * 3600)\n+\t\t\t\t )) {\n+\t\t\tlwsl_err(\u0022%s: failed to create JWT\u005cn\u0022, __func__);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022%s: jwt test '%s'\u005cn\u0022, __func__, buf);\n+\n+\t\tif (lws_jwt_signed_validate(context, \u0026jwk, \u0022ES512\u0022,\n+\t\t\t\t\t (const char *)buf, cml2,\n+\t\t\t\t\t (char *)buf + 2048, 2048,\n+\t\t\t\t\t (char *)buf + 4096, \u0026cml)) {\n+\t\t\tlwsl_err(\u0022%s: failed to parse JWT\u005cn\u0022, __func__);\n+\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022%s: jwt valid, payload '%s'\u005cn\u0022,\n+\t\t\t\t__func__, buf + 4096);\n+\t}\n+\n+\t/* end */\n+\tret \u003d 0;\n+\n+bail1:\n+\tlws_jwk_destroy(\u0026jwk);\n+\tlws_jose_destroy(\u0026jose);\n+\n+bail:\n+\tlwsl_notice(\u0022%s: selftest %s\u005cn\u0022, __func__, ret ? \u0022FAIL\u0022 : \u0022OK\u0022);\n+\n+\treturn ret;\n+}\n+\n+static char\n+\trsa_cert[] \u003d \u0022-----BEGIN CERTIFICATE-----\u005cn\u0022\n+\t \u0022MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\u005cn\u0022\n+\t \u0022VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\u005cn\u0022\n+\t \u0022MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\u005cn\u0022\n+\t \u0022HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\u005cn\u0022\n+\t \u0022WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\u005cn\u0022\n+\t \u0022d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\u005cn\u0022\n+\t \u0022cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\u005cn\u0022\n+\t \u0022aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\u005cn\u0022\n+\t \u0022aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\u005cn\u0022\n+\t \u0022Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\u005cn\u0022\n+\t \u0022LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\u005cn\u0022\n+\t \u0022KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\u005cn\u0022\n+\t \u0022jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\u005cn\u0022\n+\t \u0022Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\u005cn\u0022\n+\t \u0022TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\u005cn\u0022\n+\t \u0022Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\u005cn\u0022\n+\t \u0022nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\u005cn\u0022\n+\t \u0022GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\u005cn\u0022\n+\t \u0022sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\u005cn\u0022\n+\t \u00229mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\u005cn\u0022\n+\t \u0022jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\u005cn\u0022\n+\t \u0022YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\u005cn\u0022\n+\t \u0022xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\u005cn\u0022\n+\t \u0022wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\u005cn\u0022\n+\t \u0022H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\u005cn\u0022\n+\t \u0022xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\u005cn\u0022\n+\t \u0022ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\u005cn\u0022\n+\t \u00221WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\u005cn\u0022\n+\t \u0022AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\u005cn\u0022\n+\t \u0022mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\u005cn\u0022\n+\t \u00228sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\u005cn\u0022\n+\t \u0022e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\u005cn\u0022\n+\t \u0022-----END CERTIFICATE-----\u005cn\u0022,\n+\trsa_key[] \u003d \u0022-----BEGIN PRIVATE KEY-----\u005cn\u0022\n+\t \u0022MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\u005cn\u0022\n+\t \u0022PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\u005cn\u0022\n+\t \u0022nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\u005cn\u0022\n+\t \u0022toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\u005cn\u0022\n+\t \u00220xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\u005cn\u0022\n+\t \u0022J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\u005cn\u0022\n+\t \u0022Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\u005cn\u0022\n+\t \u0022uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\u005cn\u0022\n+\t \u0022fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\u005cn\u0022\n+\t \u0022zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\u005cn\u0022\n+\t \u0022ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\u005cn\u0022\n+\t \u0022QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\u005cn\u0022\n+\t \u0022qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\u005cn\u0022\n+\t \u0022vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\u005cn\u0022\n+\t \u0022fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\u005cn\u0022\n+\t \u0022Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\u005cn\u0022\n+\t \u0022G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\u005cn\u0022\n+\t \u0022HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\u005cn\u0022\n+\t \u0022YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\u005cn\u0022\n+\t \u0022xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\u005cn\u0022\n+\t \u0022esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\u005cn\u0022\n+\t \u0022zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\u005cn\u0022\n+\t \u0022mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\u005cn\u0022\n+\t \u0022au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\u005cn\u0022\n+\t \u002240QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\u005cn\u0022\n+\t \u0022YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\u005cn\u0022\n+\t \u0022PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\u005cn\u0022\n+\t \u0022W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\u005cn\u0022\n+\t \u0022naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\u005cn\u0022\n+\t \u00222ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\u005cn\u0022\n+\t \u002239I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\u005cn\u0022\n+\t \u0022J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\u005cn\u0022\n+\t \u0022R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\u005cn\u0022\n+\t \u0022Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\u005cn\u0022\n+\t \u0022BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\u005cn\u0022\n+\t \u0022fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\u005cn\u0022\n+\t \u0022x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\u005cn\u0022\n+\t \u0022UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\u005cn\u0022\n+\t \u0022OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\u005cn\u0022\n+\t \u002265uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\u005cn\u0022\n+\t \u0022aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\u005cn\u0022\n+\t \u0022SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\u005cn\u0022\n+\t \u0022me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\u005cn\u0022\n+\t \u0022G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\u005cn\u0022\n+\t \u0022TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\u005cn\u0022\n+\t \u002256s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\u005cn\u0022\n+\t \u0022gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\u005cn\u0022\n+\t \u0022Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\u005cn\u0022\n+\t \u0022NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\u005cn\u0022\n+\t \u0022fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\u005cn\u0022\n+\t \u0022-----END PRIVATE KEY-----\u005cn\u0022;\n+\n+int\n+test_jwt_RS256(struct lws_context *context)\n+{\n+\tstruct lws_jwk jwk;\n+\tstruct lws_x509_cert *pub \u003d NULL;\n+\tint ret \u003d -1;\n+\tint ret_encode;\n+\tchar sha1_fingerprint[30];\n+\tuint8_t sha1sum[20];\n+\tchar der_buf[LWS_ARRAY_SIZE(rsa_cert)];\n+\tunion lws_tls_cert_info_results *der_info \u003d\n+\t\t\t(union lws_tls_cert_info_results *)der_buf;\n+\n+\tif (lws_x509_create(\u0026pub)) {\n+\t\tlwsl_err(\u0022%s: failed to create x509 public key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_x509_parse_from_pem(pub, rsa_cert, LWS_ARRAY_SIZE(rsa_cert))) {\n+\t\tlwsl_err(\u0022%s: failed to parse x509 public key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_x509_public_to_jwk(\u0026jwk, pub, NULL, 2048)) {\n+\t\tlwsl_err(\u0022%s: failed to copy public key to jwk\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_x509_jwk_privkey_pem(context, \u0026jwk, (char *)rsa_key,\n+\t\t\t\t LWS_ARRAY_SIZE(rsa_key), NULL)) {\n+\t\tlwsl_err(\u0022%s: failed to copy private key to jwk\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_x509_info(pub, LWS_TLS_CERT_INFO_DER_RAW, der_info,\n+\t\t\t LWS_ARRAY_SIZE(der_buf) - sizeof(*der_info) +\n+\t\t\t sizeof(der_info-\u003ens.name)) ||\n+\t der_info-\u003ens.len \u003c\u003d 0) {\n+\t\tlwsl_err(\u0022%s: failed to parse x509 public key\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (!lws_SHA1((unsigned char *)der_info-\u003ens.name,\n+\t\t (size_t)der_info-\u003ens.len, sha1sum)) {\n+\t\tlwsl_err(\u0022%s: sha1sum of public key failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tret_encode \u003d lws_b64_encode_string_url((char *)sha1sum,\n+\t\t\t\tLWS_ARRAY_SIZE(sha1sum), sha1_fingerprint,\n+\t\t\t\tLWS_ARRAY_SIZE(sha1_fingerprint));\n+\tif (ret_encode \u003c 0) {\n+\t\tlwsl_err(\u0022%s: failed to encode sha1sum to base64url\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (sha1_fingerprint[--ret_encode] \u003d\u003d '\u003d')\n+\t\tsha1_fingerprint[ret_encode] \u003d '\u005c0';\n+\n+\tlwsl_notice(\u0022%s: cert fingerprint '%s'\u005cn\u0022, __func__, sha1_fingerprint);\n+\n+\t/* now produce jwt with some additional header fields */\n+\t{\n+\t\tunsigned long long ull \u003d lws_now_secs();\n+\t\tchar buf[8192];\n+\t\tsize_t cml \u003d 2048, cml2 \u003d 2048;\n+\t\tconst char hdr_fmt[] \u003d \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022RS256\u005c\u0022, \u005c\u0022typ\u005c\u0022:\u005c\u0022JWT\u005c\u0022, \u005c\u0022x5t\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022;\n+\t\tchar jose_hdr[LWS_ARRAY_SIZE(hdr_fmt) + LWS_ARRAY_SIZE(sha1_fingerprint)];\n+\n+\t\tstruct lws_jwt_sign_info info \u003d {\n+\t\t\t.alg \u003d NULL,\n+\t\t\t.jose_hdr \u003d jose_hdr,\n+\t\t\t.jose_hdr_len \u003d (size_t)lws_snprintf(jose_hdr, LWS_ARRAY_SIZE(jose_hdr), hdr_fmt, sha1_fingerprint),\n+\t\t\t.out \u003d buf,\n+\t\t\t.out_len \u003d \u0026cml2,\n+\t\t\t.temp \u003d buf + cml2,\n+\t\t\t.tl \u003d 4096\n+\t\t};\n+\n+\t\tlwsl_notice(\u0022%s: jose_hdr of len %zu: '%s'\u005cn\u0022, __func__, info.jose_hdr_len, info.jose_hdr);\n+\t\tif (lws_jwt_sign_via_info(context, \u0026jwk, \u0026info,\n+\t\t\t\t\t\u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022warmcat.com\u005c\u0022,\u005c\u0022aud\u005c\u0022:\u0022\n+\t\t\t\t\t\u0022\u005c\u0022https://libwebsockets.org/sai\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022iat\u005c\u0022:%llu,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022nbf\u005c\u0022:%llu,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022exp\u005c\u0022:%llu,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022sub\u005c\u0022:\u005c\u0022manage\u005c\u0022}\u0022, ull,\n+\t\t\t\t\tull - 60, ull + (30 * 24 * 3600)\n+\t\t\t\t\t\t )) {\n+\t\t\tlwsl_err(\u0022%s: failed to create JWT\u005cn\u0022, __func__);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022%s: jwt test '%s'\u005cn\u0022, __func__, buf);\n+\n+\t\tif (lws_jwt_signed_validate(context, \u0026jwk, \u0022RS256\u0022,\n+\t\t\t\t\t\t\t (const char *)buf, cml2,\n+\t\t\t\t\t\t\t (char *)buf + 2048, 2048,\n+\t\t\t\t\t\t\t (char *)buf + 4096, \u0026cml)) {\n+\t\t\tlwsl_err(\u0022%s: failed to parse JWT\u005cn\u0022, __func__);\n+\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022%s: jwt valid, payload '%s'\u005cn\u0022,\n+\t\t\t\t__func__, buf + 4096);\n+\t}\n+\n+\t/* end */\n+\tret \u003d\t0;\n+\n+bail1:\n+\tlws_jwk_destroy(\u0026jwk);\n+\tlws_x509_destroy(\u0026pub);\n+\n+bail:\n+\tlwsl_notice(\u0022%s: selftest %s\u005cn\u0022, __func__, ret ? \u0022FAIL\u0022 : \u0022OK\u0022);\n+\n+\treturn ret;\n+}\n+\n+int\n+test_jws(struct lws_context *context)\n+{\n+\tint n \u003d 0;\n+\n+\tn |\u003d test_jws_none(context);\n+\tn |\u003d test_jws_HS256(context);\n+\tn |\u003d test_jws_RS256(context);\n+\tn |\u003d test_jws_ES256(context);\n+\tn |\u003d test_jws_ES512(context);\n+\tn |\u003d test_jwt_RS256(context);\n+\n+\treturn n;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-jose/main.c b/minimal-examples-lowlevel/api-tests/api-test-jose/main.c\nnew file mode 100644\nindex 0000000..2d636cd\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-jose/main.c\n@@ -0,0 +1,56 @@\n+/*\n+ * lws-api-test-jose\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+int\n+test_jwk(struct lws_context *context);\n+int\n+test_jws(struct lws_context *context);\n+int\n+test_jwe(struct lws_context *context);\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint result \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS JOSE api tests\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\tinfo.options \u003d 0;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tresult |\u003d test_jwk(context);\n+\tlwsl_notice(\u0022%d\u005cn\u0022, result);\n+\tresult |\u003d test_jws(context);\n+\tlwsl_notice(\u0022%d\u005cn\u0022, result);\n+\tresult |\u003d test_jwe(context);\n+\tlwsl_notice(\u0022%d\u005cn\u0022, result);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, result ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lecp/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lecp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..b09ee02\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lecp/CMakeLists.txt\n@@ -0,0 +1,22 @@\n+project(lws-api-test-lecp C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_CBOR 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${PROJECT_NAME} main.c)\n+\tadd_test(NAME api-test-lecp COMMAND lws-api-test-lecp)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lecp/README.md b/minimal-examples-lowlevel/api-tests/api-test-lecp/README.md\nnew file mode 100644\nindex 0000000..ebe930d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lecp/README.md\n@@ -0,0 +1,56 @@\n+# lws api test lws_struct JSON\n+\n+Demonstrates how to use and performs selftests for lws_struct\n+JSON serialization and deserialization\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-lws_struct-json\n+[2019/03/30 22:09:09:2529] USER: LWS API selftest: lws_struct JSON\n+[2019/03/30 22:09:09:2625] NOTICE: main: ++++++++++++++++ test 1\n+[2019/03/30 22:09:09:2812] NOTICE: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (2)\n+[2019/03/30 22:09:09:2822] NOTICE: target.name 'target1' (target 0x543a830)\n+[2019/03/30 22:09:09:2824] NOTICE: target.name 'target2' (target 0x543a860)\n+[2019/03/30 22:09:09:2826] NOTICE: main: .... strarting serialization of test 1\n+[2019/03/30 22:09:09:2899] NOTICE: ser says 1\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022},{\u0022name\u0022:\u0022target2\u0022}]}\n+[2019/03/30 22:09:09:2929] NOTICE: main: ++++++++++++++++ test 2\n+[2019/03/30 22:09:09:2932] NOTICE: builder.hostname \u003d 'learn', timeout \u003d 0, targets (3)\n+[2019/03/30 22:09:09:2932] NOTICE: target.name 'target1' (target 0x543b060)\n+[2019/03/30 22:09:09:2933] NOTICE: target.name 'target2' (target 0x543b090)\n+[2019/03/30 22:09:09:2933] NOTICE: target.name 'target3' (target 0x543b0c0)\n+[2019/03/30 22:09:09:2934] NOTICE: main: .... strarting serialization of test 2\n+[2019/03/30 22:09:09:2935] NOTICE: ser says 1\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:0,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022},{\u0022name\u0022:\u0022target2\u0022},{\u0022name\u0022:\u0022target3\u0022}]}\n+[2019/03/30 22:09:09:2940] NOTICE: main: ++++++++++++++++ test 3\n+[2019/03/30 22:09:09:2959] NOTICE: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (2)\n+[2019/03/30 22:09:09:2960] NOTICE: target.name 'target1' (target 0x543b450)\n+[2019/03/30 22:09:09:2961] NOTICE: child 0x543b480, target.child.somename 'abc'\n+[2019/03/30 22:09:09:2961] NOTICE: target.name 'target2' (target 0x543b490)\n+[2019/03/30 22:09:09:2962] NOTICE: main: .... strarting serialization of test 3\n+[2019/03/30 22:09:09:2969] NOTICE: ser says 1\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022,\u0022child\u0022:{\u0022somename\u0022:\u0022abc\u0022}},{\u0022name\u0022:\u0022target2\u0022}]}\n+[2019/03/30 22:09:09:2970] NOTICE: main: ++++++++++++++++ test 4\n+[2019/03/30 22:09:09:2971] NOTICE: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (0)\n+[2019/03/30 22:09:09:2971] NOTICE: main: .... strarting serialization of test 4\n+[2019/03/30 22:09:09:2973] NOTICE: ser says 1\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800}\n+[2019/03/30 22:09:09:2974] NOTICE: main: ++++++++++++++++ test 5\n+[2019/03/30 22:09:09:2978] NOTICE: builder.hostname \u003d '', timeout \u003d 0, targets (0)\n+[2019/03/30 22:09:09:2979] NOTICE: main: .... strarting serialization of test 5\n+[2019/03/30 22:09:09:2980] NOTICE: ser says 1\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022\u0022,\u0022nspawn_timeout\u0022:0}\n+[2019/03/30 22:09:09:2982] USER: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lecp/main.c b/minimal-examples-lowlevel/api-tests/api-test-lecp/main.c\nnew file mode 100644\nindex 0000000..89133d7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lecp/main.c\n@@ -0,0 +1,5020 @@\n+/*\n+ * lws-api-test-lecp\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * unit tests for lecp\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+#include \u003cmath.h\u003e\n+#endif\n+\n+#define VERBOSE\n+\n+#if defined(VERBOSE)\n+static const char * const reason_names[] \u003d {\n+\t\u0022LECPCB_CONSTRUCTED\u0022,\n+\t\u0022LECPCB_DESTRUCTED\u0022,\n+\t\u0022LECPCB_START\u0022,\n+\t\u0022LECPCB_COMPLETE\u0022,\n+\t\u0022LECPCB_FAILED\u0022,\n+\t\u0022LECPCB_PAIR_NAME\u0022,\n+\t\u0022LECPCB_VAL_TRUE\u0022,\n+\t\u0022LECPCB_VAL_FALSE\u0022,\n+\t\u0022LECPCB_VAL_NULL\u0022,\n+\t\u0022LECPCB_VAL_NUM_INT\u0022,\n+\t\u0022LECPCB_VAL_RESERVED\u0022, /* float in lejp */\n+\t\u0022LECPCB_VAL_STR_START\u0022,\n+\t\u0022LECPCB_VAL_STR_CHUNK\u0022,\n+\t\u0022LECPCB_VAL_STR_END\u0022,\n+\t\u0022LECPCB_ARRAY_START\u0022,\n+\t\u0022LECPCB_ARRAY_END\u0022,\n+\t\u0022LECPCB_OBJECT_START\u0022,\n+\t\u0022LECPCB_OBJECT_END\u0022,\n+\t\u0022LECPCB_TAG_START\u0022,\n+\t\u0022LECPCB_TAG_END\u0022,\n+\t\u0022LECPCB_VAL_NUM_UINT\u0022,\n+\t\u0022LECPCB_VAL_UNDEFINED\u0022,\n+\t\u0022LECPCB_VAL_FLOAT16\u0022,\n+\t\u0022LECPCB_VAL_FLOAT32\u0022,\n+\t\u0022LECPCB_VAL_FLOAT64\u0022,\n+\t\u0022LECPCB_VAL_SIMPLE\u0022,\n+\t\u0022LECPCB_VAL_BLOB_START\u0022,\n+\t\u0022LECPCB_VAL_BLOB_CHUNK\u0022,\n+\t\u0022LECPCB_VAL_BLOB_END\u0022,\n+\t\u0022LECPCB_ARRAY_ITEM_START\u0022,\n+\t\u0022LECPCB_ARRAY_ITEM_END\u0022,\n+\t\u0022LECPCB_LITERAL_CBOR\u0022\n+};\n+#endif\n+\n+/*\n+ * Based on the official CBOR test vectors from here\n+ *\n+ * https://github.com/cbor/test-vectors/blob/master/appendix_a.json\n+ */\n+\n+static const uint8_t\n+\ttest1[]\t\t\u003d { 0x00 },\n+\ttest2[]\t\t\u003d { 0x01 },\n+\ttest3[]\t\t\u003d { 0x0a },\n+\ttest4[]\t\t\u003d { 0x17 },\n+\ttest5[]\t\t\u003d { 0x18, 0x18 },\n+\ttest6[]\t\t\u003d { 0x18, 0x19 },\n+\ttest7[]\t\t\u003d { 0x18, 0x64 },\n+\ttest8[]\t\t\u003d { 0x19, 0x03, 0xe8 },\n+\ttest9[]\t\t\u003d { 0x1a, 0x00, 0x0f, 0x42, 0x40 },\n+\ttest10[]\t\u003d { 0x1b, 0x00, 0x00, 0x00,\n+\t\t\t 0xe8, 0xd4, 0xa5, 0x10, 0x00 },\n+\ttest11[]\t\u003d { 0x1b, 0xff, 0xff, 0xff, 0xff,\n+\t\t\t 0xff, 0xff, 0xff, 0xff },\n+\ttest12[]\t\u003d { 0xc2, 0x49, 0x01, 0x00, 0x00,\n+\t\t\t 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t\t 0x00 },\n+\ttest13[]\t\u003d { 0x3b, 0xff, 0xff, 0xff, 0xff,\n+\t\t\t 0xff, 0xff, 0xff, 0xff },\n+\ttest14[]\t\u003d { 0xc3, 0x49, 0x01, 0x00, 0x00,\n+\t\t\t 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t\t 0x00 },\n+\ttest15[]\t\u003d { 0x20 },\n+\ttest16[]\t\u003d { 0x29 },\n+\ttest17[]\t\u003d { 0x38, 0x63 },\n+\ttest18[]\t\u003d { 0x39, 0x03, 0xe7 },\n+\ttest19[]\t\u003d { 0xf9, 0x00, 0x00 },\n+\ttest20[]\t\u003d { 0xf9, 0x80, 0x00 },\n+\ttest21[]\t\u003d { 0xf9, 0x3c, 0x00 },\n+\ttest22[]\t\u003d { 0xfb, 0x3f, 0xf1, 0x99, 0x99,\n+\t\t\t 0x99, 0x99, 0x99, 0x9a },\n+\ttest23[]\t\u003d { 0xf9, 0x3e, 0x00 },\n+\ttest24[]\t\u003d { 0xf9, 0x7b, 0xff },\n+\ttest25[]\t\u003d { 0xfa, 0x47, 0xc3, 0x50, 0x00 },\n+\ttest26[]\t\u003d { 0xfa, 0x7f, 0x7f, 0xff, 0xff },\n+\ttest27[]\t\u003d { 0xfb, 0x7e, 0x37, 0xe4, 0x3c,\n+\t\t\t 0x88, 0x00, 0x75, 0x9c },\n+\ttest28[]\t\u003d { 0xf9, 0x00, 0x01 },\n+\ttest29[]\t\u003d { 0xf9, 0x04, 0x00 },\n+\ttest30[]\t\u003d { 0xf9, 0xc4, 0x00 },\n+\ttest31[]\t\u003d { 0xfb, 0xc0, 0x10, 0x66, 0x66,\n+\t\t\t 0x66, 0x66, 0x66, 0x66 },\n+\ttest32[]\t\u003d { 0xf9, 0x7c, 0x00 },\n+\ttest33[]\t\u003d { 0xf9, 0x7e, 0x00 },\n+\ttest34[]\t\u003d { 0xf9, 0xfc, 0x00 },\n+\ttest35[]\t\u003d { 0xfa, 0x7f, 0x80, 0x00, 0x00 },\n+\ttest36[]\t\u003d { 0xfa, 0x7f, 0xc0, 0x00, 0x00 },\n+\ttest37[]\t\u003d { 0xfa, 0xff, 0x80, 0x00, 0x00 },\n+\ttest38[]\t\u003d { 0xfb, 0x7f, 0xf0, 0x00, 0x00,\n+\t\t\t 0x00, 0x00, 0x00, 0x00 },\n+\ttest39[]\t\u003d { 0xfb, 0x7f, 0xf8, 0x00, 0x00,\n+\t\t\t 0x00, 0x00, 0x00, 0x00 },\n+\ttest40[]\t\u003d { 0xfb, 0xff, 0xf0, 0x00, 0x00,\n+\t\t\t 0x00, 0x00, 0x00, 0x00 },\n+\ttest41[]\t\u003d { 0xf4 },\n+\ttest42[]\t\u003d { 0xf5 },\n+\ttest43[]\t\u003d { 0xf6 },\n+\ttest44[]\t\u003d { 0xf7 },\n+\ttest45[]\t\u003d { 0xf0 },\n+\ttest46[]\t\u003d { 0xf8, 0x18 },\n+\ttest47[]\t\u003d { 0xf8, 0xff },\n+\ttest48[]\t\u003d { 0xc0, 0x74, 0x32, 0x30, 0x31,\n+\t\t\t 0x33, 0x2d, 0x30, 0x33, 0x2d,\n+\t\t\t 0x32, 0x31, 0x54, 0x32, 0x30,\n+\t\t\t 0x3a, 0x30, 0x34, 0x3a, 0x30,\n+\t\t\t 0x30, 0x5a },\n+\ttest49[]\t\u003d { 0xc1, 0x1a, 0x51, 0x4b, 0x67,\n+\t\t\t 0xb0 },\n+\ttest50[]\t\u003d { 0xc1, 0xfb, 0x41, 0xd4, 0x52,\n+\t\t\t 0xd9, 0xec, 0x20, 0x00, 0x00 },\n+\ttest51[]\t\u003d { 0xd7, 0x44, 0x01, 0x02, 0x03,\n+\t\t\t 0x04 },\n+\ttest52[]\t\u003d { 0xd8, 0x18, 0x45, 0x64, 0x49,\n+\t\t\t 0x45, 0x54, 0x46 },\n+\ttest53[]\t\u003d { 0xd8, 0x20, 0x76, 0x68, 0x74,\n+\t\t\t 0x74, 0x70, 0x3a, 0x2f, 0x2f,\n+\t\t\t 0x77, 0x77, 0x77, 0x2e, 0x65,\n+\t\t\t 0x78, 0x61, 0x6d, 0x70, 0x6c,\n+\t\t\t 0x65, 0x2e, 0x63, 0x6f, 0x6d },\n+\ttest54[]\t\u003d { 0x40 },\n+\ttest55[]\t\u003d { 0x44, 0x01, 0x02, 0x03, 0x04 },\n+\ttest56[]\t\u003d { 0x60 },\n+\ttest57[]\t\u003d { 0x61, 0x61 },\n+\ttest58[]\t\u003d { 0x64, 0x49, 0x45, 0x54, 0x46 },\n+\ttest59[]\t\u003d { 0x62, 0x22, 0x5c },\n+\ttest60[]\t\u003d { 0x62, 0xc3, 0xbc },\n+\ttest61[]\t\u003d { 0x63, 0xe6, 0xb0, 0xb4 },\n+\ttest62[]\t\u003d { 0x64, 0xf0, 0x90, 0x85, 0x91 },\n+\ttest63[]\t\u003d { 0x80 },\n+\ttest64[]\t\u003d { 0x83, 0x01, 0x02, 0x03 },\n+\ttest65[]\t\u003d { 0x83, 0x01, 0x82, 0x02, 0x03,\n+\t\t\t 0x82, 0x04, 0x05 },\n+\ttest66[]\t\u003d { 0x98, 0x19, 0x01, 0x02, 0x03,\n+\t\t\t 0x04, 0x05, 0x06, 0x07, 0x08,\n+\t\t\t 0x09, 0x0a, 0x0b, 0x0c, 0x0d,\n+\t\t\t 0x0e, 0x0f, 0x10, 0x11, 0x12,\n+\t\t\t 0x13, 0x14, 0x15, 0x16, 0x17,\n+\t\t\t 0x18, 0x18, 0x18, 0x19 },\n+\ttest67[]\t\u003d { 0xa0 },\n+\ttest68[]\t\u003d { 0xa2, 0x01, 0x02, 0x03, 0x04 },\n+\ttest69[]\t\u003d { 0xa2, 0x61, 0x61, 0x01, 0x61,\n+\t\t\t 0x62, 0x82, 0x02, 0x03 },\n+\ttest70[]\t\u003d { 0x82, 0x61, 0x61, 0xa1, 0x61,\n+\t\t\t 0x62, 0x61, 0x63 },\n+\ttest71[]\t\u003d { 0xa5, 0x61, 0x61, 0x61, 0x41,\n+\t\t\t 0x61, 0x62, 0x61, 0x42, 0x61,\n+\t\t\t 0x63, 0x61, 0x43, 0x61, 0x64,\n+\t\t\t 0x61, 0x44, 0x61, 0x65, 0x61,\n+\t\t\t 0x45 },\n+\ttest72[]\t\u003d { 0x5f, 0x42, 0x01, 0x02, 0x43,\n+\t\t\t 0x03, 0x04, 0x05, 0xff },\n+\ttest73[]\t\u003d { 0x7f, 0x65, 0x73, 0x74, 0x72,\n+\t\t\t 0x65, 0x61, 0x64, 0x6d, 0x69,\n+\t\t\t 0x6e, 0x67, 0xff },\n+\ttest74[]\t\u003d { 0x9f, 0xff },\n+\ttest75[]\t\u003d { 0x9f, 0x01, 0x82, 0x02, 0x03,\n+\t\t\t 0x9f, 0x04, 0x05, 0xff, 0xff },\n+\ttest76[]\t\u003d { 0x9f, 0x01, 0x82, 0x02, 0x03,\n+\t\t\t 0x82, 0x04, 0x05, 0xff },\n+\ttest77[]\t\u003d { 0x83, 0x01, 0x82, 0x02, 0x03,\n+\t\t\t 0x9f, 0x04, 0x05, 0xff },\n+\ttest78[]\t\u003d { 0x83, 0x01, 0x9f, 0x02, 0x03,\n+\t\t\t 0xff, 0x82, 0x04, 0x05 },\n+\ttest79[]\t\u003d { 0x9f, 0x01, 0x02, 0x03, 0x04,\n+\t\t\t 0x05, 0x06, 0x07, 0x08, 0x09,\n+\t\t\t 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,\n+\t\t\t 0x0f, 0x10, 0x11, 0x12, 0x13,\n+\t\t\t 0x14, 0x15, 0x16, 0x17, 0x18,\n+\t\t\t 0x18, 0x18, 0x19, 0xff },\n+\ttest80[]\t\u003d { 0xbf, 0x61, 0x61, 0x01, 0x61,\n+\t\t\t 0x62, 0x9f, 0x02, 0x03, 0xff,\n+\t\t\t 0xff },\n+\ttest81[]\t\u003d { 0x82, 0x61, 0x61, 0xbf, 0x61,\n+\t\t\t 0x62, 0x61, 0x63, 0xff },\n+\ttest82[]\t\u003d { 0xbf, 0x63, 0x46, 0x75, 0x6e,\n+\t\t\t 0xf5, 0x63, 0x41, 0x6d, 0x74,\n+\t\t\t 0x21, 0xff },\n+\n+\t/* some random COSE examples\n+\t *\n+\t * COSE hmac-01 test vector\n+\t */\n+\n+\ttest83[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n+\t\t\t 0x01, 0x05, 0xA0, 0x54, 0x54,\n+\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n+\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x58,\n+\t\t\t 0x20, 0x2B, 0xDC, 0xC8, 0x9F,\n+\t\t\t 0x05, 0x82, 0x16, 0xB8, 0xA2,\n+\t\t\t 0x08, 0xDD, 0xC6, 0xD8, 0xB5,\n+\t\t\t 0x4A, 0xA9, 0x1F, 0x48, 0xBD,\n+\t\t\t 0x63, 0x48, 0x49, 0x86, 0x56,\n+\t\t\t 0x51, 0x05, 0xC9, 0xAD, 0x5A,\n+\t\t\t 0x66, 0x82, 0xF6, 0x81, 0x83,\n+\t\t\t 0x40, 0xA2, 0x01, 0x25, 0x04,\n+\t\t\t 0x4A, 0x6F, 0x75, 0x72, 0x2D,\n+\t\t\t 0x73, 0x65, 0x63, 0x72, 0x65,\n+\t\t\t 0x74, 0x40 },\n+\t /*\n+\t * COSE hmac-02 test vector\n+\t */\n+\ttest84[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n+\t\t\t 0x01, 0x06, 0xA0, 0x54, 0x54,\n+\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n+\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x58,\n+\t\t\t 0x30, 0xB3, 0x09, 0x7F, 0x70,\n+\t\t\t 0x00, 0x9A, 0x11, 0x50, 0x74,\n+\t\t\t 0x09, 0x59, 0x8A, 0x83, 0xE1,\n+\t\t\t 0x5B, 0xBB, 0xBF, 0x19, 0x82,\n+\t\t\t 0xDC, 0xE2, 0x8E, 0x5A, 0xB6,\n+\t\t\t 0xD5, 0xA6, 0xAF, 0xF6, 0x89,\n+\t\t\t 0x7B, 0xD2, 0x4B, 0xB8, 0xB7,\n+\t\t\t 0x47, 0x96, 0x22, 0xC9, 0x40,\n+\t\t\t 0x1B, 0x24, 0x09, 0x0D, 0x45,\n+\t\t\t 0x82, 0x06, 0xD5, 0x87, 0x81,\n+\t\t\t 0x83, 0x40, 0xA2, 0x01, 0x25,\n+\t\t\t 0x04, 0x46, 0x73, 0x65, 0x63,\n+\t\t\t 0x2D, 0x34, 0x38, 0x40 },\n+\ttest85[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n+\t\t\t 0x01, 0x07, 0xA0, 0x54, 0x54,\n+\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n+\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x58,\n+\t\t\t 0x40, 0xCD, 0x28, 0xA6, 0xB3,\n+\t\t\t 0xCF, 0xBB, 0xBF, 0x21, 0x48,\n+\t\t\t 0x51, 0xB9, 0x06, 0xE0, 0x50,\n+\t\t\t 0x05, 0x6C, 0xB4, 0x38, 0xA8,\n+\t\t\t 0xB8, 0x89, 0x05, 0xB8, 0xB7,\n+\t\t\t 0x46, 0x19, 0x77, 0x02, 0x27,\n+\t\t\t 0x11, 0xA9, 0xD8, 0xAC, 0x5D,\n+\t\t\t 0xBC, 0x54, 0xE2, 0x9A, 0x56,\n+\t\t\t 0xD9, 0x26, 0x04, 0x6B, 0x40,\n+\t\t\t 0xFC, 0x26, 0x07, 0xC2, 0x5B,\n+\t\t\t 0x34, 0x44, 0x54, 0xAA, 0x5F,\n+\t\t\t 0x68, 0xDE, 0x09, 0xA3, 0xE5,\n+\t\t\t 0x25, 0xD3, 0x86, 0x5A, 0x05,\n+\t\t\t 0x81, 0x83, 0x40, 0xA2, 0x01,\n+\t\t\t 0x25, 0x04, 0x46, 0x73, 0x65,\n+\t\t\t 0x63, 0x2D, 0x36, 0x34, 0x40 },\n+\ttest86[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n+\t\t\t 0x01, 0x05, 0xA0, 0x54, 0x54,\n+\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n+\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x58,\n+\t\t\t 0x20, 0x2B, 0xDC, 0xC8, 0x9F,\n+\t\t\t 0x05, 0x82, 0x16, 0xB8, 0xA2,\n+\t\t\t 0x08, 0xDD, 0xC6, 0xD8, 0xB5,\n+\t\t\t 0x4A, 0xA9, 0x1F, 0x48, 0xBD,\n+\t\t\t 0x63, 0x48, 0x49, 0x86, 0x56,\n+\t\t\t 0x51, 0x05, 0xC9, 0xAD, 0x5A,\n+\t\t\t 0x66, 0x82, 0xF7, 0x81, 0x83,\n+\t\t\t 0x40, 0xA2, 0x01, 0x25, 0x04,\n+\t\t\t 0x4A, 0x6F, 0x75, 0x72, 0x2D,\n+\t\t\t 0x73, 0x65, 0x63, 0x72, 0x65,\n+\t\t\t 0x74, 0x40 },\n+\ttest87[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n+\t\t\t 0x01, 0x04, 0xA0, 0x54, 0x54,\n+\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n+\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x48,\n+\t\t\t 0x6F, 0x35, 0xCA, 0xB7, 0x79,\n+\t\t\t 0xF7, 0x78, 0x33, 0x81, 0x83,\n+\t\t\t 0x40, 0xA2, 0x01, 0x25, 0x04,\n+\t\t\t 0x4A, 0x6F, 0x75, 0x72, 0x2D,\n+\t\t\t 0x73, 0x65, 0x63, 0x72, 0x65,\n+\t\t\t 0x74, 0x40\n+\n+\t\t\t /* COSE HMAX Enc 01 vector */\n+\n+\t}, test88[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n+\t\t\t 0x05, 0xA0, 0x54, 0x54, 0x68,\n+\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n+\t\t\t 0x6E, 0x74, 0x2E, 0x58, 0x20,\n+\t\t\t 0xA1, 0xA8, 0x48, 0xD3, 0x47,\n+\t\t\t 0x1F, 0x9D, 0x61, 0xEE, 0x49,\n+\t\t\t 0x01, 0x8D, 0x24, 0x4C, 0x82,\n+\t\t\t 0x47, 0x72, 0xF2, 0x23, 0xAD,\n+\t\t\t 0x4F, 0x93, 0x52, 0x93, 0xF1,\n+\t\t\t 0x78, 0x9F, 0xC3, 0xA0, 0x8D,\n+\t\t\t 0x8C, 0x58\n+\t}, test89[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n+\t\t\t 0x06, 0xA0, 0x54, 0x54, 0x68,\n+\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n+\t\t\t 0x6E, 0x74, 0x2E, 0x58, 0x30,\n+\t\t\t 0x99, 0x8D, 0x26, 0xC6, 0x45,\n+\t\t\t 0x9A, 0xAE, 0xEC, 0xF4, 0x4E,\n+\t\t\t 0xD2, 0x0C, 0xE0, 0x0C, 0x8C,\n+\t\t\t 0xCE, 0xDF, 0x0A, 0x1F, 0x3D,\n+\t\t\t 0x22, 0xA9, 0x2F, 0xC0, 0x5D,\n+\t\t\t 0xB0, 0x8C, 0x5A, 0xEB, 0x1C,\n+\t\t\t 0xB5, 0x94, 0xCA, 0xAF, 0x5A,\n+\t\t\t 0x5C, 0x5E, 0x2E, 0x9D, 0x01,\n+\t\t\t 0xCC, 0xE7, 0xE7, 0x7A, 0x93,\n+\t\t\t 0xAA, 0x8C, 0x62\n+\t}, test90[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n+\t\t\t 0x07, 0xA0, 0x54, 0x54, 0x68,\n+\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n+\t\t\t 0x6E, 0x74, 0x2E, 0x58, 0x40,\n+\t\t\t 0x4A, 0x55, 0x5B, 0xF9, 0x71,\n+\t\t\t 0xF7, 0xC1, 0x89, 0x1D, 0x9D,\n+\t\t\t 0xDF, 0x30, 0x4A, 0x1A, 0x13,\n+\t\t\t 0x2E, 0x2D, 0x6F, 0x81, 0x74,\n+\t\t\t 0x49, 0x47, 0x4D, 0x81, 0x3E,\n+\t\t\t 0x6D, 0x04, 0xD6, 0x59, 0x62,\n+\t\t\t 0xBE, 0xD8, 0xBB, 0xA7, 0x0C,\n+\t\t\t 0x17, 0xE1, 0xF5, 0x30, 0x8F,\n+\t\t\t 0xA3, 0x99, 0x62, 0x95, 0x9A,\n+\t\t\t 0x4B, 0x9B, 0x8D, 0x7D, 0xA8,\n+\t\t\t 0xE6, 0xD8, 0x49, 0xB2, 0x09,\n+\t\t\t 0xDC, 0xD3, 0xE9, 0x8C, 0xC0,\n+\t\t\t 0xF1, 0x1E, 0xDD, 0xF2\n+\n+\t}, test91[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n+\t\t\t 0x05, 0xA0, 0x54, 0x54, 0x68,\n+\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n+\t\t\t 0x6E, 0x74, 0x2E, 0x58, 0x20,\n+\t\t\t 0xA1, 0xA8, 0x48, 0xD3, 0x47,\n+\t\t\t 0x1F, 0x9D, 0x61, 0xEE, 0x49,\n+\t\t\t 0x01, 0x8D, 0x24, 0x4C, 0x82,\n+\t\t\t 0x47, 0x72, 0xF2, 0x23, 0xAD,\n+\t\t\t 0x4F, 0x93, 0x52, 0x93, 0xF1,\n+\t\t\t 0x78, 0x9F, 0xC3, 0xA0, 0x8D,\n+\t\t\t 0x8C, 0x59\n+\n+\t}, test92[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n+\t\t\t 0x04, 0xA0, 0x54, 0x54, 0x68,\n+\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n+\t\t\t 0x6E, 0x74, 0x2E, 0x48, 0x11,\n+\t\t\t 0xF9, 0xE3, 0x57, 0x97, 0x5F,\n+\t\t\t 0xB8, 0x49\n+\n+\t\t\t /*\n+\t\t\t * COSE countersign encrypt-01\n+\t\t\t */\n+\n+\t}, test93[]\t\u003d {\n+\t\t\t 0xd0, 0x83, 0x43, 0xa1, 0x01,\n+\t\t\t 0x01, 0xa2, 0x05, 0x4c, 0x02,\n+\t\t\t 0xd1, 0xf7, 0xe6, 0xf2, 0x6c,\n+\t\t\t 0x43, 0xd4, 0x86, 0x8d, 0x87,\n+\t\t\t 0xce, 0x07, 0x83, 0x43, 0xa1,\n+\t\t\t 0x01, 0x27, 0xa1, 0x04, 0x42,\n+\t\t\t 0x31, 0x31, 0x58, 0x40, 0xe1,\n+\t\t\t 0x04, 0x39, 0x15, 0x4c, 0xc7,\n+\t\t\t 0x5c, 0x7a, 0x3a, 0x53, 0x91,\n+\t\t\t 0x49, 0x1f, 0x88, 0x65, 0x1e,\n+\t\t\t 0x02, 0x92, 0xfd, 0x0f, 0xe0,\n+\t\t\t 0xe0, 0x2c, 0xf7, 0x40, 0x54,\n+\t\t\t 0x7e, 0xaf, 0x66, 0x77, 0xb4,\n+\t\t\t 0xa4, 0x04, 0x0b, 0x8e, 0xca,\n+\t\t\t 0x16, 0xdb, 0x59, 0x28, 0x81,\n+\t\t\t 0x26, 0x2f, 0x77, 0xb1, 0x4c,\n+\t\t\t 0x1a, 0x08, 0x6c, 0x02, 0x26,\n+\t\t\t 0x8b, 0x17, 0x17, 0x1c, 0xa1,\n+\t\t\t 0x6b, 0xe4, 0xb8, 0x59, 0x5f,\n+\t\t\t 0x8c, 0x0a, 0x08, 0x58, 0x24,\n+\t\t\t 0x60, 0x97, 0x3a, 0x94, 0xbb,\n+\t\t\t 0x28, 0x98, 0x00, 0x9e, 0xe5,\n+\t\t\t 0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n+\t\t\t 0xd2, 0x58, 0x67, 0x37, 0x4b,\n+\t\t\t 0x16, 0x2e, 0x2c, 0x03, 0x56,\n+\t\t\t 0x8b, 0x41, 0xf5, 0x7c, 0x3c,\n+\t\t\t 0xc1, 0x6f, 0x91, 0x66, 0x25,\n+\t\t\t 0x0a\n+\t\t\t /*\n+\t\t\t * COSE countersign encrypt-02\n+\t\t\t */\n+\t\t}, test94[]\t\u003d {\n+\t\t\t0xd0, 0x83, 0x43, 0xa1, 0x01,\n+\t\t\t0x01, 0xa2, 0x05, 0x4c, 0x02,\n+\t\t\t0xd1, 0xf7, 0xe6, 0xf2, 0x6c,\n+\t\t\t0x43, 0xd4, 0x86, 0x8d, 0x87,\n+\t\t\t0xce, 0x07, 0x82, 0x83, 0x43,\n+\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n+\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n+\t\t\t0xe1, 0x04, 0x39, 0x15, 0x4c,\n+\t\t\t0xc7, 0x5c, 0x7a, 0x3a, 0x53,\n+\t\t\t0x91, 0x49, 0x1f, 0x88, 0x65,\n+\t\t\t0x1e, 0x02, 0x92, 0xfd, 0x0f,\n+\t\t\t0xe0, 0xe0, 0x2c, 0xf7, 0x40,\n+\t\t\t0x54, 0x7e, 0xaf, 0x66, 0x77,\n+\t\t\t0xb4, 0xa4, 0x04, 0x0b, 0x8e,\n+\t\t\t0xca, 0x16, 0xdb, 0x59, 0x28,\n+\t\t\t0x81, 0x26, 0x2f, 0x77, 0xb1,\n+\t\t\t0x4c, 0x1a, 0x08, 0x6c, 0x02,\n+\t\t\t0x26, 0x8b, 0x17, 0x17, 0x1c,\n+\t\t\t0xa1, 0x6b, 0xe4, 0xb8, 0x59,\n+\t\t\t0x5f, 0x8c, 0x0a, 0x08, 0x83,\n+\t\t\t0x43, 0xa1, 0x01, 0x26, 0xa1,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0xfc, 0xa9, 0x8e, 0xca,\n+\t\t\t0xc8, 0x0b, 0x5f, 0xeb, 0x3a,\n+\t\t\t0xc7, 0xc1, 0x08, 0xb2, 0xb7,\n+\t\t\t0x91, 0x10, 0xde, 0x88, 0x86,\n+\t\t\t0x7b, 0xc0, 0x42, 0x6f, 0xc8,\n+\t\t\t0x3c, 0x53, 0xcc, 0xd6, 0x78,\n+\t\t\t0x96, 0x94, 0xed, 0xc5, 0xfe,\n+\t\t\t0xe3, 0xc4, 0x0d, 0xe8, 0xe7,\n+\t\t\t0xb4, 0x4f, 0xe8, 0xaa, 0xd3,\n+\t\t\t0x67, 0xe0, 0x95, 0xc8, 0xfc,\n+\t\t\t0x31, 0xb7, 0x9e, 0xe6, 0x66,\n+\t\t\t0xdf, 0x9c, 0xf9, 0x09, 0x06,\n+\t\t\t0xeb, 0x43, 0x75, 0x6c, 0x73,\n+\t\t\t0x58, 0x24, 0x60, 0x97, 0x3a,\n+\t\t\t0x94, 0xbb, 0x28, 0x98, 0x00,\n+\t\t\t0x9e, 0xe5, 0x2e, 0xcf, 0xd9,\n+\t\t\t0xab, 0x1d, 0xd2, 0x58, 0x67,\n+\t\t\t0x37, 0x4b, 0x16, 0x2e, 0x2c,\n+\t\t\t0x03, 0x56, 0x8b, 0x41, 0xf5,\n+\t\t\t0x7c, 0x3c, 0xc1, 0x6f, 0x91,\n+\t\t\t0x66, 0x25, 0x0a\n+\n+\t\t\t /*\n+\t\t\t * COSE countersign enveloped-01\n+\t\t\t */\n+\t}, test95[]\t\u003d {\n+\t\t\t0xd8, 0x60, 0x84, 0x43, 0xa1,\n+\t\t\t0x01, 0x01, 0xa2, 0x05, 0x4c,\n+\t\t\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t\t\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t\t\t0x87, 0xce, 0x07, 0x83, 0x43,\n+\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n+\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n+\t\t\t0x9a, 0x8e, 0xed, 0xe3, 0xb3,\n+\t\t\t0xcb, 0x83, 0x7b, 0xa0, 0x0d,\n+\t\t\t0xf0, 0x8f, 0xa2, 0x1b, 0x12,\n+\t\t\t0x8b, 0x2d, 0x6d, 0x91, 0x62,\n+\t\t\t0xa4, 0x29, 0x0a, 0x58, 0x2d,\n+\t\t\t0x9f, 0x19, 0xbd, 0x0f, 0xb5,\n+\t\t\t0x02, 0xf0, 0xf9, 0x2b, 0x9b,\n+\t\t\t0xf4, 0x53, 0xa4, 0x05, 0x40,\n+\t\t\t0x1f, 0x8b, 0x70, 0x55, 0xef,\n+\t\t\t0x4e, 0x95, 0x8d, 0xf7, 0xf4,\n+\t\t\t0xfb, 0xd7, 0xcf, 0xb4, 0xa0,\n+\t\t\t0xc9, 0x71, 0x60, 0xf9, 0x47,\n+\t\t\t0x2b, 0x0a, 0xa1, 0x04, 0x58,\n+\t\t\t0x24, 0x60, 0x97, 0x3a, 0x94,\n+\t\t\t0xbb, 0x28, 0x98, 0x00, 0x9e,\n+\t\t\t0xe5, 0x2e, 0xcf, 0xd9, 0xab,\n+\t\t\t0x1d, 0xd2, 0x58, 0x67, 0x37,\n+\t\t\t0x4b, 0x35, 0x81, 0xf2, 0xc8,\n+\t\t\t0x00, 0x39, 0x82, 0x63, 0x50,\n+\t\t\t0xb9, 0x7a, 0xe2, 0x30, 0x0e,\n+\t\t\t0x42, 0xfc, 0x81, 0x83, 0x40,\n+\t\t\t0xa2, 0x01, 0x25, 0x04, 0x4a,\n+\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n+\t\t\t0x40\n+\t}, test96[]\t\u003d {\n+\t\t\t0xd8, 0x60, 0x84, 0x43, 0xa1,\n+\t\t\t0x01, 0x01, 0xa2, 0x05, 0x4c,\n+\t\t\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t\t\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t\t\t0x87, 0xce, 0x07, 0x82, 0x83,\n+\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0x9a, 0x8e, 0xed, 0xe3,\n+\t\t\t0xb3, 0xcb, 0x83, 0x7b, 0xa0,\n+\t\t\t0x0d, 0xf0, 0x8f, 0xa2, 0x1b,\n+\t\t\t0x12, 0x8b, 0x2d, 0x6d, 0x91,\n+\t\t\t0x62, 0xa4, 0x29, 0x0a, 0x58,\n+\t\t\t0x2d, 0x9f, 0x19, 0xbd, 0x0f,\n+\t\t\t0xb5, 0x02, 0xf0, 0xf9, 0x2b,\n+\t\t\t0x9b, 0xf4, 0x53, 0xa4, 0x05,\n+\t\t\t0x40, 0x1f, 0x8b, 0x70, 0x55,\n+\t\t\t0xef, 0x4e, 0x95, 0x8d, 0xf7,\n+\t\t\t0xf4, 0xfb, 0xd7, 0xcf, 0xb4,\n+\t\t\t0xa0, 0xc9, 0x71, 0x60, 0xf9,\n+\t\t\t0x47, 0x2b, 0x0a, 0xa1, 0x04,\n+\t\t\t0x83, 0x43, 0xa1, 0x01, 0x26,\n+\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n+\t\t\t0x58, 0x40, 0x24, 0x27, 0xcb,\n+\t\t\t0x37, 0x56, 0x85, 0x0f, 0xbb,\n+\t\t\t0x79, 0x05, 0x18, 0x07, 0xc8,\n+\t\t\t0xb2, 0x3d, 0x2e, 0x6d, 0x16,\n+\t\t\t0xa3, 0x22, 0x4f, 0x99, 0x01,\n+\t\t\t0xb4, 0x73, 0x99, 0xcf, 0xc7,\n+\t\t\t0xe3, 0xfa, 0xc4, 0xcc, 0x62,\n+\t\t\t0x1d, 0xbb, 0xeb, 0x02, 0x02,\n+\t\t\t0xa6, 0xd8, 0xbb, 0x25, 0x69,\n+\t\t\t0x5c, 0x9d, 0xcc, 0x9c, 0x47,\n+\t\t\t0x49, 0x20, 0xff, 0x57, 0x60,\n+\t\t\t0x6d, 0x76, 0x4d, 0xea, 0x19,\n+\t\t\t0x2f, 0xc8, 0x67, 0x41, 0x16,\n+\t\t\t0xf2, 0x58, 0x24, 0x60, 0x97,\n+\t\t\t0x3a, 0x94, 0xbb, 0x28, 0x98,\n+\t\t\t0x00, 0x9e, 0xe5, 0x2e, 0xcf,\n+\t\t\t0xd9, 0xab, 0x1d, 0xd2, 0x58,\n+\t\t\t0x67, 0x37, 0x4b, 0x35, 0x81,\n+\t\t\t0xf2, 0xc8, 0x00, 0x39, 0x82,\n+\t\t\t0x63, 0x50, 0xb9, 0x7a, 0xe2,\n+\t\t\t0x30, 0x0e, 0x42, 0xfc, 0x81,\n+\t\t\t0x83, 0x40, 0xa2, 0x01, 0x25,\n+\t\t\t0x04, 0x4a, 0x6f, 0x75, 0x72,\n+\t\t\t0x2d, 0x73, 0x65, 0x63, 0x72,\n+\t\t\t0x65, 0x74, 0x40\n+\n+\t}, test97[]\t\u003d {\n+\t\t\t0xd8, 0x60, 0x84, 0x43, 0xa1,\n+\t\t\t0x01, 0x01, 0xa1, 0x05, 0x4c,\n+\t\t\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t\t\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t\t\t0x87, 0xce, 0x58, 0x24, 0x60,\n+\t\t\t0x97, 0x3a, 0x94, 0xbb, 0x28,\n+\t\t\t0x98, 0x00, 0x9e, 0xe5, 0x2e,\n+\t\t\t0xcf, 0xd9, 0xab, 0x1d, 0xd2,\n+\t\t\t0x58, 0x67, 0x37, 0x4b, 0x35,\n+\t\t\t0x81, 0xf2, 0xc8, 0x00, 0x39,\n+\t\t\t0x82, 0x63, 0x50, 0xb9, 0x7a,\n+\t\t\t0xe2, 0x30, 0x0e, 0x42, 0xfc,\n+\t\t\t0x81, 0x83, 0x40, 0xa3, 0x01,\n+\t\t\t0x25, 0x04, 0x4a, 0x6f, 0x75,\n+\t\t\t0x72, 0x2d, 0x73, 0x65, 0x63,\n+\t\t\t0x72, 0x65, 0x74, 0x07, 0x83,\n+\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0xcc, 0xb1, 0xf3, 0xfe,\n+\t\t\t0xdf, 0xce, 0xa7, 0x2b, 0x9c,\n+\t\t\t0x86, 0x79, 0x63, 0xe2, 0x52,\n+\t\t\t0xb6, 0x65, 0x8a, 0xd0, 0x7f,\n+\t\t\t0x3f, 0x5f, 0x15, 0xa3, 0x26,\n+\t\t\t0xa3, 0xf5, 0x72, 0x54, 0xcc,\n+\t\t\t0xb8, 0xd4, 0x8d, 0x60, 0x02,\n+\t\t\t0x1d, 0x2f, 0x1f, 0x8a, 0x80,\n+\t\t\t0x3b, 0x84, 0x4b, 0x78, 0x72,\n+\t\t\t0x16, 0x6c, 0x6d, 0x45, 0x90,\n+\t\t\t0x25, 0xd2, 0x1c, 0x8c, 0x84,\n+\t\t\t0x62, 0xa2, 0x44, 0xba, 0x19,\n+\t\t\t0x60, 0x4e, 0xc4, 0xd5, 0x0b,\n+\t\t\t0x40\n+\t}, test98[]\t\u003d {\n+\t\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n+\t\t\t0x01, 0x05, 0xa1, 0x07, 0x83,\n+\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0xb4, 0x92, 0x4b, 0x18,\n+\t\t\t0xeb, 0x4e, 0x04, 0x73, 0x13,\n+\t\t\t0xc7, 0x07, 0xb0, 0xed, 0xa4,\n+\t\t\t0xab, 0x84, 0x43, 0x45, 0xf2,\n+\t\t\t0xc4, 0x49, 0x87, 0xd6, 0xf9,\n+\t\t\t0xeb, 0xcc, 0x77, 0x7e, 0xfd,\n+\t\t\t0x40, 0x78, 0xcc, 0x0f, 0x4c,\n+\t\t\t0x10, 0x8d, 0xef, 0x95, 0x9f,\n+\t\t\t0x78, 0xf1, 0xed, 0xb2, 0x76,\n+\t\t\t0x54, 0x25, 0x78, 0x5f, 0xcd,\n+\t\t\t0x17, 0xd5, 0x12, 0xbe, 0x31,\n+\t\t\t0xee, 0xb6, 0x6b, 0xef, 0xf1,\n+\t\t\t0xe8, 0xfc, 0x27, 0x47, 0x07,\n+\t\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t\t0x2e, 0x58, 0x20, 0x2b, 0xdc,\n+\t\t\t0xc8, 0x9f, 0x05, 0x82, 0x16,\n+\t\t\t0xb8, 0xa2, 0x08, 0xdd, 0xc6,\n+\t\t\t0xd8, 0xb5, 0x4a, 0xa9, 0x1f,\n+\t\t\t0x48, 0xbd, 0x63, 0x48, 0x49,\n+\t\t\t0x86, 0x56, 0x51, 0x05, 0xc9,\n+\t\t\t0xad, 0x5a, 0x66, 0x82, 0xf6,\n+\t\t\t0x81, 0x83, 0x40, 0xa2, 0x01,\n+\t\t\t0x25, 0x04, 0x4a, 0x6f, 0x75,\n+\t\t\t0x72, 0x2d, 0x73, 0x65, 0x63,\n+\t\t\t0x72, 0x65, 0x74, 0x40\n+\t}, test99[]\t\u003d {\n+\t\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n+\t\t\t0x01, 0x05, 0xa1, 0x07, 0x82,\n+\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n+\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n+\t\t\t0x58, 0x40, 0xb4, 0x92, 0x4b,\n+\t\t\t0x18, 0xeb, 0x4e, 0x04, 0x73,\n+\t\t\t0x13, 0xc7, 0x07, 0xb0, 0xed,\n+\t\t\t0xa4, 0xab, 0x84, 0x43, 0x45,\n+\t\t\t0xf2, 0xc4, 0x49, 0x87, 0xd6,\n+\t\t\t0xf9, 0xeb, 0xcc, 0x77, 0x7e,\n+\t\t\t0xfd, 0x40, 0x78, 0xcc, 0x0f,\n+\t\t\t0x4c, 0x10, 0x8d, 0xef, 0x95,\n+\t\t\t0x9f, 0x78, 0xf1, 0xed, 0xb2,\n+\t\t\t0x76, 0x54, 0x25, 0x78, 0x5f,\n+\t\t\t0xcd, 0x17, 0xd5, 0x12, 0xbe,\n+\t\t\t0x31, 0xee, 0xb6, 0x6b, 0xef,\n+\t\t\t0xf1, 0xe8, 0xfc, 0x27, 0x47,\n+\t\t\t0x07, 0x83, 0x43, 0xa1, 0x01,\n+\t\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n+\t\t\t0x31, 0x58, 0x40, 0x6a, 0xcd,\n+\t\t\t0x94, 0xd3, 0xcc, 0xf7, 0x1d,\n+\t\t\t0x19, 0x2e, 0x85, 0x28, 0x36,\n+\t\t\t0x0b, 0xa7, 0xe3, 0x46, 0xda,\n+\t\t\t0xc4, 0x64, 0xe9, 0xed, 0xca,\n+\t\t\t0x4c, 0xfe, 0xb6, 0xce, 0xb6,\n+\t\t\t0xbd, 0xe7, 0xba, 0xec, 0x9f,\n+\t\t\t0xf2, 0x6c, 0xa6, 0xbd, 0xf7,\n+\t\t\t0x3d, 0x0b, 0xe4, 0x1e, 0x36,\n+\t\t\t0x12, 0x9d, 0xcf, 0xf7, 0x51,\n+\t\t\t0xdd, 0x2b, 0x5a, 0xd5, 0xce,\n+\t\t\t0x11, 0x6e, 0x8a, 0x96, 0x3a,\n+\t\t\t0x27, 0x38, 0xa2, 0x99, 0x47,\n+\t\t\t0x7a, 0x68, 0x54, 0x54, 0x68,\n+\t\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n+\t\t\t0x6e, 0x74, 0x2e, 0x58, 0x20,\n+\t\t\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n+\t\t\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n+\t\t\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n+\t\t\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n+\t\t\t0x48, 0x49, 0x86, 0x56, 0x51,\n+\t\t\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n+\t\t\t0x82, 0xf6, 0x81, 0x83, 0x40,\n+\t\t\t0xa2, 0x01, 0x25, 0x04, 0x4a,\n+\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n+\t\t\t0x40\n+\t}, test100[]\t\u003d {\n+\t\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n+\t\t\t0x05, 0xa1, 0x07, 0x83, 0x43,\n+\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n+\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n+\t\t\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n+\t\t\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n+\t\t\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n+\t\t\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n+\t\t\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n+\t\t\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n+\t\t\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n+\t\t\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n+\t\t\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n+\t\t\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n+\t\t\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n+\t\t\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n+\t\t\t0xfc, 0x27, 0x47, 0x07, 0x54,\n+\t\t\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t\t\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t\t\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t\t\t0x74, 0x65, 0x6e, 0x74, 0x2e,\n+\t\t\t0x58, 0x20, 0xa1, 0xa8, 0x48,\n+\t\t\t0xd3, 0x47, 0x1f, 0x9d, 0x61,\n+\t\t\t0xee, 0x49, 0x01, 0x8d, 0x24,\n+\t\t\t0x4c, 0x82, 0x47, 0x72, 0xf2,\n+\t\t\t0x23, 0xad, 0x4f, 0x93, 0x52,\n+\t\t\t0x93, 0xf1, 0x78, 0x9f, 0xc3,\n+\t\t\t0xa0, 0x8d, 0x8c, 0x58\n+\t}, test101[]\t\u003d { /* mac-02 */\n+\t\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n+\t\t\t0x01, 0x05, 0xa1, 0x07, 0x82,\n+\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n+\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n+\t\t\t0x58, 0x40, 0xb4, 0x92, 0x4b,\n+\t\t\t0x18, 0xeb, 0x4e, 0x04, 0x73,\n+\t\t\t0x13, 0xc7, 0x07, 0xb0, 0xed,\n+\t\t\t0xa4, 0xab, 0x84, 0x43, 0x45,\n+\t\t\t0xf2, 0xc4, 0x49, 0x87, 0xd6,\n+\t\t\t0xf9, 0xeb, 0xcc, 0x77, 0x7e,\n+\t\t\t0xfd, 0x40, 0x78, 0xcc, 0x0f,\n+\t\t\t0x4c, 0x10, 0x8d, 0xef, 0x95,\n+\t\t\t0x9f, 0x78, 0xf1, 0xed, 0xb2,\n+\t\t\t0x76, 0x54, 0x25, 0x78, 0x5f,\n+\t\t\t0xcd, 0x17, 0xd5, 0x12, 0xbe,\n+\t\t\t0x31, 0xee, 0xb6, 0x6b, 0xef,\n+\t\t\t0xf1, 0xe8, 0xfc, 0x27, 0x47,\n+\t\t\t0x07, 0x83, 0x43, 0xa1, 0x01,\n+\t\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n+\t\t\t0x31, 0x58, 0x40, 0x6a, 0xcd,\n+\t\t\t0x94, 0xd3, 0xcc, 0xf7, 0x1d,\n+\t\t\t0x19, 0x2e, 0x85, 0x28, 0x36,\n+\t\t\t0x0b, 0xa7, 0xe3, 0x46, 0xda,\n+\t\t\t0xc4, 0x64, 0xe9, 0xed, 0xca,\n+\t\t\t0x4c, 0xfe, 0xb6, 0xce, 0xb6,\n+\t\t\t0xbd, 0xe7, 0xba, 0xec, 0x9f,\n+\t\t\t0xf2, 0x6c, 0xa6, 0xbd, 0xf7,\n+\t\t\t0x3d, 0x0b, 0xe4, 0x1e, 0x36,\n+\t\t\t0x12, 0x9d, 0xcf, 0xf7, 0x51,\n+\t\t\t0xdd, 0x2b, 0x5a, 0xd5, 0xce,\n+\t\t\t0x11, 0x6e, 0x8a, 0x96, 0x3a,\n+\t\t\t0x27, 0x38, 0xa2, 0x99, 0x47,\n+\t\t\t0x7a, 0x68, 0x54, 0x54, 0x68,\n+\t\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n+\t\t\t0x6e, 0x74, 0x2e, 0x58, 0x20,\n+\t\t\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n+\t\t\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n+\t\t\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n+\t\t\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n+\t\t\t0x48, 0x49, 0x86, 0x56, 0x51,\n+\t\t\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n+\t\t\t0x82, 0xf6, 0x81, 0x83, 0x40,\n+\t\t\t0xa2, 0x01, 0x25, 0x04, 0x4a,\n+\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n+\t\t\t0x40\n+\t}, test102[] \u003d { /* mac0-01 */\n+\t\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n+\t\t\t0x05, 0xa1, 0x07, 0x83, 0x43,\n+\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n+\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n+\t\t\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n+\t\t\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n+\t\t\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n+\t\t\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n+\t\t\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n+\t\t\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n+\t\t\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n+\t\t\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n+\t\t\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n+\t\t\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n+\t\t\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n+\t\t\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n+\t\t\t0xfc, 0x27, 0x47, 0x07, 0x54,\n+\t\t\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t\t\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t\t\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t\t\t0x74, 0x65, 0x6e, 0x74, 0x2e,\n+\t\t\t0x58, 0x20, 0xa1, 0xa8, 0x48,\n+\t\t\t0xd3, 0x47, 0x1f, 0x9d, 0x61,\n+\t\t\t0xee, 0x49, 0x01, 0x8d, 0x24,\n+\t\t\t0x4c, 0x82, 0x47, 0x72, 0xf2,\n+\t\t\t0x23, 0xad, 0x4f, 0x93, 0x52,\n+\t\t\t0x93, 0xf1, 0x78, 0x9f, 0xc3,\n+\t\t\t0xa0, 0x8d, 0x8c, 0x58\n+\t}, test103[] \u003d { /* mac0-02 */\n+\t\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n+\t\t\t0x05, 0xa1, 0x07, 0x82, 0x83,\n+\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0xb4, 0x92, 0x4b, 0x18,\n+\t\t\t0xeb, 0x4e, 0x04, 0x73, 0x13,\n+\t\t\t0xc7, 0x07, 0xb0, 0xed, 0xa4,\n+\t\t\t0xab, 0x84, 0x43, 0x45, 0xf2,\n+\t\t\t0xc4, 0x49, 0x87, 0xd6, 0xf9,\n+\t\t\t0xeb, 0xcc, 0x77, 0x7e, 0xfd,\n+\t\t\t0x40, 0x78, 0xcc, 0x0f, 0x4c,\n+\t\t\t0x10, 0x8d, 0xef, 0x95, 0x9f,\n+\t\t\t0x78, 0xf1, 0xed, 0xb2, 0x76,\n+\t\t\t0x54, 0x25, 0x78, 0x5f, 0xcd,\n+\t\t\t0x17, 0xd5, 0x12, 0xbe, 0x31,\n+\t\t\t0xee, 0xb6, 0x6b, 0xef, 0xf1,\n+\t\t\t0xe8, 0xfc, 0x27, 0x47, 0x07,\n+\t\t\t0x83, 0x43, 0xa1, 0x01, 0x26,\n+\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n+\t\t\t0x58, 0x40, 0x6a, 0xcd, 0x94,\n+\t\t\t0xd3, 0xcc, 0xf7, 0x1d, 0x19,\n+\t\t\t0x2e, 0x85, 0x28, 0x36, 0x0b,\n+\t\t\t0xa7, 0xe3, 0x46, 0xda, 0xc4,\n+\t\t\t0x64, 0xe9, 0xed, 0xca, 0x4c,\n+\t\t\t0xfe, 0xb6, 0xce, 0xb6, 0xbd,\n+\t\t\t0xe7, 0xba, 0xec, 0x9f, 0xf2,\n+\t\t\t0x6c, 0xa6, 0xbd, 0xf7, 0x3d,\n+\t\t\t0x0b, 0xe4, 0x1e, 0x36, 0x12,\n+\t\t\t0x9d, 0xcf, 0xf7, 0x51, 0xdd,\n+\t\t\t0x2b, 0x5a, 0xd5, 0xce, 0x11,\n+\t\t\t0x6e, 0x8a, 0x96, 0x3a, 0x27,\n+\t\t\t0x38, 0xa2, 0x99, 0x47, 0x7a,\n+\t\t\t0x68, 0x54, 0x54, 0x68, 0x69,\n+\t\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n+\t\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n+\t\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n+\t\t\t0x74, 0x2e, 0x58, 0x20, 0xa1,\n+\t\t\t0xa8, 0x48, 0xd3, 0x47, 0x1f,\n+\t\t\t0x9d, 0x61, 0xee, 0x49, 0x01,\n+\t\t\t0x8d, 0x24, 0x4c, 0x82, 0x47,\n+\t\t\t0x72, 0xf2, 0x23, 0xad, 0x4f,\n+\t\t\t0x93, 0x52, 0x93, 0xf1, 0x78,\n+\t\t\t0x9f, 0xc3, 0xa0, 0x8d, 0x8c,\n+\t\t\t0x58\n+\t}, test104[] \u003d { /* signed-01 */\n+\t\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n+\t\t\t0x03, 0x00, 0xa0, 0x54, 0x54,\n+\t\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n+\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n+\t\t\t0xa2, 0x07, 0x83, 0x43, 0xa1,\n+\t\t\t0x01, 0x27, 0xa1, 0x04, 0x42,\n+\t\t\t0x31, 0x31, 0x58, 0x40, 0x8e,\n+\t\t\t0x1b, 0xe2, 0xf9, 0x45, 0x3d,\n+\t\t\t0x26, 0x48, 0x12, 0xe5, 0x90,\n+\t\t\t0x49, 0x91, 0x32, 0xbe, 0xf3,\n+\t\t\t0xfb, 0xf9, 0xee, 0x9d, 0xb2,\n+\t\t\t0x7c, 0x2c, 0x16, 0x87, 0x88,\n+\t\t\t0xe3, 0xb7, 0xeb, 0xe5, 0x06,\n+\t\t\t0xc0, 0x4f, 0xd3, 0xd1, 0x9f,\n+\t\t\t0xaa, 0x9f, 0x51, 0x23, 0x2a,\n+\t\t\t0xf5, 0xc9, 0x59, 0xe4, 0xef,\n+\t\t\t0x47, 0x92, 0x88, 0x34, 0x64,\n+\t\t\t0x7f, 0x56, 0xdf, 0xbe, 0x93,\n+\t\t\t0x91, 0x12, 0x88, 0x4d, 0x08,\n+\t\t\t0xef, 0x25, 0x05, 0x04, 0x42,\n+\t\t\t0x31, 0x31, 0x58, 0x40, 0x77,\n+\t\t\t0xf3, 0xea, 0xcd, 0x11, 0x85,\n+\t\t\t0x2c, 0x4b, 0xf9, 0xcb, 0x1d,\n+\t\t\t0x72, 0xfa, 0xbe, 0x6b, 0x26,\n+\t\t\t0xfb, 0xa1, 0xd7, 0x60, 0x92,\n+\t\t\t0xb2, 0xb5, 0xb7, 0xec, 0x83,\n+\t\t\t0xb8, 0x35, 0x57, 0x65, 0x22,\n+\t\t\t0x64, 0xe6, 0x96, 0x90, 0xdb,\n+\t\t\t0xc1, 0x17, 0x2d, 0xdc, 0x0b,\n+\t\t\t0xf8, 0x84, 0x11, 0xc0, 0xd2,\n+\t\t\t0x5a, 0x50, 0x7f, 0xdb, 0x24,\n+\t\t\t0x7a, 0x20, 0xc4, 0x0d, 0x5e,\n+\t\t\t0x24, 0x5f, 0xab, 0xd3, 0xfc,\n+\t\t\t0x9e, 0xc1, 0x06\n+\t}, test105[] \u003d { /* signed-02 */\n+\t\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n+\t\t\t0x03, 0x00, 0xa0, 0x54, 0x54,\n+\t\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n+\t\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n+\t\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n+\t\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n+\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n+\t\t\t0xa2, 0x07, 0x82, 0x83, 0x43,\n+\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n+\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n+\t\t\t0x8e, 0x1b, 0xe2, 0xf9, 0x45,\n+\t\t\t0x3d, 0x26, 0x48, 0x12, 0xe5,\n+\t\t\t0x90, 0x49, 0x91, 0x32, 0xbe,\n+\t\t\t0xf3, 0xfb, 0xf9, 0xee, 0x9d,\n+\t\t\t0xb2, 0x7c, 0x2c, 0x16, 0x87,\n+\t\t\t0x88, 0xe3, 0xb7, 0xeb, 0xe5,\n+\t\t\t0x06, 0xc0, 0x4f, 0xd3, 0xd1,\n+\t\t\t0x9f, 0xaa, 0x9f, 0x51, 0x23,\n+\t\t\t0x2a, 0xf5, 0xc9, 0x59, 0xe4,\n+\t\t\t0xef, 0x47, 0x92, 0x88, 0x34,\n+\t\t\t0x64, 0x7f, 0x56, 0xdf, 0xbe,\n+\t\t\t0x93, 0x91, 0x12, 0x88, 0x4d,\n+\t\t\t0x08, 0xef, 0x25, 0x05, 0x83,\n+\t\t\t0x43, 0xa1, 0x01, 0x26, 0xa1,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0xaf, 0x04, 0x9b, 0x80,\n+\t\t\t0xd5, 0x2c, 0x36, 0x69, 0xb2,\n+\t\t\t0x99, 0x70, 0xc1, 0x33, 0x54,\n+\t\t\t0x37, 0x54, 0xf9, 0xcc, 0x60,\n+\t\t\t0x8c, 0xe4, 0x11, 0x23, 0xae,\n+\t\t\t0x1c, 0x82, 0x7e, 0x36, 0xb3,\n+\t\t\t0x8c, 0xb8, 0x25, 0x98, 0x7f,\n+\t\t\t0x01, 0xf2, 0x2b, 0xb8, 0xab,\n+\t\t\t0x13, 0xe9, 0xc6, 0x62, 0x26,\n+\t\t\t0xee, 0x23, 0x17, 0x8f, 0xfa,\n+\t\t\t0x00, 0xa4, 0xfc, 0x22, 0x05,\n+\t\t\t0x93, 0xb6, 0xe5, 0xac, 0x38,\n+\t\t\t0x96, 0x00, 0x71, 0xc9, 0xc8,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0x77, 0xf3, 0xea, 0xcd,\n+\t\t\t0x11, 0x85, 0x2c, 0x4b, 0xf9,\n+\t\t\t0xcb, 0x1d, 0x72, 0xfa, 0xbe,\n+\t\t\t0x6b, 0x26, 0xfb, 0xa1, 0xd7,\n+\t\t\t0x60, 0x92, 0xb2, 0xb5, 0xb7,\n+\t\t\t0xec, 0x83, 0xb8, 0x35, 0x57,\n+\t\t\t0x65, 0x22, 0x64, 0xe6, 0x96,\n+\t\t\t0x90, 0xdb, 0xc1, 0x17, 0x2d,\n+\t\t\t0xdc, 0x0b, 0xf8, 0x84, 0x11,\n+\t\t\t0xc0, 0xd2, 0x5a, 0x50, 0x7f,\n+\t\t\t0xdb, 0x24, 0x7a, 0x20, 0xc4,\n+\t\t\t0x0d, 0x5e, 0x24, 0x5f, 0xab,\n+\t\t\t0xd3, 0xfc, 0x9e, 0xc1, 0x06\n+\t}, test106[] \u003d { /* signed-03 */\n+\t\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n+\t\t\t0x03, 0x00, 0xa1, 0x07, 0x83,\n+\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0xb7, 0xca, 0xcb, 0xa2,\n+\t\t\t0x85, 0xc4, 0xcd, 0x3e, 0xd2,\n+\t\t\t0xf0, 0x14, 0x6f, 0x41, 0x98,\n+\t\t\t0x86, 0x14, 0x4c, 0xa6, 0x38,\n+\t\t\t0xd0, 0x87, 0xde, 0x12, 0x3d,\n+\t\t\t0x40, 0x01, 0x67, 0x30, 0x8a,\n+\t\t\t0xce, 0xab, 0xc4, 0xb5, 0xe5,\n+\t\t\t0xc6, 0xa4, 0x0c, 0x0d, 0xe0,\n+\t\t\t0xb7, 0x11, 0x67, 0xa3, 0x91,\n+\t\t\t0x75, 0xea, 0x56, 0xc1, 0xfe,\n+\t\t\t0x96, 0xc8, 0x9e, 0x5e, 0x7d,\n+\t\t\t0x30, 0xda, 0xf2, 0x43, 0x8a,\n+\t\t\t0x45, 0x61, 0x59, 0xa2, 0x0a,\n+\t\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t\t0x2e, 0x81, 0x83, 0x43, 0xa1,\n+\t\t\t0x01, 0x27, 0xa1, 0x04, 0x42,\n+\t\t\t0x31, 0x31, 0x58, 0x40, 0x77,\n+\t\t\t0xf3, 0xea, 0xcd, 0x11, 0x85,\n+\t\t\t0x2c, 0x4b, 0xf9, 0xcb, 0x1d,\n+\t\t\t0x72, 0xfa, 0xbe, 0x6b, 0x26,\n+\t\t\t0xfb, 0xa1, 0xd7, 0x60, 0x92,\n+\t\t\t0xb2, 0xb5, 0xb7, 0xec, 0x83,\n+\t\t\t0xb8, 0x35, 0x57, 0x65, 0x22,\n+\t\t\t0x64, 0xe6, 0x96, 0x90, 0xdb,\n+\t\t\t0xc1, 0x17, 0x2d, 0xdc, 0x0b,\n+\t\t\t0xf8, 0x84, 0x11, 0xc0, 0xd2,\n+\t\t\t0x5a, 0x50, 0x7f, 0xdb, 0x24,\n+\t\t\t0x7a, 0x20, 0xc4, 0x0d, 0x5e,\n+\t\t\t0x24, 0x5f, 0xab, 0xd3, 0xfc,\n+\t\t\t0x9e, 0xc1, 0x06\n+\t}, test107[] \u003d { /* signed1-01 */\n+\t\t\t0xd2, 0x84, 0x45, 0xa2, 0x01,\n+\t\t\t0x27, 0x03, 0x00, 0xa2, 0x07,\n+\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n+\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n+\t\t\t0x58, 0x40, 0x6d, 0xae, 0xd1,\n+\t\t\t0x58, 0xaf, 0xe4, 0x03, 0x2e,\n+\t\t\t0x8d, 0xd4, 0x77, 0xd3, 0xd2,\n+\t\t\t0xb7, 0xf6, 0x67, 0xe7, 0x95,\n+\t\t\t0x7a, 0xa8, 0x30, 0x2b, 0xb5,\n+\t\t\t0xe5, 0x68, 0xb4, 0xdc, 0xbc,\n+\t\t\t0xce, 0x3c, 0xf0, 0xed, 0x5a,\n+\t\t\t0x90, 0xf8, 0x31, 0x35, 0x1c,\n+\t\t\t0x85, 0xd6, 0x15, 0x5a, 0x42,\n+\t\t\t0xa1, 0x7c, 0xa1, 0xf2, 0x5f,\n+\t\t\t0x50, 0x1c, 0xc1, 0x3f, 0x67,\n+\t\t\t0x10, 0x8a, 0xe5, 0x3b, 0xda,\n+\t\t\t0x92, 0xdb, 0x88, 0x27, 0x2e,\n+\t\t\t0x00, 0x04, 0x42, 0x31, 0x31,\n+\t\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t\t0x2e, 0x58, 0x40, 0x71, 0x42,\n+\t\t\t0xfd, 0x2f, 0xf9, 0x6d, 0x56,\n+\t\t\t0xdb, 0x85, 0xbe, 0xe9, 0x05,\n+\t\t\t0xa7, 0x6b, 0xa1, 0xd0, 0xb7,\n+\t\t\t0x32, 0x1a, 0x95, 0xc8, 0xc4,\n+\t\t\t0xd3, 0x60, 0x7c, 0x57, 0x81,\n+\t\t\t0x93, 0x2b, 0x7a, 0xfb, 0x87,\n+\t\t\t0x11, 0x49, 0x7d, 0xfa, 0x75,\n+\t\t\t0x1b, 0xf4, 0x0b, 0x58, 0xb3,\n+\t\t\t0xbc, 0xc3, 0x23, 0x00, 0xb1,\n+\t\t\t0x48, 0x7f, 0x3d, 0xb3, 0x40,\n+\t\t\t0x85, 0xee, 0xf0, 0x13, 0xbf,\n+\t\t\t0x08, 0xf4, 0xa4, 0x4d, 0x6f,\n+\t\t\t0xef, 0x0d\n+\t}, test108[] \u003d { /* signed1-02 */\n+\t\t\t0xd2, 0x84, 0x45, 0xa2, 0x01,\n+\t\t\t0x27, 0x03, 0x00, 0xa2, 0x07,\n+\t\t\t0x82, 0x83, 0x43, 0xa1, 0x01,\n+\t\t\t0x27, 0xa1, 0x04, 0x42, 0x31,\n+\t\t\t0x31, 0x58, 0x40, 0x6d, 0xae,\n+\t\t\t0xd1, 0x58, 0xaf, 0xe4, 0x03,\n+\t\t\t0x2e, 0x8d, 0xd4, 0x77, 0xd3,\n+\t\t\t0xd2, 0xb7, 0xf6, 0x67, 0xe7,\n+\t\t\t0x95, 0x7a, 0xa8, 0x30, 0x2b,\n+\t\t\t0xb5, 0xe5, 0x68, 0xb4, 0xdc,\n+\t\t\t0xbc, 0xce, 0x3c, 0xf0, 0xed,\n+\t\t\t0x5a, 0x90, 0xf8, 0x31, 0x35,\n+\t\t\t0x1c, 0x85, 0xd6, 0x15, 0x5a,\n+\t\t\t0x42, 0xa1, 0x7c, 0xa1, 0xf2,\n+\t\t\t0x5f, 0x50, 0x1c, 0xc1, 0x3f,\n+\t\t\t0x67, 0x10, 0x8a, 0xe5, 0x3b,\n+\t\t\t0xda, 0x92, 0xdb, 0x88, 0x27,\n+\t\t\t0x2e, 0x00, 0x83, 0x43, 0xa1,\n+\t\t\t0x01, 0x26, 0xa1, 0x04, 0x42,\n+\t\t\t0x31, 0x31, 0x58, 0x40, 0x93,\n+\t\t\t0x48, 0x7d, 0x09, 0x25, 0x6a,\n+\t\t\t0x3e, 0xf4, 0x96, 0x37, 0x19,\n+\t\t\t0xba, 0x5c, 0xf1, 0x01, 0xac,\n+\t\t\t0xe2, 0xfc, 0x13, 0xd6, 0x31,\n+\t\t\t0x4b, 0x49, 0x58, 0x21, 0x71,\n+\t\t\t0xff, 0xa4, 0xa1, 0x31, 0x4d,\n+\t\t\t0xc9, 0x3e, 0x4a, 0x4a, 0xdf,\n+\t\t\t0xa4, 0x2a, 0x79, 0xe3, 0x1b,\n+\t\t\t0x35, 0xd7, 0x30, 0x43, 0x58,\n+\t\t\t0x58, 0x5b, 0x41, 0x79, 0x96,\n+\t\t\t0x78, 0xce, 0x00, 0xca, 0x47,\n+\t\t\t0xc3, 0xe0, 0x23, 0x86, 0x39,\n+\t\t\t0x23, 0xf8, 0xc8, 0x04, 0x42,\n+\t\t\t0x31, 0x31, 0x54, 0x54, 0x68,\n+\t\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n+\t\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n+\t\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n+\t\t\t0x6e, 0x74, 0x2e, 0x58, 0x40,\n+\t\t\t0x71, 0x42, 0xfd, 0x2f, 0xf9,\n+\t\t\t0x6d, 0x56, 0xdb, 0x85, 0xbe,\n+\t\t\t0xe9, 0x05, 0xa7, 0x6b, 0xa1,\n+\t\t\t0xd0, 0xb7, 0x32, 0x1a, 0x95,\n+\t\t\t0xc8, 0xc4, 0xd3, 0x60, 0x7c,\n+\t\t\t0x57, 0x81, 0x93, 0x2b, 0x7a,\n+\t\t\t0xfb, 0x87, 0x11, 0x49, 0x7d,\n+\t\t\t0xfa, 0x75, 0x1b, 0xf4, 0x0b,\n+\t\t\t0x58, 0xb3, 0xbc, 0xc3, 0x23,\n+\t\t\t0x00, 0xb1, 0x48, 0x7f, 0x3d,\n+\t\t\t0xb3, 0x40, 0x85, 0xee, 0xf0,\n+\t\t\t0x13, 0xbf, 0x08, 0xf4, 0xa4,\n+\t\t\t0x4d, 0x6f, 0xef, 0x0d\n+\t};\n+;\n+\n+struct seq {\n+\tchar\t\t\treason;\n+\tstruct lecp_item\titem;\n+\tconst uint8_t\t\t*buf;\n+\tsize_t\t\t\tbuf_len;\n+};\n+\n+static const uint8_t bm12[] \u003d {\n+\t0x01, 0x00, 0x00, 0x00,\n+\t0x00, 0x00, 0x00, 0x00,\n+\t0x00\n+}, bm48[] \u003d {\n+\t0x32, 0x30, 0x31, 0x33,\n+\t0x2D, 0x30, 0x33, 0x2D,\n+\t0x32, 0x31, 0x54, 0x32,\n+\t0x30, 0x3A, 0x30, 0x34,\n+\t0x3A, 0x30, 0x30, 0x5A\n+}, bm51[] \u003d {\n+\t0x01, 0x02, 0x03, 0x04\n+}, bm52[] \u003d {\n+\t0x64, 0x49, 0x45, 0x54,\n+\t0x46\n+}, bm53[] \u003d {\n+\t0x68, 0x74, 0x74, 0x70,\n+\t0x3A, 0x2F, 0x2F, 0x77,\n+\t0x77, 0x77, 0x2E, 0x65,\n+\t0x78, 0x61, 0x6D, 0x70,\n+\t0x6C, 0x65, 0x2E, 0x63,\n+\t0x6F, 0x6D\n+}, bm57[] \u003d {\n+\t0x61\n+}, bm58[] \u003d {\n+\t0x49, 0x45, 0x54, 0x46\n+}, bm59[] \u003d {\n+\t0x22, 0x5C\n+}, bm60[] \u003d {\n+\t0xc3, 0xbc\n+}, bm61[] \u003d {\n+\t0xe6, 0xb0, 0xb4\n+}, bm62[] \u003d {\n+\t0xF0, 0x90, 0x85, 0x91\n+}, bm72a[] \u003d {\n+\t0x01, 0x02\n+}, bm72b[] \u003d {\n+\t0x03, 0x04, 0x05\n+}, bm83a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm83b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm83c[] \u003d {\n+\t0x2B, 0xDC, 0xC8, 0x9F,\n+\t0x05, 0x82, 0x16, 0xB8,\n+\t0xA2, 0x08, 0xDD, 0xC6,\n+\t0xD8, 0xB5, 0x4A, 0xA9,\n+\t0x1F, 0x48, 0xBD, 0x63,\n+\t0x48, 0x49, 0x86, 0x56,\n+\t0x51, 0x05, 0xC9, 0xAD,\n+\t0x5A, 0x66, 0x82, 0xF6\n+}, bm83d[] \u003d {\n+\t0x6F, 0x75, 0x72, 0x2D,\n+\t0x73, 0x65, 0x63, 0x72,\n+\t0x65, 0x74\n+}, bm84a[] \u003d {\n+\t0xa1, 0x01, 0x06\n+}, bm84b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm84c[] \u003d {\n+\t0xB3, 0x09, 0x7F, 0x70,\n+\t0x00, 0x9A, 0x11, 0x50,\n+\t0x74, 0x09, 0x59, 0x8A,\n+\t0x83, 0xE1, 0x5B, 0xBB,\n+\t0xBF, 0x19, 0x82, 0xDC,\n+\t0xE2, 0x8E, 0x5A, 0xB6,\n+\t0xD5, 0xA6, 0xAF, 0xF6,\n+\t0x89, 0x7B, 0xD2, 0x4B,\n+\t0xB8, 0xB7, 0x47, 0x96,\n+\t0x22, 0xC9, 0x40, 0x1B,\n+\t0x24, 0x09, 0x0D, 0x45,\n+\t0x82, 0x06, 0xD5, 0x87\n+}, bm84d[] \u003d {\n+\t0x73, 0x65, 0x63, 0x2D,\n+\t0x34, 0x38\n+}, bm85a[] \u003d {\n+\t0xa1, 0x01, 0x07\n+}, bm85b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm85c[] \u003d {\n+\t0xCD, 0x28, 0xA6, 0xB3,\n+\t0xCF, 0xBB, 0xBF, 0x21,\n+\t0x48, 0x51, 0xB9, 0x06,\n+\t0xE0, 0x50, 0x05, 0x6C,\n+\t0xB4, 0x38, 0xA8, 0xB8,\n+\t0x89, 0x05, 0xB8, 0xB7,\n+\t0x46, 0x19, 0x77, 0x02,\n+\t0x27, 0x11, 0xA9, 0xD8,\n+\t0xAC, 0x5D, 0xBC, 0x54,\n+\t0xE2, 0x9A, 0x56, 0xD9,\n+\t0x26, 0x04, 0x6B, 0x40,\n+\t0xFC, 0x26, 0x07, 0xC2,\n+\t0x5B, 0x34, 0x44, 0x54,\n+\t0xAA, 0x5F, 0x68, 0xDE,\n+\t0x09, 0xA3, 0xE5, 0x25,\n+\t0xD3, 0x86, 0x5A, 0x05\n+}, bm85d[] \u003d {\n+\t0x73, 0x65, 0x63, 0x2D,\n+\t0x36, 0x34\n+}, bm86a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm86b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm86c[] \u003d {\n+\t0x2B, 0xDC, 0xC8, 0x9F,\n+\t0x05, 0x82, 0x16, 0xB8,\n+\t0xA2, 0x08, 0xDD, 0xC6,\n+\t0xD8, 0xB5, 0x4A, 0xA9,\n+\t0x1F, 0x48, 0xBD, 0x63,\n+\t0x48, 0x49, 0x86, 0x56,\n+\t0x51, 0x05, 0xC9, 0xAD,\n+\t0x5A, 0x66, 0x82, 0xF7\n+}, bm86d[] \u003d {\n+\t0x6F, 0x75, 0x72, 0x2D,\n+\t0x73, 0x65, 0x63, 0x72,\n+\t0x65, 0x74\n+}, bm87a[] \u003d {\n+\t0xa1, 0x01, 0x04\n+}, bm87b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm87c[] \u003d {\n+\t0x6F, 0x35, 0xCA, 0xB7,\n+\t0x79, 0xF7, 0x78, 0x33\n+}, bm87d[] \u003d {\n+\t0x6F, 0x75, 0x72, 0x2D,\n+\t0x73, 0x65, 0x63, 0x72,\n+\t0x65, 0x74\n+}, bm88a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm88b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm88c[] \u003d {\n+\t0xA1, 0xA8, 0x48, 0xD3,\n+\t0x47, 0x1F, 0x9D, 0x61,\n+\t0xEE, 0x49, 0x01, 0x8D,\n+\t0x24, 0x4C, 0x82, 0x47,\n+\t0x72, 0xF2, 0x23, 0xAD,\n+\t0x4F, 0x93, 0x52, 0x93,\n+\t0xF1, 0x78, 0x9F, 0xC3,\n+\t0xA0, 0x8D, 0x8C, 0x58\n+}, bm89a[] \u003d {\n+\t0xa1, 0x01, 0x06\n+}, bm89b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm89c[] \u003d {\n+\t0x99, 0x8D, 0x26, 0xC6,\n+\t0x45, 0x9A, 0xAE, 0xEC,\n+\t0xF4, 0x4E, 0xD2, 0x0C,\n+\t0xE0, 0x0C, 0x8C, 0xCE,\n+\t0xDF, 0x0A, 0x1F, 0x3D,\n+\t0x22, 0xA9, 0x2F, 0xC0,\n+\t0x5D, 0xB0, 0x8C, 0x5A,\n+\t0xEB, 0x1C, 0xB5, 0x94,\n+\t0xCA, 0xAF, 0x5A, 0x5C,\n+\t0x5E, 0x2E, 0x9D, 0x01,\n+\t0xCC, 0xE7, 0xE7, 0x7A,\n+\t0x93, 0xAA, 0x8C, 0x62\n+}, bm90a[] \u003d {\n+\t0xa1, 0x01, 0x07\n+}, bm90b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm90c[] \u003d {\n+\t0x4A, 0x55, 0x5B, 0xF9,\n+\t0x71, 0xF7, 0xC1, 0x89,\n+\t0x1D, 0x9D, 0xDF, 0x30,\n+\t0x4A, 0x1A, 0x13, 0x2E,\n+\t0x2D, 0x6F, 0x81, 0x74,\n+\t0x49, 0x47, 0x4D, 0x81,\n+\t0x3E, 0x6D, 0x04, 0xD6,\n+\t0x59, 0x62, 0xBE, 0xD8,\n+\t0xBB, 0xA7, 0x0C, 0x17,\n+\t0xE1, 0xF5, 0x30, 0x8F,\n+\t0xA3, 0x99, 0x62, 0x95,\n+\t0x9A, 0x4B, 0x9B, 0x8D,\n+\t0x7D, 0xA8, 0xE6, 0xD8,\n+\t0x49, 0xB2, 0x09, 0xDC,\n+\t0xD3, 0xE9, 0x8C, 0xC0,\n+\t0xF1, 0x1E, 0xDD, 0xF2\n+}, bm91a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm91b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm91c[] \u003d {\n+\t0xA1, 0xA8, 0x48, 0xD3,\n+\t0x47, 0x1F, 0x9D, 0x61,\n+\t0xEE, 0x49, 0x01, 0x8D,\n+\t0x24, 0x4C, 0x82, 0x47,\n+\t0x72, 0xF2, 0x23, 0xAD,\n+\t0x4F, 0x93, 0x52, 0x93,\n+\t0xF1, 0x78, 0x9F, 0xC3,\n+\t0xA0, 0x8D, 0x8C, 0x59\n+}, bm92a[] \u003d {\n+\t0xa1, 0x01, 0x04\n+}, bm92b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73,\n+\t0x20, 0x69, 0x73, 0x20,\n+\t0x74, 0x68, 0x65, 0x20,\n+\t0x63, 0x6F, 0x6E, 0x74,\n+\t0x65, 0x6E, 0x74, 0x2E\n+}, bm92c[] \u003d {\n+\t0x11, 0xF9, 0xE3, 0x57,\n+\t0x97, 0x5F, 0xB8, 0x49\n+}, bm93a[] \u003d {\n+\t0xa1, 0x01, 0x01\n+}, bm93b[] \u003d {\n+\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t0x87, 0xce\n+}, bm93c[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm93d[] \u003d {\n+\t0x31, 0x31\n+}, bm93e[] \u003d {\n+\t0xe1, 0x04, 0x39, 0x15, 0x4c,\n+\t0xc7, 0x5c, 0x7a, 0x3a, 0x53,\n+\t0x91, 0x49, 0x1f, 0x88, 0x65,\n+\t0x1e, 0x02, 0x92, 0xfd, 0x0f,\n+\t0xe0, 0xe0, 0x2c, 0xf7, 0x40,\n+\t0x54, 0x7e, 0xaf, 0x66, 0x77,\n+\t0xb4, 0xa4, 0x04, 0x0b, 0x8e,\n+\t0xca, 0x16, 0xdb, 0x59, 0x28,\n+\t0x81, 0x26, 0x2f, 0x77, 0xb1,\n+\t0x4c, 0x1a, 0x08, 0x6c, 0x02,\n+\t0x26, 0x8b, 0x17, 0x17, 0x1c,\n+\t0xa1, 0x6b, 0xe4, 0xb8, 0x59,\n+\t0x5f, 0x8c, 0x0a, 0x08\n+}, bm93f[] \u003d {\n+\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n+\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n+\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n+\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n+\t0x16, 0x2e, 0x2c, 0x03, 0x56,\n+\t0x8b, 0x41, 0xf5, 0x7c, 0x3c,\n+\t0xc1, 0x6f, 0x91, 0x66, 0x25,\n+\t0x0a\n+\n+}, bm94a[] \u003d {\n+\t0xa1, 0x01, 0x01\n+}, bm94b[] \u003d {\n+\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t0x87, 0xce\n+}, bm94c[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm94d[] \u003d {\n+\t0x31, 0x31\n+}, bm94e[] \u003d {\n+\t0xe1, 0x04, 0x39, 0x15, 0x4c,\n+\t0xc7, 0x5c, 0x7a, 0x3a, 0x53,\n+\t0x91, 0x49, 0x1f, 0x88, 0x65,\n+\t0x1e, 0x02, 0x92, 0xfd, 0x0f,\n+\t0xe0, 0xe0, 0x2c, 0xf7, 0x40,\n+\t0x54, 0x7e, 0xaf, 0x66, 0x77,\n+\t0xb4, 0xa4, 0x04, 0x0b, 0x8e,\n+\t0xca, 0x16, 0xdb, 0x59, 0x28,\n+\t0x81, 0x26, 0x2f, 0x77, 0xb1,\n+\t0x4c, 0x1a, 0x08, 0x6c, 0x02,\n+\t0x26, 0x8b, 0x17, 0x17, 0x1c,\n+\t0xa1, 0x6b, 0xe4, 0xb8, 0x59,\n+\t0x5f, 0x8c, 0x0a, 0x08\n+}, bm94f[] \u003d {\n+\t0xa1, 0x01, 0x26\n+}, bm94g[] \u003d {\n+\t0x31, 0x31\n+}, bm94h[] \u003d {\n+\t0xfc, 0xa9, 0x8e, 0xca, 0xc8,\n+\t0x0b, 0x5f, 0xeb, 0x3a, 0xc7,\n+\t0xc1, 0x08, 0xb2, 0xb7, 0x91,\n+\t0x10, 0xde, 0x88, 0x86, 0x7b,\n+\t0xc0, 0x42, 0x6f, 0xc8, 0x3c,\n+\t0x53, 0xcc, 0xd6, 0x78, 0x96,\n+\t0x94, 0xed, 0xc5, 0xfe, 0xe3,\n+\t0xc4, 0x0d, 0xe8, 0xe7, 0xb4,\n+\t0x4f, 0xe8, 0xaa, 0xd3, 0x67,\n+\t0xe0, 0x95, 0xc8, 0xfc, 0x31,\n+\t0xb7, 0x9e, 0xe6, 0x66, 0xdf,\n+\t0x9c, 0xf9, 0x09, 0x06, 0xeb,\n+\t0x43, 0x75, 0x6c, 0x73\n+}, bm94i[] \u003d {\n+\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n+\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n+\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n+\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n+\t0x16, 0x2e, 0x2c, 0x03, 0x56,\n+\t0x8b, 0x41, 0xf5, 0x7c, 0x3c,\n+\t0xc1, 0x6f, 0x91, 0x66, 0x25,\n+\t0x0a\n+\n+}, bm95a[] \u003d {\n+\t0xa1, 0x01, 0x01\n+}, bm95b[] \u003d {\n+\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t0x87, 0xce\n+}, bm95c[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm95d[] \u003d {\n+\t0x31, 0x31\n+}, bm95e[] \u003d {\n+\t0x9a, 0x8e, 0xed, 0xe3, 0xb3,\n+\t0xcb, 0x83, 0x7b, 0xa0, 0x0d,\n+\t0xf0, 0x8f, 0xa2, 0x1b, 0x12,\n+\t0x8b, 0x2d, 0x6d, 0x91, 0x62,\n+\t0xa4, 0x29, 0x0a, 0x58, 0x2d,\n+\t0x9f, 0x19, 0xbd, 0x0f, 0xb5,\n+\t0x02, 0xf0, 0xf9, 0x2b, 0x9b,\n+\t0xf4, 0x53, 0xa4, 0x05, 0x40,\n+\t0x1f, 0x8b, 0x70, 0x55, 0xef,\n+\t0x4e, 0x95, 0x8d, 0xf7, 0xf4,\n+\t0xfb, 0xd7, 0xcf, 0xb4, 0xa0,\n+\t0xc9, 0x71, 0x60, 0xf9, 0x47,\n+\t0x2b, 0x0a, 0xa1, 0x04\n+}, bm95f[] \u003d {\n+\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n+\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n+\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n+\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n+\t0x35, 0x81, 0xf2, 0xc8, 0x00,\n+\t0x39, 0x82, 0x63, 0x50, 0xb9,\n+\t0x7a, 0xe2, 0x30, 0x0E, 0x42,\n+\t0xFC\n+}, bm95g[] \u003d {\n+\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t0x65, 0x63, 0x72, 0x65, 0x74\n+\n+}, bm96a[] \u003d {\n+\t0xa1, 0x01, 0x01\n+}, bm96b[] \u003d {\n+\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t0x87, 0xce\n+}, bm96c[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm96d[] \u003d {\n+\t0x31, 0x31\n+}, bm96e[] \u003d {\n+\t0x9a, 0x8e, 0xed, 0xe3, 0xb3,\n+\t0xcb, 0x83, 0x7b, 0xa0, 0x0d,\n+\t0xf0, 0x8f, 0xa2, 0x1b, 0x12,\n+\t0x8b, 0x2d, 0x6d, 0x91, 0x62,\n+\t0xa4, 0x29, 0x0a, 0x58, 0x2d,\n+\t0x9f, 0x19, 0xbd, 0x0f, 0xb5,\n+\t0x02, 0xf0, 0xf9, 0x2b, 0x9b,\n+\t0xf4, 0x53, 0xa4, 0x05, 0x40,\n+\t0x1f, 0x8b, 0x70, 0x55, 0xef,\n+\t0x4e, 0x95, 0x8d, 0xf7, 0xf4,\n+\t0xfb, 0xd7, 0xcf, 0xb4, 0xa0,\n+\t0xc9, 0x71, 0x60, 0xf9, 0x47,\n+\t0x2b, 0x0a, 0xa1, 0x04\n+}, bm96f[] \u003d {\n+\t0xa1, 0x01, 0x26\n+}, bm96g[] \u003d {\n+\t0x31, 0x31\n+}, bm96h[] \u003d {\n+\t0x24, 0x27, 0xcb, 0x37, 0x56,\n+\t0x85, 0x0f, 0xbb, 0x79, 0x05,\n+\t0x18, 0x07, 0xc8, 0xb2, 0x3d,\n+\t0x2e, 0x6d, 0x16, 0xa3, 0x22,\n+\t0x4f, 0x99, 0x01, 0xb4, 0x73,\n+\t0x99, 0xcf, 0xc7, 0xe3, 0xfa,\n+\t0xc4, 0xcc, 0x62, 0x1d, 0xbb,\n+\t0xeb, 0x02, 0x02, 0xa6, 0xd8,\n+\t0xbb, 0x25, 0x69, 0x5c, 0x9d,\n+\t0xcc, 0x9c, 0x47, 0x49, 0x20,\n+\t0xff, 0x57, 0x60, 0x6d, 0x76,\n+\t0x4d, 0xea, 0x19, 0x2f, 0xc8,\n+\t0x67, 0x41, 0x16, 0xf2\n+}, bm96i[] \u003d {\n+\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n+\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n+\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n+\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n+\t0x35, 0x81, 0xf2, 0xc8, 0x00,\n+\t0x39, 0x82, 0x63, 0x50, 0xb9,\n+\t0x7a, 0xe2, 0x30, 0x0e, 0x42,\n+\t0xfc\n+}, bm96j[] \u003d {\n+\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t0x65, 0x63, 0x72, 0x65, 0x74\n+\n+}, bm97a[] \u003d {\n+\t0xa1, 0x01, 0x01\n+}, bm97b[] \u003d {\n+\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n+\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n+\t0x87, 0xce\n+}, bm97c[] \u003d {\n+\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n+\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n+\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n+\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n+\t0x35, 0x81, 0xf2, 0xc8, 0x00,\n+\t0x39, 0x82, 0x63, 0x50, 0xb9,\n+\t0x7a, 0xe2, 0x30, 0x0e, 0x42,\n+\t0xfc\n+}, bm97d[] \u003d {\n+\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t0x65, 0x63, 0x72, 0x65, 0x74\n+}, bm97e[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm97f[] \u003d {\n+\t0x31, 0x31\n+}, bm97g[] \u003d {\n+\t0xcc, 0xb1, 0xf3, 0xfe, 0xdf,\n+\t0xce, 0xa7, 0x2b, 0x9c, 0x86,\n+\t0x79, 0x63, 0xe2, 0x52, 0xb6,\n+\t0x65, 0x8a, 0xd0, 0x7f, 0x3f,\n+\t0x5f, 0x15, 0xa3, 0x26, 0xa3,\n+\t0xf5, 0x72, 0x54, 0xcc, 0xb8,\n+\t0xd4, 0x8d, 0x60, 0x02, 0x1d,\n+\t0x2f, 0x1f, 0x8a, 0x80, 0x3b,\n+\t0x84, 0x4b, 0x78, 0x72, 0x16,\n+\t0x6c, 0x6d, 0x45, 0x90, 0x25,\n+\t0xd2, 0x1c, 0x8c, 0x84, 0x62,\n+\t0xa2, 0x44, 0xba, 0x19, 0x60,\n+\t0x4e, 0xc4, 0xd5, 0x0b\n+\n+}, bm98a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm98b[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm98c[] \u003d {\n+\t0x31, 0x31\n+}, bm98d[] \u003d {\n+\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n+\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n+\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n+\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n+\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n+\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n+\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n+\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n+\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n+\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n+\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n+\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n+\t0xfc, 0x27, 0x47, 0x07\n+}, bm98e[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm98f[] \u003d {\n+\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n+\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n+\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n+\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n+\t0x48, 0x49, 0x86, 0x56, 0x51,\n+\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n+\t0x82, 0xf6\n+}, bm98g[] \u003d {\n+\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t0x65, 0x63, 0x72, 0x65, 0x74\n+\n+}, bm99a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm99b[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm99c[] \u003d {\n+\t0x31, 0x31\n+}, bm99d[] \u003d {\n+\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n+\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n+\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n+\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n+\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n+\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n+\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n+\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n+\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n+\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n+\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n+\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n+\t0xfc, 0x27, 0x47, 0x07\n+}, bm99e[] \u003d {\n+\t0xa1, 0x01, 0x26\n+}, bm99f[] \u003d {\n+\t0x31, 0x31\n+}, bm99g[] \u003d {\n+\t0x6a, 0xcd, 0x94, 0xd3, 0xcc,\n+\t0xf7, 0x1d, 0x19, 0x2e, 0x85,\n+\t0x28, 0x36, 0x0b, 0xa7, 0xe3,\n+\t0x46, 0xda, 0xc4, 0x64, 0xe9,\n+\t0xed, 0xca, 0x4c, 0xfe, 0xb6,\n+\t0xce, 0xb6, 0xbd, 0xe7, 0xba,\n+\t0xec, 0x9f, 0xf2, 0x6c, 0xa6,\n+\t0xbd, 0xf7, 0x3d, 0x0b, 0xe4,\n+\t0x1e, 0x36, 0x12, 0x9d, 0xcf,\n+\t0xf7, 0x51, 0xdd, 0x2b, 0x5a,\n+\t0xd5, 0xce, 0x11, 0x6e, 0x8a,\n+\t0x96, 0x3a, 0x27, 0x38, 0xa2,\n+\t0x99, 0x47, 0x7a, 0x68\n+}, bm99h[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm99i[] \u003d {\n+\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n+\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n+\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n+\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n+\t0x48, 0x49, 0x86, 0x56, 0x51,\n+\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n+\t0x82, 0xf6\n+}, bm99j[] \u003d {\n+\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t0x65, 0x63, 0x72, 0x65, 0x74\n+\n+}, bm100a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm100b[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm100c[] \u003d {\n+\t0x31, 0x31\n+}, bm100d[] \u003d {\n+\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n+\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n+\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n+\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n+\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n+\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n+\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n+\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n+\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n+\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n+\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n+\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n+\t0xfc, 0x27, 0x47, 0x07\n+}, bm100e[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm100f[] \u003d {\n+\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n+\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n+\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n+\t0x47, 0x72, 0xf2, 0x23, 0xad,\n+\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n+\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n+\t0x8c, 0x58\n+\n+\n+}, bm101a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm101b[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm101c[] \u003d {\n+\t0x31, 0x31\n+}, bm101d[] \u003d {\n+\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n+\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n+\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n+\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n+\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n+\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n+\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n+\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n+\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n+\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n+\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n+\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n+\t0xfc, 0x27, 0x47, 0x07\n+}, bm101e[] \u003d {\n+\t0xa1, 0x01, 0x26\n+}, bm101f[] \u003d {\n+\t0x31, 0x31\n+}, bm101g[] \u003d {\n+\t0x6a, 0xcd, 0x94, 0xd3, 0xcc,\n+\t0xf7, 0x1d, 0x19, 0x2e, 0x85,\n+\t0x28, 0x36, 0x0b, 0xa7, 0xe3,\n+\t0x46, 0xda, 0xc4, 0x64, 0xe9,\n+\t0xed, 0xca, 0x4c, 0xfe, 0xb6,\n+\t0xce, 0xb6, 0xbd, 0xe7, 0xba,\n+\t0xec, 0x9f, 0xf2, 0x6c, 0xa6,\n+\t0xbd, 0xf7, 0x3d, 0x0b, 0xe4,\n+\t0x1e, 0x36, 0x12, 0x9d, 0xcf,\n+\t0xf7, 0x51, 0xdd, 0x2b, 0x5a,\n+\t0xd5, 0xce, 0x11, 0x6e, 0x8a,\n+\t0x96, 0x3a, 0x27, 0x38, 0xa2,\n+\t0x99, 0x47, 0x7a, 0x68\n+}, bm101h[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm101i[] \u003d {\n+\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n+\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n+\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n+\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n+\t0x48, 0x49, 0x86, 0x56, 0x51,\n+\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n+\t0x82, 0xf6\n+}, bm101j[] \u003d {\n+\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n+\t0x65, 0x63, 0x72, 0x65, 0x74\n+\n+}, bm102a[] \u003d { /* mac0-01 */\n+\t0xa1, 0x01, 0x05\n+}, bm102b[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm102c[] \u003d {\n+\t0x31, 0x31\n+}, bm102d[] \u003d {\n+\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n+\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n+\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n+\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n+\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n+\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n+\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n+\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n+\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n+\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n+\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n+\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n+\t0xfc, 0x27, 0x47, 0x07\n+}, bm102e[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm102f[] \u003d {\n+\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n+\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n+\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n+\t0x47, 0x72, 0xf2, 0x23, 0xad,\n+\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n+\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n+\t0x8c, 0x58\n+\n+}, bm103a[] \u003d {\n+\t0xa1, 0x01, 0x05\n+}, bm103b[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm103c[] \u003d {\n+\t0x31, 0x31\n+}, bm103d[] \u003d {\n+\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n+\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n+\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n+\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n+\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n+\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n+\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n+\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n+\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n+\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n+\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n+\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n+\t0xfc, 0x27, 0x47, 0x07\n+}, bm103e[] \u003d {\n+\t0xa1, 0x01, 0x26\n+}, bm103f[] \u003d {\n+\t0x31, 0x31\n+}, bm103g[] \u003d {\n+\t0x6a, 0xcd, 0x94, 0xd3, 0xcc,\n+\t0xf7, 0x1d, 0x19, 0x2e, 0x85,\n+\t0x28, 0x36, 0x0b, 0xa7, 0xe3,\n+\t0x46, 0xda, 0xc4, 0x64, 0xe9,\n+\t0xed, 0xca, 0x4c, 0xfe, 0xb6,\n+\t0xce, 0xb6, 0xbd, 0xe7, 0xba,\n+\t0xec, 0x9f, 0xf2, 0x6c, 0xa6,\n+\t0xbd, 0xf7, 0x3d, 0x0b, 0xe4,\n+\t0x1e, 0x36, 0x12, 0x9d, 0xcf,\n+\t0xf7, 0x51, 0xdd, 0x2b, 0x5a,\n+\t0xd5, 0xce, 0x11, 0x6e, 0x8a,\n+\t0x96, 0x3a, 0x27, 0x38, 0xa2,\n+\t0x99, 0x47, 0x7a, 0x68\n+}, bm103h[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm103i[] \u003d {\n+\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n+\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n+\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n+\t0x47, 0x72, 0xf2, 0x23, 0xad,\n+\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n+\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n+\t0x8c, 0x58\n+\n+}, bm104a[] \u003d {\n+\t0xa1, 0x03, 0x00\n+}, bm104b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm104c[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm104d[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm104e[] \u003d {\n+\t0x31, 0x31\n+}, bm104f[] \u003d {\n+\t0x8e, 0x1b, 0xe2, 0xf9, 0x45,\n+\t0x3d, 0x26, 0x48, 0x12, 0xe5,\n+\t0x90, 0x49, 0x91, 0x32, 0xbe,\n+\t0xf3, 0xfb, 0xf9, 0xee, 0x9d,\n+\t0xb2, 0x7c, 0x2c, 0x16, 0x87,\n+\t0x88, 0xe3, 0xb7, 0xeb, 0xe5,\n+\t0x06, 0xc0, 0x4f, 0xd3, 0xd1,\n+\t0x9f, 0xaa, 0x9f, 0x51, 0x23,\n+\t0x2a, 0xf5, 0xc9, 0x59, 0xe4,\n+\t0xef, 0x47, 0x92, 0x88, 0x34,\n+\t0x64, 0x7f, 0x56, 0xdf, 0xbe,\n+\t0x93, 0x91, 0x12, 0x88, 0x4d,\n+\t0x08, 0xef, 0x25, 0x05\n+}, bm104g[] \u003d {\n+\t0x31, 0x31\n+}, bm104h[] \u003d {\n+\t0x77, 0xf3, 0xea, 0xcd, 0x11,\n+\t0x85, 0x2c, 0x4b, 0xf9, 0xcb,\n+\t0x1d, 0x72, 0xfa, 0xbe, 0x6b,\n+\t0x26, 0xfb, 0xa1, 0xd7, 0x60,\n+\t0x92, 0xb2, 0xb5, 0xb7, 0xec,\n+\t0x83, 0xb8, 0x35, 0x57, 0x65,\n+\t0x22, 0x64, 0xe6, 0x96, 0x90,\n+\t0xdb, 0xc1, 0x17, 0x2d, 0xdc,\n+\t0x0b, 0xf8, 0x84, 0x11, 0xc0,\n+\t0xd2, 0x5a, 0x50, 0x7f, 0xdb,\n+\t0x24, 0x7a, 0x20, 0xc4, 0x0d,\n+\t0x5e, 0x24, 0x5f, 0xab, 0xd3,\n+\t0xfc, 0x9e, 0xc1, 0x06\n+\n+}, bm105a[] \u003d {\n+\t0xa1, 0x03, 0x00\n+}, bm105b[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm105c[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm105d[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm105e[] \u003d {\n+\t0x31, 0x31\n+}, bm105f[] \u003d {\n+\t\t0x8e, 0x1b, 0xe2, 0xf9, 0x45,\n+\t\t0x3d, 0x26, 0x48, 0x12, 0xe5,\n+\t\t0x90, 0x49, 0x91, 0x32, 0xbe,\n+\t\t0xf3, 0xfb, 0xf9, 0xee, 0x9d,\n+\t\t0xb2, 0x7c, 0x2c, 0x16, 0x87,\n+\t\t0x88, 0xe3, 0xb7, 0xeb, 0xe5,\n+\t\t0x06, 0xc0, 0x4f, 0xd3, 0xd1,\n+\t\t0x9f, 0xaa, 0x9f, 0x51, 0x23,\n+\t\t0x2a, 0xf5, 0xc9, 0x59, 0xe4,\n+\t\t0xef, 0x47, 0x92, 0x88, 0x34,\n+\t\t0x64, 0x7f, 0x56, 0xdf, 0xbe,\n+\t\t0x93, 0x91, 0x12, 0x88, 0x4d,\n+\t\t0x08, 0xef, 0x25, 0x05\n+}, bm105g[] \u003d {\n+\t0xa1, 0x01, 0x26\n+}, bm105h[] \u003d {\n+\t0x31, 0x31\n+}, bm105i[] \u003d {\n+\t\t0xaf, 0x04, 0x9b, 0x80, 0xd5,\n+\t\t0x2c, 0x36, 0x69, 0xb2, 0x99,\n+\t\t0x70, 0xc1, 0x33, 0x54, 0x37,\n+\t\t0x54, 0xf9, 0xcc, 0x60, 0x8c,\n+\t\t0xe4, 0x11, 0x23, 0xae, 0x1c,\n+\t\t0x82, 0x7e, 0x36, 0xb3, 0x8c,\n+\t\t0xb8, 0x25, 0x98, 0x7f, 0x01,\n+\t\t0xf2, 0x2b, 0xb8, 0xab, 0x13,\n+\t\t0xe9, 0xc6, 0x62, 0x26, 0xee,\n+\t\t0x23, 0x17, 0x8f, 0xfa, 0x00,\n+\t\t0xa4, 0xfc, 0x22, 0x05, 0x93,\n+\t\t0xb6, 0xe5, 0xac, 0x38, 0x96,\n+\t\t0x00, 0x71, 0xc9, 0xc8\n+}, bm105j[] \u003d {\n+\t0x31, 0x31\n+}, bm105k[] \u003d {\n+\t\t0x77, 0xf3, 0xea, 0xcd, 0x11,\n+\t\t0x85, 0x2c, 0x4b, 0xf9, 0xcb,\n+\t\t0x1d, 0x72, 0xfa, 0xbe, 0x6b,\n+\t\t0x26, 0xfb, 0xa1, 0xd7, 0x60,\n+\t\t0x92, 0xb2, 0xb5, 0xb7, 0xec,\n+\t\t0x83, 0xb8, 0x35, 0x57, 0x65,\n+\t\t0x22, 0x64, 0xe6, 0x96, 0x90,\n+\t\t0xdb, 0xc1, 0x17, 0x2d, 0xdc,\n+\t\t0x0b, 0xf8, 0x84, 0x11, 0xc0,\n+\t\t0xd2, 0x5a, 0x50, 0x7f, 0xdb,\n+\t\t0x24, 0x7a, 0x20, 0xc4, 0x0d,\n+\t\t0x5e, 0x24, 0x5f, 0xab, 0xd3,\n+\t\t0xfc, 0x9e, 0xc1, 0x06\n+\n+}, bm106a[] \u003d {\n+\t0xa1, 0x03, 0x00\n+}, bm106b[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm106c[] \u003d {\n+\t0x31, 0x31\n+}, bm106d[] \u003d {\n+\t\t0xb7, 0xca, 0xcb, 0xa2, 0x85,\n+\t\t0xc4, 0xcd, 0x3e, 0xd2, 0xf0,\n+\t\t0x14, 0x6f, 0x41, 0x98, 0x86,\n+\t\t0x14, 0x4c, 0xa6, 0x38, 0xd0,\n+\t\t0x87, 0xde, 0x12, 0x3d, 0x40,\n+\t\t0x01, 0x67, 0x30, 0x8a, 0xce,\n+\t\t0xab, 0xc4, 0xb5, 0xe5, 0xc6,\n+\t\t0xa4, 0x0c, 0x0d, 0xe0, 0xb7,\n+\t\t0x11, 0x67, 0xa3, 0x91, 0x75,\n+\t\t0xea, 0x56, 0xc1, 0xfe, 0x96,\n+\t\t0xc8, 0x9e, 0x5e, 0x7d, 0x30,\n+\t\t0xda, 0xf2, 0x43, 0x8a, 0x45,\n+\t\t0x61, 0x59, 0xa2, 0x0a\n+}, bm106e[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm106f[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm106g[] \u003d {\n+\t0x31, 0x31\n+}, bm106h[] \u003d {\n+\t\t0x77, 0xf3, 0xea, 0xcd, 0x11,\n+\t\t0x85, 0x2c, 0x4b, 0xf9, 0xcb,\n+\t\t0x1d, 0x72, 0xfa, 0xbe, 0x6b,\n+\t\t0x26, 0xfb, 0xa1, 0xd7, 0x60,\n+\t\t0x92, 0xb2, 0xb5, 0xb7, 0xec,\n+\t\t0x83, 0xb8, 0x35, 0x57, 0x65,\n+\t\t0x22, 0x64, 0xe6, 0x96, 0x90,\n+\t\t0xdb, 0xc1, 0x17, 0x2d, 0xdc,\n+\t\t0x0b, 0xf8, 0x84, 0x11, 0xc0,\n+\t\t0xd2, 0x5a, 0x50, 0x7f, 0xdb,\n+\t\t0x24, 0x7a, 0x20, 0xc4, 0x0d,\n+\t\t0x5e, 0x24, 0x5f, 0xab, 0xd3,\n+\t\t0xfc, 0x9e, 0xc1, 0x06\n+\n+}, bm107a[] \u003d {\n+\t0xa2, 0x01, 0x27, 0x03, 0x00\n+}, bm107b[] \u003d {\n+\t0xa1, 0x01, 0x27,\n+}, bm107c[] \u003d {\n+\t0x31, 0x31\n+}, bm107d[] \u003d {\n+\t0x6d, 0xae, 0xd1, 0x58, 0xaf,\n+\t0xe4, 0x03, 0x2e, 0x8d, 0xd4,\n+\t0x77, 0xd3, 0xd2, 0xb7, 0xf6,\n+\t0x67, 0xe7, 0x95, 0x7a, 0xa8,\n+\t0x30, 0x2b, 0xb5, 0xe5, 0x68,\n+\t0xb4, 0xdc, 0xbc, 0xce, 0x3c,\n+\t0xf0, 0xed, 0x5a, 0x90, 0xf8,\n+\t0x31, 0x35, 0x1c, 0x85, 0xd6,\n+\t0x15, 0x5a, 0x42, 0xa1, 0x7c,\n+\t0xa1, 0xf2, 0x5f, 0x50, 0x1c,\n+\t0xc1, 0x3f, 0x67, 0x10, 0x8a,\n+\t0xe5, 0x3b, 0xda, 0x92, 0xdb,\n+\t0x88, 0x27, 0x2e, 0x00\n+}, bm107e[] \u003d {\n+\t0x31, 0x31\n+}, bm107f[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm107g[] \u003d {\n+\t0x71, 0x42, 0xfd, 0x2f, 0xf9,\n+\t0x6d, 0x56, 0xdb, 0x85, 0xbe,\n+\t0xe9, 0x05, 0xa7, 0x6b, 0xa1,\n+\t0xd0, 0xb7, 0x32, 0x1a, 0x95,\n+\t0xc8, 0xc4, 0xd3, 0x60, 0x7c,\n+\t0x57, 0x81, 0x93, 0x2b, 0x7a,\n+\t0xfb, 0x87, 0x11, 0x49, 0x7d,\n+\t0xfa, 0x75, 0x1b, 0xf4, 0x0b,\n+\t0x58, 0xb3, 0xbc, 0xc3, 0x23,\n+\t0x00, 0xb1, 0x48, 0x7f, 0x3d,\n+\t0xb3, 0x40, 0x85, 0xee, 0xf0,\n+\t0x13, 0xbf, 0x08, 0xf4, 0xa4,\n+\t0x4d, 0x6f, 0xef, 0x0d\n+\n+}, bm108a[] \u003d {\n+\t0xa2, 0x01, 0x27, 0x03, 0x00\n+}, bm108b[] \u003d {\n+\t0xa1, 0x01, 0x27\n+}, bm108c[] \u003d {\n+\t0x31, 0x31\n+}, bm108d[] \u003d {\n+\t0x6d, 0xae, 0xd1, 0x58, 0xaf,\n+\t0xe4, 0x03, 0x2e, 0x8d, 0xd4,\n+\t0x77, 0xd3, 0xd2, 0xb7, 0xf6,\n+\t0x67, 0xe7, 0x95, 0x7a, 0xa8,\n+\t0x30, 0x2b, 0xb5, 0xe5, 0x68,\n+\t0xb4, 0xdc, 0xbc, 0xce, 0x3c,\n+\t0xf0, 0xed, 0x5a, 0x90, 0xf8,\n+\t0x31, 0x35, 0x1c, 0x85, 0xd6,\n+\t0x15, 0x5a, 0x42, 0xa1, 0x7c,\n+\t0xa1, 0xf2, 0x5f, 0x50, 0x1c,\n+\t0xc1, 0x3f, 0x67, 0x10, 0x8a,\n+\t0xe5, 0x3b, 0xda, 0x92, 0xdb,\n+\t0x88, 0x27, 0x2e, 0x00\n+}, bm108e[] \u003d {\n+\t0xa1, 0x01, 0x26\n+}, bm108f[] \u003d {\n+\t0x31, 0x31\n+}, bm108g[] \u003d {\n+\t0x93, 0x48, 0x7d, 0x09, 0x25,\n+\t0x6a, 0x3e, 0xf4, 0x96, 0x37,\n+\t0x19, 0xba, 0x5c, 0xf1, 0x01,\n+\t0xac, 0xe2, 0xfc, 0x13, 0xd6,\n+\t0x31, 0x4b, 0x49, 0x58, 0x21,\n+\t0x71, 0xff, 0xa4, 0xa1, 0x31,\n+\t0x4d, 0xc9, 0x3e, 0x4a, 0x4a,\n+\t0xdf, 0xa4, 0x2a, 0x79, 0xe3,\n+\t0x1b, 0x35, 0xd7, 0x30, 0x43,\n+\t0x58, 0x58, 0x5b, 0x41, 0x79,\n+\t0x96, 0x78, 0xce, 0x00, 0xca,\n+\t0x47, 0xc3, 0xe0, 0x23, 0x86,\n+\t0x39, 0x23, 0xf8, 0xc8\n+}, bm108h[] \u003d {\n+\t0x31, 0x31\n+}, bm108i[] \u003d {\n+\t0x54, 0x68, 0x69, 0x73, 0x20,\n+\t0x69, 0x73, 0x20, 0x74, 0x68,\n+\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n+\t0x74, 0x65, 0x6e, 0x74, 0x2e\n+}, bm108j[] \u003d {\n+\t0x71, 0x42, 0xfd, 0x2f, 0xf9,\n+\t0x6d, 0x56, 0xdb, 0x85, 0xbe,\n+\t0xe9, 0x05, 0xa7, 0x6b, 0xa1,\n+\t0xd0, 0xb7, 0x32, 0x1a, 0x95,\n+\t0xc8, 0xc4, 0xd3, 0x60, 0x7c,\n+\t0x57, 0x81, 0x93, 0x2b, 0x7a,\n+\t0xfb, 0x87, 0x11, 0x49, 0x7d,\n+\t0xfa, 0x75, 0x1b, 0xf4, 0x0b,\n+\t0x58, 0xb3, 0xbc, 0xc3, 0x23,\n+\t0x00, 0xb1, 0x48, 0x7f, 0x3d,\n+\t0xb3, 0x40, 0x85, 0xee, 0xf0,\n+\t0x13, 0xbf, 0x08, 0xf4, 0xa4,\n+\t0x4d, 0x6f, 0xef, 0x0d\n+};\n+\n+static const struct seq\n+seq1[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 0 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq2[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq3[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 10 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq4[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 23 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq5[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 24 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq6[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 25 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq7[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 100 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq8[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1000 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq9[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1000000 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq10[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1000000000000 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq11[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 18446744073709551615ull } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq12[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 0 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm12, .buf_len \u003d sizeof(bm12)},\n+\t{ .reason \u003d LECPCB_TAG_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq13[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d 0ull } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq14[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm12, .buf_len \u003d sizeof(bm12)},\n+\t{ .reason \u003d LECPCB_TAG_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq15[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -1ll } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq16[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -10ll } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq17[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -100ll } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq18[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -1000ll } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq19[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq20[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x8000 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq21[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x3c00 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq22[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.d \u003d 1.1 } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x3ff199999999999aull } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq23[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x3e00 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq24[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x7bff } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq25[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 100000.0 } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0x47c35000 } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq26[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 3.4028234663852886e+38 } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0x7f7fffff } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq27[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7e37e43c8800759cull } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq28[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x0001 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq29[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x0400 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq30[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0xc400 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq31[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0xc010666666666666ull } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq32[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x7c00 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq33[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x7e00 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq34[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0xfc00 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq35[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.u32 \u003d 0x7f800000 } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0x7f800000 } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq36[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d NAN } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0x7fc00000 } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq37[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.u32 \u003d 0xff800000 } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0xff800000 } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq38[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7ff0000000000000ull } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7ff0000000000000ull } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq39[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7ff8000000000000ull } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7ff8000000000000ull } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq40[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0xfff0000000000000ull } },\n+#else\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0xfff0000000000000ull } },\n+#endif\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq41[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_FALSE },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq42[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_TRUE },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq43[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_NULL },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq44[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_UNDEFINED },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq45[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_SIMPLE, .item \u003d { .u.u64 \u003d 16 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq46[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_FAILED }, /* example disallowed by RFC! */\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq47[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_SIMPLE, .item \u003d { .u.u64 \u003d 255 } },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq48[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 0 } },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm48, .buf_len \u003d sizeof(bm48)},\n+\t{ .reason \u003d LECPCB_TAG_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq49[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1363896240 } },\n+\t{ .reason \u003d LECPCB_TAG_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq50[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x41d452d9ec200000ull } },\n+\t{ .reason \u003d LECPCB_TAG_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq51[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 23 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm51, .buf_len \u003d sizeof(bm51)},\n+\t{ .reason \u003d LECPCB_TAG_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq52[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 24 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm52, .buf_len \u003d sizeof(bm52)},\n+\t{ .reason \u003d LECPCB_TAG_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq53[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 32 } },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm53, .buf_len \u003d sizeof(bm53)},\n+\t{ .reason \u003d LECPCB_TAG_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq54[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm53, .buf_len \u003d 0},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq55[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm51, .buf_len \u003d sizeof(bm51)},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq56[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm53, .buf_len \u003d 0},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq57[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm57, .buf_len \u003d sizeof(bm57)},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq58[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm58, .buf_len \u003d sizeof(bm58)},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq59[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm59, .buf_len \u003d sizeof(bm59)},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq60[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm60, .buf_len \u003d sizeof(bm60)},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq61[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm61, .buf_len \u003d sizeof(bm61)},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq62[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm62, .buf_len \u003d sizeof(bm62)},\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq63[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq64[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq65[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq66[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 6 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 8 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 9 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 10 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 11 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 12 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 13 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 14 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 15 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 16 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 17 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 18 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 19 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 20 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 21 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 22 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 23 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 24 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 25 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq67[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq68[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq69[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq70[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022c\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq71[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022A\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022B\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022c\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022C\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022d\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022D\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022e\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022E\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq72[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_CHUNK, .buf \u003d bm72a, .buf_len \u003d sizeof(bm72a)},\n+\t{ .reason \u003d LECPCB_VAL_BLOB_CHUNK, .buf \u003d bm72b, .buf_len \u003d sizeof(bm72b)},\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq73[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_CHUNK, .buf \u003d (const uint8_t *)\u0022stream\u0022, .buf_len \u003d 5},\n+\t{ .reason \u003d LECPCB_VAL_STR_CHUNK, .buf \u003d (const uint8_t *)\u0022ming\u0022, .buf_len \u003d 4},\n+\t{ .reason \u003d LECPCB_VAL_STR_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq74[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq75[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq76[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq77[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq78[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq79[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 6 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 8 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 9 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 10 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 11 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 12 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 13 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 14 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 15 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 16 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 17 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 18 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 19 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 20 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 21 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 22 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 23 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 24 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 25 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq80[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq81[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022c\u0022, .buf_len \u003d 1},\n+\t{ .reason \u003d LECPCB_OBJECT_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq82[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022Fun\u0022, .buf_len \u003d 3},\n+\t{ .reason \u003d LECPCB_VAL_TRUE },\n+\t{ .reason \u003d LECPCB_VAL_STR_START, },\n+\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022Amt\u0022, .buf_len \u003d 3},\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d (int64_t)-2ll } },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+\n+}, seq83[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83a, .buf_len \u003d sizeof(bm83a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83b, .buf_len \u003d sizeof(bm83b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83c, .buf_len \u003d sizeof(bm83c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83d, .buf_len \u003d sizeof(bm83d) },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+\n+}, seq84[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84a, .buf_len \u003d sizeof(bm84a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84b, .buf_len \u003d sizeof(bm84b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84c, .buf_len \u003d sizeof(bm84c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84d, .buf_len \u003d sizeof(bm84d) },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+\n+}, seq85[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85a, .buf_len \u003d sizeof(bm85a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85b, .buf_len \u003d sizeof(bm85b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85c, .buf_len \u003d sizeof(bm85c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85d, .buf_len \u003d sizeof(bm85d) },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+\n+}, seq86[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86a, .buf_len \u003d sizeof(bm86a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86b, .buf_len \u003d sizeof(bm86b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86c, .buf_len \u003d sizeof(bm86c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86d, .buf_len \u003d sizeof(bm86d) },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq87[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87a, .buf_len \u003d sizeof(bm87a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87b, .buf_len \u003d sizeof(bm87b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87c, .buf_len \u003d sizeof(bm87c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87d, .buf_len \u003d sizeof(bm87d) },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87a, .buf_len \u003d 0 },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq88[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm88a, .buf_len \u003d sizeof(bm88a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm88b, .buf_len \u003d sizeof(bm88b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm88c, .buf_len \u003d sizeof(bm88c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq89[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm89a, .buf_len \u003d sizeof(bm89a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm89b, .buf_len \u003d sizeof(bm89b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm89c, .buf_len \u003d sizeof(bm89c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq90[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm90a, .buf_len \u003d sizeof(bm90a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm90b, .buf_len \u003d sizeof(bm90b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm90c, .buf_len \u003d sizeof(bm90c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq91[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm91a, .buf_len \u003d sizeof(bm91a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm91b, .buf_len \u003d sizeof(bm91b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm91c, .buf_len \u003d sizeof(bm91c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq92[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm92a, .buf_len \u003d sizeof(bm92a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm92b, .buf_len \u003d sizeof(bm92b) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm92c, .buf_len \u003d sizeof(bm92c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq93[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 16 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93a, .buf_len \u003d sizeof(bm93a) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93b, .buf_len \u003d sizeof(bm93b) },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t{ .reason \u003d LECPCB_ARRAY_START, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93c, .buf_len \u003d sizeof(bm93c) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_OBJECT_START, },\n+\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93d, .buf_len \u003d sizeof(bm93d) },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93e, .buf_len \u003d sizeof(bm93e) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_OBJECT_END },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93f, .buf_len \u003d sizeof(bm93f) },\n+\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t{ .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq94[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 16 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94a, .buf_len \u003d sizeof(bm94a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94b, .buf_len \u003d sizeof(bm94b) },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94c, .buf_len \u003d sizeof(bm94c) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94d, .buf_len \u003d sizeof(bm94d) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94e, .buf_len \u003d sizeof(bm94e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94f, .buf_len \u003d sizeof(bm94f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94g, .buf_len \u003d sizeof(bm94g) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94h, .buf_len \u003d sizeof(bm94h) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94i, .buf_len \u003d sizeof(bm94i) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq95[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 96 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95a, .buf_len \u003d sizeof(bm95a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95b, .buf_len \u003d sizeof(bm95b) },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95c, .buf_len \u003d sizeof(bm95c) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95d, .buf_len \u003d sizeof(bm95d) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95e, .buf_len \u003d sizeof(bm95e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95f, .buf_len \u003d sizeof(bm95f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95f, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95g, .buf_len \u003d sizeof(bm95g) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95f, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq96[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 96 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96a, .buf_len \u003d sizeof(bm96a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96b, .buf_len \u003d sizeof(bm96b) },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96c, .buf_len \u003d sizeof(bm96c) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96d, .buf_len \u003d sizeof(bm96d) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96e, .buf_len \u003d sizeof(bm96e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96f, .buf_len \u003d sizeof(bm96f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96g, .buf_len \u003d sizeof(bm96g) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96h, .buf_len \u003d sizeof(bm96h) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96i, .buf_len \u003d sizeof(bm96i) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96f, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96j, .buf_len \u003d sizeof(bm96j) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96f, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq97[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 96 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97a, .buf_len \u003d sizeof(bm97a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97b, .buf_len \u003d sizeof(bm97b) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97c, .buf_len \u003d sizeof(bm97c) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97f, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97d, .buf_len \u003d sizeof(bm97d) },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97e, .buf_len \u003d sizeof(bm97e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97f, .buf_len \u003d sizeof(bm97f) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97g, .buf_len \u003d sizeof(bm97g) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+ { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97e, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq98[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98a, .buf_len \u003d sizeof(bm98a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98b, .buf_len \u003d sizeof(bm98b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98c, .buf_len \u003d sizeof(bm98c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98d, .buf_len \u003d sizeof(bm98d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98e, .buf_len \u003d sizeof(bm98e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98f, .buf_len \u003d sizeof(bm98f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98e, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98g, .buf_len \u003d sizeof(bm98g) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98e, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+\n+}, seq99[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99a, .buf_len \u003d sizeof(bm99a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99b, .buf_len \u003d sizeof(bm99b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99c, .buf_len \u003d sizeof(bm99c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99d, .buf_len \u003d sizeof(bm99d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99e, .buf_len \u003d sizeof(bm99e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99f, .buf_len \u003d sizeof(bm99f) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99g, .buf_len \u003d sizeof(bm99g) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99h, .buf_len \u003d sizeof(bm99h) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99i, .buf_len \u003d sizeof(bm99i) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99a, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99j, .buf_len \u003d sizeof(bm99j) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98e, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+\n+}, seq100[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100a, .buf_len \u003d sizeof(bm100a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100b, .buf_len \u003d sizeof(bm100b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100c, .buf_len \u003d sizeof(bm100c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100d, .buf_len \u003d sizeof(bm100d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100e, .buf_len \u003d sizeof(bm100e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100f, .buf_len \u003d sizeof(bm100f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+\n+}, seq101[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101a, .buf_len \u003d sizeof(bm101a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101b, .buf_len \u003d sizeof(bm101b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101c, .buf_len \u003d sizeof(bm101c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101d, .buf_len \u003d sizeof(bm101d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101e, .buf_len \u003d sizeof(bm101e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101f, .buf_len \u003d sizeof(bm101f) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101g, .buf_len \u003d sizeof(bm101g) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101h, .buf_len \u003d sizeof(bm101h) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101i, .buf_len \u003d sizeof(bm101i) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101j, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101j, .buf_len \u003d sizeof(bm101j) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101j, .buf_len \u003d 0 },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq102[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102a, .buf_len \u003d sizeof(bm102a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102b, .buf_len \u003d sizeof(bm102b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102c, .buf_len \u003d sizeof(bm102c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102d, .buf_len \u003d sizeof(bm102d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102e, .buf_len \u003d sizeof(bm102e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102f, .buf_len \u003d sizeof(bm102f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq103[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103a, .buf_len \u003d sizeof(bm103a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103b, .buf_len \u003d sizeof(bm103b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103c, .buf_len \u003d sizeof(bm103c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103d, .buf_len \u003d sizeof(bm103d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103e, .buf_len \u003d sizeof(bm103e) },\n+\t\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t\t\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t\t\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103f, .buf_len \u003d sizeof(bm103f) },\n+\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103g, .buf_len \u003d sizeof(bm103g) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103h, .buf_len \u003d sizeof(bm103h) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103i, .buf_len \u003d sizeof(bm103i) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+\n+}, seq104[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 98 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104a, .buf_len \u003d sizeof(bm104a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104b, .buf_len \u003d sizeof(bm104b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104c, .buf_len \u003d sizeof(bm104c) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104d, .buf_len \u003d sizeof(bm104d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104e, .buf_len \u003d sizeof(bm104e) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104f, .buf_len \u003d sizeof(bm104f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104g, .buf_len \u003d sizeof(bm104g) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104h, .buf_len \u003d sizeof(bm104h) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq105[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 98 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105a, .buf_len \u003d sizeof(bm105a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_OBJECT_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105b, .buf_len \u003d sizeof(bm105b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105c, .buf_len \u003d sizeof(bm105c) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105d, .buf_len \u003d sizeof(bm105d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105e, .buf_len \u003d sizeof(bm105e) },\n+\t { .reason \u003d LECPCB_OBJECT_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105f, .buf_len \u003d sizeof(bm105f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105g, .buf_len \u003d sizeof(bm105g) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105h, .buf_len \u003d sizeof(bm105h) },\n+\t { .reason \u003d LECPCB_OBJECT_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105i, .buf_len \u003d sizeof(bm105i) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105j, .buf_len \u003d sizeof(bm105j) },\n+\t { .reason \u003d LECPCB_OBJECT_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105k, .buf_len \u003d sizeof(bm105k) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq106[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 98 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106a, .buf_len \u003d sizeof(bm106a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106b, .buf_len \u003d sizeof(bm106b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106c, .buf_len \u003d sizeof(bm106c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106d, .buf_len \u003d sizeof(bm106d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106e, .buf_len \u003d sizeof(bm106e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106f, .buf_len \u003d sizeof(bm106f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106g, .buf_len \u003d sizeof(bm106g) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106h, .buf_len \u003d sizeof(bm106h) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq107[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107a, .buf_len \u003d sizeof(bm107a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107b, .buf_len \u003d sizeof(bm107b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107c, .buf_len \u003d sizeof(bm107c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107d, .buf_len \u003d sizeof(bm107d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107e, .buf_len \u003d sizeof(bm107e) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107f, .buf_len \u003d sizeof(bm107f) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107g, .buf_len \u003d sizeof(bm107g) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+}, seq108[] \u003d {\n+\t{ .reason \u003d LECPCB_CONSTRUCTED },\n+\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 18 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108a, .buf_len \u003d sizeof(bm108a) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108b, .buf_len \u003d sizeof(bm108b) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108c, .buf_len \u003d sizeof(bm108c) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108d, .buf_len \u003d sizeof(bm108d) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_ARRAY_START, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108e, .buf_len \u003d sizeof(bm108e) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_OBJECT_START, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108f, .buf_len \u003d sizeof(bm108f) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108g, .buf_len \u003d sizeof(bm108g) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108h, .buf_len \u003d sizeof(bm108h) },\n+\t { .reason \u003d LECPCB_OBJECT_END },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108i, .buf_len \u003d sizeof(bm108i) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n+\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108j, .buf_len \u003d sizeof(bm108j) },\n+\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n+\t { .reason \u003d LECPCB_ARRAY_END, },\n+\t{ .reason \u003d LECPCB_TAG_END, },\n+\t{ .reason \u003d LECPCB_DESTRUCTED },\n+};\n+\n+\n+struct cbort {\n+\tconst uint8_t\t\t*b;\n+\tsize_t\t\t\tblen;\n+\tconst struct seq\t*seq;\n+\tsize_t\t\t\tseq_size;\n+};\n+\n+static const struct cbort cbor_tests[] \u003d {\n+\t{ .b \u003d test1, .blen \u003d sizeof(test1),\n+\t\t\t.seq \u003d seq1, .seq_size \u003d LWS_ARRAY_SIZE(seq1) },\n+\t{ .b \u003d test2, .blen \u003d sizeof(test2),\n+\t\t\t.seq \u003d seq2, .seq_size \u003d LWS_ARRAY_SIZE(seq2) },\n+\t{ .b \u003d test3, .blen \u003d sizeof(test3),\n+\t\t\t.seq \u003d seq3, .seq_size \u003d LWS_ARRAY_SIZE(seq3) },\n+\t{ .b \u003d test4, .blen \u003d sizeof(test4),\n+\t\t\t.seq \u003d seq4, .seq_size \u003d LWS_ARRAY_SIZE(seq4) },\n+\t{ .b \u003d test5, .blen \u003d sizeof(test5),\n+\t\t\t.seq \u003d seq5, .seq_size \u003d LWS_ARRAY_SIZE(seq5) },\n+\t{ .b \u003d test6, .blen \u003d sizeof(test6),\n+\t\t\t.seq \u003d seq6, .seq_size \u003d LWS_ARRAY_SIZE(seq6) },\n+\t{ .b \u003d test7, .blen \u003d sizeof(test7),\n+\t\t\t.seq \u003d seq7, .seq_size \u003d LWS_ARRAY_SIZE(seq7) },\n+\t{ .b \u003d test8, .blen \u003d sizeof(test8),\n+\t\t\t.seq \u003d seq8, .seq_size \u003d LWS_ARRAY_SIZE(seq8) },\n+\t{ .b \u003d test9, .blen \u003d sizeof(test9),\n+\t\t\t.seq \u003d seq9, .seq_size \u003d LWS_ARRAY_SIZE(seq9) },\n+\t{ .b \u003d test10, .blen \u003d sizeof(test10),\n+\t\t\t.seq \u003d seq10, .seq_size \u003d LWS_ARRAY_SIZE(seq10) },\n+\t{ .b \u003d test11, .blen \u003d sizeof(test11),\n+\t\t\t.seq \u003d seq11, .seq_size \u003d LWS_ARRAY_SIZE(seq11) },\n+\t{ .b \u003d test12, .blen \u003d sizeof(test12),\n+\t\t\t.seq \u003d seq12, .seq_size \u003d LWS_ARRAY_SIZE(seq12) },\n+\t{ .b \u003d test13, .blen \u003d sizeof(test13),\n+\t\t\t.seq \u003d seq13, .seq_size \u003d LWS_ARRAY_SIZE(seq13) },\n+\t{ .b \u003d test14, .blen \u003d sizeof(test14),\n+\t\t\t.seq \u003d seq14, .seq_size \u003d LWS_ARRAY_SIZE(seq14) },\n+\t{ .b \u003d test15, .blen \u003d sizeof(test15),\n+\t\t\t.seq \u003d seq15, .seq_size \u003d LWS_ARRAY_SIZE(seq15) },\n+\t{ .b \u003d test16, .blen \u003d sizeof(test16),\n+\t\t\t.seq \u003d seq16, .seq_size \u003d LWS_ARRAY_SIZE(seq16) },\n+\t{ .b \u003d test17, .blen \u003d sizeof(test17),\n+\t\t\t.seq \u003d seq17, .seq_size \u003d LWS_ARRAY_SIZE(seq17) },\n+\t{ .b \u003d test18, .blen \u003d sizeof(test18),\n+\t\t\t.seq \u003d seq18, .seq_size \u003d LWS_ARRAY_SIZE(seq18) },\n+\t{ .b \u003d test19, .blen \u003d sizeof(test19),\n+\t\t\t.seq \u003d seq19, .seq_size \u003d LWS_ARRAY_SIZE(seq19) },\n+\t{ .b \u003d test20, .blen \u003d sizeof(test20),\n+\t\t\t.seq \u003d seq20, .seq_size \u003d LWS_ARRAY_SIZE(seq20) },\n+\t{ .b \u003d test21, .blen \u003d sizeof(test21),\n+\t\t\t.seq \u003d seq21, .seq_size \u003d LWS_ARRAY_SIZE(seq21) },\n+\t{ .b \u003d test22, .blen \u003d sizeof(test22),\n+\t\t\t.seq \u003d seq22, .seq_size \u003d LWS_ARRAY_SIZE(seq22) },\n+\t{ .b \u003d test23, .blen \u003d sizeof(test23),\n+\t\t\t.seq \u003d seq23, .seq_size \u003d LWS_ARRAY_SIZE(seq23) },\n+\t{ .b \u003d test24, .blen \u003d sizeof(test24),\n+\t\t\t.seq \u003d seq24, .seq_size \u003d LWS_ARRAY_SIZE(seq24) },\n+\t{ .b \u003d test25, .blen \u003d sizeof(test25),\n+\t\t\t.seq \u003d seq25, .seq_size \u003d LWS_ARRAY_SIZE(seq25) },\n+\t{ .b \u003d test26, .blen \u003d sizeof(test26),\n+\t\t\t.seq \u003d seq26, .seq_size \u003d LWS_ARRAY_SIZE(seq26) },\n+\t{ .b \u003d test27, .blen \u003d sizeof(test27),\n+\t\t\t.seq \u003d seq27, .seq_size \u003d LWS_ARRAY_SIZE(seq27) },\n+\t{ .b \u003d test28, .blen \u003d sizeof(test28),\n+\t\t\t.seq \u003d seq28, .seq_size \u003d LWS_ARRAY_SIZE(seq28) },\n+\t{ .b \u003d test29, .blen \u003d sizeof(test29),\n+\t\t\t.seq \u003d seq29, .seq_size \u003d LWS_ARRAY_SIZE(seq29) },\n+\t{ .b \u003d test30, .blen \u003d sizeof(test30),\n+\t\t\t.seq \u003d seq30, .seq_size \u003d LWS_ARRAY_SIZE(seq30) },\n+\t{ .b \u003d test31, .blen \u003d sizeof(test31),\n+\t\t\t.seq \u003d seq31, .seq_size \u003d LWS_ARRAY_SIZE(seq31) },\n+\t{ .b \u003d test32, .blen \u003d sizeof(test32),\n+\t\t\t.seq \u003d seq32, .seq_size \u003d LWS_ARRAY_SIZE(seq32) },\n+\t{ .b \u003d test33, .blen \u003d sizeof(test33),\n+\t\t\t.seq \u003d seq33, .seq_size \u003d LWS_ARRAY_SIZE(seq33) },\n+\t{ .b \u003d test34, .blen \u003d sizeof(test34),\n+\t\t\t.seq \u003d seq34, .seq_size \u003d LWS_ARRAY_SIZE(seq34) },\n+\t{ .b \u003d test35, .blen \u003d sizeof(test35),\n+\t\t\t.seq \u003d seq35, .seq_size \u003d LWS_ARRAY_SIZE(seq35) },\n+\t{ .b \u003d test36, .blen \u003d sizeof(test36),\n+\t\t\t.seq \u003d seq36, .seq_size \u003d LWS_ARRAY_SIZE(seq36) },\n+\t{ .b \u003d test37, .blen \u003d sizeof(test37),\n+\t\t\t.seq \u003d seq37, .seq_size \u003d LWS_ARRAY_SIZE(seq37) },\n+\t{ .b \u003d test38, .blen \u003d sizeof(test38),\n+\t\t\t.seq \u003d seq38, .seq_size \u003d LWS_ARRAY_SIZE(seq38) },\n+\t{ .b \u003d test39, .blen \u003d sizeof(test39),\n+\t\t\t.seq \u003d seq39, .seq_size \u003d LWS_ARRAY_SIZE(seq39) },\n+\t{ .b \u003d test40, .blen \u003d sizeof(test40),\n+\t\t\t.seq \u003d seq40, .seq_size \u003d LWS_ARRAY_SIZE(seq40) },\n+\t{ .b \u003d test41, .blen \u003d sizeof(test41),\n+\t\t\t.seq \u003d seq41, .seq_size \u003d LWS_ARRAY_SIZE(seq41) },\n+\t{ .b \u003d test42, .blen \u003d sizeof(test42),\n+\t\t\t.seq \u003d seq42, .seq_size \u003d LWS_ARRAY_SIZE(seq42) },\n+\t{ .b \u003d test43, .blen \u003d sizeof(test43),\n+\t\t\t.seq \u003d seq43, .seq_size \u003d LWS_ARRAY_SIZE(seq43) },\n+\t{ .b \u003d test44, .blen \u003d sizeof(test44),\n+\t\t\t.seq \u003d seq44, .seq_size \u003d LWS_ARRAY_SIZE(seq44) },\n+\t{ .b \u003d test45, .blen \u003d sizeof(test45),\n+\t\t\t.seq \u003d seq45, .seq_size \u003d LWS_ARRAY_SIZE(seq45) },\n+\t{ .b \u003d test46, .blen \u003d sizeof(test46),\n+\t\t\t.seq \u003d seq46, .seq_size \u003d LWS_ARRAY_SIZE(seq46) },\n+\t{ .b \u003d test47, .blen \u003d sizeof(test47),\n+\t\t\t.seq \u003d seq47, .seq_size \u003d LWS_ARRAY_SIZE(seq47) },\n+\t{ .b \u003d test48, .blen \u003d sizeof(test48),\n+\t\t\t.seq \u003d seq48, .seq_size \u003d LWS_ARRAY_SIZE(seq48) },\n+\t{ .b \u003d test49, .blen \u003d sizeof(test49),\n+\t\t\t.seq \u003d seq49, .seq_size \u003d LWS_ARRAY_SIZE(seq49) },\n+\t{ .b \u003d test50, .blen \u003d sizeof(test50),\n+\t\t\t.seq \u003d seq50, .seq_size \u003d LWS_ARRAY_SIZE(seq50) },\n+\t{ .b \u003d test51, .blen \u003d sizeof(test51),\n+\t\t\t.seq \u003d seq51, .seq_size \u003d LWS_ARRAY_SIZE(seq51) },\n+\t{ .b \u003d test52, .blen \u003d sizeof(test52),\n+\t\t\t.seq \u003d seq52, .seq_size \u003d LWS_ARRAY_SIZE(seq52) },\n+\t{ .b \u003d test53, .blen \u003d sizeof(test53),\n+\t\t\t.seq \u003d seq53, .seq_size \u003d LWS_ARRAY_SIZE(seq53) },\n+\t{ .b \u003d test54, .blen \u003d sizeof(test54),\n+\t\t\t.seq \u003d seq54, .seq_size \u003d LWS_ARRAY_SIZE(seq54) },\n+\t{ .b \u003d test55, .blen \u003d sizeof(test55),\n+\t\t\t.seq \u003d seq55, .seq_size \u003d LWS_ARRAY_SIZE(seq55) },\n+\t{ .b \u003d test56, .blen \u003d sizeof(test56),\n+\t\t\t.seq \u003d seq56, .seq_size \u003d LWS_ARRAY_SIZE(seq56) },\n+\t{ .b \u003d test57, .blen \u003d sizeof(test57),\n+\t\t\t.seq \u003d seq57, .seq_size \u003d LWS_ARRAY_SIZE(seq57) },\n+\t{ .b \u003d test58, .blen \u003d sizeof(test58),\n+\t\t\t.seq \u003d seq58, .seq_size \u003d LWS_ARRAY_SIZE(seq58) },\n+\t{ .b \u003d test59, .blen \u003d sizeof(test59),\n+\t\t\t.seq \u003d seq59, .seq_size \u003d LWS_ARRAY_SIZE(seq59) },\n+\t{ .b \u003d test60, .blen \u003d sizeof(test60),\n+\t\t\t.seq \u003d seq60, .seq_size \u003d LWS_ARRAY_SIZE(seq60) },\n+\t{ .b \u003d test61, .blen \u003d sizeof(test61),\n+\t\t\t.seq \u003d seq61, .seq_size \u003d LWS_ARRAY_SIZE(seq61) },\n+\t{ .b \u003d test62, .blen \u003d sizeof(test62),\n+\t\t\t.seq \u003d seq62, .seq_size \u003d LWS_ARRAY_SIZE(seq62) },\n+\t{ .b \u003d test63, .blen \u003d sizeof(test63),\n+\t\t\t.seq \u003d seq63, .seq_size \u003d LWS_ARRAY_SIZE(seq63) },\n+\t{ .b \u003d test64, .blen \u003d sizeof(test64),\n+\t\t\t.seq \u003d seq64, .seq_size \u003d LWS_ARRAY_SIZE(seq64) },\n+\t{ .b \u003d test65, .blen \u003d sizeof(test65),\n+\t\t\t.seq \u003d seq65, .seq_size \u003d LWS_ARRAY_SIZE(seq65) },\n+\t{ .b \u003d test66, .blen \u003d sizeof(test66),\n+\t\t\t.seq \u003d seq66, .seq_size \u003d LWS_ARRAY_SIZE(seq66) },\n+\t{ .b \u003d test67, .blen \u003d sizeof(test67),\n+\t\t\t.seq \u003d seq67, .seq_size \u003d LWS_ARRAY_SIZE(seq67) },\n+\t{ .b \u003d test68, .blen \u003d sizeof(test68),\n+\t\t\t.seq \u003d seq68, .seq_size \u003d LWS_ARRAY_SIZE(seq68) },\n+\t{ .b \u003d test69, .blen \u003d sizeof(test69),\n+\t\t\t.seq \u003d seq69, .seq_size \u003d LWS_ARRAY_SIZE(seq69) },\n+\t{ .b \u003d test70, .blen \u003d sizeof(test70),\n+\t\t\t.seq \u003d seq70, .seq_size \u003d LWS_ARRAY_SIZE(seq70) },\n+\t{ .b \u003d test71, .blen \u003d sizeof(test71),\n+\t\t\t.seq \u003d seq71, .seq_size \u003d LWS_ARRAY_SIZE(seq71) },\n+\t{ .b \u003d test72, .blen \u003d sizeof(test72),\n+\t\t\t.seq \u003d seq72, .seq_size \u003d LWS_ARRAY_SIZE(seq72) },\n+\t{ .b \u003d test73, .blen \u003d sizeof(test73),\n+\t\t\t.seq \u003d seq73, .seq_size \u003d LWS_ARRAY_SIZE(seq73) },\n+\t{ .b \u003d test74, .blen \u003d sizeof(test74),\n+\t\t\t.seq \u003d seq74, .seq_size \u003d LWS_ARRAY_SIZE(seq74) },\n+\t{ .b \u003d test75, .blen \u003d sizeof(test75),\n+\t\t\t.seq \u003d seq75, .seq_size \u003d LWS_ARRAY_SIZE(seq75) },\n+\t{ .b \u003d test76, .blen \u003d sizeof(test76),\n+\t\t\t.seq \u003d seq76, .seq_size \u003d LWS_ARRAY_SIZE(seq76) },\n+\t{ .b \u003d test77, .blen \u003d sizeof(test77),\n+\t\t\t.seq \u003d seq77, .seq_size \u003d LWS_ARRAY_SIZE(seq77) },\n+\t{ .b \u003d test78, .blen \u003d sizeof(test78),\n+\t\t\t.seq \u003d seq78, .seq_size \u003d LWS_ARRAY_SIZE(seq78) },\n+\t{ .b \u003d test79, .blen \u003d sizeof(test79),\n+\t\t\t.seq \u003d seq79, .seq_size \u003d LWS_ARRAY_SIZE(seq79) },\n+\t{ .b \u003d test80, .blen \u003d sizeof(test80),\n+\t\t\t.seq \u003d seq80, .seq_size \u003d LWS_ARRAY_SIZE(seq80) },\n+\t{ .b \u003d test81, .blen \u003d sizeof(test81),\n+\t\t\t.seq \u003d seq81, .seq_size \u003d LWS_ARRAY_SIZE(seq81) },\n+\t{ .b \u003d test82, .blen \u003d sizeof(test82),\n+\t\t\t.seq \u003d seq82, .seq_size \u003d LWS_ARRAY_SIZE(seq82) },\n+\n+\t/* COSE-dervied test vectors */\n+\n+\t{ .b \u003d test83, .blen \u003d sizeof(test83),\n+\t\t\t.seq \u003d seq83, .seq_size \u003d LWS_ARRAY_SIZE(seq83) },\n+\t{ .b \u003d test84, .blen \u003d sizeof(test84),\n+\t\t\t.seq \u003d seq84, .seq_size \u003d LWS_ARRAY_SIZE(seq84) },\n+\t{ .b \u003d test85, .blen \u003d sizeof(test85),\n+\t\t\t.seq \u003d seq85, .seq_size \u003d LWS_ARRAY_SIZE(seq85) },\n+\t{ .b \u003d test86, .blen \u003d sizeof(test86),\n+\t\t\t.seq \u003d seq86, .seq_size \u003d LWS_ARRAY_SIZE(seq86) },\n+\t{ .b \u003d test87, .blen \u003d sizeof(test87),\n+\t\t\t.seq \u003d seq87, .seq_size \u003d LWS_ARRAY_SIZE(seq87) },\n+\t{ .b \u003d test88, .blen \u003d sizeof(test88),\n+\t\t\t.seq \u003d seq88, .seq_size \u003d LWS_ARRAY_SIZE(seq88) },\n+\t{ .b \u003d test89, .blen \u003d sizeof(test89),\n+\t\t\t.seq \u003d seq89, .seq_size \u003d LWS_ARRAY_SIZE(seq89) },\n+\t{ .b \u003d test90, .blen \u003d sizeof(test90),\n+\t\t\t.seq \u003d seq90, .seq_size \u003d LWS_ARRAY_SIZE(seq90) },\n+\t{ .b \u003d test91, .blen \u003d sizeof(test91),\n+\t\t\t.seq \u003d seq91, .seq_size \u003d LWS_ARRAY_SIZE(seq91) },\n+\t{ .b \u003d test92, .blen \u003d sizeof(test92),\n+\t\t\t.seq \u003d seq92, .seq_size \u003d LWS_ARRAY_SIZE(seq92) },\n+\t{ .b \u003d test93, .blen \u003d sizeof(test93),\n+\t\t\t.seq \u003d seq93, .seq_size \u003d LWS_ARRAY_SIZE(seq93) },\n+\t{ .b \u003d test94, .blen \u003d sizeof(test94),\n+\t\t\t.seq \u003d seq94, .seq_size \u003d LWS_ARRAY_SIZE(seq94) },\n+\t{ .b \u003d test95, .blen \u003d sizeof(test95),\n+\t\t\t.seq \u003d seq95, .seq_size \u003d LWS_ARRAY_SIZE(seq95) },\n+\t{ .b \u003d test96, .blen \u003d sizeof(test96),\n+\t\t\t.seq \u003d seq96, .seq_size \u003d LWS_ARRAY_SIZE(seq96) },\n+\t{ .b \u003d test97, .blen \u003d sizeof(test97),\n+\t\t\t.seq \u003d seq97, .seq_size \u003d LWS_ARRAY_SIZE(seq97) },\n+\t{ .b \u003d test98, .blen \u003d sizeof(test98),\n+\t\t\t.seq \u003d seq98, .seq_size \u003d LWS_ARRAY_SIZE(seq98) },\n+\t{ .b \u003d test99, .blen \u003d sizeof(test99),\n+\t\t\t.seq \u003d seq99, .seq_size \u003d LWS_ARRAY_SIZE(seq99) },\n+\t{ .b \u003d test100, .blen \u003d sizeof(test100),\n+\t\t\t.seq \u003d seq100, .seq_size \u003d LWS_ARRAY_SIZE(seq100) },\n+\t{ .b \u003d test101, .blen \u003d sizeof(test101),\n+\t\t\t.seq \u003d seq101, .seq_size \u003d LWS_ARRAY_SIZE(seq101) },\n+\t{ .b \u003d test102, .blen \u003d sizeof(test102),\n+\t\t\t.seq \u003d seq102, .seq_size \u003d LWS_ARRAY_SIZE(seq102) },\n+\t{ .b \u003d test103, .blen \u003d sizeof(test103),\n+\t\t\t.seq \u003d seq103, .seq_size \u003d LWS_ARRAY_SIZE(seq103) },\n+\t{ .b \u003d test104, .blen \u003d sizeof(test104),\n+\t\t\t.seq \u003d seq104, .seq_size \u003d LWS_ARRAY_SIZE(seq104) },\n+\t{ .b \u003d test105, .blen \u003d sizeof(test105),\n+\t\t\t.seq \u003d seq105, .seq_size \u003d LWS_ARRAY_SIZE(seq105) },\n+\t{ .b \u003d test106, .blen \u003d sizeof(test106),\n+\t\t\t.seq \u003d seq106, .seq_size \u003d LWS_ARRAY_SIZE(seq106) },\n+\t{ .b \u003d test107, .blen \u003d sizeof(test107),\n+\t\t\t.seq \u003d seq107, .seq_size \u003d LWS_ARRAY_SIZE(seq107) },\n+\t{ .b \u003d test108, .blen \u003d sizeof(test108),\n+\t\t\t.seq \u003d seq108, .seq_size \u003d LWS_ARRAY_SIZE(seq108) },\n+};\n+\n+static const uint8_t\n+\tw1[] \u003d { 0x65, 0x68, 0x65, 0x6C,\n+\t\t 0x6C, 0x6F },\n+\tw2[] \u003d { 0xc2 },\n+\tw3[] \u003d { 0x82, 0x63, 0x61, 0x62,\n+\t\t 0x63, 0x63, 0x64, 0x65,\n+\t\t 0x66 },\n+\tw4[] \u003d { 0xA2, 0x63, 0x67, 0x68,\n+\t\t 0x69, 0x01, 0x63, 0x6A,\n+\t\t 0x6B, 0x6C, 0x02 },\n+\tw5[] \u003d { 0xD8, 0x7B, 0xA2, 0x63,\n+\t\t 0x67, 0x68, 0x69, 0x01,\n+\t\t 0x63, 0x6A, 0x6B, 0x6C,\n+\t\t 0x02 },\n+\tw6[] \u003d { 0xCC, 0xA2, 0x63, 0x67,\n+\t\t 0x68, 0x69, 0x01, 0x63,\n+\t\t 0x6A, 0x6B, 0x6C, 0x82,\n+\t\t 0x61, 0x61, 0x61, 0x62 },\n+\tw7[] \u003d { 0x20, },\n+\tw8[] \u003d { 0x0c, },\n+\tw13[] \u003d { 0x18, 0x34 },\n+\tw14[] \u003d { 0x19, 0x12, 0x34 },\n+\tw15[] \u003d { 0x1a, 0x12, 0x34, 0x56, 0x78 },\n+\tw16[] \u003d { 0x1b, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 },\n+\tw17[] \u003d { 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F },\n+\tw18[] \u003d { 0x25 },\n+\tw19[] \u003d {\n+\t\t\t0xd8, 0x7b, 0x58, 0xb7,\n+\t\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n+\t\t\t0x03, 0x00, 0xa1, 0x07, 0x83,\n+\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n+\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n+\t\t\t0x40, 0xb7, 0xca, 0xcb, 0xa2,\n+\t\t\t0x85, 0xc4, 0xcd, 0x3e, 0xd2,\n+\t\t\t0xf0, 0x14, 0x6f, 0x41, 0x98,\n+\t\t\t0x86, 0x14, 0x4c, 0xa6, 0x38,\n+\t\t\t0xd0, 0x87, 0xde, 0x12, 0x3d,\n+\t\t\t0x40, 0x01, 0x67, 0x30, 0x8a,\n+\t\t\t0xce, 0xab, 0xc4, 0xb5, 0xe5,\n+\t\t\t0xc6, 0xa4, 0x0c, 0x0d, 0xe0,\n+\t\t\t},\n+\tw19a[] \u003d {\n+\t\t\t0xb7, 0x11, 0x67, 0xa3, 0x91,\n+\t\t\t0x75, 0xea, 0x56, 0xc1, 0xfe,\n+\t\t\t0x96, 0xc8, 0x9e, 0x5e, 0x7d,\n+\t\t\t0x30, 0xda, 0xf2, 0x43, 0x8a,\n+\t\t\t0x45, 0x61, 0x59, 0xa2, 0x0a,\n+\t\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n+\t\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n+\t\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n+\t\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n+\t\t\t0x2e, 0x81, 0x83, 0x43, 0xa1,\n+\t\t\t0x01, 0x27, 0xa1, 0x04, 0x42,\n+\t\t\t0x31, 0x31, 0x58, 0x40, 0x77,\n+\t\t\t0xf3, 0xea, 0xcd, 0x11,},\n+\tw19b[] \u003d {\n+\t\t\t0x85, 0x2c, 0x4b, 0xf9, 0xcb, 0x1d,\n+\t\t\t0x72, 0xfa, 0xbe, 0x6b, 0x26,\n+\t\t\t0xfb, 0xa1, 0xd7, 0x60, 0x92,\n+\t\t\t0xb2, 0xb5, 0xb7, 0xec, 0x83,\n+\t\t\t0xb8, 0x35, 0x57, 0x65, 0x22,\n+\t\t\t0x64, 0xe6, 0x96, 0x90, 0xdb,\n+\t\t\t0xc1, 0x17, 0x2d, 0xdc, 0x0b,\n+\t\t\t0xf8, 0x84, 0x11, 0xc0, 0xd2,\n+\t\t\t0x5a, 0x50, 0x7f, 0xdb, 0x24,\n+\t\t\t0x7a, 0x20, 0xc4, 0x0d, 0x5e,\n+\t\t\t0x24, 0x5f, 0xab, 0xd3, 0xfc,\n+\t\t\t0x9e, 0xc1, 0x06 },\n+\tw22[] \u003d { 0xD8, 0x7B, 0x19, 0x01, 0xC8 },\n+\tw24[] \u003d { 0xDB, 0x12, 0x34, 0x56, 0x78, 0x9A,\n+\t\t\t0xBC, 0xED, 0xF0, 0x19, 0x01, 0xC8},\n+\tw25[] \u003d { 0xF9, 0x3C, 0x00 },\n+\tw26[] \u003d { 0xF9, 0x3E, 0x00 },\n+\tw27[] \u003d { 0xFB, 0x3F, 0xF1, 0xF7, 0xCE, 0xD9, 0x16, 0x87, 0x2B },\n+\tw28[] \u003d { 0xA2, 0x61, 0x61, 0x01, 0x61, 0x62, 0x82, 0x02, 0x03 },\n+\tw29[] \u003d { 0x7F, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0xFF\n+}\n+;\n+\n+static const char * const tok[] \u003d {\n+\t\u0022something\u0022,\n+};\n+\n+struct priv {\n+\tconst struct cbort *cbt;\n+\tsize_t idx;\n+};\n+\n+static int pass;\n+\n+static signed char\n+test_cb(struct lecp_ctx *ctx, char reason)\n+{\n+\tstruct priv *priv \u003d (struct priv *)ctx-\u003euser;\n+\tsize_t i \u003d priv-\u003eidx++;\n+\n+#if defined(VERBOSE)\n+\t lwsl_notice(\u0022%s: %s, ctx-\u003epath %s\u005cn\u0022, __func__,\n+\t\t\t reason_names[(int)reason \u0026 0x1f], ctx-\u003epath);\n+#endif\n+\n+\t// if (ctx-\u003enpos)\n+\t//\tlwsl_hexdump_notice(ctx-\u003ebuf, ctx-\u003enpos);\n+\n+\tif (!priv-\u003ecbt-\u003eseq)\n+\t\treturn 0;\n+\n+\tif (i \u003e\u003d priv-\u003ecbt-\u003eseq_size) {\n+\t\tlwsl_warn(\u0022%s: unexpected parse states\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (priv-\u003ecbt-\u003eseq[i].reason !\u003d reason) {\n+\t\tlwsl_warn(\u0022%s: reason mismatch\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (priv-\u003ecbt-\u003eseq[i].buf \u0026\u0026\n+\t (priv-\u003ecbt-\u003eseq[i].buf_len !\u003d ctx-\u003enpos ||\n+\t memcmp(priv-\u003ecbt-\u003eseq[i].buf, ctx-\u003ebuf, ctx-\u003enpos))) {\n+\t\tlwsl_warn(\u0022%s: buf mismatch\u005cn\u0022, __func__);\n+\t\tlwsl_hexdump_notice(ctx-\u003ebuf, (size_t)ctx-\u003enpos);\n+\t\treturn 1;\n+\t}\n+\n+\tswitch (reason) {\n+\tcase LECPCB_VAL_SIMPLE:\n+\tcase LECPCB_VAL_NUM_UINT:\n+\tcase LECPCB_VAL_NUM_INT:\n+\t\tif (ctx-\u003eitem.u.u64 !\u003d priv-\u003ecbt-\u003eseq[i].item.u.u64) {\n+\t\t\tlwsl_warn(\u0022%s: number mismatch %llu %llu\u005cn\u0022, __func__,\n+\t\t\t\t(unsigned long long)ctx-\u003eitem.u.u64,\n+\t\t\t\t(unsigned long long)priv-\u003ecbt-\u003eseq[i].item.u.u64);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LECPCB_VAL_FLOAT16:\n+\t\tif (ctx-\u003eitem.u.hf !\u003d priv-\u003ecbt-\u003eseq[i].item.u.hf) {\n+\t\t\tlwsl_warn(\u0022%s: number mismatch %llu %llu\u005cn\u0022, __func__,\n+\t\t\t\t(unsigned long long)ctx-\u003eitem.u.hf,\n+\t\t\t\t(unsigned long long)priv-\u003ecbt-\u003eseq[i].item.u.hf);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tbreak;\n+\tcase LECPCB_VAL_FLOAT32:\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t\tif (!isfinite(ctx-\u003eitem.u.f) \u0026\u0026\n+\t\t !isfinite(priv-\u003ecbt-\u003eseq[i].item.u.f))\n+\t\t\tbreak;\n+\t\tif (isnan(ctx-\u003eitem.u.f) \u0026\u0026\n+\t\t isnan(priv-\u003ecbt-\u003eseq[i].item.u.f))\n+\t\t\tbreak;\n+#endif\n+\t\tif (ctx-\u003eitem.u.f !\u003d priv-\u003ecbt-\u003eseq[i].item.u.f) {\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t\t\tlwsl_warn(\u0022%s: number mismatch %f %f\u005cn\u0022, __func__,\n+\t\t\t\tctx-\u003eitem.u.f,\n+\t\t\t\tpriv-\u003ecbt-\u003eseq[i].item.u.f);\n+#else\n+\t\t\tlwsl_warn(\u0022%s: f32 number mismatch %llu %llu\u005cn\u0022, __func__,\n+\t\t\t\t(unsigned long long)ctx-\u003eitem.u.f,\n+\t\t\t\t(unsigned long long)priv-\u003ecbt-\u003eseq[i].item.u.f);\n+#endif\n+\t\t\treturn 1;\n+\t\t}\n+\t\tbreak;\n+\tcase LECPCB_VAL_FLOAT64:\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t\tif (!isfinite(ctx-\u003eitem.u.d) \u0026\u0026\n+\t\t !isfinite(priv-\u003ecbt-\u003eseq[i].item.u.d))\n+\t\t\tbreak;\n+\t\tif (isnan(ctx-\u003eitem.u.d) \u0026\u0026\n+\t\t isnan(priv-\u003ecbt-\u003eseq[i].item.u.d))\n+\t\t\tbreak;\n+#endif\n+\t\tif (ctx-\u003eitem.u.d !\u003d priv-\u003ecbt-\u003eseq[i].item.u.d) {\n+#if defined(LWS_WITH_CBOR_FLOAT)\n+\t\t\tlwsl_warn(\u0022%s: f64 number mismatch %f %f\u005cn\u0022, __func__,\n+\t\t\t\tctx-\u003eitem.u.d,\n+\t\t\t\tpriv-\u003ecbt-\u003eseq[i].item.u.d);\n+#else\n+\t\t\tlwsl_warn(\u0022%s: number mismatch %llu %llu\u005cn\u0022, __func__,\n+\t\t\t\t(unsigned long long)ctx-\u003eitem.u.d,\n+\t\t\t\t(unsigned long long)priv-\u003ecbt-\u003eseq[i].item.u.d);\n+#endif\n+\t\t\treturn 1;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LECPCB_DESTRUCTED:\n+\t\tpass++;\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n, m, e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE,\n+\t\t\texpected \u003d (int)LWS_ARRAY_SIZE(cbor_tests) +\n+\t\t\t\t\t29 /* \u003c-- how many write tests */;\n+\tstruct lecp_ctx ctx;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: LECP CBOR parser\u005cn\u0022);\n+\n+\tfor (m \u003d 0; m \u003c (int)LWS_ARRAY_SIZE(cbor_tests); m++) {\n+\n+\t\tstruct priv priv;\n+\n+\t\tpriv.cbt \u003d \u0026cbor_tests[m];\n+\t\tpriv.idx \u003d 0;\n+\n+\t\tlwsl_notice(\u0022%s: ++++++++++++++++ test %d\u005cn\u0022, __func__, m + 1);\n+\n+\t\tlecp_construct(\u0026ctx, test_cb, \u0026priv, tok, LWS_ARRAY_SIZE(tok));\n+\n+\t\tlwsl_hexdump_info(cbor_tests[m].b, cbor_tests[m].blen);\n+\n+#if 0\n+\t\t{\n+\t\t\tchar fn[128];\n+\t\t\tint fd;\n+\n+\t\t\tlws_snprintf(fn, sizeof(fn), \u0022/tmp/cbor-%d\u0022, m + 1);\n+\t\t\tfd \u003d open(fn, LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);\n+\t\t\tif (fd !\u003d -1) {\n+\t\t\t\twrite(fd, cbor_tests[m].b,\n+\t\t\t\t\t cbor_tests[m].blen);\n+\t\t\t\tclose(fd);\n+\t\t\t}\n+\t\t}\n+#endif\n+\n+\t\tn \u003d lecp_parse(\u0026ctx, cbor_tests[m].b,\n+\t\t\t\t cbor_tests[m].blen);\n+\n+\t\tlecp_destruct(\u0026ctx);\n+\n+\t\tif (n \u003c 0 \u0026\u0026 m + 1 !\u003d 46 /* expected to fail */) {\n+\t\t\tlwsl_err(\u0022%s: test %d: CBOR decode failed %d '%s'\u005cn\u0022,\n+\t\t\t\t\t__func__, m + 1, n,\n+\t\t\t\t\tlecp_error_to_string(n));\n+\t\t\te++;\n+\t\t}\n+\t}\n+\n+\t{\n+\t\tlws_lec_pctx_t ctx;\n+\t\tuint8_t buf[64];\n+\n+\t\tlws_lec_init(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022'hello'\u0022) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w1) || memcmp(w1, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u00222()\u0022) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w2) || memcmp(w2, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022['abc','def']\u0022) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w3) || memcmp(w3, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test4\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022{'ghi':1,'jkl':2}\u0022) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w4) || memcmp(w4, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test5\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022123({'ghi':1,'jkl':2})\u0022) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w5) || memcmp(w5, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test6\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u002212({'ghi':1,'jkl':['a', 'b']})\u0022) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w6) || memcmp(w6, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test7\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%d\u0022, -1) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w7) || memcmp(w7, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test8\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%ld\u0022, -1l) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w7) || memcmp(w7, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test9\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%lld\u0022, -1ll) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w7) || memcmp(w7, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test10\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%u\u0022, 12) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w8) || memcmp(w8, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test11\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%ld\u0022, 12l) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w8) || memcmp(w8, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test12\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%lld\u0022, 12ll) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w8) || memcmp(w8, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test13\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%u\u0022, 0x34u) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w13) || memcmp(w13, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test14\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%ld\u0022, 0x1234ul) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w14) || memcmp(w14, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test15\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%lld\u0022, 0x12345678ull) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w15) || memcmp(w15, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test16\u005cn\u0022, __func__);\n+\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%lld\u0022, 0x123456789abcdef0ull) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w16) || memcmp(w16, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test17\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%s\u0022, \u0022hello\u0022) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w17) || memcmp(w17, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test18\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022-6\u0022) !\u003d\n+\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w18) || memcmp(w18, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\t/*\n+\t\t * A big binary blob is going to get emitted in 3 output\n+\t\t * buffers, by calling it two more times while still handling\n+\t\t * the same format object, format objects before that which\n+\t\t * were completed are skipped on the subsequent calls\n+\t\t */\n+\n+\t\tlwsl_user(\u0022%s: test19\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022123(%.*b)\u0022, (int)sizeof(test106), test106) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_AGAIN ||\n+\t\t ctx.used !\u003d sizeof(w19) || memcmp(w19, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test20\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022123(%.*b)\u0022, (int)sizeof(test106), test106) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_AGAIN ||\n+\t\t ctx.used !\u003d sizeof(w19a) || memcmp(w19a, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test21\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022123(%.*b)\u0022, (int)sizeof(test106), test106) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w19b) || memcmp(w19b, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test22\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%t(456)\u0022, 123) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w22) || memcmp(w22, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test23\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%lt(456)\u0022, 123ul) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w22) || memcmp(w22, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test24\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%llt(456)\u0022, 0x123456789abcedf0ull) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w24) || memcmp(w24, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test25\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%f\u0022, 1.0) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w25) || memcmp(w25, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test26\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%f\u0022, 1.5) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w26) || memcmp(w26, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\tlwsl_user(\u0022%s: test27\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022%f\u0022, 1.123) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w27) || memcmp(w27, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\n+\t\t{\n+\t\t\tint args[3] \u003d { 1, 2, 3 };\n+\n+\t\t\tlwsl_user(\u0022%s: test28\u005cn\u0022, __func__);\n+\t\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\t\tif (lws_lec_printf(\u0026ctx, \u0022{'a':%d,'b':[%d,%d]}\u0022,\n+\t\t\t\t\t\targs[0], args[1], args[2]) !\u003d\n+\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t\t ctx.used !\u003d sizeof(w28) ||\n+\t\t\t memcmp(w28, buf, ctx.used)) {\n+\t\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\t\te++;\n+\t\t\t} else\n+\t\t\t\tpass++;\n+\t\t}\n+\n+\t\tlwsl_user(\u0022%s: test29\u005cn\u0022, __func__);\n+\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n+\n+\t\tif (lws_lec_printf(\u0026ctx, \u0022\u003ct'hello'\u003e\u0022) !\u003d\n+\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n+\t\t ctx.used !\u003d sizeof(w29) || memcmp(w29, buf, ctx.used)) {\n+\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n+\t\t\te++;\n+\t\t} else\n+\t\t\tpass++;\n+\t}\n+\n+\tif (e)\n+\t\tgoto bail;\n+\n+\tif (pass !\u003d expected)\n+\t\tgoto bail;\n+\n+\tlwsl_user(\u0022Completed: PASS %d / %d\u005cn\u0022, pass, expected);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_user(\u0022Completed: FAIL, passed %d / %d (e %d)\u005cn\u0022, pass,\n+\t\t\t\texpected, e);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lejp/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lejp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..ccdb9b5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lejp/CMakeLists.txt\n@@ -0,0 +1,22 @@\n+project(lws-api-test-lejp C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_LEJP 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${PROJECT_NAME} main.c)\n+\tadd_test(NAME api-test-lejp COMMAND lws-api-test-lejp)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lejp/main.c b/minimal-examples-lowlevel/api-tests/api-test-lejp/main.c\nnew file mode 100644\nindex 0000000..352181b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lejp/main.c\n@@ -0,0 +1,219 @@\n+/*\n+ * lws-api-test-lejp\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * sanity tests for lejp\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+/*\n+ * in this example, the JSON is for one \u0022builder\u0022 object, which may specify\n+ * a child list \u0022targets\u0022 of zero or more \u0022target\u0022 objects.\n+ */\n+\n+static const char * const json_tests[] \u003d {\n+\t\u0022{\u0022 /* test 1 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u0022\n+\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:true\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:false\u0022\n+\t\t\t\u0022}\u0022\n+\t\t\u0022]\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 2 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target3\u005c\u0022\u0022\n+\t\t\t\u0022}\u0022\n+\t\t\u0022]\u0022\n+\t\u0022}\u0022, \u0022{\u0022 /* test 3 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u0022\n+\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022unrecognized\u005c\u0022:\u005c\u0022xyz\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022child\u005c\u0022: {\u0022\n+\t\t\t\t\t\u0022\u005c\u0022somename\u005c\u0022: \u005c\u0022abc\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022junk\u005c\u0022: { \u005c\u0022x\u005c\u0022: \u005c\u0022y\u005c\u0022 }\u0022\n+\t\t\t\t\u0022}\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022\u0022\n+\t\t\t\u0022}\u0022\n+\t\t\u0022]\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 4 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 5 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 6 ... check huge strings into smaller fixed char array */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022\u0022\n+\t\t\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A\u0022\n+\t\t\u0022zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/\u0022\n+\t\t\u0022CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5\u0022\n+\t\t\u00223FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV\u0022\n+\t\t\u00228sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n+\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG\u0022\n+\t\t\u0022JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG\u0022\n+\t\t\u0022LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW\u0022\n+\t\t\u0022v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9\u0022\n+\t\t\u0022eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY\u0022\n+\t\t\u0022VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/\u0022\n+\t\t\u0022uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu\u0022\n+\t\t\u0022yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx\u0022\n+\t\t\u0022+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 7 ... check huge strings into char * */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022\u0022\n+\t\t\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A\u0022\n+\t\t\u0022zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/\u0022\n+\t\t\u0022CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5\u0022\n+\t\t\u00223FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV\u0022\n+\t\t\u00228sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n+\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG\u0022\n+\t\t\u0022JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG\u0022\n+\t\t\u0022LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW\u0022\n+\t\t\u0022v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9\u0022\n+\t\t\u0022eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY\u0022\n+\t\t\u0022VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/\u0022\n+\t\t\u0022uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu\u0022\n+\t\t\u0022yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx\u0022\n+\t\t\u0022+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022}]}\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 8 the \u0022other\u0022 schema */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-logs\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022task_uuid\u005c\u0022:\u005c\u002297fc90052506af8b3eb43b87aaa6fb76feab32bc128ede479a8a6b961e801f06\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022timestamp\u005c\u0022: 170366786103,\u005c\u0022channel\u005c\u0022:3, \u005c\u0022len\u005c\u0022:20, \u0022\n+\t\t\u0022\u005c\u0022log\u005c\u0022: \u005c\u0022PnNhaWI+IE5TU1RBVEVfSU5JVAo\u003d\u005c\u0022}\u005cx0a\u0022\n+\t\t\u0022ntu-xenial-amd64\u005c\u0022},{\u005c\u0022name\u005c\u0022:\u005c\u0022linux-ubuntu-bionic-amd64\u005c\u0022},{\u005c\u0022name\u005c\u0022:\u005c\u0022linux-fedora-32-x86_64\u005c\u0022}]}\u005c\u0022,\u0022,\n+\n+\t\u0022{\u0022 /* test 9, empty object */\n+\t\t\u0022\u005c\u0022a\u005c\u0022:123,\u005c\u0022b\u005c\u0022:{}\u0022\n+\t\u0022}\u0022,\n+\n+\t\u0022{\u0022 /* SHOULD_FAIL: test 10, missing open */\n+\t\t\u0022\u005c\u0022a\u005c\u0022:123,\u005c\u0022b\u005c\u0022:}\u0022\n+\t\u0022}\u0022\n+};\n+\n+static const char * const tok[] \u003d {\n+\t\u0022something\u0022,\n+};\n+\n+static signed char\n+test_cb(struct lejp_ctx *ctx, char reason)\n+{\n+\tlwsl_info(\u0022%s: ctx-\u003epath %s, buf %s\u005cn\u0022, __func__, ctx-\u003epath, ctx-\u003ebuf);\n+\treturn 0;\n+}\n+\n+/* authz JSON parsing */\n+\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n, m, e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lejp_ctx ctx;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lws_struct JSON\u005cn\u0022);\n+\n+\tfor (m \u003d 0; m \u003c (int)LWS_ARRAY_SIZE(json_tests); m++) {\n+\n+\t\tlwsl_info(\u0022%s: ++++++++++++++++ test %d\u005cn\u0022, __func__, m + 1);\n+\n+\t\tlejp_construct(\u0026ctx, test_cb, NULL, tok, LWS_ARRAY_SIZE(tok));\n+\n+\t\tlwsl_hexdump_info(json_tests[m], strlen(json_tests[m]));\n+\n+\t\tif (m \u003d\u003d 7)\n+\t\t\tn \u003d lejp_parse(\u0026ctx, (uint8_t *)json_tests[m],\n+\t\t\t\t\t\t\t 0xc8);\n+\t\telse\n+\t\t\tn \u003d lejp_parse(\u0026ctx, (uint8_t *)json_tests[m],\n+\t\t\t\t\t\t (int)strlen(json_tests[m]));\n+\n+\t\tlwsl_info(\u0022n \u003d %d\u005cn\u0022, n);\n+\t\tif (n \u003c 0 \u0026\u0026 m !\u003d 9) {\n+\t\t\tlwsl_err(\u0022%s: test %d: JSON decode failed '%s'\u005cn\u0022,\n+\t\t\t\t\t__func__, m + 1, lejp_error_to_string(n));\n+\t\t\te++;\n+\t\t}\n+\t\tif (n \u003e\u003d 0 \u0026\u0026 m \u003d\u003d 9) {\n+\t\t\tlwsl_err(\u0022%s: test %d: JSON decode should have failed '%s'\u005cn\u0022,\n+\t\t\t\t\t__func__, m + 1, lejp_error_to_string(n));\n+\t\t\te++;\n+\t\t}\n+\t}\n+\n+\t{\n+\t\tconst char *cs;\n+\t\tsize_t cslen;\n+\t\tcs \u003d lws_json_simple_find(\u0022{\u005c\u0022blah\u005c\u0022:123,\u005c\u0022ext\u005c\u0022:{\u005c\u0022authorized\u005c\u0022:1}}\u0022, 35,\n+\t\t\t\t\t \u0022\u005c\u0022ext\u005c\u0022:\u0022, \u0026cslen);\n+\t\tif (!cs) {\n+\t\t\tlwsl_err(\u0022%s: simple_find failed\u005cn\u0022, __func__);\n+\t\t\te++;\n+\t\t} else {\n+\t\t\tif (lws_json_simple_strcmp(cs, cslen,\n+\t\t\t\t\t\u0022\u005c\u0022authorized\u005c\u0022:\u0022, \u00221\u0022))\n+\t\t\t\te++;\n+\t\t}\n+\t\tcs \u003d lws_json_simple_find(\u0022{\u005c\u0022blah\u005c\u0022:123,\u005c\u0022auth_user\u005c\u0022:\u005c\u0022andy@warmcat.com\u005c\u0022,\u005c\u0022thing\u005c\u0022:\u005c\u0022yeah\u005c\u0022}\u0022, 57,\n+\t\t\t\t\t \u0022\u005c\u0022auth_user\u005c\u0022:\u0022, \u0026cslen);\n+\t\tif (cslen !\u003d 16) {\n+\t\t\tlwsl_err(\u0022%s: wrong string len %d isolated\u005cn\u0022, __func__, (int)cslen);\n+\t\t\te++;\n+\t\t}\n+\t}\n+\n+\tif (e)\n+\t\tgoto bail;\n+\n+\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_user(\u0022Completed: FAIL\u005cn\u0022);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_cache/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/CMakeLists.txt\nnew file mode 100644\nindex 0000000..72ae86a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/CMakeLists.txt\n@@ -0,0 +1,19 @@\n+project(lws-api-test-lws_cache C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-lws_cache)\n+set(SRCS main.c)\n+\n+add_executable(${SAMP} ${SRCS})\n+add_test(NAME api-test-lws_cache COMMAND lws-api-test-lws_cache)\n+\n+if (websockets_shared)\n+\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\tadd_dependencies(${SAMP} websockets_shared)\n+else()\n+\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_cache/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/README.md\nnew file mode 100644\nindex 0000000..74034c7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/README.md\n@@ -0,0 +1,22 @@\n+# lws api test lwsac\n+\n+Demonstrates how to use and performs selftests for lwsac\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-lwsac\n+[2018/10/09 09:14:17:4834] USER: LWS API selftest: lwsac\n+[2018/10/09 09:14:17:4835] USER: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_cache/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/main.c\nnew file mode 100644\nindex 0000000..64835ff\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/main.c\n@@ -0,0 +1,512 @@\n+/*\n+ * lws-api-test-lws_cache\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+static struct lws_context *cx;\n+static int tests, fail;\n+\n+static int\n+test_just_l1(void)\n+{\n+\tstruct lws_cache_creation_info ci;\n+\tstruct lws_cache_ttl_lru *l1;\n+\tint ret \u003d 1;\n+\tsize_t size;\n+\tchar *po;\n+\n+\tlwsl_user(\u0022%s\u005cn\u0022, __func__);\n+\n+\ttests++;\n+\n+\t/* just create a heap cache \u0022L1\u0022 */\n+\n+\tmemset(\u0026ci, 0, sizeof(ci));\n+\tci.cx \u003d cx;\n+\tci.ops \u003d \u0026lws_cache_ops_heap;\n+\tci.name \u003d \u0022L1\u0022;\n+\n+\tl1 \u003d lws_cache_create(\u0026ci);\n+\tif (!l1)\n+\t\tgoto cdone;\n+\n+\t/* add two items, a has 1s expiry and b has 2s */\n+\n+\tif (lws_cache_write_through(l1, \u0022a\u0022, (const uint8_t *)\u0022is_a\u0022, 5,\n+\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC, NULL))\n+\t\tgoto cdone;\n+\n+\tif (lws_cache_write_through(l1, \u0022b\u0022, (const uint8_t *)\u0022is_b\u0022, 5,\n+\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL))\n+\t\tgoto cdone;\n+\n+\t/* check they exist as intended */\n+\n+\tif (lws_cache_item_get(l1, \u0022a\u0022, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d 5 || strcmp(po, \u0022is_a\u0022))\n+\t\tgoto cdone;\n+\n+\tif (lws_cache_item_get(l1, \u0022b\u0022, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d 5 || strcmp(po, \u0022is_b\u0022))\n+\t\tgoto cdone;\n+\n+\t/* wait for 1.2s to pass, working the event loop by hand */\n+\n+\tlws_cancel_service(cx);\n+\tif (lws_service(cx, 0) \u003c 0)\n+\t\tgoto cdone;\n+#if defined(WIN32)\n+\tSleep(1200);\n+#else\n+\t/* netbsd cares about \u003c 1M */\n+\tusleep(999999);\n+\tusleep(200001);\n+#endif\n+\tlws_cancel_service(cx);\n+\tif (lws_service(cx, 0) \u003c 0)\n+\t\tgoto cdone;\n+\n+\tlws_cancel_service(cx);\n+\tif (lws_service(cx, 0) \u003c 0)\n+\t\tgoto cdone;\n+\n+\t/* a only had 1s lifetime, he should be gone */\n+\n+\tif (!lws_cache_item_get(l1, \u0022a\u0022, (const void **)\u0026po, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: cache: a still exists after expiry\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t\tgoto cdone;\n+\t}\n+\n+\t/* that's ok then */\n+\n+\tret \u003d 0;\n+\n+cdone:\n+\tlws_cache_destroy(\u0026l1);\n+\n+\tif (ret)\n+\t\tlwsl_warn(\u0022%s: fail\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+static int\n+test_just_l1_limits(void)\n+{\n+\tstruct lws_cache_creation_info ci;\n+\tstruct lws_cache_ttl_lru *l1;\n+\tint ret \u003d 1;\n+\tsize_t size;\n+\tchar *po;\n+\n+\tlwsl_user(\u0022%s\u005cn\u0022, __func__);\n+\ttests++;\n+\n+\t/* just create a heap cache \u0022L1\u0022 */\n+\n+\tmemset(\u0026ci, 0, sizeof(ci));\n+\tci.cx \u003d cx;\n+\tci.ops \u003d \u0026lws_cache_ops_heap;\n+\tci.name \u003d \u0022L1_lim\u0022;\n+\tci.max_items \u003d 1; /* ie, adding a second item destroys the first */\n+\n+\tl1 \u003d lws_cache_create(\u0026ci);\n+\tif (!l1)\n+\t\tgoto cdone;\n+\n+\t/* add two items, a has 1s expiry and b has 2s */\n+\n+\tif (lws_cache_write_through(l1, \u0022a\u0022, (const uint8_t *)\u0022is_a\u0022, 5,\n+\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC, NULL))\n+\t\tgoto cdone;\n+\n+\tif (lws_cache_write_through(l1, \u0022b\u0022, (const uint8_t *)\u0022is_b\u0022, 5,\n+\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL))\n+\t\tgoto cdone;\n+\n+\t/* only b should exit, since we limit to cache to just one entry */\n+\n+\tif (!lws_cache_item_get(l1, \u0022a\u0022, (const void **)\u0026po, \u0026size))\n+\t\tgoto cdone;\n+\n+\tif (lws_cache_item_get(l1, \u0022b\u0022, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d 5 || strcmp(po, \u0022is_b\u0022))\n+\t\tgoto cdone;\n+\n+\t/* that's ok then */\n+\n+\tret \u003d 0;\n+\n+cdone:\n+\tlws_cache_destroy(\u0026l1);\n+\n+\tif (ret)\n+\t\tlwsl_warn(\u0022%s: fail\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+\n+#if defined(LWS_WITH_CACHE_NSCOOKIEJAR)\n+\n+static const char\n+\t*cookie1 \u003d \u0022host.com\u005ctFALSE\u005ct/\u005ctTRUE\u005ct4000000000\u005ctmycookie\u005ctmycookievalue\u0022,\n+\t*tag_cookie1 \u003d \u0022host.com|/|mycookie\u0022,\n+\t*cookie2 \u003d \u0022host.com\u005ctFALSE\u005ct/xxx\u005ctTRUE\u005ct4000000000\u005ctmycookie\u005ctmyxxxcookievalue\u0022,\n+\t*tag_cookie2 \u003d \u0022host.com|/xxx|mycookie\u0022,\n+\t*cookie3 \u003d \u0022host.com\u005ctFALSE\u005ct/\u005ctTRUE\u005ct4000000000\u005ctextra\u005ctcookie3value\u0022,\n+\t*tag_cookie3 \u003d \u0022host.com|/|extra\u0022,\n+\t*cookie4 \u003d \u0022host.com\u005ctFALSE\u005ct/yyy\u005ctTRUE\u005ct4000000000\u005ctnewcookie\u005ctnewcookievalue\u0022,\n+\t*tag_cookie4 \u003d \u0022host.com|/yyy|newcookie\u0022\n+;\n+\n+static int\n+test_nsc1(void)\n+{\n+\tstruct lws_cache_creation_info ci;\n+\tstruct lws_cache_ttl_lru *l1 \u003d NULL, *nsc;\n+\tlws_cache_results_t cr;\n+\tint n, ret \u003d 1;\n+\tsize_t size;\n+\tchar *po;\n+\n+\tlwsl_user(\u0022%s\u005cn\u0022, __func__);\n+\ttests++;\n+\n+\t/* First create a netscape cookie cache object */\n+\n+\tmemset(\u0026ci, 0, sizeof(ci));\n+\tci.cx \u003d cx;\n+\tci.ops \u003d \u0026lws_cache_ops_nscookiejar;\n+\tci.name \u003d \u0022NSC\u0022;\n+\tci.u.nscookiejar.filepath \u003d \u0022./cookies.txt\u0022;\n+\n+\tnsc \u003d lws_cache_create(\u0026ci);\n+\tif (!nsc)\n+\t\tgoto cdone;\n+\n+\t/* Then a heap cache \u0022L1\u0022 as a child of nsc */\n+\n+\tci.ops \u003d \u0026lws_cache_ops_heap;\n+\tci.name \u003d \u0022L1\u0022;\n+\tci.parent \u003d nsc;\n+\n+\tl1 \u003d lws_cache_create(\u0026ci);\n+\tif (!l1)\n+\t\tgoto cdone;\n+\n+\tlws_cache_debug_dump(nsc);\n+\tlws_cache_debug_dump(l1);\n+\n+\tlwsl_user(\u0022%s: add cookies to L1\u005cn\u0022, __func__);\n+\n+\t/* add three cookies */\n+\n+\tif (lws_cache_write_through(l1, tag_cookie1,\n+\t\t\t\t (const uint8_t *)cookie1, strlen(cookie1),\n+\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC, NULL)) {\n+\t\tlwsl_err(\u0022%s: write1 failed\u005cn\u0022, __func__);\n+\t\tgoto cdone;\n+\t}\n+\n+\tlws_cache_debug_dump(nsc);\n+\tlws_cache_debug_dump(l1);\n+\n+\tif (lws_cache_write_through(l1, tag_cookie2,\n+\t\t\t\t (const uint8_t *)cookie2, strlen(cookie2),\n+\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {\n+\t\tlwsl_err(\u0022%s: write2 failed\u005cn\u0022, __func__);\n+\t\tgoto cdone;\n+\t}\n+\n+\tlws_cache_debug_dump(nsc);\n+\tlws_cache_debug_dump(l1);\n+\n+\tif (lws_cache_write_through(l1, tag_cookie3,\n+\t\t\t\t (const uint8_t *)cookie3, strlen(cookie3),\n+\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {\n+\t\tlwsl_err(\u0022%s: write3 failed\u005cn\u0022, __func__);\n+\t\tgoto cdone;\n+\t}\n+\n+\tlws_cache_debug_dump(nsc);\n+\tlws_cache_debug_dump(l1);\n+\n+\tlwsl_user(\u0022%s: check cookies in L1\u005cn\u0022, __func__);\n+\n+\t/* confirm that the cookies are individually in L1 */\n+\n+\tif (lws_cache_item_get(l1, tag_cookie1, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d strlen(cookie1) || memcmp(po, cookie1, size)) {\n+\t\tlwsl_err(\u0022%s: L1 '%s' missing, size %llu, po %s\u005cn\u0022, __func__,\n+\t\t\t tag_cookie1, (unsigned long long)size, po);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (lws_cache_item_get(l1, tag_cookie2, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d strlen(cookie2) || memcmp(po, cookie2, size)) {\n+\t\tlwsl_err(\u0022%s: L1 '%s' missing\u005cn\u0022, __func__, tag_cookie2);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (lws_cache_item_get(l1, tag_cookie3, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d strlen(cookie3) || memcmp(po, cookie3, size)) {\n+\t\tlwsl_err(\u0022%s: L1 '%s' missing\u005cn\u0022, __func__, tag_cookie3);\n+\t\tgoto cdone;\n+\t}\n+\n+\t/* confirm that the cookies are individually in L2 / NSC... normally\n+\t * we don't do this but check via L1 so we can get it from there if\n+\t * present. But as a unit test, we want to make sure it's in L2 / NSC\n+\t */\n+\n+\tlwsl_user(\u0022%s: check cookies written thru to NSC\u005cn\u0022, __func__);\n+\n+\tif (lws_cache_item_get(nsc, tag_cookie1, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d strlen(cookie1) || memcmp(po, cookie1, size)) {\n+\t\tlwsl_err(\u0022%s: NSC '%s' missing, size %llu, po %s\u005cn\u0022, __func__,\n+\t\t\t tag_cookie1, (unsigned long long)size, po);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (lws_cache_item_get(nsc, tag_cookie2, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d strlen(cookie2) || memcmp(po, cookie2, size)) {\n+\t\tlwsl_err(\u0022%s: NSC '%s' missing\u005cn\u0022, __func__, tag_cookie2);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (lws_cache_item_get(nsc, tag_cookie3, (const void **)\u0026po, \u0026size) ||\n+\t size !\u003d strlen(cookie3) || memcmp(po, cookie3, size)) {\n+\t\tlwsl_err(\u0022%s: NSC '%s' missing\u005cn\u0022, __func__, tag_cookie3);\n+\t\tgoto cdone;\n+\t}\n+\n+\t/* let's do a lookup with no results */\n+\n+\tlwsl_user(\u0022%s: nonexistant get must not pass\u005cn\u0022, __func__);\n+\n+\tif (!lws_cache_item_get(l1, \u0022x.com|y|z\u0022, (const void **)\u0026po, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: nonexistant found size %llu, po %s\u005cn\u0022, __func__,\n+\t\t\t (unsigned long long)size, po);\n+\t\tgoto cdone;\n+\t}\n+\n+\t/*\n+\t * let's try some url paths and check we get the right results set...\n+\t * for / and any cookie, we expect only c1 and c3 to be listed\n+\t */\n+\n+\tlwsl_user(\u0022%s: wildcard lookup 1\u005cn\u0022, __func__);\n+\n+\tn \u003d lws_cache_lookup(l1, \u0022host.com|/|*\u0022,\n+\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n+\t\tgoto cdone;\n+\t}\n+\tlwsl_hexdump_notice(cr.ptr, size);\n+\n+\tif (cr.size !\u003d 53)\n+\t\tgoto cdone;\n+\n+\twhile (!lws_cache_results_walk(\u0026cr))\n+\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n+\t\t\t\t\t (int)cr.payload_len);\n+\n+\t/*\n+\t * for /xxx and any cookie, we expect all 3 listed\n+\t */\n+\n+\tlwsl_user(\u0022%s: wildcard lookup 2\u005cn\u0022, __func__);\n+\n+\tn \u003d lws_cache_lookup(l1, \u0022host.com|/xxx|*\u0022,\n+\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (cr.size !\u003d 84)\n+\t\tgoto cdone;\n+\n+\twhile (!lws_cache_results_walk(\u0026cr))\n+\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n+\t\t\t\t\t (int)cr.payload_len);\n+\n+\t/*\n+\t * for /yyyy and any cookie, we expect only c1 and c3\n+\t */\n+\n+\tlwsl_user(\u0022%s: wildcard lookup 3\u005cn\u0022, __func__);\n+\n+\tn \u003d lws_cache_lookup(l1, \u0022host.com|/yyyy|*\u0022,\n+\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (cr.size !\u003d 53)\n+\t\tgoto cdone;\n+\n+\twhile (!lws_cache_results_walk(\u0026cr))\n+\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n+\t\t\t\t\t (int)cr.payload_len);\n+\n+\t/*\n+\t * repeat the above test, results should come from cache\n+\t */\n+\n+\tlwsl_user(\u0022%s: wildcard lookup 4\u005cn\u0022, __func__);\n+\n+\tn \u003d lws_cache_lookup(l1, \u0022host.com|/yyyy|*\u0022,\n+\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (cr.size !\u003d 53)\n+\t\tgoto cdone;\n+\n+\twhile (!lws_cache_results_walk(\u0026cr))\n+\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n+\t\t\t\t\t (int)cr.payload_len);\n+\n+\t/* now let's try deleting cookie 1 */\n+\n+\tif (lws_cache_item_remove(l1, tag_cookie1))\n+\t\tgoto cdone;\n+\n+\tlws_cache_debug_dump(nsc);\n+\tlws_cache_debug_dump(l1);\n+\n+\t/* with c1 gone, we should only get c3 */\n+\n+\tlwsl_user(\u0022%s: wildcard lookup 5\u005cn\u0022, __func__);\n+\n+\tn \u003d lws_cache_lookup(l1, \u0022host.com|/|*\u0022,\n+\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (cr.size !\u003d 25)\n+\t\tgoto cdone;\n+\n+\twhile (!lws_cache_results_walk(\u0026cr))\n+\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n+\t\t\t\t\t (int)cr.payload_len);\n+\n+\t/*\n+\t * let's add a fourth cookie (third in cache now we deleted one)\n+\t */\n+\n+\tif (lws_cache_write_through(l1, tag_cookie4,\n+\t\t\t\t (const uint8_t *)cookie4, strlen(cookie4),\n+\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {\n+\t\tlwsl_err(\u0022%s: write4 failed\u005cn\u0022, __func__);\n+\t\tgoto cdone;\n+\t}\n+\n+\t/*\n+\t * for /yy and any cookie, we expect only c3\n+\t */\n+\n+\tlwsl_user(\u0022%s: wildcard lookup 6\u005cn\u0022, __func__);\n+\n+\tn \u003d lws_cache_lookup(l1, \u0022host.com|/yy|*\u0022,\n+\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (cr.size !\u003d 25)\n+\t\tgoto cdone;\n+\n+\twhile (!lws_cache_results_walk(\u0026cr))\n+\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n+\t\t\t\t\t (int)cr.payload_len);\n+\n+\t/*\n+\t * for /yyy and any cookie, we expect c3 and c4\n+\t */\n+\n+\tlwsl_user(\u0022%s: wildcard lookup 7\u005cn\u0022, __func__);\n+\n+\tn \u003d lws_cache_lookup(l1, \u0022host.com|/yyy|*\u0022,\n+\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n+\t\tgoto cdone;\n+\t}\n+\n+\tif (cr.size !\u003d 57)\n+\t\tgoto cdone;\n+\n+\twhile (!lws_cache_results_walk(\u0026cr))\n+\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n+\t\t\t\t\t (int)cr.payload_len);\n+\n+\t/* that's ok then */\n+\n+\tlwsl_user(\u0022%s: done\u005cn\u0022, __func__);\n+\n+\tret \u003d 0;\n+\n+cdone:\n+\tlws_cache_destroy(\u0026nsc);\n+\tlws_cache_destroy(\u0026l1);\n+\n+\tif (ret)\n+\t\tlwsl_warn(\u0022%s: fail\u005cn\u0022, __func__);\n+\n+\treturn ret;\n+}\n+#endif\n+\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\n+\tlwsl_user(\u0022LWS API selftest: lws_cache\u005cn\u0022);\n+\n+\tcx \u003d lws_create_context(\u0026info);\n+\tif (!cx) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (test_just_l1())\n+\t\tfail++;\n+\tif (test_just_l1_limits())\n+\t\tfail++;\n+\n+#if defined(LWS_WITH_CACHE_NSCOOKIEJAR)\n+\tif (test_nsc1())\n+\t\tfail++;\n+#endif\n+\n+\tlws_context_destroy(cx);\n+\n+\tif (tests \u0026\u0026 !fail)\n+\t\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n+\telse\n+\t\tlwsl_err(\u0022Completed: FAIL %d / %d\u005cn\u0022, fail, tests);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_cache/text1.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/text1.txt\nnew file mode 100644\nindex 0000000..c4079a2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/text1.txt\n@@ -0,0 +1,3 @@\n+# Netscape HTTP Cookie File\n+host.com\tFALSE\t/\tFALSE\t1234\tmycookie\tvalue\n+host.com\tFALSE\t/xxx\tFALSE\t1234\tmycookie\tvaluexxx\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/CMakeLists.txt\nnew file mode 100644\nindex 0000000..59d08cd\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-api-test-lws_dsh C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-lws_dsh)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_NETWORK 1 requirements)\n+require_lws_config(LWS_WITH_LWS_DSH 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\tadd_test(NAME api-test-lws_dsh COMMAND lws-api-test-lws_dsh)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/README.md\nnew file mode 100644\nindex 0000000..f62a45a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/README.md\n@@ -0,0 +1,22 @@\n+# lws api test lws_dsh\n+\n+Demonstrates how to use and performs selftests for lws_dsh\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-lws_dsh\n+[2018/10/09 09:14:17:4834] USER: LWS API selftest: lws_dsh\n+[2018/10/09 09:14:17:4835] USER: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/main.c\nnew file mode 100644\nindex 0000000..3e938b2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/main.c\n@@ -0,0 +1,457 @@\n+/*\n+ * lws-api-test-lws_dsh\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+int\n+test1(void)\n+{\n+\tstruct lws_dsh *dsh;\n+\tsize_t size;\n+\tvoid *a1;\n+\n+\t/*\n+\t * test 1: single dsh, alloc 2 kinds and free everything back to a\n+\t * single free obj\n+\t */\n+\n+\tdsh \u003d lws_dsh_create(NULL, 16384, 2);\n+\tif (!dsh) {\n+\t\tlwsl_err(\u0022%s: Failed to create dsh\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello\u0022, 5, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 1\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 1, \u0022some other string\u0022, 17, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 2\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello again\u0022, 11, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 3\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_get_head(dsh, 1, \u0026a1, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: no head 1\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (size !\u003d 17 || memcmp(a1, \u0022some other string\u0022, 17)) {\n+\t\tlwsl_err(\u0022%s: test 1 mismatch\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tlws_dsh_free(\u0026a1);\n+\n+\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: no head 2\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (size !\u003d 5 || memcmp(a1, \u0022hello\u0022, 5)) {\n+\t\tlwsl_err(\u0022%s: test 2 mismatch\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tlws_dsh_free(\u0026a1);\n+\n+\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: no head 3\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (size !\u003d 11 || memcmp(a1, \u0022hello again\u0022, 11)) {\n+\t\tlwsl_err(\u0022%s: test 3 mismatch\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tlws_dsh_free(\u0026a1);\n+\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 0;\n+bail:\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 1;\n+}\n+\n+int\n+test3(void)\n+{\n+\tstruct lws_dsh *dsh, *dsh2;\n+\tlws_dll2_owner_t owner;\n+\tuint8_t blob[4096];\n+\n+\tmemset(blob, 0, sizeof(blob));\n+\n+\t/*\n+\t * test 3: multiple dsh, umeetable allocation request\n+\t */\n+\n+\tlws_dll2_owner_clear(\u0026owner);\n+\n+\tdsh \u003d lws_dsh_create(\u0026owner, 4096, 2);\n+\tif (!dsh) {\n+\t\tlwsl_err(\u0022%s: Failed to create dsh1\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tdsh2 \u003d lws_dsh_create(\u0026owner, 4096, 2);\n+\tif (!dsh2) {\n+\t\tlwsl_err(\u0022%s: Failed to create dsh2\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 0, blob, 4000, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 1\u005cn\u0022, __func__);\n+\n+\t\tgoto bail2;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh2, 0, \u0022hello\u0022, 5, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 2\u005cn\u0022, __func__);\n+\n+\t\tgoto bail2;\n+\t}\n+\n+\t/*\n+\t * There's just no room for this, we expect it to fail\n+\t */\n+\n+\tif (!lws_dsh_alloc_tail(dsh, 0, blob, 5000, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Didn't fail to alloc as expected\u005cn\u0022, __func__);\n+\n+\t\tgoto bail2;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh2, 0, \u0022hello again\u0022, 11, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 4\u005cn\u0022, __func__);\n+\n+\t\tgoto bail2;\n+\t}\n+\n+\tlws_dsh_destroy(\u0026dsh2);\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 0;\n+\n+bail2:\n+\tlws_dsh_destroy(\u0026dsh2);\n+\n+bail:\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 1;\n+}\n+\n+int\n+test4(void)\n+{\n+\tuint8_t blob[4096];\n+\tstruct lws_dsh *dsh;\n+\tsize_t size;\n+\tvoid *a1;\n+\n+\tmemset(blob, 0, sizeof(blob));\n+\n+\t/*\n+\t * test 4: use up whole free list, then recover and alloc something\n+\t *\t else\n+\t */\n+\n+\tdsh \u003d lws_dsh_create(NULL, 4096, 2);\n+\tif (!dsh) {\n+\t\tlwsl_err(\u0022%s: Failed to create dsh\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 0, blob, 4000, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 1\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: no head 1\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (size !\u003d 4000) {\n+\t\tlwsl_err(\u0022%s: test 1 mismatch %d\u005cn\u0022, __func__, (int)size);\n+\n+\t\tgoto bail;\n+\t}\n+\tlws_dsh_free(\u0026a1);\n+\n+\tif (lws_dsh_alloc_tail(dsh, 0, \u0022some other string\u0022, 17, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 2\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello again\u0022, 11, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 3\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: no head 4\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (size !\u003d 17 || memcmp(a1, \u0022some other string\u0022, 17)) {\n+\t\t/* it may (should...) coalesce */\n+\t\tif (size !\u003d 28 || memcmp(a1, \u0022some other stringhello again\u0022, 28)) {\n+\t\t\tlwsl_err(\u0022%s: test 4 mismatch %d\u005cn\u0022, __func__, (int)size);\n+\n+\t\t\tgoto bail;\n+\t\t}\n+\t}\n+\tlws_dsh_free(\u0026a1);\n+\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 0;\n+bail:\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 1;\n+}\n+\n+int\n+test5(void)\n+{\n+\tstruct lws_dsh *dsh;\n+\tunsigned int budget;\n+\tuint8_t blob[4096];\n+\tlws_xos_t xos;\n+\tsize_t size;\n+\tvoid *a1;\n+\n+\tmemset(blob, 0, sizeof(blob));\n+\tlws_xos_init(\u0026xos, 0x123456789abcdef0ull);\n+\n+\tbudget \u003d (unsigned int)(lws_xos(\u0026xos) % 4000) + 4000;\n+\n+\tlwsl_notice(\u0022%s: budget %u\u005cn\u0022, __func__, budget);\n+\n+\n+\t/*\n+\t * test 5: PRNG-based spamming and erratic bidi draining\n+\t */\n+\n+\tdsh \u003d lws_dsh_create(NULL, 409600, 2);\n+\tif (!dsh) {\n+\t\tlwsl_err(\u0022%s: Failed to create dsh\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tdo {\n+\n+\t\tif (lws_xos_percent(\u0026xos, 60)) {\n+\t\t\t/* kind 0 is going to try to write */\n+\n+\t\t\tsize \u003d (size_t)((lws_xos(\u0026xos) \u0026 127) + 1);\n+\n+\t\t\tif (!lws_dsh_alloc_tail(dsh, 0, blob, size, NULL, 0))\n+\t\t\t\tlwsl_notice(\u0022%s: kind 0 alloc %d\u005cn\u0022, __func__, (int)size);\n+\t\t}\n+\n+\t\tif (lws_xos_percent(\u0026xos, 80)) {\n+\t\t\t/* kind 1 is going to try to write */\n+\n+\t\t\tsize \u003d (size_t)((lws_xos(\u0026xos) \u0026 127) + 1);\n+\n+\t\t\tif (!lws_dsh_alloc_tail(dsh, 1, blob, size, NULL, 0))\n+\t\t\t\tlwsl_notice(\u0022%s: kind 1 alloc %d\u005cn\u0022, __func__, (int)size);\n+\t\t}\n+\n+\t\tif (lws_xos_percent(\u0026xos, 40)) {\n+\t\t\t/* kind 0 is going to try to read */\n+\n+\t\t\twhile (!lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n+\t\t\t\tlwsl_notice(\u0022%s: kind 0 read %d\u005cn\u0022, __func__, (int)size);\n+\t\t\t\tlws_dsh_free(\u0026a1);\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (lws_xos_percent(\u0026xos, 30)) {\n+\t\t\t/* kind 1 is going to try to read */\n+\n+\t\t\twhile (!lws_dsh_get_head(dsh, 1, \u0026a1, \u0026size)) {\n+\t\t\t\tlwsl_notice(\u0022%s: kind 1 read %d\u005cn\u0022, __func__, (int)size);\n+\t\t\t\tlws_dsh_free(\u0026a1);\n+\t\t\t}\n+\t\t}\n+\n+\t} while (budget--);\n+\n+\twhile (!lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n+\t\tlwsl_notice(\u0022%s: kind 0 read %d\u005cn\u0022, __func__, (int)size);\n+\t\tlws_dsh_free(\u0026a1);\n+\t}\n+\n+\twhile (!lws_dsh_get_head(dsh, 1, \u0026a1, \u0026size)) {\n+\t\tlwsl_notice(\u0022%s: kind 1 read %d\u005cn\u0022, __func__, (int)size);\n+\t\tlws_dsh_free(\u0026a1);\n+\t}\n+\n+#if defined(_DEBUG)\n+\tlws_dsh_describe(dsh, \u0022test dsh end state\u0022);\n+#endif\n+\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 0;\n+}\n+\n+int\n+test6(void)\n+{\n+\tstruct lws_dsh *dsh;\n+\tsize_t size;\n+\tvoid *a1;\n+\n+\t/*\n+\t * test 6: confirm sequential coalescing\n+\t */\n+\n+\tdsh \u003d lws_dsh_create(NULL, 16384, 2);\n+\tif (!dsh) {\n+\t\tlwsl_err(\u0022%s: Failed to create dsh\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello\u0022, 5, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 1\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 1, \u0022some other string\u0022, 17, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 2\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello again\u0022, 11, NULL, 0)) {\n+\t\tlwsl_err(\u0022%s: Failed to alloc 3\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_dsh_get_head(dsh, 1, \u0026a1, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: no head 1\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (size !\u003d 17 || memcmp(a1, \u0022some other string\u0022, 17)) {\n+\t\tlwsl_err(\u0022%s: test 1 mismatch\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tlws_dsh_free(\u0026a1);\n+\n+\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: no head 2\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (size !\u003d 5 || memcmp(a1, \u0022hello\u0022, 5)) {\n+\t\tlwsl_err(\u0022%s: test 2 mismatch\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tlws_dsh_free(\u0026a1);\n+\n+\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n+\t\tlwsl_err(\u0022%s: no head 3\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (size !\u003d 11 || memcmp(a1, \u0022hello again\u0022, 11)) {\n+\t\tlwsl_err(\u0022%s: test 3 mismatch\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tlws_dsh_free(\u0026a1);\n+\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 0;\n+bail:\n+#if defined(_DEBUG)\n+\tlws_dsh_describe(dsh, \u0022test6 fail\u0022);\n+#endif\n+\tlws_dsh_destroy(\u0026dsh);\n+\n+\treturn 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tint ret \u003d 0, n;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lws_dsh\u005cn\u0022);\n+\n+\tn \u003d test1();\n+\tlwsl_user(\u0022%s: test1: %d\u005cn\u0022, __func__, n);\n+\tret |\u003d n;\n+\tif (ret)\n+\t\tgoto bail;\n+\n+\tn \u003d test3();\n+\tlwsl_user(\u0022%s: test3: %d\u005cn\u0022, __func__, n);\n+\tret |\u003d n;\n+\tif (ret)\n+\t\tgoto bail;\n+\n+\tn \u003d test4();\n+\tlwsl_user(\u0022%s: test4: %d\u005cn\u0022, __func__, n);\n+\tret |\u003d n;\n+\tif (ret)\n+\t\tgoto bail;\n+\n+\tn \u003d test5();\n+\tlwsl_user(\u0022%s: test5: %d\u005cn\u0022, __func__, n);\n+\tret |\u003d n;\n+\tif (ret)\n+\t\tgoto bail;\n+\n+\tn \u003d test6();\n+\tlwsl_user(\u0022%s: test6: %d\u005cn\u0022, __func__, n);\n+\tret |\u003d n;\n+\n+bail:\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, ret ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n+\n+\treturn ret;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_map/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_map/CMakeLists.txt\nnew file mode 100644\nindex 0000000..897042c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_map/CMakeLists.txt\n@@ -0,0 +1,17 @@\n+project(lws-api-test-lws_map C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+\n+\n+\tadd_executable(${PROJECT_NAME} main.c)\n+\tadd_test(NAME api-test-lws_map COMMAND lws-api-test-lws_map)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_map/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_map/main.c\nnew file mode 100644\nindex 0000000..022c98a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_map/main.c\n@@ -0,0 +1,264 @@\n+/*\n+ * lws-api-test-lws_map\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * unit tests for lws_map\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+/* custom key and comparator for test 3 */\n+\n+typedef struct mykey {\n+\tint\t\t\tkey;\n+} mykey_t;\n+\n+static int\n+compare_mykey_t(const lws_map_key_t key1, size_t kl1,\n+\t\tconst lws_map_value_t key2, size_t kl2)\n+{\n+\tconst mykey_t *m1 \u003d (mykey_t *)key1, *m2 \u003d (mykey_t *)key2;\n+\n+\treturn m1-\u003ekey !\u003d m2-\u003ekey;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE,\n+\t\t\texpected \u003d 4, pass \u003d 0;\n+\tmykey_t k1 \u003d { .key \u003d 123 }, k2 \u003d { .key \u003d 234 }, k3 \u003d { .key \u003d 999 };\n+\tstruct lwsac *ac \u003d NULL;\n+\tlws_map_item_t *item;\n+\tlws_map_info_t info;\n+\tlws_map_t *map;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lws_map\u005cn\u0022);\n+\n+\t/* Test 1: string keys */\n+\n+\tlwsl_user(\u0022%s: test1\u005cn\u0022, __func__);\n+\tmemset(\u0026info, 0, sizeof(info));\n+\tmap \u003d lws_map_create(\u0026info);\n+\tif (!map) {\n+\t\te++;\n+\t\tgoto end_t1;\n+\t}\n+\tif (!lws_map_item_create_ks(map, \u0022abc\u0022, (lws_map_value_t)\u0022def\u0022, 3)) {\n+\t\te++;\n+\t\tgoto end_t1;\n+\t}\n+\tif (!lws_map_item_create_ks(map, \u0022123\u0022, (lws_map_value_t)\u00224567\u0022, 4)) {\n+\t\te++;\n+\t\tgoto end_t1;\n+\t}\n+\titem \u003d lws_map_item_lookup_ks(map, \u0022abc\u0022);\n+\tif (!item) {\n+\t\te++;\n+\t\tgoto end_t1;\n+\t}\n+\n+\tif (lws_map_item_value_len(item) !\u003d 3 ||\n+\t memcmp(lws_map_item_value(item), \u0022def\u0022, 3)) {\n+\t\te++;\n+\t\tgoto end_t1;\n+\t}\n+\n+\titem \u003d lws_map_item_lookup_ks(map, \u0022123\u0022);\n+\tif (!item) {\n+\t\te++;\n+\t\tgoto end_t1;\n+\t}\n+\n+\tif (lws_map_item_value_len(item) !\u003d 4 ||\n+\t memcmp(lws_map_item_value(item), \u00224567\u0022, 4)) {\n+\t\te++;\n+\t\tgoto end_t1;\n+\t}\n+\n+\titem \u003d lws_map_item_lookup_ks(map, \u0022nope\u0022);\n+\tif (item) {\n+\t\te++;\n+\t\tgoto end_t1;\n+\t}\n+\n+\tpass++;\n+\n+end_t1:\n+\tlws_map_destroy(\u0026map);\n+\n+\t/* Test 2: Use lwsac item allocators */\n+\n+\tlwsl_user(\u0022%s: test2\u005cn\u0022, __func__);\n+\tmemset(\u0026info, 0, sizeof(info));\n+\tinfo._alloc \u003d lws_map_alloc_lwsac;\n+\tinfo._free \u003d lws_map_free_lwsac;\n+\tinfo.opaque \u003d (void *)\u0026ac;\n+\n+\tmap \u003d lws_map_create(\u0026info);\n+\tif (!map) {\n+\t\te++;\n+\t\tgoto end_t2;\n+\t}\n+\tif (!lws_map_item_create_ks(map, \u0022abc\u0022, \u0022def\u0022, 3)) {\n+\t\te++;\n+\t\tgoto end_t2;\n+\t}\n+\tif (!lws_map_item_create_ks(map, \u0022123\u0022, \u00224567\u0022, 4)) {\n+\t\te++;\n+\t\tgoto end_t2;\n+\t}\n+\titem \u003d lws_map_item_lookup_ks(map, \u0022abc\u0022);\n+\tif (!item) {\n+\t\te++;\n+\t\tgoto end_t2;\n+\t}\n+\n+\tif (lws_map_item_value_len(item) !\u003d 3 ||\n+\t memcmp(lws_map_item_value(item), \u0022def\u0022, 3)) {\n+\t\te++;\n+\t\tgoto end_t2;\n+\t}\n+\n+\titem \u003d lws_map_item_lookup_ks(map, \u0022123\u0022);\n+\tif (!item) {\n+\t\te++;\n+\t\tgoto end_t2;\n+\t}\n+\n+\tif (lws_map_item_value_len(item) !\u003d 4 ||\n+\t memcmp(lws_map_item_value(item), \u00224567\u0022, 4)) {\n+\t\te++;\n+\t\tgoto end_t2;\n+\t}\n+\n+\titem \u003d lws_map_item_lookup_ks(map, \u0022nope\u0022);\n+\tif (item) {\n+\t\te++;\n+\t\tgoto end_t2;\n+\t}\n+\n+\tpass++;\n+\n+end_t2:\n+\tlws_map_destroy(\u0026map);\n+\tlwsac_free(\u0026ac);\n+\n+\t/* Test 3: custom key object and comparator */\n+\n+\tlwsl_user(\u0022%s: test3\u005cn\u0022, __func__);\n+\tmemset(\u0026info, 0, sizeof(info));\n+\tinfo._compare \u003d compare_mykey_t;\n+\n+\tmap \u003d lws_map_create(\u0026info);\n+\tif (!map) {\n+\t\te++;\n+\t\tgoto end_t3;\n+\t}\n+\tif (!lws_map_item_create(map, (lws_map_key_t)\u0026k1, sizeof(k1),\n+\t\t\t\t (lws_map_value_t)\u0022def\u0022, 3)) {\n+\t\tlwsl_err(\u0022%s: t3; a\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto end_t3;\n+\t}\n+\tif (!lws_map_item_create(map, (lws_map_key_t)\u0026k2, sizeof(k2),\n+\t\t\t\t (lws_map_value_t)\u00224567\u0022, 4)) {\n+\t\tlwsl_err(\u0022%s: t3; b\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto end_t3;\n+\t}\n+\titem \u003d lws_map_item_lookup(map, (lws_map_key_t)\u0026k1, sizeof(k1));\n+\tif (!item) {\n+\t\tlwsl_err(\u0022%s: t3; c\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto end_t3;\n+\t}\n+\n+\tif (lws_map_item_value_len(item) !\u003d 3 ||\n+\t memcmp(lws_map_item_value(item), \u0022def\u0022, 3)) {\n+\t\tlwsl_err(\u0022%s: t3; d\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto end_t3;\n+\t}\n+\n+\titem \u003d lws_map_item_lookup(map, (lws_map_key_t)\u0026k2, sizeof(k2));\n+\tif (!item) {\n+\t\tlwsl_err(\u0022%s: t3; e\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto end_t3;\n+\t}\n+\n+\tif (lws_map_item_value_len(item) !\u003d 4 ||\n+\t memcmp(lws_map_item_value(item), \u00224567\u0022, 4)) {\n+\t\tlwsl_err(\u0022%s: t3; f\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto end_t3;\n+\t}\n+\n+\titem \u003d lws_map_item_lookup(map, (lws_map_key_t)\u0026k3, sizeof(k3));\n+\tif (item) {\n+\t\tlwsl_err(\u0022%s: t3; g\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto end_t3;\n+\t}\n+\n+\tpass++;\n+\n+end_t3:\n+\tlws_map_destroy(\u0026map);\n+\n+\t/* Test 4: same key items */\n+\n+\tlwsl_user(\u0022%s: test4\u005cn\u0022, __func__);\n+\tmemset(\u0026info, 0, sizeof(info));\n+\tmap \u003d lws_map_create(\u0026info);\n+\tif (!map) {\n+\t\te++;\n+\t\tgoto end_t4;\n+\t}\n+\tif (!lws_map_item_create_ks(map, \u0022abc\u0022, (lws_map_value_t)\u0022def\u0022, 3)) {\n+\t\te++;\n+\t\tgoto end_t4;\n+\t}\n+\tif (!lws_map_item_create_ks(map, \u0022abc\u0022, (lws_map_value_t)\u00224567\u0022, 4)) {\n+\t\te++;\n+\t\tgoto end_t4;\n+\t}\n+\titem \u003d lws_map_item_lookup_ks(map, \u0022abc\u0022);\n+\tif (!item) {\n+\t\te++;\n+\t\tgoto end_t4;\n+\t}\n+\n+\tif (lws_map_item_value_len(item) !\u003d 4 ||\n+\t memcmp(lws_map_item_value(item), \u00224567\u0022, 4)) {\n+\t\te++;\n+\t\tgoto end_t4;\n+\t}\n+\n+\tpass++;\n+\n+end_t4:\n+\tlws_map_destroy(\u0026map);\n+\n+\tif (e)\n+\t\tgoto bail;\n+\n+\tlwsl_user(\u0022Completed: PASS %d / %d\u005cn\u0022, pass, expected);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_user(\u0022Completed: FAIL, passed %d / %d (e %d)\u005cn\u0022, pass,\n+\t\t\t\texpected, e);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/CMakeLists.txt\nnew file mode 100644\nindex 0000000..59333d8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-api-test-lws_sequencer C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-lws_sequencer)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SEQUENCER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/libwebsockets.org.cer b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/libwebsockets.org.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/libwebsockets.org.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/main.c\nnew file mode 100644\nindex 0000000..0db7f40\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/main.c\n@@ -0,0 +1,399 @@\n+/*\n+ * lws-api-test-lws_sequencer\n+ *\n+ * Written in 2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This api test uses the lws_sequencer api to make five http client requests\n+ * to libwebsockets.org in sequence, from inside the event loop. The fourth\n+ * fourth http client request is directed to port 22 where it stalls\n+ * triggering the lws_sequencer timeout flow. The fifth is given a nonexistant\n+ * dns name and is expected to fail.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, test_good \u003d 0;\n+\n+enum {\n+\tSEQ1,\n+\tSEQ2,\n+\tSEQ3_404,\n+\tSEQ4_TIMEOUT,\t\t/* we expect to timeout */\n+\tSEQ5_BAD_ADDRESS\t/* we expect the connection to fail */\n+};\n+\n+/*\n+ * This is the user defined struct whose space is allocated along with the\n+ * sequencer when that is created.\n+ *\n+ * You'd put everything your sequencer needs to do its job in here.\n+ */\n+\n+struct myseq {\n+\tstruct lws_vhost\t*vhost;\n+\tstruct lws\t\t*cwsi;\t/* client wsi for current step if any */\n+\n+\tint\t\t\tstate;\t/* which test we're on */\n+\tint\t\t\thttp_resp;\n+};\n+\n+/* sequencer messages specific to this sequencer */\n+\n+enum {\n+\tSEQ_MSG_CLIENT_FAILED \u003d LWSSEQ_USER_BASE,\n+\tSEQ_MSG_CLIENT_DONE,\n+};\n+\n+/* this is the sequence of GETs we will do */\n+\n+static const char *url_paths[] \u003d {\n+\t\u0022https://libwebsockets.org/index.html\u0022,\n+\t\u0022https://libwebsockets.org/lws.css\u0022,\n+\t\u0022https://libwebsockets.org/404.html\u0022,\n+\t\u0022https://libwebsockets.org:22\u0022,\t\t/* this causes us to time out */\n+\t\u0022https://doesntexist.invalid/\u0022\t\t/* fail early in connect */\n+};\n+\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+/*\n+ * This is the sequencer-aware http protocol handler. It monitors the client\n+ * http action and queues messages for the sequencer when something definitive\n+ * happens.\n+ */\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tstruct myseq *s \u003d (struct myseq *)user;\n+\tint seq_msg \u003d SEQ_MSG_CLIENT_FAILED;\n+\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_notice(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tgoto notify;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tif (!s)\n+\t\t\treturn 1;\n+\t\ts-\u003ehttp_resp \u003d (int)lws_http_client_http_response(wsi);\n+\t\tlwsl_info(\u0022Connected with server response: %d\u005cn\u0022, s-\u003ehttp_resp);\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_info(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+#if 0 /* enable to dump the html */\n+\t\t{\n+\t\t\tconst char *p \u003d in;\n+\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p \u003c 0x7f)\n+\t\t\t\t\tputchar(*p++);\n+\t\t\t\telse\n+\t\t\t\t\tputchar('.');\n+\t\t}\n+#endif\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP: wsi %p\u005cn\u0022,\n+\t\t\t wsi);\n+\t\tif (!s)\n+\t\t\treturn 1;\n+\t\t/*\n+\t\t * We got a definitive transaction completion\n+\t\t */\n+\t\tseq_msg \u003d SEQ_MSG_CLIENT_DONE;\n+\t\tgoto notify;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tlwsl_info(\u0022LWS_CALLBACK_CLOSED_CLIENT_HTTP\u005cn\u0022);\n+\t\tif (!s)\n+\t\t\treturn 1;\n+\n+\t\tlwsl_user(\u0022%s: wsi %p: seq failed at CLOSED_CLIENT_HTTP\u005cn\u0022,\n+\t\t\t __func__, wsi);\n+\t\tgoto notify;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+\n+notify:\n+\t/*\n+\t * We only inform the sequencer of a definitive outcome for our step.\n+\t *\n+\t * So once we have informed it, we detach ourselves from the sequencer\n+\t * and the sequencer from ourselves. Wsi may want to live on but after\n+\t * we got our result and moved on to the next test or completed, the\n+\t * sequencer doesn't want to hear from it again.\n+\t */\n+\tif (!s)\n+\t\treturn 1;\n+\n+\tlws_set_wsi_user(wsi, NULL);\n+\ts-\u003ecwsi \u003d NULL;\n+\tlws_seq_queue_event(lws_seq_from_user(s), seq_msg,\n+\t\t\t\t NULL, NULL);\n+\n+\treturn 0;\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{ \u0022seq-test-http\u0022, callback_http, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+\n+static int\n+sequencer_start_client(struct myseq *s)\n+{\n+\tstruct lws_client_connect_info i;\n+\tconst char *prot, *path1;\n+\tchar uri[128], path[128];\n+\tint n;\n+\n+\tlws_strncpy(uri, url_paths[s-\u003estate], sizeof(uri));\n+\n+\tmemset(\u0026i, 0, sizeof i);\n+\ti.context \u003d lws_seq_get_context(lws_seq_from_user(s));\n+\n+\tif (lws_parse_uri(uri, \u0026prot, \u0026i.address, \u0026i.port, \u0026path1)) {\n+\t\tlwsl_err(\u0022%s: uri error %s\u005cn\u0022, __func__, uri);\n+\t}\n+\n+\tif (!strcmp(prot, \u0022https\u0022))\n+\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\n+\tpath[0] \u003d '/';\n+\tn \u003d 1;\n+\tif (path1[0] \u003d\u003d '/')\n+\t\tn \u003d 0;\n+\tlws_strncpy(\u0026path[n], path1, sizeof(path) - 1);\n+\n+\ti.path \u003d path;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\ti.vhost \u003d s-\u003evhost;\n+\ti.userdata \u003d s;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\ti.local_protocol_name \u003d protocols[0].name;\n+\ti.pwsi \u003d \u0026s-\u003ecwsi;\n+\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tlwsl_notice(\u0022%s: connecting to %s://%s:%d%s failed\u005cn\u0022,\n+\t\t\t __func__, prot, i.address, i.port, path);\n+\n+\t\t/* we couldn't even get started with the client connection */\n+\n+\t\tlws_seq_queue_event(lws_seq_from_user(s),\n+\t\t\t\t (lws_seq_events_t)SEQ_MSG_CLIENT_FAILED, NULL, NULL);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tlws_seq_timeout_us(lws_seq_from_user(s), 3 * LWS_US_PER_SEC);\n+\n+\tlwsl_notice(\u0022%s: wsi %p: connecting to %s://%s:%d%s\u005cn\u0022, __func__,\n+\t\t s-\u003ecwsi, prot, i.address, i.port, path);\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * The sequencer callback handles queued sequencer messages in the order they\n+ * were queued. The messages are presented from the event loop thread context\n+ * even if they were queued from a different thread.\n+ */\n+\n+static lws_seq_cb_return_t\n+sequencer_cb(struct lws_sequencer *seq, void *user, int event,\n+\t void *data, void *aux)\n+{\n+\tstruct myseq *s \u003d (struct myseq *)user;\n+\n+\tswitch ((int)event) {\n+\tcase LWSSEQ_CREATED: /* our sequencer just got started */\n+\t\ts-\u003estate \u003d SEQ1; /* first thing we'll do is the first url */\n+\t\tgoto step;\n+\n+\tcase LWSSEQ_DESTROYED:\n+\t\t/*\n+\t\t * This sequencer is about to be destroyed. If we have any\n+\t\t * other assets in play, detach them from us.\n+\t\t */\n+\t\tif (s-\u003ecwsi)\n+\t\t\tlws_set_wsi_user(s-\u003ecwsi, NULL);\n+\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWSSEQ_TIMED_OUT: /* current step timed out */\n+\t\tif (s-\u003estate \u003d\u003d SEQ4_TIMEOUT) {\n+\t\t\tlwsl_user(\u0022%s: test %d got expected timeout\u005cn\u0022,\n+\t\t\t\t __func__, s-\u003estate);\n+\t\t\tgoto done;\n+\t\t}\n+\t\tlwsl_user(\u0022%s: seq timed out at step %d\u005cn\u0022, __func__, s-\u003estate);\n+\t\treturn LWSSEQ_RET_DESTROY;\n+\n+\tcase SEQ_MSG_CLIENT_FAILED:\n+\t\tif (s-\u003estate \u003d\u003d SEQ5_BAD_ADDRESS) {\n+\t\t\t/*\n+\t\t\t * in this specific case, we expect to fail\n+\t\t\t */\n+\t\t\tlwsl_user(\u0022%s: test %d failed as expected\u005cn\u0022,\n+\t\t\t\t __func__, s-\u003estate);\n+\t\t\tgoto done;\n+\t\t}\n+\n+\t\tlwsl_user(\u0022%s: seq failed at step %d\u005cn\u0022, __func__, s-\u003estate);\n+\n+\t\treturn LWSSEQ_RET_DESTROY;\n+\n+\tcase SEQ_MSG_CLIENT_DONE:\n+\t\tif (s-\u003estate \u003e\u003d SEQ4_TIMEOUT) {\n+\t\t\t/*\n+\t\t\t * In these specific cases, done would be a failure,\n+\t\t\t * we expected to timeout or fail\n+\t\t\t */\n+\t\t\tlwsl_user(\u0022%s: seq failed at step %d\u005cn\u0022, __func__,\n+\t\t\t\t s-\u003estate);\n+\n+\t\t\treturn LWSSEQ_RET_DESTROY;\n+\t\t}\n+\t\tlwsl_user(\u0022%s: seq done step %d (resp %d)\u005cn\u0022, __func__,\n+\t\t\t s-\u003estate, s-\u003ehttp_resp);\n+\n+done:\n+\t\tlws_seq_timeout_us(lws_seq_from_user(s), LWSSEQTO_NONE);\n+\t\ts-\u003estate++;\n+\t\tif (s-\u003estate \u003d\u003d LWS_ARRAY_SIZE(url_paths)) {\n+\t\t\t/* the sequence has completed */\n+\t\t\tlwsl_user(\u0022%s: sequence completed OK\u005cn\u0022, __func__);\n+\n+\t\t\ttest_good \u003d 1;\n+\n+\t\t\treturn LWSSEQ_RET_DESTROY;\n+\t\t}\n+\n+step:\n+\t\tsequencer_start_client(s);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSEQ_RET_CONTINUE;\n+}\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tint n \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tstruct lws_sequencer *seq;\n+\tstruct lws_vhost *vh;\n+\tlws_seq_info_t i;\n+\tstruct myseq *s;\n+\tconst char *p;\n+\n+\t/* the normal lws init */\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lws_sequencer\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\tinfo.protocols \u003d protocols;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./libwebsockets.org.cer\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tvh \u003d lws_create_vhost(context, \u0026info);\n+\tif (!vh) {\n+\t\tlwsl_err(\u0022Failed to create first vhost\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/*\n+\t * Create the sequencer... when the event loop starts, it will\n+\t * receive the LWSSEQ_CREATED callback\n+\t */\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\ti.context \u003d context;\n+\ti.user_size \u003d sizeof(struct myseq);\n+\ti.puser \u003d (void **)\u0026s;\n+\ti.cb \u003d sequencer_cb;\n+\ti.name \u003d \u0022seq\u0022;\n+\n+\tseq \u003d lws_seq_create(\u0026i);\n+\tif (!seq) {\n+\t\tlwsl_err(\u0022%s: unable to create sequencer\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\ts-\u003evhost \u003d vh;\n+\n+\t/* the usual lws event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail1:\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, !test_good ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn !test_good;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_smd/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_smd/CMakeLists.txt\nnew file mode 100644\nindex 0000000..4926362\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_smd/CMakeLists.txt\n@@ -0,0 +1,28 @@\n+project(lws-api-test-lws_smd C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_WITH_SYS_SMD 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${PROJECT_NAME} main.c)\n+\tadd_test(NAME api-test-lws_smd COMMAND lws-api-test-lws_smd -d1151)\n+\tset_tests_properties(api-test-lws_smd\n+\t\t\t PROPERTIES\n+\t\t\t RUN_SERIAL TRUE\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/api-tests/api-test-lws_smd\n+\t\t\t TIMEOUT 60)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_smd/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_smd/main.c\nnew file mode 100644\nindex 0000000..b3f8bd5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_smd/main.c\n@@ -0,0 +1,313 @@\n+/*\n+ * lws-api-test-lws_smd\n+ *\n+ * Written in 2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This api test confirms lws_smd System Message Distribution\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#define HAVE_STRUCT_TIMESPEC\n+#include \u003cpthread.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, ok, fail, _exp \u003d 111;\n+static unsigned int how_many_msg \u003d 100, usec_interval \u003d 1000;\n+static lws_sorted_usec_list_t sul, sul_initial_drain;\n+struct lws_context *context;\n+static pthread_t thread_spam;\n+\n+static void\n+timeout_cb(lws_sorted_usec_list_t *sul)\n+{\n+\t/* We should have completed the test before this fires */\n+\tlwsl_notice(\u0022%s: test period finished\u005cn\u0022, __func__);\n+\tinterrupted \u003d 1;\n+\tlws_cancel_service(context);\n+}\n+\n+static int\n+smd_cb1int(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,\n+\t void *buf, size_t len)\n+{\n+#if 0\n+\tlwsl_notice(\u0022%s: ts %llu, len %d\u005cn\u0022, __func__,\n+\t\t (unsigned long long)timestamp, (int)len);\n+\tlwsl_hexdump_notice(buf, len);\n+#endif\n+\tok++;\n+\n+\treturn 0;\n+}\n+\n+static int\n+smd_cb2int(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,\n+\t void *buf, size_t len)\n+{\n+#if 0\n+\tlwsl_notice(\u0022%s: ts %llu, len %d\u005cn\u0022, __func__,\n+\t\t (unsigned long long)timestamp, (int)len);\n+\tlwsl_hexdump_notice(buf, len);\n+#endif\n+\tok++;\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * This is used in an smd participant that is deregistered before the message\n+ * can be delivered, it should never see any message\n+ */\n+\n+static int\n+smd_cb3int(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,\n+\t void *buf, size_t len)\n+{\n+\tlwsl_err(\u0022%s: Countermanded ts %llu, len %d\u005cn\u0022, __func__,\n+\t\t (unsigned long long)timestamp, (int)len);\n+\tlwsl_hexdump_err(buf, len);\n+\n+\tfail++;\n+\n+\treturn 0;\n+}\n+\n+static void *\n+_thread_spam(void *d)\n+{\n+#if defined(WIN32)\n+\tunsigned int mypid \u003d 0;\n+#else\n+\tunsigned int mypid \u003d (unsigned int)getpid();\n+#endif\n+\tunsigned int n \u003d 0, atm \u003d 0;\n+\n+\twhile (n++ \u003c how_many_msg) {\n+\n+\t\tatm++;\n+\t\tif (lws_smd_msg_printf(context, LWSSMDCL_SYSTEM_STATE,\n+\t\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022state\u005c\u0022,\u0022\n+\t\t\t\t\t\t\u0022\u005c\u0022pid\u005c\u0022:%u,\u0022\n+\t\t\t\t\t\t\u0022\u005c\u0022msg\u005c\u0022:%d}\u0022,\n+\t\t\t\t\t mypid, (unsigned int)n)) {\n+\t\t\tlwsl_err(\u0022%s: send attempt %d failed\u005cn\u0022, __func__, atm);\n+\t\t\tn--;\n+\t\t\tfail++;\n+\t\t\tif (fail \u003e\u003d 3) {\n+\t\t\t\tinterrupted \u003d 1;\n+\t\t\t\tlws_cancel_service(context);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+#if defined(WIN32)\n+\t\tSleep(3);\n+#else\n+\t\tusleep(usec_interval);\n+#endif\n+\t}\n+#if !defined(WIN32)\n+\tpthread_exit(NULL);\n+#endif\n+\n+\treturn NULL;\n+}\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static void\n+drained_cb(lws_sorted_usec_list_t *sul)\n+{\n+\t/*\n+\t * spawn the test thread, it's going to spam 100 messages at 3ms\n+\t * intervals... check we got everything\n+\t */\n+\n+\tif (pthread_create(\u0026thread_spam, NULL, _thread_spam, NULL))\n+\t\tlwsl_err(\u0022%s: failed to create the spamming thread\u005cn\u0022, __func__);\n+}\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\t// struct lws_context *context \u003d mgr-\u003eparent;\n+\tint n;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL || target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\t/*\n+\t * Overflow the message queue too see if it handles it well, both\n+\t * as overflowing and in recovery. These are all still going into the\n+\t * smd buffer dll2, since we don't break for the event loop to have a\n+\t * chance to deliver them.\n+\t */\n+\n+\tn \u003d 0;\n+\twhile (n++ \u003c 100)\n+\t\tif (lws_smd_msg_printf(context, LWSSMDCL_SYSTEM_STATE,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022state\u005c\u0022,\u005c\u0022test\u005c\u0022:\u005c\u0022overflow\u005c\u0022}\u0022))\n+\t\t\tbreak;\n+\n+\tlwsl_notice(\u0022%s: overflow test added %d messages\u005cn\u0022, __func__, n);\n+\tif (n \u003d\u003d 100) {\n+\t\tlwsl_err(\u0022%s: didn't overflow\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t\treturn 1;\n+\t}\n+\n+\t/*\n+\t * So we have some normal messages from earlier and now the rest of the\n+\t * smd buffer filled with junk overflow messages. Before we start the\n+\t * actual spamming test from another thread, we need to return to the\n+\t * event loop so these can be cleared first.\n+\t */\n+\n+\tlws_sul_schedule(context, 0, \u0026sul_initial_drain, drained_cb,\n+\t\t\t 5 * LWS_US_PER_MS);\n+\n+\n+\tlwsl_info(\u0022%s: operational\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+}\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_smd_peer *userreg;\n+\tconst char *p;\n+\tvoid *retval;\n+\n+\t/* the normal lws init */\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--count\u0022)))\n+\t\thow_many_msg \u003d (unsigned int)atol(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--interval\u0022)))\n+\t\tusec_interval \u003d (unsigned int)atol(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lws_smd: %u msgs at %uus interval\u005cn\u0022,\n+\t\t\thow_many_msg, usec_interval);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.register_notifier_list \u003d na;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* game over after this long */\n+\n+\tlws_sul_schedule(context, 0, \u0026sul, timeout_cb,\n+\t\t\t (how_many_msg * (usec_interval + 1000)) + (4 * LWS_US_PER_SEC));\n+\n+\t/* register a messaging participant to hear INTERACTION class */\n+\n+\tif (!lws_smd_register(context, NULL, 0, LWSSMDCL_INTERACTION,\n+\t\t\t smd_cb1int)) {\n+\t\tlwsl_err(\u0022%s: smd register 1 failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* register a messaging participant to hear SYSTEM_STATE class */\n+\n+\tif (!lws_smd_register(context, NULL, 0, LWSSMDCL_SYSTEM_STATE,\n+\t\t\t smd_cb2int)) {\n+\t\tlwsl_err(\u0022%s: smd register 2 failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* temporarily register a messaging participant to hear a user class */\n+\n+\tuserreg \u003d lws_smd_register(context, NULL, 0, 1 \u003c\u003c LWSSMDCL_USER_BASE_BITNUM,\n+\t\t\t smd_cb3int);\n+\tif (!userreg) {\n+\t\tlwsl_err(\u0022%s: smd register userclass failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * The event loop isn't started yet, so these smd messages are getting\n+\t * buffered. Later we will deliberately overrun the buffer and wait\n+\t * for that to be cleared before the spam thread test.\n+\t */\n+\n+\t/* generate an INTERACTION class message */\n+\n+\tif (lws_smd_msg_printf(context, LWSSMDCL_INTERACTION,\n+\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022interaction\u005c\u0022}\u0022)) {\n+\t\tlwsl_err(\u0022%s: problem sending smd\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* generate a SYSTEM_STATE class message */\n+\n+\tif (lws_smd_msg_printf(context, LWSSMDCL_SYSTEM_STATE,\n+\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022state\u005c\u0022}\u0022)) {\n+\t\tlwsl_err(\u0022%s: problem sending smd\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* no participant listens for this class, so it should be skipped */\n+\n+\tif (lws_smd_msg_printf(context, LWSSMDCL_NETWORK, \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022network\u005c\u0022}\u0022)) {\n+\t\tlwsl_err(\u0022%s: problem sending smd\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* generate a user class message... */\n+\n+\tif (lws_smd_msg_printf(context, 1 \u003c\u003c LWSSMDCL_USER_BASE_BITNUM,\n+\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022userclass\u005c\u0022}\u0022)) {\n+\t\tlwsl_err(\u0022%s: problem sending smd\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * ... and screw that user class message up by deregistering the only\n+\t * handler before it can deliver it... it should not get delivered\n+\t * and cleanly discarded\n+\t */\n+\n+\tlws_smd_unregister(userreg);\n+\n+\t/* the usual lws event loop */\n+\n+\twhile (!interrupted \u0026\u0026 lws_service(context, 0) \u003e\u003d 0)\n+\t\t;\n+\n+\tpthread_join(thread_spam, \u0026retval);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\tif (fail || ok \u003e\u003d _exp)\n+\t\tlwsl_user(\u0022Completed: PASS: %d / %d, FAIL: %d\u005cn\u0022, ok, _exp,\n+\t\t\t\tfail);\n+\telse\n+\t\tlwsl_user(\u0022Completed: ALL PASS: %d / %d\u005cn\u0022, ok, _exp);\n+\n+\treturn !(ok \u003e\u003d _exp \u0026\u0026 !fail);\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/CMakeLists.txt\nnew file mode 100644\nindex 0000000..9068028\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-api-test-lws_struct-json C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-lws_struct-json)\n+set(SRCS main.c test2.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_STRUCT_JSON 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\tadd_test(NAME api-test-lws_struct-json COMMAND lws-api-test-lws_struct-json)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/README.md\nnew file mode 100644\nindex 0000000..f21ba78\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/README.md\n@@ -0,0 +1,108 @@\n+# lws api test lws_struct JSON\n+\n+Demonstrates how to use and performs selftests for lws_struct\n+JSON serialization and deserialization\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-lws_struct-json\n+[2020/05/21 16:36:57:0808] U: LWS API selftest: lws_struct JSON\n+[2020/05/21 16:36:57:1188] N: main: ++++++++++++++++ test 1\n+[2020/05/21 16:36:57:1291] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1387] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n+[2020/05/21 16:36:57:1429] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n+[2020/05/21 16:36:57:1467] N: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (2)\n+[2020/05/21 16:36:57:1490] N: target.name 'target1' (target 0x509fe30)\n+[2020/05/21 16:36:57:1495] N: target.name 'target2' (target 0x509fe68)\n+[2020/05/21 16:36:57:1500] N: main: .... strarting serialization of test 1\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022,\u0022someflag\u0022:true},{\u0022name\u0022:\u0022target2\u0022,\u0022someflag\u0022:false}]}\n+[2020/05/21 16:36:57:1648] N: main: ++++++++++++++++ test 2\n+[2020/05/21 16:36:57:1649] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1650] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n+[2020/05/21 16:36:57:1651] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n+[2020/05/21 16:36:57:1652] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n+[2020/05/21 16:36:57:1653] N: builder.hostname \u003d 'learn', timeout \u003d 0, targets (3)\n+[2020/05/21 16:36:57:1653] N: target.name 'target1' (target 0x50a0660)\n+[2020/05/21 16:36:57:1654] N: target.name 'target2' (target 0x50a0698)\n+[2020/05/21 16:36:57:1655] N: target.name 'target3' (target 0x50a06d0)\n+[2020/05/21 16:36:57:1655] N: main: .... strarting serialization of test 2\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:0,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022,\u0022someflag\u0022:false},{\u0022name\u0022:\u0022target2\u0022,\u0022someflag\u0022:false},{\u0022name\u0022:\u0022target3\u0022,\u0022someflag\u0022:false}]}\n+[2020/05/21 16:36:57:1662] N: main: ++++++++++++++++ test 3\n+[2020/05/21 16:36:57:1663] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1664] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n+[2020/05/21 16:36:57:1671] N: lws_struct_default_lejp_cb: created 'child' object size 8\n+[2020/05/21 16:36:57:1685] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n+[2020/05/21 16:36:57:1685] N: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (2)\n+[2020/05/21 16:36:57:1686] N: target.name 'target1' (target 0x50a0a50)\n+[2020/05/21 16:36:57:1687] N: child 0x50a0a88, target.child.somename 'abc'\n+[2020/05/21 16:36:57:1688] N: target.name 'target2' (target 0x50a0a98)\n+[2020/05/21 16:36:57:1688] N: main: .... strarting serialization of test 3\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022,\u0022someflag\u0022:false,\u0022child\u0022:{\u0022somename\u0022:\u0022abc\u0022}},{\u0022name\u0022:\u0022target2\u0022,\u0022someflag\u0022:false}]}\n+[2020/05/21 16:36:57:1697] N: main: ++++++++++++++++ test 4\n+[2020/05/21 16:36:57:1698] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1699] N: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (0)\n+[2020/05/21 16:36:57:1699] N: main: .... strarting serialization of test 4\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800}\n+[2020/05/21 16:36:57:1701] N: main: ++++++++++++++++ test 5\n+[2020/05/21 16:36:57:1702] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1707] N: builder.hostname \u003d '', timeout \u003d 0, targets (0)\n+[2020/05/21 16:36:57:1708] N: main: .... strarting serialization of test 5\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022\u0022,\u0022nspawn_timeout\u0022:0}\n+[2020/05/21 16:36:57:1709] N: main: ++++++++++++++++ test 6\n+[2020/05/21 16:36:57:1710] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1730] N: builder.hostname \u003d 'PYvtan6kqppjnS0KpYTCaiOLsJkc7Xe', timeout \u003d 0, targets (0)\n+[2020/05/21 16:36:57:1731] N: main: .... strarting serialization of test 6\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7Xe\u0022,\u0022nspawn_timeout\u0022:0}\n+[2020/05/21 16:36:57:1732] N: main: ++++++++++++++++ test 7\n+[2020/05/21 16:36:57:1732] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1733] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n+[2020/05/21 16:36:57:1739] N: builder.hostname \u003d '', timeout \u003d 0, targets (1)\n+[2020/05/21 16:36:57:1751] N: target.name 'PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6AzefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr53FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV8sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIGJYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkGLUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MWv+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsYVkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yuyJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx+z3f+jTFM/aon5...\n+[2020/05/21 16:36:57:1752] N: main: .... strarting serialization of test 7\n+{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022\u0022,\u0022nspawn_timeout\u0022:0,\u0022targets\u0022:[{\u0022name\u0022:\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6AzefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr53FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV8sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIGJYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkGLUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MWv+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsYVkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yuyJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u0022,\u0022someflag\u0022:false}]}\n+[2020/05/21 16:36:57:1756] N: main: ++++++++++++++++ test 8\n+[2020/05/21 16:36:57:1758] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1761] N: other.name \u003d 'somename'\n+[2020/05/21 16:36:57:1763] N: main: .... strarting serialization of test 8\n+{\u0022schema\u0022:\u0022com-warmcat-sai-other\u0022,\u0022name\u0022:\u0022somename\u0022}\n+{\u0022schema\u0022:\u0022meta.schema\u0022,\u0022t\u0022:{\u0022name\u0022:\u0022mytargetname\u0022,\u0022someflag\u0022:false},\u0022e\u0022:{\u0022hostname\u0022:\u0022myhostname\u0022,\u0022nspawn_timeout\u0022:0}}\n+[2020/05/21 16:36:57:1785] N: Test set 2\n+[2020/05/21 16:36:57:1791] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1795] N: Test set 2: 6: 071ab46ab4296e5de674c628fec17c55088254679f7714ad991f8c4873dca\n+[2020/05/21 16:36:57:1801] N: test2: start \n+[2020/05/21 16:36:57:1811] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n+[2020/05/21 16:36:57:1815] N: lws_struct_default_lejp_cb: created 'config' object size 80\n+[2020/05/21 16:36:57:1819] N: lws_struct_default_lejp_cb: created 'creds' object size 16\n+[2020/05/21 16:36:57:1833] N: lws_struct_default_lejp_cb: created 'config' object size 80\n+[2020/05/21 16:36:57:1834] N: lws_struct_default_lejp_cb: created 'creds' object size 16\n+[2020/05/21 16:36:57:1837] N: test2: lejp_parse 0\n+[2020/05/21 16:36:57:1841] N: t2_configs_dump: number of configs: 2\n+[2020/05/21 16:36:57:1844] N: t2_config_dump: id1 '(null)'\n+[2020/05/21 16:36:57:1846] N: t2_config_dump: arg1 'val1'\n+[2020/05/21 16:36:57:1848] N: t2_config_dump: ssid '\u0022nw2\u0022'\n+[2020/05/21 16:36:57:1850] N: t2_config_dump: freq 0\n+[2020/05/21 16:36:57:1852] N: t2_config_dump: arg2 0\n+[2020/05/21 16:36:57:1854] N: t2_config_dump: priority 1\n+[2020/05/21 16:36:57:1856] N: t2_config_dump: key1: \u0022xxxxxxxxx\u0022, key2: (null)\n+[2020/05/21 16:36:57:1857] N: t2_config_dump: id1 '(null)'\n+[2020/05/21 16:36:57:1858] N: t2_config_dump: arg1 'val2'\n+[2020/05/21 16:36:57:1858] N: t2_config_dump: ssid '\u0022nw1\u0022'\n+[2020/05/21 16:36:57:1859] N: t2_config_dump: freq 11\n+[2020/05/21 16:36:57:1859] N: t2_config_dump: arg2 1420887242594\n+[2020/05/21 16:36:57:1860] N: t2_config_dump: priority 3\n+[2020/05/21 16:36:57:1860] N: t2_config_dump: key1: \u0022xxxxxxxxxxxxx\u0022, key2: (null)\n+{\u0022config\u0022:[{\u0022creds\u0022:{\u0022key1\u0022:\u0022\u005cu0022xxxxxxxxx\u005cu0022\u0022},\u0022arg1\u0022:\u0022val1\u0022,\u0022ssid\u0022:\u0022\u005cu0022nw2\u005cu0022\u0022,\u0022frequency\u0022:0,\u0022arg2\u0022:0,\u0022priority\u0022:1},{\u0022creds\u0022:{\u0022key1\u0022:\u0022\u005cu0022xxxxxxxxxxxxx\u005cu0022\u0022},\u0022arg1\u0022:\u0022val2\u0022,\u0022ssid\u0022:\u0022\u005cu0022nw1\u005cu0022\u0022,\u0022frequency\u0022:11,\u0022arg2\u0022:1420887242594,\u0022priority\u0022:3}]}\n+[2020/05/21 16:36:57:1880] U: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/main.c\nnew file mode 100644\nindex 0000000..0aae74c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/main.c\n@@ -0,0 +1,801 @@\n+/*\n+ * lws-api-test-lws_struct-json\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * lws_struct apis are used to serialize and deserialize your C structs and\n+ * linked-lists in a standardized way that's very modest on memory but\n+ * convenient and easy to maintain.\n+ *\n+ * The API test shows how to serialize and deserialize a struct with a linked-\n+ * list of child structs in JSON using lws_struct APIs.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+typedef struct {\n+\tlws_dll2_t\t\tlist;\n+\n+\tstruct gpiod_line\t*line;\n+\n+\tconst char\t\t*name;\n+\tconst char\t\t*wire;\n+\n+\tint\t\t\tchip_idx;\n+\tint\t\t\toffset;\n+\tint\t\t\tsafe;\n+} sai_jig_gpio_t;\n+\n+typedef struct {\n+\tlws_dll2_t\t\tlist;\n+\tsai_jig_gpio_t\t\t*gpio; /* null \u003d wait ms */\n+\tconst char\t\t*gpio_name;\n+\tint\t\t\tvalue;\n+} sai_jig_seq_item_t;\n+\n+typedef struct {\n+\tlws_dll2_t\t\tlist;\n+\tlws_dll2_owner_t\tseq_owner;\n+\tconst char\t\t*name;\n+} sai_jig_sequence_t;\n+\n+typedef struct {\n+\tlws_dll2_t\t\tlist;\n+\tlws_dll2_owner_t\tgpio_owner;\n+\tlws_dll2_owner_t\tseq_owner;\n+\n+\tlws_sorted_usec_list_t\tsul;\t\t/* next step in ongoing seq */\n+\tsai_jig_seq_item_t\t*current;\t/* next seq step */\n+\n+\tconst char\t\t*name;\n+\n+\tstruct lws\t\t*wsi;\n+} sai_jig_target_t;\n+\n+typedef struct {\n+\tlws_dll2_owner_t\ttarget_owner;\n+\tstruct gpiod_chip\t*chip[16];\n+\tstruct lwsac\t\t*ac_conf;\n+\tint\t\t\tport;\n+\tconst char\t\t*iface;\n+\tstruct lws_context\t*ctx;\n+} sai_jig_t;\n+\n+/*\n+ * We read the JSON config using lws_struct... instrument the related structures\n+ */\n+\n+static const lws_struct_map_t lsm_sai_jig_gpio[] \u003d {\n+\tLSM_UNSIGNED\t(sai_jig_gpio_t, chip_idx,\t\t\u0022chip_idx\u0022),\n+\tLSM_UNSIGNED\t(sai_jig_gpio_t, offset,\t\t\u0022offset\u0022),\n+\tLSM_UNSIGNED\t(sai_jig_gpio_t, safe,\t\t\t\u0022safe\u0022),\n+\tLSM_STRING_PTR\t(sai_jig_gpio_t, name,\t\t\t\u0022name\u0022),\n+\tLSM_STRING_PTR\t(sai_jig_gpio_t, wire,\t\t\t\u0022wire\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_sai_jig_seq_item[] \u003d {\n+\tLSM_STRING_PTR\t(sai_jig_seq_item_t, gpio_name,\t\t\u0022gpio_name\u0022),\n+\tLSM_UNSIGNED\t(sai_jig_seq_item_t, value,\t\t\u0022value\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_sai_jig_sequence[] \u003d {\n+\tLSM_STRING_PTR\t(sai_jig_sequence_t, name,\t\t\u0022name\u0022),\n+\tLSM_LIST\t(sai_jig_sequence_t, seq_owner,\n+\t\t\t sai_jig_seq_item_t, list,\n+\t\t\t NULL, lsm_sai_jig_seq_item,\t\t\u0022seq\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_sai_jig_target[] \u003d {\n+\tLSM_STRING_PTR\t(sai_jig_target_t, name,\t\t\u0022name\u0022),\n+\tLSM_LIST\t(sai_jig_target_t, gpio_owner, sai_jig_gpio_t, list,\n+\t\t\t NULL, lsm_sai_jig_gpio,\t\t\u0022gpios\u0022),\n+\tLSM_LIST\t(sai_jig_target_t, seq_owner, sai_jig_sequence_t, list,\n+\t\t\t NULL, lsm_sai_jig_sequence,\t\t\u0022sequences\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_sai_jig[] \u003d {\n+\tLSM_STRING_PTR\t(sai_jig_t, iface,\t\t\t\u0022iface\u0022),\n+\tLSM_UNSIGNED\t(sai_jig_t, port,\t\t\t\u0022port\u0022),\n+\tLSM_LIST\t(sai_jig_t, target_owner, sai_jig_target_t, list,\n+\t\t\t NULL, lsm_sai_jig_target,\t\t\u0022targets\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_jig_schema[] \u003d {\n+ LSM_SCHEMA (sai_jig_t, NULL, lsm_sai_jig,\t\t\u0022sai-jig\u0022),\n+};\n+\n+static const char * const jig_conf \u003d\n+\u0022{\u0022\n+\t\u0022\u005c\u0022schema\u005c\u0022:\t\u005c\u0022sai-jig\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022port\u005c\u0022:\t\t44000,\u0022\n+\t\u0022\u005c\u0022targets\u005c\u0022:\t[\u0022\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022linkit-7697-1\u005c\u0022,\u0022\n+ \t\u0022\u005c\u0022gpios\u005c\u0022: [\u0022\n+ \t \u0022{\u0022\n+\t\t\t\t\t\u0022\u005c\u0022chip_index\u005c\u0022:\t0,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\t\t\u005c\u0022nReset\u005c\u0022,\u0022\n+ \t\u0022\u005c\u0022offset\u005c\u0022:\t17,\u0022\n+ \t\u0022\u005c\u0022wire\u005c\u0022:\t\t\u005c\u0022RST\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022safe\u005c\u0022:\t\t0\u0022\n+\t \u0022}, {\u0022\n+\t\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\t\t\u005c\u0022usr\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022chip_index\u005c\u0022:\t0,\u0022\n+ \t\u0022\u005c\u0022offset\u005c\u0022:\t22,\u0022\n+ \t\u0022\u005c\u0022wire\u005c\u0022:\t\t\u005c\u0022P6\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022safe\u005c\u0022:\t\t0\u0022\n+\t\t\t\t\u0022}\u0022\n+ \u0022], \u005c\u0022sequences\u005c\u0022: [\u0022\n+ \t\u0022{\u0022\n+\t\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\t\t\u005c\u0022reset\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022seq\u005c\u0022: [\u0022\n+\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022nReset\u005c\u0022, \t\u005c\u0022value\u005c\u0022: 0 },\u0022\n+\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022usr\u005c\u0022,\t\t\u005c\u0022value\u005c\u0022: 0 },\u0022\n+\t \t \u0022{\t\t\t\t\u005c\u0022value\u005c\u0022: 300 },\u0022\n+\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022nReset\u005c\u0022,\t\u005c\u0022value\u005c\u0022: 1 }\u0022\n+\t\t\t\t\t\u0022]\u0022\n+ \t\u0022}, {\u0022\n+\t\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\t\t\u005c\u0022flash\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022seq\u005c\u0022: [\u0022\n+\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022nReset\u005c\u0022,\t\u005c\u0022value\u005c\u0022: 0 },\u0022\n+\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022usr\u005c\u0022,\t\t\u005c\u0022value\u005c\u0022: 1 },\u0022\n+\t \t \u0022{\t\t\t\t\u005c\u0022value\u005c\u0022: 300 },\u0022\n+\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022nReset\u005c\u0022,\t\u005c\u0022value\u005c\u0022: 1 },\u0022\n+\t \t \u0022{\t\t\t\t\u005c\u0022value\u005c\u0022: 100 },\u0022\n+\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022usr\u005c\u0022,\t\t\u005c\u0022value\u005c\u0022: 0 }\u0022\n+\t\t\t\t\t\u0022]\u0022\n+ \t\u0022}\u0022\n+ \t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t\u0022]\u0022\n+\u0022}\u0022;\n+\n+\n+\n+extern int test2(void);\n+\n+/*\n+ * in this example, the JSON is for one \u0022builder\u0022 object, which may specify\n+ * a child list \u0022targets\u0022 of zero or more \u0022target\u0022 objects.\n+ */\n+\n+static const char * const json_tests[] \u003d {\n+\t\u0022{\u0022 /* test 1 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u0022\n+\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:true\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:false\u0022\n+\t\t\t\u0022}\u0022\n+\t\t\u0022]\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 2 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target3\u005c\u0022\u0022\n+\t\t\t\u0022}\u0022\n+\t\t\u0022]\u0022\n+\t\u0022}\u0022, \u0022{\u0022 /* test 3 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u0022\n+\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022unrecognized\u005c\u0022:\u005c\u0022xyz\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022child\u005c\u0022: {\u0022\n+\t\t\t\t\t\u0022\u005c\u0022somename\u005c\u0022: \u005c\u0022abc\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022junk\u005c\u0022: { \u005c\u0022x\u005c\u0022: \u005c\u0022y\u005c\u0022 }\u0022\n+\t\t\t\t\u0022}\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022\u0022\n+\t\t\t\u0022}\u0022\n+\t\t\u0022]\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 4 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 5 */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 6 ... check huge strings into smaller fixed char array */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022\u0022\n+\t\t\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A\u0022\n+\t\t\u0022zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/\u0022\n+\t\t\u0022CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5\u0022\n+\t\t\u00223FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV\u0022\n+\t\t\u00228sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n+\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG\u0022\n+\t\t\u0022JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG\u0022\n+\t\t\u0022LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW\u0022\n+\t\t\u0022v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9\u0022\n+\t\t\u0022eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY\u0022\n+\t\t\u0022VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/\u0022\n+\t\t\u0022uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu\u0022\n+\t\t\u0022yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx\u0022\n+\t\t\u0022+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 7 ... check huge strings into char * */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022\u0022\n+\t\t\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A\u0022\n+\t\t\u0022zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/\u0022\n+\t\t\u0022CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5\u0022\n+\t\t\u00223FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV\u0022\n+\t\t\u00228sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n+\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG\u0022\n+\t\t\u0022JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG\u0022\n+\t\t\u0022LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW\u0022\n+\t\t\u0022v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9\u0022\n+\t\t\u0022eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY\u0022\n+\t\t\u0022VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/\u0022\n+\t\t\u0022uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu\u0022\n+\t\t\u0022yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx\u0022\n+\t\t\u0022+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022}]}\u0022\n+\t\u0022}\u0022,\n+\t\u0022{\u0022 /* test 8 the \u0022other\u0022 schema */\n+\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-other\u005c\u0022,\u0022\n+\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022somename\u005c\u0022\u0022\n+\t\u0022}\u0022,\n+};\n+\n+/*\n+ * These are the expected outputs for each test, without pretty formatting.\n+ *\n+ * There are some differences to do with missing elements being rendered with\n+ * default values.\n+ */\n+\n+static const char * const json_expected[] \u003d {\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u005c\u0022targets\u005c\u0022:[{\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u005c\u0022someflag\u005c\u0022:true},\u0022\n+\t \u0022{\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false}]}\u0022,\n+\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022nspawn_timeout\u005c\u0022:0,\u005c\u0022targets\u005c\u0022:[{\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false},\u0022\n+\t \u0022{\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false},{\u005c\u0022name\u005c\u0022:\u005c\u0022target3\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false}]}\u0022,\n+\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u005c\u0022targets\u005c\u0022:[{\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false,\u0022\n+\t \u0022\u005c\u0022child\u005c\u0022:{\u005c\u0022somename\u005c\u0022:\u005c\u0022abc\u005c\u0022}},{\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false}]}\u0022,\n+\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u005c\u0022nspawn_timeout\u005c\u0022:1800}\u0022,\n+\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:0}\u0022,\n+\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u0022\n+\t\t\u0022\u005c\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7Xe\u005c\u0022,\u0022\n+\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:0}\u0022,\n+\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022nspawn_timeout\u005c\u0022:0,\u005c\u0022targets\u005c\u0022:[{\u005c\u0022name\u005c\u0022:\u005c\u0022PYvtan6kqppjnS0KpYTC\u0022\n+\t\t\u0022aiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6Azefz\u0022\n+\t\t\u0022oWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9\u0022\n+\t\t\u0022D1QKIWqg5RJ/CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6\u0022\n+\t\t\u0022bzhA+A/xAsFzSBnb3MHYWzGMprr53FAP1ISo5Ec9i+2ehV40sG6Q470sH3PG\u0022\n+\t\t\u0022QZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV8sq3ZgcxKNB7tNfN\u0022\n+\t\t\u00227idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n+\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEh\u0022\n+\t\t\u0022dZgxky2+g5hhlSIGJYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/\u0022\n+\t\t\u0022RrfOV+oV4R26IDq+KqUiJBENeo8/GXkGLUH/87iPyzXKEMavr6fkrK0vTGto\u0022\n+\t\t\u00228yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MWv+B/t1eZZ+1e\u0022\n+\t\t\u0022uLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZv\u0022\n+\t\t\u0022stK9eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6\u0022\n+\t\t\u0022O/grHnvJZm2vBkxuXgsYVkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0Wa\u0022\n+\t\t\u0022CqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/uZjjEGGLhJR1jPqA9D1Ej3Ch\u0022\n+\t\t\u0022V+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yuyJln+v4R\u0022\n+\t\t\u0022IWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5v\u0022\n+\t\t\u0022METteZlx+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022\u0022\n+\t\t\t\u0022,\u005c\u0022someflag\u005c\u0022:false}]}\u0022,\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-other\u005c\u0022,\u005c\u0022name\u005c\u0022:\u005c\u0022somename\u005c\u0022}\u0022\n+};\n+\n+/*\n+ * These annotate the members in the struct that will be serialized and\n+ * deserialized with type and size information, as well as the name to use\n+ * in the serialization format.\n+ *\n+ * Struct members that aren't annotated like this won't be serialized and\n+ * when the struct is created during deserialiation, the will be set to 0\n+ * or NULL.\n+ */\n+\n+/* child object */\n+\n+typedef struct sai_child {\n+\tconst char *\tsomename;\n+} sai_child_t;\n+\n+lws_struct_map_t lsm_child[] \u003d { /* describes serializable members */\n+\tLSM_STRING_PTR\t(sai_child_t, somename,\t\t\t\u0022somename\u0022),\n+};\n+\n+/* target object */\n+\n+typedef struct sai_target {\n+\tstruct lws_dll2 target_list;\n+\tsai_child_t *\t\tchild;\n+\n+\tconst char *\t\tname;\n+\tchar\t\t\tsomeflag;\n+} sai_target_t;\n+\n+static const lws_struct_map_t lsm_target[] \u003d {\n+\tLSM_STRING_PTR\t(sai_target_t, name,\t\t\t\u0022name\u0022),\n+\tLSM_BOOLEAN\t(sai_target_t, someflag,\t\t\u0022someflag\u0022),\n+\tLSM_CHILD_PTR\t(sai_target_t, child, sai_child_t,\n+\t\t\t NULL, lsm_child,\t\t\t\u0022child\u0022),\n+};\n+\n+/* the first kind of struct / schema we can receive */\n+\n+/* builder object */\n+\n+typedef struct sai_builder {\n+\tstruct lws_dll2_owner\ttargets;\n+\n+\tchar \t\t\thostname[32];\n+\tunsigned int \t\tnspawn_timeout;\n+} sai_builder_t;\n+\n+static const lws_struct_map_t lsm_builder[] \u003d {\n+\tLSM_CARRAY\t(sai_builder_t, hostname,\t\t\u0022hostname\u0022),\n+\tLSM_UNSIGNED\t(sai_builder_t, nspawn_timeout,\t\t\u0022nspawn_timeout\u0022),\n+\tLSM_LIST\t(sai_builder_t, targets,\n+\t\t\t sai_target_t, target_list,\n+\t\t\t NULL, lsm_target,\t\t\t\u0022targets\u0022),\n+};\n+\n+/*\n+ * the second kind of struct / schema we can receive\n+ */\n+\n+typedef struct sai_other {\n+\tchar \t\t\tname[32];\n+} sai_other_t;\n+\n+static const lws_struct_map_t lsm_other[] \u003d {\n+\tLSM_CARRAY\t(sai_other_t, name,\t\t\u0022name\u0022),\n+};\n+\n+/*\n+ * meta composed pointers test\n+ *\n+ * We serialize a struct that consists of members that point to other objects,\n+ * we expect this kind of thing\n+ *\n+ * {\n+ * \u0022schema\u0022: \u0022meta\u0022,\n+ * \u0022t\u0022: { ... },\n+ * \u0022e\u0022: { ...}\n+ * }\n+ */\n+\n+typedef struct meta {\n+\tsai_target_t\t*t;\n+\tsai_builder_t\t*b;\n+} meta_t;\n+\n+static const lws_struct_map_t lsm_meta[] \u003d {\n+\tLSM_CHILD_PTR\t(meta_t, t, sai_target_t, NULL, lsm_target, \u0022t\u0022),\n+\tLSM_CHILD_PTR\t(meta_t, b, sai_child_t, NULL, lsm_builder, \u0022e\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_schema_meta[] \u003d {\n+\tLSM_SCHEMA\t(meta_t, NULL, lsm_meta, \u0022meta.schema\u0022),\n+};\n+\n+/*\n+ * Schema table\n+ *\n+ * Before we can understand the serialization top level format, we must read\n+ * the schema, use the table below to create the right toplevel object for the\n+ * schema name, and select the correct map tables to interpret the rest of the\n+ * serialization.\n+ *\n+ * In this example there are two completely separate structs / schemas possible\n+ * to receive, and we disambiguate and create the correct one using the schema\n+ * JSON node.\n+ *\n+ * Therefore the schema table below is the starting point for the JSON\n+ * deserialization.\n+ */\n+\n+static const lws_struct_map_t lsm_schema_map[] \u003d {\n+\tLSM_SCHEMA\t(sai_builder_t, NULL,\n+\t\t\t lsm_builder,\t\t\u0022com-warmcat-sai-builder\u0022),\n+\tLSM_SCHEMA\t(sai_other_t, NULL,\n+\t\t\t lsm_other,\t\t\u0022com-warmcat-sai-other\u0022),\n+};\n+\n+typedef struct sai_cancel {\n+\tchar task_uuid[65];\n+} sai_cancel_t;\n+\n+const lws_struct_map_t lsm_task_cancel[] \u003d {\n+\tLSM_CARRAY\t(sai_cancel_t, task_uuid,\t \u0022uuid\u0022),\n+};\n+\n+static const lws_struct_map_t t2_map[] \u003d {\n+\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n+\t\t\t\t\t \u0022com.warmcat.sai.taskinfo\u0022),\n+\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n+\t\t\t\t\t \u0022com.warmcat.sai.eventinfo\u0022),\n+\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n+\t\t\t/* shares struct */ \u0022com.warmcat.sai.taskreset\u0022),\n+\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n+\t\t\t/* shares struct */ \u0022com.warmcat.sai.eventreset\u0022),\n+\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n+\t\t\t/* shares struct */ \u0022com.warmcat.sai.eventdelete\u0022),\n+\tLSM_SCHEMA\t(sai_cancel_t,\t\t NULL, lsm_task_cancel,\n+\t\t\t\t\t \u0022com.warmcat.sai.taskcan\u0022),\n+};\n+\n+static const char *t2 \u003d\n+\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com.warmcat.sai.taskcan\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022uuid\u005c\u0022: \u005c\u0022071ab46ab4296e5de674c628fec17c55088254679f7714ad991f8c4873dca\u005c\u0022}\u005cx01\u005cx02\u005cxff\u005cxff\u005cxff\u005cxff\u0022;\n+\n+typedef struct xlws_wifi_creds {\n+\tlws_dll2_t\tlist;\n+\tchar \t\tssid[33];\n+\tchar\t\tpassphrase[64];\n+\tint\t\talg;\n+\tchar\t\tbssid[6];\n+} xlws_wifi_creds_t;\n+\n+typedef struct xlws_netdevs {\n+\tlws_dll2_owner_t\towner_creds;\n+} xlws_netdevs_t;\n+\n+static const lws_struct_map_t lsm_wifi_creds[] \u003d {\n+\tLSM_CARRAY\t(xlws_wifi_creds_t, ssid,\t\t\u0022ssid\u0022),\n+\tLSM_CARRAY\t(xlws_wifi_creds_t, passphrase,\t\t\u0022passphrase\u0022),\n+\tLSM_UNSIGNED\t(xlws_wifi_creds_t, alg,\t\t\t\u0022alg\u0022),\n+\tLSM_STRING_PTR\t(xlws_wifi_creds_t, bssid,\t\t\u0022bssid\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_netdev_credentials[] \u003d {\n+\tLSM_LIST\t(xlws_netdevs_t, owner_creds, xlws_wifi_creds_t, list,\n+\t\t\t NULL, lsm_wifi_creds,\t\t\t\u0022credentials\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_netdev_schema[] \u003d {\n+\tLSM_SCHEMA\t(xlws_netdevs_t, NULL, lsm_netdev_credentials,\n+\t\t\t\t\t \u0022com.warmcat.sai.taskinfo\u0022),\n+};\n+\n+\n+static int\n+show_target(struct lws_dll2 *d, void *user)\n+{\n+\tsai_target_t *t \u003d lws_container_of(d, sai_target_t, target_list);\n+\n+\tlwsl_notice(\u0022 target.name '%s' (target %p)\u005cn\u0022, t-\u003ename, t);\n+\n+\tif (t-\u003echild)\n+\t\tlwsl_notice(\u0022 child %p, target.child.somename '%s'\u005cn\u0022,\n+\t\t\t t-\u003echild, t-\u003echild-\u003esomename);\n+\n+\treturn 0;\n+}\n+\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n, m, e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+#if 1\n+\tlws_struct_serialize_t *ser;\n+\tuint8_t buf[4096];\n+\tsize_t written;\n+#endif\n+\tstruct lejp_ctx ctx;\n+\tlws_struct_args_t a;\n+\tsai_builder_t *b, mb;\n+\tsai_target_t mt;\n+\tsai_other_t *o;\n+\tconst char *p;\n+\tmeta_t meta;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lws_struct JSON\u005cn\u0022);\n+\n+\tfor (m \u003d 0; m \u003c (int)LWS_ARRAY_SIZE(json_tests); m++) {\n+\n+\t\t/* 1. deserialize the canned JSON into structs */\n+\n+\t\tlwsl_notice(\u0022%s: ++++++++++++++++ test %d\u005cn\u0022, __func__, m + 1);\n+\n+\t\tmemset(\u0026a, 0, sizeof(a));\n+\t\ta.map_st[0] \u003d lsm_schema_map;\n+\t\ta.map_entries_st[0] \u003d LWS_ARRAY_SIZE(lsm_schema_map);\n+\t\ta.ac_block_size \u003d 512;\n+\n+\t\tlws_struct_json_init_parse(\u0026ctx, NULL, \u0026a);\n+\t\tn \u003d lejp_parse(\u0026ctx, (uint8_t *)json_tests[m],\n+\t\t\t\t\t\t (int)strlen(json_tests[m]));\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: notification JSON decode failed '%s'\u005cn\u0022,\n+\t\t\t\t\t__func__, lejp_error_to_string(n));\n+\t\t\te++;\n+\t\t\tgoto done;\n+\t\t}\n+\t\tlwsac_info(a.ac);\n+\n+\t\tif (m + 1 !\u003d 8) {\n+\t\t\tb \u003d a.dest;\n+\t\t\tif (!b) {\n+\t\t\t\tlwsl_err(\u0022%s: didn't produce any output\u005cn\u0022, __func__);\n+\t\t\t\te++;\n+\t\t\t\tgoto done;\n+\t\t\t}\n+\n+\t\t\tif (a.top_schema_index) {\n+\t\t\t\tlwsl_err(\u0022%s: wrong top_schema_index\u005cn\u0022, __func__);\n+\t\t\t\te++;\n+\t\t\t\tgoto done;\n+\t\t\t}\n+\n+\t\t\tlwsl_notice(\u0022builder.hostname \u003d '%s', timeout \u003d %d, targets (%d)\u005cn\u0022,\n+\t\t\t\t b-\u003ehostname, b-\u003enspawn_timeout,\n+\t\t\t\t b-\u003etargets.count);\n+\n+\t\t\tlws_dll2_foreach_safe(\u0026b-\u003etargets, NULL, show_target);\n+\t\t} else {\n+\t\t\to \u003d a.dest;\n+\t\t\tif (!o) {\n+\t\t\t\tlwsl_err(\u0022%s: didn't produce any output\u005cn\u0022, __func__);\n+\t\t\t\te++;\n+\t\t\t\tgoto done;\n+\t\t\t}\n+\n+\t\t\tif (a.top_schema_index !\u003d 1) {\n+\t\t\t\tlwsl_err(\u0022%s: wrong top_schema_index\u005cn\u0022, __func__);\n+\t\t\t\te++;\n+\t\t\t\tgoto done;\n+\t\t\t}\n+\n+\t\t\tlwsl_notice(\u0022other.name \u003d '%s'\u005cn\u0022, o-\u003ename);\n+\t\t}\n+\n+\t\t/* 2. serialize the structs into JSON and confirm */\n+\n+\t\tlwsl_notice(\u0022%s: .... strarting serialization of test %d\u005cn\u0022,\n+\t\t\t\t__func__, m + 1);\n+\n+\t\tif (m + 1 !\u003d 8) {\n+\t\t\tser \u003d lws_struct_json_serialize_create(lsm_schema_map,\n+\t\t\t\t\t\tLWS_ARRAY_SIZE(lsm_schema_map),\n+\t\t\t\t\t\t 0//LSSERJ_FLAG_PRETTY\n+\t\t\t\t\t\t , b);\n+\t\t} else {\n+\t\t\tser \u003d lws_struct_json_serialize_create(\u0026lsm_schema_map[1],\n+\t\t\t\t\t\t1,\n+\t\t\t\t\t\t 0//LSSERJ_FLAG_PRETTY\n+\t\t\t\t\t\t , o);\n+\t\t}\n+\t\tif (!ser) {\n+\t\t\tlwsl_err(\u0022%s: unable to init serialization\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t\tdo {\n+\t\t\tn \u003d (int)lws_struct_json_serialize(ser, buf, sizeof(buf),\n+\t\t\t\t\t\t \u0026written);\n+\t\t\tswitch (n) {\n+\t\t\tcase LSJS_RESULT_FINISH:\n+\t\t\t\tputs((const char *)buf);\n+\t\t\t\tbreak;\n+\t\t\tcase LSJS_RESULT_CONTINUE:\n+\t\t\tcase LSJS_RESULT_ERROR:\n+\t\t\t\tgoto bail;\n+\t\t\t}\n+\t\t} while(n \u003d\u003d LSJS_RESULT_CONTINUE);\n+\n+\t\tif (strcmp(json_expected[m], (char *)buf)) {\n+\t\t\tlwsl_err(\u0022%s: test %d: expected %s\u005cn\u0022, __func__, m + 1,\n+\t\t\t\t\tjson_expected[m]);\n+\t\t\te++;\n+\t\t\tgoto done;\n+\t\t}\n+\n+\t\tlws_struct_json_serialize_destroy(\u0026ser);\n+\n+done:\n+\t\tlwsac_free(\u0026a.ac);\n+\t}\n+\n+\tif (e)\n+\t\tgoto bail;\n+\n+\t/* ad-hoc tests */\n+\n+\tmemset(\u0026meta, 0, sizeof(meta));\n+\tmemset(\u0026mb, 0, sizeof(mb));\n+\tmemset(\u0026mt, 0, sizeof(mt));\n+\n+\tmeta.t \u003d \u0026mt;\n+\tmeta.b \u003d \u0026mb;\n+\n+\tmeta.t-\u003ename \u003d \u0022mytargetname\u0022;\n+\tlws_strncpy(meta.b-\u003ehostname, \u0022myhostname\u0022, sizeof(meta.b-\u003ehostname));\n+\tser \u003d lws_struct_json_serialize_create(lsm_schema_meta, 1, 0,\n+\t\t\t\t\t \u0026meta);\n+\tif (!ser) {\n+\t\tlwsl_err(\u0022%s: failed to create json\u005cn\u0022, __func__);\n+\n+\n+\t}\n+\tdo {\n+\t\tn \u003d (int)lws_struct_json_serialize(ser, buf, sizeof(buf), \u0026written);\n+\t\tswitch (n) {\n+\t\tcase LSJS_RESULT_CONTINUE:\n+\t\tcase LSJS_RESULT_FINISH:\n+\t\t\tputs((const char *)buf);\n+\t\t\tif (strcmp((const char *)buf,\n+\t\t\t\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022meta.schema\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022t\u005c\u0022:{\u005c\u0022name\u005c\u0022:\u005c\u0022mytargetname\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:false},\u0022\n+\t\t\t\t\u0022\u005c\u0022e\u005c\u0022:{\u005c\u0022hostname\u005c\u0022:\u005c\u0022myhostname\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:0}}\u0022)) {\n+\t\t\t\tlwsl_err(\u0022%s: meta test fail\u005cn\u0022, __func__);\n+\t\t\t\tgoto bail;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tcase LSJS_RESULT_ERROR:\n+\t\t\tgoto bail;\n+\t\t}\n+\t} while(n \u003d\u003d LSJS_RESULT_CONTINUE);\n+\n+\tlws_struct_json_serialize_destroy(\u0026ser);\n+\n+\tlwsl_notice(\u0022Test set 2\u005cn\u0022);\n+\n+\tmemset(\u0026a, 0, sizeof(a));\n+\ta.map_st[0] \u003d t2_map;\n+\ta.map_entries_st[0] \u003d LWS_ARRAY_SIZE(t2_map);\n+\ta.ac_block_size \u003d 128;\n+\n+\tlws_struct_json_init_parse(\u0026ctx, NULL, \u0026a);\n+\tm \u003d lejp_parse(\u0026ctx, (uint8_t *)t2, (int)strlen(t2));\n+\tif (m \u003c 0 || !a.dest) {\n+\t\tlwsl_notice(\u0022%s: notification JSON decode failed '%s'\u005cn\u0022,\n+\t\t\t\t__func__, lejp_error_to_string(m));\n+\t\tgoto bail;\n+\t}\n+\n+\tlwsl_notice(\u0022Test set 2: %d: %s\u005cn\u0022, m,\n+\t\t\t((sai_cancel_t *)a.dest)-\u003etask_uuid);\n+\n+\tlwsac_free(\u0026a.ac);\n+\n+\tif (test2())\n+\t\tgoto bail;\n+\n+\t{\n+\t\tlws_struct_serialize_t *js;\n+\t\txlws_wifi_creds_t creds;\n+\t\txlws_netdevs_t netdevs;\n+\t\tunsigned char *buf;\n+\t\tsize_t w;\n+\t\tint n;\n+\n+\t\tmemset(\u0026creds, 0, sizeof(creds));\n+\t\tmemset(\u0026netdevs, 0, sizeof(netdevs));\n+\n+\t\tlws_strncpy(creds.ssid, \u0022xxx\u0022, sizeof(creds.ssid));\n+\t\tlws_strncpy(creds.passphrase, \u0022yyy\u0022, sizeof(creds.passphrase));\n+\t\tlws_dll2_add_tail(\u0026creds.list, \u0026netdevs.owner_creds);\n+\n+\t\tbuf \u003d malloc(2048); /* length should be computed */\n+\n+\t\tjs \u003d lws_struct_json_serialize_create(lsm_netdev_schema,\n+\t\t\tLWS_ARRAY_SIZE(lsm_netdev_schema), 0, \u0026netdevs);\n+\t\tif (!js)\n+\t\t\tgoto bail;\n+\n+\t\tn \u003d (int)lws_struct_json_serialize(js, buf, 2048, \u0026w);\n+\t\tlws_struct_json_serialize_destroy(\u0026js);\n+\t\tif (n !\u003d LSJS_RESULT_FINISH)\n+\t\t\tgoto bail;\n+\t\tif (strcmp(\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com.warmcat.sai.taskinfo\u005c\u0022,\u005c\u0022credentials\u005c\u0022:[{\u005c\u0022ssid\u005c\u0022:\u005c\u0022xxx\u005c\u0022,\u005c\u0022passphrase\u005c\u0022:\u005c\u0022yyy\u005c\u0022,\u005c\u0022alg\u005c\u0022:0}]}\u0022, (const char *)buf)) {\n+\t\t\tputs((const char *)buf);\n+\t\t\tgoto bail;\n+\t\t}\n+\t\tfree(buf);\n+\t}\n+\n+\t{\n+\t\tstruct x { lws_dll2_t list; const char *sz; };\n+\t\tstruct x x1, x2, *xp;\n+\t\tlws_dll2_owner_t o;\n+\n+\t\tlws_dll2_owner_clear(\u0026o);\n+\t\tmemset(\u0026x1, 0, sizeof(x1));\n+\t\tmemset(\u0026x2, 0, sizeof(x2));\n+\n+\t\tx1.sz \u003d \u0022nope\u0022;\n+\t\tx2.sz \u003d \u0022yes\u0022;\n+\n+\t\tlws_dll2_add_tail(\u0026x1.list, \u0026o);\n+\t\tlws_dll2_add_tail(\u0026x2.list, \u0026o);\n+\n+\t\txp \u003d lws_dll2_search_sz_pl(\u0026o, \u0022yes\u0022, 3, struct x, list, sz);\n+\t\tif (xp !\u003d \u0026x2) {\n+\t\t\tlwsl_err(\u0022%s: 1 xp %p\u005cn\u0022, __func__, xp);\n+\t\t\tgoto bail;\n+\t\t}\n+\t\txp \u003d lws_dll2_search_sz_pl(\u0026o, \u0022nope\u0022, 4, struct x, list, sz);\n+\t\tif (xp !\u003d \u0026x1) {\n+\t\t\tlwsl_err(\u0022%s: 2 xp %p\u005cn\u0022, __func__, xp);\n+\t\t\tgoto bail;\n+\t\t}\n+\t\txp \u003d lws_dll2_search_sz_pl(\u0026o, \u0022wrong\u0022, 4, struct x, list, sz);\n+\t\tif (xp) {\n+\t\t\tlwsl_err(\u0022%s: 3 xp %p\u005cn\u0022, __func__, xp);\n+\t\t\tgoto bail;\n+\t\t}\n+\t}\n+\n+\t{\n+\t\tlws_struct_args_t a;\n+\t\tstruct lejp_ctx ctx;\n+\t\tint m;\n+\n+\t\tmemset(\u0026a, 0, sizeof(a));\n+\t\ta.map_st[0] \u003d lsm_jig_schema;\n+\t\ta.map_entries_st[0] \u003d LWS_ARRAY_SIZE(lsm_jig_schema);\n+\t\ta.ac_block_size \u003d 512;\n+\n+\t\tlws_struct_json_init_parse(\u0026ctx, NULL, \u0026a);\n+\n+\t\tm \u003d lejp_parse(\u0026ctx, (uint8_t *)jig_conf, (int)strlen(jig_conf));\n+\n+\t\tif (m \u003c 0 || !a.dest) {\n+\t\t\tlwsl_err(\u0022%s: line %d: JSON decode failed '%s'\u005cn\u0022,\n+\t\t\t\t __func__, ctx.line, lejp_error_to_string(m));\n+\t\t\tgoto bail;\n+\t\t}\n+\t}\n+\n+\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n+\n+\treturn 0;\n+\n+bail:\n+\n+\tlwsl_user(\u0022Completed: FAIL\u005cn\u0022);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/test2.c b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/test2.c\nnew file mode 100644\nindex 0000000..4afa5a0\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/test2.c\n@@ -0,0 +1,236 @@\n+/*\n+ * lws-api-test-lws_struct-json\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * lws_struct apis are used to serialize and deserialize your C structs and\n+ * linked-lists in a standardized way that's very modest on memory but\n+ * convenient and easy to maintain.\n+ *\n+ * This second test file shows a worked example for how to express a schema\n+ * and both consume JSON -\u003e struct and struct -\u003e JSON for it.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+static const char * const test2_json \u003d\n+\u0022{\u0022\n+\t\u0022\u005c\u0022config\u005c\u0022:[\u0022\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022id1\u005c\u0022:\u0022\t\t\u0022null,\u0022\n+\t\t\t\u0022\u005c\u0022creds\u005c\u0022:{\u0022\n+\t\t\t\t\u0022\u005c\u0022key1\u005c\u0022:\u0022\t\u0022\u005c\u0022\u005c\u005c\u005c\u0022xxxxxxxxx\u005c\u005c\u005c\u0022\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022key2\u005c\u0022:\u0022\t\u0022null\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022\u005c\u0022frequency\u005c\u0022:\u0022\t\u00220,\u0022\n+\t\t\t\u0022\u005c\u0022arg1\u005c\u0022:\u0022\t\t\u0022\u005c\u0022val1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022arg2\u005c\u0022:\u0022\t\t\u00220,\u0022\n+\t\t\t\u0022\u005c\u0022priority\u005c\u0022:\u0022\t\t\u00221,\u0022\n+\t\t\t\u0022\u005c\u0022ssid\u005c\u0022:\u0022\t\t\u0022\u005c\u0022\u005c\u005c\u005c\u0022nw2\u005c\u005c\u005c\u0022\u005c\u0022\u0022\n+\t\t\u0022}, {\u0022\n+\t\t\t\u0022\u005c\u0022id2\u005c\u0022:\u0022\t\t\u0022null,\u0022\n+\t\t\t\u0022\u005c\u0022creds\u005c\u0022: {\u0022\n+\t\t\t\t\u0022\u005c\u0022key1\u005c\u0022:\u0022\t\u0022\u005c\u0022\u005c\u005c\u005c\u0022xxxxxxxxxxxxx\u005c\u005c\u005c\u0022\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022key2\u005c\u0022:\u0022\t\u0022null\u0022\n+\t\t\t\u0022},\u0022\n+\t\t\t\u0022\u005c\u0022frequency\u005c\u0022:\u0022\t\u002211,\u0022\n+\t\t\t\u0022\u005c\u0022arg1\u005c\u0022:\u0022\t\t\u0022\u005c\u0022val2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022arg2\u005c\u0022:\u0022\t\t\u00221420887242594,\u0022\n+\t\t\t\u0022\u005c\u0022priority\u005c\u0022:\u0022\t\t\u00223,\u0022\n+\t\t\t\u0022\u005c\u0022ssid\u005c\u0022:\u0022\t\t\u0022\u005c\u0022\u005c\u005c\u005c\u0022nw1\u005c\u005c\u005c\u0022\u005c\u0022\u0022\n+\t\t\u0022}\u0022\n+\t\u0022]\u0022\n+\u0022}\u0022;\n+\n+static const char * const test2_json_expected \u003d\n+\t\u0022{\u005c\u0022config\u005c\u0022:[{\u005c\u0022creds\u005c\u0022:{\u005c\u0022key1\u005c\u0022:\u005c\u0022\u005c\u005cu0022xxxxxxxxx\u005c\u005cu0022\u005c\u0022},\u0022\n+\t \u0022\u005c\u0022arg1\u005c\u0022:\u005c\u0022val1\u005c\u0022,\u005c\u0022ssid\u005c\u0022:\u005c\u0022\u005c\u005cu0022nw2\u005c\u005cu0022\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022frequency\u005c\u0022:0,\u005c\u0022arg2\u005c\u0022:0,\u005c\u0022priority\u005c\u0022:1},\u0022\n+\t \u0022{\u005c\u0022creds\u005c\u0022:{\u005c\u0022key1\u005c\u0022:\u005c\u0022\u005c\u005cu0022xxxxxxxxxxxxx\u005c\u005cu0022\u005c\u0022},\u0022\n+\t \u0022\u005c\u0022arg1\u005c\u0022:\u005c\u0022val2\u005c\u0022,\u005c\u0022ssid\u005c\u0022:\u005c\u0022\u005c\u005cu0022nw1\u005c\u005cu0022\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022frequency\u005c\u0022:11,\u005c\u0022arg2\u005c\u0022:1420887242594,\u005c\u0022priority\u005c\u0022:3}]}\u0022\n+;\n+\n+/*\n+ * level 3: Credentials object\n+ */\n+\n+typedef struct t2_cred {\n+\tconst char\t\t\t\t*key1;\n+\tconst char\t\t\t\t*key2;\n+} t2_cred_t;\n+\n+static const lws_struct_map_t lsm_t2_cred[] \u003d {\n+\tLSM_STRING_PTR\t(t2_cred_t, key1, \u0022key1\u0022),\n+\tLSM_STRING_PTR\t(t2_cred_t, key2, \u0022key2\u0022),\n+};\n+\n+/*\n+ * level 2: Configuration object, containing a child credentials object\n+ */\n+\n+typedef struct t2_config {\n+\tlws_dll2_t\t\t\t\tlist;\n+\tt2_cred_t \t\t\t\t*creds;\n+\tconst char\t\t\t\t*id1;\n+\tconst char\t\t\t\t*arg1;\n+\tconst char\t\t\t\t*ssid;\n+\tunsigned int\t\t\t\tfrequency;\n+\tunsigned long long\t\t\targ2;\n+\tunsigned int\t\t\t\tpriority;\n+} t2_config_t;\n+\n+static const lws_struct_map_t lsm_t2_config[] \u003d {\n+\tLSM_CHILD_PTR\t(t2_config_t,\n+\t\t\t creds,\t\t\t/* the child pointer member */\n+\t\t\t t2_cred_t,\t\t/* the child type */\n+\t\t\t NULL, lsm_t2_cred,\t/* map object for item type */\n+\t\t\t \u0022creds\u0022),\t\t/* outer json object name */\n+\tLSM_STRING_PTR\t(t2_config_t, id1, \t \u0022id1\u0022),\n+\tLSM_STRING_PTR\t(t2_config_t, arg1,\t \u0022arg1\u0022),\n+\tLSM_STRING_PTR\t(t2_config_t, ssid,\t \u0022ssid\u0022),\n+\n+\tLSM_UNSIGNED\t(t2_config_t, frequency, \u0022frequency\u0022),\n+\tLSM_UNSIGNED\t(t2_config_t, arg2,\t \u0022arg2\u0022),\n+\tLSM_UNSIGNED\t(t2_config_t, priority,\t \u0022priority\u0022),\n+};\n+\n+/*\n+ * level 1: list-of-configurations object\n+ */\n+\n+typedef struct t2_configs {\n+\tlws_dll2_owner_t \t\t\tconfigs;\n+} t2_configs_t;\n+\n+static const lws_struct_map_t lsm_t2_configs[] \u003d {\n+\tLSM_LIST\t(t2_configs_t, configs, /* the list owner type/member */\n+\t\t\t t2_config_t, list,\t/* the list item type/member */\n+\t\t\t NULL, lsm_t2_config,\t/* map object for item type */\n+\t\t\t \u0022config\u0022),\t\t/* outer json object name */\n+};\n+\n+/*\n+ * For parsing, this lists the kind of object we expect to parse so the struct\n+ * can be allocated polymorphically.\n+ *\n+ * Lws uses an explicit \u0022schema\u0022 member so the type is known unambiguously. If\n+ * in the incoming JSON the first member is not \u0022schema\u0022, it will scan the\n+ * maps listed here and instantiate the first object that has a member of that\n+ * name.\n+ */\n+\n+static const lws_struct_map_t lsm_schema[] \u003d {\n+\tLSM_SCHEMA\t(t2_configs_t, NULL, lsm_t2_configs, \u0022t2\u0022),\n+\t/* other schemata that might need parsing... */\n+};\n+\n+\n+\n+static int\n+t2_config_dump(struct lws_dll2 *d, void *user)\n+{\n+#if !defined(LWS_WITH_NO_LOGS)\n+\tt2_config_t *c \u003d lws_container_of(d, t2_config_t, list);\n+\n+\tlwsl_notice(\u0022%s: id1 '%s'\u005cn\u0022, __func__, c-\u003eid1);\n+\tlwsl_notice(\u0022%s: arg1 '%s'\u005cn\u0022, __func__, c-\u003earg1);\n+\tlwsl_notice(\u0022%s: ssid '%s'\u005cn\u0022, __func__, c-\u003essid);\n+\n+\tlwsl_notice(\u0022%s: freq %d\u005cn\u0022, __func__, c-\u003efrequency);\n+\tlwsl_notice(\u0022%s: arg2 %llu\u005cn\u0022, __func__, c-\u003earg2);\n+\tlwsl_notice(\u0022%s: priority %d\u005cn\u0022, __func__, c-\u003epriority);\n+\n+\tlwsl_notice(\u0022%s: key1: %s, key2: %s\u005cn\u0022, __func__,\n+\t\t\t c-\u003ecreds-\u003ekey1, c-\u003ecreds-\u003ekey2);\n+#endif\n+\n+\treturn 0;\n+}\n+\n+static int\n+t2_configs_dump(t2_configs_t *t2cs)\n+{\n+\tlwsl_notice(\u0022%s: number of configs: %d\u005cn\u0022, __func__,\n+\t\t t2cs-\u003econfigs.count);\n+\n+\tlws_dll2_foreach_safe(\u0026t2cs-\u003econfigs, NULL, t2_config_dump);\n+\n+\treturn 0;\n+}\n+\n+\n+int\n+test2(void)\n+{\n+\tlws_struct_serialize_t *ser;\n+\tstruct lejp_ctx ctx;\n+\tlws_struct_args_t a;\n+\tt2_configs_t *top;\n+\tuint8_t buf[4096];\n+\tsize_t written;\n+\tint n, bad \u003d 1;\n+\n+\tlwsl_notice(\u0022%s: start \u005cn\u0022, __func__);\n+\n+\tmemset(\u0026a, 0, sizeof(a));\n+\ta.map_st[0] \u003d lsm_schema;\n+\ta.map_entries_st[0] \u003d LWS_ARRAY_SIZE(lsm_schema);\n+\ta.ac_block_size \u003d 512;\n+\tlws_struct_json_init_parse(\u0026ctx, NULL, \u0026a);\n+\n+\tn \u003d lejp_parse(\u0026ctx, (uint8_t *)test2_json, (int)strlen(test2_json));\n+\tlwsl_notice(\u0022%s: lejp_parse %d\u005cn\u0022, __func__, n);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: test2 JSON decode failed '%s'\u005cn\u0022,\n+\t\t\t\t__func__, lejp_error_to_string(n));\n+\t\tgoto bail;\n+\t}\n+\tlwsac_info(a.ac);\n+\n+\ttop \u003d (t2_configs_t *)a.dest; /* the top level object */\n+\n+\tif (!top) {\n+\t\tlwsl_err(\u0022%s: no top level object\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\tt2_configs_dump(top);\n+\n+\t/* 2. Let's reserialize the top level object and see what comes out */\n+\n+\tser \u003d lws_struct_json_serialize_create(\u0026lsm_schema[0], 1,\n+\t\t\t\t\t LSSERJ_FLAG_OMIT_SCHEMA, top);\n+\tif (!ser) {\n+\t\tlwsl_err(\u0022%s: unable to init serialization\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tdo {\n+\t\tn \u003d (int)lws_struct_json_serialize(ser, buf, sizeof(buf), \u0026written);\n+\t\tswitch (n) {\n+\t\tcase LSJS_RESULT_FINISH:\n+\t\t\tputs((const char *)buf);\n+\t\t\tbreak;\n+\t\tcase LSJS_RESULT_CONTINUE:\n+\t\tcase LSJS_RESULT_ERROR:\n+\t\t\tgoto bail;\n+\t\t}\n+\t} while (n \u003d\u003d LSJS_RESULT_CONTINUE);\n+\n+\tif (strcmp(test2_json_expected, (char *)buf)) {\n+\t\tlwsl_err(\u0022%s: expected %s\u005cn\u0022, __func__, test2_json_expected);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_struct_json_serialize_destroy(\u0026ser);\n+\n+\tbad \u003d 0;\n+\n+bail:\n+\tlwsac_free(\u0026a.ac);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt\nnew file mode 100644\nindex 0000000..ac8b161\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-api-test-lws_struct-sqlite C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-lws_struct-sqlite)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_STRUCT_SQLITE3 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\tadd_test(NAME api-test-lws_struct_sqlite COMMAND lws-api-test-lws_struct-sqlite)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared sqlite3 ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets sqlite3 ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/README.md\nnew file mode 100644\nindex 0000000..aa2b6a8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/README.md\n@@ -0,0 +1,25 @@\n+# lws api test lws_struct SQLITE\n+\n+Demonstrates how to use and performs selftests for lws_struct\n+SQLITE serialization and deserialization\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-lws_struct-sqlite\n+[2020/02/22 09:55:05:4335] U: LWS API selftest: lws_struct SQLite\n+[2020/02/22 09:55:05:5579] N: lws_struct_sq3_open: created _lws_apitest.sq3 owned by 0:0 mode 0600\n+[2020/02/22 09:55:05:9206] U: Completed: PASS\n+\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/main.c\nnew file mode 100644\nindex 0000000..f7c1d38\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/main.c\n@@ -0,0 +1,204 @@\n+/*\n+ * lws-api-test-lws_struct-sqlite\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * lws_struct apis are used to serialize and deserialize your C structs and\n+ * linked-lists in a standardized way that's very modest on memory but\n+ * convenient and easy to maintain.\n+ *\n+ * The API test shows how to serialize and deserialize a struct with a linked-\n+ * list of child structs in JSON using lws_struct APIs.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+typedef struct teststruct {\n+\tlws_dll2_t\t\tlist; /* not directly serialized */\n+\n+\tchar \t\t\tstr1[32];\n+\tconst char\t\t*str2;\n+\tuint8_t\t\t\tu8;\n+\tuint16_t\t\tu16;\n+\tuint32_t\t\tu32;\n+\tuint64_t\t\tu64;\n+\tint32_t\t\t\ts32;\n+} teststruct_t;\n+\n+/*\n+ * These are the members that we will serialize and deserialize, not every\n+ * member in the struct (eg, the dll2 list member)\n+ */\n+\n+static const lws_struct_map_t lsm_teststruct[] \u003d {\n+\tLSM_CARRAY\t(teststruct_t, str1,\t\t\u0022str1\u0022),\n+\tLSM_STRING_PTR (teststruct_t, str2,\t\t\u0022str2\u0022),\n+\tLSM_UNSIGNED\t(teststruct_t, u8,\t\t\u0022u8\u0022),\n+\tLSM_UNSIGNED\t(teststruct_t, u16,\t\t\u0022u16\u0022),\n+\tLSM_UNSIGNED\t(teststruct_t, u32,\t\t\u0022u32\u0022),\n+\tLSM_UNSIGNED\t(teststruct_t, u64,\t\t\u0022u64\u0022),\n+\tLSM_SIGNED\t(teststruct_t, s32,\t\t\u0022s32\u0022),\n+};\n+\n+static const lws_struct_map_t lsm_schema_apitest[] \u003d {\n+\tLSM_SCHEMA_DLL2\t(teststruct_t, list, NULL, lsm_teststruct, \u0022apitest\u0022)\n+};\n+\n+static const char *test_string \u003d\n+\t\u0022No one would have believed in the last years of the nineteenth \u0022\n+\t\u0022century that this world was being watched keenly and closely by \u0022\n+\t\u0022intelligences greater than man's and yet as mortal as his own; that as \u0022\n+\t\u0022men busied themselves about their various concerns they were \u0022\n+\t\u0022scrutinised and studied, perhaps almost as narrowly as a man with a \u0022\n+\t\u0022microscope might scrutinise the transient creatures that swarm and \u0022\n+\t\u0022multiply in a drop of water. With infinite complacency men went to \u0022\n+\t\u0022and fro over this globe about their little affairs, serene in their \u0022\n+\t\u0022assurance of their empire over matter. It is possible that the \u0022\n+\t\u0022infusoria under the microscope do the same. No one gave a thought to \u0022\n+\t\u0022the older worlds of space as sources of human danger, or thought of \u0022\n+\t\u0022them only to dismiss the idea of life upon them as impossible or \u0022\n+\t\u0022improbable. It is curious to recall some of the mental habits of \u0022\n+\t\u0022those departed days. At most terrestrial men fancied there might be \u0022\n+\t\u0022other men upon Mars, perhaps inferior to themselves and ready to \u0022\n+\t\u0022welcome a missionary enterprise. Yet across the gulf of space, minds \u0022\n+\t\u0022that are to our minds as ours are to those of the beasts that perish, \u0022\n+\t\u0022intellects vast and cool and unsympathetic, regarded this earth with \u0022\n+\t\u0022envious eyes, and slowly and surely drew their plans against us. And \u0022\n+\t\u0022early in the twentieth century came the great disillusionment. \u0022;\n+\n+int main(int argc, const char **argv)\n+{\n+\tint e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tstruct lwsac *ac \u003d NULL;\n+\tlws_dll2_owner_t resown;\n+\tteststruct_t ts, *pts;\n+\tconst char *p;\n+\tsqlite3 *db;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lws_struct SQLite\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\n+\tunlink(\u0022_lws_apitest.sq3\u0022);\n+\n+\tif (lws_struct_sq3_open(context, \u0022_lws_apitest.sq3\u0022, 1, \u0026db)) {\n+\t\tlwsl_err(\u0022%s: failed to open table\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* 1. populate the struct */\n+\n+\tmemset(\u0026ts, 0, sizeof(ts));\n+\n+\tlws_strncpy(ts.str1, \u0022hello\u0022, sizeof(ts.str1));\n+\tts.str2 \u003d test_string;\n+\tts.u8 \u003d 1;\n+\tts.u16 \u003d 512,\n+\tts.u32 \u003d 0x55aa1234; /* 1437209140, */\n+\tts.u64 \u003d 0x34abcdef01ull;\n+\tts.s32 \u003d -1;\n+\n+\t/* add our struct to the dll2 owner list */\n+\n+\tlws_dll2_owner_clear(\u0026resown);\n+\tlws_dll2_add_head(\u0026ts.list, \u0026resown);\n+\n+\t/* gratuitously create the table */\n+\n+\tif (lws_struct_sq3_create_table(db, lsm_schema_apitest)) {\n+\t\tlwsl_err(\u0022%s: Create table failed\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto done;\n+\t}\n+\n+\t/* serialize the items on the dll2 owner */\n+\n+\tif (lws_struct_sq3_serialize(db, lsm_schema_apitest, \u0026resown, 0)) {\n+\t\tlwsl_err(\u0022%s: Serialize failed\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto done;\n+\t}\n+\n+\t/* resown should be cleared by deserialize, ac is already NULL */\n+\n+\tlws_dll2_owner_clear(\u0026resown); /* make sure old resown data is gone */\n+\n+\tif (lws_struct_sq3_deserialize(db, NULL, NULL, lsm_schema_apitest,\n+\t\t\t\t \u0026resown, \u0026ac, 0, 1)) {\n+\t\tlwsl_err(\u0022%s: Deserialize failed\u005cn\u0022, __func__);\n+\t\te++;\n+\t\tgoto done;\n+\t}\n+\n+\t/* we should have 1 entry in resown now (created into the ac) */\n+\n+\tif (resown.count !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: Expected 1 result got %d\u005cn\u0022, __func__,\n+\t\t\t\tresown.count);\n+\t\te++;\n+\t\tgoto done;\n+\t}\n+\n+\t/*\n+\t * Convert the pointer to the embedded lws_dll2 into a pointer\n+\t * to the actual struct with the correct type\n+\t */\n+\n+\tpts \u003d lws_container_of(lws_dll2_get_head(\u0026resown),\n+\t\t\t teststruct_t, list);\n+\n+\tif (strcmp(pts-\u003estr1, \u0022hello\u0022) ||\n+\t strcmp(pts-\u003estr2, test_string) ||\n+\t pts-\u003eu8 !\u003d 1 ||\n+\t pts-\u003eu16 !\u003d 512 ||\n+\t pts-\u003eu32 !\u003d 0x55aa1234 ||\n+\t pts-\u003eu64 !\u003d 0x34abcdef01ull ||\n+\t pts-\u003es32 !\u003d -1) {\n+\t\tlwsl_err(\u0022%s: unexpected deser values: %s\u005cn\u0022, __func__, pts-\u003estr1);\n+\t\tlwsl_err(\u0022%s: %s\u005cn\u0022, __func__, pts-\u003estr2);\n+\t\tlwsl_err(\u0022%s: %u %u %u 0x%llx %d\u005cn\u0022, __func__, pts-\u003eu8, pts-\u003eu16,\n+\t\t\t pts-\u003eu32, (unsigned long long)pts-\u003eu64, pts-\u003es32);\n+\n+\t\te++;\n+\t\tgoto done;\n+\t}\n+\n+done:\n+\tlwsac_free(\u0026ac);\n+\tlws_struct_sq3_close(\u0026db);\n+\n+\n+\tif (e)\n+\t\tgoto bail;\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n+\n+\treturn 0;\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: FAIL\u005cn\u0022);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/CMakeLists.txt\nnew file mode 100644\nindex 0000000..503f25d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/CMakeLists.txt\n@@ -0,0 +1,19 @@\n+project(lws-api-test-lws_tokenize C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-lws_tokenize)\n+set(SRCS main.c)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\tadd_test(NAME api-test-lws_tokenize COMMAND lws-api-test-lws_tokenize)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/README.md\nnew file mode 100644\nindex 0000000..a6b75ec\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/README.md\n@@ -0,0 +1,37 @@\n+# lws api test lws_tokenize\n+\n+Performs selftests for lws_tokenize\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-s \u0022input string\u0022|String to tokenize\n+-f 15|LWS_TOKENIZE_F_ flag values to apply to processing of -s \n+\n+```\n+ $ ./lws-api-test-lws_tokenize\n+[2018/10/09 09:14:17:4834] USER: LWS API selftest: lws_tokenize\n+[2018/10/09 09:14:17:4835] USER: Completed: PASS: 6, FAIL: 0\n+```\n+\n+If the `-s string` option is given, the string is tokenized on stdout in\n+the format used to produce the tests in the sources\n+\n+```\n+ $ ./lws-api-test-lws_tokenize -s \u0022hello: 1234,256\u0022\n+[2018/10/09 09:14:17:4834] USER: LWS API selftest: lws_tokenize\n+{ LWS_TOKZE_TOKEN_NAME_COLON, \u0022hello\u0022, 5 }\n+{ LWS_TOKZE_INTEGER, \u00221234\u0022, 4 }\n+{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 }\n+{ LWS_TOKZE_INTEGER, \u0022256\u0022, 3 }\n+{ LWS_TOKZE_ENDED, \u0022\u0022, 0 }\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/main.c\nnew file mode 100644\nindex 0000000..b9bbcea\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/main.c\n@@ -0,0 +1,779 @@\n+/*\n+ * lws-api-test-lws_tokenize\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdio.h\u003e\n+\n+struct expected {\n+\tlws_tokenize_elem e;\n+\tconst char *value;\n+\tsize_t len;\n+};\n+\n+struct tests {\n+\tconst char *string;\n+\tstruct expected *exp;\n+\tint count;\n+\tint flags;\n+};\n+\n+struct expected expected1[] \u003d {\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022protocol-1\u0022, 10 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1},\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022protocol_2\u0022, 10 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1},\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022protocol3\u0022, 9 },\n+\t\t{ LWS_TOKZE_ENDED, NULL, 0 },\n+\t},\n+\texpected2[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN_NAME_COLON,\t\t\u0022Accept-Language\u0022, 15 },\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022fr-CH\u0022, 5 },\n+\t\t{ LWS_TOKZE_DELIMITER,\t\t\t\u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022fr\u0022, 2 },\n+\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022;\u0022, 1},\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022q\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_FLOAT,\t\t\u00220.9\u0022, 3 },\n+\t\t{ LWS_TOKZE_DELIMITER,\t\t\t\u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022en\u0022, 2 },\n+\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022;\u0022, 1},\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022q\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_FLOAT,\t\t\u00220.8\u0022, 3 },\n+\t\t{ LWS_TOKZE_DELIMITER,\t\t\t\u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022de\u0022, 2 },\n+\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022;\u0022, 1},\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022q\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_FLOAT,\t\t\u00220.7\u0022, 3 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022*\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022;\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022q\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_FLOAT,\t\t\u00220.5\u0022, 3 },\n+\t\t{ LWS_TOKZE_ENDED, NULL, 0 },\n+\t},\n+\texpected3[] \u003d {\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022quoted\u0022, 6 },\n+\t\t\t{ LWS_TOKZE_QUOTED_STRING,\t\u0022things:\u0022, 7 },\n+\t\t{ LWS_TOKZE_DELIMITER,\t\t\t\u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_INTEGER,\t\t\u00221234\u0022, 4 },\n+\t\t{ LWS_TOKZE_ENDED, NULL, 0 },\n+\t},\n+\texpected4[] \u003d {\n+\t\t{ LWS_TOKZE_ERR_COMMA_LIST,\t\t\u0022,\u0022, 1 },\n+\t},\n+\texpected5[] \u003d {\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022brokenlist2\u0022, 11 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t{ LWS_TOKZE_ERR_COMMA_LIST,\t\t\u0022,\u0022, 1 },\n+\t},\n+\texpected6[] \u003d {\n+\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022brokenlist3\u0022, 11 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t{ LWS_TOKZE_ERR_COMMA_LIST,\t\t\u0022,\u0022, 1 },\n+\n+\t},\n+\texpected7[] \u003d {\n+\t\t\t{ LWS_TOKZE_TOKEN, \u0022fr\u0022, 2 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022-\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN, \u0022CH\u0022, 2 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN, \u0022fr\u0022, 2 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022;\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022q\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_FLOAT, \u00220.9\u0022, 3 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN, \u0022en\u0022, 2 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022;\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022q\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_FLOAT, \u00220.8\u0022, 3 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN, \u0022de\u0022, 2 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022;\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022q\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_FLOAT, \u00220.7\u0022, 3 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN, \u0022*\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_DELIMITER, \u0022;\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022q\u0022, 1 },\n+\t\t\t{ LWS_TOKZE_FLOAT, \u00220.5\u0022, 3 },\n+\t\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected8[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN, \u0022Οá½Ï‡á½¶\u0022, 10 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022ταá½Ï„á½°\u0022, 12 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022παÏίσταταί\u0022, 22 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022μοι\u0022, 6 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022γιγνώσκειν\u0022, 21 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022ὦ\u0022, 3 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022ἄνδÏες\u0022, 13 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022᾿Αθηναῖοι\u0022, 20 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022greek\u0022, 5 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected9[] \u003d {\n+\t\t/*\n+\t\t * because the tokenizer scans ahead for \u003d aggregation,\n+\t\t * it finds the broken utf8 before reporting the token\n+\t\t */\n+\t\t{ LWS_TOKZE_ERR_BROKEN_UTF8, \u0022\u0022, 0 },\n+\t},\n+\texpected10[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN, \u0022badutf8-2\u0022, 9 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022퟿\u0022, 3 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t{ LWS_TOKZE_ERR_BROKEN_UTF8, \u0022\u0022, 0 },\n+\t},\n+\texpected11[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN, \u00221.myserver\u0022, 10 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022.\u0022, 1 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022com\u0022, 3 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected12[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN, \u00221.myserver.com\u0022, 14 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected13[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN, \u00221.myserver.com\u0022, 14 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected14[] \u003d {\n+\t\t{ LWS_TOKZE_INTEGER, \u00221\u0022, 1 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022.\u0022, 1 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022myserver\u0022, 8 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022.\u0022, 1 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022com\u0022, 3 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected15[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN, \u0022close\u0022, 5 },\n+\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n+\t\t{ LWS_TOKZE_TOKEN, \u0022Upgrade\u0022, 7 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected16[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022a\u0022, 1 },\n+\t\t{ LWS_TOKZE_TOKEN, \u00225\u0022, 1 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected17[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN, \u0022hello\u0022, 5 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t},\n+\texpected18[] \u003d {\n+\t\t{ LWS_TOKZE_TOKEN, \u0022x\u003dy\u0022, 3 },\n+\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n+\t}\n+;\n+\n+struct tests tests[] \u003d {\n+\t{\n+\t\t\u0022 protocol-1, protocol_2\u005ct,\u005ctprotocol3\u005cn\u0022,\n+\t\texpected1, LWS_ARRAY_SIZE(expected1),\n+\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON\n+\t}, {\n+\t\t\u0022Accept-Language: fr-CH, fr;q\u003d0.9, en;q\u003d0.8, de;q\u003d0.7, *;q\u003d0.5\u0022,\n+\t\texpected2, LWS_ARRAY_SIZE(expected2),\n+\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON\n+\t}, {\n+\t\t\u0022quoted \u003d \u005c\u0022things:\u005c\u0022, 1234\u0022,\n+\t\texpected3, LWS_ARRAY_SIZE(expected3),\n+\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON\n+\t}, {\n+\t\t\u0022, brokenlist1\u0022,\n+\t\texpected4, LWS_ARRAY_SIZE(expected4),\n+\t\tLWS_TOKENIZE_F_COMMA_SEP_LIST\n+\t}, {\n+\t\t\u0022brokenlist2,,\u0022,\n+\t\texpected5, LWS_ARRAY_SIZE(expected5),\n+\t\tLWS_TOKENIZE_F_COMMA_SEP_LIST\n+\t}, {\n+\t\t\u0022brokenlist3,\u0022,\n+\t\texpected6, LWS_ARRAY_SIZE(expected6),\n+\t\tLWS_TOKENIZE_F_COMMA_SEP_LIST\n+\t}, {\n+\t\t\u0022fr-CH, fr;q\u003d0.9, en;q\u003d0.8, de;q\u003d0.7, *;q\u003d0.5\u0022,\n+\t\texpected7, LWS_ARRAY_SIZE(expected7),\n+\t\tLWS_TOKENIZE_F_ASTERISK_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS\n+\t},\n+\t{\n+\t\t\u0022 Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, greek\u0022,\n+\t\texpected8, LWS_ARRAY_SIZE(expected8),\n+\t\tLWS_TOKENIZE_F_RFC7230_DELIMS\n+\t},\n+\t{\n+\t\t\u0022badutf8-1 \u005cx80...\u0022,\n+\t\texpected9, LWS_ARRAY_SIZE(expected9),\n+\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS\n+\t},\n+\t{\n+\t\t\u0022badutf8-2 \u005cxed\u005cx9f\u005cxbf,\u005cx80...\u0022,\n+\t\texpected10, LWS_ARRAY_SIZE(expected10),\n+\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS\n+\t},\n+\t{\n+\t\t\u00221.myserver.com\u0022,\n+\t\texpected11, LWS_ARRAY_SIZE(expected11),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u00221.myserver.com\u0022,\n+\t\texpected12, LWS_ARRAY_SIZE(expected12),\n+\t\tLWS_TOKENIZE_F_DOT_NONTERM\n+\t},\n+\t{\n+\t\t\u00221.myserver.com\u0022,\n+\t\texpected13, LWS_ARRAY_SIZE(expected13),\n+\t\tLWS_TOKENIZE_F_DOT_NONTERM | LWS_TOKENIZE_F_NO_FLOATS\n+\t},\n+\t{\n+\t\t\u00221.myserver.com\u0022,\n+\t\texpected14, LWS_ARRAY_SIZE(expected14),\n+\t\tLWS_TOKENIZE_F_NO_FLOATS\n+\t},\n+\t{\n+\t\t\u0022close, Upgrade\u0022,\n+\t\texpected15, LWS_ARRAY_SIZE(expected15),\n+\t\tLWS_TOKENIZE_F_COMMA_SEP_LIST\n+\t},\n+\t{\n+\t\t\u0022a\u003d5\u0022, expected16, LWS_ARRAY_SIZE(expected16),\n+\t\tLWS_TOKENIZE_F_NO_INTEGERS\n+\t},\n+\t{\n+\t\t\u0022# comment1\u005cr\u005cnhello #comment2\u005cr\u005cn#comment3\u0022, expected17,\n+\t\tLWS_ARRAY_SIZE(expected17), LWS_TOKENIZE_F_HASH_COMMENT\n+\t},\n+\t{\n+\t\t\u0022x\u003dy\u0022, expected18,\n+\t\tLWS_ARRAY_SIZE(expected18), LWS_TOKENIZE_F_EQUALS_NONTERM\n+\t}\n+};\n+\n+/*\n+ * add LWS_TOKZE_ERRS to the element index (which may be negative by that\n+ * amount) to index this array\n+ */\n+\n+static const char *element_names[] \u003d {\n+\t\u0022LWS_TOKZE_ERR_BROKEN_UTF8\u0022,\n+\t\u0022LWS_TOKZE_ERR_UNTERM_STRING\u0022,\n+\t\u0022LWS_TOKZE_ERR_MALFORMED_FLOAT\u0022,\n+\t\u0022LWS_TOKZE_ERR_NUM_ON_LHS\u0022,\n+\t\u0022LWS_TOKZE_ERR_COMMA_LIST\u0022,\n+\t\u0022LWS_TOKZE_ENDED\u0022,\n+\t\u0022LWS_TOKZE_DELIMITER\u0022,\n+\t\u0022LWS_TOKZE_TOKEN\u0022,\n+\t\u0022LWS_TOKZE_INTEGER\u0022,\n+\t\u0022LWS_TOKZE_FLOAT\u0022,\n+\t\u0022LWS_TOKZE_TOKEN_NAME_EQUALS\u0022,\n+\t\u0022LWS_TOKZE_TOKEN_NAME_COLON\u0022,\n+\t\u0022LWS_TOKZE_QUOTED_STRING\u0022,\n+};\n+\n+\n+int\n+exp_cb1(void *priv, const char *name, char *out, size_t *pos, size_t olen,\n+\tsize_t *exp_ofs)\n+{\n+\tconst char *replace \u003d NULL;\n+\tsize_t total, budget;\n+\n+\tif (!strcmp(name, \u0022test\u0022)) {\n+\t\treplace \u003d \u0022replacement_string\u0022;\n+\t\ttotal \u003d strlen(replace);\n+\t\tgoto expand;\n+\t}\n+\n+\treturn LSTRX_FATAL_NAME_UNKNOWN;\n+\n+expand:\n+\tbudget \u003d olen - *pos;\n+\ttotal -\u003d *exp_ofs;\n+\tif (total \u003c budget)\n+\t\tbudget \u003d total;\n+\n+\tif (out)\n+\t\tmemcpy(out + *pos, replace + (*exp_ofs), budget);\n+\t*exp_ofs +\u003d budget;\n+\t*pos +\u003d budget;\n+\n+\tif (budget \u003d\u003d total)\n+\t\treturn LSTRX_DONE;\n+\n+\treturn LSTRX_FILLED_OUT;\n+}\n+\n+static const char *exp_inp1 \u003d \u0022this-is-a-${test}-for-strexp\u0022;\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *cx;\n+\tstruct lws_tokenize ts;\n+\tlws_tokenize_elem e;\n+\tconst char *p;\n+\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\tint fail \u003d 0, ok \u003d 0, flags \u003d 0;\n+\tchar dotstar[512];\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lws_tokenize\u005cn\u0022);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-f\u0022)))\n+\t\tflags \u003d atoi(p);\n+\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;\n+\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+#if 0\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+#endif\n+#if 0\n+\tn \u003d open(\u0022./warmcat.com.cer\u0022, O_RDONLY);\n+\tif (n \u003e\u003d 0) {\n+\t\tinfo.client_ssl_ca_mem_len \u003d read(n, memcert, sizeof(memcert));\n+\t\tinfo.client_ssl_ca_mem \u003d memcert;\n+\t\tclose(n);\n+\t\tn \u003d 0;\n+\t\tmemcert[info.client_ssl_ca_mem_len++] \u003d '\u005c0';\n+\t}\n+#endif\n+\tcx \u003d lws_create_context(\u0026info);\n+\n+\t/* lws_strexp */\n+\n+\t{\n+\t\tsize_t in_len, used_in, used_out;\n+\t\tlws_strexp_t exp;\n+\t\tchar obuf[128];\n+\t\tconst char *p;\n+\n+\t\tobuf[0] \u003d '\u005c0';\n+\t\tlws_strexp_init(\u0026exp, NULL, exp_cb1, obuf, sizeof(obuf));\n+\t\tn \u003d lws_strexp_expand(\u0026exp, exp_inp1, 28, \u0026used_in, \u0026used_out);\n+\t\tif (n !\u003d LSTRX_DONE || used_in !\u003d 28 ||\n+\t\t strcmp(obuf, \u0022this-is-a-replacement_string-for-strexp\u0022)) {\n+\t\t\tlwsl_notice(\u0022%s: obuf %s\u005cn\u0022, __func__, obuf);\n+\t\t\tlwsl_err(\u0022%s: lws_strexp test 1 failed: %d\u005cn\u0022, __func__, n);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\t/* as above, but don't generate output, just find the length */\n+\n+\t\tlws_strexp_init(\u0026exp, NULL, exp_cb1, NULL, (size_t)-1);\n+\t\tn \u003d lws_strexp_expand(\u0026exp, exp_inp1, 28, \u0026used_in, \u0026used_out);\n+\t\tif (n !\u003d LSTRX_DONE || used_in !\u003d 28 || used_out !\u003d 39) {\n+\t\t\tlwsl_err(\u0022%s: lws_strexp test 2 failed: %d, used_out: %d\u005cn\u0022,\n+\t\t\t\t\t__func__, n, (int)used_out);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tp \u003d exp_inp1;\n+\t\tin_len \u003d strlen(p);\n+\t\tmemset(obuf, 0, sizeof(obuf));\n+\t\tlws_strexp_init(\u0026exp, NULL, exp_cb1, obuf, 16);\n+\t\tn \u003d lws_strexp_expand(\u0026exp, p, in_len, \u0026used_in, \u0026used_out);\n+\t\tif (n !\u003d LSTRX_FILLED_OUT || used_in !\u003d 16 || used_out !\u003d 16) {\n+\t\t\tlwsl_err(\u0022a\u005cn\u0022);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tp +\u003d used_in;\n+\t\tin_len -\u003d used_in;\n+\n+\t\tmemset(obuf, 0, sizeof(obuf));\n+\t\tlws_strexp_reset_out(\u0026exp, obuf, 16);\n+\n+\t\tn \u003d lws_strexp_expand(\u0026exp, p, in_len, \u0026used_in, \u0026used_out);\n+\t\tif (n !\u003d LSTRX_FILLED_OUT || used_in !\u003d 5 || used_out !\u003d 16) {\n+\t\t\tlwsl_err(\u0022b: n %d, used_in %d, used_out %d\u005cn\u0022, n,\n+\t\t\t\t\t(int)used_in, (int)used_out);\n+\t\t\treturn 2;\n+\t\t}\n+\n+\t\tp +\u003d used_in;\n+\t\tin_len -\u003d used_in;\n+\n+\t\tmemset(obuf, 0, sizeof(obuf));\n+\t\tlws_strexp_reset_out(\u0026exp, obuf, 16);\n+\n+\t\tn \u003d lws_strexp_expand(\u0026exp, p, in_len, \u0026used_in, \u0026used_out);\n+\t\tif (n !\u003d LSTRX_DONE || used_in !\u003d 7 || used_out !\u003d 7) {\n+\t\t\tlwsl_err(\u0022c: n %d, used_in %d, used_out %d\u005cn\u0022, n, (int)used_in, (int)used_out);\n+\t\t\treturn 2;\n+\t\t}\n+\t}\n+\n+\t/* sanity check lws_strnncpy() */\n+\n+\tlws_strnncpy(dotstar, \u002212345678\u0022, 4, sizeof(dotstar));\n+\tif (strcmp(dotstar, \u00221234\u0022)) {\n+\t\tlwsl_err(\u0022%s: lws_strnncpy check failed\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\tlws_strnncpy(dotstar, \u002212345678\u0022, 8, 6);\n+\tif (strcmp(dotstar, \u002212345\u0022)) {\n+\t\tlwsl_err(\u0022%s: lws_strnncpy check failed\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\t/* sanity check lws_nstrstr() */\n+\n+\t{\n+\t\tstatic const char *t1 \u003d \u0022abc123456\u0022;\n+\t\tconst char *mcp;\n+\n+\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u0022abc\u0022, 3);\n+\t\tif (mcp !\u003d t1) {\n+\t\t\tlwsl_err(\u0022%s: lws_nstrstr 1 failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u0022def\u0022, 3);\n+\t\tif (mcp !\u003d NULL) {\n+\t\t\tlwsl_err(\u0022%s: lws_nstrstr 2 failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u0022456\u0022, 3);\n+\t\tif (mcp !\u003d t1 + 6) {\n+\t\t\tlwsl_err(\u0022%s: lws_nstrstr 3 failed: %p\u005cn\u0022, __func__, mcp);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u00221\u0022, 1);\n+\t\tif (mcp !\u003d t1 + 3) {\n+\t\t\tlwsl_err(\u0022%s: lws_nstrstr 4 failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u0022abc1234567\u0022, 10);\n+\t\tif (mcp !\u003d NULL) {\n+\t\t\tlwsl_err(\u0022%s: lws_nstrstr 5 failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t}\n+\n+\t/* sanity check lws_json_simple_find() */\n+\n+\t{\n+\t\tstatic const char *t1 \u003d \u0022{\u005c\u0022myname1\u005c\u0022:true,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022myname2\u005c\u0022:\u005c\u0022string\u005c\u0022, \u0022\n+\t\t\t\t\t \u0022\u005c\u0022myname3\u005c\u0022: 123}\u0022;\n+\t\tsize_t alen;\n+\t\tconst char *mcp;\n+\n+\t\tmcp \u003d lws_json_simple_find(t1, strlen(t1), \u0022\u005c\u0022myname1\u005c\u0022:\u0022, \u0026alen);\n+\t\tif (mcp !\u003d t1 + 11 || alen !\u003d 4) {\n+\t\t\tlwsl_err(\u0022%s: lws_json_simple_find 1 failed: (%d) %s\u005cn\u0022,\n+\t\t\t\t __func__, (int)alen, mcp);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tmcp \u003d lws_json_simple_find(t1, strlen(t1), \u0022\u005c\u0022myname2\u005c\u0022:\u0022, \u0026alen);\n+\t\tif (mcp !\u003d t1 + 27 || alen !\u003d 6) {\n+\t\t\tlwsl_err(\u0022%s: lws_json_simple_find 2 failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tmcp \u003d lws_json_simple_find(t1, strlen(t1), \u0022\u005c\u0022myname3\u005c\u0022:\u0022, \u0026alen);\n+\t\tif (mcp !\u003d t1 + 47 || alen !\u003d 3) {\n+\t\t\tlwsl_err(\u0022%s: lws_json_simple_find 3 failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tmcp \u003d lws_json_simple_find(t1, strlen(t1), \u0022\u005c\u0022nope\u005c\u0022:\u0022, \u0026alen);\n+\t\tif (mcp !\u003d NULL) {\n+\t\t\tlwsl_err(\u0022%s: lws_json_simple_find 4 failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t}\n+\n+\tp \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022);\n+\n+\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(tests); n++) {\n+\t\tint m \u003d 0, in_fail \u003d fail;\n+\t\tstruct expected *exp \u003d tests[n].exp;\n+\n+\t\tmemset(\u0026ts, 0, sizeof(ts));\n+\t\tts.start \u003d tests[n].string;\n+\t\tts.len \u003d strlen(ts.start);\n+\t\tts.flags \u003d (uint16_t)tests[n].flags;\n+\n+\t\tdo {\n+\t\t\te \u003d lws_tokenize(\u0026ts);\n+\n+\t\t\tlws_strnncpy(dotstar, ts.token, ts.token_len,\n+\t\t\t\t sizeof(dotstar));\n+\t\t\tlwsl_info(\u0022{ %s, \u005c\u0022%s\u005c\u0022, %d }\u005cn\u0022,\n+\t\t\t\t element_names[e + LWS_TOKZE_ERRS], dotstar,\n+\t\t\t\t (int)ts.token_len);\n+\n+\t\t\tif (m \u003d\u003d (int)tests[n].count) {\n+\t\t\t\tlwsl_notice(\u0022fail: expected end earlier\u005cn\u0022);\n+\t\t\t\tfail++;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tif (e !\u003d exp-\u003ee) {\n+\t\t\t\tlwsl_notice(\u0022fail... tok %s vs expected %s\u005cn\u0022,\n+\t\t\t\t\telement_names[e + LWS_TOKZE_ERRS],\n+\t\t\t\t\telement_names[exp-\u003ee + LWS_TOKZE_ERRS]);\n+\t\t\t\tfail++;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tif (e \u003e 0 \u0026\u0026\n+\t\t\t (ts.token_len !\u003d exp-\u003elen ||\n+\t\t\t memcmp(exp-\u003evalue, ts.token, exp-\u003elen))) {\n+\t\t\t\tlws_strnncpy(dotstar, ts.token, ts.token_len,\n+\t\t\t\t\t sizeof(dotstar));\n+\t\t\t\tlwsl_notice(\u0022fail token mismatch %d %d %s\u005cn\u0022,\n+\t\t\t\t\t (int)ts.token_len, (int)exp-\u003elen,\n+\t\t\t\t\t dotstar);\n+\t\t\t\tfail++;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tm++;\n+\t\t\texp++;\n+\n+\t\t} while (e \u003e 0);\n+\n+\t\tif (fail \u003d\u003d in_fail)\n+\t\t\tok++;\n+\t}\n+\n+\tif (p) {\n+\t\tts.start \u003d p;\n+\t\tts.len \u003d strlen(p);\n+\t\tts.flags \u003d (uint16_t)flags;\n+\n+\t\tprintf(\u0022\u005ct{\u005cn\u005ct\u005ct\u005c\u0022%s\u005c\u0022,\u005cn\u0022\n+\t\t \u0022\u005ct\u005ctexpected%d, LWS_ARRAY_SIZE(expected%d),\u005cn\u005ct\u005ct\u0022,\n+\t\t p, (int)LWS_ARRAY_SIZE(tests) + 1,\n+\t\t (int)LWS_ARRAY_SIZE(tests) + 1);\n+\n+\t\tif (!flags)\n+\t\t\tprintf(\u00220\u005cn\u005ct},\u005cn\u0022);\n+\t\telse {\n+\t\t\tif (flags \u0026 LWS_TOKENIZE_F_MINUS_NONTERM)\n+\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_MINUS_NONTERM\u0022);\n+\t\t\tif (flags \u0026 LWS_TOKENIZE_F_AGG_COLON) {\n+\t\t\t\tif (flags \u0026 1)\n+\t\t\t\t\tprintf(\u0022 | \u0022);\n+\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_AGG_COLON\u0022);\n+\t\t\t}\n+\t\t\tif (flags \u0026 LWS_TOKENIZE_F_COMMA_SEP_LIST) {\n+\t\t\t\tif (flags \u0026 3)\n+\t\t\t\t\tprintf(\u0022 | \u0022);\n+\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_COMMA_SEP_LIST\u0022);\n+\t\t\t}\n+\t\t\tif (flags \u0026 LWS_TOKENIZE_F_RFC7230_DELIMS) {\n+\t\t\t\tif (flags \u0026 7)\n+\t\t\t\t\tprintf(\u0022 | \u0022);\n+\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_RFC7230_DELIMS\u0022);\n+\t\t\t}\n+\t\t\tif (flags \u0026 LWS_TOKENIZE_F_DOT_NONTERM) {\n+\t\t\t\tif (flags \u0026 15)\n+\t\t\t\t\tprintf(\u0022 | \u0022);\n+\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_DOT_NONTERM\u0022);\n+\t\t\t}\n+\t\t\tif (flags \u0026 LWS_TOKENIZE_F_NO_FLOATS) {\n+\t\t\t\tif (flags \u0026 31)\n+\t\t\t\t\tprintf(\u0022 | \u0022);\n+\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_NO_FLOATS\u0022);\n+\t\t\t}\n+\t\t\tprintf(\u0022\u005cn\u005ct},\u005cn\u0022);\n+\t\t}\n+\n+\t\tprintf(\u0022\u005ctexpected%d[] \u003d {\u005cn\u0022, (int)LWS_ARRAY_SIZE(tests) + 1);\n+\n+\t\tdo {\n+\t\t\te \u003d lws_tokenize(\u0026ts);\n+\n+\t\t\tlws_strnncpy(dotstar, ts.token, ts.token_len,\n+\t\t\t\t sizeof(dotstar));\n+\n+\t\t\tprintf(\u0022\u005ct\u005ct{ %s, \u005c\u0022%s\u005c\u0022, %d },\u005cn\u0022,\n+\t\t\t\t element_names[e + LWS_TOKZE_ERRS],\n+\t\t\t\t dotstar, (int)ts.token_len);\n+\n+\t\t} while (e \u003e 0);\n+\n+\t\tprintf(\u0022\u005ct}\u005cn\u0022);\n+\t}\n+\n+#if defined(LWS_ROLE_H1) || defined(LWS_ROLE_H2)\n+\t{\n+\t\ttime_t t;\n+\n+\t\tif (lws_http_date_parse_unix(\u0022Tue, 15 Nov 1994 08:12:31 GMT\u0022, 29, \u0026t)) {\n+\t\t\tlwsl_err(\u0022%s: date parse failed\u005cn\u0022, __func__);\n+\t\t\tfail++;\n+\t\t} else {\n+\t\t\t/* lwsl_notice(\u0022%s: %llu\u005cn\u0022, __func__, (unsigned long long)t); */\n+\t\t\tif (t !\u003d (time_t)784887151) {\n+\t\t\t\tlwsl_err(\u0022%s: date parse wrong\u005cn\u0022, __func__);\n+\t\t\t\tfail++;\n+\t\t\t} else {\n+\t\t\t\tchar s[30];\n+\n+\t\t\t\tif (lws_http_date_render_from_unix(s, sizeof(s), \u0026t)) {\n+\t\t\t\t\tlwsl_err(\u0022%s: failed date render\u005cn\u0022, __func__);\n+\t\t\t\t\tfail++;\n+\t\t\t\t} else {\n+\t\t\t\t\tif (!strcmp(s, \u0022Tue, 15 Nov 1994 08:12:31 GMT\u0022)) {\n+\t\t\t\t\t\tlwsl_err(\u0022%s: date render wrong\u005cn\u0022, __func__);\n+\t\t\t\t\t\tfail++;\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t}\n+#endif\n+\n+\t{\n+\t\tchar buf[24];\n+\t\tint m;\n+\n+\t\tm \u003d lws_humanize(buf, sizeof(buf), 0, humanize_schema_si);\n+\t\tif (m !\u003d 1 || strcmp(buf, \u00220\u0022)) {\n+\t\t\tlwsl_user(\u0022%s: humanize 1 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n+\t\t\tfail++;\n+\t\t}\n+\t\tm \u003d lws_humanize(buf, sizeof(buf), 2, humanize_schema_si);\n+\t\tif (m !\u003d 1 || strcmp(buf, \u00222\u0022)) {\n+\t\t\tlwsl_user(\u0022%s: humanize 2 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n+\t\t\tfail++;\n+\t\t}\n+\t\tm \u003d lws_humanize(buf, sizeof(buf), 999, humanize_schema_si);\n+\t\tif (m !\u003d 3 || strcmp(buf, \u0022999\u0022)) {\n+\t\t\tlwsl_user(\u0022%s: humanize 3 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n+\t\t\tfail++;\n+\t\t}\n+\t\tm \u003d lws_humanize(buf, sizeof(buf), 1000, humanize_schema_si);\n+\t\tif (m !\u003d 4 || strcmp(buf, \u00221000\u0022)) {\n+\t\t\tlwsl_user(\u0022%s: humanize 4 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n+\t\t\tfail++;\n+\t\t}\n+\t\tm \u003d lws_humanize(buf, sizeof(buf), 1024, humanize_schema_si);\n+\t\tif (m !\u003d 7 || strcmp(buf, \u00221.000Ki\u0022)) {\n+\t\t\tlwsl_user(\u0022%s: humanize 5 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n+\t\t\tfail++;\n+\t\t}\n+\t}\n+\n+\tif (lws_strcmp_wildcard(\u0022allied\u0022, 6, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 1 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022a*\u0022, 2, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 2 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022all*\u0022, 4, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 3 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022all*d\u0022, 5, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 4 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (!lws_strcmp_wildcard(\u0022b*\u0022, 2, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 5 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (!lws_strcmp_wildcard(\u0022b*ed\u0022, 4, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 6 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (!lws_strcmp_wildcard(\u0022allie\u0022, 5, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 7 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022allie*\u0022, 6, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 8 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022*llie*\u0022, 6, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 9 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022*llied\u0022, 6, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 10 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (!lws_strcmp_wildcard(\u0022*llie\u0022, 5, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 11 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (!lws_strcmp_wildcard(\u0022*nope\u0022, 5, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 12 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022*li*\u0022, 4, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 13 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022*\u0022, 1, \u0022allied\u0022, 6)) {\n+\t\tlwsl_user(\u0022%s: wc 14 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022*abc*d\u0022, 6, \u0022xxabyyabcdd\u0022, 11)) {\n+\t\tlwsl_user(\u0022%s: wc 15 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\tif (lws_strcmp_wildcard(\u0022ssproxy.n.cn.*\u0022, 14,\n+\t\t\t\t\u0022ssproxy.n.cn.failures\u0022, 21)) {\n+\t\tlwsl_user(\u0022%s: wc 16 fail\u005cn\u0022, __func__);\n+\t\tfail++;\n+\t}\n+\n+\tlwsl_user(\u0022Completed: PASS: %d, FAIL: %d\u005cn\u0022, ok, fail);\n+\n+\tlws_context_destroy(cx);\n+\n+\treturn !(ok \u0026\u0026 !fail);\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lwsac/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lwsac/CMakeLists.txt\nnew file mode 100644\nindex 0000000..f7d0aaf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lwsac/CMakeLists.txt\n@@ -0,0 +1,19 @@\n+project(lws-api-test-lwsac C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-api-test-lwsac)\n+set(SRCS main.c)\n+\n+add_executable(${SAMP} ${SRCS})\n+add_test(NAME api-test-lwsac COMMAND lws-api-test-lwsac)\n+\n+if (websockets_shared)\n+\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\tadd_dependencies(${SAMP} websockets_shared)\n+else()\n+\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lwsac/README.md b/minimal-examples-lowlevel/api-tests/api-test-lwsac/README.md\nnew file mode 100644\nindex 0000000..74034c7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lwsac/README.md\n@@ -0,0 +1,22 @@\n+# lws api test lwsac\n+\n+Demonstrates how to use and performs selftests for lwsac\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-lwsac\n+[2018/10/09 09:14:17:4834] USER: LWS API selftest: lwsac\n+[2018/10/09 09:14:17:4835] USER: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-lwsac/main.c b/minimal-examples-lowlevel/api-tests/api-test-lwsac/main.c\nnew file mode 100644\nindex 0000000..0ea0aa4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-lwsac/main.c\n@@ -0,0 +1,83 @@\n+/*\n+ * lws-api-test-lwsac\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+struct mytest {\n+\tint payload;\n+\t/* notice doesn't have to be at start of struct */\n+\tlws_list_ptr list_next;\n+\t/* a struct can appear on multiple lists too... */\n+};\n+\n+/* converts a ptr to struct mytest .list_next to a ptr to struct mytest */\n+#define list_to_mytest(p) lws_list_ptr_container(p, struct mytest, list_next)\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, acc;\n+\tlws_list_ptr list_head \u003d NULL, iter;\n+\tstruct lwsac *lwsac \u003d NULL;\n+\tstruct mytest *m;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: lwsac\u005cn\u0022);\n+\n+\t/*\n+\t * 1) allocate and create 1000 struct mytest in a linked-list\n+\t */\n+\n+\tfor (n \u003d 0; n \u003c 1000; n++) {\n+\t\tm \u003d lwsac_use(\u0026lwsac, sizeof(*m), 0);\n+\t\tif (!m)\n+\t\t\treturn -1;\n+\t\tm-\u003epayload \u003d n;\n+\n+\t\tlws_list_ptr_insert(\u0026list_head, \u0026m-\u003elist_next, NULL);\n+\t}\n+\n+\t/*\n+\t * 2) report some debug info about the lwsac state... those 1000\n+\t * allocations actually only required 4 mallocs\n+\t */\n+\n+\tlwsac_info(lwsac);\n+\n+\t/* 3) iterate the list, accumulating the payloads */\n+\n+\tacc \u003d 0;\n+\titer \u003d list_head;\n+\twhile (iter) {\n+\t\tm \u003d list_to_mytest(iter);\n+\t\tacc +\u003d m-\u003epayload;\n+\n+\t\tlws_list_ptr_advance(iter);\n+\t}\n+\n+\tif (acc !\u003d 499500) {\n+\t\tlwsl_err(\u0022%s: FAIL acc %d\u005cn\u0022, __func__, acc);\n+\n+\t\treturn 1;\n+\t}\n+\n+\t/*\n+\t * 4) deallocate everything (lwsac is also set to NULL). It just\n+\t * deallocates the 4 mallocs, everything in there is gone accordingly\n+\t */\n+\n+\tlwsac_free(\u0026lwsac);\n+\n+\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-secure-streams/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/CMakeLists.txt\nnew file mode 100644\nindex 0000000..3c24f6d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/CMakeLists.txt\n@@ -0,0 +1,31 @@\n+project(lws-api-test-secure-streams C)\n+cmake_minimum_required(VERSION 2.8.12)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${PROJECT_NAME} main.c)\n+\t\n+\tif (LWS_CTEST_INTERNET_AVAILABLE)\n+\t\tadd_test(NAME api-test-secure-streams COMMAND ${PROJECT_NAME})\n+\t\tset_tests_properties(api-test-secure-streams\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/api-tests/api-test-secure-streams\n+\t\t\t\t TIMEOUT 20)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-secure-streams/README.md b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/README.md\nnew file mode 100644\nindex 0000000..a5a220a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/README.md\n@@ -0,0 +1,21 @@\n+# lws api test Secure Streams\n+\n+Performs some tests against httpbin.org server\n+to check Secure Streams client performance\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+ $ ./lws-api-test-secure-streams\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-secure-streams/main.c b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/main.c\nnew file mode 100644\nindex 0000000..841cd1a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/main.c\n@@ -0,0 +1,387 @@\n+/*\n+ * lws-api-test-secure-streams\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Let's exercise some basic SS / h1 functionality against httpbin.org\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1;\n+static lws_state_notify_link_t nl;\n+static struct lws_context *context;\n+\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+\n+\t\t\u0022{\u005c\u0022amz_root_ca1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\u0022\n+\t\u0022ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\u0022\n+\t\u0022b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\u0022\n+\t\u0022MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\u0022\n+\t\u0022b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\u0022\n+\t\u0022ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\u0022\n+\t\u00229O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\u0022\n+\t\u0022IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\u0022\n+\t\u0022VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\u0022\n+\t\u002293FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\u0022\n+\t\u0022jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\u0022\n+\t\u0022AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\u0022\n+\t\u0022A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\u0022\n+\t\u0022U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\u0022\n+\t\u0022N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\u0022\n+\t\u0022o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\u0022\n+\t\u00225MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\u0022\n+\t\u0022rqXRfboQnoZsG4q5WTP468SQvvG5\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022amz\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022amz_root_ca1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t \t/*\n+\t\t * \u0022fetch_policy\u0022 decides from where the real policy\n+\t\t * will be fetched, if present. Otherwise the initial\n+\t\t * policy is treated as the whole, hardcoded, policy.\n+\t\t */\n+\t\t\u0022{\u005c\u0022httpbin_get\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022/get\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022amz\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t\u0022{\u005c\u0022httpbin_get404\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022/status/404\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022amz\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t\u0022{\u005c\u0022httpbin_post\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022/post\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022amz\u005c\u0022\u0022\n+\t\t\t\u0022}}\u0022\n+ \u0022}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+typedef struct atss {\n+\tconst lws_ss_info_t\t\t*ssi;\n+\tsize_t\t\t\t\tsend;\n+\tchar\t\t\t\texpect_nack;\n+} atss_t;\n+\n+static const atss_t *next_test;\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tsize_t\t\t\t\tpayload;\n+\tsize_t\t\t\t\tsent;\n+\tchar\t\t\t\tseen_eom;\n+\tchar\t\t\t\tended_well;\n+} myss_t;\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_hexdump_info(buf, len);\n+\n+\tm-\u003epayload +\u003d len;\n+\n+\tif (!(flags \u0026 LWSSS_FLAG_EOM))\n+\t\tm-\u003eseen_eom \u003d 1;\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx_get(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\t int *flags)\n+{\n+\treturn 1; /* nothing to send */\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx_post(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\t int *flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tsize_t budget \u003d (next_test-\u003esend - m-\u003esent);\n+\n+\tif (!budget)\n+\t\treturn 1;\n+\n+\tif (*len \u003c budget)\n+\t\tbudget \u003d *len;\n+\n+\tif (!m-\u003esent)\n+\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\tmemset(buf, 0x55, budget);\n+\t*len \u003d budget;\n+\tm-\u003esent +\u003d budget;\n+\tif (m-\u003esent !\u003d next_test-\u003esend)\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\t*flags |\u003d LWSSS_FLAG_EOM;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tlws_ss_state_return_t r;\n+\n+\tlwsl_notice(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name((int)state),\n+\t\t (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tr \u003d lws_ss_client_connect(m-\u003ess);\n+\t\tif (r)\n+\t\t\treturn r;\n+\t\tif (next_test-\u003esend)\n+\t\t\treturn lws_ss_request_tx_len(m-\u003ess, (unsigned long)next_test-\u003esend);\n+\t\tbreak;\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\tlwsl_notice(\u0022%s: Connection failed\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_QOS_NACK_REMOTE:\n+\t\tif (next_test-\u003eexpect_nack)\n+\t\t\tgoto happy;\n+\t\tlwsl_notice(\u0022%s: remote NACK\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\t/*\n+\t\t * To be satisfied, we want to see the ACK_REMOTE indicating\n+\t\t * that the transaction went through; that we had the payload\n+\t\t * EOM; and that we saw at least 200 + posted bytes response\n+\t\t */\n+\n+\t\tif (!m-\u003eseen_eom || m-\u003epayload \u003c 200 + next_test-\u003esend) {\n+\t\t\tlwsl_warn(\u0022%s: ACK_REMOTE but eom %d, payload %d\u005cn\u0022,\n+\t\t\t\t __func__, m-\u003eseen_eom, (int)m-\u003epayload);\n+\t\t\tinterrupted \u003d 1;\n+\t\t\treturn -1;\n+\t\t}\n+\n+happy:\n+\t\t/* when we disconnect, we can go happily */\n+\t\tm-\u003eended_well \u003d 1;\n+\n+\t\tif (!(++next_test)-\u003essi) {\n+\t\t\tlwsl_notice(\u0022%s: completed all tests\u005cn\u0022, __func__);\n+\t\t\tbad \u003d 0;\n+\t\t\tinterrupted \u003d 1;\n+\t\t\tbreak;\n+\t\t}\n+\t\tif (lws_ss_create(context, 0, next_test-\u003essi,\n+\t\t\t\t NULL, NULL, NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tif (!m-\u003eended_well) {\n+\t\t\tlwsl_warn(\u0022%s: DISCONNECTED without good end\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\t\tinterrupted \u003d 1;\n+\t\t}\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static const lws_ss_info_t ssi_get \u003d {\n+\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n+\t.rx\t\t\t\t\u003d myss_rx,\n+\t.tx\t\t\t\t\u003d myss_tx_get,\n+\t.state\t\t\t\t\u003d myss_state,\n+\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n+\t.streamtype\t\t\t\u003d \u0022httpbin_get\u0022\n+}, ssi_get404 \u003d {\n+\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n+\t.rx\t\t\t\t\u003d myss_rx,\n+\t.tx\t\t\t\t\u003d myss_tx_get,\n+\t.state\t\t\t\t\u003d myss_state,\n+\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n+\t.streamtype\t\t\t\u003d \u0022httpbin_get404\u0022\n+}, ssi_post \u003d {\n+\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n+\t.rx\t\t\t\t\u003d myss_rx,\n+\t.tx\t\t\t\t\u003d myss_tx_post,\n+\t.state\t\t\t\t\u003d myss_state,\n+\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n+\t.streamtype\t\t\t\u003d \u0022httpbin_post\u0022\n+};\n+\n+static const atss_t test_list[] \u003d {\n+\t\t{ .ssi \u003d \u0026ssi_get },\n+\t\t{ .ssi \u003d \u0026ssi_get404, .expect_nack \u003d 1 },\n+\t\t{ .ssi \u003d \u0026ssi_post, .send \u003d 4096 },\n+\t\t{ .ssi \u003d NULL }\n+};\n+\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\n+\t\t\tnext_test \u003d \u0026test_list[0];\n+\n+\t\t\tif (lws_ss_create(context, 0, next_test-\u003essi,\n+\t\t\t\t\t NULL, NULL, NULL, NULL)) {\n+\t\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\t/* these options are mutually exclusive if given */\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-smtp_client/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/CMakeLists.txt\nnew file mode 100644\nindex 0000000..49e67ff\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-unit-tests-smtp-client C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-unit-tests-smtp-client)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SMTP 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-smtp_client/README.md b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/README.md\nnew file mode 100644\nindex 0000000..4c2052d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/README.md\n@@ -0,0 +1,41 @@\n+# lws api test smtp client\n+\n+Performs unit tests on the lws SMTP client abstract protocol\n+implementation.\n+\n+The first test \u0022sends mail to a server\u0022 (actually is prompted by\n+test vectors that look like a server) and the second test\n+confirm it can handle rejection by the \u0022server\u0022 cleanly.\n+\n+## build\n+\n+Requires lws was built with `-DLWS_WITH_SMTP\u003d1` at cmake.\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-r \u003crecipient@whatever.com\u003e|Send the test email to this email address\n+\n+\n+```\n+ $ ./lws-api-test-smtp_client\n+[2019/06/28 21:56:41:0711] USER: LWS API selftest: SMTP client unit tests\n+[2019/06/28 21:56:41:1114] NOTICE: test_sequencer_cb: test-seq: created\n+[2019/06/28 21:56:41:1259] NOTICE: unit_test_sequencer_cb: unit-test-seq: created\n+[2019/06/28 21:56:41:1272] NOTICE: lws_atcut_client_conn: smtp: test 'sending': start\n+[2019/06/28 21:56:41:1441] NOTICE: unit_test_sequencer_cb: unit-test-seq: created\n+[2019/06/28 21:56:41:1442] NOTICE: lws_atcut_client_conn: smtp: test 'rejected': start\n+[2019/06/28 21:56:41:1453] NOTICE: lws_smtp_client_abs_rx: bad response from server: 500 (state 4) 500 Service Unavailable\n+[2019/06/28 21:56:41:1467] USER: test_sequencer_cb: sequence completed OK\n+[2019/06/28 21:56:41:1474] USER: main: 2 tests 0 fail\n+[2019/06/28 21:56:41:1476] USER: test 0: PASS\n+[2019/06/28 21:56:41:1478] USER: test 1: PASS\n+[2019/06/28 21:56:41:1480] USER: Completed: PASS\n+```\n+\ndiff --git a/minimal-examples-lowlevel/api-tests/api-test-smtp_client/main.c b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/main.c\nnew file mode 100644\nindex 0000000..c32e5ac\n--- /dev/null\n+++ b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/main.c\n@@ -0,0 +1,261 @@\n+/*\n+ * lws-unit-tests-smtp-client\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This performs unit tests for the SMTP client abstract protocol\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, results[10], count_tests, count_passes;\n+\n+static int\n+email_sent_or_failed(struct lws_smtp_email *email, void *buf, size_t len)\n+{\n+\tfree(email);\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * The test helper calls this on the instance it created to prepare it for\n+ * the test. In our case, we need to queue up a test email to send on the\n+ * smtp client abstract protocol.\n+ */\n+\n+static int\n+smtp_test_instance_init(lws_abs_t *instance)\n+{\n+\tlws_smtp_email_t *email \u003d (lws_smtp_email_t *)\n+\t\t\t\t\tmalloc(sizeof(*email) + 2048);\n+\n+\tif (!email)\n+\t\treturn 1;\n+\n+\t/* attach an email to it */\n+\n+\tmemset(email, 0, sizeof(*email));\n+\temail-\u003edata \u003d NULL /* email specific user data */;\n+\temail-\u003eemail_from \u003d \u0022noreply@warmcat.com\u0022;\n+\temail-\u003eemail_to \u003d \u0022andy@warmcat.com\u0022;\n+\temail-\u003epayload \u003d (void *)\u0026email[1];\n+\n+\tlws_snprintf((char *)email-\u003epayload, 2048,\n+\t\t\t\u0022From: noreply@example.com\u005cn\u0022\n+\t\t\t\u0022To: %s\u005cn\u0022\n+\t\t\t\u0022Subject: Test email for lws smtp-client\u005cn\u0022\n+\t\t\t\u0022\u005cn\u0022\n+\t\t\t\u0022Hello this was an api test for lws smtp-client\u005cn\u0022\n+\t\t\t\u0022\u005cr\u005cn.\u005cr\u005cn\u0022, \u0022andy@warmcat.com\u0022);\n+\temail-\u003edone \u003d email_sent_or_failed;\n+\n+\tif (lws_smtpc_add_email(instance, email)) {\n+\t\tlwsl_err(\u0022%s: failed to add email\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * from https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol\n+ *\n+ *\t\ttest vector sent to protocol\n+ *\t\t\t\ttest vector received from protocol\n+ */\n+\n+static lws_unit_test_packet_t test_send1[] \u003d {\n+\t{\n+\t\t\u0022220 smtp.example.com ESMTP Postfix\u0022,\n+\t\tsmtp_test_instance_init, 34, LWS_AUT_EXPECT_RX\n+\t}, {\n+\t\t\t\t\u0022HELO lws-test-client\u005cx0a\u0022,\n+\t\tNULL, 21, LWS_AUT_EXPECT_TX\n+\t}, {\n+\t\t\u0022250 smtp.example.com, I am glad to meet you\u0022,\n+\t\tNULL, 43, LWS_AUT_EXPECT_RX\n+\t}, {\n+\t\t\t\t\u0022MAIL FROM: \u003cnoreply@warmcat.com\u003e\u005cx0a\u0022,\n+\t\tNULL, 33, LWS_AUT_EXPECT_TX\n+\t}, {\n+\t\t\u0022250 Ok\u0022,\n+\t\tNULL, 6, LWS_AUT_EXPECT_RX\n+\t}, {\n+\t\t\t\t\u0022RCPT TO: \u003candy@warmcat.com\u003e\u005cx0a\u0022,\n+\t\tNULL, 28, LWS_AUT_EXPECT_TX\n+\t}, {\n+\t\t\u0022250 Ok\u0022,\n+\t\tNULL, 6, LWS_AUT_EXPECT_RX\n+\t}, {\n+\t\t\t\t\u0022DATA\u005cx0a\u0022,\n+\t\tNULL, 5, LWS_AUT_EXPECT_TX\n+\t}, {\n+\t\t\u0022354 End data with \u003cCR\u003e\u003cLF\u003e.\u003cCR\u003e\u003cLF\u003e\u005cx0a\u0022,\n+\t\tNULL, 35, LWS_AUT_EXPECT_RX\n+\t}, {\n+\t\t\t\t\u0022From: noreply@example.com\u005cn\u0022\n+\t\t\t\t\u0022To: andy@warmcat.com\u005cn\u0022\n+\t\t\t\t\u0022Subject: Test email for lws smtp-client\u005cn\u0022\n+\t\t\t\t\u0022\u005cn\u0022\n+\t\t\t\t\u0022Hello this was an api test for lws smtp-client\u005cn\u0022\n+\t\t\t\t\u0022\u005cr\u005cn.\u005cr\u005cn\u0022,\n+\t\tNULL, 27 + 21 + 39 + 1 + 47 + 5, LWS_AUT_EXPECT_TX\n+\t}, {\n+\t\t\u0022250 Ok: queued as 12345\u005cx0a\u0022,\n+\t\tNULL, 23, LWS_AUT_EXPECT_RX\n+\t}, {\n+\t\t\t\t\u0022quit\u005cx0a\u0022,\n+\t\tNULL, 5, LWS_AUT_EXPECT_TX\n+\t}, {\n+\t\t\u0022221 Bye\u005cx0a\u0022,\n+\t\tNULL, 7, LWS_AUT_EXPECT_RX |\n+\t\t LWS_AUT_EXPECT_LOCAL_CLOSE |\n+\t\t LWS_AUT_EXPECT_DO_REMOTE_CLOSE |\n+\t\t LWS_AUT_EXPECT_TEST_END\n+\t}, { \t/* sentinel */\n+\n+\t}\n+};\n+\n+\n+static lws_unit_test_packet_t test_send2[] \u003d {\n+\t{\n+\t\t\u0022220 smtp.example.com ESMTP Postfix\u0022,\n+\t\tsmtp_test_instance_init, 34, LWS_AUT_EXPECT_RX\n+\t}, {\n+\t\t\t\t\u0022HELO lws-test-client\u005cx0a\u0022,\n+\t\tNULL, 21, LWS_AUT_EXPECT_TX\n+\t}, {\n+\t\t\u0022250 smtp.example.com, I am glad to meet you\u0022,\n+\t\tNULL, 43, LWS_AUT_EXPECT_RX\n+\t}, {\n+\t\t\t\t\u0022MAIL FROM: \u003cnoreply@warmcat.com\u003e\u005cx0a\u0022,\n+\t\tNULL, 33, LWS_AUT_EXPECT_TX\n+\t}, {\n+\t\t\u0022500 Service Unavailable\u0022,\n+\t\tNULL, 23, LWS_AUT_EXPECT_RX |\n+\t\t LWS_AUT_EXPECT_DO_REMOTE_CLOSE |\n+\t\t LWS_AUT_EXPECT_TEST_END\n+\t}, { \t/* sentinel */\n+\n+\t}\n+};\n+\n+static lws_unit_test_t tests[] \u003d {\n+\t{ \u0022sending\u0022, test_send1, 3 },\n+\t{ \u0022rejected\u0022, test_send2, 3 },\n+\t{ }\t/* sentinel */\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+/*\n+ * set the HELO our SMTP client will use\n+ */\n+\n+static const lws_token_map_t smtp_ap_tokens[] \u003d {\n+ {\n+\t.u \u003d { .value \u003d \u0022lws-test-client\u0022 },\n+\t.name_index \u003d LTMI_PSMTP_V_HELO,\n+ }, {\t/* sentinel */\n+ }\n+};\n+\n+void\n+tests_completion_cb(const void *cb_user)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tlws_test_sequencer_args_t args;\n+\tstruct lws_context *context;\n+\tlws_abs_t *abs \u003d NULL;\n+\tstruct lws_vhost *vh;\n+\tconst char *p;\n+\n+\t/* the normal lws init */\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS API selftest: SMTP client unit tests\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tvh \u003d lws_create_vhost(context, \u0026info);\n+\tif (!vh) {\n+\t\tlwsl_err(\u0022Failed to create first vhost\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* create the abs used to create connections */\n+\n+\tabs \u003d lws_abstract_alloc(vh, NULL, \u0022smtp.unit_test\u0022,\n+\t\t\t\t \u0026smtp_ap_tokens[0], NULL);\n+\tif (!abs)\n+\t\tgoto bail1;\n+\n+\t/* configure the test sequencer */\n+\n+\targs.abs \u003d abs;\n+\targs.tests \u003d tests;\n+\targs.results \u003d results;\n+\targs.results_max \u003d LWS_ARRAY_SIZE(results);\n+\targs.count_tests \u003d \u0026count_tests;\n+\targs.count_passes \u003d \u0026count_passes;\n+\targs.cb \u003d tests_completion_cb;\n+\targs.cb_user \u003d NULL;\n+\n+\tif (lws_abs_unit_test_sequencer(\u0026args)) {\n+\t\tlwsl_err(\u0022%s: failed to create test sequencer\u005cn\u0022, __func__);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/* the usual lws event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\t/* describe the overall test results */\n+\n+\tlwsl_user(\u0022%s: %d tests %d fail\u005cn\u0022, __func__, count_tests,\n+\t\t\tcount_tests - count_passes);\n+\tfor (n \u003d 0; n \u003c count_tests; n++)\n+\t\tlwsl_user(\u0022 test %d: %s\u005cn\u0022, n,\n+\t\t\t lws_unit_test_result_name(results[n]));\n+\n+bail1:\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022,\n+\t\t !count_tests || count_passes !\u003d count_tests ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n+\n+\tlws_context_destroy(context);\n+\n+\tlws_abstract_free(\u0026abs);\n+\n+\treturn !count_tests || count_passes !\u003d count_tests;\n+}\ndiff --git a/minimal-examples-lowlevel/client-server/README.md b/minimal-examples-lowlevel/client-server/README.md\nnew file mode 100644\nindex 0000000..7339c61\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/README.md\n@@ -0,0 +1,3 @@\n+|name|demonstrates|\n+---|---\n+minimal-ws-proxy|Serves an index.html over http that connects back to the ws server, and maintains a ws client connection of its own at the same time to https://libwebsockets.org dumb-increment-protocol to feed a ringbuffer that is sent to all connected browsers.\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/CMakeLists.txt b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/CMakeLists.txt\nnew file mode 100644\nindex 0000000..65a01b6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-proxy C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-proxy)\n+set(SRCS minimal-ws-proxy.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/README.md b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/README.md\nnew file mode 100644\nindex 0000000..5c65500\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/README.md\n@@ -0,0 +1,38 @@\n+# lws minimal ws proxy\n+\n+## Build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Description\n+\n+This is the same as minimal-ws-server-ring, but with the\n+inclusion of a ws client connection to https://libwebsockets.org\n+using the dumb-increment protocol feeding the ringbuffer.\n+\n+Each client that connect to this server receives the content that\n+had arrived on the client connection feeding the ringbuffer proxied\n+to their browser window over a ws connection.\n+\n+## Usage\n+\n+```\n+ $ ./lws-minimal-ws-proxy \n+[2018/03/14 17:50:10:6938] USER: LWS minimal ws proxy | visit http://localhost:7681\n+[2018/03/14 17:50:10:6955] NOTICE: Creating Vhost 'default' port 7681, 2 protocols, IPv6 off\n+[2018/03/14 17:50:10:6955] NOTICE: Using non-SSL mode\n+[2018/03/14 17:50:10:7035] NOTICE: created client ssl context for default\n+[2018/03/14 17:50:11:7047] NOTICE: binding to lws-minimal-proxy\n+[2018/03/14 17:50:11:7047] NOTICE: lws_client_connect_2: 0x872e60: address libwebsockets.org\n+[2018/03/14 17:50:12:3282] NOTICE: lws_client_connect_2: 0x872e60: address libwebsockets.org\n+[2018/03/14 17:50:13:8195] USER: callback_minimal: established\n+```\n+\n+Visit http://localhost:7681 on multiple browser windows\n+\n+Data received on the remote wss connection is copied to all open browser windows.\n+\n+A ringbuffer holds up to 8 lines of text in the server, and the browser shows\n+the last 20 lines of received text.\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/minimal-ws-proxy.c b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/minimal-ws-proxy.c\nnew file mode 100644\nindex 0000000..e304c61\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/minimal-ws-proxy.c\n@@ -0,0 +1,100 @@\n+/*\n+ * lws-minimal-ws-proxy\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws,\n+ * with an added websocket proxy distributing what is received on a\n+ * dumb-increment wss connection to https://libwebsockets.org to all\n+ * browsers connected to this server.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0},\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws proxy | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/example.js b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/example.js\nnew file mode 100644\nindex 0000000..e483922\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/example.js\n@@ -0,0 +1,67 @@\n+var head \u003d 0, tail \u003d 0, ring \u003d new Array();\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal-proxy\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tvar n, s \u003d \u0022\u0022;\n+\t\n+\t\t\tring[head] \u003d msg.data + \u0022\u005cn\u0022;\n+\t\t\thead \u003d (head + 1) % 20;\n+\t\t\tif (tail \u003d\u003d\u003d head)\n+\t\t\t\ttail \u003d (tail + 1) % 20;\n+\t\n+\t\t\tn \u003d tail;\n+\t\t\tdo {\n+\t\t\t\ts \u003d s + ring[n];\n+\t\t\t\tn \u003d (n + 1) % 20;\n+\t\t\t} while (n !\u003d\u003d head);\n+\t\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d s; \n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+}, false);\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/favicon.ico b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/index.html b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/index.html\nnew file mode 100644\nindex 0000000..9df7cf8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\t\n+\t\t\u003cb\u003eMinimal ws server proxy example\u003c/b\u003e.\u003cbr\u003e\n+\t\tThe server makes a dumb-increment-protocol wss connection\u003cbr\u003e\n+\t\tto libwebsockets.org. It proxies what it was sent to\u003cbr\u003e\n+\t\tall browsers open on this page.\u003cbr\u003e\n+\t\tThe textarea show the last 20 lines received.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d20\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/client-server/minimal-ws-proxy/protocol_lws_minimal.c b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..428a27d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/protocol_lws_minimal.c\n@@ -0,0 +1,240 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This version uses an lws_ring ringbuffer to cache up to 8 messages at a time,\n+ * so it's not so easy to lose messages.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+#include \u003cstdlib.h\u003e\n+\n+/* one of these created for each message */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/* one of these is created for each client connecting to us */\n+\n+struct per_session_data__minimal {\n+\tstruct per_session_data__minimal *pss_list;\n+\tstruct lws *wsi;\n+\tuint32_t tail;\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tlws_sorted_usec_list_t sul;\n+\n+\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n+\n+\tstruct lws_ring *ring; /* ringbuffer holding unsent messages */\n+\tstruct lws_client_connect_info i;\n+\tstruct lws *client_wsi;\n+};\n+\n+/* destroys the message when everyone has had a copy of it */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+static void\n+sul_connect_attempt(struct lws_sorted_usec_list *sul)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\tlws_container_of(sul, struct per_vhost_data__minimal, sul);\n+\n+\tvhd-\u003ei.context \u003d vhd-\u003econtext;\n+\tvhd-\u003ei.port \u003d 443;\n+\tvhd-\u003ei.address \u003d \u0022libwebsockets.org\u0022;\n+\tvhd-\u003ei.path \u003d \u0022/\u0022;\n+\tvhd-\u003ei.host \u003d vhd-\u003ei.address;\n+\tvhd-\u003ei.origin \u003d vhd-\u003ei.address;\n+\tvhd-\u003ei.ssl_connection \u003d 1;\n+\n+\tvhd-\u003ei.protocol \u003d \u0022dumb-increment-protocol\u0022;\n+\tvhd-\u003ei.local_protocol_name \u003d \u0022lws-minimal-proxy\u0022;\n+\tvhd-\u003ei.pwsi \u003d \u0026vhd-\u003eclient_wsi;\n+\n+\tif (!lws_client_connect_via_info(\u0026vhd-\u003ei))\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, 10 * LWS_US_PER_SEC);\n+}\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct msg *pmsg;\n+\tstruct msg amsg;\n+\tint m;\n+\n+\tswitch (reason) {\n+\n+\t/* --- protocol lifecycle callbacks --- */\n+\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!vhd-\u003ering)\n+\t\t\treturn 1;\n+\n+\t\tsul_connect_attempt(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tlws_ring_destroy(vhd-\u003ering);\n+\t\tlws_sul_cancel(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\t/* --- serving callbacks --- */\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* add ourselves to the list of live pss held in the vhd */\n+\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+\t\tpss-\u003etail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\t/* remove our closing pss from the list of live pss */\n+\t\tlws_ll_fwd_remove(struct per_session_data__minimal, pss_list,\n+\t\t\t\t pss, vhd-\u003epss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg)\n+\t\t\tbreak;\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) + LWS_PRE,\n+\t\t\t pmsg-\u003elen, LWS_WRITE_TEXT);\n+\t\tif (m \u003c (int)pmsg-\u003elen) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlws_ring_consume_and_update_oldest_tail(\n+\t\t\tvhd-\u003ering,\t/* lws_ring object */\n+\t\t\tstruct per_session_data__minimal, /* type of objects with tails */\n+\t\t\t\u0026pss-\u003etail,\t/* tail of guy doing the consuming */\n+\t\t\t1,\t\t/* number of payload objects being consumed */\n+\t\t\tvhd-\u003epss_list,\t/* head of list of objects with tails */\n+\t\t\ttail,\t\t/* member name of tail in objects with tails */\n+\t\t\tpss_list\t/* member name of next object in objects with tails */\n+\t\t);\n+\n+\t\t/* more to do? */\n+\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(pss-\u003ewsi);\n+\t\tbreak;\n+\n+\t/* --- client callbacks --- */\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tvhd-\u003eclient_wsi \u003d NULL;\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, LWS_US_PER_SEC);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: established\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n+\t\t/* if no clients, just drop incoming */\n+\t\tif (!vhd-\u003epss_list)\n+\t\t\tbreak;\n+\n+\t\tif (!lws_ring_get_count_free_elements(vhd-\u003ering)) {\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tamsg.len \u003d len;\n+\t\t/* notice we over-allocate by LWS_PRE */\n+\t\tamsg.payload \u003d malloc(LWS_PRE + len);\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmemcpy((char *)amsg.payload + LWS_PRE, in, len);\n+\t\tif (!lws_ring_insert(vhd-\u003ering, \u0026amsg, 1)) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/*\n+\t\t * let everybody know we want to write something on them\n+\t\t * as soon as they are ready\n+\t\t */\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tvhd-\u003eclient_wsi \u003d NULL;\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, LWS_US_PER_SEC);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal-proxy\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t128, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/crypto/README.md b/minimal-examples-lowlevel/crypto/README.md\nnew file mode 100644\nindex 0000000..1c95c13\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/README.md\n@@ -0,0 +1,7 @@\n+|name|tests|\n+---|---\n+minimal-crypto-jwe|Examples for lws RFC7516 JWE apis\n+minimal-crypto-jwk|Examples for lws RFC7517 JWK apis\n+minimal-crypto-jws|Examples for lws RFC7515 JWS apis\n+minimal-crypto-x509|Examples for lws X.509 apis\n+\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/CMakeLists.txt\nnew file mode 100644\nindex 0000000..4551ef1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/CMakeLists.txt\n@@ -0,0 +1,55 @@\n+project(lws-crypto-cose-key C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-crypto-cose-key)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_COSE 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\t\n+\tadd_test(NAME crypto-cose-key-1\n+\t\t COMMAND lws-crypto-cose-key --stdin set1.cks )\n+\tadd_test(NAME crypto-cose-key-2\n+\t\t COMMAND lws-crypto-cose-key --kty EC2 --curve P-256 --kid ctest-256 --stdout ctest-ec-256.key)\n+\tadd_test(NAME crypto-cose-key-3\n+\t\t COMMAND lws-crypto-cose-key --kty EC2 --curve P-384 --kid ctest-384 --stdout ctest-ec-384.key)\n+\tadd_test(NAME crypto-cose-key-4\n+\t\t COMMAND lws-crypto-cose-key --kty EC2 --curve P-521 --kid ctest-512 --stdout ctest-ec-512.key)\n+\tadd_test(NAME crypto-cose-key-5\n+\t\t COMMAND lws-crypto-cose-key --kty SYMMETRIC --bits 256 --stdout ctest-sym-256.key)\n+\tadd_test(NAME crypto-cose-key-6\n+\t\t COMMAND lws-crypto-cose-key --kty RSA --bits 2048 --stdout ctest-rsa-2048.key)\n+\tadd_test(NAME crypto-cose-key-7\n+\t\t COMMAND lws-crypto-cose-key --stdin ctest-rsa-2048.key)\n+\n+\tset_tests_properties(crypto-cose-key-1\n+\t\t\t crypto-cose-key-2\n+\t\t\t crypto-cose-key-3\n+\t\t\t crypto-cose-key-4\n+\t\t\t crypto-cose-key-5\n+\t\t\t crypto-cose-key-6\n+\t\t\t crypto-cose-key-7\n+\t\t\t PROPERTIES\n+\t\t \t\tWORKING_DIRECTORY\n+\t\t \t\t\t${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key\n+\t\t \t\tTIMEOUT 5)\n+\t\t \t\t\n+\tset_tests_properties(crypto-cose-key-7\n+\t\t\t PROPERTIES\n+\t\t \t\tDEPENDS crypto-cose-key-6)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/README.md\nnew file mode 100644\nindex 0000000..f6be13d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/README.md\n@@ -0,0 +1,132 @@\n+# lws minimal example for cose_key\n+\n+Demonstrates how to create and dump cose_keys.\n+\n+## Dump key or key_set\n+\n+Pipe a cose_key or cose_key_set into stdin to get a textual dump of all the keys\n+inside. You can optionally use --kid kid or --kid-hex HEXSTRING to dump one key\n+from a set.\n+\n+```\n+$ cat set1.cks | ./bin/lws-crypto-cose-key\n+$ cat set1.cks | ./bin/lws-crypto-cose-key --kid 11\n+```\n+\n+## Create keys\n+\n+Stdin is not used, give parameters for the kty and kid etc to create a\n+new key on stdout (which can be redirected to a file).\n+\n+```\n+$ ./bin/lws-crypto-cose-key --kty EC2 --curve P-521 --kid sec512 \u003eec512.key\n+```\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+|Option|Meaning|\n+|---|---|\n+|--kty type|Key type, one of OKP, EC2, RSA or SYMMETRIC|\n+|-k \u005c\u003ckeyset filepath\u005c\u003e|One or a set of cose_keys|\n+|--kid string|Specifies the key ID to use as a string|\n+|--kid-hex HEXSTRING|Specifies the key ID to use as a hex blob|\n+|--curve curve|For EC type key creation, specify the curve|\n+|--stdin filepath|Makes tool fetch from filepath instead of stdin (useful for CI)|\n+|--stdout filepath|Makes tool write to filepath instead of stdout (useful for CI)|\n+\n+\n+HEXSTRING above means a string like `1a2b3c`\n+\n+## Examples\n+\n+### cose_key dumping\n+\n+```\n+$ cat set1.cks | ./bin/lws-crypto-cose-key\n+[2021/07/30 10:14:31:0420] U: LWS cose-key example tool -k keyset [-s alg-name kid ]\n+[2021/07/30 10:14:31:0780] N: lws_create_context: LWS: 4.2.99-v4.2.0-134-g8433c8b459, NET CLI SRV H1 H2 WS ConMon IPV6-on\n+[2021/07/30 10:14:31:0892] N: ++ [wsi|0|pipe] (1)\n+[2021/07/30 10:14:31:0926] N: ++ [vh|0|netlink] (1)\n+[2021/07/30 10:14:31:0977] N: ++ [vh|1|default||-1] (2)\n+[2021/07/30 10:14:31:1057] N: main: importing\n+Cose key #1\n+ kty: EC2\n+ kid: 11\n+ kty: P-256\n+ x: bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a09eff\n+ d: 57c92077664146e876760c9520d054aa93c3afb04e306705db6090308507b4d3\n+ y: 20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbfc117e\n+Cose key #2\n+ kty: EC2\n+ kid: meriadoc.brandybuck@buckland.example\n+ kty: P-256\n+ x: 65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c08551d\n+ d: aff907c99f9ad3aae6c4cdf21122bce2bd68b5283e6907154ad911840fa208cf\n+ y: 1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd0084d19c\n+Cose key #3\n+ kty: SYMMETRIC\n+ kid: our-secret\n+ k: 849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c427188\n+Cose key #4\n+ kty: EC2\n+ kid: bilbo.baggins@hobbiton.example\n+ kty: P-521\n+ x: 0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8f42ad\n+ d: 00085138ddabf5ca975f5860f91a08e91d6d5f9a76ad4018766a476680b55cd339e8ab6c72b5facdb2a2a50ac25bd086647dd3e2e6e99e84ca2c3609fdf177feb26d\n+ y: 01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1d9475\n+Cose key #5\n+ kty: SYMMETRIC\n+ kid: our-secret2\n+ k: 849b5786457c1491be3a76dcea6c4271\n+Cose key #6\n+ kty: EC2\n+ kid: peregrin.took@tuckborough.example\n+ kty: P-256\n+ x: 98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91d6280\n+ d: 02d1f7e6f26c43d4868d87ceb2353161740aacf1f7163647984b522a848df1c3\n+ y: f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf822bb\n+Cose key #7\n+ kty: SYMMETRIC\n+ kid: 018c0ae5-4d9b-471b-bfd6-eef314bc7037\n+ use: 849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c427188\n+Cose key #8\n+ kty: SYMMETRIC\n+ kid: sec-48\n+ k: 849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c42718800112233778899aa2122232425262728\n+Cose key #9\n+ kty: SYMMETRIC\n+ kid: sec-64\n+ k: 849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c42718800112233778899aa2122232425262728aabbccddeeffa5a6a7a8a9a0b1b2b3b4\n+Cose key #10\n+ kty: EC2\n+ kid: sec384\n+ kty: P-384\n+ x: ea2866349fe3a2f9ad4d6bfe7c30c527436e901c5fb22210b67b2150574ffcd0b1dd8c43d5d1e3d5cb849ecec202117c\n+ d: 4d46a58480d43d5454307edcf501e098ef7c0186cc6b56b41dfd13fe4b9b1ab1425851cf5b23e6636ed18f5bbdde1896\n+ y: 4c3d245515a688ef25ff68034089ca4f10a01bef51cc57309f12919c3d484142368795c6f2a5d30af650b4e12d0133e4\n+Cose key #11\n+ kty: EC2\n+ kid: sec512\n+ kty: P-521\n+ x: 003b81ed66d8a2194b42f29ecb2c9ae48199be695924804a8407194ed0e172f39693f870f32463e2d36950034a21901487c5a0c43a1713a818fb89fa8a5b3b2dc181\n+ d: 013e0f06ce394ac14a3df3953fc560679ad0dee14779ef0d475787451fca71e3b4b827b6f7cedcf00e23c716fb829b5419234ba5c92c33e0bc94351fe97be21f2b82\n+ y: 004b9b6b0adf41913b5d700cf43bfe0ee8b79eb58fc308509e574fcb910b3fd5a2ad585affc6776f7fc9d4ff48f5923fe900660ecc6e3720f89c1363eecfffb38b5b\n+[2021/07/30 10:14:31:1430] N: -- [wsi|0|pipe] (0) 52.763ms\n+[2021/07/30 10:14:31:1441] N: -- [vh|0|netlink] (1) 51.437ms\n+[2021/07/30 10:14:31:1491] N: -- [vh|1|default||-1] (0) 51.591ms\n+[2021/07/30 10:14:31:1536] N: main: PASS\n+\n+```\n+\n+### cose_key creation\n+\n+```\n+$ ./bin/lws-crypto-cose-key --kty EC2 --curve P-521 --kid sec512 \u003eec512.key\n+```\n+\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/main.c\nnew file mode 100644\nindex 0000000..5a19e2c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/main.c\n@@ -0,0 +1,313 @@\n+/*\n+ * lws-minimal-crypto-cose-key\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csys/select.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+static int fdin \u003d 0, fdout \u003d 1;\n+\n+static const char *meta_names[] \u003d {\n+\t\u0022kty\u0022, \u0022kid\u0022, \u0022use\u0022, \u0022key_ops\u0022, \u0022base_iv\u0022, \u0022alg\u0022\n+};\n+\n+static const char *oct_names[] \u003d {\n+\t\u0022k\u0022\n+};\n+\n+static const char *rsa_names[] \u003d {\n+\t\u0022e\u0022, \u0022n\u0022, \u0022d\u0022, \u0022p\u0022, \u0022q\u0022, \u0022dp\u0022, \u0022dq\u0022, \u0022qi\u0022, \u0022other\u0022, \u0022ri\u0022, \u0022di\u0022, \u0022ti\u0022\n+};\n+\n+static const char *ec_names[] \u003d {\n+\t\u0022crv\u0022, \u0022x\u0022, \u0022d\u0022, \u0022y\u0022,\n+};\n+\n+static void\n+cose_key_dump(const struct lws_cose_key *ck)\n+{\n+\tconst char **enames;\n+\tchar hex[2048], dump[3072];\n+\tint elems;\n+\tsize_t l;\n+\tint n;\n+\n+\t(void)enames;\n+\t(void)meta_names;\n+\n+\tswitch (ck-\u003egencrypto_kty) {\n+\n+\tcase LWS_GENCRYPTO_KTY_OCT:\n+\t\telems \u003d LWS_GENCRYPTO_OCT_KEYEL_COUNT;\n+\t\tenames \u003d oct_names;\n+\t\tbreak;\n+\tcase LWS_GENCRYPTO_KTY_RSA:\n+\t\telems \u003d LWS_GENCRYPTO_RSA_KEYEL_COUNT;\n+\t\tenames \u003d rsa_names;\n+\t\tbreak;\n+\tcase LWS_GENCRYPTO_KTY_EC:\n+\t\telems \u003d LWS_GENCRYPTO_EC_KEYEL_COUNT;\n+\t\tenames \u003d ec_names;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tlwsl_err(\u0022%s: jwk %p: unknown type\u005cn\u0022, __func__, ck);\n+\n+\t\treturn;\n+\t}\n+\n+\tfor (n \u003d 0; n \u003c LWS_COUNT_COSE_KEY_ELEMENTS; n++) {\n+\t\tif (ck-\u003emeta[n].buf) {\n+\t\t\tif (n \u003c 2) {\n+\t\t\t\tl \u003d (size_t)lws_snprintf(dump, sizeof(dump),\n+\t\t\t\t\t\t \u0022 %s: %.*s\u005cn\u0022, meta_names[n],\n+\t\t\t\t\t\t (int)ck-\u003emeta[n].len,\n+\t\t\t\t\t\t ck-\u003emeta[n].buf);\n+\t\t\t\twrite(fdout, dump, l);\n+\t\t\t} else {\n+\t\t\t\tl \u003d (size_t)lws_snprintf(dump, sizeof(dump),\n+\t\t\t\t\t\t \u0022 %s: \u0022, meta_names[n]);\n+\t\t\t\twrite(fdout, dump, l);\n+\t\t\t\tlws_hex_from_byte_array(ck-\u003emeta[n].buf,\n+\t\t\t\t\t\t\tck-\u003emeta[n].len,\n+\t\t\t\t\t\t\thex, sizeof(hex));\n+\t\t\t\twrite(fdout, hex, strlen(hex));\n+\t\t\t\twrite(fdout, \u0022\u005cn\u0022, 1);\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tfor (n \u003d 0; n \u003c elems; n++) {\n+\t\tif (ck-\u003ee[n].buf) {\n+\t\t\tif (!n \u0026\u0026 ck-\u003egencrypto_kty \u003d\u003d LWS_GENCRYPTO_KTY_EC) {\n+\t\t\t\tl \u003d (size_t)lws_snprintf(dump, sizeof(dump),\n+\t\t\t\t\t\t \u0022 %s: %.*s\u005cn\u0022, enames[n],\n+\t\t\t\t\t\t (int)ck-\u003ee[n].len,\n+\t\t\t\t\t\t ck-\u003ee[n].buf);\n+\t\t\t\twrite(fdout, dump, l);\n+\t\t\t} else {\n+\t\t\t\tl \u003d (size_t)lws_snprintf(dump, sizeof(dump),\n+\t\t\t\t\t\t \u0022 %s: \u0022, enames[n]);\n+\t\t\t\twrite(fdout, dump, l);\n+\t\t\t\tlws_hex_from_byte_array(ck-\u003ee[n].buf,\n+\t\t\t\t\t\t\tck-\u003ee[n].len,\n+\t\t\t\t\t\t\thex, sizeof(hex));\n+\t\t\t\twrite(fdout, hex, strlen(hex));\n+\t\t\t\twrite(fdout, \u0022\u005cn\u0022, 1);\n+\t\t\t}\n+\t\t}\n+\t}\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tuint8_t *kid \u003d NULL, ktmp[4096], set_temp[32 * 1024], temp[256];\n+\tint result \u003d 1, bits \u003d 0,\n+\t logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tsize_t kid_len \u003d 0, stp \u003d 0;\n+\tstruct lws_context *context;\n+\tlws_cose_key_t *ck \u003d NULL;\n+\tcose_param_t cose_kty \u003d 0;\n+\tlws_dll2_owner_t set;\n+\tconst char *p, *crv;\n+\tlws_lec_pctx_t lec;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\n+\tlwsl_user(\u0022LWS cose-key example tool -k keyset [-s alg-name kid ]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--stdin\u0022))) {\n+\t\tfdin \u003d open(p, LWS_O_RDONLY, 0);\n+\t\tif (fdin \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: unable to open stdin file\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--stdout\u0022))) {\n+\t\tfdout \u003d open(p, LWS_O_WRONLY | LWS_O_CREAT | LWS_O_TRUNC, 0600);\n+\t\tif (fdout \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: unable to open stdout file\u005cn\u0022, __func__);\n+\t\t\tgoto bail_early;\n+\t\t}\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid\u0022))) {\n+\t\tkid \u003d (uint8_t *)p;\n+\t\tkid_len \u003d strlen(p);\n+\t\t//lwsl_hexdump_notice(kid, kid_len);\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid-hex\u0022))) {\n+\t\tkid_len \u003d (size_t)lws_hex_to_byte_array(p, ktmp, sizeof(ktmp));\n+\t\tkid \u003d (uint8_t *)ktmp;\n+\t}\n+\n+\t/*\n+\t * If we have some stdin queued up, we understand we are dumping\n+\t * an existing cose_key or key_set from stdin\n+\t */\n+\n+\tif (!fdin) {\n+\t\tstruct timeval\ttimeout;\n+\t\tfd_set\tfds;\n+\n+\t\tFD_ZERO(\u0026fds);\n+\t\tFD_SET(0, \u0026fds);\n+\n+\t\ttimeout.tv_sec \u003d 0;\n+\t\ttimeout.tv_usec \u003d 1000;\n+\n+\t\tif (select(fdin + 1, \u0026fds, NULL, NULL, \u0026timeout) \u003c 0)\n+\t\t\tgoto no_stdin;\n+\n+\t\tif (!FD_ISSET(0, \u0026fds))\n+\t\t\tgoto no_stdin;\n+\t}\n+\n+\tdo {\n+\t\tint n \u003d (int)read(fdin, temp, sizeof(temp));\n+\n+\t\tif (n \u003c 0)\n+\t\t\tgoto bail;\n+\t\tif (!n) {\n+\t\t\tint kc \u003d 0;\n+\n+\t\t\tif (!stp)\n+\t\t\t\t/* there was no stdin */\n+\t\t\t\tbreak;\n+\n+\t\t\tlwsl_notice(\u0022%s: importing\u005cn\u0022, __func__);\n+\n+\t\t\tlws_dll2_owner_clear(\u0026set);\n+\t\t\tck \u003d lws_cose_key_import(\u0026set, NULL, NULL, set_temp, stp);\n+\t\t\tif (!ck) {\n+\t\t\t\tlwsl_err(\u0022%s: import failed\u005cn\u0022, __func__);\n+\t\t\t\tgoto bail;\n+\t\t\t}\n+\n+\t\t\tlws_start_foreach_dll(struct lws_dll2 *, p,\n+\t\t\t\t\t\tlws_dll2_get_head(\u0026set)) {\n+\t\t\t\tlws_cose_key_t *ck \u003d lws_container_of(p,\n+\t\t\t\t\t\t\tlws_cose_key_t, list);\n+\t\t\t\tstruct lws_gencrypto_keyelem *ke \u003d\n+\t\t\t\t\t\t\u0026ck-\u003emeta[COSEKEY_META_KID];\n+\n+\t\t\t\tkc++;\n+\n+\t\t\t\tif (!kid_len || (ke-\u003elen \u0026\u0026\n+\t\t\t\t ke-\u003elen \u003d\u003d (uint32_t)kid_len \u0026\u0026\n+\t\t\t\t !memcmp(ke-\u003ebuf, kid, kid_len))) {\n+\t\t\t\t\t printf(\u0022Cose key #%d\u005cn\u0022, kc);\n+\t\t\t\t\t cose_key_dump(ck);\n+\t\t\t\t}\n+\n+\t\t\t} lws_end_foreach_dll(p);\n+\n+\t\t\tlws_cose_key_set_destroy(\u0026set);\n+\t\t\tresult \u003d 0;\n+\t\t\tgoto bail;\n+\n+\t\t}\n+\n+\t\tif (stp + (size_t)n \u003e sizeof(set_temp)) {\n+\t\t\tlwsl_err(\u0022%s: stdin bigger than our buffer\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\t\tmemcpy(set_temp + stp, temp, (size_t)n);\n+\t\tstp +\u003d (size_t)n;\n+\t} while (1);\n+\n+no_stdin:\n+\n+\t/*\n+\t *\n+\t */\n+\n+\tp \u003d lws_cmdline_option(argc, argv, \u0022--kty\u0022);\n+\tif (!p) {\n+\t\tlwsl_err(\u0022%s: use --kty OKP|EC2|RSA|SYMMETRIC\u005cn\u0022,\n+\t\t\t\t\t__func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (!strcmp(p, \u0022OKP\u0022))\n+\t\tcose_kty \u003d LWSCOSE_WKKTV_OKP;\n+\tif (!strcmp(p, \u0022EC2\u0022))\n+\t\tcose_kty \u003d LWSCOSE_WKKTV_EC2;\n+\tif (!strcmp(p, \u0022RSA\u0022))\n+\t\tcose_kty \u003d LWSCOSE_WKKTV_RSA;\n+\tif (!strcmp(p, \u0022SYMMETRIC\u0022) || !strcmp(p, \u0022SYM\u0022))\n+\t\tcose_kty \u003d LWSCOSE_WKKTV_SYMMETRIC;\n+\n+\tif (!cose_kty) {\n+\t\tlwsl_err(\u0022%s: use --kty OKP|EC2|RSA|SYMMETRIC\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tcrv \u003d NULL;\n+\tif (cose_kty \u003d\u003d LWSCOSE_WKKTV_OKP ||\n+\t cose_kty \u003d\u003d LWSCOSE_WKKTV_EC2) {\n+\t\tcrv \u003d lws_cmdline_option(argc, argv, \u0022--curve\u0022);\n+\t\tif (!crv) {\n+\t\t\tlwsl_err(\u0022%s: use --curve P-256 etc\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\t}\n+\n+\tp \u003d lws_cmdline_option(argc, argv, \u0022--bits\u0022);\n+\tif (p)\n+\t\tbits \u003d atoi(p);\n+\n+\tck \u003d lws_cose_key_generate(context, cose_kty, 0, bits, crv,\n+\t\t\t\t kid, kid_len);\n+\tif (!ck)\n+\t\tgoto bail;\n+\n+\tlws_lec_init(\u0026lec, ktmp, sizeof(ktmp));\n+\tlws_cose_key_export(ck, \u0026lec, LWSJWKF_EXPORT_PRIVATE);\n+\twrite(fdout, ktmp, lec.used);\n+\n+\tlws_cose_key_destroy(\u0026ck);\n+\tresult \u003d 0;\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\tif (result)\n+\t\tlwsl_err(\u0022%s: FAIL: %d\u005cn\u0022, __func__, result);\n+\telse\n+\t\tlwsl_notice(\u0022%s: PASS\u005cn\u0022, __func__);\n+\n+bail_early:\n+\tif (fdin \u003e 0)\n+\t\tclose(fdin);\n+\tif (fdout !\u003d 1 \u0026\u0026 fdout \u003e\u003d 0)\n+\t\tclose(fdout);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/set1.cks b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/set1.cks\nnew file mode 100644\nindex 0000000..e5eca18\nBinary files /dev/null and b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/set1.cks differ\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass01.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass01.sig\nnew file mode 100644\nindex 0000000..d78767e\nBinary files /dev/null and b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass01.sig differ\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass02.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass02.sig\nnew file mode 100644\nindex 0000000..2b53930\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass02.sig\n@@ -0,0 +1 @@\n+Ò„C¡\u0001\u0026¡\u0004B11TThis is the content.X@\u0010rœ×\u0011Ë8\u0013ØØéD¨Úq\u0011ç²XɽÊa5÷®\u001aÛî•\t‰\u0012gƒ~\u001e3½6ÁP2jæ'UƽŽT\u000c\u003e’×Ò%èÛr¸‚\u000b\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass03.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass03.sig\nnew file mode 100644\nindex 0000000..a10fc96\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass03.sig\n@@ -0,0 +1 @@\n+„C¡\u0001\u0026¡\u0004B11TThis is the content.X@޳\u003eL£\u001d\u001cFZ°Z¬4Ìk#Õï\u005c\u00081\u0006ÄÒZ‘®ð°\u0011~*ù¢‘ª2áJ¸4ÜVí*\u00224DT~\u0001ñ\u001d;\t\u0016å¤ÃEÊË6\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass01.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass01.sig\nnew file mode 100644\nindex 0000000..268b086\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass01.sig\n@@ -0,0 +1 @@\n+Øb„A TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@⮯Ô\riÑþnR\u0007|]ôä\u0008(,¾û]\u0006Ëô\u0014¯.\u0019Ù‚¬E¬˜¸TL‹E\u0007Þ\u001e·\u0017ÃÓH\u0016þ’j+˜õ:ý/ ó\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass02.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass02.sig\nnew file mode 100644\nindex 0000000..b80f7a2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass02.sig\n@@ -0,0 +1 @@\n+Øb„@ TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@˸ÚÙ¾¯¸á¤\u0014\u0012M‹ûÂkíò©OËZˆ$2¿öÖ\u003e\u0015õtQØ?¢Ëö\u0026rëôÇÙ“°ôÂDvGØ1ºW̨k“\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass03.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass03.sig\nnew file mode 100644\nindex 0000000..60d8f03\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass03.sig\n@@ -0,0 +1 @@\n+„@ TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@⮯Ô\riÑþnR\u0007|]ôä\u0008(,¾û]\u0006Ëô\u0014¯.\u0019Ù‚¬E¬˜¸TL‹E\u0007Þ\u001e·\u0017ÃÓH\u0016þ’j+˜õ:ý/ ó\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/CMakeLists.txt\nnew file mode 100644\nindex 0000000..241490e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/CMakeLists.txt\n@@ -0,0 +1,219 @@\n+project(lws-crypto-cose-sign C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-crypto-cose-sign)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_COSE 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\t# EC signing\n+\t\n+\tadd_test(NAME crypto-cose-sign-1\n+\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid 11\n+\t\t \t--alg ES256 --cose-sign\n+\t\t \t--stdin payload.txt\n+\t\t \t--stdout ctest-sig-es256.sig)\n+\tadd_test(NAME crypto-cose-sign-2\n+\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec384\n+\t\t \t--alg ES384 --cose-sign\n+\t\t \t--stdin payload.txt\n+\t\t \t--stdout ctest-sig-es384.sig)\n+\tadd_test(NAME crypto-cose-sign-3\n+\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec512\n+\t\t \t--alg ES512 --cose-sign\n+\t\t \t--stdin payload.txt\n+\t\t \t--stdout ctest-sig-es512.sig)\n+\n+\t# EC validation\n+\t\t \t\t\n+\tadd_test(NAME crypto-cose-sign-4\n+\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+\t\t \t--stdout r1.txt\n+\t\t \t--stdin ctest-sig-es256.sig)\n+\tset_tests_properties(crypto-cose-sign-4\tPROPERTIES\n+\t\t\t\t\t\tDEPENDS crypto-cose-sign-1)\n+\t\t \t\n+\tadd_test(NAME crypto-cose-sign-5\n+\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+\t\t \t--stdout r2.txt\n+\t\t \t--stdin ctest-sig-es384.sig)\n+\tset_tests_properties(crypto-cose-sign-5\tPROPERTIES\n+\t\t\t\t\t\tDEPENDS crypto-cose-sign-2)\n+\t\t \t\n+\tadd_test(NAME crypto-cose-sign-6\n+\t\t COMMAND lws-crypto-cose-sign -k set1.cks --cose-sign\n+\t\t \t--stdout r3.txt\n+\t\t \t--stdin ctest-sig-es512.sig)\n+\tset_tests_properties(crypto-cose-sign-6\tPROPERTIES\n+\t\t\t\t\t\tDEPENDS crypto-cose-sign-3)\n+\n+\t# RSA 4096 signing\n+\t\n+\tadd_test(NAME crypto-cose-sign-7\n+\t COMMAND lws-crypto-cose-sign -s -k rsa-4096.ck\n+\t \t--alg RS512 --cose-sign\n+\t \t--stdin payload.txt\n+\t \t--stdout ctest-sig-rs512.sig)\n+\t \t\n+\t # RSA 4096 validation\n+\n+\tadd_test(NAME crypto-cose-sign-8\n+\t\t COMMAND lws-crypto-cose-sign -k rsa-4096.ck --cose-sign\n+\t\t \t--stdout r8.txt\n+\t\t \t--stdin ctest-sig-rs512.sig)\n+\tset_tests_properties(crypto-cose-sign-8\tPROPERTIES\n+\t\t\t\t\t\tDEPENDS crypto-cose-sign-7)\n+\t\t\t\t\t\t\n+\t# HMAC signing, cose-mac\n+\n+#\tadd_test(NAME crypto-cose-sign-9\n+#\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid our-secret\n+#\t\t \t--alg HS256 --cose-mac\n+#\t\t \t--stdin payload.txt\n+#\t\t \t--stdout ctest-sig-hmac256.sig)\n+#\tadd_test(NAME crypto-cose-sign-10\n+#\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec-48\n+#\t\t \t--alg HS384 --cose-mac\n+#\t\t \t--stdin payload.txt\n+#\t\t \t--stdout ctest-sig-hmac384.sig)\n+#\tadd_test(NAME crypto-cose-sign-11\n+#\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec-64\n+#\t\t \t--alg HS512 --cose-mac\n+#\t\t \t--stdin payload.txt\n+#\t\t \t--stdout ctest-sig-hmac512.sig)\n+#\tadd_test(NAME crypto-cose-sign-12\n+#\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid our-secret\n+#\t\t \t--alg HS256_64 --cose-mac\n+#\t\t \t--stdin payload.txt\n+#\t\t \t--stdout ctest-sig-hmac256_64.sig)\n+\n+\t# HMAC validation, cose-mac\n+\t\n+#\tadd_test(NAME crypto-cose-sign-13\n+#\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+#\t\t \t--stdout r1.txt\n+#\t\t \t--stdin ctest-sig-hmac256.sig)\n+#\tset_tests_properties(crypto-cose-sign-13\n+#\t\t\t PROPERTIES DEPENDS crypto-cose-sign-9)\n+#\t\t \t\n+#\tadd_test(NAME crypto-cose-sign-14\n+#\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+#\t\t \t--stdout r2.txt\n+#\t\t \t--stdin ctest-sig-hmac384.sig)\n+#\tset_tests_properties(crypto-cose-sign-14\n+#\t\t\t PROPERTIES DEPENDS crypto-cose-sign-10)\n+#\t\t \t\n+#\tadd_test(NAME crypto-cose-sign-15\n+#\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+#\t\t \t--stdout r3.txt\n+#\t\t \t--stdin ctest-sig-hmac512.sig)\n+#\tset_tests_properties(crypto-cose-sign-15\n+#\t\t\t PROPERTIES DEPENDS crypto-cose-sign-11)\n+#\t\t\t \n+#\tadd_test(NAME crypto-cose-sign-16\n+#\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+#\t\t \t--stdout r4.txt\n+#\t\t \t--stdin ctest-sig-hmac256_64.sig)\n+#\tset_tests_properties(crypto-cose-sign-16\n+#\t\t\t PROPERTIES DEPENDS crypto-cose-sign-12)\n+\t\t\t \n+\t# HMAC signing, cose-mac0\n+\n+\tadd_test(NAME crypto-cose-sign-17\n+\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid our-secret\n+\t\t \t--alg HS256 --cose-mac0\n+\t\t \t--stdin payload.txt\n+\t\t \t--stdout ctest-sig-hmac0256.sig)\n+\tadd_test(NAME crypto-cose-sign-18\n+\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec-48\n+\t\t \t--alg HS384 --cose-mac0\n+\t\t \t--stdin payload.txt\n+\t\t \t--stdout ctest-sig-hmac0384.sig)\n+\tadd_test(NAME crypto-cose-sign-19\n+\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec-64\n+\t\t \t--alg HS512 --cose-mac0\n+\t\t \t--stdin payload.txt\n+\t\t \t--stdout ctest-sig-hmac0512.sig)\n+\tadd_test(NAME crypto-cose-sign-20\n+\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid our-secret\n+\t\t \t--alg HS256_64 --cose-mac0\n+\t\t \t--stdin payload.txt\n+\t\t \t--stdout ctest-sig-hmac0256_64.sig)\n+\n+\t# HMAC validation, cose-mac0\n+\t\n+\tadd_test(NAME crypto-cose-sign-21\n+\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+\t\t \t--stdout r1.txt\n+\t\t \t--stdin ctest-sig-hmac0256.sig)\n+\tset_tests_properties(crypto-cose-sign-21\n+\t\t\t PROPERTIES DEPENDS crypto-cose-sign-17)\n+\t\t \t\n+\tadd_test(NAME crypto-cose-sign-22\n+\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+\t\t \t--stdout r2.txt\n+\t\t \t--stdin ctest-sig-hmac0384.sig)\n+\tset_tests_properties(crypto-cose-sign-22\n+\t\t\t PROPERTIES DEPENDS crypto-cose-sign-18)\n+\t\t \t\n+\tadd_test(NAME crypto-cose-sign-23\n+\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+\t\t \t--stdout r3.txt\n+\t\t \t--stdin ctest-sig-hmac0512.sig)\n+\tset_tests_properties(crypto-cose-sign-23\n+\t\t\t PROPERTIES DEPENDS crypto-cose-sign-19)\n+\t\t\t \n+\tadd_test(NAME crypto-cose-sign-24\n+\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n+\t\t \t--stdout r4.txt\n+\t\t \t--stdin ctest-sig-hmac0256_64.sig)\n+\tset_tests_properties(crypto-cose-sign-24\n+\t\t\t PROPERTIES DEPENDS crypto-cose-sign-20)\n+\n+\n+\tset_tests_properties(crypto-cose-sign-1\n+\t\t\t crypto-cose-sign-2\n+\t\t\t crypto-cose-sign-3\n+\t\t\t crypto-cose-sign-4\n+ \t\t\t crypto-cose-sign-5\n+\t\t\t crypto-cose-sign-6\n+\t\t\t crypto-cose-sign-7\n+\t\t\t crypto-cose-sign-8\n+# \t\t\t crypto-cose-sign-9\n+# \t\t crypto-cose-sign-10\n+#\t\t\t crypto-cose-sign-11\n+#\t\t\t crypto-cose-sign-12\n+#\t\t\t crypto-cose-sign-13\n+#\t\t\t crypto-cose-sign-14\n+#\t\t\t crypto-cose-sign-15\n+#\t\t\t crypto-cose-sign-16\n+\t\t\t crypto-cose-sign-17\n+\t\t\t crypto-cose-sign-18\n+\t\t\t crypto-cose-sign-19\n+\t\t\t crypto-cose-sign-20\n+\t\t\t crypto-cose-sign-21\n+\t\t\t crypto-cose-sign-22\n+\t\t\t crypto-cose-sign-23\n+\t\t\t crypto-cose-sign-24\n+\n+\t\t\t PROPERTIES\n+\t\t \t\tWORKING_DIRECTORY\n+\t\t \t\t\t${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign\n+\t\t \t\tTIMEOUT 5)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/README.md\nnew file mode 100644\nindex 0000000..f241d75\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/README.md\n@@ -0,0 +1,105 @@\n+# lws minimal example for cose_sign\n+\n+Demonstrates how to sign and verify using cose_sign and cose_key, providing a\n+commandline tool for signing and verifying stdin.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+|Option|Sig|Val|Meaning|\n+|---|---|---|---|\n+|-s|o|||Select signing mode (stdin is payload)|\n+|-k \u003ckeyset filepath\u003e|o|o|One or a set of cose_keys|\n+|--kid string|o|mac0|Specifies the key ID to use as a string|\n+|--kid-hex HEXSTRING|o|mac0|Specifies the key ID to use as a hex blob|\n+|--cose-sign|o|if no tag|Sets cose-sign mode|\n+|--cose-sign1|o|if no tag|Sets cose-sign1 mode|\n+|--cose-mac|o|if no tag|Sets cose-sign1 mode|\n+|--cose-mac0|o|if no tag|Sets cose-sign1 mode|\n+|--extra HEXSTRING|o|o|Optional extra payload data|\n+\n+HEXSTRING above means a string like `1a2b3c`\n+\n+Stdin is either the plaintext (if signing) or cose_sign (if verifying).\n+\n+For convenience, a keyset from the COSE RFC is provided in\n+`minimal-examples/crypto/minimal-crypto-cose-sign/set1.cks`. Six example\n+cose_sign1 and cose_sign are also provided in that directory signed with keys\n+from the provided keyset.\n+\n+## Examples\n+\n+### Validation\n+\n+The RFC8152 sign1_pass01.sig is a cose_sign1 that contains the ES256 alg\n+parameter along with a kid hint that it was signed with the key with kid \u002211\u0022\n+from the RFC8152 key set. So we just need to provide the signature and the key\n+set and lws can sort it out.\n+\n+```\n+$ cat sign1_pass01.sig | ./lws-crypto-cose-sign -k set1.cks\n+[2021/07/26 05:41:29:1663] N: lws_create_context: LWS: 4.2.99-v4.2.0-133-g300f3f3250, NET CLI SRV H1 H2 WS ConMon IPV6-on\n+[2021/07/26 05:41:29:3892] N: results count 1\n+[2021/07/26 05:41:29:3901] N: result: 0 (alg ES256, kid 3131)\n+[2021/07/26 05:41:29:4168] N: main: PASS\n+```\n+\n+Notice how the validation just delivers a results list and leaves it to the user\n+code to iterate it, and confirm that it's happy with the result, the alg used,\n+and the kid that was used.\n+\n+RFC8152 sign1_pass02.sig is similar but contains extra application data in the\n+signature, that must be given at validation too.\n+\n+```\n+$cat sign1_pass02.sig | ./lws-crypto-cose-sign -k set1.cks --extra 11aa22bb33cc44dd55006699\n+[2021/07/26 05:55:50:9103] N: lws_create_context: LWS: 4.2.99-v4.2.0-133-g300f3f3250, NET CLI SRV H1 H2 WS ConMon IPV6-on\n+[2021/07/26 05:55:50:9381] N: 12\n+[2021/07/26 05:55:51:0924] N: \n+[2021/07/26 05:55:51:0939] N: 0000: 11 AA 22 BB 33 CC 44 DD 55 00 66 99 ..\u0022.3.D.U.f. \n+[2021/07/26 05:55:51:0943] N: \n+[2021/07/26 05:55:51:1368] N: results count 1\n+[2021/07/26 05:55:51:1377] N: result: 0 (alg ES256, kid 3131)\n+[2021/07/26 05:55:51:1657] N: main: PASS\n+```\n+\n+### Signing\n+\n+Generate a cose-sign1 using ES256 and the key set key with id \u002211\u0022 for the\n+payload given on stdin\n+\n+```\n+$ echo -n \u0022This is the content.\u0022 |\u005c\n+ ./bin/lws-crypto-cose-sign -s -k set1.cks \u005c\n+ --kid 11 --alg ES256 \u003e ./test.sig\n+\n+00000000 d2 84 43 a1 01 26 a1 04 42 31 31 54 54 68 69 73 |..C..\u0026..B11TThis|\n+00000010 20 69 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e | is the content.|\n+00000020 58 40 b9 a8 85 09 17 7f 01 f6 78 5d 39 62 d0 44 |X@........x]9b.D|\n+00000030 08 0b fa b4 b4 5b 17 80 c2 e3 ba a3 af 33 6f e6 |.....[.......3o.|\n+00000040 44 09 13 1f cf 4f 17 5c 62 9f 8d 29 29 1c ab 28 |D....O.\u005cb..))..(|\n+00000050 b2 f4 e6 af f9 62 ea 69 52 90 07 0e 2c 40 72 d3 |.....b.iR...,@r.|\n+00000060 12 cf |..|\n+\n+```\n+\n+Same as above, but force it to use cose-sign layout\n+\n+```\n+$ echo -n \u0022This is the content.\u0022 |\u005c\n+ ./bin/lws-crypto-cose-sign -s -k set1.cks \u005c\n+ --kid 11 --alg ES256 --cose-sign \u003e ./test.sig\n+\n+00000000 d8 62 84 40 40 54 54 68 69 73 20 69 73 20 74 68 |.b.@@TThis is th|\n+00000010 65 20 63 6f 6e 74 65 6e 74 2e 81 83 a1 01 26 a1 |e content.....\u0026.|\n+00000020 04 42 31 31 58 40 37 5d 93 48 20 b0 d0 75 16 41 |.B11X@7].H ..u.A|\n+00000030 db 95 95 5b 39 7d 6d 92 6e 52 c9 78 96 d8 a2 9b |...[9}m.nR.x....|\n+00000040 62 62 89 9e e5 26 31 63 4b 90 d1 37 86 ca 82 a2 |bb...\u00261cK..7....|\n+00000050 28 9a d2 82 a7 6d 24 23 cd de 58 91 47 98 bb 11 |(....m$#..X.G...|\n+00000060 e4 b9 08 18 48 65 |....He|\n+```\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/main.c\nnew file mode 100644\nindex 0000000..c1e8e58\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/main.c\n@@ -0,0 +1,406 @@\n+/*\n+ * lws-minimal-crypto-cose-sign\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+static int fdin \u003d 0, fdout \u003d 1;\n+static uint8_t extra[4096];\n+static size_t ext_len;\n+\n+int\n+_alloc_file(struct lws_context *context, const char *filename, uint8_t **buf,\n+\t\tsize_t *amount)\n+{\n+\tFILE *f;\n+\tsize_t s;\n+\tssize_t m;\n+\tint n \u003d 0;\n+\n+\tf \u003d fopen(filename, \u0022rb\u0022);\n+\tif (f \u003d\u003d NULL) {\n+\t\tn \u003d 1;\n+\t\tgoto bail;\n+\t}\n+\n+\tif (fseek(f, 0, SEEK_END) !\u003d 0) {\n+\t\tn \u003d 1;\n+\t\tgoto bail;\n+\t}\n+\n+\tm \u003d ftell(f);\n+\tif (m \u003d\u003d -1l) {\n+\t\tn \u003d 1;\n+\t\tgoto bail;\n+\t}\n+\ts \u003d (size_t)m;\n+\n+\tif (fseek(f, 0, SEEK_SET) !\u003d 0) {\n+\t\tn \u003d 1;\n+\t\tgoto bail;\n+\t}\n+\n+\t*buf \u003d malloc(s + 1);\n+\tif (!*buf) {\n+\t\tn \u003d 2;\n+\t\tgoto bail;\n+\t}\n+\n+\tif (fread(*buf, s, 1, f) !\u003d 1) {\n+\t\tfree(*buf);\n+\t\tn \u003d 1;\n+\t\tgoto bail;\n+\t}\n+\n+\t*amount \u003d s;\n+\n+bail:\n+\tif (f)\n+\t\tfclose(f);\n+\n+\treturn n;\n+\n+}\n+\n+static int\n+extra_cb(lws_cose_sig_ext_pay_t *x)\n+{\n+\tx-\u003eext \u003d extra;\n+\tx-\u003exl \u003d ext_len;\n+\n+\t// lwsl_hexdump_notice(extra, ext_len);\n+\n+\treturn 0;\n+}\n+\n+int\n+pay_cb(struct lws_cose_validate_context *cps, void *opaque,\n+ const uint8_t *paychunk, size_t paychunk_len)\n+{\n+\twrite(fdout, paychunk, paychunk_len);\n+\n+\treturn 0;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tuint8_t *ks, temp[256], *kid \u003d NULL, ktmp[4096], sbuf[512];\n+\tint n, m, sign \u003d 0, result \u003d 1,\n+\t logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tenum lws_cose_sig_types sigtype \u003d SIGTYPE_UNKNOWN;\n+\tstruct lws_cose_validate_context *cps \u003d NULL;\n+\tstruct lws_cose_sign_context *csc \u003d NULL;\n+\tconst struct lws_gencrypto_keyelem *ke;\n+\tstruct lws_context_creation_info info;\n+\tlws_cose_validate_create_info_t vi;\n+\tstruct lws_buflist *paybuf \u003d NULL;\n+\tlws_cose_sign_create_info_t i;\n+\tstruct lws_context *context;\n+\tsize_t ks_len, kid_len \u003d 0;\n+\tlws_cose_key_t *ck \u003d NULL;\n+\tlws_dll2_owner_t *o, set;\n+\tlws_lec_pctx_t lec;\n+\tcose_param_t alg;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\n+\tlwsl_user(\u0022LWS cose-sign example tool -k keyset [-s alg-name kid ]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--stdin\u0022))) {\n+\t\tfdin \u003d open(p, LWS_O_RDONLY, 0);\n+\t\tif (fdin \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: unable to open stdin file\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--stdout\u0022))) {\n+\t\tfdout \u003d open(p, LWS_O_WRONLY | LWS_O_CREAT | LWS_O_TRUNC, 0600);\n+\t\tif (fdout \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: unable to open stdout file\u005cn\u0022, __func__);\n+\t\t\tgoto bail_early;\n+\t\t}\n+\t}\n+\n+\t/*\n+\t * If no tag, you can tell it the signature type, otherwise it will\n+\t * use the tag to select the right type without these\n+\t */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--cose-sign\u0022))\n+\t\tsigtype \u003d SIGTYPE_MULTI;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--cose-sign1\u0022))\n+\t\tsigtype \u003d SIGTYPE_SINGLE;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--cose-mac\u0022))\n+\t\tsigtype \u003d SIGTYPE_MAC;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--cose-mac0\u0022))\n+\t\tsigtype \u003d SIGTYPE_MAC0;\n+\n+\t/* if signing, set the ciphers */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022))\n+\t\tsign \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid\u0022))) {\n+\t\tkid \u003d (uint8_t *)p;\n+\t\tkid_len \u003d strlen(p);\n+\t\t//lwsl_hexdump_notice(kid, kid_len);\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid-hex\u0022))) {\n+\t\tkid_len \u003d (size_t)lws_hex_to_byte_array(p, ktmp, sizeof(ktmp));\n+\t\tkid \u003d (uint8_t *)ktmp;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--extra\u0022))) {\n+\t\text_len \u003d (size_t)lws_hex_to_byte_array(p, extra, sizeof(extra));\n+\t\tlwsl_notice(\u0022%llu\u005cn\u0022, (unsigned long long)ext_len);\n+\t\tif (ext_len \u003d\u003d (size_t)-1ll)\n+\t\t\text_len \u003d 0;\n+\t}\n+\n+\t/* grab the key */\n+\n+\tif (!(p \u003d lws_cmdline_option(argc, argv, \u0022-k\u0022))) {\n+\t\tlwsl_err(\u0022-k \u003ckey set file\u003e is required\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (_alloc_file(context, p, \u0026ks, \u0026ks_len)) {\n+\t\tlwsl_err(\u0022%s: unable to load %s\u005cn\u0022, __func__, p);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_dll2_owner_clear(\u0026set);\n+\tif (!lws_cose_key_import(\u0026set, NULL, NULL, ks, ks_len)) {\n+\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n+\t\tfree(ks);\n+\t\tgoto bail2;\n+\t}\n+\n+\tfree(ks);\n+\n+\tif (!fdin) {\n+\t\tstruct timeval\ttimeout;\n+\t\tfd_set\tfds;\n+\n+\t\tFD_ZERO(\u0026fds);\n+\t\tFD_SET(0, \u0026fds);\n+\n+\t\ttimeout.tv_sec \u003d 0;\n+\t\ttimeout.tv_usec \u003d 1000;\n+\n+\t\tif (select(fdin + 1, \u0026fds, NULL, NULL, \u0026timeout) \u003c 0 ||\n+\t\t !FD_ISSET(0, \u0026fds)) {\n+\t\t\tlwsl_err(\u0022%s: pass cose_sign or plaintext \u0022\n+\t\t\t\t \u0022on stdin or --stdin\u005cn\u0022, __func__);\n+\t\t\tgoto bail2;\n+\t\t}\n+\t}\n+\n+\tif (sign) {\n+\t\tuint8_t *ppay;\n+\t\tsize_t s;\n+\n+\t\tp \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022);\n+\t\tif (!p) {\n+\t\t\tlwsl_err(\u0022%s: need to specify alg (eg, ES256) \u0022\n+\t\t\t\t \u0022when signing\u005cn\u0022, __func__);\n+\t\t\tgoto bail2;\n+\t\t}\n+\t\talg \u003d lws_cose_name_to_alg(p);\n+\n+\t\tlws_lec_init(\u0026lec, sbuf, sizeof(sbuf));\n+\t\tmemset(\u0026i, 0, sizeof(i));\n+\t\ti.cx\t\t\u003d context;\n+\t\ti.keyset\t\u003d \u0026set;\n+\t\ti.lec\t\t\u003d \u0026lec;\n+\t\ti.flags\t\t\u003d LCSC_FL_ADD_CBOR_TAG |\n+\t\t\t\t LCSC_FL_ADD_CBOR_PREFER_MAC0;\n+\t\ti.sigtype\t\u003d sigtype;\n+\n+\t\t/*\n+\t\t * Unfortunately, with COSE we must know the payload length\n+\t\t * before we have seen the payload. It's illegal to use\n+\t\t * indeterminite lengths inside COSE objects.\n+\t\t */\n+\n+\t\tdo {\n+\t\t\tn \u003d (int)read(fdin, temp, sizeof(temp));\n+\t\t\tif (n \u003c 0)\n+\t\t\t\tgoto bail3;\n+\t\t\tif (!n)\n+\t\t\t\tbreak;\n+\n+\t\t\ts \u003d (size_t)n;\n+\n+\t\t\tif (lws_buflist_append_segment(\u0026paybuf, temp, s) \u003c 0)\n+\t\t\t\tgoto bail3;\n+\t\t\ti.inline_payload_len +\u003d s;\n+\n+\t\t} while (1);\n+\n+\t//\tlwsl_notice(\u0022%s: inline_payload_len %llu\u005cn\u0022, __func__,\n+\t//\t\t\t(unsigned long long)i.inline_payload_len);\n+\n+\t\tcsc \u003d lws_cose_sign_create(\u0026i);\n+\t\tif (!csc)\n+\t\t\tgoto bail2;\n+\t\tck \u003d lws_cose_key_from_set(\u0026set, kid, kid_len);\n+\t\tif (!ck)\n+\t\t\tgoto bail2;\n+\n+\t\tif (lws_cose_sign_add(csc, alg, ck))\n+\t\t\tgoto bail2;\n+\n+\t\tdo {\n+\t\t\ts \u003d lws_buflist_next_segment_len(\u0026paybuf, \u0026ppay);\n+\t\t\tif (!s)\n+\t\t\t\tbreak;\n+\n+\t\t\tdo {\n+\t\t\t\tm \u003d (int)lws_cose_sign_payload_chunk(csc,\n+\t\t\t\t\t\t\t\t ppay, s);\n+\t\t\t\tif (lec.used) {\n+\t\t\t\t\t// lwsl_hexdump_err(sbuf, lec.used);\n+\t\t\t\t\twrite(fdout, sbuf, lec.used);\n+\t\t\t\t\tlws_lec_setbuf(\u0026lec, sbuf, sizeof(sbuf));\n+\t\t\t\t}\n+\t\t\t} while (m \u003d\u003d LCOSESIGEXTCB_RET_AGAIN);\n+\n+\t\t\tif (m \u003d\u003d LWS_LECPCTX_RET_FAIL)\n+\t\t\t\tgoto bail2;\n+\n+\t\t\tif (lec.used) {\n+\t\t\t\twrite(fdout, sbuf, lec.used);\n+\t\t\t\tlws_lec_setbuf(\u0026lec, sbuf, sizeof(sbuf));\n+\t\t\t}\n+\n+\t\t\tlws_buflist_use_segment(\u0026paybuf, s);\n+\t\t} while(1);\n+\n+\t} else {\n+\t\tmemset(\u0026vi, 0, sizeof(vi));\n+\n+\t\tvi.cx\t\t\u003d context;\n+\t\tvi.keyset\t\u003d \u0026set;\n+\t\tvi.sigtype\t\u003d sigtype;\n+\t\tvi.ext_cb\t\u003d extra_cb;\n+\t\tvi.ext_opaque\t\u003d extra;\n+\t\tvi.ext_len\t\u003d ext_len;\n+\t\tvi.pay_cb\t\u003d pay_cb;\n+\n+\t\tcps \u003d lws_cose_validate_create(\u0026vi);\n+\t\tif (!cps) {\n+\t\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+\t\tdo {\n+\t\t\tn \u003d (int)read(fdin, temp, sizeof(temp));\n+\t\t\tif (n \u003c 0)\n+\t\t\t\tgoto bail3;\n+\t\t\tif (!n)\n+\t\t\t\tbreak;\n+\n+\t\t\tn \u003d lws_cose_validate_chunk(cps, temp, (size_t)n, NULL);\n+\t\t\tif (n \u0026\u0026 n !\u003d LECP_CONTINUE) {\n+\t\t\t\tlwsl_err(\u0022%s: chunk validation failed: %d\u005cn\u0022,\n+\t\t\t\t\t\t__func__, n);\n+\t\t\t\tgoto bail2;\n+\t\t\t}\n+\t\t} while (1);\n+\t}\n+\n+bail3:\n+\n+\tresult \u003d 0;\n+\n+\tif (!sign) {\n+\t\tchar buf[2048];\n+\t\tint os;\n+\n+\t\to \u003d lws_cose_validate_results(cps);\n+\t\tif (!o)\n+\t\t\tresult \u003d 1;\n+\t\telse {\n+\t\t\tos \u003d lws_snprintf(buf, sizeof(buf),\n+\t\t\t\t\t \u0022\u005cnresults count %d\u005cn\u0022, o-\u003ecount);\n+\t\t\twrite(fdout, buf, (size_t)os);\n+\n+\t\t\tif (!o-\u003ecount)\n+\t\t\t\tresult \u003d 1;\n+\t\t}\n+\n+\t\tlws_start_foreach_dll_safe(struct lws_dll2 *, p, tp,\n+\t\t\t\t\t lws_dll2_get_head(o)) {\n+\t\t\tlws_cose_validate_res_t *res \u003d lws_container_of(p,\n+\t\t\t\t\t\tlws_cose_validate_res_t, list);\n+\t\t\tchar khr[256];\n+\n+\t\t\tkhr[0] \u003d '\u005c0';\n+\t\t\tif (res-\u003ecose_key) {\n+\t\t\t\tke \u003d \u0026res-\u003ecose_key-\u003emeta[COSEKEY_META_KID];\n+\t\t\t\tif (ke \u0026\u0026 ke-\u003ebuf)\n+\t\t\t\t\tlws_hex_from_byte_array(ke-\u003ebuf, ke-\u003elen,\n+\t\t\t\t\t\t\tkhr, sizeof(khr));\n+\t\t\t}\n+\t\t\tos \u003d lws_snprintf(buf, sizeof(buf),\n+\t\t\t\t \u0022 result: %d (alg %s, kid %s)\u005cn\u0022,\n+\t\t\t\t res-\u003eresult,\n+\t\t\t\t lws_cose_alg_to_name(res-\u003ecose_alg), khr);\n+\t\t\twrite(fdout, buf, (size_t)os);\n+\t\t\tresult |\u003d res-\u003eresult;\n+\t\t} lws_end_foreach_dll_safe(p, tp);\n+\t}\n+\n+bail2:\n+\tif (!sign)\n+\t\tlws_cose_validate_destroy(\u0026cps);\n+\telse {\n+\t\tlws_buflist_destroy_all_segments(\u0026paybuf);\n+\t\tlws_cose_sign_destroy(\u0026csc);\n+\t}\n+//bail1:\n+\tlws_cose_key_set_destroy(\u0026set);\n+bail:\n+\tlws_context_destroy(context);\n+\n+\tif (result)\n+\t\tlwsl_err(\u0022%s: FAIL: %d\u005cn\u0022, __func__, result);\n+\telse\n+\t\tlwsl_notice(\u0022%s: PASS\u005cn\u0022, __func__);\n+\n+bail_early:\n+\tif (fdin \u003e 0)\n+\t\tclose(fdin);\n+\tif (fdout !\u003d 1 \u0026\u0026 fdout \u003e\u003d 0)\n+\t\tclose(fdout);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/payload.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/payload.txt\nnew file mode 100644\nindex 0000000..402bd7c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/payload.txt\n@@ -0,0 +1 @@\n+The Test Payload\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/rsa-4096.ck b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/rsa-4096.ck\nnew file mode 100644\nindex 0000000..8b3fddb\nBinary files /dev/null and b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/rsa-4096.ck differ\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/set1.cks b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/set1.cks\nnew file mode 100644\nindex 0000000..e5eca18\nBinary files /dev/null and b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/set1.cks differ\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig\nnew file mode 100644\nindex 0000000..a233d68\nBinary files /dev/null and b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig differ\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass01.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass01.sig\nnew file mode 100644\nindex 0000000..d78767e\nBinary files /dev/null and b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass01.sig differ\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass02.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass02.sig\nnew file mode 100644\nindex 0000000..2b53930\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass02.sig\n@@ -0,0 +1 @@\n+Ò„C¡\u0001\u0026¡\u0004B11TThis is the content.X@\u0010rœ×\u0011Ë8\u0013ØØéD¨Úq\u0011ç²XɽÊa5÷®\u001aÛî•\t‰\u0012gƒ~\u001e3½6ÁP2jæ'UƽŽT\u000c\u003e’×Ò%èÛr¸‚\u000b\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass03.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass03.sig\nnew file mode 100644\nindex 0000000..a10fc96\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass03.sig\n@@ -0,0 +1 @@\n+„C¡\u0001\u0026¡\u0004B11TThis is the content.X@޳\u003eL£\u001d\u001cFZ°Z¬4Ìk#Õï\u005c\u00081\u0006ÄÒZ‘®ð°\u0011~*ù¢‘ª2áJ¸4ÜVí*\u00224DT~\u0001ñ\u001d;\t\u0016å¤ÃEÊË6\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass01.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass01.sig\nnew file mode 100644\nindex 0000000..268b086\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass01.sig\n@@ -0,0 +1 @@\n+Øb„A TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@⮯Ô\riÑþnR\u0007|]ôä\u0008(,¾û]\u0006Ëô\u0014¯.\u0019Ù‚¬E¬˜¸TL‹E\u0007Þ\u001e·\u0017ÃÓH\u0016þ’j+˜õ:ý/ ó\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass02.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass02.sig\nnew file mode 100644\nindex 0000000..b80f7a2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass02.sig\n@@ -0,0 +1 @@\n+Øb„@ TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@˸ÚÙ¾¯¸á¤\u0014\u0012M‹ûÂkíò©OËZˆ$2¿öÖ\u003e\u0015õtQØ?¢Ëö\u0026rëôÇÙ“°ôÂDvGØ1ºW̨k“\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass03.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass03.sig\nnew file mode 100644\nindex 0000000..60d8f03\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass03.sig\n@@ -0,0 +1 @@\n+„@ TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@⮯Ô\riÑþnR\u0007|]ôä\u0008(,¾û]\u0006Ëô\u0014¯.\u0019Ù‚¬E¬˜¸TL‹E\u0007Þ\u001e·\u0017ÃÓH\u0016þ’j+˜õ:ý/ ó\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/CMakeLists.txt\nnew file mode 100644\nindex 0000000..4896dfc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-crypto-jwe C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-crypto-jwe)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_JOSE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/README.md\nnew file mode 100644\nindex 0000000..f7ddc7a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/README.md\n@@ -0,0 +1,70 @@\n+# lws minimal example for JWE\n+\n+Demonstrates how to encrypt and decrypt using JWE and JWK, providing a\n+commandline tool for creating encrypted JWE and decoding them.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Stdin is either the plaintext (if encrypting) or JWE (if decrypting).\n+\n+Stdout is either the JWE (if encrypting) or plaintext (if decrypting).\n+\n+You must pass a private or public key JWK file in the -k option if encrypting,\n+and must pass a private key JWK file in the -k option if decrypting. To be\n+clear, for asymmetric keys the public part of the key is required to encrypt,\n+and the private part required to decrypt.\n+\n+For convenience, a pair of public and private keys are provided,\n+`key-rsa-4096.private` and `key-rsa-4096.pub`, these were produced with just\n+\n+```\n+ $ lws-crypto-jwk -t RSA -b 4096 --public key-rsa-4096.pub \u003ekey-rsa-4096.private\n+```\n+\n+Similar keys for EC modes may be produced with\n+\n+```\n+ $ lws-crypto-jwk -t EC -v P-256 --public key-ecdh-p-256.pub \u003ekey-ecdh-p-256.private\n+```\n+\n+and for AES (\u0022octet\u0022) symmetric keys\n+\n+```\n+ $ lws-crypto-jwk -t OCT -b 128 \u003ekey-aes-128.private\n+```\n+\n+JWEs produced with openssl and mbedtls backends are completely interchangeable.\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-e \u0022\u003ccek cipher alg\u003e \u003cpayload enc alg\u003e\u0022|Encrypt (default is decrypt), eg, -e \u0022RSA1_5 A128CBC-HS256\u0022. For decrypt, the cipher information comes from the input JWE.\n+-k \u003cjwk file\u003e|JWK file to encrypt or decrypt with\n+-c|Format the JWE as a linebroken C string\n+-f|Output flattened representation (instead of compact by default)\n+\n+```\n+ $ echo -n \u0022plaintext0123456\u0022 | ./lws-crypto-jwe -k key-rsa-4096.private -e \u0022RSA1_5 A128CBC-HS256\u0022\n+[2018/12/19 16:20:25:6519] USER: LWS JWE example tool\n+[2018/12/19 16:20:25:6749] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+eyJhbGciOiJSU0ExXzUiLCAiZW5jIjoiQTEyOENCQy1IUzI1NiJ9.ivFr7qzx-pQ4V_edbjpdvR9OwWL9KmojPE2rXQM52oLtW0BtnxZu2_ezqhsAelyIcaworgfobs3u4bslXHMFbeJJjPb5xD0fBDe64OYXZH1NpUGTMJh9Ka4CrJ2B3xhxe7EByGAuGqmluqE0Yezj7rhSw7vlr5JAwuOJ8FaGa8aZ8ldki5G5h_S2Furlbjdcw3Rrxk7mCoMHcLoqzfZtggMPwGAMFogCqcwUo7oSLbBeGaa6hpMbfSysugseWdr8TzObQKPM52k6iVAlGwRaOg_qdLMgZiYRhHA6nFKTQd7XBbNY6qAS8sPuj7Zz344tF3RSfJ0zX_telG71sOtVv5fMpeDU-eCdpOWlCBfu6J6FQfAFu6SJryM4ajGOif09CwFI5qUQ33SOfQfS_M3nqSyd6Vu5M4lsDrb5wK7_XX5gqUwvI9wicf_8WWR-CQomRF-JvEASnA2SIf8QqYfa8R2rP9q6Md4vwO4EZrtxIsMDPsH-4ZEFu7vDjyy09QfIWWsnEb8-UgpVXensgt2m_2bZ76r1VB8-0nZLMwMyEhaH2wra9vX2FWao5UkmNJ7ht300f4_V6QzMFoePpwCvsufWBW6jcQLB-frCWe6uitWaZHEB4LxmNPKzQSz4QwwTKhpF1jNn8Xh1-w1m-2h0gj-oe-S8QBwPveqhPI1p2fI.snuhUTXHNu5mJ6dEPQqg6g.yl36qC4o0GE4nrquQ2YyCg.Vf0MoT7_kUrZdCNWXhq1DQ\n+```\n+\n+Notice the logging is on stderr, and the output alone on stdout.\n+\n+You can also pipe the output of the encrypt action directly into the decrypt\n+action, eg\n+\n+```\n+ $ echo -n \u0022plaintext0123456\u0022 | \u005c\n+ ./lws-crypto-jwe -k key-rsa-4096.pub -e \u0022RSA1_5 A128CBC-HS256\u0022 | \u005c\n+ ./lws-crypto-jwe -k key-rsa-4096.private\n+```\n+\n+prints the plaintext on stdout.\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.private b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.private\nnew file mode 100644\nindex 0000000..1084143\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.private\n@@ -0,0 +1 @@\n+{\u0022d\u0022:\u0022XcSl3ulvs4OGomu9thRPVQGOstim0PY7CibP_bnCmzjvmGmzb8J4q5AUmJCnZT5TesOzXuXhyG95CxQWsakd9GWHSAinV1QQSLsahaezPULRG1qmo37JqKb9noKkvXguh5XU5np8HjeoeeEkF_XqtCdEo0wHijEjTL9RZar98jmyAmlizoHIY9NnECavs4DZB27onU61B61vGpw-y4xhC9jlZSIwRqIMDzeTcSv8fRKcVYR80ozm2_KwWMpue27rS2EfTQUtsMXuYmnvMAf_DHqA0tNWyD1gpUWYHvlyBh5xnYrWPuXxQBRNesImQdRQl5VMMsuvdtY-uZfIVUdN5CcsB0acronx4UsmVg-Qz-jd1NVW4koZQM9uA4oWiMZg4FEUTQ-UWelHCldg-PYLAazsItmaHPF9LcAPkLkI8jaVS33v-DhSeXHW3Pg3sibtnPhouiSvD84zMtzu1gjFT7vtapMynBeZouqeWYT-BFeu2wzppJcW1YxTQ_Ai80VJSFY__Huw-9r1MOHmDRcEW7x9W97UezWDjrh5Shhh4C6SMYbaf7ouACzFu1i_r8Q06JqKA7aY8i5izKlKA0We9tQKlTF8Fgsneu9gpxFglvZsd1ersiA-MkuP9qTBQpyAf3kJ6HS9GrQUju6r3DExdWDjdvM5Grt8QD7Zkv-qXeE\u0022,\u0022dp\u0022:\u0022M-LFs3T2GI1JxD5LJt2GgV4cMDKbiPKBddLukfG0duUxNp0-6x2LZ0ptxrlHrhxBMMmvCg4GEaujrZdaYWCar6xCnlnkVlOELz4yZ3JBSpS86thJw03xuE7lyeR7usFY4CpSqUQGI_YveITuFeoh4YjwdKDuqPhOpDI-34ptgU93dlBRS9nnQFTiVoUdP4bhGTKOpULTiLgPXHQxQR5rfiGVD9AIwqHvMdBQ0hxQBKEt37PbRWK_eTzMslHZGWNfbg8ipwJxisvHyUn0c1X3Uelw8BRyvNVCNovNDeCj-R7kFkMvriMd_sqGVy1Go46WZ2wMkUJHkvmYk0gDlhnTGQ\u0022,\u0022dq\u0022:\u0022qO89nQEJfdkaDtGGyD-sQE2Mm8p_PIPSpCmgMfpl8zgSOb4P9iqXBgpHyS7w10uY_UHt8KW6pY7ozy0y4Gu_f4Wk_rcXiYYdbuIhlFl0_nLI2mfFPGxr1xC64zfjjEaBr4zIJr_YzhvTpjZFtIdSAH5VG5Tv-2yUtCC2DnKnU2kzEkgUeSI6LHOEVhXqup7C0Kjiv9FJsLR0hiqwH4oLziqH7EVqVDvJI3yL1lhqoLKjAu1ogTDgH7hzSrqVhttnpwL8rDcgbtY6Q8C2csdN3Jt1ucgtGy-Yzgqf_QIULP3CRlqzDTvHrMe2A9cNAQ4dNsCbNAjW_MxxGKKWuWXAMQ\u0022,\u0022e\u0022:\u0022AQAB\u0022,\u0022kid\u0022:\u0022my kid\u0022,\u0022kty\u0022:\u0022RSA\u0022,\u0022n\u0022:\u00222_YjG_D1sOWJxs6cohikupHf5WJfWSFfSCrnNZ7WR7AyTLnKZAF4VKyimMeJTLYYwCAXMDD5XmkF8VluI4O-hASUIJ7F9eDg3vO7nPwtkWa9lkqt-QyQZ_PjiOGpwetBLzrsaXsC9PvdVzrKXnjeNPsmmbC_Fx2cUn4H_9H_WfXi01VR75XFTBtxTrDY7hmpZHuFCFUOMCW9siTZRk9339Y6ORBznBs4jFbkGI1Pmc3op0o5f8S1gus9L81W5uyUrxfd-CkmJ6eWE8I36cfzI6irN2bhVhR_NXERUtS0QOEeJYlRJXqfYkxTMVlsXPl6zbYt__ZYLC6ZiUTCc6K2KmfGh7fihWbao4dyQW3Mq4kClhpIT0O01Y0r7sR1j4jTnFNqbmtPSl9lEMrfiUHfOLqRJo3qizQ-b6HLCDty1otFz8Q8gg0rD3copQ_zFrcTGwJGAv2Absraj7kp9EJXBqneCJ3dlRO8rzx7KB9Dsj-ygh3kZaubkPCeT1v4l_VUY2iGnK4vzIGKM7j56DQ97ZAi1Bb0y6GYSbrWB2_z0DKJu0fiU-NscbKplR68vgppUM6_iogrk48JEZg_kkTymniqbT3g7J_WeoZSx1Uu8ZHI3ysIFfUtFscOa2SJGlj1ds-lfk6Oqac_I8ahRqQeyVAEisZPmYIGSJajbJopJ4s\u0022,\u0022p\u0022:\u0022_V4CwEjRd8Hv9-ncqGdB_vtReTIuHSWQzSx4al15J3VxvPFI2kxicNeQKyq3OAVT2kmCmUP3ETgCdwuKIgw_QbEc8qNxtS_KpM_KsuTe9a5jrQKpt8ctYhzELZfr_sy9UzUGJzr8glLjJ1IDX4x6_JAqYB_NhttP6bzgu5Dt-DKtRPNO1qZtfhrLIgmltpC2M6-AlAv-dyHSHck2VJIL84Hwk4FulozEYxop0dKuZdfM5Z1dZM8-ICo62O0zUKzoWxKmQcB9_gDZsxYaO6xZ9BLmaW6-WcPSEI6YDnPk8ptnk_Kbyc4kPW4Z3ASczxjaewBmfl2_lwkqkndFVptAeQ\u0022,\u0022q\u0022:\u00223j9DR6ZpKC3WrshSrxXFYAuT19Rlf6qQ_9uD_Fq7dIpTjCZdl01695Qx7UmujKoetutL3RMCpeRdZR-gCLVh8aMxpMuIc5fHC6HbhsdF-I7GoqO0DEJ6coS3n5Ey4EXL5uoLh4C3l67wBKfLmPW28bxxG2QAP59jncWXkrBQm_qbS5Qon8r7wj0tejG_tGdsPjhsFc9KdnkkBucT6MiEVpzpdwDlsn7bHpMsyPlNyc0fj5qYmRB-DN7rv5varaisBaVT0mLQdwKjBDVqNVnU2m5azPhY-2txvihHaI5_cLIsLLaqKMbB17UxGumuT_o8S03_h8-1syO3Ay87y9pPIw\u0022,\u0022qi\u0022:\u0022JY2uUek6wPrp4fPcInX_5WdNlhyghcGVEvlqxs9iOEUeCtUc6d42n9tgiImMu605dQaigvNaH5y1pwDpLlmxUk0nOUVxqo9mv0Uw8WNXB88FyDb0fPbewLpn4Fskb8Umv6_OymJ1W814DRG-jq3sI5DsB7AjtqJQ22nP2Vs1bIrx5fUxuScwrMsWSrrjAx4Kr8-5eeSDqE-_c7DPZ_zSPYDoHaMeR2pZfNAq3mEbxp8jMukzh77rYZ3ffQEA6AyxFSCSCrxVozhP4ypQ0jAkXVWOlj4nuV6briIqlL3ZboydwsIolRwaPSgH6-bw03XS6Hb9DA0KHJKLun94N9n5kw\u0022,\u0022use\u0022:\u0022enc\u0022}\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.pub b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.pub\nnew file mode 100644\nindex 0000000..e2bd85c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.pub\n@@ -0,0 +1 @@\n+{\u0022e\u0022:\u0022AQAB\u0022,\u0022kid\u0022:\u0022my kid\u0022,\u0022kty\u0022:\u0022RSA\u0022,\u0022n\u0022:\u00222_YjG_D1sOWJxs6cohikupHf5WJfWSFfSCrnNZ7WR7AyTLnKZAF4VKyimMeJTLYYwCAXMDD5XmkF8VluI4O-hASUIJ7F9eDg3vO7nPwtkWa9lkqt-QyQZ_PjiOGpwetBLzrsaXsC9PvdVzrKXnjeNPsmmbC_Fx2cUn4H_9H_WfXi01VR75XFTBtxTrDY7hmpZHuFCFUOMCW9siTZRk9339Y6ORBznBs4jFbkGI1Pmc3op0o5f8S1gus9L81W5uyUrxfd-CkmJ6eWE8I36cfzI6irN2bhVhR_NXERUtS0QOEeJYlRJXqfYkxTMVlsXPl6zbYt__ZYLC6ZiUTCc6K2KmfGh7fihWbao4dyQW3Mq4kClhpIT0O01Y0r7sR1j4jTnFNqbmtPSl9lEMrfiUHfOLqRJo3qizQ-b6HLCDty1otFz8Q8gg0rD3copQ_zFrcTGwJGAv2Absraj7kp9EJXBqneCJ3dlRO8rzx7KB9Dsj-ygh3kZaubkPCeT1v4l_VUY2iGnK4vzIGKM7j56DQ97ZAi1Bb0y6GYSbrWB2_z0DKJu0fiU-NscbKplR68vgppUM6_iogrk48JEZg_kkTymniqbT3g7J_WeoZSx1Uu8ZHI3ysIFfUtFscOa2SJGlj1ds-lfk6Oqac_I8ahRqQeyVAEisZPmYIGSJajbJopJ4s\u0022}\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/main.c\nnew file mode 100644\nindex 0000000..883f0b6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/main.c\n@@ -0,0 +1,288 @@\n+/*\n+ * lws-crypto-jwe\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+/*\n+ * handles escapes and line wrapping suitable for use\n+ * defining a C char array ( -c option )\n+ */\n+\n+static void\n+format_c(const char *key)\n+{\n+\tconst char *k \u003d key;\n+\tint seq \u003d 0;\n+\n+\twhile (*k) {\n+\t\tif (*k \u003d\u003d '{') {\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tputchar('{');\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tputchar('\u005cn');\n+\t\t\tputchar('\u005ct');\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tk++;\n+\t\t\tseq \u003d 0;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (*k \u003d\u003d '}') {\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tputchar('\u005cn');\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tputchar('}');\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tputchar('\u005cn');\n+\t\t\tk++;\n+\t\t\tseq \u003d 0;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (*k \u003d\u003d '\u005c\u0022') {\n+\t\t\tputchar('\u005c\u005c');\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tseq +\u003d 2;\n+\t\t\tk++;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (*k \u003d\u003d ',') {\n+\t\t\tputchar(',');\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tputchar('\u005cn');\n+\t\t\tputchar('\u005ct');\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tk++;\n+\t\t\tseq \u003d 0;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tputchar(*k);\n+\t\tseq++;\n+\t\tif (seq \u003e\u003d 60) {\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tputchar('\u005cn');\n+\t\t\tputchar('\u005ct');\n+\t\t\tputchar(' ');\n+\t\t\tputchar('\u005c\u0022');\n+\t\t\tseq \u003d 1;\n+\t\t}\n+\t\tk++;\n+\t}\n+}\n+\n+#define MAX_SIZE (4 * 1024 * 1024)\n+\tchar temp[MAX_SIZE], compact[MAX_SIZE];\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n, enc \u003d 0, result \u003d 0,\n+\t logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tchar *in;\n+\tstruct lws_context_creation_info info;\n+\tint temp_len \u003d sizeof(temp);\n+\tstruct lws_context *context;\n+\tstruct lws_jwe jwe;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS JWE example tool\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\tinfo.options \u003d 0;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_jwe_init(\u0026jwe, context);\n+\n+\t/* if encrypting, set the ciphers */\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-e\u0022))) {\n+\t\tchar *sp \u003d strchr(p, ' ');\n+\n+\t\tif (!sp) {\n+\t\t\tlwsl_err(\u0022format: -e \u005c\u0022\u003ccek cipher alg\u003e \u0022\n+\t\t\t\t \u0022\u003cpayload enc alg\u003e\u005c\u0022, eg, \u0022\n+\t\t\t\t \u0022-e \u005c\u0022RSA1_5 A128CBC-HS256\u005c\u0022\u005cn\u0022);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\t\t*sp \u003d '\u005c0';\n+\t\tif (lws_gencrypto_jwe_alg_to_definition(p, \u0026jwe.jose.alg)) {\n+\t\t\tlwsl_err(\u0022Unknown cipher alg %s\u005cn\u0022, p);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tif (lws_gencrypto_jwe_enc_to_definition(sp + 1, \u0026jwe.jose.enc_alg)) {\n+\t\t\tlwsl_err(\u0022Unknown payload enc alg %s\u005cn\u0022, sp + 1);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\t/* create JOSE header, also needed for output */\n+\n+\t\tif (lws_jws_alloc_element(\u0026jwe.jws.map, LJWS_JOSE,\n+\t\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t\t \u0026temp_len, strlen(p) +\n+\t\t\t\t\t strlen(sp + 1) + 32, 0)) {\n+\t\t\tlwsl_err(\u0022%s: temp space too small\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tjwe.jws.map.len[LJWS_JOSE] \u003d (uint32_t)lws_snprintf(\n+\t\t\t\t(char *)jwe.jws.map.buf[LJWS_JOSE], (unsigned int)temp_len,\n+\t\t\t\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022%s\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022, p, sp + 1);\n+\n+\t\tenc \u003d 1;\n+\t}\n+\n+\tin \u003d lws_concat_temp(temp, temp_len);\n+\tn \u003d (int)read(0, in, (unsigned int)temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022Problem reading from stdin\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* account for padding as well */\n+\n+\ttemp_len -\u003d (int)lws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN, (unsigned int)n);\n+\n+\t/* grab the key */\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-k\u0022))) {\n+\t\tif (lws_jwk_load(\u0026jwe.jwk, p, NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: problem loading JWK %s\u005cn\u0022, __func__, p);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\t} else {\n+\t\tlwsl_err(\u0022-k \u003cjwk file\u003e is required\u005cn\u0022);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tif (enc) {\n+\n+\t\t/* point CTXT to the plaintext we read from stdin */\n+\n+\t\tjwe.jws.map.buf[LJWE_CTXT] \u003d in;\n+\t\tjwe.jws.map.len[LJWE_CTXT] \u003d (uint32_t)n;\n+\n+\t\t/*\n+\t\t * Create a random CEK and set EKEY to it\n+\t\t * CEK size is determined by hash / hmac size\n+\t\t */\n+\n+\t\tn \u003d lws_gencrypto_bits_to_bytes(jwe.jose.enc_alg-\u003ekeybits_fixed);\n+\t\tif (lws_jws_randomize_element(context, \u0026jwe.jws.map, LJWE_EKEY,\n+\t\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t\t \u0026temp_len, (unsigned int)n,\n+\t\t\t\t\t LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n+\t\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\t/* perform the encryption of the CEK and the plaintext */\n+\n+\t\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len);\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n+\t\t\tgoto bail1;\n+\t\t}\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-f\u0022))\n+\t\t\t/* output the JWE in flattened form */\n+\t\t\tn \u003d lws_jwe_render_flattened(\u0026jwe, compact,\n+\t\t\t\t\t\t sizeof(compact));\n+\t\telse\n+\t\t\t/* output the JWE in compact form */\n+\t\t\tn \u003d lws_jwe_render_compact(\u0026jwe, compact,\n+\t\t\t\t\t\t sizeof(compact));\n+\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: lws_jwe_render failed: %d\u005cn\u0022,\n+\t\t\t\t __func__, n);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-c\u0022))\n+\t\t\tformat_c(compact);\n+\t\telse\n+\t\t\tif (write(1, compact,\n+#if defined(WIN32)\n+\t\t\t\t\t(unsigned int)\n+#endif\n+\t\t\t\t\tstrlen(compact)) \u003c 0) {\n+\t\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n+\t\t\t\tgoto bail1;\n+\t\t\t}\n+\t} else {\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-f\u0022)) {\n+\t\t\tif (lws_jwe_json_parse(\u0026jwe, (uint8_t *)in, n,\n+\t\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t\t \u0026temp_len)) {\n+\t\t\t\tlwsl_err(\u0022%s: lws_jwe_json_parse failed\u005cn\u0022,\n+\t\t\t\t\t\t\t\t __func__);\n+\t\t\t\tgoto bail1;\n+\t\t\t}\n+\t\t} else\n+\t\t\t/*\n+\t\t\t * converts a compact serialization to b64 + decoded maps\n+\t\t\t * held in jws\n+\t\t\t */\n+\t\t\tif (lws_jws_compact_decode(in, n, \u0026jwe.jws.map,\n+\t\t\t\t\t\t \u0026jwe.jws.map_b64,\n+\t\t\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t\t\t \u0026temp_len) !\u003d 5) {\n+\t\t\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\tgoto bail1;\n+\t\t\t}\n+\n+\t\t/*\n+\t\t * Do the crypto according to what we parsed into the jose\n+\t\t * (information on the ciphers) and the jws (plaintext and\n+\t\t * signature info)\n+\t\t */\n+\n+\t\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe,\n+\t\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t\t \u0026temp_len);\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\t/* if it's valid, dump the plaintext and return 0 */\n+\n+\t\tif (write(1, jwe.jws.map.buf[LJWE_CTXT],\n+\t\t\t jwe.jws.map.len[LJWE_CTXT]) \u003c 0) {\n+\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n+\t\t\tgoto bail1;\n+\t\t}\n+\t}\n+\n+\tresult \u003d 0;\n+\n+bail1:\n+\n+\tlws_jwe_destroy(\u0026jwe);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/CMakeLists.txt\nnew file mode 100644\nindex 0000000..a5b2d07\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-crypto-jwk C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-crypto-jwk)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_JOSE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/README.md\nnew file mode 100644\nindex 0000000..eea687d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/README.md\n@@ -0,0 +1,52 @@\n+# lws minimal example for JWK\n+\n+Demonstrates how to generate and format any kind of supported new random JWK keys.\n+\n+The full private key is output to stdout, a version of the key with the private\n+part removed and some metadata adapted can be saved to a file at the same time\n+using `--public \u003cfile\u003e`. In the public form, `key_ops` and `use` elements are\n+adjusted to remove activities that require a private key.\n+\n+Key elements are output in strict RFC7638 lexicographic order as required by\n+some applications.\n+\n+Keys produced with openssl and mbedtls backends are completely interchangeable.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-t \u003ctype\u003e|RSA, OCT or EC\n+-b \u003cbits\u003e|For RSA and OCT, key size in bits\n+-v \u003ccurve\u003e|For EC keys, the curve, eg, \u0022P-384\u0022... this implies the key bits\n+--kid \u0022ID string\u0022|Key identity string\n+--use \u0022use[ use]\u0022|Key use restriction (mutually exclusive with --key-ops): sig, enc\n+--alg \u003calg\u003e|Specify the algorithm the key is designed for, eg \u0022RSA1_5\u0022\n+--key-ops \u0022op[ op]\u0022|Key valid operations (mutually exclusive with --use): sign, verify, encrypt, decrypt, wrapKey, unwrapKey, deriveKey, deriveBits\n+-c|Format the jwk as a linebroken C string\n+--public \u003cfilepath\u003e|Only output the full, private key, not the public version first\n+\n+For legibility the example uses -c, however this\n+\n+```\n+ $ ./lws-crypto-jwk -t EC -v P-256 --key-ops \u0022sign verify\u0022 --public mykey.pub\n+[2018/12/18 20:19:29:6972] USER: LWS JWK example\n+[2018/12/18 20:19:29:7200] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+[2018/12/18 20:19:29:7251] NOTICE: lws_jwk_generate: generating ECDSA key on curve P-256\n+{\u0022crv\u0022:\u0022P-256\u0022,\u0022d\u0022:\u0022eMKM_S4BTL2aiebZLqvxglufV2YX4b3_32DesgEUOaM\u0022,\u0022key_ops\u0022:[\u0022sign\u0022,\u0022verify\u0022],\u0022kty\u0022:\u0022EC\u0022,\u0022x\u0022:\u0022OWauiGGtJ60ZegtqlwETQlmO1exTZdWbT2VbUs4a1hg\u0022,\u0022y\u0022:\u0022g_eNOlqPecbguVQArL6Fd4T5xZthBgipNCBypXubPos\u0022}\n+```\n+\n+The output in `mykey.pub` is:\n+\n+```\n+{\u0022crv\u0022:\u0022P-256\u0022,\u0022key_ops\u0022:[\u0022verify\u0022],\u0022kty\u0022:\u0022EC\u0022,\u0022x\u0022:\u0022OWauiGGtJ60ZegtqlwETQlmO1exTZdWbT2VbUs4a1hg\u0022,\u0022y\u0022:\u0022g_eNOlqPecbguVQArL6Fd4T5xZthBgipNCBypXubPos\u0022}\n+```\n+\n+Notice the logging goes out on stderr, the key data goes on stdout.\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/main.c\nnew file mode 100644\nindex 0000000..db62457\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/main.c\n@@ -0,0 +1,200 @@\n+/*\n+ * lws-crypto-jwk\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+/*\n+ * handles escapes and line wrapping suitable for use\n+ * defining a C char array ( -c option )\n+ */\n+\n+static int\n+format_c(int fd, const char *key)\n+{\n+\tconst char *k \u003d key;\n+\tint seq \u003d 0;\n+\n+\twhile (*k) {\n+\t\tif (*k \u003d\u003d '{') {\n+\t\t\tif (write(fd, \u0022\u005c\u0022{\u005c\u0022\u005cn\u005ct\u005c\u0022\u0022, 6) \u003c 6)\n+\t\t\t\treturn -1;\n+\t\t\tk++;\n+\t\t\tseq \u003d 0;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (*k \u003d\u003d '}') {\n+\t\t\tif (write(fd, \u0022\u005c\u0022\u005cn\u005c\u0022}\u005c\u0022\u005cn\u0022, 6) \u003c 6)\n+\t\t\t\treturn -1;\n+\t\t\tk++;\n+\t\t\tseq \u003d 0;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (*k \u003d\u003d '\u005c\u0022') {\n+\t\t\tif (write(fd, \u0022\u005c\u005c\u005c\u0022\u0022, 2) \u003c 2)\n+\t\t\t\treturn -1;\n+\t\t\tseq +\u003d 2;\n+\t\t\tk++;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (*k \u003d\u003d ',') {\n+\t\t\tif (write(fd, \u0022,\u005c\u0022\u005cn\u005ct\u005c\u0022\u0022, 5) \u003c 5)\n+\t\t\t\treturn -1;\n+\t\t\tk++;\n+\t\t\tseq \u003d 0;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (write(fd, k, 1) \u003c 1)\n+\t\t\treturn -1;\n+\t\tseq++;\n+\t\tif (seq \u003e\u003d 60) {\n+\t\t\tif (write(fd, \u0022\u005c\u0022\u005cn\u005ct \u005c\u0022\u0022, 5) \u003c 5)\n+\t\t\t\treturn -1;\n+\t\t\tseq \u003d 1;\n+\t\t}\n+\t\tk++;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint result \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tenum lws_gencrypto_kty kty \u003d LWS_GENCRYPTO_KTY_RSA;\n+\tstruct lws_context_creation_info info;\n+\tconst char *curve \u003d \u0022P-256\u0022, *p;\n+\tstruct lws_context *context;\n+\tstruct lws_jwk jwk;\n+\tint bits \u003d 4096;\n+\tchar key[32768];\n+\tint vl \u003d sizeof(key);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS JWK example\u005cn\u0022);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-b\u0022)))\n+\t\tbits \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-t\u0022))) {\n+\t\tif (!strcmp(p, \u0022RSA\u0022))\n+\t\t\tkty \u003d LWS_GENCRYPTO_KTY_RSA;\n+\t\telse\n+\t\t\tif (!strcmp(p, \u0022OCT\u0022))\n+\t\t\t\tkty \u003d LWS_GENCRYPTO_KTY_OCT;\n+\t\t\telse\n+\t\t\t\tif (!strcmp(p, \u0022EC\u0022))\n+\t\t\t\t\tkty \u003d LWS_GENCRYPTO_KTY_EC;\n+\t\t\t\telse {\n+\t\t\t\t\tlwsl_err(\u0022Unknown key type (must be \u0022\n+\t\t\t\t\t\t \u0022OCT, RSA or EC)\u005cn\u0022);\n+\n+\t\t\t\t\treturn 1;\n+\t\t\t\t}\n+\t}\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\tinfo.options \u003d 0;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-v\u0022)))\n+\t\tcurve \u003d p;\n+\n+\tif (lws_jwk_generate(context, \u0026jwk, kty, bits, curve)) {\n+\t\tlwsl_err(\u0022lws_jwk_generate failed\u005cn\u0022);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid\u0022)))\n+\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_KID, p, (int)strlen(p));\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--use\u0022)))\n+\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_USE, p, (int)strlen(p));\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022)))\n+\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_ALG, p, (int)strlen(p));\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--key-ops\u0022)))\n+\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_KEY_OPS, p, (int)strlen(p));\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--public\u0022)) \u0026\u0026\n+\t kty !\u003d LWS_GENCRYPTO_KTY_OCT) {\n+\n+\t\tint fd;\n+\n+\t\t/* public version */\n+\n+\t\tif (lws_jwk_export(\u0026jwk, 0, key, \u0026vl) \u003c 0) {\n+\t\t\tlwsl_err(\u0022lws_jwk_export failed\u005cn\u0022);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tfd \u003d open(p, LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);\n+\t\tif (fd \u003c 0) {\n+\t\t\tlwsl_err(\u0022Can't open public key file %s\u005cn\u0022, p);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-c\u0022))\n+\t\t\tformat_c(fd, key);\n+\t\telse {\n+\t\t\tif (write(fd, key,\n+#if defined(WIN32)\n+\t\t\t\t\t(unsigned int)\n+#endif\n+\t\t\t\t\tstrlen(key)) \u003c 0) {\n+\t\t\t\tlwsl_err(\u0022Write public failed\u005cn\u0022);\n+\t\t\t\treturn 1;\n+\t\t\t}\n+\t\t}\n+\n+\t\tclose(fd);\n+\t}\n+\n+\t/* private version */\n+\n+\tif (lws_jwk_export(\u0026jwk, LWSJWKF_EXPORT_PRIVATE, key, \u0026vl) \u003c 0) {\n+\t\tlwsl_err(\u0022lws_jwk_export failed\u005cn\u0022);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-c\u0022)) {\n+\t\tif (format_c(1, key) \u003c 0)\n+\t\t\treturn 1;\n+\t} else\n+\t\tif (write(1, key,\n+#if defined(WIN32)\n+\t\t\t\t(unsigned int)\n+#endif\n+\t\t\t\tstrlen(key)) \u003c 0) {\n+\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jws/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/CMakeLists.txt\nnew file mode 100644\nindex 0000000..b566fb2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-crypto-jws C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-crypto-jws)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_JOSE 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jws/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/README.md\nnew file mode 100644\nindex 0000000..97cbf00\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/README.md\n@@ -0,0 +1,60 @@\n+# lws minimal example for JWS\n+\n+Demonstrates how to sign and verify using compact JWS and JWK, providing a\n+commandline tool for signing and verifying stdin.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Stdin is either the plaintext (if signing) or compact JWS (if verifying).\n+\n+Stdout is either the JWE (if encrypting) or plaintext (if decrypting).\n+\n+You must pass a private or public key JWK file in the -k option if encrypting,\n+and must pass a private key JWK file in the -k option if decrypting. To be\n+clear, for asymmetric keys the public part of the key is required to encrypt,\n+and the private part required to decrypt.\n+\n+For convenience, a pair of public and private keys are provided,\n+`key-rsa-4096.private` and `key-rsa-4096.pub`, these were produced with just\n+\n+```\n+ $ lws-crypto-jwk -t RSA -b 4096 --public key-rsa-4096.pub \u003ekey-rsa-4096.private\n+```\n+\n+Similar keys for EC modes may be produced with\n+\n+```\n+ $ lws-crypto-jwk -t EC -v P-256 --public key-ecdh-p-256.pub \u003ekey-ecdh-p-256.private\n+```\n+\n+JWSs produced with openssl and mbedtls backends are completely interchangeable.\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-s \u0022\u003csignature alg\u003e\u0022|Sign (default is verify), eg, -e \u0022ES256\u0022. For verify, the cipher information comes from the input JWS.\n+-k \u003cjwk file\u003e|JWK file to sign or verify with... sign requires the key has its private part\n+-c|Format the JWE as a linebroken C string\n+-f|Output flattened representation (instead of compact by default)\n+\n+```\n+ $ echo -n \u0022plaintext0123456\u0022 | ./lws-crypto-jws -s \u0022ES256\u0022 -k ec-p256.private\n+[2018/12/19 16:20:25:6519] USER: LWS JWE example tool\n+[2018/12/19 16:20:25:6749] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+eyJhbGciOiJSU0ExXzUiLCAiZW5jIjoiQTEyOENCQy1IUzI1NiJ9.ivFr7qzx-pQ4V_edbjpdvR9OwWL9KmojPE2rXQM52oLtW0BtnxZu2_ezqhsAelyIcaworgfobs3u4bslXHMFbeJJjPb5xD0fBDe64OYXZH1NpUGTMJh9Ka4CrJ2B3xhxe7EByGAuGqmluqE0Yezj7rhSw7vlr5JAwuOJ8FaGa8aZ8ldki5G5h_S2Furlbjdcw3Rrxk7mCoMHcLoqzfZtggMPwGAMFogCqcwUo7oSLbBeGaa6hpMbfSysugseWdr8TzObQKPM52k6iVAlGwRaOg_qdLMgZiYRhHA6nFKTQd7XBbNY6qAS8sPuj7Zz344tF3RSfJ0zX_telG71sOtVv5fMpeDU-eCdpOWlCBfu6J6FQfAFu6SJryM4ajGOif09CwFI5qUQ33SOfQfS_M3nqSyd6Vu5M4lsDrb5wK7_XX5gqUwvI9wicf_8WWR-CQomRF-JvEASnA2SIf8QqYfa8R2rP9q6Md4vwO4EZrtxIsMDPsH-4ZEFu7vDjyy09QfIWWsnEb8-UgpVXensgt2m_2bZ76r1VB8-0nZLMwMyEhaH2wra9vX2FWao5UkmNJ7ht300f4_V6QzMFoePpwCvsufWBW6jcQLB-frCWe6uitWaZHEB4LxmNPKzQSz4QwwTKhpF1jNn8Xh1-w1m-2h0gj-oe-S8QBwPveqhPI1p2fI.snuhUTXHNu5mJ6dEPQqg6g.yl36qC4o0GE4nrquQ2YyCg.Vf0MoT7_kUrZdCNWXhq1DQ\n+```\n+\n+Notice the logging is on stderr, and the output alone on stdout.\n+\n+When signing, the compact representation of the JWS is output on stdout.\n+\n+When verifying, if the signature is valid the plaintext is output on stdout\n+and the tool exits with a 0 exit code. Otherwise nothing is output on stdout\n+and it exits with a nonzero exit code.\n+\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-jws/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/main.c\nnew file mode 100644\nindex 0000000..d579aab\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/main.c\n@@ -0,0 +1,215 @@\n+/*\n+ * lws-crypto-jws\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+#define MAX_SIZE (4 * 1024 * 1024)\n+char temp[MAX_SIZE], compact[MAX_SIZE];\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n, sign \u003d 0, result \u003d 0,\n+\t logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tchar *in;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_jws_map map;\n+\tint temp_len \u003d sizeof(temp);\n+\tstruct lws_context *context;\n+\tstruct lws_jose jose;\n+\tstruct lws_jwk jwk;\n+\tstruct lws_jws jws;\n+\tconst char *p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS JWS example tool\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\tinfo.options \u003d 0;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_jose_init(\u0026jose);\n+\tlws_jws_init(\u0026jws, \u0026jwk, context);\n+\n+\t/* if signing, set the ciphers */\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022))) {\n+\n+\t\tif (lws_gencrypto_jws_alg_to_definition(p, \u0026jose.alg)) {\n+\t\t\tlwsl_err(\u0022format: -s \u005c\u0022\u003cjws cipher alg\u003e\u005c\u0022, eg, \u0022\n+\t\t\t\t \u0022-e \u005c\u0022RS256\u005c\u0022\u005cn\u0022);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\t/* create JOSE header, also needed for output */\n+\n+\t\tif (lws_jws_alloc_element(\u0026jws.map, LJWS_JOSE,\n+\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len, strlen(p) + 10, 0)) {\n+\t\t\tlwsl_err(\u0022%s: temp space too small\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tjws.map.len[LJWS_JOSE] \u003d (uint32_t)\n+\t\t\t\tlws_snprintf((char *)jws.map.buf[LJWS_JOSE],\n+\t\t\t\t\t (unsigned int)temp_len, \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022, p);\n+\t\tsign \u003d 1;\n+\t}\n+\n+\tin \u003d lws_concat_temp(temp, temp_len);\n+\tn \u003d (int)read(0, in, (unsigned int)temp_len);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022Problem reading from stdin\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\ttemp_len -\u003d n;\n+\n+\t/* grab the key */\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-k\u0022))) {\n+\t\tif (lws_jwk_load(\u0026jwk, p, NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: problem loading JWK %s\u005cn\u0022, __func__, p);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\t} else {\n+\t\tlwsl_err(\u0022-k \u003cjwk file\u003e is required\u005cn\u0022);\n+\n+\t\treturn 1;\n+\t}\n+\tif (sign) {\n+\n+\t\t/* add the plaintext from stdin to the map and a b64 version */\n+\n+\t\tjws.map.buf[LJWS_PYLD] \u003d in;\n+\t\tjws.map.len[LJWS_PYLD] \u003d (unsigned int)n;\n+\n+\t\tif (lws_jws_encode_b64_element(\u0026jws.map_b64, LJWS_PYLD,\n+\t\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t\t \u0026temp_len, jws.map.buf[LJWS_PYLD],\n+\t\t\t\t\t jws.map.len[LJWS_PYLD]))\n+\t\t\tgoto bail1;\n+\n+\t\t/* add the b64 JOSE header to the b64 map */\n+\n+\t\tif (lws_jws_encode_b64_element(\u0026jws.map_b64, LJWS_JOSE,\n+\t\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t\t \u0026temp_len, jws.map.buf[LJWS_JOSE],\n+\t\t\t\t\t jws.map.len[LJWS_JOSE]))\n+\t\t\tgoto bail1;\n+\n+\t\t/* prepare the space for the b64 signature in the map */\n+\n+\t\tif (lws_jws_alloc_element(\u0026jws.map_b64, LJWS_SIG,\n+\t\t\t\t lws_concat_temp(temp, temp_len),\n+\t\t\t\t \u0026temp_len, (unsigned int)lws_base64_size(\n+\t\t\t\t\t LWS_JWE_LIMIT_KEY_ELEMENT_BYTES), 0)) {\n+\t\t\tlwsl_err(\u0022%s: temp space too small\u005cn\u0022, __func__);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\n+\n+\t\t/* sign the plaintext */\n+\n+\t\tn \u003d lws_jws_sign_from_b64(\u0026jose, \u0026jws,\n+\t\t\t\t\t (char *)jws.map_b64.buf[LJWS_SIG],\n+\t\t\t\t\t jws.map_b64.len[LJWS_SIG]);\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: failed signing test packet\u005cn\u0022, __func__);\n+\t\t\tgoto bail1;\n+\t\t}\n+\t\t/* set the actual b64 signature size */\n+\t\tjws.map_b64.len[LJWS_SIG] \u003d (uint32_t)n;\n+\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-f\u0022))\n+\t\t\t/* create the flattened representation */\n+\t\t\tn \u003d lws_jws_write_flattened_json(\u0026jws, compact, sizeof(compact));\n+\t\telse\n+\t\t\t/* create the compact JWS representation */\n+\t\t\tn \u003d lws_jws_write_compact(\u0026jws, compact, sizeof(compact));\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_notice(\u0022%s: write_compact failed\u005cn\u0022, __func__);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\t/* dump the compact JWS representation on stdout */\n+\n+\t\tif (write(1, compact,\n+#if defined(WIN32)\n+\t\t\t\t(unsigned int)\n+#endif\n+\t\t\t\tstrlen(compact)) \u003c 0) {\n+\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t} else {\n+\t\t/* perform the verify directly on the compact representation */\n+\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-f\u0022)) {\n+\t\t\tif (lws_jws_sig_confirm_json(in, (unsigned int)n, \u0026jws, \u0026jwk, context,\n+\t\t\t\t\tlws_concat_temp(temp, temp_len),\n+\t\t\t\t\t\u0026temp_len) \u003c 0) {\n+\t\t\t\tlwsl_notice(\u0022%s: confirm rsa sig failed\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\tlwsl_hexdump_notice(jws.map.buf[LJWS_JOSE], jws.map.len[LJWS_JOSE]);\n+\t\t\t\tlwsl_hexdump_notice(jws.map.buf[LJWS_PYLD], jws.map.len[LJWS_PYLD]);\n+\t\t\t\tlwsl_hexdump_notice(jws.map.buf[LJWS_SIG], jws.map.len[LJWS_SIG]);\n+\n+\t\t\t\tlwsl_hexdump_notice(jws.map_b64.buf[LJWS_JOSE], jws.map_b64.len[LJWS_JOSE]);\n+\t\t\t\tlwsl_hexdump_notice(jws.map_b64.buf[LJWS_PYLD], jws.map_b64.len[LJWS_PYLD]);\n+\t\t\t\tlwsl_hexdump_notice(jws.map_b64.buf[LJWS_SIG], jws.map_b64.len[LJWS_SIG]);\n+\t\t\t\tgoto bail1;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tif (lws_jws_sig_confirm_compact_b64(in,\n+\t\t\t\t\tlws_concat_used(temp, (unsigned int)temp_len),\n+\t\t\t\t\t\u0026map, \u0026jwk, context,\n+\t\t\t\t\tlws_concat_temp(temp, temp_len),\n+\t\t\t\t\t\u0026temp_len) \u003c 0) {\n+\t\t\t\tlwsl_notice(\u0022%s: confirm rsa sig failed\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\tgoto bail1;\n+\t\t\t}\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022VALID\u005cn\u0022);\n+\n+\t\t/* dump the verifed plaintext and return 0 */\n+\n+\t\tif (write(1, jws.map.buf[LJWS_PYLD], jws.map.len[LJWS_PYLD]) \u003c 0) {\n+\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n+\t\t\tgoto bail1;\n+\t\t}\n+\t}\n+\n+\tresult \u003d 0;\n+\n+bail1:\n+\tlws_jws_destroy(\u0026jws);\n+\tlws_jwk_destroy(\u0026jwk);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-x509/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/CMakeLists.txt\nnew file mode 100644\nindex 0000000..74d7732\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-crypto-x509 C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-crypto-x509)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_JOSE 1 requirements)\n+\n+if (requirements)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-x509/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/README.md\nnew file mode 100644\nindex 0000000..b0d641e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/README.md\n@@ -0,0 +1,59 @@\n+# lws minimal example for X509\n+\n+The example shows how to:\n+\n+ - confirm one PEM cert or chain (-c) was signed by a trusted PEM cert (-t)\n+ - convert a certificate public key to JWK\n+ - convert a certificate public key and its private key PEM to a private JWK\n+\n+The examples work for EC and RSA certs and on mbedtls and OpenSSL the same.\n+\n+Notice the logging is on stderr, and only the JWK is output on stdout.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-c \u003cPEM certificate path\u003e|Required PEM Certificate(s) to operate on... may be multiple concatednated PEM\n+-t \u003cPEM certificate path\u003e|Single PEM trusted certificate\n+-p \u003cPEM private key path\u003e|Optional private key matching certificate given in -c. If given, only the private JWK is printed to stdout\n+\n+Example for confirming trust relationship. Notice the PEM in -c must contain not only\n+the final certificate but also the certificates for any intermediate CAs.\n+\n+```\n+ $ ./lws-crypto-x509 -c ec-cert.pem -t ca-cert.pem\n+[2019/01/02 20:31:13:2031] USER: LWS X509 api example\n+[2019/01/02 20:31:13:2032] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+[2019/01/02 20:31:13:2043] NOTICE: main: certs loaded OK\n+[2019/01/02 20:31:13:2043] NOTICE: main: verified OK \u003c\u003c\u003c\u003c\u003d\u003d\u003d\u003d\u003d\u003d\n+[2019/01/02 20:31:13:2045] NOTICE: Cert Public JWK\n+{\u0022crv\u0022:\u0022P-521\u0022,\u0022kty\u0022:\u0022EC\u0022,\u0022x\u0022:\u0022_uRNBbIbm0zhk8v6ujvQX9924264ZkqJhit0qamAoCegzuJbLf434kN7_aFEt6u-QWUu6-N1R8t6OlvrLo2jrNY\u0022,\u0022y\u0022:\u0022AU-29XpNyB7e5e3s5t0ylzGEnF601A8A7Tx8m8xxngARZX_bn22itGJ3Y57BTcclPMoG80KjWAMnRVtrKqrD_aGD\u0022}\n+\n+[2019/01/02 20:31:13:2045] NOTICE: main: OK\n+```\n+\n+Example creating JWKs for public and public + private cert + PEM keys:\n+\n+```\n+ $ ./lws-crypto-x509 -c ec-cert.pem -p ec-key.pem\n+[2019/01/02 20:14:43:4966] USER: LWS X509 api example\n+[2019/01/02 20:14:43:5225] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+[2019/01/02 20:14:43:5707] NOTICE: lws_x509_public_to_jwk: EC key\n+[2019/01/02 20:24:59:9514] USER: LWS X509 api example\n+[2019/01/02 20:24:59:9741] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+[2019/01/02 20:25:00:1261] NOTICE: lws_x509_public_to_jwk: key type 408 \u0022id-ecPublicKey\u0022\n+[2019/01/02 20:25:00:1269] NOTICE: lws_x509_public_to_jwk: EC key\n+[2019/01/02 20:25:00:2097] NOTICE: Cert + Key Private JWK\n+{\u0022crv\u0022:\u0022P-521\u0022,\u0022d\u0022:\u0022AU3iQSKfPskMTW4ZncrYLhipUYzLYty2XhemTQ_nSuUB1vB76jHmOYUTRXFBLkVCW8cQYyMa5dMa3Bvv-cdvH0IB\u0022,\u0022kty\u0022:\u0022EC\u0022,\u0022x\u0022:\u0022_uRNBbIbm0zhk8v6ujvQX9924264ZkqJhit0qamAoCegzuJbLf434kN7_aFEt6u-QWUu6-N1R8t6OlvrLo2jrNY\u0022,\u0022y\u0022:\u0022AU-29XpNyB7e5e3s5t0ylzGEnF601A8A7Tx8m8xxngARZX_bn22itGJ3Y57BTcclPMoG80KjWAMnRVtrKqrD_aGD\u0022}\n+\n+[2019/01/02 20:25:00:2207] NOTICE: main: OK\n+```\n+\ndiff --git a/minimal-examples-lowlevel/crypto/minimal-crypto-x509/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/main.c\nnew file mode 100644\nindex 0000000..7a3bc3b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/main.c\n@@ -0,0 +1,205 @@\n+/*\n+ * lws-crypto-x509\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003cfcntl.h\u003e\n+#include \u003cerrno.h\u003e\n+\n+static int\n+read_pem(const char *filename, char *pembuf, int pembuf_len)\n+{\n+\tint n, fd \u003d open(filename, LWS_O_RDONLY);\n+\tif (fd \u003d\u003d -1)\n+\t\treturn -1;\n+\n+\tn \u003d (int)read(fd, pembuf, (unsigned int)pembuf_len - 1);\n+\tclose(fd);\n+\n+\tpembuf[n++] \u003d '\u005c0';\n+\n+\treturn n;\n+}\n+\n+static int\n+read_pem_c509_cert(struct lws_x509_cert **x509, const char *filename,\n+\t\t char *pembuf, int pembuf_len)\n+{\n+\tint n;\n+\n+\tn \u003d read_pem(filename, pembuf, pembuf_len);\n+\tif (n \u003c 0)\n+\t\treturn -1;\n+\n+\tif (lws_x509_create(x509)) {\n+\t\tlwsl_err(\u0022%s: failed to create x509\u005cn\u0022, __func__);\n+\n+\t\treturn -1;\n+\t}\n+\n+\tif (lws_x509_parse_from_pem(*x509, pembuf, (unsigned int)n) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: unable to parse PEM %s\u005cn\u0022, __func__, filename);\n+\t\tlws_x509_destroy(x509);\n+\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n, result \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_x509_cert *x509 \u003d NULL, *x509_trusted \u003d NULL;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tstruct lws_jwk jwk;\n+\tchar pembuf[6144];\n+\tconst char *p;\n+\n+\tmemset(\u0026jwk, 0, sizeof(jwk));\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS X509 api example\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+#if defined(LWS_WITH_NETWORK)\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#endif\n+\tinfo.options \u003d 0;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\n+\tp \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022);\n+\tif (!p) {\n+\t\tlwsl_err(\u0022%s: missing -c \u003ccert pem file\u003e\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\tif (read_pem_c509_cert(\u0026x509, p, pembuf, sizeof(pembuf))) {\n+\t\tlwsl_err(\u0022%s: unable to read \u005c\u0022%s\u005c\u0022: errno %d\u005cn\u0022,\n+\t\t\t __func__, p, errno);\n+\t\tgoto bail;\n+\t}\n+\n+\tp \u003d lws_cmdline_option(argc, argv, \u0022-t\u0022);\n+\tif (p) {\n+\n+\t\tif (read_pem_c509_cert(\u0026x509_trusted, p, pembuf,\n+\t\t\t\t sizeof(pembuf))) {\n+\t\t\tlwsl_err(\u0022%s: unable to read \u005c\u0022%s\u005c\u0022: errno %d\u005cn\u0022,\n+\t\t\t\t __func__, p, errno);\n+\t\t\tgoto bail1;\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022%s: certs loaded OK\u005cn\u0022, __func__);\n+\n+\t\tif (lws_x509_verify(x509, x509_trusted, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: verify failed\u005cn\u0022, __func__);\n+\t\t\tgoto bail2;\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022%s: verified OK\u005cn\u0022, __func__);\n+\t}\n+\n+\tif (x509_trusted) {\n+\n+\t\t/* show the trusted cert public key as a JWK */\n+\n+\t\tif (lws_x509_public_to_jwk(\u0026jwk, x509_trusted,\n+\t\t\t\t\t \u0022P-256,P-384,P-521\u0022, 4096)) {\n+\t\t\tlwsl_err(\u0022%s: unable to get trusted cert pubkey as JWK\u005cn\u0022,\n+\t\t\t\t __func__);\n+\n+\t\t\tgoto bail2;\n+\t\t}\n+\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022)))\n+\t\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_ALG, p, (int)strlen(p));\n+\n+\t\tlwsl_info(\u0022JWK version of trusted cert:\u005cn\u0022);\n+\t\tlws_jwk_dump(\u0026jwk);\n+\t\tlws_jwk_destroy(\u0026jwk);\n+\t}\n+\n+\t/* get the cert public key as a JWK */\n+\n+\tif (lws_x509_public_to_jwk(\u0026jwk, x509, \u0022P-256,P-384,P-521\u0022, 4096)) {\n+\t\tlwsl_err(\u0022%s: unable to get cert pubkey as JWK\u005cn\u0022, __func__);\n+\n+\t\tgoto bail3;\n+\t}\n+\tlwsl_info(\u0022JWK version of cert:\u005cn\u0022);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022)))\n+\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_ALG, p, (int)strlen(p));\n+\n+\tlws_jwk_dump(\u0026jwk);\n+\t/* only print public if he doesn't provide private */\n+\tif (!lws_cmdline_option(argc, argv, \u0022-p\u0022)) {\n+\t\tlwsl_notice(\u0022Issuing Cert Public JWK on stdout\u005cn\u0022);\n+\t\tn \u003d sizeof(pembuf);\n+\t\tif (lws_jwk_export(\u0026jwk, 0, pembuf, \u0026n))\n+\t\t\tputs(pembuf);\n+\t}\n+\n+\t/* if we know where the cert private key is, add that to the cert JWK */\n+\n+\tp \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022);\n+\tif (p) {\n+\t\tn \u003d read_pem(p, pembuf, sizeof(pembuf));\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: unable read privkey %s\u005cn\u0022, __func__, p);\n+\n+\t\t\tgoto bail3;\n+\t\t}\n+\t\tif (lws_x509_jwk_privkey_pem(context, \u0026jwk, pembuf,\n+\t\t\t\t\t\t(unsigned int)n, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: unable to parse privkey %s\u005cn\u0022,\n+\t\t\t\t\t__func__, p);\n+\n+\t\t\tgoto bail3;\n+\t\t}\n+\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022)))\n+\t\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_ALG, p, (int)strlen(p));\n+\n+\t\tlwsl_info(\u0022JWK version of cert + privkey:\u005cn\u0022);\n+\t\tlws_jwk_dump(\u0026jwk);\n+\t\tlwsl_notice(\u0022Issuing Cert + Private JWK on stdout\u005cn\u0022);\n+\t\tn \u003d sizeof(pembuf);\n+\t\tif (lws_jwk_export(\u0026jwk, LWSJWKF_EXPORT_PRIVATE, pembuf, \u0026n))\n+\t\t\tputs(pembuf);\n+\t}\n+\n+\tresult \u003d 0;\n+\n+bail3:\n+\tlws_jwk_destroy(\u0026jwk);\n+bail2:\n+\tlws_x509_destroy(\u0026x509_trusted);\n+bail1:\n+\tlws_x509_destroy(\u0026x509);\n+bail:\n+\tlws_context_destroy(context);\n+\n+\tif (result)\n+\t\tlwsl_err(\u0022%s: failed\u005cn\u0022, __func__);\n+\telse\n+\t\tlwsl_notice(\u0022%s: OK\u005cn\u0022, __func__);\n+\n+\treturn result;\n+}\ndiff --git a/minimal-examples-lowlevel/dbus-client/README.md b/minimal-examples-lowlevel/dbus-client/README.md\nnew file mode 100644\nindex 0000000..ecde9d1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-client/README.md\n@@ -0,0 +1,4 @@\n+|Example|Demonstrates|\n+---|---\n+minimal-dbus-client|Shows how to connect to a DBusServer dbus server like minimal-dbus-server\n+minimal-dbus-ws-proxy-testclient|A test client for use with minimal-dbus-ws-proxy\ndiff --git a/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/CMakeLists.txt b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/CMakeLists.txt\nnew file mode 100644\nindex 0000000..6496e17\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/CMakeLists.txt\n@@ -0,0 +1,36 @@\n+project(lws-minimal-dbus-client C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(CheckLibraryExists)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-dbus-client)\n+set(SRCS minimal-dbus-client.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_DBUS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (NOT MSVC AND NOT WIN32 AND requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (NOT LWS_PLAT_FREERTOS)\n+\t\tfind_package(PkgConfig QUIET)\n+\t\tpkg_check_modules(PC_DBUS1 dbus-1 QUIET)\n+\t\tlist(APPEND LWS_DBUS_INCLUDE1 ${PC_DBUS1_INCLUDE_DIRS})\n+\t\tlist(APPEND LWS_DBUS_LIB \u0022${PC_DBUS1_LIBRARIES};dl\u0022)\n+\tendif()\n+\n+\tif (LWS_DBUS_INCLUDE1)\n+\t\tinclude_directories(\u0022${LWS_DBUS_INCLUDE1}\u0022)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared ${LWS_DBUS_LIB})\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LWS_DBUS_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/README.md b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/README.md\nnew file mode 100644\nindex 0000000..42563c6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/README.md\n@@ -0,0 +1,49 @@\n+# lws minimal dbus client\n+\n+This demonstrates nonblocking, asynchronous dbus method calls as the client.\n+\n+## build\n+\n+Using libdbus requires additional non-default include paths setting, same as\n+is necessary for lws build described in ./lib/roles/dbus/README.md\n+\n+CMake can guess one path and the library name usually, see the README above\n+for details of how to override for custom libdbus and cross build.\n+\n+Fedora example:\n+```\n+$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib64/dbus-1.0/include\u0022\n+$ make\n+```\n+\n+Ubuntu example:\n+```\n+$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib/x86_64-linux-gnu/dbus-1.0/include\u0022\n+$ make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+The minimal client connects to the minimal dbus server example, which is\n+expected to be listening on its default abstract unix domain socket path.\n+\n+It call the server Echo method with \u0022Hello!\u0022 and returns to the event loop.\n+When the reply comes, it prints the returned message.\n+\n+Afterwards it just sits there receiving unsolicited messages from the server\n+example, until closed by the user.\n+\n+```\n+ $ ./lws-minimal-dbus-client\n+ctx\n+[2018/10/05 06:08:31:4901] NOTICE: pending_call_notify\n+[2018/10/05 06:08:31:4929] USER: pending_call_notify: received 'Hello!'\n+^C[2018/10/05 06:09:22:4409] NOTICE: destroy_dbus_client_conn\n+[2018/10/05 06:09:22:4691] NOTICE: Exiting cleanly\n+...\n+```\n+\ndiff --git a/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/minimal-dbus-client.c b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/minimal-dbus-client.c\nnew file mode 100644\nindex 0000000..43b48a1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/minimal-dbus-client.c\n@@ -0,0 +1,281 @@\n+/*\n+ * lws-minimal-dbus-client\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal session dbus server that uses the lws event loop,\n+ * making it possible to integrate it with other lws features.\n+ */\n+\n+#include \u003cstdbool.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdio.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003cunistd.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003clibwebsockets/lws-dbus.h\u003e\n+\n+static struct lws_dbus_ctx *dbus_ctx;\n+static struct lws_context *context;\n+static int interrupted;\n+\n+#define THIS_INTERFACE\t \u0022org.libwebsockets.test\u0022\n+#define THIS_OBJECT\t \u0022/org/libwebsockets/test\u0022\n+#define THIS_BUSNAME\t \u0022org.libwebsockets.test\u0022\n+\n+#define THIS_LISTEN_PATH \u0022unix:abstract\u003dorg.libwebsockets.test\u0022\n+\n+\n+static DBusHandlerResult\n+client_message_handler(DBusConnection *conn, DBusMessage *message, void *data)\n+{\n+\tconst char *str;\n+\n+\tlwsl_info(\u0022%s: Got D-Bus request: %s.%s on %s\u005cn\u0022, __func__,\n+\t\t dbus_message_get_interface(message),\n+\t\t dbus_message_get_member(message),\n+\t\t dbus_message_get_path(message));\n+\n+\tif (!dbus_message_get_args(message, NULL,\n+\t\t\t\t DBUS_TYPE_STRING, \u0026str,\n+\t\t\t\t DBUS_TYPE_INVALID))\n+\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+\n+\tlwsl_notice(\u0022%s: '%s'\u005cn\u0022, __func__, str);\n+\n+\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+}\n+\n+static void\n+destroy_dbus_client_conn(struct lws_dbus_ctx *ctx)\n+{\n+\tif (!ctx || !ctx-\u003econn)\n+\t\treturn;\n+\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\n+\tdbus_connection_remove_filter(ctx-\u003econn, client_message_handler, ctx);\n+\tdbus_connection_close(ctx-\u003econn);\n+\tdbus_connection_unref(ctx-\u003econn);\n+\n+\tfree(ctx);\n+}\n+\n+/*\n+ * This callback is coming when lws has noticed the fd took a POLLHUP. The\n+ * ctx has effectively gone out of scope before this, and the connection can\n+ * be cleaned up and the ctx freed.\n+ */\n+\n+static void\n+cb_closing(struct lws_dbus_ctx *ctx)\n+{\n+\tlwsl_err(\u0022%s: closing\u005cn\u0022, __func__);\n+\n+\tif (ctx \u003d\u003d dbus_ctx)\n+\t\tdbus_ctx \u003d NULL;\n+\n+\tdestroy_dbus_client_conn(ctx);\n+}\n+\n+static struct lws_dbus_ctx *\n+create_dbus_client_conn(struct lws_vhost *vh, int tsi, const char *ads)\n+{\n+\tstruct lws_dbus_ctx *ctx;\n+\tDBusError err;\n+\n+\tctx \u003d malloc(sizeof(*ctx));\n+\tif (!ctx)\n+\t\treturn NULL;\n+\n+\tmemset(ctx, 0, sizeof(*ctx));\n+\n+\tctx-\u003evh \u003d vh;\n+\tctx-\u003etsi \u003d tsi;\n+\n+ dbus_error_init(\u0026err);\n+\n+\t/* connect to the daemon bus */\n+\tctx-\u003econn \u003d dbus_connection_open_private(ads, \u0026err);\n+\tif (!ctx-\u003econn) {\n+\t\tlwsl_err(\u0022%s: Failed to connect: %s\u005cn\u0022,\n+\t\t\t __func__, err.message);\n+\t\tgoto fail;\n+\t}\n+\n+\tdbus_connection_set_exit_on_disconnect(ctx-\u003econn, 0);\n+\n+\tif (!dbus_connection_add_filter(ctx-\u003econn, client_message_handler,\n+\t\t\t\t\tctx, NULL)) {\n+\t\tlwsl_err(\u0022%s: Failed to add filter\u005cn\u0022, __func__);\n+\t\tgoto fail;\n+\t}\n+\n+\t/*\n+\t * This is the part that binds the connection to lws watcher and\n+\t * timeout handling provided by lws\n+\t */\n+\n+\tif (lws_dbus_connection_setup(ctx, ctx-\u003econn, cb_closing)) {\n+\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n+\t\tgoto fail;\n+\t}\n+\n+\tlwsl_notice(\u0022%s: created OK\u005cn\u0022, __func__);\n+\n+\treturn ctx;\n+\n+fail:\n+\tdbus_error_free(\u0026err);\n+\n+\tfree(ctx);\n+\n+\treturn NULL;\n+}\n+\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+/*\n+ * This gets called if we timed out waiting for the server reply, or the\n+ * reply arrived.\n+ */\n+\n+static void\n+pending_call_notify(DBusPendingCall *pending, void *data)\n+{\n+\t// struct lws_dbus_ctx *ctx \u003d (struct lws_dbus_ctx *)data;\n+\tconst char *payload;\n+\tDBusMessage *msg;\n+\n+\tif (!dbus_pending_call_get_completed(pending)) {\n+\t\tlwsl_err(\u0022%s: timed out waiting for reply\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tmsg \u003d dbus_pending_call_steal_reply(pending);\n+\tif (!msg)\n+\t\tgoto bail;\n+\n+\tif (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, \u0026payload,\n+\t\t\t\t DBUS_TYPE_INVALID)) {\n+\t\tgoto bail1;\n+\t}\n+\n+\tlwsl_user(\u0022%s: received '%s'\u005cn\u0022, __func__, payload);\n+\n+bail1:\n+\tdbus_message_unref(msg);\n+bail:\n+\tdbus_pending_call_unref(pending);\n+}\n+\n+static int\n+remote_method_call(struct lws_dbus_ctx *ctx)\n+{\n+\tDBusMessage *msg;\n+\tconst char *payload \u003d \u0022Hello!\u0022;\n+\tint ret \u003d 1;\n+\n+\tmsg \u003d dbus_message_new_method_call(\n+\t\t\t/* dest */\t THIS_BUSNAME,\n+\t\t\t/* object-path */ THIS_OBJECT,\n+\t\t\t/* interface */ THIS_INTERFACE,\n+\t\t\t/* method */\t \u0022Echo\u0022);\n+\tif (!msg)\n+\t\treturn 1;\n+\n+\tif (!dbus_message_append_args(msg, DBUS_TYPE_STRING, \u0026payload,\n+\t\t\t\t DBUS_TYPE_INVALID))\n+\t\tgoto bail;\n+\n+\tif (!dbus_connection_send_with_reply(ctx-\u003econn, msg,\n+\t\t\t\t\t \u0026ctx-\u003epc,\n+\t\t\t\t\t DBUS_TIMEOUT_USE_DEFAULT)) {\n+\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tdbus_pending_call_set_notify(ctx-\u003epc, pending_call_notify, ctx, NULL);\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tdbus_message_unref(msg);\n+\n+\treturn ret;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_vhost *vh;\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */ /* | LLL_THREAD */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal DBUS client\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tvh \u003d lws_create_vhost(context, \u0026info);\n+\tif (!vh)\n+\t\tgoto bail;\n+\n+\tdbus_ctx \u003d create_dbus_client_conn(vh, 0, THIS_LISTEN_PATH);\n+\tif (!dbus_ctx)\n+\t\tgoto bail1;\n+\n+\tif (remote_method_call(dbus_ctx))\n+\t\tgoto bail2;\n+\n+\t/* lws event loop (default poll one) */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail2:\n+\tdestroy_dbus_client_conn(dbus_ctx);\n+\n+bail1:\n+\t/* this is required for valgrind-cleanliness */\n+\tdbus_shutdown();\n+\tlws_context_destroy(context);\n+\n+\tlwsl_notice(\u0022Exiting cleanly\u005cn\u0022);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_err(\u0022%s: failed to start\u005cn\u0022, __func__);\n+\tlws_context_destroy(context);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5c69398\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt\n@@ -0,0 +1,33 @@\n+project(lws-minimal-dbus-ws-proxy-testclient C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(CheckLibraryExists)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_DBUS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (NOT MSVC AND NOT WIN32 AND requirements)\n+\tadd_executable(${PROJECT_NAME} minimal-dbus-ws-proxy-testclient.c)\n+\n+\tif (NOT LWS_PLAT_FREERTOS)\n+\t\tfind_package(PkgConfig QUIET)\n+\t\tpkg_check_modules(PC_DBUS1 dbus-1 QUIET)\n+\t\tlist(APPEND LWS_DBUS_INCLUDE1 ${PC_DBUS1_INCLUDE_DIRS})\n+\t\tlist(APPEND LWS_DBUS_LIB \u0022${PC_DBUS1_LIBRARIES};dl\u0022)\n+\tendif()\n+\n+\tif (LWS_DBUS_INCLUDE1)\n+\t\tinclude_directories(\u0022${LWS_DBUS_INCLUDE1}\u0022)\n+\tendif()\n+\tmessage(\u0022project ${PROJECT_NAME}\u0022)\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared ${LWS_DBUS_LIB})\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LWS_DBUS_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/README.md b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/README.md\nnew file mode 100644\nindex 0000000..d583462\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/README.md\n@@ -0,0 +1,52 @@\n+# lws minimal dbus ws proxy testclient\n+\n+This is a test client used to test `./minimal-examples/dbus-server/minimal-dbus-ws-proxy`\n+\n+It asks the minimal dbus ws proxy application to connect to libwebsockets.org\n+over the mirror protocol. And it proxies back the ASCII packets used to\n+communicate the mirror sample drawing vectors over dbus to this test client\n+if you draw on the [mirror example app](https://libwebsockets.org/testserver/)\n+in a browser.\n+\n+## build\n+\n+Using libdbus requires additional non-default include paths setting, same as\n+is necessary for lws build described in ./lib/roles/dbus/README.md\n+\n+CMake can guess one path and the library name usually, see the README above\n+for details of how to override for custom libdbus and cross build.\n+\n+Fedora example:\n+```\n+$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib64/dbus-1.0/include\u0022\n+$ make\n+```\n+\n+Ubuntu example:\n+```\n+$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib/x86_64-linux-gnu/dbus-1.0/include\u0022\n+$ make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+This connects to the minimal-dbus-ws-proxy example running in another terminal.\n+\n+```\n+ $ ./lws-minimal-dbus-ws-proxy-testclient\n+[2018/10/05 14:17:16:6286] USER: LWS minimal DBUS ws proxy testclient\n+[2018/10/05 14:17:16:6538] NOTICE: Creating Vhost 'default' port 0, 1 protocols, IPv6 off\n+[2018/10/05 14:17:16:6617] USER: create_dbus_client_conn: connecting to 'unix:abstract\u003dorg.libwebsockets.wsclientproxy'\n+[2018/10/05 14:17:16:7189] NOTICE: create_dbus_client_conn: created OK\n+[2018/10/05 14:17:16:7429] USER: remote_method_call: requesting proxy connection wss://libwebsockets.org/ lws-mirror-protocol\n+[2018/10/05 14:17:17:0387] USER: pending_call_notify: received 'Connecting'\n+[2018/10/05 14:17:18:7475] NOTICE: client_message_handler: (type 7) 'ws client connection established'\n+[2018/10/05 14:17:21:2028] NOTICE: client_message_handler: (type 6) 'd #000000 323 63 323 67;'\n+[2018/10/05 14:17:21:2197] NOTICE: client_message_handler: (type 6) 'd #000000 323 67 327 73;'\n+...\n+```\n+\ndiff --git a/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c\nnew file mode 100644\nindex 0000000..c3d92ee\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c\n@@ -0,0 +1,436 @@\n+/*\n+ * lws-minimal-dbus-ws-proxy-testclient\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This acts as a test client over DBUS, opening a session with\n+ * minimal-dbus-ws-proxy and sending and receiving data on the libwebsockets\n+ * mirror demo page.\n+ */\n+\n+#include \u003cstdbool.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdio.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003cunistd.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003clibwebsockets/lws-dbus.h\u003e\n+\n+/*\n+ * These are the various states our connection can be in, both with regards\n+ * to the direct connection to the proxy, and the state of the onward ws\n+ * connection the proxy opens at our request.\n+ */\n+\n+enum lws_dbus_client_state {\n+\tLDCS_NOTHING,\t\t /* no connection yet */\n+\tLDCS_CONN,\t\t /* conn to proxy */\n+\tLDCS_CONN_WAITING_ONWARD, /* conn to proxy, awaiting proxied conn */\n+\tLDCS_CONN_ONWARD,\t /* conn to proxy and onward conn OK */\n+\tLDCS_CONN_CLOSED,\t /* conn to proxy but onward conn closed */\n+\tLDCS_CLOSED,\t\t /* connection to proxy is closed */\n+};\n+\n+/*\n+ * our expanded dbus context\n+ */\n+\n+struct lws_dbus_ctx_wsproxy_client {\n+\tstruct lws_dbus_ctx ctx;\n+\n+\tlws_sorted_usec_list_t sul;\n+\n+\tenum lws_dbus_client_state state;\n+};\n+\n+static struct lws_dbus_ctx_wsproxy_client *dbus_ctx;\n+static struct lws_context *context;\n+static int interrupted, autoexit_budget \u003d -1, count_rx, count_tx;\n+\n+#define THIS_INTERFACE\t \u0022org.libwebsockets.wsclientproxy\u0022\n+#define THIS_OBJECT\t \u0022/org/libwebsockets/wsclientproxy\u0022\n+#define THIS_BUSNAME\t \u0022org.libwebsockets.wsclientproxy\u0022\n+\n+#define THIS_LISTEN_PATH \u0022unix:abstract\u003dorg.libwebsockets.wsclientproxy\u0022\n+\n+static void\n+state_transition(struct lws_dbus_ctx_wsproxy_client *dcwc,\n+\t\t enum lws_dbus_client_state state)\n+{\n+\tlwsl_notice(\u0022%s: %p: from state %d -\u003e %d\u005cn\u0022, __func__,\n+\t\t dcwc,dcwc-\u003estate, state);\n+\tdcwc-\u003estate \u003d state;\n+}\n+\n+static DBusHandlerResult\n+filter(DBusConnection *conn, DBusMessage *message, void *data)\n+{\n+\tstruct lws_dbus_ctx_wsproxy_client *dcwc \u003d\n+\t\t\t(struct lws_dbus_ctx_wsproxy_client *)data;\n+\tconst char *str;\n+\n+\tif (!dbus_message_get_args(message, NULL,\n+\t\t\t\t DBUS_TYPE_STRING, \u0026str,\n+\t\t\t\t DBUS_TYPE_INVALID))\n+\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+\n+\t/* received ws data */\n+\n+\tif (dbus_message_is_signal(message, THIS_INTERFACE, \u0022Receive\u0022)) {\n+\t\tlwsl_user(\u0022%s: Received '%s'\u005cn\u0022, __func__, str);\n+\t\tcount_rx++;\n+\t}\n+\n+\t/* proxy ws connection failed */\n+\n+\tif (dbus_message_is_signal(message, THIS_INTERFACE, \u0022Status\u0022) \u0026\u0026\n+\t !strcmp(str, \u0022ws client connection error\u0022))\n+\t\tstate_transition(dcwc, LDCS_CONN_CLOSED);\n+\n+\t/* proxy ws connection succeeded */\n+\n+\tif (dbus_message_is_signal(message, THIS_INTERFACE, \u0022Status\u0022) \u0026\u0026\n+\t !strcmp(str, \u0022ws client connection established\u0022))\n+\t\tstate_transition(dcwc, LDCS_CONN_ONWARD);\n+\n+\t/* proxy ws connection has closed */\n+\n+\tif (dbus_message_is_signal(message, THIS_INTERFACE, \u0022Status\u0022) \u0026\u0026\n+\t !strcmp(str, \u0022ws client connection closed\u0022))\n+\t\tstate_transition(dcwc, LDCS_CONN_CLOSED);\n+\n+\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+}\n+\n+static void\n+destroy_dbus_client_conn(struct lws_dbus_ctx_wsproxy_client **pdcwc)\n+{\n+\tstruct lws_dbus_ctx_wsproxy_client *dcwc \u003d *pdcwc;\n+\n+\tif (!dcwc || !dcwc-\u003ectx.conn)\n+\t\treturn;\n+\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\n+\tdbus_connection_remove_filter(dcwc-\u003ectx.conn, filter, \u0026dcwc-\u003ectx);\n+\tdbus_connection_close(dcwc-\u003ectx.conn);\n+\tdbus_connection_unref(dcwc-\u003ectx.conn);\n+\n+\tfree(dcwc);\n+\n+\t*pdcwc \u003d NULL;\n+}\n+\n+/*\n+ * This callback is coming when lws has noticed the fd took a POLLHUP. The\n+ * ctx has effectively gone out of scope before this, and the connection can\n+ * be cleaned up and the ctx freed.\n+ */\n+\n+static void\n+cb_closing(struct lws_dbus_ctx *ctx)\n+{\n+\tstruct lws_dbus_ctx_wsproxy_client *dcwc \u003d\n+\t\t\t(struct lws_dbus_ctx_wsproxy_client *)ctx;\n+\n+\tlwsl_err(\u0022%s: closing\u005cn\u0022, __func__);\n+\n+\tif (dcwc \u003d\u003d dbus_ctx)\n+\t\tdbus_ctx \u003d NULL;\n+\n+\tdestroy_dbus_client_conn(\u0026dcwc);\n+\n+\tinterrupted \u003d 1;\n+}\n+\n+static struct lws_dbus_ctx_wsproxy_client *\n+create_dbus_client_conn(struct lws_vhost *vh, int tsi, const char *ads)\n+{\n+\tstruct lws_dbus_ctx_wsproxy_client *dcwc;\n+\tDBusError e;\n+\n+\tdcwc \u003d malloc(sizeof(*dcwc));\n+\tif (!dcwc)\n+\t\treturn NULL;\n+\n+\tmemset(dcwc, 0, sizeof(*dcwc));\n+\n+\tdcwc-\u003estate \u003d LDCS_NOTHING;\n+\tdcwc-\u003ectx.vh \u003d vh;\n+\tdcwc-\u003ectx.tsi \u003d tsi;\n+\n+ dbus_error_init(\u0026e);\n+\n+ lwsl_user(\u0022%s: connecting to '%s'\u005cn\u0022, __func__, ads);\n+#if 1\n+\t/* connect to our daemon bus */\n+\n+ dcwc-\u003ectx.conn \u003d dbus_connection_open_private(ads, \u0026e);\n+\tif (!dcwc-\u003ectx.conn) {\n+\t\tlwsl_err(\u0022%s: Failed to connect: %s\u005cn\u0022,\n+\t\t\t __func__, e.message);\n+\t\tgoto fail;\n+\t}\n+#else\n+\t/* connect to the SYSTEM bus */\n+\n+\tdcwc-\u003ectx.conn \u003d dbus_bus_get(DBUS_BUS_SYSTEM, \u0026e);\n+\tif (!dcwc-\u003ectx.conn) {\n+\t\tlwsl_err(\u0022%s: Failed to get a session DBus connection: %s\u005cn\u0022,\n+\t\t\t __func__, e.message);\n+\t\tgoto fail;\n+\t}\n+#endif\n+\tdbus_connection_set_exit_on_disconnect(dcwc-\u003ectx.conn, 0);\n+\n+\tif (!dbus_connection_add_filter(dcwc-\u003ectx.conn, filter,\n+\t\t\t\t\t\u0026dcwc-\u003ectx, NULL)) {\n+\t\tlwsl_err(\u0022%s: Failed to add filter\u005cn\u0022, __func__);\n+\t\tgoto fail;\n+\t}\n+\n+\t/*\n+\t * This is the part that binds the connection to lws watcher and\n+\t * timeout handling provided by lws\n+\t */\n+\n+\tif (lws_dbus_connection_setup(\u0026dcwc-\u003ectx, dcwc-\u003ectx.conn, cb_closing)) {\n+\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n+\t\tgoto fail;\n+\t}\n+\n+\tstate_transition(dcwc, LDCS_CONN);\n+\n+\tlwsl_notice(\u0022%s: created OK\u005cn\u0022, __func__);\n+\n+\treturn dcwc;\n+\n+fail:\n+\tdbus_error_free(\u0026e);\n+\n+\tfree(dcwc);\n+\n+\treturn NULL;\n+}\n+\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+/*\n+ * This gets called if we timed out waiting for the dbus server reply, or the\n+ * reply arrived.\n+ */\n+\n+static void\n+pending_call_notify(DBusPendingCall *pending, void *data)\n+{\n+\tconst char *payload;\n+\tDBusMessage *msg;\n+\n+\tif (!dbus_pending_call_get_completed(pending)) {\n+\t\tlwsl_err(\u0022%s: timed out waiting for reply\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tmsg \u003d dbus_pending_call_steal_reply(pending);\n+\tif (!msg)\n+\t\tgoto bail;\n+\n+\tif (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, \u0026payload,\n+\t\t\t\t\t DBUS_TYPE_INVALID)) {\n+\t\tgoto bail1;\n+\t}\n+\n+\tlwsl_user(\u0022%s: received '%s'\u005cn\u0022, __func__, payload);\n+\n+bail1:\n+\tdbus_message_unref(msg);\n+bail:\n+\tdbus_pending_call_unref(pending);\n+}\n+\n+static int\n+remote_method_call(struct lws_dbus_ctx_wsproxy_client *dcwc)\n+{\n+\tchar _uri[96];\n+\tconst char *subprotocol \u003d \u0022lws-mirror-protocol\u0022, *uri \u003d _uri;\n+\tDBusMessage *msg;\n+\tint ret \u003d 1;\n+\n+\t/*\n+\t * make our own private mirror session... because others may run this\n+\t * at the same time against libwebsockets.org... as happened 2019-03-14\n+\t * and broke travis tests :-)\n+\t */\n+\n+\tlws_snprintf(_uri, sizeof(_uri), \u0022wss://libwebsockets.org/?mirror\u003ddbt-%d\u0022,\n+\t\t\t(int)getpid());\n+\n+\tmsg \u003d dbus_message_new_method_call(\n+\t\t\t/* dest */\t THIS_BUSNAME,\n+\t\t\t/* object-path */ THIS_OBJECT,\n+\t\t\t/* interface */ THIS_INTERFACE,\n+\t\t\t/* method */\t \u0022Connect\u0022);\n+\tif (!msg)\n+\t\treturn 1;\n+\n+\tif (!dbus_message_append_args(msg, DBUS_TYPE_STRING, \u0026uri,\n+\t\t\t\t\t DBUS_TYPE_STRING, \u0026subprotocol,\n+\t\t\t\t\t DBUS_TYPE_INVALID))\n+\t\tgoto bail;\n+\n+\tlwsl_user(\u0022%s: requesting proxy connection %s %s\u005cn\u0022, __func__,\n+\t\t\turi, subprotocol);\n+\n+\tif (!dbus_connection_send_with_reply(dcwc-\u003ectx.conn, msg, \u0026dcwc-\u003ectx.pc,\n+\t\t\t\t\t DBUS_TIMEOUT_USE_DEFAULT)) {\n+\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\tdbus_pending_call_set_notify(dcwc-\u003ectx.pc, pending_call_notify,\n+\t\t\t\t \u0026dcwc-\u003ectx, NULL);\n+\n+\tstate_transition(dcwc, LDCS_CONN_WAITING_ONWARD);\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tdbus_message_unref(msg);\n+\n+\treturn ret;\n+}\n+\n+static void\n+sul_timer(struct lws_sorted_usec_list *sul)\n+{\n+\tchar payload[64];\n+\tconst char *ws_pkt \u003d payload;\n+\tDBusMessage *msg;\n+\n+\tif (!dbus_ctx || dbus_ctx-\u003estate !\u003d LDCS_CONN_ONWARD)\n+\t\tgoto again;\n+\n+\tif (autoexit_budget \u003e 0) {\n+\t\tif (!--autoexit_budget) {\n+\t\t\tlwsl_notice(\u0022reached autoexit budget\u005cn\u0022);\n+\t\t\tinterrupted \u003d 1;\n+\t\t\treturn;\n+\t\t}\n+\t}\n+\n+\tmsg \u003d dbus_message_new_method_call(THIS_BUSNAME, THIS_OBJECT,\n+\t\t\t\t\t THIS_INTERFACE, \u0022Send\u0022);\n+\tif (!msg)\n+\t\tgoto again;\n+\n+\tlws_snprintf(payload, sizeof(payload), \u0022d #%06X %d %d %d %d;\u0022,\n+\t\t rand() \u0026 0xffffff, rand() % 480, rand() % 300,\n+\t\t rand() % 480, rand() % 300);\n+\n+\tif (!dbus_message_append_args(msg, DBUS_TYPE_STRING, \u0026ws_pkt,\n+\t\t\t\t\t DBUS_TYPE_INVALID)) {\n+\t\tdbus_message_unref(msg);\n+\t\tgoto again;\n+\t}\n+\n+\tif (!dbus_connection_send_with_reply(dbus_ctx-\u003ectx.conn, msg,\n+\t\t\t\t\t \u0026dbus_ctx-\u003ectx.pc,\n+\t\t\t\t\t DBUS_TIMEOUT_USE_DEFAULT)) {\n+\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n+\t\tdbus_message_unref(msg);\n+\t\tgoto again;\n+\t}\n+\n+\tdbus_message_unref(msg);\n+\tdbus_pending_call_set_notify(dbus_ctx-\u003ectx.pc,\n+\t\t\t\t pending_call_notify,\n+\t\t\t\t \u0026dbus_ctx-\u003ectx, NULL);\n+\tcount_tx++;\n+\n+again:\n+\tlws_sul_schedule(context, 0, \u0026dbus_ctx-\u003esul, sul_timer, 2 * LWS_US_PER_SEC);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_vhost *vh;\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */ /* | LLL_THREAD */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-x\u0022)))\n+\t\tautoexit_budget \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal DBUS ws proxy testclient\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.options |\u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tvh \u003d lws_create_vhost(context, \u0026info);\n+\tif (!vh)\n+\t\tgoto bail;\n+\n+\tdbus_ctx \u003d create_dbus_client_conn(vh, 0, THIS_LISTEN_PATH);\n+\tif (!dbus_ctx)\n+\t\tgoto bail1;\n+\n+\tlws_sul_schedule(context, 0, \u0026dbus_ctx-\u003esul, sul_timer, LWS_US_PER_SEC);\n+\n+\n+\tif (remote_method_call(dbus_ctx))\n+\t\tgoto bail2;\n+\n+\t/* lws event loop (default poll one) */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail2:\n+\tdestroy_dbus_client_conn(\u0026dbus_ctx);\n+\n+bail1:\n+\t/* this is required for valgrind-cleanliness */\n+\tdbus_shutdown();\n+\tlws_context_destroy(context);\n+\n+\tlwsl_notice(\u0022Exiting cleanly, rx: %d, tx: %d\u005cn\u0022, count_rx, count_tx);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_err(\u0022%s: failed to start\u005cn\u0022, __func__);\n+\tlws_context_destroy(context);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/dbus-server/README.md b/minimal-examples-lowlevel/dbus-server/README.md\nnew file mode 100644\nindex 0000000..fc59bfb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/README.md\n@@ -0,0 +1,4 @@\n+|Example|Demonstrates|\n+---|---\n+minimal-dbus-server|Shows how to run a DBUS session server using lws event loop\n+minimal-dbus-ws-proxy|Control ws client connections via DBUS\ndiff --git a/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/CMakeLists.txt b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/CMakeLists.txt\nnew file mode 100644\nindex 0000000..0c0b7cf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/CMakeLists.txt\n@@ -0,0 +1,36 @@\n+project(lws-minimal-dbus-server C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(CheckLibraryExists)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-dbus-server)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_DBUS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (NOT MSVC AND NOT WIN32 AND requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (NOT LWS_PLAT_FREERTOS)\n+\t\tfind_package(PkgConfig QUIET)\n+\t\tpkg_check_modules(PC_DBUS1 dbus-1 QUIET)\n+\t\tlist(APPEND LWS_DBUS_INCLUDE1 ${PC_DBUS1_INCLUDE_DIRS})\n+\t\tlist(APPEND LWS_DBUS_LIB \u0022${PC_DBUS1_LIBRARIES};dl\u0022)\n+\tendif()\n+\n+\tif (LWS_DBUS_INCLUDE1)\n+\t\tinclude_directories(\u0022${LWS_DBUS_INCLUDE1}\u0022)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared ${LWS_DBUS_LIB})\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LWS_DBUS_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/README.md b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/README.md\nnew file mode 100644\nindex 0000000..7b61eb1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/README.md\n@@ -0,0 +1,96 @@\n+# lws minimal dbus server\n+\n+## build\n+\n+Using libdbus requires additional non-default include paths setting, same as\n+is necessary for lws build described in ./lib/roles/dbus/README.md\n+\n+CMake can guess one path and the library name usually, see the README above\n+for details of how to override for custom libdbus and cross build.\n+\n+Fedora example:\n+```\n+$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib64/dbus-1.0/include\u0022\n+$ make\n+```\n+\n+Ubuntu example:\n+```\n+$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib/x86_64-linux-gnu/dbus-1.0/include\u0022\n+$ make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+--session | Bind to session bus instead of creating private abstract unix socket\n+\n+By default the minimal server listens using its own abstract unix socket\n+at `unix:abstract\u003dorg.libwebsockets.test`.\n+\n+You can also run it instead as a participant on the session bus, without its own\n+unix socket, by giving `--session`.\n+\n+### Examples using the default private abstract unix socket\n+\n+```\n+ $ ./lws-minimal-dbus-server\n+[2018/10/03 07:08:02:6448] USER: LWS minimal dbus server\n+[2018/10/03 07:08:02:6693] NOTICE: Creating Vhost 'default' port 0, 1 protocols, IPv6 off\n+...\n+```\n+\n+You can communicate with the dbus server over its private abstract socket using, eg\n+\n+```\n+$ gdbus introspect --address unix:abstract\u003dorg.libwebsockets.test --dest org.libwebsockets.test --object-path /org/libwebsockets/test\n+node /org/example/TestObject {\n+ interface org.freedesktop.DBus.Introspectable {\n+ methods:\n+ Introspect(out s data);\n+ signals:\n+ properties:\n+ };\n+ interface org.freedesktop.DBus.Properties {\n+ methods:\n+ Get(in s interface,\n+...\n+```\n+\n+```\n+$ gdbus call --address unix:abstract\u003dorg.libwebsockets.test --dest org.libwebsockets.test --object-path /org/libwebsockets/test --method org.libwebsockets.test.Echo HELLO\n+('HELLO',)\n+```\n+\n+### Examples using the DBUS session bus\n+\n+```\n+ $ ./lws-minimal-dbus-server --session\n+[2018/10/03 07:08:02:6448] USER: LWS minimal dbus server\n+[2018/10/03 07:08:02:6693] NOTICE: Creating Vhost 'default' port 0, 1 protocols, IPv6 off\n+...\n+```\n+\n+You can communicate with the dbus server over the session bus using, eg\n+\n+```\n+$ gdbus introspect --session --dest org.libwebsockets.test --object-path /org/libwebsockets/test\n+node /org/example/TestObject {\n+ interface org.freedesktop.DBus.Introspectable {\n+ methods:\n+ Introspect(out s data);\n+ signals:\n+ properties:\n+ };\n+ interface org.freedesktop.DBus.Properties {\n+ methods:\n+ Get(in s interface,\n+...\n+```\n+\n+```\n+$ gdbus call --session --dest org.libwebsockets.test --object-path /org/libwebsockets/test --method org.libwebsockets.test.Echo HELLO\n+('HELLO',)\n+```\ndiff --git a/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/main.c b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/main.c\nnew file mode 100644\nindex 0000000..0d74b9b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/main.c\n@@ -0,0 +1,535 @@\n+/*\n+ * lws-minimal-dbus-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal session dbus server that uses the lws event loop,\n+ * making it possible to integrate it with other lws features.\n+ *\n+ * The dbus server parts are based on \u0022Sample code illustrating basic use of\n+ * D-BUS\u0022 (presumed Public Domain) here:\n+ *\n+ * https://github.com/fbuihuu/samples-dbus/blob/master/dbus-server.c\n+ */\n+\n+#include \u003cstdbool.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdio.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003cunistd.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003clibwebsockets/lws-dbus.h\u003e\n+\n+static struct lws_context *context;\n+static const char *version \u003d \u00220.1\u0022;\n+static int interrupted;\n+static struct lws_dbus_ctx dbus_ctx, ctx_listener;\n+static char session;\n+\n+#define THIS_INTERFACE\t \u0022org.libwebsockets.test\u0022\n+#define THIS_OBJECT\t \u0022/org/libwebsockets/test\u0022\n+#define THIS_BUSNAME\t \u0022org.libwebsockets.test\u0022\n+\n+#define THIS_LISTEN_PATH \u0022unix:abstract\u003dorg.libwebsockets.test\u0022\n+\n+static const char *\n+server_introspection_xml \u003d\n+\tDBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE\n+\t\u0022\u003cnode\u003e\u005cn\u0022\n+\t\u0022 \u003cinterface name\u003d'\u0022 DBUS_INTERFACE_INTROSPECTABLE \u0022'\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Introspect'\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'data' type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003c/interface\u003e\u005cn\u0022\n+\n+\t\u0022 \u003cinterface name\u003d'\u0022 DBUS_INTERFACE_PROPERTIES \u0022'\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Get'\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'interface' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'property' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'value' type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'GetAll'\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'interface' type\u003d's' direction\u003d'in'/\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'properties' type\u003d'a{sv}' direction\u003d'out'/\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003c/interface\u003e\u005cn\u0022\n+\n+\t\u0022 \u003cinterface name\u003d'\u0022THIS_INTERFACE\u0022'\u003e\u005cn\u0022\n+\t\u0022 \u003cproperty name\u003d'Version' type\u003d's' access\u003d'read' /\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Ping' \u003e\u005cn\u0022\n+\t\u0022 \u003carg type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Echo'\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'string' direction\u003d'in' type\u003d's'/\u003e\u005cn\u0022\n+\t\u0022 \u003carg type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'EmitSignal'\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Quit'\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003csignal name\u003d'OnEmitSignal'\u003e\u005cn\u0022\n+\t\u0022 \u003c/signal\u003e\u0022\n+\t\u0022 \u003c/interface\u003e\u005cn\u0022\n+\n+\t\u0022\u003c/node\u003e\u005cn\u0022;\n+\n+static DBusHandlerResult\n+dmh_introspect(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tdbus_message_append_args(*reply, DBUS_TYPE_STRING,\n+\t\t\t\t \u0026server_introspection_xml, DBUS_TYPE_INVALID);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_get(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tconst char *interface, *property;\n+\tDBusError err;\n+\n+\tdbus_error_init(\u0026err);\n+\n+\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING, \u0026interface,\n+\t\t\t\t\t DBUS_TYPE_STRING, \u0026property,\n+\t\t\t\t\t DBUS_TYPE_INVALID)) {\n+\t\tdbus_message_unref(*reply);\n+\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n+\t\tdbus_error_free(\u0026err);\n+\n+\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n+\t}\n+\n+\tif (strcmp(property, \u0022Version\u0022)) /* Unknown property */\n+\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+\n+\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, \u0026version,\n+\t\t\t\t DBUS_TYPE_INVALID);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_getall(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tDBusMessageIter arr, di, iter, va;\n+\tconst char *property \u003d \u0022Version\u0022;\n+\n+\tdbus_message_iter_init_append(*reply, \u0026iter);\n+\tdbus_message_iter_open_container(\u0026iter, DBUS_TYPE_ARRAY, \u0022{sv}\u0022, \u0026arr);\n+\n+\t/* Append all properties name/value pairs */\n+\tdbus_message_iter_open_container(\u0026arr, DBUS_TYPE_DICT_ENTRY, NULL, \u0026di);\n+\tdbus_message_iter_append_basic(\u0026di, DBUS_TYPE_STRING, \u0026property);\n+\tdbus_message_iter_open_container(\u0026di, DBUS_TYPE_VARIANT, \u0022s\u0022, \u0026va);\n+\tdbus_message_iter_append_basic(\u0026va, DBUS_TYPE_STRING, \u0026version);\n+\tdbus_message_iter_close_container(\u0026di, \u0026va);\n+\tdbus_message_iter_close_container(\u0026arr, \u0026di);\n+\n+\tdbus_message_iter_close_container(\u0026iter, \u0026arr);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_ping(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tconst char *pong \u003d \u0022Pong\u0022;\n+\n+\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, \u0026pong,\n+\t\t\t\t\t DBUS_TYPE_INVALID);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_echo(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tconst char *msg;\n+\tDBusError err;\n+\n+\tdbus_error_init(\u0026err);\n+\n+\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING,\n+\t\t\t\t \u0026msg, DBUS_TYPE_INVALID)) {\n+\t\tdbus_message_unref(*reply);\n+\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n+\t\tdbus_error_free(\u0026err);\n+\n+\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n+\t}\n+\n+\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, \u0026msg,\n+\t\t\t\t\t DBUS_TYPE_INVALID);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_emit_signal(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tDBusMessage *r \u003d dbus_message_new_signal(THIS_OBJECT, THIS_INTERFACE,\n+\t\t\t\t\t \u0022OnEmitSignal\u0022);\n+\n+\tif (!r)\n+\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+\n+\tif (!dbus_connection_send(c, r, NULL))\n+\t\treturn DBUS_HANDLER_RESULT_NEED_MEMORY;\n+\n+\t/* and send the original empty reply after */\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_emit_quit(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tinterrupted \u003d 1;\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+struct lws_dbus_methods {\n+\tconst char *inter;\n+\tconst char *call;\n+\tlws_dbus_message_handler handler;\n+} meths[] \u003d {\n+\t{ DBUS_INTERFACE_INTROSPECTABLE, \u0022Introspect\u0022,\tdmh_introspect\t},\n+\t{ DBUS_INTERFACE_PROPERTIES,\t \u0022Get\u0022,\t\tdmh_get\t\t},\n+\t{ DBUS_INTERFACE_PROPERTIES,\t \u0022GetAll\u0022,\tdmh_getall\t},\n+\t{ THIS_INTERFACE,\t\t \u0022Ping\u0022,\tdmh_ping\t},\n+\t{ THIS_INTERFACE,\t\t \u0022Echo\u0022,\tdmh_echo\t},\n+\t{ THIS_INTERFACE,\t\t \u0022EmitSignal\u0022,\tdmh_emit_signal },\n+\t{ THIS_INTERFACE,\t\t \u0022Quit\u0022,\tdmh_emit_quit\t},\n+};\n+\n+static DBusHandlerResult\n+server_message_handler(DBusConnection *conn, DBusMessage *message, void *data)\n+{\n+\tstruct lws_dbus_methods *mp \u003d meths;\n+\tDBusHandlerResult result;\n+ DBusMessage *reply \u003d NULL;\n+\tsize_t n;\n+\n+\tlwsl_info(\u0022%s: Got D-Bus request: %s.%s on %s\u005cn\u0022, __func__,\n+\t\t dbus_message_get_interface(message),\n+\t\t dbus_message_get_member(message),\n+\t\t dbus_message_get_path(message));\n+\n+\tfor (n \u003d 0; n \u003c LWS_ARRAY_SIZE(meths); n++) {\n+\t\tif (dbus_message_is_method_call(message, mp-\u003einter, mp-\u003ecall)) {\n+\t\t\treply \u003d dbus_message_new_method_return(message);\n+\t\t\tif (!reply)\n+\t\t\t\treturn DBUS_HANDLER_RESULT_NEED_MEMORY;\n+\n+\t\t\tresult \u003d mp-\u003ehandler(conn, message, \u0026reply, data);\n+\n+\t\t\tif (result \u003d\u003d DBUS_HANDLER_RESULT_HANDLED \u0026\u0026\n+\t\t\t !dbus_connection_send(conn, reply, NULL))\n+\t\t\t\tresult \u003d DBUS_HANDLER_RESULT_NEED_MEMORY;\n+\n+\t\t\tdbus_message_unref(reply);\n+\n+\t\t\treturn result;\n+\t\t}\n+\n+\t\tmp++;\n+\t}\n+\n+\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+}\n+\n+static const DBusObjectPathVTable server_vtable \u003d {\n+\t.message_function \u003d server_message_handler\n+};\n+\n+static void\n+destroy_dbus_server_conn(struct lws_dbus_ctx *ctx)\n+{\n+\tif (!ctx-\u003econn)\n+\t\treturn;\n+\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\n+\tdbus_connection_unregister_object_path(ctx-\u003econn, THIS_OBJECT);\n+\tlws_dll2_remove(\u0026ctx-\u003enext);\n+\tdbus_connection_unref(ctx-\u003econn);\n+}\n+\n+static void\n+cb_closing(struct lws_dbus_ctx *ctx)\n+{\n+\tlwsl_err(\u0022%s: closing\u005cn\u0022, __func__);\n+\tdestroy_dbus_server_conn(ctx);\n+\n+\tfree(ctx);\n+}\n+\n+\n+static void\n+new_conn(DBusServer *server, DBusConnection *conn, void *data)\n+{\n+\tstruct lws_dbus_ctx *conn_ctx, *ctx \u003d (struct lws_dbus_ctx *)data;\n+\n+\tlwsl_notice(\u0022%s: vh %s\u005cn\u0022, __func__, lws_get_vhost_name(ctx-\u003evh));\n+\n+\tconn_ctx \u003d malloc(sizeof(*conn_ctx));\n+\tif (!conn_ctx)\n+\t\treturn;\n+\n+\tmemset(conn_ctx, 0, sizeof(*conn_ctx));\n+\n+\tconn_ctx-\u003etsi \u003d ctx-\u003etsi;\n+\tconn_ctx-\u003evh \u003d ctx-\u003evh;\n+\tconn_ctx-\u003econn \u003d conn;\n+\n+\tif (lws_dbus_connection_setup(conn_ctx, conn, cb_closing)) {\n+\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (!dbus_connection_register_object_path(conn, THIS_OBJECT,\n+\t\t\t\t\t\t \u0026server_vtable, conn_ctx)) {\n+\t\tlwsl_err(\u0022%s: Failed to register object path\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_dll2_add_head(\u0026conn_ctx-\u003enext, \u0026ctx-\u003eowner);\n+\n+\t/* we take on responsibility for explicit close / unref with this... */\n+\tdbus_connection_ref(conn);\n+\n+\treturn;\n+\n+bail:\n+\tfree(conn_ctx);\n+}\n+\n+static int\n+create_dbus_listener(const char *ads)\n+{\n+\tDBusError e;\n+\n+ dbus_error_init(\u0026e);\n+\n+\tif (!lws_dbus_server_listen(\u0026ctx_listener, ads, \u0026e, new_conn)) {\n+\t\tlwsl_err(\u0022%s: failed\u005cn\u0022, __func__);\n+\t\tdbus_error_free(\u0026e);\n+\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+create_dbus_server_conn(struct lws_dbus_ctx *ctx, DBusBusType type)\n+{\n+\tDBusError err;\n+\tint rv;\n+\n+ dbus_error_init(\u0026err);\n+\n+\t/* connect to the daemon bus */\n+\tctx-\u003econn \u003d dbus_bus_get(type, \u0026err);\n+\tif (!ctx-\u003econn) {\n+\t\tlwsl_err(\u0022%s: Failed to get a session DBus connection: %s\u005cn\u0022,\n+\t\t\t __func__, err.message);\n+\t\tgoto fail;\n+\t}\n+\n+\t/*\n+\t * by default dbus will call exit() when this connection closes...\n+\t * we have to shut down other things cleanly, so disable that\n+\t */\n+\tdbus_connection_set_exit_on_disconnect(ctx-\u003econn, 0);\n+\n+\trv \u003d dbus_bus_request_name(ctx-\u003econn, THIS_BUSNAME,\n+\t\t\t\t DBUS_NAME_FLAG_REPLACE_EXISTING, \u0026err);\n+\tif (rv !\u003d DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {\n+\t\tlwsl_err(\u0022%s: Failed to request name on bus: %s\u005cn\u0022,\n+\t\t\t __func__, err.message);\n+\t\tgoto fail;\n+\t}\n+\n+\tif (!dbus_connection_register_object_path(ctx-\u003econn, THIS_OBJECT,\n+\t\t\t\t\t\t \u0026server_vtable, NULL)) {\n+\t\tlwsl_err(\u0022%s: Failed to register object path for TestObject\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tdbus_bus_release_name(ctx-\u003econn, THIS_BUSNAME, \u0026err);\n+\t\tgoto fail;\n+\t}\n+\n+\t/*\n+\t * This is the part that binds the connection to lws watcher and\n+\t * timeout handling provided by lws\n+\t */\n+\n+\tif (lws_dbus_connection_setup(ctx, ctx-\u003econn, cb_closing)) {\n+\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n+\t\tgoto fail;\n+\t}\n+\n+\tlwsl_notice(\u0022%s: created OK\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+\n+fail:\n+\tdbus_error_free(\u0026err);\n+\n+\treturn 1;\n+}\n+\n+/*\n+ * Cleanly release the connection\n+ */\n+\n+static void\n+destroy_dbus_server_listener(struct lws_dbus_ctx *ctx)\n+{\n+\tdbus_server_disconnect(ctx-\u003edbs);\n+\n+\tlws_start_foreach_dll_safe(struct lws_dll2 *, rdt, nx,\n+\t\t\t\t ctx-\u003eowner.head) {\n+\t\tstruct lws_dbus_ctx *r \u003d\n+\t\t\tlws_container_of(rdt, struct lws_dbus_ctx, next);\n+\n+\t\tdbus_connection_close(r-\u003econn);\n+\t\tdbus_connection_unref(r-\u003econn);\n+\t\tfree(r);\n+\t} lws_end_foreach_dll_safe(rdt, nx);\n+\n+\tdbus_server_unref(ctx-\u003edbs);\n+}\n+\n+/*\n+ * DBUS can send messages outside the usual client-initiated RPC concept.\n+ *\n+ * You can receive them using a message filter.\n+ */\n+\n+static void\n+spam_connected_clients(struct lws_dbus_ctx *ctx)\n+{\n+\n+\t/* send connected clients an unsolicited message */\n+\n+\tlws_start_foreach_dll_safe(struct lws_dll2 *, rdt, nx,\n+\t\t\t\t ctx-\u003eowner.head) {\n+\t\tstruct lws_dbus_ctx *r \u003d\n+\t\t\tlws_container_of(rdt, struct lws_dbus_ctx, next);\n+\n+\n+\t\tDBusMessage *msg;\n+\t\tconst char *payload \u003d \u0022Unsolicited message\u0022;\n+\n+\t\tmsg \u003d dbus_message_new(DBUS_NUM_MESSAGE_TYPES + 1);\n+\t\tif (!msg) {\n+\t\t\tlwsl_err(\u0022%s: new message failed\u005cn\u0022, __func__);\n+\t\t}\n+\n+\t\tdbus_message_append_args(msg, DBUS_TYPE_STRING, \u0026payload,\n+\t\t\t\t\t\t DBUS_TYPE_INVALID);\n+\t\tif (!dbus_connection_send(r-\u003econn, msg, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\n+\t\tdbus_message_unref(msg);\n+\n+\t} lws_end_foreach_dll_safe(rdt, nx);\n+\n+}\n+\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */ /* | LLL_THREAD */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal DBUS server\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.options |\u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tdbus_ctx.tsi \u003d 0;\n+\tctx_listener.tsi \u003d 0;\n+\tctx_listener.vh \u003d dbus_ctx.vh \u003d lws_create_vhost(context, \u0026info);\n+\tif (!dbus_ctx.vh)\n+\t\tgoto bail;\n+\n+\tsession \u003d !!lws_cmdline_option(argc, argv, \u0022--session\u0022);\n+\n+\tif (session) {\n+\t\t/* create the dbus connection, loosely bound to our lws vhost */\n+\n+\t\tif (create_dbus_server_conn(\u0026dbus_ctx, DBUS_BUS_SESSION))\n+\t\t\tgoto bail;\n+\t} else {\n+\t\tif (create_dbus_listener(THIS_LISTEN_PATH)) {\n+\t\t\tlwsl_err(\u0022%s: create_dbus_listener failed\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\t}\n+\n+\t/* lws event loop (default poll one) */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted) {\n+\t\tif (!session)\n+\t\t\tspam_connected_clients(\u0026ctx_listener);\n+\t\tn \u003d lws_service(context, 0);\n+\t}\n+\n+\tif (session)\n+\t\tdestroy_dbus_server_conn(\u0026dbus_ctx);\n+\telse\n+\t\tdestroy_dbus_server_listener(\u0026ctx_listener);\n+\n+\t/* this is required for valgrind-cleanliness */\n+\tdbus_shutdown();\n+\tlws_context_destroy(context);\n+\n+\tlwsl_notice(\u0022Exiting cleanly\u005cn\u0022);\n+\n+\treturn 0;\n+\n+bail:\n+\tlwsl_err(\u0022%s: failed to start\u005cn\u0022, __func__);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt\nnew file mode 100644\nindex 0000000..cd699a2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt\n@@ -0,0 +1,38 @@\n+project(lws-minimal-dbus-ws-proxy C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(CheckLibraryExists)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-dbus-ws-proxy)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_DBUS 1 requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (NOT MSVC AND NOT WIN32 AND requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (NOT LWS_PLAT_FREERTOS)\n+\t\tfind_package(PkgConfig QUIET)\n+\t\tpkg_check_modules(PC_DBUS1 dbus-1 QUIET)\n+\t\tlist(APPEND LWS_DBUS_INCLUDE1 ${PC_DBUS1_INCLUDE_DIRS})\n+\t\tlist(APPEND LWS_DBUS_LIB \u0022${PC_DBUS1_LIBRARIES};dl\u0022)\n+\tendif()\n+\n+\tif (LWS_DBUS_INCLUDE1)\n+\t\tinclude_directories(\u0022${LWS_DBUS_INCLUDE1}\u0022)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared ${LWS_DBUS_LIB})\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LWS_DBUS_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/README.md b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/README.md\nnew file mode 100644\nindex 0000000..7192854\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/README.md\n@@ -0,0 +1,115 @@\n+# lws minimal dbus ws proxy\n+\n+This is an application which presents a DBUS server on one side, and a\n+websocket client proxy on the other.\n+\n+You connect to it over DBUS, send a Connect method on its interface giving\n+a URI and a ws subprotocol name.\n+\n+It replies with a string \u0022Connecting\u0022 if all is well.\n+\n+Connection progress (including close) is then provided using type 7 messages\n+sent back to the dbus client.\n+\n+Payload from the ws connection is provided using type 6 messages sent back to\n+the dbus client.\n+\n+## build\n+\n+Using libdbus requires additional non-default include paths setting, same as\n+is necessary for lws build described in ./lib/roles/dbus/README.md\n+\n+CMake can guess one path and the library name usually, see the README above\n+for details of how to override for custom libdbus and cross build.\n+\n+Fedora example:\n+```\n+$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib64/dbus-1.0/include\u0022\n+$ make\n+```\n+\n+Ubuntu example:\n+```\n+$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib/x86_64-linux-gnu/dbus-1.0/include\u0022\n+$ make\n+```\n+\n+## Configuration\n+\n+The dbus-ws-proxy server tries to register its actual bus name with the SYSTEM\n+bus in DBUS. If it fails, eg because of insufficient permissions on the user,\n+then it continues without that and starts its own daemon normally.\n+\n+The main dbus daemon must be told how to accept these registrations if that's\n+what you want. A config file is provided that tells dbus to allow the\n+well-known busname for this daemon to be registered, but only by root.\n+\n+``` \n+$ sudo cp org.libwebsockets.wsclientproxy.conf /etc/dbus-1/system.d\n+$ sudo systemctl restart dbus\n+```\n+\n+## usage\n+\n+Run the dbus-ws-proxy server, then start lws-minimal-dbus-ws-proxy-testclient in\n+another terminal.\n+\n+This test app sends a random line drawing message to the mirror example on\n+https://libwebsockets.org/testserver every couple of seconds, and displays\n+any received messages (such as its own sends mirrored back, or anything\n+drawn in the canvas in a browser).\n+\n+```\n+ $ sudo ./lws-minimal-dbus-ws-proxy-testclient\n+[2018/10/07 10:05:29:2084] USER: LWS minimal DBUS ws proxy testclient\n+[2018/10/07 10:05:29:2345] NOTICE: Creating Vhost 'default' port 0, 1 protocols, IPv6 off\n+[2018/10/07 10:05:29:2424] USER: create_dbus_client_conn: connecting to 'unix:abstract\u003dorg.libwebsockets.wsclientproxy'\n+[2018/10/07 10:05:29:2997] NOTICE: state_transition: 0x5679720: from state 0 -\u003e 1\n+[2018/10/07 10:05:29:2999] NOTICE: create_dbus_client_conn: created OK\n+[2018/10/07 10:05:29:3232] USER: remote_method_call: requesting proxy connection wss://libwebsockets.org/ lws-mirror-protocol\n+[2018/10/07 10:05:29:3450] NOTICE: state_transition: 0x5679720: from state 1 -\u003e 2\n+[2018/10/07 10:05:29:5972] USER: pending_call_notify: received 'Connecting'\n+[2018/10/07 10:05:31:3387] NOTICE: state_transition: 0x5679720: from state 2 -\u003e 3\n+[2018/10/07 10:05:33:6672] USER: filter: Received 'd #B0DC51 115 177 166 283;'\n+[2018/10/07 10:05:35:9723] USER: filter: Received 'd #E87CCD 9 192 106 235;'\n+[2018/10/07 10:05:38:2784] USER: filter: Received 'd #E2A9E3 379 290 427 62;'\n+[2018/10/07 10:05:39:5833] USER: filter: Received 'd #B127F8 52 126 60 226;'\n+[2018/10/07 10:05:41:8908] USER: filter: Received 'd #0E0F76 429 267 8 11;'\n+...\n+```\n+\n+## ws proxy DBUS details\n+\n+### Fixed details\n+\n+Item|Value\n+---|---\n+Address|unix:abstract\u003dorg.libwebsockets.wsclientproxy\n+Interface|org.libwebsockets.wsclientproxy\n+Bus Name|org.libwebsockets.wsclientproxy\n+Object path|/org/libwebsockets/wsclientproxy\n+\n+### Interface Methods\n+\n+Method|Arguments|Returns\n+---|---|---\n+Connect|s: ws URI, s: ws subprotocol name|\u0022Bad Uri\u0022, \u0022Connecting\u0022 or \u0022Failed\u0022\n+Send|s: payload|Empty message if no problem, or error message\n+\n+When Connecting, the actual connection happens asynchronously if the initial\n+connection attempt doesn't fail immediately. If it's continuing in the\n+background, the reply will have been \u0022Connecting\u0022.\n+\n+### Signals\n+\n+Signal Name|Argument|Meaning\n+---|---|---\n+Receive|s: payload|Received data from the ws link\n+Status|s: status|See table below\n+\n+Status String|Meaning\n+---|---\n+\u0022ws client connection error\u0022|The ws connection attempt ended with a fatal error\n+\u0022ws client connection established\u0022|The ws connection attempt succeeded\n+\u0022ws client connection closed\u0022|The ws connection has closed\n+\ndiff --git a/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/main.c b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/main.c\nnew file mode 100644\nindex 0000000..353b159\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/main.c\n@@ -0,0 +1,101 @@\n+/*\n+ * lws-minimal-dbus-ws-proxy\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal session dbus server that uses the lws event loop,\n+ * and allows proxying ws client connections via DBUS.\n+ */\n+\n+#include \u003cstdbool.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdio.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003cunistd.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003clibwebsockets/lws-dbus.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal_dbus_ws_proxy.c\u0022\n+\n+static int interrupted;\n+static struct lws_protocols protocols[] \u003d {\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL_DBUS_WSPROXY,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+/*\n+ * we pass the dbus address to connect to proxy with from outside the\n+ * protocol plugin... eg if built as a plugin for lwsws, you would instead\n+ * set this pvo in the lwsws JSON config.\n+ */\n+\n+static const struct lws_protocol_vhost_options pvo_ads \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022ads\u0022,\t\t\t\t/* pvo name */\n+\t(void *)\u0022unix:abstract\u003dorg.libwebsockets.wsclientproxy\u0022\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_ads,\t\t\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-minimal-dbus-wsproxy\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t\t\t/* ignored */\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstatic struct lws_context *context;\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */ /* | LLL_THREAD */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS DBUS ws client proxy\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* lws event loop (default poll one) */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_notice(\u0022Exiting cleanly\u005cn\u0022);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf\nnew file mode 100644\nindex 0000000..49e430b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf\n@@ -0,0 +1,14 @@\n+\u003c!DOCTYPE busconfig PUBLIC\n+ \u0022-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN\u0022\n+ \u0022http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd\u0022\u003e\n+\u003cbusconfig\u003e\n+\t\u003cpolicy user\u003d\u0022root\u0022\u003e\n+\t\t\u003callow own\u003d\u0022org.libwebsockets.wsclientproxy\u0022/\u003e\n+\t\t\u003callow send_destination\u003d\u0022org.libwebsockets.wsclientproxy\u0022/\u003e\n+\t\u003c/policy\u003e\n+\t\u003cpolicy context\u003d\u0022default\u0022\u003e\n+ \u003cdeny own\u003d\u0022org.libwebsockets.wsclientproxy\u0022/\u003e\n+ \u003cdeny send_destination\u003d\u0022org.libwebsockets.wsclientproxy\u0022/\u003e\n+ \u003c/policy\u003e\n+\u003c/busconfig\u003e\n+\ndiff --git a/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c\nnew file mode 100644\nindex 0000000..3db1c4e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c\n@@ -0,0 +1,795 @@\n+/*\n+ * ws protocol handler plugin for dbus ws proxy\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This proxies outgoing ws client connections on DBUS. So a DBUS client can\n+ * reach out and get remote WS payloads in both directions.\n+ *\n+ * DEVELOPER NOTE\n+ *\n+ * Two worlds, dbus and ws, collide in this file.\n+ *\n+ * There main thing keeping it sane is both worlds are running in the same\n+ * thread and on the same event loop. Although things may happen completely\n+ * asynchronously in both worlds, the logical reaction to those events are\n+ * serialized in a single event loop doing one thing at a time.\n+ *\n+ * So while you are servicing an event in the ws world, you can be certain the\n+ * logical state of any related dbus thing cannot change underneath you, until\n+ * you return back to the event loop, and vice versa. So other-world objects\n+ * can't be freed, other-world handles can't close etc while you are servicing\n+ * in your world.\n+ *\n+ * Since all bets are off what happens next, and in which world, after you\n+ * return back to the event loop though, an additional rule is needed: worlds\n+ * must not allocate in objects owned by the other world. They must generate\n+ * their own objects in their world and use those for allocations and state.\n+ *\n+ * For example in the dbus-world there is a struct lws_dbus_ctx_wsproxy with\n+ * various state, but he is subject to deletion by events in dbus-world. If\n+ * the ws-world stored things there, they are subject to going out of scope\n+ * at the whim of the dbus connection without the ws world hearing about it and\n+ * cleanly deallocaing them. So the ws world must keep his own pss that remains\n+ * in scope until the ws link closes for allocations from ws-world.\n+ *\n+ * In this application there's a point of contact between the worlds, a ring\n+ * buffer allocated in ws world when the ws connection is established, and\n+ * deallocated when the ws connection is closed. The DBUS world needs to put\n+ * things in this ringbuffer. But the way lws_ring works, when the message\n+ * allocated in DBUS world is queued on the ringbuffer, the ringbuffer itself\n+ * takes responsibility for deallocation. So there is no problem.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#include \u003clibwebsockets/lws-dbus.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+#include \u003cassert.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/*\n+ * dbus accepted connections create these larger context structs that start\n+ * with the lws dbus context\n+ */\n+\n+struct vhd_dbus_proxy;\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+\tchar binary;\n+\tchar first;\n+\tchar final;\n+};\n+\n+struct pss_dbus_proxy {\n+\tstruct lws_ring *ring_out;\n+\tuint32_t ring_out_tail;\n+};\n+\n+struct lws_dbus_ctx_wsproxy {\n+\tstruct lws_dbus_ctx ctx;\n+\n+\tstruct lws *cwsi;\n+\tstruct vhd_dbus_proxy *vhd;\n+\tstruct pss_dbus_proxy *pss;\n+};\n+\n+struct vhd_dbus_proxy {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\n+\t/*\n+\t * Because the listener ctx is composed in the vhd, we can always get a\n+\t * pointer to the outer vhd from a pointer to ctx_listener inside.\n+\t */\n+\tstruct lws_dbus_ctx ctx_listener;\n+\tstruct lws_dbus_ctx_wsproxy dctx;\n+\n+\tconst char *dbus_listen_ads;\n+};\n+\n+#define THIS_INTERFACE\t\u0022org.libwebsockets.wsclientproxy\u0022\n+#define THIS_OBJECT\t\u0022/org/libwebsockets/wsclientproxy\u0022\n+#define THIS_BUSNAME\t\u0022org.libwebsockets.wsclientproxy\u0022\n+static const char *version \u003d \u00220.1\u0022;\n+\n+static const char *server_introspection_xml \u003d\n+\tDBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE\n+\t\u0022\u003cnode\u003e\u005cn\u0022\n+\t\u0022 \u003cinterface name\u003d'\u0022 DBUS_INTERFACE_INTROSPECTABLE \u0022'\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Introspect'\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'data' type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003c/interface\u003e\u005cn\u0022\n+\n+\t\u0022 \u003cinterface name\u003d'\u0022 DBUS_INTERFACE_PROPERTIES \u0022'\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Get'\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'interface' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'property' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'value' type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'GetAll'\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'interface' type\u003d's' direction\u003d'in'/\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'properties' type\u003d'a{sv}' direction\u003d'out'/\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003c/interface\u003e\u005cn\u0022\n+\n+\t\u0022 \u003cinterface name\u003d'\u0022THIS_INTERFACE\u0022'\u003e\u005cn\u0022\n+\t\u0022 \u003cproperty name\u003d'Version' type\u003d's' access\u003d'read' /\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Connect' \u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'url' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'subprotocol' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003cmethod name\u003d'Send'\u003e\u005cn\u0022\n+\t\u0022 \u003carg name\u003d'payload' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n+\t\u0022 \u003c/method\u003e\u005cn\u0022\n+\t\u0022 \u003csignal name\u003d'Receive'\u003e\u005cn\u0022\n+\t\u0022 \u003c/signal\u003e\u0022\n+\t\u0022 \u003csignal name\u003d'Status'\u003e\u005cn\u0022\n+\t\u0022 \u003c/signal\u003e\u0022\n+\t\u0022 \u003c/interface\u003e\u005cn\u0022\n+\n+\t\u0022\u003c/node\u003e\u005cn\u0022;\n+\n+static void\n+destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+/*\n+ * DBUS WORLD\n+ */\n+\n+static DBusHandlerResult\n+dmh_introspect(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tdbus_message_append_args(*reply,\n+\t\t\t\t DBUS_TYPE_STRING, \u0026server_introspection_xml,\n+\t\t\t\t DBUS_TYPE_INVALID);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_get(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tconst char *interface, *property;\n+\tDBusError err;\n+\n+\tdbus_error_init(\u0026err);\n+\n+\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING, \u0026interface,\n+\t\t\t\t\t DBUS_TYPE_STRING, \u0026property,\n+\t\t\t\t\t DBUS_TYPE_INVALID)) {\n+\t\tdbus_message_unref(*reply);\n+\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n+\t\tdbus_error_free(\u0026err);\n+\n+\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n+\t}\n+\n+\tif (strcmp(property, \u0022Version\u0022)) /* Unknown property */\n+\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+\n+\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, \u0026version,\n+\t\t\t\t\t DBUS_TYPE_INVALID);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_getall(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tDBusMessageIter arr, di, iter, va;\n+\tconst char *property \u003d \u0022Version\u0022;\n+\n+\tdbus_message_iter_init_append(*reply, \u0026iter);\n+\tdbus_message_iter_open_container(\u0026iter, DBUS_TYPE_ARRAY, \u0022{sv}\u0022, \u0026arr);\n+\n+\t/* Append all properties name/value pairs */\n+\tdbus_message_iter_open_container(\u0026arr, DBUS_TYPE_DICT_ENTRY, NULL, \u0026di);\n+\tdbus_message_iter_append_basic(\u0026di, DBUS_TYPE_STRING, \u0026property);\n+\tdbus_message_iter_open_container(\u0026di, DBUS_TYPE_VARIANT, \u0022s\u0022, \u0026va);\n+\tdbus_message_iter_append_basic(\u0026va, DBUS_TYPE_STRING, \u0026version);\n+\tdbus_message_iter_close_container(\u0026di, \u0026va);\n+\tdbus_message_iter_close_container(\u0026arr, \u0026di);\n+\n+\tdbus_message_iter_close_container(\u0026iter, \u0026arr);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static DBusHandlerResult\n+dmh_connect(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tstruct lws_dbus_ctx_wsproxy *wspctx \u003d (struct lws_dbus_ctx_wsproxy *)d;\n+\tconst char *prot \u003d \u0022\u0022, *ads \u003d \u0022\u0022, *path \u003d \u0022\u0022, *baduri \u003d \u0022Bad Uri\u0022,\n+\t\t *connecting \u003d \u0022Connecting\u0022, *failed \u003d \u0022Failed\u0022, **pp;\n+\tstruct lws_client_connect_info i;\n+\tchar host[128], uri_copy[512];\n+\tconst char *uri, *subprotocol;\n+\tDBusError err;\n+\tint port \u003d 0;\n+\n+\tdbus_error_init(\u0026err);\n+\n+\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING, \u0026uri,\n+\t\t\t \t \t DBUS_TYPE_STRING, \u0026subprotocol,\n+\t\t\t\t\t DBUS_TYPE_INVALID)) {\n+\t\tdbus_message_unref(*reply);\n+\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n+\t\tdbus_error_free(\u0026err);\n+\n+\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n+\t}\n+\n+\tstrncpy(uri_copy, uri, sizeof(uri_copy) - 1);\n+\turi_copy[sizeof(uri_copy) - 1] \u003d '\u005c0';\n+\n+\tif (lws_parse_uri(uri_copy, \u0026prot, \u0026ads, \u0026port, \u0026path)) {\n+\t\tpp \u003d \u0026baduri;\n+\t\tgoto send_reply;\n+\t}\n+\n+\tlws_snprintf(host, sizeof(host), \u0022%s:%u\u0022, ads, port);\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\n+\tassert(wspctx);\n+\tassert(wspctx-\u003evhd);\n+\n+\ti.context \u003d wspctx-\u003evhd-\u003econtext;\n+\ti.port \u003d port;\n+\ti.address \u003d ads;\n+\ti.path \u003d path;\n+\ti.host \u003d host;\n+\ti.origin \u003d host;\n+\ti.ssl_connection \u003d !strcmp(prot, \u0022https\u0022) || !strcmp(prot, \u0022wss\u0022);\n+\ti.vhost \u003d wspctx-\u003ectx.vh;\n+\ti.protocol \u003d subprotocol;\n+\ti.local_protocol_name \u003d \u0022lws-minimal-dbus-wsproxy\u0022;\n+\ti.pwsi \u003d \u0026wspctx-\u003ecwsi;\n+\n+\tlwsl_user(\u0022%s: connecting to %s://%s:%d%s\u005cn\u0022, __func__, prot,\n+\t\t\ti.address, i.port, i.path);\n+\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tlwsl_notice(\u0022%s: client connect failed\u005cn\u0022, __func__);\n+\t\tpp \u003d \u0026failed;\n+\t\tgoto send_reply;\n+\t}\n+\n+\tlws_set_opaque_parent_data(wspctx-\u003ecwsi, wspctx);\n+\tlwsl_notice(\u0022%s: client connecting...\u005cn\u0022, __func__);\n+\tpp \u003d \u0026connecting;\n+\n+send_reply:\n+\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, pp,\n+\t\t\t\t\t DBUS_TYPE_INVALID);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+static int\n+issue_dbus_signal(struct lws *wsi, const char *signame, const char *string)\n+{\n+\tstruct lws_dbus_ctx_wsproxy *wspctx \u003d\n+\t\t\tlws_get_opaque_parent_data(wsi);\n+\tDBusMessage *m;\n+\n+\tif (!wspctx)\n+\t\treturn 1;\n+\n+\tm \u003d dbus_message_new_signal(THIS_OBJECT, THIS_INTERFACE, signame);\n+\tif (!m) {\n+\t\tlwsl_err(\u0022%s: new signal failed\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tdbus_message_append_args(m, DBUS_TYPE_STRING, \u0026string,\n+\t\t\t\t DBUS_TYPE_INVALID);\n+\n+\tif (!dbus_connection_send(wspctx-\u003ectx.conn, m, NULL))\n+\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n+\n+\tdbus_message_unref(m);\n+\n+\treturn 0;\n+}\n+\n+static DBusHandlerResult\n+dmh_send(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n+{\n+\tstruct lws_dbus_ctx_wsproxy *wspctx \u003d (struct lws_dbus_ctx_wsproxy *)d;\n+\tconst char *payload;\n+\tstruct msg amsg;\n+\tDBusError err;\n+\n+\tdbus_error_init(\u0026err);\n+\n+\tif (!wspctx-\u003ecwsi || !wspctx-\u003epss) {\n+\t\tdbus_message_unref(*reply);\n+\t\t*reply \u003d dbus_message_new_error(m, \u0022Send Fail\u0022, \u0022No ws conn\u0022);\n+\n+\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n+\t}\n+\n+\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING, \u0026payload,\n+\t\t\t\t\t DBUS_TYPE_INVALID)) {\n+\t\tdbus_message_unref(*reply);\n+\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n+\t\tdbus_error_free(\u0026err);\n+\n+\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n+\t}\n+\n+\t/*\n+\t * we allocate on the ringbuffer in ws world, but responsibility for\n+\t * freeing it is understood by lws_ring.\n+\t */\n+\n+\tamsg.len \u003d strlen(payload);\n+\t/* notice we over-allocate by LWS_PRE */\n+\tamsg.payload \u003d malloc(LWS_PRE + amsg.len);\n+\tif (!amsg.payload) {\n+\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\tdbus_message_unref(*reply);\n+\t\t*reply \u003d dbus_message_new_error(m, \u0022Send Fail\u0022, \u0022OOM\u0022);\n+\n+\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n+\t}\n+\tamsg.binary \u003d 0;\n+\tamsg.first \u003d 1;\n+\tamsg.final \u003d 1;\n+\n+\tmemcpy((char *)amsg.payload + LWS_PRE, payload, amsg.len);\n+\tif (!lws_ring_insert(wspctx-\u003epss-\u003ering_out, \u0026amsg, 1)) {\n+\t\tdestroy_message(\u0026amsg);\n+\t\tlwsl_user(\u0022Ring Full!\u005cn\u0022);\n+\t\tdbus_message_unref(*reply);\n+\t\t*reply \u003d dbus_message_new_error(m, \u0022Send Fail\u0022, \u0022Ring full\u0022);\n+\n+\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n+\t}\n+\tif (wspctx-\u003ecwsi)\n+\t\tlws_callback_on_writable(wspctx-\u003ecwsi);\n+\n+\treturn DBUS_HANDLER_RESULT_HANDLED;\n+}\n+\n+struct lws_dbus_methods {\n+\tconst char *inter;\n+\tconst char *call;\n+\tlws_dbus_message_handler handler;\n+} meths[] \u003d {\n+\t{ DBUS_INTERFACE_INTROSPECTABLE, \u0022Introspect\u0022,\tdmh_introspect\t},\n+\t{ DBUS_INTERFACE_PROPERTIES,\t \u0022Get\u0022,\t\tdmh_get\t\t},\n+\t{ DBUS_INTERFACE_PROPERTIES,\t \u0022GetAll\u0022,\tdmh_getall\t},\n+\t{ THIS_INTERFACE,\t\t \u0022Connect\u0022,\tdmh_connect\t},\n+\t{ THIS_INTERFACE,\t\t \u0022Send\u0022,\tdmh_send\t},\n+};\n+\n+static DBusHandlerResult\n+server_message_handler(DBusConnection *conn, DBusMessage *message, void *data)\n+{\n+\tstruct lws_dbus_methods *mp \u003d meths;\n+ DBusMessage *reply \u003d NULL;\n+\tDBusHandlerResult result;\n+\tsize_t n;\n+\n+\tassert(data);\n+\n+\tlwsl_info(\u0022%s: Got D-Bus request: %s.%s on %s\u005cn\u0022, __func__,\n+\t\tdbus_message_get_interface(message),\n+\t\tdbus_message_get_member(message),\n+\t\tdbus_message_get_path(message));\n+\n+\tfor (n \u003d 0; n \u003c LWS_ARRAY_SIZE(meths); n++) {\n+\t\tif (dbus_message_is_method_call(message, mp-\u003einter, mp-\u003ecall)) {\n+\t\t\treply \u003d dbus_message_new_method_return(message);\n+\t\t\tif (!reply)\n+\t\t\t\treturn DBUS_HANDLER_RESULT_NEED_MEMORY;\n+\n+\t\t\tresult \u003d mp-\u003ehandler(conn, message, \u0026reply, data);\n+\n+\t\t\tif (result \u003d\u003d DBUS_HANDLER_RESULT_HANDLED \u0026\u0026\n+\t\t\t !dbus_connection_send(conn, reply, NULL))\n+\t\t\t\tresult \u003d DBUS_HANDLER_RESULT_NEED_MEMORY;\n+\n+\t\t\tdbus_message_unref(reply);\n+\n+\t\t\treturn result;\n+\t\t}\n+\n+\t\tmp++;\n+\t}\n+\n+\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n+}\n+\n+static const DBusObjectPathVTable vtable \u003d {\n+\t.message_function \u003d server_message_handler\n+};\n+\n+static void\n+destroy_dbus_server_conn(struct lws_dbus_ctx_wsproxy *wsctx)\n+{\n+\tif (!wsctx-\u003ectx.conn)\n+\t\treturn;\n+\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\n+\tdbus_connection_unregister_object_path(wsctx-\u003ectx.conn, THIS_OBJECT);\n+\tlws_dll2_remove(\u0026wsctx-\u003ectx.next);\n+\tdbus_connection_unref(wsctx-\u003ectx.conn);\n+}\n+\n+/*\n+ * This is the client dbus side going away. We need to stop the associated\n+ * client ws part and make sure it can't dereference us now we are gone.\n+ */\n+\n+static void\n+cb_closing(struct lws_dbus_ctx *ctx)\n+{\n+\tstruct lws_dbus_ctx_wsproxy *wspctx \u003d\n+\t\t\t(struct lws_dbus_ctx_wsproxy *)ctx;\n+\tlwsl_err(\u0022%s: closing\u005cn\u0022, __func__);\n+\n+\t/*\n+\t * We have to take care that the associated proxy wsi knows our\n+\t * dbus ctx is going out of scope after we return from here.\n+\t *\n+\t * We do it by setting its pointer to our dbus ctx to NULL.\n+\t */\n+\n+\tif (wspctx-\u003ecwsi) {\n+\t\tlws_set_opaque_parent_data(wspctx-\u003ecwsi, NULL);\n+\t\tlws_set_timeout(wspctx-\u003ecwsi,\n+\t\t\t\tPENDING_TIMEOUT_KILLED_BY_PROXY_CLIENT_CLOSE,\n+\t\t\t\tLWS_TO_KILL_ASYNC);\n+\t}\n+\n+\tdestroy_dbus_server_conn(wspctx);\n+\n+\tfree(wspctx);\n+}\n+\n+static void\n+new_conn(DBusServer *server, DBusConnection *conn, void *d)\n+{\n+\tstruct lws_dbus_ctx_wsproxy *conn_wspctx, /* the new conn context */\n+\t\t\t\t /* the listener context */\n+\t\t\t\t *wspctx \u003d (struct lws_dbus_ctx_wsproxy *)d;\n+\tstruct vhd_dbus_proxy *vhd \u003d lws_container_of(d,\n+\t\t\t\t\tstruct vhd_dbus_proxy, ctx_listener);\n+\n+\tassert(vhd-\u003evhost \u003d\u003d wspctx-\u003ectx.vh);\n+\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\n+\tconn_wspctx \u003d malloc(sizeof(*conn_wspctx));\n+\tif (!conn_wspctx)\n+\t\treturn;\n+\n+\tmemset(conn_wspctx, 0, sizeof(*conn_wspctx));\n+\n+\tconn_wspctx-\u003ectx.tsi \u003d wspctx-\u003ectx.tsi;\n+\tconn_wspctx-\u003ectx.vh \u003d wspctx-\u003ectx.vh;\n+\tconn_wspctx-\u003ectx.conn \u003d conn;\n+\tconn_wspctx-\u003evhd \u003d vhd; /* let accepted connections also know the vhd */\n+\n+\tassert(conn_wspctx-\u003evhd);\n+\n+\tif (lws_dbus_connection_setup(\u0026conn_wspctx-\u003ectx, conn, cb_closing)) {\n+\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (!dbus_connection_register_object_path(conn, THIS_OBJECT, \u0026vtable,\n+\t\t\t\t\t\t conn_wspctx)) {\n+\t\tlwsl_err(\u0022%s: Failed to register object path\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tlws_dll2_add_head(\u0026conn_wspctx-\u003ectx.next, \u0026wspctx-\u003ectx.owner);\n+\n+\t/* we take on responsibility for explicit close / unref with this... */\n+\tdbus_connection_ref(conn);\n+\n+\treturn;\n+\n+bail:\n+\tfree(conn_wspctx);\n+}\n+\n+static int\n+create_dbus_listener(struct vhd_dbus_proxy *vhd, int tsi)\n+{\n+\tDBusError e;\n+\n+ dbus_error_init(\u0026e);\n+#if 0\n+ vhd-\u003edctx.ctx.tsi \u003d tsi;\n+ vhd-\u003edctx.ctx.vh \u003d vhd-\u003evhost;\n+ vhd-\u003edctx.ctx.next.prev \u003d NULL;\n+ vhd-\u003edctx.ctx.next.next \u003d NULL;\n+ vhd-\u003edctx.vhd \u003d vhd;\n+ vhd-\u003edctx.cwsi \u003d NULL;\n+\n+\t/* connect to the SYSTEM bus */\n+\n+\tvhd-\u003edctx.ctx.conn \u003d dbus_bus_get(DBUS_BUS_SYSTEM, \u0026e);\n+\tif (!vhd-\u003edctx.ctx.conn) {\n+\t\tlwsl_notice(\u0022%s: Failed to get a session DBus connection: '%s'\u0022\n+\t\t\t \u0022, continuing with daemon listener only\u005cn\u0022,\n+\t\t\t __func__, e.message);\n+\t\tdbus_error_free(\u0026e);\n+\t\tdbus_error_init(\u0026e);\n+\t\tgoto daemon;\n+\t}\n+\n+\t/*\n+\t * by default dbus will call exit() when this connection closes...\n+\t * we have to shut down other things cleanly, so disable that\n+\t */\n+\tdbus_connection_set_exit_on_disconnect(vhd-\u003edctx.ctx.conn, 0);\n+\n+\tif (dbus_bus_request_name(vhd-\u003edctx.ctx.conn, THIS_BUSNAME,\n+\t\t\t\t DBUS_NAME_FLAG_REPLACE_EXISTING, \u0026e) !\u003d\n+\t\t\t\t\tDBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {\n+\t\tlwsl_notice(\u0022%s: Failed to request name on bus: '%s',\u0022\n+\t\t\t \u0022 continuing with daemon listener only\u005cn\u0022,\n+\t\t\t __func__, e.message);\n+\t\tdbus_connection_unref(vhd-\u003edctx.ctx.conn);\n+\t\tvhd-\u003edctx.ctx.conn \u003d NULL;\n+\t\tdbus_error_free(\u0026e);\n+\t\tdbus_error_init(\u0026e);\n+\t\tgoto daemon;\n+\t}\n+\n+\tif (!dbus_connection_register_object_path(vhd-\u003edctx.ctx.conn,\n+\t\t\t\t\t\t THIS_OBJECT, \u0026vtable,\n+\t\t\t\t\t\t \u0026vhd-\u003edctx)) {\n+\t\tlwsl_err(\u0022%s: Failed to register object path\u005cn\u0022, __func__);\n+\t\tgoto fail;\n+\t}\n+\n+\t/*\n+\t * This is the part that binds the connection to lws watcher and\n+\t * timeout handling provided by lws\n+\t */\n+\n+\tif (lws_dbus_connection_setup(\u0026vhd-\u003edctx.ctx, vhd-\u003edctx.ctx.conn,\n+\t\t\t\t cb_closing)) {\n+\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n+\t\tgoto fail;\n+\t}\n+\n+daemon:\n+#endif\n+ vhd-\u003ectx_listener.vh \u003d vhd-\u003evhost;\n+ vhd-\u003ectx_listener.tsi \u003d tsi;\n+\n+\tif (!lws_dbus_server_listen(\u0026vhd-\u003ectx_listener, vhd-\u003edbus_listen_ads,\n+\t\t\t\t \u0026e, new_conn)) {\n+\t\tlwsl_err(\u0022%s: failed\u005cn\u0022, __func__);\n+\t\tdbus_error_free(\u0026e);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tlwsl_notice(\u0022%s: created DBUS listener on %s\u005cn\u0022, __func__,\n+\t\t\tvhd-\u003edbus_listen_ads);\n+\n+\treturn 0;\n+#if 0\n+fail:\n+\tdbus_error_free(\u0026e);\n+\n+\treturn 1;\n+#endif\n+}\n+\n+static void\n+destroy_dbus_server_listener(struct vhd_dbus_proxy *vhd)\n+{\n+\tdbus_server_disconnect(vhd-\u003ectx_listener.dbs);\n+\n+\tlws_start_foreach_dll_safe(struct lws_dll2 *, rdt, nx,\n+\t\t\tvhd-\u003ectx_listener.owner.head) {\n+\t\tstruct lws_dbus_ctx *r \u003d lws_container_of(rdt,\n+\t\t\t\t\t\tstruct lws_dbus_ctx, next);\n+\n+\t\tdbus_connection_close(r-\u003econn);\n+\t\tdbus_connection_unref(r-\u003econn);\n+\t\tfree(r);\n+\t} lws_end_foreach_dll_safe(rdt, nx);\n+\n+\tif (vhd-\u003edctx.ctx.conn)\n+\t\tdbus_connection_unref(vhd-\u003edctx.ctx.conn);\n+\tdbus_server_unref(vhd-\u003ectx_listener.dbs);\n+}\n+\n+/*\n+ * WS WORLD\n+ */\n+\n+static int\n+callback_minimal_dbus_wsproxy(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\tstruct pss_dbus_proxy *pss \u003d (struct pss_dbus_proxy *)user;\n+\tstruct vhd_dbus_proxy *vhd \u003d (struct vhd_dbus_proxy *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\t\t lws_get_protocol(wsi));\n+\tstruct lws_dbus_ctx_wsproxy *wspctx;\n+\tconst struct msg *pmsg;\n+\tint flags, m;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi), sizeof(*vhd));\n+\t\tif (!vhd)\n+\t\t\treturn -1;\n+\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tif (lws_pvo_get_str(in, \u0022ads\u0022, \u0026vhd-\u003edbus_listen_ads)) {\n+\t\t\tlwsl_err(\u0022%s: pvo 'ads' must be set\u005cn\u0022, __func__);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tif (create_dbus_listener(vhd, 0)) {\n+\t\t\tlwsl_err(\u0022%s: create_dbus_listener failed\u005cn\u0022, __func__);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tdestroy_dbus_server_listener(vhd);\n+\t\t/* this is required for valgrind-cleanliness */\n+\t\tdbus_shutdown();\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_ESTABLISHED\u005cn\u0022);\n+\n+\t\t/*\n+\t\t * create the send ringbuffer now the ws connection is\n+\t\t * established.\n+\t\t */\n+\n+\t\twspctx \u003d lws_get_opaque_parent_data(wsi);\n+\t\tif (!wspctx)\n+\t\t\tbreak;\n+\n+\t\twspctx-\u003epss \u003d pss;\n+\t\tpss-\u003ering_out_tail \u003d 0;\n+\t\tpss-\u003ering_out \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t\t destroy_message);\n+\t\tif (!pss-\u003ering_out) {\n+\t\t\tlwsl_err(\u0022OOM\u005cn\u0022);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tissue_dbus_signal(wsi, \u0022Status\u0022,\n+\t\t\t\t \u0022ws client connection established\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_WRITEABLE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_WRITEABLE:\u005cn\u0022);\n+\n+\t\tpmsg \u003d lws_ring_get_element(pss-\u003ering_out, \u0026pss-\u003ering_out_tail);\n+\t\tif (!pmsg) {\n+\t\t\tlwsl_user(\u0022 (nothing in ring)\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tflags \u003d lws_write_ws_flags(\n+\t\t\t pmsg-\u003ebinary ? LWS_WRITE_BINARY : LWS_WRITE_TEXT,\n+\t\t\t pmsg-\u003efirst, pmsg-\u003efinal);\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) + LWS_PRE,\n+\t\t\t pmsg-\u003elen, flags);\n+\t\tif (m \u003c (int)pmsg-\u003elen) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlwsl_user(\u0022 wrote %d: flags: 0x%x first: %d final %d\u005cn\u0022,\n+\t\t\t\tm, flags, pmsg-\u003efirst, pmsg-\u003efinal);\n+\n+\t\tlws_ring_consume_single_tail(pss-\u003ering_out,\n+\t\t\t\t\t \u0026pss-\u003ering_out_tail, 1);\n+\n+\t\t/* more to do for us? */\n+\t\tif (lws_ring_get_element(pss-\u003ering_out, \u0026pss-\u003ering_out_tail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(wsi);\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_RECEIVE: %4d \u0022\n+\t\t\t \u0022(rpp %5d, first %d, last %d, bin %d)\u005cn\u0022,\n+\t\t\t (int)len, (int)lws_remaining_packet_payload(wsi),\n+\t\t\t lws_is_first_fragment(wsi),\n+\t\t\t lws_is_final_fragment(wsi),\n+\t\t\t lws_frame_is_binary(wsi));\n+\n+\t\t{\n+\t\t\tchar strbuf[256];\n+\t\t\tsize_t l \u003d len;\n+\n+\t\t\tif (l \u003e sizeof(strbuf) - 1u)\n+\t\t\t\tl \u003d sizeof(strbuf) - 1u;\n+\n+\t\t\tmemcpy(strbuf, in, l);\n+\t\t\tstrbuf[l] \u003d '\u005c0';\n+\n+\t\t\tissue_dbus_signal(wsi, \u0022Receive\u0022, strbuf);\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tissue_dbus_signal(wsi, \u0022Status\u0022, \u0022ws client connection error\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tlwsl_err(\u0022LWS_CALLBACK_CLIENT_CLOSED ()\u005cn\u0022);\n+\t\tissue_dbus_signal(wsi, \u0022Status\u0022, \u0022ws client connection closed\u0022);\n+\n+\t\t/* destroy any ringbuffer and pending messages */\n+\n+\t\tlws_ring_destroy(pss-\u003ering_out);\n+\n+\t\twspctx \u003d lws_get_opaque_parent_data(wsi);\n+\t\tif (!wspctx)\n+\t\t\tbreak;\n+\n+\t\t/*\n+\t\t * the wspctx cannot refer to its child wsi any longer, it is\n+\t\t * about to go out of scope.\n+\t\t */\n+\n+\t\twspctx-\u003ecwsi \u003d NULL;\n+\t\twspctx-\u003epss \u003d NULL;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL_DBUS_WSPROXY \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal-dbus-wsproxy\u0022, \u005c\n+\t\tcallback_minimal_dbus_wsproxy, \u005c\n+\t\tsizeof(struct pss_dbus_proxy), \u005c\n+\t\t1024, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/gtk/minimal-gtk/CMakeLists.txt b/minimal-examples-lowlevel/gtk/minimal-gtk/CMakeLists.txt\nnew file mode 100644\nindex 0000000..27587f4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/gtk/minimal-gtk/CMakeLists.txt\n@@ -0,0 +1,47 @@\n+project(lws-minimal-gtk C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-gtk)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_GLIB 1 requirements)\n+require_lws_config(LWS_WITH_GTK 1 requirements)\n+\n+if (requirements)\n+\n+# gtk pieces\n+\t\n+\tinclude (FindPkgConfig)\n+\t\n+\tset(LWS_GTK_INCLUDE_DIRS CACHE PATH \u0022Path to the gtk include directory\u0022)\n+\tset(LWS_GTK_LIBRARIES CACHE PATH \u0022Path to the gtk library\u0022)\n+\tPKG_SEARCH_MODULE(LWS_GTK2 gtk+-3.0)\n+\tif (LWS_GTK2_FOUND)\n+\t\tlist(APPEND LWS_GTK_INCLUDE_DIRS \u0022${LWS_GTK2_INCLUDE_DIRS}\u0022)\n+\t\tlist(APPEND LWS_GTK_LIBRARIES \u0022${LWS_GTK2_LIBRARIES}\u0022)\n+\tendif()\n+\tmessage(\u0022gtk include dir: ${LWS_GTK_INCLUDE_DIRS}\u0022)\n+\tmessage(\u0022gtk libraries: ${LWS_GTK_LIBRARIES}\u0022)\n+\tinclude_directories(\u0022${LWS_GTK_INCLUDE_DIRS}\u0022)\n+\tset(extralibs ${extralibs} ${LWS_GTK_LIBRARIES})\n+\t\n+\t\n+\t\n+\tmessage(\u0022Extra libs: ${extralibs}\u0022)\n+\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${extralibs} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${extralibs} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/gtk/minimal-gtk/README.md b/minimal-examples-lowlevel/gtk/minimal-gtk/README.md\nnew file mode 100644\nindex 0000000..f85e594\n--- /dev/null\n+++ b/minimal-examples-lowlevel/gtk/minimal-gtk/README.md\n@@ -0,0 +1,32 @@\n+# lws minimal http client gtk\n+\n+The application goes to https://warmcat.com and receives the page data,\n+from inside a gtk app using gtk / glib main loop directly.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+\n+```\n+$\n+t1_main: started\n+[2020/02/08 18:04:07:6647] N: Loading client CA for verification ./warmcat.com.cer\n+[2020/02/08 18:04:07:7744] U: Connected to 46.105.127.147, http response: 200\n+[2020/02/08 18:04:07:7762] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2020/02/08 18:04:07:7762] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2020/02/08 18:04:07:7928] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2020/02/08 18:04:07:7929] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2020/02/08 18:04:07:7956] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2020/02/08 18:04:07:7956] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2020/02/08 18:04:07:7956] U: RECEIVE_CLIENT_HTTP_READ: read 1971\n+[2020/02/08 18:04:07:7956] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n+Hello World\n+$\n+```\n+\n+\ndiff --git a/minimal-examples-lowlevel/gtk/minimal-gtk/main.c b/minimal-examples-lowlevel/gtk/minimal-gtk/main.c\nnew file mode 100644\nindex 0000000..56f234c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/gtk/minimal-gtk/main.c\n@@ -0,0 +1,211 @@\n+#include \u003cgtk/gtk.h\u003e\n+#include \u003clibwebsockets.h\u003e\n+\n+static int status \u003d 0;\n+\n+static void\n+print_hello(GtkWidget *widget, gpointer data)\n+{\n+\tg_print(\u0022Hello World\u005cn\u0022);\n+}\n+\n+static void\n+activate(GtkApplication *app, gpointer user_data)\n+{\n+\tGtkWidget *window;\n+\tGtkWidget *button, *bbox;\n+\n+\twindow \u003d gtk_application_window_new(app);\n+\tgtk_window_set_title(GTK_WINDOW(window), \u0022mywindow\u0022);\n+\tgtk_window_set_default_size(GTK_WINDOW(window), 200, 200);\n+\n+\tbbox \u003d gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);\n+\tgtk_container_add(GTK_CONTAINER(window), bbox);\n+\n+\tbutton \u003d gtk_button_new_with_label(\u0022Hello World\u0022);\n+\tg_signal_connect(button, \u0022clicked\u0022, G_CALLBACK(print_hello), NULL);\n+\tg_signal_connect_swapped(button, \u0022clicked\u0022,\n+\t\t\t\t G_CALLBACK(gtk_widget_destroy), window);\n+\tgtk_container_add(GTK_CONTAINER(bbox), button);\n+\n+\tgtk_widget_show_all(window);\n+}\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d mgr-\u003eparent;\n+\tstruct lws_client_connect_info i;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL ||\n+\t target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\tlwsl_notice(\u0022%s: operational\u005cn\u0022, __func__);\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\ti.ssl_connection \u003d LCCSCF_USE_SSL | LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n+\ti.port \u003d 443;\n+\ti.address \u003d \u0022warmcat.com\u0022;\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d \u0022http\u0022;\n+\n+\treturn !lws_client_connect_via_info(\u0026i);\n+}\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buf[128];\n+\n+\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n+\t\t\tstatus \u003d lws_http_client_http_response(wsi);\n+\n+\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n+\t\t\t\t\tbuf, status);\n+\t\t}\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0,\n+\t\t0,\n+\t},\n+\t{ NULL, NULL, 0, 0 }\n+};\n+\n+static gpointer\n+t1_main (gpointer user_data)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tGMainContext *t1_mc \u003d (GMainContext *)user_data;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tvoid *foreign_loops[1];\n+\tGMainLoop *ml;\n+\n+\tg_print(\u0022%s: started\u005cn\u0022, __func__);\n+\n+\tg_main_context_push_thread_default(t1_mc);\n+\n+\tml \u003d g_main_loop_new(t1_mc, FALSE);\n+\n+\t/* attach our lws activities to the main loop of this thread */\n+\n+\tlws_set_log_level(LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, NULL);\n+\tmemset(\u0026info, 0, sizeof info);\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_GLIB;\n+\tinfo.protocols \u003d protocols;\n+\tforeign_loops[0] \u003d (void *)ml;\n+\tinfo.foreign_loops \u003d foreign_loops;\n+\tinfo.register_notifier_list \u003d na;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn NULL;\n+\t}\n+\n+\t/*\n+\t * We created the lws_context and bound it to this thread's main loop,\n+\t * let's run the thread's main loop now...\n+\t */\n+\n+\tg_main_loop_run(ml);\n+\tg_main_loop_unref(ml);\n+\n+\tg_main_context_pop_thread_default(t1_mc);\n+\tg_main_context_unref(t1_mc);\n+\n+\tg_print(\u0022%s: ending\u005cn\u0022, __func__);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn NULL;\n+}\n+\n+int\n+main(int argc, char **argv)\n+{\n+\tGMainContext *t1_mc \u003d g_main_context_new();\n+\tGtkApplication *app;\n+\tGThread *t1;\n+\tint status;\n+\n+\tt1 \u003d g_thread_new (\u0022t1\u0022, t1_main, g_main_context_ref (t1_mc));\n+\t(void)t1;\n+\n+\tapp \u003d gtk_application_new(\u0022org.gtk.example\u0022, G_APPLICATION_FLAGS_NONE);\n+\tg_signal_connect(app, \u0022activate\u0022, G_CALLBACK(activate), NULL);\n+\n+\tstatus \u003d g_application_run(G_APPLICATION(app), argc, argv);\n+\tg_object_unref(app);\n+\n+\treturn status;\n+}\n+\ndiff --git a/minimal-examples-lowlevel/gtk/minimal-gtk/warmcat.com.cer b/minimal-examples-lowlevel/gtk/minimal-gtk/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/gtk/minimal-gtk/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/README.md b/minimal-examples-lowlevel/http-client/README.md\nnew file mode 100644\nindex 0000000..fc56f6c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/README.md\n@@ -0,0 +1,8 @@\n+|name|demonstrates|\n+---|---\n+minimal-http-client-certinfo|Shows how to gain detailed information on the peer certificate\n+minimal-http-client-custom-headers|Shows how to send and receive custom headers (h1 only)\n+minimal-http-client-hugeurl|Sends a \u003e 2.5KB URL to warmcat.com\n+minimal-http-client-multi|Connects to and reads https://warmcat.com, 8 times concurrently\n+minimal-http-client-post|POSTs a form containing an uploaded file and a form variable, and captures the response\n+minimal-http-client|Connects to and reads https://warmcat.com\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-attach/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/CMakeLists.txt\nnew file mode 100644\nindex 0000000..909efca\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-http-client-attach C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-attach)\n+set(SRCS minimal-http-client-attach.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (requirements AND NOT WIN32)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-attach/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/README.md\nnew file mode 100644\nindex 0000000..81d6310\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/README.md\n@@ -0,0 +1,35 @@\n+# lws minimal http client attach\n+\n+This demonstrates how other threads can reach out to an existing lws_context\n+and join its event loop cleanly and safely.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+Pthreads is required on your system.\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-client-attach\n+[2019/12/31 18:30:49:3495] U: main: main thread tid 0x503e1c0\n+[2019/12/31 18:30:50:3584] U: LWS minimal http client attach\n+[2019/12/31 18:30:50:4002] U: lws_create: tid 0x5c41700\n+[2019/12/31 18:30:50:5727] E: callback_ntpc: set up system ops for set_clock\n+[2019/12/31 18:30:50:2110] N: callback_ntpc: Unix time: 1577817053\n+[2019/12/31 18:30:50:2136] U: attach_callback: called from tid 0x5c41700\n+[2019/12/31 18:30:51:8733] U: Connected to 46.105.127.147, http response: 200\n+[2019/12/31 18:30:51:8818] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2019/12/31 18:30:51:8823] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2019/12/31 18:30:51:8846] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2019/12/31 18:30:51:8847] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2019/12/31 18:30:51:8855] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2019/12/31 18:30:51:8856] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2019/12/31 18:30:51:8860] U: RECEIVE_CLIENT_HTTP_READ: read 1971\n+[2019/12/31 18:30:51:8873] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n+[2019/12/31 18:30:51:9629] U: main: finished\n+```\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-attach/minimal-http-client-attach.c b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/minimal-http-client-attach.c\nnew file mode 100644\nindex 0000000..460f946\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/minimal-http-client-attach.c\n@@ -0,0 +1,276 @@\n+/*\n+ * lws-minimal-http-client-attach\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates how to use the lws_system (*attach) api to allow a\n+ * different thread to arrange to join an existing lws event loop safely. The\n+ * attached stuff does an http client GET from the lws event loop, even though\n+ * it was originally requested from a different thread than the lws event loop.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+static struct lws_context *context;\n+static pthread_t lws_thread;\n+static pthread_mutex_t lock;\n+static int interrupted, bad \u003d 1, status;\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buf[128];\n+\n+\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n+\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\n+\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n+\t\t\t\t\tbuf, status);\n+\t\t}\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+\n+#if 0 /* enable to dump the html */\n+\t\t{\n+\t\t\tconst char *p \u003d in;\n+\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p \u003c 0x7f)\n+\t\t\t\t\tputchar(*p++);\n+\t\t\t\telse\n+\t\t\t\t\tputchar('.');\n+\t\t}\n+#endif\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static void\n+attach_callback(struct lws_context *context, int tsi, void *opaque)\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\t/*\n+\t * Even though it was asked for from a different thread, we are called\n+\t * back by lws from the lws event loop thread context\n+\t *\n+\t * We can set up our operations on the lws event loop and return so\n+\t * they can happen asynchronously\n+\t */\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n+\ti.port \u003d 443;\n+\ti.address \u003d \u0022warmcat.com\u0022;\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\n+\tlws_client_connect_via_info(\u0026i);\n+}\n+\n+\n+static int\n+lws_attach_with_pthreads_locking(struct lws_context *context, int tsi,\n+\t\t\t\t lws_attach_cb_t cb, lws_system_states_t state,\n+\t\t\t\t void *opaque, struct lws_attach_item **get)\n+{\n+\tint n;\n+\n+\tpthread_mutex_lock(\u0026lock);\n+\t/*\n+\t * We just provide system-specific locking around the lws non-threadsafe\n+\t * helper that adds and removes things from the pt list\n+\t */\n+\tn \u003d __lws_system_attach(context, tsi, cb, state, opaque, get);\n+\tpthread_mutex_unlock(\u0026lock);\n+\n+\treturn n;\n+}\n+\n+\n+lws_system_ops_t ops \u003d {\n+\t.attach \u003d lws_attach_with_pthreads_locking\n+};\n+\n+/*\n+ * We made this into a different thread to model it being run from completely\n+ * different codebase that's all linked together\n+ */\n+\n+static void *\n+lws_create(void *d)\n+{\n+\tstruct lws_context_creation_info info;\n+\n+ lwsl_user(\u0022%s: tid %p\u005cn\u0022, __func__, (void *)(intptr_t)pthread_self());\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.system_ops \u003d \u0026ops;\n+\tinfo.protocols \u003d protocols;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* start the event loop */\n+\n+\twhile (!interrupted)\n+\t\tif (lws_service(context, 0))\n+\t\t\tinterrupted \u003d 1;\n+\n+\tlws_context_destroy(context);\n+\n+bail:\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tconst char *p;\n+\tvoid *retval;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http client attach\u005cn\u0022);\n+\n+\tpthread_mutex_init(\u0026lock, NULL);\n+\n+\t/*\n+\t * The idea of the example is we're going to split the lws context and\n+\t * event loop off to be created from its own thread... this is like it\n+\t * was actually started by some completely different code...\n+\t */\n+\n+\tif (pthread_create(\u0026lws_thread, NULL, lws_create, NULL)) {\n+\t\tlwsl_err(\u0022thread creation failed\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\t/*\n+\t * Now on the original / different thread representing a different\n+\t * codebase that wants to join this existing event loop, we'll ask to\n+\t * get a callback from the event loop context when the event loop\n+\t * thread is operational. We have to wait around a bit because we\n+\t * may run before the lws context was created.\n+\t */\n+\n+\twhile (!context \u0026\u0026 n++ \u003c 30)\n+\t\tusleep(10000);\n+\n+\tif (!context) {\n+\t\tlwsl_err(\u0022%s: context didn't start\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * From our different, non event loop thread, ask for our attach\n+\t * callback to get called when lws system state is OPERATIONAL\n+\t */\n+\n+\tlws_system_get_ops(context)-\u003eattach(context, 0, attach_callback,\n+\t\t\t\t\t LWS_SYSTATE_OPERATIONAL,\n+\t\t\t\t\t NULL, NULL);\n+\n+\t/*\n+\t * That's all we wanted to do with our thread. Just wait for the lws\n+\t * thread to exit as well.\n+\t */\n+\n+bail:\n+\tpthread_join(lws_thread, \u0026retval);\n+bail1:\n+\tpthread_mutex_destroy(\u0026lock);\n+\n+\tlwsl_user(\u0022%s: finished\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/CMakeLists.txt\nnew file mode 100644\nindex 0000000..e7be79a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/CMakeLists.txt\n@@ -0,0 +1,27 @@\n+project(lws-minimal-http-client-captive-portal C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-captive-portal)\n+set(SRCS minimal-http-client-captive-portal.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (NOT WIN32 AND requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared pthread ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets pthread ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/README.md\nnew file mode 100644\nindex 0000000..8db2002\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/README.md\n@@ -0,0 +1,45 @@\n+# lws minimal http client captive portal detect\n+\n+This demonstrates how to perform captive portal detection integrated\n+with `lws_system` states.\n+\n+After reaching the `lws_system` DHCP state, the application tries to\n+connect through to `http://connectivitycheck.android.com/generate_204`\n+over http... if it succeeds, it will get a 204 response and set the\n+captive portal detection state to `LWS_CPD_INTERNET_OK` and perform\n+a GET from warmcat.com.\n+\n+If there is a problem detected, the captive portal detection state is\n+set accordingly and the app will respond by exiting without trying the\n+read from warmcat.com.\n+\n+The captive portal detection scheme is implemented in the user code\n+and can be modified according to the strategy that's desired for\n+captive portal detection.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+$ ./bin/lws-minimal-http-client-captive-portal\n+[2020/03/11 13:07:07:4519] U: LWS minimal http client captive portal detect\n+[2020/03/11 13:07:07:4519] N: lws_create_context: using ss proxy bind '(null)', port 0, ads '(null)'\n+[2020/03/11 13:07:07:5022] U: callback_cpd_http: established with resp 204\n+[2020/03/11 13:07:07:5023] U: app_system_state_nf: OPERATIONAL, cpd 1\n+[2020/03/11 13:07:07:5896] U: Connected to 46.105.127.147, http response: 200\n+[2020/03/11 13:07:07:5931] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2020/03/11 13:07:07:5931] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2020/03/11 13:07:07:6092] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2020/03/11 13:07:07:6092] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2020/03/11 13:07:07:6112] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n+[2020/03/11 13:07:07:6113] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n+[2020/03/11 13:07:07:6113] U: RECEIVE_CLIENT_HTTP_READ: read 2657\n+[2020/03/11 13:07:07:6113] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n+[2020/03/11 13:07:07:6119] U: main: finished OK\n+```\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c\nnew file mode 100644\nindex 0000000..d9a00bc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c\n@@ -0,0 +1,321 @@\n+/*\n+ * lws-minimal-http-client-captive-portal\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates how to use the lws_system captive portal detect integration\n+ *\n+ * We check for a captive portal by doing a GET from\n+ * http://connectivitycheck.android.com/generate_204, if we really are going\n+ * out on the Internet he'll return with a 204 response code and we will\n+ * understand there's no captive portal. If we get something else, we take it\n+ * there is a captive portal.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static struct lws_context *context;\n+static int interrupted, bad \u003d 1, status;\n+static lws_state_notify_link_t nl;\n+\n+/*\n+ * this is the user code http handler\n+ */\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buf[128];\n+\n+\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n+\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\n+\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n+\t\t\t\t\tbuf, status);\n+\t\t}\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+\n+#if 0 /* enable to dump the html */\n+\t\t{\n+\t\t\tconst char *p \u003d in;\n+\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p \u003c 0x7f)\n+\t\t\t\t\tputchar(*p++);\n+\t\t\t\telse\n+\t\t\t\t\tputchar('.');\n+\t\t}\n+#endif\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+/*\n+ * This is the platform's custom captive portal detection handler\n+ */\n+\n+static int\n+callback_cpd_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t void *user, void *in, size_t len)\n+{\n+\tint resp;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tresp \u003d (int)lws_http_client_http_response(wsi);\n+\t\tif (!resp)\n+\t\t\tbreak;\n+\t\tlwsl_user(\u0022%s: established with resp %d\u005cn\u0022, __func__, resp);\n+\t\tswitch (resp) {\n+\n+\t\tcase HTTP_STATUS_NO_CONTENT:\n+\t\t\t/*\n+\t\t\t * We got the 204 which is used to distinguish the real\n+\t\t\t * endpoint\n+\t\t\t */\n+\t\t\tlws_system_cpd_set(lws_get_context(wsi),\n+\t\t\t\t\t LWS_CPD_INTERNET_OK);\n+\t\t\treturn 0;\n+\n+\t\t/* also case HTTP_STATUS_OK: ... */\n+\t\tdefault:\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/* fallthru */\n+\n+\tcase LWS_CALLBACK_CLIENT_HTTP_REDIRECT:\n+\t\tlws_system_cpd_set(lws_get_context(wsi), LWS_CPD_CAPTIVE_PORTAL);\n+\t\t/* don't follow it, just report it */\n+\t\treturn 1;\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\t/* only the first result counts */\n+\t\tlws_system_cpd_set(lws_get_context(wsi), LWS_CPD_NO_INTERNET);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0, 0, 0, NULL, 0\n+\t}, {\n+\t\t\u0022lws-cpd-http\u0022,\n+\t\tcallback_cpd_http,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+/*\n+ * This triggers our platform implementation of captive portal detection, the\n+ * actual test can be whatever you need.\n+ *\n+ * In this example, we detect it using Android's\n+ *\n+ * http://connectivitycheck.android.com/generate_204\n+ *\n+ * and seeing if we get an http 204 back.\n+ */\n+\n+static int\n+captive_portal_detect_request(struct lws_context *context)\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof i);\n+\ti.context \u003d context;\n+\ti.port \u003d 80;\n+\ti.address \u003d \u0022connectivitycheck.android.com\u0022;\n+\ti.path \u003d \u0022/generate_204\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d \u0022lws-cpd-http\u0022;\n+\n+\treturn !lws_client_connect_via_info(\u0026i);\n+}\n+\n+\n+lws_system_ops_t ops \u003d {\n+\t.captive_portal_detect_request \u003d captive_portal_detect_request\n+};\n+\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *cx \u003d lws_system_context_from_system_mgr(mgr);\n+\n+\tswitch (target) {\n+\tcase LWS_SYSTATE_CPD_PRE_TIME:\n+\t\tif (lws_system_cpd_state_get(cx))\n+\t\t\treturn 0; /* allow it */\n+\n+\t\tlwsl_info(\u0022%s: LWS_SYSTATE_CPD_PRE_TIME\u005cn\u0022, __func__);\n+\t\tlws_system_cpd_start(cx);\n+\t\t/* we'll move the state on when we get a result */\n+\t\treturn 1;\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\t\t\tstruct lws_client_connect_info i;\n+\n+\t\t\tlwsl_user(\u0022%s: OPERATIONAL, cpd %d\u005cn\u0022, __func__,\n+\t\t\t\t\tlws_system_cpd_state_get(cx));\n+\n+\t\t\t/*\n+\t\t\t * When we reach the OPERATIONAL lws_system state, we\n+\t\t\t * can do our main job knowing we have DHCP, ntpclient,\n+\t\t\t * captive portal testing done.\n+\t\t\t */\n+\n+\t\t\tif (lws_system_cpd_state_get(cx) !\u003d LWS_CPD_INTERNET_OK) {\n+\t\t\t\tlwsl_warn(\u0022%s: There's no internet...\u005cn\u0022, __func__);\n+\t\t\t\tinterrupted \u003d 1;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tmemset(\u0026i, 0, sizeof i);\n+\t\t\ti.context \u003d context;\n+\t\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\t\t\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n+\t\t\ti.port \u003d 443;\n+\t\t\ti.address \u003d \u0022warmcat.com\u0022;\n+\t\t\ti.path \u003d \u0022/\u0022;\n+\t\t\ti.host \u003d i.address;\n+\t\t\ti.origin \u003d i.address;\n+\t\t\ti.method \u003d \u0022GET\u0022;\n+\n+\t\t\ti.protocol \u003d protocols[0].name;\n+\n+\t\t\tlws_client_connect_via_info(\u0026i);\n+\t\t\tbreak;\n+\t\t}\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+/*\n+ * We made this into a different thread to model it being run from completely\n+ * different codebase that's all linked together\n+ */\n+\n+\n+int main(int argc, const char **argv)\n+{\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http client captive portal detect\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.system_ops \u003d \u0026ops;\n+\tinfo.protocols \u003d protocols;\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (!interrupted)\n+\t\tif (lws_service(context, 0))\n+\t\t\tinterrupted \u003d 1;\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022%s: finished %s\u005cn\u0022, __func__, bad ? \u0022FAIL\u0022: \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/CMakeLists.txt\nnew file mode 100644\nindex 0000000..07ff4e2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-client-certinfo C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-certinfo)\n+set(SRCS minimal-http-client-certinfo.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/README.md\nnew file mode 100644\nindex 0000000..ff6ada4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/README.md\n@@ -0,0 +1,77 @@\n+# lws minimal http client certinfo\n+\n+This demonstrates how to dump information from the peer\n+certificate largely independent of the tls backend.\n+\n+The application goes to https://warmcat.com and receives the page data.\n+\n+Before receiving the page it dumps information on the server's cert.\n+\n+This works independently of the tls backend being OpenSSL or mbedTLS.\n+\n+However the public keys cannot be compared between the two tls\n+backends, since they produce different representations.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-l| Connect to https://localhost:7681 and accept selfsigned cert\n+--h1|Specify http/1.1 only using ALPN, rejects h2 even if server supports it\n+\n+```\n+ $ ./lws-minimal-http-client-certinfo\n+[2018/04/05 21:39:26:5882] USER: LWS minimal http client\n+[2018/04/05 21:39:26:5897] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 on\n+[2018/04/05 21:39:26:5955] NOTICE: created client ssl context for default\n+[2018/04/05 21:39:28:0824] NOTICE: lws_http_client_http_response 200\n+[2018/04/05 21:39:28:0824] NOTICE: Peer Cert CN : warmcat.com\n+[2018/04/05 21:39:28:0824] NOTICE: Peer Cert issuer : /C\u003dGB/ST\u003dGreater Manchester/L\u003dSalford/O\u003dCOMODO CA Limited\n+[2018/04/05 21:39:28:0825] NOTICE: Peer Cert Valid from: Mon Nov 3 00:00:00 2014\n+[2018/04/05 21:39:28:0825] NOTICE: Peer Cert Valid to : Sat Nov 2 23:59:59 2019\n+[2018/04/05 21:39:28:0825] NOTICE: Peer Cert usage bits: 0xa0\n+[2018/04/05 21:39:28:0825] NOTICE: Peer Cert public key:\n+[2018/04/05 21:39:28:0825] NOTICE: \n+[2018/04/05 21:39:28:0825] NOTICE: 0000: 30 82 01 22 30 0D 06 09 2A 86 48 86 F7 0D 01 01 0..\u00220...*.H.....\n+[2018/04/05 21:39:28:0825] NOTICE: 0010: 01 05 00 03 82 01 0F 00 30 82 01 0A 02 82 01 01 ........0.......\n+[2018/04/05 21:39:28:0825] NOTICE: 0020: 00 EC 39 C1 98 25 A8 99 AC 01 9B D2 16 C0 CA A3 ..9..%..........\n+[2018/04/05 21:39:28:0825] NOTICE: 0030: 0E 19 57 E5 3D 23 F3 79 7E 63 BF CD B8 88 D1 16 ..W.\u003d#.y~c......\n+[2018/04/05 21:39:28:0825] NOTICE: 0040: C6 F0 A6 ED 66 CB F3 C3 D6 7E A7 A3 AB 00 0A 3E ....f....~.....\u003e\n+[2018/04/05 21:39:28:0825] NOTICE: 0050: AD EF 20 44 85 5A 61 F0 71 20 BD E3 D1 4B B6 53 .. D.Za.q ...K.S\n+[2018/04/05 21:39:28:0825] NOTICE: 0060: 57 AA 81 E6 ED 74 36 40 E7 FC 62 24 AD E8 82 1D W....t6@..b$....\n+[2018/04/05 21:39:28:0826] NOTICE: 0070: 89 C4 3D 64 6C A8 34 4B DB FB DD 7D D2 2D FB 86 ..\u003ddl.4K...}.-..\n+[2018/04/05 21:39:28:0826] NOTICE: 0080: 97 EA 6B E2 C9 39 D6 19 DE A8 90 E7 86 8F CF 0A ..k..9..........\n+[2018/04/05 21:39:28:0826] NOTICE: 0090: CD 09 3C AF FB 0A FF 85 E8 93 D1 4B A0 C5 21 AD ..\u003c........K..!.\n+[2018/04/05 21:39:28:0826] NOTICE: 00A0: 58 52 30 0E 4B FE 4F C8 01 B9 BD 0F D4 E4 64 7B XR0.K.O.......d{\n+[2018/04/05 21:39:28:0826] NOTICE: 00B0: 04 B4 D2 68 69 8F F1 D5 FD B0 1A CE 55 43 08 B7 ...hi.......UC..\n+[2018/04/05 21:39:28:0826] NOTICE: 00C0: 9F 57 0D 4E E1 CA E8 5C B4 2A 6B AB 05 B5 57 67 .W.N...\u005c.*k...Wg\n+[2018/04/05 21:39:28:0826] NOTICE: 00D0: B8 FD 20 F4 4F 6B 0E 47 7C AD EB B4 99 2C 9B 53 .. .Ok.G|....,.S\n+[2018/04/05 21:39:28:0826] NOTICE: 00E0: DF EA 67 8D 8A 9D A7 17 01 F9 4E BD 56 43 50 53 ..g.......N.VCPS\n+[2018/04/05 21:39:28:0826] NOTICE: 00F0: 08 4E FE 6A 85 4A 4D 45 03 DA 01 00 96 7A C0 A9 .N.j.JME.....z..\n+[2018/04/05 21:39:28:0826] NOTICE: 0100: C2 32 5E 1A 9F 6F 7B E2 02 5E 70 12 D3 8E 76 6A .2^..o{..^p...vj\n+[2018/04/05 21:39:28:0826] NOTICE: 0110: 0B 59 A4 D7 31 9D C6 86 08 53 2E 02 8A 1E B1 FB .Y..1....S......\n+[2018/04/05 21:39:28:0826] NOTICE: 0120: 7B 02 03 01 00 01 {..... \n+[2018/04/05 21:39:28:0826] NOTICE: \n+[2018/04/05 21:39:28:0829] USER: RECEIVE_CLIENT_HTTP_READ: read 503\n+[2018/04/05 21:39:28:0829] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n+[2018/04/05 21:39:28:0829] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n+[2018/04/05 21:39:28:0829] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n+...\n+[2018/04/05 21:39:28:3777] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n+[2018/04/05 21:39:28:3777] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n+[2018/04/05 21:39:28:3778] USER: RECEIVE_CLIENT_HTTP_READ: read 503\n+[2018/04/05 21:39:28:3778] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n+[2018/04/05 21:39:28:3778] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n+[2018/04/05 21:39:28:3778] USER: RECEIVE_CLIENT_HTTP_READ: read 471\n+[2018/04/05 21:39:28:3778] USER: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n+[2018/04/05 21:39:28:3787] USER: Completed\n+```\n+\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c\nnew file mode 100644\nindex 0000000..9f3bf04\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c\n@@ -0,0 +1,256 @@\n+/*\n+ * lws-minimal-http-client\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there. You\n+ * can dump the page data by changing the #if 0 below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, status;\n+static struct lws *client_wsi;\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tuint8_t buf[1280];\n+\tunion lws_tls_cert_info_results *ci \u003d\n+\t\t(union lws_tls_cert_info_results *)buf;\n+#if defined(LWS_HAVE_CTIME_R)\n+\tchar date[32];\n+#endif\n+\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tclient_wsi \u003d NULL;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\t\tlwsl_notice(\u0022lws_http_client_http_response %d\u005cn\u0022, status);\n+\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_COMMON_NAME,\n+\t\t\t\t\t ci, sizeof(buf) - sizeof(*ci)))\n+\t\t\tlwsl_notice(\u0022 Peer Cert CN : %s\u005cn\u0022, ci-\u003ens.name);\n+\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_ISSUER_NAME,\n+\t\t\t\t\t ci, sizeof(ci-\u003ens.name)))\n+\t\t\tlwsl_notice(\u0022 Peer Cert issuer : %s\u005cn\u0022, ci-\u003ens.name);\n+\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_VALIDITY_FROM,\n+\t\t\t\t\t ci, 0))\n+#if defined(LWS_HAVE_CTIME_R)\n+\t\t\tlwsl_notice(\u0022 Peer Cert Valid from: %s\u0022, \n+\t\t\t\t\t\tctime_r(\u0026ci-\u003etime, date));\n+#else\n+\t\t\tlwsl_notice(\u0022 Peer Cert Valid from: %s\u0022, \n+\t\t\t\t\t\tctime(\u0026ci-\u003etime));\n+#endif\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_VALIDITY_TO,\n+\t\t\t\t\t ci, 0))\n+#if defined(LWS_HAVE_CTIME_R)\n+\t\t\tlwsl_notice(\u0022 Peer Cert Valid to : %s\u0022,\n+\t\t\t\t\t\tctime_r(\u0026ci-\u003etime, date));\n+#else\n+\t\t\tlwsl_notice(\u0022 Peer Cert Valid to : %s\u0022,\n+\t\t\t\t\t\tctime(\u0026ci-\u003etime));\n+#endif\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_USAGE,\n+\t\t\t\t\t ci, 0))\n+\t\t\tlwsl_notice(\u0022 Peer Cert usage bits: 0x%x\u005cn\u0022, ci-\u003eusage);\n+\t\tif (!lws_tls_peer_cert_info(wsi,\n+\t\t\t\t\t LWS_TLS_CERT_INFO_OPAQUE_PUBLIC_KEY,\n+\t\t\t\t\t ci, sizeof(buf) - sizeof(*ci))) {\n+\t\t\tlwsl_notice(\u0022 Peer Cert public key:\u005cn\u0022);\n+\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (unsigned int)ci-\u003ens.len);\n+\t\t}\n+\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID,\n+\t\t\t\t\t ci, 0)) {\n+\t\t\tlwsl_notice(\u0022 AUTHORITY_KEY_ID\u005cn\u0022);\n+\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (size_t)ci-\u003ens.len);\n+\t\t}\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID_ISSUER,\n+\t\t\t\t\t ci, 0)) {\n+\t\t\tlwsl_notice(\u0022 AUTHORITY_KEY_ID ISSUER\u005cn\u0022);\n+\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (size_t)ci-\u003ens.len);\n+\t\t}\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID_SERIAL,\n+\t\t\t\t\t ci, 0)) {\n+\t\t\tlwsl_notice(\u0022 AUTHORITY_KEY_ID SERIAL\u005cn\u0022);\n+\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (size_t)ci-\u003ens.len);\n+\t\t}\n+\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_SUBJECT_KEY_ID,\n+\t\t\t\t\t ci, 0)) {\n+\t\t\tlwsl_notice(\u0022 AUTHORITY_KEY_ID SUBJECT_KEY_ID\u005cn\u0022);\n+\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (size_t)ci-\u003ens.len);\n+\t\t}\n+\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+#if 0 /* enable to dump the html */\n+\t\t{\n+\t\t\tconst char *p \u003d in;\n+\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p \u003c 0x7f)\n+\t\t\t\t\tputchar(*p++);\n+\t\t\t\telse\n+\t\t\t\t\tputchar('.');\n+\t\t}\n+#endif\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tclient_wsi \u003d NULL;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tclient_wsi \u003d NULL;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_client_connect_info i;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t /*\n+\t\t * For LLL_ verbosity above NOTICE to be built into lws,\n+\t\t * lws must have been configured and built with\n+\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE\n+\t\t *\n+\t\t * | LLL_INFO | LLL_PARSER | LLL_HEADER | LLL_EXT |\n+\t\t * LLL_CLIENT | LLL_LATENCY | LLL_DEBUG\n+\t\t */ ;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http client [\u003c-d \u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022warmcat.com\u0022;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022)))\n+\t\ti.address \u003d p;\n+\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\n+\t/* force h1 even if h2 available */\n+\tif (lws_cmdline_option(argc, argv, \u0022--h1\u0022))\n+\t\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\ti.pwsi \u003d \u0026client_wsi;\n+\tlws_client_connect_via_info(\u0026i);\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 client_wsi \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/CMakeLists.txt\nnew file mode 100644\nindex 0000000..0a69c0b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-client-custom-headers C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-custom-headers)\n+set(SRCS minimal-http-client-custom-headers.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/README.md\nnew file mode 100644\nindex 0000000..ac49a87\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/README.md\n@@ -0,0 +1,45 @@\n+# lws minimal http client custom headers\n+\n+This http client application shows how to send and receive custom headers.\n+\n+This currently only works on http 1, so the app forces that even if h2 enables.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-l| Connect to https://localhost:7681 and accept selfsigned cert\n+-n|no TLS\n+\n+The app looks for a custom header \u0022test-custom-header\u0022 sent by warmcat.com.\n+\n+```\n+ $ ./lws-minimal-http-client-custom-headers\n+[2019/03/11 05:46:45:7582] USER: LWS minimal http client Custom Headers [-d\u003cverbosity\u003e] [-l] [--h1]\n+[2019/03/11 05:46:45:7671] NOTICE: created client ssl context for default\n+[2019/03/11 05:46:46:7812] USER: Connected with server response: 200\n+[2019/03/11 05:46:46:7812] NOTICE: callback_http: custom header: 'hello'\n+[2019/03/11 05:46:46:7814] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+...\n+```\n+You can use the -n and -l to make this test app connect to localhost:7681 over http,\n+and confirm the \u0022dnt:1\u0022 header was sent either by tcpdump or by running the test\n+server on :7681 with -d1151\n+\n+```\n+[2019/03/11 05:48:53:6806] PARSER: WSI_TOKEN_NAME_PART 'd' 0x64 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d0\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role\u003d0x20000000) wsi-\u003elextable_pos\u003d567\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART 't' 0x74 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART ' ' 0x20 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART '1' 0x31 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n+' 0x0D (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1NAME_PART '\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART '\n+```\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c\nnew file mode 100644\nindex 0000000..6868371\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c\n@@ -0,0 +1,227 @@\n+/*\n+ * lws-minimal-http-client\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there. You\n+ * can dump the page data by changing the #if 0 below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, status;\n+static struct lws *client_wsi;\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tchar val[32];\n+\tint n;\n+\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tclient_wsi \u003d NULL;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:\n+\t{\n+\t\t unsigned char **p \u003d (unsigned char **)in, *end \u003d (*p) + len;\n+\n+\t\t /*\n+\t\t * How to send a custom header in the request to the server\n+\t\t */\n+\n+\t\t if (lws_add_http_header_by_name(wsi,\n+\t\t\t\t (const unsigned char *)\u0022dnt\u0022,\n+\t\t\t\t (const unsigned char *)\u00221\u0022, 1, p, end))\n+\t\t\t return -1;\n+\t\tbreak;\n+\t}\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\t\tlwsl_user(\u0022Connected with server response: %d\u005cn\u0022, status);\n+\n+\t\t/*\n+\t\t * How to query custom headers (http 1.x only at the momemnt)\n+\t\t *\n+\t\t * warmcat.com sends a custom header \u0022test-custom-header\u0022 for\n+\t\t * testing, it has the fixed value \u0022hello\u0022.\n+\t\t */\n+\n+\t\tn \u003d lws_hdr_custom_length(wsi, \u0022test-custom-header:\u0022, 19);\n+\t\tif (n \u003c 0)\n+\t\t\tlwsl_notice(\u0022%s: Can't find test-custom-header\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\telse {\n+\t\t\tif (lws_hdr_custom_copy(wsi, val, sizeof(val),\n+\t\t\t\t\t\t\u0022test-custom-header:\u0022, 19) \u003c 0)\n+\t\t\t\tlwsl_notice(\u0022%s: custom header too long\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\telse\n+\t\t\t\tlwsl_notice(\u0022%s: custom header: '%s'\u005cn\u0022,\n+\t\t\t\t\t\t__func__, val);\n+\t\t}\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+#if 0 /* enable to dump the html */\n+\t\t{\n+\t\t\tconst char *p \u003d in;\n+\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p \u003c 0x7f)\n+\t\t\t\t\tputchar(*p++);\n+\t\t\t\telse\n+\t\t\t\t\tputchar('.');\n+\t\t}\n+#endif\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tclient_wsi \u003d NULL;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tclient_wsi \u003d NULL;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_client_connect_info i;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t /*\n+\t\t * For LLL_ verbosity above NOTICE to be built into lws,\n+\t\t * lws must have been configured and built with\n+\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE\n+\t\t *\n+\t\t * | LLL_INFO | LLL_PARSER | LLL_HEADER | LLL_EXT |\n+\t\t * LLL_CLIENT | LLL_LATENCY | LLL_DEBUG\n+\t\t */ ;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http client Custom Headers [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\n+\tif (!lws_cmdline_option(argc, argv, \u0022-n\u0022))\n+\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022warmcat.com\u0022;\n+\t}\n+\n+\t/* currently custom headers receive only works with h1 */\n+\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\ti.pwsi \u003d \u0026client_wsi;\n+\tlws_client_connect_via_info(\u0026i);\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 client_wsi \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt\nnew file mode 100644\nindex 0000000..d3004fa\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt\n@@ -0,0 +1,35 @@\n+project(lws-minimal-http-client-h2-rxflow C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-h2-rxflow)\n+set(SRCS minimal-http-client.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H2 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\tif (LWS_CTEST_INTERNET_AVAILABLE)\n+\t\tadd_test(NAME http-client-h2-rxflow-warmcat COMMAND lws-minimal-http-client-h2-rxflow)\n+\t\tadd_test(NAME http-client-h2-rxflow-warmcat-h1 COMMAND lws-minimal-http-client-h2-rxflow --h1)\n+\t\tset_tests_properties(http-client-h2-rxflow-warmcat\n+\t\t\t\t http-client-h2-rxflow-warmcat-h1\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow\n+\t\t\t\t TIMEOUT 30)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/README.md\nnew file mode 100644\nindex 0000000..1593d26\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/README.md\n@@ -0,0 +1,53 @@\n+# lws minimal http client-h2-rxflow\n+\n+The application reads from a server with tightly controlled and rate-limited\n+receive flow control using h2 tx credit.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-l| Connect to https://localhost:7681 and accept selfsigned cert\n+--server \u003cname\u003e|set server name to connect to\n+--path \u003cpath\u003e|URL path to access on server\n+-k|Apply tls option LCCSCF_ALLOW_INSECURE\n+-j|Apply tls option LCCSCF_ALLOW_SELFSIGNED\n+-m|Apply tls option LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK\n+-e|Apply tls option LCCSCF_ALLOW_EXPIRED\n+-v|Connection validity use 3s / 10s instead of default 5m / 5m10s\n+--nossl| disable ssl connection\n+-f \u003cinitial credit\u003e|Indicate we will manually manage tx credit and set a new connection-specific initial tx credit\n+\n+RX is constrained to 1024 bytes every 250ms\n+\n+```\n+ $ ./lws-minimal-http-client-h2-rxflow --server phys.org --path \u0022/\u0022 -f 1024\n+[2019/12/26 13:32:59:6801] U: LWS minimal http client [-d\u003cverbosity\u003e] [-l] [--h1]\n+[2019/12/26 13:33:00:5087] N: system_notify_cb: manual peer tx credit 1024\n+[2019/12/26 13:33:01:7390] U: Connected to 72.251.236.55, http response: 200\n+[2019/12/26 13:33:01:7441] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:01:0855] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:02:3367] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:02:5858] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:02:8384] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:02:0886] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+...\n+[2019/12/26 13:33:46:1152] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:47:3650] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:47:6150] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:47:8666] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:47:1154] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:48:3656] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2019/12/26 13:33:48:6157] U: RECEIVE_CLIENT_HTTP_READ: read 380\n+[2019/12/26 13:33:48:6219] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n+[2019/12/26 13:33:48:7050] U: Completed: OK\n+\n+```\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c\nnew file mode 100644\nindex 0000000..dbd04b8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c\n@@ -0,0 +1,304 @@\n+/*\n+ * lws-minimal-http-client-h2-rxflow\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there. You\n+ * can dump the page data by changing the #if 0 below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, status, each \u003d 1024;\n+static struct lws *client_wsi;\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping \u003d 3,\n+\t.secs_since_valid_hangup \u003d 10,\n+};\n+\n+struct pss {\n+\tlws_sorted_usec_list_t sul;\n+\tstruct lws *wsi;\n+};\n+\n+/*\n+ * Once we're established, we ask the server for another 1KB every 250ms\n+ * until we have it all.\n+ */\n+\n+static void\n+drain_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tstruct pss *pss \u003d lws_container_of(sul, struct pss, sul);\n+\n+\tlws_wsi_tx_credit(pss-\u003ewsi, LWSTXCR_PEER_TO_US, each);\n+\n+\tlws_sul_schedule(lws_get_context(pss-\u003ewsi), 0, \u0026pss-\u003esul, drain_cb,\n+\t\t\t 250 * LWS_US_PER_MS);\n+}\n+\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buf[128];\n+\n+\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n+\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\n+\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n+\t\t\t\t\tbuf, status);\n+\t\t}\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tlws_sul_schedule(lws_get_context(wsi), 0, \u0026pss-\u003esul, drain_cb,\n+\t\t\t\t 250 * LWS_US_PER_MS);\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+\n+#if 0 /* enable to dump the html */\n+\t\t{\n+\t\t\tconst char *p \u003d in;\n+\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p \u003c 0x7f)\n+\t\t\t\t\tputchar(*p++);\n+\t\t\t\telse\n+\t\t\t\t\tputchar('.');\n+\t\t}\n+#endif\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_sul_cancel(\u0026pss-\u003esul);\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\tsizeof(struct pss),\n+\t\t0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+struct args {\n+\tint argc;\n+\tconst char **argv;\n+};\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d mgr-\u003eparent;\n+\tstruct lws_client_connect_info i;\n+\tstruct args *a \u003d lws_context_user(context);\n+\tconst char *p;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL || target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\tlwsl_info(\u0022%s: operational\u005cn\u0022, __func__);\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\tif (!lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-n\u0022))\n+\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022warmcat.com\u0022;\n+\t}\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--nossl\u0022))\n+\t\ti.ssl_connection \u003d 0;\n+\n+\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n+\n+\ti.alpn \u003d \u0022h2\u0022;\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--h1\u0022))\n+\t\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-p\u0022)))\n+\t\ti.port \u003d atoi(p);\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-j\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-k\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_INSECURE;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-m\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-e\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_EXPIRED;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-f\u0022))) {\n+\t\ti.ssl_connection |\u003d LCCSCF_H2_MANUAL_RXFLOW;\n+\t\ti.manual_initial_tx_credit \u003d atoi(p);\n+\t\tlwsl_notice(\u0022%s: manual peer tx credit %d\u005cn\u0022, __func__,\n+\t\t\t\ti.manual_initial_tx_credit);\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--each\u0022)))\n+\t\teach \u003d atoi(p);\n+\n+\t/* the default validity check is 5m / 5m10s... -v \u003d 3s / 10s */\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-v\u0022))\n+\t\ti.retry_and_idle_policy \u003d \u0026retry;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--server\u0022)))\n+\t\ti.address \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--path\u0022)))\n+\t\ti.path \u003d p;\n+\telse\n+\t\ti.path \u003d \u0022/\u0022;\n+\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\ti.pwsi \u003d \u0026client_wsi;\n+\n+\treturn !lws_client_connect_via_info(\u0026i);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tstruct args args;\n+\tint n \u003d 0;\n+\t// uint8_t memcert[4096];\n+\n+\targs.argc \u003d argc;\n+\targs.argv \u003d argv;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal http client [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.user \u003d \u0026args;\n+\tinfo.register_notifier_list \u003d na;\n+\tinfo.timeout_secs \u003d 10;\n+\tinfo.connect_timeout_secs \u003d 30;\n+\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+#if 0\n+\tn \u003d open(\u0022./warmcat.com.cer\u0022, O_RDONLY);\n+\tif (n \u003e\u003d 0) {\n+\t\tinfo.client_ssl_ca_mem_len \u003d read(n, memcert, sizeof(memcert));\n+\t\tinfo.client_ssl_ca_mem \u003d memcert;\n+\t\tclose(n);\n+\t\tn \u003d 0;\n+\t\tmemcert[info.client_ssl_ca_mem_len++] \u003d '\u005c0';\n+\t}\n+#endif\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/CMakeLists.txt\nnew file mode 100644\nindex 0000000..25b8236\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/CMakeLists.txt\n@@ -0,0 +1,49 @@\n+project(lws-minimal-http-client-hugeurl C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-hugeurl)\n+set(SRCS minimal-http-client-hugeurl.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE)\n+\n+\t\t#\n+\t\t# creates a fixture res_hchugeurlw to get a lease on the\n+\t\t# server resources\n+\t\t#\n+\t\tsai_resource(warmcat_conns 1 40 hchugeurlw)\n+\t\n+\t\tadd_test(NAME http-client-hugeurl-warmcat COMMAND lws-minimal-http-client-hugeurl )\n+\t\tadd_test(NAME http-client-hugeurl-warmcat-h1 COMMAND lws-minimal-http-client-hugeurl --h1)\n+\t\tset_tests_properties(http-client-hugeurl-warmcat\n+\t\t\t\t http-client-hugeurl-warmcat-h1\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl\n+\t\t\t\t TIMEOUT 20)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(http-client-hugeurl-warmcat\n+\t\t\t\t\t http-client-hugeurl-warmcat-h1\n+\t\t\t\t\t PROPERTIES\n+\t\t\t\t\t\tFIXTURES_REQUIRED \u0022res_hchugeurlw\u0022)\t\n+\t\tendif()\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/README.md\nnew file mode 100644\nindex 0000000..6a7d06d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/README.md\n@@ -0,0 +1,52 @@\n+# lws minimal http client hugeurl\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+The application goes to https://warmcat.com/?fakeparam\u003d\u003c2KB\u003e and receives the page data.\n+\n+```\n+ $ ./lws-minimal-http-client\n+[2018/03/04 14:43:20:8562] USER: LWS minimal http client hugeurl\n+[2018/03/04 14:43:20:8571] NOTICE: Creating Vhost 'default' port -1, 1 protocols, IPv6 on\n+[2018/03/04 14:43:20:8616] NOTICE: created client ssl context for default\n+[2018/03/04 14:43:20:8617] NOTICE: lws_client_connect_2: 0x1814dc0: address warmcat.com\n+[2018/03/04 14:43:21:1496] NOTICE: lws_client_connect_2: 0x1814dc0: address warmcat.com\n+[2018/03/04 14:43:22:0154] NOTICE: lws_client_interpret_server_handshake: incoming content length 26520\n+[2018/03/04 14:43:22:0154] NOTICE: lws_client_interpret_server_handshake: client connection up\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3022] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3022] USER: RECEIVE_CLIENT_HTTP_READ: read 974\n+[2018/03/04 14:43:22:3022] NOTICE: lws_http_client_read: transaction completed says -1\n+[2018/03/04 14:43:23:3042] USER: Completed\n+```\n+\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c\nnew file mode 100644\nindex 0000000..a3cda5d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c\n@@ -0,0 +1,221 @@\n+/*\n+ * lws-minimal-http-client hugeurl\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws.\n+ *\n+ * It visits https://warmcat.com/?fakeparam\u003d\u003c2KB\u003e and receives the html\n+ * page there. You can dump the page data by changing the #if 0 below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, status;\n+static struct lws *client_wsi;\n+\n+static const char * const uri \u003d\n+\t\u0022/?fakeparam\u003d\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022\n+\t\u002200000000000000000000000000000000000000000000000000\u0022 /* 500 */\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022\n+\t\u002211111111111111111111111111111111111111111111111111\u0022 /* 1000 */\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022\n+\t\u002222222222222222222222222222222222222222222222222222\u0022 /* 1500 */\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022\n+\t\u002233333333333333333333333333333333333333333333333333\u0022 /* 2000 */\n+;\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tclient_wsi \u003d NULL;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\t\tlwsl_user(\u0022Connected with server response: %d\u005cn\u0022, status);\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+#if 0 /* enable to dump the html */\n+\t\t{\n+\t\t\tconst char *p \u003d in;\n+\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p \u003c 0x7f)\n+\t\t\t\t\tputchar(*p++);\n+\t\t\t\telse\n+\t\t\t\t\tputchar('.');\n+\t\t}\n+#endif\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tclient_wsi \u003d NULL;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tclient_wsi \u003d NULL;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_client_connect_info i;\n+\tstruct lws_context *context;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal http client hugeurl [-d \u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pt_serv_buf_size \u003d 8192;\n+\tinfo.timeout_secs \u003d 10;\n+\tinfo.connect_timeout_secs \u003d 30;\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022warmcat.com\u0022;\n+\t}\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--h1\u0022))\n+\t\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\ti.path \u003d uri;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\ti.protocol \u003d protocols[0].name;\n+\ti.pwsi \u003d \u0026client_wsi;\n+\n+\tlws_client_connect_via_info(\u0026i);\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 client_wsi \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad? \u0022failed\u0022: \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/CMakeLists.txt\nnew file mode 100644\nindex 0000000..fb968d5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/CMakeLists.txt\n@@ -0,0 +1,157 @@\n+project(lws-minimal-http-client-jit-trust C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-jit-trust)\n+set(SRCS minimal-http-client.c)\n+\n+set(has_fault_injection 1)\n+set(has_h2 1)\n+set(has_plugins 1)\n+set(has_ss_policy_parse 1)\n+set(has_no_system_vhost 1)\n+set(has_async_dns 1)\n+\n+set(requirements 1)\n+\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+require_lws_config(LWS_WITH_TLS_JIT_TRUST 1 requirements)\n+\n+require_lws_config(LWS_ROLE_H2 1 has_h2)\n+require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection)\n+require_lws_config(LWS_WITH_EVLIB_PLUGINS 1 has_plugins)\n+require_lws_config(LWS_WITH_EVENT_LIBS 1 has_plugins)\n+\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 has_ss_policy_parse)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 has_ss_policy_parse)\n+\n+require_lws_config(LWS_WITH_SYS_ASYNC_DNS 0 has_no_system_vhost)\n+require_lws_config(LWS_WITH_SYS_NTPCLIENT 0 has_no_system_vhost)\n+require_lws_config(LWS_WITH_SYS_DHCP_CLIENT 0 has_no_system_vhost)\n+\n+require_lws_config(LWS_WITH_SYS_ASYNC_DNS 1 has_async_dns)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\t\n+\tsai_resource(warmcat_conns 1 40 http_client_warmcat)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE)\n+\t\tset(mytests http-client-warmcat-h1)\n+\t\tif (has_h2)\n+\t\t\tadd_test(NAME http-client-warmcat COMMAND lws-minimal-http-client )\n+\t\t\tlist(APPEND mytests http-client-warmcat)\n+\t\tendif()\n+\n+\n+\t\tadd_test(NAME http-client-warmcat-h1 COMMAND lws-minimal-http-client --h1)\n+\t\t\t\t \n+\t\tif (has_fault_injection)\n+\t\t\n+\t\t\t# creation related faults\n+\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx1)\n+\t\t\tadd_test(NAME http-client-fi-ctx1 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail1\u0022)\n+\t\t\t\n+\t\t\t# if (has_plugins)\n+\t\t\t# !!! need to actually select an available evlib plugin to trigger this\n+\t\t\t#\tlist(APPEND mytests http-client-fi-pi)\n+\t\t\t#\tadd_test(NAME http-client-fi-pi COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_plugin_init\u0022)\n+\t\t\t# endif()\n+\n+\t\t\tlist(APPEND mytests http-client-fi-ctx2)\n+\t\t\tadd_test(NAME http-client-fi-ctx2 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_sel\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx3)\n+\t\t\tadd_test(NAME http-client-fi-ctx3 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_oom_ctx\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx4)\n+\t\t\tadd_test(NAME http-client-fi-ctx4 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_privdrop\u0022)\n+\n+\t\t\tlist(APPEND mytests http-client-fi-ctx5)\n+\t\t\tadd_test(NAME http-client-fi-ctx5 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_maxfds\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx6)\n+\t\t\tadd_test(NAME http-client-fi-ctx6 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_oom_fds\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx7)\n+\t\t\tadd_test(NAME http-client-fi-ctx7 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_plat_init\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx8)\n+\t\t\tadd_test(NAME http-client-fi-ctx8 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_init\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx9)\n+\t\t\tadd_test(NAME http-client-fi-ctx9 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_pt\u0022)\n+\t\t\t\n+\t\t\tif (NOT has_no_system_vhost)\n+\t\t\t\n+\t\t\t\tlist(APPEND mytests http-client-fi-ctx10)\n+\t\t\t\tadd_test(NAME http-client-fi-ctx10 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_sys_vh\u0022)\n+\t\t\t\n+\t\t\t\tlist(APPEND mytests http-client-fi-ctx11)\n+\t\t\t\tadd_test(NAME http-client-fi-ctx11 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_sys_vh_init\u0022)\n+\t\t\t\t\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx12)\n+\t\t\tadd_test(NAME http-client-fi-ctx12 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_def_vh\u0022)\n+\t\t\t\n+\n+\t\t\tlist(APPEND mytests http-client-fi-vh1)\n+\t\t\tadd_test(NAME http-client-fi-vh1 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_oom\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-vh2)\n+\t\t\tadd_test(NAME http-client-fi-vh2 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_pcols_oom\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-vh3)\n+\t\t\tadd_test(NAME http-client-fi-vh3 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_ssl_srv\u0022)\n+\n+\t\t\tlist(APPEND mytests http-client-fi-vh4)\n+\t\t\tadd_test(NAME http-client-fi-vh4 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_ssl_cli\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-vh5)\n+\t\t\tadd_test(NAME http-client-fi-vh5 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_srv_init\u0022)\n+\n+\n+\t\t\tlist(APPEND mytests http-client-fi-dnsfail)\n+\t\t\tadd_test(NAME http-client-fi-dnsfail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection \u0022wsi\u003duser/dnsfail\u0022)\n+\t\t\t\n+\t\t\tif (has_async_dns)\n+\t\t\t\tlist(APPEND mytests http-client-fi-connfail)\n+\t\t\t\tadd_test(NAME http-client-fi-connfail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection \u0022wsi\u003duser/connfail\u0022)\n+\t\t\telse()\n+\t\t\t\tlist(APPEND mytests http-client-fi-connfail)\n+\t\t\t\tadd_test(NAME http-client-fi-connfail COMMAND lws-minimal-http-client --expected-exit 2 --fault-injection \u0022wsi\u003duser/connfail\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-user-est-fail)\n+\t\t\tadd_test(NAME http-client-fi-user-est-fail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection \u0022wsi/user_reject_at_est\u0022)\t\n+\t\t\n+\t\t\t\n+\t\tendif()\n+\t\t\n+\t\tset_tests_properties(${mytests} PROPERTIES\n+\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client\n+\t\t TIMEOUT 20)\n+\t\t\t\t \n+ \t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(${mytests} PROPERTIES\n+\t\t\t\t\t FIXTURES_REQUIRED \u0022res_http_client_warmcat\u0022)\n+\t\tendif()\t\t\n+\t\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/README.md\nnew file mode 100644\nindex 0000000..024f739\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/README.md\n@@ -0,0 +1,96 @@\n+# lws minimal http client JIT Trust\n+\n+This example turns off any existing trusted CAs and then tries to connect to a server, by default, warmcat.com.\n+\n+It validates the remote certificates using trusted CAs from a JIT Trust blob compiled into the code.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-l| Connect to https://localhost:7681 and accept selfsigned cert\n+--h1|Specify http/1.1 only using ALPN, rejects h2 even if server supports it\n+--server \u003cname\u003e|set server name to connect to\n+-k|Apply tls option LCCSCF_ALLOW_INSECURE\n+-j|Apply tls option LCCSCF_ALLOW_SELFSIGNED\n+-m|Apply tls option LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK\n+-e|Apply tls option LCCSCF_ALLOW_EXPIRED\n+-v|Connection validity use 3s / 10s instead of default 5m / 5m10s\n+--nossl| disable ssl connection\n+--user \u003cusername\u003e| Set Basic Auth username\n+--password \u003cpassword\u003e | Set Basic Auth password\n+\n+```\n+ $ ./bin/lws-minimal-http-client-jit-trust --h1 --server ebay.com --path /\n+\u003d\u003d1302866\u003d\u003d \n+[2021/06/17 14:33:54:7500] U: LWS minimal http client JIT Trust [-d\u003cverbosity\u003e] [-l] [--h1]\n+[2021/06/17 14:33:54:7956] N: LWS: 4.2.99-v4.2.0-70-g80e7e39bae, loglevel 1031\n+[2021/06/17 14:33:54:7960] N: NET CLI SRV H1 H2 WS MbedTLS ConMon IPv6-absent\n+[2021/06/17 14:33:54:8165] N: ++ [wsi|0|pipe] (1)\n+[2021/06/17 14:33:54:8227] N: ++ [vh|0|netlink] (1)\n+[2021/06/17 14:33:54:8319] N: ++ [vh|1|default||-1] (2)\n+[2021/06/17 14:33:55:0107] N: ++ [wsicli|0|GET/h1/ebay.com] (1)\n+[2021/06/17 14:33:56:0291] N: ++ [vh|2|jitt-7F69A044||-1] (3)\n+[2021/06/17 14:33:56:0355] E: CLIENT_CONNECTION_ERROR: server's cert didn't look good, invalidca (use_ssl 0x20000061) X509_V_ERR \u003d 24: CA is not trusted\n+\n+[2021/06/17 14:33:56:0376] N: ++ [wsicli|1|GET/h1/ebay.com] (2)\n+[2021/06/17 14:33:56:0746] N: -- [wsicli|0|GET/h1/ebay.com] (1) 1.061s\n+[2021/06/17 14:33:56:7555] N: lws_client_reset: REDIRECT www.ebay.com:443, path\u003d'/', ssl \u003d 1, alpn\u003d'http/1.1'\n+[2021/06/17 14:33:57:0205] N: ++ [vh|3|jitt-DFF2B5B4||-1] (4)\n+[2021/06/17 14:33:57:0208] E: CLIENT_CONNECTION_ERROR: server's cert didn't look good, invalidca (use_ssl 0x1) X509_V_ERR \u003d 24: CA is not trusted\n+\n+[2021/06/17 14:33:57:0210] N: ++ [wsicli|2|GET/h1/ebay.com] (2)\n+[2021/06/17 14:33:57:0288] N: -- [wsicli|1|GET/h1/ebay.com] (1) 991.119ms\n+[2021/06/17 14:33:57:7528] N: lws_client_reset: REDIRECT www.ebay.com:443, path\u003d'/', ssl \u003d 1, alpn\u003d'http/1.1'\n+[2021/06/17 14:33:58:1564] U: Connected to 195.95.193.127, http response: 200\n+[2021/06/17 14:33:58:1637] U: RECEIVE_CLIENT_HTTP_READ: read 209\n+[2021/06/17 14:33:58:1796] U: RECEIVE_CLIENT_HTTP_READ: read 197\n+[2021/06/17 14:33:58:1822] U: RECEIVE_CLIENT_HTTP_READ: read 1014\n+[2021/06/17 14:33:58:1847] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:1851] U: RECEIVE_CLIENT_HTTP_READ: read 1022\n+[2021/06/17 14:33:58:2748] U: RECEIVE_CLIENT_HTTP_READ: read 242\n+[2021/06/17 14:33:58:2782] U: RECEIVE_CLIENT_HTTP_READ: read 1014\n+[2021/06/17 14:33:58:2784] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:2785] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+...\n+[2021/06/17 14:33:58:4661] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4662] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4663] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4664] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4665] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4666] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4667] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4668] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4669] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4670] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4671] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4672] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2021/06/17 14:33:58:4673] U: RECEIVE_CLIENT_HTTP_READ: read 286\n+[2021/06/17 14:33:58:4690] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n+[2021/06/17 14:33:58:4712] E: main: destroying context, interrupted \u003d 1\n+[2021/06/17 14:33:58:4774] N: -- [wsi|0|pipe] (0) 3.661s\n+[2021/06/17 14:33:58:4780] N: callback_http: LWS_CALLBACK_CLOSED_CLIENT_HTTP\n+[2021/06/17 14:33:58:4829] N: -- [vh|3|jitt-DFF2B5B4||-1] (3) 1.462s\n+[2021/06/17 14:33:58:4833] N: -- [wsicli|2|GET/h1/ebay.com] (0) 1.462s\n+[2021/06/17 14:33:58:4834] N: -- [vh|0|netlink] (2) 3.660s\n+[2021/06/17 14:33:58:4858] N: -- [vh|1|default||-1] (1) 3.654s\n+[2021/06/17 14:33:58:4860] N: -- [vh|2|jitt-7F69A044||-1] (0) 2.456s\n+[2021/06/17 14:33:58:4974] U: Completed: OK (seen expected 0)\n+```\n+\n+You can also test the client Basic Auth support against the http-server/minimal-http-server-basicauth\n+example. In one console window run the server and in the other\n+\n+```\n+$ lws-minimal-http-client -l --nossl --path /secret/index.html --user user --password password\n+```\n+\n+The Basic Auth credentials for the test server are literally username \u0022user\u0022 and password \u0022password\u0022.\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/minimal-http-client.c b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/minimal-http-client.c\nnew file mode 100644\nindex 0000000..92fd04e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/minimal-http-client.c\n@@ -0,0 +1,468 @@\n+/*\n+ * lws-minimal-http-client-jit-trust\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there. You\n+ * can dump the page data by changing the #if 0 below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, status, conmon;\n+#if defined(LWS_WITH_HTTP2)\n+static int long_poll;\n+#endif\n+static struct lws *client_wsi;\n+static const char *ba_user, *ba_password;\n+static int budget \u003d 6;\n+\n+/*\n+ * For this example, we import the C-formatted array version of the trust blob\n+ * directly. This is produced by running scripts/mozilla-trust-gen.sh and can\n+ * be found in ./_trust after that.\n+ */\n+\n+static uint8_t jit_trust_blob[] \u003d {\n+#include \u0022./trust_blob.h\u0022\n+};\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping \u003d 3,\n+\t.secs_since_valid_hangup \u003d 10,\n+};\n+\n+#if defined(LWS_WITH_CONMON)\n+void\n+dump_conmon_data(struct lws *wsi)\n+{\n+\tconst struct addrinfo *ai;\n+\tstruct lws_conmon cm;\n+\tchar ads[48];\n+\n+\tlws_conmon_wsi_take(wsi, \u0026cm);\n+\n+\tlws_sa46_write_numeric_address(\u0026cm.peer46, ads, sizeof(ads));\n+\tlwsl_notice(\u0022%s: peer %s, dns: %uus, sockconn: %uus, \u0022\n+\t\t \u0022tls: %uus, txn_resp: %uus\u005cn\u0022,\n+\t\t __func__, ads,\n+\t\t (unsigned int)cm.ciu_dns,\n+\t\t (unsigned int)cm.ciu_sockconn,\n+\t\t (unsigned int)cm.ciu_tls,\n+\t\t (unsigned int)cm.ciu_txn_resp);\n+\n+\tai \u003d cm.dns_results_copy;\n+\twhile (ai) {\n+\t\tlws_sa46_write_numeric_address((lws_sockaddr46 *)ai-\u003eai_addr,\n+\t\t\t\t\t\tads, sizeof(ads));\n+\t\tlwsl_notice(\u0022%s: DNS %s\u005cn\u0022, __func__, ads);\n+\t\tai \u003d ai-\u003eai_next;\n+\t}\n+\n+\t/*\n+\t * This destroys the DNS list in the lws_conmon that we took\n+\t * responsibility for when we used lws_conmon_wsi_take()\n+\t */\n+\n+\tlws_conmon_release(\u0026cm);\n+}\n+#endif\n+\n+struct args {\n+\tint argc;\n+\tconst char **argv;\n+};\n+\n+static const struct lws_protocols protocols[];\n+\n+static int\n+try_connect(struct lws_context *cx)\n+{\n+\tstruct lws_client_connect_info i;\n+\tstruct args *a \u003d lws_context_user(cx);\n+\tconst char *p;\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d cx;\n+\tif (!lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-n\u0022)) {\n+\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+#if defined(LWS_WITH_HTTP2)\n+\t\t/* requires h2 */\n+\t\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--long-poll\u0022)) {\n+\t\t\tlwsl_user(\u0022%s: long poll mode\u005cn\u0022, __func__);\n+\t\t\tlong_poll \u003d 1;\n+\t\t}\n+#endif\n+\t}\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022warmcat.com\u0022;\n+\t}\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--nossl\u0022))\n+\t\ti.ssl_connection \u003d 0;\n+\n+\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM |\n+\t\t\t LCCSCF_ACCEPT_TLS_DOWNGRADE_REDIRECTS;\n+\n+\ti.alpn \u003d \u0022h2,http/1.1\u0022;\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--h1\u0022))\n+\t\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--h2-prior-knowledge\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_H2_PRIOR_KNOWLEDGE;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-p\u0022)))\n+\t\ti.port \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--user\u0022)))\n+\t\tba_user \u003d p;\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--password\u0022)))\n+\t\tba_password \u003d p;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-j\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-k\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_INSECURE;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-m\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-e\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_EXPIRED;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-f\u0022))) {\n+\t\ti.ssl_connection |\u003d LCCSCF_H2_MANUAL_RXFLOW;\n+\t\ti.manual_initial_tx_credit \u003d atoi(p);\n+\t\tlwsl_notice(\u0022%s: manual peer tx credit %d\u005cn\u0022, __func__,\n+\t\t\t\ti.manual_initial_tx_credit);\n+\t}\n+\n+#if defined(LWS_WITH_CONMON)\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--conmon\u0022)) {\n+\t\ti.ssl_connection |\u003d LCCSCF_CONMON;\n+\t\tconmon \u003d 1;\n+\t}\n+#endif\n+\n+\t/* the default validity check is 5m / 5m10s... -v \u003d 3s / 10s */\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-v\u0022))\n+\t\ti.retry_and_idle_policy \u003d \u0026retry;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--server\u0022)))\n+\t\ti.address \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--path\u0022)))\n+\t\ti.path \u003d p;\n+\telse\n+\t\ti.path \u003d \u0022/\u0022;\n+\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\ti.pwsi \u003d \u0026client_wsi;\n+\ti.fi_wsi_name \u003d \u0022user\u0022;\n+\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tlwsl_err(\u0022Client creation failed\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 2; /* could not even start client connection */\n+\t\tlws_cancel_service(cx);\n+\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static const char *ua \u003d \u0022Mozilla/5.0 (X11; Linux x86_64) \u0022\n+\t\t\t\u0022AppleWebKit/537.36 (KHTML, like Gecko) \u0022\n+\t\t\t\u0022Chrome/51.0.2704.103 Safari/537.36\u0022,\n+\t\t *acc \u003d \u0022*/*\u0022;\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\n+\t\tif (budget--) {\n+\t\t\ttry_connect(lws_get_context(wsi));\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 3; /* connection failed before we could make connection */\n+\t\tlws_cancel_service(lws_get_context(wsi));\n+\n+#if defined(LWS_WITH_CONMON)\n+\tif (conmon)\n+\t\tdump_conmon_data(wsi);\n+#endif\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buf[128];\n+\n+\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n+\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\n+\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n+\t\t\t\t\tbuf, status);\n+\t\t}\n+#if defined(LWS_WITH_HTTP2)\n+\t\tif (long_poll) {\n+\t\t\tlwsl_user(\u0022%s: Client entering long poll mode\u005cn\u0022, __func__);\n+\t\t\tlws_h2_client_stream_long_poll_rxonly(wsi);\n+\t\t}\n+#endif\n+\n+\t\tif (lws_fi_user_wsi_fi(wsi, \u0022user_reject_at_est\u0022))\n+\t\t\treturn -1;\n+\n+\t\tbreak;\n+\n+\n+\tcase LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:\n+\t{\n+\t\tunsigned char **p \u003d (unsigned char **)in, *end \u003d (*p) + len;\n+\n+\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_USER_AGENT,\n+\t\t\t\t(unsigned char *)ua, (int)strlen(ua), p, end))\n+\t\t\treturn -1;\n+\n+\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_ACCEPT,\n+\t\t\t\t(unsigned char *)acc, (int)strlen(acc), p, end))\n+\t\t\treturn -1;\n+\n+#if defined(LWS_WITH_HTTP_BASIC_AUTH)\n+\t\t{\n+\t\tchar b[128];\n+\n+\t/* you only need this if you need to do Basic Auth */\n+\n+\t\tif (!ba_user || !ba_password)\n+\t\t\tbreak;\n+\n+\t\tif (lws_http_basic_auth_gen(ba_user, ba_password, b, sizeof(b)))\n+\t\t\tbreak;\n+\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_AUTHORIZATION,\n+\t\t\t\t(unsigned char *)b, (int)strlen(b), p, end))\n+\t\t\treturn -1;\n+\t\t}\n+#endif\n+\n+\t\tbreak;\n+\t}\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+#if defined(LWS_WITH_HTTP2)\n+\t\tif (long_poll) {\n+\t\t\tchar dotstar[128];\n+\t\t\tlws_strnncpy(dotstar, (const char *)in, len,\n+\t\t\t\t sizeof(dotstar));\n+\t\t\tlwsl_notice(\u0022long poll rx: %d '%s'\u005cn\u0022, (int)len,\n+\t\t\t\t\tdotstar);\n+\t\t}\n+#endif\n+#if 0\n+\t\tlwsl_hexdump_notice(in, len);\n+#endif\n+\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_fi_user_wsi_fi(wsi, \u0022user_reject_at_rx\u0022))\n+\t\t\t\treturn -1;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 0; // we accept 403 or whatever for this test status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tlwsl_notice(\u0022%s: LWS_CALLBACK_CLOSED_CLIENT_HTTP\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 0; // status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+#if defined(LWS_WITH_CONMON)\n+\t\tif (conmon)\n+\t\t\tdump_conmon_data(wsi);\n+#endif\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *cx \u003d mgr-\u003eparent;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL ||\n+\t target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\tlwsl_info(\u0022%s: operational\u005cn\u0022, __func__);\n+\n+\ttry_connect(cx);\n+\n+\treturn 0;\n+}\n+\n+static int\n+jit_trust_query(struct lws_context *cx, const uint8_t *skid,\n+\t\tsize_t skid_len, void *got_opaque)\n+{\n+\tconst uint8_t *der \u003d NULL;\n+\tsize_t der_len \u003d 0;\n+\n+\tlwsl_info(\u0022%s\u005cn\u0022, __func__);\n+\tlwsl_hexdump_info(skid, skid_len);\n+\n+\t/*\n+\t * For this example, we look up SKIDs using a trust table that's\n+\t * compiled in, synchronously. Lws provides the necessary helper.\n+\t *\n+\t * DER will remain NULL if no match.\n+\t */\n+\n+\tlws_tls_jit_trust_blob_queury_skid(jit_trust_blob,\n+\t\t\t\t\t sizeof(jit_trust_blob), skid,\n+\t\t\t\t\t skid_len, \u0026der, \u0026der_len);\n+\n+\tif (der)\n+\t\tlwsl_info(\u0022%s: found len %d\u005cn\u0022, __func__, (int)der_len);\n+\telse\n+\t\tlwsl_info(\u0022%s: not trusted\u005cn\u0022, __func__);\n+\n+\t/* Once we have a result, pass it to the completion helper */\n+\n+\treturn lws_tls_jit_trust_got_cert_cb(cx, got_opaque, skid, skid_len,\n+\t\t\t\t\t der, der_len);\n+}\n+\n+static lws_system_ops_t system_ops \u003d {\n+\t.jit_trust_query\t\t\u003d jit_trust_query\n+};\n+\n+int main(int argc, const char **argv)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0, expected \u003d 0;\n+\tstruct args args;\n+\tconst char *p;\n+\n+\targs.argc \u003d argc;\n+\targs.argv \u003d argv;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal http client JIT Trust [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t /* we start off not trusting anything */\n+\t\t LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.user \u003d \u0026args;\n+\tinfo.register_notifier_list \u003d na;\n+\tinfo.connect_timeout_secs \u003d 30;\n+\tinfo.system_ops \u003d \u0026system_ops;\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.max_http_header_data \u003d 8192;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tbad \u003d 5;\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlwsl_err(\u0022%s: destroying context, interrupted \u003d %d\u005cn\u0022, __func__,\n+\t\t\tinterrupted);\n+\n+\tlws_context_destroy(context);\n+\n+bail:\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n+\t\texpected \u003d atoi(p);\n+\n+\tif (bad \u003d\u003d expected) {\n+\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, expected);\n+\t\treturn 0;\n+\t}\n+\n+\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, bad, expected);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/trust_blob.h b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/trust_blob.h\nnew file mode 100644\nindex 0000000..615d1df\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/trust_blob.h\n@@ -0,0 +1,8931 @@\n+0x54, 0x42, 0x4c, 0x42, 0x00, 0x01, 0x00, 0x80, 0x60, 0xc6, 0xf3, 0x12, 0x00, 0x02, 0x22, 0xd8,\n+0x00, 0x02, 0x23, 0xd8, 0x00, 0x02, 0x24, 0x58, 0x00, 0x02, 0x2e, 0x30, 0x30, 0x82, 0x05, 0x82,\n+0x30, 0x82, 0x03, 0x6a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b, 0x5a, 0x4b, 0xbd, 0x5a, 0xfb,\n+0x4f, 0x8a, 0x5b, 0xfa, 0x65, 0xe5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x41, 0x54, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1a, 0x65,\n+0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n+0x72, 0x69, 0x6e, 0x67, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x13, 0x10, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20,\n+0x32, 0x30, 0x32, 0x30, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x32, 0x31, 0x30, 0x30, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x30, 0x36, 0x31, 0x30, 0x30, 0x30, 0x30,\n+0x30, 0x30, 0x30, 0x5a, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x41, 0x54, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1a, 0x65, 0x2d,\n+0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n+0x69, 0x6e, 0x67, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x10, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x32,\n+0x30, 0x32, 0x30, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n+0x82, 0x02, 0x01, 0x00, 0xae, 0x2e, 0x56, 0xad, 0x1b, 0x1c, 0xef, 0xf6, 0x95, 0x8f, 0xa0, 0x77,\n+0x1b, 0x2b, 0xd3, 0x63, 0x8f, 0x84, 0x4d, 0x45, 0xa2, 0x0f, 0x9f, 0x5b, 0x45, 0xab, 0x59, 0x7b,\n+0x51, 0x34, 0xf9, 0xec, 0x8b, 0x8a, 0x78, 0xc5, 0xdd, 0x6b, 0xaf, 0xbd, 0xc4, 0xdf, 0x93, 0x45,\n+0x1e, 0xbf, 0x91, 0x38, 0x0b, 0xae, 0x0e, 0x16, 0xe7, 0x41, 0x73, 0xf8, 0xdb, 0xbb, 0xd1, 0xb8,\n+0x51, 0xe0, 0xcb, 0x83, 0x3b, 0x73, 0x38, 0x6e, 0x77, 0x8a, 0x0f, 0x59, 0x63, 0x26, 0xcd, 0xa7,\n+0x2a, 0xce, 0x54, 0xfb, 0xb8, 0xe2, 0xc0, 0x7c, 0x47, 0xce, 0x60, 0x7c, 0x3f, 0xb2, 0x73, 0xf2,\n+0xc0, 0x19, 0xb6, 0x8a, 0x92, 0x87, 0x35, 0x0d, 0x90, 0x28, 0xa2, 0xe4, 0x15, 0x04, 0x63, 0x3e,\n+0xba, 0xaf, 0xee, 0x7c, 0x5e, 0xcc, 0xa6, 0x8b, 0x50, 0xb2, 0x38, 0xf7, 0x41, 0x63, 0xca, 0xce,\n+0xff, 0x69, 0x8f, 0x68, 0x0e, 0x95, 0x36, 0xe5, 0xcc, 0xb9, 0x8c, 0x09, 0xca, 0x4b, 0xdd, 0x31,\n+0x90, 0x96, 0xc8, 0xcc, 0x1f, 0xfd, 0x56, 0x96, 0x34, 0xdb, 0x8e, 0x1c, 0xea, 0x2c, 0xbe, 0x85,\n+0x2e, 0x63, 0xdd, 0xaa, 0xa9, 0x95, 0xd3, 0xfd, 0x29, 0x95, 0x13, 0xf0, 0xc8, 0x98, 0x93, 0xd9,\n+0x2d, 0x16, 0x47, 0x90, 0x11, 0x83, 0xa2, 0x3a, 0x22, 0xa2, 0x28, 0x57, 0xa2, 0xeb, 0xfe, 0xc0,\n+0x8c, 0x28, 0xa0, 0xa6, 0x7d, 0xe7, 0x2a, 0x42, 0x3b, 0x82, 0x80, 0x63, 0xa5, 0x63, 0x1f, 0x19,\n+0xcc, 0x7c, 0xb2, 0x66, 0xa8, 0xc2, 0xd3, 0x6d, 0x37, 0x6f, 0xe2, 0x7e, 0x06, 0x51, 0xd9, 0x45,\n+0x84, 0x1f, 0x12, 0xce, 0x24, 0x52, 0x64, 0x85, 0x0b, 0x48, 0x80, 0x4e, 0x87, 0xb1, 0x22, 0x22,\n+0x30, 0xaa, 0xeb, 0xae, 0xbe, 0xe0, 0x02, 0xe0, 0x40, 0xe8, 0xb0, 0x42, 0x80, 0x03, 0x51, 0xaa,\n+0xb4, 0x7e, 0xaa, 0x44, 0xd7, 0x43, 0x61, 0xf3, 0xa2, 0x6b, 0x16, 0x89, 0x49, 0xa4, 0xa3, 0xa4,\n+0x2b, 0x8a, 0x02, 0xc4, 0x78, 0xf4, 0x68, 0x8a, 0xc1, 0xe4, 0x7a, 0x36, 0xb1, 0x6f, 0x1b, 0x96,\n+0x1b, 0x77, 0x49, 0x8d, 0xd4, 0xc9, 0x06, 0x72, 0x8f, 0xcf, 0x53, 0xe3, 0xdc, 0x17, 0x85, 0x20,\n+0x4a, 0xdc, 0x98, 0x27, 0xd3, 0x91, 0x26, 0x2b, 0x47, 0x1e, 0x69, 0x07, 0xaf, 0xde, 0xa2, 0xe4,\n+0xe4, 0xd4, 0x6b, 0x0b, 0xb3, 0x5e, 0x7c, 0xd4, 0x24, 0x80, 0x47, 0x29, 0x69, 0x3b, 0x6e, 0xe8,\n+0xac, 0xfd, 0x40, 0xeb, 0xd8, 0xed, 0x71, 0x71, 0x2b, 0xf2, 0xe8, 0x58, 0x1d, 0xeb, 0x41, 0x97,\n+0x22, 0xc5, 0x1f, 0xd4, 0x39, 0xd0, 0x27, 0x8f, 0x87, 0xe3, 0x18, 0xf4, 0xe0, 0xa9, 0x46, 0x0d,\n+0xf5, 0x74, 0x3a, 0x82, 0x2e, 0xd0, 0x6e, 0x2c, 0x91, 0xa3, 0x31, 0x5c, 0x3b, 0x46, 0xea, 0x7b,\n+0x04, 0x10, 0x56, 0x5e, 0x80, 0x1d, 0xf5, 0xa5, 0x65, 0xe8, 0x82, 0xfc, 0xe2, 0x07, 0x8c, 0x62,\n+0x45, 0xf5, 0x20, 0xde, 0x46, 0x70, 0x86, 0xa1, 0xbc, 0x93, 0xd3, 0x1e, 0x74, 0xa6, 0x6c, 0xb0,\n+0x2c, 0xf7, 0x03, 0x0c, 0x88, 0x0c, 0xcb, 0xd4, 0x72, 0x53, 0x86, 0xbc, 0x60, 0x46, 0xf3, 0x98,\n+0x6a, 0xc2, 0xf1, 0xbf, 0x43, 0xf9, 0x70, 0x20, 0x77, 0xca, 0x37, 0x41, 0x79, 0x55, 0x52, 0x63,\n+0x8d, 0x5b, 0x12, 0x9f, 0xc5, 0x68, 0xc4, 0x88, 0x9d, 0xac, 0xf2, 0x30, 0xab, 0xb7, 0xa3, 0x31,\n+0x97, 0x67, 0xad, 0x8f, 0x17, 0x0f, 0x6c, 0xc7, 0x73, 0xed, 0x24, 0x94, 0x6b, 0xc8, 0x83, 0x9a,\n+0xd0, 0x9a, 0x37, 0x49, 0x04, 0xab, 0xb1, 0x16, 0xc8, 0x6c, 0x49, 0x49, 0x2d, 0xab, 0xa1, 0xd0,\n+0x8c, 0x92, 0xf2, 0x41, 0x4a, 0x79, 0x21, 0x25, 0xdb, 0x63, 0xd7, 0xb6, 0x9c, 0xa7, 0x7e, 0x42,\n+0x69, 0xfb, 0x3a, 0x63, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e,\n+0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xdc, 0x2e, 0x1f, 0xd1, 0x61, 0x37, 0x79,\n+0xe4, 0xab, 0xd5, 0xd5, 0xb3, 0x12, 0x71, 0x68, 0x3d, 0x6a, 0x68, 0x9c, 0x22, 0x30, 0x1f, 0x06,\n+0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xdc, 0x2e, 0x1f, 0xd1, 0x61, 0x37,\n+0x79, 0xe4, 0xab, 0xd5, 0xd5, 0xb3, 0x12, 0x71, 0x68, 0x3d, 0x6a, 0x68, 0x9c, 0x22, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02,\n+0x01, 0x00, 0x91, 0xf0, 0x42, 0x02, 0x68, 0x40, 0xee, 0xc3, 0x68, 0xc0, 0x54, 0x2f, 0xdf, 0xec,\n+0x62, 0xc3, 0xc3, 0x9e, 0x8a, 0xa0, 0x31, 0x28, 0xaa, 0x83, 0x8e, 0xa4, 0x56, 0x96, 0x12, 0x10,\n+0x86, 0x56, 0xba, 0x97, 0x72, 0xd2, 0x54, 0x30, 0x7c, 0xad, 0x19, 0xd5, 0x1d, 0x68, 0x6f, 0xfb,\n+0x14, 0x42, 0xd8, 0x8d, 0x0e, 0xf3, 0xb5, 0xd1, 0xa5, 0xe3, 0x02, 0x42, 0x5e, 0xdc, 0xe8, 0x46,\n+0x58, 0x07, 0x35, 0x02, 0x30, 0xe0, 0xbc, 0x74, 0x4a, 0xc1, 0x43, 0x2a, 0xff, 0xdb, 0x1a, 0xd0,\n+0xb0, 0xaf, 0x6c, 0xc3, 0xfd, 0xcb, 0xb3, 0xf5, 0x7f, 0x6d, 0x03, 0x2e, 0x59, 0x56, 0x9d, 0x2d,\n+0x2d, 0x35, 0x8c, 0xb2, 0xd6, 0x43, 0x17, 0x2c, 0x92, 0x0a, 0xcb, 0x5d, 0xe8, 0x8c, 0x0f, 0x4b,\n+0x70, 0x43, 0xd0, 0x82, 0xff, 0xa8, 0xcc, 0xbf, 0xa4, 0x94, 0xc0, 0xbe, 0x87, 0xbd, 0x8a, 0xe3,\n+0x93, 0x7b, 0xc6, 0x8f, 0x9b, 0x16, 0x9d, 0x27, 0x65, 0xbc, 0x7a, 0xc5, 0x42, 0x82, 0x6c, 0x5c,\n+0x07, 0xd0, 0xa9, 0xc1, 0x88, 0x60, 0x44, 0xe9, 0x98, 0x85, 0x16, 0x5f, 0xf8, 0x8f, 0xca, 0x01,\n+0x10, 0xce, 0x25, 0xc3, 0xf9, 0x60, 0x1b, 0xa0, 0xc5, 0x97, 0xc3, 0xd3, 0x2c, 0x88, 0x31, 0xa2,\n+0xbd, 0x30, 0xec, 0xd0, 0xd0, 0xc0, 0x12, 0xf1, 0xc1, 0x39, 0xe3, 0xe5, 0xf5, 0xf8, 0xd6, 0x4a,\n+0xdd, 0x34, 0xcd, 0xfb, 0x6f, 0xc1, 0x4f, 0xe3, 0x00, 0x8b, 0x56, 0xe2, 0x92, 0xf7, 0x28, 0xb2,\n+0x42, 0x77, 0x72, 0x23, 0x67, 0xc7, 0x3f, 0x11, 0x15, 0xb2, 0xc4, 0x03, 0x05, 0xbe, 0xbb, 0x11,\n+0x7b, 0x0a, 0xbf, 0xa8, 0x6e, 0xe7, 0xff, 0x58, 0x43, 0xcf, 0x9b, 0x67, 0xa0, 0x80, 0x07, 0xb6,\n+0x1d, 0xca, 0xad, 0x6d, 0xea, 0x41, 0x11, 0x7e, 0x2d, 0x74, 0x93, 0xfb, 0xc2, 0xbc, 0xbe, 0x51,\n+0x44, 0xc5, 0xef, 0x68, 0x25, 0x27, 0x80, 0xe3, 0xc8, 0xa0, 0xd4, 0x12, 0xec, 0xd9, 0xa5, 0x37,\n+0x1d, 0x37, 0x7c, 0xb4, 0x91, 0xca, 0xda, 0xd4, 0xb1, 0x96, 0x81, 0xef, 0x68, 0x5c, 0x76, 0x10,\n+0x49, 0xaf, 0x7e, 0xa5, 0x37, 0x80, 0xb1, 0x1c, 0x52, 0xbd, 0x33, 0x81, 0x4c, 0x8f, 0xf9, 0xdd,\n+0x65, 0xd9, 0x14, 0xcd, 0x8a, 0x25, 0x58, 0xf4, 0xe2, 0xc5, 0x83, 0xa5, 0x09, 0x90, 0xd4, 0x6c,\n+0x14, 0x63, 0xb5, 0x40, 0xdf, 0xeb, 0xc0, 0xfc, 0xc4, 0x58, 0x7e, 0x0d, 0x14, 0x16, 0x87, 0x54,\n+0x27, 0x6e, 0x56, 0xe4, 0x70, 0x84, 0xb8, 0x6c, 0x32, 0x12, 0x7e, 0x82, 0x31, 0x43, 0xbe, 0xd7,\n+0xdd, 0x7c, 0xa1, 0xad, 0xae, 0xd6, 0xab, 0x20, 0x12, 0xef, 0x0a, 0xc3, 0x10, 0x8c, 0x49, 0x96,\n+0x35, 0xdc, 0x0b, 0x75, 0x5e, 0xb1, 0x4f, 0xd5, 0x4f, 0x34, 0x0e, 0x11, 0x20, 0x07, 0x75, 0x43,\n+0x45, 0xe9, 0xa3, 0x11, 0xda, 0xac, 0xa3, 0x99, 0xc2, 0xb6, 0x79, 0x27, 0xe2, 0xb9, 0xef, 0xc8,\n+0xe2, 0xf6, 0x35, 0x29, 0x7a, 0x74, 0xfa, 0xc5, 0x7f, 0x82, 0x05, 0x62, 0xa6, 0x0a, 0xea, 0x68,\n+0xb2, 0x79, 0x47, 0x06, 0x6e, 0xf2, 0x57, 0xa8, 0x15, 0x33, 0xc6, 0xf7, 0x78, 0x4a, 0x3d, 0x42,\n+0x7b, 0x6b, 0x7e, 0xfe, 0xf7, 0x46, 0xea, 0xd1, 0xeb, 0x8e, 0xef, 0x88, 0x68, 0x5b, 0xe8, 0xc1,\n+0xd9, 0x71, 0x7e, 0xfd, 0x64, 0xef, 0xff, 0x67, 0x47, 0x88, 0x58, 0x25, 0x2f, 0x3e, 0x86, 0x07,\n+0xbd, 0xfb, 0xa8, 0xe5, 0x82, 0xa8, 0xac, 0xa5, 0xd3, 0x69, 0x43, 0xcd, 0x31, 0x88, 0x49, 0x84,\n+0x53, 0x92, 0xc0, 0xb1, 0x39, 0x1b, 0x39, 0x83, 0x01, 0x30, 0xc4, 0xf2, 0xa9, 0xfa, 0xd0, 0x03,\n+0xbd, 0x72, 0x37, 0x60, 0x56, 0x1f, 0x36, 0x7c, 0xbd, 0x39, 0x91, 0xf5, 0x6d, 0x0d, 0xbf, 0x7b,\n+0xd7, 0x92, 0x30, 0x82, 0x02, 0x59, 0x30, 0x82, 0x01, 0xdf, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x10, 0x66, 0xf2, 0x3d, 0xaf, 0x87, 0xde, 0x8b, 0xb1, 0x4a, 0xea, 0x0c, 0x57, 0x31, 0x01, 0xc2,\n+0xec, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x65, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,\n+0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x36, 0x30, 0x34,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,\n+0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n+0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20,\n+0x32, 0x30, 0x31, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x31, 0x32, 0x31, 0x38, 0x32, 0x33,\n+0x30, 0x36, 0x34, 0x35, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x37, 0x31, 0x38, 0x32, 0x33, 0x31,\n+0x36, 0x30, 0x34, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69,\n+0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,\n+0x69, 0x6f, 0x6e, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4d, 0x69,\n+0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74,\n+0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x37, 0x30, 0x76, 0x30, 0x10, 0x06,\n+0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03,\n+0x62, 0x00, 0x04, 0xd4, 0xbc, 0x3d, 0x02, 0x42, 0x75, 0x41, 0x13, 0x23, 0xcd, 0x80, 0x04, 0x86,\n+0x02, 0x51, 0x2f, 0x6a, 0xa8, 0x81, 0x62, 0x0b, 0x65, 0xcc, 0xf6, 0xca, 0x9d, 0x1e, 0x6f, 0x4a,\n+0x66, 0x51, 0xa2, 0x03, 0xd9, 0x9d, 0x91, 0xfa, 0xb6, 0x16, 0xb1, 0x8c, 0x6e, 0xde, 0x7c, 0xcd,\n+0xdb, 0x79, 0xa6, 0x2f, 0xce, 0xbb, 0xce, 0x71, 0x2f, 0xe5, 0xa5, 0xab, 0x28, 0xec, 0x63, 0x04,\n+0x66, 0x99, 0xf8, 0xfa, 0xf2, 0x93, 0x10, 0x05, 0xe1, 0x81, 0x28, 0x42, 0xe3, 0xc6, 0x68, 0xf4,\n+0xe6, 0x1b, 0x84, 0x60, 0x4a, 0x89, 0xaf, 0xed, 0x79, 0x0f, 0x3b, 0xce, 0xf1, 0xf6, 0x44, 0xf5,\n+0x01, 0x78, 0xc0, 0xa3, 0x54, 0x30, 0x52, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,\n+0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n+0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0xc8, 0xcb, 0x99, 0x72, 0x70, 0x52, 0x0c, 0xf8, 0xe6, 0xbe, 0xb2, 0x04, 0x57,\n+0x29, 0x2a, 0xcf, 0x42, 0x10, 0xed, 0x35, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01,\n+0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n+0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x30, 0x58, 0xf2, 0x4d, 0xea,\n+0x0c, 0xf9, 0x5f, 0x5e, 0xee, 0x60, 0x29, 0xcb, 0x3a, 0xf2, 0xdb, 0xd6, 0x32, 0x84, 0x19, 0x3f,\n+0x7c, 0xd5, 0x2f, 0xc2, 0xb1, 0xcc, 0x93, 0xae, 0x50, 0xbb, 0x09, 0x32, 0xc6, 0xc6, 0xed, 0x7e,\n+0xc9, 0x36, 0x94, 0x12, 0xe4, 0x68, 0x85, 0x06, 0xa2, 0x1b, 0xd0, 0x2f, 0x02, 0x31, 0x00, 0x99,\n+0xe9, 0x16, 0xb4, 0x0e, 0xfa, 0x56, 0x48, 0xd4, 0xa4, 0x30, 0x16, 0x91, 0x78, 0xdb, 0x54, 0x8c,\n+0x65, 0x01, 0x8a, 0xe7, 0x50, 0x66, 0xc2, 0x31, 0xb7, 0x39, 0xba, 0xb8, 0x1a, 0x22, 0x07, 0x4e,\n+0xfc, 0x6b, 0x54, 0x16, 0x20, 0xff, 0x2b, 0xb5, 0xe7, 0x4c, 0x0c, 0x4d, 0xa6, 0x4f, 0x73, 0x30,\n+0x82, 0x05, 0xa8, 0x30, 0x82, 0x03, 0x90, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x1e, 0xd3,\n+0x97, 0x09, 0x5f, 0xd8, 0xb4, 0xb3, 0x47, 0x70, 0x1e, 0xaa, 0xbe, 0x7f, 0x45, 0xb3, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x65, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,\n+0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x36, 0x30, 0x34,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,\n+0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n+0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20,\n+0x32, 0x30, 0x31, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x31, 0x32, 0x31, 0x38, 0x32, 0x32,\n+0x35, 0x31, 0x32, 0x32, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x37, 0x31, 0x38, 0x32, 0x33, 0x30,\n+0x30, 0x32, 0x33, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69,\n+0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,\n+0x69, 0x6f, 0x6e, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4d, 0x69,\n+0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74,\n+0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x37, 0x30, 0x82, 0x02, 0x22, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n+0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xca, 0x5b, 0xbe, 0x94,\n+0x33, 0x8c, 0x29, 0x95, 0x91, 0x16, 0x0a, 0x95, 0xbd, 0x47, 0x62, 0xc1, 0x89, 0xf3, 0x99, 0x36,\n+0xdf, 0x46, 0x90, 0xc9, 0xa5, 0xed, 0x78, 0x6a, 0x6f, 0x47, 0x91, 0x68, 0xf8, 0x27, 0x67, 0x50,\n+0x33, 0x1d, 0xa1, 0xa6, 0xfb, 0xe0, 0xe5, 0x43, 0xa3, 0x84, 0x02, 0x57, 0x01, 0x5d, 0x9c, 0x48,\n+0x40, 0x82, 0x53, 0x10, 0xbc, 0xbf, 0xc7, 0x3b, 0x68, 0x90, 0xb6, 0x82, 0x2d, 0xe5, 0xf4, 0x65,\n+0xd0, 0xcc, 0x6d, 0x19, 0xcc, 0x95, 0xf9, 0x7b, 0xac, 0x4a, 0x94, 0xad, 0x0e, 0xde, 0x4b, 0x43,\n+0x1d, 0x87, 0x07, 0x92, 0x13, 0x90, 0x80, 0x83, 0x64, 0x35, 0x39, 0x04, 0xfc, 0xe5, 0xe9, 0x6c,\n+0xb3, 0xb6, 0x1f, 0x50, 0x94, 0x38, 0x65, 0x50, 0x5c, 0x17, 0x46, 0xb9, 0xb6, 0x85, 0xb5, 0x1c,\n+0xb5, 0x17, 0xe8, 0xd6, 0x45, 0x9d, 0xd8, 0xb2, 0x26, 0xb0, 0xca, 0xc4, 0x70, 0x4a, 0xae, 0x60,\n+0xa4, 0xdd, 0xb3, 0xd9, 0xec, 0xfc, 0x3b, 0xd5, 0x57, 0x72, 0xbc, 0x3f, 0xc8, 0xc9, 0xb2, 0xde,\n+0x4b, 0x6b, 0xf8, 0x23, 0x6c, 0x03, 0xc0, 0x05, 0xbd, 0x95, 0xc7, 0xcd, 0x73, 0x3b, 0x66, 0x80,\n+0x64, 0xe3, 0x1a, 0xac, 0x2e, 0xf9, 0x47, 0x05, 0xf2, 0x06, 0xb6, 0x9b, 0x73, 0xf5, 0x78, 0x33,\n+0x5b, 0xc7, 0xa1, 0xfb, 0x27, 0x2a, 0xa1, 0xb4, 0x9a, 0x91, 0x8c, 0x91, 0xd3, 0x3a, 0x82, 0x3e,\n+0x76, 0x40, 0xb4, 0xcd, 0x52, 0x61, 0x51, 0x70, 0x28, 0x3f, 0xc5, 0xc5, 0x5a, 0xf2, 0xc9, 0x8c,\n+0x49, 0xbb, 0x14, 0x5b, 0x4d, 0xc8, 0xff, 0x67, 0x4d, 0x4c, 0x12, 0x96, 0xad, 0xf5, 0xfe, 0x78,\n+0xa8, 0x97, 0x87, 0xd7, 0xfd, 0x5e, 0x20, 0x80, 0xdc, 0xa1, 0x4b, 0x22, 0xfb, 0xd4, 0x89, 0xad,\n+0xba, 0xce, 0x47, 0x97, 0x47, 0x55, 0x7b, 0x8f, 0x45, 0xc8, 0x67, 0x28, 0x84, 0x95, 0x1c, 0x68,\n+0x30, 0xef, 0xef, 0x49, 0xe0, 0x35, 0x7b, 0x64, 0xe7, 0x98, 0xb0, 0x94, 0xda, 0x4d, 0x85, 0x3b,\n+0x3e, 0x55, 0xc4, 0x28, 0xaf, 0x57, 0xf3, 0x9e, 0x13, 0xdb, 0x46, 0x27, 0x9f, 0x1e, 0xa2, 0x5e,\n+0x44, 0x83, 0xa4, 0xa5, 0xca, 0xd5, 0x13, 0xb3, 0x4b, 0x3f, 0xc4, 0xe3, 0xc2, 0xe6, 0x86, 0x61,\n+0xa4, 0x52, 0x30, 0xb9, 0x7a, 0x20, 0x4f, 0x6f, 0x0f, 0x38, 0x53, 0xcb, 0x33, 0x0c, 0x13, 0x2b,\n+0x8f, 0xd6, 0x9a, 0xbd, 0x2a, 0xc8, 0x2d, 0xb1, 0x1c, 0x7d, 0x4b, 0x51, 0xca, 0x47, 0xd1, 0x48,\n+0x27, 0x72, 0x5d, 0x87, 0xeb, 0xd5, 0x45, 0xe6, 0x48, 0x65, 0x9d, 0xaf, 0x52, 0x90, 0xba, 0x5b,\n+0xa2, 0x18, 0x65, 0x57, 0x12, 0x9f, 0x68, 0xb9, 0xd4, 0x15, 0x6b, 0x94, 0xc4, 0x69, 0x22, 0x98,\n+0xf4, 0x33, 0xe0, 0xed, 0xf9, 0x51, 0x8e, 0x41, 0x50, 0xc9, 0x34, 0x4f, 0x76, 0x90, 0xac, 0xfc,\n+0x38, 0xc1, 0xd8, 0xe1, 0x7b, 0xb9, 0xe3, 0xe3, 0x94, 0xe1, 0x46, 0x69, 0xcb, 0x0e, 0x0a, 0x50,\n+0x6b, 0x13, 0xba, 0xac, 0x0f, 0x37, 0x5a, 0xb7, 0x12, 0xb5, 0x90, 0x81, 0x1e, 0x56, 0xae, 0x57,\n+0x22, 0x86, 0xd9, 0xc9, 0xd2, 0xd1, 0xd7, 0x51, 0xe3, 0xab, 0x3b, 0xc6, 0x55, 0xfd, 0x1e, 0x0e,\n+0xd3, 0x74, 0x0a, 0xd1, 0xda, 0xaa, 0xea, 0x69, 0xb8, 0x97, 0x28, 0x8f, 0x48, 0xc4, 0x07, 0xf8,\n+0x52, 0x43, 0x3a, 0xf4, 0xca, 0x55, 0x35, 0x2c, 0xb0, 0xa6, 0x6a, 0xc0, 0x9c, 0xf9, 0xf2, 0x81,\n+0xe1, 0x12, 0x6a, 0xc0, 0x45, 0xd9, 0x67, 0xb3, 0xce, 0xff, 0x23, 0xa2, 0x89, 0x0a, 0x54, 0xd4,\n+0x14, 0xb9, 0x2a, 0xa8, 0xd7, 0xec, 0xf9, 0xab, 0xcd, 0x25, 0x58, 0x32, 0x79, 0x8f, 0x90, 0x5b,\n+0x98, 0x39, 0xc4, 0x08, 0x06, 0xc1, 0xac, 0x7f, 0x0e, 0x3d, 0x00, 0xa5, 0x02, 0x03, 0x01, 0x00,\n+0x01, 0xa3, 0x54, 0x30, 0x52, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n+0x14, 0x09, 0xcb, 0x59, 0x7f, 0x86, 0xb2, 0x70, 0x8f, 0x1a, 0xc3, 0x39, 0xe3, 0xc0, 0xd9, 0xe9,\n+0xbf, 0xbb, 0x4d, 0xb2, 0x23, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37,\n+0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xac, 0xaf, 0x3e, 0x5d, 0xc2,\n+0x11, 0x96, 0x89, 0x8e, 0xa3, 0xe7, 0x92, 0xd6, 0x97, 0x15, 0xb8, 0x13, 0xa2, 0xa6, 0x42, 0x2e,\n+0x02, 0xcd, 0x16, 0x05, 0x59, 0x27, 0xca, 0x20, 0xe8, 0xba, 0xb8, 0xe8, 0x1a, 0xec, 0x4d, 0xa8,\n+0x97, 0x56, 0xae, 0x65, 0x43, 0xb1, 0x8f, 0x00, 0x9b, 0x52, 0xcd, 0x55, 0xcd, 0x53, 0x39, 0x6d,\n+0x62, 0x4c, 0x8b, 0x0d, 0x5b, 0x7c, 0x2e, 0x44, 0xbf, 0x83, 0x10, 0x8f, 0xf3, 0x53, 0x82, 0x80,\n+0xc3, 0x4f, 0x3a, 0xc7, 0x6e, 0x11, 0x3f, 0xe6, 0xe3, 0x16, 0x91, 0x84, 0xfb, 0x6d, 0x84, 0x7f,\n+0x34, 0x74, 0xad, 0x89, 0xa7, 0xce, 0xb9, 0xd7, 0xd7, 0x9f, 0x84, 0x64, 0x92, 0xbe, 0x95, 0xa1,\n+0xad, 0x09, 0x53, 0x33, 0xdd, 0xee, 0x0a, 0xea, 0x4a, 0x51, 0x8e, 0x6f, 0x55, 0xab, 0xba, 0xb5,\n+0x94, 0x46, 0xae, 0x8c, 0x7f, 0xd8, 0xa2, 0x50, 0x25, 0x65, 0x60, 0x80, 0x46, 0xdb, 0x33, 0x04,\n+0xae, 0x6c, 0xb5, 0x98, 0x74, 0x54, 0x25, 0xdc, 0x93, 0xe4, 0xf8, 0xe3, 0x55, 0x15, 0x3d, 0xb8,\n+0x6d, 0xc3, 0x0a, 0xa4, 0x12, 0xc1, 0x69, 0x85, 0x6e, 0xdf, 0x64, 0xf1, 0x53, 0x99, 0xe1, 0x4a,\n+0x75, 0x20, 0x9d, 0x95, 0x0f, 0xe4, 0xd6, 0xdc, 0x03, 0xf1, 0x59, 0x18, 0xe8, 0x47, 0x89, 0xb2,\n+0x57, 0x5a, 0x94, 0xb6, 0xa9, 0xd8, 0x17, 0x2b, 0x17, 0x49, 0xe5, 0x76, 0xcb, 0xc1, 0x56, 0x99,\n+0x3a, 0x37, 0xb1, 0xff, 0x69, 0x2c, 0x91, 0x91, 0x93, 0xe1, 0xdf, 0x4c, 0xa3, 0x37, 0x76, 0x4d,\n+0xa1, 0x9f, 0xf8, 0x6d, 0x1e, 0x1d, 0xd3, 0xfa, 0xec, 0xfb, 0xf4, 0x45, 0x1d, 0x13, 0x6d, 0xcf,\n+0xf7, 0x59, 0xe5, 0x22, 0x27, 0x72, 0x2b, 0x86, 0xf3, 0x57, 0xbb, 0x30, 0xed, 0x24, 0x4d, 0xdc,\n+0x7d, 0x56, 0xbb, 0xa3, 0xb3, 0xf8, 0x34, 0x79, 0x89, 0xc1, 0xe0, 0xf2, 0x02, 0x61, 0xf7, 0xa6,\n+0xfc, 0x0f, 0xbb, 0x1c, 0x17, 0x0b, 0xae, 0x41, 0xd9, 0x7c, 0xbd, 0x27, 0xa3, 0xfd, 0x2e, 0x3a,\n+0xd1, 0x93, 0x94, 0xb1, 0x73, 0x1d, 0x24, 0x8b, 0xaf, 0x5b, 0x20, 0x89, 0xad, 0xb7, 0x67, 0x66,\n+0x79, 0xf5, 0x3a, 0xc6, 0xa6, 0x96, 0x33, 0xfe, 0x53, 0x92, 0xc8, 0x46, 0xb1, 0x11, 0x91, 0xc6,\n+0x99, 0x7f, 0x8f, 0xc9, 0xd6, 0x66, 0x31, 0x20, 0x41, 0x10, 0x87, 0x2d, 0x0c, 0xd6, 0xc1, 0xaf,\n+0x34, 0x98, 0xca, 0x64, 0x83, 0xfb, 0x13, 0x57, 0xd1, 0xc1, 0xf0, 0x3c, 0x7a, 0x8c, 0xa5, 0xc1,\n+0xfd, 0x95, 0x21, 0xa0, 0x71, 0xc1, 0x93, 0x67, 0x71, 0x12, 0xea, 0x8f, 0x88, 0x0a, 0x69, 0x19,\n+0x64, 0x99, 0x23, 0x56, 0xfb, 0xac, 0x2a, 0x2e, 0x70, 0xbe, 0x66, 0xc4, 0x0c, 0x84, 0xef, 0xe5,\n+0x8b, 0xf3, 0x93, 0x01, 0xf8, 0x6a, 0x90, 0x93, 0x67, 0x4b, 0xb2, 0x68, 0xa3, 0xb5, 0x62, 0x8f,\n+0xe9, 0x3f, 0x8c, 0x7a, 0x3b, 0x5e, 0x0f, 0xe7, 0x8c, 0xb8, 0xc6, 0x7c, 0xef, 0x37, 0xfd, 0x74,\n+0xe2, 0xc8, 0x4f, 0x33, 0x72, 0xe1, 0x94, 0x39, 0x6d, 0xbd, 0x12, 0xaf, 0xbe, 0x0c, 0x4e, 0x70,\n+0x7c, 0x1b, 0x6f, 0x8d, 0xb3, 0x32, 0x93, 0x73, 0x44, 0x16, 0x6d, 0xe8, 0xf4, 0xf7, 0xe0, 0x95,\n+0x80, 0x8f, 0x96, 0x5d, 0x38, 0xa4, 0xf4, 0xab, 0xde, 0x0a, 0x30, 0x87, 0x93, 0xd8, 0x4d, 0x00,\n+0x71, 0x62, 0x45, 0x27, 0x4b, 0x3a, 0x42, 0x84, 0x5b, 0x7f, 0x65, 0xb7, 0x67, 0x34, 0x52, 0x2d,\n+0x9c, 0x16, 0x6b, 0xaa, 0xa8, 0xd8, 0x7b, 0xa3, 0x42, 0x4c, 0x71, 0xc7, 0x0c, 0xca, 0x3e, 0x83,\n+0xe4, 0xa6, 0xef, 0xb7, 0x01, 0x30, 0x5e, 0x51, 0xa3, 0x79, 0xf5, 0x70, 0x69, 0xa6, 0x41, 0x44,\n+0x0f, 0x86, 0xb0, 0x2c, 0x91, 0xc6, 0x3d, 0xea, 0xae, 0x0f, 0x84, 0x30, 0x82, 0x05, 0xef, 0x30,\n+0x82, 0x03, 0xd7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x0d, 0xd3, 0xe3, 0xbc, 0x6c, 0xf9,\n+0x6b, 0xb1, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n+0x00, 0x30, 0x81, 0x84, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x47,\n+0x36, 0x33, 0x32, 0x38, 0x37, 0x35, 0x31, 0x30, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e,\n+0x41, 0x4e, 0x46, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20, 0x64, 0x65,\n+0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x31, 0x14,\n+0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b, 0x41, 0x4e, 0x46, 0x20, 0x43, 0x41, 0x20,\n+0x52, 0x61, 0x69, 0x7a, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x41,\n+0x4e, 0x46, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x39,\n+0x30, 0x34, 0x31, 0x30, 0x30, 0x30, 0x33, 0x38, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x30, 0x38, 0x33,\n+0x30, 0x31, 0x30, 0x30, 0x30, 0x33, 0x38, 0x5a, 0x30, 0x81, 0x84, 0x31, 0x12, 0x30, 0x10, 0x06,\n+0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x47, 0x36, 0x33, 0x32, 0x38, 0x37, 0x35, 0x31, 0x30, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x27, 0x30, 0x25,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x41, 0x4e, 0x46, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x72,\n+0x69, 0x64, 0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n+0x61, 0x63, 0x69, 0x6f, 0x6e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b,\n+0x41, 0x4e, 0x46, 0x20, 0x43, 0x41, 0x20, 0x52, 0x61, 0x69, 0x7a, 0x31, 0x22, 0x30, 0x20, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x41, 0x4e, 0x46, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65,\n+0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30,\n+0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00,\n+0xdb, 0xeb, 0x6b, 0x2b, 0xe6, 0x64, 0x54, 0x95, 0x82, 0x90, 0xa3, 0x72, 0xa4, 0x19, 0x01, 0x9d,\n+0x9c, 0x0b, 0x81, 0x5f, 0x73, 0x49, 0xba, 0xa7, 0xac, 0xf3, 0x04, 0x4e, 0x7b, 0x96, 0x0b, 0xec,\n+0x11, 0xe0, 0x5b, 0xa6, 0x1c, 0xce, 0x1b, 0xd2, 0x0d, 0x83, 0x1c, 0x2b, 0xb8, 0x9e, 0x1d, 0x7e,\n+0x45, 0x32, 0x60, 0x0f, 0x07, 0xe9, 0x77, 0x58, 0x7e, 0x9f, 0x6a, 0xc8, 0x61, 0x4e, 0xb6, 0x26,\n+0xc1, 0x4c, 0x8d, 0xff, 0x4c, 0xef, 0x34, 0xb2, 0x1f, 0x65, 0xd8, 0xb9, 0x78, 0xf5, 0xad, 0xa9,\n+0x71, 0xb9, 0xef, 0x4f, 0x58, 0x1d, 0xa5, 0xde, 0x74, 0x20, 0x97, 0xa1, 0xed, 0x68, 0x4c, 0xde,\n+0x92, 0x17, 0x4b, 0xbc, 0xab, 0xff, 0x65, 0x9a, 0x9e, 0xfb, 0x47, 0xd9, 0x57, 0x72, 0xf3, 0x09,\n+0xa1, 0xae, 0x76, 0x44, 0x13, 0x6e, 0x9c, 0x2d, 0x44, 0x39, 0xbc, 0xf9, 0xc7, 0x3b, 0xa4, 0x58,\n+0x3d, 0x41, 0xbd, 0xb4, 0xc2, 0x49, 0xa3, 0xc8, 0x0d, 0xd2, 0x97, 0x2f, 0x07, 0x65, 0x52, 0x00,\n+0xa7, 0x6e, 0xc8, 0xaf, 0x68, 0xec, 0xf4, 0x14, 0x96, 0xb6, 0x57, 0x1f, 0x56, 0xc3, 0x39, 0x9f,\n+0x2b, 0x6d, 0xe4, 0xf3, 0x3e, 0xf6, 0x35, 0x64, 0xda, 0x0c, 0x1c, 0xa1, 0x84, 0x4b, 0x2f, 0x4b,\n+0x4b, 0xe2, 0x2c, 0x24, 0x9d, 0x6d, 0x93, 0x40, 0xeb, 0xb5, 0x23, 0x8e, 0x32, 0xca, 0x6f, 0x45,\n+0xd3, 0xa8, 0x89, 0x7b, 0x1e, 0xcf, 0x1e, 0xfa, 0x5b, 0x43, 0x8b, 0xcd, 0xcd, 0xa8, 0x0f, 0x6a,\n+0xca, 0x0c, 0x5e, 0xb9, 0x9e, 0x47, 0x8f, 0xf0, 0xd9, 0xb6, 0x0a, 0x0b, 0x58, 0x65, 0x17, 0x33,\n+0xb9, 0x23, 0xe4, 0x77, 0x19, 0x7d, 0xcb, 0x4a, 0x2e, 0x92, 0x7b, 0x4f, 0x2f, 0x10, 0x77, 0xb1,\n+0x8d, 0x2f, 0x68, 0x9c, 0x62, 0xcc, 0xe0, 0x50, 0xf8, 0xec, 0x91, 0xa7, 0x54, 0x4c, 0x57, 0x09,\n+0xd5, 0x76, 0x63, 0xc5, 0xe8, 0x65, 0x1e, 0xee, 0x6d, 0x6a, 0xcf, 0x09, 0x9d, 0xfa, 0x7c, 0x4f,\n+0xad, 0x60, 0x08, 0xfd, 0x56, 0x99, 0x0f, 0x15, 0x2c, 0x7b, 0xa9, 0x80, 0xab, 0x8c, 0x61, 0x8f,\n+0x4a, 0x07, 0x76, 0x42, 0xde, 0x3d, 0xf4, 0xdd, 0xb2, 0x24, 0x33, 0x5b, 0xb8, 0xb5, 0xa3, 0x44,\n+0xc9, 0xac, 0x7f, 0x77, 0x3c, 0x1d, 0x23, 0xec, 0x82, 0xa9, 0xa6, 0xe2, 0xc8, 0x06, 0x4c, 0x02,\n+0xfe, 0xac, 0x5c, 0x99, 0x99, 0x0b, 0x2f, 0x10, 0x8a, 0xa6, 0xf4, 0x7f, 0xd5, 0x87, 0x74, 0x0d,\n+0x59, 0x49, 0x45, 0xf6, 0xf0, 0x71, 0x5c, 0x39, 0x29, 0xd6, 0xbf, 0x4a, 0x23, 0x8b, 0xf5, 0x5f,\n+0x01, 0x63, 0xd2, 0x87, 0x73, 0x28, 0xb5, 0x4b, 0x0a, 0xf5, 0xf8, 0xab, 0x82, 0x2c, 0x7e, 0x73,\n+0x25, 0x32, 0x1d, 0x0b, 0x63, 0x0a, 0x17, 0x81, 0x00, 0xff, 0xb6, 0x76, 0x5e, 0xe7, 0xb4, 0xb1,\n+0x40, 0xca, 0x21, 0xbb, 0xd5, 0x80, 0x51, 0xe5, 0x48, 0x52, 0x67, 0x2c, 0xd2, 0x61, 0x89, 0x07,\n+0x0d, 0x0f, 0xce, 0x42, 0x77, 0xc0, 0x44, 0x73, 0x9c, 0x44, 0x50, 0xa0, 0xdb, 0x10, 0x0a, 0x2d,\n+0x95, 0x1c, 0x81, 0xaf, 0xe4, 0x1c, 0xe5, 0x14, 0x1e, 0xf1, 0x36, 0x41, 0x01, 0x02, 0x2f, 0x7d,\n+0x73, 0xa7, 0xde, 0x42, 0xcc, 0x4c, 0xe9, 0x89, 0x0d, 0x56, 0xf7, 0x9f, 0x91, 0xd4, 0x03, 0xc6,\n+0x6c, 0xc9, 0x8f, 0xdb, 0xd8, 0x1c, 0xe0, 0x40, 0x98, 0x5d, 0x66, 0x99, 0x98, 0x80, 0x6e, 0x2d,\n+0xff, 0x01, 0xc5, 0xce, 0xcb, 0x46, 0x1f, 0xac, 0x02, 0xc6, 0x43, 0xe6, 0xae, 0xa2, 0x84, 0x3c,\n+0xc5, 0x4e, 0x1e, 0x3d, 0x6d, 0xc9, 0x14, 0x4c, 0xe3, 0x2e, 0x41, 0xbb, 0xca, 0x39, 0xbf, 0x36,\n+0x3c, 0x2a, 0x19, 0xaa, 0x41, 0x87, 0x4e, 0xa5, 0xce, 0x4b, 0x32, 0x79, 0xdd, 0x90, 0x49, 0x7f,\n+0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,\n+0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x9c, 0x5f, 0xd0, 0x6c, 0x63, 0xa3, 0x5f, 0x93, 0xca, 0x93,\n+0x98, 0x08, 0xad, 0x8c, 0x87, 0xa5, 0x2c, 0x5c, 0xc1, 0x37, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n+0x0e, 0x04, 0x16, 0x04, 0x14, 0x9c, 0x5f, 0xd0, 0x6c, 0x63, 0xa3, 0x5f, 0x93, 0xca, 0x93, 0x98,\n+0x08, 0xad, 0x8c, 0x87, 0xa5, 0x2c, 0x5c, 0xc1, 0x37, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f,\n+0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n+0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x4e, 0x1e,\n+0xb9, 0x8a, 0xc6, 0xa0, 0x98, 0x3f, 0x6e, 0xc3, 0x69, 0xc0, 0x6a, 0x5c, 0x49, 0x52, 0xac, 0xcb,\n+0x2b, 0x5d, 0x78, 0x38, 0xc1, 0xd5, 0x54, 0x84, 0x9f, 0x93, 0xf0, 0x87, 0x19, 0x3d, 0x2c, 0x66,\n+0x89, 0xeb, 0x0d, 0x42, 0xfc, 0xcc, 0xf0, 0x75, 0x85, 0x3f, 0x8b, 0xf4, 0x80, 0x5d, 0x79, 0xe5,\n+0x17, 0x67, 0xbd, 0x35, 0x82, 0xe2, 0xf2, 0x3c, 0x8e, 0x7d, 0x5b, 0x36, 0xcb, 0x5a, 0x80, 0x00,\n+0x29, 0xf2, 0xce, 0x2b, 0x2c, 0xf1, 0x8f, 0xaa, 0x6d, 0x05, 0x93, 0x6c, 0x72, 0xc7, 0x56, 0xeb,\n+0xdf, 0x50, 0x23, 0x28, 0xe5, 0x45, 0x10, 0x3d, 0xe8, 0x67, 0xa3, 0xaf, 0x0e, 0x55, 0x0f, 0x90,\n+0x09, 0x62, 0xef, 0x4b, 0x59, 0xa2, 0xf6, 0x53, 0xf1, 0xc0, 0x35, 0xe4, 0x2f, 0xc1, 0x24, 0xbd,\n+0x79, 0x2f, 0x4e, 0x20, 0x22, 0x3b, 0xfd, 0x1a, 0x20, 0xb0, 0xa4, 0x0e, 0x2c, 0x70, 0xed, 0x74,\n+0x3f, 0xb8, 0x13, 0x95, 0x06, 0x51, 0xc8, 0xe8, 0x87, 0x26, 0xca, 0xa4, 0x5b, 0x6a, 0x16, 0x21,\n+0x92, 0xdd, 0x73, 0x60, 0x9e, 0x10, 0x18, 0xde, 0x3c, 0x81, 0xea, 0xe8, 0x18, 0xc3, 0x7c, 0x89,\n+0xf2, 0x8b, 0x50, 0x3e, 0xbd, 0x11, 0xe2, 0x15, 0x03, 0xa8, 0x36, 0x7d, 0x33, 0x01, 0x6c, 0x48,\n+0x15, 0xd7, 0x88, 0x90, 0x99, 0x04, 0xc5, 0xcc, 0xe6, 0x07, 0xf4, 0xbc, 0xf4, 0x90, 0xed, 0x13,\n+0xe2, 0xea, 0x8b, 0xc3, 0x8f, 0xa3, 0x33, 0x0f, 0xc1, 0x29, 0x4c, 0x13, 0x4e, 0xda, 0x15, 0x56,\n+0x71, 0x73, 0x72, 0x82, 0x50, 0xf6, 0x9a, 0x33, 0x7c, 0xa2, 0xb1, 0xa8, 0x1a, 0x34, 0x74, 0x65,\n+0x5c, 0xce, 0xd1, 0xeb, 0xab, 0x53, 0xe0, 0x1a, 0x80, 0xd8, 0xea, 0x3a, 0x49, 0xe4, 0x26, 0x30,\n+0x9b, 0xe5, 0x1c, 0x8a, 0xa8, 0xa9, 0x15, 0x32, 0x86, 0x99, 0x92, 0x0a, 0x10, 0x23, 0x56, 0x12,\n+0xe0, 0xf6, 0xce, 0x4c, 0xe2, 0xbb, 0xbe, 0xdb, 0x8d, 0x92, 0x73, 0x01, 0x66, 0x2f, 0x62, 0x3e,\n+0xb2, 0x72, 0x27, 0x45, 0x36, 0xed, 0x4d, 0x56, 0xe3, 0x97, 0x99, 0xff, 0x3a, 0x35, 0x3e, 0xa5,\n+0x54, 0x4a, 0x52, 0x59, 0x4b, 0x60, 0xdb, 0xee, 0xfe, 0x78, 0x11, 0x7f, 0x4a, 0xdc, 0x14, 0x79,\n+0x60, 0xb6, 0x6b, 0x64, 0x03, 0xdb, 0x15, 0x83, 0xe1, 0xa2, 0xbe, 0xf6, 0x23, 0x97, 0x50, 0xf0,\n+0x09, 0x33, 0x36, 0xa7, 0x71, 0x96, 0x25, 0xf3, 0xb9, 0x42, 0x7d, 0xdb, 0x38, 0x3f, 0x2c, 0x58,\n+0xac, 0xe8, 0x42, 0xe1, 0x0e, 0xd8, 0xd3, 0x3b, 0x4c, 0x2e, 0x82, 0xe9, 0x83, 0x2e, 0x6b, 0x31,\n+0xd9, 0xdd, 0x47, 0x86, 0x4f, 0x6d, 0x97, 0x91, 0x2e, 0x4f, 0xe2, 0x28, 0x71, 0x35, 0x16, 0xd1,\n+0xf2, 0x73, 0xfe, 0x25, 0x2b, 0x07, 0x47, 0x24, 0x63, 0x27, 0xc8, 0xf8, 0xf6, 0xd9, 0x6b, 0xfc,\n+0x12, 0x31, 0x56, 0x08, 0xc0, 0x53, 0x42, 0xaf, 0x9c, 0xd0, 0x33, 0x7e, 0xfc, 0x06, 0xf0, 0x31,\n+0x44, 0x03, 0x14, 0xf1, 0x58, 0xea, 0xf2, 0x6a, 0x0d, 0xa9, 0x11, 0xb2, 0x83, 0xbe, 0xc5, 0x1a,\n+0xbf, 0x07, 0xea, 0x59, 0xdc, 0xa3, 0x88, 0x35, 0xef, 0x9c, 0x76, 0x32, 0x3c, 0x4d, 0x06, 0x22,\n+0xce, 0x15, 0xe5, 0xdd, 0x9e, 0xd8, 0x8f, 0xda, 0xde, 0xd2, 0xc4, 0x39, 0xe5, 0x17, 0x81, 0xcf,\n+0x38, 0x47, 0xeb, 0x7f, 0x88, 0x6d, 0x59, 0x1b, 0xdf, 0x9f, 0x42, 0x14, 0xae, 0x7e, 0xcf, 0xa8,\n+0xb0, 0x66, 0x65, 0xda, 0x37, 0xaf, 0x9f, 0xaa, 0x3d, 0xea, 0x28, 0xb6, 0xde, 0xd5, 0x31, 0x58,\n+0x16, 0x82, 0x5b, 0xea, 0xbb, 0x19, 0x75, 0x02, 0x73, 0x1a, 0xca, 0x48, 0x1a, 0x21, 0x93, 0x90,\n+0x0a, 0x8e, 0x93, 0x84, 0xa7, 0x7d, 0x3b, 0x23, 0x18, 0x92, 0x89, 0xa0, 0x8d, 0xac, 0x30, 0x82,\n+0x02, 0x65, 0x30, 0x82, 0x01, 0xeb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x78, 0x8f, 0x27,\n+0x5c, 0x81, 0x12, 0x52, 0x20, 0xa5, 0x04, 0xd0, 0x2d, 0xdd, 0xba, 0x73, 0xf4, 0x30, 0x0a, 0x06,\n+0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x74, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x18, 0x41, 0x73, 0x73, 0x65, 0x63, 0x6f, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x53,\n+0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06,\n+0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x43,\n+0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x45, 0x43, 0x2d, 0x33, 0x38, 0x34, 0x20, 0x43, 0x41, 0x30,\n+0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x33, 0x32, 0x36, 0x30, 0x37, 0x32, 0x34, 0x35, 0x34, 0x5a,\n+0x17, 0x0d, 0x34, 0x33, 0x30, 0x33, 0x32, 0x36, 0x30, 0x37, 0x32, 0x34, 0x35, 0x34, 0x5a, 0x30,\n+0x74, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x21,\n+0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x41, 0x73, 0x73, 0x65, 0x63, 0x6f, 0x20,\n+0x44, 0x61, 0x74, 0x61, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x41,\n+0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65, 0x72, 0x74,\n+0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x13, 0x10, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x45, 0x43, 0x2d, 0x33,\n+0x38, 0x34, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n+0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xc4, 0x28, 0x8e,\n+0xab, 0x18, 0x5b, 0x6a, 0xbe, 0x6e, 0x64, 0x37, 0x63, 0xe4, 0xcd, 0xec, 0xab, 0x3a, 0xf7, 0xcc,\n+0xa1, 0xb8, 0x0e, 0x82, 0x49, 0xd7, 0x86, 0x29, 0x9f, 0xa1, 0x94, 0xf2, 0xe3, 0x60, 0x78, 0x98,\n+0x81, 0x78, 0x06, 0x4d, 0xf2, 0xec, 0x9a, 0x0e, 0x57, 0x60, 0x83, 0x9f, 0xb4, 0xe6, 0x17, 0x2f,\n+0x1a, 0xb3, 0x5d, 0x02, 0x5b, 0x89, 0x23, 0x3c, 0xc2, 0x11, 0x05, 0x2a, 0xa7, 0x88, 0x13, 0x18,\n+0xf3, 0x50, 0x84, 0xd7, 0xbd, 0x34, 0x2c, 0x27, 0x89, 0x55, 0xff, 0xce, 0x4c, 0xe7, 0xdf, 0xa6,\n+0x1f, 0x28, 0xc4, 0xf0, 0x54, 0xc3, 0xb9, 0x7c, 0xb7, 0x53, 0xad, 0xeb, 0xc2, 0xa3, 0x42, 0x30,\n+0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x8d, 0x06, 0x66,\n+0x74, 0x24, 0x76, 0x3a, 0xf3, 0x89, 0xf7, 0xbc, 0xd6, 0xbd, 0x47, 0x7d, 0x2f, 0xbc, 0x10, 0x5f,\n+0x4b, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n+0x06, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00,\n+0x30, 0x65, 0x02, 0x30, 0x03, 0x55, 0x2d, 0xa6, 0xe6, 0x18, 0xc4, 0x7c, 0xef, 0xc9, 0x50, 0x6e,\n+0xc1, 0x27, 0x0f, 0x9c, 0x87, 0xaf, 0x6e, 0xd5, 0x1b, 0x08, 0x18, 0xbd, 0x92, 0x29, 0xc1, 0xef,\n+0x94, 0x91, 0x78, 0xd2, 0x3a, 0x1c, 0x55, 0x89, 0x62, 0xe5, 0x1b, 0x09, 0x1e, 0xba, 0x64, 0x6b,\n+0xf1, 0x76, 0xb4, 0xd4, 0x02, 0x31, 0x00, 0xb4, 0x42, 0x84, 0x99, 0xff, 0xab, 0xe7, 0x9e, 0xfb,\n+0x91, 0x97, 0x27, 0x5d, 0xdc, 0xb0, 0x5b, 0x30, 0x71, 0xce, 0x5e, 0x38, 0x1a, 0x6a, 0xd9, 0x25,\n+0xe7, 0xea, 0xf7, 0x61, 0x92, 0x56, 0xf8, 0xea, 0xda, 0x36, 0xc2, 0x87, 0x65, 0x96, 0x2e, 0x72,\n+0x25, 0x2f, 0x7f, 0xdf, 0xc3, 0x13, 0xc9, 0x30, 0x82, 0x05, 0xc0, 0x30, 0x82, 0x03, 0xa8, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x1e, 0xbf, 0x59, 0x50, 0xb8, 0xc9, 0x80, 0x37, 0x4c, 0x06,\n+0xf7, 0xeb, 0x55, 0x4f, 0xb5, 0xed, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0d, 0x05, 0x00, 0x30, 0x7a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x50, 0x4c, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x41,\n+0x73, 0x73, 0x65, 0x63, 0x6f, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65,\n+0x6d, 0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x13, 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x43, 0x65, 0x72, 0x74, 0x75,\n+0x6d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43,\n+0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x33, 0x31, 0x36, 0x31, 0x32, 0x31, 0x30, 0x31,\n+0x33, 0x5a, 0x17, 0x0d, 0x34, 0x33, 0x30, 0x33, 0x31, 0x36, 0x31, 0x32, 0x31, 0x30, 0x31, 0x33,\n+0x5a, 0x30, 0x7a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c,\n+0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x41, 0x73, 0x73, 0x65, 0x63,\n+0x6f, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53,\n+0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65,\n+0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n+0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x1f, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54, 0x72,\n+0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02,\n+0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,\n+0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd1, 0x2d,\n+0x8e, 0xbb, 0xb7, 0x36, 0xea, 0x6d, 0x37, 0x91, 0x9f, 0x4e, 0x93, 0xa7, 0x05, 0xe4, 0x29, 0x03,\n+0x25, 0xce, 0x1c, 0x82, 0xf7, 0x7c, 0x99, 0x9f, 0x41, 0x06, 0xcd, 0xed, 0xa3, 0xba, 0xc0, 0xdb,\n+0x09, 0x2c, 0xc1, 0x7c, 0xdf, 0x29, 0x7e, 0x4b, 0x65, 0x2f, 0x93, 0xa7, 0xd4, 0x01, 0x6b, 0x03,\n+0x28, 0x18, 0xa3, 0xd8, 0x9d, 0x05, 0xc1, 0x2a, 0xd8, 0x45, 0xf1, 0x91, 0xde, 0xdf, 0x3b, 0xd0,\n+0x80, 0x02, 0x8c, 0xcf, 0x38, 0x0f, 0xea, 0xa7, 0x5c, 0x78, 0x11, 0xa4, 0xc1, 0xc8, 0x85, 0x5c,\n+0x25, 0xd3, 0xd3, 0xb2, 0xe7, 0x25, 0xcf, 0x11, 0x54, 0x97, 0xab, 0x35, 0xc0, 0x1e, 0x76, 0x1c,\n+0xef, 0x00, 0x53, 0x9f, 0x39, 0xdc, 0x14, 0xa5, 0x2c, 0x22, 0x25, 0xb3, 0x72, 0x72, 0xfc, 0x8d,\n+0xb3, 0xe5, 0x3e, 0x08, 0x1e, 0x14, 0x2a, 0x37, 0x0b, 0x88, 0x3c, 0xca, 0xb0, 0xf4, 0xc8, 0xc2,\n+0xa1, 0xae, 0xbc, 0xc1, 0xbe, 0x29, 0x67, 0x55, 0xe2, 0xfc, 0xad, 0x59, 0x5c, 0xfe, 0xbd, 0x57,\n+0x2c, 0xb0, 0x90, 0x8d, 0xc2, 0xed, 0x37, 0xb6, 0x7c, 0x99, 0x88, 0xb5, 0xd5, 0x03, 0x9a, 0x3d,\n+0x15, 0x0d, 0x3d, 0x3a, 0xa8, 0xa8, 0x45, 0xf0, 0x95, 0x4e, 0x25, 0x59, 0x1d, 0xcd, 0x98, 0x69,\n+0xbb, 0xd3, 0xcc, 0x32, 0xc9, 0x8d, 0xef, 0x81, 0xfe, 0xad, 0x7d, 0x89, 0xbb, 0xba, 0x60, 0x13,\n+0xca, 0x65, 0x95, 0x67, 0xa0, 0xf3, 0x19, 0xf6, 0x03, 0x56, 0xd4, 0x6a, 0xd3, 0x27, 0xe2, 0xa1,\n+0xad, 0x83, 0xf0, 0x4a, 0x12, 0x22, 0x77, 0x1c, 0x05, 0x73, 0xe2, 0x19, 0x71, 0x42, 0xc0, 0xec,\n+0x75, 0x46, 0x9a, 0x90, 0x58, 0xe0, 0x6a, 0x8e, 0x2b, 0xa5, 0x46, 0x30, 0x04, 0x8e, 0x19, 0xb2,\n+0x17, 0xe3, 0xbe, 0xa9, 0xba, 0x7f, 0x56, 0xf1, 0x24, 0x03, 0xd7, 0xb2, 0x21, 0x28, 0x76, 0x0e,\n+0x36, 0x30, 0x4c, 0x79, 0xd5, 0x41, 0x9a, 0x9a, 0xa8, 0xb8, 0x35, 0xba, 0x0c, 0x3a, 0xf2, 0x44,\n+0x1b, 0x20, 0x88, 0xf7, 0xc5, 0x25, 0xd7, 0x3d, 0xc6, 0xe3, 0x3e, 0x43, 0xdd, 0x87, 0xfe, 0xc4,\n+0xea, 0xf5, 0x53, 0x3e, 0x4c, 0x65, 0xff, 0x3b, 0x4a, 0xcb, 0x78, 0x5a, 0x6b, 0x17, 0x5f, 0x0d,\n+0xc7, 0xc3, 0x4f, 0x4e, 0x9a, 0x2a, 0xa2, 0xed, 0x57, 0x4d, 0x22, 0xe2, 0x46, 0x9a, 0x3f, 0x0f,\n+0x91, 0x34, 0x24, 0x7d, 0x55, 0xe3, 0x8c, 0x95, 0x37, 0xd3, 0x1a, 0xf0, 0x09, 0x2b, 0x2c, 0xd2,\n+0xc9, 0x8d, 0xb4, 0x0d, 0x00, 0xab, 0x67, 0x29, 0x28, 0xd8, 0x01, 0xf5, 0x19, 0x04, 0xb6, 0x1d,\n+0xbe, 0x76, 0xfe, 0x72, 0x5c, 0xc4, 0x85, 0xca, 0xd2, 0x80, 0x41, 0xdf, 0x05, 0xa8, 0xa3, 0xd5,\n+0x84, 0x90, 0x4f, 0x0b, 0xf3, 0xe0, 0x3f, 0x9b, 0x19, 0xd2, 0x37, 0x89, 0x3f, 0xf2, 0x7b, 0x52,\n+0x1c, 0x8c, 0xf6, 0xe1, 0xf7, 0x3c, 0x07, 0x97, 0x8c, 0x0e, 0xa2, 0x59, 0x81, 0x0c, 0xb2, 0x90,\n+0x3d, 0xd3, 0xe3, 0x59, 0x46, 0xed, 0x0f, 0xa9, 0xa7, 0xde, 0x80, 0x6b, 0x5a, 0xaa, 0x07, 0xb6,\n+0x19, 0xcb, 0xbc, 0x57, 0xf3, 0x97, 0x21, 0x7a, 0x0c, 0xb1, 0x2b, 0x74, 0x3e, 0xeb, 0xda, 0xa7,\n+0x67, 0x2d, 0x4c, 0xc4, 0x98, 0x9e, 0x36, 0x09, 0x76, 0x66, 0x66, 0xfc, 0x1a, 0x3f, 0xea, 0x48,\n+0x54, 0x1c, 0xbe, 0x30, 0xbd, 0x80, 0x50, 0xbf, 0x7c, 0xb5, 0xce, 0x00, 0xf6, 0x0c, 0x61, 0xd9,\n+0xe7, 0x24, 0x03, 0xe0, 0xe3, 0x01, 0x81, 0x0e, 0xbd, 0xd8, 0x85, 0x34, 0x88, 0xbd, 0xb2, 0x36,\n+0xa8, 0x7b, 0x5c, 0x08, 0xe5, 0x44, 0x80, 0x8c, 0x6f, 0xf8, 0x2f, 0xd5, 0x21, 0xca, 0x1d, 0x1c,\n+0xd0, 0xfb, 0xc4, 0xb5, 0x87, 0xd1, 0x3a, 0x4e, 0xc7, 0x76, 0xb5, 0x35, 0x48, 0xb5, 0x02, 0x03,\n+0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n+0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0x8c, 0xfb, 0x1c, 0x75, 0xbc, 0x02, 0xd3, 0x9f, 0x4e, 0x2e, 0x48, 0xd9, 0xf9,\n+0x60, 0x54, 0xaa, 0xc4, 0xb3, 0x4f, 0xfa, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,\n+0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0d, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x48, 0xa2, 0xd5, 0x00, 0x0b,\n+0x2e, 0xd0, 0x3f, 0xbc, 0x1c, 0xd5, 0xb5, 0x54, 0x49, 0x1e, 0x5a, 0x6b, 0xf4, 0xe4, 0xf2, 0xe0,\n+0x40, 0x37, 0xe0, 0xcc, 0x14, 0x7b, 0xb9, 0xc9, 0xfa, 0x35, 0xb5, 0x75, 0x17, 0x93, 0x6a, 0x05,\n+0x69, 0x85, 0x9c, 0xcd, 0x4f, 0x19, 0x78, 0x5b, 0x19, 0x81, 0xf3, 0x63, 0x3e, 0xc3, 0xce, 0x5b,\n+0x8f, 0xf5, 0x2f, 0x5e, 0x01, 0x76, 0x13, 0x3f, 0x2c, 0x00, 0xb9, 0xcd, 0x96, 0x52, 0x39, 0x49,\n+0x6d, 0x04, 0x4e, 0xc5, 0xe9, 0x0f, 0x86, 0x0d, 0xe1, 0xfa, 0xb3, 0x5f, 0x82, 0x12, 0xf1, 0x3a,\n+0xce, 0x66, 0x06, 0x24, 0x34, 0x2b, 0xe8, 0xcc, 0xca, 0xe7, 0x69, 0xdc, 0x87, 0x9d, 0xc2, 0x34,\n+0xd7, 0x79, 0xd1, 0xd3, 0x77, 0xb8, 0xaa, 0x59, 0x58, 0xfe, 0x9d, 0x26, 0xfa, 0x38, 0x86, 0x3e,\n+0x9d, 0x8a, 0x87, 0x64, 0x57, 0xe5, 0x17, 0x3a, 0xe2, 0xf9, 0x8d, 0xb9, 0xe3, 0x33, 0x78, 0xc1,\n+0x90, 0xd8, 0xb8, 0xdd, 0xb7, 0x83, 0x51, 0xe4, 0xc4, 0xcc, 0x23, 0xd5, 0x06, 0x7c, 0xe6, 0x51,\n+0xd3, 0xcd, 0x34, 0x31, 0xc0, 0xf6, 0x46, 0xbb, 0x0b, 0xad, 0xfc, 0x3d, 0x10, 0x05, 0x2a, 0x3b,\n+0x4a, 0x91, 0x25, 0xee, 0x8c, 0xd4, 0x84, 0x87, 0x80, 0x2a, 0xbc, 0x09, 0x8c, 0xaa, 0x3a, 0x13,\n+0x5f, 0xe8, 0x34, 0x79, 0x50, 0xc1, 0x10, 0x19, 0xf9, 0xd3, 0x28, 0x1e, 0xd4, 0xd1, 0x51, 0x30,\n+0x29, 0xb3, 0xae, 0x90, 0x67, 0xd6, 0x1f, 0x0a, 0x63, 0xb1, 0xc5, 0xa9, 0xc6, 0x42, 0x31, 0x63,\n+0x17, 0x94, 0xef, 0x69, 0xcb, 0x2f, 0xfa, 0x8c, 0x14, 0x7d, 0xc4, 0x43, 0x18, 0x89, 0xd9, 0xf0,\n+0x32, 0x40, 0xe6, 0x80, 0xe2, 0x46, 0x5f, 0xe5, 0xe3, 0xc1, 0x00, 0x59, 0xa8, 0xf9, 0xe8, 0x20,\n+0xbc, 0x89, 0x2c, 0x0e, 0x47, 0x34, 0x0b, 0xea, 0x57, 0xc2, 0x53, 0x36, 0xfc, 0xa7, 0xd4, 0xaf,\n+0x31, 0xcd, 0xfe, 0x02, 0xe5, 0x75, 0xfa, 0xb9, 0x27, 0x09, 0xf9, 0xf3, 0xf5, 0x3b, 0xca, 0x7d,\n+0x9f, 0xa9, 0x22, 0xcb, 0x88, 0xc9, 0xaa, 0xd1, 0x47, 0x3d, 0x36, 0x77, 0xa8, 0x59, 0x64, 0x6b,\n+0x27, 0xcf, 0xef, 0x27, 0xc1, 0xe3, 0x24, 0xb5, 0x86, 0xf7, 0xae, 0x7e, 0x32, 0x4d, 0xb0, 0x79,\n+0x68, 0xd1, 0x39, 0xe8, 0x90, 0x58, 0xc3, 0x83, 0xbc, 0x0f, 0x2c, 0xd6, 0x97, 0xeb, 0xce, 0x0c,\n+0xe1, 0x20, 0xc7, 0xda, 0xb7, 0x3e, 0xc3, 0x3f, 0xbf, 0x2f, 0xdc, 0x34, 0xa4, 0xfb, 0x2b, 0x21,\n+0xcd, 0x67, 0x8f, 0x4b, 0xf4, 0xe3, 0xea, 0xd4, 0x3f, 0xe7, 0x4f, 0xba, 0xb9, 0xa5, 0x93, 0x45,\n+0x1c, 0x66, 0x1f, 0x21, 0xfa, 0x64, 0x5e, 0x6f, 0xe0, 0x76, 0x94, 0x32, 0xcb, 0x75, 0xf5, 0x6e,\n+0xe5, 0xf6, 0x8f, 0xc7, 0xb8, 0xa4, 0xcc, 0xa8, 0x96, 0x7d, 0x64, 0xfb, 0x24, 0x5a, 0x4a, 0x03,\n+0x6c, 0x6b, 0x38, 0xc6, 0xe8, 0x03, 0x43, 0x9a, 0xf7, 0x57, 0xb9, 0xb3, 0x29, 0x69, 0x93, 0x38,\n+0xf4, 0x03, 0xf2, 0xbb, 0xfb, 0x82, 0x6b, 0x07, 0x20, 0xd1, 0x52, 0x1f, 0x9a, 0x64, 0x02, 0x7b,\n+0x98, 0x66, 0xdb, 0x5c, 0x4d, 0x5a, 0x0f, 0xd0, 0x84, 0x95, 0xa0, 0x3c, 0x14, 0x43, 0x06, 0xca,\n+0xca, 0xdb, 0xb8, 0x41, 0x36, 0xda, 0x6a, 0x44, 0x67, 0x87, 0xaf, 0xaf, 0xe3, 0x45, 0x11, 0x15,\n+0x69, 0x08, 0xb2, 0xbe, 0x16, 0x39, 0x97, 0x24, 0x6f, 0x12, 0x45, 0xd1, 0x67, 0x5d, 0x09, 0xa8,\n+0xc9, 0x15, 0xda, 0xfa, 0xd2, 0xa6, 0x5f, 0x13, 0x61, 0x1f, 0xbf, 0x85, 0xac, 0xb4, 0xad, 0xad,\n+0x05, 0x94, 0x08, 0x83, 0x1e, 0x75, 0x17, 0xd3, 0x71, 0x3b, 0x93, 0x50, 0x23, 0x59, 0xa0, 0xed,\n+0x3c, 0x91, 0x54, 0x9d, 0x76, 0x00, 0xc5, 0xc3, 0xb8, 0x38, 0xdb, 0x30, 0x82, 0x05, 0xcf, 0x30,\n+0x82, 0x03, 0xb7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x08, 0x16, 0x5f, 0x8a, 0x4c, 0xa5,\n+0xec, 0x00, 0xc9, 0x93, 0x40, 0xdf, 0xc4, 0xc6, 0xae, 0x23, 0xb8, 0x1c, 0x5a, 0xa4, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x6f, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b, 0x31, 0x12, 0x30, 0x10,\n+0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x09, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67,\n+0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x48, 0x6f, 0x6e, 0x67, 0x20,\n+0x4b, 0x6f, 0x6e, 0x67, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x48,\n+0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20,\n+0x50, 0x6f, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x1e,\n+0x17, 0x0d, 0x31, 0x37, 0x30, 0x36, 0x30, 0x33, 0x30, 0x32, 0x32, 0x39, 0x34, 0x36, 0x5a, 0x17,\n+0x0d, 0x34, 0x32, 0x30, 0x36, 0x30, 0x33, 0x30, 0x32, 0x32, 0x39, 0x34, 0x36, 0x5a, 0x30, 0x6f,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b, 0x31, 0x12, 0x30,\n+0x10, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x09, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e,\n+0x67, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x48, 0x6f, 0x6e, 0x67,\n+0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d,\n+0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x31, 0x20, 0x30,\n+0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67,\n+0x20, 0x50, 0x6f, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30,\n+0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00,\n+0xb3, 0x88, 0xd7, 0xea, 0xce, 0x0f, 0x20, 0x4e, 0xbe, 0xe6, 0xd6, 0x03, 0x6d, 0xee, 0x59, 0xfc,\n+0xc2, 0x57, 0xdf, 0x29, 0x68, 0xa1, 0x83, 0x0e, 0x3e, 0x68, 0xc7, 0x68, 0x58, 0x9c, 0x1c, 0x60,\n+0x4b, 0x89, 0x43, 0x0c, 0xb9, 0xd4, 0x15, 0xb2, 0xee, 0xc1, 0x4e, 0x75, 0xe9, 0xb5, 0xa7, 0xef,\n+0xe5, 0xe9, 0x35, 0x99, 0xe4, 0xcc, 0x1c, 0xe7, 0x4b, 0x5f, 0x8d, 0x33, 0x30, 0x20, 0x33, 0x53,\n+0xd9, 0xa6, 0xbb, 0xd5, 0x3e, 0x13, 0x8e, 0xe9, 0x1f, 0x87, 0x49, 0xad, 0x50, 0x2d, 0x50, 0xca,\n+0x18, 0xbe, 0x01, 0x58, 0xa2, 0x13, 0x70, 0x96, 0xbb, 0x89, 0x88, 0x56, 0x80, 0x5c, 0xf8, 0xbd,\n+0x2c, 0x3c, 0xe1, 0x4c, 0x57, 0x88, 0xbb, 0xd3, 0xb9, 0x95, 0xef, 0xcb, 0xc7, 0xf6, 0xda, 0x31,\n+0x74, 0x28, 0xa6, 0xe6, 0x54, 0x89, 0xf5, 0x41, 0x31, 0xca, 0xe5, 0x26, 0x1a, 0xcd, 0x82, 0xe0,\n+0x70, 0xda, 0x3b, 0x29, 0xbb, 0xd5, 0x03, 0xf5, 0x99, 0xba, 0x55, 0xf5, 0x64, 0xd1, 0x60, 0x0e,\n+0xb3, 0x89, 0x49, 0xb8, 0x8a, 0x2f, 0x05, 0xd2, 0x84, 0x45, 0x28, 0x7c, 0x8f, 0x68, 0x50, 0x12,\n+0x78, 0xfc, 0x0b, 0xb5, 0x53, 0xcb, 0xc2, 0x98, 0x1c, 0x84, 0xa3, 0x9e, 0xb0, 0xbe, 0x23, 0xa4,\n+0xda, 0xdc, 0xc8, 0x2b, 0x1e, 0xda, 0x6e, 0x45, 0x1e, 0x89, 0x98, 0xda, 0xf9, 0x00, 0x2e, 0x06,\n+0xe9, 0x0c, 0x3b, 0x70, 0xd5, 0x50, 0x25, 0x88, 0x99, 0xcb, 0xcd, 0x73, 0x60, 0xf7, 0xd5, 0xff,\n+0x35, 0x67, 0xc5, 0xa1, 0xbc, 0x5e, 0xab, 0xcd, 0x4a, 0xb8, 0x45, 0xeb, 0xc8, 0x68, 0x1e, 0x0d,\n+0x0d, 0x14, 0x46, 0x12, 0xe3, 0xd2, 0x64, 0x62, 0x8a, 0x42, 0x98, 0xbc, 0xb4, 0xc6, 0x08, 0x08,\n+0xf8, 0xfd, 0xa8, 0x4c, 0x64, 0x9c, 0x76, 0x01, 0xbd, 0x2f, 0xa9, 0x6c, 0x33, 0x0f, 0xd8, 0x3f,\n+0x28, 0xb8, 0x3c, 0x69, 0x01, 0x42, 0x86, 0x7e, 0x69, 0xc1, 0xc9, 0x06, 0xca, 0xe5, 0x7a, 0x46,\n+0x65, 0xe9, 0xc2, 0xd6, 0x50, 0x41, 0x2e, 0x3f, 0xb7, 0xe4, 0xed, 0x6c, 0xd7, 0xbf, 0x26, 0x01,\n+0x11, 0xa2, 0x16, 0x29, 0x4a, 0x6b, 0x34, 0x06, 0x90, 0xec, 0x13, 0xd2, 0xb6, 0xfb, 0x6a, 0x76,\n+0xd2, 0x3c, 0xed, 0xf0, 0xd6, 0x2d, 0xdd, 0xe1, 0x15, 0xec, 0xa3, 0x9b, 0x2f, 0x2c, 0xc9, 0x3e,\n+0x2b, 0xe4, 0x69, 0x3b, 0xff, 0x72, 0x25, 0xb1, 0x36, 0x86, 0x5b, 0xc7, 0x7f, 0x6b, 0x8b, 0x55,\n+0x1b, 0x4a, 0xc5, 0x20, 0x61, 0x3d, 0xae, 0xcb, 0x50, 0xe1, 0x08, 0x3a, 0xbe, 0xb0, 0x8f, 0x63,\n+0x41, 0x53, 0x30, 0x08, 0x59, 0x3c, 0x98, 0x1d, 0x77, 0xba, 0x63, 0x91, 0x7a, 0xca, 0x10, 0x50,\n+0x60, 0xbf, 0xf0, 0xd7, 0xbc, 0x95, 0x87, 0x8f, 0x97, 0xc5, 0xfe, 0x97, 0x6a, 0x01, 0x94, 0xa3,\n+0x7c, 0x5b, 0x85, 0x1d, 0x2a, 0x39, 0x3a, 0xd0, 0x54, 0xa1, 0xd1, 0x39, 0x71, 0x9d, 0xfd, 0x21,\n+0xf9, 0xb5, 0x7b, 0xf0, 0xe2, 0xe0, 0x02, 0x8f, 0x6e, 0x96, 0x24, 0x25, 0x2c, 0xa0, 0x1e, 0x2c,\n+0xa8, 0xc4, 0x89, 0xa7, 0xef, 0xed, 0x99, 0x06, 0x2f, 0xb6, 0x0a, 0x4c, 0x4f, 0xdb, 0xa2, 0xcc,\n+0x37, 0x1a, 0xaf, 0x47, 0x85, 0x2d, 0x8a, 0x5f, 0xc4, 0x34, 0x34, 0x4c, 0x00, 0xfd, 0x18, 0x93,\n+0x67, 0x13, 0xd1, 0x37, 0xe6, 0x48, 0xb4, 0x8b, 0x06, 0xc5, 0x57, 0x7b, 0x19, 0x86, 0x0a, 0x79,\n+0xcb, 0x00, 0xc9, 0x52, 0xaf, 0x42, 0xff, 0x37, 0x8f, 0xe1, 0xa3, 0x1e, 0x7a, 0x3d, 0x50, 0xab,\n+0x63, 0x06, 0xe7, 0x15, 0xb5, 0x3f, 0xb6, 0x45, 0x37, 0x94, 0x37, 0xb1, 0x7e, 0xf2, 0x48, 0xc3,\n+0x7f, 0xc5, 0x75, 0xfe, 0x97, 0x8d, 0x45, 0x8f, 0x1a, 0xa7, 0x1a, 0x72, 0x28, 0x1a, 0x40, 0x0f,\n+0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n+0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,\n+0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x17, 0x9d, 0xcd, 0x1e, 0x8b, 0xd6, 0x39, 0x2b, 0x70,\n+0xd3, 0x5c, 0xd4, 0xa0, 0xb8, 0x1f, 0xb0, 0x00, 0xfc, 0xc5, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x17, 0x9d, 0xcd, 0x1e, 0x8b, 0xd6, 0x39, 0x2b, 0x70, 0xd3,\n+0x5c, 0xd4, 0xa0, 0xb8, 0x1f, 0xb0, 0x00, 0xfc, 0xc5, 0x61, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x56, 0xd5,\n+0x7b, 0x6e, 0xe6, 0x22, 0x01, 0xd2, 0x42, 0x9b, 0x18, 0xd5, 0x0e, 0xd7, 0x66, 0x23, 0x5c, 0xe3,\n+0xfe, 0xa0, 0xc7, 0x92, 0xd2, 0xe9, 0x94, 0xad, 0x4b, 0xa2, 0xc6, 0xec, 0x12, 0x7c, 0x74, 0xd5,\n+0x48, 0xd2, 0x59, 0x14, 0x99, 0xc0, 0xeb, 0xb9, 0xd1, 0xeb, 0xf4, 0x48, 0x30, 0x5b, 0xad, 0xa7,\n+0x57, 0x73, 0x99, 0xa9, 0xd3, 0xe5, 0xb7, 0xd1, 0x2e, 0x59, 0x24, 0x58, 0xdc, 0x68, 0x2e, 0x2e,\n+0x62, 0xd8, 0x6a, 0xe4, 0x70, 0x0b, 0x2d, 0x20, 0x50, 0x20, 0xa4, 0x32, 0x95, 0xd1, 0x00, 0x98,\n+0xbb, 0xd3, 0xfd, 0xf7, 0x32, 0xf2, 0x49, 0xae, 0xc6, 0x7a, 0xe0, 0x47, 0xbe, 0x6e, 0xce, 0xcb,\n+0xa3, 0x72, 0x3a, 0x2d, 0x69, 0x5d, 0xcb, 0xc8, 0xe8, 0x45, 0x39, 0xd4, 0xfa, 0x42, 0xc1, 0x11,\n+0x4c, 0x77, 0x5d, 0x92, 0xfb, 0x6a, 0xff, 0x58, 0x44, 0xe5, 0xeb, 0x81, 0x9e, 0xaf, 0xa0, 0x99,\n+0xad, 0xbe, 0xa9, 0x01, 0x66, 0xcb, 0x38, 0x1d, 0x3c, 0xdf, 0x43, 0x1f, 0xf4, 0x4d, 0x6e, 0xb4,\n+0xba, 0x17, 0x46, 0xfc, 0x7d, 0xfd, 0x87, 0x81, 0x79, 0x6a, 0x0d, 0x33, 0x0f, 0xfa, 0x2f, 0xf8,\n+0x14, 0xb9, 0x80, 0xb3, 0x5d, 0x4d, 0xaa, 0x97, 0xe1, 0xf9, 0xe4, 0x18, 0xc5, 0xf8, 0xd5, 0x38,\n+0x8c, 0x26, 0x3c, 0xfd, 0xf2, 0x28, 0xe2, 0xee, 0x5a, 0x49, 0x88, 0x2c, 0xdf, 0x79, 0x3d, 0x8e,\n+0x9e, 0x90, 0x3c, 0xbd, 0x41, 0x4a, 0x3a, 0xdd, 0x5b, 0xf6, 0x9a, 0xb4, 0xce, 0x3f, 0x25, 0x30,\n+0x7f, 0x32, 0x7d, 0xa2, 0x03, 0x94, 0xd0, 0xdc, 0x7a, 0xa1, 0x52, 0xde, 0x6e, 0x93, 0x8d, 0x18,\n+0x26, 0xfd, 0x55, 0xac, 0xbd, 0x8f, 0x9b, 0xd2, 0xcf, 0xaf, 0xe7, 0x86, 0x2c, 0xcb, 0x1f, 0x09,\n+0x6f, 0xa3, 0x6f, 0xa9, 0x84, 0xd4, 0x73, 0xbf, 0x4d, 0xa1, 0x74, 0x1b, 0x4e, 0x23, 0x60, 0xf2,\n+0xcc, 0x0e, 0xaa, 0x7f, 0xa4, 0x9c, 0x4c, 0x25, 0xa8, 0xb2, 0x66, 0x3b, 0x38, 0xff, 0xd9, 0x94,\n+0x30, 0xf6, 0x72, 0x84, 0xbe, 0x68, 0x55, 0x10, 0x0f, 0xc6, 0x73, 0x2c, 0x16, 0x69, 0x93, 0x07,\n+0xfe, 0xb1, 0x45, 0xed, 0xbb, 0xa2, 0x55, 0x6a, 0xb0, 0xda, 0xb5, 0x4a, 0x02, 0x25, 0x27, 0x85,\n+0xd7, 0xb7, 0xb7, 0x86, 0x44, 0x16, 0x89, 0x6c, 0x80, 0x2b, 0x3e, 0x97, 0xa9, 0x9c, 0xd5, 0x7e,\n+0x55, 0x4c, 0xc6, 0xde, 0x45, 0x10, 0x1c, 0xea, 0xe9, 0x3b, 0x9f, 0x03, 0x53, 0xee, 0xee, 0x7a,\n+0x01, 0x02, 0x16, 0x78, 0xd4, 0xe8, 0xc2, 0xbe, 0x46, 0x76, 0x88, 0x13, 0x3f, 0x22, 0xbb, 0x48,\n+0x12, 0x1d, 0x52, 0x00, 0xb4, 0x02, 0x7e, 0x21, 0x1a, 0x1e, 0x9c, 0x25, 0xf4, 0xf3, 0x3d, 0x5e,\n+0x1e, 0xd2, 0x1c, 0xf9, 0xb3, 0x2d, 0xb6, 0xf7, 0x37, 0x5c, 0xc6, 0xcb, 0x21, 0x4e, 0xb0, 0xf7,\n+0x99, 0x47, 0x18, 0x85, 0xc1, 0x2b, 0xba, 0x55, 0xae, 0x06, 0xea, 0xd0, 0x07, 0xb2, 0xdc, 0xab,\n+0xd0, 0x82, 0x96, 0x75, 0xce, 0xd2, 0x50, 0xfe, 0x99, 0xe7, 0xcf, 0x2f, 0x9f, 0xe7, 0x76, 0xd1,\n+0x61, 0x2a, 0xfb, 0x21, 0xbb, 0x31, 0xd0, 0xaa, 0x9f, 0x47, 0xa4, 0xb2, 0x22, 0xca, 0x16, 0x3a,\n+0x50, 0x57, 0xc4, 0x5b, 0x43, 0x67, 0xc5, 0x65, 0x62, 0x03, 0x49, 0x01, 0xeb, 0x43, 0xd9, 0xd8,\n+0xf8, 0x9e, 0xad, 0xcf, 0xb1, 0x63, 0x0e, 0x45, 0xf4, 0xa0, 0x5a, 0x2c, 0x9b, 0x2d, 0xc5, 0xa6,\n+0xc0, 0xad, 0xa8, 0x47, 0xf4, 0x27, 0x4c, 0x38, 0x0d, 0x2e, 0x1b, 0x49, 0x3b, 0x52, 0xf4, 0xe8,\n+0x88, 0x83, 0x2b, 0x54, 0x28, 0xd4, 0xf2, 0x35, 0x52, 0xb4, 0x32, 0x83, 0x62, 0x69, 0x64, 0x0c,\n+0x91, 0x9c, 0x9f, 0x97, 0xea, 0x74, 0x16, 0xfd, 0x1f, 0x11, 0x06, 0x9a, 0x9b, 0xf4, 0x30, 0x82,\n+0x05, 0xeb, 0x30, 0x82, 0x03, 0xd3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x56, 0xb6, 0x29,\n+0xcd, 0x34, 0xbc, 0x78, 0xf6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54,\n+0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48,\n+0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,\n+0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x53, 0x53, 0x4c, 0x2e, 0x63,\n+0x6f, 0x6d, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n+0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,\n+0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30,\n+0x35, 0x33, 0x31, 0x31, 0x38, 0x31, 0x34, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x35,\n+0x33, 0x30, 0x31, 0x38, 0x31, 0x34, 0x33, 0x37, 0x5a, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55,\n+0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,\n+0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72,\n+0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e,\n+0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75,\n+0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x32, 0x30, 0x82,\n+0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x8f,\n+0x36, 0x65, 0x40, 0xe1, 0xd6, 0x4d, 0xc0, 0xd7, 0xb4, 0xe9, 0x46, 0xda, 0x6b, 0xea, 0x33, 0x47,\n+0xcd, 0x4c, 0xf9, 0x7d, 0x7d, 0xbe, 0xbd, 0x2d, 0x3d, 0xf0, 0xdb, 0x78, 0xe1, 0x86, 0xa5, 0xd9,\n+0xba, 0x09, 0x57, 0x68, 0xed, 0x57, 0x3e, 0xa0, 0xd0, 0x08, 0x41, 0x83, 0xe7, 0x28, 0x41, 0x24,\n+0x1f, 0xe3, 0x72, 0x15, 0xd0, 0x01, 0x1a, 0xfb, 0x5e, 0x70, 0x23, 0xb2, 0xcb, 0x9f, 0x39, 0xe3,\n+0xcf, 0xc5, 0x4e, 0xc6, 0x92, 0x6d, 0x26, 0xc6, 0x7b, 0xbb, 0xb3, 0xda, 0x27, 0x9d, 0x0a, 0x86,\n+0xe9, 0x81, 0x37, 0x05, 0xfe, 0xf0, 0x71, 0x71, 0xec, 0xc3, 0x1c, 0xe9, 0x63, 0xa2, 0x17, 0x14,\n+0x9d, 0xef, 0x1b, 0x67, 0xd3, 0x85, 0x55, 0x02, 0x02, 0xd6, 0x49, 0xc9, 0xcc, 0x5a, 0xe1, 0xb1,\n+0xf7, 0x6f, 0x32, 0x9f, 0xc9, 0xd4, 0x3b, 0x88, 0x41, 0xa8, 0x9c, 0xbd, 0xcb, 0xab, 0xdb, 0x6d,\n+0x7b, 0x09, 0x1f, 0xa2, 0x4c, 0x72, 0x90, 0xda, 0x2b, 0x08, 0xfc, 0xcf, 0x3c, 0x54, 0xce, 0x67,\n+0x0f, 0xa8, 0xcf, 0x5d, 0x96, 0x19, 0x0b, 0xc4, 0xe3, 0x72, 0xeb, 0xad, 0xd1, 0x7d, 0x1d, 0x27,\n+0xef, 0x92, 0xeb, 0x10, 0xbf, 0x5b, 0xeb, 0x3b, 0xaf, 0xcf, 0x80, 0xdd, 0xc1, 0xd2, 0x96, 0x04,\n+0x5b, 0x7a, 0x7e, 0xa4, 0xa9, 0x3c, 0x38, 0x76, 0xa4, 0x62, 0x8e, 0xa0, 0x39, 0x5e, 0xea, 0x77,\n+0xcf, 0x5d, 0x00, 0x59, 0x8f, 0x66, 0x2c, 0x3e, 0x07, 0xa2, 0xa3, 0x05, 0x26, 0x11, 0x69, 0x97,\n+0xea, 0x85, 0xb7, 0x0f, 0x96, 0x0b, 0x4b, 0xc8, 0x40, 0xe1, 0x50, 0xba, 0x2e, 0x8a, 0xcb, 0xf7,\n+0x0f, 0x9a, 0x22, 0xe7, 0x7f, 0x9a, 0x37, 0x13, 0xcd, 0xf2, 0x4d, 0x13, 0x6b, 0x21, 0xd1, 0xc0,\n+0xcc, 0x22, 0xf2, 0xa1, 0x46, 0xf6, 0x44, 0x69, 0x9c, 0xca, 0x61, 0x35, 0x07, 0x00, 0x6f, 0xd6,\n+0x61, 0x08, 0x11, 0xea, 0xba, 0xb8, 0xf6, 0xe9, 0xb3, 0x60, 0xe5, 0x4d, 0xb9, 0xec, 0x9f, 0x14,\n+0x66, 0xc9, 0x57, 0x58, 0xdb, 0xcd, 0x87, 0x69, 0xf8, 0x8a, 0x86, 0x12, 0x03, 0x47, 0xbf, 0x66,\n+0x13, 0x76, 0xac, 0x77, 0x7d, 0x34, 0x24, 0x85, 0x83, 0xcd, 0xd7, 0xaa, 0x9c, 0x90, 0x1a, 0x9f,\n+0x21, 0x2c, 0x7f, 0x78, 0xb7, 0x64, 0xb8, 0xd8, 0xe8, 0xa6, 0xf4, 0x78, 0xb3, 0x55, 0xcb, 0x84,\n+0xd2, 0x32, 0xc4, 0x78, 0xae, 0xa3, 0x8f, 0x61, 0xdd, 0xce, 0x08, 0x53, 0xad, 0xec, 0x88, 0xfc,\n+0x15, 0xe4, 0x9a, 0x0d, 0xe6, 0x9f, 0x1a, 0x77, 0xce, 0x4c, 0x8f, 0xb8, 0x14, 0x15, 0x3d, 0x62,\n+0x9c, 0x86, 0x38, 0x06, 0x00, 0x66, 0x12, 0xe4, 0x59, 0x76, 0x5a, 0x53, 0xc0, 0x02, 0x98, 0xa2,\n+0x10, 0x2b, 0x68, 0x44, 0x7b, 0x8e, 0x79, 0xce, 0x33, 0x4a, 0x76, 0xaa, 0x5b, 0x81, 0x16, 0x1b,\n+0xb5, 0x8a, 0xd8, 0xd0, 0x00, 0x7b, 0x5e, 0x62, 0xb4, 0x09, 0xd6, 0x86, 0x63, 0x0e, 0xa6, 0x05,\n+0x95, 0x49, 0xba, 0x28, 0x8b, 0x88, 0x93, 0xb2, 0x34, 0x1c, 0xd8, 0xa4, 0x55, 0x6e, 0xb7, 0x1c,\n+0xd0, 0xde, 0x99, 0x55, 0x3b, 0x23, 0xf4, 0x22, 0xe0, 0xf9, 0x29, 0x66, 0x26, 0xec, 0x20, 0x50,\n+0x77, 0xdb, 0x4a, 0x0b, 0x8f, 0xbe, 0xe5, 0x02, 0x60, 0x70, 0x41, 0x5e, 0xd4, 0xae, 0x50, 0x39,\n+0x22, 0x14, 0x26, 0xcb, 0xb2, 0x3b, 0x73, 0x74, 0x55, 0x47, 0x07, 0x79, 0x81, 0x39, 0xa8, 0x30,\n+0x13, 0x44, 0xe5, 0x04, 0x8a, 0xae, 0x96, 0x13, 0x25, 0x42, 0x0f, 0xb9, 0x53, 0xc4, 0x9b, 0xfc,\n+0xcd, 0xe4, 0x1c, 0xde, 0x3c, 0xfa, 0xab, 0xd6, 0x06, 0x4a, 0x1f, 0x67, 0xa6, 0x98, 0x30, 0x1c,\n+0xdd, 0x2c, 0xdb, 0xdc, 0x18, 0x95, 0x57, 0x66, 0xc6, 0xff, 0x5c, 0x8b, 0x56, 0xf5, 0x77, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,\n+0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,\n+0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xf9, 0x60, 0xbb, 0xd4, 0xe3, 0xd5, 0x34, 0xf6, 0xb8, 0xf5,\n+0x06, 0x80, 0x25, 0xa7, 0x73, 0xdb, 0x46, 0x69, 0xa8, 0x9e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n+0x0e, 0x04, 0x16, 0x04, 0x14, 0xf9, 0x60, 0xbb, 0xd4, 0xe3, 0xd5, 0x34, 0xf6, 0xb8, 0xf5, 0x06,\n+0x80, 0x25, 0xa7, 0x73, 0xdb, 0x46, 0x69, 0xa8, 0x9e, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f,\n+0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x56, 0xb3, 0x8e,\n+0xcb, 0x0a, 0x9d, 0x49, 0x8e, 0xbf, 0xa4, 0xc4, 0x91, 0xbb, 0x66, 0x17, 0x05, 0x51, 0x98, 0x75,\n+0xfb, 0xe5, 0x50, 0x2c, 0x7a, 0x9e, 0xf1, 0x14, 0xfa, 0xab, 0xd3, 0x8a, 0x3e, 0xff, 0x91, 0x29,\n+0x8f, 0x63, 0x8b, 0xd8, 0xb4, 0xa9, 0x54, 0x01, 0x0d, 0xbe, 0x93, 0x86, 0x2f, 0xf9, 0x4a, 0x6d,\n+0xc7, 0x5e, 0xf5, 0x57, 0xf9, 0xca, 0x55, 0x1c, 0x12, 0xbe, 0x47, 0x0f, 0x36, 0xc5, 0xdf, 0x6a,\n+0xb7, 0xdb, 0x75, 0xc2, 0x47, 0x25, 0x7f, 0xb9, 0xf1, 0x63, 0xf8, 0x68, 0x2d, 0x55, 0x04, 0xd1,\n+0xf2, 0x8d, 0xb0, 0xa4, 0xcf, 0xbc, 0x3c, 0x5e, 0x1f, 0x78, 0xe7, 0xa5, 0xa0, 0x20, 0x70, 0xb0,\n+0x04, 0xc5, 0xb7, 0xf7, 0x72, 0xa7, 0xde, 0x22, 0x0d, 0xbd, 0x33, 0x25, 0x46, 0x8c, 0x64, 0x92,\n+0x26, 0xe3, 0x3e, 0x2e, 0x63, 0x96, 0xda, 0x9b, 0x8c, 0x3d, 0xf8, 0x18, 0x09, 0xd7, 0x03, 0xcc,\n+0x7d, 0x86, 0x82, 0xe0, 0xca, 0x04, 0x07, 0x51, 0x50, 0xd7, 0xff, 0x92, 0xd5, 0x0c, 0xef, 0xda,\n+0x86, 0x9f, 0x99, 0xd7, 0xeb, 0xb7, 0xaf, 0x68, 0xe2, 0x39, 0x26, 0x94, 0xba, 0x68, 0xb7, 0xbf,\n+0x83, 0xd3, 0xea, 0x7a, 0x67, 0x3d, 0x62, 0x67, 0xae, 0x25, 0xe5, 0x72, 0xe8, 0xe2, 0xe4, 0xec,\n+0xae, 0x12, 0xf6, 0x4b, 0x2b, 0x3c, 0x9f, 0xe9, 0xb0, 0x40, 0xf3, 0x38, 0x54, 0xb3, 0xfd, 0xb7,\n+0x68, 0xc8, 0xda, 0xc6, 0x8f, 0x51, 0x3c, 0xb2, 0xfb, 0x91, 0xdc, 0x1c, 0xe7, 0x9b, 0x9d, 0xe1,\n+0xb7, 0x0d, 0x72, 0x8f, 0xe2, 0xa4, 0xc4, 0xa9, 0x78, 0xf9, 0xeb, 0x14, 0xac, 0xc6, 0x43, 0x05,\n+0xc2, 0x65, 0x39, 0x28, 0x18, 0x02, 0xc3, 0x82, 0xb2, 0x9d, 0x05, 0xbe, 0x65, 0xed, 0x96, 0x5f,\n+0x65, 0x74, 0x3c, 0xfb, 0x09, 0x35, 0x2e, 0x7b, 0x9c, 0x13, 0xfd, 0x1b, 0x0f, 0x5d, 0xc7, 0x6d,\n+0x81, 0x3a, 0x56, 0x0f, 0xcc, 0x3b, 0xe1, 0xaf, 0x02, 0x2f, 0x22, 0xac, 0x46, 0xca, 0x46, 0x3c,\n+0xa0, 0x1c, 0x4c, 0xd6, 0x44, 0xb4, 0x5e, 0x2e, 0x5c, 0x15, 0x66, 0x09, 0xe1, 0x26, 0x29, 0xfe,\n+0xc6, 0x52, 0x61, 0xba, 0xb1, 0x73, 0xff, 0xc3, 0x0c, 0x9c, 0xe5, 0x6c, 0x6a, 0x94, 0x3f, 0x14,\n+0xca, 0x40, 0x16, 0x95, 0x84, 0xf3, 0x59, 0xa9, 0xac, 0x5f, 0x4c, 0x61, 0x93, 0x6d, 0xd1, 0x3b,\n+0xcc, 0xa2, 0x95, 0x0c, 0x22, 0xa6, 0x67, 0x67, 0x44, 0x2e, 0xb9, 0xd9, 0xd2, 0x8a, 0x41, 0xb3,\n+0x66, 0x0b, 0x5a, 0xfb, 0x7d, 0x23, 0xa5, 0xf2, 0x1a, 0xb0, 0xff, 0xde, 0x9b, 0x83, 0x94, 0x2e,\n+0xd1, 0x3f, 0xdf, 0x92, 0xb7, 0x91, 0xaf, 0x05, 0x3b, 0x65, 0xc7, 0xa0, 0x6c, 0xb1, 0xcd, 0x62,\n+0x12, 0xc3, 0x90, 0x1b, 0xe3, 0x25, 0xce, 0x34, 0xbc, 0x6f, 0x77, 0x76, 0xb1, 0x10, 0xc3, 0xf7,\n+0x05, 0x1a, 0xc0, 0xd6, 0xaf, 0x74, 0x62, 0x48, 0x17, 0x77, 0x92, 0x69, 0x90, 0x61, 0x1c, 0xde,\n+0x95, 0x80, 0x74, 0x54, 0x8f, 0x18, 0x1c, 0xc3, 0xf3, 0x03, 0xd0, 0xbf, 0xa4, 0x43, 0x75, 0x86,\n+0x53, 0x18, 0x7a, 0x0a, 0x2e, 0x09, 0x1c, 0x36, 0x9f, 0x91, 0xfd, 0x82, 0x8a, 0x22, 0x4b, 0xd1,\n+0x0e, 0x50, 0x25, 0xdd, 0xcb, 0x03, 0x0c, 0x17, 0xc9, 0x83, 0x00, 0x08, 0x4e, 0x35, 0x4d, 0x8a,\n+0x8b, 0xed, 0xf0, 0x02, 0x94, 0x66, 0x2c, 0x44, 0x7f, 0xcb, 0x95, 0x27, 0x96, 0x17, 0xad, 0x09,\n+0x30, 0xac, 0xb6, 0x71, 0x17, 0x6e, 0x8b, 0x17, 0xf6, 0x1c, 0x09, 0xd4, 0x2d, 0x3b, 0x98, 0xa5,\n+0x71, 0xd3, 0x54, 0x13, 0xd9, 0x60, 0xf3, 0xf5, 0x4b, 0x66, 0x4f, 0xfa, 0xf1, 0xee, 0x20, 0x12,\n+0x8d, 0xb4, 0xac, 0x57, 0xb1, 0x45, 0x63, 0xa1, 0xac, 0x76, 0xa9, 0xc2, 0xfb, 0x30, 0x82, 0x05,\n+0x47, 0x30, 0x82, 0x03, 0x2f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x11, 0x00, 0x34, 0xb6,\n+0x4e, 0xc6, 0x36, 0x2d, 0x36, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0b, 0x05, 0x00, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x52, 0x4f, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x43, 0x45,\n+0x52, 0x54, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x53, 0x41, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x13, 0x13, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x52, 0x4f, 0x4f,\n+0x54, 0x20, 0x43, 0x41, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x32, 0x30,\n+0x36, 0x30, 0x39, 0x32, 0x37, 0x33, 0x35, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x32, 0x30, 0x36,\n+0x30, 0x39, 0x32, 0x37, 0x33, 0x35, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x52, 0x4f, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x0b, 0x43, 0x45, 0x52, 0x54, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x53, 0x41, 0x31, 0x1c, 0x30, 0x1a,\n+0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x13, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x20,\n+0x52, 0x4f, 0x4f, 0x54, 0x20, 0x43, 0x41, 0x20, 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02,\n+0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc0, 0xc5, 0x75, 0x19, 0x91,\n+0x7d, 0x44, 0x74, 0x74, 0x87, 0xfe, 0x0e, 0x3b, 0x96, 0xdc, 0xd8, 0x01, 0x16, 0xcc, 0xee, 0x63,\n+0x91, 0xe7, 0x0b, 0x6f, 0xce, 0x3b, 0x0a, 0x69, 0x1a, 0x7c, 0xc2, 0xe3, 0xaf, 0x82, 0x8e, 0x86,\n+0xd7, 0x5e, 0x8f, 0x57, 0xeb, 0xd3, 0x21, 0x59, 0xfd, 0x39, 0x37, 0x42, 0x30, 0xbe, 0x50, 0xea,\n+0xb6, 0x0f, 0xa9, 0x88, 0xd8, 0x2e, 0x2d, 0x69, 0x21, 0xe7, 0xd1, 0x37, 0x18, 0x4e, 0x7d, 0x91,\n+0xd5, 0x16, 0x5f, 0x6b, 0x5b, 0x00, 0xc2, 0x39, 0x43, 0x0d, 0x36, 0x85, 0x52, 0xb9, 0x53, 0x65,\n+0x0f, 0x1d, 0x42, 0xe5, 0x8f, 0xcf, 0x05, 0xd3, 0xee, 0xdc, 0x0c, 0x1a, 0xd9, 0xb8, 0x8b, 0x78,\n+0x22, 0x67, 0xe4, 0x69, 0xb0, 0x68, 0xc5, 0x3c, 0xe4, 0x6c, 0x5a, 0x46, 0xe7, 0xcd, 0xc7, 0xfa,\n+0xef, 0xc4, 0xec, 0x4b, 0xbd, 0x6a, 0xa4, 0xac, 0xfd, 0xcc, 0x28, 0x51, 0xef, 0x92, 0xb4, 0x29,\n+0xab, 0xab, 0x35, 0x9a, 0x4c, 0xe4, 0xc4, 0x08, 0xc6, 0x26, 0xcc, 0xf8, 0x69, 0x9f, 0xe4, 0x9c,\n+0xf0, 0x29, 0xd3, 0x5c, 0xf9, 0xc6, 0x16, 0x25, 0x9e, 0x23, 0xc3, 0x20, 0xc1, 0x3d, 0x0f, 0x3f,\n+0x38, 0x40, 0xb0, 0xfe, 0x82, 0x44, 0x38, 0xaa, 0x5a, 0x1a, 0x8a, 0x6b, 0x63, 0x58, 0x38, 0xb4,\n+0x15, 0xd3, 0xb6, 0x11, 0x69, 0x7b, 0x1e, 0x54, 0xee, 0x8c, 0x1a, 0x22, 0xac, 0x72, 0x97, 0x3f,\n+0x23, 0x59, 0x9b, 0xc9, 0x22, 0x84, 0xc1, 0x07, 0x4f, 0xcc, 0x7f, 0xe2, 0x57, 0xca, 0x12, 0x70,\n+0xbb, 0xa6, 0x65, 0xf3, 0x69, 0x75, 0x63, 0xbd, 0x95, 0xfb, 0x1b, 0x97, 0xcd, 0xe4, 0xa8, 0xaf,\n+0xf6, 0xd1, 0x4e, 0xa8, 0xd9, 0x8a, 0x71, 0x24, 0xcd, 0x36, 0x3d, 0xbc, 0x96, 0xc4, 0xf1, 0x6c,\n+0xa9, 0xae, 0xe5, 0xcf, 0x0d, 0x6e, 0x28, 0x0d, 0xb0, 0x0e, 0xb5, 0xca, 0x51, 0x7b, 0x78, 0x14,\n+0xc3, 0x20, 0x2f, 0x7f, 0xfb, 0x14, 0x55, 0xe1, 0x11, 0x99, 0xfd, 0xd5, 0x0a, 0xa1, 0x9e, 0x02,\n+0xe3, 0x62, 0x5f, 0xeb, 0x35, 0x4b, 0x2c, 0xb8, 0x72, 0xe8, 0x3e, 0x3d, 0x4f, 0xac, 0x2c, 0xbb,\n+0x2e, 0x86, 0xe2, 0xa3, 0x76, 0x8f, 0xe5, 0x93, 0x2a, 0xcf, 0xa5, 0xab, 0xc8, 0x5c, 0x8d, 0x4b,\n+0x06, 0xff, 0x12, 0x46, 0xac, 0x78, 0xcb, 0x14, 0x07, 0x35, 0xe0, 0xa9, 0xdf, 0x8b, 0xe9, 0xaf,\n+0x15, 0x4f, 0x16, 0x89, 0x5b, 0xbd, 0xf6, 0x8d, 0xc6, 0x59, 0xae, 0x88, 0x85, 0x0e, 0xc1, 0x89,\n+0xeb, 0x1f, 0x67, 0xc5, 0x45, 0x8e, 0xff, 0x6d, 0x37, 0x36, 0x2b, 0x78, 0x66, 0x83, 0x91, 0x51,\n+0x2b, 0x3d, 0xff, 0x51, 0x77, 0x76, 0x62, 0xa1, 0xec, 0x67, 0x3e, 0x3e, 0x81, 0x83, 0xe0, 0x56,\n+0xa9, 0x50, 0x1f, 0x1f, 0x7a, 0x99, 0xab, 0x63, 0xbf, 0x84, 0x17, 0x77, 0xf1, 0x0d, 0x3b, 0xdf,\n+0xf7, 0x9c, 0x61, 0xb3, 0x35, 0x98, 0x8a, 0x3a, 0xb2, 0xec, 0x3c, 0x1a, 0x37, 0x3f, 0x7e, 0x8f,\n+0x92, 0xcf, 0xd9, 0x12, 0x14, 0x64, 0xda, 0x10, 0x02, 0x15, 0x41, 0xff, 0x4f, 0xc4, 0xeb, 0x1c,\n+0xa3, 0xc9, 0xfa, 0x99, 0xf7, 0x46, 0xe9, 0xe1, 0x18, 0xd9, 0xb1, 0xb8, 0x32, 0x2d, 0xcb, 0x14,\n+0x0c, 0x50, 0xd8, 0x83, 0x65, 0x83, 0xee, 0xb9, 0x5c, 0xcf, 0xcb, 0x05, 0x5a, 0x4c, 0xfa, 0x19,\n+0x97, 0x6b, 0xd6, 0x5d, 0x13, 0xd3, 0xc2, 0x5c, 0x54, 0xbc, 0x32, 0x73, 0xa0, 0x78, 0xf5, 0xf1,\n+0x6d, 0x1e, 0xcb, 0x9f, 0xa5, 0xa6, 0x9f, 0x22, 0xdc, 0xd1, 0x51, 0x9e, 0x82, 0x79, 0x64, 0x60,\n+0x29, 0x13, 0x3e, 0xa3, 0xfd, 0x4f, 0x72, 0x6a, 0xab, 0xe2, 0xd4, 0xe5, 0xb8, 0x24, 0x55, 0x2c,\n+0x44, 0x4b, 0x8a, 0x88, 0x44, 0x9c, 0xca, 0x84, 0xd3, 0x2a, 0x3b, 0x02, 0x03, 0x01, 0x00, 0x01,\n+0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n+0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+0x82, 0x21, 0x2d, 0x66, 0xc6, 0xd7, 0xa0, 0xe0, 0x15, 0xeb, 0xce, 0x4c, 0x09, 0x77, 0xc4, 0x60,\n+0x9e, 0x54, 0x6e, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x60, 0xde, 0x1a, 0xb8, 0xe7, 0xf2, 0x60, 0x82,\n+0xd5, 0x03, 0x33, 0x81, 0xcb, 0x06, 0x8a, 0xf1, 0x22, 0x49, 0xe9, 0xe8, 0xea, 0x91, 0x7f, 0xc6,\n+0x33, 0x5e, 0x68, 0x19, 0x03, 0x86, 0x3b, 0x43, 0x01, 0xcf, 0x07, 0x70, 0xe4, 0x08, 0x1e, 0x65,\n+0x85, 0x91, 0xe6, 0x11, 0x22, 0xb7, 0xf5, 0x02, 0x23, 0x8e, 0xae, 0xb9, 0x1e, 0x7d, 0x1f, 0x7e,\n+0x6c, 0xe6, 0xbd, 0x25, 0xd5, 0x95, 0x1a, 0xf2, 0x05, 0xa6, 0xaf, 0x85, 0x02, 0x6f, 0xae, 0xf8,\n+0xd6, 0x31, 0xff, 0x25, 0xc9, 0x4a, 0xc8, 0xc7, 0x8a, 0xa9, 0xd9, 0x9f, 0x4b, 0x49, 0x9b, 0x11,\n+0x57, 0x99, 0x92, 0x43, 0x11, 0xde, 0xb6, 0x33, 0xa4, 0xcc, 0xd7, 0x8d, 0x64, 0x7d, 0xd4, 0xcd,\n+0x3c, 0x28, 0x2c, 0xb4, 0x9a, 0x96, 0xea, 0x4d, 0xf5, 0xc4, 0x44, 0xc4, 0x25, 0xaa, 0x20, 0x80,\n+0xd8, 0x29, 0x55, 0xf7, 0xe0, 0x41, 0xfc, 0x06, 0x26, 0xff, 0xb9, 0x36, 0xf5, 0x43, 0x14, 0x03,\n+0x66, 0x78, 0xe1, 0x11, 0xb1, 0xda, 0x20, 0x5f, 0x46, 0x00, 0x78, 0x00, 0x21, 0xa5, 0x1e, 0x00,\n+0x28, 0x61, 0x78, 0x6f, 0xa8, 0x01, 0x01, 0x8f, 0x9d, 0x34, 0x9a, 0xff, 0xf4, 0x38, 0x90, 0xfb,\n+0xb8, 0xd1, 0xb3, 0x72, 0x06, 0xc9, 0x71, 0xe6, 0x81, 0xc5, 0x79, 0xed, 0x0b, 0xa6, 0x79, 0xf2,\n+0x13, 0x0b, 0x9c, 0xf7, 0x5d, 0x0e, 0x7b, 0x24, 0x93, 0xb4, 0x48, 0xdb, 0x86, 0x5f, 0xde, 0x50,\n+0x86, 0x78, 0xe7, 0x40, 0xe6, 0x31, 0xa8, 0x90, 0x76, 0x70, 0x61, 0xaf, 0x9c, 0x37, 0x2c, 0x11,\n+0xb5, 0x82, 0xb7, 0xaa, 0xae, 0x24, 0x34, 0x5b, 0x72, 0x0c, 0x69, 0x0d, 0xcd, 0x59, 0x9f, 0xf6,\n+0x71, 0xaf, 0x9c, 0x0b, 0xd1, 0x0a, 0x38, 0xf9, 0x06, 0x22, 0x83, 0x53, 0x25, 0x0c, 0xfc, 0x51,\n+0xc4, 0xe6, 0xbe, 0xe2, 0x39, 0x95, 0x0b, 0x24, 0xad, 0xaf, 0xd1, 0x95, 0xe4, 0x96, 0xd7, 0x74,\n+0x64, 0x6b, 0x71, 0x4e, 0x02, 0x3c, 0xaa, 0x85, 0xf3, 0x20, 0xa3, 0x43, 0x39, 0x76, 0x5b, 0x6c,\n+0x50, 0xfe, 0x9a, 0x9c, 0x14, 0x1e, 0x65, 0x14, 0x8a, 0x15, 0xbd, 0xa3, 0x82, 0x45, 0x5a, 0x49,\n+0x56, 0x6a, 0xd2, 0x9c, 0xb1, 0x63, 0x32, 0xe5, 0x61, 0xe0, 0x53, 0x22, 0x0e, 0xa7, 0x0a, 0x49,\n+0xea, 0xcb, 0x7e, 0x1f, 0xa8, 0xe2, 0x62, 0x80, 0xf6, 0x10, 0x45, 0x52, 0x98, 0x06, 0x18, 0xde,\n+0xa5, 0xcd, 0x2f, 0x7f, 0xaa, 0xd4, 0xe9, 0x3e, 0x08, 0x72, 0xec, 0x23, 0x03, 0x02, 0x3c, 0xa6,\n+0xaa, 0xd8, 0xbc, 0x67, 0x74, 0x3d, 0x14, 0x17, 0xfb, 0x54, 0x4b, 0x17, 0xe3, 0xd3, 0x79, 0x3d,\n+0x6d, 0x6b, 0x49, 0xc9, 0x28, 0x0e, 0x2e, 0x74, 0x50, 0xbf, 0x0c, 0xd9, 0x46, 0x3a, 0x10, 0x86,\n+0xc9, 0xa7, 0x3f, 0xe9, 0xa0, 0xec, 0x7f, 0xeb, 0xa5, 0x77, 0x58, 0x69, 0x71, 0xe6, 0x83, 0x0a,\n+0x37, 0xf2, 0x86, 0x49, 0x6a, 0xbe, 0x79, 0x08, 0x90, 0xf6, 0x02, 0x16, 0x64, 0x3e, 0xe5, 0xda,\n+0x4c, 0x7e, 0x0c, 0x34, 0xc9, 0xf9, 0x5f, 0xb6, 0xb3, 0x28, 0x51, 0xa7, 0xa7, 0x2b, 0xaa, 0x49,\n+0xfa, 0x8d, 0x65, 0x29, 0x4e, 0xe3, 0x6b, 0x13, 0xa7, 0x94, 0xa3, 0x2d, 0x51, 0x6d, 0x78, 0x0c,\n+0x44, 0xcb, 0xdf, 0xde, 0x08, 0x6f, 0xce, 0xa3, 0x64, 0xab, 0xd3, 0x95, 0x84, 0xd4, 0xb9, 0x52,\n+0x54, 0x72, 0x7b, 0x96, 0x25, 0xcc, 0xbc, 0x69, 0xe3, 0x48, 0x6e, 0x0d, 0xd0, 0xc7, 0x9d, 0x27,\n+0x9a, 0xaa, 0xf8, 0x13, 0x92, 0xdd, 0x1e, 0xdf, 0x63, 0x9f, 0x35, 0xa9, 0x16, 0x36, 0xec, 0x8c,\n+0xb8, 0x83, 0xf4, 0x3d, 0x89, 0x8f, 0xcd, 0xb4, 0x17, 0x5e, 0xd7, 0xb3, 0x17, 0x41, 0x10, 0x5d,\n+0x27, 0x73, 0x60, 0x85, 0x57, 0x49, 0x22, 0x07, 0x30, 0x82, 0x02, 0x69, 0x30, 0x82, 0x01, 0xef,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x21, 0x2a, 0x56, 0x0c, 0xae, 0xda, 0x0c, 0xab, 0x40,\n+0x45, 0xbf, 0x2b, 0xa2, 0x2d, 0x3a, 0xea, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n+0x04, 0x03, 0x03, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x43, 0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53,\n+0x65, 0x4b, 0x65, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f,\n+0x49, 0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n+0x45, 0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79,\n+0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x43, 0x20,\n+0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x35, 0x30, 0x39, 0x30, 0x39, 0x34, 0x38,\n+0x33, 0x34, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x35, 0x30, 0x39, 0x30, 0x39, 0x35, 0x38, 0x33,\n+0x33, 0x5a, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43,\n+0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53, 0x65,\n+0x4b, 0x65, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f, 0x49,\n+0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45,\n+0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x20,\n+0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x43, 0x20, 0x43,\n+0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05,\n+0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x4c, 0xe9, 0x50, 0xc0, 0xc6, 0x0f, 0x72,\n+0x18, 0xbc, 0xd8, 0xf1, 0xba, 0xb3, 0x89, 0xe2, 0x79, 0x4a, 0xa3, 0x16, 0xa7, 0x6b, 0x54, 0x24,\n+0xdb, 0x51, 0xff, 0xea, 0xf4, 0x09, 0x24, 0xc3, 0x0b, 0x22, 0x9f, 0xcb, 0x6a, 0x27, 0x82, 0x81,\n+0x0d, 0xd2, 0xc0, 0xaf, 0x31, 0xe4, 0x74, 0x82, 0x6e, 0xca, 0x25, 0xd9, 0x8c, 0x75, 0x9d, 0xf1,\n+0xdb, 0xd0, 0x9a, 0xa2, 0x4b, 0x21, 0x7e, 0x16, 0xa7, 0x63, 0x90, 0xd2, 0x39, 0xd4, 0xb1, 0x87,\n+0x78, 0x5f, 0x18, 0x96, 0x0f, 0x50, 0x1b, 0x35, 0x37, 0x0f, 0x6a, 0xc6, 0xdc, 0xd9, 0x13, 0x4d,\n+0xa4, 0x8e, 0x90, 0x37, 0xe6, 0xbd, 0x5b, 0x31, 0x91, 0xa3, 0x54, 0x30, 0x52, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48, 0x87, 0x14, 0xac, 0xe3, 0xc3, 0x9e,\n+0x90, 0x60, 0x3a, 0xd7, 0xca, 0x89, 0xee, 0xd3, 0xad, 0x8c, 0xb4, 0x50, 0x66, 0x30, 0x10, 0x06,\n+0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30,\n+0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65,\n+0x02, 0x30, 0x26, 0xc7, 0x69, 0x5b, 0xdc, 0xd5, 0xe7, 0xb2, 0xe7, 0xc8, 0x0c, 0x8c, 0x8c, 0xc3,\n+0xdd, 0x79, 0x8c, 0x1b, 0x63, 0xd5, 0xc9, 0x52, 0x94, 0x4e, 0x4d, 0x82, 0x4a, 0x73, 0x1e, 0xb2,\n+0x80, 0x84, 0xa9, 0x25, 0xc0, 0x4c, 0x5a, 0x6d, 0x49, 0x29, 0x60, 0x78, 0x13, 0xe2, 0x7e, 0x48,\n+0xeb, 0x64, 0x02, 0x31, 0x00, 0xdb, 0x34, 0x20, 0x32, 0x08, 0xff, 0x9a, 0x49, 0x02, 0xb6, 0x88,\n+0xde, 0x14, 0xaf, 0x5d, 0x6c, 0x99, 0x71, 0x8d, 0x1a, 0x3f, 0x8b, 0xd7, 0xe0, 0xa2, 0x36, 0x86,\n+0x1c, 0x07, 0x82, 0x3a, 0x76, 0x53, 0xfd, 0xc2, 0xa2, 0xed, 0xef, 0x7b, 0xb0, 0x80, 0x4f, 0x58,\n+0x0f, 0x4b, 0x53, 0x39, 0xbd, 0x30, 0x82, 0x03, 0xb5, 0x30, 0x82, 0x02, 0x9d, 0xa0, 0x03, 0x02,\n+0x01, 0x02, 0x02, 0x10, 0x76, 0xb1, 0x20, 0x52, 0x74, 0xf0, 0x85, 0x87, 0x46, 0xb3, 0xf8, 0x23,\n+0x1a, 0xf6, 0xc2, 0xc0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x43, 0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53,\n+0x65, 0x4b, 0x65, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f,\n+0x49, 0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n+0x45, 0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79,\n+0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x42, 0x20,\n+0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x32, 0x30, 0x31, 0x31, 0x35, 0x30, 0x30,\n+0x33, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x31, 0x32, 0x30, 0x31, 0x31, 0x35, 0x31, 0x30, 0x33,\n+0x31, 0x5a, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43,\n+0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53, 0x65,\n+0x4b, 0x65, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f, 0x49,\n+0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45,\n+0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x20,\n+0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x42, 0x20, 0x43,\n+0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01,\n+0x01, 0x00, 0xd8, 0x17, 0xb7, 0x1c, 0x4a, 0x24, 0x2a, 0xd6, 0x97, 0xb1, 0xca, 0xe2, 0x1e, 0xfb,\n+0x7d, 0x38, 0xef, 0x98, 0xf5, 0xb2, 0x39, 0x98, 0x4e, 0x27, 0xb8, 0x11, 0x5d, 0x7b, 0xd2, 0x25,\n+0x94, 0x88, 0x82, 0x15, 0x26, 0x6a, 0x1b, 0x31, 0xbb, 0xa8, 0x5b, 0x21, 0x21, 0x2b, 0xd8, 0x0f,\n+0x4e, 0x9f, 0x5a, 0xf1, 0xb1, 0x5a, 0xe4, 0x79, 0xd6, 0x32, 0x23, 0x2b, 0xe1, 0x53, 0xcc, 0x99,\n+0x45, 0x5c, 0x7b, 0x4f, 0xad, 0xbc, 0xbf, 0x87, 0x4a, 0x0b, 0x4b, 0x97, 0x5a, 0xa8, 0xf6, 0x48,\n+0xec, 0x7d, 0x7b, 0x0d, 0xcd, 0x21, 0x06, 0xdf, 0x9e, 0x15, 0xfd, 0x41, 0x8a, 0x48, 0xb7, 0x20,\n+0xf4, 0xa1, 0x7a, 0x1b, 0x57, 0xd4, 0x5d, 0x50, 0xff, 0xba, 0x67, 0xd8, 0x23, 0x99, 0x1f, 0xc8,\n+0x3f, 0xe3, 0xde, 0xff, 0x6f, 0x5b, 0x77, 0xb1, 0x6b, 0x6e, 0xb8, 0xc9, 0x64, 0xf7, 0xe1, 0xca,\n+0x41, 0x46, 0x0e, 0x29, 0x71, 0xd0, 0xb9, 0x23, 0xfc, 0xc9, 0x81, 0x5f, 0x4e, 0xf7, 0x6f, 0xdf,\n+0xbf, 0x84, 0xad, 0x73, 0x64, 0xbb, 0xb7, 0x42, 0x8e, 0x69, 0xf6, 0xd4, 0x76, 0x1d, 0x7e, 0x9d,\n+0xa7, 0xb8, 0x57, 0x8a, 0x51, 0x67, 0x72, 0xd7, 0xd4, 0xa8, 0xb8, 0x95, 0x54, 0x40, 0x73, 0x03,\n+0xf6, 0xea, 0xf4, 0xeb, 0xfe, 0x28, 0x42, 0x77, 0x3f, 0x9d, 0x23, 0x1b, 0xb2, 0xb6, 0x3d, 0x80,\n+0x14, 0x07, 0x4c, 0x2e, 0x4f, 0xf7, 0xd5, 0x0a, 0x16, 0x0d, 0xbd, 0x66, 0x43, 0x37, 0x7e, 0x23,\n+0x43, 0x79, 0xc3, 0x40, 0x86, 0xf5, 0x4c, 0x29, 0xda, 0x8e, 0x9a, 0xad, 0x0d, 0xa5, 0x04, 0x87,\n+0x88, 0x1e, 0x85, 0xe3, 0xe9, 0x53, 0xd5, 0x9b, 0xc8, 0x8b, 0x03, 0x63, 0x78, 0xeb, 0xe0, 0x19,\n+0x4a, 0x6e, 0xbb, 0x2f, 0x6b, 0x33, 0x64, 0x58, 0x93, 0xad, 0x69, 0xbf, 0x8f, 0x1b, 0xef, 0x82,\n+0x48, 0xc7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x51, 0x30, 0x4f, 0x30, 0x0b, 0x06, 0x03, 0x55,\n+0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,\n+0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\n+0x04, 0x16, 0x04, 0x14, 0x35, 0x0f, 0xc8, 0x36, 0x63, 0x5e, 0xe2, 0xa3, 0xec, 0xf9, 0x3b, 0x66,\n+0x15, 0xce, 0x51, 0x52, 0xe3, 0x91, 0x9a, 0x3d, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04,\n+0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x40, 0x4c,\n+0xfb, 0x87, 0xb2, 0x99, 0x81, 0x90, 0x7e, 0x9d, 0xc5, 0xb0, 0xb0, 0x26, 0xcd, 0x88, 0x7b, 0x2b,\n+0x32, 0x8d, 0x6e, 0xb8, 0x21, 0x71, 0x58, 0x97, 0x7d, 0xae, 0x37, 0x14, 0xaf, 0x3e, 0xe7, 0xf7,\n+0x9a, 0xe2, 0x7d, 0xf6, 0x71, 0x98, 0x99, 0x04, 0xaa, 0x43, 0x74, 0x78, 0xa3, 0xe3, 0x49, 0x61,\n+0x3e, 0x73, 0x8c, 0x4d, 0x94, 0xe0, 0xf9, 0x71, 0xc4, 0xb6, 0x16, 0x0e, 0x53, 0x78, 0x1f, 0xd6,\n+0xa2, 0x87, 0x2f, 0x02, 0x39, 0x81, 0x29, 0x3c, 0xaf, 0x15, 0x98, 0x21, 0x30, 0xfe, 0x28, 0x90,\n+0x00, 0x8c, 0xd1, 0xe1, 0xcb, 0xfa, 0x5e, 0xc8, 0xfd, 0xf8, 0x10, 0x46, 0x3b, 0xa2, 0x78, 0x42,\n+0x91, 0x17, 0x74, 0x55, 0x0a, 0xde, 0x50, 0x67, 0x4d, 0x66, 0xd1, 0xa7, 0xff, 0xfd, 0xd9, 0xc0,\n+0xb5, 0xa8, 0xa3, 0x8a, 0xce, 0x66, 0xf5, 0x0f, 0x43, 0xcd, 0xa7, 0x2b, 0x57, 0x7b, 0x63, 0x46,\n+0x6a, 0xaa, 0x2e, 0x52, 0xd8, 0xf4, 0xed, 0xe1, 0x6d, 0xad, 0x29, 0x90, 0x78, 0x48, 0xba, 0xe1,\n+0x23, 0xaa, 0xa3, 0x89, 0xec, 0xb5, 0xab, 0x96, 0xc0, 0xb4, 0x4b, 0xa2, 0x1d, 0x97, 0x9e, 0x7a,\n+0xf2, 0x6e, 0x40, 0x71, 0xdf, 0x68, 0xf1, 0x65, 0x4d, 0xce, 0x7c, 0x05, 0xdf, 0x53, 0x65, 0xa9,\n+0xa5, 0xf0, 0xb1, 0x97, 0x04, 0x70, 0x15, 0x46, 0x03, 0x98, 0xd4, 0xd2, 0xbf, 0x54, 0xb4, 0xa0,\n+0x58, 0x7d, 0x52, 0x6f, 0xda, 0x56, 0x26, 0x62, 0xd4, 0xd8, 0xdb, 0x89, 0x31, 0x6f, 0x1c, 0xf0,\n+0x22, 0xc2, 0xd3, 0x62, 0x1c, 0x35, 0xcd, 0x4c, 0x69, 0x15, 0x54, 0x1a, 0x90, 0x98, 0xde, 0xeb,\n+0x1e, 0x5f, 0xca, 0x77, 0xc7, 0xcb, 0x8e, 0x3d, 0x43, 0x69, 0x9c, 0x9a, 0x58, 0xd0, 0x24, 0x3b,\n+0xdf, 0x1b, 0x40, 0x96, 0x7e, 0x35, 0xad, 0x81, 0xc7, 0x4e, 0x71, 0xba, 0x88, 0x13, 0x30, 0x82,\n+0x03, 0x72, 0x30, 0x82, 0x02, 0x5a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x3e, 0x8a, 0x5d,\n+0x07, 0xec, 0x55, 0xd2, 0x32, 0xd5, 0xb7, 0xe3, 0xb6, 0x5f, 0x01, 0xeb, 0x2d, 0xdc, 0xe4, 0xd6,\n+0xe4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n+0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31,\n+0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1f, 0x4b, 0x72, 0x61, 0x6a, 0x6f, 0x77,\n+0x61, 0x20, 0x49, 0x7a, 0x62, 0x61, 0x20, 0x52, 0x6f, 0x7a, 0x6c, 0x69, 0x63, 0x7a, 0x65, 0x6e,\n+0x69, 0x6f, 0x77, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x0c, 0x0f, 0x53, 0x5a, 0x41, 0x46, 0x49, 0x52, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x20,\n+0x43, 0x41, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x31, 0x30, 0x31, 0x39, 0x30, 0x37, 0x34,\n+0x33, 0x33, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x35, 0x31, 0x30, 0x31, 0x39, 0x30, 0x37, 0x34, 0x33,\n+0x33, 0x30, 0x5a, 0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x50, 0x4c, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1f, 0x4b, 0x72, 0x61,\n+0x6a, 0x6f, 0x77, 0x61, 0x20, 0x49, 0x7a, 0x62, 0x61, 0x20, 0x52, 0x6f, 0x7a, 0x6c, 0x69, 0x63,\n+0x7a, 0x65, 0x6e, 0x69, 0x6f, 0x77, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x18, 0x30, 0x16,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x53, 0x5a, 0x41, 0x46, 0x49, 0x52, 0x20, 0x52, 0x4f,\n+0x4f, 0x54, 0x20, 0x43, 0x41, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82,\n+0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0xbc, 0x3e, 0x50, 0xa8, 0x4b, 0xcd, 0x40, 0xb5,\n+0xce, 0x61, 0xe7, 0x96, 0xca, 0xb4, 0xa1, 0xda, 0x0c, 0x22, 0xb0, 0xfa, 0xb5, 0x7b, 0x76, 0x00,\n+0x77, 0x8c, 0x0b, 0xcf, 0x7d, 0xa8, 0x86, 0xcc, 0x26, 0x51, 0xe4, 0x20, 0x3d, 0x85, 0x0c, 0xd6,\n+0x58, 0xe3, 0xe7, 0xf4, 0x2a, 0x18, 0x9d, 0xda, 0xd1, 0xae, 0x26, 0xee, 0xeb, 0x53, 0xdc, 0xf4,\n+0x90, 0xd6, 0x13, 0x4a, 0x0c, 0x90, 0x3c, 0xc3, 0xf4, 0xda, 0xd2, 0x8e, 0x0d, 0x92, 0x3a, 0xdc,\n+0xb1, 0xb1, 0xff, 0x38, 0xde, 0xc3, 0xba, 0x2d, 0x5f, 0x80, 0xb9, 0x02, 0xbd, 0x4a, 0x9d, 0x1b,\n+0x0f, 0xb4, 0xc3, 0xc2, 0xc1, 0x67, 0x03, 0xdd, 0xdc, 0x1b, 0x9c, 0x3d, 0xb3, 0xb0, 0xde, 0x00,\n+0x1e, 0xa8, 0x34, 0x47, 0xbb, 0x9a, 0xeb, 0xfe, 0x0b, 0x14, 0xbd, 0x36, 0x84, 0xda, 0x0d, 0x20,\n+0xbf, 0xfa, 0x5b, 0xcb, 0xa9, 0x16, 0x20, 0xad, 0x39, 0x60, 0xee, 0x2f, 0x75, 0xb6, 0xe7, 0x97,\n+0x9c, 0xf9, 0x3e, 0xfd, 0x7e, 0x4d, 0x6f, 0x4d, 0x2f, 0xef, 0x88, 0x0d, 0x6a, 0xfa, 0xdd, 0xf1,\n+0x3d, 0x6e, 0x20, 0xa5, 0xa0, 0x12, 0xb4, 0x4d, 0x70, 0xb9, 0xce, 0xd7, 0x72, 0x3b, 0x89, 0x93,\n+0xa7, 0x80, 0x84, 0x1c, 0x27, 0x49, 0x72, 0x49, 0xb5, 0xff, 0x3b, 0x95, 0x9e, 0xc1, 0xcc, 0xc8,\n+0x01, 0xec, 0xe8, 0x0e, 0x8a, 0x0a, 0x96, 0xe7, 0xb3, 0xa6, 0x87, 0xe5, 0xd6, 0xf9, 0x05, 0x2b,\n+0x0d, 0x97, 0x40, 0x70, 0x3c, 0xba, 0xac, 0x75, 0x5a, 0x9c, 0xd5, 0x4d, 0x9d, 0x02, 0x0a, 0xd2,\n+0x4b, 0x9b, 0x66, 0x4b, 0x46, 0x07, 0x17, 0x65, 0xad, 0x9f, 0x6c, 0x88, 0x00, 0xdc, 0x22, 0x89,\n+0xe0, 0xe1, 0x64, 0xd4, 0x67, 0xbc, 0x31, 0x79, 0x61, 0x3c, 0xbb, 0xca, 0x41, 0xcd, 0x5c, 0x6a,\n+0x00, 0xc8, 0x3c, 0x38, 0x8e, 0x58, 0xaf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n+0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n+0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x2e, 0x16, 0xa9, 0x4a,\n+0x18, 0xb5, 0xcb, 0xcc, 0xf5, 0x6f, 0x50, 0xf3, 0x23, 0x5f, 0xf8, 0x5d, 0xe7, 0xac, 0xf0, 0xc8,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03,\n+0x82, 0x01, 0x01, 0x00, 0xb5, 0x73, 0xf8, 0x03, 0xdc, 0x59, 0x5b, 0x1d, 0x76, 0xe9, 0xa3, 0x2a,\n+0x7b, 0x90, 0x28, 0xb2, 0x4d, 0xc0, 0x33, 0x4f, 0xaa, 0x9a, 0xb1, 0xd4, 0xb8, 0xe4, 0x27, 0xff,\n+0xa9, 0x96, 0x99, 0xce, 0x46, 0xe0, 0x6d, 0x7c, 0x4c, 0xa2, 0x38, 0xa4, 0x06, 0x70, 0xf0, 0xf4,\n+0x41, 0x11, 0xec, 0x3f, 0x47, 0x8d, 0x3f, 0x72, 0x87, 0xf9, 0x3b, 0xfd, 0xa4, 0x6f, 0x2b, 0x53,\n+0x00, 0xe0, 0xff, 0x39, 0xb9, 0x6a, 0x07, 0x0e, 0xeb, 0x1d, 0x1c, 0xf6, 0xa2, 0x72, 0x90, 0xcb,\n+0x82, 0x3d, 0x11, 0x82, 0x8b, 0xd2, 0xbb, 0x9f, 0x2a, 0xaf, 0x21, 0xe6, 0x63, 0x86, 0x9d, 0x79,\n+0x19, 0xef, 0xf7, 0xbb, 0x0c, 0x35, 0x90, 0xc3, 0x8a, 0xed, 0x4f, 0x0f, 0xf5, 0xcc, 0x12, 0xd9,\n+0xa4, 0x3e, 0xbb, 0xa0, 0xfc, 0x20, 0x95, 0x5f, 0x4f, 0x26, 0x2f, 0x11, 0x23, 0x83, 0x4e, 0x75,\n+0x07, 0x0f, 0xbf, 0x9b, 0xd1, 0xb4, 0x1d, 0xe9, 0x10, 0x04, 0xfe, 0xca, 0x60, 0x8f, 0xa2, 0x4c,\n+0xb8, 0xad, 0xcf, 0xe1, 0x90, 0x0f, 0xcd, 0xae, 0x0a, 0xc7, 0x5d, 0x7b, 0xb7, 0x50, 0xd2, 0xd4,\n+0x61, 0xfa, 0xd5, 0x15, 0xdb, 0xd7, 0x9f, 0x87, 0x51, 0x54, 0xeb, 0xa5, 0xe3, 0xeb, 0xc9, 0x85,\n+0xa0, 0x25, 0x20, 0x37, 0xfb, 0x8e, 0xce, 0x0c, 0x34, 0x84, 0xe1, 0x3c, 0x81, 0xb2, 0x77, 0x4e,\n+0x43, 0xa5, 0x88, 0x5f, 0x86, 0x67, 0xa1, 0x3d, 0xe6, 0xb4, 0x5c, 0x61, 0xb6, 0x3e, 0xdb, 0xfe,\n+0xb7, 0x28, 0xc5, 0xa2, 0x07, 0xae, 0xb5, 0xca, 0xca, 0x8d, 0x2a, 0x12, 0xef, 0x97, 0xed, 0xc2,\n+0x30, 0xa4, 0xc9, 0x2a, 0x7a, 0xfb, 0xf3, 0x4d, 0x23, 0x1b, 0x99, 0x33, 0x34, 0xa0, 0x2e, 0xf5,\n+0xa9, 0x0b, 0x3f, 0xd4, 0x5d, 0xe1, 0xcf, 0x84, 0x9f, 0xe2, 0x19, 0xc2, 0x5f, 0x8a, 0xd6, 0x20,\n+0x1e, 0xe3, 0x73, 0xb7, 0x30, 0x82, 0x05, 0xd2, 0x30, 0x82, 0x03, 0xba, 0xa0, 0x03, 0x02, 0x01,\n+0x02, 0x02, 0x10, 0x21, 0xd6, 0xd0, 0x4a, 0x4f, 0x25, 0x0f, 0xc9, 0x32, 0x37, 0xfc, 0xaa, 0x5e,\n+0x12, 0x8d, 0xe9, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0d,\n+0x05, 0x00, 0x30, 0x81, 0x80, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x50, 0x4c, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x55, 0x6e, 0x69,\n+0x7a, 0x65, 0x74, 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65,\n+0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,\n+0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n+0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31,\n+0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d,\n+0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,\n+0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x22, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30,\n+0x36, 0x30, 0x38, 0x33, 0x39, 0x35, 0x36, 0x5a, 0x18, 0x0f, 0x32, 0x30, 0x34, 0x36, 0x31, 0x30,\n+0x30, 0x36, 0x30, 0x38, 0x33, 0x39, 0x35, 0x36, 0x5a, 0x30, 0x81, 0x80, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x19, 0x55, 0x6e, 0x69, 0x7a, 0x65, 0x74, 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68,\n+0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30,\n+0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43,\n+0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74,\n+0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x1b, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20,\n+0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n+0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xbd, 0xf9, 0x78,\n+0xf8, 0xe6, 0xd5, 0x80, 0x0c, 0x64, 0x9d, 0x86, 0x1b, 0x96, 0x64, 0x67, 0x3f, 0x22, 0x3a, 0x1e,\n+0x75, 0x01, 0x7d, 0xef, 0xfb, 0x5c, 0x67, 0x8c, 0xc9, 0xcc, 0x5c, 0x6b, 0xa9, 0x91, 0xe6, 0xb9,\n+0x42, 0xe5, 0x20, 0x4b, 0x9b, 0xda, 0x9b, 0x7b, 0xb9, 0x99, 0x5d, 0xd9, 0x9b, 0x80, 0x4b, 0xd7,\n+0x84, 0x40, 0x2b, 0x27, 0xd3, 0xe8, 0xba, 0x30, 0xbb, 0x3e, 0x09, 0x1a, 0xa7, 0x49, 0x95, 0xef,\n+0x2b, 0x40, 0x24, 0xc2, 0x97, 0xc7, 0xa7, 0xee, 0x9b, 0x25, 0xef, 0xa8, 0x0a, 0x00, 0x97, 0x85,\n+0x5a, 0xaa, 0x9d, 0xdc, 0x29, 0xc9, 0xe2, 0x35, 0x07, 0xeb, 0x70, 0x4d, 0x4a, 0xd6, 0xc1, 0xb3,\n+0x56, 0xb8, 0xa1, 0x41, 0x38, 0x9b, 0xd1, 0xfb, 0x31, 0x7f, 0x8f, 0xe0, 0x5f, 0xe1, 0xb1, 0x3f,\n+0x0f, 0x8e, 0x16, 0x49, 0x60, 0xd7, 0x06, 0x8d, 0x18, 0xf9, 0xaa, 0x26, 0x10, 0xab, 0x2a, 0xd3,\n+0xd0, 0xd1, 0x67, 0x8d, 0x1b, 0x46, 0xbe, 0x47, 0x30, 0xd5, 0x2e, 0x72, 0xd1, 0xc5, 0x63, 0xda,\n+0xe7, 0x63, 0x79, 0x44, 0x7e, 0x4b, 0x63, 0x24, 0x89, 0x86, 0x2e, 0x34, 0x3f, 0x29, 0x4c, 0x52,\n+0x8b, 0x2a, 0xa7, 0xc0, 0xe2, 0x91, 0x28, 0x89, 0xb9, 0xc0, 0x5b, 0xf9, 0x1d, 0xd9, 0xe7, 0x27,\n+0xad, 0xff, 0x9a, 0x02, 0x97, 0xc1, 0xc6, 0x50, 0x92, 0x9b, 0x02, 0x2c, 0xbd, 0xa9, 0xb9, 0x34,\n+0x59, 0x0a, 0xbf, 0x84, 0x4a, 0xff, 0xdf, 0xfe, 0xb3, 0x9f, 0xeb, 0xd9, 0x9e, 0xe0, 0x98, 0x23,\n+0xec, 0xa6, 0x6b, 0x77, 0x16, 0x2a, 0xdb, 0xcc, 0xad, 0x3b, 0x1c, 0xa4, 0x87, 0xdc, 0x46, 0x73,\n+0x5e, 0x19, 0x62, 0x68, 0x45, 0x57, 0xe4, 0x90, 0x82, 0x42, 0xbb, 0x42, 0xd6, 0xf0, 0x61, 0xe0,\n+0xc1, 0xa3, 0x3d, 0x66, 0xa3, 0x5d, 0xf4, 0x18, 0xee, 0x88, 0xc9, 0x8d, 0x17, 0x45, 0x29, 0x99,\n+0x32, 0x75, 0x02, 0x31, 0xee, 0x29, 0x26, 0xc8, 0x6b, 0x02, 0xe6, 0xb5, 0x62, 0x45, 0x7f, 0x37,\n+0x15, 0x5a, 0x23, 0x68, 0x89, 0xd4, 0x3e, 0xde, 0x4e, 0x27, 0xb0, 0xf0, 0x40, 0x0c, 0xbc, 0x4d,\n+0x17, 0xcb, 0x4d, 0xa2, 0xb3, 0x1e, 0xd0, 0x06, 0x5a, 0xdd, 0xf6, 0x93, 0xcf, 0x57, 0x75, 0x99,\n+0xf5, 0xfa, 0x86, 0x1a, 0x67, 0x78, 0xb3, 0xbf, 0x96, 0xfe, 0x34, 0xdc, 0xbd, 0xe7, 0x52, 0x56,\n+0xe5, 0xb3, 0xe5, 0x75, 0x7b, 0xd7, 0x41, 0x91, 0x05, 0xdc, 0x5d, 0x69, 0xe3, 0x95, 0x0d, 0x43,\n+0xb9, 0xfc, 0x83, 0x96, 0x39, 0x95, 0x7b, 0x6c, 0x80, 0x5a, 0x4f, 0x13, 0x72, 0xc6, 0xd7, 0x7d,\n+0x29, 0x7a, 0x44, 0xba, 0x52, 0xa4, 0x2a, 0xd5, 0x41, 0x46, 0x09, 0x20, 0xfe, 0x22, 0xa0, 0xb6,\n+0x5b, 0x30, 0x8d, 0xbc, 0x89, 0x0c, 0xd5, 0xd7, 0x70, 0xf8, 0x87, 0x52, 0xfd, 0xda, 0xef, 0xac,\n+0x51, 0x2e, 0x07, 0xb3, 0x4e, 0xfe, 0xd0, 0x09, 0xda, 0x70, 0xef, 0x98, 0xfa, 0x56, 0xe6, 0x6d,\n+0xdb, 0xb5, 0x57, 0x4b, 0xdc, 0xe5, 0x2c, 0x25, 0x15, 0xc8, 0x9e, 0x2e, 0x78, 0x4e, 0xf8, 0xda,\n+0x9c, 0x9e, 0x86, 0x2c, 0xca, 0x57, 0xf3, 0x1a, 0xe5, 0xc8, 0x92, 0x8b, 0x1a, 0x82, 0x96, 0x7a,\n+0xc3, 0xbc, 0x50, 0x12, 0x69, 0xd8, 0x0e, 0x5a, 0x46, 0x8b, 0x3a, 0xeb, 0x26, 0xfa, 0x23, 0xc9,\n+0xb6, 0xb0, 0x81, 0xbe, 0x42, 0x00, 0xa4, 0xf8, 0xd6, 0xfe, 0x30, 0x2e, 0xc7, 0xd2, 0x46, 0xf6,\n+0xe5, 0x8e, 0x75, 0xfd, 0xf2, 0xcc, 0xb9, 0xd0, 0x87, 0x5b, 0xcc, 0x06, 0x10, 0x60, 0xbb, 0x83,\n+0x35, 0xb7, 0x5e, 0x67, 0xde, 0x47, 0xec, 0x99, 0x48, 0xf1, 0xa4, 0xa1, 0x15, 0xfe, 0xad, 0x8c,\n+0x62, 0x8e, 0x39, 0x55, 0x4f, 0x39, 0x16, 0xb9, 0xb1, 0x63, 0x9d, 0xff, 0xb7, 0x02, 0x03, 0x01,\n+0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n+0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n+0x04, 0x14, 0xb6, 0xa1, 0x54, 0x39, 0x02, 0xc3, 0xa0, 0x3f, 0x8e, 0x8a, 0xbc, 0xfa, 0xd4, 0xf8,\n+0x1c, 0xa6, 0xd1, 0x3a, 0x0e, 0xfd, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0d, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x71, 0xa5, 0x0e, 0xce, 0xe4, 0xe9,\n+0xbf, 0x3f, 0x38, 0xd5, 0x89, 0x5a, 0xc4, 0x02, 0x61, 0xfb, 0x4c, 0xc5, 0x14, 0x17, 0x2d, 0x8b,\n+0x4f, 0x53, 0x6b, 0x10, 0x17, 0xfc, 0x65, 0x84, 0xc7, 0x10, 0x49, 0x90, 0xde, 0xdb, 0xc7, 0x26,\n+0x93, 0x88, 0x26, 0x6f, 0x70, 0xd6, 0x02, 0x5e, 0x39, 0xa0, 0xf7, 0x8f, 0xab, 0x96, 0xb5, 0xa5,\n+0x13, 0x5c, 0x81, 0x14, 0x6d, 0x0e, 0x81, 0x82, 0x11, 0x1b, 0x8a, 0x4e, 0xc6, 0x4f, 0xa5, 0xdd,\n+0x62, 0x1e, 0x44, 0xdf, 0x09, 0x59, 0xf4, 0x5b, 0x77, 0x0b, 0x37, 0xe9, 0x8b, 0x20, 0xc6, 0xf8,\n+0x0a, 0x4e, 0x2e, 0x58, 0x1c, 0xeb, 0x33, 0xd0, 0xcf, 0x86, 0x60, 0xc9, 0xda, 0xfb, 0x80, 0x2f,\n+0x9e, 0x4c, 0x60, 0x84, 0x78, 0x3d, 0x21, 0x64, 0xd6, 0xfb, 0x41, 0x1f, 0x18, 0x0f, 0xe7, 0xc9,\n+0x75, 0x71, 0xbd, 0xbd, 0x5c, 0xde, 0x34, 0x87, 0x3e, 0x41, 0xb0, 0x0e, 0xf6, 0xb9, 0xd6, 0x3f,\n+0x09, 0x13, 0x96, 0x14, 0x2f, 0xde, 0x9a, 0x1d, 0x5a, 0xb9, 0x56, 0xce, 0x35, 0x3a, 0xb0, 0x5f,\n+0x70, 0x4d, 0x5e, 0xe3, 0x29, 0xf1, 0x23, 0x28, 0x72, 0x59, 0xb6, 0xab, 0xc2, 0x8c, 0x66, 0x26,\n+0x1c, 0x77, 0x2c, 0x26, 0x76, 0x35, 0x8b, 0x28, 0xa7, 0x69, 0xa0, 0xf9, 0x3b, 0xf5, 0x23, 0xdd,\n+0x85, 0x10, 0x74, 0xc9, 0x90, 0x03, 0x56, 0x91, 0xe7, 0xaf, 0xba, 0x47, 0xd4, 0x12, 0x97, 0x11,\n+0x22, 0xe3, 0xa2, 0x49, 0x94, 0x6c, 0xe7, 0xb7, 0x94, 0x4b, 0xba, 0x2d, 0xa4, 0xda, 0x33, 0x8b,\n+0x4c, 0xa6, 0x44, 0xff, 0x5a, 0x3c, 0xc6, 0x1d, 0x64, 0xd8, 0xb5, 0x31, 0xe4, 0xa6, 0x3c, 0x7a,\n+0xa8, 0x57, 0x0b, 0xdb, 0xed, 0x61, 0x1a, 0xcb, 0xf1, 0xce, 0x73, 0x77, 0x63, 0xa4, 0x87, 0x6f,\n+0x4c, 0x51, 0x38, 0xd6, 0xe4, 0x5f, 0xc7, 0x9f, 0xb6, 0x81, 0x2a, 0xe4, 0x85, 0x48, 0x79, 0x58,\n+0x5e, 0x3b, 0xf8, 0xdb, 0x02, 0x82, 0x67, 0xc1, 0x39, 0xdb, 0xc3, 0x74, 0x4b, 0x3d, 0x36, 0x1e,\n+0xf9, 0x29, 0x93, 0x88, 0x68, 0x5b, 0xa8, 0x44, 0x19, 0x21, 0xf0, 0xa7, 0xe8, 0x81, 0x0d, 0x2c,\n+0xe8, 0x93, 0x36, 0xb4, 0x37, 0xb2, 0xca, 0xb0, 0x1b, 0x26, 0x7a, 0x9a, 0x25, 0x1f, 0x9a, 0x9a,\n+0x80, 0x9e, 0x4b, 0x2a, 0x3f, 0xfb, 0xa3, 0x9a, 0xfe, 0x73, 0x32, 0x71, 0xc2, 0x9e, 0xc6, 0x72,\n+0xe1, 0x8a, 0x68, 0x27, 0xf1, 0xe4, 0x0f, 0xb4, 0xc4, 0x4c, 0xa5, 0x61, 0x93, 0xf8, 0x97, 0x10,\n+0x07, 0x2a, 0x30, 0x25, 0xa9, 0xb9, 0xc8, 0x71, 0xb8, 0xef, 0x68, 0xcc, 0x2d, 0x7e, 0xf5, 0xe0,\n+0x7e, 0x0f, 0x82, 0xa8, 0x6f, 0xb6, 0xba, 0x6c, 0x83, 0x43, 0x77, 0xcd, 0x8a, 0x92, 0x17, 0xa1,\n+0x9e, 0x5b, 0x78, 0x16, 0x3d, 0x45, 0xe2, 0x33, 0x72, 0xdd, 0xe1, 0x66, 0xca, 0x99, 0xd3, 0xc9,\n+0xc5, 0x26, 0xfd, 0x0d, 0x68, 0x04, 0x46, 0xae, 0xb6, 0xd9, 0x9b, 0x8c, 0xbe, 0x19, 0xbe, 0xb1,\n+0xc6, 0xf2, 0x19, 0xe3, 0x5c, 0x02, 0xca, 0x2c, 0xd8, 0x6f, 0x4a, 0x07, 0xd9, 0xc9, 0x35, 0xda,\n+0x40, 0x75, 0xf2, 0xc4, 0xa7, 0x19, 0x6f, 0x9e, 0x42, 0x10, 0x98, 0x75, 0xe6, 0x95, 0x8b, 0x60,\n+0xbc, 0xed, 0xc5, 0x12, 0xd7, 0x8a, 0xce, 0xd5, 0x98, 0x5c, 0x56, 0x96, 0x03, 0xc5, 0xee, 0x77,\n+0x06, 0x35, 0xff, 0xcf, 0xe4, 0xee, 0x3f, 0x13, 0x61, 0xee, 0xdb, 0xda, 0x2d, 0x85, 0xf0, 0xcd,\n+0xae, 0x9d, 0xb2, 0x18, 0x09, 0x45, 0xc3, 0x92, 0xa1, 0x72, 0x17, 0xfc, 0x47, 0xb6, 0xa0, 0x0b,\n+0x2c, 0xf1, 0xc4, 0xde, 0x43, 0x68, 0x08, 0x6a, 0x5f, 0x3b, 0xf0, 0x76, 0x63, 0xfb, 0xcc, 0x06,\n+0x2c, 0xa6, 0xc6, 0xe2, 0x0e, 0xb5, 0xb9, 0xbe, 0x24, 0x8f, 0x30, 0x82, 0x02, 0x6e, 0x30, 0x82,\n+0x01, 0xf3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x62, 0xf6, 0x32, 0x6c, 0xe5, 0xc4, 0xe3,\n+0x68, 0x5c, 0x1b, 0x62, 0xdd, 0x9c, 0x2e, 0x9d, 0x95, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n+0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x78, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x45, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x46,\n+0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x0c, 0x05, 0x43, 0x65, 0x72, 0x65, 0x73, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x61,\n+0x0c, 0x0f, 0x56, 0x41, 0x54, 0x45, 0x53, 0x2d, 0x51, 0x32, 0x38, 0x32, 0x36, 0x30, 0x30, 0x34,\n+0x4a, 0x31, 0x2c, 0x30, 0x2a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x23, 0x41, 0x43, 0x20, 0x52,\n+0x41, 0x49, 0x5a, 0x20, 0x46, 0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x20, 0x53, 0x45, 0x52,\n+0x56, 0x49, 0x44, 0x4f, 0x52, 0x45, 0x53, 0x20, 0x53, 0x45, 0x47, 0x55, 0x52, 0x4f, 0x53, 0x30,\n+0x1e, 0x17, 0x0d, 0x31, 0x38, 0x31, 0x32, 0x32, 0x30, 0x30, 0x39, 0x33, 0x37, 0x33, 0x33, 0x5a,\n+0x17, 0x0d, 0x34, 0x33, 0x31, 0x32, 0x32, 0x30, 0x30, 0x39, 0x33, 0x37, 0x33, 0x33, 0x5a, 0x30,\n+0x78, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x11,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x46, 0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43,\n+0x4d, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x05, 0x43, 0x65, 0x72, 0x65,\n+0x73, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x61, 0x0c, 0x0f, 0x56, 0x41, 0x54, 0x45,\n+0x53, 0x2d, 0x51, 0x32, 0x38, 0x32, 0x36, 0x30, 0x30, 0x34, 0x4a, 0x31, 0x2c, 0x30, 0x2a, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x0c, 0x23, 0x41, 0x43, 0x20, 0x52, 0x41, 0x49, 0x5a, 0x20, 0x46, 0x4e,\n+0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x44, 0x4f, 0x52, 0x45,\n+0x53, 0x20, 0x53, 0x45, 0x47, 0x55, 0x52, 0x4f, 0x53, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a,\n+0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00,\n+0x04, 0xf6, 0xba, 0x57, 0x53, 0xc8, 0xca, 0xab, 0xdf, 0x36, 0x4a, 0x52, 0x21, 0xe4, 0x97, 0xd2,\n+0x83, 0x67, 0x9e, 0xf0, 0x65, 0x51, 0xd0, 0x5e, 0x87, 0xc7, 0x47, 0xb1, 0x59, 0xf2, 0x57, 0x47,\n+0x9b, 0x00, 0x02, 0x93, 0x44, 0x17, 0x69, 0xdb, 0x42, 0xc7, 0xb1, 0xb2, 0x3a, 0x18, 0x0e, 0xb4,\n+0x5d, 0x8c, 0xb3, 0x66, 0x5d, 0xa1, 0x34, 0xf9, 0x36, 0x2c, 0x49, 0xdb, 0xf3, 0x46, 0xfc, 0xb3,\n+0x44, 0x69, 0x44, 0x13, 0x66, 0xfd, 0xd7, 0xc5, 0xfd, 0xaf, 0x36, 0x4d, 0xce, 0x03, 0x4d, 0x07,\n+0x71, 0xcf, 0xaf, 0x6a, 0x05, 0xd2, 0xa2, 0x43, 0x5a, 0x0a, 0x52, 0x6f, 0x01, 0x03, 0x4e, 0x8e,\n+0x8b, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n+0x14, 0x01, 0xb9, 0x2f, 0xef, 0xbf, 0x11, 0x86, 0x60, 0xf2, 0x4f, 0xd0, 0x41, 0x6e, 0xab, 0x73,\n+0x1f, 0xe7, 0xd2, 0x6e, 0x49, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03,\n+0x03, 0x03, 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xae, 0x4a, 0xe3, 0x2b, 0x40, 0xc3, 0x74,\n+0x11, 0xf2, 0x95, 0xad, 0x16, 0x23, 0xde, 0x4e, 0x0c, 0x1a, 0xe6, 0x5d, 0xa5, 0x24, 0x5e, 0x6b,\n+0x44, 0x7b, 0xfc, 0x38, 0xe2, 0x4f, 0xcb, 0x9c, 0x45, 0x17, 0x11, 0x4c, 0x14, 0x27, 0x26, 0x55,\n+0x39, 0x75, 0x4a, 0x03, 0xcc, 0x13, 0x90, 0x9f, 0x92, 0x02, 0x31, 0x00, 0xfa, 0x4a, 0x6c, 0x60,\n+0x88, 0x73, 0xf3, 0xee, 0xb8, 0x98, 0x62, 0xa9, 0xce, 0x2b, 0xc2, 0xd9, 0x8a, 0xa6, 0x70, 0x31,\n+0x1d, 0xaf, 0xb0, 0x94, 0x4c, 0xeb, 0x4f, 0xc6, 0xe3, 0xd1, 0xf3, 0x62, 0xa7, 0x3c, 0xff, 0x93,\n+0x2e, 0x07, 0x5c, 0x49, 0x01, 0x67, 0x69, 0x12, 0x02, 0x72, 0xbf, 0xe7, 0x30, 0x82, 0x05, 0x6b,\n+0x30, 0x82, 0x03, 0x53, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0x82, 0x10, 0xcf, 0xb0,\n+0xd2, 0x40, 0xe3, 0x59, 0x44, 0x63, 0xe0, 0xbb, 0x63, 0x82, 0x8b, 0x00, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4f, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x53, 0x65,\n+0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20,\n+0x47, 0x72, 0x6f, 0x75, 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0c,\n+0x49, 0x53, 0x52, 0x47, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x58, 0x31, 0x30, 0x1e, 0x17, 0x0d,\n+0x31, 0x35, 0x30, 0x36, 0x30, 0x34, 0x31, 0x31, 0x30, 0x34, 0x33, 0x38, 0x5a, 0x17, 0x0d, 0x33,\n+0x35, 0x30, 0x36, 0x30, 0x34, 0x31, 0x31, 0x30, 0x34, 0x33, 0x38, 0x5a, 0x30, 0x4f, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x29, 0x30, 0x27, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x53,\n+0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,\n+0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x0c, 0x49, 0x53, 0x52, 0x47, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x58, 0x31, 0x30, 0x82, 0x02,\n+0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,\n+0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xad, 0xe8,\n+0x24, 0x73, 0xf4, 0x14, 0x37, 0xf3, 0x9b, 0x9e, 0x2b, 0x57, 0x28, 0x1c, 0x87, 0xbe, 0xdc, 0xb7,\n+0xdf, 0x38, 0x90, 0x8c, 0x6e, 0x3c, 0xe6, 0x57, 0xa0, 0x78, 0xf7, 0x75, 0xc2, 0xa2, 0xfe, 0xf5,\n+0x6a, 0x6e, 0xf6, 0x00, 0x4f, 0x28, 0xdb, 0xde, 0x68, 0x86, 0x6c, 0x44, 0x93, 0xb6, 0xb1, 0x63,\n+0xfd, 0x14, 0x12, 0x6b, 0xbf, 0x1f, 0xd2, 0xea, 0x31, 0x9b, 0x21, 0x7e, 0xd1, 0x33, 0x3c, 0xba,\n+0x48, 0xf5, 0xdd, 0x79, 0xdf, 0xb3, 0xb8, 0xff, 0x12, 0xf1, 0x21, 0x9a, 0x4b, 0xc1, 0x8a, 0x86,\n+0x71, 0x69, 0x4a, 0x66, 0x66, 0x6c, 0x8f, 0x7e, 0x3c, 0x70, 0xbf, 0xad, 0x29, 0x22, 0x06, 0xf3,\n+0xe4, 0xc0, 0xe6, 0x80, 0xae, 0xe2, 0x4b, 0x8f, 0xb7, 0x99, 0x7e, 0x94, 0x03, 0x9f, 0xd3, 0x47,\n+0x97, 0x7c, 0x99, 0x48, 0x23, 0x53, 0xe8, 0x38, 0xae, 0x4f, 0x0a, 0x6f, 0x83, 0x2e, 0xd1, 0x49,\n+0x57, 0x8c, 0x80, 0x74, 0xb6, 0xda, 0x2f, 0xd0, 0x38, 0x8d, 0x7b, 0x03, 0x70, 0x21, 0x1b, 0x75,\n+0xf2, 0x30, 0x3c, 0xfa, 0x8f, 0xae, 0xdd, 0xda, 0x63, 0xab, 0xeb, 0x16, 0x4f, 0xc2, 0x8e, 0x11,\n+0x4b, 0x7e, 0xcf, 0x0b, 0xe8, 0xff, 0xb5, 0x77, 0x2e, 0xf4, 0xb2, 0x7b, 0x4a, 0xe0, 0x4c, 0x12,\n+0x25, 0x0c, 0x70, 0x8d, 0x03, 0x29, 0xa0, 0xe1, 0x53, 0x24, 0xec, 0x13, 0xd9, 0xee, 0x19, 0xbf,\n+0x10, 0xb3, 0x4a, 0x8c, 0x3f, 0x89, 0xa3, 0x61, 0x51, 0xde, 0xac, 0x87, 0x07, 0x94, 0xf4, 0x63,\n+0x71, 0xec, 0x2e, 0xe2, 0x6f, 0x5b, 0x98, 0x81, 0xe1, 0x89, 0x5c, 0x34, 0x79, 0x6c, 0x76, 0xef,\n+0x3b, 0x90, 0x62, 0x79, 0xe6, 0xdb, 0xa4, 0x9a, 0x2f, 0x26, 0xc5, 0xd0, 0x10, 0xe1, 0x0e, 0xde,\n+0xd9, 0x10, 0x8e, 0x16, 0xfb, 0xb7, 0xf7, 0xa8, 0xf7, 0xc7, 0xe5, 0x02, 0x07, 0x98, 0x8f, 0x36,\n+0x08, 0x95, 0xe7, 0xe2, 0x37, 0x96, 0x0d, 0x36, 0x75, 0x9e, 0xfb, 0x0e, 0x72, 0xb1, 0x1d, 0x9b,\n+0xbc, 0x03, 0xf9, 0x49, 0x05, 0xd8, 0x81, 0xdd, 0x05, 0xb4, 0x2a, 0xd6, 0x41, 0xe9, 0xac, 0x01,\n+0x76, 0x95, 0x0a, 0x0f, 0xd8, 0xdf, 0xd5, 0xbd, 0x12, 0x1f, 0x35, 0x2f, 0x28, 0x17, 0x6c, 0xd2,\n+0x98, 0xc1, 0xa8, 0x09, 0x64, 0x77, 0x6e, 0x47, 0x37, 0xba, 0xce, 0xac, 0x59, 0x5e, 0x68, 0x9d,\n+0x7f, 0x72, 0xd6, 0x89, 0xc5, 0x06, 0x41, 0x29, 0x3e, 0x59, 0x3e, 0xdd, 0x26, 0xf5, 0x24, 0xc9,\n+0x11, 0xa7, 0x5a, 0xa3, 0x4c, 0x40, 0x1f, 0x46, 0xa1, 0x99, 0xb5, 0xa7, 0x3a, 0x51, 0x6e, 0x86,\n+0x3b, 0x9e, 0x7d, 0x72, 0xa7, 0x12, 0x05, 0x78, 0x59, 0xed, 0x3e, 0x51, 0x78, 0x15, 0x0b, 0x03,\n+0x8f, 0x8d, 0xd0, 0x2f, 0x05, 0xb2, 0x3e, 0x7b, 0x4a, 0x1c, 0x4b, 0x73, 0x05, 0x12, 0xfc, 0xc6,\n+0xea, 0xe0, 0x50, 0x13, 0x7c, 0x43, 0x93, 0x74, 0xb3, 0xca, 0x74, 0xe7, 0x8e, 0x1f, 0x01, 0x08,\n+0xd0, 0x30, 0xd4, 0x5b, 0x71, 0x36, 0xb4, 0x07, 0xba, 0xc1, 0x30, 0x30, 0x5c, 0x48, 0xb7, 0x82,\n+0x3b, 0x98, 0xa6, 0x7d, 0x60, 0x8a, 0xa2, 0xa3, 0x29, 0x82, 0xcc, 0xba, 0xbd, 0x83, 0x04, 0x1b,\n+0xa2, 0x83, 0x03, 0x41, 0xa1, 0xd6, 0x05, 0xf1, 0x1b, 0xc2, 0xb6, 0xf0, 0xa8, 0x7c, 0x86, 0x3b,\n+0x46, 0xa8, 0x48, 0x2a, 0x88, 0xdc, 0x76, 0x9a, 0x76, 0xbf, 0x1f, 0x6a, 0xa5, 0x3d, 0x19, 0x8f,\n+0xeb, 0x38, 0xf3, 0x64, 0xde, 0xc8, 0x2b, 0x0d, 0x0a, 0x28, 0xff, 0xf7, 0xdb, 0xe2, 0x15, 0x42,\n+0xd4, 0x22, 0xd0, 0x27, 0x5d, 0xe1, 0x79, 0xfe, 0x18, 0xe7, 0x70, 0x88, 0xad, 0x4e, 0xe6, 0xd9,\n+0x8b, 0x3a, 0xc6, 0xdd, 0x27, 0x51, 0x6e, 0xff, 0xbc, 0x64, 0xf5, 0x33, 0x43, 0x4f, 0x02, 0x03,\n+0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,\n+0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n+0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0x79, 0xb4, 0x59, 0xe6, 0x7b, 0xb6, 0xe5, 0xe4, 0x01, 0x73, 0x80, 0x08, 0x88,\n+0xc8, 0x1a, 0x58, 0xf6, 0xe9, 0x9b, 0x6e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x55, 0x1f, 0x58, 0xa9, 0xbc,\n+0xb2, 0xa8, 0x50, 0xd0, 0x0c, 0xb1, 0xd8, 0x1a, 0x69, 0x20, 0x27, 0x29, 0x08, 0xac, 0x61, 0x75,\n+0x5c, 0x8a, 0x6e, 0xf8, 0x82, 0xe5, 0x69, 0x2f, 0xd5, 0xf6, 0x56, 0x4b, 0xb9, 0xb8, 0x73, 0x10,\n+0x59, 0xd3, 0x21, 0x97, 0x7e, 0xe7, 0x4c, 0x71, 0xfb, 0xb2, 0xd2, 0x60, 0xad, 0x39, 0xa8, 0x0b,\n+0xea, 0x17, 0x21, 0x56, 0x85, 0xf1, 0x50, 0x0e, 0x59, 0xeb, 0xce, 0xe0, 0x59, 0xe9, 0xba, 0xc9,\n+0x15, 0xef, 0x86, 0x9d, 0x8f, 0x84, 0x80, 0xf6, 0xe4, 0xe9, 0x91, 0x90, 0xdc, 0x17, 0x9b, 0x62,\n+0x1b, 0x45, 0xf0, 0x66, 0x95, 0xd2, 0x7c, 0x6f, 0xc2, 0xea, 0x3b, 0xef, 0x1f, 0xcf, 0xcb, 0xd6,\n+0xae, 0x27, 0xf1, 0xa9, 0xb0, 0xc8, 0xae, 0xfd, 0x7d, 0x7e, 0x9a, 0xfa, 0x22, 0x04, 0xeb, 0xff,\n+0xd9, 0x7f, 0xea, 0x91, 0x2b, 0x22, 0xb1, 0x17, 0x0e, 0x8f, 0xf2, 0x8a, 0x34, 0x5b, 0x58, 0xd8,\n+0xfc, 0x01, 0xc9, 0x54, 0xb9, 0xb8, 0x26, 0xcc, 0x8a, 0x88, 0x33, 0x89, 0x4c, 0x2d, 0x84, 0x3c,\n+0x82, 0xdf, 0xee, 0x96, 0x57, 0x05, 0xba, 0x2c, 0xbb, 0xf7, 0xc4, 0xb7, 0xc7, 0x4e, 0x3b, 0x82,\n+0xbe, 0x31, 0xc8, 0x22, 0x73, 0x73, 0x92, 0xd1, 0xc2, 0x80, 0xa4, 0x39, 0x39, 0x10, 0x33, 0x23,\n+0x82, 0x4c, 0x3c, 0x9f, 0x86, 0xb2, 0x55, 0x98, 0x1d, 0xbe, 0x29, 0x86, 0x8c, 0x22, 0x9b, 0x9e,\n+0xe2, 0x6b, 0x3b, 0x57, 0x3a, 0x82, 0x70, 0x4d, 0xdc, 0x09, 0xc7, 0x89, 0xcb, 0x0a, 0x07, 0x4d,\n+0x6c, 0xe8, 0x5d, 0x8e, 0xc9, 0xef, 0xce, 0xab, 0xc7, 0xbb, 0xb5, 0x2b, 0x4e, 0x45, 0xd6, 0x4a,\n+0xd0, 0x26, 0xcc, 0xe5, 0x72, 0xca, 0x08, 0x6a, 0xa5, 0x95, 0xe3, 0x15, 0xa1, 0xf7, 0xa4, 0xed,\n+0xc9, 0x2c, 0x5f, 0xa5, 0xfb, 0xff, 0xac, 0x28, 0x02, 0x2e, 0xbe, 0xd7, 0x7b, 0xbb, 0xe3, 0x71,\n+0x7b, 0x90, 0x16, 0xd3, 0x07, 0x5e, 0x46, 0x53, 0x7c, 0x37, 0x07, 0x42, 0x8c, 0xd3, 0xc4, 0x96,\n+0x9c, 0xd5, 0x99, 0xb5, 0x2a, 0xe0, 0x95, 0x1a, 0x80, 0x48, 0xae, 0x4c, 0x39, 0x07, 0xce, 0xcc,\n+0x47, 0xa4, 0x52, 0x95, 0x2b, 0xba, 0xb8, 0xfb, 0xad, 0xd2, 0x33, 0x53, 0x7d, 0xe5, 0x1d, 0x4d,\n+0x6d, 0xd5, 0xa1, 0xb1, 0xc7, 0x42, 0x6f, 0xe6, 0x40, 0x27, 0x35, 0x5c, 0xa3, 0x28, 0xb7, 0x07,\n+0x8d, 0xe7, 0x8d, 0x33, 0x90, 0xe7, 0x23, 0x9f, 0xfb, 0x50, 0x9c, 0x79, 0x6c, 0x46, 0xd5, 0xb4,\n+0x15, 0xb3, 0x96, 0x6e, 0x7e, 0x9b, 0x0c, 0x96, 0x3a, 0xb8, 0x52, 0x2d, 0x3f, 0xd6, 0x5b, 0xe1,\n+0xfb, 0x08, 0xc2, 0x84, 0xfe, 0x24, 0xa8, 0xa3, 0x89, 0xda, 0xac, 0x6a, 0xe1, 0x18, 0x2a, 0xb1,\n+0xa8, 0x43, 0x61, 0x5b, 0xd3, 0x1f, 0xdc, 0x3b, 0x8d, 0x76, 0xf2, 0x2d, 0xe8, 0x8d, 0x75, 0xdf,\n+0x17, 0x33, 0x6c, 0x3d, 0x53, 0xfb, 0x7b, 0xcb, 0x41, 0x5f, 0xff, 0xdc, 0xa2, 0xd0, 0x61, 0x38,\n+0xe1, 0x96, 0xb8, 0xac, 0x5d, 0x8b, 0x37, 0xd7, 0x75, 0xd5, 0x33, 0xc0, 0x99, 0x11, 0xae, 0x9d,\n+0x41, 0xc1, 0x72, 0x75, 0x84, 0xbe, 0x02, 0x41, 0x42, 0x5f, 0x67, 0x24, 0x48, 0x94, 0xd1, 0x9b,\n+0x27, 0xbe, 0x07, 0x3f, 0xb9, 0xb8, 0x4f, 0x81, 0x74, 0x51, 0xe1, 0x7a, 0xb7, 0xed, 0x9d, 0x23,\n+0xe2, 0xbe, 0xe0, 0xd5, 0x28, 0x04, 0x13, 0x3c, 0x31, 0x03, 0x9e, 0xdd, 0x7a, 0x6c, 0x8f, 0xc6,\n+0x07, 0x18, 0xc6, 0x7f, 0xde, 0x47, 0x8e, 0x3f, 0x28, 0x9e, 0x04, 0x06, 0xcf, 0xa5, 0x54, 0x34,\n+0x77, 0xbd, 0xec, 0x89, 0x9b, 0xe9, 0x17, 0x43, 0xdf, 0x5b, 0xdb, 0x5f, 0xfe, 0x8e, 0x1e, 0x57,\n+0xa2, 0xcd, 0x40, 0x9d, 0x7e, 0x62, 0x22, 0xda, 0xde, 0x18, 0x27, 0x30, 0x82, 0x04, 0x63, 0x30,\n+0x82, 0x03, 0x4b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xd2, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,\n+0x55, 0x04, 0x07, 0x13, 0x0f, 0x47, 0x65, 0x62, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x4b, 0x6f, 0x63,\n+0x61, 0x65, 0x6c, 0x69, 0x31, 0x42, 0x30, 0x40, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x39, 0x54,\n+0x75, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0x6d, 0x73, 0x65, 0x6c, 0x20,\n+0x76, 0x65, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6b, 0x20, 0x41, 0x72,\n+0x61, 0x73, 0x74, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x75, 0x20, 0x2d,\n+0x20, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4b, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04,\n+0x0b, 0x13, 0x24, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b,\n+0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x72, 0x6b, 0x65, 0x7a, 0x69, 0x20, 0x2d, 0x20,\n+0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x4d, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x2d, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4b, 0x20, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53,\n+0x4d, 0x20, 0x53, 0x53, 0x4c, 0x20, 0x4b, 0x6f, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66,\n+0x69, 0x6b, 0x61, 0x73, 0x69, 0x20, 0x2d, 0x20, 0x53, 0x75, 0x72, 0x75, 0x6d, 0x20, 0x31, 0x30,\n+0x1e, 0x17, 0x0d, 0x31, 0x33, 0x31, 0x31, 0x32, 0x35, 0x30, 0x38, 0x32, 0x35, 0x35, 0x35, 0x5a,\n+0x17, 0x0d, 0x34, 0x33, 0x31, 0x30, 0x32, 0x35, 0x30, 0x38, 0x32, 0x35, 0x35, 0x35, 0x5a, 0x30,\n+0x81, 0xd2, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31,\n+0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0f, 0x47, 0x65, 0x62, 0x7a, 0x65, 0x20,\n+0x2d, 0x20, 0x4b, 0x6f, 0x63, 0x61, 0x65, 0x6c, 0x69, 0x31, 0x42, 0x30, 0x40, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x39, 0x54, 0x75, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69,\n+0x6d, 0x73, 0x65, 0x6c, 0x20, 0x76, 0x65, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a,\n+0x69, 0x6b, 0x20, 0x41, 0x72, 0x61, 0x73, 0x74, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x4b, 0x75, 0x72,\n+0x75, 0x6d, 0x75, 0x20, 0x2d, 0x20, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4b, 0x31, 0x2d, 0x30,\n+0x2b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x24, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x72, 0x6b, 0x65,\n+0x7a, 0x69, 0x20, 0x2d, 0x20, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x4d, 0x31, 0x36, 0x30, 0x34,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4b, 0x20, 0x4b,\n+0x61, 0x6d, 0x75, 0x20, 0x53, 0x4d, 0x20, 0x53, 0x53, 0x4c, 0x20, 0x4b, 0x6f, 0x6b, 0x20, 0x53,\n+0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, 0x69, 0x20, 0x2d, 0x20, 0x53, 0x75, 0x72,\n+0x75, 0x6d, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a,\n+0x02, 0x82, 0x01, 0x01, 0x00, 0xaf, 0x75, 0x30, 0x33, 0xaa, 0xbb, 0x6b, 0xd3, 0x99, 0x2c, 0x12,\n+0x37, 0x84, 0xd9, 0x8d, 0x7b, 0x97, 0x80, 0xd3, 0x6e, 0xe7, 0xff, 0x9b, 0x50, 0x95, 0x3e, 0x90,\n+0x95, 0x56, 0x42, 0xd7, 0x19, 0x7c, 0x26, 0x84, 0x8d, 0x92, 0xfa, 0x01, 0x1d, 0x3a, 0x0f, 0xe2,\n+0x64, 0x38, 0xb7, 0x8c, 0xbc, 0xe8, 0x88, 0xf9, 0x8b, 0x24, 0xab, 0x2e, 0xa3, 0xf5, 0x37, 0xe4,\n+0x40, 0x8e, 0x18, 0x25, 0x79, 0x83, 0x75, 0x1f, 0x3b, 0xff, 0x6c, 0xa8, 0xc5, 0xc6, 0x56, 0xf8,\n+0xb4, 0xed, 0x8a, 0x44, 0xa3, 0xab, 0x6c, 0x4c, 0xfc, 0x1d, 0xd0, 0xdc, 0xef, 0x68, 0xbd, 0xcf,\n+0xe4, 0xaa, 0xce, 0xf0, 0x55, 0xf7, 0xa2, 0x34, 0xd4, 0x83, 0x6b, 0x37, 0x7c, 0x1c, 0xc2, 0xfe,\n+0xb5, 0x03, 0xec, 0x57, 0xce, 0xbc, 0xb4, 0xb5, 0xc5, 0xed, 0x00, 0x0f, 0x53, 0x37, 0x2a, 0x4d,\n+0xf4, 0x4f, 0x0c, 0x83, 0xfb, 0x86, 0xcf, 0xcb, 0xfe, 0x8c, 0x4e, 0xbd, 0x87, 0xf9, 0xa7, 0x8b,\n+0x21, 0x57, 0x9c, 0x7a, 0xdf, 0x03, 0x67, 0x89, 0x2c, 0x9d, 0x97, 0x61, 0xa7, 0x10, 0xb8, 0x55,\n+0x90, 0x7f, 0x0e, 0x2d, 0x27, 0x38, 0x74, 0xdf, 0xe7, 0xfd, 0xda, 0x4e, 0x12, 0xe3, 0x4d, 0x15,\n+0x22, 0x02, 0xc8, 0xe0, 0xe0, 0xfc, 0x0f, 0xad, 0x8a, 0xd7, 0xc9, 0x54, 0x50, 0xcc, 0x3b, 0x0f,\n+0xca, 0x16, 0x80, 0x84, 0xd0, 0x51, 0x56, 0xc3, 0x8e, 0x56, 0x7f, 0x89, 0x22, 0x33, 0x2f, 0xe6,\n+0x85, 0x0a, 0xbd, 0xa5, 0xa8, 0x1b, 0x36, 0xde, 0xd3, 0xdc, 0x2c, 0x6d, 0x3b, 0xc7, 0x13, 0xbd,\n+0x59, 0x23, 0x2c, 0xe6, 0xe5, 0xa4, 0xf7, 0xd8, 0x0b, 0xed, 0xea, 0x90, 0x40, 0x44, 0xa8, 0x95,\n+0xbb, 0x93, 0xd5, 0xd0, 0x80, 0x34, 0xb6, 0x46, 0x78, 0x0e, 0x1f, 0x00, 0x93, 0x46, 0xe1, 0xee,\n+0xe9, 0xf9, 0xec, 0x4f, 0x17, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x65, 0x3f, 0xc7, 0x8a, 0x86, 0xc6, 0x3c,\n+0xdd, 0x3c, 0x54, 0x5c, 0x35, 0xf8, 0x3a, 0xed, 0x52, 0x0c, 0x47, 0x57, 0xc8, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01,\n+0x01, 0x00, 0x2a, 0x3f, 0xe1, 0xf1, 0x32, 0x8e, 0xae, 0xe1, 0x98, 0x5c, 0x4b, 0x5e, 0xcf, 0x6b,\n+0x1e, 0x6a, 0x09, 0xd2, 0x22, 0xa9, 0x12, 0xc7, 0x5e, 0x57, 0x7d, 0x73, 0x56, 0x64, 0x80, 0x84,\n+0x7a, 0x93, 0xe4, 0x09, 0xb9, 0x10, 0xcd, 0x9f, 0x2a, 0x27, 0xe1, 0x00, 0x77, 0xbe, 0x48, 0xc8,\n+0x35, 0xa8, 0x81, 0x9f, 0xe4, 0xb8, 0x2c, 0xc9, 0x7f, 0x0e, 0xb0, 0xd2, 0x4b, 0x37, 0x5d, 0xea,\n+0xb9, 0xd5, 0x0b, 0x5e, 0x34, 0xbd, 0xf4, 0x73, 0x29, 0xc3, 0xed, 0x26, 0x15, 0x9c, 0x7e, 0x08,\n+0x53, 0x8a, 0x58, 0x8d, 0xd0, 0x4b, 0x28, 0xdf, 0xc1, 0xb3, 0xdf, 0x20, 0xf3, 0xf9, 0xe3, 0xe3,\n+0x3a, 0xdf, 0xcc, 0x9c, 0x94, 0xd8, 0x4e, 0x4f, 0xc3, 0x6b, 0x17, 0xb7, 0xf7, 0x72, 0xe8, 0xad,\n+0x66, 0x33, 0xb5, 0x25, 0x53, 0xab, 0xe0, 0xf8, 0x4c, 0xa9, 0x9d, 0xfd, 0xf2, 0x0d, 0xba, 0xae,\n+0xb9, 0xd9, 0xaa, 0xc6, 0x6b, 0xf9, 0x93, 0xbb, 0xae, 0xab, 0xb8, 0x97, 0x3c, 0x03, 0x1a, 0xba,\n+0x43, 0xc6, 0x96, 0xb9, 0x45, 0x72, 0x38, 0xb3, 0xa7, 0xa1, 0x96, 0x3d, 0x91, 0x7b, 0x7e, 0xc0,\n+0x21, 0x53, 0x4c, 0x87, 0xed, 0xf2, 0x0b, 0x54, 0x95, 0x51, 0x93, 0xd5, 0x22, 0xa5, 0x0d, 0x8a,\n+0xf1, 0x93, 0x0e, 0x3e, 0x54, 0x0e, 0xb0, 0xd8, 0xc9, 0x4e, 0xdc, 0xf2, 0x31, 0x32, 0x56, 0xea,\n+0x64, 0xf9, 0xea, 0xb5, 0x9d, 0x16, 0x66, 0x42, 0x72, 0xf3, 0x7f, 0xd3, 0xb1, 0x31, 0x43, 0xfc,\n+0xa4, 0x8e, 0x17, 0xf1, 0x6d, 0x23, 0xab, 0x94, 0x66, 0xf8, 0xad, 0xfb, 0x0f, 0x08, 0x6e, 0x26,\n+0x2d, 0x7f, 0x17, 0x07, 0x09, 0xb2, 0x8c, 0xfb, 0x50, 0xc0, 0x9f, 0x96, 0x8d, 0xcf, 0xb6, 0xfd,\n+0x00, 0x9d, 0x5a, 0x14, 0x9a, 0xbf, 0x02, 0x44, 0xf5, 0xc1, 0xc2, 0x9f, 0x22, 0x5e, 0xa2, 0x0f,\n+0xa1, 0xe3, 0x30, 0x82, 0x01, 0xb6, 0x30, 0x82, 0x01, 0x5b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x13, 0x06, 0x6c, 0x9f, 0xd5, 0x74, 0x97, 0x36, 0x66, 0x3f, 0x3b, 0x0b, 0x9a, 0xd9, 0xe8, 0x9e,\n+0x76, 0x03, 0xf2, 0x4a, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,\n+0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e,\n+0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f,\n+0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x35, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30,\n+0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x39, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce,\n+0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00,\n+0x04, 0x29, 0x97, 0xa7, 0xc6, 0x41, 0x7f, 0xc0, 0x0d, 0x9b, 0xe8, 0x01, 0x1b, 0x56, 0xc6, 0xf2,\n+0x52, 0xa5, 0xba, 0x2d, 0xb2, 0x12, 0xe8, 0xd2, 0x2e, 0xd7, 0xfa, 0xc9, 0xc5, 0xd8, 0xaa, 0x6d,\n+0x1f, 0x73, 0x81, 0x3b, 0x3b, 0x98, 0x6b, 0x39, 0x7c, 0x33, 0xa5, 0xc5, 0x4e, 0x86, 0x8e, 0x80,\n+0x17, 0x68, 0x62, 0x45, 0x57, 0x7d, 0x44, 0x58, 0x1d, 0xb3, 0x37, 0xe5, 0x67, 0x08, 0xeb, 0x66,\n+0xde, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n+0x14, 0xab, 0xb6, 0xdb, 0xd7, 0x06, 0x9e, 0x37, 0xac, 0x30, 0x86, 0x07, 0x91, 0x70, 0xc7, 0x9c,\n+0xc4, 0x19, 0xb1, 0x78, 0xc0, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03,\n+0x02, 0x03, 0x49, 0x00, 0x30, 0x46, 0x02, 0x21, 0x00, 0xe0, 0x85, 0x92, 0xa3, 0x17, 0xb7, 0x8d,\n+0xf9, 0x2b, 0x06, 0xa5, 0x93, 0xac, 0x1a, 0x98, 0x68, 0x61, 0x72, 0xfa, 0xe1, 0xa1, 0xd0, 0xfb,\n+0x1c, 0x78, 0x60, 0xa6, 0x43, 0x99, 0xc5, 0xb8, 0xc4, 0x02, 0x21, 0x00, 0x9c, 0x02, 0xef, 0xf1,\n+0x94, 0x9c, 0xb3, 0x96, 0xf9, 0xeb, 0xc6, 0x2a, 0xf8, 0xb6, 0x2c, 0xfe, 0x3a, 0x90, 0x14, 0x16,\n+0xd7, 0x8c, 0x63, 0x24, 0x48, 0x1c, 0xdf, 0x30, 0x7d, 0xd5, 0x68, 0x3b, 0x30, 0x82, 0x05, 0x88,\n+0x30, 0x82, 0x03, 0x70, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x7d, 0x09, 0x97, 0xfe, 0xf0,\n+0x47, 0xea, 0x7a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n+0x05, 0x00, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43,\n+0x4e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x29, 0x47, 0x55, 0x41, 0x4e,\n+0x47, 0x20, 0x44, 0x4f, 0x4e, 0x47, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41,\n+0x54, 0x45, 0x20, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x20, 0x43, 0x4f, 0x2e,\n+0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16,\n+0x47, 0x44, 0x43, 0x41, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, 0x55, 0x54, 0x48, 0x20, 0x52,\n+0x35, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x31, 0x32, 0x36,\n+0x30, 0x35, 0x31, 0x33, 0x31, 0x35, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31,\n+0x35, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x29,\n+0x47, 0x55, 0x41, 0x4e, 0x47, 0x20, 0x44, 0x4f, 0x4e, 0x47, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49,\n+0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x20, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59,\n+0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x0c, 0x16, 0x47, 0x44, 0x43, 0x41, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, 0x55,\n+0x54, 0x48, 0x20, 0x52, 0x35, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02,\n+0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd9, 0xa3, 0x16, 0xf0, 0xc8,\n+0x74, 0x74, 0x77, 0x9b, 0xef, 0x33, 0x0d, 0x3b, 0x06, 0x7e, 0x55, 0xfc, 0xb5, 0x60, 0x8f, 0x76,\n+0x86, 0x12, 0x42, 0x7d, 0x56, 0x66, 0x3e, 0x88, 0x82, 0xed, 0x72, 0x63, 0x0e, 0x9e, 0x8b, 0xdd,\n+0x34, 0x2c, 0x02, 0x51, 0x51, 0xc3, 0x19, 0xfd, 0x59, 0x54, 0x84, 0xc9, 0xf1, 0x6b, 0xb3, 0x4c,\n+0xb0, 0xe9, 0xe8, 0x46, 0x5d, 0x38, 0xc6, 0xa2, 0xa7, 0x2e, 0x11, 0x57, 0xba, 0x82, 0x15, 0xa2,\n+0x9c, 0x8f, 0x6d, 0xb0, 0x99, 0x4a, 0x0a, 0xf2, 0xeb, 0x89, 0x70, 0x63, 0x4e, 0x79, 0xc4, 0xb7,\n+0x5b, 0xbd, 0xa2, 0x5d, 0xb1, 0xf2, 0x41, 0x02, 0x2b, 0xad, 0xa9, 0x3a, 0xa3, 0xec, 0x79, 0x0a,\n+0xec, 0x5f, 0x3a, 0xe3, 0xfd, 0xef, 0x80, 0x3c, 0xad, 0x34, 0x9b, 0x1a, 0xab, 0x88, 0x26, 0x7b,\n+0x56, 0xa2, 0x82, 0x86, 0x1f, 0xeb, 0x35, 0x89, 0x83, 0x7f, 0x5f, 0xae, 0x29, 0x4e, 0x3d, 0xb6,\n+0x6e, 0xec, 0xae, 0xc1, 0xf0, 0x27, 0x9b, 0xae, 0xe3, 0xf4, 0xec, 0xef, 0xae, 0x7f, 0xf7, 0x86,\n+0x3d, 0x72, 0x7a, 0xeb, 0xa5, 0xfb, 0x59, 0x4e, 0xa7, 0xeb, 0x95, 0x8c, 0x22, 0x39, 0x79, 0xe1,\n+0x2d, 0x08, 0x8f, 0xcc, 0xbc, 0x91, 0xb8, 0x41, 0xf7, 0x14, 0xc1, 0x23, 0xa9, 0xc3, 0xad, 0x9a,\n+0x45, 0x44, 0xb3, 0xb2, 0xd7, 0x2c, 0xcd, 0xc6, 0x29, 0xe2, 0x50, 0x10, 0xae, 0x5c, 0xcb, 0x82,\n+0x8e, 0x17, 0x18, 0x36, 0x7d, 0x97, 0xe6, 0x88, 0x9a, 0xb0, 0x4d, 0x34, 0x09, 0xf4, 0x2c, 0xb9,\n+0x5a, 0x66, 0x2a, 0xb0, 0x17, 0x9b, 0x9e, 0x1e, 0x76, 0x9d, 0x4a, 0x66, 0x31, 0x41, 0xdf, 0x3f,\n+0xfb, 0xc5, 0x06, 0xef, 0x1b, 0xb6, 0x7e, 0x1a, 0x46, 0x36, 0xf7, 0x64, 0x63, 0x3b, 0xe3, 0x39,\n+0x18, 0x23, 0xe7, 0x67, 0x75, 0x14, 0xd5, 0x75, 0x57, 0x92, 0x37, 0xbd, 0xbe, 0x6a, 0x1b, 0x26,\n+0x50, 0xf2, 0x36, 0x26, 0x06, 0x90, 0xc5, 0x70, 0x01, 0x64, 0x6d, 0x76, 0x66, 0xe1, 0x91, 0xdb,\n+0x6e, 0x07, 0xc0, 0x61, 0x80, 0x2e, 0xb2, 0x2e, 0x2f, 0x8c, 0x70, 0xa7, 0xd1, 0x3b, 0x3c, 0xb3,\n+0x91, 0xe4, 0x6e, 0xb6, 0xc4, 0x3b, 0x70, 0xf2, 0x6c, 0x92, 0x97, 0x09, 0xcd, 0x47, 0x7d, 0x18,\n+0xc0, 0xf3, 0xbb, 0x9e, 0x0f, 0xd6, 0x8b, 0xae, 0x07, 0xb6, 0x5a, 0x0f, 0xce, 0x0b, 0x0c, 0x47,\n+0xa7, 0xe5, 0x3e, 0xb8, 0xbd, 0x7d, 0xc7, 0x9b, 0x35, 0xa0, 0x61, 0x97, 0x3a, 0x41, 0x75, 0x17,\n+0xcc, 0x2b, 0x96, 0x77, 0x2a, 0x92, 0x21, 0x1e, 0xd9, 0x95, 0x76, 0x20, 0x67, 0x68, 0xcf, 0x0d,\n+0xbd, 0xdf, 0xd6, 0x1f, 0x09, 0x6a, 0x9a, 0xe2, 0xcc, 0x73, 0x71, 0xa4, 0x2f, 0x7d, 0x12, 0x80,\n+0xb7, 0x53, 0x30, 0x46, 0x5e, 0x4b, 0x54, 0x99, 0x0f, 0x67, 0xc9, 0xa5, 0xc8, 0xf2, 0x20, 0xc1,\n+0x82, 0xec, 0x9d, 0x11, 0xdf, 0xc2, 0x02, 0xfb, 0x1a, 0x3b, 0xd1, 0xed, 0x20, 0x9a, 0xef, 0x65,\n+0x64, 0x92, 0x10, 0x0d, 0x2a, 0xe2, 0xde, 0x70, 0xf1, 0x18, 0x67, 0x82, 0x8c, 0x61, 0xde, 0xb8,\n+0xbc, 0xd1, 0x2f, 0x9c, 0xfb, 0x0f, 0xd0, 0x2b, 0xed, 0x1b, 0x76, 0xb9, 0xe4, 0x39, 0x55, 0xf8,\n+0xf8, 0xa1, 0x1d, 0xb8, 0xaa, 0x80, 0x00, 0x4c, 0x82, 0xe7, 0xb2, 0x7f, 0x09, 0xb8, 0xbc, 0x30,\n+0xa0, 0x2f, 0x0d, 0xf5, 0x52, 0x9e, 0x8e, 0xf7, 0x92, 0xb3, 0x0a, 0x00, 0x1d, 0x00, 0x54, 0x97,\n+0x06, 0xe0, 0xb1, 0x07, 0xd9, 0xc7, 0x0f, 0x5c, 0x65, 0x7d, 0x3c, 0x6d, 0x59, 0x57, 0xe4, 0xed,\n+0xa5, 0x8d, 0xe9, 0x40, 0x53, 0x9f, 0x15, 0x4b, 0xa0, 0x71, 0xf6, 0x1a, 0x21, 0xe3, 0xda, 0x70,\n+0x06, 0x21, 0x58, 0x14, 0x87, 0x85, 0x77, 0x79, 0xaa, 0x82, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01,\n+0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe2,\n+0xc9, 0x40, 0x9f, 0x4d, 0xce, 0xe8, 0x9a, 0xa1, 0x7c, 0xcf, 0x0e, 0x3f, 0x65, 0xc5, 0x29, 0x88,\n+0x6a, 0x19, 0x51, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xd1, 0x49, 0x57, 0xe0, 0xa7, 0xcc, 0x68, 0x58,\n+0xba, 0x01, 0x0f, 0x2b, 0x19, 0xcd, 0x8d, 0xb0, 0x61, 0x45, 0xac, 0x11, 0xed, 0x63, 0x50, 0x69,\n+0xf8, 0x1f, 0x7f, 0xbe, 0x16, 0x8f, 0xfd, 0x9d, 0xeb, 0x0b, 0xaa, 0x32, 0x47, 0x76, 0xd2, 0x67,\n+0x24, 0xed, 0xbd, 0x7c, 0x33, 0x32, 0x97, 0x2a, 0xc7, 0x05, 0x86, 0x66, 0x0d, 0x17, 0x7d, 0x14,\n+0x15, 0x1b, 0xd4, 0xeb, 0xfd, 0x1f, 0x9a, 0xf6, 0x5e, 0x97, 0x69, 0xb7, 0x1a, 0x25, 0xa4, 0x0a,\n+0xb3, 0x91, 0x3f, 0x5f, 0x36, 0xac, 0x8b, 0xec, 0x57, 0xa8, 0x3e, 0xe7, 0x81, 0x8a, 0x18, 0x57,\n+0x39, 0x85, 0x74, 0x1a, 0x42, 0xc7, 0xe9, 0x5b, 0x13, 0x5f, 0x8f, 0xf9, 0x08, 0xe9, 0x92, 0x74,\n+0x8d, 0xf5, 0x47, 0xd2, 0xab, 0x3b, 0xd6, 0xfb, 0x78, 0x66, 0x4e, 0x36, 0x7d, 0xf9, 0xe9, 0x92,\n+0xe9, 0x04, 0xde, 0xfd, 0x49, 0x63, 0xfc, 0x6d, 0xfb, 0x14, 0x71, 0x93, 0x67, 0x2f, 0x47, 0x4a,\n+0xb7, 0xb9, 0xff, 0x1e, 0x2a, 0x73, 0x70, 0x46, 0x30, 0xbf, 0x5a, 0xf2, 0x2f, 0x79, 0xa5, 0xe1,\n+0x8d, 0x0c, 0xd9, 0xf9, 0xb2, 0x63, 0x37, 0x8c, 0x37, 0x65, 0x85, 0x70, 0x6a, 0x5c, 0x5b, 0x09,\n+0x72, 0xb9, 0xad, 0x63, 0x3c, 0xb1, 0xdd, 0xf8, 0xfc, 0x32, 0xbf, 0x37, 0x86, 0xe4, 0xbb, 0x8e,\n+0x98, 0x27, 0x7e, 0xba, 0x1f, 0x16, 0xe1, 0x70, 0x11, 0xf2, 0x03, 0xdf, 0x25, 0x62, 0x32, 0x27,\n+0x26, 0x18, 0x32, 0x84, 0x9f, 0xff, 0x00, 0x3a, 0x13, 0xba, 0x9a, 0x4d, 0xf4, 0x4f, 0xb8, 0x14,\n+0x70, 0x22, 0xb1, 0xca, 0x2b, 0x90, 0xce, 0x29, 0xc1, 0x70, 0xf4, 0x2f, 0x9d, 0x7f, 0xf2, 0x90,\n+0x1e, 0xd6, 0x5a, 0xdf, 0xb7, 0x46, 0xfc, 0xe6, 0x86, 0xfa, 0xcb, 0xe0, 0x20, 0x76, 0x7a, 0xba,\n+0xa6, 0xcb, 0xf5, 0x7c, 0xde, 0x62, 0xa5, 0xb1, 0x8b, 0xee, 0xde, 0x82, 0x66, 0x8a, 0x4e, 0x3a,\n+0x30, 0x1f, 0x3f, 0x80, 0xcb, 0xad, 0x27, 0xba, 0x0c, 0x5e, 0xd7, 0xd0, 0xb1, 0x56, 0xca, 0x77,\n+0x71, 0xb2, 0xb5, 0x75, 0xa1, 0x50, 0xa9, 0x40, 0x43, 0x17, 0xc2, 0x28, 0xd9, 0xcf, 0x52, 0x8b,\n+0x5b, 0xc8, 0x63, 0xd4, 0x42, 0x3e, 0xa0, 0x33, 0x7a, 0x46, 0x2e, 0xf7, 0x0a, 0x20, 0x46, 0x54,\n+0x7e, 0x6a, 0x4f, 0x31, 0xf1, 0x81, 0x7e, 0x42, 0x74, 0x38, 0x65, 0x73, 0x27, 0xee, 0xc6, 0x7c,\n+0xb8, 0x8e, 0xd7, 0xa5, 0x3a, 0xd7, 0x98, 0xa1, 0x9c, 0x8c, 0x10, 0x55, 0xd3, 0xdb, 0x4b, 0xec,\n+0x40, 0x90, 0xf2, 0xcd, 0x6e, 0x57, 0xd2, 0x62, 0x0e, 0x7c, 0x57, 0x93, 0xb1, 0xa7, 0x6d, 0xcd,\n+0x9d, 0x83, 0xbb, 0x2a, 0xe7, 0xe5, 0xb6, 0x3b, 0x71, 0x58, 0xad, 0xfd, 0xd1, 0x45, 0xbc, 0x5a,\n+0x91, 0xee, 0x53, 0x15, 0x6f, 0xd3, 0x45, 0x09, 0x75, 0x6e, 0xba, 0x90, 0x5d, 0x1e, 0x04, 0xcf,\n+0x37, 0xdf, 0x1e, 0xa8, 0x66, 0xb1, 0x8c, 0xe6, 0x20, 0x6a, 0xef, 0xfc, 0x48, 0x4e, 0x74, 0x98,\n+0x42, 0xaf, 0x29, 0x6f, 0x2e, 0x6a, 0xc7, 0xfb, 0x7d, 0xd1, 0x66, 0x31, 0x22, 0xcc, 0x86, 0x00,\n+0x7e, 0x66, 0x83, 0x0c, 0x42, 0xf4, 0xbd, 0x34, 0x92, 0xc3, 0x1a, 0xea, 0x4f, 0xca, 0x7e, 0x72,\n+0x4d, 0x0b, 0x70, 0x8c, 0xa6, 0x48, 0xbb, 0xa6, 0xa1, 0x14, 0xf6, 0xfb, 0x58, 0x44, 0x99, 0x14,\n+0xae, 0xaa, 0x0b, 0x93, 0x69, 0xa0, 0x29, 0x25, 0x4a, 0xa5, 0xcb, 0x2b, 0xdd, 0x8a, 0x66, 0x07,\n+0x16, 0x78, 0x15, 0x57, 0x71, 0x1b, 0xec, 0xf5, 0x47, 0x84, 0xf3, 0x9e, 0x31, 0x37, 0x7a, 0xd5,\n+0x7f, 0x24, 0xad, 0xe4, 0xbc, 0xfd, 0xfd, 0xcc, 0x6e, 0x83, 0xe8, 0x0c, 0xa8, 0xb7, 0x41, 0x6c,\n+0x07, 0xdd, 0xbd, 0x3c, 0x86, 0x97, 0x2f, 0xd2, 0x30, 0x82, 0x05, 0x41, 0x30, 0x82, 0x03, 0x29,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x13, 0x06, 0x6c, 0x9f, 0xd2, 0x96, 0x35, 0x86, 0x9f, 0x0a,\n+0x0f, 0xe5, 0x86, 0x78, 0xf8, 0x5b, 0x26, 0xbb, 0x8a, 0x37, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x41, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30,\n+0x30, 0x30, 0x30, 0x5a, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d,\n+0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41,\n+0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30,\n+0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00,\n+0xad, 0x96, 0x9f, 0x2d, 0x9c, 0x4a, 0x4c, 0x4a, 0x81, 0x79, 0x51, 0x99, 0xec, 0x8a, 0xcb, 0x6b,\n+0x60, 0x51, 0x13, 0xbc, 0x4d, 0x6d, 0x06, 0xfc, 0xb0, 0x08, 0x8d, 0xdd, 0x19, 0x10, 0x6a, 0xc7,\n+0x26, 0x0c, 0x35, 0xd8, 0xc0, 0x6f, 0x20, 0x84, 0xe9, 0x94, 0xb1, 0x9b, 0x85, 0x03, 0xc3, 0x5b,\n+0xdb, 0x4a, 0xe8, 0xc8, 0xf8, 0x90, 0x76, 0xd9, 0x5b, 0x4f, 0xe3, 0x4c, 0xe8, 0x06, 0x36, 0x4d,\n+0xcc, 0x9a, 0xac, 0x3d, 0x0c, 0x90, 0x2b, 0x92, 0xd4, 0x06, 0x19, 0x60, 0xac, 0x37, 0x44, 0x79,\n+0x85, 0x81, 0x82, 0xad, 0x5a, 0x37, 0xe0, 0x0d, 0xcc, 0x9d, 0xa6, 0x4c, 0x52, 0x76, 0xea, 0x43,\n+0x9d, 0xb7, 0x04, 0xd1, 0x50, 0xf6, 0x55, 0xe0, 0xd5, 0xd2, 0xa6, 0x49, 0x85, 0xe9, 0x37, 0xe9,\n+0xca, 0x7e, 0xae, 0x5c, 0x95, 0x4d, 0x48, 0x9a, 0x3f, 0xae, 0x20, 0x5a, 0x6d, 0x88, 0x95, 0xd9,\n+0x34, 0xb8, 0x52, 0x1a, 0x43, 0x90, 0xb0, 0xbf, 0x6c, 0x05, 0xb9, 0xb6, 0x78, 0xb7, 0xea, 0xd0,\n+0xe4, 0x3a, 0x3c, 0x12, 0x53, 0x62, 0xff, 0x4a, 0xf2, 0x7b, 0xbe, 0x35, 0x05, 0xa9, 0x12, 0x34,\n+0xe3, 0xf3, 0x64, 0x74, 0x62, 0x2c, 0x3d, 0x00, 0x49, 0x5a, 0x28, 0xfe, 0x32, 0x44, 0xbb, 0x87,\n+0xdd, 0x65, 0x27, 0x02, 0x71, 0x3b, 0xda, 0x4a, 0xf7, 0x1f, 0xda, 0xcd, 0xf7, 0x21, 0x55, 0x90,\n+0x4f, 0x0f, 0xec, 0xae, 0x82, 0xe1, 0x9f, 0x6b, 0xd9, 0x45, 0xd3, 0xbb, 0xf0, 0x5f, 0x87, 0xed,\n+0x3c, 0x2c, 0x39, 0x86, 0xda, 0x3f, 0xde, 0xec, 0x72, 0x55, 0xeb, 0x79, 0xa3, 0xad, 0xdb, 0xdd,\n+0x7c, 0xb0, 0xba, 0x1c, 0xce, 0xfc, 0xde, 0x4f, 0x35, 0x76, 0xcf, 0x0f, 0xf8, 0x78, 0x1f, 0x6a,\n+0x36, 0x51, 0x46, 0x27, 0x61, 0x5b, 0xe9, 0x9e, 0xcf, 0xf0, 0xa2, 0x55, 0x7d, 0x7c, 0x25, 0x8a,\n+0x6f, 0x2f, 0xb4, 0xc5, 0xcf, 0x84, 0x2e, 0x2b, 0xfd, 0x0d, 0x51, 0x10, 0x6c, 0xfb, 0x5f, 0x1b,\n+0xbc, 0x1b, 0x7e, 0xc5, 0xae, 0x3b, 0x98, 0x01, 0x31, 0x92, 0xff, 0x0b, 0x57, 0xf4, 0x9a, 0xb2,\n+0xb9, 0x57, 0xe9, 0xab, 0xef, 0x0d, 0x76, 0xd1, 0xf0, 0xee, 0xf4, 0xce, 0x86, 0xa7, 0xe0, 0x6e,\n+0xe9, 0xb4, 0x69, 0xa1, 0xdf, 0x69, 0xf6, 0x33, 0xc6, 0x69, 0x2e, 0x97, 0x13, 0x9e, 0xa5, 0x87,\n+0xb0, 0x57, 0x10, 0x81, 0x37, 0xc9, 0x53, 0xb3, 0xbb, 0x7f, 0xf6, 0x92, 0xd1, 0x9c, 0xd0, 0x18,\n+0xf4, 0x92, 0x6e, 0xda, 0x83, 0x4f, 0xa6, 0x63, 0x99, 0x4c, 0xa5, 0xfb, 0x5e, 0xef, 0x21, 0x64,\n+0x7a, 0x20, 0x5f, 0x6c, 0x64, 0x85, 0x15, 0xcb, 0x37, 0xe9, 0x62, 0x0c, 0x0b, 0x2a, 0x16, 0xdc,\n+0x01, 0x2e, 0x32, 0xda, 0x3e, 0x4b, 0xf5, 0x9e, 0x3a, 0xf6, 0x17, 0x40, 0x94, 0xef, 0x9e, 0x91,\n+0x08, 0x86, 0xfa, 0xbe, 0x63, 0xa8, 0x5a, 0x33, 0xec, 0xcb, 0x74, 0x43, 0x95, 0xf9, 0x6c, 0x69,\n+0x52, 0x36, 0xc7, 0x29, 0x6f, 0xfc, 0x55, 0x03, 0x5c, 0x1f, 0xfb, 0x9f, 0xbd, 0x47, 0xeb, 0xe7,\n+0x49, 0x47, 0x95, 0x0b, 0x4e, 0x89, 0x22, 0x09, 0x49, 0xe0, 0xf5, 0x61, 0x1e, 0xf1, 0xbf, 0x2e,\n+0x8a, 0x72, 0x6e, 0x80, 0x59, 0xff, 0x57, 0x3a, 0xf9, 0x75, 0x32, 0xa3, 0x4e, 0x5f, 0xec, 0xed,\n+0x28, 0x62, 0xd9, 0x4d, 0x73, 0xf2, 0xcc, 0x81, 0x17, 0x60, 0xed, 0xcd, 0xeb, 0xdc, 0xdb, 0xa7,\n+0xca, 0xc5, 0x7e, 0x02, 0xbd, 0xf2, 0x54, 0x08, 0x54, 0xfd, 0xb4, 0x2d, 0x09, 0x2c, 0x17, 0x54,\n+0x4a, 0x98, 0xd1, 0x54, 0xe1, 0x51, 0x67, 0x08, 0xd2, 0xed, 0x6e, 0x7e, 0x6f, 0x3f, 0xd2, 0x2d,\n+0x81, 0x59, 0x29, 0x66, 0xcb, 0x90, 0x39, 0x95, 0x11, 0x1e, 0x74, 0x27, 0xfe, 0xdd, 0xeb, 0xaf,\n+0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n+0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n+0x0e, 0x04, 0x16, 0x04, 0x14, 0xb0, 0x0c, 0xf0, 0x4c, 0x30, 0xf4, 0x05, 0x58, 0x02, 0x48, 0xfd,\n+0x33, 0xe5, 0x52, 0xaf, 0x4b, 0x84, 0xe3, 0x66, 0x52, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xaa, 0xa8, 0x80,\n+0x8f, 0x0e, 0x78, 0xa3, 0xe0, 0xa2, 0xd4, 0xcd, 0xe6, 0xf5, 0x98, 0x7a, 0x3b, 0xea, 0x00, 0x03,\n+0xb0, 0x97, 0x0e, 0x93, 0xbc, 0x5a, 0xa8, 0xf6, 0x2c, 0x8c, 0x72, 0x87, 0xa9, 0xb1, 0xfc, 0x7f,\n+0x73, 0xfd, 0x63, 0x71, 0x78, 0xa5, 0x87, 0x59, 0xcf, 0x30, 0xe1, 0x0d, 0x10, 0xb2, 0x13, 0x5a,\n+0x6d, 0x82, 0xf5, 0x6a, 0xe6, 0x80, 0x9f, 0xa0, 0x05, 0x0b, 0x68, 0xe4, 0x47, 0x6b, 0xc7, 0x6a,\n+0xdf, 0xb6, 0xfd, 0x77, 0x32, 0x72, 0xe5, 0x18, 0xfa, 0x09, 0xf4, 0xa0, 0x93, 0x2c, 0x5d, 0xd2,\n+0x8c, 0x75, 0x85, 0x76, 0x65, 0x90, 0x0c, 0x03, 0x79, 0xb7, 0x31, 0x23, 0x63, 0xad, 0x78, 0x83,\n+0x09, 0x86, 0x68, 0x84, 0xca, 0xff, 0xf9, 0xcf, 0x26, 0x9a, 0x92, 0x79, 0xe7, 0xcd, 0x4b, 0xc5,\n+0xe7, 0x61, 0xa7, 0x17, 0xcb, 0xf3, 0xa9, 0x12, 0x93, 0x93, 0x6b, 0xa7, 0xe8, 0x2f, 0x53, 0x92,\n+0xc4, 0x60, 0x58, 0xb0, 0xcc, 0x02, 0x51, 0x18, 0x5b, 0x85, 0x8d, 0x62, 0x59, 0x63, 0xb6, 0xad,\n+0xb4, 0xde, 0x9a, 0xfb, 0x26, 0xf7, 0x00, 0x27, 0xc0, 0x5d, 0x55, 0x37, 0x74, 0x99, 0xc9, 0x50,\n+0x7f, 0xe3, 0x59, 0x2e, 0x44, 0xe3, 0x2c, 0x25, 0xee, 0xec, 0x4c, 0x32, 0x77, 0xb4, 0x9f, 0x1a,\n+0xe9, 0x4b, 0x5d, 0x20, 0xc5, 0xda, 0xfd, 0x1c, 0x87, 0x16, 0xc6, 0x43, 0xe8, 0xd4, 0xbb, 0x26,\n+0x9a, 0x45, 0x70, 0x5e, 0xa9, 0x0b, 0x37, 0x53, 0xe2, 0x46, 0x7b, 0x27, 0xfd, 0xe0, 0x46, 0xf2,\n+0x89, 0xb7, 0xcc, 0x42, 0xb6, 0xcb, 0x28, 0x26, 0x6e, 0xd9, 0xa5, 0xc9, 0x3a, 0xc8, 0x41, 0x13,\n+0x60, 0xf7, 0x50, 0x8c, 0x15, 0xae, 0xb2, 0x6d, 0x1a, 0x15, 0x1a, 0x57, 0x78, 0xe6, 0x92, 0x2a,\n+0xd9, 0x65, 0x90, 0x82, 0x3f, 0x6c, 0x02, 0xaf, 0xae, 0x12, 0x3a, 0x27, 0x96, 0x36, 0x04, 0xd7,\n+0x1d, 0xa2, 0x80, 0x63, 0xa9, 0x9b, 0xf1, 0xe5, 0xba, 0xb4, 0x7c, 0x14, 0xb0, 0x4e, 0xc9, 0xb1,\n+0x1f, 0x74, 0x5f, 0x38, 0xf6, 0x51, 0xea, 0x9b, 0xfa, 0x2c, 0xa2, 0x11, 0xd4, 0xa9, 0x2d, 0x27,\n+0x1a, 0x45, 0xb1, 0xaf, 0xb2, 0x4e, 0x71, 0x0d, 0xc0, 0x58, 0x46, 0xd6, 0x69, 0x06, 0xcb, 0x53,\n+0xcb, 0xb3, 0xfe, 0x6b, 0x41, 0xcd, 0x41, 0x7e, 0x7d, 0x4c, 0x0f, 0x7c, 0x72, 0x79, 0x7a, 0x59,\n+0xcd, 0x5e, 0x4a, 0x0e, 0xac, 0x9b, 0xa9, 0x98, 0x73, 0x79, 0x7c, 0xb4, 0xf4, 0xcc, 0xb9, 0xb8,\n+0x07, 0x0c, 0xb2, 0x74, 0x5c, 0xb8, 0xc7, 0x6f, 0x88, 0xa1, 0x90, 0xa7, 0xf4, 0xaa, 0xf9, 0xbf,\n+0x67, 0x3a, 0xf4, 0x1a, 0x15, 0x62, 0x1e, 0xb7, 0x9f, 0xbe, 0x3d, 0xb1, 0x29, 0xaf, 0x67, 0xa1,\n+0x12, 0xf2, 0x58, 0x10, 0x19, 0x53, 0x03, 0x30, 0x1b, 0xb8, 0x1a, 0x89, 0xf6, 0x9c, 0xbd, 0x97,\n+0x03, 0x8e, 0xa3, 0x09, 0xf3, 0x1d, 0x8b, 0x21, 0xf1, 0xb4, 0xdf, 0xe4, 0x1c, 0xd1, 0x9f, 0x65,\n+0x02, 0x06, 0xea, 0x5c, 0xd6, 0x13, 0xb3, 0x84, 0xef, 0xa2, 0xa5, 0x5c, 0x8c, 0x77, 0x29, 0xa7,\n+0x68, 0xc0, 0x6b, 0xae, 0x40, 0xd2, 0xa8, 0xb4, 0xea, 0xcd, 0xf0, 0x8d, 0x4b, 0x38, 0x9c, 0x19,\n+0x9a, 0x1b, 0x28, 0x54, 0xb8, 0x89, 0x90, 0xef, 0xca, 0x75, 0x81, 0x3e, 0x1e, 0xf2, 0x64, 0x24,\n+0xc7, 0x18, 0xaf, 0x4e, 0xff, 0x47, 0x9e, 0x07, 0xf6, 0x35, 0x65, 0xa4, 0xd3, 0x0a, 0x56, 0xff,\n+0xf5, 0x17, 0x64, 0x6c, 0xef, 0xa8, 0x22, 0x25, 0x49, 0x93, 0xb6, 0xdf, 0x00, 0x17, 0xda, 0x58,\n+0x7e, 0x5d, 0xee, 0xc5, 0x1b, 0xb0, 0xd1, 0xd1, 0x5f, 0x21, 0x10, 0xc7, 0xf9, 0xf3, 0xba, 0x02,\n+0x0a, 0x27, 0x07, 0xc5, 0xf1, 0xd6, 0xc7, 0xd3, 0xe0, 0xfb, 0x09, 0x60, 0x6c, 0x30, 0x82, 0x03,\n+0x41, 0x30, 0x82, 0x02, 0x29, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x13, 0x06, 0x6c, 0x9f, 0xcf,\n+0x99, 0xbf, 0x8c, 0x0a, 0x39, 0xe2, 0xf0, 0x78, 0x8a, 0x43, 0xe6, 0x96, 0x36, 0x5b, 0xca, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x39,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30,\n+0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19,\n+0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30,\n+0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31,\n+0x31, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a,\n+0x02, 0x82, 0x01, 0x01, 0x00, 0xb2, 0x78, 0x80, 0x71, 0xca, 0x78, 0xd5, 0xe3, 0x71, 0xaf, 0x47,\n+0x80, 0x50, 0x74, 0x7d, 0x6e, 0xd8, 0xd7, 0x88, 0x76, 0xf4, 0x99, 0x68, 0xf7, 0x58, 0x21, 0x60,\n+0xf9, 0x74, 0x84, 0x01, 0x2f, 0xac, 0x02, 0x2d, 0x86, 0xd3, 0xa0, 0x43, 0x7a, 0x4e, 0xb2, 0xa4,\n+0xd0, 0x36, 0xba, 0x01, 0xbe, 0x8d, 0xdb, 0x48, 0xc8, 0x07, 0x17, 0x36, 0x4c, 0xf4, 0xee, 0x88,\n+0x23, 0xc7, 0x3e, 0xeb, 0x37, 0xf5, 0xb5, 0x19, 0xf8, 0x49, 0x68, 0xb0, 0xde, 0xd7, 0xb9, 0x76,\n+0x38, 0x1d, 0x61, 0x9e, 0xa4, 0xfe, 0x82, 0x36, 0xa5, 0xe5, 0x4a, 0x56, 0xe4, 0x45, 0xe1, 0xf9,\n+0xfd, 0xb4, 0x16, 0xfa, 0x74, 0xda, 0x9c, 0x9b, 0x35, 0x39, 0x2f, 0xfa, 0xb0, 0x20, 0x50, 0x06,\n+0x6c, 0x7a, 0xd0, 0x80, 0xb2, 0xa6, 0xf9, 0xaf, 0xec, 0x47, 0x19, 0x8f, 0x50, 0x38, 0x07, 0xdc,\n+0xa2, 0x87, 0x39, 0x58, 0xf8, 0xba, 0xd5, 0xa9, 0xf9, 0x48, 0x67, 0x30, 0x96, 0xee, 0x94, 0x78,\n+0x5e, 0x6f, 0x89, 0xa3, 0x51, 0xc0, 0x30, 0x86, 0x66, 0xa1, 0x45, 0x66, 0xba, 0x54, 0xeb, 0xa3,\n+0xc3, 0x91, 0xf9, 0x48, 0xdc, 0xff, 0xd1, 0xe8, 0x30, 0x2d, 0x7d, 0x2d, 0x74, 0x70, 0x35, 0xd7,\n+0x88, 0x24, 0xf7, 0x9e, 0xc4, 0x59, 0x6e, 0xbb, 0x73, 0x87, 0x17, 0xf2, 0x32, 0x46, 0x28, 0xb8,\n+0x43, 0xfa, 0xb7, 0x1d, 0xaa, 0xca, 0xb4, 0xf2, 0x9f, 0x24, 0x0e, 0x2d, 0x4b, 0xf7, 0x71, 0x5c,\n+0x5e, 0x69, 0xff, 0xea, 0x95, 0x02, 0xcb, 0x38, 0x8a, 0xae, 0x50, 0x38, 0x6f, 0xdb, 0xfb, 0x2d,\n+0x62, 0x1b, 0xc5, 0xc7, 0x1e, 0x54, 0xe1, 0x77, 0xe0, 0x67, 0xc8, 0x0f, 0x9c, 0x87, 0x23, 0xd6,\n+0x3f, 0x40, 0x20, 0x7f, 0x20, 0x80, 0xc4, 0x80, 0x4c, 0x3e, 0x3b, 0x24, 0x26, 0x8e, 0x04, 0xae,\n+0x6c, 0x9a, 0xc8, 0xaa, 0x0d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f,\n+0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x84, 0x18, 0xcc, 0x85, 0x34, 0xec,\n+0xbc, 0x0c, 0x94, 0x94, 0x2e, 0x08, 0x59, 0x9c, 0xc7, 0xb2, 0x10, 0x4e, 0x0a, 0x08, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01,\n+0x01, 0x00, 0x98, 0xf2, 0x37, 0x5a, 0x41, 0x90, 0xa1, 0x1a, 0xc5, 0x76, 0x51, 0x28, 0x20, 0x36,\n+0x23, 0x0e, 0xae, 0xe6, 0x28, 0xbb, 0xaa, 0xf8, 0x94, 0xae, 0x48, 0xa4, 0x30, 0x7f, 0x1b, 0xfc,\n+0x24, 0x8d, 0x4b, 0xb4, 0xc8, 0xa1, 0x97, 0xf6, 0xb6, 0xf1, 0x7a, 0x70, 0xc8, 0x53, 0x93, 0xcc,\n+0x08, 0x28, 0xe3, 0x98, 0x25, 0xcf, 0x23, 0xa4, 0xf9, 0xde, 0x21, 0xd3, 0x7c, 0x85, 0x09, 0xad,\n+0x4e, 0x9a, 0x75, 0x3a, 0xc2, 0x0b, 0x6a, 0x89, 0x78, 0x76, 0x44, 0x47, 0x18, 0x65, 0x6c, 0x8d,\n+0x41, 0x8e, 0x3b, 0x7f, 0x9a, 0xcb, 0xf4, 0xb5, 0xa7, 0x50, 0xd7, 0x05, 0x2c, 0x37, 0xe8, 0x03,\n+0x4b, 0xad, 0xe9, 0x61, 0xa0, 0x02, 0x6e, 0xf5, 0xf2, 0xf0, 0xc5, 0xb2, 0xed, 0x5b, 0xb7, 0xdc,\n+0xfa, 0x94, 0x5c, 0x77, 0x9e, 0x13, 0xa5, 0x7f, 0x52, 0xad, 0x95, 0xf2, 0xf8, 0x93, 0x3b, 0xde,\n+0x8b, 0x5c, 0x5b, 0xca, 0x5a, 0x52, 0x5b, 0x60, 0xaf, 0x14, 0xf7, 0x4b, 0xef, 0xa3, 0xfb, 0x9f,\n+0x40, 0x95, 0x6d, 0x31, 0x54, 0xfc, 0x42, 0xd3, 0xc7, 0x46, 0x1f, 0x23, 0xad, 0xd9, 0x0f, 0x48,\n+0x70, 0x9a, 0xd9, 0x75, 0x78, 0x71, 0xd1, 0x72, 0x43, 0x34, 0x75, 0x6e, 0x57, 0x59, 0xc2, 0x02,\n+0x5c, 0x26, 0x60, 0x29, 0xcf, 0x23, 0x19, 0x16, 0x8e, 0x88, 0x43, 0xa5, 0xd4, 0xe4, 0xcb, 0x08,\n+0xfb, 0x23, 0x11, 0x43, 0xe8, 0x43, 0x29, 0x72, 0x62, 0xa1, 0xa9, 0x5d, 0x5e, 0x08, 0xd4, 0x90,\n+0xae, 0xb8, 0xd8, 0xce, 0x14, 0xc2, 0xd0, 0x55, 0xf2, 0x86, 0xf6, 0xc4, 0x93, 0x43, 0x77, 0x66,\n+0x61, 0xc0, 0xb9, 0xe8, 0x41, 0xd7, 0x97, 0x78, 0x60, 0x03, 0x6e, 0x4a, 0x72, 0xae, 0xa5, 0xd1,\n+0x7d, 0xba, 0x10, 0x9e, 0x86, 0x6c, 0x1b, 0x8a, 0xb9, 0x59, 0x33, 0xf8, 0xeb, 0xc4, 0x90, 0xbe,\n+0xf1, 0xb9, 0x30, 0x82, 0x01, 0xf2, 0x30, 0x82, 0x01, 0x78, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x13, 0x06, 0x6c, 0x9f, 0xd7, 0xc1, 0xbb, 0x10, 0x4c, 0x29, 0x43, 0xe5, 0x71, 0x7b, 0x7b, 0x2c,\n+0xc8, 0x1a, 0xc1, 0x0e, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03,\n+0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e,\n+0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f,\n+0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x34, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x35, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30,\n+0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x39, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x43, 0x41, 0x20, 0x34, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce,\n+0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xd2, 0xab,\n+0x8a, 0x37, 0x4f, 0xa3, 0x53, 0x0d, 0xfe, 0xc1, 0x8a, 0x7b, 0x4b, 0xa8, 0x7b, 0x46, 0x4b, 0x63,\n+0xb0, 0x62, 0xf6, 0x2d, 0x1b, 0xdb, 0x08, 0x71, 0x21, 0xd2, 0x00, 0xe8, 0x63, 0xbd, 0x9a, 0x27,\n+0xfb, 0xf0, 0x39, 0x6e, 0x5d, 0xea, 0x3d, 0xa5, 0xc9, 0x81, 0xaa, 0xa3, 0x5b, 0x20, 0x98, 0x45,\n+0x5d, 0x16, 0xdb, 0xfd, 0xe8, 0x10, 0x6d, 0xe3, 0x9c, 0xe0, 0xe3, 0xbd, 0x5f, 0x84, 0x62, 0xf3,\n+0x70, 0x64, 0x33, 0xa0, 0xcb, 0x24, 0x2f, 0x70, 0xba, 0x88, 0xa1, 0x2a, 0xa0, 0x75, 0xf8, 0x81,\n+0xae, 0x62, 0x06, 0xc4, 0x81, 0xdb, 0x39, 0x6e, 0x29, 0xb0, 0x1e, 0xfa, 0x2e, 0x5c, 0xa3, 0x42,\n+0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n+0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n+0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd3, 0xec,\n+0xc7, 0x3a, 0x65, 0x6e, 0xcc, 0xe1, 0xda, 0x76, 0x9a, 0x56, 0xfb, 0x9c, 0xf3, 0x86, 0x6d, 0x57,\n+0xe5, 0x81, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68,\n+0x00, 0x30, 0x65, 0x02, 0x30, 0x3a, 0x8b, 0x21, 0xf1, 0xbd, 0x7e, 0x11, 0xad, 0xd0, 0xef, 0x58,\n+0x96, 0x2f, 0xd6, 0xeb, 0x9d, 0x7e, 0x90, 0x8d, 0x2b, 0xcf, 0x66, 0x55, 0xc3, 0x2c, 0xe3, 0x28,\n+0xa9, 0x70, 0x0a, 0x47, 0x0e, 0xf0, 0x37, 0x59, 0x12, 0xff, 0x2d, 0x99, 0x94, 0x28, 0x4e, 0x2a,\n+0x4f, 0x35, 0x4d, 0x33, 0x5a, 0x02, 0x31, 0x00, 0xea, 0x75, 0x00, 0x4e, 0x3b, 0xc4, 0x3a, 0x94,\n+0x12, 0x91, 0xc9, 0x58, 0x46, 0x9d, 0x21, 0x13, 0x72, 0xa7, 0x88, 0x9c, 0x8a, 0xe4, 0x4c, 0x4a,\n+0xdb, 0x96, 0xd4, 0xac, 0x8b, 0x6b, 0x6b, 0x49, 0x12, 0x53, 0x33, 0xad, 0xd7, 0xe4, 0xbe, 0x24,\n+0xfc, 0xb5, 0x0a, 0x76, 0xd4, 0xa5, 0xbc, 0x10, 0x30, 0x82, 0x06, 0x0b, 0x30, 0x82, 0x03, 0xf3,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa6, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07,\n+0x13, 0x06, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64,\n+0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63,\n+0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43,\n+0x65, 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x40,\n+0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x37, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69,\n+0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52,\n+0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74,\n+0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35,\n+0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x37, 0x30, 0x37, 0x31, 0x30, 0x31, 0x31, 0x32, 0x31,\n+0x5a, 0x17, 0x0d, 0x34, 0x30, 0x30, 0x36, 0x33, 0x30, 0x31, 0x30, 0x31, 0x31, 0x32, 0x31, 0x5a,\n+0x30, 0x81, 0xa6, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x52,\n+0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x41, 0x74, 0x68, 0x65, 0x6e,\n+0x73, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c,\n+0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e,\n+0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69,\n+0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75,\n+0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x37, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65,\n+0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,\n+0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f,\n+0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc2, 0xf8, 0xa9, 0x3f, 0x1b, 0x89,\n+0xfc, 0x3c, 0x3c, 0x04, 0x5d, 0x3d, 0x90, 0x36, 0xb0, 0x91, 0x3a, 0x79, 0x3c, 0x66, 0x5a, 0xef,\n+0x6d, 0x39, 0x01, 0x49, 0x1a, 0xb4, 0xb7, 0xcf, 0x7f, 0x4d, 0x23, 0x53, 0xb7, 0x90, 0x00, 0xe3,\n+0x13, 0x2a, 0x28, 0xa6, 0x31, 0xf1, 0x91, 0x00, 0xe3, 0x28, 0xec, 0xae, 0x21, 0x41, 0xce, 0x1f,\n+0xda, 0xfd, 0x7d, 0x12, 0x5b, 0x01, 0x83, 0x0f, 0xb9, 0xb0, 0x5f, 0x99, 0xe1, 0xf2, 0x12, 0x83,\n+0x80, 0x4d, 0x06, 0x3e, 0xdf, 0xac, 0xaf, 0xe7, 0xa1, 0x88, 0x6b, 0x31, 0xaf, 0xf0, 0x8b, 0xd0,\n+0x18, 0x33, 0xb8, 0xdb, 0x45, 0x6a, 0x34, 0xf4, 0x02, 0x80, 0x24, 0x28, 0x0a, 0x02, 0x15, 0x95,\n+0x5e, 0x76, 0x2a, 0x0d, 0x99, 0x3a, 0x14, 0x5b, 0xf6, 0xcb, 0xcb, 0x53, 0xbc, 0x13, 0x4d, 0x01,\n+0x88, 0x37, 0x94, 0x25, 0x1b, 0x42, 0xbc, 0x22, 0xd8, 0x8e, 0xa3, 0x96, 0x5e, 0x3a, 0xd9, 0x32,\n+0xdb, 0x3e, 0xe8, 0xf0, 0x10, 0x65, 0xed, 0x74, 0xe1, 0x2f, 0xa7, 0x7c, 0xaf, 0x27, 0x34, 0xbb,\n+0x29, 0x7d, 0x9b, 0xb6, 0xcf, 0x09, 0xc8, 0xe5, 0xd3, 0x0a, 0xfc, 0x88, 0x65, 0x65, 0x74, 0x0a,\n+0xdc, 0x73, 0x1c, 0x5c, 0xcd, 0x40, 0xb1, 0x1c, 0xd4, 0xb6, 0x84, 0x8c, 0x4c, 0x50, 0xcf, 0x68,\n+0x8e, 0xa8, 0x59, 0xae, 0xc2, 0x27, 0x4e, 0x82, 0xa2, 0x35, 0xdd, 0x14, 0xf4, 0x1f, 0xff, 0xb2,\n+0x77, 0xd5, 0x87, 0x2f, 0xaa, 0x6e, 0x7d, 0x24, 0x27, 0xe7, 0xc6, 0xcb, 0x26, 0xe6, 0xe5, 0xfe,\n+0x67, 0x07, 0x63, 0xd8, 0x45, 0x0d, 0xdd, 0x3a, 0x59, 0x65, 0x39, 0x58, 0x7a, 0x92, 0x99, 0x72,\n+0x3d, 0x9c, 0x84, 0x5e, 0x88, 0x21, 0xb8, 0xd5, 0xf4, 0x2c, 0xfc, 0xd9, 0x70, 0x52, 0x4f, 0x78,\n+0xb8, 0xbd, 0x3c, 0x2b, 0x8b, 0x95, 0x98, 0xf5, 0xb3, 0xd1, 0x68, 0xcf, 0x20, 0x14, 0x7e, 0x4c,\n+0x5c, 0x5f, 0xe7, 0x8b, 0xe5, 0xf5, 0x35, 0x81, 0x19, 0x37, 0xd7, 0x11, 0x08, 0xb7, 0x66, 0xbe,\n+0xd3, 0x4a, 0xce, 0x83, 0x57, 0x00, 0x3a, 0xc3, 0x81, 0xf8, 0x17, 0xcb, 0x92, 0x36, 0x5d, 0xd1,\n+0xa3, 0xd8, 0x75, 0x1b, 0xe1, 0x8b, 0x27, 0xea, 0x7a, 0x48, 0x41, 0xfd, 0x45, 0x19, 0x06, 0xad,\n+0x27, 0x99, 0x4e, 0xc1, 0x70, 0x47, 0xdd, 0xb5, 0x9f, 0x81, 0x53, 0x12, 0xe5, 0xb1, 0x8c, 0x48,\n+0x5d, 0x31, 0x43, 0x17, 0xe3, 0x8c, 0xc6, 0x7a, 0x63, 0x96, 0x4b, 0x29, 0x30, 0x4e, 0x84, 0x4e,\n+0x62, 0x19, 0x5e, 0x3c, 0xce, 0x97, 0x90, 0xa5, 0x7f, 0x01, 0xeb, 0x9d, 0xe0, 0xf8, 0x8b, 0x89,\n+0xdd, 0x25, 0x98, 0x3d, 0x92, 0xb6, 0x7e, 0xef, 0xd9, 0xf1, 0x51, 0x51, 0x7d, 0x2d, 0x26, 0xc8,\n+0x69, 0x59, 0x61, 0xe0, 0xac, 0x6a, 0xb8, 0x2a, 0x36, 0x11, 0x04, 0x7a, 0x50, 0xbd, 0x32, 0x84,\n+0xbe, 0x2f, 0xdc, 0x72, 0xd5, 0xd7, 0x1d, 0x16, 0x47, 0xe4, 0x47, 0x66, 0x20, 0x3f, 0xf4, 0x96,\n+0xc5, 0xaf, 0x8e, 0x01, 0x7a, 0xa5, 0x0f, 0x7a, 0x64, 0xf5, 0x0d, 0x18, 0x87, 0xd9, 0xae, 0x88,\n+0xd5, 0xfa, 0x84, 0xc1, 0x3a, 0xc0, 0x69, 0x28, 0x2d, 0xf2, 0x0d, 0x68, 0x51, 0xaa, 0xe3, 0xa5,\n+0x77, 0xc6, 0xa4, 0x90, 0x0e, 0xa1, 0x37, 0x8b, 0x31, 0x23, 0x47, 0xc1, 0x09, 0x08, 0xeb, 0x6e,\n+0xf7, 0x78, 0x9b, 0xd7, 0x82, 0xfc, 0x84, 0x20, 0x99, 0x49, 0x19, 0xb6, 0x12, 0x46, 0xb1, 0xfb,\n+0x45, 0x55, 0x16, 0xa9, 0xa3, 0x65, 0xac, 0x9c, 0x07, 0x0f, 0xea, 0x6b, 0xdc, 0x1f, 0x2e, 0x06,\n+0x72, 0xec, 0x86, 0x88, 0x12, 0xe4, 0x2d, 0xdb, 0x5f, 0x05, 0x2f, 0xe4, 0xf0, 0x03, 0xd3, 0x26,\n+0x33, 0xe7, 0x80, 0xc2, 0xcd, 0x42, 0xa1, 0x17, 0x34, 0x0b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n+0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x71,\n+0x15, 0x67, 0xc8, 0xc8, 0xc9, 0xbd, 0x75, 0x5d, 0x72, 0xd0, 0x38, 0x18, 0x6a, 0x9d, 0xf3, 0x71,\n+0x24, 0x54, 0x0b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x75, 0xbb, 0x6d, 0x54, 0x4b, 0xaa, 0x10, 0x58, 0x46,\n+0x34, 0xf2, 0x62, 0xd7, 0x16, 0x36, 0x5d, 0x08, 0x5e, 0xd5, 0x6c, 0xc8, 0x87, 0xbd, 0xb4, 0x2e,\n+0x46, 0xf2, 0x31, 0xf8, 0x7c, 0xea, 0x42, 0xb5, 0x93, 0x16, 0x55, 0xdc, 0xa1, 0x0c, 0x12, 0xa0,\n+0xda, 0x61, 0x7e, 0x0f, 0x58, 0x58, 0x73, 0x64, 0x72, 0xc7, 0xe8, 0x45, 0x8e, 0xdc, 0xa9, 0xf2,\n+0x26, 0x3f, 0xc6, 0x79, 0x8c, 0xb1, 0x53, 0x08, 0x33, 0x81, 0xb0, 0x56, 0x13, 0xbe, 0xe6, 0x51,\n+0x5c, 0xd8, 0x9b, 0x0a, 0x4f, 0x4b, 0x9c, 0x56, 0x53, 0x02, 0xe9, 0x4f, 0xf6, 0x0d, 0x60, 0xea,\n+0x4d, 0x42, 0x55, 0xe8, 0x7c, 0x1b, 0x21, 0x21, 0xd3, 0x1b, 0x3a, 0xcc, 0x77, 0xf2, 0xb8, 0x90,\n+0xf1, 0x68, 0xc7, 0xf9, 0x5a, 0xfe, 0xfa, 0x2d, 0xf4, 0xbf, 0xc9, 0xf5, 0x45, 0x1b, 0xce, 0x38,\n+0x10, 0x2a, 0x37, 0x8a, 0x79, 0xa3, 0xb4, 0xe3, 0x09, 0x6c, 0x85, 0x86, 0x93, 0xff, 0x89, 0x96,\n+0x27, 0x78, 0x81, 0x8f, 0x67, 0xe3, 0x46, 0x74, 0x54, 0x8e, 0xd9, 0x0d, 0x69, 0xe2, 0x4a, 0xf4,\n+0x4d, 0x74, 0x03, 0xff, 0xb2, 0x77, 0xed, 0x95, 0x67, 0x97, 0xe4, 0xb1, 0xc5, 0xab, 0xbf, 0x6a,\n+0x23, 0xe8, 0xd4, 0x94, 0xe2, 0x44, 0x28, 0x62, 0xc4, 0x4b, 0xe2, 0xf0, 0xd8, 0xe2, 0x29, 0x6b,\n+0x1a, 0x70, 0x7e, 0x24, 0x61, 0x93, 0x7b, 0x4f, 0x03, 0x32, 0x25, 0x0d, 0x45, 0x24, 0x2b, 0x96,\n+0xb4, 0x46, 0x6a, 0xbf, 0x4a, 0x0b, 0xf7, 0x9a, 0x8f, 0xc1, 0xac, 0x1a, 0xc5, 0x67, 0xf3, 0x6f,\n+0x34, 0xd2, 0xfa, 0x73, 0x63, 0x8c, 0xef, 0x16, 0xb0, 0xa8, 0xa4, 0x46, 0x2a, 0xf8, 0xeb, 0x12,\n+0xec, 0x72, 0xb4, 0xef, 0xf8, 0x2b, 0x7e, 0x8c, 0x52, 0xc0, 0x8b, 0x84, 0x54, 0xf9, 0x2f, 0x3e,\n+0xe3, 0x55, 0xa8, 0xdc, 0x66, 0xb1, 0xd9, 0xe1, 0x5f, 0xd8, 0xb3, 0x8c, 0x59, 0x34, 0x59, 0xa4,\n+0xab, 0x4f, 0x6c, 0xbb, 0x1f, 0x18, 0xdb, 0x75, 0xab, 0xd8, 0xcb, 0x92, 0xcd, 0x94, 0x38, 0x61,\n+0x0e, 0x07, 0x06, 0x1f, 0x4b, 0x46, 0x10, 0xf1, 0x15, 0xbe, 0x8d, 0x85, 0x5c, 0x3b, 0x4a, 0x2b,\n+0x81, 0x79, 0x0f, 0xb4, 0x69, 0x9f, 0x49, 0x50, 0x97, 0x4d, 0xf7, 0x0e, 0x56, 0x5d, 0xc0, 0x95,\n+0x6a, 0xc2, 0x36, 0xc3, 0x1b, 0x68, 0xc9, 0xf5, 0x2a, 0xdc, 0x47, 0x9a, 0xbe, 0xb2, 0xce, 0xc5,\n+0x25, 0xe8, 0xfa, 0x03, 0xb9, 0xda, 0xf9, 0x16, 0x6e, 0x91, 0x84, 0xf5, 0x1c, 0x28, 0xc8, 0xfc,\n+0x26, 0xcc, 0xd7, 0x1c, 0x90, 0x56, 0xa7, 0x5f, 0x6f, 0x3a, 0x04, 0xbc, 0xcd, 0x78, 0x89, 0x0b,\n+0x8e, 0x0f, 0x2f, 0xa3, 0xaa, 0x4f, 0xa2, 0x1b, 0x12, 0x3d, 0x16, 0x08, 0x40, 0x0f, 0xf1, 0x46,\n+0x4c, 0xd7, 0xaa, 0x7b, 0x08, 0xc1, 0x0a, 0xf5, 0x6d, 0x27, 0xde, 0x02, 0x8f, 0xca, 0xc3, 0xb5,\n+0x2b, 0xca, 0xe9, 0xeb, 0xc8, 0x21, 0x53, 0x38, 0xa5, 0xcc, 0x3b, 0xd8, 0x77, 0x37, 0x30, 0xa2,\n+0x4f, 0xd9, 0x6f, 0xd1, 0xf2, 0x40, 0xad, 0x41, 0x7a, 0x17, 0xc5, 0xd6, 0x4a, 0x35, 0x89, 0xb7,\n+0x41, 0xd5, 0x7c, 0x86, 0x7f, 0x55, 0x4d, 0x83, 0x4a, 0xa5, 0x73, 0x20, 0xc0, 0x3a, 0xaf, 0x90,\n+0xf1, 0x9a, 0x24, 0x8e, 0xd9, 0x8e, 0x71, 0xca, 0x7b, 0xb8, 0x86, 0xda, 0xb2, 0x8f, 0x99, 0x3e,\n+0x1d, 0x13, 0x0d, 0x12, 0x11, 0xee, 0xd4, 0xab, 0xf0, 0xe9, 0x15, 0x76, 0x02, 0xe4, 0xe0, 0xdf,\n+0xaa, 0x20, 0x1e, 0x5b, 0x61, 0x85, 0x64, 0x40, 0xa9, 0x90, 0x97, 0x0d, 0xad, 0x53, 0xd2, 0x5a,\n+0x1d, 0x87, 0x6a, 0x00, 0x97, 0x65, 0x62, 0xb4, 0xbe, 0x6f, 0x6a, 0xa7, 0xf5, 0x2c, 0x42, 0xed,\n+0x32, 0xad, 0xb6, 0x21, 0x9e, 0xbe, 0xbc, 0x30, 0x82, 0x02, 0xc3, 0x30, 0x82, 0x02, 0x4a, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n+0x04, 0x03, 0x02, 0x30, 0x81, 0xaa, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x47, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x41, 0x74,\n+0x68, 0x65, 0x6e, 0x73, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48,\n+0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63,\n+0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e,\n+0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63,\n+0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61,\n+0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n+0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35,\n+0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x37, 0x30, 0x37, 0x31, 0x30, 0x33, 0x37, 0x31, 0x32,\n+0x5a, 0x17, 0x0d, 0x34, 0x30, 0x30, 0x36, 0x33, 0x30, 0x31, 0x30, 0x33, 0x37, 0x31, 0x32, 0x5a,\n+0x30, 0x81, 0xaa, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x52,\n+0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x41, 0x74, 0x68, 0x65, 0x6e,\n+0x73, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c,\n+0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e,\n+0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69,\n+0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75,\n+0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65,\n+0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,\n+0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x45, 0x43,\n+0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35, 0x30, 0x76, 0x30,\n+0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00,\n+0x22, 0x03, 0x62, 0x00, 0x04, 0x92, 0xa0, 0x41, 0xe8, 0x4b, 0x82, 0x84, 0x5c, 0xe2, 0xf8, 0x31,\n+0x11, 0x99, 0x86, 0x64, 0x4e, 0x09, 0x25, 0x2f, 0x9d, 0x41, 0x2f, 0x0a, 0xae, 0x35, 0x4f, 0x74,\n+0x95, 0xb2, 0x51, 0x64, 0x6b, 0x8d, 0x6b, 0xe6, 0x3f, 0x70, 0x95, 0xf0, 0x05, 0x44, 0x47, 0xa6,\n+0x72, 0x38, 0x50, 0x76, 0x95, 0x02, 0x5a, 0x8e, 0xae, 0x28, 0x9e, 0xf9, 0x2d, 0x4e, 0x99, 0xef,\n+0x2c, 0x48, 0x6f, 0x4c, 0x25, 0x29, 0xe8, 0xd1, 0x71, 0x5b, 0xdf, 0x1d, 0xc1, 0x75, 0x37, 0xb4,\n+0xd7, 0xfa, 0x7b, 0x7a, 0x42, 0x9c, 0x6a, 0x0a, 0x56, 0x5a, 0x7c, 0x69, 0x0b, 0xaa, 0x80, 0x09,\n+0x24, 0x6c, 0x7e, 0xc1, 0x46, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n+0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n+0x0e, 0x04, 0x16, 0x04, 0x14, 0xb4, 0x22, 0x0b, 0x82, 0x99, 0x24, 0x01, 0x0e, 0x9c, 0xbb, 0xe4,\n+0x0e, 0xfd, 0xbf, 0xfb, 0x97, 0x20, 0x93, 0x99, 0x2a, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n+0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x67, 0xce, 0x16, 0x62,\n+0x38, 0xa2, 0xac, 0x62, 0x45, 0xa7, 0xa9, 0x95, 0x24, 0xc0, 0x1a, 0x27, 0x9c, 0x32, 0x3b, 0xc0,\n+0xc0, 0xd5, 0xba, 0xa9, 0xe7, 0xf8, 0x04, 0x43, 0x53, 0x85, 0xee, 0x52, 0x21, 0xde, 0x9d, 0xf5,\n+0x25, 0x83, 0x3e, 0x9e, 0x58, 0x4b, 0x2f, 0xd7, 0x67, 0x13, 0x0e, 0x21, 0x02, 0x30, 0x05, 0xe1,\n+0x75, 0x01, 0xde, 0x68, 0xed, 0x2a, 0x1f, 0x4d, 0x4c, 0x09, 0x08, 0x0d, 0xec, 0x4b, 0xad, 0x64,\n+0x17, 0x28, 0xe7, 0x75, 0xce, 0x45, 0x65, 0x72, 0x21, 0x17, 0xcb, 0x22, 0x41, 0x0e, 0x8c, 0x13,\n+0x98, 0x38, 0x9a, 0x54, 0x6d, 0x9b, 0xca, 0xe2, 0x7c, 0xea, 0x02, 0x58, 0x22, 0x91, 0x30, 0x82,\n+0x06, 0x5b, 0x30, 0x82, 0x04, 0x43, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0xca, 0xe9,\n+0x1b, 0x89, 0xf1, 0x55, 0x03, 0x0d, 0xa3, 0xe6, 0x41, 0x6d, 0xc4, 0xe3, 0xa6, 0xe1, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5a, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x12, 0x30, 0x10,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73,\n+0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x13, 0x30, 0x30, 0x30, 0x32, 0x20,\n+0x34, 0x38, 0x31, 0x34, 0x36, 0x33, 0x30, 0x38, 0x31, 0x30, 0x30, 0x30, 0x33, 0x36, 0x31, 0x19,\n+0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x10, 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e,\n+0x61, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x31,\n+0x30, 0x30, 0x31, 0x30, 0x38, 0x33, 0x32, 0x32, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x33, 0x31, 0x30,\n+0x30, 0x31, 0x30, 0x38, 0x33, 0x32, 0x32, 0x37, 0x5a, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73, 0x31, 0x1c, 0x30, 0x1a,\n+0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x13, 0x30, 0x30, 0x30, 0x32, 0x20, 0x34, 0x38, 0x31, 0x34,\n+0x36, 0x33, 0x30, 0x38, 0x31, 0x30, 0x30, 0x30, 0x33, 0x36, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x0c, 0x10, 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02,\n+0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xcd, 0x18, 0x39, 0x65, 0x1a, 0x59, 0xb1, 0xea, 0x64, 0x16,\n+0x0e, 0x8c, 0x94, 0x24, 0x95, 0x7c, 0x83, 0xd3, 0xc5, 0x39, 0x26, 0xdc, 0x0c, 0xef, 0x16, 0x57,\n+0x8d, 0xd7, 0xd8, 0xac, 0xa3, 0x42, 0x7f, 0x82, 0xca, 0xed, 0xcd, 0x5b, 0xdb, 0x0e, 0xb7, 0x2d,\n+0xed, 0x45, 0x08, 0x17, 0xb2, 0xd9, 0xb3, 0xcb, 0xd6, 0x17, 0x52, 0x72, 0x28, 0xdb, 0x8e, 0x4e,\n+0x9e, 0x8a, 0xb6, 0x0b, 0xf9, 0x9e, 0x84, 0x9a, 0x4d, 0x76, 0xde, 0x22, 0x29, 0x5c, 0xd2, 0xb3,\n+0xd2, 0x06, 0x3e, 0x30, 0x39, 0xa9, 0x74, 0xa3, 0x92, 0x56, 0x1c, 0xa1, 0x6f, 0x4c, 0x0a, 0x20,\n+0x6d, 0x9f, 0x23, 0x7a, 0xb4, 0xc6, 0xda, 0x2c, 0xe4, 0x1d, 0x2c, 0xdc, 0xb3, 0x28, 0xd0, 0x13,\n+0xf2, 0x4c, 0x4e, 0x02, 0x49, 0xa1, 0x54, 0x40, 0x9e, 0xe6, 0xe5, 0x05, 0xa0, 0x2d, 0x84, 0xc8,\n+0xff, 0x98, 0x6c, 0xd0, 0xeb, 0x8a, 0x1a, 0x84, 0x08, 0x1e, 0xb7, 0x68, 0x23, 0xee, 0x23, 0xd5,\n+0x70, 0xce, 0x6d, 0x51, 0x69, 0x10, 0xee, 0xa1, 0x7a, 0xc2, 0xd1, 0x22, 0x31, 0xc2, 0x82, 0x85,\n+0xd2, 0xf2, 0x55, 0x76, 0x50, 0x7c, 0x25, 0x7a, 0xc9, 0x84, 0x5c, 0x0b, 0xac, 0xdd, 0x42, 0x4e,\n+0x2b, 0xe7, 0x82, 0xa2, 0x24, 0x89, 0xcb, 0x90, 0xb2, 0xd0, 0xee, 0x23, 0xba, 0x66, 0x4c, 0xbb,\n+0x62, 0xa4, 0xf9, 0x53, 0x5a, 0x64, 0x7b, 0x7c, 0x98, 0xfa, 0xa3, 0x48, 0x9e, 0x0f, 0x95, 0xae,\n+0xa7, 0x18, 0xf4, 0x6a, 0xec, 0x2e, 0x03, 0x45, 0xaf, 0xf0, 0x74, 0xf8, 0x2a, 0xcd, 0x7a, 0x5d,\n+0xd1, 0xbe, 0x44, 0x26, 0x32, 0x29, 0xf1, 0xf1, 0xf5, 0x6c, 0xcc, 0x7e, 0x02, 0x21, 0x0b, 0x9f,\n+0x6f, 0xa4, 0x3f, 0xbe, 0x9d, 0x53, 0xe2, 0xcf, 0x7d, 0xa9, 0x2c, 0x7c, 0x58, 0x1a, 0x97, 0xe1,\n+0x3d, 0x37, 0x37, 0x18, 0x66, 0x28, 0xd2, 0x40, 0xc5, 0x51, 0x8a, 0x8c, 0xc3, 0x2d, 0xce, 0x53,\n+0x88, 0x24, 0x58, 0x64, 0x30, 0x16, 0xc5, 0xaa, 0xe0, 0xd6, 0x0a, 0xa6, 0x40, 0xdf, 0x78, 0xf6,\n+0xf5, 0x04, 0x7c, 0x69, 0x13, 0x84, 0xbc, 0xd1, 0xd1, 0xa7, 0x06, 0xcf, 0x01, 0xf7, 0x68, 0xc0,\n+0xa8, 0x57, 0xbb, 0x3a, 0x61, 0xad, 0x04, 0x8c, 0x93, 0xe3, 0xad, 0xfc, 0xf0, 0xdb, 0x44, 0x6d,\n+0x59, 0xdc, 0x49, 0x59, 0xae, 0xac, 0x9a, 0x99, 0x36, 0x30, 0x41, 0x7b, 0x76, 0x33, 0x22, 0x87,\n+0xa3, 0xc2, 0x92, 0x86, 0x6e, 0xf9, 0x70, 0xee, 0xae, 0x87, 0x87, 0x95, 0x1b, 0xc4, 0x7a, 0xbd,\n+0x31, 0xf3, 0xd4, 0xd2, 0xe5, 0x99, 0xff, 0xbe, 0x48, 0xec, 0x75, 0xf5, 0x78, 0x16, 0x1d, 0xa6,\n+0x70, 0xc1, 0x7f, 0x3c, 0x1b, 0xa1, 0x92, 0xfb, 0xcf, 0xc8, 0x3c, 0xd6, 0xc5, 0x93, 0x0a, 0x8f,\n+0xf5, 0x55, 0x3a, 0x76, 0x95, 0xce, 0x59, 0x98, 0x8a, 0x09, 0x95, 0x77, 0x32, 0x9a, 0x83, 0xba,\n+0x2c, 0x04, 0x3a, 0x97, 0xbd, 0xd4, 0x2f, 0xbe, 0xd7, 0x6c, 0x9b, 0xa2, 0xca, 0x7d, 0x6d, 0x26,\n+0xc9, 0x55, 0xd5, 0xcf, 0xc3, 0x79, 0x52, 0x08, 0x09, 0x99, 0x07, 0x24, 0x2d, 0x64, 0x25, 0x6b,\n+0xa6, 0x21, 0x69, 0x9b, 0x6a, 0xdd, 0x74, 0x4d, 0x6b, 0x97, 0x7a, 0x41, 0xbd, 0xab, 0x17, 0xf9,\n+0x90, 0x17, 0x48, 0x8f, 0x36, 0xf9, 0x2d, 0xd5, 0xc5, 0xdb, 0xee, 0xaa, 0x85, 0x45, 0x41, 0xfa,\n+0xcd, 0x3a, 0x45, 0xb1, 0x68, 0xe6, 0x36, 0x4c, 0x9b, 0x90, 0x57, 0xec, 0x23, 0xb9, 0x87, 0x08,\n+0xc2, 0xc4, 0x09, 0xf1, 0x97, 0x86, 0x2a, 0x28, 0x4d, 0xe2, 0x74, 0xc0, 0xda, 0xc4, 0x8c, 0xdb,\n+0xdf, 0xe2, 0xa1, 0x17, 0x59, 0xce, 0x24, 0x59, 0x74, 0x31, 0xda, 0x7f, 0xfd, 0x30, 0x6d, 0xd9,\n+0xdc, 0xe1, 0x6a, 0xe1, 0xfc, 0x5f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x1a, 0x30,\n+0x82, 0x01, 0x16, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x18,\n+0x87, 0x56, 0xe0, 0x6e, 0x77, 0xee, 0x24, 0x35, 0x3c, 0x4e, 0x73, 0x9a, 0x1f, 0xd6, 0xe1, 0xe2,\n+0x79, 0x7e, 0x2b, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,\n+0x18, 0x87, 0x56, 0xe0, 0x6e, 0x77, 0xee, 0x24, 0x35, 0x3c, 0x4e, 0x73, 0x9a, 0x1f, 0xd6, 0xe1,\n+0xe2, 0x79, 0x7e, 0x2b, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3d, 0x30, 0x3b, 0x30,\n+0x39, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x31, 0x30, 0x2f, 0x06, 0x08, 0x2b, 0x06, 0x01,\n+0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77,\n+0x77, 0x77, 0x77, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x2e, 0x66, 0x72, 0x2f,\n+0x61, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x30, 0x6d, 0x06, 0x03, 0x55, 0x1d,\n+0x1f, 0x04, 0x66, 0x30, 0x64, 0x30, 0x2f, 0xa0, 0x2d, 0xa0, 0x2b, 0x86, 0x29, 0x68, 0x74, 0x74,\n+0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61,\n+0x2e, 0x66, 0x72, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x72, 0x6f, 0x6f, 0x74,\n+0x63, 0x61, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x31, 0xa0, 0x2f, 0xa0, 0x2d, 0x86, 0x2b, 0x68, 0x74,\n+0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x64, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74,\n+0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x72,\n+0x6f, 0x6f, 0x74, 0x63, 0x61, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x94, 0xb8, 0x9e,\n+0x4f, 0xf0, 0xe3, 0x95, 0x08, 0x22, 0xe7, 0xcd, 0x68, 0x41, 0xf7, 0x1c, 0x55, 0xd5, 0x7c, 0x00,\n+0xe2, 0x2d, 0x3a, 0x89, 0x5d, 0x68, 0x38, 0x2f, 0x51, 0x22, 0x0b, 0x4a, 0x8d, 0xcb, 0xe9, 0xbb,\n+0x5d, 0x3e, 0xbb, 0x5c, 0x3d, 0xb1, 0x28, 0xfe, 0xe4, 0x53, 0x55, 0x13, 0xcf, 0xa1, 0x90, 0x1b,\n+0x02, 0x1d, 0x5f, 0x66, 0x46, 0x09, 0x33, 0x28, 0xe1, 0x0d, 0x24, 0x97, 0x70, 0xd3, 0x10, 0x1f,\n+0xea, 0x64, 0x57, 0x96, 0xbb, 0x5d, 0xda, 0xe7, 0xc4, 0x8c, 0x4f, 0x4c, 0x64, 0x46, 0x1d, 0x5c,\n+0x87, 0xe3, 0x59, 0xde, 0x42, 0xd1, 0x9b, 0xa8, 0x7e, 0xa6, 0x89, 0xdd, 0x8f, 0x1c, 0xc9, 0x30,\n+0x82, 0xed, 0x3b, 0x9c, 0xcd, 0xc0, 0xe9, 0x19, 0xe0, 0x6a, 0xd8, 0x02, 0x75, 0x37, 0xab, 0xf7,\n+0x34, 0x28, 0x28, 0x91, 0xf2, 0x04, 0x0a, 0x4f, 0x35, 0xe3, 0x60, 0x26, 0x01, 0xfa, 0xd0, 0x11,\n+0x8c, 0xf9, 0x11, 0x6a, 0xee, 0xaf, 0x3d, 0xc3, 0x50, 0xd3, 0x8f, 0x5f, 0x33, 0x79, 0x3c, 0x86,\n+0xa8, 0x73, 0x45, 0x90, 0x8c, 0x20, 0xb6, 0x72, 0x73, 0x17, 0x23, 0xbe, 0x07, 0x65, 0xe5, 0x78,\n+0x92, 0x0d, 0xba, 0x01, 0xc0, 0xeb, 0x8c, 0x1c, 0x66, 0xbf, 0xac, 0x86, 0x77, 0x01, 0x94, 0x0d,\n+0x9c, 0xe6, 0xe9, 0x39, 0x8d, 0x1f, 0xa6, 0x51, 0x8c, 0x99, 0x0c, 0x39, 0x77, 0xe1, 0xb4, 0x9b,\n+0xfa, 0x1c, 0x67, 0x57, 0x6f, 0x6a, 0x6a, 0x8e, 0xa9, 0x2b, 0x4c, 0x57, 0x79, 0x7a, 0x57, 0x22,\n+0xcf, 0xcd, 0x5f, 0x63, 0x46, 0x8d, 0x5c, 0x59, 0x3a, 0x86, 0xf8, 0x32, 0x47, 0x62, 0xa3, 0x67,\n+0x0d, 0x18, 0x91, 0xdc, 0xfb, 0xa6, 0x6b, 0xf5, 0x48, 0x61, 0x73, 0x23, 0x59, 0x8e, 0x02, 0xa7,\n+0xbc, 0x44, 0xea, 0xf4, 0x49, 0x9d, 0xf1, 0x54, 0x58, 0xf9, 0x60, 0xaf, 0xda, 0x18, 0xa4, 0x2f,\n+0x28, 0x45, 0xdc, 0x7a, 0xa0, 0x88, 0x86, 0x5d, 0xf3, 0x3b, 0xe7, 0xff, 0x29, 0x35, 0x80, 0xfc,\n+0x64, 0x43, 0x94, 0xe6, 0xe3, 0x1c, 0x6f, 0xbe, 0xad, 0x0e, 0x2a, 0x63, 0x99, 0x2b, 0xc9, 0x7e,\n+0x85, 0xf6, 0x71, 0xe8, 0x06, 0x03, 0x95, 0xfe, 0xde, 0x8f, 0x48, 0x1c, 0x5a, 0xd4, 0x92, 0xe8,\n+0x2b, 0xee, 0xe7, 0x31, 0xdb, 0xba, 0x04, 0x6a, 0x87, 0x98, 0xe7, 0xc5, 0x5f, 0xef, 0x7d, 0xa7,\n+0x22, 0xf7, 0x01, 0xd8, 0x4d, 0xf9, 0x89, 0xd0, 0x0e, 0x9a, 0x05, 0x59, 0xa4, 0x9e, 0x98, 0xd9,\n+0x6f, 0x2b, 0xca, 0x70, 0xbe, 0x64, 0xc2, 0x55, 0xa3, 0xf4, 0xe9, 0xaf, 0xc3, 0x92, 0x29, 0xdc,\n+0x88, 0x16, 0x24, 0x99, 0x3c, 0x8d, 0x26, 0x98, 0xb6, 0x5b, 0xb7, 0xcc, 0xce, 0xb7, 0x37, 0x07,\n+0xfd, 0x26, 0xd9, 0x98, 0x85, 0x24, 0xff, 0x59, 0x23, 0x03, 0x9a, 0xed, 0x9d, 0x9d, 0xa8, 0xe4,\n+0x5e, 0x38, 0xce, 0xd7, 0x52, 0x0d, 0x6f, 0xd2, 0x3f, 0x6d, 0xb1, 0x05, 0x6b, 0x49, 0xce, 0x8a,\n+0x91, 0x46, 0x73, 0xf4, 0xf6, 0x2f, 0xf0, 0xa8, 0x73, 0x77, 0x0e, 0x65, 0xac, 0xa1, 0x8d, 0x66,\n+0x52, 0x69, 0x7e, 0x4b, 0x68, 0x0c, 0xc7, 0x1e, 0x37, 0x27, 0x83, 0xa5, 0x8c, 0xc7, 0x02, 0xe4,\n+0x14, 0xcd, 0x49, 0x01, 0xb0, 0x73, 0xb3, 0xfd, 0xc6, 0x90, 0x3a, 0x6f, 0xd2, 0x6c, 0xed, 0x3b,\n+0xee, 0xec, 0x91, 0xbe, 0xa2, 0x43, 0x5d, 0x8b, 0x00, 0x4a, 0x66, 0x25, 0x44, 0x70, 0xde, 0x40,\n+0x0f, 0xf8, 0x7c, 0x15, 0xf7, 0xa2, 0xce, 0x3c, 0xd7, 0x5e, 0x13, 0x8c, 0x81, 0x17, 0x18, 0x17,\n+0xd1, 0xbd, 0xf1, 0x77, 0x10, 0x3a, 0xd4, 0x65, 0x39, 0xc1, 0x27, 0xac, 0x57, 0x2c, 0x25, 0x54,\n+0xff, 0xa2, 0xda, 0x4f, 0x8a, 0x61, 0x39, 0x5e, 0xae, 0x3d, 0x4a, 0x8c, 0xbd, 0x30, 0x82, 0x04,\n+0x20, 0x30, 0x82, 0x03, 0x08, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0x84, 0x82, 0x2c,\n+0x5f, 0x1c, 0x62, 0xd0, 0x40, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x9c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50,\n+0x61, 0x6e, 0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b,\n+0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53,\n+0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c,\n+0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x43, 0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x0c, 0x0e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x45, 0x43,\n+0x41, 0x2d, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x30, 0x34, 0x31, 0x32, 0x33,\n+0x32, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x37, 0x32, 0x38,\n+0x30, 0x37, 0x5a, 0x30, 0x81, 0x9c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50, 0x61,\n+0x6e, 0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x50,\n+0x61, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53, 0x79,\n+0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c, 0x2e,\n+0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x43, 0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20,\n+0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x0c, 0x0e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x45, 0x43, 0x41,\n+0x2d, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,\n+0x01, 0x01, 0x00, 0xcf, 0x8f, 0xe0, 0x11, 0xb5, 0x9f, 0xa8, 0x76, 0x76, 0xdb, 0xdf, 0x0f, 0x54,\n+0xef, 0x73, 0x63, 0x29, 0x82, 0xad, 0x47, 0xc6, 0xa3, 0x6b, 0xed, 0xfe, 0x5f, 0x33, 0xf8, 0x43,\n+0x51, 0xe9, 0x1a, 0x33, 0x91, 0x31, 0x17, 0xa0, 0x74, 0xc4, 0xd4, 0xa7, 0x01, 0xe6, 0xb2, 0x92,\n+0x3e, 0x6a, 0x9d, 0xed, 0x0e, 0xf9, 0x74, 0x98, 0x40, 0xd3, 0x3f, 0x03, 0x80, 0x06, 0x82, 0x40,\n+0xe8, 0xb1, 0xe2, 0xa7, 0x51, 0xa7, 0x1d, 0x83, 0x26, 0x6b, 0xab, 0xde, 0xfa, 0x17, 0x91, 0x2b,\n+0xd8, 0xc6, 0xac, 0x1e, 0xb1, 0x9e, 0x19, 0x01, 0xd5, 0x97, 0xa6, 0xea, 0x0d, 0xb7, 0xc4, 0x55,\n+0x1f, 0x27, 0x7c, 0xd2, 0x08, 0xd5, 0x76, 0x1f, 0x29, 0x15, 0x87, 0x40, 0x39, 0xdd, 0x38, 0x45,\n+0x11, 0x75, 0xd0, 0x9a, 0xa7, 0x34, 0xe0, 0xbf, 0xcd, 0xc8, 0x52, 0x1d, 0xb9, 0x47, 0x7e, 0x0d,\n+0xb8, 0xbb, 0xc6, 0x0c, 0xf6, 0x73, 0x57, 0x16, 0x5a, 0x7e, 0x43, 0x91, 0x1f, 0x55, 0x3a, 0xc6,\n+0x6d, 0x44, 0x04, 0xaa, 0x9c, 0xa9, 0x9c, 0xa7, 0x4c, 0x89, 0x17, 0x83, 0xae, 0xa3, 0x04, 0x5e,\n+0x52, 0x80, 0x8b, 0x1e, 0x12, 0x25, 0x11, 0x19, 0xd7, 0x0c, 0x7d, 0x7d, 0x31, 0x44, 0x41, 0xea,\n+0xdb, 0xaf, 0xb0, 0x1c, 0xef, 0x81, 0xd0, 0x2c, 0xc5, 0x9a, 0x21, 0x9b, 0x3d, 0xed, 0x42, 0x3b,\n+0x50, 0x26, 0xf2, 0xec, 0xce, 0x71, 0x61, 0x06, 0x62, 0x21, 0x54, 0x4e, 0x7f, 0xc1, 0x9d, 0x3e,\n+0x7f, 0x20, 0x8c, 0x80, 0xcb, 0x2a, 0xd8, 0x97, 0x62, 0xc8, 0x83, 0x33, 0x91, 0x7d, 0xb0, 0xa2,\n+0x5a, 0x0f, 0x57, 0xe8, 0x3b, 0xcc, 0xf2, 0x25, 0xb2, 0xd4, 0x7c, 0x2f, 0xec, 0x4d, 0xc6, 0xa1,\n+0x3a, 0x15, 0x7a, 0xe7, 0xb6, 0x5d, 0x35, 0xf5, 0xf6, 0x48, 0x4a, 0x36, 0x45, 0x66, 0xd4, 0xba,\n+0x98, 0x58, 0xc1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03,\n+0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x44, 0x9e, 0x48, 0xf5, 0xcc, 0x6d, 0x48, 0xd4, 0xa0,\n+0x4b, 0x7f, 0xfe, 0x59, 0x24, 0x2f, 0x83, 0x97, 0x99, 0x9a, 0x86, 0x30, 0x1f, 0x06, 0x03, 0x55,\n+0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x44, 0x9e, 0x48, 0xf5, 0xcc, 0x6d, 0x48, 0xd4,\n+0xa0, 0x4b, 0x7f, 0xfe, 0x59, 0x24, 0x2f, 0x83, 0x97, 0x99, 0x9a, 0x86, 0x30, 0x0f, 0x06, 0x03,\n+0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01,\n+0x00, 0x05, 0x3e, 0x35, 0x5c, 0x15, 0x70, 0x9b, 0xc9, 0xc7, 0x73, 0x61, 0x6f, 0x72, 0x2b, 0xd4,\n+0xc2, 0x8f, 0xf2, 0x43, 0x5d, 0x02, 0xce, 0xc4, 0x94, 0xb9, 0x94, 0x11, 0x83, 0x67, 0x5d, 0xe2,\n+0x67, 0x6c, 0x75, 0x76, 0xbf, 0xbb, 0x0c, 0xaa, 0x36, 0xc6, 0xad, 0x47, 0x93, 0x63, 0xdc, 0x1e,\n+0x7e, 0xd6, 0xde, 0x2e, 0xfe, 0xe9, 0x19, 0x32, 0x38, 0x03, 0x7f, 0x14, 0xf6, 0x00, 0x73, 0x2c,\n+0x59, 0xb1, 0x21, 0x06, 0xe1, 0xfb, 0xac, 0x18, 0x95, 0x0c, 0xa3, 0xff, 0x99, 0x96, 0xf7, 0x2b,\n+0x27, 0x9b, 0xd5, 0x24, 0xcc, 0x1d, 0xdd, 0xc1, 0x3a, 0xe0, 0x98, 0x44, 0xb0, 0xc4, 0xe4, 0x3e,\n+0x77, 0xb1, 0x73, 0xa9, 0x64, 0x2c, 0xf6, 0x1c, 0x01, 0x7c, 0x3f, 0x5d, 0x45, 0x85, 0xc0, 0x85,\n+0xe7, 0x25, 0x8f, 0x95, 0xdc, 0x17, 0xf3, 0x3c, 0x9f, 0x1a, 0x6e, 0xb0, 0xca, 0xe3, 0x1d, 0x2a,\n+0xe9, 0x4c, 0x63, 0xfa, 0x24, 0x61, 0x62, 0xd6, 0xda, 0x7e, 0xb6, 0x1c, 0x6c, 0xf5, 0x02, 0x1d,\n+0xd4, 0x2a, 0xdd, 0x55, 0x90, 0xeb, 0x2a, 0x11, 0x47, 0x3c, 0x2e, 0x5e, 0x74, 0xb2, 0x82, 0x22,\n+0xa5, 0x7d, 0x53, 0x1f, 0x45, 0xec, 0x27, 0x91, 0x7d, 0xe7, 0x22, 0x16, 0xe8, 0xc0, 0x68, 0x36,\n+0xd8, 0xc6, 0xf1, 0x4f, 0x80, 0x44, 0x32, 0xf9, 0xe1, 0xd1, 0xd1, 0x1d, 0xaa, 0xde, 0xa8, 0xab,\n+0x9c, 0x04, 0xaf, 0xad, 0x20, 0x0e, 0x64, 0x98, 0x4d, 0xa5, 0x6b, 0xc0, 0x48, 0x58, 0x96, 0x69,\n+0x4d, 0xdc, 0x07, 0x8c, 0x51, 0x93, 0xa2, 0xdf, 0x9f, 0x0f, 0x3d, 0x8b, 0x60, 0xb4, 0x82, 0x8d,\n+0xaa, 0x08, 0x4e, 0x62, 0x45, 0xe0, 0xf9, 0x0b, 0xd2, 0xe0, 0xe0, 0x3c, 0x5b, 0xde, 0x5c, 0x71,\n+0x27, 0x25, 0xc2, 0xe6, 0x03, 0x81, 0x8b, 0x10, 0x53, 0xe3, 0xc7, 0x55, 0xa2, 0xb4, 0x9f, 0xd7,\n+0xe6, 0x30, 0x82, 0x06, 0x2f, 0x30, 0x82, 0x04, 0x17, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08,\n+0x25, 0xa1, 0xdf, 0xca, 0x33, 0xcb, 0x59, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa4, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08,\n+0x0c, 0x06, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04,\n+0x07, 0x0c, 0x0b, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24,\n+0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f,\n+0x72, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20,\n+0x52, 0x2e, 0x4c, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n+0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x1f, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x41, 0x2d, 0x32, 0x30, 0x1e,\n+0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x30, 0x34, 0x31, 0x32, 0x33, 0x32, 0x32, 0x33, 0x5a, 0x17,\n+0x0d, 0x33, 0x34, 0x31, 0x32, 0x33, 0x31, 0x31, 0x37, 0x32, 0x36, 0x33, 0x39, 0x5a, 0x30, 0x81,\n+0xa4, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x41, 0x31, 0x0f,\n+0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x31,\n+0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61,\n+0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1b,\n+0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,\n+0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06,\n+0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x43,\n+0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74,\n+0x20, 0x43, 0x41, 0x2d, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02,\n+0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa7, 0x20, 0x6e, 0xc2, 0x2a, 0xa2, 0x62, 0x24, 0x95, 0x90,\n+0x76, 0xc8, 0x38, 0x7e, 0x80, 0xd2, 0xab, 0xc1, 0x9b, 0x65, 0x05, 0x94, 0xf4, 0xc1, 0x0a, 0x10,\n+0xd5, 0x02, 0xac, 0xed, 0x9f, 0x93, 0xc7, 0x87, 0xc8, 0xb0, 0x27, 0x2b, 0x42, 0x0c, 0x3d, 0x0a,\n+0x3e, 0x41, 0x5a, 0x9e, 0x75, 0xdd, 0x8d, 0xca, 0xe0, 0x9b, 0xec, 0x68, 0x32, 0xa4, 0x69, 0x92,\n+0x68, 0x8c, 0x0b, 0x81, 0x0e, 0x56, 0xa0, 0x3e, 0x1a, 0xdd, 0x2c, 0x25, 0x14, 0x82, 0x2f, 0x97,\n+0xd3, 0x64, 0x46, 0xf4, 0x54, 0xa9, 0xdc, 0x3a, 0x54, 0x2d, 0x31, 0x2b, 0x99, 0x82, 0xf2, 0xd9,\n+0x2a, 0xd7, 0xef, 0x71, 0x00, 0xb8, 0x31, 0xa4, 0xbe, 0x7a, 0x24, 0x07, 0xc3, 0x42, 0x20, 0xf2,\n+0x8a, 0xd4, 0x92, 0x04, 0x1b, 0x65, 0x56, 0x4c, 0x6c, 0xd4, 0xfb, 0xb6, 0x61, 0x5a, 0x47, 0x23,\n+0xb4, 0xd8, 0x69, 0xb4, 0xb7, 0x3a, 0xd0, 0x74, 0x3c, 0x0c, 0x75, 0xa1, 0x8c, 0x4e, 0x76, 0xa1,\n+0xe9, 0xdb, 0x2a, 0xa5, 0x3b, 0xfa, 0xce, 0xb0, 0xff, 0x7e, 0x6a, 0x28, 0xfd, 0x27, 0x1c, 0xc8,\n+0xb1, 0xe9, 0x29, 0xf1, 0x57, 0x6e, 0x64, 0xb4, 0xd0, 0xc1, 0x15, 0x6d, 0x0e, 0xbe, 0x2e, 0x0e,\n+0x46, 0xc8, 0x5e, 0xf4, 0x51, 0xfe, 0xef, 0x0e, 0x63, 0x3a, 0x3b, 0x71, 0xba, 0xcf, 0x6f, 0x59,\n+0xca, 0x0c, 0xe3, 0x9b, 0x5d, 0x49, 0xb8, 0x4c, 0xe2, 0x57, 0xb1, 0x98, 0x8a, 0x42, 0x57, 0x9c,\n+0x76, 0xef, 0xef, 0xbd, 0xd1, 0x68, 0xa8, 0xd2, 0xf4, 0x09, 0xbb, 0x77, 0x35, 0xbe, 0x25, 0x82,\n+0x08, 0xc4, 0x16, 0x2c, 0x44, 0x20, 0x56, 0xa9, 0x44, 0x11, 0x77, 0xef, 0x5d, 0xb4, 0x1d, 0xaa,\n+0x5e, 0x6b, 0x3e, 0x8b, 0x32, 0xf6, 0x07, 0x2f, 0x57, 0x04, 0x92, 0xca, 0xf5, 0xfe, 0x9d, 0xc2,\n+0xe9, 0xe8, 0xb3, 0x8e, 0x4c, 0x4b, 0x02, 0x31, 0xd9, 0xe4, 0x3c, 0x48, 0x82, 0x27, 0xf7, 0x18,\n+0x82, 0x76, 0x48, 0x3a, 0x71, 0xb1, 0x13, 0xa1, 0x39, 0xd5, 0x2e, 0xc5, 0x34, 0xc2, 0x1d, 0x62,\n+0x85, 0xdf, 0x03, 0xfe, 0x4d, 0xf4, 0xaf, 0x3d, 0xdf, 0x5c, 0x5b, 0x8d, 0xfa, 0x70, 0xe1, 0xa5,\n+0x7e, 0x27, 0xc7, 0x86, 0x2e, 0x6a, 0x8f, 0x12, 0xc6, 0x84, 0x5e, 0x43, 0x51, 0x50, 0x9c, 0x19,\n+0x9b, 0x78, 0xe6, 0xfc, 0xf6, 0xed, 0x47, 0x7e, 0x7b, 0x3d, 0x66, 0xef, 0x13, 0x13, 0x88, 0x5f,\n+0x3c, 0xa1, 0x63, 0xfb, 0xf9, 0xac, 0x87, 0x35, 0x9f, 0xf3, 0x82, 0x9e, 0xa4, 0x3f, 0x0a, 0x9c,\n+0x31, 0x69, 0x8b, 0x99, 0xa4, 0x88, 0x4a, 0x8e, 0x6e, 0x66, 0x4d, 0xef, 0x16, 0xc4, 0x0f, 0x79,\n+0x28, 0x21, 0x60, 0x0d, 0x85, 0x16, 0x7d, 0xd7, 0x54, 0x38, 0xf1, 0x92, 0x56, 0xfd, 0xb5, 0x33,\n+0x4c, 0x83, 0xdc, 0xd7, 0x10, 0x9f, 0x4b, 0xfd, 0xc6, 0xf8, 0x42, 0xbd, 0xba, 0x7c, 0x73, 0x02,\n+0xe0, 0xff, 0x7d, 0xcd, 0x5b, 0xe1, 0xd4, 0xac, 0x61, 0x7b, 0x57, 0xd5, 0x4a, 0x7b, 0x5b, 0xd4,\n+0x85, 0x58, 0x27, 0x5d, 0xbf, 0xf8, 0x2b, 0x60, 0xac, 0xa0, 0x26, 0xae, 0x14, 0x21, 0x27, 0xc6,\n+0x77, 0x9a, 0x33, 0x80, 0x3c, 0x5e, 0x46, 0x3f, 0xf7, 0xc3, 0xb1, 0xa3, 0x86, 0x33, 0xc6, 0xe8,\n+0x5e, 0x0d, 0xb9, 0x35, 0x2c, 0xaa, 0x46, 0xc1, 0x85, 0x02, 0x75, 0x80, 0xa0, 0xeb, 0x24, 0xfb,\n+0x15, 0xaa, 0xe4, 0x67, 0x7f, 0x6e, 0x77, 0x3f, 0xf4, 0x04, 0x8a, 0x2f, 0x7c, 0x7b, 0xe3, 0x17,\n+0x61, 0xf0, 0xdd, 0x09, 0xa9, 0x20, 0xc8, 0xbe, 0x09, 0xa4, 0xd0, 0x7e, 0x44, 0xc3, 0xb2, 0x30,\n+0x4a, 0x38, 0xaa, 0xa9, 0xec, 0x18, 0x9a, 0x07, 0x82, 0x2b, 0xdb, 0xb8, 0x9c, 0x18, 0xad, 0xda,\n+0xe0, 0x46, 0x17, 0xac, 0xcf, 0x5d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd9, 0xfe, 0x21, 0x40, 0x6e, 0x94,\n+0x9e, 0xbc, 0x9b, 0x3d, 0x9c, 0x7d, 0x98, 0x20, 0x19, 0xe5, 0x8c, 0x30, 0x62, 0xb2, 0x30, 0x1f,\n+0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xd9, 0xfe, 0x21, 0x40, 0x6e,\n+0x94, 0x9e, 0xbc, 0x9b, 0x3d, 0x9c, 0x7d, 0x98, 0x20, 0x19, 0xe5, 0x8c, 0x30, 0x62, 0xb2, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03,\n+0x82, 0x02, 0x01, 0x00, 0x9e, 0x45, 0x9e, 0x0c, 0x3b, 0xb6, 0xef, 0xe1, 0x3a, 0xc8, 0x7c, 0xd1,\n+0x00, 0x3d, 0xcf, 0xe2, 0xea, 0x06, 0xb5, 0xb2, 0x3a, 0xbb, 0x06, 0x4b, 0x68, 0x7a, 0xd0, 0x23,\n+0x97, 0x74, 0xa7, 0x2c, 0xf0, 0x08, 0xd8, 0x79, 0x5a, 0xd7, 0x5a, 0x84, 0x8a, 0xd8, 0x12, 0x9a,\n+0x1b, 0xd9, 0x7d, 0x5c, 0x4d, 0x70, 0xc5, 0xa5, 0xf9, 0xab, 0xe5, 0xa3, 0x89, 0x89, 0xdd, 0x01,\n+0xfa, 0xec, 0xdd, 0xf9, 0xe9, 0x92, 0x97, 0xdb, 0xb0, 0x46, 0x42, 0xf3, 0xd3, 0x62, 0xaa, 0x95,\n+0xfe, 0x31, 0x67, 0x14, 0x69, 0x58, 0x90, 0x0a, 0xaa, 0x0b, 0xee, 0x37, 0x23, 0xc7, 0x50, 0x51,\n+0xb4, 0xf5, 0x7e, 0x9e, 0xe3, 0x7b, 0xf7, 0xe4, 0xcc, 0x42, 0x32, 0x2d, 0x49, 0x0c, 0xcb, 0xff,\n+0x49, 0x0c, 0x9b, 0x1e, 0x34, 0xfd, 0x6e, 0x6e, 0x96, 0x8a, 0x79, 0x03, 0xb6, 0x6f, 0xdb, 0x09,\n+0xcb, 0xfd, 0x5f, 0x65, 0x14, 0x37, 0xe1, 0x38, 0xf5, 0xf3, 0x61, 0x16, 0x58, 0xe4, 0xb5, 0x6d,\n+0x0d, 0x0b, 0x04, 0x1b, 0x3f, 0x50, 0x2d, 0x7f, 0xb3, 0xc7, 0x7a, 0x1a, 0x16, 0x80, 0x60, 0xf8,\n+0x8a, 0x1f, 0xe9, 0x1b, 0x2a, 0xc6, 0xf9, 0xba, 0x01, 0x1a, 0x69, 0xbf, 0xd2, 0x58, 0xc7, 0x54,\n+0x57, 0x08, 0x8f, 0xe1, 0x39, 0x60, 0x77, 0x4b, 0xac, 0x59, 0x84, 0x1a, 0x88, 0xf1, 0xdd, 0xcb,\n+0x4f, 0x78, 0xd7, 0xe7, 0xe1, 0x33, 0x2d, 0xfc, 0xee, 0x41, 0xfa, 0x20, 0xb0, 0xbe, 0xcb, 0xf7,\n+0x38, 0x94, 0xc0, 0xe1, 0xd0, 0x85, 0x0f, 0xbb, 0xed, 0x2c, 0x73, 0xab, 0xed, 0xfe, 0x92, 0x76,\n+0x1a, 0x64, 0x7f, 0x5b, 0x0d, 0x33, 0x09, 0x07, 0x33, 0x7b, 0x06, 0x3f, 0x11, 0xa4, 0x5c, 0x70,\n+0x3c, 0x85, 0xc0, 0xcf, 0xe3, 0x90, 0xa8, 0x83, 0x77, 0xfa, 0xdb, 0xe6, 0xc5, 0x8c, 0x68, 0x67,\n+0x10, 0x67, 0xa5, 0x52, 0x2d, 0xf0, 0xc4, 0x99, 0x8f, 0x7f, 0xbf, 0xd1, 0x6b, 0xe2, 0xb5, 0x47,\n+0xd6, 0xd9, 0xd0, 0x85, 0x99, 0x4d, 0x94, 0x9b, 0x0f, 0x4b, 0x8d, 0xee, 0x00, 0x5a, 0x47, 0x1d,\n+0x11, 0x03, 0xac, 0x41, 0x18, 0xaf, 0x87, 0xb7, 0x6f, 0x0c, 0x3a, 0x8f, 0xca, 0xcf, 0xdc, 0x03,\n+0xc1, 0xa2, 0x09, 0xc8, 0xe5, 0xfd, 0x80, 0x5e, 0xc8, 0x60, 0x42, 0x01, 0x1b, 0x1a, 0x53, 0x5a,\n+0xbb, 0x37, 0xa6, 0xb7, 0xbc, 0xba, 0x84, 0xe9, 0x1e, 0x6c, 0x1a, 0xd4, 0x64, 0xda, 0xd4, 0x43,\n+0xfe, 0x93, 0x8b, 0x4b, 0xf2, 0x2c, 0x79, 0x16, 0x10, 0xd4, 0x93, 0x0b, 0x88, 0x8f, 0xa1, 0xd8,\n+0x86, 0x14, 0x46, 0x91, 0x47, 0x9b, 0x28, 0x24, 0xef, 0x57, 0x52, 0x4e, 0x5c, 0x42, 0x9c, 0xaa,\n+0xf7, 0x49, 0xec, 0x27, 0xe8, 0x40, 0x1e, 0xb3, 0xa6, 0x89, 0x22, 0x72, 0x9c, 0xf5, 0x0d, 0x33,\n+0xb4, 0x58, 0xa3, 0x30, 0x3b, 0xdd, 0xd4, 0x6a, 0x54, 0x93, 0xbe, 0x1a, 0x4d, 0xf3, 0x93, 0x94,\n+0xf7, 0xfc, 0x84, 0x0b, 0x3f, 0x84, 0x20, 0x5c, 0x34, 0x03, 0x44, 0xc5, 0xda, 0xad, 0xbc, 0x0a,\n+0xc1, 0x02, 0xcf, 0x1e, 0xe5, 0x94, 0xd9, 0xf3, 0x8e, 0x5b, 0xd8, 0x4c, 0xf0, 0x9d, 0xec, 0x61,\n+0x17, 0xbb, 0x14, 0x32, 0x54, 0x0c, 0x02, 0x29, 0x93, 0x1e, 0x92, 0x86, 0xf6, 0x7f, 0xef, 0xe7,\n+0x92, 0x05, 0x0e, 0x59, 0xdd, 0x99, 0x08, 0x2e, 0x2e, 0xfa, 0x9c, 0x00, 0x52, 0xd3, 0xc5, 0x66,\n+0x29, 0xe4, 0xa7, 0x97, 0x44, 0xa4, 0x0e, 0x28, 0x81, 0x13, 0x35, 0xc5, 0xf6, 0x6f, 0x64, 0xe6,\n+0x41, 0xc4, 0xd5, 0x2f, 0xcc, 0x34, 0x45, 0x25, 0xcf, 0x41, 0x00, 0x96, 0x3d, 0x4a, 0x2e, 0xc2,\n+0x96, 0x98, 0x4f, 0x4e, 0x4a, 0x9c, 0x97, 0xb7, 0xdb, 0x1f, 0x92, 0x32, 0xc8, 0xff, 0x0f, 0x51,\n+0x6e, 0xd6, 0xec, 0x09, 0x30, 0x82, 0x04, 0x30, 0x30, 0x82, 0x03, 0x18, 0xa0, 0x03, 0x02, 0x01,\n+0x02, 0x02, 0x09, 0x00, 0xda, 0x9b, 0xec, 0x71, 0xf3, 0x03, 0xb0, 0x19, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa4, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06,\n+0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12,\n+0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69,\n+0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75,\n+0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e,\n+0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04,\n+0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,\n+0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x43, 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x41,\n+0x2d, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x30, 0x34, 0x31, 0x32, 0x33, 0x32,\n+0x31, 0x36, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x37, 0x32, 0x33, 0x31,\n+0x36, 0x5a, 0x30, 0x81, 0xa4, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50, 0x61, 0x6e,\n+0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x50, 0x61,\n+0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53, 0x79, 0x73,\n+0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c, 0x2e, 0x31,\n+0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43,\n+0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41,\n+0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x0c, 0x16, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x41, 0x2d, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f,\n+0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x8e, 0xb7, 0x95, 0xe2, 0xc2,\n+0x26, 0x12, 0x6b, 0x33, 0x19, 0xc7, 0x40, 0x58, 0x0a, 0xab, 0x59, 0xaa, 0x8d, 0x00, 0xa3, 0xfc,\n+0x80, 0xc7, 0x50, 0x7b, 0x8e, 0xd4, 0x20, 0x26, 0xba, 0x32, 0x12, 0xd8, 0x23, 0x54, 0x49, 0x25,\n+0x10, 0x22, 0x98, 0x9d, 0x46, 0xd2, 0xc1, 0xc9, 0x9e, 0x4e, 0x1b, 0x2e, 0x2c, 0x0e, 0x38, 0xf3,\n+0x1a, 0x25, 0x68, 0x1c, 0xa6, 0x5a, 0x05, 0xe6, 0x1e, 0x8b, 0x48, 0xbf, 0x98, 0x96, 0x74, 0x3e,\n+0x69, 0xca, 0xe9, 0xb5, 0x78, 0xa5, 0x06, 0xbc, 0xd5, 0x00, 0x5e, 0x09, 0x0a, 0xf2, 0x27, 0x7a,\n+0x52, 0xfc, 0x2d, 0xd5, 0xb1, 0xea, 0xb4, 0x89, 0x61, 0x24, 0xf3, 0x1a, 0x13, 0xdb, 0xa9, 0xcf,\n+0x52, 0xed, 0x0c, 0x24, 0xba, 0xb9, 0x9e, 0xec, 0x7e, 0x00, 0x74, 0xfa, 0x93, 0xad, 0x6c, 0x29,\n+0x92, 0xae, 0x51, 0xb4, 0xbb, 0xd3, 0x57, 0xbf, 0xb3, 0xf3, 0xa8, 0x8d, 0x9c, 0xf4, 0x24, 0x4b,\n+0x2a, 0xd6, 0x99, 0x9e, 0xf4, 0x9e, 0xfe, 0xc0, 0x7e, 0x42, 0x3a, 0xe7, 0x0b, 0x95, 0x53, 0xda,\n+0xb7, 0x68, 0x0e, 0x90, 0x4c, 0xfb, 0x70, 0x3f, 0x8f, 0x4a, 0x2c, 0x94, 0xf3, 0x26, 0xdd, 0x63,\n+0x69, 0xa9, 0x94, 0xd8, 0x10, 0x4e, 0xc5, 0x47, 0x08, 0x90, 0x99, 0x1b, 0x17, 0x4d, 0xb9, 0x6c,\n+0x6e, 0xef, 0x60, 0x95, 0x11, 0x8e, 0x21, 0x80, 0xb5, 0xbd, 0xa0, 0x73, 0xd8, 0xd0, 0xb2, 0x77,\n+0xc4, 0x45, 0xea, 0x5a, 0x26, 0xfb, 0x66, 0x76, 0x76, 0xf8, 0x06, 0x1f, 0x61, 0x6d, 0x0f, 0x55,\n+0xc5, 0x83, 0xb7, 0x10, 0x56, 0x72, 0x06, 0x07, 0xa5, 0xf3, 0xb1, 0x1a, 0x03, 0x05, 0x64, 0x0e,\n+0x9d, 0x5a, 0x8a, 0xd6, 0x86, 0x70, 0x1b, 0x24, 0xde, 0xfe, 0x28, 0x8a, 0x2b, 0xd0, 0x6a, 0xb0,\n+0xfc, 0x7a, 0xa2, 0xdc, 0xb2, 0x79, 0x0e, 0x8b, 0x65, 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n+0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xee, 0x6b,\n+0x49, 0x3c, 0x7a, 0x3f, 0x0d, 0xe3, 0xb1, 0x09, 0xb7, 0x8a, 0xc8, 0xab, 0x19, 0x9f, 0x73, 0x33,\n+0x50, 0xe7, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xee,\n+0x6b, 0x49, 0x3c, 0x7a, 0x3f, 0x0d, 0xe3, 0xb1, 0x09, 0xb7, 0x8a, 0xc8, 0xab, 0x19, 0x9f, 0x73,\n+0x33, 0x50, 0xe7, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x25, 0x18, 0xd4, 0x91, 0x8f, 0x13, 0xee, 0x8f,\n+0x1e, 0x1d, 0x11, 0x53, 0xda, 0x2d, 0x44, 0x29, 0x19, 0xa0, 0x1e, 0x6b, 0x31, 0x9e, 0x4d, 0x0e,\n+0x9e, 0xad, 0x3d, 0x5c, 0x41, 0x6f, 0x95, 0x2b, 0x24, 0xa1, 0x79, 0x98, 0x3a, 0x38, 0x36, 0xfb,\n+0xbb, 0x66, 0x9e, 0x48, 0xff, 0x90, 0x90, 0xef, 0x3d, 0xd4, 0xb8, 0x9b, 0xb4, 0x87, 0x75, 0x3f,\n+0x20, 0x9b, 0xce, 0x72, 0xcf, 0xa1, 0x55, 0xc1, 0x4d, 0x64, 0xa2, 0x19, 0x06, 0xa1, 0x07, 0x33,\n+0x0c, 0x0b, 0x29, 0xe5, 0xf1, 0xea, 0xab, 0xa3, 0xec, 0xb5, 0x0a, 0x74, 0x90, 0xc7, 0x7d, 0x72,\n+0xf2, 0xd7, 0x5c, 0x9f, 0x91, 0xef, 0x91, 0x8b, 0xb7, 0xdc, 0xed, 0x66, 0xa2, 0xcf, 0x8e, 0x66,\n+0x3b, 0xbc, 0x9f, 0x3a, 0x02, 0xe0, 0x27, 0xdd, 0x16, 0x98, 0xc0, 0x95, 0xd4, 0x0a, 0xa4, 0xe4,\n+0x81, 0x9a, 0x75, 0x94, 0x35, 0x9c, 0x90, 0x5f, 0x88, 0x37, 0x06, 0xad, 0x59, 0x95, 0x0a, 0xb0,\n+0xd1, 0x67, 0xd3, 0x19, 0xca, 0x89, 0xe7, 0x32, 0x5a, 0x36, 0x1c, 0x3e, 0x82, 0xa8, 0x5a, 0x93,\n+0xbe, 0xc6, 0xd0, 0x64, 0x91, 0xb6, 0xcf, 0xd9, 0xb6, 0x18, 0xcf, 0xdb, 0x7e, 0xd2, 0x65, 0xa3,\n+0xa6, 0xc4, 0x8e, 0x17, 0x31, 0xc1, 0xfb, 0x7e, 0x76, 0xdb, 0xd3, 0x85, 0xe3, 0x58, 0xb2, 0x77,\n+0x7a, 0x76, 0x3b, 0x6c, 0x2f, 0x50, 0x1c, 0xe7, 0xdb, 0xf6, 0x67, 0x79, 0x1f, 0xf5, 0x82, 0x95,\n+0x9a, 0x07, 0xa7, 0x14, 0xaf, 0x8f, 0xdc, 0x28, 0x21, 0x67, 0x09, 0xd2, 0xd6, 0x4d, 0x5a, 0x1c,\n+0x19, 0x1c, 0x8e, 0x77, 0x5c, 0xc3, 0x94, 0x24, 0x3d, 0x32, 0x6b, 0x4b, 0x7e, 0xd4, 0x78, 0x94,\n+0x83, 0xbe, 0x37, 0x4d, 0xce, 0x5f, 0xc7, 0x1e, 0x4e, 0x3c, 0xe0, 0x89, 0x33, 0x95, 0x0b, 0x0f,\n+0xa5, 0x32, 0xd6, 0x3c, 0x5a, 0x79, 0x2c, 0x19, 0x30, 0x82, 0x05, 0x5a, 0x30, 0x82, 0x03, 0x42,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x4f, 0xd2, 0x2b, 0x8f, 0xf5, 0x64, 0xc8, 0x33, 0x9e,\n+0x4f, 0x34, 0x58, 0x66, 0x23, 0x70, 0x60, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08,\n+0x55, 0x6e, 0x69, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x0c, 0x1c, 0x55, 0x43, 0x41, 0x20, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20,\n+0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30,\n+0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x33, 0x31, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,\n+0x17, 0x0d, 0x33, 0x38, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30,\n+0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x11,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x55, 0x6e, 0x69, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, 0x55, 0x43, 0x41, 0x20,\n+0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,\n+0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00,\n+0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa9, 0x09, 0x07, 0x28, 0x13, 0x02, 0xb0,\n+0x99, 0xe0, 0x64, 0xaa, 0x1e, 0x43, 0x16, 0x7a, 0x73, 0xb1, 0x91, 0xa0, 0x75, 0x3e, 0xa8, 0xfa,\n+0xe3, 0x38, 0x00, 0x7a, 0xec, 0x89, 0x6a, 0x20, 0x0f, 0x8b, 0xc5, 0xb0, 0x9b, 0x33, 0x03, 0x5a,\n+0x86, 0xc6, 0x58, 0x86, 0xd5, 0xc1, 0x85, 0xbb, 0x4f, 0xc6, 0x9c, 0x40, 0x4d, 0xca, 0xbe, 0xee,\n+0x69, 0x96, 0xb8, 0xad, 0x81, 0x30, 0x9a, 0x7c, 0x92, 0x05, 0xeb, 0x05, 0x2b, 0x9a, 0x48, 0xd0,\n+0xb8, 0x76, 0x3e, 0x96, 0xc8, 0x20, 0xbb, 0xd2, 0xb0, 0xf1, 0x8f, 0xd8, 0xac, 0x45, 0x46, 0xff,\n+0xaa, 0x67, 0x60, 0xb4, 0x77, 0x7e, 0x6a, 0x1f, 0x3c, 0x1a, 0x52, 0x7a, 0x04, 0x3d, 0x07, 0x3c,\n+0x85, 0x0d, 0x84, 0xd0, 0x1f, 0x76, 0x0a, 0xf7, 0x6a, 0x14, 0xdf, 0x72, 0xe3, 0x34, 0x7c, 0x57,\n+0x4e, 0x56, 0x01, 0x3e, 0x79, 0xf1, 0xaa, 0x29, 0x3b, 0x6c, 0xfa, 0xf8, 0x8f, 0x6d, 0x4d, 0xc8,\n+0x35, 0xdf, 0xae, 0xeb, 0xdc, 0x24, 0xee, 0x79, 0x45, 0xa7, 0x85, 0xb6, 0x05, 0x88, 0xde, 0x88,\n+0x5d, 0x25, 0x7c, 0x97, 0x64, 0x67, 0x09, 0xd9, 0xbf, 0x5a, 0x15, 0x05, 0x86, 0xf3, 0x09, 0x1e,\n+0xec, 0x58, 0x32, 0x33, 0x11, 0xf3, 0x77, 0x64, 0xb0, 0x76, 0x1f, 0xe4, 0x10, 0x35, 0x17, 0x1b,\n+0xf2, 0x0e, 0xb1, 0x6c, 0xa4, 0x2a, 0xa3, 0x73, 0xfc, 0x09, 0x1f, 0x1e, 0x32, 0x19, 0x53, 0x11,\n+0xe7, 0xd9, 0xb3, 0x2c, 0x2e, 0x76, 0x2e, 0xa1, 0xa3, 0xde, 0x7e, 0x6a, 0x88, 0x09, 0xe8, 0xf2,\n+0x07, 0x8a, 0xf8, 0xb2, 0xcd, 0x10, 0xe7, 0xe2, 0x73, 0x40, 0x93, 0xbb, 0x08, 0xd1, 0x3f, 0xe1,\n+0xfc, 0x0b, 0x94, 0xb3, 0x25, 0xef, 0x7c, 0xa6, 0xd7, 0xd1, 0xaf, 0x9f, 0xff, 0x96, 0x9a, 0xf5,\n+0x91, 0x7b, 0x98, 0x0b, 0x77, 0xd4, 0x7e, 0xe8, 0x07, 0xd2, 0x62, 0xb5, 0x95, 0x39, 0xe3, 0xf3,\n+0xf1, 0x6d, 0x0f, 0x0e, 0x65, 0x84, 0x8a, 0x63, 0x54, 0xc5, 0x80, 0xb6, 0xe0, 0x9e, 0x4b, 0x7d,\n+0x47, 0x26, 0xa7, 0x01, 0x08, 0x5d, 0xd1, 0x88, 0x9e, 0xd7, 0xc3, 0x32, 0x44, 0xfa, 0x82, 0x4a,\n+0x0a, 0x68, 0x54, 0x7f, 0x38, 0x53, 0x03, 0xcc, 0xa4, 0x00, 0x33, 0x64, 0x51, 0x59, 0x0b, 0xa3,\n+0x82, 0x91, 0x7a, 0x5e, 0xec, 0x16, 0xc2, 0xf3, 0x2a, 0xe6, 0x62, 0xda, 0x2a, 0xdb, 0x59, 0x62,\n+0x10, 0x25, 0x4a, 0x2a, 0x81, 0x0b, 0x47, 0x07, 0x43, 0x06, 0x70, 0x87, 0xd2, 0xfa, 0x93, 0x11,\n+0x29, 0x7a, 0x48, 0x4d, 0xeb, 0x94, 0xc7, 0x70, 0x4d, 0xaf, 0x67, 0xd5, 0x51, 0xb1, 0x80, 0x20,\n+0x01, 0x01, 0xb4, 0x7a, 0x08, 0xa6, 0x90, 0x7f, 0x4e, 0xe0, 0xef, 0x07, 0x41, 0x87, 0xaf, 0x6a,\n+0xa5, 0x5e, 0x8b, 0xfb, 0xcf, 0x50, 0xb2, 0x9a, 0x54, 0xaf, 0xc3, 0x89, 0xba, 0x58, 0x2d, 0xf5,\n+0x30, 0x98, 0xb1, 0x36, 0x72, 0x39, 0x7e, 0x49, 0x04, 0xfd, 0x29, 0xa7, 0x4c, 0x79, 0xe4, 0x05,\n+0x57, 0xdb, 0x94, 0xb9, 0x16, 0x53, 0x8d, 0x46, 0xb3, 0x1d, 0x95, 0x61, 0x57, 0x56, 0x7f, 0xaf,\n+0xf0, 0x16, 0x5b, 0x61, 0x58, 0x6f, 0x36, 0x50, 0x11, 0x0b, 0xd8, 0xac, 0x2b, 0x95, 0x16, 0x1a,\n+0x0e, 0x1f, 0x08, 0xcd, 0x36, 0x34, 0x65, 0x10, 0x62, 0x66, 0xd5, 0x80, 0x5f, 0x14, 0x20, 0x5f,\n+0x2d, 0x0c, 0xa0, 0x78, 0x0a, 0x68, 0xd6, 0x2c, 0xd7, 0xe9, 0x6f, 0x2b, 0xd2, 0x4a, 0x05, 0x93,\n+0xfc, 0x9e, 0x6f, 0x6b, 0x67, 0xff, 0x88, 0xf1, 0x4e, 0xa5, 0x69, 0x4a, 0x52, 0x37, 0x05, 0xea,\n+0xc6, 0x16, 0x8d, 0xd2, 0xc4, 0x99, 0xd1, 0x82, 0x2b, 0x3b, 0xba, 0x35, 0x75, 0xf7, 0x51, 0x51,\n+0x58, 0xf3, 0xc8, 0x07, 0xdd, 0xe4, 0xb4, 0x03, 0x7f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n+0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd9, 0x74, 0x3a,\n+0xe4, 0x30, 0x3d, 0x0d, 0xf7, 0x12, 0xdc, 0x7e, 0x5a, 0x05, 0x9f, 0x1e, 0x34, 0x9a, 0xf7, 0xe1,\n+0x14, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n+0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x36, 0x8d, 0x97, 0xcc, 0x42, 0x15, 0x64, 0x29, 0x37, 0x9b,\n+0x26, 0x2c, 0xd6, 0xfb, 0xae, 0x15, 0x69, 0x2c, 0x6b, 0x1a, 0x1a, 0xf7, 0x5f, 0xb6, 0xf9, 0x07,\n+0x4c, 0x59, 0xea, 0xf3, 0xc9, 0xc8, 0xb9, 0xae, 0xcc, 0xba, 0x2e, 0x7a, 0xdc, 0xc0, 0xf5, 0xb0,\n+0x2d, 0xc0, 0x3b, 0xaf, 0x9f, 0x70, 0x05, 0x11, 0x6a, 0x9f, 0x25, 0x4f, 0x01, 0x29, 0x70, 0xe3,\n+0xe5, 0x0c, 0xe1, 0xea, 0x5a, 0x7c, 0xdc, 0x49, 0xbb, 0xc1, 0x1e, 0x2a, 0x81, 0xf5, 0x16, 0x4b,\n+0x72, 0x91, 0xc8, 0xa2, 0x31, 0xb9, 0xaa, 0xda, 0xfc, 0x9d, 0x1f, 0xf3, 0x5d, 0x40, 0x02, 0x13,\n+0xfc, 0x4e, 0x1c, 0x06, 0xca, 0xb3, 0x14, 0x90, 0x54, 0x17, 0x19, 0x12, 0x1a, 0xf1, 0x1f, 0xd7,\n+0x0c, 0x69, 0x5a, 0xf6, 0x71, 0x78, 0xf4, 0x94, 0x7d, 0x91, 0x0b, 0x8e, 0xec, 0x90, 0x54, 0x8e,\n+0xbc, 0x6f, 0xa1, 0x4c, 0xab, 0xfc, 0x74, 0x64, 0xfd, 0x71, 0x9a, 0xf8, 0x41, 0x07, 0xa1, 0xcd,\n+0x91, 0xe4, 0x3c, 0x9a, 0xe0, 0x9b, 0x32, 0x39, 0x73, 0xab, 0x2a, 0xd5, 0x69, 0xc8, 0x78, 0x91,\n+0x26, 0x31, 0x7d, 0xe2, 0xc7, 0x30, 0xf1, 0xfc, 0x14, 0x78, 0x77, 0x12, 0x0e, 0x13, 0xf4, 0xdd,\n+0x16, 0x94, 0xbf, 0x4b, 0x67, 0x7b, 0x70, 0x53, 0x85, 0xca, 0xb0, 0xbb, 0xf3, 0x38, 0x4d, 0x2c,\n+0x90, 0x39, 0xc0, 0x0d, 0xc2, 0x5d, 0x6b, 0xe9, 0xe2, 0xe5, 0xd5, 0x88, 0x8d, 0xd6, 0x2c, 0xbf,\n+0xab, 0x1b, 0xbe, 0xb5, 0x28, 0x87, 0x12, 0x17, 0x74, 0x6e, 0xfc, 0x7d, 0xfc, 0x8f, 0xd0, 0x87,\n+0x26, 0xb0, 0x1b, 0xfb, 0xb9, 0x6c, 0xab, 0xe2, 0x9e, 0x3d, 0x15, 0xc1, 0x3b, 0x2e, 0x67, 0x02,\n+0x58, 0x91, 0x9f, 0xef, 0xf8, 0x42, 0x1f, 0x2c, 0xb7, 0x68, 0xf5, 0x75, 0xad, 0xcf, 0xb5, 0xf6,\n+0xff, 0x11, 0x7d, 0xc2, 0xf0, 0x24, 0xa5, 0xad, 0xd3, 0xfa, 0xa0, 0x3c, 0xa9, 0xfa, 0x5d, 0xdc,\n+0xa5, 0xa0, 0xef, 0x44, 0xa4, 0xbe, 0xd6, 0xe8, 0xe5, 0xe4, 0x13, 0x96, 0x17, 0x7b, 0x06, 0x3e,\n+0x32, 0xed, 0xc7, 0xb7, 0x42, 0xbc, 0x76, 0xa3, 0xd8, 0x65, 0x38, 0x2b, 0x38, 0x35, 0x51, 0x21,\n+0x0e, 0x0e, 0x6f, 0x2e, 0x34, 0x13, 0x40, 0xe1, 0x2b, 0x67, 0x0c, 0x6d, 0x4a, 0x41, 0x30, 0x18,\n+0x23, 0x5a, 0x32, 0x55, 0x99, 0xc9, 0x17, 0xe0, 0x3c, 0xde, 0xf6, 0xec, 0x79, 0xad, 0x2b, 0x58,\n+0x19, 0xa2, 0xad, 0x2c, 0x22, 0x1a, 0x95, 0x8e, 0xbe, 0x96, 0x90, 0x5d, 0x42, 0x57, 0xc4, 0xf9,\n+0x14, 0x03, 0x35, 0x2b, 0x1c, 0x2d, 0x51, 0x57, 0x08, 0xa7, 0x3a, 0xde, 0x3f, 0xe4, 0xc8, 0xb4,\n+0x03, 0x73, 0xc2, 0xc1, 0x26, 0x80, 0xbb, 0x0b, 0x42, 0x1f, 0xad, 0x0d, 0xaf, 0x26, 0x72, 0xda,\n+0xcc, 0xbe, 0xb3, 0xa3, 0x83, 0x58, 0x0d, 0x82, 0xc5, 0x1f, 0x46, 0x51, 0xe3, 0x9c, 0x18, 0xcc,\n+0x8d, 0x9b, 0x8d, 0xec, 0x49, 0xeb, 0x75, 0x50, 0xd5, 0x8c, 0x28, 0x59, 0xca, 0x74, 0x34, 0xda,\n+0x8c, 0x0b, 0x21, 0xab, 0x1e, 0xea, 0x1b, 0xe5, 0xc7, 0xfd, 0x15, 0x3e, 0xc0, 0x17, 0xaa, 0xfb,\n+0x23, 0x6e, 0x26, 0x46, 0xcb, 0xfa, 0xf9, 0xb1, 0x72, 0x6b, 0x69, 0xcf, 0x22, 0x84, 0x0b, 0x62,\n+0x0f, 0xac, 0xd9, 0x19, 0x00, 0x94, 0xa2, 0x76, 0x3c, 0xd4, 0x2d, 0x9a, 0xed, 0x04, 0x9e, 0x2d,\n+0x06, 0x62, 0x10, 0x37, 0x52, 0x1c, 0x85, 0x72, 0x1b, 0x27, 0xe5, 0xcc, 0xc6, 0x31, 0xec, 0x37,\n+0xec, 0x63, 0x59, 0x9b, 0x0b, 0x1d, 0x76, 0xcc, 0x7e, 0x32, 0x9a, 0x88, 0x95, 0x08, 0x36, 0x52,\n+0xbb, 0xde, 0x76, 0x5f, 0x76, 0x49, 0x49, 0xad, 0x7f, 0xbd, 0x65, 0x20, 0xb2, 0xc9, 0xc1, 0x2b,\n+0x76, 0x18, 0x76, 0x9f, 0x56, 0xb1, 0x30, 0x82, 0x05, 0x46, 0x30, 0x82, 0x03, 0x2e, 0xa0, 0x03,\n+0x02, 0x01, 0x02, 0x02, 0x10, 0x5d, 0xdf, 0xb1, 0xda, 0x5a, 0xa3, 0xed, 0x5d, 0xbe, 0x5a, 0x65,\n+0x20, 0x65, 0x03, 0x90, 0xef, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0b, 0x05, 0x00, 0x30, 0x3d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x43, 0x4e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x55, 0x6e,\n+0x69, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n+0x12, 0x55, 0x43, 0x41, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x47, 0x32, 0x20, 0x52,\n+0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x33, 0x31, 0x31, 0x30, 0x30, 0x30,\n+0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30,\n+0x30, 0x30, 0x5a, 0x30, 0x3d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x43, 0x4e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x55, 0x6e, 0x69,\n+0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x12,\n+0x55, 0x43, 0x41, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x47, 0x32, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82,\n+0x02, 0x01, 0x00, 0xc5, 0xe6, 0x2b, 0x6f, 0x7c, 0xef, 0x26, 0x05, 0x27, 0xa3, 0x81, 0x24, 0xda,\n+0x6f, 0xcb, 0x01, 0xf9, 0x99, 0x9a, 0xa9, 0x32, 0xc2, 0x22, 0x87, 0x61, 0x41, 0x91, 0x3b, 0xcb,\n+0xc3, 0x68, 0x1b, 0x06, 0xc5, 0x4c, 0xa9, 0x2b, 0xc1, 0x67, 0x17, 0x22, 0x1d, 0x2b, 0xed, 0xf9,\n+0x29, 0x89, 0x93, 0xa2, 0x78, 0xbd, 0x92, 0x6b, 0xa0, 0xa3, 0x0d, 0xa2, 0x7e, 0xca, 0x93, 0xb3,\n+0xa6, 0xd1, 0x8c, 0x35, 0xd5, 0x75, 0xf9, 0x17, 0xf6, 0xcf, 0x45, 0xc5, 0xe5, 0x7a, 0xec, 0x77,\n+0x93, 0xa0, 0x8f, 0x23, 0xae, 0x0e, 0x1a, 0x03, 0x7f, 0xbe, 0xd4, 0xd0, 0xed, 0x2e, 0x7b, 0xab,\n+0x46, 0x23, 0x5b, 0xff, 0x2c, 0xe6, 0x54, 0x7a, 0x94, 0xc0, 0x2a, 0x15, 0xf0, 0xc9, 0x8d, 0xb0,\n+0x7a, 0x3b, 0x24, 0xe1, 0xd7, 0x68, 0xe2, 0x31, 0x3c, 0x06, 0x33, 0x46, 0xb6, 0x54, 0x11, 0xa6,\n+0xa5, 0x2f, 0x22, 0x54, 0x2a, 0x58, 0x0d, 0x01, 0x02, 0xf1, 0xfa, 0x15, 0x51, 0x67, 0x6c, 0xc0,\n+0xfa, 0xd7, 0xb6, 0x1b, 0x7f, 0xd1, 0x56, 0x88, 0x2f, 0x1a, 0x3a, 0x8d, 0x3b, 0xbb, 0x82, 0x11,\n+0xe0, 0x47, 0x00, 0xd0, 0x52, 0x87, 0xab, 0xfb, 0x86, 0x7e, 0x0f, 0x24, 0x6b, 0x40, 0x9d, 0x34,\n+0x67, 0xbc, 0x8d, 0xc7, 0x2d, 0x86, 0x6f, 0x79, 0x3e, 0x8e, 0xa9, 0x3c, 0x17, 0x4b, 0x7f, 0xb0,\n+0x99, 0xe3, 0xb0, 0x71, 0x60, 0xdc, 0x0b, 0xf5, 0x64, 0xc3, 0xce, 0x43, 0xbc, 0x6d, 0x71, 0xb9,\n+0xd2, 0xde, 0x27, 0x5b, 0x8a, 0xe8, 0xd8, 0xc6, 0xae, 0xe1, 0x59, 0x7d, 0xcf, 0x28, 0x2d, 0x35,\n+0xb8, 0x95, 0x56, 0x1a, 0xf1, 0xb2, 0x58, 0x4b, 0xb7, 0x12, 0x37, 0xc8, 0x7c, 0xb3, 0xed, 0x4b,\n+0x80, 0xe1, 0x8d, 0xfa, 0x32, 0x23, 0xb6, 0x6f, 0xb7, 0x48, 0x95, 0x08, 0xb1, 0x44, 0x4e, 0x85,\n+0x8c, 0x3a, 0x02, 0x54, 0x20, 0x2f, 0xdf, 0xbf, 0x57, 0x4f, 0x3b, 0x3a, 0x90, 0x21, 0xd7, 0xc1,\n+0x26, 0x35, 0x54, 0x20, 0xec, 0xc7, 0x3f, 0x47, 0xec, 0xef, 0x5a, 0xbf, 0x4b, 0x7a, 0xc1, 0xad,\n+0x3b, 0x17, 0x50, 0x5c, 0x62, 0xd8, 0x0f, 0x4b, 0x4a, 0xdc, 0x2b, 0xfa, 0x6e, 0xbc, 0x73, 0x92,\n+0xcd, 0xec, 0xc7, 0x50, 0xe8, 0x41, 0x96, 0xd7, 0xa9, 0x7e, 0x6d, 0xd8, 0xe9, 0x1d, 0x8f, 0x8a,\n+0xb5, 0xb9, 0x58, 0x92, 0xba, 0x4a, 0x92, 0x2b, 0x0c, 0x56, 0xfd, 0x80, 0xeb, 0x08, 0xf0, 0x5e,\n+0x29, 0x6e, 0x1b, 0x1c, 0x0c, 0xaf, 0x8f, 0x93, 0x89, 0xad, 0xdb, 0xbd, 0xa3, 0x9e, 0x21, 0xca,\n+0x89, 0x19, 0xec, 0xdf, 0xb5, 0xc3, 0x1a, 0xeb, 0x16, 0xfe, 0x78, 0x36, 0x4c, 0xd6, 0x6e, 0xd0,\n+0x3e, 0x17, 0x1c, 0x90, 0x17, 0x6b, 0x26, 0xba, 0xfb, 0x7a, 0x2f, 0xbf, 0x11, 0x1c, 0x18, 0x0e,\n+0x2d, 0x73, 0x03, 0x8f, 0xa0, 0xe5, 0x35, 0xa0, 0x5a, 0xe2, 0x4c, 0x75, 0x1d, 0x71, 0xe1, 0x39,\n+0x38, 0x53, 0x78, 0x40, 0xcc, 0x83, 0x93, 0xd7, 0x0a, 0x9e, 0x9d, 0x5b, 0x8f, 0x8a, 0xe4, 0xe5,\n+0xe0, 0x48, 0xe4, 0x48, 0xb2, 0x47, 0xcd, 0x4e, 0x2a, 0x75, 0x2a, 0x7b, 0xf2, 0x22, 0xf6, 0xc9,\n+0xbe, 0x09, 0x91, 0x96, 0x57, 0x7a, 0x88, 0x88, 0xac, 0xee, 0x70, 0xac, 0xf9, 0xdc, 0x29, 0xe3,\n+0x0c, 0x1c, 0x3b, 0x12, 0x4e, 0x44, 0xd6, 0xa7, 0x4e, 0xb0, 0x26, 0xc8, 0xf3, 0xd9, 0x1a, 0x97,\n+0x91, 0x68, 0xea, 0xef, 0x8d, 0x46, 0x06, 0xd2, 0x56, 0x45, 0x58, 0x9a, 0x3c, 0x0c, 0x0f, 0x83,\n+0xb8, 0x05, 0x25, 0xc3, 0x39, 0xcf, 0x3b, 0xa4, 0x34, 0x89, 0xb7, 0x79, 0x12, 0x2f, 0x47, 0xc5,\n+0xe7, 0xa9, 0x97, 0x69, 0xfc, 0xa6, 0x77, 0x67, 0xb5, 0xdf, 0x7b, 0xf1, 0x7a, 0x65, 0x15, 0xe4,\n+0x61, 0x56, 0x65, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03,\n+0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03,\n+0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06,\n+0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x81, 0xc4, 0x8c, 0xcc, 0xf5, 0xe4, 0x30, 0xff,\n+0xa5, 0x0c, 0x08, 0x5f, 0x8c, 0x15, 0x67, 0x21, 0x74, 0x01, 0xdf, 0xdf, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00,\n+0x13, 0x65, 0x22, 0xf5, 0x8e, 0x2b, 0xad, 0x44, 0xe4, 0xcb, 0xff, 0xb9, 0x68, 0xe6, 0xc3, 0x80,\n+0x48, 0x3d, 0x04, 0x7b, 0xfa, 0x23, 0x2f, 0x7a, 0xed, 0x36, 0xda, 0xb2, 0xce, 0x6d, 0xf6, 0xe6,\n+0x9e, 0xe5, 0x5f, 0x58, 0x8f, 0xcb, 0x37, 0x32, 0xa1, 0xc8, 0x65, 0xb6, 0xae, 0x38, 0x3d, 0x35,\n+0x1b, 0x3e, 0xbc, 0x3b, 0xb6, 0x04, 0xd0, 0xbc, 0xf9, 0x49, 0xf5, 0x9b, 0xf7, 0x85, 0xc5, 0x36,\n+0xb6, 0xcb, 0xbc, 0xf8, 0xc8, 0x39, 0xd5, 0xe4, 0x5f, 0x07, 0xbd, 0x15, 0x54, 0x97, 0x74, 0xca,\n+0xca, 0xed, 0x4f, 0xba, 0xba, 0x64, 0x76, 0x9f, 0x81, 0xb8, 0x84, 0x45, 0x49, 0x4c, 0x8d, 0x6f,\n+0xa2, 0xeb, 0xb1, 0xcc, 0xd1, 0xc3, 0x94, 0xda, 0x44, 0xc2, 0xe6, 0xe2, 0xea, 0x18, 0xe8, 0xa2,\n+0x1f, 0x27, 0x05, 0xba, 0xd7, 0xe5, 0xd6, 0xa9, 0xcd, 0xdd, 0xef, 0x76, 0x98, 0x8d, 0x00, 0x0e,\n+0xcd, 0x1b, 0xfa, 0x03, 0xb7, 0x8e, 0x80, 0x58, 0x0e, 0x27, 0x3f, 0x52, 0xfb, 0x94, 0xa2, 0xca,\n+0x5e, 0x65, 0xc9, 0xd6, 0x84, 0xda, 0xb9, 0x35, 0x71, 0xf3, 0x26, 0xc0, 0x4f, 0x77, 0xe6, 0x81,\n+0x27, 0xd2, 0x77, 0x3b, 0x9a, 0x14, 0x6f, 0x79, 0xf4, 0xf6, 0xd0, 0xe1, 0xd3, 0x94, 0xba, 0xd0,\n+0x57, 0x51, 0xbd, 0x27, 0x05, 0x0d, 0xc1, 0xfd, 0xc8, 0x12, 0x30, 0xee, 0x6f, 0x8d, 0x11, 0x2b,\n+0x08, 0x9d, 0xd4, 0xd4, 0xbf, 0x80, 0x45, 0x14, 0x9a, 0x88, 0x44, 0xda, 0x30, 0xea, 0xb4, 0xa7,\n+0xe3, 0xee, 0xef, 0x5b, 0x82, 0xd5, 0x3e, 0xd6, 0xad, 0x78, 0x92, 0xdb, 0x5c, 0x3c, 0xf3, 0xd8,\n+0xad, 0xfa, 0xb8, 0x6b, 0x7f, 0xc4, 0x36, 0x28, 0xb6, 0x02, 0x15, 0x8a, 0x54, 0x2c, 0x9c, 0xb0,\n+0x17, 0x73, 0x8e, 0xd0, 0x37, 0xa3, 0x14, 0x3c, 0x98, 0x95, 0x00, 0x0c, 0x29, 0x05, 0x5b, 0x9e,\n+0x49, 0x49, 0xb1, 0x5f, 0xc7, 0xe3, 0xcb, 0xcf, 0x27, 0x65, 0x8e, 0x35, 0x17, 0xb7, 0x57, 0xc8,\n+0x30, 0xd9, 0x41, 0x5b, 0xb9, 0x14, 0xb6, 0xe8, 0xc2, 0x0f, 0x94, 0x31, 0xa7, 0x94, 0x98, 0xcc,\n+0x6a, 0xeb, 0xb5, 0xe1, 0x27, 0xf5, 0x10, 0xa8, 0x01, 0xe8, 0x8e, 0x12, 0x62, 0xe8, 0x88, 0xcc,\n+0xb5, 0x7f, 0x46, 0x97, 0xc0, 0x9b, 0x10, 0x66, 0x38, 0x1a, 0x36, 0x46, 0x5f, 0x22, 0x68, 0x3d,\n+0xdf, 0xc9, 0xc6, 0x13, 0x27, 0xab, 0x53, 0x06, 0xac, 0xa2, 0x3c, 0x86, 0x06, 0x65, 0x6f, 0xb1,\n+0x7e, 0xb1, 0x29, 0x44, 0x9a, 0xa3, 0xba, 0x49, 0x69, 0x28, 0x69, 0x8f, 0xd7, 0xe5, 0x5f, 0xad,\n+0x04, 0x86, 0x64, 0x6f, 0x1a, 0xa0, 0x0c, 0xc5, 0x08, 0x62, 0xce, 0x80, 0xa3, 0xd0, 0xf3, 0xec,\n+0x68, 0xde, 0xbe, 0x33, 0xc7, 0x17, 0x5b, 0x7f, 0x80, 0xc4, 0x4c, 0x4c, 0xb1, 0xa6, 0x84, 0x8a,\n+0xc3, 0x3b, 0xb8, 0x09, 0xcd, 0x14, 0x81, 0xba, 0x18, 0xe3, 0x54, 0x57, 0x36, 0xfe, 0xdb, 0x2f,\n+0x7c, 0x47, 0xa1, 0x3a, 0x33, 0xc8, 0xf9, 0x58, 0x3b, 0x44, 0x4f, 0xb1, 0xca, 0x02, 0x89, 0x04,\n+0x96, 0x28, 0x68, 0xc5, 0x4b, 0xb8, 0x26, 0x89, 0xbb, 0xd6, 0x33, 0x2f, 0x50, 0xd5, 0xfe, 0x9a,\n+0x89, 0xba, 0x18, 0x32, 0x92, 0x54, 0xc6, 0x5b, 0xe0, 0x9d, 0xf9, 0x5e, 0xe5, 0x0d, 0x22, 0x9b,\n+0xf6, 0xda, 0xe2, 0xc8, 0x21, 0xb2, 0x62, 0x21, 0xaa, 0x86, 0x40, 0xb2, 0x2e, 0x64, 0xd3, 0x5f,\n+0xc8, 0xe3, 0x7e, 0x11, 0x67, 0x45, 0x1f, 0x05, 0xfe, 0xe3, 0xa2, 0xef, 0xb3, 0xa8, 0xb3, 0xf3,\n+0x7d, 0x8f, 0xf8, 0x0c, 0x1f, 0x22, 0x1f, 0x2d, 0x70, 0xb4, 0xb8, 0x01, 0x34, 0x76, 0x30, 0x00,\n+0xe5, 0x23, 0x78, 0xa7, 0x56, 0xd7, 0x50, 0x1f, 0x8a, 0xfb, 0x06, 0xf5, 0xc2, 0x19, 0xf0, 0xd0,\n+0x30, 0x82, 0x02, 0x94, 0x30, 0x82, 0x02, 0x1a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x2c,\n+0x29, 0x9c, 0x5b, 0x16, 0xed, 0x05, 0x95, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n+0x04, 0x03, 0x02, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78,\n+0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75,\n+0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53,\n+0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x34,\n+0x30, 0x32, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2b, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d,\n+0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x20, 0x45, 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x31, 0x32, 0x31, 0x38,\n+0x31, 0x35, 0x32, 0x33, 0x5a, 0x17, 0x0d, 0x34, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x38, 0x31,\n+0x35, 0x32, 0x33, 0x5a, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65,\n+0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f,\n+0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f,\n+0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31,\n+0x34, 0x30, 0x32, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2b, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f,\n+0x6d, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n+0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,\n+0x79, 0x20, 0x45, 0x43, 0x43, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n+0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xaa, 0x12, 0x47,\n+0x90, 0x98, 0x1b, 0xfb, 0xef, 0xc3, 0x40, 0x07, 0x83, 0x20, 0x4e, 0xf1, 0x30, 0x82, 0xa2, 0x06,\n+0xd1, 0xf2, 0x92, 0x86, 0x61, 0xf2, 0xf6, 0x21, 0x68, 0xca, 0x00, 0xc4, 0xc7, 0xea, 0x43, 0x00,\n+0x54, 0x86, 0xdc, 0xfd, 0x1f, 0xdf, 0x00, 0xb8, 0x41, 0x62, 0x5c, 0xdc, 0x70, 0x16, 0x32, 0xde,\n+0x1f, 0x99, 0xd4, 0xcc, 0xc5, 0x07, 0xc8, 0x08, 0x1f, 0x61, 0x16, 0x07, 0x51, 0x3d, 0x7d, 0x5c,\n+0x07, 0x53, 0xe3, 0x35, 0x38, 0x8c, 0xdf, 0xcd, 0x9f, 0xd9, 0x2e, 0x0d, 0x4a, 0xb6, 0x19, 0x2e,\n+0x5a, 0x70, 0x5a, 0x06, 0xed, 0xbe, 0xf0, 0xa1, 0xb0, 0xca, 0xd0, 0x09, 0x29, 0xa3, 0x63, 0x30,\n+0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x5b, 0xca, 0x5e, 0xe5,\n+0xde, 0xd2, 0x81, 0xaa, 0xcd, 0xa8, 0x2d, 0x64, 0x51, 0xb6, 0xd9, 0x72, 0x9b, 0x97, 0xe6, 0x4f,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n+0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x5b, 0xca,\n+0x5e, 0xe5, 0xde, 0xd2, 0x81, 0xaa, 0xcd, 0xa8, 0x2d, 0x64, 0x51, 0xb6, 0xd9, 0x72, 0x9b, 0x97,\n+0xe6, 0x4f, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x86, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x68,\n+0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0x8a, 0xe6, 0x40, 0x89, 0x37, 0xeb, 0xe9, 0xd5, 0x13, 0xd9,\n+0xca, 0xd4, 0x6b, 0x24, 0xf3, 0xb0, 0x3d, 0x87, 0x46, 0x58, 0x1a, 0xec, 0xb1, 0xdf, 0x6f, 0xfb,\n+0x56, 0xba, 0x70, 0x6b, 0xc7, 0x38, 0xcc, 0xe8, 0xb1, 0x8c, 0x4f, 0x0f, 0xf7, 0xf1, 0x67, 0x76,\n+0x0e, 0x83, 0xd0, 0x1e, 0x51, 0x8f, 0x02, 0x30, 0x3d, 0xf6, 0x23, 0x28, 0x26, 0x4c, 0xc6, 0x60,\n+0x87, 0x93, 0x26, 0x9b, 0xb2, 0x35, 0x1e, 0xba, 0xd6, 0xf7, 0x3c, 0xd1, 0x1c, 0xce, 0xfa, 0x25,\n+0x3c, 0xa6, 0x1a, 0x81, 0x15, 0x5b, 0xf3, 0x12, 0x0f, 0x6c, 0xee, 0x65, 0x8a, 0xc9, 0x87, 0xa8,\n+0xf9, 0x07, 0xe0, 0x62, 0x9a, 0x8c, 0x5c, 0x4a, 0x30, 0x82, 0x02, 0x8d, 0x30, 0x82, 0x02, 0x14,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x75, 0xe6, 0xdf, 0xcb, 0xc1, 0x68, 0x5b, 0xa8, 0x30,\n+0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x30, 0x7c, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03,\n+0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03,\n+0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f,\n+0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n+0x28, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65,\n+0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n+0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x45, 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30,\n+0x32, 0x31, 0x32, 0x31, 0x38, 0x31, 0x34, 0x30, 0x33, 0x5a, 0x17, 0x0d, 0x34, 0x31, 0x30, 0x32,\n+0x31, 0x32, 0x31, 0x38, 0x31, 0x34, 0x30, 0x33, 0x5a, 0x30, 0x7c, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04,\n+0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04,\n+0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61,\n+0x74, 0x69, 0x6f, 0x6e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x28, 0x53,\n+0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,\n+0x69, 0x74, 0x79, 0x20, 0x45, 0x43, 0x43, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48,\n+0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x45,\n+0x6e, 0xa9, 0x50, 0xc4, 0xa6, 0x23, 0x36, 0x9e, 0x5f, 0x28, 0x8d, 0x17, 0xcb, 0x96, 0x22, 0x64,\n+0x3f, 0xdc, 0x7a, 0x8e, 0x1d, 0xcc, 0x08, 0xb3, 0xa2, 0x71, 0x24, 0xba, 0x8e, 0x49, 0xb9, 0x04,\n+0x1b, 0x47, 0x96, 0x58, 0xab, 0x2d, 0x95, 0xc8, 0xed, 0x9e, 0x08, 0x35, 0xc8, 0x27, 0xeb, 0x89,\n+0x8c, 0x53, 0x58, 0xeb, 0x62, 0x8a, 0xfe, 0xf0, 0x5b, 0x0f, 0x6b, 0x31, 0x52, 0x63, 0x41, 0x3b,\n+0x89, 0xcd, 0xec, 0xec, 0xb6, 0x8d, 0x19, 0xd3, 0x34, 0x07, 0xdc, 0xbb, 0xc6, 0x06, 0x7f, 0xc2,\n+0x45, 0x95, 0xec, 0xcb, 0x7f, 0xa8, 0x23, 0xe0, 0x09, 0xe9, 0x81, 0xfa, 0xf3, 0x47, 0xd3, 0xa3,\n+0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x82, 0xd1,\n+0x85, 0x73, 0x30, 0xe7, 0x35, 0x04, 0xd3, 0x8e, 0x02, 0x92, 0xfb, 0xe5, 0xa4, 0xd1, 0xc4, 0x21,\n+0xe8, 0xcd, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n+0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,\n+0x82, 0xd1, 0x85, 0x73, 0x30, 0xe7, 0x35, 0x04, 0xd3, 0x8e, 0x02, 0x92, 0xfb, 0xe5, 0xa4, 0xd1,\n+0xc4, 0x21, 0xe8, 0xcd, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x86, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,\n+0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x6f, 0xe7, 0xeb, 0x59, 0x11, 0xa4, 0x60, 0xcf, 0x61,\n+0xb0, 0x96, 0x7b, 0xed, 0x05, 0xf9, 0x2f, 0x13, 0x91, 0xdc, 0xed, 0xe5, 0xfc, 0x50, 0x6b, 0x11,\n+0x46, 0x46, 0xb3, 0x1c, 0x21, 0x00, 0x62, 0xbb, 0xbe, 0xc3, 0xe7, 0xe8, 0xcd, 0x07, 0x99, 0xf9,\n+0x0d, 0x0b, 0x5d, 0x72, 0x3e, 0xc4, 0xaa, 0x02, 0x30, 0x1f, 0xbc, 0xba, 0x0b, 0xe2, 0x30, 0x24,\n+0xfb, 0x7c, 0x6d, 0x80, 0x55, 0x0a, 0x99, 0x3e, 0x80, 0x0d, 0x33, 0xe5, 0x66, 0xa3, 0xb3, 0xa3,\n+0xbb, 0xa5, 0xd5, 0x8b, 0x8f, 0x09, 0x2c, 0xa6, 0x5d, 0x7e, 0xe2, 0xf0, 0x07, 0x08, 0x68, 0x6d,\n+0xd2, 0x7c, 0x69, 0x6e, 0x5f, 0xdf, 0xe5, 0x6a, 0x65, 0x30, 0x82, 0x05, 0xdd, 0x30, 0x82, 0x03,\n+0xc5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x7b, 0x2c, 0x9b, 0xd3, 0x16, 0x80, 0x32, 0x99,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,\n+0x7c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e,\n+0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e,\n+0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43,\n+0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x0c, 0x28, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n+0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x30, 0x1e, 0x17,\n+0x0d, 0x31, 0x36, 0x30, 0x32, 0x31, 0x32, 0x31, 0x37, 0x33, 0x39, 0x33, 0x39, 0x5a, 0x17, 0x0d,\n+0x34, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x37, 0x33, 0x39, 0x33, 0x39, 0x5a, 0x30, 0x7c, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c,\n+0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e,\n+0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18,\n+0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72,\n+0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x0c, 0x28, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75,\n+0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n+0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xf9, 0x0f, 0xdd, 0xa3,\n+0x2b, 0x7d, 0xcb, 0xd0, 0x2a, 0xfe, 0xec, 0x67, 0x85, 0xa6, 0xe7, 0x2e, 0x1b, 0xba, 0x77, 0xe1,\n+0xe3, 0xf5, 0xaf, 0xa4, 0xec, 0xfa, 0x4a, 0x5d, 0x91, 0xc4, 0x57, 0x47, 0x6b, 0x18, 0x77, 0x6b,\n+0x76, 0xf2, 0xfd, 0x93, 0xe4, 0x3d, 0x0f, 0xc2, 0x16, 0x9e, 0x0b, 0x66, 0xc3, 0x56, 0x94, 0x9e,\n+0x17, 0x83, 0x85, 0xce, 0x56, 0xef, 0xf2, 0x16, 0xfd, 0x00, 0x62, 0xf5, 0x22, 0x09, 0x54, 0xe8,\n+0x65, 0x17, 0x4e, 0x41, 0xb9, 0xe0, 0x4f, 0x46, 0x97, 0xaa, 0x1b, 0xc8, 0xb8, 0x6e, 0x62, 0x5e,\n+0x69, 0xb1, 0x5f, 0xdb, 0x2a, 0x02, 0x7e, 0xfc, 0x6c, 0xca, 0xf3, 0x41, 0xd8, 0xed, 0xd0, 0xe8,\n+0xfc, 0x3f, 0x61, 0x48, 0xed, 0xb0, 0x03, 0x14, 0x1d, 0x10, 0x0e, 0x4b, 0x19, 0xe0, 0xbb, 0x4e,\n+0xec, 0x86, 0x65, 0xff, 0x36, 0xf3, 0x5e, 0x67, 0x02, 0x0b, 0x9d, 0x86, 0x55, 0x61, 0xfd, 0x7a,\n+0x38, 0xed, 0xfe, 0xe2, 0x19, 0x00, 0xb7, 0x6f, 0xa1, 0x50, 0x62, 0x75, 0x74, 0x3c, 0xa0, 0xfa,\n+0xc8, 0x25, 0x92, 0xb4, 0x6e, 0x7a, 0x22, 0xc7, 0xf8, 0x1e, 0xa1, 0xe3, 0xb2, 0xdd, 0x91, 0x31,\n+0xab, 0x2b, 0x1d, 0x04, 0xff, 0xa5, 0x4a, 0x04, 0x37, 0xe9, 0x85, 0xa4, 0x33, 0x2b, 0xfd, 0xe2,\n+0xd6, 0x55, 0x34, 0x7c, 0x19, 0xa4, 0x4a, 0x68, 0xc7, 0xb2, 0xa8, 0xd3, 0xb7, 0xca, 0xa1, 0x93,\n+0x88, 0xeb, 0xc1, 0x97, 0xbc, 0x8c, 0xf9, 0x1d, 0xd9, 0x22, 0x84, 0x24, 0x74, 0xc7, 0x04, 0x3d,\n+0x6a, 0xa9, 0x29, 0x93, 0xcc, 0xeb, 0xb8, 0x5b, 0xe1, 0xfe, 0x5f, 0x25, 0xaa, 0x34, 0x58, 0xc8,\n+0xc1, 0x23, 0x54, 0x9d, 0x1b, 0x98, 0x11, 0xc3, 0x38, 0x9c, 0x7e, 0x3d, 0x86, 0x6c, 0xa5, 0x0f,\n+0x40, 0x86, 0x7c, 0x02, 0xf4, 0x5c, 0x02, 0x4f, 0x28, 0xcb, 0xae, 0x71, 0x9f, 0x0f, 0x3a, 0xc8,\n+0x33, 0xfe, 0x11, 0x25, 0x35, 0xea, 0xfc, 0xba, 0xc5, 0x60, 0x3d, 0xd9, 0x7c, 0x18, 0xd5, 0xb2,\n+0xa9, 0xd3, 0x75, 0x78, 0x03, 0x72, 0x22, 0xca, 0x3a, 0xc3, 0x1f, 0xef, 0x2c, 0xe5, 0x2e, 0xa9,\n+0xfa, 0x9e, 0x2c, 0xb6, 0x51, 0x46, 0xfd, 0xaf, 0x03, 0xd6, 0xea, 0x60, 0x68, 0xea, 0x85, 0x16,\n+0x36, 0x6b, 0x85, 0xe9, 0x1e, 0xc0, 0xb3, 0xdd, 0xc4, 0x24, 0xdc, 0x80, 0x2a, 0x81, 0x41, 0x6d,\n+0x94, 0x3e, 0xc8, 0xe0, 0xc9, 0x81, 0x41, 0x00, 0x9e, 0x5e, 0xbf, 0x7f, 0xc5, 0x08, 0x98, 0xa2,\n+0x18, 0x2c, 0x42, 0x40, 0xb3, 0xf9, 0x6f, 0x38, 0x27, 0x4b, 0x4e, 0x80, 0xf4, 0x3d, 0x81, 0x47,\n+0xe0, 0x88, 0x7c, 0xea, 0x1c, 0xce, 0xb5, 0x75, 0x5c, 0x51, 0x2e, 0x1c, 0x2b, 0x7f, 0x1a, 0x72,\n+0x28, 0xe7, 0x00, 0xb5, 0xd1, 0x74, 0xc6, 0xd7, 0xe4, 0x9f, 0xad, 0x07, 0x93, 0xb6, 0x53, 0x35,\n+0x35, 0xfc, 0x37, 0xe4, 0xc3, 0xf6, 0x5d, 0x16, 0xbe, 0x21, 0x73, 0xde, 0x92, 0x0a, 0xf8, 0xa0,\n+0x63, 0x6a, 0xbc, 0x96, 0x92, 0x6a, 0x3e, 0xf8, 0xbc, 0x65, 0x55, 0x9b, 0xde, 0xf5, 0x0d, 0x89,\n+0x26, 0x04, 0xfc, 0x25, 0x1a, 0xa6, 0x25, 0x69, 0xcb, 0xc2, 0x6d, 0xca, 0x7c, 0xe2, 0x59, 0x5f,\n+0x97, 0xac, 0xeb, 0xef, 0x2e, 0xc8, 0xbc, 0xd7, 0x1b, 0x59, 0x3c, 0x2b, 0xcc, 0xf2, 0x19, 0xc8,\n+0x93, 0x6b, 0x27, 0x63, 0x19, 0xcf, 0xfc, 0xe9, 0x26, 0xf8, 0xca, 0x71, 0x9b, 0x7f, 0x93, 0xfe,\n+0x34, 0x67, 0x84, 0x4e, 0x99, 0xeb, 0xfc, 0xb3, 0x78, 0x09, 0x33, 0x70, 0xba, 0x66, 0xa6, 0x76,\n+0xed, 0x1b, 0x73, 0xeb, 0x1a, 0xa5, 0x0d, 0xc4, 0x22, 0x13, 0x20, 0x94, 0x56, 0x0a, 0x4e, 0x2c,\n+0x6c, 0x4e, 0xb1, 0xfd, 0xcf, 0x9c, 0x09, 0xba, 0xa2, 0x33, 0xed, 0x87, 0x02, 0x03, 0x01, 0x00,\n+0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+0xdd, 0x04, 0x09, 0x07, 0xa2, 0xf5, 0x7a, 0x7d, 0x52, 0x53, 0x12, 0x92, 0x95, 0xee, 0x38, 0x80,\n+0x25, 0x0d, 0xa6, 0x59, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n+0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16,\n+0x80, 0x14, 0xdd, 0x04, 0x09, 0x07, 0xa2, 0xf5, 0x7a, 0x7d, 0x52, 0x53, 0x12, 0x92, 0x95, 0xee,\n+0x38, 0x80, 0x25, 0x0d, 0xa6, 0x59, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x20, 0x18, 0x11, 0x94, 0x29, 0xfb,\n+0x26, 0x9d, 0x1c, 0x1e, 0x1e, 0x70, 0x61, 0xf1, 0x95, 0x72, 0x93, 0x71, 0x24, 0xad, 0x68, 0x93,\n+0x58, 0x8e, 0x32, 0xaf, 0x1b, 0xb3, 0x70, 0x03, 0xfc, 0x25, 0x2b, 0x74, 0x85, 0x90, 0x3d, 0x78,\n+0x6a, 0xf4, 0xb9, 0x8b, 0xa5, 0x97, 0x3b, 0xb5, 0x18, 0x91, 0xbb, 0x1e, 0xa7, 0xf9, 0x40, 0x5b,\n+0x91, 0xf9, 0x55, 0x99, 0xaf, 0x1e, 0x11, 0xd0, 0x5c, 0x1d, 0xa7, 0x66, 0xe3, 0xb1, 0x94, 0x07,\n+0x0c, 0x32, 0x39, 0xa6, 0xea, 0x1b, 0xb0, 0x79, 0xd8, 0x1d, 0x9c, 0x70, 0x44, 0xe3, 0x8a, 0xdd,\n+0xc4, 0xf9, 0x95, 0x1f, 0x8a, 0x38, 0x43, 0x3f, 0x01, 0x85, 0xa5, 0x47, 0xa7, 0x3d, 0x46, 0xb2,\n+0xbc, 0xe5, 0x22, 0x68, 0xf7, 0x7b, 0x9c, 0xd8, 0x2c, 0x3e, 0x0a, 0x21, 0xc8, 0x2d, 0x33, 0xac,\n+0xbf, 0xc5, 0x81, 0x99, 0x31, 0x74, 0xc1, 0x75, 0x71, 0xc5, 0xbe, 0xb1, 0xf0, 0x23, 0x45, 0xf4,\n+0x9d, 0x6b, 0xfc, 0x19, 0x63, 0x9d, 0xa3, 0xbc, 0x04, 0xc6, 0x18, 0x0b, 0x25, 0xbb, 0x53, 0x89,\n+0x0f, 0xb3, 0x80, 0x50, 0xde, 0x45, 0xee, 0x44, 0x7f, 0xab, 0x94, 0x78, 0x64, 0x98, 0xd3, 0xf6,\n+0x28, 0xdd, 0x87, 0xd8, 0x70, 0x65, 0x74, 0xfb, 0x0e, 0xb9, 0x13, 0xeb, 0xa7, 0x0f, 0x61, 0xa9,\n+0x32, 0x96, 0xcc, 0xde, 0xbb, 0xed, 0x63, 0x4c, 0x18, 0xbb, 0xa9, 0x40, 0xf7, 0xa0, 0x54, 0x6e,\n+0x20, 0x88, 0x71, 0x75, 0x18, 0xea, 0x7a, 0xb4, 0x34, 0x72, 0xe0, 0x23, 0x27, 0x77, 0x5c, 0xb6,\n+0x90, 0xea, 0x86, 0x25, 0x40, 0xab, 0xef, 0x33, 0x0f, 0xcb, 0x9f, 0x82, 0xbe, 0xa2, 0x20, 0xfb,\n+0xf6, 0xb5, 0x2d, 0x1a, 0xe6, 0xc2, 0x85, 0xb1, 0x74, 0x0f, 0xfb, 0xc8, 0x65, 0x02, 0xa4, 0x52,\n+0x01, 0x47, 0xdd, 0x49, 0x22, 0xc1, 0xbf, 0xd8, 0xeb, 0x6b, 0xac, 0x7e, 0xde, 0xec, 0x63, 0x33,\n+0x15, 0xb7, 0x23, 0x08, 0x8f, 0xc6, 0x0f, 0x8d, 0x41, 0x5a, 0xdd, 0x8e, 0xc5, 0xb9, 0x8f, 0xe5,\n+0x45, 0x3f, 0x78, 0xdb, 0xba, 0xd2, 0x1b, 0x40, 0xb1, 0xfe, 0x71, 0x4d, 0x3f, 0xe0, 0x81, 0xa2,\n+0xba, 0x5e, 0xb4, 0xec, 0x15, 0xe0, 0x93, 0xdd, 0x08, 0x1f, 0x7e, 0xe1, 0x55, 0x99, 0x0b, 0x21,\n+0xde, 0x93, 0x9e, 0x0a, 0xfb, 0xe6, 0xa3, 0x49, 0xbd, 0x36, 0x30, 0xfe, 0xe7, 0x77, 0xb2, 0xa0,\n+0x75, 0x97, 0xb5, 0x2d, 0x81, 0x88, 0x17, 0x65, 0x20, 0xf7, 0xda, 0x90, 0x00, 0x9f, 0xc9, 0x52,\n+0xcc, 0x32, 0xca, 0x35, 0x7c, 0xf5, 0x3d, 0x0f, 0xd8, 0x2b, 0xd7, 0xf5, 0x26, 0x6c, 0xc9, 0x06,\n+0x34, 0x96, 0x16, 0xea, 0x70, 0x59, 0x1a, 0x32, 0x79, 0x79, 0x0b, 0xb6, 0x88, 0x7f, 0x0f, 0x52,\n+0x48, 0x3d, 0xbf, 0x6c, 0xd8, 0xa2, 0x44, 0x2e, 0xd1, 0x4e, 0xb7, 0x72, 0x58, 0xd3, 0x89, 0x13,\n+0x95, 0xfe, 0x44, 0xab, 0xf8, 0xd7, 0x8b, 0x1b, 0x6e, 0x9c, 0xbc, 0x2c, 0xa0, 0x5b, 0xd5, 0x6a,\n+0x00, 0xaf, 0x5f, 0x37, 0xe1, 0xd5, 0xfa, 0x10, 0x0b, 0x98, 0x9c, 0x86, 0xe7, 0x26, 0x8f, 0xce,\n+0xf0, 0xec, 0x6e, 0x8a, 0x57, 0x0b, 0x80, 0xe3, 0x4e, 0xb2, 0xc0, 0xa0, 0x63, 0x61, 0x90, 0xba,\n+0x55, 0x68, 0x37, 0x74, 0x6a, 0xb6, 0x92, 0xdb, 0x9f, 0xa1, 0x86, 0x22, 0xb6, 0x65, 0x27, 0x0e,\n+0xec, 0xb6, 0x9f, 0x42, 0x60, 0xe4, 0x67, 0xc2, 0xb5, 0xda, 0x41, 0x0b, 0xc4, 0xd3, 0x8b, 0x61,\n+0x1b, 0xbc, 0xfa, 0x1f, 0x91, 0x2b, 0xd7, 0x44, 0x07, 0x5e, 0xba, 0x29, 0xac, 0xd9, 0xc5, 0xe9,\n+0xef, 0x53, 0x48, 0x5a, 0xeb, 0x80, 0xf1, 0x28, 0x58, 0x21, 0xcd, 0xb0, 0x06, 0x55, 0xfb, 0x27,\n+0x3f, 0x53, 0x90, 0x70, 0xa9, 0x04, 0x1e, 0x57, 0x27, 0xb9, 0x30, 0x82, 0x05, 0x83, 0x30, 0x82,\n+0x03, 0x6b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0f, 0x5d, 0x93, 0x8d, 0x30, 0x67, 0x36, 0xc8,\n+0x06, 0x1d, 0x1a, 0xc7, 0x54, 0x84, 0x69, 0x07, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,\n+0x08, 0x46, 0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x0c, 0x10, 0x41, 0x43, 0x20, 0x52, 0x41, 0x49, 0x5a, 0x20, 0x46, 0x4e, 0x4d, 0x54,\n+0x2d, 0x52, 0x43, 0x4d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x30, 0x32, 0x39, 0x31, 0x35,\n+0x35, 0x39, 0x35, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30,\n+0x30, 0x30, 0x30, 0x5a, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x45, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x46, 0x4e,\n+0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c,\n+0x10, 0x41, 0x43, 0x20, 0x52, 0x41, 0x49, 0x5a, 0x20, 0x46, 0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43,\n+0x4d, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02,\n+0x01, 0x00, 0xba, 0x71, 0x80, 0x7a, 0x4c, 0x86, 0x6e, 0x7f, 0xc8, 0x13, 0x6d, 0xc0, 0xc6, 0x7d,\n+0x1c, 0x00, 0x97, 0x8f, 0x2c, 0x0c, 0x23, 0xbb, 0x10, 0x9a, 0x40, 0xa9, 0x1a, 0xb7, 0x87, 0x88,\n+0xf8, 0x9b, 0x56, 0x6a, 0xfb, 0xe6, 0x7b, 0x8e, 0x8b, 0x92, 0x8e, 0xa7, 0x25, 0x5d, 0x59, 0x11,\n+0xdb, 0x36, 0x2e, 0xb7, 0x51, 0x17, 0x1f, 0xa9, 0x08, 0x1f, 0x04, 0x17, 0x24, 0x58, 0xaa, 0x37,\n+0x4a, 0x18, 0xdf, 0xe5, 0x39, 0xd4, 0x57, 0xfd, 0xd7, 0xc1, 0x2c, 0x91, 0x01, 0x91, 0xe2, 0x22,\n+0xd4, 0x03, 0xc0, 0x58, 0xfc, 0x77, 0x47, 0xec, 0x8f, 0x3e, 0x74, 0x43, 0xba, 0xac, 0x34, 0x8d,\n+0x4d, 0x38, 0x76, 0x67, 0x8e, 0xb0, 0xc8, 0x6f, 0x30, 0x33, 0x58, 0x71, 0x5c, 0xb4, 0xf5, 0x6b,\n+0x6e, 0xd4, 0x01, 0x50, 0xb8, 0x13, 0x7e, 0x6c, 0x4a, 0xa3, 0x49, 0xd1, 0x20, 0x19, 0xee, 0xbc,\n+0xc0, 0x29, 0x18, 0x65, 0xa7, 0xde, 0xfe, 0xef, 0xdd, 0x0a, 0x90, 0x21, 0xe7, 0x1a, 0x67, 0x92,\n+0x42, 0x10, 0x98, 0x5f, 0x4f, 0x30, 0xbc, 0x3e, 0x1c, 0x45, 0xb4, 0x10, 0xd7, 0x68, 0x40, 0x14,\n+0xc0, 0x40, 0xfa, 0xe7, 0x77, 0x17, 0x7a, 0xe6, 0x0b, 0x8f, 0x65, 0x5b, 0x3c, 0xd9, 0x9a, 0x52,\n+0xdb, 0xb5, 0xbd, 0x9e, 0x46, 0xcf, 0x3d, 0xeb, 0x91, 0x05, 0x02, 0xc0, 0x96, 0xb2, 0x76, 0x4c,\n+0x4d, 0x10, 0x96, 0x3b, 0x92, 0xfa, 0x9c, 0x7f, 0x0f, 0x99, 0xdf, 0xbe, 0x23, 0x35, 0x45, 0x1e,\n+0x02, 0x5c, 0xfe, 0xb5, 0xa8, 0x9b, 0x99, 0x25, 0xda, 0x5e, 0xf3, 0x22, 0xc3, 0x39, 0xf5, 0xe4,\n+0x2a, 0x2e, 0xd3, 0xc6, 0x1f, 0xc4, 0x6c, 0xaa, 0xc5, 0x1c, 0x6a, 0x01, 0x05, 0x4a, 0x2f, 0xd2,\n+0xc5, 0xc1, 0xa8, 0x34, 0x26, 0x5d, 0x66, 0xa5, 0xd2, 0x02, 0x21, 0xf9, 0x18, 0xb7, 0x06, 0xf5,\n+0x4e, 0x99, 0x6f, 0xa8, 0xab, 0x4c, 0x51, 0xe8, 0xcf, 0x50, 0x18, 0xc5, 0x77, 0xc8, 0x39, 0x09,\n+0x2c, 0x49, 0x92, 0x32, 0x99, 0xa8, 0xbb, 0x17, 0x17, 0x79, 0xb0, 0x5a, 0xc5, 0xe6, 0xa3, 0xc4,\n+0x59, 0x65, 0x47, 0x35, 0x83, 0x5e, 0xa9, 0xe8, 0x35, 0x0b, 0x99, 0xbb, 0xe4, 0xcd, 0x20, 0xc6,\n+0x9b, 0x4a, 0x06, 0x39, 0xb5, 0x68, 0xfc, 0x22, 0xba, 0xee, 0x55, 0x8c, 0x2b, 0x4e, 0xea, 0xf3,\n+0xb1, 0xe3, 0xfc, 0xb6, 0x99, 0x9a, 0xd5, 0x42, 0xfa, 0x71, 0x4d, 0x08, 0xcf, 0x87, 0x1e, 0x6a,\n+0x71, 0x7d, 0xf9, 0xd3, 0xb4, 0xe9, 0xa5, 0x71, 0x81, 0x7b, 0xc2, 0x4e, 0x47, 0x96, 0xa5, 0xf6,\n+0x76, 0x85, 0xa3, 0x28, 0x8f, 0xe9, 0x80, 0x6e, 0x81, 0x53, 0xa5, 0x6d, 0x5f, 0xb8, 0x48, 0xf9,\n+0xc2, 0xf9, 0x36, 0xa6, 0x2e, 0x49, 0xff, 0xb8, 0x96, 0xc2, 0x8c, 0x07, 0xb3, 0x9b, 0x88, 0x58,\n+0xfc, 0xeb, 0x1b, 0x1c, 0xde, 0x2d, 0x70, 0xe2, 0x97, 0x92, 0x30, 0xa1, 0x89, 0xe3, 0xbc, 0x55,\n+0xa8, 0x27, 0xd6, 0x4b, 0xed, 0x90, 0xad, 0x8b, 0xfa, 0x63, 0x25, 0x59, 0x2d, 0xa8, 0x35, 0xdd,\n+0xca, 0x97, 0x33, 0xbc, 0xe5, 0xcd, 0xc7, 0x9d, 0xd1, 0xec, 0xef, 0x5e, 0x0e, 0x4a, 0x90, 0x06,\n+0x26, 0x63, 0xad, 0xb9, 0xd9, 0x35, 0x2d, 0x07, 0xba, 0x76, 0x65, 0x2c, 0xac, 0x57, 0x8f, 0x7d,\n+0xf4, 0x07, 0x94, 0xd7, 0x81, 0x02, 0x96, 0x5d, 0xa3, 0x07, 0x49, 0xd5, 0x7a, 0xd0, 0x57, 0xf9,\n+0x1b, 0xe7, 0x53, 0x46, 0x75, 0xaa, 0xb0, 0x79, 0x42, 0xcb, 0x68, 0x71, 0x08, 0xe9, 0x60, 0xbd,\n+0x39, 0x69, 0xce, 0xf4, 0xaf, 0xc3, 0x56, 0x40, 0xc7, 0xad, 0x52, 0xa2, 0x09, 0xe4, 0x6f, 0x86,\n+0x47, 0x8a, 0x1f, 0xeb, 0x28, 0x27, 0x5d, 0x83, 0x20, 0xaf, 0x04, 0xc9, 0x6c, 0x56, 0x9a, 0x8b,\n+0x46, 0xf5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x83, 0x30, 0x81, 0x80, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e,\n+0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xf7, 0x7d, 0xc5, 0xfd, 0xc4, 0xe8, 0x9a,\n+0x1b, 0x77, 0x64, 0xa7, 0xf5, 0x1d, 0xa0, 0xcc, 0xbf, 0x87, 0x60, 0x9a, 0x6d, 0x30, 0x3e, 0x06,\n+0x03, 0x55, 0x1d, 0x20, 0x04, 0x37, 0x30, 0x35, 0x30, 0x33, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00,\n+0x30, 0x2b, 0x30, 0x29, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1d,\n+0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x2e,\n+0x66, 0x6e, 0x6d, 0x74, 0x2e, 0x65, 0x73, 0x2f, 0x64, 0x70, 0x63, 0x73, 0x2f, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,\n+0x00, 0x07, 0x90, 0x4a, 0xdf, 0xf3, 0x23, 0x4e, 0xf0, 0xc3, 0x9c, 0x51, 0x65, 0x9b, 0x9c, 0x22,\n+0xa2, 0x8a, 0x0c, 0x85, 0xf3, 0x73, 0x29, 0x6b, 0x4d, 0xfe, 0x01, 0xe2, 0xa9, 0x0c, 0x63, 0x01,\n+0xbf, 0x04, 0x67, 0xa5, 0x9d, 0x98, 0x5f, 0xfd, 0x01, 0x13, 0xfa, 0xec, 0x9a, 0x62, 0xe9, 0x86,\n+0xfe, 0xb6, 0x62, 0xd2, 0x6e, 0x4c, 0x94, 0xfb, 0xc0, 0x75, 0x45, 0x7c, 0x65, 0x0c, 0xf8, 0xb2,\n+0x37, 0xcf, 0xac, 0x0f, 0xcf, 0x8d, 0x6f, 0xf9, 0x19, 0xf7, 0x8f, 0xec, 0x1e, 0xf2, 0x70, 0x9e,\n+0xf0, 0xca, 0xb8, 0xef, 0xb7, 0xff, 0x76, 0x37, 0x76, 0x5b, 0xf6, 0x6e, 0x88, 0xf3, 0xaf, 0x62,\n+0x32, 0x22, 0x93, 0x0d, 0x3a, 0x6a, 0x8e, 0x14, 0x66, 0x0c, 0x2d, 0x53, 0x74, 0x57, 0x65, 0x1e,\n+0xd5, 0xb2, 0xdd, 0x23, 0x81, 0x3b, 0xa5, 0x66, 0x23, 0x27, 0x67, 0x09, 0x8f, 0xe1, 0x77, 0xaa,\n+0x43, 0xcd, 0x65, 0x51, 0x08, 0xed, 0x51, 0x58, 0xfe, 0xe6, 0x39, 0xf9, 0xcb, 0x47, 0x84, 0xa4,\n+0x15, 0xf1, 0x76, 0xbb, 0xa4, 0xee, 0xa4, 0x3b, 0xc4, 0x5f, 0xef, 0xb2, 0x33, 0x96, 0x11, 0x18,\n+0xb7, 0xc9, 0x65, 0xbe, 0x18, 0xe1, 0xa3, 0xa4, 0xdc, 0xfa, 0x18, 0xf9, 0xd3, 0xbc, 0x13, 0x9b,\n+0x39, 0x7a, 0x34, 0xba, 0xd3, 0x41, 0xfb, 0xfa, 0x32, 0x8a, 0x2a, 0xb7, 0x2b, 0x86, 0x0b, 0x69,\n+0x83, 0x38, 0xbe, 0xcd, 0x8a, 0x2e, 0x0b, 0x70, 0xad, 0x8d, 0x26, 0x92, 0xee, 0x1e, 0xf5, 0x01,\n+0x2b, 0x0a, 0xd9, 0xd6, 0x97, 0x9b, 0x6e, 0xe0, 0xa8, 0x19, 0x1c, 0x3a, 0x21, 0x8b, 0x0c, 0x1e,\n+0x40, 0xad, 0x03, 0xe7, 0xdd, 0x66, 0x7e, 0xf5, 0xb9, 0x20, 0x0d, 0x03, 0xe8, 0x96, 0xf9, 0x82,\n+0x45, 0xd4, 0x39, 0xe0, 0xa0, 0x00, 0x5d, 0xd7, 0x98, 0xe6, 0x7d, 0x9e, 0x67, 0x73, 0xc3, 0x9a,\n+0x2a, 0xf7, 0xab, 0x8b, 0xa1, 0x3a, 0x14, 0xef, 0x34, 0xbc, 0x52, 0x0e, 0x89, 0x98, 0x9a, 0x04,\n+0x40, 0x84, 0x1d, 0x7e, 0x45, 0x69, 0x93, 0x57, 0xce, 0xeb, 0xce, 0xf8, 0x50, 0x7c, 0x4f, 0x1c,\n+0x6e, 0x04, 0x43, 0x9b, 0xf9, 0xd6, 0x3b, 0x23, 0x18, 0xe9, 0xea, 0x8e, 0xd1, 0x4d, 0x46, 0x8d,\n+0xf1, 0x3b, 0xe4, 0x6a, 0xca, 0xba, 0xfb, 0x23, 0xb7, 0x9b, 0xfa, 0x99, 0x01, 0x29, 0x5a, 0x58,\n+0x5a, 0x2d, 0xe3, 0xf9, 0xd4, 0x6d, 0x0e, 0x26, 0xad, 0xc1, 0x6e, 0x34, 0xbc, 0x32, 0xf8, 0x0c,\n+0x05, 0xfa, 0x65, 0xa3, 0xdb, 0x3b, 0x37, 0x83, 0x22, 0xe9, 0xd6, 0xdc, 0x72, 0x33, 0xfd, 0x5d,\n+0xf2, 0x20, 0xbd, 0x76, 0x3c, 0x23, 0xda, 0x28, 0xf7, 0xf9, 0x1b, 0xeb, 0x59, 0x64, 0xd5, 0xdc,\n+0x5f, 0x72, 0x7e, 0x20, 0xfc, 0xcd, 0x89, 0xb5, 0x90, 0x67, 0x4d, 0x62, 0x7a, 0x3f, 0x4e, 0xad,\n+0x1d, 0xc3, 0x39, 0xfe, 0x7a, 0xf4, 0x28, 0x16, 0xdf, 0x41, 0xf6, 0x48, 0x80, 0x05, 0xd7, 0x0f,\n+0x51, 0x79, 0xac, 0x10, 0xab, 0xd4, 0xec, 0x03, 0x66, 0xe6, 0x6a, 0xb0, 0xba, 0x31, 0x92, 0x42,\n+0x40, 0x6a, 0xbe, 0x3a, 0xd3, 0x72, 0xe1, 0x6a, 0x37, 0x55, 0xbc, 0xac, 0x1d, 0x95, 0xb7, 0x69,\n+0x61, 0xf2, 0x43, 0x91, 0x74, 0xe6, 0xa0, 0xd3, 0x0a, 0x24, 0x46, 0xa1, 0x08, 0xaf, 0xd6, 0xda,\n+0x45, 0x19, 0x96, 0xd4, 0x53, 0x1d, 0x5b, 0x84, 0x79, 0xf0, 0xc0, 0xf7, 0x47, 0xef, 0x8b, 0x8f,\n+0xc5, 0x06, 0xae, 0x9d, 0x4c, 0x62, 0x9d, 0xff, 0x46, 0x04, 0xf8, 0xd3, 0xc9, 0xb6, 0x10, 0x25,\n+0x40, 0x75, 0xfe, 0x16, 0xaa, 0xc9, 0x4a, 0x60, 0x86, 0x2f, 0xba, 0xef, 0x30, 0x77, 0xe4, 0x54,\n+0xe2, 0xb8, 0x84, 0x99, 0x58, 0x80, 0xaa, 0x13, 0x8b, 0x51, 0x3a, 0x4f, 0x48, 0xf6, 0x8b, 0xb6,\n+0xb3, 0x30, 0x82, 0x05, 0x8d, 0x30, 0x82, 0x03, 0x75, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04,\n+0x18, 0x4a, 0xcc, 0xd6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x30, 0x56, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x43, 0x4e, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x27, 0x43, 0x68, 0x69,\n+0x6e, 0x61, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x43,\n+0x46, 0x43, 0x41, 0x20, 0x45, 0x56, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x32, 0x30, 0x38, 0x30, 0x38, 0x30, 0x33, 0x30, 0x37, 0x30, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x39,\n+0x31, 0x32, 0x33, 0x31, 0x30, 0x33, 0x30, 0x37, 0x30, 0x31, 0x5a, 0x30, 0x56, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x0c, 0x27, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e,\n+0x63, 0x69, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n+0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x15, 0x30, 0x13,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x43, 0x46, 0x43, 0x41, 0x20, 0x45, 0x56, 0x20, 0x52,\n+0x4f, 0x4f, 0x54, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n+0x82, 0x02, 0x01, 0x00, 0xd7, 0x5d, 0x6b, 0xcd, 0x10, 0x3f, 0x1f, 0x05, 0x59, 0xd5, 0x05, 0x4d,\n+0x37, 0xb1, 0x0e, 0xec, 0x98, 0x2b, 0x8e, 0x15, 0x1d, 0xfa, 0x93, 0x4b, 0x17, 0x82, 0x21, 0x71,\n+0x10, 0x52, 0xd7, 0x51, 0x64, 0x70, 0x16, 0xc2, 0x55, 0x69, 0x4d, 0x8e, 0x15, 0x6d, 0x9f, 0xbf,\n+0x0c, 0x1b, 0xc2, 0xe0, 0xa3, 0x67, 0xd6, 0x0c, 0xac, 0xcf, 0x22, 0xae, 0xaf, 0x77, 0x54, 0x2a,\n+0x4b, 0x4c, 0x8a, 0x53, 0x52, 0x7a, 0xc3, 0xee, 0x2e, 0xde, 0xb3, 0x71, 0x25, 0xc1, 0xe9, 0x5d,\n+0x3d, 0xee, 0xa1, 0x2f, 0xa3, 0xf7, 0x2a, 0x3c, 0xc9, 0x23, 0x1d, 0x6a, 0xab, 0x1d, 0xa1, 0xa7,\n+0xf1, 0xf3, 0xec, 0xa0, 0xd5, 0x44, 0xcf, 0x15, 0xcf, 0x72, 0x2f, 0x1d, 0x63, 0x97, 0xe8, 0x99,\n+0xf9, 0xfd, 0x93, 0xa4, 0x54, 0x80, 0x4c, 0x52, 0xd4, 0x52, 0xab, 0x2e, 0x49, 0xdf, 0x90, 0xcd,\n+0xb8, 0x5f, 0xbe, 0x3f, 0xde, 0xa1, 0xca, 0x4d, 0x20, 0xd4, 0x25, 0xe8, 0x84, 0x29, 0x53, 0xb7,\n+0xb1, 0x88, 0x1f, 0xff, 0xfa, 0xda, 0x90, 0x9f, 0x0a, 0xa9, 0x2d, 0x41, 0x3f, 0xb1, 0xf1, 0x18,\n+0x29, 0xee, 0x16, 0x59, 0x2c, 0x34, 0x49, 0x1a, 0xa8, 0x06, 0xd7, 0xa8, 0x88, 0xd2, 0x03, 0x72,\n+0x7a, 0x32, 0xe2, 0xea, 0x68, 0x4d, 0x6e, 0x2c, 0x96, 0x65, 0x7b, 0xca, 0x59, 0xfa, 0xf2, 0xe2,\n+0xdd, 0xee, 0x30, 0x2c, 0xfb, 0xcc, 0x46, 0xac, 0xc4, 0x63, 0xeb, 0x6f, 0x7f, 0x36, 0x2b, 0x34,\n+0x73, 0x12, 0x94, 0x7f, 0xdf, 0xcc, 0x26, 0x9e, 0xf1, 0x72, 0x5d, 0x50, 0x65, 0x59, 0x8f, 0x69,\n+0xb3, 0x87, 0x5e, 0x32, 0x6f, 0xc3, 0x18, 0x8a, 0xb5, 0x95, 0x8f, 0xb0, 0x7a, 0x37, 0xde, 0x5a,\n+0x45, 0x3b, 0xc7, 0x36, 0xe1, 0xef, 0x67, 0xd1, 0x39, 0xd3, 0x97, 0x5b, 0x73, 0x62, 0x19, 0x48,\n+0x2d, 0x87, 0x1c, 0x06, 0xfb, 0x74, 0x98, 0x20, 0x49, 0x73, 0xf0, 0x05, 0xd2, 0x1b, 0xb1, 0xa0,\n+0xa3, 0xb7, 0x1b, 0x70, 0xd3, 0x88, 0x69, 0xb9, 0x5a, 0xd6, 0x38, 0xf4, 0x62, 0xdc, 0x25, 0x8b,\n+0x78, 0xbf, 0xf8, 0xe8, 0x7e, 0xb8, 0x5c, 0xc9, 0x95, 0x4f, 0x5f, 0xa7, 0x2d, 0xb9, 0x20, 0x6b,\n+0xcf, 0x6b, 0xdd, 0xf5, 0x0d, 0xf4, 0x82, 0xb7, 0xf4, 0xb2, 0x66, 0x2e, 0x10, 0x28, 0xf6, 0x97,\n+0x5a, 0x7b, 0x96, 0x16, 0x8f, 0x01, 0x19, 0x2d, 0x6c, 0x6e, 0x7f, 0x39, 0x58, 0x06, 0x64, 0x83,\n+0x01, 0x83, 0x83, 0xc3, 0x4d, 0x92, 0xdd, 0x32, 0xc6, 0x87, 0xa4, 0x37, 0xe9, 0x16, 0xce, 0xaa,\n+0x2d, 0x68, 0xaf, 0x0a, 0x81, 0x65, 0x3a, 0x70, 0xc1, 0x9b, 0xad, 0x4d, 0x6d, 0x54, 0xca, 0x2a,\n+0x2d, 0x4b, 0x85, 0x1b, 0xb3, 0x80, 0xe6, 0x70, 0x45, 0x0d, 0x6b, 0x5e, 0x35, 0xf0, 0x7f, 0x3b,\n+0xb8, 0x9c, 0xe4, 0x04, 0x70, 0x89, 0x12, 0x25, 0x93, 0xda, 0x0a, 0x99, 0x22, 0x60, 0x6a, 0x63,\n+0x60, 0x4e, 0x76, 0x06, 0x98, 0x4e, 0xbd, 0x83, 0xad, 0x1d, 0x58, 0x8a, 0x25, 0x85, 0xd2, 0xc7,\n+0x65, 0x1e, 0x2d, 0x8e, 0xc6, 0xdf, 0xb6, 0xc6, 0xe1, 0x7f, 0x8a, 0x04, 0x21, 0x15, 0x29, 0x74,\n+0xf0, 0x3e, 0x9c, 0x90, 0x9d, 0x0c, 0x2e, 0xf1, 0x8a, 0x3e, 0x5a, 0xaa, 0x0c, 0x09, 0x1e, 0xc7,\n+0xd5, 0x3c, 0xa3, 0xed, 0x97, 0xc3, 0x1e, 0x34, 0xfa, 0x38, 0xf9, 0x08, 0x0e, 0xe3, 0xc0, 0x5d,\n+0x2b, 0x83, 0xd1, 0x56, 0x6a, 0xc9, 0xb6, 0xa8, 0x54, 0x53, 0x2e, 0x78, 0x32, 0x67, 0x3d, 0x82,\n+0x7f, 0x74, 0xd0, 0xfb, 0xe1, 0xb6, 0x05, 0x60, 0xb9, 0x70, 0xdb, 0x8e, 0x0b, 0xf9, 0x13, 0x58,\n+0x6f, 0x71, 0x60, 0x10, 0x52, 0x10, 0xb9, 0xc1, 0x41, 0x09, 0xef, 0x72, 0x1f, 0x67, 0x31, 0x78,\n+0xff, 0x96, 0x05, 0x8d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1f, 0x06,\n+0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xe3, 0xfe, 0x2d, 0xfd, 0x28, 0xd0,\n+0x0b, 0xb5, 0xba, 0xb6, 0xa2, 0xc4, 0xbf, 0x06, 0xaa, 0x05, 0x8c, 0x93, 0xfb, 0x2f, 0x30, 0x0f,\n+0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe3, 0xfe, 0x2d, 0xfd, 0x28, 0xd0,\n+0x0b, 0xb5, 0xba, 0xb6, 0xa2, 0xc4, 0xbf, 0x06, 0xaa, 0x05, 0x8c, 0x93, 0xfb, 0x2f, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02,\n+0x01, 0x00, 0x25, 0xc6, 0xba, 0x6b, 0xeb, 0x87, 0xcb, 0xde, 0x82, 0x39, 0x96, 0x3d, 0xf0, 0x44,\n+0xa7, 0x6b, 0x84, 0x73, 0x03, 0xde, 0x9d, 0x2b, 0x4f, 0xba, 0x20, 0x7f, 0xbc, 0x78, 0xb2, 0xcf,\n+0x97, 0xb0, 0x1b, 0x9c, 0xf3, 0xd7, 0x79, 0x2e, 0xf5, 0x48, 0xb6, 0xd2, 0xfb, 0x17, 0x88, 0xe6,\n+0xd3, 0x7a, 0x3f, 0xed, 0x53, 0x13, 0xd0, 0xe2, 0x2f, 0x6a, 0x79, 0xcb, 0x00, 0x23, 0x28, 0xe6,\n+0x1e, 0x37, 0x57, 0x35, 0x89, 0x84, 0xc2, 0x76, 0x4f, 0x34, 0x36, 0xad, 0x67, 0xc3, 0xce, 0x41,\n+0x06, 0x88, 0xc5, 0xf7, 0xee, 0xd8, 0x1a, 0xb8, 0xd6, 0x0b, 0x7f, 0x50, 0xff, 0x93, 0xaa, 0x17,\n+0x4b, 0x8c, 0xec, 0xed, 0x52, 0x60, 0xb2, 0xa4, 0x06, 0xea, 0x4e, 0xeb, 0xf4, 0x6b, 0x19, 0xfd,\n+0xeb, 0xf5, 0x1a, 0xe0, 0x25, 0x2a, 0x9a, 0xdc, 0xc7, 0x41, 0x36, 0xf7, 0xc8, 0x74, 0x05, 0x84,\n+0x39, 0x95, 0x39, 0xd6, 0x0b, 0x3b, 0xa4, 0x27, 0xfa, 0x08, 0xd8, 0x5c, 0x1e, 0xf8, 0x04, 0x60,\n+0x52, 0x11, 0x28, 0x28, 0x03, 0xff, 0xef, 0x53, 0x66, 0x00, 0xa5, 0x4a, 0x34, 0x16, 0x66, 0x7c,\n+0xfd, 0x09, 0xa4, 0xae, 0x9e, 0x67, 0x1a, 0x6f, 0x41, 0x0b, 0x6b, 0x06, 0x13, 0x9b, 0x8f, 0x86,\n+0x71, 0x05, 0xb4, 0x2f, 0x8d, 0x89, 0x66, 0x33, 0x29, 0x76, 0x54, 0x9a, 0x11, 0xf8, 0x27, 0xfa,\n+0xb2, 0x3f, 0x91, 0xe0, 0xce, 0x0d, 0x1b, 0xf3, 0x30, 0x1a, 0xad, 0xbf, 0x22, 0x5d, 0x1b, 0xd3,\n+0xbf, 0x25, 0x05, 0x4d, 0xe1, 0x92, 0x1a, 0x7f, 0x99, 0x9f, 0x3c, 0x44, 0x93, 0xca, 0xd4, 0x40,\n+0x49, 0x6c, 0x80, 0x87, 0xd7, 0x04, 0x3a, 0xc3, 0x32, 0x52, 0x35, 0x0e, 0x56, 0xf8, 0xa5, 0xdd,\n+0x7d, 0xc4, 0x8b, 0x0d, 0x11, 0x1f, 0x53, 0xcb, 0x1e, 0xb2, 0x17, 0xb6, 0x68, 0x77, 0x5a, 0xe0,\n+0xd4, 0xcb, 0xc8, 0x07, 0xae, 0xf5, 0x3a, 0x2e, 0x8e, 0x37, 0xb7, 0xd0, 0x01, 0x4b, 0x43, 0x29,\n+0x77, 0x8c, 0x39, 0x97, 0x8f, 0x82, 0x5a, 0xf8, 0x51, 0xe5, 0x89, 0xa0, 0x18, 0xe7, 0x68, 0x7f,\n+0x5d, 0x0a, 0x2e, 0xfb, 0xa3, 0x47, 0x0e, 0x3d, 0xa6, 0x23, 0x7a, 0xc6, 0x01, 0xc7, 0x8f, 0xc8,\n+0x5e, 0xbf, 0x6d, 0x80, 0x56, 0xbe, 0x8a, 0x24, 0xba, 0x33, 0xea, 0x9f, 0xe1, 0x32, 0x11, 0x9e,\n+0xf1, 0xd2, 0x4f, 0x80, 0xf6, 0x1b, 0x40, 0xaf, 0x38, 0x9e, 0x11, 0x50, 0x79, 0x73, 0x12, 0x12,\n+0xcd, 0xe6, 0x6c, 0x9d, 0x2c, 0x88, 0x72, 0x3c, 0x30, 0x81, 0x06, 0x91, 0x22, 0xea, 0x59, 0xad,\n+0xda, 0x19, 0x2e, 0x22, 0xc2, 0x8d, 0xb9, 0x8c, 0x87, 0xe0, 0x66, 0xbc, 0x73, 0x23, 0x5f, 0x21,\n+0x64, 0x63, 0x80, 0x48, 0xf5, 0xa0, 0x3c, 0x18, 0x3d, 0x94, 0xc8, 0x48, 0x41, 0x1d, 0x40, 0xba,\n+0x5e, 0xfe, 0xfe, 0x56, 0x39, 0xa1, 0xc8, 0xcf, 0x5e, 0x9e, 0x19, 0x64, 0x46, 0x10, 0xda, 0x17,\n+0x91, 0xb7, 0x05, 0x80, 0xac, 0x8b, 0x99, 0x92, 0x7d, 0xe7, 0xa2, 0xd8, 0x07, 0x0b, 0x36, 0x27,\n+0xe7, 0x48, 0x79, 0x60, 0x8a, 0xc3, 0xd7, 0x13, 0x5c, 0xf8, 0x72, 0x40, 0xdf, 0x4a, 0xcb, 0xcf,\n+0x99, 0x00, 0x0a, 0x00, 0x0b, 0x11, 0x95, 0xda, 0x56, 0x45, 0x03, 0x88, 0x0a, 0x9f, 0x67, 0xd0,\n+0xd5, 0x79, 0xb1, 0xa8, 0x8d, 0x40, 0x6d, 0x0d, 0xc2, 0x7a, 0x40, 0xfa, 0xf3, 0x5f, 0x64, 0x47,\n+0x92, 0xcb, 0x53, 0xb9, 0xbb, 0x59, 0xce, 0x4f, 0xfd, 0xd0, 0x15, 0x53, 0x01, 0xd8, 0xdf, 0xeb,\n+0xd9, 0xe6, 0x76, 0xef, 0xd0, 0x23, 0xbb, 0x3b, 0xa9, 0x79, 0xb3, 0xd5, 0x02, 0x29, 0xcd, 0x89,\n+0xa3, 0x96, 0x0f, 0x4a, 0x35, 0xe7, 0x4e, 0x42, 0xc0, 0x75, 0xcd, 0x07, 0xcf, 0xe6, 0x2c, 0xeb,\n+0x7b, 0x2e, 0x30, 0x82, 0x04, 0x15, 0x30, 0x82, 0x02, 0xfd, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x06, 0x49, 0x41, 0x2c, 0xe4, 0x00, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa7, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c,\n+0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x0c, 0x0c, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e,\n+0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x2e, 0x54, 0x61, 0x6e, 0xc3, 0xba,\n+0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0xc3, 0xb3, 0x6b,\n+0x20, 0x28, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n+0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x29, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x0c, 0x2c, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x41, 0x72, 0x61, 0x6e,\n+0x79, 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x29, 0x20, 0x46,\n+0xc5, 0x91, 0x74, 0x61, 0x6e, 0xc3, 0xba, 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79,\n+0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x32, 0x31, 0x31, 0x31, 0x35, 0x30, 0x38, 0x32, 0x31,\n+0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, 0x30, 0x36, 0x31, 0x35, 0x30, 0x38, 0x32, 0x31, 0x5a,\n+0x30, 0x81, 0xa7, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55,\n+0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70,\n+0x65, 0x73, 0x74, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x4e, 0x65,\n+0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03,\n+0x55, 0x04, 0x0b, 0x0c, 0x2e, 0x54, 0x61, 0x6e, 0xc3, 0xba, 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3,\n+0xa1, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0xc3, 0xb3, 0x6b, 0x20, 0x28, 0x43, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n+0x65, 0x73, 0x29, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2c, 0x4e, 0x65,\n+0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x41, 0x72, 0x61, 0x6e, 0x79, 0x20, 0x28, 0x43, 0x6c, 0x61,\n+0x73, 0x73, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x29, 0x20, 0x46, 0xc5, 0x91, 0x74, 0x61, 0x6e, 0xc3,\n+0xba, 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,\n+0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc4, 0x24, 0x5e, 0x73, 0xbe,\n+0x4b, 0x6d, 0x14, 0xc3, 0xa1, 0xf4, 0xe3, 0x97, 0x90, 0x6e, 0xd2, 0x30, 0x45, 0x1e, 0x3c, 0xee,\n+0x67, 0xd9, 0x64, 0xe0, 0x1a, 0x8a, 0x7f, 0xca, 0x30, 0xca, 0x83, 0xe3, 0x20, 0xc1, 0xe3, 0xf4,\n+0x3a, 0xd3, 0x94, 0x5f, 0x1a, 0x7c, 0x5b, 0x6d, 0xbf, 0x30, 0x4f, 0x84, 0x27, 0xf6, 0x9f, 0x1f,\n+0x49, 0xbc, 0xc6, 0x99, 0x0a, 0x90, 0xf2, 0x0f, 0xf5, 0x7f, 0x43, 0x84, 0x37, 0x63, 0x51, 0x8b,\n+0x7a, 0xa5, 0x70, 0xfc, 0x7a, 0x58, 0xcd, 0x8e, 0x9b, 0xed, 0xc3, 0x46, 0x6c, 0x84, 0x70, 0x5d,\n+0xda, 0xf3, 0x01, 0x90, 0x23, 0xfc, 0x4e, 0x30, 0xa9, 0x7e, 0xe1, 0x27, 0x63, 0xe7, 0xed, 0x64,\n+0x3c, 0xa0, 0xb8, 0xc9, 0x33, 0x63, 0xfe, 0x16, 0x90, 0xff, 0xb0, 0xb8, 0xfd, 0xd7, 0xa8, 0xc0,\n+0xc0, 0x94, 0x43, 0x0b, 0xb6, 0xd5, 0x59, 0xa6, 0x9e, 0x56, 0xd0, 0x24, 0x1f, 0x70, 0x79, 0xaf,\n+0xdb, 0x39, 0x54, 0x0d, 0x65, 0x75, 0xd9, 0x15, 0x41, 0x94, 0x01, 0xaf, 0x5e, 0xec, 0xf6, 0x8d,\n+0xf1, 0xff, 0xad, 0x64, 0xfe, 0x20, 0x9a, 0xd7, 0x5c, 0xeb, 0xfe, 0xa6, 0x1f, 0x08, 0x64, 0xa3,\n+0x8b, 0x76, 0x55, 0xad, 0x1e, 0x3b, 0x28, 0x60, 0x2e, 0x87, 0x25, 0xe8, 0xaa, 0xaf, 0x1f, 0xc6,\n+0x64, 0x46, 0x20, 0xb7, 0x70, 0x7f, 0x3c, 0xde, 0x48, 0xdb, 0x96, 0x53, 0xb7, 0x39, 0x77, 0xe4,\n+0x1a, 0xe2, 0xc7, 0x16, 0x84, 0x76, 0x97, 0x5b, 0x2f, 0xbb, 0x19, 0x15, 0x85, 0xf8, 0x69, 0x85,\n+0xf5, 0x99, 0xa7, 0xa9, 0xf2, 0x34, 0xa7, 0xa9, 0xb6, 0xa6, 0x03, 0xfc, 0x6f, 0x86, 0x3d, 0x54,\n+0x7c, 0x76, 0x04, 0x9b, 0x6b, 0xf9, 0x40, 0x5d, 0x00, 0x34, 0xc7, 0x2e, 0x99, 0x75, 0x9d, 0xe5,\n+0x88, 0x03, 0xaa, 0x4d, 0xf8, 0x03, 0xd2, 0x42, 0x76, 0xc0, 0x1b, 0x02, 0x03, 0x00, 0xa8, 0x8b,\n+0xa3, 0x45, 0x30, 0x43, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08,\n+0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x04, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n+0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0xcc, 0xfa, 0x67, 0x93, 0xf0, 0xb6, 0xb8, 0xd0, 0xa5, 0xc0, 0x1e, 0xf3, 0x53,\n+0xfd, 0x8c, 0x53, 0xdf, 0x83, 0xd7, 0x96, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xab, 0x7f, 0xee, 0x1c, 0x16,\n+0xa9, 0x9c, 0x3c, 0x51, 0x00, 0xa0, 0xc0, 0x11, 0x08, 0x05, 0xa7, 0x99, 0xe6, 0x6f, 0x01, 0x88,\n+0x54, 0x61, 0x6e, 0xf1, 0xb9, 0x18, 0xad, 0x4a, 0xad, 0xfe, 0x81, 0x40, 0x23, 0x94, 0x2f, 0xfb,\n+0x75, 0x7c, 0x2f, 0x28, 0x4b, 0x62, 0x24, 0x81, 0x82, 0x0b, 0xf5, 0x61, 0xf1, 0x1c, 0x6e, 0xb8,\n+0x61, 0x38, 0xeb, 0x81, 0xfa, 0x62, 0xa1, 0x3b, 0x5a, 0x62, 0xd3, 0x94, 0x65, 0xc4, 0xe1, 0xe6,\n+0x6d, 0x82, 0xf8, 0x2f, 0x25, 0x70, 0xb2, 0x21, 0x26, 0xc1, 0x72, 0x51, 0x1f, 0x8c, 0x2c, 0xc3,\n+0x84, 0x90, 0xc3, 0x5a, 0x8f, 0xba, 0xcf, 0xf4, 0xa7, 0x65, 0xa5, 0xeb, 0x98, 0xd1, 0xfb, 0x05,\n+0xb2, 0x46, 0x75, 0x15, 0x23, 0x6a, 0x6f, 0x85, 0x63, 0x30, 0x80, 0xf0, 0xd5, 0x9e, 0x1f, 0x29,\n+0x1c, 0xc2, 0x6c, 0xb0, 0x50, 0x59, 0x5d, 0x90, 0x5b, 0x3b, 0xa8, 0x0d, 0x30, 0xcf, 0xbf, 0x7d,\n+0x7f, 0xce, 0xf1, 0x9d, 0x83, 0xbd, 0xc9, 0x46, 0x6e, 0x20, 0xa6, 0xf9, 0x61, 0x51, 0xba, 0x21,\n+0x2f, 0x7b, 0xbe, 0xa5, 0x15, 0x63, 0xa1, 0xd4, 0x95, 0x87, 0xf1, 0x9e, 0xb9, 0xf3, 0x89, 0xf3,\n+0x3d, 0x85, 0xb8, 0xb8, 0xdb, 0xbe, 0xb5, 0xb9, 0x29, 0xf9, 0xda, 0x37, 0x05, 0x00, 0x49, 0x94,\n+0x03, 0x84, 0x44, 0xe7, 0xbf, 0x43, 0x31, 0xcf, 0x75, 0x8b, 0x25, 0xd1, 0xf4, 0xa6, 0x64, 0xf5,\n+0x92, 0xf6, 0xab, 0x05, 0xeb, 0x3d, 0xe9, 0xa5, 0x0b, 0x36, 0x62, 0xda, 0xcc, 0x06, 0x5f, 0x36,\n+0x8b, 0xb6, 0x5e, 0x31, 0xb8, 0x2a, 0xfb, 0x5e, 0xf6, 0x71, 0xdf, 0x44, 0x26, 0x9e, 0xc4, 0xe6,\n+0x0d, 0x91, 0xb4, 0x2e, 0x75, 0x95, 0x80, 0x51, 0x6a, 0x4b, 0x30, 0xa6, 0xb0, 0x62, 0xa1, 0x93,\n+0xf1, 0x9b, 0xd8, 0xce, 0xc4, 0x63, 0x75, 0x3f, 0x59, 0x47, 0xb1, 0x30, 0x82, 0x03, 0x4a, 0x30,\n+0x82, 0x02, 0x32, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x44, 0xaf, 0xb0, 0x80, 0xd6, 0xa3,\n+0x27, 0xba, 0x89, 0x30, 0x39, 0x86, 0x2e, 0xf8, 0x40, 0x6b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69,\n+0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f,\n+0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x58, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30,\n+0x30, 0x39, 0x33, 0x30, 0x32, 0x31, 0x31, 0x32, 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30,\n+0x39, 0x33, 0x30, 0x31, 0x34, 0x30, 0x31, 0x31, 0x35, 0x5a, 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53,\n+0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43,\n+0x6f, 0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x58, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n+0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdf, 0xaf, 0xe9, 0x97,\n+0x50, 0x08, 0x83, 0x57, 0xb4, 0xcc, 0x62, 0x65, 0xf6, 0x90, 0x82, 0xec, 0xc7, 0xd3, 0x2c, 0x6b,\n+0x30, 0xca, 0x5b, 0xec, 0xd9, 0xc3, 0x7d, 0xc7, 0x40, 0xc1, 0x18, 0x14, 0x8b, 0xe0, 0xe8, 0x33,\n+0x76, 0x49, 0x2a, 0xe3, 0x3f, 0x21, 0x49, 0x93, 0xac, 0x4e, 0x0e, 0xaf, 0x3e, 0x48, 0xcb, 0x65,\n+0xee, 0xfc, 0xd3, 0x21, 0x0f, 0x65, 0xd2, 0x2a, 0xd9, 0x32, 0x8f, 0x8c, 0xe5, 0xf7, 0x77, 0xb0,\n+0x12, 0x7b, 0xb5, 0x95, 0xc0, 0x89, 0xa3, 0xa9, 0xba, 0xed, 0x73, 0x2e, 0x7a, 0x0c, 0x06, 0x32,\n+0x83, 0xa2, 0x7e, 0x8a, 0x14, 0x30, 0xcd, 0x11, 0xa0, 0xe1, 0x2a, 0x38, 0xb9, 0x79, 0x0a, 0x31,\n+0xfd, 0x50, 0xbd, 0x80, 0x65, 0xdf, 0xb7, 0x51, 0x63, 0x83, 0xc8, 0xe2, 0x88, 0x61, 0xea, 0x4b,\n+0x61, 0x81, 0xec, 0x52, 0x6b, 0xb9, 0xa2, 0xe2, 0x4b, 0x1a, 0x28, 0x9f, 0x48, 0xa3, 0x9e, 0x0c,\n+0xda, 0x09, 0x8e, 0x3e, 0x17, 0x2e, 0x1e, 0xdd, 0x20, 0xdf, 0x5b, 0xc6, 0x2a, 0x8a, 0xab, 0x2e,\n+0xbd, 0x70, 0xad, 0xc5, 0x0b, 0x1a, 0x25, 0x90, 0x74, 0x72, 0xc5, 0x7b, 0x6a, 0xab, 0x34, 0xd6,\n+0x30, 0x89, 0xff, 0xe5, 0x68, 0x13, 0x7b, 0x54, 0x0b, 0xc8, 0xd6, 0xae, 0xec, 0x5a, 0x9c, 0x92,\n+0x1e, 0x3d, 0x64, 0xb3, 0x8c, 0xc6, 0xdf, 0xbf, 0xc9, 0x41, 0x70, 0xec, 0x16, 0x72, 0xd5, 0x26,\n+0xec, 0x38, 0x55, 0x39, 0x43, 0xd0, 0xfc, 0xfd, 0x18, 0x5c, 0x40, 0xf1, 0x97, 0xeb, 0xd5, 0x9a,\n+0x9b, 0x8d, 0x1d, 0xba, 0xda, 0x25, 0xb9, 0xc6, 0xd8, 0xdf, 0xc1, 0x15, 0x02, 0x3a, 0xab, 0xda,\n+0x6e, 0xf1, 0x3e, 0x2e, 0xf5, 0x5c, 0x08, 0x9c, 0x3c, 0xd6, 0x83, 0x69, 0xe4, 0x10, 0x9b, 0x19,\n+0x2a, 0xb6, 0x29, 0x57, 0xe3, 0xe5, 0x3d, 0x9b, 0x9f, 0xf0, 0x02, 0x5d, 0x02, 0x03, 0x01, 0x00,\n+0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n+0x14, 0xc4, 0xa7, 0xb1, 0xa4, 0x7b, 0x2c, 0x71, 0xfa, 0xdb, 0xe1, 0x4b, 0x90, 0x75, 0xff, 0xc4,\n+0x15, 0x60, 0x85, 0x89, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x1a, 0x2c, 0x9b, 0x17, 0x00, 0x5c,\n+0xa9, 0x1e, 0xee, 0x28, 0x66, 0x37, 0x3a, 0xbf, 0x83, 0xc7, 0x3f, 0x4b, 0xc3, 0x09, 0xa0, 0x95,\n+0x20, 0x5d, 0xe3, 0xd9, 0x59, 0x44, 0xd2, 0x3e, 0x0d, 0x3e, 0xbd, 0x8a, 0x4b, 0xa0, 0x74, 0x1f,\n+0xce, 0x10, 0x82, 0x9c, 0x74, 0x1a, 0x1d, 0x7e, 0x98, 0x1a, 0xdd, 0xcb, 0x13, 0x4b, 0xb3, 0x20,\n+0x44, 0xe4, 0x91, 0xe9, 0xcc, 0xfc, 0x7d, 0xa5, 0xdb, 0x6a, 0xe5, 0xfe, 0xe6, 0xfd, 0xe0, 0x4e,\n+0xdd, 0xb7, 0x00, 0x3a, 0xb5, 0x70, 0x49, 0xaf, 0xf2, 0xe5, 0xeb, 0x02, 0xf1, 0xd1, 0x02, 0x8b,\n+0x19, 0xcb, 0x94, 0x3a, 0x5e, 0x48, 0xc4, 0x18, 0x1e, 0x58, 0x19, 0x5f, 0x1e, 0x02, 0x5a, 0xf0,\n+0x0c, 0xf1, 0xb1, 0xad, 0xa9, 0xdc, 0x59, 0x86, 0x8b, 0x6e, 0xe9, 0x91, 0xf5, 0x86, 0xca, 0xfa,\n+0xb9, 0x66, 0x33, 0xaa, 0x59, 0x5b, 0xce, 0xe2, 0xa7, 0x16, 0x73, 0x47, 0xcb, 0x2b, 0xcc, 0x99,\n+0xb0, 0x37, 0x48, 0xcf, 0xe3, 0x56, 0x4b, 0xf5, 0xcf, 0x0f, 0x0c, 0x72, 0x32, 0x87, 0xc6, 0xf0,\n+0x44, 0xbb, 0x53, 0x72, 0x6d, 0x43, 0xf5, 0x26, 0x48, 0x9a, 0x52, 0x67, 0xb7, 0x58, 0xab, 0xfe,\n+0x67, 0x76, 0x71, 0x78, 0xdb, 0x0d, 0xa2, 0x56, 0x14, 0x13, 0x39, 0x24, 0x31, 0x85, 0xa2, 0xa8,\n+0x02, 0x5a, 0x30, 0x47, 0xe1, 0xdd, 0x50, 0x07, 0xbc, 0x02, 0x09, 0x90, 0x00, 0xeb, 0x64, 0x63,\n+0x60, 0x9b, 0x16, 0xbc, 0x88, 0xc9, 0x12, 0xe6, 0xd2, 0x7d, 0x91, 0x8b, 0xf9, 0x3d, 0x32, 0x8d,\n+0x65, 0xb4, 0xe9, 0x7c, 0xb1, 0x57, 0x76, 0xea, 0xc5, 0xb6, 0x28, 0x39, 0xbf, 0x15, 0x65, 0x1c,\n+0xc8, 0xf6, 0x77, 0x96, 0x6a, 0x0a, 0x8d, 0x77, 0x0b, 0xd8, 0x91, 0x0b, 0x04, 0x8e, 0x07, 0xdb,\n+0x29, 0xb6, 0x0a, 0xee, 0x9d, 0x82, 0x35, 0x35, 0x10, 0x30, 0x82, 0x03, 0xe6, 0x30, 0x82, 0x02,\n+0xce, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x57, 0xcb, 0x33, 0x6f, 0xc2, 0x5c, 0x16, 0xe6,\n+0x47, 0x16, 0x17, 0xe3, 0x90, 0x31, 0x68, 0xe0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x18, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f,\n+0x6e, 0x73, 0x20, 0x4c, 0x2e, 0x4c, 0x2e, 0x43, 0x2e, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x13, 0x27, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c, 0x75,\n+0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n+0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30,\n+0x36, 0x31, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39,\n+0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x62, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x18, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c,\n+0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x4c, 0x2e, 0x4c, 0x2e, 0x43, 0x2e, 0x31, 0x30, 0x30,\n+0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x27, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20,\n+0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n+0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30,\n+0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n+0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00,\n+0xe4, 0xbc, 0x7e, 0x92, 0x30, 0x6d, 0xc6, 0xd8, 0x8e, 0x2b, 0x0b, 0xbc, 0x46, 0xce, 0xe0, 0x27,\n+0x96, 0xde, 0xde, 0xf9, 0xfa, 0x12, 0xd3, 0x3c, 0x33, 0x73, 0xb3, 0x04, 0x2f, 0xbc, 0x71, 0x8c,\n+0xe5, 0x9f, 0xb6, 0x22, 0x60, 0x3e, 0x5f, 0x5d, 0xce, 0x09, 0xff, 0x82, 0x0c, 0x1b, 0x9a, 0x51,\n+0x50, 0x1a, 0x26, 0x89, 0xdd, 0xd5, 0x61, 0x5d, 0x19, 0xdc, 0x12, 0x0f, 0x2d, 0x0a, 0xa2, 0x43,\n+0x5d, 0x17, 0xd0, 0x34, 0x92, 0x20, 0xea, 0x73, 0xcf, 0x38, 0x2c, 0x06, 0x26, 0x09, 0x7a, 0x72,\n+0xf7, 0xfa, 0x50, 0x32, 0xf8, 0xc2, 0x93, 0xd3, 0x69, 0xa2, 0x23, 0xce, 0x41, 0xb1, 0xcc, 0xe4,\n+0xd5, 0x1f, 0x36, 0xd1, 0x8a, 0x3a, 0xf8, 0x8c, 0x63, 0xe2, 0x14, 0x59, 0x69, 0xed, 0x0d, 0xd3,\n+0x7f, 0x6b, 0xe8, 0xb8, 0x03, 0xe5, 0x4f, 0x6a, 0xe5, 0x98, 0x63, 0x69, 0x48, 0x05, 0xbe, 0x2e,\n+0xff, 0x33, 0xb6, 0xe9, 0x97, 0x59, 0x69, 0xf8, 0x67, 0x19, 0xae, 0x93, 0x61, 0x96, 0x44, 0x15,\n+0xd3, 0x72, 0xb0, 0x3f, 0xbc, 0x6a, 0x7d, 0xec, 0x48, 0x7f, 0x8d, 0xc3, 0xab, 0xaa, 0x71, 0x2b,\n+0x53, 0x69, 0x41, 0x53, 0x34, 0xb5, 0xb0, 0xb9, 0xc5, 0x06, 0x0a, 0xc4, 0xb0, 0x45, 0xf5, 0x41,\n+0x5d, 0x6e, 0x89, 0x45, 0x7b, 0x3d, 0x3b, 0x26, 0x8c, 0x74, 0xc2, 0xe5, 0xd2, 0xd1, 0x7d, 0xb2,\n+0x11, 0xd4, 0xfb, 0x58, 0x32, 0x22, 0x9a, 0x80, 0xc9, 0xdc, 0xfd, 0x0c, 0xe9, 0x7f, 0x5e, 0x03,\n+0x97, 0xce, 0x3b, 0x00, 0x14, 0x87, 0x27, 0x70, 0x38, 0xa9, 0x8e, 0x6e, 0xb3, 0x27, 0x76, 0x98,\n+0x51, 0xe0, 0x05, 0xe3, 0x21, 0xab, 0x1a, 0xd5, 0x85, 0x22, 0x3c, 0x29, 0xb5, 0x9a, 0x16, 0xc5,\n+0x80, 0xa8, 0xf4, 0xbb, 0x6b, 0x30, 0x8f, 0x2f, 0x46, 0x02, 0xa2, 0xb1, 0x0c, 0x22, 0xe0, 0xd3,\n+0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x97, 0x30, 0x81, 0x94, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x21, 0x30, 0xc9, 0xfb, 0x00, 0xd7, 0x4e, 0x98, 0xda, 0x87,\n+0xaa, 0x2a, 0xd0, 0xa7, 0x2e, 0xb1, 0x40, 0x31, 0xa7, 0x4c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,\n+0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x52, 0x06, 0x03, 0x55,\n+0x1d, 0x1f, 0x04, 0x4b, 0x30, 0x49, 0x30, 0x47, 0xa0, 0x45, 0xa0, 0x43, 0x86, 0x41, 0x68, 0x74,\n+0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x6e, 0x65, 0x74, 0x73, 0x6f, 0x6c, 0x73,\n+0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f,\n+0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n+0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x63, 0x72, 0x6c, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82,\n+0x01, 0x01, 0x00, 0xbb, 0xae, 0x4b, 0xe7, 0xb7, 0x57, 0xeb, 0x7f, 0xaa, 0x2d, 0xb7, 0x73, 0x47,\n+0x85, 0x6a, 0xc1, 0xe4, 0xa5, 0x1d, 0xe4, 0xe7, 0x3c, 0xe9, 0xf4, 0x59, 0x65, 0x77, 0xb5, 0x7a,\n+0x5b, 0x5a, 0x8d, 0x25, 0x36, 0xe0, 0x7a, 0x97, 0x2e, 0x38, 0xc0, 0x57, 0x60, 0x83, 0x98, 0x06,\n+0x83, 0x9f, 0xb9, 0x76, 0x7a, 0x6e, 0x50, 0xe0, 0xba, 0x88, 0x2c, 0xfc, 0x45, 0xcc, 0x18, 0xb0,\n+0x99, 0x95, 0x51, 0x0e, 0xec, 0x1d, 0xb8, 0x88, 0xff, 0x87, 0x50, 0x1c, 0x82, 0xc2, 0xe3, 0xe0,\n+0x32, 0x80, 0xbf, 0xa0, 0x0b, 0x47, 0xc8, 0xc3, 0x31, 0xef, 0x99, 0x67, 0x32, 0x80, 0x4f, 0x17,\n+0x21, 0x79, 0x0c, 0x69, 0x5c, 0xde, 0x5e, 0x34, 0xae, 0x02, 0xb5, 0x26, 0xea, 0x50, 0xdf, 0x7f,\n+0x18, 0x65, 0x2c, 0xc9, 0xf2, 0x63, 0xe1, 0xa9, 0x07, 0xfe, 0x7c, 0x71, 0x1f, 0x6b, 0x33, 0x24,\n+0x6a, 0x1e, 0x05, 0xf7, 0x05, 0x68, 0xc0, 0x6a, 0x12, 0xcb, 0x2e, 0x5e, 0x61, 0xcb, 0xae, 0x28,\n+0xd3, 0x7e, 0xc2, 0xb4, 0x66, 0x91, 0x26, 0x5f, 0x3c, 0x2e, 0x24, 0x5f, 0xcb, 0x58, 0x0f, 0xeb,\n+0x28, 0xec, 0xaf, 0x11, 0x96, 0xf3, 0xdc, 0x7b, 0x6f, 0xc0, 0xa7, 0x88, 0xf2, 0x53, 0x77, 0xb3,\n+0x60, 0x5e, 0xae, 0xae, 0x28, 0xda, 0x35, 0x2c, 0x6f, 0x34, 0x45, 0xd3, 0x26, 0xe1, 0xde, 0xec,\n+0x5b, 0x4f, 0x27, 0x6b, 0x16, 0x7c, 0xbd, 0x44, 0x04, 0x18, 0x82, 0xb3, 0x89, 0x79, 0x17, 0x10,\n+0x71, 0x3d, 0x7a, 0xa2, 0x16, 0x4e, 0xf5, 0x01, 0xcd, 0xa4, 0x6c, 0x65, 0x68, 0xa1, 0x49, 0x76,\n+0x5c, 0x43, 0xc9, 0xd8, 0xbc, 0x36, 0x67, 0x6c, 0xa5, 0x94, 0xb5, 0xd4, 0xcc, 0xb9, 0xbd, 0x6a,\n+0x35, 0x56, 0x21, 0xde, 0xd8, 0xc3, 0xeb, 0xfb, 0xcb, 0xa4, 0x60, 0x4c, 0xb0, 0x55, 0xa0, 0xa0,\n+0x7b, 0x57, 0xb2, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0, 0x03, 0x02, 0x01, 0x02,\n+0x02, 0x14, 0x78, 0x58, 0x5f, 0x2e, 0xad, 0x2c, 0x19, 0x4b, 0xe3, 0x37, 0x07, 0x35, 0x34, 0x13,\n+0x28, 0xb5, 0x96, 0xd4, 0x65, 0x93, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51,\n+0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31,\n+0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64,\n+0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x20, 0x47, 0x33, 0x30,\n+0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x37, 0x32, 0x37, 0x34, 0x34, 0x5a,\n+0x17, 0x0d, 0x34, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x37, 0x32, 0x37, 0x34, 0x34, 0x5a, 0x30,\n+0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19,\n+0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69,\n+0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x20, 0x47, 0x33, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f,\n+0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa0, 0xbe, 0x50, 0x10, 0x8e, 0xe9,\n+0xf2, 0x6c, 0x40, 0xb4, 0x04, 0x9c, 0x85, 0xb9, 0x31, 0xca, 0xdc, 0x2d, 0xe4, 0x11, 0xa9, 0x04,\n+0x3c, 0x1b, 0x55, 0xc1, 0xe7, 0x58, 0x30, 0x1d, 0x24, 0xb4, 0xc3, 0xef, 0x85, 0xde, 0x8c, 0x2c,\n+0xe1, 0xc1, 0x3d, 0xdf, 0x82, 0xe6, 0x4f, 0xad, 0x47, 0x87, 0x6c, 0xec, 0x5b, 0x49, 0xc1, 0x4a,\n+0xd5, 0xbb, 0x8f, 0xec, 0x87, 0xac, 0x7f, 0x82, 0x9a, 0x86, 0xec, 0x3d, 0x03, 0x99, 0x52, 0x01,\n+0xd2, 0x35, 0x9e, 0xac, 0xda, 0xf0, 0x53, 0xc9, 0x66, 0x3c, 0xd4, 0xac, 0x02, 0x01, 0xda, 0x24,\n+0xd3, 0x3b, 0xa8, 0x02, 0x46, 0xaf, 0xa4, 0x1c, 0xe3, 0xf8, 0x73, 0x58, 0x76, 0xb7, 0xf6, 0x0e,\n+0x90, 0x0d, 0xb5, 0xf0, 0xcf, 0xcc, 0xfa, 0xf9, 0xc6, 0x4c, 0xe5, 0xc3, 0x86, 0x30, 0x0a, 0x8d,\n+0x17, 0x7e, 0x35, 0xeb, 0xc5, 0xdf, 0xbb, 0x0e, 0x9c, 0xc0, 0x8d, 0x87, 0xe3, 0x88, 0x38, 0x85,\n+0x67, 0xfa, 0x3e, 0xc7, 0xab, 0xe0, 0x13, 0x9c, 0x05, 0x18, 0x98, 0xcf, 0x93, 0xf5, 0xb1, 0x92,\n+0xb4, 0xfc, 0x23, 0xd3, 0xcf, 0xd5, 0xc4, 0x27, 0x49, 0xe0, 0x9e, 0x3c, 0x9b, 0x08, 0xa3, 0x8b,\n+0x5d, 0x2a, 0x21, 0xe0, 0xfc, 0x39, 0xaa, 0x53, 0xda, 0x7d, 0x7e, 0xcf, 0x1a, 0x09, 0x53, 0xbc,\n+0x5d, 0x05, 0x04, 0xcf, 0xa1, 0x4a, 0x8f, 0x8b, 0x76, 0x82, 0x0d, 0xa1, 0xf8, 0xd2, 0xc7, 0x14,\n+0x77, 0x5b, 0x90, 0x36, 0x07, 0x81, 0x9b, 0x3e, 0x06, 0xfa, 0x52, 0x5e, 0x63, 0xc5, 0xa6, 0x00,\n+0xfe, 0xa5, 0xe9, 0x52, 0x1b, 0x52, 0xb5, 0x92, 0x39, 0x72, 0x03, 0x09, 0x62, 0xbd, 0xb0, 0x60,\n+0x16, 0x6e, 0xa6, 0xdd, 0x25, 0xc2, 0x03, 0x66, 0xdd, 0xf3, 0x04, 0xd1, 0x40, 0xe2, 0x4e, 0x8b,\n+0x86, 0xf4, 0x6f, 0xe5, 0x83, 0xa0, 0x27, 0x84, 0x5e, 0x04, 0xc1, 0xf5, 0x90, 0xbd, 0x30, 0x3d,\n+0xc4, 0xef, 0xa8, 0x69, 0xbc, 0x38, 0x9b, 0xa4, 0xa4, 0x96, 0xd1, 0x62, 0xda, 0x69, 0xc0, 0x01,\n+0x96, 0xae, 0xcb, 0xc4, 0x51, 0x34, 0xea, 0x0c, 0xaa, 0xff, 0x21, 0x8e, 0x59, 0x8f, 0x4a, 0x5c,\n+0xe4, 0x61, 0x9a, 0xa7, 0xd2, 0xe9, 0x2a, 0x78, 0x8d, 0x51, 0x3d, 0x3a, 0x15, 0xee, 0xa2, 0x59,\n+0x8e, 0xa9, 0x5c, 0xde, 0xc5, 0xf9, 0x90, 0x22, 0xe5, 0x88, 0x45, 0x71, 0xdd, 0x91, 0x99, 0x6c,\n+0x7a, 0x9f, 0x3d, 0x3d, 0x98, 0x7c, 0x5e, 0xf6, 0xbe, 0x16, 0x68, 0xa0, 0x5e, 0xae, 0x0b, 0x23,\n+0xfc, 0x5a, 0x0f, 0xaa, 0x22, 0x76, 0x2d, 0xc9, 0xa1, 0x10, 0x1d, 0xe4, 0xd3, 0x44, 0x23, 0x90,\n+0x88, 0x9f, 0xc6, 0x2a, 0xe6, 0xd7, 0xf5, 0x9a, 0xb3, 0x58, 0x1e, 0x2f, 0x30, 0x89, 0x08, 0x1b,\n+0x54, 0xa2, 0xb5, 0x98, 0x23, 0xec, 0x08, 0x77, 0x1c, 0x95, 0x5d, 0x61, 0xd1, 0xcb, 0x89, 0x9c,\n+0x5f, 0xa2, 0x4a, 0x91, 0x9a, 0xef, 0x21, 0xaa, 0x49, 0x16, 0x08, 0xa8, 0xbd, 0x61, 0x28, 0x31,\n+0xc9, 0x74, 0xad, 0x85, 0xf6, 0xd9, 0xc5, 0xb1, 0x8b, 0xd1, 0xe5, 0x10, 0x32, 0x4d, 0x5f, 0x8b,\n+0x20, 0x3a, 0x3c, 0x49, 0x1f, 0x33, 0x85, 0x59, 0x0d, 0xdb, 0xcb, 0x09, 0x75, 0x43, 0x69, 0x73,\n+0xfb, 0x6b, 0x71, 0x7d, 0xf0, 0xdf, 0xc4, 0x4c, 0x7d, 0xc6, 0xa3, 0x2e, 0xc8, 0x95, 0x79, 0xcb,\n+0x73, 0xa2, 0x8e, 0x4e, 0x4d, 0x24, 0xfb, 0x5e, 0xe4, 0x04, 0xbe, 0x72, 0x1b, 0xa6, 0x27, 0x2d,\n+0x49, 0x5a, 0x99, 0x7a, 0xd7, 0x5c, 0x09, 0x20, 0xb7, 0x7f, 0x94, 0xb9, 0x4f, 0xf1, 0x0d, 0x1c,\n+0x5e, 0x88, 0x42, 0x1b, 0x11, 0xb7, 0xe7, 0x91, 0xdb, 0x9e, 0x6c, 0xf4, 0x6a, 0xdf, 0x8c, 0x06,\n+0x98, 0x03, 0xad, 0xcc, 0x28, 0xef, 0xa5, 0x47, 0xf3, 0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n+0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa3,\n+0x97, 0xd6, 0xf3, 0x5e, 0xa2, 0x10, 0xe1, 0xab, 0x45, 0x9f, 0x3c, 0x17, 0x64, 0x3c, 0xee, 0x01,\n+0x70, 0x9c, 0xcc, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x18, 0xfa, 0x5b, 0x75, 0xfc, 0x3e, 0x7a, 0xc7, 0x5f,\n+0x77, 0xc7, 0xca, 0xdf, 0xcf, 0x5f, 0xc3, 0x12, 0xc4, 0x40, 0x5d, 0xd4, 0x32, 0xaa, 0xb8, 0x6a,\n+0xd7, 0xd5, 0x15, 0x15, 0x46, 0x98, 0x23, 0xa5, 0xe6, 0x90, 0x5b, 0x18, 0x99, 0x4c, 0xe3, 0xad,\n+0x42, 0xa3, 0x82, 0x31, 0x36, 0x88, 0xcd, 0xe9, 0xfb, 0xc4, 0x04, 0x96, 0x48, 0x8b, 0x01, 0xc7,\n+0x8d, 0x01, 0xcf, 0x5b, 0x33, 0x06, 0x96, 0x46, 0x66, 0x74, 0x1d, 0x4f, 0xed, 0xc1, 0xb6, 0xb9,\n+0xb4, 0x0d, 0x61, 0xcc, 0x63, 0x7e, 0xd7, 0x2e, 0x77, 0x8c, 0x96, 0x1c, 0x2a, 0x23, 0x68, 0x6b,\n+0x85, 0x57, 0x76, 0x70, 0x33, 0x13, 0xfe, 0xe1, 0x4f, 0xa6, 0x23, 0x77, 0x18, 0xfa, 0x1a, 0x8c,\n+0xe8, 0xbd, 0x65, 0xc9, 0xcf, 0x3f, 0xf4, 0xc9, 0x17, 0xdc, 0xeb, 0xc7, 0xbc, 0xc0, 0x04, 0x2e,\n+0x2d, 0x46, 0x2f, 0x69, 0x66, 0xc3, 0x1b, 0x8f, 0xfe, 0xec, 0x3e, 0xd3, 0xca, 0x94, 0xbf, 0x76,\n+0x0a, 0x25, 0x0d, 0xa9, 0x7b, 0x02, 0x1c, 0xa9, 0xd0, 0x3b, 0x5f, 0x0b, 0xc0, 0x81, 0x3a, 0x3d,\n+0x64, 0xe1, 0xbf, 0xa7, 0x2d, 0x4e, 0xbd, 0x4d, 0xc4, 0xd8, 0x29, 0xc6, 0x22, 0x18, 0xd0, 0xc5,\n+0xac, 0x72, 0x02, 0x82, 0x3f, 0xaa, 0x3a, 0xa2, 0x3a, 0x22, 0x97, 0x31, 0xdd, 0x08, 0x63, 0xc3,\n+0x75, 0x14, 0xb9, 0x60, 0x28, 0x2d, 0x5b, 0x68, 0xe0, 0x16, 0xa9, 0x66, 0x82, 0x23, 0x51, 0xf5,\n+0xeb, 0x53, 0xd8, 0x31, 0x9b, 0x7b, 0xe9, 0xb7, 0x9d, 0x4b, 0xeb, 0x88, 0x16, 0xcf, 0xf9, 0x5d,\n+0x38, 0x8a, 0x49, 0x30, 0x8f, 0xed, 0xf1, 0xeb, 0x19, 0xf4, 0x77, 0x1a, 0x31, 0x18, 0x4d, 0x67,\n+0x54, 0x6c, 0x2f, 0x6f, 0x65, 0xf9, 0xdb, 0x3d, 0xec, 0x21, 0xec, 0x5e, 0xf4, 0xf4, 0x8b, 0xca,\n+0x60, 0x65, 0x54, 0xd1, 0x71, 0x64, 0xf4, 0xf9, 0xa6, 0xa3, 0x81, 0x33, 0x36, 0x33, 0x71, 0xf0,\n+0xa4, 0x78, 0x5f, 0x4e, 0xad, 0x83, 0x21, 0xde, 0x34, 0x49, 0x8d, 0xe8, 0x59, 0xac, 0x9d, 0xf2,\n+0x76, 0x5a, 0x36, 0xf2, 0x13, 0xf4, 0xaf, 0xe0, 0x09, 0xc7, 0x61, 0x2a, 0x6c, 0xf7, 0xe0, 0x9d,\n+0xae, 0xbb, 0x86, 0x4a, 0x28, 0x6f, 0x2e, 0xee, 0xb4, 0x79, 0xcd, 0x90, 0x33, 0xc3, 0xb3, 0x76,\n+0xfa, 0xf5, 0xf0, 0x6c, 0x9d, 0x01, 0x90, 0xfa, 0x9e, 0x90, 0xf6, 0x9c, 0x72, 0xcf, 0x47, 0xda,\n+0xc3, 0x1f, 0xe4, 0x35, 0x20, 0x53, 0xf2, 0x54, 0xd1, 0xdf, 0x61, 0x83, 0xa6, 0x02, 0xe2, 0x25,\n+0x38, 0xde, 0x85, 0x32, 0x2d, 0x5e, 0x73, 0x90, 0x52, 0x5d, 0x42, 0xc4, 0xce, 0x3d, 0x4b, 0xe1,\n+0xf9, 0x19, 0x84, 0x1d, 0xd5, 0xa2, 0x50, 0xcc, 0x41, 0xfb, 0x41, 0x14, 0xc3, 0xbd, 0xd6, 0xc9,\n+0x5a, 0xa3, 0x63, 0x66, 0x02, 0x80, 0xbd, 0x05, 0x3a, 0x3b, 0x47, 0x9c, 0xec, 0x00, 0x26, 0x4c,\n+0xf5, 0x88, 0x51, 0xbf, 0xa8, 0x23, 0x7f, 0x18, 0x07, 0xb0, 0x0b, 0xed, 0x8b, 0x26, 0xa1, 0x64,\n+0xd3, 0x61, 0x4a, 0xeb, 0x5c, 0x9f, 0xde, 0xb3, 0xaf, 0x67, 0x03, 0xb3, 0x1f, 0xdd, 0x6d, 0x5d,\n+0x69, 0x68, 0x69, 0xab, 0x5e, 0x3a, 0xec, 0x7c, 0x69, 0xbc, 0xc7, 0x3b, 0x85, 0x4e, 0x9e, 0x15,\n+0xb9, 0xb4, 0x15, 0x4f, 0xc3, 0x95, 0x7a, 0x58, 0xd7, 0xc9, 0x6c, 0xe9, 0x6c, 0xb9, 0xf3, 0x29,\n+0x63, 0x5e, 0xb4, 0x2c, 0xf0, 0x2d, 0x3d, 0xed, 0x5a, 0x65, 0xe0, 0xa9, 0x5b, 0x40, 0xc2, 0x48,\n+0x99, 0x81, 0x6d, 0x9e, 0x1f, 0x06, 0x2a, 0x3c, 0x12, 0xb4, 0x8b, 0x0f, 0x9b, 0xa2, 0x24, 0xf0,\n+0xa6, 0x8d, 0xd6, 0x7a, 0xe0, 0x4b, 0xb6, 0x64, 0x96, 0x63, 0x95, 0x84, 0xc2, 0x4a, 0xcd, 0x1c,\n+0x2e, 0x24, 0x87, 0x33, 0x60, 0xe5, 0xc3, 0x30, 0x82, 0x05, 0xb7, 0x30, 0x82, 0x03, 0x9f, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x05, 0x09, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65,\n+0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56,\n+0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x1e,\n+0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x34, 0x31, 0x38, 0x32, 0x37, 0x30, 0x30, 0x5a, 0x17,\n+0x0d, 0x33, 0x31, 0x31, 0x31, 0x32, 0x34, 0x31, 0x38, 0x32, 0x33, 0x33, 0x33, 0x5a, 0x30, 0x45,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30,\n+0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73,\n+0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02,\n+0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x9a, 0x18, 0xca, 0x4b, 0x94, 0x0d, 0x00, 0x2d, 0xaf, 0x03,\n+0x29, 0x8a, 0xf0, 0x0f, 0x81, 0xc8, 0xae, 0x4c, 0x19, 0x85, 0x1d, 0x08, 0x9f, 0xab, 0x29, 0x44,\n+0x85, 0xf3, 0x2f, 0x81, 0xad, 0x32, 0x1e, 0x90, 0x46, 0xbf, 0xa3, 0x86, 0x26, 0x1a, 0x1e, 0xfe,\n+0x7e, 0x1c, 0x18, 0x3a, 0x5c, 0x9c, 0x60, 0x17, 0x2a, 0x3a, 0x74, 0x83, 0x33, 0x30, 0x7d, 0x61,\n+0x54, 0x11, 0xcb, 0xed, 0xab, 0xe0, 0xe6, 0xd2, 0xa2, 0x7e, 0xf5, 0x6b, 0x6f, 0x18, 0xb7, 0x0a,\n+0x0b, 0x2d, 0xfd, 0xe9, 0x3e, 0xef, 0x0a, 0xc6, 0xb3, 0x10, 0xe9, 0xdc, 0xc2, 0x46, 0x17, 0xf8,\n+0x5d, 0xfd, 0xa4, 0xda, 0xff, 0x9e, 0x49, 0x5a, 0x9c, 0xe6, 0x33, 0xe6, 0x24, 0x96, 0xf7, 0x3f,\n+0xba, 0x5b, 0x2b, 0x1c, 0x7a, 0x35, 0xc2, 0xd6, 0x67, 0xfe, 0xab, 0x66, 0x50, 0x8b, 0x6d, 0x28,\n+0x60, 0x2b, 0xef, 0xd7, 0x60, 0xc3, 0xc7, 0x93, 0xbc, 0x8d, 0x36, 0x91, 0xf3, 0x7f, 0xf8, 0xdb,\n+0x11, 0x13, 0xc4, 0x9c, 0x77, 0x76, 0xc1, 0xae, 0xb7, 0x02, 0x6a, 0x81, 0x7a, 0xa9, 0x45, 0x83,\n+0xe2, 0x05, 0xe6, 0xb9, 0x56, 0xc1, 0x94, 0x37, 0x8f, 0x48, 0x71, 0x63, 0x22, 0xec, 0x17, 0x65,\n+0x07, 0x95, 0x8a, 0x4b, 0xdf, 0x8f, 0xc6, 0x5a, 0x0a, 0xe5, 0xb0, 0xe3, 0x5f, 0x5e, 0x6b, 0x11,\n+0xab, 0x0c, 0xf9, 0x85, 0xeb, 0x44, 0xe9, 0xf8, 0x04, 0x73, 0xf2, 0xe9, 0xfe, 0x5c, 0x98, 0x8c,\n+0xf5, 0x73, 0xaf, 0x6b, 0xb4, 0x7e, 0xcd, 0xd4, 0x5c, 0x02, 0x2b, 0x4c, 0x39, 0xe1, 0xb2, 0x95,\n+0x95, 0x2d, 0x42, 0x87, 0xd7, 0xd5, 0xb3, 0x90, 0x43, 0xb7, 0x6c, 0x13, 0xf1, 0xde, 0xdd, 0xf6,\n+0xc4, 0xf8, 0x89, 0x3f, 0xd1, 0x75, 0xf5, 0x92, 0xc3, 0x91, 0xd5, 0x8a, 0x88, 0xd0, 0x90, 0xec,\n+0xdc, 0x6d, 0xde, 0x89, 0xc2, 0x65, 0x71, 0x96, 0x8b, 0x0d, 0x03, 0xfd, 0x9c, 0xbf, 0x5b, 0x16,\n+0xac, 0x92, 0xdb, 0xea, 0xfe, 0x79, 0x7c, 0xad, 0xeb, 0xaf, 0xf7, 0x16, 0xcb, 0xdb, 0xcd, 0x25,\n+0x2b, 0xe5, 0x1f, 0xfb, 0x9a, 0x9f, 0xe2, 0x51, 0xcc, 0x3a, 0x53, 0x0c, 0x48, 0xe6, 0x0e, 0xbd,\n+0xc9, 0xb4, 0x76, 0x06, 0x52, 0xe6, 0x11, 0x13, 0x85, 0x72, 0x63, 0x03, 0x04, 0xe0, 0x04, 0x36,\n+0x2b, 0x20, 0x19, 0x02, 0xe8, 0x74, 0xa7, 0x1f, 0xb6, 0xc9, 0x56, 0x66, 0xf0, 0x75, 0x25, 0xdc,\n+0x67, 0xc1, 0x0e, 0x61, 0x60, 0x88, 0xb3, 0x3e, 0xd1, 0xa8, 0xfc, 0xa3, 0xda, 0x1d, 0xb0, 0xd1,\n+0xb1, 0x23, 0x54, 0xdf, 0x44, 0x76, 0x6d, 0xed, 0x41, 0xd8, 0xc1, 0xb2, 0x22, 0xb6, 0x53, 0x1c,\n+0xdf, 0x35, 0x1d, 0xdc, 0xa1, 0x77, 0x2a, 0x31, 0xe4, 0x2d, 0xf5, 0xe5, 0xe5, 0xdb, 0xc8, 0xe0,\n+0xff, 0xe5, 0x80, 0xd7, 0x0b, 0x63, 0xa0, 0xff, 0x33, 0xa1, 0x0f, 0xba, 0x2c, 0x15, 0x15, 0xea,\n+0x97, 0xb3, 0xd2, 0xa2, 0xb5, 0xbe, 0xf2, 0x8c, 0x96, 0x1e, 0x1a, 0x8f, 0x1d, 0x6c, 0xa4, 0x61,\n+0x37, 0xb9, 0x86, 0x73, 0x33, 0xd7, 0x97, 0x96, 0x9e, 0x23, 0x7d, 0x82, 0xa4, 0x4c, 0x81, 0xe2,\n+0xa1, 0xd1, 0xba, 0x67, 0x5f, 0x95, 0x07, 0xa3, 0x27, 0x11, 0xee, 0x16, 0x10, 0x7b, 0xbc, 0x45,\n+0x4a, 0x4c, 0xb2, 0x04, 0xd2, 0xab, 0xef, 0xd5, 0xfd, 0x0c, 0x51, 0xce, 0x50, 0x6a, 0x08, 0x31,\n+0xf9, 0x91, 0xda, 0x0c, 0x8f, 0x64, 0x5c, 0x03, 0xc3, 0x3a, 0x8b, 0x20, 0x3f, 0x6e, 0x8d, 0x67,\n+0x3d, 0x3a, 0xd6, 0xfe, 0x7d, 0x5b, 0x88, 0xc9, 0x5e, 0xfb, 0xcc, 0x61, 0xdc, 0x8b, 0x33, 0x77,\n+0xd3, 0x44, 0x32, 0x35, 0x09, 0x62, 0x04, 0x92, 0x16, 0x10, 0xd8, 0x9e, 0x27, 0x47, 0xfb, 0x3b,\n+0x21, 0xe3, 0xf8, 0xeb, 0x1d, 0x5b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb0, 0x30, 0x81,\n+0xad, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1a, 0x84, 0x62, 0xbc, 0x48, 0x4c,\n+0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, 0x03, 0xc4, 0x19, 0x46, 0xd1, 0x94, 0x6b, 0x30, 0x6e,\n+0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x1a, 0x84, 0x62, 0xbc, 0x48,\n+0x4c, 0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, 0x03, 0xc4, 0x19, 0x46, 0xd1, 0x94, 0x6b, 0xa1,\n+0x49, 0xa4, 0x47, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f,\n+0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30,\n+0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x82, 0x02, 0x05, 0x09, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02,\n+0x01, 0x00, 0x3e, 0x0a, 0x16, 0x4d, 0x9f, 0x06, 0x5b, 0xa8, 0xae, 0x71, 0x5d, 0x2f, 0x05, 0x2f,\n+0x67, 0xe6, 0x13, 0x45, 0x83, 0xc4, 0x36, 0xf6, 0xf3, 0xc0, 0x26, 0x0c, 0x0d, 0xb5, 0x47, 0x64,\n+0x5d, 0xf8, 0xb4, 0x72, 0xc9, 0x46, 0xa5, 0x03, 0x18, 0x27, 0x55, 0x89, 0x78, 0x7d, 0x76, 0xea,\n+0x96, 0x34, 0x80, 0x17, 0x20, 0xdc, 0xe7, 0x83, 0xf8, 0x8d, 0xfc, 0x07, 0xb8, 0xda, 0x5f, 0x4d,\n+0x2e, 0x67, 0xb2, 0x84, 0xfd, 0xd9, 0x44, 0xfc, 0x77, 0x50, 0x81, 0xe6, 0x7c, 0xb4, 0xc9, 0x0d,\n+0x0b, 0x72, 0x53, 0xf8, 0x76, 0x07, 0x07, 0x41, 0x47, 0x96, 0x0c, 0xfb, 0xe0, 0x82, 0x26, 0x93,\n+0x55, 0x8c, 0xfe, 0x22, 0x1f, 0x60, 0x65, 0x7c, 0x5f, 0xe7, 0x26, 0xb3, 0xf7, 0x32, 0x90, 0x98,\n+0x50, 0xd4, 0x37, 0x71, 0x55, 0xf6, 0x92, 0x21, 0x78, 0xf7, 0x95, 0x79, 0xfa, 0xf8, 0x2d, 0x26,\n+0x87, 0x66, 0x56, 0x30, 0x77, 0xa6, 0x37, 0x78, 0x33, 0x52, 0x10, 0x58, 0xae, 0x3f, 0x61, 0x8e,\n+0xf2, 0x6a, 0xb1, 0xef, 0x18, 0x7e, 0x4a, 0x59, 0x63, 0xca, 0x8d, 0xa2, 0x56, 0xd5, 0xa7, 0x2f,\n+0xbc, 0x56, 0x1f, 0xcf, 0x39, 0xc1, 0xe2, 0xfb, 0x0a, 0xa8, 0x15, 0x2c, 0x7d, 0x4d, 0x7a, 0x63,\n+0xc6, 0x6c, 0x97, 0x44, 0x3c, 0xd2, 0x6f, 0xc3, 0x4a, 0x17, 0x0a, 0xf8, 0x90, 0xd2, 0x57, 0xa2,\n+0x19, 0x51, 0xa5, 0x2d, 0x97, 0x41, 0xda, 0x07, 0x4f, 0xa9, 0x50, 0xda, 0x90, 0x8d, 0x94, 0x46,\n+0xe1, 0x3e, 0xf0, 0x94, 0xfd, 0x10, 0x00, 0x38, 0xf5, 0x3b, 0xe8, 0x40, 0xe1, 0xb4, 0x6e, 0x56,\n+0x1a, 0x20, 0xcc, 0x6f, 0x58, 0x8d, 0xed, 0x2e, 0x45, 0x8f, 0xd6, 0xe9, 0x93, 0x3f, 0xe7, 0xb1,\n+0x2c, 0xdf, 0x3a, 0xd6, 0x22, 0x8c, 0xdc, 0x84, 0xbb, 0x22, 0x6f, 0xd0, 0xf8, 0xe4, 0xc6, 0x39,\n+0xe9, 0x04, 0x88, 0x3c, 0xc3, 0xba, 0xeb, 0x55, 0x7a, 0x6d, 0x80, 0x99, 0x24, 0xf5, 0x6c, 0x01,\n+0xfb, 0xf8, 0x97, 0xb0, 0x94, 0x5b, 0xeb, 0xfd, 0xd2, 0x6f, 0xf1, 0x77, 0x68, 0x0d, 0x35, 0x64,\n+0x23, 0xac, 0xb8, 0x55, 0xa1, 0x03, 0xd1, 0x4d, 0x42, 0x19, 0xdc, 0xf8, 0x75, 0x59, 0x56, 0xa3,\n+0xf9, 0xa8, 0x49, 0x79, 0xf8, 0xaf, 0x0e, 0xb9, 0x11, 0xa0, 0x7c, 0xb7, 0x6a, 0xed, 0x34, 0xd0,\n+0xb6, 0x26, 0x62, 0x38, 0x1a, 0x87, 0x0c, 0xf8, 0xe8, 0xfd, 0x2e, 0xd3, 0x90, 0x7f, 0x07, 0x91,\n+0x2a, 0x1d, 0xd6, 0x7e, 0x5c, 0x85, 0x83, 0x99, 0xb0, 0x38, 0x08, 0x3f, 0xe9, 0x5e, 0xf9, 0x35,\n+0x07, 0xe4, 0xc9, 0x62, 0x6e, 0x57, 0x7f, 0xa7, 0x50, 0x95, 0xf7, 0xba, 0xc8, 0x9b, 0xe6, 0x8e,\n+0xa2, 0x01, 0xc5, 0xd6, 0x66, 0xbf, 0x79, 0x61, 0xf3, 0x3c, 0x1c, 0xe1, 0xb9, 0x82, 0x5c, 0x5d,\n+0xa0, 0xc3, 0xe9, 0xd8, 0x48, 0xbd, 0x19, 0xa2, 0x11, 0x14, 0x19, 0x6e, 0xb2, 0x86, 0x1b, 0x68,\n+0x3e, 0x48, 0x37, 0x1a, 0x88, 0xb7, 0x5d, 0x96, 0x5e, 0x9c, 0xc7, 0xef, 0x27, 0x62, 0x08, 0xe2,\n+0x91, 0x19, 0x5c, 0xd2, 0xf1, 0x21, 0xdd, 0xba, 0x17, 0x42, 0x82, 0x97, 0x71, 0x81, 0x53, 0x31,\n+0xa9, 0x9f, 0xf6, 0x7d, 0x62, 0xbf, 0x72, 0xe1, 0xa3, 0x93, 0x1d, 0xcc, 0x8a, 0x26, 0x5a, 0x09,\n+0x38, 0xd0, 0xce, 0xd7, 0x0d, 0x80, 0x16, 0xb4, 0x78, 0xa5, 0x3a, 0x87, 0x4c, 0x8d, 0x8a, 0xa5,\n+0xd5, 0x46, 0x97, 0xf2, 0x2c, 0x10, 0xb9, 0xbc, 0x54, 0x22, 0xc0, 0x01, 0x50, 0x69, 0x43, 0x9e,\n+0xf4, 0xb2, 0xef, 0x6d, 0xf8, 0xec, 0xda, 0xf1, 0xe3, 0xb1, 0xef, 0xdf, 0x91, 0x8f, 0x54, 0x2a,\n+0x0b, 0x25, 0xc1, 0x26, 0x19, 0xc4, 0x52, 0x10, 0x05, 0x65, 0xd5, 0x82, 0x10, 0xea, 0xc2, 0x31,\n+0xcd, 0x2e, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x14, 0x44, 0x57, 0x34, 0x24, 0x5b, 0x81, 0x89, 0x9b, 0x35, 0xf2, 0xce, 0xb8, 0x2b, 0x3b, 0x5b,\n+0xa7, 0x26, 0xf0, 0x75, 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0b, 0x05, 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75,\n+0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e,\n+0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69,\n+0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x47, 0x33, 0x30, 0x1e,\n+0x17, 0x0d, 0x31, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x38, 0x35, 0x39, 0x33, 0x32, 0x5a, 0x17,\n+0x0d, 0x34, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x38, 0x35, 0x39, 0x33, 0x32, 0x5a, 0x30, 0x48,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30,\n+0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73,\n+0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x47, 0x33, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00,\n+0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa1, 0xae, 0x25, 0xb2, 0x01, 0x18, 0xdc,\n+0x57, 0x88, 0x3f, 0x46, 0xeb, 0xf9, 0xaf, 0xe2, 0xeb, 0x23, 0x71, 0xe2, 0x9a, 0xd1, 0x61, 0x66,\n+0x21, 0x5f, 0xaa, 0xaf, 0x27, 0x51, 0xe5, 0x6e, 0x1b, 0x16, 0xd4, 0x2d, 0x7d, 0x50, 0xb0, 0x53,\n+0x77, 0xbd, 0x78, 0x3a, 0x60, 0xe2, 0x64, 0x02, 0x9b, 0x7c, 0x86, 0x9b, 0xd6, 0x1a, 0x8e, 0xad,\n+0xff, 0x1f, 0x15, 0x7f, 0xd5, 0x95, 0x1e, 0x12, 0xcb, 0xe6, 0x14, 0x84, 0x04, 0xc1, 0xdf, 0x36,\n+0xb3, 0x16, 0x9f, 0x8a, 0xe3, 0xc9, 0xdb, 0x98, 0x34, 0xce, 0xd8, 0x33, 0x17, 0x28, 0x46, 0xfc,\n+0xa7, 0xc9, 0xf0, 0xd2, 0xb4, 0xd5, 0x4d, 0x09, 0x72, 0x49, 0xf9, 0xf2, 0x87, 0xe3, 0xa9, 0xda,\n+0x7d, 0xa1, 0x7d, 0x6b, 0xb2, 0x3a, 0x25, 0xa9, 0x6d, 0x52, 0x44, 0xac, 0xf8, 0xbe, 0x6e, 0xfb,\n+0xdc, 0xa6, 0x73, 0x91, 0x90, 0x61, 0xa6, 0x03, 0x14, 0x20, 0xf2, 0xe7, 0x87, 0xa3, 0x88, 0xad,\n+0xad, 0xa0, 0x8c, 0xff, 0xa6, 0x0b, 0x25, 0x52, 0x25, 0xe7, 0x16, 0x01, 0xd5, 0xcb, 0xb8, 0x35,\n+0x81, 0x0c, 0xa3, 0x3b, 0xf0, 0xe1, 0xe1, 0xfc, 0x5a, 0x5d, 0xce, 0x80, 0x71, 0x6d, 0xf8, 0x49,\n+0xab, 0x3e, 0x3b, 0xba, 0xb8, 0xd7, 0x80, 0x01, 0xfb, 0xa5, 0xeb, 0x5b, 0xb3, 0xc5, 0x5e, 0x60,\n+0x2a, 0x31, 0xa0, 0xaf, 0x37, 0xe8, 0x20, 0x3a, 0x9f, 0xa8, 0x32, 0x2c, 0x0c, 0xcc, 0x09, 0x1d,\n+0xd3, 0x9e, 0x8e, 0x5d, 0xbc, 0x4c, 0x98, 0xee, 0xc5, 0x1a, 0x68, 0x7b, 0xec, 0x53, 0xa6, 0xe9,\n+0x14, 0x35, 0xa3, 0xdf, 0xcd, 0x80, 0x9f, 0x0c, 0x48, 0xfb, 0x1c, 0xf4, 0xf1, 0xbf, 0x4a, 0xb8,\n+0xfa, 0xd5, 0x8c, 0x71, 0x4a, 0xc7, 0x1f, 0xad, 0xfe, 0x41, 0x9a, 0xb3, 0x83, 0x5d, 0xf2, 0x84,\n+0x56, 0xef, 0xa5, 0x57, 0x43, 0xce, 0x29, 0xad, 0x8c, 0xab, 0x55, 0xbf, 0xc4, 0xfb, 0x5b, 0x01,\n+0xdd, 0x23, 0x21, 0xa1, 0x58, 0x00, 0x8e, 0xc3, 0xd0, 0x6a, 0x13, 0xed, 0x13, 0xe3, 0x12, 0x2b,\n+0x80, 0xdc, 0x67, 0xe6, 0x95, 0xb2, 0xcd, 0x1e, 0x22, 0x6e, 0x2a, 0xf8, 0x41, 0xd4, 0xf2, 0xca,\n+0x14, 0x07, 0x8d, 0x8a, 0x55, 0x12, 0xc6, 0x69, 0xf5, 0xb8, 0x86, 0x68, 0x2f, 0x53, 0x5e, 0xb0,\n+0xd2, 0xaa, 0x21, 0xc1, 0x98, 0xe6, 0x30, 0xe3, 0x67, 0x55, 0xc7, 0x9b, 0x6e, 0xac, 0x19, 0xa8,\n+0x55, 0xa6, 0x45, 0x06, 0xd0, 0x23, 0x3a, 0xdb, 0xeb, 0x65, 0x5d, 0x2a, 0x11, 0x11, 0xf0, 0x3b,\n+0x4f, 0xca, 0x6d, 0xf4, 0x34, 0xc4, 0x71, 0xe4, 0xff, 0x00, 0x5a, 0xf6, 0x5c, 0xae, 0x23, 0x60,\n+0x85, 0x73, 0xf1, 0xe4, 0x10, 0xb1, 0x25, 0xae, 0xd5, 0x92, 0xbb, 0x13, 0xc1, 0x0c, 0xe0, 0x39,\n+0xda, 0xb4, 0x39, 0x57, 0xb5, 0xab, 0x35, 0xaa, 0x72, 0x21, 0x3b, 0x83, 0x35, 0xe7, 0x31, 0xdf,\n+0x7a, 0x21, 0x6e, 0xb8, 0x32, 0x08, 0x7d, 0x1d, 0x32, 0x91, 0x15, 0x4a, 0x62, 0x72, 0xcf, 0xe3,\n+0x77, 0xa1, 0xbc, 0xd5, 0x11, 0x1b, 0x76, 0x01, 0x67, 0x08, 0xe0, 0x41, 0x0b, 0xc3, 0xeb, 0x15,\n+0x6e, 0xf8, 0xa4, 0x19, 0xd9, 0xa2, 0xab, 0xaf, 0xe2, 0x27, 0x52, 0x56, 0x2b, 0x02, 0x8a, 0x2c,\n+0x14, 0x24, 0xf9, 0xbf, 0x42, 0x02, 0xbf, 0x26, 0xc8, 0xc6, 0x8f, 0xe0, 0x6e, 0x38, 0x7d, 0x53,\n+0x2d, 0xe5, 0xed, 0x98, 0xb3, 0x95, 0x63, 0x68, 0x7f, 0xf9, 0x35, 0xf4, 0xdf, 0x88, 0xc5, 0x60,\n+0x35, 0x92, 0xc0, 0x7c, 0x69, 0x1c, 0x61, 0x95, 0x16, 0xd0, 0xeb, 0xde, 0x0b, 0xaf, 0x3e, 0x04,\n+0x10, 0x45, 0x65, 0x58, 0x50, 0x38, 0xaf, 0x48, 0xf2, 0x59, 0xb6, 0x16, 0xf2, 0x3c, 0x0d, 0x90,\n+0x02, 0xc6, 0x70, 0x2e, 0x01, 0xad, 0x3c, 0x15, 0xd7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n+0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n+0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n+0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xed, 0xe7,\n+0x6f, 0x76, 0x5a, 0xbf, 0x60, 0xec, 0x49, 0x5b, 0xc6, 0xa5, 0x77, 0xbb, 0x72, 0x16, 0x71, 0x9b,\n+0xc4, 0x3d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n+0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x91, 0xdf, 0x80, 0x3f, 0x43, 0x09, 0x7e, 0x71, 0xc2, 0xf7,\n+0xeb, 0xb3, 0x88, 0x8f, 0xe1, 0x51, 0xb2, 0xbc, 0x3d, 0x75, 0xf9, 0x28, 0x5d, 0xc8, 0xbc, 0x99,\n+0x9b, 0x7b, 0x5d, 0xaa, 0xe5, 0xca, 0xe1, 0x0a, 0xf7, 0xe8, 0xb2, 0xd3, 0x9f, 0xdd, 0x67, 0x31,\n+0x7e, 0xba, 0x01, 0xaa, 0xc7, 0x6a, 0x41, 0x3b, 0x90, 0xd4, 0x08, 0x5c, 0xb2, 0x60, 0x6a, 0x90,\n+0xf0, 0xc8, 0xce, 0x03, 0x62, 0xf9, 0x8b, 0xed, 0xfb, 0x6e, 0x2a, 0xdc, 0x06, 0x4d, 0x3c, 0x29,\n+0x0f, 0x89, 0x16, 0x8a, 0x58, 0x4c, 0x48, 0x0f, 0xe8, 0x84, 0x61, 0xea, 0x3c, 0x72, 0xa6, 0x77,\n+0xe4, 0x42, 0xae, 0x88, 0xa3, 0x43, 0x58, 0x79, 0x7e, 0xae, 0xca, 0xa5, 0x53, 0x0d, 0xa9, 0x3d,\n+0x70, 0xbd, 0x20, 0x19, 0x61, 0xa4, 0x6c, 0x38, 0xfc, 0x43, 0x32, 0xe1, 0xc1, 0x47, 0xff, 0xf8,\n+0xec, 0xf1, 0x11, 0x22, 0x32, 0x96, 0x9c, 0xc2, 0xf6, 0x5b, 0x69, 0x96, 0x7b, 0x20, 0x0c, 0x43,\n+0x41, 0x9a, 0x5b, 0xf6, 0x59, 0x19, 0x88, 0xde, 0x55, 0x88, 0x37, 0x51, 0x0b, 0x78, 0x5c, 0x0a,\n+0x1e, 0xa3, 0x42, 0xfd, 0xc7, 0x9d, 0x88, 0x0f, 0xc0, 0xf2, 0x78, 0x02, 0x24, 0x54, 0x93, 0xaf,\n+0x89, 0x87, 0x88, 0xc9, 0x4a, 0x80, 0x1d, 0xea, 0xd0, 0x6e, 0x3e, 0x61, 0x2e, 0x36, 0xbb, 0x35,\n+0x0e, 0x27, 0x96, 0xfd, 0x66, 0x34, 0x3b, 0x61, 0x72, 0x73, 0xf1, 0x16, 0x5c, 0x47, 0x06, 0x54,\n+0x49, 0x00, 0x7a, 0x58, 0x12, 0xb0, 0x0a, 0xef, 0x85, 0xfd, 0xb1, 0xb8, 0x33, 0x75, 0x6a, 0x93,\n+0x1c, 0x12, 0xe6, 0x60, 0x5e, 0x6f, 0x1d, 0x7f, 0xc9, 0x1f, 0x23, 0xcb, 0x84, 0x61, 0x9f, 0x1e,\n+0x82, 0x44, 0xf9, 0x5f, 0xad, 0x62, 0x55, 0x24, 0x9a, 0x52, 0x98, 0xed, 0x51, 0xe7, 0xa1, 0x7e,\n+0x97, 0x3a, 0xe6, 0x2f, 0x1f, 0x11, 0xda, 0x53, 0x80, 0x2c, 0x85, 0x9e, 0xab, 0x35, 0x10, 0xdb,\n+0x22, 0x5f, 0x6a, 0xc5, 0x5e, 0x97, 0x53, 0xf2, 0x32, 0x02, 0x09, 0x30, 0xa3, 0x58, 0xf0, 0x0d,\n+0x01, 0xd5, 0x72, 0xc6, 0xb1, 0x7c, 0x69, 0x7b, 0xc3, 0xf5, 0x36, 0x45, 0xcc, 0x61, 0x6e, 0x5e,\n+0x4c, 0x94, 0xc5, 0x5e, 0xae, 0xe8, 0x0e, 0x5e, 0x8b, 0xbf, 0xf7, 0xcd, 0xe0, 0xed, 0xa1, 0x0e,\n+0x1b, 0x33, 0xee, 0x54, 0x18, 0xfe, 0x0f, 0xbe, 0xef, 0x7e, 0x84, 0x6b, 0x43, 0xe3, 0x70, 0x98,\n+0xdb, 0x5d, 0x75, 0xb2, 0x0d, 0x59, 0x07, 0x85, 0x15, 0x23, 0x39, 0xd6, 0xf1, 0xdf, 0xa9, 0x26,\n+0x0f, 0xd6, 0x48, 0xc7, 0xb3, 0xa6, 0x22, 0xf5, 0x33, 0x37, 0x5a, 0x95, 0x47, 0x9f, 0x7b, 0xba,\n+0x18, 0x15, 0x6f, 0xff, 0xd6, 0x14, 0x64, 0x83, 0x49, 0xd2, 0x0a, 0x67, 0x21, 0xdb, 0x0f, 0x35,\n+0x63, 0x60, 0x28, 0x22, 0xe3, 0xb1, 0x95, 0x83, 0xcd, 0x85, 0xa6, 0xdd, 0x2f, 0x0f, 0xe7, 0x67,\n+0x52, 0x6e, 0xbb, 0x2f, 0x85, 0x7c, 0xf5, 0x4a, 0x73, 0xe7, 0xc5, 0x3e, 0xc0, 0xbd, 0x21, 0x12,\n+0x05, 0x3f, 0xfc, 0xb7, 0x03, 0x49, 0x02, 0x5b, 0xc8, 0x25, 0xe6, 0xe2, 0x54, 0x38, 0xf5, 0x79,\n+0x87, 0x8c, 0x1d, 0x53, 0xb2, 0x4e, 0x85, 0x7b, 0x06, 0x38, 0xc7, 0x2c, 0xf8, 0xf8, 0xb0, 0x72,\n+0x8d, 0x25, 0xe5, 0x77, 0x52, 0xf4, 0x03, 0x1c, 0x48, 0xa6, 0x50, 0x5f, 0x88, 0x20, 0x30, 0x6e,\n+0xf2, 0x82, 0x43, 0xab, 0x3d, 0x97, 0x84, 0xe7, 0x53, 0xfb, 0x21, 0xc1, 0x4f, 0x0f, 0x22, 0x9a,\n+0x86, 0xb8, 0x59, 0x2a, 0xf6, 0x47, 0x3d, 0x19, 0x88, 0x2d, 0xe8, 0x85, 0xe1, 0x9e, 0xec, 0x85,\n+0x08, 0x6a, 0xb1, 0x6c, 0x34, 0xc9, 0x1d, 0xec, 0x48, 0x2b, 0x3b, 0x78, 0xed, 0x66, 0xc4, 0x8e,\n+0x79, 0x69, 0x83, 0xde, 0x7f, 0x8c, 0x30, 0x82, 0x06, 0x9d, 0x30, 0x82, 0x04, 0x85, 0xa0, 0x03,\n+0x02, 0x01, 0x02, 0x02, 0x02, 0x05, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10,\n+0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,\n+0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61,\n+0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x1e, 0x17,\n+0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x34, 0x31, 0x39, 0x31, 0x31, 0x32, 0x33, 0x5a, 0x17, 0x0d,\n+0x33, 0x31, 0x31, 0x31, 0x32, 0x34, 0x31, 0x39, 0x30, 0x36, 0x34, 0x34, 0x5a, 0x30, 0x45, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20,\n+0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x41, 0x20, 0x33, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a,\n+0x02, 0x82, 0x02, 0x01, 0x00, 0xcc, 0x57, 0x42, 0x16, 0x54, 0x9c, 0xe6, 0x98, 0xd3, 0xd3, 0x4d,\n+0xee, 0xfe, 0xed, 0xc7, 0x9f, 0x43, 0x39, 0x4a, 0x65, 0xb3, 0xe8, 0x16, 0x88, 0x34, 0xdb, 0x0d,\n+0x59, 0x91, 0x74, 0xcf, 0x92, 0xb8, 0x04, 0x40, 0xad, 0x02, 0x4b, 0x31, 0xab, 0xbc, 0x8d, 0x91,\n+0x68, 0xd8, 0x20, 0x0e, 0x1a, 0x01, 0xe2, 0x1a, 0x7b, 0x4e, 0x17, 0x5d, 0xe2, 0x8a, 0xb7, 0x3f,\n+0x99, 0x1a, 0xcd, 0xeb, 0x61, 0xab, 0xc2, 0x65, 0xa6, 0x1f, 0xb7, 0xb7, 0xbd, 0xb7, 0x8f, 0xfc,\n+0xfd, 0x70, 0x8f, 0x0b, 0xa0, 0x67, 0xbe, 0x01, 0xa2, 0x59, 0xcf, 0x71, 0xe6, 0x0f, 0x29, 0x76,\n+0xff, 0xb1, 0x56, 0x79, 0x45, 0x2b, 0x1f, 0x9e, 0x7a, 0x54, 0xe8, 0xa3, 0x29, 0x35, 0x68, 0xa4,\n+0x01, 0x4f, 0x0f, 0xa4, 0x2e, 0x37, 0xef, 0x1b, 0xbf, 0xe3, 0x8f, 0x10, 0xa8, 0x72, 0xab, 0x58,\n+0x57, 0xe7, 0x54, 0x86, 0xc8, 0xc9, 0xf3, 0x5b, 0xda, 0x2c, 0xda, 0x5d, 0x8e, 0x6e, 0x3c, 0xa3,\n+0x3e, 0xda, 0xfb, 0x82, 0xe5, 0xdd, 0xf2, 0x5c, 0xb2, 0x05, 0x33, 0x6f, 0x8a, 0x36, 0xce, 0xd0,\n+0x13, 0x4e, 0xff, 0xbf, 0x4a, 0x0c, 0x34, 0x4c, 0xa6, 0xc3, 0x21, 0xbd, 0x50, 0x04, 0x55, 0xeb,\n+0xb1, 0xbb, 0x9d, 0xfb, 0x45, 0x1e, 0x64, 0x15, 0xde, 0x55, 0x01, 0x8c, 0x02, 0x76, 0xb5, 0xcb,\n+0xa1, 0x3f, 0x42, 0x69, 0xbc, 0x2f, 0xbd, 0x68, 0x43, 0x16, 0x56, 0x89, 0x2a, 0x37, 0x61, 0x91,\n+0xfd, 0xa6, 0xae, 0x4e, 0xc0, 0xcb, 0x14, 0x65, 0x94, 0x37, 0x4b, 0x92, 0x06, 0xef, 0x04, 0xd0,\n+0xc8, 0x9c, 0x88, 0xdb, 0x0b, 0x7b, 0x81, 0xaf, 0xb1, 0x3d, 0x2a, 0xc4, 0x65, 0x3a, 0x78, 0xb6,\n+0xee, 0xdc, 0x80, 0xb1, 0xd2, 0xd3, 0x99, 0x9c, 0x3a, 0xee, 0x6b, 0x5a, 0x6b, 0xb3, 0x8d, 0xb7,\n+0xd5, 0xce, 0x9c, 0xc2, 0xbe, 0xa5, 0x4b, 0x2f, 0x16, 0xb1, 0x9e, 0x68, 0x3b, 0x06, 0x6f, 0xae,\n+0x7d, 0x9f, 0xf8, 0xde, 0xec, 0xcc, 0x29, 0xa7, 0x98, 0xa3, 0x25, 0x43, 0x2f, 0xef, 0xf1, 0x5f,\n+0x26, 0xe1, 0x88, 0x4d, 0xf8, 0x5e, 0x6e, 0xd7, 0xd9, 0x14, 0x6e, 0x19, 0x33, 0x69, 0xa7, 0x3b,\n+0x84, 0x89, 0x93, 0xc4, 0x53, 0x55, 0x13, 0xa1, 0x51, 0x78, 0x40, 0xf8, 0xb8, 0xc9, 0xa2, 0xee,\n+0x7b, 0xba, 0x52, 0x42, 0x83, 0x9e, 0x14, 0xed, 0x05, 0x52, 0x5a, 0x59, 0x56, 0xa7, 0x97, 0xfc,\n+0x9d, 0x3f, 0x0a, 0x29, 0xd8, 0xdc, 0x4f, 0x91, 0x0e, 0x13, 0xbc, 0xde, 0x95, 0xa4, 0xdf, 0x8b,\n+0x99, 0xbe, 0xac, 0x9b, 0x33, 0x88, 0xef, 0xb5, 0x81, 0xaf, 0x1b, 0xc6, 0x22, 0x53, 0xc8, 0xf6,\n+0xc7, 0xee, 0x97, 0x14, 0xb0, 0xc5, 0x7c, 0x78, 0x52, 0xc8, 0xf0, 0xce, 0x6e, 0x77, 0x60, 0x84,\n+0xa6, 0xe9, 0x2a, 0x76, 0x20, 0xed, 0x58, 0x01, 0x17, 0x30, 0x93, 0xe9, 0x1a, 0x8b, 0xe0, 0x73,\n+0x63, 0xd9, 0x6a, 0x92, 0x94, 0x49, 0x4e, 0xb4, 0xad, 0x4a, 0x85, 0xc4, 0xa3, 0x22, 0x30, 0xfc,\n+0x09, 0xed, 0x68, 0x22, 0x73, 0xa6, 0x88, 0x0c, 0x55, 0x21, 0x58, 0xc5, 0xe1, 0x3a, 0x9f, 0x2a,\n+0xdd, 0xca, 0xe1, 0x90, 0xe0, 0xd9, 0x73, 0xab, 0x6c, 0x80, 0xb8, 0xe8, 0x0b, 0x64, 0x93, 0xa0,\n+0x9c, 0x8c, 0x19, 0xff, 0xb3, 0xd2, 0x0c, 0xec, 0x91, 0x26, 0x87, 0x8a, 0xb3, 0xa2, 0xe1, 0x70,\n+0x8f, 0x2c, 0x0a, 0xe5, 0xcd, 0x6d, 0x68, 0x51, 0xeb, 0xda, 0x3f, 0x05, 0x7f, 0x8b, 0x32, 0xe6,\n+0x13, 0x5c, 0x6b, 0xfe, 0x5f, 0x40, 0xe2, 0x22, 0xc8, 0xb4, 0xb4, 0x64, 0x4f, 0xd6, 0xba, 0x7d,\n+0x48, 0x3e, 0xa8, 0x69, 0x0c, 0xd7, 0xbb, 0x86, 0x71, 0xc9, 0x73, 0xb8, 0x3f, 0x3b, 0x9d, 0x25,\n+0x4b, 0xda, 0xff, 0x40, 0xeb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x95, 0x30, 0x82,\n+0x01, 0x91, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n+0x01, 0x01, 0xff, 0x30, 0x81, 0xe1, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x81, 0xd9, 0x30, 0x81,\n+0xd6, 0x30, 0x81, 0xd3, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xbe, 0x58, 0x00, 0x03, 0x30,\n+0x81, 0xc5, 0x30, 0x81, 0x93, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30,\n+0x81, 0x86, 0x1a, 0x81, 0x83, 0x41, 0x6e, 0x79, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20,\n+0x74, 0x68, 0x69, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n+0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61, 0x63, 0x63,\n+0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x51,\n+0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20,\n+0x33, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x50, 0x6f,\n+0x6c, 0x69, 0x63, 0x79, 0x20, 0x2f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n+0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x20, 0x53, 0x74,\n+0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x30, 0x2d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,\n+0x05, 0x07, 0x02, 0x01, 0x16, 0x21, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,\n+0x2e, 0x71, 0x75, 0x6f, 0x76, 0x61, 0x64, 0x69, 0x73, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e,\n+0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x70, 0x73, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xf2,\n+0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb, 0xee, 0x2f, 0x67, 0x32, 0x96, 0x35, 0x5c, 0xdb, 0xb8,\n+0xcb, 0x02, 0xd0, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, 0x14,\n+0xf2, 0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb, 0xee, 0x2f, 0x67, 0x32, 0x96, 0x35, 0x5c, 0xdb,\n+0xb8, 0xcb, 0x02, 0xd0, 0xa1, 0x49, 0xa4, 0x47, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74,\n+0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f,\n+0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x82,\n+0x02, 0x05, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x4f, 0xad, 0xa0, 0x2c, 0x4c, 0xfa, 0xc0, 0xf2, 0x6f,\n+0xf7, 0x66, 0x55, 0xab, 0x23, 0x34, 0xee, 0xe7, 0x29, 0xda, 0xc3, 0x5b, 0xb6, 0xb0, 0x83, 0xd9,\n+0xd0, 0xd0, 0xe2, 0x21, 0xfb, 0xf3, 0x60, 0xa7, 0x3b, 0x5d, 0x60, 0x53, 0x27, 0xa2, 0x9b, 0xf6,\n+0x08, 0x22, 0x2a, 0xe7, 0xbf, 0xa0, 0x72, 0xe5, 0x9c, 0x24, 0x6a, 0x31, 0xb1, 0x90, 0x7a, 0x27,\n+0xdb, 0x84, 0x11, 0x89, 0x27, 0xa6, 0x77, 0x5a, 0x38, 0xd7, 0xbf, 0xac, 0x86, 0xfc, 0xee, 0x5d,\n+0x83, 0xbc, 0x06, 0xc6, 0xd1, 0x77, 0x6b, 0x0f, 0x6d, 0x24, 0x2f, 0x4b, 0x7a, 0x6c, 0xa7, 0x07,\n+0x96, 0xca, 0xe3, 0x84, 0x9f, 0xad, 0x88, 0x8b, 0x1d, 0xab, 0x16, 0x8d, 0x5b, 0x66, 0x17, 0xd9,\n+0x16, 0xf4, 0x8b, 0x80, 0xd2, 0xdd, 0xf8, 0xb2, 0x76, 0xc3, 0xfc, 0x38, 0x13, 0xaa, 0x0c, 0xde,\n+0x42, 0x69, 0x2b, 0x6e, 0xf3, 0x3c, 0xeb, 0x80, 0x27, 0xdb, 0xf5, 0xa6, 0x44, 0x0d, 0x9f, 0x5a,\n+0x55, 0x59, 0x0b, 0xd5, 0x0d, 0x52, 0x48, 0xc5, 0xae, 0x9f, 0xf2, 0x2f, 0x80, 0xc5, 0xea, 0x32,\n+0x50, 0x35, 0x12, 0x97, 0x2e, 0xc1, 0xe1, 0xff, 0xf1, 0x23, 0x88, 0x51, 0x38, 0x9f, 0xf2, 0x66,\n+0x56, 0x76, 0xe7, 0x0f, 0x51, 0x97, 0xa5, 0x52, 0x0c, 0x4d, 0x49, 0x51, 0x95, 0x36, 0x3d, 0xbf,\n+0xa2, 0x4b, 0x0c, 0x10, 0x1d, 0x86, 0x99, 0x4c, 0xaa, 0xf3, 0x72, 0x11, 0x93, 0xe4, 0xea, 0xf6,\n+0x9b, 0xda, 0xa8, 0x5d, 0xa7, 0x4d, 0xb7, 0x9e, 0x02, 0xae, 0x73, 0x00, 0xc8, 0xda, 0x23, 0x03,\n+0xe8, 0xf9, 0xea, 0x19, 0x74, 0x62, 0x00, 0x94, 0xcb, 0x22, 0x20, 0xbe, 0x94, 0xa7, 0x59, 0xb5,\n+0x82, 0x6a, 0xbe, 0x99, 0x79, 0x7a, 0xa9, 0xf2, 0x4a, 0x24, 0x52, 0xf7, 0x74, 0xfd, 0xba, 0x4e,\n+0xe6, 0xa8, 0x1d, 0x02, 0x6e, 0xb1, 0x0d, 0x80, 0x44, 0xc1, 0xae, 0xd3, 0x23, 0x37, 0x5f, 0xbb,\n+0x85, 0x7c, 0x2b, 0x92, 0x2e, 0xe8, 0x7e, 0xa5, 0x8b, 0xdd, 0x99, 0xe1, 0xbf, 0x27, 0x6f, 0x2d,\n+0x5d, 0xaa, 0x7b, 0x87, 0xfe, 0x0a, 0xdd, 0x4b, 0xfc, 0x8e, 0xf5, 0x26, 0xe4, 0x6e, 0x70, 0x42,\n+0x6e, 0x33, 0xec, 0x31, 0x9e, 0x7b, 0x93, 0xc1, 0xe4, 0xc9, 0x69, 0x1a, 0x3d, 0xc0, 0x6b, 0x4e,\n+0x22, 0x6d, 0xee, 0xab, 0x58, 0x4d, 0xc6, 0xd0, 0x41, 0xc1, 0x2b, 0xea, 0x4f, 0x12, 0x87, 0x5e,\n+0xeb, 0x45, 0xd8, 0x6c, 0xf5, 0x98, 0x02, 0xd3, 0xa0, 0xd8, 0x55, 0x8a, 0x06, 0x99, 0x19, 0xa2,\n+0xa0, 0x77, 0xd1, 0x30, 0x9e, 0xac, 0xcc, 0x75, 0xee, 0x83, 0xf5, 0xb0, 0x62, 0x39, 0xcf, 0x6c,\n+0x57, 0xe2, 0x4c, 0xd2, 0x91, 0x0b, 0x0e, 0x75, 0x28, 0x1b, 0x9a, 0xbf, 0xfd, 0x1a, 0x43, 0xf1,\n+0xca, 0x77, 0xfb, 0x3b, 0x8f, 0x61, 0xb8, 0x69, 0x28, 0x16, 0x42, 0x04, 0x5e, 0x70, 0x2a, 0x1c,\n+0x21, 0xd8, 0x8f, 0xe1, 0xbd, 0x23, 0x5b, 0x2d, 0x74, 0x40, 0x92, 0xd9, 0x63, 0x19, 0x0d, 0x73,\n+0xdd, 0x69, 0xbc, 0x62, 0x47, 0xbc, 0xe0, 0x74, 0x2b, 0xb2, 0xeb, 0x7d, 0xbe, 0x41, 0x1b, 0xb5,\n+0xc0, 0x46, 0xc5, 0xa1, 0x22, 0xcb, 0x5f, 0x4e, 0xc1, 0x28, 0x92, 0xde, 0x18, 0xba, 0xd5, 0x2a,\n+0x28, 0xbb, 0x11, 0x8b, 0x17, 0x93, 0x98, 0x99, 0x60, 0x94, 0x5c, 0x23, 0xcf, 0x5a, 0x27, 0x97,\n+0x5e, 0x0b, 0x05, 0x06, 0x93, 0x37, 0x1e, 0x3b, 0x69, 0x36, 0xeb, 0xa9, 0x9e, 0x61, 0x1d, 0x8f,\n+0x32, 0xda, 0x8e, 0x0c, 0xd6, 0x74, 0x3e, 0x7b, 0x09, 0x24, 0xda, 0x01, 0x77, 0x47, 0xc4, 0x3b,\n+0xcd, 0x34, 0x8c, 0x99, 0xf5, 0xca, 0xe1, 0x25, 0x61, 0x33, 0xb2, 0x59, 0x1b, 0xe2, 0x6e, 0xd7,\n+0x37, 0x57, 0xb6, 0x0d, 0xa9, 0x12, 0xda, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x2e, 0xf5, 0x9b, 0x02, 0x28, 0xa7, 0xdb, 0x7a, 0xff, 0xd5,\n+0xa3, 0xa9, 0xee, 0xbd, 0x03, 0xa0, 0xcf, 0x12, 0x6a, 0x1d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69,\n+0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75,\n+0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33,\n+0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32,\n+0x36, 0x33, 0x32, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, 0x36,\n+0x33, 0x32, 0x5a, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f,\n+0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30,\n+0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x20, 0x47, 0x33, 0x30, 0x82, 0x02,\n+0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,\n+0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb3, 0xcb,\n+0x0e, 0x10, 0x67, 0x8e, 0xea, 0x14, 0x97, 0xa7, 0x32, 0x2a, 0x0a, 0x56, 0x36, 0x7f, 0x68, 0x4c,\n+0xc7, 0xb3, 0x6f, 0x3a, 0x23, 0x14, 0x91, 0xff, 0x19, 0x7f, 0xa5, 0xca, 0xac, 0xee, 0xb3, 0x76,\n+0x9d, 0x7a, 0xe9, 0x8b, 0x1b, 0xab, 0x6b, 0x31, 0xdb, 0xfa, 0x0b, 0x53, 0x4c, 0xaf, 0xc5, 0xa5,\n+0x1a, 0x79, 0x3c, 0x8a, 0x4c, 0xff, 0xac, 0xdf, 0x25, 0xde, 0x4e, 0xd9, 0x82, 0x32, 0x0b, 0x44,\n+0xde, 0xca, 0xdb, 0x8c, 0xac, 0xa3, 0x6e, 0x16, 0x83, 0x3b, 0xa6, 0x64, 0x4b, 0x32, 0x89, 0xfb,\n+0x16, 0x16, 0x38, 0x7e, 0xeb, 0x43, 0xe2, 0xd3, 0x74, 0x4a, 0xc2, 0x62, 0x0a, 0x73, 0x0a, 0xdd,\n+0x49, 0xb3, 0x57, 0xd2, 0xb0, 0x0a, 0x85, 0x9d, 0x71, 0x3c, 0xde, 0xa3, 0xcb, 0xc0, 0x32, 0xf3,\n+0x01, 0x39, 0x20, 0x43, 0x1b, 0x35, 0xd1, 0x53, 0xb3, 0xb1, 0xee, 0xc5, 0x93, 0x69, 0x82, 0x3e,\n+0x16, 0xb5, 0x28, 0x46, 0xa1, 0xde, 0xea, 0x89, 0x09, 0xed, 0x43, 0xb8, 0x05, 0x46, 0x8a, 0x86,\n+0xf5, 0x59, 0x47, 0xbe, 0x1b, 0x6f, 0x01, 0x21, 0x10, 0xb9, 0xfd, 0xa9, 0xd2, 0x28, 0xca, 0x10,\n+0x39, 0x09, 0xca, 0x13, 0x36, 0xcf, 0x9c, 0xad, 0xad, 0x40, 0x74, 0x79, 0x2b, 0x02, 0x3f, 0x34,\n+0xff, 0xfa, 0x20, 0x69, 0x7d, 0xd3, 0xee, 0x61, 0xf5, 0xba, 0xb3, 0xe7, 0x30, 0xd0, 0x37, 0x23,\n+0x86, 0x72, 0x61, 0x45, 0x29, 0x48, 0x59, 0x68, 0x6f, 0x77, 0xa6, 0x2e, 0x81, 0xbe, 0x07, 0x4d,\n+0x6f, 0xaf, 0xce, 0xc4, 0x45, 0x13, 0x91, 0x14, 0x70, 0x06, 0x8f, 0x1f, 0x9f, 0xf8, 0x87, 0x69,\n+0xb1, 0x0e, 0xef, 0xc3, 0x89, 0x19, 0xeb, 0xea, 0x1c, 0x61, 0xfc, 0x7a, 0x6c, 0x8a, 0xdc, 0xd6,\n+0x03, 0x0b, 0x9e, 0x26, 0xba, 0x12, 0xdd, 0xd4, 0x54, 0x39, 0xab, 0x26, 0xa3, 0x33, 0xea, 0x75,\n+0x81, 0xda, 0x2d, 0xcd, 0x0f, 0x4f, 0xe4, 0x03, 0xd1, 0xef, 0x15, 0x97, 0x1b, 0x6b, 0x90, 0xc5,\n+0x02, 0x90, 0x93, 0x66, 0x02, 0x21, 0xb1, 0x47, 0xde, 0x8b, 0x9a, 0x4a, 0x80, 0xb9, 0x55, 0x8f,\n+0xb5, 0xa2, 0x2f, 0xc0, 0xd6, 0x33, 0x67, 0xda, 0x7e, 0xc4, 0xa7, 0xb4, 0x04, 0x44, 0xeb, 0x47,\n+0xfb, 0xe6, 0x58, 0xb9, 0xf7, 0x0c, 0xf0, 0x7b, 0x2b, 0xb1, 0xc0, 0x70, 0x29, 0xc3, 0x40, 0x62,\n+0x2d, 0x3b, 0x48, 0x69, 0xdc, 0x23, 0x3c, 0x48, 0xeb, 0x7b, 0x09, 0x79, 0xa9, 0x6d, 0xda, 0xa8,\n+0x30, 0x98, 0xcf, 0x80, 0x72, 0x03, 0x88, 0xa6, 0x5b, 0x46, 0xae, 0x72, 0x79, 0x7c, 0x08, 0x03,\n+0x21, 0x65, 0xae, 0xb7, 0xe1, 0x1c, 0xa5, 0xb1, 0x2a, 0xa2, 0x31, 0xde, 0x66, 0x04, 0xf7, 0xc0,\n+0x74, 0xe8, 0x71, 0xde, 0xff, 0x3d, 0x59, 0xcc, 0x96, 0x26, 0x12, 0x8b, 0x85, 0x95, 0x57, 0x1a,\n+0xab, 0x6b, 0x75, 0x0b, 0x44, 0x3d, 0x11, 0x28, 0x3c, 0x7b, 0x61, 0xb7, 0xe2, 0x8f, 0x67, 0x4f,\n+0xe5, 0xec, 0x3c, 0x4c, 0x60, 0x80, 0x69, 0x57, 0x38, 0x1e, 0x01, 0x5b, 0x8d, 0x55, 0xe8, 0xc7,\n+0xdf, 0xc0, 0xcc, 0x77, 0x23, 0x34, 0x49, 0x75, 0x7c, 0xf6, 0x98, 0x11, 0xeb, 0x2d, 0xde, 0xed,\n+0x41, 0x2e, 0x14, 0x05, 0x02, 0x7f, 0xe0, 0xfe, 0x20, 0xeb, 0x35, 0xe7, 0x11, 0xac, 0x22, 0xce,\n+0x57, 0x3d, 0xde, 0xc9, 0x30, 0x6d, 0x10, 0x03, 0x85, 0xcd, 0xf1, 0xff, 0x8c, 0x16, 0xb5, 0xc1,\n+0xb2, 0x3e, 0x88, 0x6c, 0x60, 0x7f, 0x90, 0x4f, 0x95, 0xf7, 0xf6, 0x2d, 0xad, 0x01, 0x39, 0x07,\n+0x04, 0xfa, 0x75, 0x80, 0x7d, 0xbf, 0x49, 0x50, 0xed, 0xef, 0xc9, 0xc4, 0x7c, 0x1c, 0xeb, 0x80,\n+0x7e, 0xdb, 0xb6, 0xd0, 0xdd, 0x13, 0xfe, 0xc9, 0xd3, 0x9c, 0xd7, 0xb2, 0x97, 0xa9, 0x02, 0x03,\n+0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n+0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n+0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0xc6, 0x17, 0xd0, 0xbc, 0xa8, 0xea, 0x02, 0x43, 0xf2, 0x1b, 0x06, 0x99, 0x5d,\n+0x2b, 0x90, 0x20, 0xb9, 0xd7, 0x9c, 0xe4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x34, 0x61, 0xd9, 0x56, 0xb5,\n+0x12, 0x87, 0x55, 0x4d, 0xdd, 0xa3, 0x35, 0x31, 0x46, 0xbb, 0xa4, 0x07, 0x72, 0xbc, 0x5f, 0x61,\n+0x62, 0xe8, 0xa5, 0xfb, 0x0b, 0x37, 0xb1, 0x3c, 0xb6, 0xb3, 0xfa, 0x29, 0x9d, 0x7f, 0x02, 0xf5,\n+0xa4, 0xc9, 0xa8, 0x93, 0xb7, 0x7a, 0x71, 0x28, 0x69, 0x8f, 0x73, 0xe1, 0x52, 0x90, 0xda, 0xd5,\n+0xbe, 0x3a, 0xe5, 0xb7, 0x76, 0x6a, 0x56, 0x80, 0x21, 0xdf, 0x5d, 0xe6, 0xe9, 0x3a, 0x9e, 0xe5,\n+0x3e, 0xf6, 0xa2, 0x69, 0xc7, 0x2a, 0x0a, 0xb0, 0x18, 0x47, 0xdc, 0x20, 0x70, 0x7d, 0x52, 0xa3,\n+0x3e, 0x59, 0x7c, 0xc1, 0xba, 0xc9, 0xc8, 0x15, 0x40, 0x61, 0xca, 0x72, 0xd6, 0x70, 0xac, 0xd2,\n+0xb7, 0xf0, 0x1c, 0xe4, 0x86, 0x29, 0xf0, 0xce, 0xef, 0x68, 0x63, 0xd0, 0xb5, 0x20, 0x8a, 0x15,\n+0x61, 0x9a, 0x7e, 0x86, 0x98, 0xb4, 0xc9, 0xc2, 0x76, 0xfb, 0xcc, 0xba, 0x30, 0x16, 0xcc, 0xa3,\n+0x61, 0xc6, 0x74, 0x13, 0xe5, 0x6b, 0xef, 0xa3, 0x15, 0xea, 0x03, 0xfe, 0x13, 0x8b, 0x64, 0xe4,\n+0xd3, 0xc1, 0xd2, 0xe8, 0x84, 0xfb, 0x49, 0xd1, 0x10, 0x4d, 0x79, 0x66, 0xeb, 0xaa, 0xfd, 0xf4,\n+0x8d, 0x31, 0x1e, 0x70, 0x14, 0xad, 0xdc, 0xde, 0x67, 0x13, 0x4c, 0x81, 0x15, 0x61, 0xbc, 0xb7,\n+0xd9, 0x91, 0x77, 0x71, 0x19, 0x81, 0x60, 0xbb, 0xf0, 0x58, 0xa5, 0xb5, 0x9c, 0x0b, 0xf7, 0x8f,\n+0x22, 0x55, 0x27, 0xc0, 0x4b, 0x01, 0x6d, 0x3b, 0x99, 0x0d, 0xd4, 0x1d, 0x9b, 0x63, 0x67, 0x2f,\n+0xd0, 0xee, 0x0d, 0xca, 0x66, 0xbc, 0x94, 0x4f, 0xa6, 0xad, 0xed, 0xfc, 0xee, 0x63, 0xac, 0x57,\n+0x3f, 0x65, 0x25, 0xcf, 0xb2, 0x86, 0x8f, 0xd0, 0x08, 0xff, 0xb8, 0x76, 0x14, 0x6e, 0xde, 0xe5,\n+0x27, 0xec, 0xab, 0x78, 0xb5, 0x53, 0xb9, 0xb6, 0x3f, 0xe8, 0x20, 0xf9, 0xd2, 0xa8, 0xbe, 0x61,\n+0x46, 0xca, 0x87, 0x8c, 0x84, 0xf3, 0xf9, 0xf1, 0xa0, 0x68, 0x9b, 0x22, 0x1e, 0x81, 0x26, 0x9b,\n+0x10, 0x04, 0x91, 0x71, 0xc0, 0x06, 0x1f, 0xdc, 0xa0, 0xd3, 0xb9, 0x56, 0xa7, 0xe3, 0x98, 0x2d,\n+0x7f, 0x83, 0x9d, 0xdf, 0x8c, 0x2b, 0x9c, 0x32, 0x8e, 0x32, 0x94, 0xf0, 0x01, 0x3c, 0x22, 0x2a,\n+0x9f, 0x43, 0xc2, 0x2e, 0xc3, 0x98, 0x39, 0x07, 0x38, 0x7b, 0xfc, 0x5e, 0x00, 0x42, 0x1f, 0xf3,\n+0x32, 0x26, 0x79, 0x83, 0x84, 0xf6, 0xe5, 0xf0, 0xc1, 0x51, 0x12, 0xc0, 0x0b, 0x1e, 0x04, 0x23,\n+0x0c, 0x54, 0xa5, 0x4c, 0x2f, 0x49, 0xc5, 0x4a, 0xd1, 0xb6, 0x6e, 0x60, 0x0d, 0x6b, 0xfc, 0x6b,\n+0x8b, 0x85, 0x24, 0x64, 0xb7, 0x89, 0x0e, 0xab, 0x25, 0x47, 0x5b, 0x3c, 0xcf, 0x7e, 0x49, 0xbd,\n+0xc7, 0xe9, 0x0a, 0xc6, 0xda, 0xf7, 0x7e, 0x0e, 0x17, 0x08, 0xd3, 0x48, 0x97, 0xd0, 0x71, 0x92,\n+0xf0, 0x0f, 0x39, 0x3e, 0x34, 0x6a, 0x1c, 0x7d, 0xd8, 0xf2, 0x22, 0xae, 0xbb, 0x69, 0xf4, 0x33,\n+0xb4, 0xa6, 0x48, 0x55, 0xd1, 0x0f, 0x0e, 0x26, 0xe8, 0xec, 0xb6, 0x0b, 0x2d, 0xa7, 0x85, 0x35,\n+0xcd, 0xfd, 0x59, 0xc8, 0x9f, 0xd1, 0xcd, 0x3e, 0x5a, 0x29, 0x34, 0xb9, 0x3d, 0x84, 0xce, 0xb1,\n+0x65, 0xd4, 0x59, 0x91, 0x91, 0x56, 0x75, 0x21, 0xc1, 0x77, 0x9e, 0xf9, 0x7a, 0xe1, 0x60, 0x9d,\n+0xd3, 0xad, 0x04, 0x18, 0xf4, 0x7c, 0xeb, 0x5e, 0x93, 0x8f, 0x53, 0x4a, 0x22, 0x29, 0xf8, 0x48,\n+0x2b, 0x3e, 0x4d, 0x86, 0xac, 0x5b, 0x7f, 0xcb, 0x06, 0x99, 0x59, 0x60, 0xd8, 0x58, 0x65, 0x95,\n+0x8d, 0x44, 0xd1, 0xf7, 0x7f, 0x7e, 0x27, 0x7f, 0x7d, 0xae, 0x80, 0xf5, 0x07, 0x4c, 0xb6, 0x3e,\n+0x9c, 0x71, 0x54, 0x99, 0x04, 0x4b, 0xfd, 0x58, 0xf9, 0x98, 0xf4, 0x30, 0x82, 0x03, 0x6d, 0x30,\n+0x82, 0x02, 0x55, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x22, 0x4a, 0x61, 0x70, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n+0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73,\n+0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x43, 0x41, 0x31, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x34, 0x30, 0x38, 0x30, 0x34,\n+0x35, 0x36, 0x34, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x34, 0x30, 0x38, 0x30, 0x34, 0x35,\n+0x36, 0x34, 0x37, 0x5a, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x4a, 0x50, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x22, 0x4a, 0x61,\n+0x70, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n+0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,\n+0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72,\n+0x65, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x31, 0x30, 0x82,\n+0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xfd,\n+0x77, 0xaa, 0xa5, 0x1c, 0x90, 0x05, 0x3b, 0xcb, 0x4c, 0x9b, 0x33, 0x8b, 0x5a, 0x14, 0x45, 0xa4,\n+0xe7, 0x90, 0x16, 0xd1, 0xdf, 0x57, 0xd2, 0x21, 0x10, 0xa4, 0x17, 0xfd, 0xdf, 0xac, 0xd6, 0x1f,\n+0xa7, 0xe4, 0xdb, 0x7c, 0xf7, 0xec, 0xdf, 0xb8, 0x03, 0xda, 0x94, 0x58, 0xfd, 0x5d, 0x72, 0x7c,\n+0x8c, 0x3f, 0x5f, 0x01, 0x67, 0x74, 0x15, 0x96, 0xe3, 0x02, 0x3c, 0x87, 0xdb, 0xae, 0xcb, 0x01,\n+0x8e, 0xc2, 0xf3, 0x66, 0xc6, 0x85, 0x45, 0xf4, 0x02, 0xc6, 0x3a, 0xb5, 0x62, 0xb2, 0xaf, 0xfa,\n+0x9c, 0xbf, 0xa4, 0xe6, 0xd4, 0x80, 0x30, 0x98, 0xf3, 0x0d, 0xb6, 0x93, 0x8f, 0xa9, 0xd4, 0xd8,\n+0x36, 0xf2, 0xb0, 0xfc, 0x8a, 0xca, 0x2c, 0xa1, 0x15, 0x33, 0x95, 0x31, 0xda, 0xc0, 0x1b, 0xf2,\n+0xee, 0x62, 0x99, 0x86, 0x63, 0x3f, 0xbf, 0xdd, 0x93, 0x2a, 0x83, 0xa8, 0x76, 0xb9, 0x13, 0x1f,\n+0xb7, 0xce, 0x4e, 0x42, 0x85, 0x8f, 0x22, 0xe7, 0x2e, 0x1a, 0xf2, 0x95, 0x09, 0xb2, 0x05, 0xb5,\n+0x44, 0x4e, 0x77, 0xa1, 0x20, 0xbd, 0xa9, 0xf2, 0x4e, 0x0a, 0x7d, 0x50, 0xad, 0xf5, 0x05, 0x0d,\n+0x45, 0x4f, 0x46, 0x71, 0xfd, 0x28, 0x3e, 0x53, 0xfb, 0x04, 0xd8, 0x2d, 0xd7, 0x65, 0x1d, 0x4a,\n+0x1b, 0xfa, 0xcf, 0x3b, 0xb0, 0x31, 0x9a, 0x35, 0x6e, 0xc8, 0x8b, 0x06, 0xd3, 0x00, 0x91, 0xf2,\n+0x94, 0x08, 0x65, 0x4c, 0xb1, 0x34, 0x06, 0x00, 0x7a, 0x89, 0xe2, 0xf0, 0xc7, 0x03, 0x59, 0xcf,\n+0xd5, 0xd6, 0xe8, 0xa7, 0x32, 0xb3, 0xe6, 0x98, 0x40, 0x86, 0xc5, 0xcd, 0x27, 0x12, 0x8b, 0xcc,\n+0x7b, 0xce, 0xb7, 0x11, 0x3c, 0x62, 0x60, 0x07, 0x23, 0x3e, 0x2b, 0x40, 0x6e, 0x94, 0x80, 0x09,\n+0x6d, 0xb6, 0xb3, 0x6f, 0x77, 0x6f, 0x35, 0x08, 0x50, 0xfb, 0x02, 0x87, 0xc5, 0x3e, 0x89, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0x5b, 0xf8, 0x4d, 0x4f, 0xb2, 0xa5, 0x86, 0xd4, 0x3a, 0xd2, 0xf1, 0x63, 0x9a,\n+0xa0, 0xbe, 0x09, 0xf6, 0x57, 0xb7, 0xde, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,\n+0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n+0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa0, 0xa1, 0x38, 0x16,\n+0x66, 0x2e, 0xa7, 0x56, 0x1f, 0x21, 0x9c, 0x06, 0xfa, 0x1d, 0xed, 0xb9, 0x22, 0xc5, 0x38, 0x26,\n+0xd8, 0x4e, 0x4f, 0xec, 0xa3, 0x7f, 0x79, 0xde, 0x46, 0x21, 0xa1, 0x87, 0x77, 0x8f, 0x07, 0x08,\n+0x9a, 0xb2, 0xa4, 0xc5, 0xaf, 0x0f, 0x32, 0x98, 0x0b, 0x7c, 0x66, 0x29, 0xb6, 0x9b, 0x7d, 0x25,\n+0x52, 0x49, 0x43, 0xab, 0x4c, 0x2e, 0x2b, 0x6e, 0x7a, 0x70, 0xaf, 0x16, 0x0e, 0xe3, 0x02, 0x6c,\n+0xfb, 0x42, 0xe6, 0x18, 0x9d, 0x45, 0xd8, 0x55, 0xc8, 0xe8, 0x3b, 0xdd, 0xe7, 0xe1, 0xf4, 0x2e,\n+0x0b, 0x1c, 0x34, 0x5c, 0x6c, 0x58, 0x4a, 0xfb, 0x8c, 0x88, 0x50, 0x5f, 0x95, 0x1c, 0xbf, 0xed,\n+0xab, 0x22, 0xb5, 0x65, 0xb3, 0x85, 0xba, 0x9e, 0x0f, 0xb8, 0xad, 0xe5, 0x7a, 0x1b, 0x8a, 0x50,\n+0x3a, 0x1d, 0xbd, 0x0d, 0xbc, 0x7b, 0x54, 0x50, 0x0b, 0xb9, 0x42, 0xaf, 0x55, 0xa0, 0x18, 0x81,\n+0xad, 0x65, 0x99, 0xef, 0xbe, 0xe4, 0x9c, 0xbf, 0xc4, 0x85, 0xab, 0x41, 0xb2, 0x54, 0x6f, 0xdc,\n+0x25, 0xcd, 0xed, 0x78, 0xe2, 0x8e, 0x0c, 0x8d, 0x09, 0x49, 0xdd, 0x63, 0x7b, 0x5a, 0x69, 0x96,\n+0x02, 0x21, 0xa8, 0xbd, 0x52, 0x59, 0xe9, 0x7d, 0x35, 0xcb, 0xc8, 0x52, 0xca, 0x7f, 0x81, 0xfe,\n+0xd9, 0x6b, 0xd3, 0xf7, 0x11, 0xed, 0x25, 0xdf, 0xf8, 0xe7, 0xf9, 0xa4, 0xfa, 0x72, 0x97, 0x84,\n+0x53, 0x0d, 0xa5, 0xd0, 0x32, 0x18, 0x51, 0x76, 0x59, 0x14, 0x6c, 0x0f, 0xeb, 0xec, 0x5f, 0x80,\n+0x8c, 0x75, 0x43, 0x83, 0xc3, 0x85, 0x98, 0xff, 0x4c, 0x9e, 0x2d, 0x0d, 0xe4, 0x77, 0x83, 0x93,\n+0x4e, 0xb5, 0x96, 0x07, 0x8b, 0x28, 0x13, 0x9b, 0x8c, 0x19, 0x8d, 0x41, 0x27, 0x49, 0x40, 0xee,\n+0xde, 0xe6, 0x23, 0x44, 0x39, 0xdc, 0xa1, 0x22, 0xd6, 0xba, 0x03, 0xf2, 0x30, 0x82, 0x03, 0x5a,\n+0x30, 0x82, 0x02, 0x42, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x50, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x0f, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x2e, 0x6e, 0x65, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53,\n+0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63,\n+0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30, 0x1e, 0x17,\n+0x0d, 0x30, 0x33, 0x30, 0x39, 0x33, 0x30, 0x30, 0x34, 0x32, 0x30, 0x34, 0x39, 0x5a, 0x17, 0x0d,\n+0x32, 0x33, 0x30, 0x39, 0x33, 0x30, 0x30, 0x34, 0x32, 0x30, 0x34, 0x39, 0x5a, 0x30, 0x50, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x18, 0x30, 0x16,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75,\n+0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,\n+0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e,\n+0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30,\n+0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n+0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00,\n+0xb3, 0xb3, 0xfe, 0x7f, 0xd3, 0x6d, 0xb1, 0xef, 0x16, 0x7c, 0x57, 0xa5, 0x0c, 0x6d, 0x76, 0x8a,\n+0x2f, 0x4b, 0xbf, 0x64, 0xfb, 0x4c, 0xee, 0x8a, 0xf0, 0xf3, 0x29, 0x7c, 0xf5, 0xff, 0xee, 0x2a,\n+0xe0, 0xe9, 0xe9, 0xba, 0x5b, 0x64, 0x22, 0x9a, 0x9a, 0x6f, 0x2c, 0x3a, 0x26, 0x69, 0x51, 0x05,\n+0x99, 0x26, 0xdc, 0xd5, 0x1c, 0x6a, 0x71, 0xc6, 0x9a, 0x7d, 0x1e, 0x9d, 0xdd, 0x7c, 0x6c, 0xc6,\n+0x8c, 0x67, 0x67, 0x4a, 0x3e, 0xf8, 0x71, 0xb0, 0x19, 0x27, 0xa9, 0x09, 0x0c, 0xa6, 0x95, 0xbf,\n+0x4b, 0x8c, 0x0c, 0xfa, 0x55, 0x98, 0x3b, 0xd8, 0xe8, 0x22, 0xa1, 0x4b, 0x71, 0x38, 0x79, 0xac,\n+0x97, 0x92, 0x69, 0xb3, 0x89, 0x7e, 0xea, 0x21, 0x68, 0x06, 0x98, 0x14, 0x96, 0x87, 0xd2, 0x61,\n+0x36, 0xbc, 0x6d, 0x27, 0x56, 0x9e, 0x57, 0xee, 0xc0, 0xc0, 0x56, 0xfd, 0x32, 0xcf, 0xa4, 0xd9,\n+0x8e, 0xc2, 0x23, 0xd7, 0x8d, 0xa8, 0xf3, 0xd8, 0x25, 0xac, 0x97, 0xe4, 0x70, 0x38, 0xf4, 0xb6,\n+0x3a, 0xb4, 0x9d, 0x3b, 0x97, 0x26, 0x43, 0xa3, 0xa1, 0xbc, 0x49, 0x59, 0x72, 0x4c, 0x23, 0x30,\n+0x87, 0x01, 0x58, 0xf6, 0x4e, 0xbe, 0x1c, 0x68, 0x56, 0x66, 0xaf, 0xcd, 0x41, 0x5d, 0xc8, 0xb3,\n+0x4d, 0x2a, 0x55, 0x46, 0xab, 0x1f, 0xda, 0x1e, 0xe2, 0x40, 0x3d, 0xdb, 0xcd, 0x7d, 0xb9, 0x92,\n+0x80, 0x9c, 0x37, 0xdd, 0x0c, 0x96, 0x64, 0x9d, 0xdc, 0x22, 0xf7, 0x64, 0x8b, 0xdf, 0x61, 0xde,\n+0x15, 0x94, 0x52, 0x15, 0xa0, 0x7d, 0x52, 0xc9, 0x4b, 0xa8, 0x21, 0xc9, 0xc6, 0xb1, 0xed, 0xcb,\n+0xc3, 0x95, 0x60, 0xd1, 0x0f, 0xf0, 0xab, 0x70, 0xf8, 0xdf, 0xcb, 0x4d, 0x7e, 0xec, 0xd6, 0xfa,\n+0xab, 0xd9, 0xbd, 0x7f, 0x54, 0xf2, 0xa5, 0xe9, 0x79, 0xfa, 0xd9, 0xd6, 0x76, 0x24, 0x28, 0x73,\n+0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x3f, 0x30, 0x3d, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\n+0x04, 0x16, 0x04, 0x14, 0xa0, 0x73, 0x49, 0x99, 0x68, 0xdc, 0x85, 0x5b, 0x65, 0xe3, 0x9b, 0x28,\n+0x2f, 0x57, 0x9f, 0xbd, 0x33, 0xbc, 0x07, 0x48, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x68, 0x40, 0xa9, 0xa8, 0xbb, 0xe4,\n+0x4f, 0x5d, 0x79, 0xb3, 0x05, 0xb5, 0x17, 0xb3, 0x60, 0x13, 0xeb, 0xc6, 0x92, 0x5d, 0xe0, 0xd1,\n+0xd3, 0x6a, 0xfe, 0xfb, 0xbe, 0x9b, 0x6d, 0xbf, 0xc7, 0x05, 0x6d, 0x59, 0x20, 0xc4, 0x1c, 0xf0,\n+0xb7, 0xda, 0x84, 0x58, 0x02, 0x63, 0xfa, 0x48, 0x16, 0xef, 0x4f, 0xa5, 0x0b, 0xf7, 0x4a, 0x98,\n+0xf2, 0x3f, 0x9e, 0x1b, 0xad, 0x47, 0x6b, 0x63, 0xce, 0x08, 0x47, 0xeb, 0x52, 0x3f, 0x78, 0x9c,\n+0xaf, 0x4d, 0xae, 0xf8, 0xd5, 0x4f, 0xcf, 0x9a, 0x98, 0x2a, 0x10, 0x41, 0x39, 0x52, 0xc4, 0xdd,\n+0xd9, 0x9b, 0x0e, 0xef, 0x93, 0x01, 0xae, 0xb2, 0x2e, 0xca, 0x68, 0x42, 0x24, 0x42, 0x6c, 0xb0,\n+0xb3, 0x3a, 0x3e, 0xcd, 0xe9, 0xda, 0x48, 0xc4, 0x15, 0xcb, 0xe9, 0xf9, 0x07, 0x0f, 0x92, 0x50,\n+0x49, 0x8a, 0xdd, 0x31, 0x97, 0x5f, 0xc9, 0xe9, 0x37, 0xaa, 0x3b, 0x59, 0x65, 0x97, 0x94, 0x32,\n+0xc9, 0xb3, 0x9f, 0x3e, 0x3a, 0x62, 0x58, 0xc5, 0x49, 0xad, 0x62, 0x0e, 0x71, 0xa5, 0x32, 0xaa,\n+0x2f, 0xc6, 0x89, 0x76, 0x43, 0x40, 0x13, 0x13, 0x67, 0x3d, 0xa2, 0x54, 0x25, 0x10, 0xcb, 0xf1,\n+0x3a, 0xf2, 0xd9, 0xfa, 0xdb, 0x49, 0x56, 0xbb, 0xa6, 0xfe, 0xa7, 0x41, 0x35, 0xc3, 0xe0, 0x88,\n+0x61, 0xc9, 0x88, 0xc7, 0xdf, 0x36, 0x10, 0x22, 0x98, 0x59, 0xea, 0xb0, 0x4a, 0xfb, 0x56, 0x16,\n+0x73, 0x6e, 0xac, 0x4d, 0xf7, 0x22, 0xa1, 0x4f, 0xad, 0x1d, 0x7a, 0x2d, 0x45, 0x27, 0xe5, 0x30,\n+0xc1, 0x5e, 0xf2, 0xda, 0x13, 0xcb, 0x25, 0x42, 0x51, 0x95, 0x47, 0x03, 0x8c, 0x6c, 0x21, 0xcc,\n+0x74, 0x42, 0xed, 0x53, 0xff, 0x33, 0x8b, 0x8f, 0x0f, 0x57, 0x01, 0x16, 0x2f, 0xcf, 0xa6, 0xee,\n+0xc9, 0x70, 0x22, 0x14, 0xbd, 0xfd, 0xbe, 0x6c, 0x0b, 0x03, 0x30, 0x82, 0x03, 0x77, 0x30, 0x82,\n+0x02, 0x5f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53,\n+0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31,\n+0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69,\n+0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x35,\n+0x32, 0x39, 0x30, 0x35, 0x30, 0x30, 0x33, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x35, 0x32,\n+0x39, 0x30, 0x35, 0x30, 0x30, 0x33, 0x39, 0x5a, 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x79,\n+0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x27,\n+0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,\n+0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,\n+0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd0, 0x15, 0x39, 0x52, 0xb1, 0x52, 0xb3, 0xba,\n+0xc5, 0x59, 0x82, 0xc4, 0x5d, 0x52, 0xae, 0x3a, 0x43, 0x65, 0x80, 0x4b, 0xc7, 0xf2, 0x96, 0xbc,\n+0xdb, 0x36, 0x97, 0xd6, 0xa6, 0x64, 0x8c, 0xa8, 0x5e, 0xf0, 0xe3, 0x0a, 0x1c, 0xf7, 0xdf, 0x97,\n+0x3d, 0x4b, 0xae, 0xf6, 0x5d, 0xec, 0x21, 0xb5, 0x41, 0xab, 0xcd, 0xb9, 0x7e, 0x76, 0x9f, 0xbe,\n+0xf9, 0x3e, 0x36, 0x34, 0xa0, 0x3b, 0xc1, 0xf6, 0x31, 0x11, 0x45, 0x74, 0x93, 0x3d, 0x57, 0x80,\n+0xc5, 0xf9, 0x89, 0x99, 0xca, 0xe5, 0xab, 0x6a, 0xd4, 0xb5, 0xda, 0x41, 0x90, 0x10, 0xc1, 0xd6,\n+0xd6, 0x42, 0x89, 0xc2, 0xbf, 0xf4, 0x38, 0x12, 0x95, 0x4c, 0x54, 0x05, 0xf7, 0x36, 0xe4, 0x45,\n+0x83, 0x7b, 0x14, 0x65, 0xd6, 0xdc, 0x0c, 0x4d, 0xd1, 0xde, 0x7e, 0x0c, 0xab, 0x3b, 0xc4, 0x15,\n+0xbe, 0x3a, 0x56, 0xa6, 0x5a, 0x6f, 0x76, 0x69, 0x52, 0xa9, 0x7a, 0xb9, 0xc8, 0xeb, 0x6a, 0x9a,\n+0x5d, 0x52, 0xd0, 0x2d, 0x0a, 0x6b, 0x35, 0x16, 0x09, 0x10, 0x84, 0xd0, 0x6a, 0xca, 0x3a, 0x06,\n+0x00, 0x37, 0x47, 0xe4, 0x7e, 0x57, 0x4f, 0x3f, 0x8b, 0xeb, 0x67, 0xb8, 0x88, 0xaa, 0xc5, 0xbe,\n+0x53, 0x55, 0xb2, 0x91, 0xc4, 0x7d, 0xb9, 0xb0, 0x85, 0x19, 0x06, 0x78, 0x2e, 0xdb, 0x61, 0x1a,\n+0xfa, 0x85, 0xf5, 0x4a, 0x91, 0xa1, 0xe7, 0x16, 0xd5, 0x8e, 0xa2, 0x39, 0xdf, 0x94, 0xb8, 0x70,\n+0x1f, 0x28, 0x3f, 0x8b, 0xfc, 0x40, 0x5e, 0x63, 0x83, 0x3c, 0x83, 0x2a, 0x1a, 0x99, 0x6b, 0xcf,\n+0xde, 0x59, 0x6a, 0x3b, 0xfc, 0x6f, 0x16, 0xd7, 0x1f, 0xfd, 0x4a, 0x10, 0xeb, 0x4e, 0x82, 0x16,\n+0x3a, 0xac, 0x27, 0x0c, 0x53, 0xf1, 0xad, 0xd5, 0x24, 0xb0, 0x6b, 0x03, 0x50, 0xc1, 0x2d, 0x3c,\n+0x16, 0xdd, 0x44, 0x34, 0x27, 0x1a, 0x75, 0xfb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30,\n+0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x0a, 0x85, 0xa9, 0x77,\n+0x65, 0x05, 0x98, 0x7c, 0x40, 0x81, 0xf8, 0x0f, 0x97, 0x2c, 0x38, 0xf1, 0x0a, 0xec, 0x3c, 0xcf,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n+0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n+0x03, 0x82, 0x01, 0x01, 0x00, 0x4c, 0x3a, 0xa3, 0x44, 0xac, 0xb9, 0x45, 0xb1, 0xc7, 0x93, 0x7e,\n+0xc8, 0x0b, 0x0a, 0x42, 0xdf, 0x64, 0xea, 0x1c, 0xee, 0x59, 0x6c, 0x08, 0xba, 0x89, 0x5f, 0x6a,\n+0xca, 0x4a, 0x95, 0x9e, 0x7a, 0x8f, 0x07, 0xc5, 0xda, 0x45, 0x72, 0x82, 0x71, 0x0e, 0x3a, 0xd2,\n+0xcc, 0x6f, 0xa7, 0xb4, 0xa1, 0x23, 0xbb, 0xf6, 0x24, 0x9f, 0xcb, 0x17, 0xfe, 0x8c, 0xa6, 0xce,\n+0xc2, 0xd2, 0xdb, 0xcc, 0x8d, 0xfc, 0x71, 0xfc, 0x03, 0x29, 0xc1, 0x6c, 0x5d, 0x33, 0x5f, 0x64,\n+0xb6, 0x65, 0x3b, 0x89, 0x6f, 0x18, 0x76, 0x78, 0xf5, 0xdc, 0xa2, 0x48, 0x1f, 0x19, 0x3f, 0x8e,\n+0x93, 0xeb, 0xf1, 0xfa, 0x17, 0xee, 0xcd, 0x4e, 0xe3, 0x04, 0x12, 0x55, 0xd6, 0xe5, 0xe4, 0xdd,\n+0xfb, 0x3e, 0x05, 0x7c, 0xe2, 0x1d, 0x5e, 0xc6, 0xa7, 0xbc, 0x97, 0x4f, 0x68, 0x3a, 0xf5, 0xe9,\n+0x2e, 0x0a, 0x43, 0xb6, 0xaf, 0x57, 0x5c, 0x62, 0x68, 0x7c, 0xb7, 0xfd, 0xa3, 0x8a, 0x84, 0xa0,\n+0xac, 0x62, 0xbe, 0x2b, 0x09, 0x87, 0x34, 0xf0, 0x6a, 0x01, 0xbb, 0x9b, 0x29, 0x56, 0x3c, 0xfe,\n+0x00, 0x37, 0xcf, 0x23, 0x6c, 0xf1, 0x4e, 0xaa, 0xb6, 0x74, 0x46, 0x12, 0x6c, 0x91, 0xee, 0x34,\n+0xd5, 0xec, 0x9a, 0x91, 0xe7, 0x44, 0xbe, 0x90, 0x31, 0x72, 0xd5, 0x49, 0x02, 0xf6, 0x02, 0xe5,\n+0xf4, 0x1f, 0xeb, 0x7c, 0xd9, 0x96, 0x55, 0xa9, 0xff, 0xec, 0x8a, 0xf9, 0x99, 0x47, 0xff, 0x35,\n+0x5a, 0x02, 0xaa, 0x04, 0xcb, 0x8a, 0x5b, 0x87, 0x71, 0x29, 0x91, 0xbd, 0xa4, 0xb4, 0x7a, 0x0d,\n+0xbd, 0x9a, 0xf5, 0x57, 0x23, 0x00, 0x07, 0x21, 0x17, 0x3f, 0x4a, 0x39, 0xd1, 0x05, 0x49, 0x0b,\n+0xa7, 0xb6, 0x37, 0x81, 0xa5, 0x5d, 0x8c, 0xaa, 0x33, 0x5e, 0x81, 0x28, 0x7c, 0xa7, 0x7d, 0x27,\n+0xeb, 0x00, 0xae, 0x8d, 0x37, 0x30, 0x82, 0x05, 0xd8, 0x30, 0x82, 0x03, 0xc0, 0xa0, 0x03, 0x02,\n+0x01, 0x02, 0x02, 0x10, 0x4c, 0xaa, 0xf9, 0xca, 0xdb, 0x63, 0x6f, 0xe0, 0x1f, 0xf7, 0x4e, 0xd8,\n+0x5b, 0x03, 0x86, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0c, 0x05, 0x00, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72,\n+0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72,\n+0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f,\n+0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d,\n+0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b,\n+0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20,\n+0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n+0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x30, 0x30, 0x31, 0x31, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38,\n+0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x85, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06,\n+0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61,\n+0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04,\n+0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c,\n+0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,\n+0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n+0x82, 0x02, 0x01, 0x00, 0x91, 0xe8, 0x54, 0x92, 0xd2, 0x0a, 0x56, 0xb1, 0xac, 0x0d, 0x24, 0xdd,\n+0xc5, 0xcf, 0x44, 0x67, 0x74, 0x99, 0x2b, 0x37, 0xa3, 0x7d, 0x23, 0x70, 0x00, 0x71, 0xbc, 0x53,\n+0xdf, 0xc4, 0xfa, 0x2a, 0x12, 0x8f, 0x4b, 0x7f, 0x10, 0x56, 0xbd, 0x9f, 0x70, 0x72, 0xb7, 0x61,\n+0x7f, 0xc9, 0x4b, 0x0f, 0x17, 0xa7, 0x3d, 0xe3, 0xb0, 0x04, 0x61, 0xee, 0xff, 0x11, 0x97, 0xc7,\n+0xf4, 0x86, 0x3e, 0x0a, 0xfa, 0x3e, 0x5c, 0xf9, 0x93, 0xe6, 0x34, 0x7a, 0xd9, 0x14, 0x6b, 0xe7,\n+0x9c, 0xb3, 0x85, 0xa0, 0x82, 0x7a, 0x76, 0xaf, 0x71, 0x90, 0xd7, 0xec, 0xfd, 0x0d, 0xfa, 0x9c,\n+0x6c, 0xfa, 0xdf, 0xb0, 0x82, 0xf4, 0x14, 0x7e, 0xf9, 0xbe, 0xc4, 0xa6, 0x2f, 0x4f, 0x7f, 0x99,\n+0x7f, 0xb5, 0xfc, 0x67, 0x43, 0x72, 0xbd, 0x0c, 0x00, 0xd6, 0x89, 0xeb, 0x6b, 0x2c, 0xd3, 0xed,\n+0x8f, 0x98, 0x1c, 0x14, 0xab, 0x7e, 0xe5, 0xe3, 0x6e, 0xfc, 0xd8, 0xa8, 0xe4, 0x92, 0x24, 0xda,\n+0x43, 0x6b, 0x62, 0xb8, 0x55, 0xfd, 0xea, 0xc1, 0xbc, 0x6c, 0xb6, 0x8b, 0xf3, 0x0e, 0x8d, 0x9a,\n+0xe4, 0x9b, 0x6c, 0x69, 0x99, 0xf8, 0x78, 0x48, 0x30, 0x45, 0xd5, 0xad, 0xe1, 0x0d, 0x3c, 0x45,\n+0x60, 0xfc, 0x32, 0x96, 0x51, 0x27, 0xbc, 0x67, 0xc3, 0xca, 0x2e, 0xb6, 0x6b, 0xea, 0x46, 0xc7,\n+0xc7, 0x20, 0xa0, 0xb1, 0x1f, 0x65, 0xde, 0x48, 0x08, 0xba, 0xa4, 0x4e, 0xa9, 0xf2, 0x83, 0x46,\n+0x37, 0x84, 0xeb, 0xe8, 0xcc, 0x81, 0x48, 0x43, 0x67, 0x4e, 0x72, 0x2a, 0x9b, 0x5c, 0xbd, 0x4c,\n+0x1b, 0x28, 0x8a, 0x5c, 0x22, 0x7b, 0xb4, 0xab, 0x98, 0xd9, 0xee, 0xe0, 0x51, 0x83, 0xc3, 0x09,\n+0x46, 0x4e, 0x6d, 0x3e, 0x99, 0xfa, 0x95, 0x17, 0xda, 0x7c, 0x33, 0x57, 0x41, 0x3c, 0x8d, 0x51,\n+0xed, 0x0b, 0xb6, 0x5c, 0xaf, 0x2c, 0x63, 0x1a, 0xdf, 0x57, 0xc8, 0x3f, 0xbc, 0xe9, 0x5d, 0xc4,\n+0x9b, 0xaf, 0x45, 0x99, 0xe2, 0xa3, 0x5a, 0x24, 0xb4, 0xba, 0xa9, 0x56, 0x3d, 0xcf, 0x6f, 0xaa,\n+0xff, 0x49, 0x58, 0xbe, 0xf0, 0xa8, 0xff, 0xf4, 0xb8, 0xad, 0xe9, 0x37, 0xfb, 0xba, 0xb8, 0xf4,\n+0x0b, 0x3a, 0xf9, 0xe8, 0x43, 0x42, 0x1e, 0x89, 0xd8, 0x84, 0xcb, 0x13, 0xf1, 0xd9, 0xbb, 0xe1,\n+0x89, 0x60, 0xb8, 0x8c, 0x28, 0x56, 0xac, 0x14, 0x1d, 0x9c, 0x0a, 0xe7, 0x71, 0xeb, 0xcf, 0x0e,\n+0xdd, 0x3d, 0xa9, 0x96, 0xa1, 0x48, 0xbd, 0x3c, 0xf7, 0xaf, 0xb5, 0x0d, 0x22, 0x4c, 0xc0, 0x11,\n+0x81, 0xec, 0x56, 0x3b, 0xf6, 0xd3, 0xa2, 0xe2, 0x5b, 0xb7, 0xb2, 0x04, 0x22, 0x52, 0x95, 0x80,\n+0x93, 0x69, 0xe8, 0x8e, 0x4c, 0x65, 0xf1, 0x91, 0x03, 0x2d, 0x70, 0x74, 0x02, 0xea, 0x8b, 0x67,\n+0x15, 0x29, 0x69, 0x52, 0x02, 0xbb, 0xd7, 0xdf, 0x50, 0x6a, 0x55, 0x46, 0xbf, 0xa0, 0xa3, 0x28,\n+0x61, 0x7f, 0x70, 0xd0, 0xc3, 0xa2, 0xaa, 0x2c, 0x21, 0xaa, 0x47, 0xce, 0x28, 0x9c, 0x06, 0x45,\n+0x76, 0xbf, 0x82, 0x18, 0x27, 0xb4, 0xd5, 0xae, 0xb4, 0xcb, 0x50, 0xe6, 0x6b, 0xf4, 0x4c, 0x86,\n+0x71, 0x30, 0xe9, 0xa6, 0xdf, 0x16, 0x86, 0xe0, 0xd8, 0xff, 0x40, 0xdd, 0xfb, 0xd0, 0x42, 0x88,\n+0x7f, 0xa3, 0x33, 0x3a, 0x2e, 0x5c, 0x1e, 0x41, 0x11, 0x81, 0x63, 0xce, 0x18, 0x71, 0x6b, 0x2b,\n+0xec, 0xa6, 0x8a, 0xb7, 0x31, 0x5c, 0x3a, 0x6a, 0x47, 0xe0, 0xc3, 0x79, 0x59, 0xd6, 0x20, 0x1a,\n+0xaf, 0xf2, 0x6a, 0x98, 0xaa, 0x72, 0xbc, 0x57, 0x4a, 0xd2, 0x4b, 0x9d, 0xbb, 0x10, 0xfc, 0xb0,\n+0x4c, 0x41, 0xe5, 0xed, 0x1d, 0x3d, 0x5e, 0x28, 0x9d, 0x9c, 0xcc, 0xbf, 0xb3, 0x51, 0xda, 0xa7,\n+0x47, 0xe5, 0x84, 0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06,\n+0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xbb, 0xaf, 0x7e, 0x02, 0x3d, 0xfa, 0xa6, 0xf1,\n+0x3c, 0x84, 0x8e, 0xad, 0xee, 0x38, 0x98, 0xec, 0xd9, 0x32, 0x32, 0xd4, 0x30, 0x0e, 0x06, 0x03,\n+0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03,\n+0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,\n+0x00, 0x0a, 0xf1, 0xd5, 0x46, 0x84, 0xb7, 0xae, 0x51, 0xbb, 0x6c, 0xb2, 0x4d, 0x41, 0x14, 0x00,\n+0x93, 0x4c, 0x9c, 0xcb, 0xe5, 0xc0, 0x54, 0xcf, 0xa0, 0x25, 0x8e, 0x02, 0xf9, 0xfd, 0xb0, 0xa2,\n+0x0d, 0xf5, 0x20, 0x98, 0x3c, 0x13, 0x2d, 0xac, 0x56, 0xa2, 0xb0, 0xd6, 0x7e, 0x11, 0x92, 0xe9,\n+0x2e, 0xba, 0x9e, 0x2e, 0x9a, 0x72, 0xb1, 0xbd, 0x19, 0x44, 0x6c, 0x61, 0x35, 0xa2, 0x9a, 0xb4,\n+0x16, 0x12, 0x69, 0x5a, 0x8c, 0xe1, 0xd7, 0x3e, 0xa4, 0x1a, 0xe8, 0x2f, 0x03, 0xf4, 0xae, 0x61,\n+0x1d, 0x10, 0x1b, 0x2a, 0xa4, 0x8b, 0x7a, 0xc5, 0xfe, 0x05, 0xa6, 0xe1, 0xc0, 0xd6, 0xc8, 0xfe,\n+0x9e, 0xae, 0x8f, 0x2b, 0xba, 0x3d, 0x99, 0xf8, 0xd8, 0x73, 0x09, 0x58, 0x46, 0x6e, 0xa6, 0x9c,\n+0xf4, 0xd7, 0x27, 0xd3, 0x95, 0xda, 0x37, 0x83, 0x72, 0x1c, 0xd3, 0x73, 0xe0, 0xa2, 0x47, 0x99,\n+0x03, 0x38, 0x5d, 0xd5, 0x49, 0x79, 0x00, 0x29, 0x1c, 0xc7, 0xec, 0x9b, 0x20, 0x1c, 0x07, 0x24,\n+0x69, 0x57, 0x78, 0xb2, 0x39, 0xfc, 0x3a, 0x84, 0xa0, 0xb5, 0x9c, 0x7c, 0x8d, 0xbf, 0x2e, 0x93,\n+0x62, 0x27, 0xb7, 0x39, 0xda, 0x17, 0x18, 0xae, 0xbd, 0x3c, 0x09, 0x68, 0xff, 0x84, 0x9b, 0x3c,\n+0xd5, 0xd6, 0x0b, 0x03, 0xe3, 0x57, 0x9e, 0x14, 0xf7, 0xd1, 0xeb, 0x4f, 0xc8, 0xbd, 0x87, 0x23,\n+0xb7, 0xb6, 0x49, 0x43, 0x79, 0x85, 0x5c, 0xba, 0xeb, 0x92, 0x0b, 0xa1, 0xc6, 0xe8, 0x68, 0xa8,\n+0x4c, 0x16, 0xb1, 0x1a, 0x99, 0x0a, 0xe8, 0x53, 0x2c, 0x92, 0xbb, 0xa1, 0x09, 0x18, 0x75, 0x0c,\n+0x65, 0xa8, 0x7b, 0xcb, 0x23, 0xb7, 0x1a, 0xc2, 0x28, 0x85, 0xc3, 0x1b, 0xff, 0xd0, 0x2b, 0x62,\n+0xef, 0xa4, 0x7b, 0x09, 0x91, 0x98, 0x67, 0x8c, 0x14, 0x01, 0xcd, 0x68, 0x06, 0x6a, 0x63, 0x21,\n+0x75, 0x03, 0x80, 0x88, 0x8a, 0x6e, 0x81, 0xc6, 0x85, 0xf2, 0xa9, 0xa4, 0x2d, 0xe7, 0xf4, 0xa5,\n+0x24, 0x10, 0x47, 0x83, 0xca, 0xcd, 0xf4, 0x8d, 0x79, 0x58, 0xb1, 0x06, 0x9b, 0xe7, 0x1a, 0x2a,\n+0xd9, 0x9d, 0x01, 0xd7, 0x94, 0x7d, 0xed, 0x03, 0x4a, 0xca, 0xf0, 0xdb, 0xe8, 0xa9, 0x01, 0x3e,\n+0xf5, 0x56, 0x99, 0xc9, 0x1e, 0x8e, 0x49, 0x3d, 0xbb, 0xe5, 0x09, 0xb9, 0xe0, 0x4f, 0x49, 0x92,\n+0x3d, 0x16, 0x82, 0x40, 0xcc, 0xcc, 0x59, 0xc6, 0xe6, 0x3a, 0xed, 0x12, 0x2e, 0x69, 0x3c, 0x6c,\n+0x95, 0xb1, 0xfd, 0xaa, 0x1d, 0x7b, 0x7f, 0x86, 0xbe, 0x1e, 0x0e, 0x32, 0x46, 0xfb, 0xfb, 0x13,\n+0x8f, 0x75, 0x7f, 0x4c, 0x8b, 0x4b, 0x46, 0x63, 0xfe, 0x00, 0x34, 0x40, 0x70, 0xc1, 0xc3, 0xb9,\n+0xa1, 0xdd, 0xa6, 0x70, 0xe2, 0x04, 0xb3, 0x41, 0xbc, 0xe9, 0x80, 0x91, 0xea, 0x64, 0x9c, 0x7a,\n+0xe1, 0x22, 0x03, 0xa9, 0x9c, 0x6e, 0x6f, 0x0e, 0x65, 0x4f, 0x6c, 0x87, 0x87, 0x5e, 0xf3, 0x6e,\n+0xa0, 0xf9, 0x75, 0xa5, 0x9b, 0x40, 0xe8, 0x53, 0xb2, 0x27, 0x9d, 0x4a, 0xb9, 0xc0, 0x77, 0x21,\n+0x8d, 0xff, 0x87, 0xf2, 0xde, 0xbc, 0x8c, 0xef, 0x17, 0xdf, 0xb7, 0x49, 0x0b, 0xd1, 0xf2, 0x6e,\n+0x30, 0x0b, 0x1a, 0x0e, 0x4e, 0x76, 0xed, 0x11, 0xfc, 0xf5, 0xe9, 0x56, 0xb2, 0x7d, 0xbf, 0xc7,\n+0x6d, 0x0a, 0x93, 0x8c, 0xa5, 0xd0, 0xc0, 0xb6, 0x1d, 0xbe, 0x3a, 0x4e, 0x94, 0xa2, 0xd7, 0x6e,\n+0x6c, 0x0b, 0xc2, 0x8a, 0x7c, 0xfa, 0x20, 0xf3, 0xc4, 0xe4, 0xe5, 0xcd, 0x0d, 0xa8, 0xcb, 0x91,\n+0x92, 0xb1, 0x7c, 0x85, 0xec, 0xb5, 0x14, 0x69, 0x66, 0x0e, 0x82, 0xe7, 0xcd, 0xce, 0xc8, 0x2d,\n+0xa6, 0x51, 0x7f, 0x21, 0xc1, 0x35, 0x53, 0x85, 0x06, 0x4a, 0x5d, 0x9f, 0xad, 0xbb, 0x1b, 0x5f,\n+0x74, 0x30, 0x82, 0x04, 0x0f, 0x30, 0x82, 0x02, 0xf7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01,\n+0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,\n+0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69,\n+0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73,\n+0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,\n+0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73,\n+0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34,\n+0x30, 0x36, 0x32, 0x39, 0x31, 0x37, 0x33, 0x39, 0x31, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x30,\n+0x36, 0x32, 0x39, 0x31, 0x37, 0x33, 0x39, 0x31, 0x36, 0x5a, 0x30, 0x68, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65,\n+0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,\n+0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x29, 0x53, 0x74, 0x61, 0x72, 0x66,\n+0x69, 0x65, 0x6c, 0x64, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08,\n+0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0x32, 0xc8, 0xfe, 0xe9, 0x71, 0xa6, 0x04, 0x85, 0xad, 0x0c,\n+0x11, 0x64, 0xdf, 0xce, 0x4d, 0xef, 0xc8, 0x03, 0x18, 0x87, 0x3f, 0xa1, 0xab, 0xfb, 0x3c, 0xa6,\n+0x9f, 0xf0, 0xc3, 0xa1, 0xda, 0xd4, 0xd8, 0x6e, 0x2b, 0x53, 0x90, 0xfb, 0x24, 0xa4, 0x3e, 0x84,\n+0xf0, 0x9e, 0xe8, 0x5f, 0xec, 0xe5, 0x27, 0x44, 0xf5, 0x28, 0xa6, 0x3f, 0x7b, 0xde, 0xe0, 0x2a,\n+0xf0, 0xc8, 0xaf, 0x53, 0x2f, 0x9e, 0xca, 0x05, 0x01, 0x93, 0x1e, 0x8f, 0x66, 0x1c, 0x39, 0xa7,\n+0x4d, 0xfa, 0x5a, 0xb6, 0x73, 0x04, 0x25, 0x66, 0xeb, 0x77, 0x7f, 0xe7, 0x59, 0xc6, 0x4a, 0x99,\n+0x25, 0x14, 0x54, 0xeb, 0x26, 0xc7, 0xf3, 0x7f, 0x19, 0xd5, 0x30, 0x70, 0x8f, 0xaf, 0xb0, 0x46,\n+0x2a, 0xff, 0xad, 0xeb, 0x29, 0xed, 0xd7, 0x9f, 0xaa, 0x04, 0x87, 0xa3, 0xd4, 0xf9, 0x89, 0xa5,\n+0x34, 0x5f, 0xdb, 0x43, 0x91, 0x82, 0x36, 0xd9, 0x66, 0x3c, 0xb1, 0xb8, 0xb9, 0x82, 0xfd, 0x9c,\n+0x3a, 0x3e, 0x10, 0xc8, 0x3b, 0xef, 0x06, 0x65, 0x66, 0x7a, 0x9b, 0x19, 0x18, 0x3d, 0xff, 0x71,\n+0x51, 0x3c, 0x30, 0x2e, 0x5f, 0xbe, 0x3d, 0x77, 0x73, 0xb2, 0x5d, 0x06, 0x6c, 0xc3, 0x23, 0x56,\n+0x9a, 0x2b, 0x85, 0x26, 0x92, 0x1c, 0xa7, 0x02, 0xb3, 0xe4, 0x3f, 0x0d, 0xaf, 0x08, 0x79, 0x82,\n+0xb8, 0x36, 0x3d, 0xea, 0x9c, 0xd3, 0x35, 0xb3, 0xbc, 0x69, 0xca, 0xf5, 0xcc, 0x9d, 0xe8, 0xfd,\n+0x64, 0x8d, 0x17, 0x80, 0x33, 0x6e, 0x5e, 0x4a, 0x5d, 0x99, 0xc9, 0x1e, 0x87, 0xb4, 0x9d, 0x1a,\n+0xc0, 0xd5, 0x6e, 0x13, 0x35, 0x23, 0x5e, 0xdf, 0x9b, 0x5f, 0x3d, 0xef, 0xd6, 0xf7, 0x76, 0xc2,\n+0xea, 0x3e, 0xbb, 0x78, 0x0d, 0x1c, 0x42, 0x67, 0x6b, 0x04, 0xd8, 0xf8, 0xd6, 0xda, 0x6f, 0x8b,\n+0xf2, 0x44, 0xa0, 0x01, 0xab, 0x02, 0x01, 0x03, 0xa3, 0x81, 0xc5, 0x30, 0x81, 0xc2, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xbf, 0x5f, 0xb7, 0xd1, 0xce, 0xdd, 0x1f,\n+0x86, 0xf4, 0x5b, 0x55, 0xac, 0xdc, 0xd7, 0x10, 0xc2, 0x0e, 0xa9, 0x88, 0xe7, 0x30, 0x81, 0x92,\n+0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x8a, 0x30, 0x81, 0x87, 0x80, 0x14, 0xbf, 0x5f, 0xb7,\n+0xd1, 0xce, 0xdd, 0x1f, 0x86, 0xf4, 0x5b, 0x55, 0xac, 0xdc, 0xd7, 0x10, 0xc2, 0x0e, 0xa9, 0x88,\n+0xe7, 0xa1, 0x6c, 0xa4, 0x6a, 0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x55, 0x53, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53,\n+0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c,\n+0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06,\n+0x03, 0x55, 0x04, 0x0b, 0x13, 0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20,\n+0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n+0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x82,\n+0x01, 0x00, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,\n+0x82, 0x01, 0x01, 0x00, 0x05, 0x9d, 0x3f, 0x88, 0x9d, 0xd1, 0xc9, 0x1a, 0x55, 0xa1, 0xac, 0x69,\n+0xf3, 0xf3, 0x59, 0xda, 0x9b, 0x01, 0x87, 0x1a, 0x4f, 0x57, 0xa9, 0xa1, 0x79, 0x09, 0x2a, 0xdb,\n+0xf7, 0x2f, 0xb2, 0x1e, 0xcc, 0xc7, 0x5e, 0x6a, 0xd8, 0x83, 0x87, 0xa1, 0x97, 0xef, 0x49, 0x35,\n+0x3e, 0x77, 0x06, 0x41, 0x58, 0x62, 0xbf, 0x8e, 0x58, 0xb8, 0x0a, 0x67, 0x3f, 0xec, 0xb3, 0xdd,\n+0x21, 0x66, 0x1f, 0xc9, 0x54, 0xfa, 0x72, 0xcc, 0x3d, 0x4c, 0x40, 0xd8, 0x81, 0xaf, 0x77, 0x9e,\n+0x83, 0x7a, 0xbb, 0xa2, 0xc7, 0xf5, 0x34, 0x17, 0x8e, 0xd9, 0x11, 0x40, 0xf4, 0xfc, 0x2c, 0x2a,\n+0x4d, 0x15, 0x7f, 0xa7, 0x62, 0x5d, 0x2e, 0x25, 0xd3, 0x00, 0x0b, 0x20, 0x1a, 0x1d, 0x68, 0xf9,\n+0x17, 0xb8, 0xf4, 0xbd, 0x8b, 0xed, 0x28, 0x59, 0xdd, 0x4d, 0x16, 0x8b, 0x17, 0x83, 0xc8, 0xb2,\n+0x65, 0xc7, 0x2d, 0x7a, 0xa5, 0xaa, 0xbc, 0x53, 0x86, 0x6d, 0xdd, 0x57, 0xa4, 0xca, 0xf8, 0x20,\n+0x41, 0x0b, 0x68, 0xf0, 0xf4, 0xfb, 0x74, 0xbe, 0x56, 0x5d, 0x7a, 0x79, 0xf5, 0xf9, 0x1d, 0x85,\n+0xe3, 0x2d, 0x95, 0xbe, 0xf5, 0x71, 0x90, 0x43, 0xcc, 0x8d, 0x1f, 0x9a, 0x00, 0x0a, 0x87, 0x29,\n+0xe9, 0x55, 0x22, 0x58, 0x00, 0x23, 0xea, 0xe3, 0x12, 0x43, 0x29, 0x5b, 0x47, 0x08, 0xdd, 0x8c,\n+0x41, 0x6a, 0x65, 0x06, 0xa8, 0xe5, 0x21, 0xaa, 0x41, 0xb4, 0x95, 0x21, 0x95, 0xb9, 0x7d, 0xd1,\n+0x34, 0xab, 0x13, 0xd6, 0xad, 0xbc, 0xdc, 0xe2, 0x3d, 0x39, 0xcd, 0xbd, 0x3e, 0x75, 0x70, 0xa1,\n+0x18, 0x59, 0x03, 0xc9, 0x22, 0xb4, 0x8f, 0x9c, 0xd5, 0x5e, 0x2a, 0xd7, 0xa5, 0xb6, 0xd4, 0x0a,\n+0x6d, 0xf8, 0xb7, 0x40, 0x11, 0x46, 0x9a, 0x1f, 0x79, 0x0e, 0x62, 0xbf, 0x0f, 0x97, 0xec, 0xe0,\n+0x2f, 0x1f, 0x17, 0x94, 0x30, 0x82, 0x03, 0xdd, 0x30, 0x82, 0x02, 0xc5, 0xa0, 0x03, 0x02, 0x01,\n+0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x30, 0x81, 0x8f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72,\n+0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a,\n+0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54,\n+0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63,\n+0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x53, 0x74, 0x61, 0x72,\n+0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n+0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x30, 0x31, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33,\n+0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x8f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07,\n+0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07,\n+0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64,\n+0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49,\n+0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x53, 0x74,\n+0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,\n+0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,\n+0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbd, 0xed, 0xc1, 0x03, 0xfc, 0xf6, 0x8f, 0xfc,\n+0x02, 0xb1, 0x6f, 0x5b, 0x9f, 0x48, 0xd9, 0x9d, 0x79, 0xe2, 0xa2, 0xb7, 0x03, 0x61, 0x56, 0x18,\n+0xc3, 0x47, 0xb6, 0xd7, 0xca, 0x3d, 0x35, 0x2e, 0x89, 0x43, 0xf7, 0xa1, 0x69, 0x9b, 0xde, 0x8a,\n+0x1a, 0xfd, 0x13, 0x20, 0x9c, 0xb4, 0x49, 0x77, 0x32, 0x29, 0x56, 0xfd, 0xb9, 0xec, 0x8c, 0xdd,\n+0x22, 0xfa, 0x72, 0xdc, 0x27, 0x61, 0x97, 0xee, 0xf6, 0x5a, 0x84, 0xec, 0x6e, 0x19, 0xb9, 0x89,\n+0x2c, 0xdc, 0x84, 0x5b, 0xd5, 0x74, 0xfb, 0x6b, 0x5f, 0xc5, 0x89, 0xa5, 0x10, 0x52, 0x89, 0x46,\n+0x55, 0xf4, 0xb8, 0x75, 0x1c, 0xe6, 0x7f, 0xe4, 0x54, 0xae, 0x4b, 0xf8, 0x55, 0x72, 0x57, 0x02,\n+0x19, 0xf8, 0x17, 0x71, 0x59, 0xeb, 0x1e, 0x28, 0x07, 0x74, 0xc5, 0x9d, 0x48, 0xbe, 0x6c, 0xb4,\n+0xf4, 0xa4, 0xb0, 0xf3, 0x64, 0x37, 0x79, 0x92, 0xc0, 0xec, 0x46, 0x5e, 0x7f, 0xe1, 0x6d, 0x53,\n+0x4c, 0x62, 0xaf, 0xcd, 0x1f, 0x0b, 0x63, 0xbb, 0x3a, 0x9d, 0xfb, 0xfc, 0x79, 0x00, 0x98, 0x61,\n+0x74, 0xcf, 0x26, 0x82, 0x40, 0x63, 0xf3, 0xb2, 0x72, 0x6a, 0x19, 0x0d, 0x99, 0xca, 0xd4, 0x0e,\n+0x75, 0xcc, 0x37, 0xfb, 0x8b, 0x89, 0xc1, 0x59, 0xf1, 0x62, 0x7f, 0x5f, 0xb3, 0x5f, 0x65, 0x30,\n+0xf8, 0xa7, 0xb7, 0x4d, 0x76, 0x5a, 0x1e, 0x76, 0x5e, 0x34, 0xc0, 0xe8, 0x96, 0x56, 0x99, 0x8a,\n+0xb3, 0xf0, 0x7f, 0xa4, 0xcd, 0xbd, 0xdc, 0x32, 0x31, 0x7c, 0x91, 0xcf, 0xe0, 0x5f, 0x11, 0xf8,\n+0x6b, 0xaa, 0x49, 0x5c, 0xd1, 0x99, 0x94, 0xd1, 0xa2, 0xe3, 0x63, 0x5b, 0x09, 0x76, 0xb5, 0x56,\n+0x62, 0xe1, 0x4b, 0x74, 0x1d, 0x96, 0xd4, 0x26, 0xd4, 0x08, 0x04, 0x59, 0xd0, 0x98, 0x0e, 0x0e,\n+0xe6, 0xde, 0xfc, 0xc3, 0xec, 0x1f, 0x90, 0xf1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30,\n+0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7c, 0x0c, 0x32,\n+0x1f, 0xa7, 0xd9, 0x30, 0x7f, 0xc4, 0x7d, 0x68, 0xa3, 0x62, 0xa8, 0xa1, 0xce, 0xab, 0x07, 0x5b,\n+0x27, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n+0x03, 0x82, 0x01, 0x01, 0x00, 0x11, 0x59, 0xfa, 0x25, 0x4f, 0x03, 0x6f, 0x94, 0x99, 0x3b, 0x9a,\n+0x1f, 0x82, 0x85, 0x39, 0xd4, 0x76, 0x05, 0x94, 0x5e, 0xe1, 0x28, 0x93, 0x6d, 0x62, 0x5d, 0x09,\n+0xc2, 0xa0, 0xa8, 0xd4, 0xb0, 0x75, 0x38, 0xf1, 0x34, 0x6a, 0x9d, 0xe4, 0x9f, 0x8a, 0x86, 0x26,\n+0x51, 0xe6, 0x2c, 0xd1, 0xc6, 0x2d, 0x6e, 0x95, 0x20, 0x4a, 0x92, 0x01, 0xec, 0xb8, 0x8a, 0x67,\n+0x7b, 0x31, 0xe2, 0x67, 0x2e, 0x8c, 0x95, 0x03, 0x26, 0x2e, 0x43, 0x9d, 0x4a, 0x31, 0xf6, 0x0e,\n+0xb5, 0x0c, 0xbb, 0xb7, 0xe2, 0x37, 0x7f, 0x22, 0xba, 0x00, 0xa3, 0x0e, 0x7b, 0x52, 0xfb, 0x6b,\n+0xbb, 0x3b, 0xc4, 0xd3, 0x79, 0x51, 0x4e, 0xcd, 0x90, 0xf4, 0x67, 0x07, 0x19, 0xc8, 0x3c, 0x46,\n+0x7a, 0x0d, 0x01, 0x7d, 0xc5, 0x58, 0xe7, 0x6d, 0xe6, 0x85, 0x30, 0x17, 0x9a, 0x24, 0xc4, 0x10,\n+0xe0, 0x04, 0xf7, 0xe0, 0xf2, 0x7f, 0xd4, 0xaa, 0x0a, 0xff, 0x42, 0x1d, 0x37, 0xed, 0x94, 0xe5,\n+0x64, 0x59, 0x12, 0x20, 0x77, 0x38, 0xd3, 0x32, 0x3e, 0x38, 0x81, 0x75, 0x96, 0x73, 0xfa, 0x68,\n+0x8f, 0xb1, 0xcb, 0xce, 0x1f, 0xc5, 0xec, 0xfa, 0x9c, 0x7e, 0xcf, 0x7e, 0xb1, 0xf1, 0x07, 0x2d,\n+0xb6, 0xfc, 0xbf, 0xca, 0xa4, 0xbf, 0xd0, 0x97, 0x05, 0x4a, 0xbc, 0xea, 0x18, 0x28, 0x02, 0x90,\n+0xbd, 0x54, 0x78, 0x09, 0x21, 0x71, 0xd3, 0xd1, 0x7d, 0x1d, 0xd9, 0x16, 0xb0, 0xa9, 0x61, 0x3d,\n+0xd0, 0x0a, 0x00, 0x22, 0xfc, 0xc7, 0x7b, 0xcb, 0x09, 0x64, 0x45, 0x0b, 0x3b, 0x40, 0x81, 0xf7,\n+0x7d, 0x7c, 0x32, 0xf5, 0x98, 0xca, 0x58, 0x8e, 0x7d, 0x2a, 0xee, 0x90, 0x59, 0x73, 0x64, 0xf9,\n+0x36, 0x74, 0x5e, 0x25, 0xa1, 0xf5, 0x66, 0x05, 0x2e, 0x7f, 0x39, 0x15, 0xa9, 0x2a, 0xfb, 0x50,\n+0x8b, 0x8e, 0x85, 0x69, 0xf4, 0x30, 0x82, 0x03, 0xef, 0x30, 0x82, 0x02, 0xd7, 0xa0, 0x03, 0x02,\n+0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41,\n+0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13,\n+0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20,\n+0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e,\n+0x63, 0x2e, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x53, 0x74, 0x61,\n+0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30,\n+0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,\n+0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30,\n+0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e,\n+0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74,\n+0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e,\n+0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3b, 0x30,\n+0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c,\n+0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68,\n+0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,\n+0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd5, 0x0c, 0x3a, 0xc4, 0x2a,\n+0xf9, 0x4e, 0xe2, 0xf5, 0xbe, 0x19, 0x97, 0x5f, 0x8e, 0x88, 0x53, 0xb1, 0x1f, 0x3f, 0xcb, 0xcf,\n+0x9f, 0x20, 0x13, 0x6d, 0x29, 0x3a, 0xc8, 0x0f, 0x7d, 0x3c, 0xf7, 0x6b, 0x76, 0x38, 0x63, 0xd9,\n+0x36, 0x60, 0xa8, 0x9b, 0x5e, 0x5c, 0x00, 0x80, 0xb2, 0x2f, 0x59, 0x7f, 0xf6, 0x87, 0xf9, 0x25,\n+0x43, 0x86, 0xe7, 0x69, 0x1b, 0x52, 0x9a, 0x90, 0xe1, 0x71, 0xe3, 0xd8, 0x2d, 0x0d, 0x4e, 0x6f,\n+0xf6, 0xc8, 0x49, 0xd9, 0xb6, 0xf3, 0x1a, 0x56, 0xae, 0x2b, 0xb6, 0x74, 0x14, 0xeb, 0xcf, 0xfb,\n+0x26, 0xe3, 0x1a, 0xba, 0x1d, 0x96, 0x2e, 0x6a, 0x3b, 0x58, 0x94, 0x89, 0x47, 0x56, 0xff, 0x25,\n+0xa0, 0x93, 0x70, 0x53, 0x83, 0xda, 0x84, 0x74, 0x14, 0xc3, 0x67, 0x9e, 0x04, 0x68, 0x3a, 0xdf,\n+0x8e, 0x40, 0x5a, 0x1d, 0x4a, 0x4e, 0xcf, 0x43, 0x91, 0x3b, 0xe7, 0x56, 0xd6, 0x00, 0x70, 0xcb,\n+0x52, 0xee, 0x7b, 0x7d, 0xae, 0x3a, 0xe7, 0xbc, 0x31, 0xf9, 0x45, 0xf6, 0xc2, 0x60, 0xcf, 0x13,\n+0x59, 0x02, 0x2b, 0x80, 0xcc, 0x34, 0x47, 0xdf, 0xb9, 0xde, 0x90, 0x65, 0x6d, 0x02, 0xcf, 0x2c,\n+0x91, 0xa6, 0xa6, 0xe7, 0xde, 0x85, 0x18, 0x49, 0x7c, 0x66, 0x4e, 0xa3, 0x3a, 0x6d, 0xa9, 0xb5,\n+0xee, 0x34, 0x2e, 0xba, 0x0d, 0x03, 0xb8, 0x33, 0xdf, 0x47, 0xeb, 0xb1, 0x6b, 0x8d, 0x25, 0xd9,\n+0x9b, 0xce, 0x81, 0xd1, 0x45, 0x46, 0x32, 0x96, 0x70, 0x87, 0xde, 0x02, 0x0e, 0x49, 0x43, 0x85,\n+0xb6, 0x6c, 0x73, 0xbb, 0x64, 0xea, 0x61, 0x41, 0xac, 0xc9, 0xd4, 0x54, 0xdf, 0x87, 0x2f, 0xc7,\n+0x22, 0xb2, 0x26, 0xcc, 0x9f, 0x59, 0x54, 0x68, 0x9f, 0xfc, 0xbe, 0x2a, 0x2f, 0xc4, 0x55, 0x1c,\n+0x75, 0x40, 0x60, 0x17, 0x85, 0x02, 0x55, 0x39, 0x8b, 0x7f, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01,\n+0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n+0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+0x9c, 0x5f, 0x00, 0xdf, 0xaa, 0x01, 0xd7, 0x30, 0x2b, 0x38, 0x88, 0xa2, 0xb8, 0x6d, 0x4a, 0x9c,\n+0xf2, 0x11, 0x91, 0x83, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x4b, 0x36, 0xa6, 0x84, 0x77, 0x69, 0xdd, 0x3b,\n+0x19, 0x9f, 0x67, 0x23, 0x08, 0x6f, 0x0e, 0x61, 0xc9, 0xfd, 0x84, 0xdc, 0x5f, 0xd8, 0x36, 0x81,\n+0xcd, 0xd8, 0x1b, 0x41, 0x2d, 0x9f, 0x60, 0xdd, 0xc7, 0x1a, 0x68, 0xd9, 0xd1, 0x6e, 0x86, 0xe1,\n+0x88, 0x23, 0xcf, 0x13, 0xde, 0x43, 0xcf, 0xe2, 0x34, 0xb3, 0x04, 0x9d, 0x1f, 0x29, 0xd5, 0xbf,\n+0xf8, 0x5e, 0xc8, 0xd5, 0xc1, 0xbd, 0xee, 0x92, 0x6f, 0x32, 0x74, 0xf2, 0x91, 0x82, 0x2f, 0xbd,\n+0x82, 0x42, 0x7a, 0xad, 0x2a, 0xb7, 0x20, 0x7d, 0x4d, 0xbc, 0x7a, 0x55, 0x12, 0xc2, 0x15, 0xea,\n+0xbd, 0xf7, 0x6a, 0x95, 0x2e, 0x6c, 0x74, 0x9f, 0xcf, 0x1c, 0xb4, 0xf2, 0xc5, 0x01, 0xa3, 0x85,\n+0xd0, 0x72, 0x3e, 0xad, 0x73, 0xab, 0x0b, 0x9b, 0x75, 0x0c, 0x6d, 0x45, 0xb7, 0x8e, 0x94, 0xac,\n+0x96, 0x37, 0xb5, 0xa0, 0xd0, 0x8f, 0x15, 0x47, 0x0e, 0xe3, 0xe8, 0x83, 0xdd, 0x8f, 0xfd, 0xef,\n+0x41, 0x01, 0x77, 0xcc, 0x27, 0xa9, 0x62, 0x85, 0x33, 0xf2, 0x37, 0x08, 0xef, 0x71, 0xcf, 0x77,\n+0x06, 0xde, 0xc8, 0x19, 0x1d, 0x88, 0x40, 0xcf, 0x7d, 0x46, 0x1d, 0xff, 0x1e, 0xc7, 0xe1, 0xce,\n+0xff, 0x23, 0xdb, 0xc6, 0xfa, 0x8d, 0x55, 0x4e, 0xa9, 0x02, 0xe7, 0x47, 0x11, 0x46, 0x3e, 0xf4,\n+0xfd, 0xbd, 0x7b, 0x29, 0x26, 0xbb, 0xa9, 0x61, 0x62, 0x37, 0x28, 0xb6, 0x2d, 0x2a, 0xf6, 0x10,\n+0x86, 0x64, 0xc9, 0x70, 0xa7, 0xd2, 0xad, 0xb7, 0x29, 0x70, 0x79, 0xea, 0x3c, 0xda, 0x63, 0x25,\n+0x9f, 0xfd, 0x68, 0xb7, 0x30, 0xec, 0x70, 0xfb, 0x75, 0x8a, 0xb7, 0x6d, 0x60, 0x67, 0xb2, 0x1e,\n+0xc8, 0xb9, 0xe9, 0xd8, 0xa8, 0x6f, 0x02, 0x8b, 0x67, 0x0d, 0x4d, 0x26, 0x57, 0x71, 0xda, 0x20,\n+0xfc, 0xc1, 0x4a, 0x50, 0x8d, 0xb1, 0x28, 0xba, 0x30, 0x82, 0x05, 0xde, 0x30, 0x82, 0x03, 0xc6,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x01, 0xfd, 0x6d, 0x30, 0xfc, 0xa3, 0xca, 0x51, 0xa8,\n+0x1b, 0xbc, 0x64, 0x0e, 0x35, 0x03, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13,\n+0x0a, 0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06,\n+0x03, 0x55, 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74,\n+0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20,\n+0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n+0x6b, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52,\n+0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n+0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,\n+0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30,\n+0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39,\n+0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n+0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, 0x65, 0x77, 0x20,\n+0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13,\n+0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54,\n+0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x2e, 0x30, 0x2c,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n+0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n+0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x80, 0x12, 0x65,\n+0x17, 0x36, 0x0e, 0xc3, 0xdb, 0x08, 0xb3, 0xd0, 0xac, 0x57, 0x0d, 0x76, 0xed, 0xcd, 0x27, 0xd3,\n+0x4c, 0xad, 0x50, 0x83, 0x61, 0xe2, 0xaa, 0x20, 0x4d, 0x09, 0x2d, 0x64, 0x09, 0xdc, 0xce, 0x89,\n+0x9f, 0xcc, 0x3d, 0xa9, 0xec, 0xf6, 0xcf, 0xc1, 0xdc, 0xf1, 0xd3, 0xb1, 0xd6, 0x7b, 0x37, 0x28,\n+0x11, 0x2b, 0x47, 0xda, 0x39, 0xc6, 0xbc, 0x3a, 0x19, 0xb4, 0x5f, 0xa6, 0xbd, 0x7d, 0x9d, 0xa3,\n+0x63, 0x42, 0xb6, 0x76, 0xf2, 0xa9, 0x3b, 0x2b, 0x91, 0xf8, 0xe2, 0x6f, 0xd0, 0xec, 0x16, 0x20,\n+0x90, 0x09, 0x3e, 0xe2, 0xe8, 0x74, 0xc9, 0x18, 0xb4, 0x91, 0xd4, 0x62, 0x64, 0xdb, 0x7f, 0xa3,\n+0x06, 0xf1, 0x88, 0x18, 0x6a, 0x90, 0x22, 0x3c, 0xbc, 0xfe, 0x13, 0xf0, 0x87, 0x14, 0x7b, 0xf6,\n+0xe4, 0x1f, 0x8e, 0xd4, 0xe4, 0x51, 0xc6, 0x11, 0x67, 0x46, 0x08, 0x51, 0xcb, 0x86, 0x14, 0x54,\n+0x3f, 0xbc, 0x33, 0xfe, 0x7e, 0x6c, 0x9c, 0xff, 0x16, 0x9d, 0x18, 0xbd, 0x51, 0x8e, 0x35, 0xa6,\n+0xa7, 0x66, 0xc8, 0x72, 0x67, 0xdb, 0x21, 0x66, 0xb1, 0xd4, 0x9b, 0x78, 0x03, 0xc0, 0x50, 0x3a,\n+0xe8, 0xcc, 0xf0, 0xdc, 0xbc, 0x9e, 0x4c, 0xfe, 0xaf, 0x05, 0x96, 0x35, 0x1f, 0x57, 0x5a, 0xb7,\n+0xff, 0xce, 0xf9, 0x3d, 0xb7, 0x2c, 0xb6, 0xf6, 0x54, 0xdd, 0xc8, 0xe7, 0x12, 0x3a, 0x4d, 0xae,\n+0x4c, 0x8a, 0xb7, 0x5c, 0x9a, 0xb4, 0xb7, 0x20, 0x3d, 0xca, 0x7f, 0x22, 0x34, 0xae, 0x7e, 0x3b,\n+0x68, 0x66, 0x01, 0x44, 0xe7, 0x01, 0x4e, 0x46, 0x53, 0x9b, 0x33, 0x60, 0xf7, 0x94, 0xbe, 0x53,\n+0x37, 0x90, 0x73, 0x43, 0xf3, 0x32, 0xc3, 0x53, 0xef, 0xdb, 0xaa, 0xfe, 0x74, 0x4e, 0x69, 0xc7,\n+0x6b, 0x8c, 0x60, 0x93, 0xde, 0xc4, 0xc7, 0x0c, 0xdf, 0xe1, 0x32, 0xae, 0xcc, 0x93, 0x3b, 0x51,\n+0x78, 0x95, 0x67, 0x8b, 0xee, 0x3d, 0x56, 0xfe, 0x0c, 0xd0, 0x69, 0x0f, 0x1b, 0x0f, 0xf3, 0x25,\n+0x26, 0x6b, 0x33, 0x6d, 0xf7, 0x6e, 0x47, 0xfa, 0x73, 0x43, 0xe5, 0x7e, 0x0e, 0xa5, 0x66, 0xb1,\n+0x29, 0x7c, 0x32, 0x84, 0x63, 0x55, 0x89, 0xc4, 0x0d, 0xc1, 0x93, 0x54, 0x30, 0x19, 0x13, 0xac,\n+0xd3, 0x7d, 0x37, 0xa7, 0xeb, 0x5d, 0x3a, 0x6c, 0x35, 0x5c, 0xdb, 0x41, 0xd7, 0x12, 0xda, 0xa9,\n+0x49, 0x0b, 0xdf, 0xd8, 0x80, 0x8a, 0x09, 0x93, 0x62, 0x8e, 0xb5, 0x66, 0xcf, 0x25, 0x88, 0xcd,\n+0x84, 0xb8, 0xb1, 0x3f, 0xa4, 0x39, 0x0f, 0xd9, 0x02, 0x9e, 0xeb, 0x12, 0x4c, 0x95, 0x7c, 0xf3,\n+0x6b, 0x05, 0xa9, 0x5e, 0x16, 0x83, 0xcc, 0xb8, 0x67, 0xe2, 0xe8, 0x13, 0x9d, 0xcc, 0x5b, 0x82,\n+0xd3, 0x4c, 0xb3, 0xed, 0x5b, 0xff, 0xde, 0xe5, 0x73, 0xac, 0x23, 0x3b, 0x2d, 0x00, 0xbf, 0x35,\n+0x55, 0x74, 0x09, 0x49, 0xd8, 0x49, 0x58, 0x1a, 0x7f, 0x92, 0x36, 0xe6, 0x51, 0x92, 0x0e, 0xf3,\n+0x26, 0x7d, 0x1c, 0x4d, 0x17, 0xbc, 0xc9, 0xec, 0x43, 0x26, 0xd0, 0xbf, 0x41, 0x5f, 0x40, 0xa9,\n+0x44, 0x44, 0xf4, 0x99, 0xe7, 0x57, 0x87, 0x9e, 0x50, 0x1f, 0x57, 0x54, 0xa8, 0x3e, 0xfd, 0x74,\n+0x63, 0x2f, 0xb1, 0x50, 0x65, 0x09, 0xe6, 0x58, 0x42, 0x2e, 0x43, 0x1a, 0x4c, 0xb4, 0xf0, 0x25,\n+0x47, 0x59, 0xfa, 0x04, 0x1e, 0x93, 0xd4, 0x26, 0x46, 0x4a, 0x50, 0x81, 0xb2, 0xde, 0xbe, 0x78,\n+0xb7, 0xfc, 0x67, 0x15, 0xe1, 0xc9, 0x57, 0x84, 0x1e, 0x0f, 0x63, 0xd6, 0xe9, 0x62, 0xba, 0xd6,\n+0x5f, 0x55, 0x2e, 0xea, 0x5c, 0xc6, 0x28, 0x08, 0x04, 0x25, 0x39, 0xb8, 0x0e, 0x2b, 0xa9, 0xf2,\n+0x4c, 0x97, 0x1c, 0x07, 0x3f, 0x0d, 0x52, 0xf5, 0xed, 0xef, 0x2f, 0x82, 0x0f, 0x02, 0x03, 0x01,\n+0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n+0x14, 0x53, 0x79, 0xbf, 0x5a, 0xaa, 0x2b, 0x4a, 0xcf, 0x54, 0x80, 0xe1, 0xd8, 0x9b, 0xc0, 0x9d,\n+0xf2, 0xb2, 0x03, 0x66, 0xcb, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x5c, 0xd4, 0x7c, 0x0d, 0xcf, 0xf7,\n+0x01, 0x7d, 0x41, 0x99, 0x65, 0x0c, 0x73, 0xc5, 0x52, 0x9f, 0xcb, 0xf8, 0xcf, 0x99, 0x06, 0x7f,\n+0x1b, 0xda, 0x43, 0x15, 0x9f, 0x9e, 0x02, 0x55, 0x57, 0x96, 0x14, 0xf1, 0x52, 0x3c, 0x27, 0x87,\n+0x94, 0x28, 0xed, 0x1f, 0x3a, 0x01, 0x37, 0xa2, 0x76, 0xfc, 0x53, 0x50, 0xc0, 0x84, 0x9b, 0xc6,\n+0x6b, 0x4e, 0xba, 0x8c, 0x21, 0x4f, 0xa2, 0x8e, 0x55, 0x62, 0x91, 0xf3, 0x69, 0x15, 0xd8, 0xbc,\n+0x88, 0xe3, 0xc4, 0xaa, 0x0b, 0xfd, 0xef, 0xa8, 0xe9, 0x4b, 0x55, 0x2a, 0x06, 0x20, 0x6d, 0x55,\n+0x78, 0x29, 0x19, 0xee, 0x5f, 0x30, 0x5c, 0x4b, 0x24, 0x11, 0x55, 0xff, 0x24, 0x9a, 0x6e, 0x5e,\n+0x2a, 0x2b, 0xee, 0x0b, 0x4d, 0x9f, 0x7f, 0xf7, 0x01, 0x38, 0x94, 0x14, 0x95, 0x43, 0x07, 0x09,\n+0xfb, 0x60, 0xa9, 0xee, 0x1c, 0xab, 0x12, 0x8c, 0xa0, 0x9a, 0x5e, 0xa7, 0x98, 0x6a, 0x59, 0x6d,\n+0x8b, 0x3f, 0x08, 0xfb, 0xc8, 0xd1, 0x45, 0xaf, 0x18, 0x15, 0x64, 0x90, 0x12, 0x0f, 0x73, 0x28,\n+0x2e, 0xc5, 0xe2, 0x24, 0x4e, 0xfc, 0x58, 0xec, 0xf0, 0xf4, 0x45, 0xfe, 0x22, 0xb3, 0xeb, 0x2f,\n+0x8e, 0xd2, 0xd9, 0x45, 0x61, 0x05, 0xc1, 0x97, 0x6f, 0xa8, 0x76, 0x72, 0x8f, 0x8b, 0x8c, 0x36,\n+0xaf, 0xbf, 0x0d, 0x05, 0xce, 0x71, 0x8d, 0xe6, 0xa6, 0x6f, 0x1f, 0x6c, 0xa6, 0x71, 0x62, 0xc5,\n+0xd8, 0xd0, 0x83, 0x72, 0x0c, 0xf1, 0x67, 0x11, 0x89, 0x0c, 0x9c, 0x13, 0x4c, 0x72, 0x34, 0xdf,\n+0xbc, 0xd5, 0x71, 0xdf, 0xaa, 0x71, 0xdd, 0xe1, 0xb9, 0x6c, 0x8c, 0x3c, 0x12, 0x5d, 0x65, 0xda,\n+0xbd, 0x57, 0x12, 0xb6, 0x43, 0x6b, 0xff, 0xe5, 0xde, 0x4d, 0x66, 0x11, 0x51, 0xcf, 0x99, 0xae,\n+0xec, 0x17, 0xb6, 0xe8, 0x71, 0x91, 0x8c, 0xde, 0x49, 0xfe, 0xdd, 0x35, 0x71, 0xa2, 0x15, 0x27,\n+0x94, 0x1c, 0xcf, 0x61, 0xe3, 0x26, 0xbb, 0x6f, 0xa3, 0x67, 0x25, 0x21, 0x5d, 0xe6, 0xdd, 0x1d,\n+0x0b, 0x2e, 0x68, 0x1b, 0x3b, 0x82, 0xaf, 0xec, 0x83, 0x67, 0x85, 0xd4, 0x98, 0x51, 0x74, 0xb1,\n+0xb9, 0x99, 0x80, 0x89, 0xff, 0x7f, 0x78, 0x19, 0x5c, 0x79, 0x4a, 0x60, 0x2e, 0x92, 0x40, 0xae,\n+0x4c, 0x37, 0x2a, 0x2c, 0xc9, 0xc7, 0x62, 0xc8, 0x0e, 0x5d, 0xf7, 0x36, 0x5b, 0xca, 0xe0, 0x25,\n+0x25, 0x01, 0xb4, 0xdd, 0x1a, 0x07, 0x9c, 0x77, 0x00, 0x3f, 0xd0, 0xdc, 0xd5, 0xec, 0x3d, 0xd4,\n+0xfa, 0xbb, 0x3f, 0xcc, 0x85, 0xd6, 0x6f, 0x7f, 0xa9, 0x2d, 0xdf, 0xb9, 0x02, 0xf7, 0xf5, 0x97,\n+0x9a, 0xb5, 0x35, 0xda, 0xc3, 0x67, 0xb0, 0x87, 0x4a, 0xa9, 0x28, 0x9e, 0x23, 0x8e, 0xff, 0x5c,\n+0x27, 0x6b, 0xe1, 0xb0, 0x4f, 0xf3, 0x07, 0xee, 0x00, 0x2e, 0xd4, 0x59, 0x87, 0xcb, 0x52, 0x41,\n+0x95, 0xea, 0xf4, 0x47, 0xd7, 0xee, 0x64, 0x41, 0x55, 0x7c, 0x8d, 0x59, 0x02, 0x95, 0xdd, 0x62,\n+0x9d, 0xc2, 0xb9, 0xee, 0x5a, 0x28, 0x74, 0x84, 0xa5, 0x9b, 0xb7, 0x90, 0xc7, 0x0c, 0x07, 0xdf,\n+0xf5, 0x89, 0x36, 0x74, 0x32, 0xd6, 0x28, 0xc1, 0xb0, 0xb0, 0x0b, 0xe0, 0x9c, 0x4c, 0xc3, 0x1c,\n+0xd6, 0xfc, 0xe3, 0x69, 0xb5, 0x47, 0x46, 0x81, 0x2f, 0xa2, 0x82, 0xab, 0xd3, 0x63, 0x44, 0x70,\n+0xc4, 0x8d, 0xff, 0x2d, 0x33, 0xba, 0xad, 0x8f, 0x7b, 0xb5, 0x70, 0x88, 0xae, 0x3e, 0x19, 0xcf,\n+0x40, 0x28, 0xd8, 0xfc, 0xc8, 0x90, 0xbb, 0x5d, 0x99, 0x22, 0xf5, 0x52, 0xe6, 0x58, 0xc5, 0x1f,\n+0x88, 0x31, 0x43, 0xee, 0x88, 0x1d, 0xd7, 0xc6, 0x8e, 0x3c, 0x43, 0x6a, 0x1d, 0xa7, 0x18, 0xde,\n+0x7d, 0x3d, 0x16, 0xf1, 0x62, 0xf9, 0xca, 0x90, 0xa8, 0xfd, 0x30, 0x82, 0x02, 0x8f, 0x30, 0x82,\n+0x02, 0x15, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x5c, 0x8b, 0x99, 0xc5, 0x5a, 0x94, 0xc5,\n+0xd2, 0x71, 0x56, 0xde, 0xcd, 0x89, 0x80, 0xcc, 0x26, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n+0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a,\n+0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03,\n+0x55, 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79,\n+0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55,\n+0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,\n+0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n+0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a,\n+0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53,\n+0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, 0x65, 0x77, 0x20, 0x4a,\n+0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0b,\n+0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52,\n+0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x2e, 0x30, 0x2c, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20,\n+0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n+0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x76, 0x30, 0x10, 0x06,\n+0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03,\n+0x62, 0x00, 0x04, 0x1a, 0xac, 0x54, 0x5a, 0xa9, 0xf9, 0x68, 0x23, 0xe7, 0x7a, 0xd5, 0x24, 0x6f,\n+0x53, 0xc6, 0x5a, 0xd8, 0x4b, 0xab, 0xc6, 0xd5, 0xb6, 0xd1, 0xe6, 0x73, 0x71, 0xae, 0xdd, 0x9c,\n+0xd6, 0x0c, 0x61, 0xfd, 0xdb, 0xa0, 0x89, 0x03, 0xb8, 0x05, 0x14, 0xec, 0x57, 0xce, 0xee, 0x5d,\n+0x3f, 0xe2, 0x21, 0xb3, 0xce, 0xf7, 0xd4, 0x8a, 0x79, 0xe0, 0xa3, 0x83, 0x7e, 0x2d, 0x97, 0xd0,\n+0x61, 0xc4, 0xf1, 0x99, 0xdc, 0x25, 0x91, 0x63, 0xab, 0x7f, 0x30, 0xa3, 0xb4, 0x70, 0xe2, 0xc7,\n+0xa1, 0x33, 0x9c, 0xf3, 0xbf, 0x2e, 0x5c, 0x53, 0xb1, 0x5f, 0xb3, 0x7d, 0x32, 0x7f, 0x8a, 0x34,\n+0xe3, 0x79, 0x79, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n+0x04, 0x14, 0x3a, 0xe1, 0x09, 0x86, 0xd4, 0xcf, 0x19, 0xc2, 0x96, 0x76, 0x74, 0x49, 0x76, 0xdc,\n+0xe0, 0x35, 0xc6, 0x63, 0x63, 0x9a, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n+0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n+0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x30, 0x36, 0x67, 0xa1, 0x16, 0x08, 0xdc,\n+0xe4, 0x97, 0x00, 0x41, 0x1d, 0x4e, 0xbe, 0xe1, 0x63, 0x01, 0xcf, 0x3b, 0xaa, 0x42, 0x11, 0x64,\n+0xa0, 0x9d, 0x94, 0x39, 0x02, 0x11, 0x79, 0x5c, 0x7b, 0x1d, 0xfa, 0x64, 0xb9, 0xee, 0x16, 0x42,\n+0xb3, 0xbf, 0x8a, 0xc2, 0x09, 0xc4, 0xec, 0xe4, 0xb1, 0x4d, 0x02, 0x31, 0x00, 0xe9, 0x2a, 0x61,\n+0x47, 0x8c, 0x52, 0x4a, 0x4b, 0x4e, 0x18, 0x70, 0xf6, 0xd6, 0x44, 0xd6, 0x6e, 0xf5, 0x83, 0xba,\n+0x6d, 0x58, 0xbd, 0x24, 0xd9, 0x56, 0x48, 0xea, 0xef, 0xc4, 0xa2, 0x46, 0x81, 0x88, 0x6a, 0x3a,\n+0x46, 0xd1, 0xa9, 0x9b, 0x4d, 0xc9, 0x61, 0xda, 0xd1, 0x5d, 0x57, 0x6a, 0x18, 0x30, 0x82, 0x04,\n+0x91, 0x30, 0x82, 0x03, 0x79, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x45, 0x6b, 0x50, 0x54,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,\n+0x81, 0xb0, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73,\n+0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x13, 0x30, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65,\n+0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f,\n+0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,\n+0x63, 0x65, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x28, 0x63, 0x29,\n+0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49,\n+0x6e, 0x63, 0x2e, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x45, 0x6e,\n+0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n+0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,\n+0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x32, 0x33,\n+0x34, 0x32, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x35, 0x33, 0x34,\n+0x32, 0x5a, 0x30, 0x81, 0xb0, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74,\n+0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03,\n+0x55, 0x04, 0x0b, 0x13, 0x30, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74,\n+0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6f,\n+0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65,\n+0x72, 0x65, 0x6e, 0x63, 0x65, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16,\n+0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74,\n+0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x24, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65,\n+0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n+0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,\n+0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb6, 0x95, 0xb6, 0x43, 0x42, 0xfa, 0xc6, 0x6d, 0x2a, 0x6f,\n+0x48, 0xdf, 0x94, 0x4c, 0x39, 0x57, 0x05, 0xee, 0xc3, 0x79, 0x11, 0x41, 0x68, 0x36, 0xed, 0xec,\n+0xfe, 0x9a, 0x01, 0x8f, 0xa1, 0x38, 0x28, 0xfc, 0xf7, 0x10, 0x46, 0x66, 0x2e, 0x4d, 0x1e, 0x1a,\n+0xb1, 0x1a, 0x4e, 0xc6, 0xd1, 0xc0, 0x95, 0x88, 0xb0, 0xc9, 0xff, 0x31, 0x8b, 0x33, 0x03, 0xdb,\n+0xb7, 0x83, 0x7b, 0x3e, 0x20, 0x84, 0x5e, 0xed, 0xb2, 0x56, 0x28, 0xa7, 0xf8, 0xe0, 0xb9, 0x40,\n+0x71, 0x37, 0xc5, 0xcb, 0x47, 0x0e, 0x97, 0x2a, 0x68, 0xc0, 0x22, 0x95, 0x62, 0x15, 0xdb, 0x47,\n+0xd9, 0xf5, 0xd0, 0x2b, 0xff, 0x82, 0x4b, 0xc9, 0xad, 0x3e, 0xde, 0x4c, 0xdb, 0x90, 0x80, 0x50,\n+0x3f, 0x09, 0x8a, 0x84, 0x00, 0xec, 0x30, 0x0a, 0x3d, 0x18, 0xcd, 0xfb, 0xfd, 0x2a, 0x59, 0x9a,\n+0x23, 0x95, 0x17, 0x2c, 0x45, 0x9e, 0x1f, 0x6e, 0x43, 0x79, 0x6d, 0x0c, 0x5c, 0x98, 0xfe, 0x48,\n+0xa7, 0xc5, 0x23, 0x47, 0x5c, 0x5e, 0xfd, 0x6e, 0xe7, 0x1e, 0xb4, 0xf6, 0x68, 0x45, 0xd1, 0x86,\n+0x83, 0x5b, 0xa2, 0x8a, 0x8d, 0xb1, 0xe3, 0x29, 0x80, 0xfe, 0x25, 0x71, 0x88, 0xad, 0xbe, 0xbc,\n+0x8f, 0xac, 0x52, 0x96, 0x4b, 0xaa, 0x51, 0x8d, 0xe4, 0x13, 0x31, 0x19, 0xe8, 0x4e, 0x4d, 0x9f,\n+0xdb, 0xac, 0xb3, 0x6a, 0xd5, 0xbc, 0x39, 0x54, 0x71, 0xca, 0x7a, 0x7a, 0x7f, 0x90, 0xdd, 0x7d,\n+0x1d, 0x80, 0xd9, 0x81, 0xbb, 0x59, 0x26, 0xc2, 0x11, 0xfe, 0xe6, 0x93, 0xe2, 0xf7, 0x80, 0xe4,\n+0x65, 0xfb, 0x34, 0x37, 0x0e, 0x29, 0x80, 0x70, 0x4d, 0xaf, 0x38, 0x86, 0x2e, 0x9e, 0x7f, 0x57,\n+0xaf, 0x9e, 0x17, 0xae, 0xeb, 0x1c, 0xcb, 0x28, 0x21, 0x5f, 0xb6, 0x1c, 0xd8, 0xe7, 0xa2, 0x04,\n+0x22, 0xf9, 0xd3, 0xda, 0xd8, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb0, 0x30, 0x81,\n+0xad, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n+0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x1d, 0x10, 0x04, 0x24, 0x30, 0x22, 0x80, 0x0f, 0x32,\n+0x30, 0x30, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x32, 0x33, 0x34, 0x32, 0x5a, 0x81, 0x0f,\n+0x32, 0x30, 0x32, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x35, 0x33, 0x34, 0x32, 0x5a, 0x30,\n+0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x68, 0x90, 0xe4, 0x67,\n+0xa4, 0xa6, 0x53, 0x80, 0xc7, 0x86, 0x66, 0xa4, 0xf1, 0xf7, 0x4b, 0x43, 0xfb, 0x84, 0xbd, 0x6d,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x68, 0x90, 0xe4, 0x67, 0xa4,\n+0xa6, 0x53, 0x80, 0xc7, 0x86, 0x66, 0xa4, 0xf1, 0xf7, 0x4b, 0x43, 0xfb, 0x84, 0xbd, 0x6d, 0x30,\n+0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, 0x00, 0x04, 0x10, 0x30, 0x0e,\n+0x1b, 0x08, 0x56, 0x37, 0x2e, 0x31, 0x3a, 0x34, 0x2e, 0x30, 0x03, 0x02, 0x04, 0x90, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01,\n+0x01, 0x00, 0x93, 0xd4, 0x30, 0xb0, 0xd7, 0x03, 0x20, 0x2a, 0xd0, 0xf9, 0x63, 0xe8, 0x91, 0x0c,\n+0x05, 0x20, 0xa9, 0x5f, 0x19, 0xca, 0x7b, 0x72, 0x4e, 0xd4, 0xb1, 0xdb, 0xd0, 0x96, 0xfb, 0x54,\n+0x5a, 0x19, 0x2c, 0x0c, 0x08, 0xf7, 0xb2, 0xbc, 0x85, 0xa8, 0x9d, 0x7f, 0x6d, 0x3b, 0x52, 0xb3,\n+0x2a, 0xdb, 0xe7, 0xd4, 0x84, 0x8c, 0x63, 0xf6, 0x0f, 0xcb, 0x26, 0x01, 0x91, 0x50, 0x6c, 0xf4,\n+0x5f, 0x14, 0xe2, 0x93, 0x74, 0xc0, 0x13, 0x9e, 0x30, 0x3a, 0x50, 0xe3, 0xb4, 0x60, 0xc5, 0x1c,\n+0xf0, 0x22, 0x44, 0x8d, 0x71, 0x47, 0xac, 0xc8, 0x1a, 0xc9, 0xe9, 0x9b, 0x9a, 0x00, 0x60, 0x13,\n+0xff, 0x70, 0x7e, 0x5f, 0x11, 0x4d, 0x49, 0x1b, 0xb3, 0x15, 0x52, 0x7b, 0xc9, 0x54, 0xda, 0xbf,\n+0x9d, 0x95, 0xaf, 0x6b, 0x9a, 0xd8, 0x9e, 0xe9, 0xf1, 0xe4, 0x43, 0x8d, 0xe2, 0x11, 0x44, 0x3a,\n+0xbf, 0xaf, 0xbd, 0x83, 0x42, 0x73, 0x52, 0x8b, 0xaa, 0xbb, 0xa7, 0x29, 0xcf, 0xf5, 0x64, 0x1c,\n+0x0a, 0x4d, 0xd1, 0xbc, 0xaa, 0xac, 0x9f, 0x2a, 0xd0, 0xff, 0x7f, 0x7f, 0xda, 0x7d, 0xea, 0xb1,\n+0xed, 0x30, 0x25, 0xc1, 0x84, 0xda, 0x34, 0xd2, 0x5b, 0x78, 0x83, 0x56, 0xec, 0x9c, 0x36, 0xc3,\n+0x26, 0xe2, 0x11, 0xf6, 0x67, 0x49, 0x1d, 0x92, 0xab, 0x8c, 0xfb, 0xeb, 0xff, 0x7a, 0xee, 0x85,\n+0x4a, 0xa7, 0x50, 0x80, 0xf0, 0xa7, 0x5c, 0x4a, 0x94, 0x2e, 0x5f, 0x05, 0x99, 0x3c, 0x52, 0x41,\n+0xe0, 0xcd, 0xb4, 0x63, 0xcf, 0x01, 0x43, 0xba, 0x9c, 0x83, 0xdc, 0x8f, 0x60, 0x3b, 0xf3, 0x5a,\n+0xb4, 0xb4, 0x7b, 0xae, 0xda, 0x0b, 0x90, 0x38, 0x75, 0xef, 0x81, 0x1d, 0x66, 0xd2, 0xf7, 0x57,\n+0x70, 0x36, 0xb3, 0xbf, 0xfc, 0x28, 0xaf, 0x71, 0x25, 0x85, 0x5b, 0x13, 0xfe, 0x1e, 0x7f, 0x5a,\n+0xb4, 0x3c, 0x30, 0x82, 0x05, 0x56, 0x30, 0x82, 0x04, 0x3e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x10, 0xee, 0x2b, 0x3d, 0xeb, 0xd4, 0x21, 0xde, 0x14, 0xa8, 0x62, 0xac, 0x04, 0xf3, 0xdd, 0xc4,\n+0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,\n+0x30, 0x81, 0xf3, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53,\n+0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x32, 0x41, 0x67, 0x65, 0x6e, 0x63,\n+0x69, 0x61, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x64, 0x65, 0x20, 0x43,\n+0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x20, 0x28, 0x4e, 0x49, 0x46,\n+0x20, 0x51, 0x2d, 0x30, 0x38, 0x30, 0x31, 0x31, 0x37, 0x36, 0x2d, 0x49, 0x29, 0x31, 0x28, 0x30,\n+0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x69, 0x73, 0x20,\n+0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n+0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x13, 0x2c, 0x56, 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f,\n+0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f,\n+0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65, 0x6c, 0x20, 0x28, 0x63, 0x29, 0x30, 0x33, 0x31, 0x35,\n+0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x4a, 0x65, 0x72, 0x61, 0x72, 0x71, 0x75,\n+0x69, 0x61, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x61, 0x74, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43,\n+0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x20, 0x43, 0x61, 0x74, 0x61,\n+0x6c, 0x61, 0x6e, 0x65, 0x73, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06,\n+0x45, 0x43, 0x2d, 0x41, 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x30, 0x31, 0x30, 0x37,\n+0x32, 0x33, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x30, 0x31, 0x30, 0x37, 0x32,\n+0x32, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xf3, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x32, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e,\n+0x61, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69,\n+0x6f, 0x20, 0x28, 0x4e, 0x49, 0x46, 0x20, 0x51, 0x2d, 0x30, 0x38, 0x30, 0x31, 0x31, 0x37, 0x36,\n+0x2d, 0x49, 0x29, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65,\n+0x72, 0x76, 0x65, 0x69, 0x73, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x73, 0x20, 0x64, 0x65,\n+0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x31, 0x35, 0x30,\n+0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74,\n+0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72,\n+0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65, 0x6c, 0x20, 0x28,\n+0x63, 0x29, 0x30, 0x33, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x4a,\n+0x65, 0x72, 0x61, 0x72, 0x71, 0x75, 0x69, 0x61, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x61, 0x74,\n+0x73, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69,\n+0x6f, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x31, 0x0f, 0x30, 0x0d, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x06, 0x45, 0x43, 0x2d, 0x41, 0x43, 0x43, 0x30, 0x82, 0x01, 0x22,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n+0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb3, 0x22, 0xc7,\n+0x4f, 0xe2, 0x97, 0x42, 0x95, 0x88, 0x47, 0x83, 0x40, 0xf6, 0x1d, 0x17, 0xf3, 0x83, 0x73, 0x24,\n+0x1e, 0x51, 0xf3, 0x98, 0x8a, 0xc3, 0x92, 0xb8, 0xff, 0x40, 0x90, 0x05, 0x70, 0x87, 0x60, 0xc9,\n+0x00, 0xa9, 0xb5, 0x94, 0x65, 0x19, 0x22, 0x15, 0x17, 0xc2, 0x43, 0x6c, 0x66, 0x44, 0x9a, 0x0d,\n+0x04, 0x3e, 0x39, 0x6f, 0xa5, 0x4b, 0x7a, 0xaa, 0x63, 0xb7, 0x8a, 0x44, 0x9d, 0xd9, 0x63, 0x91,\n+0x84, 0x66, 0xe0, 0x28, 0x0f, 0xba, 0x42, 0xe3, 0x6e, 0x8e, 0xf7, 0x14, 0x27, 0x93, 0x69, 0xee,\n+0x91, 0x0e, 0xa3, 0x5f, 0x0e, 0xb1, 0xeb, 0x66, 0xa2, 0x72, 0x4f, 0x12, 0x13, 0x86, 0x65, 0x7a,\n+0x3e, 0xdb, 0x4f, 0x07, 0xf4, 0xa7, 0x09, 0x60, 0xda, 0x3a, 0x42, 0x99, 0xc7, 0xb2, 0x7f, 0xb3,\n+0x16, 0x95, 0x1c, 0xc7, 0xf9, 0x34, 0xb5, 0x94, 0x85, 0xd5, 0x99, 0x5e, 0xa0, 0x48, 0xa0, 0x7e,\n+0xe7, 0x17, 0x65, 0xb8, 0xa2, 0x75, 0xb8, 0x1e, 0xf3, 0xe5, 0x42, 0x7d, 0xaf, 0xed, 0xf3, 0x8a,\n+0x48, 0x64, 0x5d, 0x82, 0x14, 0x93, 0xd8, 0xc0, 0xe4, 0xff, 0xb3, 0x50, 0x72, 0xf2, 0x76, 0xf6,\n+0xb3, 0x5d, 0x42, 0x50, 0x79, 0xd0, 0x94, 0x3e, 0x6b, 0x0c, 0x00, 0xbe, 0xd8, 0x6b, 0x0e, 0x4e,\n+0x2a, 0xec, 0x3e, 0xd2, 0xcc, 0x82, 0xa2, 0x18, 0x65, 0x33, 0x13, 0x77, 0x9e, 0x9a, 0x5d, 0x1a,\n+0x13, 0xd8, 0xc3, 0xdb, 0x3d, 0xc8, 0x97, 0x7a, 0xee, 0x70, 0xed, 0xa7, 0xe6, 0x7c, 0xdb, 0x71,\n+0xcf, 0x2d, 0x94, 0x62, 0xdf, 0x6d, 0xd6, 0xf5, 0x38, 0xbe, 0x3f, 0xa5, 0x85, 0x0a, 0x19, 0xb8,\n+0xa8, 0xd8, 0x09, 0x75, 0x42, 0x70, 0xc4, 0xea, 0xef, 0xcb, 0x0e, 0xc8, 0x34, 0xa8, 0x12, 0x22,\n+0x98, 0x0c, 0xb8, 0x13, 0x94, 0xb6, 0x4b, 0xec, 0xf0, 0xd0, 0x90, 0xe7, 0x27, 0x02, 0x03, 0x01,\n+0x00, 0x01, 0xa3, 0x81, 0xe3, 0x30, 0x81, 0xe0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04,\n+0x16, 0x30, 0x14, 0x81, 0x12, 0x65, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x40, 0x63, 0x61, 0x74, 0x63,\n+0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n+0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n+0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0xa0, 0xc3, 0x8b, 0x44, 0xaa, 0x37, 0xa5, 0x45, 0xbf, 0x97, 0x80, 0x5a, 0xd1,\n+0xf1, 0x78, 0xa2, 0x9b, 0xe9, 0x5d, 0x8d, 0x30, 0x7f, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x78,\n+0x30, 0x76, 0x30, 0x74, 0x06, 0x0b, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xf5, 0x78, 0x01, 0x03, 0x01,\n+0x0a, 0x30, 0x65, 0x30, 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16,\n+0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74,\n+0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65,\n+0x6c, 0x30, 0x35, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x29, 0x1a,\n+0x27, 0x56, 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77,\n+0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76,\n+0x65, 0x72, 0x61, 0x72, 0x72, 0x65, 0x6c, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa0, 0x48, 0x5b, 0x82,\n+0x01, 0xf6, 0x4d, 0x48, 0xb8, 0x39, 0x55, 0x35, 0x9c, 0x80, 0x7a, 0x53, 0x99, 0xd5, 0x5a, 0xff,\n+0xb1, 0x71, 0x3b, 0xcc, 0x39, 0x09, 0x94, 0x5e, 0xd6, 0xda, 0xef, 0xbe, 0x01, 0x5b, 0x5d, 0xd3,\n+0x1e, 0xd8, 0xfd, 0x7d, 0x4f, 0xcd, 0xa0, 0x41, 0xe0, 0x34, 0x93, 0xbf, 0xcb, 0xe2, 0x86, 0x9c,\n+0x37, 0x92, 0x90, 0x56, 0x1c, 0xdc, 0xeb, 0x29, 0x05, 0xe5, 0xc4, 0x9e, 0xc7, 0x35, 0xdf, 0x8a,\n+0x0c, 0xcd, 0xc5, 0x21, 0x43, 0xe9, 0xaa, 0x88, 0xe5, 0x35, 0xc0, 0x19, 0x42, 0x63, 0x5a, 0x02,\n+0x5e, 0xa4, 0x48, 0x18, 0x3a, 0x85, 0x6f, 0xdc, 0x9d, 0xbc, 0x3f, 0x9d, 0x9c, 0xc1, 0x87, 0xb8,\n+0x7a, 0x61, 0x08, 0xe9, 0x77, 0x0b, 0x7f, 0x70, 0xab, 0x7a, 0xdd, 0xd9, 0x97, 0x2c, 0x64, 0x1e,\n+0x85, 0xbf, 0xbc, 0x74, 0x96, 0xa1, 0xc3, 0x7a, 0x12, 0xec, 0x0c, 0x1a, 0x6e, 0x83, 0x0c, 0x3c,\n+0xe8, 0x72, 0x46, 0x9f, 0xfb, 0x48, 0xd5, 0x5e, 0x97, 0xe6, 0xb1, 0xa1, 0xf8, 0xe4, 0xef, 0x46,\n+0x25, 0x94, 0x9c, 0x89, 0xdb, 0x69, 0x38, 0xbe, 0xec, 0x5c, 0x0e, 0x56, 0xc7, 0x65, 0x51, 0xe5,\n+0x50, 0x88, 0x88, 0xbf, 0x42, 0xd5, 0x2b, 0x3d, 0xe5, 0xf9, 0xba, 0x9e, 0x2e, 0xb3, 0xca, 0xf4,\n+0x73, 0x92, 0x02, 0x0b, 0xbe, 0x4c, 0x66, 0xeb, 0x20, 0xfe, 0xb9, 0xcb, 0xb5, 0x99, 0x7f, 0xe6,\n+0xb6, 0x13, 0xfa, 0xca, 0x4b, 0x4d, 0xd9, 0xee, 0x53, 0x46, 0x06, 0x3b, 0xc6, 0x4e, 0xad, 0x93,\n+0x5a, 0x81, 0x7e, 0x6c, 0x2a, 0x4b, 0x6a, 0x05, 0x45, 0x8c, 0xf2, 0x21, 0xa4, 0x31, 0x90, 0x87,\n+0x6c, 0x65, 0x9c, 0x9d, 0xa5, 0x60, 0x95, 0x3a, 0x52, 0x7f, 0xf5, 0xd1, 0xab, 0x08, 0x6e, 0xf3,\n+0xee, 0x5b, 0xf9, 0x88, 0x3d, 0x7e, 0xb8, 0x6f, 0x6e, 0x03, 0xe4, 0x42, 0x30, 0x82, 0x04, 0x2a,\n+0x30, 0x82, 0x03, 0x12, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x38, 0x63, 0xde, 0xf8, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81,\n+0xb4, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x45, 0x6e, 0x74, 0x72,\n+0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x14, 0x37, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65,\n+0x74, 0x2f, 0x43, 0x50, 0x53, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72,\n+0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x2e, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69,\n+0x74, 0x73, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, 0x74,\n+0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,\n+0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75,\n+0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n+0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x28,\n+0x32, 0x30, 0x34, 0x38, 0x29, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x31, 0x32, 0x32, 0x34, 0x31,\n+0x37, 0x35, 0x30, 0x35, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x37, 0x32, 0x34, 0x31, 0x34,\n+0x31, 0x35, 0x31, 0x32, 0x5a, 0x30, 0x81, 0xb4, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x40,\n+0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x14, 0x37, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74,\n+0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x5f, 0x32, 0x30, 0x34,\n+0x38, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66,\n+0x2e, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29,\n+0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, 0x20, 0x31,\n+0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20,\n+0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x65,\n+0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n+0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x28, 0x32, 0x30, 0x34, 0x38, 0x29, 0x30, 0x82, 0x01, 0x22,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n+0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xad, 0x4d, 0x4b,\n+0xa9, 0x12, 0x86, 0xb2, 0xea, 0xa3, 0x20, 0x07, 0x15, 0x16, 0x64, 0x2a, 0x2b, 0x4b, 0xd1, 0xbf,\n+0x0b, 0x4a, 0x4d, 0x8e, 0xed, 0x80, 0x76, 0xa5, 0x67, 0xb7, 0x78, 0x40, 0xc0, 0x73, 0x42, 0xc8,\n+0x68, 0xc0, 0xdb, 0x53, 0x2b, 0xdd, 0x5e, 0xb8, 0x76, 0x98, 0x35, 0x93, 0x8b, 0x1a, 0x9d, 0x7c,\n+0x13, 0x3a, 0x0e, 0x1f, 0x5b, 0xb7, 0x1e, 0xcf, 0xe5, 0x24, 0x14, 0x1e, 0xb1, 0x81, 0xa9, 0x8d,\n+0x7d, 0xb8, 0xcc, 0x6b, 0x4b, 0x03, 0xf1, 0x02, 0x0c, 0xdc, 0xab, 0xa5, 0x40, 0x24, 0x00, 0x7f,\n+0x74, 0x94, 0xa1, 0x9d, 0x08, 0x29, 0xb3, 0x88, 0x0b, 0xf5, 0x87, 0x77, 0x9d, 0x55, 0xcd, 0xe4,\n+0xc3, 0x7e, 0xd7, 0x6a, 0x64, 0xab, 0x85, 0x14, 0x86, 0x95, 0x5b, 0x97, 0x32, 0x50, 0x6f, 0x3d,\n+0xc8, 0xba, 0x66, 0x0c, 0xe3, 0xfc, 0xbd, 0xb8, 0x49, 0xc1, 0x76, 0x89, 0x49, 0x19, 0xfd, 0xc0,\n+0xa8, 0xbd, 0x89, 0xa3, 0x67, 0x2f, 0xc6, 0x9f, 0xbc, 0x71, 0x19, 0x60, 0xb8, 0x2d, 0xe9, 0x2c,\n+0xc9, 0x90, 0x76, 0x66, 0x7b, 0x94, 0xe2, 0xaf, 0x78, 0xd6, 0x65, 0x53, 0x5d, 0x3c, 0xd6, 0x9c,\n+0xb2, 0xcf, 0x29, 0x03, 0xf9, 0x2f, 0xa4, 0x50, 0xb2, 0xd4, 0x48, 0xce, 0x05, 0x32, 0x55, 0x8a,\n+0xfd, 0xb2, 0x64, 0x4c, 0x0e, 0xe4, 0x98, 0x07, 0x75, 0xdb, 0x7f, 0xdf, 0xb9, 0x08, 0x55, 0x60,\n+0x85, 0x30, 0x29, 0xf9, 0x7b, 0x48, 0xa4, 0x69, 0x86, 0xe3, 0x35, 0x3f, 0x1e, 0x86, 0x5d, 0x7a,\n+0x7a, 0x15, 0xbd, 0xef, 0x00, 0x8e, 0x15, 0x22, 0x54, 0x17, 0x00, 0x90, 0x26, 0x93, 0xbc, 0x0e,\n+0x49, 0x68, 0x91, 0xbf, 0xf8, 0x47, 0xd3, 0x9d, 0x95, 0x42, 0xc1, 0x0e, 0x4d, 0xdf, 0x6f, 0x26,\n+0xcf, 0xc3, 0x18, 0x21, 0x62, 0x66, 0x43, 0x70, 0xd6, 0xd5, 0xc0, 0x07, 0xe1, 0x02, 0x03, 0x01,\n+0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n+0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n+0x04, 0x14, 0x55, 0xe4, 0x81, 0xd1, 0x11, 0x80, 0xbe, 0xd8, 0x89, 0xb9, 0x08, 0xa3, 0x31, 0xf9,\n+0xa1, 0x24, 0x09, 0x16, 0xb9, 0x70, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3b, 0x9b, 0x8f, 0x56, 0x9b, 0x30,\n+0xe7, 0x53, 0x99, 0x7c, 0x7a, 0x79, 0xa7, 0x4d, 0x97, 0xd7, 0x19, 0x95, 0x90, 0xfb, 0x06, 0x1f,\n+0xca, 0x33, 0x7c, 0x46, 0x63, 0x8f, 0x96, 0x66, 0x24, 0xfa, 0x40, 0x1b, 0x21, 0x27, 0xca, 0xe6,\n+0x72, 0x73, 0xf2, 0x4f, 0xfe, 0x31, 0x99, 0xfd, 0xc8, 0x0c, 0x4c, 0x68, 0x53, 0xc6, 0x80, 0x82,\n+0x13, 0x98, 0xfa, 0xb6, 0xad, 0xda, 0x5d, 0x3d, 0xf1, 0xce, 0x6e, 0xf6, 0x15, 0x11, 0x94, 0x82,\n+0x0c, 0xee, 0x3f, 0x95, 0xaf, 0x11, 0xab, 0x0f, 0xd7, 0x2f, 0xde, 0x1f, 0x03, 0x8f, 0x57, 0x2c,\n+0x1e, 0xc9, 0xbb, 0x9a, 0x1a, 0x44, 0x95, 0xeb, 0x18, 0x4f, 0xa6, 0x1f, 0xcd, 0x7d, 0x57, 0x10,\n+0x2f, 0x9b, 0x04, 0x09, 0x5a, 0x84, 0xb5, 0x6e, 0xd8, 0x1d, 0x3a, 0xe1, 0xd6, 0x9e, 0xd1, 0x6c,\n+0x79, 0x5e, 0x79, 0x1c, 0x14, 0xc5, 0xe3, 0xd0, 0x4c, 0x93, 0x3b, 0x65, 0x3c, 0xed, 0xdf, 0x3d,\n+0xbe, 0xa6, 0xe5, 0x95, 0x1a, 0xc3, 0xb5, 0x19, 0xc3, 0xbd, 0x5e, 0x5b, 0xbb, 0xff, 0x23, 0xef,\n+0x68, 0x19, 0xcb, 0x12, 0x93, 0x27, 0x5c, 0x03, 0x2d, 0x6f, 0x30, 0xd0, 0x1e, 0xb6, 0x1a, 0xac,\n+0xde, 0x5a, 0xf7, 0xd1, 0xaa, 0xa8, 0x27, 0xa6, 0xfe, 0x79, 0x81, 0xc4, 0x79, 0x99, 0x33, 0x57,\n+0xba, 0x12, 0xb0, 0xa9, 0xe0, 0x42, 0x6c, 0x93, 0xca, 0x56, 0xde, 0xfe, 0x6d, 0x84, 0x0b, 0x08,\n+0x8b, 0x7e, 0x8d, 0xea, 0xd7, 0x98, 0x21, 0xc6, 0xf3, 0xe7, 0x3c, 0x79, 0x2f, 0x5e, 0x9c, 0xd1,\n+0x4c, 0x15, 0x8d, 0xe1, 0xec, 0x22, 0x37, 0xcc, 0x9a, 0x43, 0x0b, 0x97, 0xdc, 0x80, 0x90, 0x8d,\n+0xb3, 0x67, 0x9b, 0x6f, 0x48, 0x08, 0x15, 0x56, 0xcf, 0xbf, 0xf1, 0x2b, 0x7c, 0x5e, 0x9a, 0x76,\n+0xe9, 0x59, 0x90, 0xc5, 0x7c, 0x83, 0x35, 0x11, 0x65, 0x51, 0x30, 0x82, 0x04, 0x32, 0x30, 0x82,\n+0x03, 0x1a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04,\n+0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68,\n+0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07,\n+0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x0c, 0x11, 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69,\n+0x74, 0x65, 0x64, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x18, 0x41, 0x41,\n+0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65,\n+0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x31, 0x30, 0x31,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, 0x33, 0x31, 0x32,\n+0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12,\n+0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74,\n+0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c,\n+0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43,\n+0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,\n+0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x18, 0x41, 0x41, 0x41, 0x20, 0x43,\n+0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69,\n+0x63, 0x65, 0x73, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02,\n+0x82, 0x01, 0x01, 0x00, 0xbe, 0x40, 0x9d, 0xf4, 0x6e, 0xe1, 0xea, 0x76, 0x87, 0x1c, 0x4d, 0x45,\n+0x44, 0x8e, 0xbe, 0x46, 0xc8, 0x83, 0x06, 0x9d, 0xc1, 0x2a, 0xfe, 0x18, 0x1f, 0x8e, 0xe4, 0x02,\n+0xfa, 0xf3, 0xab, 0x5d, 0x50, 0x8a, 0x16, 0x31, 0x0b, 0x9a, 0x06, 0xd0, 0xc5, 0x70, 0x22, 0xcd,\n+0x49, 0x2d, 0x54, 0x63, 0xcc, 0xb6, 0x6e, 0x68, 0x46, 0x0b, 0x53, 0xea, 0xcb, 0x4c, 0x24, 0xc0,\n+0xbc, 0x72, 0x4e, 0xea, 0xf1, 0x15, 0xae, 0xf4, 0x54, 0x9a, 0x12, 0x0a, 0xc3, 0x7a, 0xb2, 0x33,\n+0x60, 0xe2, 0xda, 0x89, 0x55, 0xf3, 0x22, 0x58, 0xf3, 0xde, 0xdc, 0xcf, 0xef, 0x83, 0x86, 0xa2,\n+0x8c, 0x94, 0x4f, 0x9f, 0x68, 0xf2, 0x98, 0x90, 0x46, 0x84, 0x27, 0xc7, 0x76, 0xbf, 0xe3, 0xcc,\n+0x35, 0x2c, 0x8b, 0x5e, 0x07, 0x64, 0x65, 0x82, 0xc0, 0x48, 0xb0, 0xa8, 0x91, 0xf9, 0x61, 0x9f,\n+0x76, 0x20, 0x50, 0xa8, 0x91, 0xc7, 0x66, 0xb5, 0xeb, 0x78, 0x62, 0x03, 0x56, 0xf0, 0x8a, 0x1a,\n+0x13, 0xea, 0x31, 0xa3, 0x1e, 0xa0, 0x99, 0xfd, 0x38, 0xf6, 0xf6, 0x27, 0x32, 0x58, 0x6f, 0x07,\n+0xf5, 0x6b, 0xb8, 0xfb, 0x14, 0x2b, 0xaf, 0xb7, 0xaa, 0xcc, 0xd6, 0x63, 0x5f, 0x73, 0x8c, 0xda,\n+0x05, 0x99, 0xa8, 0x38, 0xa8, 0xcb, 0x17, 0x78, 0x36, 0x51, 0xac, 0xe9, 0x9e, 0xf4, 0x78, 0x3a,\n+0x8d, 0xcf, 0x0f, 0xd9, 0x42, 0xe2, 0x98, 0x0c, 0xab, 0x2f, 0x9f, 0x0e, 0x01, 0xde, 0xef, 0x9f,\n+0x99, 0x49, 0xf1, 0x2d, 0xdf, 0xac, 0x74, 0x4d, 0x1b, 0x98, 0xb5, 0x47, 0xc5, 0xe5, 0x29, 0xd1,\n+0xf9, 0x90, 0x18, 0xc7, 0x62, 0x9c, 0xbe, 0x83, 0xc7, 0x26, 0x7b, 0x3e, 0x8a, 0x25, 0xc7, 0xc0,\n+0xdd, 0x9d, 0xe6, 0x35, 0x68, 0x10, 0x20, 0x9d, 0x8f, 0xd8, 0xde, 0xd2, 0xc3, 0x84, 0x9c, 0x0d,\n+0x5e, 0xe8, 0x2f, 0xc9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xc0, 0x30, 0x81, 0xbd, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa0, 0x11, 0x0a, 0x23, 0x3e, 0x96,\n+0xf1, 0x07, 0xec, 0xe2, 0xaf, 0x29, 0xef, 0x82, 0xa5, 0x7f, 0xd0, 0x30, 0xa4, 0xb4, 0x30, 0x0e,\n+0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f,\n+0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n+0x7b, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x74, 0x30, 0x72, 0x30, 0x38, 0xa0, 0x36, 0xa0, 0x34,\n+0x86, 0x32, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d,\n+0x6f, 0x64, 0x6f, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x41, 0x41, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73,\n+0x2e, 0x63, 0x72, 0x6c, 0x30, 0x36, 0xa0, 0x34, 0xa0, 0x32, 0x86, 0x30, 0x68, 0x74, 0x74, 0x70,\n+0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x2e, 0x6e, 0x65,\n+0x74, 0x2f, 0x41, 0x41, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n+0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,\n+0x08, 0x56, 0xfc, 0x02, 0xf0, 0x9b, 0xe8, 0xff, 0xa4, 0xfa, 0xd6, 0x7b, 0xc6, 0x44, 0x80, 0xce,\n+0x4f, 0xc4, 0xc5, 0xf6, 0x00, 0x58, 0xcc, 0xa6, 0xb6, 0xbc, 0x14, 0x49, 0x68, 0x04, 0x76, 0xe8,\n+0xe6, 0xee, 0x5d, 0xec, 0x02, 0x0f, 0x60, 0xd6, 0x8d, 0x50, 0x18, 0x4f, 0x26, 0x4e, 0x01, 0xe3,\n+0xe6, 0xb0, 0xa5, 0xee, 0xbf, 0xbc, 0x74, 0x54, 0x41, 0xbf, 0xfd, 0xfc, 0x12, 0xb8, 0xc7, 0x4f,\n+0x5a, 0xf4, 0x89, 0x60, 0x05, 0x7f, 0x60, 0xb7, 0x05, 0x4a, 0xf3, 0xf6, 0xf1, 0xc2, 0xbf, 0xc4,\n+0xb9, 0x74, 0x86, 0xb6, 0x2d, 0x7d, 0x6b, 0xcc, 0xd2, 0xf3, 0x46, 0xdd, 0x2f, 0xc6, 0xe0, 0x6a,\n+0xc3, 0xc3, 0x34, 0x03, 0x2c, 0x7d, 0x96, 0xdd, 0x5a, 0xc2, 0x0e, 0xa7, 0x0a, 0x99, 0xc1, 0x05,\n+0x8b, 0xab, 0x0c, 0x2f, 0xf3, 0x5c, 0x3a, 0xcf, 0x6c, 0x37, 0x55, 0x09, 0x87, 0xde, 0x53, 0x40,\n+0x6c, 0x58, 0xef, 0xfc, 0xb6, 0xab, 0x65, 0x6e, 0x04, 0xf6, 0x1b, 0xdc, 0x3c, 0xe0, 0x5a, 0x15,\n+0xc6, 0x9e, 0xd9, 0xf1, 0x59, 0x48, 0x30, 0x21, 0x65, 0x03, 0x6c, 0xec, 0xe9, 0x21, 0x73, 0xec,\n+0x9b, 0x03, 0xa1, 0xe0, 0x37, 0xad, 0xa0, 0x15, 0x18, 0x8f, 0xfa, 0xba, 0x02, 0xce, 0xa7, 0x2c,\n+0xa9, 0x10, 0x13, 0x2c, 0xd4, 0xe5, 0x08, 0x26, 0xab, 0x22, 0x97, 0x60, 0xf8, 0x90, 0x5e, 0x74,\n+0xd4, 0xa2, 0x9a, 0x53, 0xbd, 0xf2, 0xa9, 0x68, 0xe0, 0xa2, 0x6e, 0xc2, 0xd7, 0x6c, 0xb1, 0xa3,\n+0x0f, 0x9e, 0xbf, 0xeb, 0x68, 0xe7, 0x56, 0xf2, 0xae, 0xf2, 0xe3, 0x2b, 0x38, 0x3a, 0x09, 0x81,\n+0xb5, 0x6b, 0x85, 0xd7, 0xbe, 0x2d, 0xed, 0x3f, 0x1a, 0xb7, 0xb2, 0x63, 0xe2, 0xf5, 0x62, 0x2c,\n+0x82, 0xd4, 0x6a, 0x00, 0x41, 0x50, 0xf1, 0x39, 0x83, 0x9f, 0x95, 0xe9, 0x36, 0x96, 0x98, 0x6e,\n+0x30, 0x82, 0x07, 0xd3, 0x30, 0x82, 0x05, 0xbb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x5e,\n+0xc3, 0xb7, 0xa6, 0x43, 0x7f, 0xa4, 0xe0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x42, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x0c, 0x09, 0x41, 0x43, 0x43, 0x56, 0x52, 0x41, 0x49, 0x5a, 0x31, 0x31, 0x10, 0x30, 0x0e,\n+0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x07, 0x50, 0x4b, 0x49, 0x41, 0x43, 0x43, 0x56, 0x31, 0x0d,\n+0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x43, 0x43, 0x56, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31,\n+0x30, 0x35, 0x30, 0x35, 0x30, 0x39, 0x33, 0x37, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31,\n+0x32, 0x33, 0x31, 0x30, 0x39, 0x33, 0x37, 0x33, 0x37, 0x5a, 0x30, 0x42, 0x31, 0x12, 0x30, 0x10,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x09, 0x41, 0x43, 0x43, 0x56, 0x52, 0x41, 0x49, 0x5a, 0x31,\n+0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x07, 0x50, 0x4b, 0x49, 0x41, 0x43,\n+0x43, 0x56, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x43, 0x43,\n+0x56, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x30, 0x82,\n+0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x9b,\n+0xa9, 0xab, 0xbf, 0x61, 0x4a, 0x97, 0xaf, 0x2f, 0x97, 0x66, 0x9a, 0x74, 0x5f, 0xd0, 0xd9, 0x96,\n+0xfd, 0xcf, 0xe2, 0xe4, 0x66, 0xef, 0x1f, 0x1f, 0x47, 0x33, 0xc2, 0x44, 0xa3, 0xdf, 0x9a, 0xde,\n+0x1f, 0xb5, 0x54, 0xdd, 0x15, 0x7c, 0x69, 0x35, 0x11, 0x6f, 0xbb, 0xc8, 0x0c, 0x8e, 0x6a, 0x18,\n+0x1e, 0xd8, 0x8f, 0xd9, 0x16, 0xbc, 0x10, 0x48, 0x36, 0x5c, 0xf0, 0x63, 0xb3, 0x90, 0x5a, 0x5c,\n+0x24, 0x37, 0xd7, 0xa3, 0xd6, 0xcb, 0x09, 0x71, 0xb9, 0xf1, 0x01, 0x72, 0x84, 0xb0, 0x7d, 0xdb,\n+0x4d, 0x80, 0xcd, 0xfc, 0xd3, 0x6f, 0xc9, 0xf8, 0xda, 0xb6, 0x0e, 0x82, 0xd2, 0x45, 0x85, 0xa8,\n+0x1b, 0x68, 0xa8, 0x3d, 0xe8, 0xf4, 0x44, 0x6c, 0xbd, 0xa1, 0xc2, 0xcb, 0x03, 0xbe, 0x8c, 0x3e,\n+0x13, 0x00, 0x84, 0xdf, 0x4a, 0x48, 0xc0, 0xe3, 0x22, 0x0a, 0xe8, 0xe9, 0x37, 0xa7, 0x18, 0x4c,\n+0xb1, 0x09, 0x0d, 0x23, 0x56, 0x7f, 0x04, 0x4d, 0xd9, 0x17, 0x84, 0x18, 0xa5, 0xc8, 0xda, 0x40,\n+0x94, 0x73, 0xeb, 0xce, 0x0e, 0x57, 0x3c, 0x03, 0x81, 0x3a, 0x9d, 0x0a, 0xa1, 0x57, 0x43, 0x69,\n+0xac, 0x57, 0x6d, 0x79, 0x90, 0x78, 0xe5, 0xb5, 0xb4, 0x3b, 0xd8, 0xbc, 0x4c, 0x8d, 0x28, 0xa1,\n+0xa7, 0xa3, 0xa7, 0xba, 0x02, 0x4e, 0x25, 0xd1, 0x2a, 0xae, 0xed, 0xae, 0x03, 0x22, 0xb8, 0x6b,\n+0x20, 0x0f, 0x30, 0x28, 0x54, 0x95, 0x7f, 0xe0, 0xee, 0xce, 0x0a, 0x66, 0x9d, 0xd1, 0x40, 0x2d,\n+0x6e, 0x22, 0xaf, 0x9d, 0x1a, 0xc1, 0x05, 0x19, 0xd2, 0x6f, 0xc0, 0xf2, 0x9f, 0xf8, 0x7b, 0xb3,\n+0x02, 0x42, 0xfb, 0x50, 0xa9, 0x1d, 0x2d, 0x93, 0x0f, 0x23, 0xab, 0xc6, 0xc1, 0x0f, 0x92, 0xff,\n+0xd0, 0xa2, 0x15, 0xf5, 0x53, 0x09, 0x71, 0x1c, 0xff, 0x45, 0x13, 0x84, 0xe6, 0x26, 0x5e, 0xf8,\n+0xe0, 0x88, 0x1c, 0x0a, 0xfc, 0x16, 0xb6, 0xa8, 0x73, 0x06, 0xb8, 0xf0, 0x63, 0x84, 0x02, 0xa0,\n+0xc6, 0x5a, 0xec, 0xe7, 0x74, 0xdf, 0x70, 0xae, 0xa3, 0x83, 0x25, 0xea, 0xd6, 0xc7, 0x97, 0x87,\n+0x93, 0xa7, 0xc6, 0x8a, 0x8a, 0x33, 0x97, 0x60, 0x37, 0x10, 0x3e, 0x97, 0x3e, 0x6e, 0x29, 0x15,\n+0xd6, 0xa1, 0x0f, 0xd1, 0x88, 0x2c, 0x12, 0x9f, 0x6f, 0xaa, 0xa4, 0xc6, 0x42, 0xeb, 0x41, 0xa2,\n+0xe3, 0x95, 0x43, 0xd3, 0x01, 0x85, 0x6d, 0x8e, 0xbb, 0x3b, 0xf3, 0x23, 0x36, 0xc7, 0xfe, 0x3b,\n+0xe0, 0xa1, 0x25, 0x07, 0x48, 0xab, 0xc9, 0x89, 0x74, 0xff, 0x08, 0x8f, 0x80, 0xbf, 0xc0, 0x96,\n+0x65, 0xf3, 0xee, 0xec, 0x4b, 0x68, 0xbd, 0x9d, 0x88, 0xc3, 0x31, 0xb3, 0x40, 0xf1, 0xe8, 0xcf,\n+0xf6, 0x38, 0xbb, 0x9c, 0xe4, 0xd1, 0x7f, 0xd4, 0xe5, 0x58, 0x9b, 0x7c, 0xfa, 0xd4, 0xf3, 0x0e,\n+0x9b, 0x75, 0x91, 0xe4, 0xba, 0x52, 0x2e, 0x19, 0x7e, 0xd1, 0xf5, 0xcd, 0x5a, 0x19, 0xfc, 0xba,\n+0x06, 0xf6, 0xfb, 0x52, 0xa8, 0x4b, 0x99, 0x04, 0xdd, 0xf8, 0xf9, 0xb4, 0x8b, 0x50, 0xa3, 0x4e,\n+0x62, 0x89, 0xf0, 0x87, 0x24, 0xfa, 0x83, 0x42, 0xc1, 0x87, 0xfa, 0xd5, 0x2d, 0x29, 0x2a, 0x5a,\n+0x71, 0x7a, 0x64, 0x6a, 0xd7, 0x27, 0x60, 0x63, 0x0d, 0xdb, 0xce, 0x49, 0xf5, 0x8d, 0x1f, 0x90,\n+0x89, 0x32, 0x17, 0xf8, 0x73, 0x43, 0xb8, 0xd2, 0x5a, 0x93, 0x86, 0x61, 0xd6, 0xe1, 0x75, 0x0a,\n+0xea, 0x79, 0x66, 0x76, 0x88, 0x4f, 0x71, 0xeb, 0x04, 0x25, 0xd6, 0x0a, 0x5a, 0x7a, 0x93, 0xe5,\n+0xb9, 0x4b, 0x17, 0x40, 0x0f, 0xb1, 0xb6, 0xb9, 0xf5, 0xde, 0x4f, 0xdc, 0xe0, 0xb3, 0xac, 0x3b,\n+0x11, 0x70, 0x60, 0x84, 0x4a, 0x43, 0x6e, 0x99, 0x20, 0xc0, 0x29, 0x71, 0x0a, 0xc0, 0x65, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0xcb, 0x30, 0x82, 0x02, 0xc7, 0x30, 0x7d, 0x06, 0x08,\n+0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x71, 0x30, 0x6f, 0x30, 0x4c, 0x06, 0x08,\n+0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x40, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,\n+0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x6c,\n+0x65, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x6f, 0x73, 0x2f,\n+0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x64, 0x6f, 0x73, 0x2f, 0x72, 0x61, 0x69,\n+0x7a, 0x61, 0x63, 0x63, 0x76, 0x31, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x1f, 0x06, 0x08, 0x2b, 0x06,\n+0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x13, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f,\n+0x63, 0x73, 0x70, 0x2e, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65, 0x73, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd2, 0x87, 0xb4, 0xe3, 0xdf, 0x37, 0x27, 0x93, 0x55, 0xf6,\n+0x56, 0xea, 0x81, 0xe5, 0x36, 0xcc, 0x8c, 0x1e, 0x3f, 0xbd, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,\n+0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55,\n+0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xd2, 0x87, 0xb4, 0xe3, 0xdf, 0x37, 0x27, 0x93,\n+0x55, 0xf6, 0x56, 0xea, 0x81, 0xe5, 0x36, 0xcc, 0x8c, 0x1e, 0x3f, 0xbd, 0x30, 0x82, 0x01, 0x73,\n+0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x82, 0x01, 0x6a, 0x30, 0x82, 0x01, 0x66, 0x30, 0x82, 0x01,\n+0x62, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x82, 0x01, 0x58, 0x30, 0x82, 0x01, 0x22, 0x06,\n+0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x82, 0x01, 0x14, 0x1e, 0x82, 0x01,\n+0x10, 0x00, 0x41, 0x00, 0x75, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, 0x64, 0x00,\n+0x61, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, 0x00,\n+0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00,\n+0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x52, 0x00, 0x61, 0x00, 0xed, 0x00, 0x7a, 0x00,\n+0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x20, 0x00, 0x41, 0x00,\n+0x43, 0x00, 0x43, 0x00, 0x56, 0x00, 0x20, 0x00, 0x28, 0x00, 0x41, 0x00, 0x67, 0x00, 0x65, 0x00,\n+0x6e, 0x00, 0x63, 0x00, 0x69, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00,\n+0x54, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x67, 0x00,\n+0xed, 0x00, 0x61, 0x00, 0x20, 0x00, 0x79, 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, 0x00, 0x72, 0x00,\n+0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x69, 0x00,\n+0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x45, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00,\n+0x72, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x2c, 0x00, 0x20, 0x00,\n+0x43, 0x00, 0x49, 0x00, 0x46, 0x00, 0x20, 0x00, 0x51, 0x00, 0x34, 0x00, 0x36, 0x00, 0x30, 0x00,\n+0x31, 0x00, 0x31, 0x00, 0x35, 0x00, 0x36, 0x00, 0x45, 0x00, 0x29, 0x00, 0x2e, 0x00, 0x20, 0x00,\n+0x43, 0x00, 0x50, 0x00, 0x53, 0x00, 0x20, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x68, 0x00,\n+0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00,\n+0x77, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x76, 0x00, 0x2e, 0x00, 0x65, 0x00,\n+0x73, 0x30, 0x30, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x24, 0x68,\n+0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65,\n+0x73, 0x2f, 0x6c, 0x65, 0x67, 0x69, 0x73, 0x6c, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x2e,\n+0x68, 0x74, 0x6d, 0x30, 0x55, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x4e, 0x30, 0x4c, 0x30, 0x4a,\n+0xa0, 0x48, 0xa0, 0x46, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,\n+0x2e, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x61, 0x64, 0x6d,\n+0x69, 0x6e, 0x2f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x6f, 0x73, 0x2f, 0x63, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x63, 0x61, 0x64, 0x6f, 0x73, 0x2f, 0x72, 0x61, 0x69, 0x7a, 0x61, 0x63, 0x63,\n+0x76, 0x31, 0x5f, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x17, 0x06, 0x03, 0x55, 0x1d,\n+0x11, 0x04, 0x10, 0x30, 0x0e, 0x81, 0x0c, 0x61, 0x63, 0x63, 0x76, 0x40, 0x61, 0x63, 0x63, 0x76,\n+0x2e, 0x65, 0x73, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x97, 0x31, 0x02, 0x9f, 0xe7, 0xfd, 0x43, 0x67, 0x48,\n+0x44, 0x14, 0xe4, 0x29, 0x87, 0xed, 0x4c, 0x28, 0x66, 0xd0, 0x8f, 0x35, 0xda, 0x4d, 0x61, 0xb7,\n+0x4a, 0x97, 0x4d, 0xb5, 0xdb, 0x90, 0xe0, 0x05, 0x2e, 0x0e, 0xc6, 0x79, 0xd0, 0xf2, 0x97, 0x69,\n+0x0f, 0xbd, 0x04, 0x47, 0xd9, 0xbe, 0xdb, 0xb5, 0x29, 0xda, 0x9b, 0xd9, 0xae, 0xa9, 0x99, 0xd5,\n+0xd3, 0x3c, 0x30, 0x93, 0xf5, 0x8d, 0xa1, 0xa8, 0xfc, 0x06, 0x8d, 0x44, 0xf4, 0xca, 0x16, 0x95,\n+0x7c, 0x33, 0xdc, 0x62, 0x8b, 0xa8, 0x37, 0xf8, 0x27, 0xd8, 0x09, 0x2d, 0x1b, 0xef, 0xc8, 0x14,\n+0x27, 0x20, 0xa9, 0x64, 0x44, 0xff, 0x2e, 0xd6, 0x75, 0xaa, 0x6c, 0x4d, 0x60, 0x40, 0x19, 0x49,\n+0x43, 0x54, 0x63, 0xda, 0xe2, 0xcc, 0xba, 0x66, 0xe5, 0x4f, 0x44, 0x7a, 0x5b, 0xd9, 0x6a, 0x81,\n+0x2b, 0x40, 0xd5, 0x7f, 0xf9, 0x01, 0x27, 0x58, 0x2c, 0xc8, 0xed, 0x48, 0x91, 0x7c, 0x3f, 0xa6,\n+0x00, 0xcf, 0xc4, 0x29, 0x73, 0x11, 0x36, 0xde, 0x86, 0x19, 0x3e, 0x9d, 0xee, 0x19, 0x8a, 0x1b,\n+0xd5, 0xb0, 0xed, 0x8e, 0x3d, 0x9c, 0x2a, 0xc0, 0x0d, 0xd8, 0x3d, 0x66, 0xe3, 0x3c, 0x0d, 0xbd,\n+0xd5, 0x94, 0x5c, 0xe2, 0xe2, 0xa7, 0x35, 0x1b, 0x04, 0x00, 0xf6, 0x3f, 0x5a, 0x8d, 0xea, 0x43,\n+0xbd, 0x5f, 0x89, 0x1d, 0xa9, 0xc1, 0xb0, 0xcc, 0x99, 0xe2, 0x4d, 0x00, 0x0a, 0xda, 0xc9, 0x27,\n+0x5b, 0xe7, 0x13, 0x90, 0x5c, 0xe4, 0xf5, 0x33, 0xa2, 0x55, 0x6d, 0xdc, 0xe0, 0x09, 0x4d, 0x2f,\n+0xb1, 0x26, 0x5b, 0x27, 0x75, 0x00, 0x09, 0xc4, 0x62, 0x77, 0x29, 0x08, 0x5f, 0x9e, 0x59, 0xac,\n+0xb6, 0x7e, 0xad, 0x9f, 0x54, 0x30, 0x22, 0x03, 0xc1, 0x1e, 0x71, 0x64, 0xfe, 0xf9, 0x38, 0x0a,\n+0x96, 0x18, 0xdd, 0x02, 0x14, 0xac, 0x23, 0xcb, 0x06, 0x1c, 0x1e, 0xa4, 0x7d, 0x8d, 0x0d, 0xde,\n+0x27, 0x41, 0xe8, 0xad, 0xda, 0x15, 0xb7, 0xb0, 0x23, 0xdd, 0x2b, 0xa8, 0xd3, 0xda, 0x25, 0x87,\n+0xed, 0xe8, 0x55, 0x44, 0x4d, 0x88, 0xf4, 0x36, 0x7e, 0x84, 0x9a, 0x78, 0xac, 0xf7, 0x0e, 0x56,\n+0x49, 0x0e, 0xd6, 0x33, 0x25, 0xd6, 0x84, 0x50, 0x42, 0x6c, 0x20, 0x12, 0x1d, 0x2a, 0xd5, 0xbe,\n+0xbc, 0xf2, 0x70, 0x81, 0xa4, 0x70, 0x60, 0xbe, 0x05, 0xb5, 0x9b, 0x9e, 0x04, 0x44, 0xbe, 0x61,\n+0x23, 0xac, 0xe9, 0xa5, 0x24, 0x8c, 0x11, 0x80, 0x94, 0x5a, 0xa2, 0xa2, 0xb9, 0x49, 0xd2, 0xc1,\n+0xdc, 0xd1, 0xa7, 0xed, 0x31, 0x11, 0x2c, 0x9e, 0x19, 0xa6, 0xee, 0xe1, 0x55, 0xe1, 0xc0, 0xea,\n+0xcf, 0x0d, 0x84, 0xe4, 0x17, 0xb7, 0xa2, 0x7c, 0xa5, 0xde, 0x55, 0x25, 0x06, 0xee, 0xcc, 0xc0,\n+0x87, 0x5c, 0x40, 0xda, 0xcc, 0x95, 0x3f, 0x55, 0xe0, 0x35, 0xc7, 0xb8, 0x84, 0xbe, 0xb4, 0x5d,\n+0xcd, 0x7a, 0x83, 0x01, 0x72, 0xee, 0x87, 0xe6, 0x5f, 0x1d, 0xae, 0xb5, 0x85, 0xc6, 0x26, 0xdf,\n+0xe6, 0xc1, 0x9a, 0xe9, 0x1e, 0x02, 0x47, 0x9f, 0x2a, 0xa8, 0x6d, 0xa9, 0x5b, 0xcf, 0xec, 0x45,\n+0x77, 0x7f, 0x98, 0x27, 0x9a, 0x32, 0x5d, 0x2a, 0xe3, 0x84, 0xee, 0xc5, 0x98, 0x66, 0x2f, 0x96,\n+0x20, 0x1d, 0xdd, 0xd8, 0xc3, 0x27, 0xd7, 0xb0, 0xf9, 0xfe, 0xd9, 0x7d, 0xcd, 0xd0, 0x9f, 0x8f,\n+0x0b, 0x14, 0x58, 0x51, 0x9f, 0x2f, 0x8b, 0xc3, 0x38, 0x2d, 0xde, 0xe8, 0x8f, 0xd6, 0x8d, 0x87,\n+0xa4, 0xf5, 0x56, 0x43, 0x16, 0x99, 0x2c, 0xf4, 0xa4, 0x56, 0xb4, 0x34, 0xb8, 0x61, 0x37, 0xc9,\n+0xc2, 0x58, 0x80, 0x1b, 0xa0, 0x97, 0xa1, 0xfc, 0x59, 0x8d, 0xe9, 0x11, 0xf6, 0xd1, 0x0f, 0x4b,\n+0x55, 0x34, 0x46, 0x2a, 0x8b, 0x86, 0x3b, 0x30, 0x82, 0x05, 0xbb, 0x30, 0x82, 0x03, 0xa3, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x57, 0x0a, 0x11, 0x97, 0x42, 0xc4, 0xe3, 0xcc, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x6b, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x54, 0x31, 0x0e, 0x30, 0x0c,\n+0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x05, 0x4d, 0x69, 0x6c, 0x61, 0x6e, 0x31, 0x23, 0x30, 0x21,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x41, 0x63, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x20, 0x53,\n+0x2e, 0x70, 0x2e, 0x41, 0x2e, 0x2f, 0x30, 0x33, 0x33, 0x35, 0x38, 0x35, 0x32, 0x30, 0x39, 0x36,\n+0x37, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x41, 0x63, 0x74, 0x61,\n+0x6c, 0x69, 0x73, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69,\n+0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31,\n+0x30, 0x39, 0x32, 0x32, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x30,\n+0x39, 0x32, 0x32, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, 0x5a, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x54, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55,\n+0x04, 0x07, 0x0c, 0x05, 0x4d, 0x69, 0x6c, 0x61, 0x6e, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x0c, 0x1a, 0x41, 0x63, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x20, 0x53, 0x2e, 0x70, 0x2e,\n+0x41, 0x2e, 0x2f, 0x30, 0x33, 0x33, 0x35, 0x38, 0x35, 0x32, 0x30, 0x39, 0x36, 0x37, 0x31, 0x27,\n+0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x41, 0x63, 0x74, 0x61, 0x6c, 0x69, 0x73,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30,\n+0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa7, 0xc6, 0xc4, 0xa5, 0x29, 0xa4, 0x2c, 0xef,\n+0xe5, 0x18, 0xc5, 0xb0, 0x50, 0xa3, 0x6f, 0x51, 0x3b, 0x9f, 0x0a, 0x5a, 0xc9, 0xc2, 0x48, 0x38,\n+0x0a, 0xc2, 0x1c, 0xa0, 0x18, 0x7f, 0x91, 0xb5, 0x87, 0xb9, 0x40, 0x3f, 0xdd, 0x1d, 0x68, 0x1f,\n+0x08, 0x83, 0xd5, 0x2d, 0x1e, 0x88, 0xa0, 0xf8, 0x8f, 0x56, 0x8f, 0x6d, 0x99, 0x02, 0x92, 0x90,\n+0x16, 0xd5, 0x5f, 0x08, 0x6c, 0x89, 0xd7, 0xe1, 0xac, 0xbc, 0x20, 0xc2, 0xb1, 0xe0, 0x83, 0x51,\n+0x8a, 0x69, 0x4d, 0x00, 0x96, 0x5a, 0x6f, 0x2f, 0xc0, 0x44, 0x7e, 0xa3, 0x0e, 0xe4, 0x91, 0xcd,\n+0x58, 0xee, 0xdc, 0xfb, 0xc7, 0x1e, 0x45, 0x47, 0xdd, 0x27, 0xb9, 0x08, 0x01, 0x9f, 0xa6, 0x21,\n+0x1d, 0xf5, 0x41, 0x2d, 0x2f, 0x4c, 0xfd, 0x28, 0xad, 0xe0, 0x8a, 0xad, 0x22, 0xb4, 0x56, 0x65,\n+0x8e, 0x86, 0x54, 0x8f, 0x93, 0x43, 0x29, 0xde, 0x39, 0x46, 0x78, 0xa3, 0x30, 0x23, 0xba, 0xcd,\n+0xf0, 0x7d, 0x13, 0x57, 0xc0, 0x5d, 0xd2, 0x83, 0x6b, 0x48, 0x4c, 0xc4, 0xab, 0x9f, 0x80, 0x5a,\n+0x5b, 0x3a, 0xbd, 0xc9, 0xa7, 0x22, 0x3f, 0x80, 0x27, 0x33, 0x5b, 0x0e, 0xb7, 0x8a, 0x0c, 0x5d,\n+0x07, 0x37, 0x08, 0xcb, 0x6c, 0xd2, 0x7a, 0x47, 0x22, 0x44, 0x35, 0xc5, 0xcc, 0xcc, 0x2e, 0x8e,\n+0xdd, 0x2a, 0xed, 0xb7, 0x7d, 0x66, 0x0d, 0x5f, 0x61, 0x51, 0x22, 0x55, 0x1b, 0xe3, 0x46, 0xe3,\n+0xe3, 0x3d, 0xd0, 0x35, 0x62, 0x9a, 0xdb, 0xaf, 0x14, 0xc8, 0x5b, 0xa1, 0xcc, 0x89, 0x1b, 0xe1,\n+0x30, 0x26, 0xfc, 0xa0, 0x9b, 0x1f, 0x81, 0xa7, 0x47, 0x1f, 0x04, 0xeb, 0xa3, 0x39, 0x92, 0x06,\n+0x9f, 0x99, 0xd3, 0xbf, 0xd3, 0xea, 0x4f, 0x50, 0x9c, 0x19, 0xfe, 0x96, 0x87, 0x1e, 0x3c, 0x65,\n+0xf6, 0xa3, 0x18, 0x24, 0x83, 0x86, 0x10, 0xe7, 0x54, 0x3e, 0xa8, 0x3a, 0x76, 0x24, 0x4f, 0x81,\n+0x21, 0xc5, 0xe3, 0x0f, 0x02, 0xf8, 0x93, 0x94, 0x47, 0x20, 0xbb, 0xfe, 0xd4, 0x0e, 0xd3, 0x68,\n+0xb9, 0xdd, 0xc4, 0x7a, 0x84, 0x82, 0xe3, 0x53, 0x54, 0x79, 0xdd, 0xdb, 0x9c, 0xd2, 0xf2, 0x07,\n+0x9b, 0x2e, 0xb6, 0xbc, 0x3e, 0xed, 0x85, 0x6d, 0xef, 0x25, 0x11, 0xf2, 0x97, 0x1a, 0x42, 0x61,\n+0xf7, 0x4a, 0x97, 0xe8, 0x8b, 0xb1, 0x10, 0x07, 0xfa, 0x65, 0x81, 0xb2, 0xa2, 0x39, 0xcf, 0xf7,\n+0x3c, 0xff, 0x18, 0xfb, 0xc6, 0xf1, 0x5a, 0x8b, 0x59, 0xe2, 0x02, 0xac, 0x7b, 0x92, 0xd0, 0x4e,\n+0x14, 0x4f, 0x59, 0x45, 0xf6, 0x0c, 0x5e, 0x28, 0x5f, 0xb0, 0xe8, 0x3f, 0x45, 0xcf, 0xcf, 0xaf,\n+0x9b, 0x6f, 0xfb, 0x84, 0xd3, 0x77, 0x5a, 0x95, 0x6f, 0xac, 0x94, 0x84, 0x9e, 0xee, 0xbc, 0xc0,\n+0x4a, 0x8f, 0x4a, 0x93, 0xf8, 0x44, 0x21, 0xe2, 0x31, 0x45, 0x61, 0x50, 0x4e, 0x10, 0xd8, 0xe3,\n+0x35, 0x7c, 0x4c, 0x19, 0xb4, 0xde, 0x05, 0xbf, 0xa3, 0x06, 0x9f, 0xc8, 0xb5, 0xcd, 0xe4, 0x1f,\n+0xd7, 0x17, 0x06, 0x0d, 0x7a, 0x95, 0x74, 0x55, 0x0d, 0x68, 0x1a, 0xfc, 0x10, 0x1b, 0x62, 0x64,\n+0x9d, 0x6d, 0xe0, 0x95, 0xa0, 0xc3, 0x94, 0x07, 0x57, 0x0d, 0x14, 0xe6, 0xbd, 0x05, 0xfb, 0xb8,\n+0x9f, 0xe6, 0xdf, 0x8b, 0xe2, 0xc6, 0xe7, 0x7e, 0x96, 0xf6, 0x53, 0xc5, 0x80, 0x34, 0x50, 0x28,\n+0x58, 0xf0, 0x12, 0x50, 0x71, 0x17, 0x30, 0xba, 0xe6, 0x78, 0x63, 0xbc, 0xf4, 0xb2, 0xad, 0x9b,\n+0x2b, 0xb2, 0xfe, 0xe1, 0x39, 0x8c, 0x5e, 0xba, 0x0b, 0x20, 0x94, 0xde, 0x7b, 0x83, 0xb8, 0xff,\n+0xe3, 0x56, 0x8d, 0xb7, 0x11, 0xe9, 0x3b, 0x8c, 0xf2, 0xb1, 0xc1, 0x5d, 0x9d, 0xa4, 0x0b, 0x4c,\n+0x2b, 0xd9, 0xb2, 0x18, 0xf5, 0xb5, 0x9f, 0x4b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30,\n+0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x52, 0xd8, 0x88, 0x3a,\n+0xc8, 0x9f, 0x78, 0x66, 0xed, 0x89, 0xf3, 0x7b, 0x38, 0x70, 0x94, 0xc9, 0x02, 0x02, 0x36, 0xd0,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n+0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x52, 0xd8,\n+0x88, 0x3a, 0xc8, 0x9f, 0x78, 0x66, 0xed, 0x89, 0xf3, 0x7b, 0x38, 0x70, 0x94, 0xc9, 0x02, 0x02,\n+0x36, 0xd0, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n+0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x0b, 0x7b, 0x72, 0x87, 0xc0, 0x60, 0xa6, 0x49, 0x4c, 0x88,\n+0x58, 0xe6, 0x1d, 0x88, 0xf7, 0x14, 0x64, 0x48, 0xa6, 0xd8, 0x58, 0x0a, 0x0e, 0x4f, 0x13, 0x35,\n+0xdf, 0x35, 0x1d, 0xd4, 0xed, 0x06, 0x31, 0xc8, 0x81, 0x3e, 0x6a, 0xd5, 0xdd, 0x3b, 0x1a, 0x32,\n+0xee, 0x90, 0x3d, 0x11, 0xd2, 0x2e, 0xf4, 0x8e, 0xc3, 0x63, 0x2e, 0x23, 0x66, 0xb0, 0x67, 0xbe,\n+0x6f, 0xb6, 0xc0, 0x13, 0x39, 0x60, 0xaa, 0xa2, 0x34, 0x25, 0x93, 0x75, 0x52, 0xde, 0xa7, 0x9d,\n+0xad, 0x0e, 0x87, 0x89, 0x52, 0x71, 0x6a, 0x16, 0x3c, 0x19, 0x1d, 0x83, 0xf8, 0x9a, 0x29, 0x65,\n+0xbe, 0xf4, 0x3f, 0x9a, 0xd9, 0xf0, 0xf3, 0x5a, 0x87, 0x21, 0x71, 0x80, 0x4d, 0xcb, 0xe0, 0x38,\n+0x9b, 0x3f, 0xbb, 0xfa, 0xe0, 0x30, 0x4d, 0xcf, 0x86, 0xd3, 0x65, 0x10, 0x19, 0x18, 0xd1, 0x97,\n+0x02, 0xb1, 0x2b, 0x72, 0x42, 0x68, 0xac, 0xa0, 0xbd, 0x4e, 0x5a, 0xda, 0x18, 0xbf, 0x6b, 0x98,\n+0x81, 0xd0, 0xfd, 0x9a, 0xbe, 0x5e, 0x15, 0x48, 0xcd, 0x11, 0x15, 0xb9, 0xc0, 0x29, 0x5c, 0xb4,\n+0xe8, 0x88, 0xf7, 0x3e, 0x36, 0xae, 0xb7, 0x62, 0xfd, 0x1e, 0x62, 0xde, 0x70, 0x78, 0x10, 0x1c,\n+0x48, 0x5b, 0xda, 0xbc, 0xa4, 0x38, 0xba, 0x67, 0xed, 0x55, 0x3e, 0x5e, 0x57, 0xdf, 0xd4, 0x03,\n+0x40, 0x4c, 0x81, 0xa4, 0xd2, 0x4f, 0x63, 0xa7, 0x09, 0x42, 0x09, 0x14, 0xfc, 0x00, 0xa9, 0xc2,\n+0x80, 0x73, 0x4f, 0x2e, 0xc0, 0x40, 0xd9, 0x11, 0x7b, 0x48, 0xea, 0x7a, 0x02, 0xc0, 0xd3, 0xeb,\n+0x28, 0x01, 0x26, 0x58, 0x74, 0xc1, 0xc0, 0x73, 0x22, 0x6d, 0x93, 0x95, 0xfd, 0x39, 0x7d, 0xbb,\n+0x2a, 0xe3, 0xf6, 0x82, 0xe3, 0x2c, 0x97, 0x5f, 0x4e, 0x1f, 0x91, 0x94, 0xfa, 0xfe, 0x2c, 0xa3,\n+0xd8, 0x76, 0x1a, 0xb8, 0x4d, 0xb2, 0x38, 0x4f, 0x9b, 0xfa, 0x1d, 0x48, 0x60, 0x79, 0x26, 0xe2,\n+0xf3, 0xfd, 0xa9, 0xd0, 0x9a, 0xe8, 0x70, 0x8f, 0x49, 0x7a, 0xd6, 0xe5, 0xbd, 0x0a, 0x0e, 0xdb,\n+0x2d, 0xf3, 0x8d, 0xbf, 0xeb, 0xe3, 0xa4, 0x7d, 0xcb, 0xc7, 0x95, 0x71, 0xe8, 0xda, 0xa3, 0x7c,\n+0xc5, 0xc2, 0xf8, 0x74, 0x92, 0x04, 0x1b, 0x86, 0xac, 0xa4, 0x22, 0x53, 0x40, 0xb6, 0xac, 0xfe,\n+0x4c, 0x76, 0xcf, 0xfb, 0x94, 0x32, 0xc0, 0x35, 0x9f, 0x76, 0x3f, 0x6e, 0xe5, 0x90, 0x6e, 0xa0,\n+0xa6, 0x26, 0xa2, 0xb8, 0x2c, 0xbe, 0xd1, 0x2b, 0x85, 0xfd, 0xa7, 0x68, 0xc8, 0xba, 0x01, 0x2b,\n+0xb1, 0x6c, 0x74, 0x1d, 0xb8, 0x73, 0x95, 0xe7, 0xee, 0xb7, 0xc7, 0x25, 0xf0, 0x00, 0x4c, 0x00,\n+0xb2, 0x7e, 0xb6, 0x0b, 0x8b, 0x1c, 0xf3, 0xc0, 0x50, 0x9e, 0x25, 0xb9, 0xe0, 0x08, 0xde, 0x36,\n+0x66, 0xff, 0x37, 0xa5, 0xd1, 0xbb, 0x54, 0x64, 0x2c, 0xc9, 0x27, 0xb5, 0x4b, 0x92, 0x7e, 0x65,\n+0xff, 0xd3, 0x2d, 0xe1, 0xb9, 0x4e, 0xbc, 0x7f, 0xa4, 0x41, 0x21, 0x90, 0x41, 0x77, 0xa6, 0x39,\n+0x1f, 0xea, 0x9e, 0xe3, 0x9f, 0xd0, 0x66, 0x6f, 0x05, 0xec, 0xaa, 0x76, 0x7e, 0xbf, 0x6b, 0x16,\n+0xa0, 0xeb, 0xb5, 0xc7, 0xfc, 0x92, 0x54, 0x2f, 0x2b, 0x11, 0x27, 0x25, 0x37, 0x78, 0x4c, 0x51,\n+0x6a, 0xb0, 0xf3, 0xcc, 0x58, 0x5d, 0x14, 0xf1, 0x6a, 0x48, 0x15, 0xff, 0xc2, 0x07, 0xb6, 0xb1,\n+0x8d, 0x0f, 0x8e, 0x5c, 0x50, 0x46, 0xb3, 0x3d, 0xbf, 0x01, 0x98, 0x4f, 0xb2, 0x59, 0x54, 0x47,\n+0x3e, 0x34, 0x7b, 0x78, 0x6d, 0x56, 0x93, 0x2e, 0x73, 0xea, 0x66, 0x28, 0x78, 0xcd, 0x1d, 0x14,\n+0xbf, 0xa0, 0x8f, 0x2f, 0x2e, 0xb8, 0x2e, 0x8e, 0xf2, 0x14, 0x8a, 0xcc, 0xe9, 0xb5, 0x7c, 0xfb,\n+0x6c, 0x9d, 0x0c, 0xa5, 0xe1, 0x96, 0x30, 0x82, 0x03, 0x4c, 0x30, 0x82, 0x02, 0x34, 0xa0, 0x03,\n+0x02, 0x01, 0x02, 0x02, 0x08, 0x77, 0x77, 0x06, 0x27, 0x26, 0xa9, 0xb1, 0x7c, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x44, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, 0x66, 0x69,\n+0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69,\n+0x61, 0x6c, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x30, 0x36,\n+0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x30, 0x36, 0x30,\n+0x36, 0x5a, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n+0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69,\n+0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x0c, 0x16, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f,\n+0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,\n+0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf6, 0x1b, 0x4f, 0x67, 0x07, 0x2b, 0xa1,\n+0x15, 0xf5, 0x06, 0x22, 0xcb, 0x1f, 0x01, 0xb2, 0xe3, 0x73, 0x45, 0x06, 0x44, 0x49, 0x2c, 0xbb,\n+0x49, 0x25, 0x14, 0xd6, 0xce, 0xc3, 0xb7, 0xab, 0x2c, 0x4f, 0xc6, 0x41, 0x32, 0x94, 0x57, 0xfa,\n+0x12, 0xa7, 0x5b, 0x0e, 0xe2, 0x8f, 0x1f, 0x1e, 0x86, 0x19, 0xa7, 0xaa, 0xb5, 0x2d, 0xb9, 0x5f,\n+0x0d, 0x8a, 0xc2, 0xaf, 0x85, 0x35, 0x79, 0x32, 0x2d, 0xbb, 0x1c, 0x62, 0x37, 0xf2, 0xb1, 0x5b,\n+0x4a, 0x3d, 0xca, 0xcd, 0x71, 0x5f, 0xe9, 0x42, 0xbe, 0x94, 0xe8, 0xc8, 0xde, 0xf9, 0x22, 0x48,\n+0x64, 0xc6, 0xe5, 0xab, 0xc6, 0x2b, 0x6d, 0xad, 0x05, 0xf0, 0xfa, 0xd5, 0x0b, 0xcf, 0x9a, 0xe5,\n+0xf0, 0x50, 0xa4, 0x8b, 0x3b, 0x47, 0xa5, 0x23, 0x5b, 0x7a, 0x7a, 0xf8, 0x33, 0x3f, 0xb8, 0xef,\n+0x99, 0x97, 0xe3, 0x20, 0xc1, 0xd6, 0x28, 0x89, 0xcf, 0x94, 0xfb, 0xb9, 0x45, 0xed, 0xe3, 0x40,\n+0x17, 0x11, 0xd4, 0x74, 0xf0, 0x0b, 0x31, 0xe2, 0x2b, 0x26, 0x6a, 0x9b, 0x4c, 0x57, 0xae, 0xac,\n+0x20, 0x3e, 0xba, 0x45, 0x7a, 0x05, 0xf3, 0xbd, 0x9b, 0x69, 0x15, 0xae, 0x7d, 0x4e, 0x20, 0x63,\n+0xc4, 0x35, 0x76, 0x3a, 0x07, 0x02, 0xc9, 0x37, 0xfd, 0xc7, 0x47, 0xee, 0xe8, 0xf1, 0x76, 0x1d,\n+0x73, 0x15, 0xf2, 0x97, 0xa4, 0xb5, 0xc8, 0x7a, 0x79, 0xd9, 0x42, 0xaa, 0x2b, 0x7f, 0x5c, 0xfe,\n+0xce, 0x26, 0x4f, 0xa3, 0x66, 0x81, 0x35, 0xaf, 0x44, 0xba, 0x54, 0x1e, 0x1c, 0x30, 0x32, 0x65,\n+0x9d, 0xe6, 0x3c, 0x93, 0x5e, 0x50, 0x4e, 0x7a, 0xe3, 0x3a, 0xd4, 0x6e, 0xcc, 0x1a, 0xfb, 0xf9,\n+0xd2, 0x37, 0xae, 0x24, 0x2a, 0xab, 0x57, 0x03, 0x22, 0x28, 0x0d, 0x49, 0x75, 0x7f, 0xb7, 0x28,\n+0xda, 0x75, 0xbf, 0x8e, 0xe3, 0xdc, 0x0e, 0x79, 0x31, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n+0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x93, 0xc6,\n+0x53, 0x8b, 0x5e, 0xca, 0xaf, 0x3f, 0x9f, 0x1e, 0x0f, 0xe5, 0x99, 0x95, 0xbc, 0x24, 0xf6, 0x94,\n+0x8f, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n+0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x58, 0xac, 0xf4, 0x04, 0x0e, 0xcd, 0xc0, 0x0d, 0xff, 0x0a,\n+0xfd, 0xd4, 0xba, 0x16, 0x5f, 0x29, 0xbd, 0x7b, 0x68, 0x99, 0x58, 0x49, 0xd2, 0xb4, 0x1d, 0x37,\n+0x4d, 0x7f, 0x27, 0x7d, 0x46, 0x06, 0x5d, 0x43, 0xc6, 0x86, 0x2e, 0x3e, 0x73, 0xb2, 0x26, 0x7d,\n+0x4f, 0x93, 0xa9, 0xb6, 0xc4, 0x2a, 0x9a, 0xab, 0x21, 0x97, 0x14, 0xb1, 0xde, 0x8c, 0xd3, 0xab,\n+0x89, 0x15, 0xd8, 0x6b, 0x24, 0xd4, 0xf1, 0x16, 0xae, 0xd8, 0xa4, 0x5c, 0xd4, 0x7f, 0x51, 0x8e,\n+0xed, 0x18, 0x01, 0xb1, 0x93, 0x63, 0xbd, 0xbc, 0xf8, 0x61, 0x80, 0x9a, 0x9e, 0xb1, 0xce, 0x42,\n+0x70, 0xe2, 0xa9, 0x7d, 0x06, 0x25, 0x7d, 0x27, 0xa1, 0xfe, 0x6f, 0xec, 0xb3, 0x1e, 0x24, 0xda,\n+0xe3, 0x4b, 0x55, 0x1a, 0x00, 0x3b, 0x35, 0xb4, 0x3b, 0xd9, 0xd7, 0x5d, 0x30, 0xfd, 0x81, 0x13,\n+0x89, 0xf2, 0xc2, 0x06, 0x2b, 0xed, 0x67, 0xc4, 0x8e, 0xc9, 0x43, 0xb2, 0x5c, 0x6b, 0x15, 0x89,\n+0x02, 0xbc, 0x62, 0xfc, 0x4e, 0xf2, 0xb5, 0x33, 0xaa, 0xb2, 0x6f, 0xd3, 0x0a, 0xa2, 0x50, 0xe3,\n+0xf6, 0x3b, 0xe8, 0x2e, 0x44, 0xc2, 0xdb, 0x66, 0x38, 0xa9, 0x33, 0x56, 0x48, 0xf1, 0x6d, 0x1b,\n+0x33, 0x8d, 0x0d, 0x8c, 0x3f, 0x60, 0x37, 0x9d, 0xd3, 0xca, 0x6d, 0x7e, 0x34, 0x7e, 0x0d, 0x9f,\n+0x72, 0x76, 0x8b, 0x1b, 0x9f, 0x72, 0xfd, 0x52, 0x35, 0x41, 0x45, 0x02, 0x96, 0x2f, 0x1c, 0xb2,\n+0x9a, 0x73, 0x49, 0x21, 0xb1, 0x49, 0x47, 0x45, 0x47, 0xb4, 0xef, 0x6a, 0x34, 0x11, 0xc9, 0x4d,\n+0x9a, 0xcc, 0x59, 0xb7, 0xd6, 0x02, 0x9e, 0x5a, 0x4e, 0x65, 0xb5, 0x94, 0xae, 0x1b, 0xdf, 0x29,\n+0xb0, 0x16, 0xf1, 0xbf, 0x00, 0x9e, 0x07, 0x3a, 0x17, 0x64, 0xb5, 0x04, 0xb5, 0x23, 0x21, 0x99,\n+0x0a, 0x95, 0x3b, 0x97, 0x7c, 0xef, 0x30, 0x82, 0x05, 0xb0, 0x30, 0x82, 0x03, 0x98, 0xa0, 0x03,\n+0x02, 0x01, 0x02, 0x02, 0x10, 0x15, 0xc8, 0xbd, 0x65, 0x47, 0x5c, 0xaf, 0xb8, 0x97, 0x00, 0x5e,\n+0xe4, 0x06, 0xd2, 0xbc, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x05, 0x05, 0x00, 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x54, 0x57, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x43, 0x68,\n+0x75, 0x6e, 0x67, 0x68, 0x77, 0x61, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x63, 0x6f, 0x6d, 0x20, 0x43,\n+0x6f, 0x2e, 0x2c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04,\n+0x0b, 0x0c, 0x21, 0x65, 0x50, 0x4b, 0x49, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x31, 0x32, 0x32, 0x30, 0x30, 0x32,\n+0x33, 0x31, 0x32, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x31, 0x32, 0x32, 0x30, 0x30, 0x32, 0x33,\n+0x31, 0x32, 0x37, 0x5a, 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x54, 0x57, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x43, 0x68,\n+0x75, 0x6e, 0x67, 0x68, 0x77, 0x61, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x63, 0x6f, 0x6d, 0x20, 0x43,\n+0x6f, 0x2e, 0x2c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04,\n+0x0b, 0x0c, 0x21, 0x65, 0x50, 0x4b, 0x49, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a,\n+0x02, 0x82, 0x02, 0x01, 0x00, 0xe1, 0x25, 0x0f, 0xee, 0x8d, 0xdb, 0x88, 0x33, 0x75, 0x67, 0xcd,\n+0xad, 0x1f, 0x7d, 0x3a, 0x4e, 0x6d, 0x9d, 0xd3, 0x2f, 0x14, 0xf3, 0x63, 0x74, 0xcb, 0x01, 0x21,\n+0x6a, 0x37, 0xea, 0x84, 0x50, 0x07, 0x4b, 0x26, 0x5b, 0x09, 0x43, 0x6c, 0x21, 0x9e, 0x6a, 0xc8,\n+0xd5, 0x03, 0xf5, 0x60, 0x69, 0x8f, 0xcc, 0xf0, 0x22, 0xe4, 0x1f, 0xe7, 0xf7, 0x6a, 0x22, 0x31,\n+0xb7, 0x2c, 0x15, 0xf2, 0xe0, 0xfe, 0x00, 0x6a, 0x43, 0xff, 0x87, 0x65, 0xc6, 0xb5, 0x1a, 0xc1,\n+0xa7, 0x4c, 0x6d, 0x22, 0x70, 0x21, 0x8a, 0x31, 0xf2, 0x97, 0x74, 0x89, 0x09, 0x12, 0x26, 0x1c,\n+0x9e, 0xca, 0xd9, 0x12, 0xa2, 0x95, 0x3c, 0xda, 0xe9, 0x67, 0xbf, 0x08, 0xa0, 0x64, 0xe3, 0xd6,\n+0x42, 0xb7, 0x45, 0xef, 0x97, 0xf4, 0xf6, 0xf5, 0xd7, 0xb5, 0x4a, 0x15, 0x02, 0x58, 0x7d, 0x98,\n+0x58, 0x4b, 0x60, 0xbc, 0xcd, 0xd7, 0x0d, 0x9a, 0x13, 0x33, 0x53, 0xd1, 0x61, 0xf9, 0x7a, 0xd5,\n+0xd7, 0x78, 0xb3, 0x9a, 0x33, 0xf7, 0x00, 0x86, 0xce, 0x1d, 0x4d, 0x94, 0x38, 0xaf, 0xa8, 0xec,\n+0x78, 0x51, 0x70, 0x8a, 0x5c, 0x10, 0x83, 0x51, 0x21, 0xf7, 0x11, 0x3d, 0x34, 0x86, 0x5e, 0xe5,\n+0x48, 0xcd, 0x97, 0x81, 0x82, 0x35, 0x4c, 0x19, 0xec, 0x65, 0xf6, 0x6b, 0xc5, 0x05, 0xa1, 0xee,\n+0x47, 0x13, 0xd6, 0xb3, 0x21, 0x27, 0x94, 0x10, 0x0a, 0xd9, 0x24, 0x3b, 0xba, 0xbe, 0x44, 0x13,\n+0x46, 0x30, 0x3f, 0x97, 0x3c, 0xd8, 0xd7, 0xd7, 0x6a, 0xee, 0x3b, 0x38, 0xe3, 0x2b, 0xd4, 0x97,\n+0x0e, 0xb9, 0x1b, 0xe7, 0x07, 0x49, 0x7f, 0x37, 0x2a, 0xf9, 0x77, 0x78, 0xcf, 0x54, 0xed, 0x5b,\n+0x46, 0x9d, 0xa3, 0x80, 0x0e, 0x91, 0x43, 0xc1, 0xd6, 0x5b, 0x5f, 0x14, 0xba, 0x9f, 0xa6, 0x8d,\n+0x24, 0x47, 0x40, 0x59, 0xbf, 0x72, 0x38, 0xb2, 0x36, 0x6c, 0x37, 0xff, 0x99, 0xd1, 0x5d, 0x0e,\n+0x59, 0x0a, 0xab, 0x69, 0xf7, 0xc0, 0xb2, 0x04, 0x45, 0x7a, 0x54, 0x00, 0xae, 0xbe, 0x53, 0xf6,\n+0xb5, 0xe7, 0xe1, 0xf8, 0x3c, 0xa3, 0x31, 0xd2, 0xa9, 0xfe, 0x21, 0x52, 0x64, 0xc5, 0xa6, 0x67,\n+0xf0, 0x75, 0x07, 0x06, 0x94, 0x14, 0x81, 0x55, 0xc6, 0x27, 0xe4, 0x01, 0x8f, 0x17, 0xc1, 0x6a,\n+0x71, 0xd7, 0xbe, 0x4b, 0xfb, 0x94, 0x58, 0x7d, 0x7e, 0x11, 0x33, 0xb1, 0x42, 0xf7, 0x62, 0x6c,\n+0x18, 0xd6, 0xcf, 0x09, 0x68, 0x3e, 0x7f, 0x6c, 0xf6, 0x1e, 0x8f, 0x62, 0xad, 0xa5, 0x63, 0xdb,\n+0x09, 0xa7, 0x1f, 0x22, 0x42, 0x41, 0x1e, 0x6f, 0x99, 0x8a, 0x3e, 0xd7, 0xf9, 0x3f, 0x40, 0x7a,\n+0x79, 0xb0, 0xa5, 0x01, 0x92, 0xd2, 0x9d, 0x3d, 0x08, 0x15, 0xa5, 0x10, 0x01, 0x2d, 0xb3, 0x32,\n+0x76, 0xa8, 0x95, 0x0d, 0xb3, 0x7a, 0x9a, 0xfb, 0x07, 0x10, 0x78, 0x11, 0x6f, 0xe1, 0x8f, 0xc7,\n+0xba, 0x0f, 0x25, 0x1a, 0x74, 0x2a, 0xe5, 0x1c, 0x98, 0x41, 0x99, 0xdf, 0x21, 0x87, 0xe8, 0x95,\n+0x06, 0x6a, 0x0a, 0xb3, 0x6a, 0x47, 0x76, 0x65, 0xf6, 0x3a, 0xcf, 0x8f, 0x62, 0x17, 0x19, 0x7b,\n+0x0a, 0x28, 0xcd, 0x1a, 0xd2, 0x83, 0x1e, 0x21, 0xc7, 0x2c, 0xbf, 0xbe, 0xff, 0x61, 0x68, 0xb7,\n+0x67, 0x1b, 0xbb, 0x78, 0x4d, 0x8d, 0xce, 0x67, 0xe5, 0xe4, 0xc1, 0x8e, 0xb7, 0x23, 0x66, 0xe2,\n+0x9d, 0x90, 0x75, 0x34, 0x98, 0xa9, 0x36, 0x2b, 0x8a, 0x9a, 0x94, 0xb9, 0x9d, 0xec, 0xcc, 0x8a,\n+0xb1, 0xf8, 0x25, 0x89, 0x5c, 0x5a, 0xb6, 0x2f, 0x8c, 0x1f, 0x6d, 0x79, 0x24, 0xa7, 0x52, 0x68,\n+0xc3, 0x84, 0x35, 0xe2, 0x66, 0x8d, 0x63, 0x0e, 0x25, 0x4d, 0xd5, 0x19, 0xb2, 0xe6, 0x79, 0x37,\n+0xa7, 0x22, 0x9d, 0x54, 0x31, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x6a, 0x30, 0x68, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1e, 0x0c, 0xf7, 0xb6, 0x67, 0xf2, 0xe1,\n+0x92, 0x26, 0x09, 0x45, 0xc0, 0x55, 0x39, 0x2e, 0x77, 0x3f, 0x42, 0x4a, 0xa2, 0x30, 0x0c, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x39, 0x06, 0x04, 0x67,\n+0x2a, 0x07, 0x00, 0x04, 0x31, 0x30, 0x2f, 0x30, 0x2d, 0x02, 0x01, 0x00, 0x30, 0x09, 0x06, 0x05,\n+0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x30, 0x07, 0x06, 0x05, 0x67, 0x2a, 0x03, 0x00, 0x00,\n+0x04, 0x14, 0x45, 0xb0, 0xc2, 0xc7, 0x0a, 0x56, 0x7c, 0xee, 0x5b, 0x78, 0x0c, 0x95, 0xf9, 0x18,\n+0x53, 0xc1, 0xa6, 0x1c, 0xd8, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x09, 0xb3, 0x83, 0x53, 0x59, 0x01,\n+0x3e, 0x95, 0x49, 0xb9, 0xf1, 0x81, 0xba, 0xf9, 0x76, 0x20, 0x23, 0xb5, 0x27, 0x60, 0x74, 0xd4,\n+0x6a, 0x99, 0x34, 0x5e, 0x6c, 0x00, 0x53, 0xd9, 0x9f, 0xf2, 0xa6, 0xb1, 0x24, 0x07, 0x44, 0x6a,\n+0x2a, 0xc6, 0xa5, 0x8e, 0x78, 0x12, 0xe8, 0x47, 0xd9, 0x58, 0x1b, 0x13, 0x2a, 0x5e, 0x79, 0x9b,\n+0x9f, 0x0a, 0x2a, 0x67, 0xa6, 0x25, 0x3f, 0x06, 0x69, 0x56, 0x73, 0xc3, 0x8a, 0x66, 0x48, 0xfb,\n+0x29, 0x81, 0x57, 0x74, 0x06, 0xca, 0x9c, 0xea, 0x28, 0xe8, 0x38, 0x67, 0x26, 0x2b, 0xf1, 0xd5,\n+0xb5, 0x3f, 0x65, 0x93, 0xf8, 0x36, 0x5d, 0x8e, 0x8d, 0x8d, 0x40, 0x20, 0x87, 0x19, 0xea, 0xef,\n+0x27, 0xc0, 0x3d, 0xb4, 0x39, 0x0f, 0x25, 0x7b, 0x68, 0x50, 0x74, 0x55, 0x9c, 0x0c, 0x59, 0x7d,\n+0x5a, 0x3d, 0x41, 0x94, 0x25, 0x52, 0x08, 0xe0, 0x47, 0x2c, 0x15, 0x31, 0x19, 0xd5, 0xbf, 0x07,\n+0x55, 0xc6, 0xbb, 0x12, 0xb5, 0x97, 0xf4, 0x5f, 0x83, 0x85, 0xba, 0x71, 0xc1, 0xd9, 0x6c, 0x81,\n+0x11, 0x76, 0x0a, 0x0a, 0xb0, 0xbf, 0x82, 0x97, 0xf7, 0xea, 0x3d, 0xfa, 0xfa, 0xec, 0x2d, 0xa9,\n+0x28, 0x94, 0x3b, 0x56, 0xdd, 0xd2, 0x51, 0x2e, 0xae, 0xc0, 0xbd, 0x08, 0x15, 0x8c, 0x77, 0x52,\n+0x34, 0x96, 0xd6, 0x9b, 0xac, 0xd3, 0x1d, 0x8e, 0x61, 0x0f, 0x35, 0x7b, 0x9b, 0xae, 0x39, 0x69,\n+0x0b, 0x62, 0x60, 0x40, 0x20, 0x36, 0x8f, 0xaf, 0xfb, 0x36, 0xee, 0x2d, 0x08, 0x4a, 0x1d, 0xb8,\n+0xbf, 0x9b, 0x5c, 0xf8, 0xea, 0xa5, 0x1b, 0xa0, 0x73, 0xa6, 0xd8, 0xf8, 0x6e, 0xe0, 0x33, 0x04,\n+0x5f, 0x68, 0xaa, 0x27, 0x87, 0xed, 0xd9, 0xc1, 0x90, 0x9c, 0xed, 0xbd, 0xe3, 0x6a, 0x35, 0xaf,\n+0x63, 0xdf, 0xab, 0x18, 0xd9, 0xba, 0xe6, 0xe9, 0x4a, 0xea, 0x50, 0x8a, 0x0f, 0x61, 0x93, 0x1e,\n+0xe2, 0x2d, 0x19, 0xe2, 0x30, 0x94, 0x35, 0x92, 0x5d, 0x0e, 0xb6, 0x07, 0xaf, 0x19, 0x80, 0x8f,\n+0x47, 0x90, 0x51, 0x4b, 0x2e, 0x4d, 0xdd, 0x85, 0xe2, 0xd2, 0x0a, 0x52, 0x0a, 0x17, 0x9a, 0xfc,\n+0x1a, 0xb0, 0x50, 0x02, 0xe5, 0x01, 0xa3, 0x63, 0x37, 0x21, 0x4c, 0x44, 0xc4, 0x9b, 0x51, 0x99,\n+0x11, 0x0e, 0x73, 0x9c, 0x06, 0x8f, 0x54, 0x2e, 0xa7, 0x28, 0x5e, 0x44, 0x39, 0x87, 0x56, 0x2d,\n+0x37, 0xbd, 0x85, 0x44, 0x94, 0xe1, 0x0c, 0x4b, 0x2c, 0x9c, 0xc3, 0x92, 0x85, 0x34, 0x61, 0xcb,\n+0x0f, 0xb8, 0x9b, 0x4a, 0x43, 0x52, 0xfe, 0x34, 0x3a, 0x7d, 0xb8, 0xe9, 0x29, 0xdc, 0x76, 0xa9,\n+0xc8, 0x30, 0xf8, 0x14, 0x71, 0x80, 0xc6, 0x1e, 0x36, 0x48, 0x74, 0x22, 0x41, 0x5c, 0x87, 0x82,\n+0xe8, 0x18, 0x71, 0x8b, 0x41, 0x89, 0x44, 0xe7, 0x7e, 0x58, 0x5b, 0xa8, 0xb8, 0x8d, 0x13, 0xe9,\n+0xa7, 0x6c, 0xc3, 0x47, 0xed, 0xb3, 0x1a, 0x9d, 0x62, 0xae, 0x8d, 0x82, 0xea, 0x94, 0x9e, 0xdd,\n+0x59, 0x10, 0xc3, 0xad, 0xdd, 0xe2, 0x4d, 0xe3, 0x31, 0xd5, 0xc7, 0xec, 0xe8, 0xf2, 0xb0, 0xfe,\n+0x92, 0x1e, 0x16, 0x0a, 0x1a, 0xfc, 0xd9, 0xf3, 0xf8, 0x27, 0xb6, 0xc9, 0xbe, 0x1d, 0xb4, 0x6c,\n+0x64, 0x90, 0x7f, 0xf4, 0xe4, 0xc4, 0x5b, 0xd7, 0x37, 0xae, 0x42, 0x0e, 0xdd, 0xa4, 0x1a, 0x6f,\n+0x7c, 0x88, 0x54, 0xc5, 0x16, 0x6e, 0xe1, 0x7a, 0x68, 0x2e, 0xf8, 0x3a, 0xbf, 0x0d, 0xa4, 0x3c,\n+0x89, 0x3b, 0x78, 0xa7, 0x4e, 0x63, 0x83, 0x04, 0x21, 0x08, 0x67, 0x8d, 0xf2, 0x82, 0x49, 0xd0,\n+0x5b, 0xfd, 0xb1, 0xcd, 0x0f, 0x83, 0x84, 0xd4, 0x3e, 0x20, 0x85, 0xf7, 0x4a, 0x3d, 0x2b, 0x9c,\n+0xfd, 0x2a, 0x0a, 0x09, 0x4d, 0xea, 0x81, 0xf8, 0x11, 0x9c, 0x30, 0x82, 0x05, 0x46, 0x30, 0x82,\n+0x03, 0x2e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x6d, 0x8c, 0x14, 0x46, 0xb1, 0xa6, 0x0a,\n+0xee, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00,\n+0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d,\n+0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13,\n+0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d,\n+0x69, 0x75, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x31,\n+0x30, 0x33, 0x36, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x31, 0x30,\n+0x33, 0x36, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66,\n+0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x0c, 0x13, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50,\n+0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82,\n+0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc4, 0x12, 0xdf, 0xa9, 0x5f, 0xfe, 0x41, 0xdd, 0xdd,\n+0xf5, 0x9f, 0x8a, 0xe3, 0xf6, 0xac, 0xe1, 0x3c, 0x78, 0x9a, 0xbc, 0xd8, 0xf0, 0x7f, 0x7a, 0xa0,\n+0x33, 0x2a, 0xdc, 0x8d, 0x20, 0x5b, 0xae, 0x2d, 0x6f, 0xe7, 0x93, 0xd9, 0x36, 0x70, 0x6a, 0x68,\n+0xcf, 0x8e, 0x51, 0xa3, 0x85, 0x5b, 0x67, 0x04, 0xa0, 0x10, 0x24, 0x6f, 0x5d, 0x28, 0x82, 0xc1,\n+0x97, 0x57, 0xd8, 0x48, 0x29, 0x13, 0xb6, 0xe1, 0xbe, 0x91, 0x4d, 0xdf, 0x85, 0x0c, 0x53, 0x18,\n+0x9a, 0x1e, 0x24, 0xa2, 0x4f, 0x8f, 0xf0, 0xa2, 0x85, 0x0b, 0xcb, 0xf4, 0x29, 0x7f, 0xd2, 0xa4,\n+0x58, 0xee, 0x26, 0x4d, 0xc9, 0xaa, 0xa8, 0x7b, 0x9a, 0xd9, 0xfa, 0x38, 0xde, 0x44, 0x57, 0x15,\n+0xe5, 0xf8, 0x8c, 0xc8, 0xd9, 0x48, 0xe2, 0x0d, 0x16, 0x27, 0x1d, 0x1e, 0xc8, 0x83, 0x85, 0x25,\n+0xb7, 0xba, 0xaa, 0x55, 0x41, 0xcc, 0x03, 0x22, 0x4b, 0x2d, 0x91, 0x8d, 0x8b, 0xe6, 0x89, 0xaf,\n+0x66, 0xc7, 0xe9, 0xff, 0x2b, 0xe9, 0x3c, 0xac, 0xda, 0xd2, 0xb3, 0xc3, 0xe1, 0x68, 0x9c, 0x89,\n+0xf8, 0x7a, 0x00, 0x56, 0xde, 0xf4, 0x55, 0x95, 0x6c, 0xfb, 0xba, 0x64, 0xdd, 0x62, 0x8b, 0xdf,\n+0x0b, 0x77, 0x32, 0xeb, 0x62, 0xcc, 0x26, 0x9a, 0x9b, 0xbb, 0xaa, 0x62, 0x83, 0x4c, 0xb4, 0x06,\n+0x7a, 0x30, 0xc8, 0x29, 0xbf, 0xed, 0x06, 0x4d, 0x97, 0xb9, 0x1c, 0xc4, 0x31, 0x2b, 0xd5, 0x5f,\n+0xbc, 0x53, 0x12, 0x17, 0x9c, 0x99, 0x57, 0x29, 0x66, 0x77, 0x61, 0x21, 0x31, 0x07, 0x2e, 0x25,\n+0x49, 0x9d, 0x18, 0xf2, 0xee, 0xf3, 0x2b, 0x71, 0x8c, 0xb5, 0xba, 0x39, 0x07, 0x49, 0x77, 0xfc,\n+0xef, 0x2e, 0x92, 0x90, 0x05, 0x8d, 0x2d, 0x2f, 0x77, 0x7b, 0xef, 0x43, 0xbf, 0x35, 0xbb, 0x9a,\n+0xd8, 0xf9, 0x73, 0xa7, 0x2c, 0xf2, 0xd0, 0x57, 0xee, 0x28, 0x4e, 0x26, 0x5f, 0x8f, 0x90, 0x68,\n+0x09, 0x2f, 0xb8, 0xf8, 0xdc, 0x06, 0xe9, 0x2e, 0x9a, 0x3e, 0x51, 0xa7, 0xd1, 0x22, 0xc4, 0x0a,\n+0xa7, 0x38, 0x48, 0x6c, 0xb3, 0xf9, 0xff, 0x7d, 0xab, 0x86, 0x57, 0xe3, 0xba, 0xd6, 0x85, 0x78,\n+0x77, 0xba, 0x43, 0xea, 0x48, 0x7f, 0xf6, 0xd8, 0xbe, 0x23, 0x6d, 0x1e, 0xbf, 0xd1, 0x36, 0x6c,\n+0x58, 0x5c, 0xf1, 0xee, 0xa4, 0x19, 0x54, 0x1a, 0xf5, 0x03, 0xd2, 0x76, 0xe6, 0xe1, 0x8c, 0xbd,\n+0x3c, 0xb3, 0xd3, 0x48, 0x4b, 0xe2, 0xc8, 0xf8, 0x7f, 0x92, 0xa8, 0x76, 0x46, 0x9c, 0x42, 0x65,\n+0x3e, 0xa4, 0x1e, 0xc1, 0x07, 0x03, 0x5a, 0x46, 0x2d, 0xb8, 0x97, 0xf3, 0xb7, 0xd5, 0xb2, 0x55,\n+0x21, 0xef, 0xba, 0xdc, 0x4c, 0x00, 0x97, 0xfb, 0x14, 0x95, 0x27, 0x33, 0xbf, 0xe8, 0x43, 0x47,\n+0x46, 0xd2, 0x08, 0x99, 0x16, 0x60, 0x3b, 0x9a, 0x7e, 0xd2, 0xe6, 0xed, 0x38, 0xea, 0xec, 0x01,\n+0x1e, 0x3c, 0x48, 0x56, 0x49, 0x09, 0xc7, 0x4c, 0x37, 0x00, 0x9e, 0x88, 0x0e, 0xc0, 0x73, 0xe1,\n+0x6f, 0x66, 0xe9, 0x72, 0x47, 0x30, 0x3e, 0x10, 0xe5, 0x0b, 0x03, 0xc9, 0x9a, 0x42, 0x00, 0x6c,\n+0xc5, 0x94, 0x7e, 0x61, 0xc4, 0x8a, 0xdf, 0x7f, 0x82, 0x1a, 0x0b, 0x59, 0xc4, 0x59, 0x32, 0x77,\n+0xb3, 0xbc, 0x60, 0x69, 0x56, 0x39, 0xfd, 0xb4, 0x06, 0x7b, 0x2c, 0xd6, 0x64, 0x36, 0xd9, 0xbd,\n+0x48, 0xed, 0x84, 0x1f, 0x7e, 0xa5, 0x22, 0x8f, 0x2a, 0xb8, 0x42, 0xf4, 0x82, 0xb7, 0xd4, 0x53,\n+0x90, 0x78, 0x4e, 0x2d, 0x1a, 0xfd, 0x81, 0x6f, 0x44, 0xd7, 0x3b, 0x01, 0x74, 0x96, 0x42, 0xe0,\n+0x00, 0xe2, 0x2e, 0x6b, 0xea, 0xc5, 0xee, 0x72, 0xac, 0xbb, 0xbf, 0xfe, 0xea, 0xaa, 0xa8, 0xf8,\n+0xdc, 0xf6, 0xb2, 0x79, 0x8a, 0xb6, 0x67, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0xc0, 0x67, 0xa6, 0x0c,\n+0x22, 0xd9, 0x26, 0xf5, 0x45, 0xab, 0xa6, 0x65, 0x52, 0x11, 0x27, 0xd8, 0x45, 0xac, 0x63, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03,\n+0x82, 0x02, 0x01, 0x00, 0xb3, 0x57, 0x4d, 0x10, 0x62, 0x4e, 0x3a, 0xe4, 0xac, 0xea, 0xb8, 0x1c,\n+0xaf, 0x32, 0x23, 0xc8, 0xb3, 0x49, 0x5a, 0x51, 0x9c, 0x76, 0x28, 0x8d, 0x79, 0xaa, 0x57, 0x46,\n+0x17, 0xd5, 0xf5, 0x52, 0xf6, 0xb7, 0x44, 0xe8, 0x08, 0x44, 0xbf, 0x18, 0x84, 0xd2, 0x0b, 0x80,\n+0xcd, 0xc5, 0x12, 0xfd, 0x00, 0x55, 0x05, 0x61, 0x87, 0x41, 0xdc, 0xb5, 0x24, 0x9e, 0x3c, 0xc4,\n+0xd8, 0xc8, 0xfb, 0x70, 0x9e, 0x2f, 0x78, 0x96, 0x83, 0x20, 0x36, 0xde, 0x7c, 0x0f, 0x69, 0x13,\n+0x88, 0xa5, 0x75, 0x36, 0x98, 0x08, 0xa6, 0xc6, 0xdf, 0xac, 0xce, 0xe3, 0x58, 0xd6, 0xb7, 0x3e,\n+0xde, 0xba, 0xf3, 0xeb, 0x34, 0x40, 0xd8, 0xa2, 0x81, 0xf5, 0x78, 0x3f, 0x2f, 0xd5, 0xa5, 0xfc,\n+0xd9, 0xa2, 0xd4, 0x5e, 0x04, 0x0e, 0x17, 0xad, 0xfe, 0x41, 0xf0, 0xe5, 0xb2, 0x72, 0xfa, 0x44,\n+0x82, 0x33, 0x42, 0xe8, 0x2d, 0x58, 0xf7, 0x56, 0x8c, 0x62, 0x3f, 0xba, 0x42, 0xb0, 0x9c, 0x0c,\n+0x5c, 0x7e, 0x2e, 0x65, 0x26, 0x5c, 0x53, 0x4f, 0x00, 0xb2, 0x78, 0x7e, 0xa1, 0x0d, 0x99, 0x2d,\n+0x8d, 0xb8, 0x1d, 0x8e, 0xa2, 0xc4, 0xb0, 0xfd, 0x60, 0xd0, 0x30, 0xa4, 0x8e, 0xc8, 0x04, 0x62,\n+0xa9, 0xc4, 0xed, 0x35, 0xde, 0x7a, 0x97, 0xed, 0x0e, 0x38, 0x5e, 0x92, 0x2f, 0x93, 0x70, 0xa5,\n+0xa9, 0x9c, 0x6f, 0xa7, 0x7d, 0x13, 0x1d, 0x7e, 0xc6, 0x08, 0x48, 0xb1, 0x5e, 0x67, 0xeb, 0x51,\n+0x08, 0x25, 0xe9, 0xe6, 0x25, 0x6b, 0x52, 0x29, 0x91, 0x9c, 0xd2, 0x39, 0x73, 0x08, 0x57, 0xde,\n+0x99, 0x06, 0xb4, 0x5b, 0x9d, 0x10, 0x06, 0xe1, 0xc2, 0x00, 0xa8, 0xb8, 0x1c, 0x4a, 0x02, 0x0a,\n+0x14, 0xd0, 0xc1, 0x41, 0xca, 0xfb, 0x8c, 0x35, 0x21, 0x7d, 0x82, 0x38, 0xf2, 0xa9, 0x54, 0x91,\n+0x19, 0x35, 0x93, 0x94, 0x6d, 0x6a, 0x3a, 0xc5, 0xb2, 0xd0, 0xbb, 0x89, 0x86, 0x93, 0xe8, 0x9b,\n+0xc9, 0x0f, 0x3a, 0xa7, 0x7a, 0xb8, 0xa1, 0xf0, 0x78, 0x46, 0xfa, 0xfc, 0x37, 0x2f, 0xe5, 0x8a,\n+0x84, 0xf3, 0xdf, 0xfe, 0x04, 0xd9, 0xa1, 0x68, 0xa0, 0x2f, 0x24, 0xe2, 0x09, 0x95, 0x06, 0xd5,\n+0x95, 0xca, 0xe1, 0x24, 0x96, 0xeb, 0x7c, 0xf6, 0x93, 0x05, 0xbb, 0xed, 0x73, 0xe9, 0x2d, 0xd1,\n+0x75, 0x39, 0xd7, 0xe7, 0x24, 0xdb, 0xd8, 0x4e, 0x5f, 0x43, 0x8f, 0x9e, 0xd0, 0x14, 0x39, 0xbf,\n+0x55, 0x70, 0x48, 0x99, 0x57, 0x31, 0xb4, 0x9c, 0xee, 0x4a, 0x98, 0x03, 0x96, 0x30, 0x1f, 0x60,\n+0x06, 0xee, 0x1b, 0x23, 0xfe, 0x81, 0x60, 0x23, 0x1a, 0x47, 0x62, 0x85, 0xa5, 0xcc, 0x19, 0x34,\n+0x80, 0x6f, 0xb3, 0xac, 0x1a, 0xe3, 0x9f, 0xf0, 0x7b, 0x48, 0xad, 0xd5, 0x01, 0xd9, 0x67, 0xb6,\n+0xa9, 0x72, 0x93, 0xea, 0x2d, 0x66, 0xb5, 0xb2, 0xb8, 0xe4, 0x3d, 0x3c, 0xb2, 0xef, 0x4c, 0x8c,\n+0xea, 0xeb, 0x07, 0xbf, 0xab, 0x35, 0x9a, 0x55, 0x86, 0xbc, 0x18, 0xa6, 0xb5, 0xa8, 0x5e, 0xb4,\n+0x83, 0x6c, 0x6b, 0x69, 0x40, 0xd3, 0x9f, 0xdc, 0xf1, 0xc3, 0x69, 0x6b, 0xb9, 0xe1, 0x6d, 0x09,\n+0xf4, 0xf1, 0xaa, 0x50, 0x76, 0x0a, 0x7a, 0x7d, 0x7a, 0x17, 0xa1, 0x55, 0x96, 0x42, 0x99, 0x31,\n+0x09, 0xdd, 0x60, 0x11, 0x8d, 0x05, 0x30, 0x7e, 0xe6, 0x8e, 0x46, 0xd1, 0x9d, 0x14, 0xda, 0xc7,\n+0x17, 0xe4, 0x05, 0x96, 0x8c, 0xc4, 0x24, 0xb5, 0x1b, 0xcf, 0x14, 0x07, 0xb2, 0x40, 0xf8, 0xa3,\n+0x9e, 0x41, 0x86, 0xbc, 0x04, 0xd0, 0x6b, 0x96, 0xc8, 0x2a, 0x80, 0x34, 0xfd, 0xbf, 0xef, 0x06,\n+0xa3, 0xdd, 0x58, 0xc5, 0x85, 0x3d, 0x3e, 0x8f, 0xfe, 0x9e, 0x29, 0xe0, 0xb6, 0xb8, 0x09, 0x68,\n+0x19, 0x1c, 0x18, 0x43, 0x30, 0x82, 0x01, 0xfe, 0x30, 0x82, 0x01, 0x85, 0xa0, 0x03, 0x02, 0x01,\n+0x02, 0x02, 0x08, 0x74, 0x97, 0x25, 0x8a, 0xc7, 0x3f, 0x7a, 0x54, 0x30, 0x0a, 0x06, 0x08, 0x2a,\n+0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,\n+0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75,\n+0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x45, 0x43, 0x43, 0x30, 0x1e,\n+0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x32, 0x30, 0x32, 0x34, 0x5a, 0x17,\n+0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x32, 0x30, 0x32, 0x34, 0x5a, 0x30, 0x45,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30,\n+0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72,\n+0x75, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, 0x41, 0x66,\n+0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75,\n+0x6d, 0x20, 0x45, 0x43, 0x43, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n+0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x0d, 0x30, 0x5e,\n+0x1b, 0x15, 0x9d, 0x03, 0xd0, 0xa1, 0x79, 0x35, 0xb7, 0x3a, 0x3c, 0x92, 0x7a, 0xca, 0x15, 0x1c,\n+0xcd, 0x62, 0xf3, 0x9c, 0x26, 0x5c, 0x07, 0x3d, 0xe5, 0x54, 0xfa, 0xa3, 0xd6, 0xcc, 0x12, 0xea,\n+0xf4, 0x14, 0x5f, 0xe8, 0x8e, 0x19, 0xab, 0x2f, 0x2e, 0x48, 0xe6, 0xac, 0x18, 0x43, 0x78, 0xac,\n+0xd0, 0x37, 0xc3, 0xbd, 0xb2, 0xcd, 0x2c, 0xe6, 0x47, 0xe2, 0x1a, 0xe6, 0x63, 0xb8, 0x3d, 0x2e,\n+0x2f, 0x78, 0xc4, 0x4f, 0xdb, 0xf4, 0x0f, 0xa4, 0x68, 0x4c, 0x55, 0x72, 0x6b, 0x95, 0x1d, 0x4e,\n+0x18, 0x42, 0x95, 0x78, 0xcc, 0x37, 0x3c, 0x91, 0xe2, 0x9b, 0x65, 0x2b, 0x29, 0xa3, 0x42, 0x30,\n+0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9a, 0xaf, 0x29, 0x7a,\n+0xc0, 0x11, 0x35, 0x35, 0x26, 0x51, 0x30, 0x00, 0xc3, 0x6a, 0xfe, 0x40, 0xd5, 0xae, 0xd6, 0x3c,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n+0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n+0x06, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x67, 0x00,\n+0x30, 0x64, 0x02, 0x30, 0x17, 0x09, 0xf3, 0x87, 0x88, 0x50, 0x5a, 0xaf, 0xc8, 0xc0, 0x42, 0xbf,\n+0x47, 0x5f, 0xf5, 0x6c, 0x6a, 0x86, 0xe0, 0xc4, 0x27, 0x74, 0xe4, 0x38, 0x53, 0xd7, 0x05, 0x7f,\n+0x1b, 0x34, 0xe3, 0xc6, 0x2f, 0xb3, 0xca, 0x09, 0x3c, 0x37, 0x9d, 0xd7, 0xe7, 0xb8, 0x46, 0xf1,\n+0xfd, 0xa1, 0xe2, 0x71, 0x02, 0x30, 0x42, 0x59, 0x87, 0x43, 0xd4, 0x51, 0xdf, 0xba, 0xd3, 0x09,\n+0x32, 0x5a, 0xce, 0x88, 0x7e, 0x57, 0x3d, 0x9c, 0x5f, 0x42, 0x6b, 0xf5, 0x07, 0x2d, 0xb5, 0xf0,\n+0x82, 0x93, 0xf9, 0x59, 0x6f, 0xae, 0x64, 0xfa, 0x58, 0xe5, 0x8b, 0x1e, 0xe3, 0x63, 0xbe, 0xb5,\n+0x81, 0xcd, 0x6f, 0x02, 0x8c, 0x79, 0x30, 0x82, 0x03, 0x4c, 0x30, 0x82, 0x02, 0x34, 0xa0, 0x03,\n+0x02, 0x01, 0x02, 0x02, 0x08, 0x7c, 0x4f, 0x04, 0x39, 0x1c, 0xd4, 0x99, 0x2d, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x44, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, 0x66, 0x69,\n+0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69,\n+0x6e, 0x67, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x30, 0x38,\n+0x32, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x30, 0x38, 0x32,\n+0x34, 0x5a, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n+0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69,\n+0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x0c, 0x16, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65,\n+0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,\n+0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb4, 0x84, 0xcc, 0x33, 0x17, 0x2e, 0x6b,\n+0x94, 0x6c, 0x6b, 0x61, 0x52, 0xa0, 0xeb, 0xa3, 0xcf, 0x79, 0x94, 0x4c, 0xe5, 0x94, 0x80, 0x99,\n+0xcb, 0x55, 0x64, 0x44, 0x65, 0x8f, 0x67, 0x64, 0xe2, 0x06, 0xe3, 0x5c, 0x37, 0x49, 0xf6, 0x2f,\n+0x9b, 0x84, 0x84, 0x1e, 0x2d, 0xf2, 0x60, 0x9d, 0x30, 0x4e, 0xcc, 0x84, 0x85, 0xe2, 0x2c, 0xcf,\n+0x1e, 0x9e, 0xfe, 0x36, 0xab, 0x33, 0x77, 0x35, 0x44, 0xd8, 0x35, 0x96, 0x1a, 0x3d, 0x36, 0xe8,\n+0x7a, 0x0e, 0xd8, 0xd5, 0x47, 0xa1, 0x6a, 0x69, 0x8b, 0xd9, 0xfc, 0xbb, 0x3a, 0xae, 0x79, 0x5a,\n+0xd5, 0xf4, 0xd6, 0x71, 0xbb, 0x9a, 0x90, 0x23, 0x6b, 0x9a, 0xb7, 0x88, 0x74, 0x87, 0x0c, 0x1e,\n+0x5f, 0xb9, 0x9e, 0x2d, 0xfa, 0xab, 0x53, 0x2b, 0xdc, 0xbb, 0x76, 0x3e, 0x93, 0x4c, 0x08, 0x08,\n+0x8c, 0x1e, 0xa2, 0x23, 0x1c, 0xd4, 0x6a, 0xad, 0x22, 0xba, 0x99, 0x01, 0x2e, 0x6d, 0x65, 0xcb,\n+0xbe, 0x24, 0x66, 0x55, 0x24, 0x4b, 0x40, 0x44, 0xb1, 0x1b, 0xd7, 0xe1, 0xc2, 0x85, 0xc0, 0xde,\n+0x10, 0x3f, 0x3d, 0xed, 0xb8, 0xfc, 0xf1, 0xf1, 0x23, 0x53, 0xdc, 0xbf, 0x65, 0x97, 0x6f, 0xd9,\n+0xf9, 0x40, 0x71, 0x8d, 0x7d, 0xbd, 0x95, 0xd4, 0xce, 0xbe, 0xa0, 0x5e, 0x27, 0x23, 0xde, 0xfd,\n+0xa6, 0xd0, 0x26, 0x0e, 0x00, 0x29, 0xeb, 0x3c, 0x46, 0xf0, 0x3d, 0x60, 0xbf, 0x3f, 0x50, 0xd2,\n+0xdc, 0x26, 0x41, 0x51, 0x9e, 0x14, 0x37, 0x42, 0x04, 0xa3, 0x70, 0x57, 0xa8, 0x1b, 0x87, 0xed,\n+0x2d, 0xfa, 0x7b, 0xee, 0x8c, 0x0a, 0xe3, 0xa9, 0x66, 0x89, 0x19, 0xcb, 0x41, 0xf9, 0xdd, 0x44,\n+0x36, 0x61, 0xcf, 0xe2, 0x77, 0x46, 0xc8, 0x7d, 0xf6, 0xf4, 0x92, 0x81, 0x36, 0xfd, 0xdb, 0x34,\n+0xf1, 0x72, 0x7e, 0xf3, 0x0c, 0x16, 0xbd, 0xb4, 0x15, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n+0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x07, 0x1f, 0xd2,\n+0xe7, 0x9c, 0xda, 0xc2, 0x6e, 0xa2, 0x40, 0xb4, 0xb0, 0x7a, 0x50, 0x10, 0x50, 0x74, 0xc4, 0xc8,\n+0xbd, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,\n+0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x89, 0x57, 0xb2, 0x16, 0x7a, 0xa8, 0xc2, 0xfd, 0xd6, 0xd9,\n+0x9b, 0x9b, 0x34, 0xc2, 0x9c, 0xb4, 0x32, 0x14, 0x4d, 0xa7, 0xa4, 0xdf, 0xec, 0xbe, 0xa7, 0xbe,\n+0xf8, 0x43, 0xdb, 0x91, 0x37, 0xce, 0xb4, 0x32, 0x2e, 0x50, 0x55, 0x1a, 0x35, 0x4e, 0x76, 0x43,\n+0x71, 0x20, 0xef, 0x93, 0x77, 0x4e, 0x15, 0x70, 0x2e, 0x87, 0xc3, 0xc1, 0x1d, 0x6d, 0xdc, 0xcb,\n+0xb5, 0x27, 0xd4, 0x2c, 0x56, 0xd1, 0x52, 0x53, 0x3a, 0x44, 0xd2, 0x73, 0xc8, 0xc4, 0x1b, 0x05,\n+0x65, 0x5a, 0x62, 0x92, 0x9c, 0xee, 0x41, 0x8d, 0x31, 0xdb, 0xe7, 0x34, 0xea, 0x59, 0x21, 0xd5,\n+0x01, 0x7a, 0xd7, 0x64, 0xb8, 0x64, 0x39, 0xcd, 0xc9, 0xed, 0xaf, 0xed, 0x4b, 0x03, 0x48, 0xa7,\n+0xa0, 0x99, 0x01, 0x80, 0xdc, 0x65, 0xa3, 0x36, 0xae, 0x65, 0x59, 0x48, 0x4f, 0x82, 0x4b, 0xc8,\n+0x65, 0xf1, 0x57, 0x1d, 0xe5, 0x59, 0x2e, 0x0a, 0x3f, 0x6c, 0xd8, 0xd1, 0xf5, 0xe5, 0x09, 0xb4,\n+0x6c, 0x54, 0x00, 0x0a, 0xe0, 0x15, 0x4d, 0x87, 0x75, 0x6d, 0xb7, 0x58, 0x96, 0x5a, 0xdd, 0x6d,\n+0xd2, 0x00, 0xa0, 0xf4, 0x9b, 0x48, 0xbe, 0xc3, 0x37, 0xa4, 0xba, 0x36, 0xe0, 0x7c, 0x87, 0x85,\n+0x97, 0x1a, 0x15, 0xa2, 0xde, 0x2e, 0xa2, 0x5b, 0xbd, 0xaf, 0x18, 0xf9, 0x90, 0x50, 0xcd, 0x70,\n+0x59, 0xf8, 0x27, 0x67, 0x47, 0xcb, 0xc7, 0xa0, 0x07, 0x3a, 0x7d, 0xd1, 0x2c, 0x5d, 0x6c, 0x19,\n+0x3a, 0x66, 0xb5, 0x7d, 0xfd, 0x91, 0x6f, 0x82, 0xb1, 0xbe, 0x08, 0x93, 0xdb, 0x14, 0x47, 0xf1,\n+0xa2, 0x37, 0xc7, 0x45, 0x9e, 0x3c, 0xc7, 0x77, 0xaf, 0x64, 0xa8, 0x93, 0xdf, 0xf6, 0x69, 0x83,\n+0x82, 0x60, 0xf2, 0x49, 0x42, 0x34, 0xed, 0x5a, 0x00, 0x54, 0x85, 0x1c, 0x16, 0x36, 0x92, 0x0c,\n+0x5c, 0xfa, 0xa6, 0xad, 0xbf, 0xdb, 0x30, 0x82, 0x06, 0x14, 0x30, 0x82, 0x03, 0xfc, 0xa0, 0x03,\n+0x02, 0x01, 0x02, 0x02, 0x08, 0x53, 0xec, 0x3b, 0xee, 0xfb, 0xb2, 0x48, 0x5f, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x51, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x42, 0x30, 0x40, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x0c, 0x39, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20,\n+0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e,\n+0x20, 0x46, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61,\n+0x6c, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, 0x30, 0x36, 0x38, 0x30,\n+0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x35, 0x32, 0x30, 0x30, 0x38, 0x33, 0x38, 0x31, 0x35, 0x5a,\n+0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30, 0x38, 0x33, 0x38, 0x31, 0x35, 0x5a, 0x30,\n+0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x42,\n+0x30, 0x40, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x39, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64,\n+0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63,\n+0x69, 0x6f, 0x6e, 0x20, 0x46, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69,\n+0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, 0x30,\n+0x36, 0x38, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82,\n+0x02, 0x01, 0x00, 0xca, 0x96, 0x6b, 0x8e, 0xea, 0xf8, 0xfb, 0xf1, 0xa2, 0x35, 0xe0, 0x7f, 0x4c,\n+0xda, 0xe0, 0xc3, 0x52, 0xd7, 0x7d, 0xb6, 0x10, 0xc8, 0x02, 0x5e, 0xb3, 0x43, 0x2a, 0xc4, 0x4f,\n+0x6a, 0xb2, 0xca, 0x1c, 0x5d, 0x28, 0x9a, 0x78, 0x11, 0x1a, 0x69, 0x59, 0x57, 0xaf, 0xb5, 0x20,\n+0x42, 0xe4, 0x8b, 0x0f, 0xe6, 0xdf, 0x5b, 0xa6, 0x03, 0x92, 0x2f, 0xf5, 0x11, 0xe4, 0x62, 0xd7,\n+0x32, 0x71, 0x38, 0xd9, 0x04, 0x0c, 0x71, 0xab, 0x3d, 0x51, 0x7e, 0x0f, 0x07, 0xdf, 0x63, 0x05,\n+0x5c, 0xe9, 0xbf, 0x94, 0x6f, 0xc1, 0x29, 0x82, 0xc0, 0xb4, 0xda, 0x51, 0xb0, 0xc1, 0x3c, 0xbb,\n+0xad, 0x37, 0x4a, 0x5c, 0xca, 0xf1, 0x4b, 0x36, 0x0e, 0x24, 0xab, 0xbf, 0xc3, 0x84, 0x77, 0xfd,\n+0xa8, 0x50, 0xf4, 0xb1, 0xe7, 0xc6, 0x2f, 0xd2, 0x2d, 0x59, 0x8d, 0x7a, 0x0a, 0x4e, 0x96, 0x69,\n+0x52, 0x02, 0xaa, 0x36, 0x98, 0xec, 0xfc, 0xfa, 0x14, 0x83, 0x0c, 0x37, 0x1f, 0xc9, 0x92, 0x37,\n+0x7f, 0xd7, 0x81, 0x2d, 0xe5, 0xc4, 0xb9, 0xe0, 0x3e, 0x34, 0xfe, 0x67, 0xf4, 0x3e, 0x66, 0xd1,\n+0xd3, 0xf4, 0x40, 0xcf, 0x5e, 0x62, 0x34, 0x0f, 0x70, 0x06, 0x3e, 0x20, 0x18, 0x5a, 0xce, 0xf7,\n+0x72, 0x1b, 0x25, 0x6c, 0x93, 0x74, 0x14, 0x93, 0xa3, 0x73, 0xb1, 0x0e, 0xaa, 0x87, 0x10, 0x23,\n+0x59, 0x5f, 0x20, 0x05, 0x19, 0x47, 0xed, 0x68, 0x8e, 0x92, 0x12, 0xca, 0x5d, 0xfc, 0xd6, 0x2b,\n+0xb2, 0x92, 0x3c, 0x20, 0xcf, 0xe1, 0x5f, 0xaf, 0x20, 0xbe, 0xa0, 0x76, 0x7f, 0x76, 0xe5, 0xec,\n+0x1a, 0x86, 0x61, 0x33, 0x3e, 0xe7, 0x7b, 0xb4, 0x3f, 0xa0, 0x0f, 0x8e, 0xa2, 0xb9, 0x6a, 0x6f,\n+0xb9, 0x87, 0x26, 0x6f, 0x41, 0x6c, 0x88, 0xa6, 0x50, 0xfd, 0x6a, 0x63, 0x0b, 0xf5, 0x93, 0x16,\n+0x1b, 0x19, 0x8f, 0xb2, 0xed, 0x9b, 0x9b, 0xc9, 0x90, 0xf5, 0x01, 0x0c, 0xdf, 0x19, 0x3d, 0x0f,\n+0x3e, 0x38, 0x23, 0xc9, 0x2f, 0x8f, 0x0c, 0xd1, 0x02, 0xfe, 0x1b, 0x55, 0xd6, 0x4e, 0xd0, 0x8d,\n+0x3c, 0xaf, 0x4f, 0xa4, 0xf3, 0xfe, 0xaf, 0x2a, 0xd3, 0x05, 0x9d, 0x79, 0x08, 0xa1, 0xcb, 0x57,\n+0x31, 0xb4, 0x9c, 0xc8, 0x90, 0xb2, 0x67, 0xf4, 0x18, 0x16, 0x93, 0x3a, 0xfc, 0x47, 0xd8, 0xd1,\n+0x78, 0x96, 0x31, 0x1f, 0xba, 0x2b, 0x0c, 0x5f, 0x5d, 0x99, 0xad, 0x63, 0x89, 0x5a, 0x24, 0x20,\n+0x76, 0xd8, 0xdf, 0xfd, 0xab, 0x4e, 0xa6, 0x22, 0xaa, 0x9d, 0x5e, 0xe6, 0x27, 0x8a, 0x7d, 0x68,\n+0x29, 0xa3, 0xe7, 0x8a, 0xb8, 0xda, 0x11, 0xbb, 0x17, 0x2d, 0x99, 0x9d, 0x13, 0x24, 0x46, 0xf7,\n+0xc5, 0xe2, 0xd8, 0x9f, 0x8e, 0x7f, 0xc7, 0x8f, 0x74, 0x6d, 0x5a, 0xb2, 0xe8, 0x72, 0xf5, 0xac,\n+0xee, 0x24, 0x10, 0xad, 0x2f, 0x14, 0xda, 0xff, 0x2d, 0x9a, 0x46, 0x71, 0x47, 0xbe, 0x42, 0xdf,\n+0xbb, 0x01, 0xdb, 0xf4, 0x7f, 0xd3, 0x28, 0x8f, 0x31, 0x59, 0x5b, 0xd3, 0xc9, 0x02, 0xa6, 0xb4,\n+0x52, 0xca, 0x6e, 0x97, 0xfb, 0x43, 0xc5, 0x08, 0x26, 0x6f, 0x8a, 0xf4, 0xbb, 0xfd, 0x9f, 0x28,\n+0xaa, 0x0d, 0xd5, 0x45, 0xf3, 0x13, 0x3a, 0x1d, 0xd8, 0xc0, 0x78, 0x8f, 0x41, 0x67, 0x3c, 0x1e,\n+0x94, 0x64, 0xae, 0x7b, 0x0b, 0xc5, 0xe8, 0xd9, 0x01, 0x88, 0x39, 0x1a, 0x97, 0x86, 0x64, 0x41,\n+0xd5, 0x3b, 0x87, 0x0c, 0x6e, 0xfa, 0x0f, 0xc6, 0xbd, 0x48, 0x14, 0xbf, 0x39, 0x4d, 0xd4, 0x9e,\n+0x41, 0xb6, 0x8f, 0x96, 0x1d, 0x63, 0x96, 0x93, 0xd9, 0x95, 0x06, 0x78, 0x31, 0x68, 0x9e, 0x37,\n+0x06, 0x3b, 0x80, 0x89, 0x45, 0x61, 0x39, 0x23, 0xc7, 0x1b, 0x44, 0xa3, 0x15, 0xe5, 0x1c, 0xf8,\n+0x92, 0x30, 0xbb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xef, 0x30, 0x81, 0xec, 0x30, 0x12,\n+0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02,\n+0x01, 0x01, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x65, 0xcd, 0xeb,\n+0xab, 0x35, 0x1e, 0x00, 0x3e, 0x7e, 0xd5, 0x74, 0xc0, 0x1c, 0xb4, 0x73, 0x47, 0x0e, 0x1a, 0x64,\n+0x2f, 0x30, 0x81, 0xa6, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x81, 0x9e, 0x30, 0x81, 0x9b, 0x30,\n+0x81, 0x98, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x81, 0x8f, 0x30, 0x2f, 0x06, 0x08, 0x2b,\n+0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,\n+0x77, 0x77, 0x77, 0x2e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69,\n+0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x70, 0x73, 0x30, 0x5c, 0x06, 0x08,\n+0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x50, 0x1e, 0x4e, 0x00, 0x50, 0x00, 0x61,\n+0x00, 0x73, 0x00, 0x65, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c,\n+0x00, 0x61, 0x00, 0x20, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x6f,\n+0x00, 0x76, 0x00, 0x61, 0x00, 0x20, 0x00, 0x34, 0x00, 0x37, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61,\n+0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x20,\n+0x00, 0x30, 0x00, 0x38, 0x00, 0x30, 0x00, 0x31, 0x00, 0x37, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x17, 0x7d,\n+0xa0, 0xf9, 0xb4, 0xdd, 0xc5, 0xc5, 0xeb, 0xad, 0x4b, 0x24, 0xb5, 0xa1, 0x02, 0xab, 0xdd, 0xa5,\n+0x88, 0x4a, 0xb2, 0x0f, 0x55, 0x4b, 0x2b, 0x57, 0x8c, 0x3b, 0xe5, 0x31, 0xdd, 0xfe, 0xc4, 0x32,\n+0xf1, 0xe7, 0x5b, 0x64, 0x96, 0x36, 0x32, 0x18, 0xec, 0xa5, 0x32, 0x77, 0xd7, 0xe3, 0x44, 0xb6,\n+0xc0, 0x11, 0x2a, 0x80, 0xb9, 0x3d, 0x6a, 0x6e, 0x7c, 0x9b, 0xd3, 0xad, 0xfc, 0xc3, 0xd6, 0xa3,\n+0xe6, 0x64, 0x29, 0x7c, 0xd1, 0xe1, 0x38, 0x1e, 0x82, 0x2b, 0xff, 0x27, 0x65, 0xaf, 0xfb, 0x16,\n+0x15, 0xc4, 0x2e, 0x71, 0x84, 0xe5, 0xb5, 0xff, 0xfa, 0xa4, 0x47, 0xbd, 0x64, 0x32, 0xbb, 0xf6,\n+0x25, 0x84, 0xa2, 0x27, 0x42, 0xf5, 0x20, 0xb0, 0xc2, 0x13, 0x10, 0x11, 0xcd, 0x10, 0x15, 0xba,\n+0x42, 0x90, 0x2a, 0xd2, 0x44, 0xe1, 0x96, 0x26, 0xeb, 0x31, 0x48, 0x12, 0xfd, 0x2a, 0xda, 0xc9,\n+0x06, 0xcf, 0x74, 0x1e, 0xa9, 0x4b, 0xd5, 0x87, 0x28, 0xf9, 0x79, 0x34, 0x92, 0x3e, 0x2e, 0x44,\n+0xe8, 0xf6, 0x8f, 0x4f, 0x8f, 0x35, 0x3f, 0x25, 0xb3, 0x39, 0xdc, 0x63, 0x2a, 0x90, 0x6b, 0x20,\n+0x5f, 0xc4, 0x52, 0x12, 0x4e, 0x97, 0x2c, 0x2a, 0xac, 0x9d, 0x97, 0xde, 0x48, 0xf2, 0xa3, 0x66,\n+0xdb, 0xc2, 0xd2, 0x83, 0x95, 0xa6, 0x66, 0xa7, 0x9e, 0x25, 0x0f, 0xe9, 0x0b, 0x33, 0x91, 0x65,\n+0x0a, 0x5a, 0xc3, 0xd9, 0x54, 0x12, 0xdd, 0xaf, 0xc3, 0x4e, 0x0e, 0x1f, 0x26, 0x5e, 0x0d, 0xdc,\n+0xb3, 0x8d, 0xec, 0xd5, 0x81, 0x70, 0xde, 0xd2, 0x4f, 0x24, 0x05, 0xf3, 0x6c, 0x4e, 0xf5, 0x4c,\n+0x49, 0x66, 0x8d, 0xd1, 0xff, 0xd2, 0x0b, 0x25, 0x41, 0x48, 0xfe, 0x51, 0x84, 0xc6, 0x42, 0xaf,\n+0x80, 0x04, 0xcf, 0xd0, 0x7e, 0x64, 0x49, 0xe4, 0xf2, 0xdf, 0xa2, 0xec, 0xb1, 0x4c, 0xc0, 0x2a,\n+0x1d, 0xe7, 0xb4, 0xb1, 0x65, 0xa2, 0xc4, 0xbc, 0xf1, 0x98, 0xf4, 0xaa, 0x70, 0x07, 0x63, 0xb4,\n+0xb8, 0xda, 0x3b, 0x4c, 0xfa, 0x40, 0x22, 0x30, 0x5b, 0x11, 0xa6, 0xf0, 0x05, 0x0e, 0xc6, 0x02,\n+0x03, 0x48, 0xab, 0x86, 0x9b, 0x85, 0xdd, 0xdb, 0xdd, 0xea, 0xa2, 0x76, 0x80, 0x73, 0x7d, 0xf5,\n+0x9c, 0x04, 0xc4, 0x45, 0x8d, 0xe7, 0xb9, 0x1c, 0x8b, 0x9e, 0xea, 0xd7, 0x75, 0xd1, 0x72, 0xb1,\n+0xde, 0x75, 0x44, 0xe7, 0x42, 0x7d, 0xe2, 0x57, 0x6b, 0x7d, 0xdc, 0x99, 0xbc, 0x3d, 0x83, 0x28,\n+0xea, 0x80, 0x93, 0x8d, 0xc5, 0x4c, 0x65, 0xc1, 0x70, 0x81, 0xb8, 0x38, 0xfc, 0x43, 0x31, 0xb2,\n+0xf6, 0x03, 0x34, 0x47, 0xb2, 0xac, 0xfb, 0x22, 0x06, 0xcb, 0x1e, 0xdd, 0x17, 0x47, 0x1c, 0x5f,\n+0x66, 0xb9, 0xd3, 0x1a, 0xa2, 0xda, 0x11, 0xb1, 0xa4, 0xbc, 0x23, 0xc9, 0xe4, 0xbe, 0x87, 0xff,\n+0xb9, 0x94, 0xb6, 0xf8, 0x5d, 0x20, 0x4a, 0xd4, 0x5f, 0xe7, 0xbd, 0x68, 0x7b, 0x65, 0xf2, 0x15,\n+0x1e, 0xd2, 0x3a, 0xa9, 0x2d, 0xe9, 0xd8, 0x6b, 0x24, 0xac, 0x97, 0x58, 0x44, 0x47, 0xad, 0x59,\n+0x18, 0xf1, 0x21, 0x65, 0x70, 0xde, 0xce, 0x34, 0x60, 0xa8, 0x40, 0xf1, 0xf3, 0x3c, 0xa4, 0xc3,\n+0x28, 0x23, 0x8c, 0xfe, 0x27, 0x33, 0x43, 0x40, 0xa0, 0x17, 0x3c, 0xeb, 0xea, 0x3b, 0xb0, 0x72,\n+0xa6, 0xa3, 0xb9, 0x4a, 0x4b, 0x5e, 0x16, 0x48, 0xf4, 0xb2, 0xbc, 0xc8, 0x8c, 0x92, 0xc5, 0x9d,\n+0x9f, 0xac, 0x72, 0x36, 0xbc, 0x34, 0x80, 0x34, 0x6b, 0xa9, 0x8b, 0x92, 0xc0, 0xb8, 0x17, 0xed,\n+0xec, 0x76, 0x53, 0xf5, 0x24, 0x01, 0x8c, 0xb3, 0x22, 0xe8, 0x4b, 0x7c, 0x55, 0xc6, 0x9d, 0xfa,\n+0xa3, 0x14, 0xbb, 0x65, 0x85, 0x6e, 0x6e, 0x4f, 0x12, 0x7e, 0x0a, 0x3c, 0x9d, 0x95, 0x30, 0x82,\n+0x03, 0x77, 0x30, 0x82, 0x02, 0x5f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, 0x00, 0x00,\n+0xb9, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,\n+0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x45, 0x31,\n+0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d,\n+0x6f, 0x72, 0x65, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x43, 0x79,\n+0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x19, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x62,\n+0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d,\n+0x30, 0x30, 0x30, 0x35, 0x31, 0x32, 0x31, 0x38, 0x34, 0x36, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32,\n+0x35, 0x30, 0x35, 0x31, 0x32, 0x32, 0x33, 0x35, 0x39, 0x30, 0x30, 0x5a, 0x30, 0x5a, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x45, 0x31, 0x12, 0x30, 0x10, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x31,\n+0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x42,\n+0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72,\n+0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,\n+0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x04, 0xbb, 0x22, 0xab, 0x98, 0x3d,\n+0x57, 0xe8, 0x26, 0x72, 0x9a, 0xb5, 0x79, 0xd4, 0x29, 0xe2, 0xe1, 0xe8, 0x95, 0x80, 0xb1, 0xb0,\n+0xe3, 0x5b, 0x8e, 0x2b, 0x29, 0x9a, 0x64, 0xdf, 0xa1, 0x5d, 0xed, 0xb0, 0x09, 0x05, 0x6d, 0xdb,\n+0x28, 0x2e, 0xce, 0x62, 0xa2, 0x62, 0xfe, 0xb4, 0x88, 0xda, 0x12, 0xeb, 0x38, 0xeb, 0x21, 0x9d,\n+0xc0, 0x41, 0x2b, 0x01, 0x52, 0x7b, 0x88, 0x77, 0xd3, 0x1c, 0x8f, 0xc7, 0xba, 0xb9, 0x88, 0xb5,\n+0x6a, 0x09, 0xe7, 0x73, 0xe8, 0x11, 0x40, 0xa7, 0xd1, 0xcc, 0xca, 0x62, 0x8d, 0x2d, 0xe5, 0x8f,\n+0x0b, 0xa6, 0x50, 0xd2, 0xa8, 0x50, 0xc3, 0x28, 0xea, 0xf5, 0xab, 0x25, 0x87, 0x8a, 0x9a, 0x96,\n+0x1c, 0xa9, 0x67, 0xb8, 0x3f, 0x0c, 0xd5, 0xf7, 0xf9, 0x52, 0x13, 0x2f, 0xc2, 0x1b, 0xd5, 0x70,\n+0x70, 0xf0, 0x8f, 0xc0, 0x12, 0xca, 0x06, 0xcb, 0x9a, 0xe1, 0xd9, 0xca, 0x33, 0x7a, 0x77, 0xd6,\n+0xf8, 0xec, 0xb9, 0xf1, 0x68, 0x44, 0x42, 0x48, 0x13, 0xd2, 0xc0, 0xc2, 0xa4, 0xae, 0x5e, 0x60,\n+0xfe, 0xb6, 0xa6, 0x05, 0xfc, 0xb4, 0xdd, 0x07, 0x59, 0x02, 0xd4, 0x59, 0x18, 0x98, 0x63, 0xf5,\n+0xa5, 0x63, 0xe0, 0x90, 0x0c, 0x7d, 0x5d, 0xb2, 0x06, 0x7a, 0xf3, 0x85, 0xea, 0xeb, 0xd4, 0x03,\n+0xae, 0x5e, 0x84, 0x3e, 0x5f, 0xff, 0x15, 0xed, 0x69, 0xbc, 0xf9, 0x39, 0x36, 0x72, 0x75, 0xcf,\n+0x77, 0x52, 0x4d, 0xf3, 0xc9, 0x90, 0x2c, 0xb9, 0x3d, 0xe5, 0xc9, 0x23, 0x53, 0x3f, 0x1f, 0x24,\n+0x98, 0x21, 0x5c, 0x07, 0x99, 0x29, 0xbd, 0xc6, 0x3a, 0xec, 0xe7, 0x6e, 0x86, 0x3a, 0x6b, 0x97,\n+0x74, 0x63, 0x33, 0xbd, 0x68, 0x18, 0x31, 0xf0, 0x78, 0x8d, 0x76, 0xbf, 0xfc, 0x9e, 0x8e, 0x5d,\n+0x2a, 0x86, 0xa7, 0x4d, 0x90, 0xdc, 0x27, 0x1a, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x45,\n+0x30, 0x43, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe5, 0x9d, 0x59,\n+0x30, 0x82, 0x47, 0x58, 0xcc, 0xac, 0xfa, 0x08, 0x54, 0x36, 0x86, 0x7b, 0x3a, 0xb5, 0x04, 0x4d,\n+0xf0, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01,\n+0x01, 0xff, 0x02, 0x01, 0x03, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x85, 0x0c, 0x5d, 0x8e, 0xe4, 0x6f, 0x51,\n+0x68, 0x42, 0x05, 0xa0, 0xdd, 0xbb, 0x4f, 0x27, 0x25, 0x84, 0x03, 0xbd, 0xf7, 0x64, 0xfd, 0x2d,\n+0xd7, 0x30, 0xe3, 0xa4, 0x10, 0x17, 0xeb, 0xda, 0x29, 0x29, 0xb6, 0x79, 0x3f, 0x76, 0xf6, 0x19,\n+0x13, 0x23, 0xb8, 0x10, 0x0a, 0xf9, 0x58, 0xa4, 0xd4, 0x61, 0x70, 0xbd, 0x04, 0x61, 0x6a, 0x12,\n+0x8a, 0x17, 0xd5, 0x0a, 0xbd, 0xc5, 0xbc, 0x30, 0x7c, 0xd6, 0xe9, 0x0c, 0x25, 0x8d, 0x86, 0x40,\n+0x4f, 0xec, 0xcc, 0xa3, 0x7e, 0x38, 0xc6, 0x37, 0x11, 0x4f, 0xed, 0xdd, 0x68, 0x31, 0x8e, 0x4c,\n+0xd2, 0xb3, 0x01, 0x74, 0xee, 0xbe, 0x75, 0x5e, 0x07, 0x48, 0x1a, 0x7f, 0x70, 0xff, 0x16, 0x5c,\n+0x84, 0xc0, 0x79, 0x85, 0xb8, 0x05, 0xfd, 0x7f, 0xbe, 0x65, 0x11, 0xa3, 0x0f, 0xc0, 0x02, 0xb4,\n+0xf8, 0x52, 0x37, 0x39, 0x04, 0xd5, 0xa9, 0x31, 0x7a, 0x18, 0xbf, 0xa0, 0x2a, 0xf4, 0x12, 0x99,\n+0xf7, 0xa3, 0x45, 0x82, 0xe3, 0x3c, 0x5e, 0xf5, 0x9d, 0x9e, 0xb5, 0xc8, 0x9e, 0x7c, 0x2e, 0xc8,\n+0xa4, 0x9e, 0x4e, 0x08, 0x14, 0x4b, 0x6d, 0xfd, 0x70, 0x6d, 0x6b, 0x1a, 0x63, 0xbd, 0x64, 0xe6,\n+0x1f, 0xb7, 0xce, 0xf0, 0xf2, 0x9f, 0x2e, 0xbb, 0x1b, 0xb7, 0xf2, 0x50, 0x88, 0x73, 0x92, 0xc2,\n+0xe2, 0xe3, 0x16, 0x8d, 0x9a, 0x32, 0x02, 0xab, 0x8e, 0x18, 0xdd, 0xe9, 0x10, 0x11, 0xee, 0x7e,\n+0x35, 0xab, 0x90, 0xaf, 0x3e, 0x30, 0x94, 0x7a, 0xd0, 0x33, 0x3d, 0xa7, 0x65, 0x0f, 0xf5, 0xfc,\n+0x8e, 0x9e, 0x62, 0xcf, 0x47, 0x44, 0x2c, 0x01, 0x5d, 0xbb, 0x1d, 0xb5, 0x32, 0xd2, 0x47, 0xd2,\n+0x38, 0x2e, 0xd0, 0xfe, 0x81, 0xdc, 0x32, 0x6a, 0x1e, 0xb5, 0xee, 0x3c, 0xd5, 0xfc, 0xe7, 0x81,\n+0x1d, 0x19, 0xc3, 0x24, 0x42, 0xea, 0x63, 0x39, 0xa9, 0x30, 0x82, 0x05, 0x59, 0x30, 0x82, 0x03,\n+0x41, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33,\n+0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n+0x17, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x31, 0x30,\n+0x32, 0x36, 0x30, 0x38, 0x33, 0x38, 0x30, 0x33, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x30, 0x32,\n+0x36, 0x30, 0x38, 0x33, 0x38, 0x30, 0x33, 0x5a, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33,\n+0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n+0x17, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00,\n+0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd7, 0xc7, 0x5e, 0xf7, 0xc1, 0x07, 0xd4,\n+0x77, 0xfb, 0x43, 0x21, 0xf4, 0xf4, 0xf5, 0x69, 0xe4, 0xee, 0x32, 0x01, 0xdb, 0xa3, 0x86, 0x1f,\n+0xe4, 0x59, 0x0d, 0xba, 0xe7, 0x75, 0x83, 0x52, 0xeb, 0xea, 0x1c, 0x61, 0x15, 0x48, 0xbb, 0x1d,\n+0x07, 0xca, 0x8c, 0xae, 0xb0, 0xdc, 0x96, 0x9d, 0xea, 0xc3, 0x60, 0x92, 0x86, 0x82, 0x28, 0x73,\n+0x9c, 0x56, 0x06, 0xff, 0x4b, 0x64, 0xf0, 0x0c, 0x2a, 0x37, 0x49, 0xb5, 0xe5, 0xcf, 0x0c, 0x7c,\n+0xee, 0xf1, 0x4a, 0xbb, 0x73, 0x30, 0x65, 0xf3, 0xd5, 0x2f, 0x83, 0xb6, 0x7e, 0xe3, 0xe7, 0xf5,\n+0x9e, 0xab, 0x60, 0xf9, 0xd3, 0xf1, 0x9d, 0x92, 0x74, 0x8a, 0xe4, 0x1c, 0x96, 0xac, 0x5b, 0x80,\n+0xe9, 0xb5, 0xf4, 0x31, 0x87, 0xa3, 0x51, 0xfc, 0xc7, 0x7e, 0xa1, 0x6f, 0x8e, 0x53, 0x77, 0xd4,\n+0x97, 0xc1, 0x55, 0x33, 0x92, 0x3e, 0x18, 0x2f, 0x75, 0xd4, 0xad, 0x86, 0x49, 0xcb, 0x95, 0xaf,\n+0x54, 0x06, 0x6c, 0xd8, 0x06, 0x13, 0x8d, 0x5b, 0xff, 0xe1, 0x26, 0x19, 0x59, 0xc0, 0x24, 0xba,\n+0x81, 0x71, 0x79, 0x90, 0x44, 0x50, 0x68, 0x24, 0x94, 0x5f, 0xb8, 0xb3, 0x11, 0xf1, 0x29, 0x41,\n+0x61, 0xa3, 0x41, 0xcb, 0x23, 0x36, 0xd5, 0xc1, 0xf1, 0x32, 0x50, 0x10, 0x4e, 0x7f, 0xf4, 0x86,\n+0x93, 0xec, 0x84, 0xd3, 0x8e, 0xbc, 0x4b, 0xbf, 0x5c, 0x01, 0x4e, 0x07, 0x3d, 0xdc, 0x14, 0x8a,\n+0x94, 0x0a, 0xa4, 0xea, 0x73, 0xfb, 0x0b, 0x51, 0xe8, 0x13, 0x07, 0x18, 0xfa, 0x0e, 0xf1, 0x2b,\n+0xd1, 0x54, 0x15, 0x7d, 0x3c, 0xe1, 0xf7, 0xb4, 0x19, 0x42, 0x67, 0x62, 0x5e, 0x77, 0xe0, 0xa2,\n+0x55, 0xec, 0xb6, 0xd9, 0x69, 0x17, 0xd5, 0x3a, 0xaf, 0x44, 0xed, 0x4a, 0xc5, 0x9e, 0xe4, 0x7a,\n+0x27, 0x7c, 0xe5, 0x75, 0xd7, 0xaa, 0xcb, 0x25, 0xe7, 0xdf, 0x6b, 0x0a, 0xdb, 0x0f, 0x4d, 0x93,\n+0x4e, 0xa8, 0xa0, 0xcd, 0x7b, 0x2e, 0xf2, 0x59, 0x01, 0x6a, 0xb7, 0x0d, 0xb8, 0x07, 0x81, 0x7e,\n+0x8b, 0x38, 0x1b, 0x38, 0xe6, 0x0a, 0x57, 0x99, 0x3d, 0xee, 0x21, 0xe8, 0xa3, 0xf5, 0x0c, 0x16,\n+0xdd, 0x8b, 0xec, 0x34, 0x8e, 0x9c, 0x2a, 0x1c, 0x00, 0x15, 0x17, 0x8d, 0x68, 0x83, 0xd2, 0x70,\n+0x9f, 0x18, 0x08, 0xcd, 0x11, 0x68, 0xd5, 0xc9, 0x6b, 0x52, 0xcd, 0xc4, 0x46, 0x8f, 0xdc, 0xb5,\n+0xf3, 0xd8, 0x57, 0x73, 0x1e, 0xe9, 0x94, 0x39, 0x04, 0xbf, 0xd3, 0xde, 0x38, 0xde, 0xb4, 0x53,\n+0xec, 0x69, 0x1c, 0xa2, 0x7e, 0xc4, 0x8f, 0xe4, 0x1b, 0x70, 0xad, 0xf2, 0xa2, 0xf9, 0xfb, 0xf7,\n+0x16, 0x64, 0x66, 0x69, 0x9f, 0x49, 0x51, 0xa2, 0xe2, 0x15, 0x18, 0x67, 0x06, 0x4a, 0x7f, 0xd5,\n+0x6c, 0xb5, 0x4d, 0xb3, 0x33, 0xe0, 0x61, 0xeb, 0x5d, 0xbe, 0xe9, 0x98, 0x0f, 0x32, 0xd7, 0x1d,\n+0x4b, 0x3c, 0x2e, 0x5a, 0x01, 0x52, 0x91, 0x09, 0xf2, 0xdf, 0xea, 0x8d, 0xd8, 0x06, 0x40, 0x63,\n+0xaa, 0x11, 0xe4, 0xfe, 0xc3, 0x37, 0x9e, 0x14, 0x52, 0x3f, 0xf4, 0xe2, 0xcc, 0xf2, 0x61, 0x93,\n+0xd1, 0xfd, 0x67, 0x6b, 0xd7, 0x52, 0xae, 0xbf, 0x68, 0xab, 0x40, 0x43, 0xa0, 0x57, 0x35, 0x53,\n+0x78, 0xf0, 0x53, 0xf8, 0x61, 0x42, 0x07, 0x64, 0xc6, 0xd7, 0x6f, 0x9b, 0x4c, 0x38, 0x0d, 0x63,\n+0xac, 0x62, 0xaf, 0x36, 0x8b, 0xa2, 0x73, 0x0a, 0x0d, 0xf5, 0x21, 0xbd, 0x74, 0xaa, 0x4d, 0xea,\n+0x72, 0x03, 0x49, 0xdb, 0xc7, 0x5f, 0x1d, 0x62, 0x63, 0xc7, 0xfd, 0xdd, 0x91, 0xec, 0x33, 0xee,\n+0xf5, 0x6d, 0xb4, 0x6e, 0x30, 0x68, 0xde, 0xc8, 0xd6, 0x26, 0xb0, 0x75, 0x5e, 0x7b, 0xb4, 0x07,\n+0x20, 0x98, 0xa1, 0x76, 0x32, 0xb8, 0x4d, 0x6c, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n+0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n+0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc9, 0x80,\n+0x77, 0xe0, 0x62, 0x92, 0x82, 0xf5, 0x46, 0x9c, 0xf3, 0xba, 0xf7, 0x4c, 0xc3, 0xde, 0xb8, 0xa3,\n+0xad, 0x39, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n+0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x53, 0x5f, 0x21, 0xf5, 0xba, 0xb0, 0x3a, 0x52, 0x39, 0x2c,\n+0x92, 0xb0, 0x6c, 0x00, 0xc9, 0xef, 0xce, 0x20, 0xef, 0x06, 0xf2, 0x96, 0x9e, 0xe9, 0xa4, 0x74,\n+0x7f, 0x7a, 0x16, 0xfc, 0xb7, 0xf5, 0xb6, 0xfb, 0x15, 0x1b, 0x3f, 0xab, 0xa6, 0xc0, 0x72, 0x5d,\n+0x10, 0xb1, 0x71, 0xee, 0xbc, 0x4f, 0xe3, 0xad, 0xac, 0x03, 0x6d, 0x2e, 0x71, 0x2e, 0xaf, 0xc4,\n+0xe3, 0xad, 0xa3, 0xbd, 0x0c, 0x11, 0xa7, 0xb4, 0xff, 0x4a, 0xb2, 0x7b, 0x10, 0x10, 0x1f, 0xa7,\n+0x57, 0x41, 0xb2, 0xc0, 0xae, 0xf4, 0x2c, 0x59, 0xd6, 0x47, 0x10, 0x88, 0xf3, 0x21, 0x51, 0x29,\n+0x30, 0xca, 0x60, 0x86, 0xaf, 0x46, 0xab, 0x1d, 0xed, 0x3a, 0x5b, 0xb0, 0x94, 0xde, 0x44, 0xe3,\n+0x41, 0x08, 0xa2, 0xc1, 0xec, 0x1d, 0xd6, 0xfd, 0x4f, 0xb6, 0xd6, 0x47, 0xd0, 0x14, 0x0b, 0xca,\n+0xe6, 0xca, 0xb5, 0x7b, 0x77, 0x7e, 0x41, 0x1f, 0x5e, 0x83, 0xc7, 0xb6, 0x8c, 0x39, 0x96, 0xb0,\n+0x3f, 0x96, 0x81, 0x41, 0x6f, 0x60, 0x90, 0xe2, 0xe8, 0xf9, 0xfb, 0x22, 0x71, 0xd9, 0x7d, 0xb3,\n+0x3d, 0x46, 0xbf, 0xb4, 0x84, 0xaf, 0x90, 0x1c, 0x0f, 0x8f, 0x12, 0x6a, 0xaf, 0xef, 0xee, 0x1e,\n+0x7a, 0xae, 0x02, 0x4a, 0x8a, 0x17, 0x2b, 0x76, 0xfe, 0xac, 0x54, 0x89, 0x24, 0x2c, 0x4f, 0x3f,\n+0xb6, 0xb2, 0xa7, 0x4e, 0x8c, 0xa8, 0x91, 0x97, 0xfb, 0x29, 0xc6, 0x7b, 0x5c, 0x2d, 0xb9, 0xcb,\n+0x66, 0xb6, 0xb7, 0xa8, 0x5b, 0x12, 0x51, 0x85, 0xb5, 0x09, 0x7e, 0x62, 0x78, 0x70, 0xfe, 0xa9,\n+0x6a, 0x60, 0xb6, 0x1d, 0x0e, 0x79, 0x0c, 0xfd, 0xca, 0xea, 0x24, 0x80, 0x72, 0xc3, 0x97, 0x3f,\n+0xf2, 0x77, 0xab, 0x43, 0x22, 0x0a, 0xc7, 0xeb, 0xb6, 0x0c, 0x84, 0x82, 0x2c, 0x80, 0x6b, 0x41,\n+0x8a, 0x08, 0xc0, 0xeb, 0xa5, 0x6b, 0xdf, 0x99, 0x12, 0xcb, 0x8a, 0xd5, 0x5e, 0x80, 0x0c, 0x91,\n+0xe0, 0x26, 0x08, 0x36, 0x48, 0xc5, 0xfa, 0x38, 0x11, 0x35, 0xff, 0x25, 0x83, 0x2d, 0xf2, 0x7a,\n+0xbf, 0xda, 0xfd, 0x8e, 0xfe, 0xa5, 0xcb, 0x45, 0x2c, 0x1f, 0xc4, 0x88, 0x53, 0xae, 0x77, 0x0e,\n+0xd9, 0x9a, 0x76, 0xc5, 0x8e, 0x2c, 0x1d, 0xa3, 0xba, 0xd5, 0xec, 0x32, 0xae, 0xc0, 0xaa, 0xac,\n+0xf7, 0xd1, 0x7a, 0x4d, 0xeb, 0xd4, 0x07, 0xe2, 0x48, 0xf7, 0x22, 0x8e, 0xb0, 0xa4, 0x9f, 0x6a,\n+0xce, 0x8e, 0xb2, 0xb2, 0x60, 0xf4, 0xa3, 0x22, 0xd0, 0x23, 0xeb, 0x94, 0x5a, 0x7a, 0x69, 0xdd,\n+0x0f, 0xbf, 0x40, 0x57, 0xac, 0x6b, 0x59, 0x50, 0xd9, 0xa3, 0x99, 0xe1, 0x6e, 0xfe, 0x8d, 0x01,\n+0x79, 0x27, 0x23, 0x15, 0xde, 0x92, 0x9d, 0x7b, 0x09, 0x4d, 0x5a, 0xe7, 0x4b, 0x48, 0x30, 0x5a,\n+0x18, 0xe6, 0x0a, 0x6d, 0xe6, 0x8f, 0xe0, 0xd2, 0xbb, 0xe6, 0xdf, 0x7c, 0x6e, 0x21, 0x82, 0xc1,\n+0x68, 0x39, 0x4d, 0xb4, 0x98, 0x58, 0x66, 0x62, 0xcc, 0x4a, 0x90, 0x5e, 0xc3, 0xfa, 0x27, 0x04,\n+0xb1, 0x79, 0x15, 0x74, 0x99, 0xcc, 0xbe, 0xad, 0x20, 0xde, 0x26, 0x60, 0x1c, 0xeb, 0x56, 0x51,\n+0xa6, 0xa3, 0xea, 0xe4, 0xa3, 0x3f, 0xa7, 0xff, 0x61, 0xdc, 0xf1, 0x5a, 0x4d, 0x6c, 0x32, 0x23,\n+0x43, 0xee, 0xac, 0xa8, 0xee, 0xee, 0x4a, 0x12, 0x09, 0x3c, 0x5d, 0x71, 0xc2, 0xbe, 0x79, 0xfa,\n+0xc2, 0x87, 0x68, 0x1d, 0x0b, 0xfd, 0x5c, 0x69, 0xcc, 0x06, 0xd0, 0x9a, 0x7d, 0x54, 0x99, 0x2a,\n+0xc9, 0x39, 0x1a, 0x19, 0xaf, 0x4b, 0x2a, 0x43, 0xf3, 0x63, 0x5d, 0x5a, 0x58, 0xe2, 0x2f, 0xe3,\n+0x1d, 0xe4, 0xa9, 0xd6, 0xd0, 0x0a, 0xd0, 0x9e, 0xbf, 0xd7, 0x81, 0x09, 0xf1, 0xc9, 0xc7, 0x26,\n+0x0d, 0xac, 0x98, 0x16, 0x56, 0xa0, 0x30, 0x82, 0x03, 0x77, 0x30, 0x82, 0x02, 0x5f, 0xa0, 0x03,\n+0x02, 0x01, 0x02, 0x02, 0x08, 0x5c, 0x33, 0xcb, 0x62, 0x2c, 0x5f, 0xb3, 0x32, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3c, 0x31, 0x1e,\n+0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x15, 0x41, 0x74, 0x6f, 0x73, 0x20, 0x54, 0x72,\n+0x75, 0x73, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x32, 0x30, 0x31, 0x31, 0x31, 0x0d,\n+0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x74, 0x6f, 0x73, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31,\n+0x30, 0x37, 0x30, 0x37, 0x31, 0x34, 0x35, 0x38, 0x33, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31,\n+0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x3c, 0x31, 0x1e, 0x30, 0x1c,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x15, 0x41, 0x74, 0x6f, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x32, 0x30, 0x31, 0x31, 0x31, 0x0d, 0x30, 0x0b,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x74, 0x6f, 0x73, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,\n+0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x95, 0x85, 0x3b, 0x97, 0x6f, 0x2a, 0x3b,\n+0x2e, 0x3b, 0xcf, 0xa6, 0xf3, 0x29, 0x35, 0xbe, 0xcf, 0x18, 0xac, 0x3e, 0xaa, 0xd9, 0xf8, 0x4d,\n+0xa0, 0x3e, 0x1a, 0x47, 0xb9, 0xbc, 0x9a, 0xdf, 0xf2, 0xfe, 0xcc, 0x3e, 0x47, 0xe8, 0x7a, 0x96,\n+0xc2, 0x24, 0x8e, 0x35, 0xf4, 0xa9, 0x0c, 0xfc, 0x82, 0xfd, 0x6d, 0xc1, 0x72, 0x62, 0x27, 0xbd,\n+0xea, 0x6b, 0xeb, 0xe7, 0x8a, 0xcc, 0x54, 0x3e, 0x90, 0x50, 0xcf, 0x80, 0xd4, 0x95, 0xfb, 0xe8,\n+0xb5, 0x82, 0xd4, 0x14, 0xc5, 0xb6, 0xa9, 0x55, 0x25, 0x57, 0xdb, 0xb1, 0x50, 0xf6, 0xb0, 0x60,\n+0x64, 0x59, 0x7a, 0x69, 0xcf, 0x03, 0xb7, 0x6f, 0x0d, 0xbe, 0xca, 0x3e, 0x6f, 0x74, 0x72, 0xea,\n+0xaa, 0x30, 0x2a, 0x73, 0x62, 0xbe, 0x49, 0x91, 0x61, 0xc8, 0x11, 0xfe, 0x0e, 0x03, 0x2a, 0xf7,\n+0x6a, 0x20, 0xdc, 0x02, 0x15, 0x0d, 0x5e, 0x15, 0x6a, 0xfc, 0xe3, 0x82, 0xc1, 0xb5, 0xc5, 0x9d,\n+0x64, 0x09, 0x6c, 0xa3, 0x59, 0x98, 0x07, 0x27, 0xc7, 0x1b, 0x96, 0x2b, 0x61, 0x74, 0x71, 0x6c,\n+0x43, 0xf1, 0xf7, 0x35, 0x89, 0x10, 0xe0, 0x9e, 0xec, 0x55, 0xa1, 0x37, 0x22, 0xa2, 0x87, 0x04,\n+0x05, 0x2c, 0x47, 0x7d, 0xb4, 0x1c, 0xb9, 0x62, 0x29, 0x66, 0x28, 0xca, 0xb7, 0xe1, 0x93, 0xf5,\n+0xa4, 0x94, 0x03, 0x99, 0xb9, 0x70, 0x85, 0xb5, 0xe6, 0x48, 0xea, 0x8d, 0x50, 0xfc, 0xd9, 0xde,\n+0xcc, 0x6f, 0x07, 0x0e, 0xdd, 0x0b, 0x72, 0x9d, 0x80, 0x30, 0x16, 0x07, 0x95, 0x3f, 0x28, 0x0e,\n+0xfd, 0xc5, 0x75, 0x4f, 0x53, 0xd6, 0x74, 0x9a, 0xb4, 0x24, 0x2e, 0x8e, 0x02, 0x91, 0xcf, 0x76,\n+0xc5, 0x9b, 0x1e, 0x55, 0x74, 0x9c, 0x78, 0x21, 0xb1, 0xf0, 0x2d, 0xf1, 0x0b, 0x9f, 0xc2, 0xd5,\n+0x96, 0x18, 0x1f, 0xf0, 0x54, 0x22, 0x7a, 0x8c, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x7d,\n+0x30, 0x7b, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa7, 0xa5, 0x06,\n+0xb1, 0x2c, 0xa6, 0x09, 0x60, 0xee, 0xd1, 0x97, 0xe9, 0x70, 0xae, 0xbc, 0x3b, 0x19, 0x6c, 0xdb,\n+0x21, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa7,\n+0xa5, 0x06, 0xb1, 0x2c, 0xa6, 0x09, 0x60, 0xee, 0xd1, 0x97, 0xe9, 0x70, 0xae, 0xbc, 0x3b, 0x19,\n+0x6c, 0xdb, 0x21, 0x30, 0x18, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x11, 0x30, 0x0f, 0x30, 0x0d,\n+0x06, 0x0b, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xb0, 0x2d, 0x03, 0x04, 0x01, 0x01, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01,\n+0x00, 0x26, 0x77, 0x34, 0xdb, 0x94, 0x48, 0x86, 0x2a, 0x41, 0x9d, 0x2c, 0x3e, 0x06, 0x90, 0x60,\n+0xc4, 0x8c, 0xac, 0x0b, 0x54, 0xb8, 0x1f, 0xb9, 0x7b, 0xd3, 0x07, 0x39, 0xe4, 0xfa, 0x3e, 0x7b,\n+0xb2, 0x3d, 0x4e, 0xed, 0x9f, 0x23, 0xbd, 0x97, 0xf3, 0x6b, 0x5c, 0xef, 0xee, 0xfd, 0x40, 0xa6,\n+0xdf, 0xa1, 0x93, 0xa1, 0x0a, 0x86, 0xac, 0xef, 0x20, 0xd0, 0x79, 0x01, 0xbd, 0x78, 0xf7, 0x19,\n+0xd8, 0x24, 0x31, 0x34, 0x04, 0x01, 0xa6, 0xba, 0x15, 0x9a, 0xc3, 0x27, 0xdc, 0xd8, 0x4f, 0x0f,\n+0xcc, 0x18, 0x63, 0xff, 0x99, 0x0f, 0x0e, 0x91, 0x6b, 0x75, 0x16, 0xe1, 0x21, 0xfc, 0xd8, 0x26,\n+0xc7, 0x47, 0xb7, 0xa6, 0xcf, 0x58, 0x72, 0x71, 0x7e, 0xba, 0xe1, 0x4d, 0x95, 0x47, 0x3b, 0xc9,\n+0xaf, 0x6d, 0xa1, 0xb4, 0xc1, 0xec, 0x89, 0xf6, 0xb4, 0x0f, 0x38, 0xb5, 0xe2, 0x64, 0xdc, 0x25,\n+0xcf, 0xa6, 0xdb, 0xeb, 0x9a, 0x5c, 0x99, 0xa1, 0xc5, 0x08, 0xde, 0xfd, 0xe6, 0xda, 0xd5, 0xd6,\n+0x5a, 0x45, 0x0c, 0xc4, 0xb7, 0xc2, 0xb5, 0x14, 0xef, 0xb4, 0x11, 0xff, 0x0e, 0x15, 0xb5, 0xf5,\n+0xf5, 0xdb, 0xc6, 0xbd, 0xeb, 0x5a, 0xa7, 0xf0, 0x56, 0x22, 0xa9, 0x3c, 0x65, 0x54, 0xc6, 0x15,\n+0xa8, 0xbd, 0x86, 0x9e, 0xcd, 0x83, 0x96, 0x68, 0x7a, 0x71, 0x81, 0x89, 0xe1, 0x0b, 0xe1, 0xea,\n+0x11, 0x1b, 0x68, 0x08, 0xcc, 0x69, 0x9e, 0xec, 0x9e, 0x41, 0x9e, 0x44, 0x32, 0x26, 0x7a, 0xe2,\n+0x87, 0x0a, 0x71, 0x3d, 0xeb, 0xe4, 0x5a, 0xa4, 0xd2, 0xdb, 0xc5, 0xcd, 0xc6, 0xde, 0x60, 0x7f,\n+0xb9, 0xf3, 0x4f, 0x44, 0x92, 0xef, 0x2a, 0xb7, 0x18, 0x3e, 0xa7, 0x19, 0xd9, 0x0b, 0x7d, 0xb1,\n+0x37, 0x41, 0x42, 0xb0, 0xba, 0x60, 0x1d, 0xf2, 0xfe, 0x09, 0x11, 0xb0, 0xf0, 0x87, 0x7b, 0xa7,\n+0x9d, 0x30, 0x82, 0x05, 0x59, 0x30, 0x82, 0x03, 0x41, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01,\n+0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n+0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31,\n+0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73,\n+0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x20,\n+0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73,\n+0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41,\n+0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, 0x30, 0x38, 0x32, 0x38, 0x35, 0x38,\n+0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x30, 0x32, 0x36, 0x30, 0x38, 0x32, 0x38, 0x35, 0x38, 0x5a,\n+0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31,\n+0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73,\n+0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x20,\n+0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73,\n+0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41,\n+0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01,\n+0x00, 0xa5, 0xda, 0x0a, 0x95, 0x16, 0x50, 0xe3, 0x95, 0xf2, 0x5e, 0x9d, 0x76, 0x31, 0x06, 0x32,\n+0x7a, 0x9b, 0xf1, 0x10, 0x76, 0xb8, 0x00, 0x9a, 0xb5, 0x52, 0x36, 0xcd, 0x24, 0x47, 0xb0, 0x9f,\n+0x18, 0x64, 0xbc, 0x9a, 0xf6, 0xfa, 0xd5, 0x79, 0xd8, 0x90, 0x62, 0x4c, 0x22, 0x2f, 0xde, 0x38,\n+0x3d, 0xd6, 0xe0, 0xa8, 0xe9, 0x1c, 0x2c, 0xdb, 0x78, 0x11, 0xe9, 0x8e, 0x68, 0x51, 0x15, 0x72,\n+0xc7, 0xf3, 0x33, 0x87, 0xe4, 0xa0, 0x5d, 0x0b, 0x5c, 0xe0, 0x57, 0x07, 0x2a, 0x30, 0xf5, 0xcd,\n+0xc4, 0x37, 0x77, 0x28, 0x4d, 0x18, 0x91, 0xe6, 0xbf, 0xd5, 0x52, 0xfd, 0x71, 0x2d, 0x70, 0x3e,\n+0xe7, 0xc6, 0xc4, 0x8a, 0xe3, 0xf0, 0x28, 0x0b, 0xf4, 0x76, 0x98, 0xa1, 0x8b, 0x87, 0x55, 0xb2,\n+0x3a, 0x13, 0xfc, 0xb7, 0x3e, 0x27, 0x37, 0x8e, 0x22, 0xe3, 0xa8, 0x4f, 0x2a, 0xef, 0x60, 0xbb,\n+0x3d, 0xb7, 0x39, 0xc3, 0x0e, 0x01, 0x47, 0x99, 0x5d, 0x12, 0x4f, 0xdb, 0x43, 0xfa, 0x57, 0xa1,\n+0xed, 0xf9, 0x9d, 0xbe, 0x11, 0x47, 0x26, 0x5b, 0x13, 0x98, 0xab, 0x5d, 0x16, 0x8a, 0xb0, 0x37,\n+0x1c, 0x57, 0x9d, 0x45, 0xff, 0x88, 0x96, 0x36, 0xbf, 0xbb, 0xca, 0x07, 0x7b, 0x6f, 0x87, 0x63,\n+0xd7, 0xd0, 0x32, 0x6a, 0xd6, 0x5d, 0x6c, 0x0c, 0xf1, 0xb3, 0x6e, 0x39, 0xe2, 0x6b, 0x31, 0x2e,\n+0x39, 0x00, 0x27, 0x14, 0xde, 0x38, 0xc0, 0xec, 0x19, 0x66, 0x86, 0x12, 0xe8, 0x9d, 0x72, 0x16,\n+0x13, 0x64, 0x52, 0xc7, 0xa9, 0x37, 0x1c, 0xfd, 0x82, 0x30, 0xed, 0x84, 0x18, 0x1d, 0xf4, 0xae,\n+0x5c, 0xff, 0x70, 0x13, 0x00, 0xeb, 0xb1, 0xf5, 0x33, 0x7a, 0x4b, 0xd6, 0x55, 0xf8, 0x05, 0x8d,\n+0x4b, 0x69, 0xb0, 0xf5, 0xb3, 0x28, 0x36, 0x5c, 0x14, 0xc4, 0x51, 0x73, 0x4d, 0x6b, 0x0b, 0xf1,\n+0x34, 0x07, 0xdb, 0x17, 0x39, 0xd7, 0xdc, 0x28, 0x7b, 0x6b, 0xf5, 0x9f, 0xf3, 0x2e, 0xc1, 0x4f,\n+0x17, 0x2a, 0x10, 0xf3, 0xcc, 0xca, 0xe8, 0xeb, 0xfd, 0x6b, 0xab, 0x2e, 0x9a, 0x9f, 0x2d, 0x82,\n+0x6e, 0x04, 0xd4, 0x52, 0x01, 0x93, 0x2d, 0x3d, 0x86, 0xfc, 0x7e, 0xfc, 0xdf, 0xef, 0x42, 0x1d,\n+0xa6, 0x6b, 0xef, 0xb9, 0x20, 0xc6, 0xf7, 0xbd, 0xa0, 0xa7, 0x95, 0xfd, 0xa7, 0xe6, 0x89, 0x24,\n+0xd8, 0xcc, 0x8c, 0x34, 0x6c, 0xe2, 0x23, 0x2f, 0xd9, 0x12, 0x1a, 0x21, 0xb9, 0x55, 0x91, 0x6f,\n+0x0b, 0x91, 0x79, 0x19, 0x0c, 0xad, 0x40, 0x88, 0x0b, 0x70, 0xe2, 0x7a, 0xd2, 0x0e, 0xd8, 0x68,\n+0x48, 0xbb, 0x82, 0x13, 0x39, 0x10, 0x58, 0xe9, 0xd8, 0x2a, 0x07, 0xc6, 0x12, 0xdb, 0x58, 0xdb,\n+0xd2, 0x3b, 0x55, 0x10, 0x47, 0x05, 0x15, 0x67, 0x62, 0x7e, 0x18, 0x63, 0xa6, 0x46, 0x3f, 0x09,\n+0x0e, 0x54, 0x32, 0x5e, 0xbf, 0x0d, 0x62, 0x7a, 0x27, 0xef, 0x80, 0xe8, 0xdb, 0xd9, 0x4b, 0x06,\n+0x5a, 0x37, 0x5a, 0x25, 0xd0, 0x08, 0x12, 0x77, 0xd4, 0x6f, 0x09, 0x50, 0x97, 0x3d, 0xc8, 0x1d,\n+0xc3, 0xdf, 0x8c, 0x45, 0x30, 0x56, 0xc6, 0xd3, 0x64, 0xab, 0x66, 0xf3, 0xc0, 0x5e, 0x96, 0x9c,\n+0xc3, 0xc4, 0xef, 0xc3, 0x7c, 0x6b, 0x8b, 0x3a, 0x79, 0x7f, 0xb3, 0x49, 0xcf, 0x3d, 0xe2, 0x89,\n+0x9f, 0xa0, 0x30, 0x4b, 0x85, 0xb9, 0x9c, 0x94, 0x24, 0x79, 0x8f, 0x7d, 0x6b, 0xa9, 0x45, 0x68,\n+0x0f, 0x2b, 0xd0, 0xf1, 0xda, 0x1c, 0xcb, 0x69, 0xb8, 0xca, 0x49, 0x62, 0x6d, 0xc8, 0xd0, 0x63,\n+0x62, 0xdd, 0x60, 0x0f, 0x58, 0xaa, 0x8f, 0xa1, 0xbc, 0x05, 0xa5, 0x66, 0xa2, 0xcf, 0x1b, 0x76,\n+0xb2, 0x84, 0x64, 0xb1, 0x4c, 0x39, 0x52, 0xc0, 0x30, 0xba, 0xf0, 0x8c, 0x4b, 0x02, 0xb0, 0xb6,\n+0xb7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,\n+0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x47, 0xb8, 0xcd, 0xff, 0xe5, 0x6f, 0xee, 0xf8, 0xb2, 0xec,\n+0x2f, 0x4e, 0x0e, 0xf9, 0x25, 0xb0, 0x8e, 0x3c, 0x6b, 0xc3, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x00, 0x20,\n+0x23, 0x41, 0x35, 0x04, 0x90, 0xc2, 0x40, 0x62, 0x60, 0xef, 0xe2, 0x35, 0x4c, 0xd7, 0x3f, 0xac,\n+0xe2, 0x34, 0x90, 0xb8, 0xa1, 0x6f, 0x76, 0xfa, 0x16, 0x16, 0xa4, 0x48, 0x37, 0x2c, 0xe9, 0x90,\n+0xc2, 0xf2, 0x3c, 0xf8, 0x0a, 0x9f, 0xd8, 0x81, 0xe5, 0xbb, 0x5b, 0xda, 0x25, 0x2c, 0xa4, 0xa7,\n+0x55, 0x71, 0x24, 0x32, 0xf6, 0xc8, 0x0b, 0xf2, 0xbc, 0x6a, 0xf8, 0x93, 0xac, 0xb2, 0x07, 0xc2,\n+0x5f, 0x9f, 0xdb, 0xcc, 0xc8, 0x8a, 0xaa, 0xbe, 0x6a, 0x6f, 0xe1, 0x49, 0x10, 0xcc, 0x31, 0xd7,\n+0x80, 0xbb, 0xbb, 0xc8, 0xd8, 0xa2, 0x0e, 0x64, 0x57, 0xea, 0xa2, 0xf5, 0xc2, 0xa9, 0x31, 0x15,\n+0xd2, 0x20, 0x6a, 0xec, 0xfc, 0x22, 0x01, 0x28, 0xcf, 0x86, 0xb8, 0x80, 0x1e, 0xa9, 0xcc, 0x11,\n+0xa5, 0x3c, 0xf2, 0x16, 0xb3, 0x47, 0x9d, 0xfc, 0xd2, 0x80, 0x21, 0xc4, 0xcb, 0xd0, 0x47, 0x70,\n+0x41, 0xa1, 0xca, 0x83, 0x19, 0x08, 0x2c, 0x6d, 0xf2, 0x5d, 0x77, 0x9c, 0x8a, 0x14, 0x13, 0xd4,\n+0x36, 0x1c, 0x92, 0xf0, 0xe5, 0x06, 0x37, 0xdc, 0xa6, 0xe6, 0x90, 0x9b, 0x38, 0x8f, 0x5c, 0x6b,\n+0x1b, 0x46, 0x86, 0x43, 0x42, 0x5f, 0x3e, 0x01, 0x07, 0x53, 0x54, 0x5d, 0x65, 0x7d, 0xf7, 0x8a,\n+0x73, 0xa1, 0x9a, 0x54, 0x5a, 0x1f, 0x29, 0x43, 0x14, 0x27, 0xc2, 0x85, 0x0f, 0xb5, 0x88, 0x7b,\n+0x1a, 0x3b, 0x94, 0xb7, 0x1d, 0x60, 0xa7, 0xb5, 0x9c, 0xe7, 0x29, 0x69, 0x57, 0x5a, 0x9b, 0x93,\n+0x7a, 0x43, 0x30, 0x1b, 0x03, 0xd7, 0x62, 0xc8, 0x40, 0xa6, 0xaa, 0xfc, 0x64, 0xe4, 0x4a, 0xd7,\n+0x91, 0x53, 0x01, 0xa8, 0x20, 0x88, 0x6e, 0x9c, 0x5f, 0x44, 0xb9, 0xcb, 0x60, 0x81, 0x34, 0xec,\n+0x6f, 0xd3, 0x7d, 0xda, 0x48, 0x5f, 0xeb, 0xb4, 0x90, 0xbc, 0x2d, 0xa9, 0x1c, 0x0b, 0xac, 0x1c,\n+0xd5, 0xa2, 0x68, 0x20, 0x80, 0x04, 0xd6, 0xfc, 0xb1, 0x8f, 0x2f, 0xbb, 0x4a, 0x31, 0x0d, 0x4a,\n+0x86, 0x1c, 0xeb, 0xe2, 0x36, 0x29, 0x26, 0xf5, 0xda, 0xd8, 0xc4, 0xf2, 0x75, 0x61, 0xcf, 0x7e,\n+0xae, 0x76, 0x63, 0x4a, 0x7a, 0x40, 0x65, 0x93, 0x87, 0xf8, 0x1e, 0x80, 0x8c, 0x86, 0xe5, 0x86,\n+0xd6, 0x8f, 0x0e, 0xfc, 0x53, 0x2c, 0x60, 0xe8, 0x16, 0x61, 0x1a, 0xa2, 0x3e, 0x43, 0x7b, 0xcd,\n+0x39, 0x60, 0x54, 0x6a, 0xf5, 0xf2, 0x89, 0x26, 0x01, 0x68, 0x83, 0x48, 0xa2, 0x33, 0xe8, 0xc9,\n+0x04, 0x91, 0xb2, 0x11, 0x34, 0x11, 0x3e, 0xea, 0xd0, 0x43, 0x19, 0x1f, 0x03, 0x93, 0x90, 0x0c,\n+0xff, 0x51, 0x3d, 0x57, 0xf4, 0x41, 0x6e, 0xe1, 0xcb, 0xa0, 0xbe, 0xeb, 0xc9, 0x63, 0xcd, 0x6d,\n+0xcc, 0xe4, 0xf8, 0x36, 0xaa, 0x68, 0x9d, 0xed, 0xbd, 0x5d, 0x97, 0x70, 0x44, 0x0d, 0xb6, 0x0e,\n+0x35, 0xdc, 0xe1, 0x0c, 0x5d, 0xbb, 0xa0, 0x51, 0x94, 0xcb, 0x7e, 0x16, 0xeb, 0x11, 0x2f, 0xa3,\n+0x92, 0x45, 0xc8, 0x4c, 0x71, 0xd9, 0xbc, 0xc9, 0x99, 0x52, 0x57, 0x46, 0x2f, 0x50, 0xcf, 0xbd,\n+0x35, 0x69, 0xf4, 0x3d, 0x15, 0xce, 0x06, 0xa5, 0x2c, 0x0f, 0x3e, 0xf6, 0x81, 0xba, 0x94, 0xbb,\n+0xc3, 0xbb, 0xbf, 0x65, 0x78, 0xd2, 0x86, 0x79, 0xff, 0x49, 0x3b, 0x1a, 0x83, 0x0c, 0xf0, 0xde,\n+0x78, 0xec, 0xc8, 0xf2, 0x4d, 0x4c, 0x1a, 0xde, 0x82, 0x29, 0xf8, 0xc1, 0x5a, 0xda, 0xed, 0xee,\n+0xe6, 0x27, 0x5e, 0xe8, 0x45, 0xd0, 0x9d, 0x1c, 0x51, 0xa8, 0x68, 0xab, 0x44, 0xe3, 0xd0, 0x8b,\n+0x6a, 0xe3, 0xf8, 0x3b, 0xbb, 0xdc, 0x4d, 0xd7, 0x64, 0xf2, 0x51, 0xbe, 0xe6, 0xaa, 0xab, 0x5a,\n+0xe9, 0x31, 0xee, 0x06, 0xbc, 0x73, 0xbf, 0x13, 0x62, 0x0a, 0x9f, 0xc7, 0xb9, 0x97, 0x30, 0x82,\n+0x05, 0x69, 0x30, 0x82, 0x03, 0x51, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0x92, 0xb8,\n+0x88, 0xdb, 0xb0, 0x8a, 0xc1, 0x63, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x52, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x53, 0x4b, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x42,\n+0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x0a, 0x44, 0x69, 0x73, 0x69, 0x67, 0x20, 0x61, 0x2e, 0x73, 0x2e, 0x31, 0x19,\n+0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x43, 0x41, 0x20, 0x44, 0x69, 0x73, 0x69,\n+0x67, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30,\n+0x37, 0x31, 0x39, 0x30, 0x39, 0x31, 0x35, 0x33, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x37,\n+0x31, 0x39, 0x30, 0x39, 0x31, 0x35, 0x33, 0x30, 0x5a, 0x30, 0x52, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x4b, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,\n+0x07, 0x13, 0x0a, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x31, 0x13, 0x30,\n+0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x44, 0x69, 0x73, 0x69, 0x67, 0x20, 0x61, 0x2e,\n+0x73, 0x2e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x43, 0x41, 0x20,\n+0x44, 0x69, 0x73, 0x69, 0x67, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x32, 0x30, 0x82, 0x02,\n+0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,\n+0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa2, 0xa3,\n+0xc4, 0x00, 0x09, 0xd6, 0x85, 0x5d, 0x2d, 0x6d, 0x14, 0xf6, 0xc2, 0xc3, 0x73, 0x9e, 0x35, 0xc2,\n+0x71, 0x55, 0x7e, 0x81, 0xfb, 0xab, 0x46, 0x50, 0xe0, 0xc1, 0x7c, 0x49, 0x78, 0xe6, 0xab, 0x79,\n+0x58, 0x3c, 0xda, 0xff, 0x7c, 0x1c, 0x9f, 0xd8, 0x97, 0x02, 0x78, 0x3e, 0x6b, 0x41, 0x04, 0xe9,\n+0x41, 0xbd, 0xbe, 0x03, 0x2c, 0x45, 0xf6, 0x2f, 0x64, 0xd4, 0xab, 0x5d, 0xa3, 0x47, 0x3d, 0x64,\n+0x9b, 0xe9, 0x68, 0x9a, 0xc6, 0xcc, 0x1b, 0x3f, 0xba, 0xbe, 0xb2, 0x8b, 0x34, 0x02, 0x2e, 0x98,\n+0x55, 0x19, 0xfc, 0x8c, 0x6f, 0xaa, 0x5f, 0xda, 0x4c, 0xce, 0x4d, 0x03, 0x21, 0xa3, 0xd8, 0xd2,\n+0x34, 0x93, 0x56, 0x96, 0xcb, 0x4c, 0x0c, 0x00, 0x16, 0x3c, 0x5f, 0x1a, 0xcd, 0xc8, 0xc7, 0x6c,\n+0xa6, 0xad, 0xd3, 0x31, 0xa7, 0xbc, 0xe8, 0xe5, 0xe1, 0x66, 0xd6, 0xd2, 0xfb, 0x03, 0xb4, 0x41,\n+0x65, 0xc9, 0x10, 0xae, 0x0e, 0x05, 0x63, 0xc6, 0x80, 0x6a, 0x69, 0x30, 0xfd, 0xd2, 0xee, 0x90,\n+0xef, 0x0d, 0x27, 0xdf, 0x9f, 0x95, 0x73, 0xf4, 0xe1, 0x25, 0xda, 0x6c, 0x16, 0xde, 0x41, 0x38,\n+0x34, 0xea, 0x8b, 0xfc, 0xd1, 0xe8, 0x04, 0x14, 0x61, 0x2d, 0x41, 0x7e, 0xac, 0xc7, 0x77, 0x4e,\n+0xcb, 0x51, 0x54, 0xfb, 0x5e, 0x92, 0x18, 0x1b, 0x04, 0x5a, 0x68, 0xc6, 0xc9, 0xc4, 0xfa, 0xb7,\n+0x13, 0xa0, 0x98, 0xb7, 0x11, 0x2b, 0xb7, 0xd6, 0x57, 0xcc, 0x7c, 0x9e, 0x17, 0xd1, 0xcb, 0x25,\n+0xfe, 0x86, 0x4e, 0x24, 0x2e, 0x56, 0x0c, 0x78, 0x4d, 0x9e, 0x01, 0x12, 0xa6, 0x2b, 0xa7, 0x01,\n+0x65, 0x6e, 0x7c, 0x62, 0x1d, 0x84, 0x84, 0xdf, 0xea, 0xc0, 0x6b, 0xb5, 0xa5, 0x2a, 0x95, 0x83,\n+0xc3, 0x53, 0x11, 0x0c, 0x73, 0x1d, 0x0b, 0xb2, 0x46, 0x90, 0xd1, 0x42, 0x3a, 0xce, 0x40, 0x6e,\n+0x95, 0xad, 0xff, 0xc6, 0x94, 0xad, 0x6e, 0x97, 0x84, 0x8e, 0x7d, 0x6f, 0x9e, 0x8a, 0x80, 0x0d,\n+0x49, 0x6d, 0x73, 0xe2, 0x7b, 0x92, 0x1e, 0xc3, 0xf3, 0xc1, 0xf3, 0xeb, 0x2e, 0x05, 0x6f, 0xd9,\n+0x1b, 0xcf, 0x37, 0x76, 0x04, 0xc8, 0xb4, 0x5a, 0xe4, 0x17, 0xa7, 0xcb, 0xdd, 0x76, 0x1f, 0xd0,\n+0x19, 0x76, 0xe8, 0x2c, 0x05, 0xb3, 0xd6, 0x9c, 0x34, 0xd8, 0x96, 0xdc, 0x61, 0x87, 0x91, 0x05,\n+0xe4, 0x44, 0x08, 0x33, 0xc1, 0xda, 0xb9, 0x08, 0x65, 0xd4, 0xae, 0xb2, 0x36, 0x0d, 0xeb, 0xba,\n+0x38, 0xba, 0x0c, 0xe5, 0x9b, 0x9e, 0xeb, 0x8d, 0x66, 0xdd, 0x99, 0xcf, 0xd6, 0x89, 0x41, 0xf6,\n+0x04, 0x92, 0x8a, 0x29, 0x29, 0x6d, 0x6b, 0x3a, 0x1c, 0xe7, 0x75, 0x7d, 0x02, 0x71, 0x0e, 0xf3,\n+0xc0, 0xe7, 0xbd, 0xcb, 0x19, 0xdd, 0x9d, 0x60, 0xb2, 0xc2, 0x66, 0x60, 0xb6, 0xb1, 0x04, 0xee,\n+0xc9, 0xe6, 0x86, 0xb9, 0x9a, 0x66, 0x40, 0xa8, 0xe7, 0x11, 0xed, 0x81, 0x45, 0x03, 0x8b, 0xf6,\n+0x67, 0x59, 0xe8, 0xc1, 0x06, 0x11, 0xbd, 0xdd, 0xcf, 0x80, 0x02, 0x4f, 0x65, 0x40, 0x78, 0x5c,\n+0x47, 0x50, 0xc8, 0x9b, 0xe6, 0x1f, 0x81, 0x7b, 0xe4, 0x44, 0xa8, 0x5b, 0x85, 0x9a, 0xe2, 0xde,\n+0x5a, 0xd5, 0xc7, 0xf9, 0x3a, 0x44, 0x66, 0x4b, 0xe4, 0x32, 0x54, 0x7c, 0xe4, 0x6c, 0x9c, 0xb3,\n+0x0e, 0x3d, 0x17, 0xa2, 0xb2, 0x34, 0x12, 0xd6, 0x7e, 0xb2, 0xa8, 0x49, 0xbb, 0xd1, 0x7a, 0x28,\n+0x40, 0xbe, 0xa2, 0x16, 0x1f, 0xdf, 0xe4, 0x37, 0x1f, 0x11, 0x73, 0xfb, 0x90, 0x0a, 0x65, 0x43,\n+0xa2, 0x0d, 0x7c, 0xf8, 0x06, 0x01, 0x55, 0x33, 0x7d, 0xb0, 0x0d, 0xb8, 0xf4, 0xf5, 0xae, 0xa5,\n+0x42, 0x57, 0x7c, 0x36, 0x11, 0x8c, 0x7b, 0x5e, 0xc4, 0x03, 0x9d, 0x8c, 0x79, 0x9d, 0x02, 0x03,\n+0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n+0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n+0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0xb5, 0x99, 0xf8, 0xaf, 0xb0, 0x94, 0xf5, 0xe3, 0x20, 0xd6, 0x0a, 0xad, 0xce,\n+0x4e, 0x56, 0xa4, 0x2e, 0x6e, 0x42, 0xed, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x26, 0x06, 0x5e, 0x70, 0xe7,\n+0x65, 0x33, 0xc8, 0x82, 0x6e, 0xd9, 0x9c, 0x17, 0x3a, 0x1b, 0x7a, 0x66, 0xb2, 0x01, 0xf6, 0x78,\n+0x3b, 0x69, 0x5e, 0x2f, 0xea, 0xff, 0x4e, 0xf9, 0x28, 0xc3, 0x98, 0x2a, 0x61, 0x4c, 0xb4, 0x24,\n+0x12, 0x8a, 0x7d, 0x6d, 0x11, 0x14, 0xf7, 0x9c, 0xb5, 0xca, 0xe6, 0xbc, 0x9e, 0x27, 0x8e, 0x4c,\n+0x19, 0xc8, 0xa9, 0xbd, 0x7a, 0xc0, 0xd7, 0x36, 0x0e, 0x6d, 0x85, 0x72, 0x6e, 0xa8, 0xc6, 0xa2,\n+0x6d, 0xf6, 0xfa, 0x73, 0x63, 0x7f, 0xbc, 0x6e, 0x79, 0x08, 0x1c, 0x9d, 0x8a, 0x9f, 0x1a, 0x8a,\n+0x53, 0xa6, 0xd8, 0xbb, 0xd9, 0x35, 0x55, 0xb1, 0x11, 0xc5, 0xa9, 0x03, 0xb3, 0x56, 0x3b, 0xb9,\n+0x84, 0x93, 0x22, 0x5e, 0x7e, 0xc1, 0xf6, 0x12, 0x52, 0x8b, 0xea, 0x2c, 0x67, 0xbc, 0xfe, 0x36,\n+0x4c, 0xf5, 0xb8, 0xcf, 0xd1, 0xb3, 0x49, 0x92, 0x3b, 0xd3, 0x29, 0x0e, 0x99, 0x1b, 0x96, 0xf7,\n+0x61, 0xb8, 0x3b, 0xc4, 0x2b, 0xb6, 0x78, 0x6c, 0xb4, 0x23, 0x6f, 0xf0, 0xfd, 0xd3, 0xb2, 0x5e,\n+0x75, 0x1f, 0x99, 0x95, 0xa8, 0xac, 0xf6, 0xda, 0xe1, 0xc5, 0x31, 0x7b, 0xfb, 0xd1, 0x46, 0xb3,\n+0xd2, 0xbc, 0x67, 0xb4, 0x62, 0x54, 0xba, 0x09, 0xf7, 0x63, 0xb0, 0x93, 0xa2, 0x9a, 0xf9, 0xe9,\n+0x52, 0x2e, 0x8b, 0x60, 0x12, 0xab, 0xfc, 0xf5, 0x60, 0x56, 0xef, 0x10, 0x5c, 0x8b, 0xc4, 0x1a,\n+0x42, 0xdc, 0x83, 0x5b, 0x64, 0x0e, 0xcb, 0xb5, 0xbc, 0xd6, 0x4f, 0xc1, 0x7c, 0x3c, 0x6e, 0x8d,\n+0x13, 0x6d, 0xfb, 0x7b, 0xeb, 0x30, 0xd0, 0xdc, 0x4d, 0xaf, 0xc5, 0xd5, 0xb6, 0xa5, 0x4c, 0x5b,\n+0x71, 0xc9, 0xe8, 0x31, 0xbe, 0xe8, 0x38, 0x06, 0x48, 0xa1, 0x1a, 0xe2, 0xea, 0xd2, 0xde, 0x12,\n+0x39, 0x58, 0x1a, 0xff, 0x80, 0x0e, 0x82, 0x75, 0xe6, 0xb7, 0xc9, 0x07, 0x6c, 0x0e, 0xef, 0xff,\n+0x38, 0xf1, 0x98, 0x71, 0xc4, 0xb7, 0x7f, 0x0e, 0x15, 0xd0, 0x25, 0x69, 0xbd, 0x22, 0x9d, 0x2b,\n+0xed, 0x05, 0xf6, 0x46, 0x47, 0xac, 0xed, 0xc0, 0xf0, 0xd4, 0x3b, 0xe2, 0xec, 0xee, 0x96, 0x5b,\n+0x90, 0x13, 0x4e, 0x1e, 0x56, 0x3a, 0xeb, 0xb0, 0xef, 0x96, 0xbb, 0x96, 0x23, 0x11, 0xba, 0xf2,\n+0x43, 0x86, 0x74, 0x64, 0x95, 0xc8, 0x28, 0x75, 0xdf, 0x1d, 0x35, 0xba, 0xd2, 0x37, 0x83, 0x38,\n+0x53, 0x38, 0x36, 0x3b, 0xcf, 0x6c, 0xe9, 0xf9, 0x6b, 0x0e, 0xd0, 0xfb, 0x04, 0xe8, 0x4f, 0x77,\n+0xd7, 0x65, 0x01, 0x78, 0x86, 0x0c, 0x7a, 0x3e, 0x21, 0x62, 0xf1, 0x7f, 0x63, 0x71, 0x0c, 0xc9,\n+0x9f, 0x44, 0xdb, 0xa8, 0x27, 0xa2, 0x75, 0xbe, 0x6e, 0x81, 0x3e, 0xd7, 0xc0, 0xeb, 0x1b, 0x98,\n+0x0f, 0x70, 0x5c, 0x34, 0xb2, 0x8a, 0xcc, 0xc0, 0x85, 0x18, 0xeb, 0x6e, 0x7a, 0xb3, 0xf7, 0x5a,\n+0xa1, 0x07, 0xbf, 0xa9, 0x42, 0x92, 0xf3, 0x60, 0x22, 0x97, 0xe4, 0x14, 0xa1, 0x07, 0x9b, 0x4e,\n+0x76, 0xc0, 0x8e, 0x7d, 0xfd, 0xa4, 0x25, 0xc7, 0x47, 0xed, 0xff, 0x1f, 0x73, 0xac, 0xcc, 0xc3,\n+0xa5, 0xe9, 0x6f, 0x0a, 0x8e, 0x9b, 0x65, 0xc2, 0x50, 0x85, 0xb5, 0xa3, 0xa0, 0x53, 0x12, 0xcc,\n+0x55, 0x87, 0x61, 0xf3, 0x81, 0xae, 0x10, 0x46, 0x61, 0xbd, 0x44, 0x21, 0xb8, 0xc2, 0x3d, 0x74,\n+0xcf, 0x7e, 0x24, 0x35, 0xfa, 0x1c, 0x07, 0x0e, 0x9b, 0x3d, 0x22, 0xca, 0xef, 0x31, 0x2f, 0x8c,\n+0xac, 0x12, 0xbd, 0xef, 0x40, 0x28, 0xfc, 0x29, 0x67, 0x9f, 0xb2, 0x13, 0x4f, 0x66, 0x24, 0xc4,\n+0x53, 0x19, 0xe9, 0x1e, 0x29, 0x15, 0xef, 0xe6, 0x6d, 0xb0, 0x7f, 0x2d, 0x67, 0xfd, 0xf3, 0x6c,\n+0x1b, 0x75, 0x46, 0xa3, 0xe5, 0x4a, 0x17, 0xe9, 0xa4, 0xd7, 0x0b, 0x30, 0x82, 0x03, 0xa8, 0x30,\n+0x82, 0x02, 0x90, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xfe, 0xdc, 0xe3, 0x01, 0x0f,\n+0xc9, 0x48, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,\n+0x05, 0x00, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46,\n+0x52, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d,\n+0x79, 0x6f, 0x74, 0x69, 0x73, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08,\n+0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x30, 0x36,\n+0x32, 0x39, 0x31, 0x35, 0x31, 0x33, 0x30, 0x35, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x36, 0x32,\n+0x39, 0x31, 0x35, 0x31, 0x33, 0x30, 0x35, 0x5a, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73, 0x31, 0x11, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x30, 0x82,\n+0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc8,\n+0x68, 0xf1, 0xc9, 0xd6, 0xd6, 0xb3, 0x34, 0x75, 0x26, 0x82, 0x1e, 0xec, 0xb4, 0xbe, 0xea, 0x5c,\n+0xe1, 0x26, 0xed, 0x11, 0x47, 0x61, 0xe1, 0xa2, 0x7c, 0x16, 0x78, 0x40, 0x21, 0xe4, 0x60, 0x9e,\n+0x5a, 0xc8, 0x63, 0xe1, 0xc4, 0xb1, 0x96, 0x92, 0xff, 0x18, 0x6d, 0x69, 0x23, 0xe1, 0x2b, 0x62,\n+0xf7, 0xdd, 0xe2, 0x36, 0x2f, 0x91, 0x07, 0xb9, 0x48, 0xcf, 0x0e, 0xec, 0x79, 0xb6, 0x2c, 0xe7,\n+0x34, 0x4b, 0x70, 0x08, 0x25, 0xa3, 0x3c, 0x87, 0x1b, 0x19, 0xf2, 0x81, 0x07, 0x0f, 0x38, 0x90,\n+0x19, 0xd3, 0x11, 0xfe, 0x86, 0xb4, 0xf2, 0xd1, 0x5e, 0x1e, 0x1e, 0x96, 0xcd, 0x80, 0x6c, 0xce,\n+0x3b, 0x31, 0x93, 0xb6, 0xf2, 0xa0, 0xd0, 0xa9, 0x95, 0x12, 0x7d, 0xa5, 0x9a, 0xcc, 0x6b, 0xc8,\n+0x84, 0x56, 0x8a, 0x33, 0xa9, 0xe7, 0x22, 0x15, 0x53, 0x16, 0xf0, 0xcc, 0x17, 0xec, 0x57, 0x5f,\n+0xe9, 0xa2, 0x0a, 0x98, 0x09, 0xde, 0xe3, 0x5f, 0x9c, 0x6f, 0xdc, 0x48, 0xe3, 0x85, 0x0b, 0x15,\n+0x5a, 0xa6, 0xba, 0x9f, 0xac, 0x48, 0xe3, 0x09, 0xb2, 0xf7, 0xf4, 0x32, 0xde, 0x5e, 0x34, 0xbe,\n+0x1c, 0x78, 0x5d, 0x42, 0x5b, 0xce, 0x0e, 0x22, 0x8f, 0x4d, 0x90, 0xd7, 0x7d, 0x32, 0x18, 0xb3,\n+0x0b, 0x2c, 0x6a, 0xbf, 0x8e, 0x3f, 0x14, 0x11, 0x89, 0x20, 0x0e, 0x77, 0x14, 0xb5, 0x3d, 0x94,\n+0x08, 0x87, 0xf7, 0x25, 0x1e, 0xd5, 0xb2, 0x60, 0x00, 0xec, 0x6f, 0x2a, 0x28, 0x25, 0x6e, 0x2a,\n+0x3e, 0x18, 0x63, 0x17, 0x25, 0x3f, 0x3e, 0x44, 0x20, 0x16, 0xf6, 0x26, 0xc8, 0x25, 0xae, 0x05,\n+0x4a, 0xb4, 0xe7, 0x63, 0x2c, 0xf3, 0x8c, 0x16, 0x53, 0x7e, 0x5c, 0xfb, 0x11, 0x1a, 0x08, 0xc1,\n+0x46, 0x62, 0x9f, 0x22, 0xb8, 0xf1, 0xc2, 0x8d, 0x69, 0xdc, 0xfa, 0x3a, 0x58, 0x06, 0xdf, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xbc, 0x30, 0x81, 0xb9, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,\n+0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1a, 0xed, 0xfe, 0x41, 0x39, 0x90, 0xb4, 0x24, 0x59, 0xbe,\n+0x01, 0xf2, 0x52, 0xd5, 0x45, 0xf6, 0x5a, 0x39, 0xdc, 0x11, 0x30, 0x64, 0x06, 0x03, 0x55, 0x1d,\n+0x23, 0x04, 0x5d, 0x30, 0x5b, 0x80, 0x14, 0x1a, 0xed, 0xfe, 0x41, 0x39, 0x90, 0xb4, 0x24, 0x59,\n+0xbe, 0x01, 0xf2, 0x52, 0xd5, 0x45, 0xf6, 0x5a, 0x39, 0xdc, 0x11, 0xa1, 0x38, 0xa4, 0x36, 0x30,\n+0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x12,\n+0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74,\n+0x69, 0x73, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x67, 0x6e, 0x61, 0x82, 0x09, 0x00, 0xfe, 0xdc, 0xe3, 0x01, 0x0f, 0xc9, 0x48, 0xff,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03,\n+0x02, 0x00, 0x07, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,\n+0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x85, 0x03, 0x1e, 0x92, 0x71, 0xf6, 0x42, 0xaf, 0xe1,\n+0xa3, 0x61, 0x9e, 0xeb, 0xf3, 0xc0, 0x0f, 0xf2, 0xa5, 0xd4, 0xda, 0x95, 0xe6, 0xd6, 0xbe, 0x68,\n+0x36, 0x3d, 0x7e, 0x6e, 0x1f, 0x4c, 0x8a, 0xef, 0xd1, 0x0f, 0x21, 0x6d, 0x5e, 0xa5, 0x52, 0x63,\n+0xce, 0x12, 0xf8, 0xef, 0x2a, 0xda, 0x6f, 0xeb, 0x37, 0xfe, 0x13, 0x02, 0xc7, 0xcb, 0x3b, 0x3e,\n+0x22, 0x6b, 0xda, 0x61, 0x2e, 0x7f, 0xd4, 0x72, 0x3d, 0xdd, 0x30, 0xe1, 0x1e, 0x4c, 0x40, 0x19,\n+0x8c, 0x0f, 0xd7, 0x9c, 0xd1, 0x83, 0x30, 0x7b, 0x98, 0x59, 0xdc, 0x7d, 0xc6, 0xb9, 0x0c, 0x29,\n+0x4c, 0xa1, 0x33, 0xa2, 0xeb, 0x67, 0x3a, 0x65, 0x84, 0xd3, 0x96, 0xe2, 0xed, 0x76, 0x45, 0x70,\n+0x8f, 0xb5, 0x2b, 0xde, 0xf9, 0x23, 0xd6, 0x49, 0x6e, 0x3c, 0x14, 0xb5, 0xc6, 0x9f, 0x35, 0x1e,\n+0x50, 0xd0, 0xc1, 0x8f, 0x6a, 0x70, 0x44, 0x02, 0x62, 0xcb, 0xae, 0x1d, 0x68, 0x41, 0xa7, 0xaa,\n+0x57, 0xe8, 0x53, 0xaa, 0x07, 0xd2, 0x06, 0xf6, 0xd5, 0x14, 0x06, 0x0b, 0x91, 0x03, 0x75, 0x2c,\n+0x6c, 0x72, 0xb5, 0x61, 0x95, 0x9a, 0x0d, 0x8b, 0xb9, 0x0d, 0xe7, 0xf5, 0xdf, 0x54, 0xcd, 0xde,\n+0xe6, 0xd8, 0xd6, 0x09, 0x08, 0x97, 0x63, 0xe5, 0xc1, 0x2e, 0xb0, 0xb7, 0x44, 0x26, 0xc0, 0x26,\n+0xc0, 0xaf, 0x55, 0x30, 0x9e, 0x3b, 0xd5, 0x36, 0x2a, 0x19, 0x04, 0xf4, 0x5c, 0x1e, 0xff, 0xcf,\n+0x2c, 0xb7, 0xff, 0xd0, 0xfd, 0x87, 0x40, 0x11, 0xd5, 0x11, 0x23, 0xbb, 0x48, 0xc0, 0x21, 0xa9,\n+0xa4, 0x28, 0x2d, 0xfd, 0x15, 0xf8, 0xb0, 0x4e, 0x2b, 0xf4, 0x30, 0x5b, 0x21, 0xfc, 0x11, 0x91,\n+0x34, 0xbe, 0x41, 0xef, 0x7b, 0x9d, 0x97, 0x75, 0xff, 0x97, 0x95, 0xc0, 0x96, 0x58, 0x2f, 0xea,\n+0xbb, 0x46, 0xd7, 0xbb, 0xe4, 0xd9, 0x2e, 0x30, 0x82, 0x05, 0x38, 0x30, 0x82, 0x03, 0x20, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0x95, 0xbe, 0x16, 0xa0, 0xf7, 0x2e, 0x46, 0xf1, 0x7b,\n+0x39, 0x82, 0x72, 0xfa, 0x8b, 0xcd, 0x96, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x37, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x0c, 0x0b, 0x54, 0x65, 0x6c, 0x69, 0x61, 0x53, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x31, 0x1f,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x54, 0x65, 0x6c, 0x69, 0x61, 0x53, 0x6f,\n+0x6e, 0x65, 0x72, 0x61, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x76, 0x31, 0x30,\n+0x1e, 0x17, 0x0d, 0x30, 0x37, 0x31, 0x30, 0x31, 0x38, 0x31, 0x32, 0x30, 0x30, 0x35, 0x30, 0x5a,\n+0x17, 0x0d, 0x33, 0x32, 0x31, 0x30, 0x31, 0x38, 0x31, 0x32, 0x30, 0x30, 0x35, 0x30, 0x5a, 0x30,\n+0x37, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x54, 0x65, 0x6c, 0x69,\n+0x61, 0x53, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x0c, 0x16, 0x54, 0x65, 0x6c, 0x69, 0x61, 0x53, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x76, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00,\n+0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc2, 0xbe, 0xeb, 0x27, 0xf0, 0x21, 0xa3,\n+0xf3, 0x69, 0x26, 0x55, 0x7e, 0x9d, 0xc5, 0x55, 0x16, 0x91, 0x5c, 0xfd, 0xef, 0x21, 0xbf, 0x53,\n+0x80, 0x7a, 0x2d, 0xd2, 0x91, 0x8c, 0x63, 0x31, 0xf0, 0xec, 0x24, 0xf0, 0xc3, 0xa5, 0xd2, 0x72,\n+0x7c, 0x10, 0x6d, 0xf4, 0x37, 0xb7, 0xe5, 0xe6, 0x7c, 0x79, 0xea, 0x8c, 0xb5, 0x82, 0x8b, 0xae,\n+0x48, 0xb6, 0xac, 0x00, 0xdc, 0x65, 0x75, 0xec, 0x2a, 0x4d, 0x5f, 0xc1, 0x87, 0xf5, 0x20, 0x65,\n+0x2b, 0x81, 0xa8, 0x47, 0x3e, 0x89, 0x23, 0x95, 0x30, 0x16, 0x90, 0x7f, 0xe8, 0x57, 0x07, 0x48,\n+0xe7, 0x19, 0xae, 0xbf, 0x45, 0x67, 0xb1, 0x37, 0x1b, 0x06, 0x2a, 0xfe, 0xde, 0xf9, 0xac, 0x7d,\n+0x83, 0xfb, 0x5e, 0xba, 0xe4, 0x8f, 0x97, 0x67, 0xbe, 0x4b, 0x8e, 0x8d, 0x64, 0x07, 0x57, 0x38,\n+0x55, 0x69, 0x34, 0x36, 0x3d, 0x13, 0x48, 0xef, 0x4f, 0xe2, 0xd3, 0x66, 0x1e, 0xa4, 0xcf, 0x1a,\n+0xb7, 0x5e, 0x36, 0x33, 0xd4, 0xb4, 0x06, 0xbd, 0x18, 0x01, 0xfd, 0x77, 0x84, 0x50, 0x00, 0x45,\n+0xf5, 0x8c, 0x5d, 0xe8, 0x23, 0xbc, 0x7e, 0xfe, 0x35, 0xe1, 0xed, 0x50, 0x7b, 0xa9, 0x30, 0x8d,\n+0x19, 0xd3, 0x09, 0x8e, 0x68, 0x67, 0x5d, 0xbf, 0x3c, 0x97, 0x18, 0x53, 0xbb, 0x29, 0x62, 0xc5,\n+0xca, 0x5e, 0x72, 0xc1, 0xc7, 0x96, 0xd4, 0xdb, 0x2d, 0xa0, 0xb4, 0x1f, 0x69, 0x03, 0xec, 0xea,\n+0xe2, 0x50, 0xf1, 0x0c, 0x3c, 0xf0, 0xac, 0xf3, 0x53, 0x2d, 0xf0, 0x1c, 0xf5, 0xed, 0x6c, 0x39,\n+0x39, 0x73, 0x80, 0x16, 0xc8, 0x52, 0xb0, 0x23, 0xcd, 0xe0, 0x3e, 0xdc, 0xdd, 0x3c, 0x47, 0xa0,\n+0xbb, 0x35, 0x8a, 0xe2, 0x98, 0x68, 0x8b, 0xbe, 0xe5, 0xbf, 0x72, 0xee, 0xd2, 0xfa, 0xa5, 0xed,\n+0x12, 0xed, 0xfc, 0x98, 0x18, 0xa9, 0x26, 0x76, 0xdc, 0x28, 0x4b, 0x10, 0x20, 0x1c, 0xd3, 0x7f,\n+0x16, 0x77, 0x2d, 0xed, 0x6f, 0x80, 0xf7, 0x49, 0xbb, 0x53, 0x05, 0xbb, 0x5d, 0x68, 0xc7, 0xd4,\n+0xc8, 0x75, 0x16, 0x3f, 0x89, 0x5a, 0x8b, 0xf7, 0x17, 0x47, 0xd4, 0x4c, 0xf1, 0xd2, 0x89, 0x79,\n+0x3e, 0x4d, 0x3d, 0x98, 0xa8, 0x61, 0xde, 0x3a, 0x1e, 0xd2, 0xf8, 0x5e, 0x03, 0xe0, 0xc1, 0xc9,\n+0x1c, 0x8c, 0xd3, 0x8d, 0x4d, 0xd3, 0x95, 0x36, 0xb3, 0x37, 0x5f, 0x63, 0x63, 0x9b, 0x33, 0x14,\n+0xf0, 0x2d, 0x26, 0x6b, 0x53, 0x7c, 0x89, 0x8c, 0x32, 0xc2, 0x6e, 0xec, 0x3d, 0x21, 0x00, 0x39,\n+0xc9, 0xa1, 0x68, 0xe2, 0x50, 0x83, 0x2e, 0xb0, 0x3a, 0x2b, 0xf3, 0x36, 0xa0, 0xac, 0x2f, 0xe4,\n+0x6f, 0x61, 0xc2, 0x51, 0x09, 0x39, 0x3e, 0x8b, 0x53, 0xb9, 0xbb, 0x67, 0xda, 0xdc, 0x53, 0xb9,\n+0x76, 0x59, 0x36, 0x9d, 0x43, 0xe5, 0x20, 0xe0, 0x3d, 0x32, 0x60, 0x85, 0x22, 0x51, 0xb7, 0xc7,\n+0x33, 0xbb, 0xdd, 0x15, 0x2f, 0xa4, 0x78, 0xa6, 0x07, 0x7b, 0x81, 0x46, 0x36, 0x04, 0x86, 0xdd,\n+0x79, 0x35, 0xc7, 0x95, 0x2c, 0x3b, 0xb0, 0xa3, 0x17, 0x35, 0xe5, 0x73, 0x1f, 0xb4, 0x5c, 0x59,\n+0xef, 0xda, 0xea, 0x10, 0x65, 0x7b, 0x7a, 0xd0, 0x7f, 0x9f, 0xb3, 0xb4, 0x2a, 0x37, 0x3b, 0x70,\n+0x8b, 0x9b, 0x5b, 0xb9, 0x2b, 0xb7, 0xec, 0xb2, 0x51, 0x12, 0x97, 0x53, 0x29, 0x5a, 0xd4, 0xf0,\n+0x12, 0x10, 0xdc, 0x4f, 0x02, 0xbb, 0x12, 0x92, 0x2f, 0x62, 0xd4, 0x3f, 0x69, 0x43, 0x7c, 0x0d,\n+0xd6, 0xfc, 0x58, 0x75, 0x01, 0x88, 0x9d, 0x58, 0x16, 0x4b, 0xde, 0xba, 0x90, 0xff, 0x47, 0x01,\n+0x89, 0x06, 0x6a, 0xf6, 0x5f, 0xb2, 0x90, 0x6a, 0xb3, 0x02, 0xa6, 0x02, 0x88, 0xbf, 0xb3, 0x47,\n+0x7e, 0x2a, 0xd9, 0xd5, 0xfa, 0x68, 0x78, 0x35, 0x4d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x3f,\n+0x30, 0x3d, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n+0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xf0, 0x8f, 0x59, 0x38, 0x00,\n+0xb3, 0xf5, 0x8f, 0x9a, 0x96, 0x0c, 0xd5, 0xeb, 0xfa, 0x7b, 0xaa, 0x17, 0xe8, 0x13, 0x12, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82,\n+0x02, 0x01, 0x00, 0xbe, 0xe4, 0x5c, 0x62, 0x4e, 0x24, 0xf4, 0x0c, 0x08, 0xff, 0xf0, 0xd3, 0x0c,\n+0x68, 0xe4, 0x93, 0x49, 0x22, 0x3f, 0x44, 0x27, 0x6f, 0xbb, 0x6d, 0xde, 0x83, 0x66, 0xce, 0xa8,\n+0xcc, 0x0d, 0xfc, 0xf5, 0x9a, 0x06, 0xe5, 0x77, 0x14, 0x91, 0xeb, 0x9d, 0x41, 0x7b, 0x99, 0x2a,\n+0x84, 0xe5, 0xff, 0xfc, 0x21, 0xc1, 0x5d, 0xf0, 0xe4, 0x1f, 0x57, 0xb7, 0x75, 0xa9, 0xa1, 0x5f,\n+0x02, 0x26, 0xff, 0xd7, 0xc7, 0xf7, 0x4e, 0xde, 0x4f, 0xf8, 0xf7, 0x1c, 0x46, 0xc0, 0x7a, 0x4f,\n+0x40, 0x2c, 0x22, 0x35, 0xf0, 0x19, 0xb1, 0xd0, 0x6b, 0x67, 0x2c, 0xb0, 0xa8, 0xe0, 0xc0, 0x40,\n+0x37, 0x35, 0xf6, 0x84, 0x5c, 0x5c, 0xe3, 0xaf, 0x42, 0x78, 0xfe, 0xa7, 0xc9, 0x0d, 0x50, 0xea,\n+0x0d, 0x84, 0x76, 0xf6, 0x51, 0xef, 0x83, 0x53, 0xc6, 0x7a, 0xff, 0x0e, 0x56, 0x49, 0x2e, 0x8f,\n+0x7a, 0xd6, 0x0c, 0xe6, 0x27, 0x54, 0xe3, 0x4d, 0x0a, 0x60, 0x72, 0x62, 0xcd, 0x91, 0x07, 0xd6,\n+0xa5, 0xbf, 0xc8, 0x99, 0x6b, 0xed, 0xc4, 0x19, 0xe6, 0xab, 0x4c, 0x11, 0x38, 0xc5, 0x6f, 0x31,\n+0xe2, 0x6e, 0x49, 0xc8, 0x3f, 0x76, 0x80, 0x26, 0x03, 0x26, 0x29, 0xe0, 0x36, 0xf6, 0xf6, 0x20,\n+0x53, 0xe3, 0x17, 0x70, 0x34, 0x17, 0x9d, 0x63, 0x68, 0x1e, 0x6b, 0xec, 0xc3, 0x4d, 0x86, 0xb8,\n+0x13, 0x30, 0x2f, 0x5d, 0x46, 0x0d, 0x47, 0x43, 0xd5, 0x1b, 0xaa, 0x59, 0x0e, 0xb9, 0x5c, 0x8d,\n+0x06, 0x48, 0xad, 0x74, 0x87, 0x5f, 0xc7, 0xfc, 0x31, 0x54, 0x41, 0x13, 0xe2, 0xc7, 0x21, 0x0e,\n+0x9e, 0xe0, 0x1e, 0x0d, 0xe1, 0xc0, 0x7b, 0x43, 0x85, 0x90, 0xc5, 0x8a, 0x58, 0xc6, 0x65, 0x0a,\n+0x78, 0x57, 0xf2, 0xc6, 0x23, 0x0f, 0x01, 0xd9, 0x20, 0x4b, 0xde, 0x0f, 0xfb, 0x92, 0x85, 0x75,\n+0x2a, 0x5c, 0x73, 0x8d, 0x6d, 0x7b, 0x25, 0x91, 0xca, 0xee, 0x45, 0xae, 0x06, 0x4b, 0x00, 0xcc,\n+0xd3, 0xb1, 0x59, 0x50, 0xda, 0x3a, 0x88, 0x3b, 0x29, 0x43, 0x46, 0x5e, 0x97, 0x2b, 0x54, 0xce,\n+0x53, 0x6f, 0x8d, 0x4a, 0xe7, 0x96, 0xfa, 0xbf, 0x71, 0x0e, 0x42, 0x8b, 0x7c, 0xfd, 0x28, 0xa0,\n+0xd0, 0x48, 0xca, 0xda, 0xc4, 0x81, 0x4c, 0xbb, 0xa2, 0x73, 0x93, 0x26, 0xc8, 0xeb, 0x0c, 0xd6,\n+0x26, 0x88, 0xb6, 0xc0, 0x24, 0xcf, 0xbb, 0xbd, 0x5b, 0xeb, 0x75, 0x7d, 0xe9, 0x08, 0x8e, 0x86,\n+0x33, 0x2c, 0x79, 0x77, 0x09, 0x69, 0xa5, 0x89, 0xfc, 0xb3, 0x70, 0x90, 0x87, 0x76, 0x8f, 0xd3,\n+0x22, 0xbb, 0x42, 0xce, 0xbd, 0x73, 0x0b, 0x20, 0x26, 0x2a, 0xd0, 0x9b, 0x3d, 0x70, 0x1e, 0x24,\n+0x6c, 0xcd, 0x87, 0x76, 0xa9, 0x17, 0x96, 0xb7, 0xcf, 0x0d, 0x92, 0xfb, 0x8e, 0x18, 0xa9, 0x98,\n+0x49, 0xd1, 0x9e, 0xfe, 0x60, 0x44, 0x72, 0x21, 0xb9, 0x19, 0xed, 0xc2, 0xf5, 0x31, 0xf1, 0x39,\n+0x48, 0x88, 0x90, 0x24, 0x75, 0x54, 0x16, 0xad, 0xce, 0xf4, 0xf8, 0x69, 0x14, 0x64, 0x39, 0xfb,\n+0xa3, 0xb8, 0xba, 0x70, 0x40, 0xc7, 0x27, 0x1c, 0xbf, 0xc4, 0x56, 0x53, 0xfa, 0x63, 0x65, 0xd0,\n+0xf3, 0x1c, 0x0e, 0x16, 0xf5, 0x6b, 0x86, 0x58, 0x4d, 0x18, 0xd4, 0xe4, 0x0d, 0x8e, 0xa5, 0x9d,\n+0x5b, 0x91, 0xdc, 0x76, 0x24, 0x50, 0x3f, 0xc6, 0x2a, 0xfb, 0xd9, 0xb7, 0x9c, 0xb5, 0xd6, 0xe6,\n+0xd0, 0xd9, 0xe8, 0x19, 0x8b, 0x15, 0x71, 0x48, 0xad, 0xb7, 0xea, 0xd8, 0x59, 0x88, 0xd4, 0x90,\n+0xbf, 0x16, 0xb3, 0xd9, 0xe9, 0xac, 0x59, 0x61, 0x54, 0xc8, 0x1c, 0xba, 0xca, 0xc1, 0xca, 0xe1,\n+0xb9, 0x20, 0x4c, 0x8f, 0x3a, 0x93, 0x89, 0xa5, 0xa0, 0xcc, 0xbf, 0xd3, 0xf6, 0x75, 0xa4, 0x75,\n+0x96, 0x6d, 0x56, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0, 0x03, 0x02, 0x01, 0x02,\n+0x02, 0x10, 0x0a, 0x01, 0x42, 0x80, 0x00, 0x00, 0x01, 0x45, 0x23, 0xc8, 0x44, 0xb5, 0x00, 0x00,\n+0x00, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n+0x00, 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53,\n+0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x49, 0x64, 0x65, 0x6e, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x49,\n+0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63,\n+0x69, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17,\n+0x0d, 0x31, 0x34, 0x30, 0x31, 0x31, 0x36, 0x31, 0x38, 0x31, 0x32, 0x32, 0x33, 0x5a, 0x17, 0x0d,\n+0x33, 0x34, 0x30, 0x31, 0x31, 0x36, 0x31, 0x38, 0x31, 0x32, 0x32, 0x33, 0x5a, 0x30, 0x4a, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x12, 0x30, 0x10,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f,\n+0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa7, 0x50, 0x19, 0xde, 0x3f, 0x99,\n+0x3d, 0xd4, 0x33, 0x46, 0xf1, 0x6f, 0x51, 0x61, 0x82, 0xb2, 0xa9, 0x4f, 0x8f, 0x67, 0x89, 0x5d,\n+0x84, 0xd9, 0x53, 0xdd, 0x0c, 0x28, 0xd9, 0xd7, 0xf0, 0xff, 0xae, 0x95, 0x43, 0x72, 0x99, 0xf9,\n+0xb5, 0x5d, 0x7c, 0x8a, 0xc1, 0x42, 0xe1, 0x31, 0x50, 0x74, 0xd1, 0x81, 0x0d, 0x7c, 0xcd, 0x9b,\n+0x21, 0xab, 0x43, 0xe2, 0xac, 0xad, 0x5e, 0x86, 0x6e, 0xf3, 0x09, 0x8a, 0x1f, 0x5a, 0x32, 0xbd,\n+0xa2, 0xeb, 0x94, 0xf9, 0xe8, 0x5c, 0x0a, 0xec, 0xff, 0x98, 0xd2, 0xaf, 0x71, 0xb3, 0xb4, 0x53,\n+0x9f, 0x4e, 0x87, 0xef, 0x92, 0xbc, 0xbd, 0xec, 0x4f, 0x32, 0x30, 0x88, 0x4b, 0x17, 0x5e, 0x57,\n+0xc4, 0x53, 0xc2, 0xf6, 0x02, 0x97, 0x8d, 0xd9, 0x62, 0x2b, 0xbf, 0x24, 0x1f, 0x62, 0x8d, 0xdf,\n+0xc3, 0xb8, 0x29, 0x4b, 0x49, 0x78, 0x3c, 0x93, 0x60, 0x88, 0x22, 0xfc, 0x99, 0xda, 0x36, 0xc8,\n+0xc2, 0xa2, 0xd4, 0x2c, 0x54, 0x00, 0x67, 0x35, 0x6e, 0x73, 0xbf, 0x02, 0x58, 0xf0, 0xa4, 0xdd,\n+0xe5, 0xb0, 0xa2, 0x26, 0x7a, 0xca, 0xe0, 0x36, 0xa5, 0x19, 0x16, 0xf5, 0xfd, 0xb7, 0xef, 0xae,\n+0x3f, 0x40, 0xf5, 0x6d, 0x5a, 0x04, 0xfd, 0xce, 0x34, 0xca, 0x24, 0xdc, 0x74, 0x23, 0x1b, 0x5d,\n+0x33, 0x13, 0x12, 0x5d, 0xc4, 0x01, 0x25, 0xf6, 0x30, 0xdd, 0x02, 0x5d, 0x9f, 0xe0, 0xd5, 0x47,\n+0xbd, 0xb4, 0xeb, 0x1b, 0xa1, 0xbb, 0x49, 0x49, 0xd8, 0x9f, 0x5b, 0x02, 0xf3, 0x8a, 0xe4, 0x24,\n+0x90, 0xe4, 0x62, 0x4f, 0x4f, 0xc1, 0xaf, 0x8b, 0x0e, 0x74, 0x17, 0xa8, 0xd1, 0x72, 0x88, 0x6a,\n+0x7a, 0x01, 0x49, 0xcc, 0xb4, 0x46, 0x79, 0xc6, 0x17, 0xb1, 0xda, 0x98, 0x1e, 0x07, 0x59, 0xfa,\n+0x75, 0x21, 0x85, 0x65, 0xdd, 0x90, 0x56, 0xce, 0xfb, 0xab, 0xa5, 0x60, 0x9d, 0xc4, 0x9d, 0xf9,\n+0x52, 0xb0, 0x8b, 0xbd, 0x87, 0xf9, 0x8f, 0x2b, 0x23, 0x0a, 0x23, 0x76, 0x3b, 0xf7, 0x33, 0xe1,\n+0xc9, 0x00, 0xf3, 0x69, 0xf9, 0x4b, 0xa2, 0xe0, 0x4e, 0xbc, 0x7e, 0x93, 0x39, 0x84, 0x07, 0xf7,\n+0x44, 0x70, 0x7e, 0xfe, 0x07, 0x5a, 0xe5, 0xb1, 0xac, 0xd1, 0x18, 0xcc, 0xf2, 0x35, 0xe5, 0x49,\n+0x49, 0x08, 0xca, 0x56, 0xc9, 0x3d, 0xfb, 0x0f, 0x18, 0x7d, 0x8b, 0x3b, 0xc1, 0x13, 0xc2, 0x4d,\n+0x8f, 0xc9, 0x4f, 0x0e, 0x37, 0xe9, 0x1f, 0xa1, 0x0e, 0x6a, 0xdf, 0x62, 0x2e, 0xcb, 0x35, 0x06,\n+0x51, 0x79, 0x2c, 0xc8, 0x25, 0x38, 0xf4, 0xfa, 0x4b, 0xa7, 0x89, 0x5c, 0x9c, 0xd2, 0xe3, 0x0d,\n+0x39, 0x86, 0x4a, 0x74, 0x7c, 0xd5, 0x59, 0x87, 0xc2, 0x3f, 0x4e, 0x0c, 0x5c, 0x52, 0xf4, 0x3d,\n+0xf7, 0x52, 0x82, 0xf1, 0xea, 0xa3, 0xac, 0xfd, 0x49, 0x34, 0x1a, 0x28, 0xf3, 0x41, 0x88, 0x3a,\n+0x13, 0xee, 0xe8, 0xde, 0xff, 0x99, 0x1d, 0x5f, 0xba, 0xcb, 0xe8, 0x1e, 0xf2, 0xb9, 0x50, 0x60,\n+0xc0, 0x31, 0xd3, 0x73, 0xe5, 0xef, 0xbe, 0xa0, 0xed, 0x33, 0x0b, 0x74, 0xbe, 0x20, 0x20, 0xc4,\n+0x67, 0x6c, 0xf0, 0x08, 0x03, 0x7a, 0x55, 0x80, 0x7f, 0x46, 0x4e, 0x96, 0xa7, 0xf4, 0x1e, 0x3e,\n+0xe1, 0xf6, 0xd8, 0x09, 0xe1, 0x33, 0x64, 0x2b, 0x63, 0xd7, 0x32, 0x5e, 0x9f, 0xf9, 0xc0, 0x7b,\n+0x0f, 0x78, 0x6f, 0x97, 0xbc, 0x93, 0x9a, 0xf9, 0x9c, 0x12, 0x90, 0x78, 0x7a, 0x80, 0x87, 0x15,\n+0xd7, 0x72, 0x74, 0x9c, 0x55, 0x74, 0x78, 0xb1, 0xba, 0xe1, 0x6e, 0x70, 0x04, 0xba, 0x4f, 0xa0,\n+0xba, 0x68, 0xc3, 0x7b, 0xff, 0x31, 0xf0, 0x73, 0x3d, 0x3d, 0x94, 0x2a, 0xb1, 0x0b, 0x41, 0x0e,\n+0xa0, 0xfe, 0x4d, 0x88, 0x65, 0x6b, 0x79, 0x33, 0xb4, 0xd7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n+0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n+0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xed,\n+0x44, 0x19, 0xc0, 0xd3, 0xf0, 0x06, 0x8b, 0xee, 0xa4, 0x7b, 0xbe, 0x42, 0xe7, 0x26, 0x54, 0xc8,\n+0x8e, 0x36, 0x76, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x0d, 0xae, 0x90, 0x32, 0xf6, 0xa6, 0x4b, 0x7c, 0x44,\n+0x76, 0x19, 0x61, 0x1e, 0x27, 0x28, 0xcd, 0x5e, 0x54, 0xef, 0x25, 0xbc, 0xe3, 0x08, 0x90, 0xf9,\n+0x29, 0xd7, 0xae, 0x68, 0x08, 0xe1, 0x94, 0x00, 0x58, 0xef, 0x2e, 0x2e, 0x7e, 0x53, 0x52, 0x8c,\n+0xb6, 0x5c, 0x07, 0xea, 0x88, 0xba, 0x99, 0x8b, 0x50, 0x94, 0xd7, 0x82, 0x80, 0xdf, 0x61, 0x09,\n+0x00, 0x93, 0xad, 0x0d, 0x14, 0xe6, 0xce, 0xc1, 0xf2, 0x37, 0x94, 0x78, 0xb0, 0x5f, 0x9c, 0xb3,\n+0xa2, 0x73, 0xb8, 0x8f, 0x05, 0x93, 0x38, 0xcd, 0x8d, 0x3e, 0xb0, 0xb8, 0xfb, 0xc0, 0xcf, 0xb1,\n+0xf2, 0xec, 0x2d, 0x2d, 0x1b, 0xcc, 0xec, 0xaa, 0x9a, 0xb3, 0xaa, 0x60, 0x82, 0x1b, 0x2d, 0x3b,\n+0xc3, 0x84, 0x3d, 0x57, 0x8a, 0x96, 0x1e, 0x9c, 0x75, 0xb8, 0xd3, 0x30, 0xcd, 0x60, 0x08, 0x83,\n+0x90, 0xd3, 0x8e, 0x54, 0xf1, 0x4d, 0x66, 0xc0, 0x5d, 0x74, 0x03, 0x40, 0xa3, 0xee, 0x85, 0x7e,\n+0xc2, 0x1f, 0x77, 0x9c, 0x06, 0xe8, 0xc1, 0xa7, 0x18, 0x5d, 0x52, 0x95, 0xed, 0xc9, 0xdd, 0x25,\n+0x9e, 0x6d, 0xfa, 0xa9, 0xed, 0xa3, 0x3a, 0x34, 0xd0, 0x59, 0x7b, 0xda, 0xed, 0x50, 0xf3, 0x35,\n+0xbf, 0xed, 0xeb, 0x14, 0x4d, 0x31, 0xc7, 0x60, 0xf4, 0xda, 0xf1, 0x87, 0x9c, 0xe2, 0x48, 0xe2,\n+0xc6, 0xc5, 0x37, 0xfb, 0x06, 0x10, 0xfa, 0x75, 0x59, 0x66, 0x31, 0x47, 0x29, 0xda, 0x76, 0x9a,\n+0x1c, 0xe9, 0x82, 0xae, 0xef, 0x9a, 0xb9, 0x51, 0xf7, 0x88, 0x23, 0x9a, 0x69, 0x95, 0x62, 0x3c,\n+0xe5, 0x55, 0x80, 0x36, 0xd7, 0x54, 0x02, 0xff, 0xf1, 0xb9, 0x5d, 0xce, 0xd4, 0x23, 0x6f, 0xd8,\n+0x45, 0x84, 0x4a, 0x5b, 0x65, 0xef, 0x89, 0x0c, 0xdd, 0x14, 0xa7, 0x20, 0xcb, 0x18, 0xa5, 0x25,\n+0xb4, 0x0d, 0xf9, 0x01, 0xf0, 0xa2, 0xd2, 0xf4, 0x00, 0xc8, 0x74, 0x8e, 0xa1, 0x2a, 0x48, 0x8e,\n+0x65, 0xdb, 0x13, 0xc4, 0xe2, 0x25, 0x17, 0x7d, 0xeb, 0xbe, 0x87, 0x5b, 0x17, 0x20, 0x54, 0x51,\n+0x93, 0x4a, 0x53, 0x03, 0x0b, 0xec, 0x5d, 0xca, 0x33, 0xed, 0x62, 0xfd, 0x45, 0xc7, 0x2f, 0x5b,\n+0xdc, 0x58, 0xa0, 0x80, 0x39, 0xe6, 0xfa, 0xd7, 0xfe, 0x13, 0x14, 0xa6, 0xed, 0x3d, 0x94, 0x4a,\n+0x42, 0x74, 0xd4, 0xc3, 0x77, 0x59, 0x73, 0xcd, 0x8f, 0x46, 0xbe, 0x55, 0x38, 0xef, 0xfa, 0xe8,\n+0x91, 0x32, 0xea, 0x97, 0x58, 0x04, 0x22, 0xde, 0x38, 0xc3, 0xcc, 0xbc, 0x6d, 0xc9, 0x33, 0x3a,\n+0x6a, 0x0a, 0x69, 0x3f, 0xa0, 0xc8, 0xea, 0x72, 0x8f, 0x8c, 0x63, 0x86, 0x23, 0xbd, 0x6d, 0x3c,\n+0x96, 0x9e, 0x95, 0xe0, 0x49, 0x4c, 0xaa, 0xa2, 0xb9, 0x2a, 0x1b, 0x9c, 0x36, 0x81, 0x78, 0xed,\n+0xc3, 0xe8, 0x46, 0xe2, 0x26, 0x59, 0x44, 0x75, 0x1e, 0xd9, 0x75, 0x89, 0x51, 0xcd, 0x10, 0x84,\n+0x9d, 0x61, 0x60, 0xcb, 0x5d, 0xf9, 0x97, 0x22, 0x4d, 0x8e, 0x98, 0xe6, 0xe3, 0x7f, 0xf6, 0x5b,\n+0xbb, 0xae, 0xcd, 0xca, 0x4a, 0x81, 0x6b, 0x5e, 0x0b, 0xf3, 0x51, 0xe1, 0x74, 0x2b, 0xe9, 0x7e,\n+0x27, 0xa7, 0xd9, 0x99, 0x49, 0x4e, 0xf8, 0xa5, 0x80, 0xdb, 0x25, 0x0f, 0x1c, 0x63, 0x62, 0x8a,\n+0xc9, 0x33, 0x67, 0x6b, 0x3c, 0x10, 0x83, 0xc6, 0xad, 0xde, 0xa8, 0xcd, 0x16, 0x8e, 0x8d, 0xf0,\n+0x07, 0x37, 0x71, 0x9f, 0xf2, 0xab, 0xfc, 0x41, 0xf5, 0xc1, 0x8b, 0xec, 0x00, 0x37, 0x5d, 0x09,\n+0xe5, 0x4e, 0x80, 0xef, 0xfa, 0xb1, 0x5c, 0x38, 0x06, 0xa5, 0x1b, 0x4a, 0xe1, 0xdc, 0x38, 0x2d,\n+0x3c, 0xdc, 0xab, 0x1f, 0x90, 0x1a, 0xd5, 0x4a, 0x9c, 0xee, 0xd1, 0x70, 0x6c, 0xcc, 0xee, 0xf4,\n+0x57, 0xf8, 0x18, 0xba, 0x84, 0x6e, 0x87, 0x30, 0x82, 0x05, 0x66, 0x30, 0x82, 0x03, 0x4e, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0a, 0x01, 0x42, 0x80, 0x00, 0x00, 0x01, 0x45, 0x23, 0xcf,\n+0x46, 0x7c, 0x00, 0x00, 0x00, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x55, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x49,\n+0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x75, 0x62,\n+0x6c, 0x69, 0x63, 0x20, 0x53, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x31, 0x31, 0x36, 0x31, 0x37,\n+0x35, 0x33, 0x33, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x30, 0x31, 0x31, 0x36, 0x31, 0x37, 0x35,\n+0x33, 0x33, 0x32, 0x5a, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x55, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x49, 0x64,\n+0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x75, 0x62, 0x6c,\n+0x69, 0x63, 0x20, 0x53, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43,\n+0x41, 0x20, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n+0x82, 0x02, 0x01, 0x00, 0xb6, 0x22, 0x94, 0xfc, 0xa4, 0x48, 0xaf, 0xe8, 0x47, 0x6b, 0x0a, 0xfb,\n+0x27, 0x76, 0xe4, 0xf2, 0x3f, 0x8a, 0x3b, 0x7a, 0x4a, 0x2c, 0x31, 0x2a, 0x8c, 0x8d, 0xb0, 0xa9,\n+0xc3, 0x31, 0x6b, 0xa8, 0x77, 0x76, 0x84, 0x26, 0xb6, 0xac, 0x81, 0x42, 0x0d, 0x08, 0xeb, 0x55,\n+0x58, 0xbb, 0x7a, 0xf8, 0xbc, 0x65, 0x7d, 0xf2, 0xa0, 0x6d, 0x8b, 0xa8, 0x47, 0xe9, 0x62, 0x76,\n+0x1e, 0x11, 0xee, 0x08, 0x14, 0xd1, 0xb2, 0x44, 0x16, 0xf4, 0xea, 0xd0, 0xfa, 0x1e, 0x2f, 0x5e,\n+0xdb, 0xcb, 0x73, 0x41, 0xae, 0xbc, 0x00, 0xb0, 0x4a, 0x2b, 0x40, 0xb2, 0xac, 0xe1, 0x3b, 0x4b,\n+0xc2, 0x2d, 0x9d, 0xe4, 0xa1, 0x9b, 0xec, 0x1a, 0x3a, 0x1e, 0xf0, 0x08, 0xb3, 0xd0, 0xe4, 0x24,\n+0x35, 0x07, 0x9f, 0x9c, 0xb4, 0xc9, 0x52, 0x6d, 0xdb, 0x07, 0xca, 0x8f, 0xb5, 0x5b, 0xf0, 0x83,\n+0xf3, 0x4f, 0xc7, 0x2d, 0xa5, 0xc8, 0xad, 0xcb, 0x95, 0x20, 0xa4, 0x31, 0x28, 0x57, 0x58, 0x5a,\n+0xe4, 0x8d, 0x1b, 0x9a, 0xab, 0x9e, 0x0d, 0x0c, 0xf2, 0x0a, 0x33, 0x39, 0x22, 0x39, 0x0a, 0x97,\n+0x2e, 0xf3, 0x53, 0x77, 0xb9, 0x44, 0x45, 0xfd, 0x84, 0xcb, 0x36, 0x20, 0x81, 0x59, 0x2d, 0x9a,\n+0x6f, 0x6d, 0x48, 0x48, 0x61, 0xca, 0x4c, 0xdf, 0x53, 0xd1, 0xaf, 0x52, 0xbc, 0x44, 0x9f, 0xab,\n+0x2f, 0x6b, 0x83, 0x72, 0xef, 0x75, 0x80, 0xda, 0x06, 0x33, 0x1b, 0x5d, 0xc8, 0xda, 0x63, 0xc6,\n+0x4d, 0xcd, 0xac, 0x66, 0x31, 0xcd, 0xd1, 0xde, 0x3e, 0x87, 0x10, 0x36, 0xe1, 0xb9, 0xa4, 0x7a,\n+0xef, 0x60, 0x50, 0xb2, 0xcb, 0xca, 0xa6, 0x56, 0xe0, 0x37, 0xaf, 0xab, 0x34, 0x13, 0x39, 0x25,\n+0xe8, 0x39, 0x66, 0xe4, 0x98, 0x7a, 0xaa, 0x12, 0x98, 0x9c, 0x59, 0x66, 0x86, 0x3e, 0xad, 0xf1,\n+0xb0, 0xca, 0x3e, 0x06, 0x0f, 0x7b, 0xf0, 0x11, 0x4b, 0x37, 0xa0, 0x44, 0x6d, 0x7b, 0xcb, 0xa8,\n+0x8c, 0x71, 0xf4, 0xd5, 0xb5, 0x91, 0x36, 0xcc, 0xf0, 0x15, 0xc6, 0x2b, 0xde, 0x51, 0x17, 0xb1,\n+0x97, 0x4c, 0x50, 0x3d, 0xb1, 0x95, 0x59, 0x7c, 0x05, 0x7d, 0x2d, 0x21, 0xd5, 0x00, 0xbf, 0x01,\n+0x67, 0xa2, 0x5e, 0x7b, 0xa6, 0x5c, 0xf2, 0xf7, 0x22, 0xf1, 0x90, 0x0d, 0x93, 0xdb, 0xaa, 0x44,\n+0x51, 0x66, 0xcc, 0x7d, 0x76, 0x03, 0xeb, 0x6a, 0xa8, 0x2a, 0x38, 0x19, 0x97, 0x76, 0x0d, 0x6b,\n+0x8a, 0x61, 0xf9, 0xbc, 0xf6, 0xee, 0x76, 0xfd, 0x70, 0x2b, 0xdd, 0x29, 0x3c, 0xf8, 0x0a, 0x1e,\n+0x5b, 0x42, 0x1c, 0x8b, 0x56, 0x2f, 0x55, 0x1b, 0x1c, 0xa1, 0x2e, 0xb5, 0xc7, 0x16, 0xe6, 0xf8,\n+0xaa, 0x3c, 0x92, 0x8e, 0x69, 0xb6, 0x01, 0xc1, 0xb5, 0x86, 0x9d, 0x89, 0x0f, 0x0b, 0x38, 0x94,\n+0x54, 0xe8, 0xea, 0xdc, 0x9e, 0x3d, 0x25, 0xbc, 0x53, 0x26, 0xed, 0xd5, 0xab, 0x39, 0xaa, 0xc5,\n+0x40, 0x4c, 0x54, 0xab, 0xb2, 0xb4, 0xd9, 0xd9, 0xf8, 0xd7, 0x72, 0xdb, 0x1c, 0xbc, 0x6d, 0xbd,\n+0x65, 0x5f, 0xef, 0x88, 0x35, 0x2a, 0x66, 0x2f, 0xee, 0xf6, 0xb3, 0x65, 0xf0, 0x33, 0x8d, 0x7c,\n+0x98, 0x41, 0x69, 0x46, 0x0f, 0x43, 0x1c, 0x69, 0xfa, 0x9b, 0xb5, 0xd0, 0x61, 0x6a, 0xcd, 0xca,\n+0x4b, 0xd9, 0x4c, 0x90, 0x46, 0xab, 0x15, 0x59, 0xa1, 0x47, 0x54, 0x29, 0x2e, 0x83, 0x28, 0x5f,\n+0x1c, 0xc2, 0xa2, 0xab, 0x72, 0x17, 0x00, 0x06, 0x8e, 0x45, 0xec, 0x8b, 0xe2, 0x33, 0x3d, 0x7f,\n+0xda, 0x19, 0x44, 0xe4, 0x62, 0x72, 0xc3, 0xdf, 0x22, 0xc6, 0xf2, 0x56, 0xd4, 0xdd, 0x5f, 0x95,\n+0x72, 0xed, 0x6d, 0x5f, 0xf7, 0x48, 0x03, 0x5b, 0xfd, 0xc5, 0x2a, 0xa0, 0xf6, 0x73, 0x23, 0x84,\n+0x10, 0x1b, 0x01, 0xe7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe3, 0x71, 0xe0, 0x9e, 0xd8, 0xa7, 0x42,\n+0xd9, 0xdb, 0x71, 0x91, 0x6b, 0x94, 0x93, 0xeb, 0xc3, 0xa3, 0xd1, 0x14, 0xa3, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,\n+0x00, 0x47, 0xfa, 0xdd, 0x0a, 0xb0, 0x11, 0x91, 0x38, 0xad, 0x4d, 0x5d, 0xf7, 0xe5, 0x0e, 0x97,\n+0x54, 0x19, 0x82, 0x48, 0x87, 0x54, 0x8c, 0xaa, 0x64, 0x99, 0xd8, 0x5a, 0xfe, 0x88, 0x01, 0xc5,\n+0x58, 0xa5, 0x99, 0xb1, 0x23, 0x54, 0x23, 0xb7, 0x6a, 0x1d, 0x20, 0x57, 0xe5, 0x01, 0x62, 0x41,\n+0x17, 0xd3, 0x09, 0xdb, 0x75, 0xcb, 0x6e, 0x54, 0x90, 0x75, 0xfe, 0x1a, 0x9f, 0x81, 0x0a, 0xc2,\n+0xdd, 0xd7, 0xf7, 0x09, 0xd0, 0x5b, 0x72, 0x15, 0xe4, 0x1e, 0x09, 0x6a, 0x3d, 0x33, 0xf3, 0x21,\n+0x9a, 0xe6, 0x15, 0x7e, 0xad, 0x51, 0xd5, 0x0d, 0x10, 0xed, 0x7d, 0x42, 0xc0, 0x8f, 0xee, 0xc0,\n+0x9a, 0x08, 0xd5, 0x41, 0xd6, 0x5c, 0x0e, 0x21, 0x69, 0x6e, 0x80, 0x61, 0x0e, 0x15, 0xc0, 0xb8,\n+0xcf, 0xc5, 0x49, 0x12, 0x52, 0xcc, 0xbe, 0x3a, 0xcc, 0xd4, 0x2e, 0x38, 0x05, 0xde, 0x35, 0xfd,\n+0x1f, 0x6f, 0xb8, 0x80, 0x68, 0x98, 0x3d, 0x4d, 0xa0, 0xca, 0x40, 0x65, 0xd2, 0x73, 0x7c, 0xf5,\n+0x8b, 0xd9, 0x0a, 0x95, 0x3f, 0xd8, 0x3f, 0x23, 0x6d, 0x1a, 0xd1, 0x2a, 0x24, 0x19, 0xd9, 0x85,\n+0xb3, 0x17, 0xef, 0x78, 0x6e, 0xa9, 0x58, 0xd1, 0x23, 0xd3, 0xc7, 0x13, 0xed, 0x72, 0x25, 0x7f,\n+0x5d, 0xb1, 0x73, 0x70, 0xd0, 0x7f, 0x06, 0x97, 0x09, 0x84, 0x29, 0x80, 0x61, 0x1d, 0xfa, 0x5e,\n+0xff, 0x73, 0xac, 0xa0, 0xe3, 0x89, 0xb8, 0x1c, 0x71, 0x15, 0xc6, 0xde, 0x31, 0x7f, 0x12, 0xdc,\n+0xe1, 0x6d, 0x9b, 0xaf, 0xe7, 0xe8, 0x9f, 0x75, 0x78, 0x4c, 0xab, 0x46, 0x3b, 0x9a, 0xce, 0xbf,\n+0x05, 0x18, 0x5d, 0x4d, 0x15, 0x3c, 0x16, 0x9a, 0x19, 0x50, 0x04, 0x9a, 0xb2, 0x9a, 0x6f, 0x65,\n+0x8b, 0x52, 0x5f, 0x3c, 0x58, 0x04, 0x28, 0x25, 0xc0, 0x66, 0x61, 0x31, 0x7e, 0xb9, 0xe0, 0x75,\n+0xb9, 0x1a, 0xa8, 0x81, 0xd6, 0x72, 0x17, 0xb3, 0xc5, 0x03, 0x31, 0x35, 0x11, 0x78, 0x78, 0xa2,\n+0xe0, 0xe9, 0x30, 0x8c, 0x7f, 0x80, 0xdf, 0x58, 0xdf, 0x3c, 0xba, 0x27, 0x96, 0xe2, 0x80, 0x34,\n+0x6d, 0xe3, 0x98, 0xd3, 0x64, 0x27, 0xac, 0x48, 0x7e, 0x28, 0x77, 0x5c, 0xc6, 0x25, 0x61, 0x25,\n+0xf8, 0x85, 0x0c, 0x65, 0xfa, 0xc4, 0x32, 0x2f, 0xa5, 0x98, 0x05, 0xe4, 0xf8, 0x0b, 0x67, 0x16,\n+0x16, 0xc6, 0x82, 0xb8, 0x32, 0x19, 0xf9, 0xf9, 0xb9, 0x79, 0xdc, 0x1f, 0xcd, 0xeb, 0xaf, 0xab,\n+0x0e, 0xdd, 0x1b, 0xdb, 0x45, 0xe4, 0x7a, 0xe7, 0x02, 0xe2, 0x95, 0x5d, 0xfc, 0x69, 0xf0, 0x53,\n+0x69, 0x61, 0x95, 0x75, 0x79, 0x0b, 0x5e, 0x55, 0xe6, 0x38, 0x1c, 0x94, 0xa9, 0x59, 0x33, 0x9e,\n+0xc8, 0x71, 0x74, 0x79, 0x7f, 0x51, 0x89, 0xb6, 0xc8, 0x6a, 0xb8, 0x30, 0xc8, 0x6a, 0x38, 0xc3,\n+0x6e, 0x9e, 0xe1, 0x37, 0x16, 0xea, 0x05, 0x62, 0x4c, 0x5b, 0x12, 0x47, 0xed, 0xa7, 0xb4, 0xb3,\n+0x58, 0x56, 0xc7, 0x49, 0xf3, 0x7f, 0x12, 0x68, 0x09, 0x31, 0x71, 0xf0, 0x6d, 0xf8, 0x4e, 0x47,\n+0xfb, 0xd6, 0x85, 0xee, 0xc5, 0x58, 0x40, 0x19, 0xa4, 0x1d, 0xa7, 0xf9, 0x4b, 0x43, 0x37, 0xdc,\n+0x68, 0x5a, 0x4f, 0xcf, 0xeb, 0xc2, 0x64, 0x74, 0xde, 0xb4, 0x15, 0xd9, 0xf4, 0x54, 0x54, 0x1a,\n+0x2f, 0x1c, 0xd7, 0x97, 0x71, 0x54, 0x90, 0x8e, 0xd9, 0x20, 0x9d, 0x53, 0x2b, 0x7f, 0xab, 0x8f,\n+0xe2, 0xea, 0x30, 0xbc, 0x50, 0x37, 0xef, 0xf1, 0x47, 0xb5, 0x7d, 0x7c, 0x2c, 0x04, 0xec, 0x68,\n+0x9d, 0xb4, 0x49, 0x44, 0x10, 0xf4, 0x72, 0x4b, 0x1c, 0x64, 0xe7, 0xfc, 0xe6, 0x6b, 0x90, 0xdd,\n+0x69, 0x7d, 0x69, 0xfd, 0x00, 0x56, 0xa5, 0xb7, 0xac, 0xb6, 0xad, 0xb7, 0xca, 0x3e, 0x01, 0xef,\n+0x9c, 0x30, 0x82, 0x05, 0x70, 0x30, 0x82, 0x03, 0x58, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04,\n+0x00, 0x98, 0x96, 0x8d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x4e, 0x4c, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x15, 0x53, 0x74, 0x61,\n+0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64,\n+0x65, 0x6e, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x20, 0x53, 0x74, 0x61,\n+0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64,\n+0x65, 0x6e, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17,\n+0x0d, 0x31, 0x30, 0x31, 0x32, 0x30, 0x38, 0x31, 0x31, 0x31, 0x39, 0x32, 0x39, 0x5a, 0x17, 0x0d,\n+0x32, 0x32, 0x31, 0x32, 0x30, 0x38, 0x31, 0x31, 0x31, 0x30, 0x32, 0x38, 0x5a, 0x30, 0x58, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x1e, 0x30, 0x1c,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x15, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72,\n+0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x6e, 0x31, 0x29, 0x30, 0x27,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x20, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72,\n+0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x6e, 0x20, 0x45, 0x56, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30,\n+0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xe3, 0xc7, 0x7e, 0x89, 0xf9, 0x24, 0x4b, 0x3a,\n+0xd2, 0x33, 0x83, 0x35, 0x2c, 0x69, 0xec, 0xdc, 0x09, 0xa4, 0xe3, 0x51, 0xa8, 0x25, 0x2b, 0x79,\n+0xb8, 0x08, 0x3d, 0xe0, 0x91, 0xba, 0x84, 0x85, 0xc6, 0x85, 0xa4, 0xca, 0xe6, 0xc9, 0x2e, 0x53,\n+0xa4, 0xc9, 0x24, 0x1e, 0xfd, 0x55, 0x66, 0x71, 0x5d, 0x2c, 0xc5, 0x60, 0x68, 0x04, 0xb7, 0xd9,\n+0xc2, 0x52, 0x26, 0x38, 0x88, 0xa4, 0xd6, 0x3b, 0x40, 0xa6, 0xc2, 0xcd, 0x3f, 0xcd, 0x98, 0x93,\n+0xb3, 0x54, 0x14, 0x58, 0x96, 0x55, 0xd5, 0x50, 0xfe, 0x86, 0xad, 0xa4, 0x63, 0x7f, 0x5c, 0x87,\n+0xf6, 0x8e, 0xe6, 0x27, 0x92, 0x67, 0x17, 0x92, 0x02, 0x03, 0x2c, 0xdc, 0xd6, 0x66, 0x74, 0xed,\n+0xdd, 0x67, 0xff, 0xc1, 0x61, 0x8d, 0x63, 0x4f, 0x0f, 0x9b, 0x6d, 0x17, 0x30, 0x26, 0xef, 0xab,\n+0xd2, 0x1f, 0x10, 0xa0, 0xf9, 0xc5, 0x7f, 0x16, 0x69, 0x81, 0x03, 0x47, 0xed, 0x1e, 0x68, 0x8d,\n+0x72, 0xa1, 0x4d, 0xb2, 0x26, 0xc6, 0xba, 0x6c, 0x5f, 0x6d, 0xd6, 0xaf, 0xd1, 0xb1, 0x13, 0x8e,\n+0xa9, 0xad, 0xf3, 0x5e, 0x69, 0x75, 0x26, 0x18, 0x3e, 0x41, 0x2b, 0x21, 0x7f, 0xee, 0x8b, 0x5d,\n+0x07, 0x06, 0x9d, 0x43, 0xc4, 0x29, 0x0a, 0x2b, 0xfc, 0x2a, 0x3e, 0x86, 0xcb, 0x3c, 0x83, 0x3a,\n+0xf9, 0xc9, 0x0d, 0xda, 0xc5, 0x99, 0xe2, 0xbc, 0x78, 0x41, 0x33, 0x76, 0xe1, 0xbf, 0x2f, 0x5d,\n+0xe5, 0xa4, 0x98, 0x50, 0x0c, 0x15, 0xdd, 0xe0, 0xfa, 0x9c, 0x7f, 0x38, 0x68, 0xd0, 0xb2, 0xa6,\n+0x7a, 0xa7, 0xd1, 0x31, 0xbd, 0x7e, 0x8a, 0x58, 0x27, 0x43, 0xb3, 0xba, 0x33, 0x91, 0xd3, 0xa7,\n+0x98, 0x15, 0x5c, 0x9a, 0xe6, 0xd3, 0x0f, 0x75, 0xd9, 0xfc, 0x41, 0x98, 0x97, 0x3e, 0xaa, 0x25,\n+0xdb, 0x8f, 0x92, 0x2e, 0xb0, 0x7b, 0x0c, 0x5f, 0xf1, 0x63, 0xa9, 0x37, 0xf9, 0x9b, 0x75, 0x69,\n+0x4c, 0x28, 0x26, 0x25, 0xda, 0xd5, 0xf2, 0x12, 0x70, 0x45, 0x55, 0xe3, 0xdf, 0x73, 0x5e, 0x37,\n+0xf5, 0x21, 0x6c, 0x90, 0x8e, 0x35, 0x5a, 0xc9, 0xd3, 0x23, 0xeb, 0xd3, 0xc0, 0xbe, 0x78, 0xac,\n+0x42, 0x28, 0x58, 0x66, 0xa5, 0x46, 0x6d, 0x70, 0x02, 0xd7, 0x10, 0xf9, 0x4b, 0x54, 0xfc, 0x5d,\n+0x86, 0x4a, 0x87, 0xcf, 0x7f, 0xca, 0x45, 0xac, 0x11, 0x5a, 0xb5, 0x20, 0x51, 0x8d, 0x2f, 0x88,\n+0x47, 0x97, 0x39, 0xc0, 0xcf, 0xba, 0xc0, 0x42, 0x01, 0x40, 0x99, 0x48, 0x21, 0x0b, 0x6b, 0xa7,\n+0xd2, 0xfd, 0x96, 0xd5, 0xd1, 0xbe, 0x46, 0x9d, 0x49, 0xe0, 0x0b, 0xa6, 0xa0, 0x22, 0x4e, 0x38,\n+0xd0, 0xc1, 0x3c, 0x30, 0xbc, 0x70, 0x8f, 0x2c, 0x75, 0xcc, 0xd0, 0xc5, 0x8c, 0x51, 0x3b, 0x3d,\n+0x94, 0x08, 0x64, 0x26, 0x61, 0x7d, 0xb9, 0xc3, 0x65, 0x8f, 0x14, 0x9c, 0x21, 0xd0, 0xaa, 0xfd,\n+0x17, 0x72, 0x03, 0x8f, 0xbd, 0x9b, 0x8c, 0xe6, 0x5e, 0x53, 0x9e, 0xb9, 0x9d, 0xef, 0x82, 0xbb,\n+0xe1, 0xbc, 0xe2, 0x72, 0x41, 0x5b, 0x21, 0x94, 0xd3, 0x45, 0x37, 0x94, 0xd1, 0xdf, 0x09, 0x39,\n+0x5d, 0xe7, 0x23, 0xaa, 0x9a, 0x1d, 0xca, 0x6d, 0xa8, 0x0a, 0x86, 0x85, 0x8a, 0x82, 0xbe, 0x42,\n+0x07, 0xd6, 0xf2, 0x38, 0x82, 0x73, 0xda, 0x87, 0x5b, 0xe5, 0x3c, 0xd3, 0x9e, 0x3e, 0xa7, 0x3b,\n+0x9e, 0xf4, 0x03, 0xb3, 0xf9, 0xf1, 0x7d, 0x13, 0x74, 0x02, 0xff, 0xbb, 0xa1, 0xe5, 0xfa, 0x00,\n+0x79, 0x1c, 0xa6, 0x66, 0x41, 0x88, 0x5c, 0x60, 0x57, 0xa6, 0x2e, 0x09, 0xc4, 0xba, 0xfd, 0x9a,\n+0xcf, 0xa7, 0x1f, 0x40, 0xc3, 0xbb, 0xcc, 0x5a, 0x0a, 0x55, 0x4b, 0x3b, 0x38, 0x76, 0x51, 0xb8,\n+0x63, 0x8b, 0x84, 0x94, 0x16, 0xe6, 0x56, 0xf3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30,\n+0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xfe, 0xab, 0x00,\n+0x90, 0x98, 0x9e, 0x24, 0xfc, 0xa9, 0xcc, 0x1a, 0x8a, 0xfb, 0x27, 0xb8, 0xbf, 0x30, 0x6e, 0xa8,\n+0x3b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n+0x03, 0x82, 0x02, 0x01, 0x00, 0xcf, 0x77, 0x2c, 0x6e, 0x56, 0xbe, 0x4e, 0xb3, 0xb6, 0x84, 0x00,\n+0x94, 0xab, 0x47, 0xc9, 0x0d, 0xd2, 0x76, 0xc7, 0x86, 0x9f, 0x1d, 0x07, 0xd3, 0xb6, 0xb4, 0xbb,\n+0x08, 0x78, 0xaf, 0x69, 0xd2, 0x0b, 0x49, 0xde, 0x33, 0xc5, 0xac, 0xad, 0xc2, 0x88, 0x02, 0x7d,\n+0x06, 0xb7, 0x35, 0x02, 0xc1, 0x60, 0xc9, 0xbf, 0xc4, 0xe8, 0x94, 0xde, 0xd4, 0xd3, 0xa9, 0x13,\n+0x25, 0x5a, 0xfe, 0x6e, 0xa2, 0xae, 0x7d, 0x05, 0xdc, 0x7d, 0xf3, 0x6c, 0xf0, 0x7e, 0xa6, 0x8d,\n+0xee, 0xd9, 0xd7, 0xce, 0x58, 0x17, 0xe8, 0xa9, 0x29, 0xae, 0x73, 0x48, 0x87, 0xe7, 0x9b, 0xca,\n+0x6e, 0x29, 0xa1, 0x64, 0x5f, 0x19, 0x13, 0xf7, 0xae, 0x06, 0x10, 0xff, 0x51, 0xc6, 0x9b, 0x4d,\n+0x55, 0x25, 0x4f, 0x93, 0x99, 0x10, 0x01, 0x53, 0x75, 0xf1, 0x13, 0xce, 0xc7, 0xa6, 0x41, 0x41,\n+0xd2, 0xbf, 0x88, 0xa5, 0x7f, 0x45, 0xfc, 0xac, 0xb8, 0xa5, 0xb5, 0x33, 0x0c, 0x82, 0xc4, 0xfb,\n+0x07, 0xf6, 0x6a, 0xe5, 0x25, 0x84, 0x5f, 0x06, 0xca, 0xc1, 0x86, 0x39, 0x11, 0xdb, 0x58, 0xcd,\n+0x77, 0x3b, 0x2c, 0xc2, 0x4c, 0x0f, 0x5e, 0x9a, 0xe3, 0xf0, 0xab, 0x3e, 0x61, 0x1b, 0x50, 0x24,\n+0xc2, 0xc0, 0xf4, 0xf1, 0x19, 0xf0, 0x11, 0x29, 0xb6, 0xa5, 0x18, 0x02, 0x9b, 0xd7, 0x63, 0x4c,\n+0x70, 0x8c, 0x47, 0xa3, 0x03, 0x43, 0x5c, 0xb9, 0x5d, 0x46, 0xa0, 0x0d, 0x6f, 0xff, 0x59, 0x8e,\n+0xbe, 0xdd, 0x9f, 0x72, 0xc3, 0x5b, 0x2b, 0xdf, 0x8c, 0x5b, 0xce, 0xe5, 0x0c, 0x46, 0x6c, 0x92,\n+0xb2, 0x0a, 0xa3, 0x4c, 0x54, 0x42, 0x18, 0x15, 0x12, 0x18, 0xbd, 0xda, 0xfc, 0xba, 0x74, 0x6e,\n+0xff, 0xc1, 0xb6, 0xa0, 0x64, 0xd8, 0xa9, 0x5f, 0x55, 0xae, 0x9f, 0x5c, 0x6a, 0x76, 0x96, 0xd8,\n+0x73, 0x67, 0x87, 0xfb, 0x4d, 0x7f, 0x5c, 0xee, 0x69, 0xca, 0x73, 0x10, 0xfb, 0x8a, 0xa9, 0xfd,\n+0x9e, 0xbd, 0x36, 0x38, 0x49, 0x49, 0x87, 0xf4, 0x0e, 0x14, 0xf0, 0xe9, 0x87, 0xb8, 0x3f, 0xa7,\n+0x4f, 0x7a, 0x5a, 0x8e, 0x79, 0xd4, 0x93, 0xe4, 0xbb, 0x68, 0x52, 0x84, 0xac, 0x6c, 0xe9, 0xf3,\n+0x98, 0x70, 0x55, 0x72, 0x32, 0xf9, 0x34, 0xab, 0x2b, 0x49, 0xb5, 0xcd, 0x20, 0x62, 0xe4, 0x3a,\n+0x7a, 0x67, 0x63, 0xab, 0x96, 0xdc, 0x6d, 0xae, 0x97, 0xec, 0xfc, 0x9f, 0x76, 0x56, 0x88, 0x2e,\n+0x66, 0xcf, 0x5b, 0xb6, 0xc9, 0xa4, 0xb0, 0xd7, 0x05, 0xba, 0xe1, 0x27, 0x2f, 0x93, 0xbb, 0x26,\n+0x2a, 0xa2, 0x93, 0xb0, 0x1b, 0xf3, 0x8e, 0xbe, 0x1d, 0x40, 0xa3, 0xb9, 0x36, 0x8f, 0x3e, 0x82,\n+0x1a, 0x1a, 0x5e, 0x88, 0xea, 0x50, 0xf8, 0x59, 0xe2, 0x83, 0x46, 0x29, 0x0b, 0xe3, 0x44, 0x5c,\n+0xe1, 0x95, 0xb6, 0x69, 0x90, 0x9a, 0x14, 0x6f, 0x97, 0xae, 0x81, 0xcf, 0x68, 0xef, 0x99, 0x9a,\n+0xbe, 0xb5, 0xe7, 0xe1, 0x7f, 0xf8, 0xfa, 0x13, 0x47, 0x16, 0x4c, 0xcc, 0x6d, 0x08, 0x40, 0xe7,\n+0x8b, 0x78, 0x6f, 0x50, 0x82, 0x44, 0x50, 0x3f, 0x66, 0x06, 0x8a, 0xab, 0x43, 0x84, 0x56, 0x4a,\n+0x0f, 0x20, 0x2d, 0x86, 0x0e, 0xf5, 0xd2, 0xdb, 0xd2, 0x7a, 0x8a, 0x4b, 0xcd, 0xa5, 0xe8, 0x4e,\n+0xf1, 0x5e, 0x26, 0x25, 0x01, 0x59, 0x23, 0xa0, 0x7e, 0xd2, 0xf6, 0x7e, 0x21, 0x57, 0xd7, 0x27,\n+0xbc, 0x15, 0x57, 0x4c, 0xa4, 0x46, 0xc1, 0xe0, 0x83, 0x1e, 0x0c, 0x4c, 0x4d, 0x1f, 0x4f, 0x06,\n+0x19, 0xe2, 0xf9, 0xa8, 0xf4, 0x3a, 0x82, 0xa1, 0xb2, 0x79, 0x43, 0x79, 0xd6, 0xad, 0x6f, 0x7a,\n+0x27, 0x90, 0x03, 0xa4, 0xea, 0x24, 0x87, 0x3f, 0xd9, 0xbd, 0xd9, 0xe9, 0xf2, 0x5f, 0x50, 0x49,\n+0x1c, 0xee, 0xec, 0xd7, 0x2e, 0x30, 0x82, 0x04, 0x3e, 0x30, 0x82, 0x03, 0x26, 0xa0, 0x03, 0x02,\n+0x01, 0x02, 0x02, 0x04, 0x4a, 0x53, 0x8c, 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xbe, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31,\n+0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, 0x65, 0x20, 0x77, 0x77,\n+0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x6c, 0x65,\n+0x67, 0x61, 0x6c, 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x45, 0x6e, 0x74,\n+0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x66, 0x6f, 0x72,\n+0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20,\n+0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x45,\n+0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,\n+0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x37,\n+0x30, 0x37, 0x31, 0x37, 0x32, 0x35, 0x35, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x30,\n+0x37, 0x31, 0x37, 0x35, 0x35, 0x35, 0x34, 0x5a, 0x30, 0x81, 0xbe, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,\n+0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, 0x65, 0x20, 0x77,\n+0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x6c,\n+0x65, 0x67, 0x61, 0x6c, 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03,\n+0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x45, 0x6e,\n+0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x66, 0x6f,\n+0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65,\n+0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29,\n+0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f,\n+0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xba, 0x84, 0xb6, 0x72, 0xdb, 0x9e,\n+0x0c, 0x6b, 0xe2, 0x99, 0xe9, 0x30, 0x01, 0xa7, 0x76, 0xea, 0x32, 0xb8, 0x95, 0x41, 0x1a, 0xc9,\n+0xda, 0x61, 0x4e, 0x58, 0x72, 0xcf, 0xfe, 0xf6, 0x82, 0x79, 0xbf, 0x73, 0x61, 0x06, 0x0a, 0xa5,\n+0x27, 0xd8, 0xb3, 0x5f, 0xd3, 0x45, 0x4e, 0x1c, 0x72, 0xd6, 0x4e, 0x32, 0xf2, 0x72, 0x8a, 0x0f,\n+0xf7, 0x83, 0x19, 0xd0, 0x6a, 0x80, 0x80, 0x00, 0x45, 0x1e, 0xb0, 0xc7, 0xe7, 0x9a, 0xbf, 0x12,\n+0x57, 0x27, 0x1c, 0xa3, 0x68, 0x2f, 0x0a, 0x87, 0xbd, 0x6a, 0x6b, 0x0e, 0x5e, 0x65, 0xf3, 0x1c,\n+0x77, 0xd5, 0xd4, 0x85, 0x8d, 0x70, 0x21, 0xb4, 0xb3, 0x32, 0xe7, 0x8b, 0xa2, 0xd5, 0x86, 0x39,\n+0x02, 0xb1, 0xb8, 0xd2, 0x47, 0xce, 0xe4, 0xc9, 0x49, 0xc4, 0x3b, 0xa7, 0xde, 0xfb, 0x54, 0x7d,\n+0x57, 0xbe, 0xf0, 0xe8, 0x6e, 0xc2, 0x79, 0xb2, 0x3a, 0x0b, 0x55, 0xe2, 0x50, 0x98, 0x16, 0x32,\n+0x13, 0x5c, 0x2f, 0x78, 0x56, 0xc1, 0xc2, 0x94, 0xb3, 0xf2, 0x5a, 0xe4, 0x27, 0x9a, 0x9f, 0x24,\n+0xd7, 0xc6, 0xec, 0xd0, 0x9b, 0x25, 0x82, 0xe3, 0xcc, 0xc2, 0xc4, 0x45, 0xc5, 0x8c, 0x97, 0x7a,\n+0x06, 0x6b, 0x2a, 0x11, 0x9f, 0xa9, 0x0a, 0x6e, 0x48, 0x3b, 0x6f, 0xdb, 0xd4, 0x11, 0x19, 0x42,\n+0xf7, 0x8f, 0x07, 0xbf, 0xf5, 0x53, 0x5f, 0x9c, 0x3e, 0xf4, 0x17, 0x2c, 0xe6, 0x69, 0xac, 0x4e,\n+0x32, 0x4c, 0x62, 0x77, 0xea, 0xb7, 0xe8, 0xe5, 0xbb, 0x34, 0xbc, 0x19, 0x8b, 0xae, 0x9c, 0x51,\n+0xe7, 0xb7, 0x7e, 0xb5, 0x53, 0xb1, 0x33, 0x22, 0xe5, 0x6d, 0xcf, 0x70, 0x3c, 0x1a, 0xfa, 0xe2,\n+0x9b, 0x67, 0xb6, 0x83, 0xf4, 0x8d, 0xa5, 0xaf, 0x62, 0x4c, 0x4d, 0xe0, 0x58, 0xac, 0x64, 0x34,\n+0x12, 0x03, 0xf8, 0xb6, 0x8d, 0x94, 0x63, 0x24, 0xa4, 0x71, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n+0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n+0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x6a,\n+0x72, 0x26, 0x7a, 0xd0, 0x1e, 0xef, 0x7d, 0xe7, 0x3b, 0x69, 0x51, 0xd4, 0x6c, 0x8d, 0x9f, 0x90,\n+0x12, 0x66, 0xab, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n+0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x79, 0x9f, 0x1d, 0x96, 0xc6, 0xb6, 0x79, 0x3f, 0x22,\n+0x8d, 0x87, 0xd3, 0x87, 0x03, 0x04, 0x60, 0x6a, 0x6b, 0x9a, 0x2e, 0x59, 0x89, 0x73, 0x11, 0xac,\n+0x43, 0xd1, 0xf5, 0x13, 0xff, 0x8d, 0x39, 0x2b, 0xc0, 0xf2, 0xbd, 0x4f, 0x70, 0x8c, 0xa9, 0x2f,\n+0xea, 0x17, 0xc4, 0x0b, 0x54, 0x9e, 0xd4, 0x1b, 0x96, 0x98, 0x33, 0x3c, 0xa8, 0xad, 0x62, 0xa2,\n+0x00, 0x76, 0xab, 0x59, 0x69, 0x6e, 0x06, 0x1d, 0x7e, 0xc4, 0xb9, 0x44, 0x8d, 0x98, 0xaf, 0x12,\n+0xd4, 0x61, 0xdb, 0x0a, 0x19, 0x46, 0x47, 0xf3, 0xeb, 0xf7, 0x63, 0xc1, 0x40, 0x05, 0x40, 0xa5,\n+0xd2, 0xb7, 0xf4, 0xb5, 0x9a, 0x36, 0xbf, 0xa9, 0x88, 0x76, 0x88, 0x04, 0x55, 0x04, 0x2b, 0x9c,\n+0x87, 0x7f, 0x1a, 0x37, 0x3c, 0x7e, 0x2d, 0xa5, 0x1a, 0xd8, 0xd4, 0x89, 0x5e, 0xca, 0xbd, 0xac,\n+0x3d, 0x6c, 0xd8, 0x6d, 0xaf, 0xd5, 0xf3, 0x76, 0x0f, 0xcd, 0x3b, 0x88, 0x38, 0x22, 0x9d, 0x6c,\n+0x93, 0x9a, 0xc4, 0x3d, 0xbf, 0x82, 0x1b, 0x65, 0x3f, 0xa6, 0x0f, 0x5d, 0xaa, 0xfc, 0xe5, 0xb2,\n+0x15, 0xca, 0xb5, 0xad, 0xc6, 0xbc, 0x3d, 0xd0, 0x84, 0xe8, 0xea, 0x06, 0x72, 0xb0, 0x4d, 0x39,\n+0x32, 0x78, 0xbf, 0x3e, 0x11, 0x9c, 0x0b, 0xa4, 0x9d, 0x9a, 0x21, 0xf3, 0xf0, 0x9b, 0x0b, 0x30,\n+0x78, 0xdb, 0xc1, 0xdc, 0x87, 0x43, 0xfe, 0xbc, 0x63, 0x9a, 0xca, 0xc5, 0xc2, 0x1c, 0xc9, 0xc7,\n+0x8d, 0xff, 0x3b, 0x12, 0x58, 0x08, 0xe6, 0xb6, 0x3d, 0xec, 0x7a, 0x2c, 0x4e, 0xfb, 0x83, 0x96,\n+0xce, 0x0c, 0x3c, 0x69, 0x87, 0x54, 0x73, 0xa4, 0x73, 0xc2, 0x93, 0xff, 0x51, 0x10, 0xac, 0x15,\n+0x54, 0x01, 0xd8, 0xfc, 0x05, 0xb1, 0x89, 0xa1, 0x7f, 0x74, 0x83, 0x9a, 0x49, 0xd7, 0xdc, 0x4e,\n+0x7b, 0x8a, 0x48, 0x6f, 0x8b, 0x45, 0xf6, 0x30, 0x82, 0x02, 0xf9, 0x30, 0x82, 0x02, 0x80, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x0d, 0x00, 0xa6, 0x8b, 0x79, 0x29, 0x00, 0x00, 0x00, 0x00, 0x50,\n+0xd0, 0x91, 0xf9, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30,\n+0x81, 0xbf, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73,\n+0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x13, 0x1f, 0x53, 0x65, 0x65, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73,\n+0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x2d, 0x74, 0x65, 0x72, 0x6d,\n+0x73, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20,\n+0x32, 0x30, 0x31, 0x32, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e,\n+0x63, 0x2e, 0x20, 0x2d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,\n+0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x33, 0x30, 0x31,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52,\n+0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n+0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x45, 0x43,\n+0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x31, 0x32, 0x31, 0x38, 0x31, 0x35, 0x32, 0x35, 0x33,\n+0x36, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x31, 0x38, 0x31, 0x35, 0x35, 0x35, 0x33, 0x36,\n+0x5a, 0x30, 0x81, 0xbf, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n+0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72,\n+0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, 0x65, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72,\n+0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x2d, 0x74, 0x65,\n+0x72, 0x6d, 0x73, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63,\n+0x29, 0x20, 0x32, 0x30, 0x31, 0x32, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20,\n+0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x33,\n+0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n+0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20,\n+0x45, 0x43, 0x31, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01,\n+0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x84, 0x13, 0xc9, 0xd0, 0xba,\n+0x6d, 0x41, 0x7b, 0xe2, 0x6c, 0xd0, 0xeb, 0x55, 0x5f, 0x66, 0x02, 0x1a, 0x24, 0xf4, 0x5b, 0x89,\n+0x69, 0x47, 0xe3, 0xb8, 0xc2, 0x7d, 0xf1, 0xf2, 0x02, 0xc5, 0x9f, 0xa0, 0xf6, 0x5b, 0xd5, 0x8b,\n+0x06, 0x19, 0x86, 0x4f, 0x53, 0x10, 0x6d, 0x07, 0x24, 0x27, 0xa1, 0xa0, 0xf8, 0xd5, 0x47, 0x19,\n+0x61, 0x4c, 0x7d, 0xca, 0x93, 0x27, 0xea, 0x74, 0x0c, 0xef, 0x6f, 0x96, 0x09, 0xfe, 0x63, 0xec,\n+0x70, 0x5d, 0x36, 0xad, 0x67, 0x77, 0xae, 0xc9, 0x9d, 0x7c, 0x55, 0x44, 0x3a, 0xa2, 0x63, 0x51,\n+0x1f, 0xf5, 0xe3, 0x62, 0xd4, 0xa9, 0x47, 0x07, 0x3e, 0xcc, 0x20, 0xa3, 0x42, 0x30, 0x40, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb7, 0x63, 0xe7, 0x1a, 0xdd,\n+0x8d, 0xe9, 0x08, 0xa6, 0x55, 0x83, 0xa4, 0xe0, 0x6a, 0x50, 0x41, 0x65, 0x11, 0x42, 0x49, 0x30,\n+0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x67, 0x00, 0x30, 0x64,\n+0x02, 0x30, 0x61, 0x79, 0xd8, 0xe5, 0x42, 0x47, 0xdf, 0x1c, 0xae, 0x53, 0x99, 0x17, 0xb6, 0x6f,\n+0x1c, 0x7d, 0xe1, 0xbf, 0x11, 0x94, 0xd1, 0x03, 0x88, 0x75, 0xe4, 0x8d, 0x89, 0xa4, 0x8a, 0x77,\n+0x46, 0xde, 0x6d, 0x61, 0xef, 0x02, 0xf5, 0xfb, 0xb5, 0xdf, 0xcc, 0xfe, 0x4e, 0xff, 0xfe, 0xa9,\n+0xe6, 0xa7, 0x02, 0x30, 0x5b, 0x99, 0xd7, 0x85, 0x37, 0x06, 0xb5, 0x7b, 0x08, 0xfd, 0xeb, 0x27,\n+0x8b, 0x4a, 0x94, 0xf9, 0xe1, 0xfa, 0xa7, 0x8e, 0x26, 0x08, 0xe8, 0x7c, 0x92, 0x68, 0x6d, 0x73,\n+0xd8, 0x6f, 0x26, 0xac, 0x21, 0x02, 0xb8, 0x99, 0xb7, 0x26, 0x41, 0x5b, 0x25, 0x60, 0xae, 0xd0,\n+0x48, 0x1a, 0xee, 0x06, 0x30, 0x82, 0x03, 0x38, 0x30, 0x82, 0x02, 0x20, 0xa0, 0x03, 0x02, 0x01,\n+0x02, 0x02, 0x06, 0x20, 0x06, 0x05, 0x16, 0x70, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x52, 0x4f, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x08, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03,\n+0x55, 0x04, 0x0b, 0x13, 0x10, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x52, 0x4f,\n+0x4f, 0x54, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x37, 0x30, 0x34, 0x31,\n+0x37, 0x32, 0x30, 0x30, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x30, 0x37, 0x30, 0x34, 0x31, 0x37,\n+0x32, 0x30, 0x30, 0x34, 0x5a, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x52, 0x4f, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x63,\n+0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x13, 0x10, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x20,\n+0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,\n+0x01, 0x01, 0x00, 0xb7, 0x33, 0xb9, 0x7e, 0xc8, 0x25, 0x4a, 0x8e, 0xb5, 0xdb, 0xb4, 0x28, 0x1b,\n+0xaa, 0x57, 0x90, 0xe8, 0xd1, 0x22, 0xd3, 0x64, 0xba, 0xd3, 0x93, 0xe8, 0xd4, 0xac, 0x86, 0x61,\n+0x40, 0x6a, 0x60, 0x57, 0x68, 0x54, 0x84, 0x4d, 0xbc, 0x6a, 0x54, 0x02, 0x05, 0xff, 0xdf, 0x9b,\n+0x9a, 0x2a, 0xae, 0x5d, 0x07, 0x8f, 0x4a, 0xc3, 0x28, 0x7f, 0xef, 0xfb, 0x2b, 0xfa, 0x79, 0xf1,\n+0xc7, 0xad, 0xf0, 0x10, 0x53, 0x24, 0x90, 0x8b, 0x66, 0xc9, 0xa8, 0x88, 0xab, 0xaf, 0x5a, 0xa3,\n+0x00, 0xe9, 0xbe, 0xba, 0x46, 0xee, 0x5b, 0x73, 0x7b, 0x2c, 0x17, 0x82, 0x81, 0x5e, 0x62, 0x2c,\n+0xa1, 0x02, 0x65, 0xb3, 0xbd, 0xc5, 0x2b, 0x00, 0x7e, 0xc4, 0xfc, 0x03, 0x33, 0x57, 0x0d, 0xed,\n+0xe2, 0xfa, 0xce, 0x5d, 0x45, 0xd6, 0x38, 0xcd, 0x35, 0xb6, 0xb2, 0xc1, 0xd0, 0x9c, 0x81, 0x4a,\n+0xaa, 0xe4, 0xb2, 0x01, 0x5c, 0x1d, 0x8f, 0x5f, 0x99, 0xc4, 0xb1, 0xad, 0xdb, 0x88, 0x21, 0xeb,\n+0x90, 0x08, 0x82, 0x80, 0xf3, 0x30, 0xa3, 0x43, 0xe6, 0x90, 0x82, 0xae, 0x55, 0x28, 0x49, 0xed,\n+0x5b, 0xd7, 0xa9, 0x10, 0x38, 0x0e, 0xfe, 0x8f, 0x4c, 0x5b, 0x9b, 0x46, 0xea, 0x41, 0xf5, 0xb0,\n+0x08, 0x74, 0xc3, 0xd0, 0x88, 0x33, 0xb6, 0x7c, 0xd7, 0x74, 0xdf, 0xdc, 0x84, 0xd1, 0x43, 0x0e,\n+0x75, 0x39, 0xa1, 0x25, 0x40, 0x28, 0xea, 0x78, 0xcb, 0x0e, 0x2c, 0x2e, 0x39, 0x9d, 0x8c, 0x8b,\n+0x6e, 0x16, 0x1c, 0x2f, 0x26, 0x82, 0x10, 0xe2, 0xe3, 0x65, 0x94, 0x0a, 0x04, 0xc0, 0x5e, 0xf7,\n+0x5d, 0x5b, 0xf8, 0x10, 0xe2, 0xd0, 0xba, 0x7a, 0x4b, 0xfb, 0xde, 0x37, 0x00, 0x00, 0x1a, 0x5b,\n+0x28, 0xe3, 0xd2, 0x9c, 0x73, 0x3e, 0x32, 0x87, 0x98, 0xa1, 0xc9, 0x51, 0x2f, 0xd7, 0xde, 0xac,\n+0x33, 0xb3, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03,\n+0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, 0x1d, 0x06,\n+0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe0, 0x8c, 0x9b, 0xdb, 0x25, 0x49, 0xb3, 0xf1,\n+0x7c, 0x86, 0xd6, 0xb2, 0x42, 0x87, 0x0b, 0xd0, 0x6b, 0xa0, 0xd9, 0xe4, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,\n+0x3e, 0xd2, 0x1c, 0x89, 0x2e, 0x35, 0xfc, 0xf8, 0x75, 0xdd, 0xe6, 0x7f, 0x65, 0x88, 0xf4, 0x72,\n+0x4c, 0xc9, 0x2c, 0xd7, 0x32, 0x4e, 0xf3, 0xdd, 0x19, 0x79, 0x47, 0xbd, 0x8e, 0x3b, 0x5b, 0x93,\n+0x0f, 0x50, 0x49, 0x24, 0x13, 0x6b, 0x14, 0x06, 0x72, 0xef, 0x09, 0xd3, 0xa1, 0xa1, 0xe3, 0x40,\n+0x84, 0xc9, 0xe7, 0x18, 0x32, 0x74, 0x3c, 0x48, 0x6e, 0x0f, 0x9f, 0x4b, 0xd4, 0xf7, 0x1e, 0xd3,\n+0x93, 0x86, 0x64, 0x54, 0x97, 0x63, 0x72, 0x50, 0xd5, 0x55, 0xcf, 0xfa, 0x20, 0x93, 0x02, 0xa2,\n+0x9b, 0xc3, 0x23, 0x93, 0x4e, 0x16, 0x55, 0x76, 0xa0, 0x70, 0x79, 0x6d, 0xcd, 0x21, 0x1f, 0xcf,\n+0x2f, 0x2d, 0xbc, 0x19, 0xe3, 0x88, 0x31, 0xf8, 0x59, 0x1a, 0x81, 0x09, 0xc8, 0x97, 0xa6, 0x74,\n+0xc7, 0x60, 0xc4, 0x5b, 0xcc, 0x57, 0x8e, 0xb2, 0x75, 0xfd, 0x1b, 0x02, 0x09, 0xdb, 0x59, 0x6f,\n+0x72, 0x93, 0x69, 0xf7, 0x31, 0x41, 0xd6, 0x88, 0x38, 0xbf, 0x87, 0xb2, 0xbd, 0x16, 0x79, 0xf9,\n+0xaa, 0xe4, 0xbe, 0x88, 0x25, 0xdd, 0x61, 0x27, 0x23, 0x1c, 0xb5, 0x31, 0x07, 0x04, 0x36, 0xb4,\n+0x1a, 0x90, 0xbd, 0xa0, 0x74, 0x71, 0x50, 0x89, 0x6d, 0xbc, 0x14, 0xe3, 0x0f, 0x86, 0xae, 0xf1,\n+0xab, 0x3e, 0xc7, 0xa0, 0x09, 0xcc, 0xa3, 0x48, 0xd1, 0xe0, 0xdb, 0x64, 0xe7, 0x92, 0xb5, 0xcf,\n+0xaf, 0x72, 0x43, 0x70, 0x8b, 0xf9, 0xc3, 0x84, 0x3c, 0x13, 0xaa, 0x7e, 0x92, 0x9b, 0x57, 0x53,\n+0x93, 0xfa, 0x70, 0xc2, 0x91, 0x0e, 0x31, 0xf9, 0x9b, 0x67, 0x5d, 0xe9, 0x96, 0x38, 0x5e, 0x5f,\n+0xb3, 0x73, 0x4e, 0x88, 0x15, 0x67, 0xde, 0x9e, 0x76, 0x10, 0x62, 0x20, 0xbe, 0x55, 0x69, 0x95,\n+0x43, 0x00, 0x39, 0x4d, 0xf6, 0xee, 0xb0, 0x5a, 0x4e, 0x49, 0x44, 0x54, 0x58, 0x5f, 0x42, 0x83,\n+0x30, 0x82, 0x03, 0xbb, 0x30, 0x82, 0x02, 0xa3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x04,\n+0x44, 0xc0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,\n+0x00, 0x30, 0x7e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c,\n+0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x55, 0x6e, 0x69, 0x7a, 0x65,\n+0x74, 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x20,\n+0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43,\n+0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n+0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x22, 0x30,\n+0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43,\n+0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x30, 0x32, 0x32, 0x31, 0x32, 0x30, 0x37, 0x33,\n+0x37, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x32, 0x30, 0x37, 0x33, 0x37,\n+0x5a, 0x30, 0x7e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c,\n+0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x55, 0x6e, 0x69, 0x7a, 0x65,\n+0x74, 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x20,\n+0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43,\n+0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n+0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x22, 0x30,\n+0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43,\n+0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01,\n+0x01, 0x00, 0xe3, 0xfb, 0x7d, 0xa3, 0x72, 0xba, 0xc2, 0xf0, 0xc9, 0x14, 0x87, 0xf5, 0x6b, 0x01,\n+0x4e, 0xe1, 0x6e, 0x40, 0x07, 0xba, 0x6d, 0x27, 0x5d, 0x7f, 0xf7, 0x5b, 0x2d, 0xb3, 0x5a, 0xc7,\n+0x51, 0x5f, 0xab, 0xa4, 0x32, 0xa6, 0x61, 0x87, 0xb6, 0x6e, 0x0f, 0x86, 0xd2, 0x30, 0x02, 0x97,\n+0xf8, 0xd7, 0x69, 0x57, 0xa1, 0x18, 0x39, 0x5d, 0x6a, 0x64, 0x79, 0xc6, 0x01, 0x59, 0xac, 0x3c,\n+0x31, 0x4a, 0x38, 0x7c, 0xd2, 0x04, 0xd2, 0x4b, 0x28, 0xe8, 0x20, 0x5f, 0x3b, 0x07, 0xa2, 0xcc,\n+0x4d, 0x73, 0xdb, 0xf3, 0xae, 0x4f, 0xc7, 0x56, 0xd5, 0x5a, 0xa7, 0x96, 0x89, 0xfa, 0xf3, 0xab,\n+0x68, 0xd4, 0x23, 0x86, 0x59, 0x27, 0xcf, 0x09, 0x27, 0xbc, 0xac, 0x6e, 0x72, 0x83, 0x1c, 0x30,\n+0x72, 0xdf, 0xe0, 0xa2, 0xe9, 0xd2, 0xe1, 0x74, 0x75, 0x19, 0xbd, 0x2a, 0x9e, 0x7b, 0x15, 0x54,\n+0x04, 0x1b, 0xd7, 0x43, 0x39, 0xad, 0x55, 0x28, 0xc5, 0xe2, 0x1a, 0xbb, 0xf4, 0xc0, 0xe4, 0xae,\n+0x38, 0x49, 0x33, 0xcc, 0x76, 0x85, 0x9f, 0x39, 0x45, 0xd2, 0xa4, 0x9e, 0xf2, 0x12, 0x8c, 0x51,\n+0xf8, 0x7c, 0xe4, 0x2d, 0x7f, 0xf5, 0xac, 0x5f, 0xeb, 0x16, 0x9f, 0xb1, 0x2d, 0xd1, 0xba, 0xcc,\n+0x91, 0x42, 0x77, 0x4c, 0x25, 0xc9, 0x90, 0x38, 0x6f, 0xdb, 0xf0, 0xcc, 0xfb, 0x8e, 0x1e, 0x97,\n+0x59, 0x3e, 0xd5, 0x60, 0x4e, 0xe6, 0x05, 0x28, 0xed, 0x49, 0x79, 0x13, 0x4b, 0xba, 0x48, 0xdb,\n+0x2f, 0xf9, 0x72, 0xd3, 0x39, 0xca, 0xfe, 0x1f, 0xd8, 0x34, 0x72, 0xf5, 0xb4, 0x40, 0xcf, 0x31,\n+0x01, 0xc3, 0xec, 0xde, 0x11, 0x2d, 0x17, 0x5d, 0x1f, 0xb8, 0x50, 0xd1, 0x5e, 0x19, 0xa7, 0x69,\n+0xde, 0x07, 0x33, 0x28, 0xca, 0x50, 0x95, 0xf9, 0xa7, 0x54, 0xcb, 0x54, 0x86, 0x50, 0x45, 0xa9,\n+0xf9, 0x49, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55,\n+0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03,\n+0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x08, 0x76, 0xcd, 0xcb, 0x07, 0xff, 0x24, 0xf6, 0xc5,\n+0xcd, 0xed, 0xbb, 0x90, 0xbc, 0xe2, 0x84, 0x37, 0x46, 0x75, 0xf7, 0x30, 0x0e, 0x06, 0x03, 0x55,\n+0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa6,\n+0xa8, 0xad, 0x22, 0xce, 0x01, 0x3d, 0xa6, 0xa3, 0xff, 0x62, 0xd0, 0x48, 0x9d, 0x8b, 0x5e, 0x72,\n+0xb0, 0x78, 0x44, 0xe3, 0xdc, 0x1c, 0xaf, 0x09, 0xfd, 0x23, 0x48, 0xfa, 0xbd, 0x2a, 0xc4, 0xb9,\n+0x55, 0x04, 0xb5, 0x10, 0xa3, 0x8d, 0x27, 0xde, 0x0b, 0x82, 0x63, 0xd0, 0xee, 0xde, 0x0c, 0x37,\n+0x79, 0x41, 0x5b, 0x22, 0xb2, 0xb0, 0x9a, 0x41, 0x5c, 0xa6, 0x70, 0xe0, 0xd4, 0xd0, 0x77, 0xcb,\n+0x23, 0xd3, 0x00, 0xe0, 0x6c, 0x56, 0x2f, 0xe1, 0x69, 0x0d, 0x0d, 0xd9, 0xaa, 0xbf, 0x21, 0x81,\n+0x50, 0xd9, 0x06, 0xa5, 0xa8, 0xff, 0x95, 0x37, 0xd0, 0xaa, 0xfe, 0xe2, 0xb3, 0xf5, 0x99, 0x2d,\n+0x45, 0x84, 0x8a, 0xe5, 0x42, 0x09, 0xd7, 0x74, 0x02, 0x2f, 0xf7, 0x89, 0xd8, 0x99, 0xe9, 0xbc,\n+0x27, 0xd4, 0x47, 0x8d, 0xba, 0x0d, 0x46, 0x1c, 0x77, 0xcf, 0x14, 0xa4, 0x1c, 0xb9, 0xa4, 0x31,\n+0xc4, 0x9c, 0x28, 0x74, 0x03, 0x34, 0xff, 0x33, 0x19, 0x26, 0xa5, 0xe9, 0x0d, 0x74, 0xb7, 0x3e,\n+0x97, 0xc6, 0x76, 0xe8, 0x27, 0x96, 0xa3, 0x66, 0xdd, 0xe1, 0xae, 0xf2, 0x41, 0x5b, 0xca, 0x98,\n+0x56, 0x83, 0x73, 0x70, 0xe4, 0x86, 0x1a, 0xd2, 0x31, 0x41, 0xba, 0x2f, 0xbe, 0x2d, 0x13, 0x5a,\n+0x76, 0x6f, 0x4e, 0xe8, 0x4e, 0x81, 0x0e, 0x3f, 0x5b, 0x03, 0x22, 0xa0, 0x12, 0xbe, 0x66, 0x58,\n+0x11, 0x4a, 0xcb, 0x03, 0xc4, 0xb4, 0x2a, 0x2a, 0x2d, 0x96, 0x17, 0xe0, 0x39, 0x54, 0xbc, 0x48,\n+0xd3, 0x76, 0x27, 0x9d, 0x9a, 0x2d, 0x06, 0xa6, 0xc9, 0xec, 0x39, 0xd2, 0xab, 0xdb, 0x9f, 0x9a,\n+0x0b, 0x27, 0x02, 0x35, 0x29, 0xb1, 0x40, 0x95, 0xe7, 0xf9, 0xe8, 0x9c, 0x55, 0x88, 0x19, 0x46,\n+0xd6, 0xb7, 0x34, 0xf5, 0x7e, 0xce, 0x39, 0x9a, 0xd9, 0x38, 0xf1, 0x51, 0xf7, 0x4f, 0x2c, 0x30,\n+0x82, 0x04, 0x1d, 0x30, 0x82, 0x03, 0x05, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x4e, 0x81,\n+0x2d, 0x8a, 0x82, 0x65, 0xe0, 0x0b, 0x02, 0xee, 0x3e, 0x35, 0x02, 0x46, 0xe5, 0x3d, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x81,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30,\n+0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,\n+0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03,\n+0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41,\n+0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x1e, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n+0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,\n+0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30,\n+0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39,\n+0x5a, 0x30, 0x81, 0x81, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47,\n+0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61,\n+0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64,\n+0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44,\n+0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x27, 0x30, 0x25,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x65,\n+0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n+0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,\n+0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd0, 0x40, 0x8b, 0x8b, 0x72, 0xe3, 0x91, 0x1b, 0xf7, 0x51,\n+0xc1, 0x1b, 0x54, 0x04, 0x98, 0xd3, 0xa9, 0xbf, 0xc1, 0xe6, 0x8a, 0x5d, 0x3b, 0x87, 0xfb, 0xbb,\n+0x88, 0xce, 0x0d, 0xe3, 0x2f, 0x3f, 0x06, 0x96, 0xf0, 0xa2, 0x29, 0x50, 0x99, 0xae, 0xdb, 0x3b,\n+0xa1, 0x57, 0xb0, 0x74, 0x51, 0x71, 0xcd, 0xed, 0x42, 0x91, 0x4d, 0x41, 0xfe, 0xa9, 0xc8, 0xd8,\n+0x6a, 0x86, 0x77, 0x44, 0xbb, 0x59, 0x66, 0x97, 0x50, 0x5e, 0xb4, 0xd4, 0x2c, 0x70, 0x44, 0xcf,\n+0xda, 0x37, 0x95, 0x42, 0x69, 0x3c, 0x30, 0xc4, 0x71, 0xb3, 0x52, 0xf0, 0x21, 0x4d, 0xa1, 0xd8,\n+0xba, 0x39, 0x7c, 0x1c, 0x9e, 0xa3, 0x24, 0x9d, 0xf2, 0x83, 0x16, 0x98, 0xaa, 0x16, 0x7c, 0x43,\n+0x9b, 0x15, 0x5b, 0xb7, 0xae, 0x34, 0x91, 0xfe, 0xd4, 0x62, 0x26, 0x18, 0x46, 0x9a, 0x3f, 0xeb,\n+0xc1, 0xf9, 0xf1, 0x90, 0x57, 0xeb, 0xac, 0x7a, 0x0d, 0x8b, 0xdb, 0x72, 0x30, 0x6a, 0x66, 0xd5,\n+0xe0, 0x46, 0xa3, 0x70, 0xdc, 0x68, 0xd9, 0xff, 0x04, 0x48, 0x89, 0x77, 0xde, 0xb5, 0xe9, 0xfb,\n+0x67, 0x6d, 0x41, 0xe9, 0xbc, 0x39, 0xbd, 0x32, 0xd9, 0x62, 0x02, 0xf1, 0xb1, 0xa8, 0x3d, 0x6e,\n+0x37, 0x9c, 0xe2, 0x2f, 0xe2, 0xd3, 0xa2, 0x26, 0x8b, 0xc6, 0xb8, 0x55, 0x43, 0x88, 0xe1, 0x23,\n+0x3e, 0xa5, 0xd2, 0x24, 0x39, 0x6a, 0x47, 0xab, 0x00, 0xd4, 0xa1, 0xb3, 0xa9, 0x25, 0xfe, 0x0d,\n+0x3f, 0xa7, 0x1d, 0xba, 0xd3, 0x51, 0xc1, 0x0b, 0xa4, 0xda, 0xac, 0x38, 0xef, 0x55, 0x50, 0x24,\n+0x05, 0x65, 0x46, 0x93, 0x34, 0x4f, 0x2d, 0x8d, 0xad, 0xc6, 0xd4, 0x21, 0x19, 0xd2, 0x8e, 0xca,\n+0x05, 0x61, 0x71, 0x07, 0x73, 0x47, 0xe5, 0x8a, 0x19, 0x12, 0xbd, 0x04, 0x4d, 0xce, 0x4e, 0x9c,\n+0xa5, 0x48, 0xac, 0xbb, 0x26, 0xf7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x8e, 0x30, 0x81,\n+0x8b, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x0b, 0x58, 0xe5, 0x8b,\n+0xc6, 0x4c, 0x15, 0x37, 0xa4, 0x40, 0xa9, 0x30, 0xa9, 0x21, 0xbe, 0x47, 0x36, 0x5a, 0x56, 0xff,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n+0xff, 0x30, 0x49, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x42, 0x30, 0x40, 0x30, 0x3e, 0xa0, 0x3c,\n+0xa0, 0x3a, 0x86, 0x38, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63,\n+0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x4f, 0x4d, 0x4f,\n+0x44, 0x4f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41,\n+0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,\n+0x3e, 0x98, 0x9e, 0x9b, 0xf6, 0x1b, 0xe9, 0xd7, 0x39, 0xb7, 0x78, 0xae, 0x1d, 0x72, 0x18, 0x49,\n+0xd3, 0x87, 0xe4, 0x43, 0x82, 0xeb, 0x3f, 0xc9, 0xaa, 0xf5, 0xa8, 0xb5, 0xef, 0x55, 0x7c, 0x21,\n+0x52, 0x65, 0xf9, 0xd5, 0x0d, 0xe1, 0x6c, 0xf4, 0x3e, 0x8c, 0x93, 0x73, 0x91, 0x2e, 0x02, 0xc4,\n+0x4e, 0x07, 0x71, 0x6f, 0xc0, 0x8f, 0x38, 0x61, 0x08, 0xa8, 0x1e, 0x81, 0x0a, 0xc0, 0x2f, 0x20,\n+0x2f, 0x41, 0x8b, 0x91, 0xdc, 0x48, 0x45, 0xbc, 0xf1, 0xc6, 0xde, 0xba, 0x76, 0x6b, 0x33, 0xc8,\n+0x00, 0x2d, 0x31, 0x46, 0x4c, 0xed, 0xe7, 0x9d, 0xcf, 0x88, 0x94, 0xff, 0x33, 0xc0, 0x56, 0xe8,\n+0x24, 0x86, 0x26, 0xb8, 0xd8, 0x38, 0x38, 0xdf, 0x2a, 0x6b, 0xdd, 0x12, 0xcc, 0xc7, 0x3f, 0x47,\n+0x17, 0x4c, 0xa2, 0xc2, 0x06, 0x96, 0x09, 0xd6, 0xdb, 0xfe, 0x3f, 0x3c, 0x46, 0x41, 0xdf, 0x58,\n+0xe2, 0x56, 0x0f, 0x3c, 0x3b, 0xc1, 0x1c, 0x93, 0x35, 0xd9, 0x38, 0x52, 0xac, 0xee, 0xc8, 0xec,\n+0x2e, 0x30, 0x4e, 0x94, 0x35, 0xb4, 0x24, 0x1f, 0x4b, 0x78, 0x69, 0xda, 0xf2, 0x02, 0x38, 0xcc,\n+0x95, 0x52, 0x93, 0xf0, 0x70, 0x25, 0x59, 0x9c, 0x20, 0x67, 0xc4, 0xee, 0xf9, 0x8b, 0x57, 0x61,\n+0xf4, 0x92, 0x76, 0x7d, 0x3f, 0x84, 0x8d, 0x55, 0xb7, 0xe8, 0xe5, 0xac, 0xd5, 0xf1, 0xf5, 0x19,\n+0x56, 0xa6, 0x5a, 0xfb, 0x90, 0x1c, 0xaf, 0x93, 0xeb, 0xe5, 0x1c, 0xd4, 0x67, 0x97, 0x5d, 0x04,\n+0x0e, 0xbe, 0x0b, 0x83, 0xa6, 0x17, 0x83, 0xb9, 0x30, 0x12, 0xa0, 0xc5, 0x33, 0x15, 0x05, 0xb9,\n+0x0d, 0xfb, 0xc7, 0x05, 0x76, 0xe3, 0xd8, 0x4a, 0x8d, 0xfc, 0x34, 0x17, 0xa3, 0xc6, 0x21, 0x28,\n+0xbe, 0x30, 0x45, 0x31, 0x1e, 0xc7, 0x78, 0xbe, 0x58, 0x61, 0x38, 0xac, 0x3b, 0xe2, 0x01, 0x65,\n+0x30, 0x82, 0x03, 0xa1, 0x30, 0x82, 0x02, 0x89, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b, 0x04,\n+0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x85, 0xaa, 0x2d, 0x48, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x18, 0x30, 0x16, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x43, 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74,\n+0x2c, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16,\n+0x43, 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61,\n+0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32, 0x31, 0x35,\n+0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x31, 0x32, 0x31, 0x35, 0x30,\n+0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x3b, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x0f, 0x43, 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49,\n+0x6e, 0x63, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x43, 0x79, 0x62,\n+0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52,\n+0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02,\n+0x82, 0x01, 0x01, 0x00, 0xf8, 0xc8, 0xbc, 0xbd, 0x14, 0x50, 0x66, 0x13, 0xff, 0xf0, 0xd3, 0x79,\n+0xec, 0x23, 0xf2, 0xb7, 0x1a, 0xc7, 0x8e, 0x85, 0xf1, 0x12, 0x73, 0xa6, 0x19, 0xaa, 0x10, 0xdb,\n+0x9c, 0xa2, 0x65, 0x74, 0x5a, 0x77, 0x3e, 0x51, 0x7d, 0x56, 0xf6, 0xdc, 0x23, 0xb6, 0xd4, 0xed,\n+0x5f, 0x58, 0xb1, 0x37, 0x4d, 0xd5, 0x49, 0x0e, 0x6e, 0xf5, 0x6a, 0x87, 0xd6, 0xd2, 0x8c, 0xd2,\n+0x27, 0xc6, 0xe2, 0xff, 0x36, 0x9f, 0x98, 0x65, 0xa0, 0x13, 0x4e, 0xc6, 0x2a, 0x64, 0x9b, 0xd5,\n+0x90, 0x12, 0xcf, 0x14, 0x06, 0xf4, 0x3b, 0xe3, 0xd4, 0x28, 0xbe, 0xe8, 0x0e, 0xf8, 0xab, 0x4e,\n+0x48, 0x94, 0x6d, 0x8e, 0x95, 0x31, 0x10, 0x5c, 0xed, 0xa2, 0x2d, 0xbd, 0xd5, 0x3a, 0x6d, 0xb2,\n+0x1c, 0xbb, 0x60, 0xc0, 0x46, 0x4b, 0x01, 0xf5, 0x49, 0xae, 0x7e, 0x46, 0x8a, 0xd0, 0x74, 0x8d,\n+0xa1, 0x0c, 0x02, 0xce, 0xee, 0xfc, 0xe7, 0x8f, 0xb8, 0x6b, 0x66, 0xf3, 0x7f, 0x44, 0x00, 0xbf,\n+0x66, 0x25, 0x14, 0x2b, 0xdd, 0x10, 0x30, 0x1d, 0x07, 0x96, 0x3f, 0x4d, 0xf6, 0x6b, 0xb8, 0x8f,\n+0xb7, 0x7b, 0x0c, 0xa5, 0x38, 0xeb, 0xde, 0x47, 0xdb, 0xd5, 0x5d, 0x39, 0xfc, 0x88, 0xa7, 0xf3,\n+0xd7, 0x2a, 0x74, 0xf1, 0xe8, 0x5a, 0xa2, 0x3b, 0x9f, 0x50, 0xba, 0xa6, 0x8c, 0x45, 0x35, 0xc2,\n+0x50, 0x65, 0x95, 0xdc, 0x63, 0x82, 0xef, 0xdd, 0xbf, 0x77, 0x4d, 0x9c, 0x62, 0xc9, 0x63, 0x73,\n+0x16, 0xd0, 0x29, 0x0f, 0x49, 0xa9, 0x48, 0xf0, 0xb3, 0xaa, 0xb7, 0x6c, 0xc5, 0xa7, 0x30, 0x39,\n+0x40, 0x5d, 0xae, 0xc4, 0xe2, 0x5d, 0x26, 0x53, 0xf0, 0xce, 0x1c, 0x23, 0x08, 0x61, 0xa8, 0x94,\n+0x19, 0xba, 0x04, 0x62, 0x40, 0xec, 0x1f, 0x38, 0x70, 0x77, 0x12, 0x06, 0x71, 0xa7, 0x30, 0x18,\n+0x5d, 0x25, 0x27, 0xa5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xa5, 0x30, 0x81, 0xa2, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb6, 0x08, 0x7b, 0x0d, 0x7a,\n+0xcc, 0xac, 0x20, 0x4c, 0x86, 0x56, 0x32, 0x5e, 0xcf, 0xab, 0x6e, 0x85, 0x2d, 0x70, 0x57, 0x30,\n+0x3f, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x38, 0x30, 0x36, 0x30, 0x34, 0xa0, 0x32, 0xa0, 0x30,\n+0x86, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x32, 0x2e, 0x70, 0x75,\n+0x62, 0x6c, 0x69, 0x63, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,\n+0x72, 0x6c, 0x2f, 0x63, 0x74, 0x2f, 0x63, 0x74, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x72, 0x6c,\n+0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb6, 0x08, 0x7b,\n+0x0d, 0x7a, 0xcc, 0xac, 0x20, 0x4c, 0x86, 0x56, 0x32, 0x5e, 0xcf, 0xab, 0x6e, 0x85, 0x2d, 0x70,\n+0x57, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,\n+0x03, 0x82, 0x01, 0x01, 0x00, 0x56, 0xef, 0x0a, 0x23, 0xa0, 0x54, 0x4e, 0x95, 0x97, 0xc9, 0xf8,\n+0x89, 0xda, 0x45, 0xc1, 0xd4, 0xa3, 0x00, 0x25, 0xf4, 0x1f, 0x13, 0xab, 0xb7, 0xa3, 0x85, 0x58,\n+0x69, 0xc2, 0x30, 0xad, 0xd8, 0x15, 0x8a, 0x2d, 0xe3, 0xc9, 0xcd, 0x81, 0x5a, 0xf8, 0x73, 0x23,\n+0x5a, 0xa7, 0x7c, 0x05, 0xf3, 0xfd, 0x22, 0x3b, 0x0e, 0xd1, 0x06, 0xc4, 0xdb, 0x36, 0x4c, 0x73,\n+0x04, 0x8e, 0xe5, 0xb0, 0x22, 0xe4, 0xc5, 0xf3, 0x2e, 0xa5, 0xd9, 0x23, 0xe3, 0xb8, 0x4e, 0x4a,\n+0x20, 0xa7, 0x6e, 0x02, 0x24, 0x9f, 0x22, 0x60, 0x67, 0x7b, 0x8b, 0x1d, 0x72, 0x09, 0xc5, 0x31,\n+0x5c, 0xe9, 0x79, 0x9f, 0x80, 0x47, 0x3d, 0xad, 0xa1, 0x0b, 0x07, 0x14, 0x3d, 0x47, 0xff, 0x03,\n+0x69, 0x1a, 0x0c, 0x0b, 0x44, 0xe7, 0x63, 0x25, 0xa7, 0x7f, 0xb2, 0xc9, 0xb8, 0x76, 0x84, 0xed,\n+0x23, 0xf6, 0x7d, 0x07, 0xab, 0x45, 0x7e, 0xd3, 0xdf, 0xb3, 0xbf, 0xe9, 0x8a, 0xb6, 0xcd, 0xa8,\n+0xa2, 0x67, 0x2b, 0x52, 0xd5, 0xb7, 0x65, 0xf0, 0x39, 0x4c, 0x63, 0xa0, 0x91, 0x79, 0x93, 0x52,\n+0x0f, 0x54, 0xdd, 0x83, 0xbb, 0x9f, 0xd1, 0x8f, 0xa7, 0x53, 0x73, 0xc3, 0xcb, 0xff, 0x30, 0xec,\n+0x7c, 0x04, 0xb8, 0xd8, 0x44, 0x1f, 0x93, 0x5f, 0x71, 0x09, 0x22, 0xb7, 0x6e, 0x3e, 0xea, 0x1c,\n+0x03, 0x4e, 0x9d, 0x1a, 0x20, 0x61, 0xfb, 0x81, 0x37, 0xec, 0x5e, 0xfc, 0x0a, 0x45, 0xab, 0xd7,\n+0xe7, 0x17, 0x55, 0xd0, 0xa0, 0xea, 0x60, 0x9b, 0xa6, 0xf6, 0xe3, 0x8c, 0x5b, 0x29, 0xc2, 0x06,\n+0x60, 0x14, 0x9d, 0x2d, 0x97, 0x4c, 0xa9, 0x93, 0x15, 0x9d, 0x61, 0xc4, 0x01, 0x5f, 0x48, 0xd6,\n+0x58, 0xbd, 0x56, 0x31, 0x12, 0x4e, 0x11, 0xc8, 0x21, 0xe0, 0xb3, 0x11, 0x91, 0x65, 0xdb, 0xb4,\n+0xa6, 0x88, 0x38, 0xce, 0x55, 0x30, 0x82, 0x02, 0x89, 0x30, 0x82, 0x02, 0x0f, 0xa0, 0x03, 0x02,\n+0x01, 0x02, 0x02, 0x10, 0x1f, 0x47, 0xaf, 0xaa, 0x62, 0x00, 0x70, 0x50, 0x54, 0x4c, 0x01, 0x9e,\n+0x9b, 0x63, 0x99, 0x2a, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03,\n+0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42,\n+0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74,\n+0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31,\n+0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f,\n+0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x45, 0x43, 0x43,\n+0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41,\n+0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x33,\n+0x30, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31,\n+0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04,\n+0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68,\n+0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07,\n+0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69,\n+0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f,\n+0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b,\n+0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x03, 0x47, 0x7b, 0x2f, 0x75, 0xc9, 0x82, 0x15,\n+0x85, 0xfb, 0x75, 0xe4, 0x91, 0x16, 0xd4, 0xab, 0x62, 0x99, 0xf5, 0x3e, 0x52, 0x0b, 0x06, 0xce,\n+0x41, 0x00, 0x7f, 0x97, 0xe1, 0x0a, 0x24, 0x3c, 0x1d, 0x01, 0x04, 0xee, 0x3d, 0xd2, 0x8d, 0x09,\n+0x97, 0x0c, 0xe0, 0x75, 0xe4, 0xfa, 0xfb, 0x77, 0x8a, 0x2a, 0xf5, 0x03, 0x60, 0x4b, 0x36, 0x8b,\n+0x16, 0x23, 0x16, 0xad, 0x09, 0x71, 0xf4, 0x4a, 0xf4, 0x28, 0x50, 0xb4, 0xfe, 0x88, 0x1c, 0x6e,\n+0x3f, 0x6c, 0x2f, 0x2f, 0x09, 0x59, 0x5b, 0xa5, 0x5b, 0x0b, 0x33, 0x99, 0xe2, 0xc3, 0x3d, 0x89,\n+0xf9, 0x6a, 0x2c, 0xef, 0xb2, 0xd3, 0x06, 0xe9, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03,\n+0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x75, 0x71, 0xa7, 0x19, 0x48, 0x19, 0xbc, 0x9d, 0x9d,\n+0xea, 0x41, 0x47, 0xdf, 0x94, 0xc4, 0x48, 0x77, 0x99, 0xd3, 0x79, 0x30, 0x0e, 0x06, 0x03, 0x55,\n+0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55,\n+0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08,\n+0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x31, 0x00,\n+0xef, 0x03, 0x5b, 0x7a, 0xac, 0xb7, 0x78, 0x0a, 0x72, 0xb7, 0x88, 0xdf, 0xff, 0xb5, 0x46, 0x14,\n+0x09, 0x0a, 0xfa, 0xa0, 0xe6, 0x7d, 0x08, 0xc6, 0x1a, 0x87, 0xbd, 0x18, 0xa8, 0x73, 0xbd, 0x26,\n+0xca, 0x60, 0x0c, 0x9d, 0xce, 0x99, 0x9f, 0xcf, 0x5c, 0x0f, 0x30, 0xe1, 0xbe, 0x14, 0x31, 0xea,\n+0x02, 0x30, 0x14, 0xf4, 0x93, 0x3c, 0x49, 0xa7, 0x33, 0x7a, 0x90, 0x46, 0x47, 0xb3, 0x63, 0x7d,\n+0x13, 0x9b, 0x4e, 0xb7, 0x6f, 0x18, 0x37, 0x80, 0x53, 0xfe, 0xdd, 0x20, 0xe0, 0x35, 0x9a, 0x36,\n+0xd1, 0xc7, 0x01, 0xb9, 0xe6, 0xdc, 0xdd, 0xf3, 0xff, 0x1d, 0x2c, 0x3a, 0x16, 0x57, 0xd9, 0x92,\n+0x39, 0xd6, 0x30, 0x82, 0x03, 0xb7, 0x30, 0x82, 0x02, 0x9f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x10, 0x0c, 0xe7, 0xe0, 0xe5, 0x17, 0xd8, 0x46, 0xfe, 0x8f, 0xe5, 0x60, 0xfc, 0x1b, 0xf0, 0x30,\n+0x39, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,\n+0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65,\n+0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,\n+0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f,\n+0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69,\n+0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x31,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, 0x31, 0x31, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30,\n+0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69,\n+0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75,\n+0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82,\n+0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xad,\n+0x0e, 0x15, 0xce, 0xe4, 0x43, 0x80, 0x5c, 0xb1, 0x87, 0xf3, 0xb7, 0x60, 0xf9, 0x71, 0x12, 0xa5,\n+0xae, 0xdc, 0x26, 0x94, 0x88, 0xaa, 0xf4, 0xce, 0xf5, 0x20, 0x39, 0x28, 0x58, 0x60, 0x0c, 0xf8,\n+0x80, 0xda, 0xa9, 0x15, 0x95, 0x32, 0x61, 0x3c, 0xb5, 0xb1, 0x28, 0x84, 0x8a, 0x8a, 0xdc, 0x9f,\n+0x0a, 0x0c, 0x83, 0x17, 0x7a, 0x8f, 0x90, 0xac, 0x8a, 0xe7, 0x79, 0x53, 0x5c, 0x31, 0x84, 0x2a,\n+0xf6, 0x0f, 0x98, 0x32, 0x36, 0x76, 0xcc, 0xde, 0xdd, 0x3c, 0xa8, 0xa2, 0xef, 0x6a, 0xfb, 0x21,\n+0xf2, 0x52, 0x61, 0xdf, 0x9f, 0x20, 0xd7, 0x1f, 0xe2, 0xb1, 0xd9, 0xfe, 0x18, 0x64, 0xd2, 0x12,\n+0x5b, 0x5f, 0xf9, 0x58, 0x18, 0x35, 0xbc, 0x47, 0xcd, 0xa1, 0x36, 0xf9, 0x6b, 0x7f, 0xd4, 0xb0,\n+0x38, 0x3e, 0xc1, 0x1b, 0xc3, 0x8c, 0x33, 0xd9, 0xd8, 0x2f, 0x18, 0xfe, 0x28, 0x0f, 0xb3, 0xa7,\n+0x83, 0xd6, 0xc3, 0x6e, 0x44, 0xc0, 0x61, 0x35, 0x96, 0x16, 0xfe, 0x59, 0x9c, 0x8b, 0x76, 0x6d,\n+0xd7, 0xf1, 0xa2, 0x4b, 0x0d, 0x2b, 0xff, 0x0b, 0x72, 0xda, 0x9e, 0x60, 0xd0, 0x8e, 0x90, 0x35,\n+0xc6, 0x78, 0x55, 0x87, 0x20, 0xa1, 0xcf, 0xe5, 0x6d, 0x0a, 0xc8, 0x49, 0x7c, 0x31, 0x98, 0x33,\n+0x6c, 0x22, 0xe9, 0x87, 0xd0, 0x32, 0x5a, 0xa2, 0xba, 0x13, 0x82, 0x11, 0xed, 0x39, 0x17, 0x9d,\n+0x99, 0x3a, 0x72, 0xa1, 0xe6, 0xfa, 0xa4, 0xd9, 0xd5, 0x17, 0x31, 0x75, 0xae, 0x85, 0x7d, 0x22,\n+0xae, 0x3f, 0x01, 0x46, 0x86, 0xf6, 0x28, 0x79, 0xc8, 0xb1, 0xda, 0xe4, 0x57, 0x17, 0xc4, 0x7e,\n+0x1c, 0x0e, 0xb0, 0xb4, 0x92, 0xa6, 0x56, 0xb3, 0xbd, 0xb2, 0x97, 0xed, 0xaa, 0xa7, 0xf0, 0xb7,\n+0xc5, 0xa8, 0x3f, 0x95, 0x16, 0xd0, 0xff, 0xa1, 0x96, 0xeb, 0x08, 0x5f, 0x18, 0x77, 0x4f, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n+0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,\n+0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\n+0x04, 0x16, 0x04, 0x14, 0x45, 0xeb, 0xa2, 0xaf, 0xf4, 0x92, 0xcb, 0x82, 0x31, 0x2d, 0x51, 0x8b,\n+0xa7, 0xa7, 0x21, 0x9d, 0xf3, 0x6d, 0xc8, 0x0f, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04,\n+0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0xeb, 0xa2, 0xaf, 0xf4, 0x92, 0xcb, 0x82, 0x31, 0x2d, 0x51,\n+0x8b, 0xa7, 0xa7, 0x21, 0x9d, 0xf3, 0x6d, 0xc8, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa2, 0x0e, 0xbc,\n+0xdf, 0xe2, 0xed, 0xf0, 0xe3, 0x72, 0x73, 0x7a, 0x64, 0x94, 0xbf, 0xf7, 0x72, 0x66, 0xd8, 0x32,\n+0xe4, 0x42, 0x75, 0x62, 0xae, 0x87, 0xeb, 0xf2, 0xd5, 0xd9, 0xde, 0x56, 0xb3, 0x9f, 0xcc, 0xce,\n+0x14, 0x28, 0xb9, 0x0d, 0x97, 0x60, 0x5c, 0x12, 0x4c, 0x58, 0xe4, 0xd3, 0x3d, 0x83, 0x49, 0x45,\n+0x58, 0x97, 0x35, 0x69, 0x1a, 0xa8, 0x47, 0xea, 0x56, 0xc6, 0x79, 0xab, 0x12, 0xd8, 0x67, 0x81,\n+0x84, 0xdf, 0x7f, 0x09, 0x3c, 0x94, 0xe6, 0xb8, 0x26, 0x2c, 0x20, 0xbd, 0x3d, 0xb3, 0x28, 0x89,\n+0xf7, 0x5f, 0xff, 0x22, 0xe2, 0x97, 0x84, 0x1f, 0xe9, 0x65, 0xef, 0x87, 0xe0, 0xdf, 0xc1, 0x67,\n+0x49, 0xb3, 0x5d, 0xeb, 0xb2, 0x09, 0x2a, 0xeb, 0x26, 0xed, 0x78, 0xbe, 0x7d, 0x3f, 0x2b, 0xf3,\n+0xb7, 0x26, 0x35, 0x6d, 0x5f, 0x89, 0x01, 0xb6, 0x49, 0x5b, 0x9f, 0x01, 0x05, 0x9b, 0xab, 0x3d,\n+0x25, 0xc1, 0xcc, 0xb6, 0x7f, 0xc2, 0xf1, 0x6f, 0x86, 0xc6, 0xfa, 0x64, 0x68, 0xeb, 0x81, 0x2d,\n+0x94, 0xeb, 0x42, 0xb7, 0xfa, 0x8c, 0x1e, 0xdd, 0x62, 0xf1, 0xbe, 0x50, 0x67, 0xb7, 0x6c, 0xbd,\n+0xf3, 0xf1, 0x1f, 0x6b, 0x0c, 0x36, 0x07, 0x16, 0x7f, 0x37, 0x7c, 0xa9, 0x5b, 0x6d, 0x7a, 0xf1,\n+0x12, 0x46, 0x60, 0x83, 0xd7, 0x27, 0x04, 0xbe, 0x4b, 0xce, 0x97, 0xbe, 0xc3, 0x67, 0x2a, 0x68,\n+0x11, 0xdf, 0x80, 0xe7, 0x0c, 0x33, 0x66, 0xbf, 0x13, 0x0d, 0x14, 0x6e, 0xf3, 0x7f, 0x1f, 0x63,\n+0x10, 0x1e, 0xfa, 0x8d, 0x1b, 0x25, 0x6d, 0x6c, 0x8f, 0xa5, 0xb7, 0x61, 0x01, 0xb1, 0xd2, 0xa3,\n+0x26, 0xa1, 0x10, 0x71, 0x9d, 0xad, 0xe2, 0xc3, 0xf9, 0xc3, 0x99, 0x51, 0xb7, 0x2b, 0x07, 0x08,\n+0xce, 0x2e, 0xe6, 0x50, 0xb2, 0xa7, 0xfa, 0x0a, 0x45, 0x2f, 0xa2, 0xf0, 0xf2, 0x30, 0x82, 0x03,\n+0x96, 0x30, 0x82, 0x02, 0x7e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0b, 0x93, 0x1c, 0x3a,\n+0xd6, 0x39, 0x67, 0xea, 0x67, 0x23, 0xbf, 0xc3, 0xaf, 0x9a, 0xf4, 0x4b, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x65, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e,\n+0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e,\n+0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20,\n+0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30,\n+0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x35, 0x31, 0x32, 0x30, 0x30, 0x30,\n+0x30, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n+0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69,\n+0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04,\n+0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e,\n+0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69,\n+0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49,\n+0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f,\n+0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd9, 0xe7, 0x28, 0x2f, 0x52, 0x3f,\n+0x36, 0x72, 0x49, 0x88, 0x93, 0x34, 0xf3, 0xf8, 0x6a, 0x1e, 0x31, 0x54, 0x80, 0x9f, 0xad, 0x54,\n+0x41, 0xb5, 0x47, 0xdf, 0x96, 0xa8, 0xd4, 0xaf, 0x80, 0x2d, 0xb9, 0x0a, 0xcf, 0x75, 0xfd, 0x89,\n+0xa5, 0x7d, 0x24, 0xfa, 0xe3, 0x22, 0x0c, 0x2b, 0xbc, 0x95, 0x17, 0x0b, 0x33, 0xbf, 0x19, 0x4d,\n+0x41, 0x06, 0x90, 0x00, 0xbd, 0x0c, 0x4d, 0x10, 0xfe, 0x07, 0xb5, 0xe7, 0x1c, 0x6e, 0x22, 0x55,\n+0x31, 0x65, 0x97, 0xbd, 0xd3, 0x17, 0xd2, 0x1e, 0x62, 0xf3, 0xdb, 0xea, 0x6c, 0x50, 0x8c, 0x3f,\n+0x84, 0x0c, 0x96, 0xcf, 0xb7, 0xcb, 0x03, 0xe0, 0xca, 0x6d, 0xa1, 0x14, 0x4c, 0x1b, 0x89, 0xdd,\n+0xed, 0x00, 0xb0, 0x52, 0x7c, 0xaf, 0x91, 0x6c, 0xb1, 0x38, 0x13, 0xd1, 0xe9, 0x12, 0x08, 0xc0,\n+0x00, 0xb0, 0x1c, 0x2b, 0x11, 0xda, 0x77, 0x70, 0x36, 0x9b, 0xae, 0xce, 0x79, 0x87, 0xdc, 0x82,\n+0x70, 0xe6, 0x09, 0x74, 0x70, 0x55, 0x69, 0xaf, 0xa3, 0x68, 0x9f, 0xbf, 0xdd, 0xb6, 0x79, 0xb3,\n+0xf2, 0x9d, 0x70, 0x29, 0x55, 0xf4, 0xab, 0xff, 0x95, 0x61, 0xf3, 0xc9, 0x40, 0x6f, 0x1d, 0xd1,\n+0xbe, 0x93, 0xbb, 0xd3, 0x88, 0x2a, 0xbb, 0x9d, 0xbf, 0x72, 0x5a, 0x56, 0x71, 0x3b, 0x3f, 0xd4,\n+0xf3, 0xd1, 0x0a, 0xfe, 0x28, 0xef, 0xa3, 0xee, 0xd9, 0x99, 0xaf, 0x03, 0xd3, 0x8f, 0x60, 0xb7,\n+0xf2, 0x92, 0xa1, 0xb1, 0xbd, 0x89, 0x89, 0x1f, 0x30, 0xcd, 0xc3, 0xa6, 0x2e, 0x62, 0x33, 0xae,\n+0x16, 0x02, 0x77, 0x44, 0x5a, 0xe7, 0x81, 0x0a, 0x3c, 0xa7, 0x44, 0x2e, 0x79, 0xb8, 0x3f, 0x04,\n+0xbc, 0x5c, 0xa0, 0x87, 0xe1, 0x1b, 0xaf, 0x51, 0x8e, 0xcd, 0xec, 0x2c, 0xfa, 0xf8, 0xfe, 0x6d,\n+0xf0, 0x3a, 0x7c, 0xaa, 0x8b, 0xe4, 0x67, 0x95, 0x31, 0x8d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n+0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xce,\n+0xc3, 0x4a, 0xb9, 0x99, 0x55, 0xf2, 0xb8, 0xdb, 0x60, 0xbf, 0xa9, 0x7e, 0xbd, 0x56, 0xb5, 0x97,\n+0x36, 0xa7, 0xd6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n+0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xca, 0xa5, 0x55, 0x8c, 0xe3, 0xc8, 0x41, 0x6e, 0x69,\n+0x27, 0xa7, 0x75, 0x11, 0xef, 0x3c, 0x86, 0x36, 0x6f, 0xd2, 0x9d, 0xc6, 0x78, 0x38, 0x1d, 0x69,\n+0x96, 0xa2, 0x92, 0x69, 0x2e, 0x38, 0x6c, 0x9b, 0x7d, 0x04, 0xd4, 0x89, 0xa5, 0xb1, 0x31, 0x37,\n+0x8a, 0xc9, 0x21, 0xcc, 0xab, 0x6c, 0xcd, 0x8b, 0x1c, 0x9a, 0xd6, 0xbf, 0x48, 0xd2, 0x32, 0x66,\n+0xc1, 0x8a, 0xc0, 0xf3, 0x2f, 0x3a, 0xef, 0xc0, 0xe3, 0xd4, 0x91, 0x86, 0xd1, 0x50, 0xe3, 0x03,\n+0xdb, 0x73, 0x77, 0x6f, 0x4a, 0x39, 0x53, 0xed, 0xde, 0x26, 0xc7, 0xb5, 0x7d, 0xaf, 0x2b, 0x42,\n+0xd1, 0x75, 0x62, 0xe3, 0x4a, 0x2b, 0x02, 0xc7, 0x50, 0x4b, 0xe0, 0x69, 0xe2, 0x96, 0x6c, 0x0e,\n+0x44, 0x66, 0x10, 0x44, 0x8f, 0xad, 0x05, 0xeb, 0xf8, 0x79, 0xac, 0xa6, 0x1b, 0xe8, 0x37, 0x34,\n+0x9d, 0x53, 0xc9, 0x61, 0xaa, 0xa2, 0x52, 0xaf, 0x4a, 0x70, 0x16, 0x86, 0xc2, 0x3a, 0xc8, 0xb1,\n+0x13, 0x70, 0x36, 0xd8, 0xcf, 0xee, 0xf4, 0x0a, 0x34, 0xd5, 0x5b, 0x4c, 0xfd, 0x07, 0x9c, 0xa2,\n+0xba, 0xd9, 0x01, 0x72, 0x5c, 0xf3, 0x4d, 0xc1, 0xdd, 0x0e, 0xb1, 0x1c, 0x0d, 0xc4, 0x63, 0xbe,\n+0xad, 0xf4, 0x14, 0xfb, 0x89, 0xec, 0xa2, 0x41, 0x0e, 0x4c, 0xcc, 0xc8, 0x57, 0x40, 0xd0, 0x6e,\n+0x03, 0xaa, 0xcd, 0x0c, 0x8e, 0x89, 0x99, 0x99, 0x6c, 0xf0, 0x3c, 0x30, 0xaf, 0x38, 0xdf, 0x6f,\n+0xbc, 0xa3, 0xbe, 0x29, 0x20, 0x27, 0xab, 0x74, 0xff, 0x13, 0x22, 0x78, 0xde, 0x97, 0x52, 0x55,\n+0x1e, 0x83, 0xb5, 0x54, 0x20, 0x03, 0xee, 0xae, 0xc0, 0x4f, 0x56, 0xde, 0x37, 0xcc, 0xc3, 0x7f,\n+0xaa, 0x04, 0x27, 0xbb, 0xd3, 0x77, 0xb8, 0x62, 0xdb, 0x17, 0x7c, 0x9c, 0x28, 0x22, 0x13, 0x73,\n+0x6c, 0xcf, 0x26, 0xf5, 0x8a, 0x29, 0xe7, 0x30, 0x82, 0x03, 0xaf, 0x30, 0x82, 0x02, 0x97, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x08, 0x3b, 0xe0, 0x56, 0x90, 0x42, 0x46, 0xb1, 0xa1, 0x75,\n+0x6a, 0xc9, 0x59, 0x91, 0xc7, 0x4a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44,\n+0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06,\n+0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65,\n+0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31,\n+0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, 0x31, 0x31,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19,\n+0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67,\n+0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f,\n+0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n+0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe2, 0x3b, 0xe1, 0x11,\n+0x72, 0xde, 0xa8, 0xa4, 0xd3, 0xa3, 0x57, 0xaa, 0x50, 0xa2, 0x8f, 0x0b, 0x77, 0x90, 0xc9, 0xa2,\n+0xa5, 0xee, 0x12, 0xce, 0x96, 0x5b, 0x01, 0x09, 0x20, 0xcc, 0x01, 0x93, 0xa7, 0x4e, 0x30, 0xb7,\n+0x53, 0xf7, 0x43, 0xc4, 0x69, 0x00, 0x57, 0x9d, 0xe2, 0x8d, 0x22, 0xdd, 0x87, 0x06, 0x40, 0x00,\n+0x81, 0x09, 0xce, 0xce, 0x1b, 0x83, 0xbf, 0xdf, 0xcd, 0x3b, 0x71, 0x46, 0xe2, 0xd6, 0x66, 0xc7,\n+0x05, 0xb3, 0x76, 0x27, 0x16, 0x8f, 0x7b, 0x9e, 0x1e, 0x95, 0x7d, 0xee, 0xb7, 0x48, 0xa3, 0x08,\n+0xda, 0xd6, 0xaf, 0x7a, 0x0c, 0x39, 0x06, 0x65, 0x7f, 0x4a, 0x5d, 0x1f, 0xbc, 0x17, 0xf8, 0xab,\n+0xbe, 0xee, 0x28, 0xd7, 0x74, 0x7f, 0x7a, 0x78, 0x99, 0x59, 0x85, 0x68, 0x6e, 0x5c, 0x23, 0x32,\n+0x4b, 0xbf, 0x4e, 0xc0, 0xe8, 0x5a, 0x6d, 0xe3, 0x70, 0xbf, 0x77, 0x10, 0xbf, 0xfc, 0x01, 0xf6,\n+0x85, 0xd9, 0xa8, 0x44, 0x10, 0x58, 0x32, 0xa9, 0x75, 0x18, 0xd5, 0xd1, 0xa2, 0xbe, 0x47, 0xe2,\n+0x27, 0x6a, 0xf4, 0x9a, 0x33, 0xf8, 0x49, 0x08, 0x60, 0x8b, 0xd4, 0x5f, 0xb4, 0x3a, 0x84, 0xbf,\n+0xa1, 0xaa, 0x4a, 0x4c, 0x7d, 0x3e, 0xcf, 0x4f, 0x5f, 0x6c, 0x76, 0x5e, 0xa0, 0x4b, 0x37, 0x91,\n+0x9e, 0xdc, 0x22, 0xe6, 0x6d, 0xce, 0x14, 0x1a, 0x8e, 0x6a, 0xcb, 0xfe, 0xcd, 0xb3, 0x14, 0x64,\n+0x17, 0xc7, 0x5b, 0x29, 0x9e, 0x32, 0xbf, 0xf2, 0xee, 0xfa, 0xd3, 0x0b, 0x42, 0xd4, 0xab, 0xb7,\n+0x41, 0x32, 0xda, 0x0c, 0xd4, 0xef, 0xf8, 0x81, 0xd5, 0xbb, 0x8d, 0x58, 0x3f, 0xb5, 0x1b, 0xe8,\n+0x49, 0x28, 0xa2, 0x70, 0xda, 0x31, 0x04, 0xdd, 0xf7, 0xb2, 0x16, 0xf2, 0x4c, 0x0a, 0x4e, 0x07,\n+0xa8, 0xed, 0x4a, 0x3d, 0x5e, 0xb5, 0x7f, 0xa3, 0x90, 0xc3, 0xaf, 0x27, 0x02, 0x03, 0x01, 0x00,\n+0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n+0x14, 0x03, 0xde, 0x50, 0x35, 0x56, 0xd1, 0x4c, 0xbb, 0x66, 0xf0, 0xa3, 0xe2, 0x1b, 0x1b, 0xc3,\n+0x97, 0xb2, 0x3d, 0xd1, 0x55, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16,\n+0x80, 0x14, 0x03, 0xde, 0x50, 0x35, 0x56, 0xd1, 0x4c, 0xbb, 0x66, 0xf0, 0xa3, 0xe2, 0x1b, 0x1b,\n+0xc3, 0x97, 0xb2, 0x3d, 0xd1, 0x55, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xcb, 0x9c, 0x37, 0xaa, 0x48, 0x13,\n+0x12, 0x0a, 0xfa, 0xdd, 0x44, 0x9c, 0x4f, 0x52, 0xb0, 0xf4, 0xdf, 0xae, 0x04, 0xf5, 0x79, 0x79,\n+0x08, 0xa3, 0x24, 0x18, 0xfc, 0x4b, 0x2b, 0x84, 0xc0, 0x2d, 0xb9, 0xd5, 0xc7, 0xfe, 0xf4, 0xc1,\n+0x1f, 0x58, 0xcb, 0xb8, 0x6d, 0x9c, 0x7a, 0x74, 0xe7, 0x98, 0x29, 0xab, 0x11, 0xb5, 0xe3, 0x70,\n+0xa0, 0xa1, 0xcd, 0x4c, 0x88, 0x99, 0x93, 0x8c, 0x91, 0x70, 0xe2, 0xab, 0x0f, 0x1c, 0xbe, 0x93,\n+0xa9, 0xff, 0x63, 0xd5, 0xe4, 0x07, 0x60, 0xd3, 0xa3, 0xbf, 0x9d, 0x5b, 0x09, 0xf1, 0xd5, 0x8e,\n+0xe3, 0x53, 0xf4, 0x8e, 0x63, 0xfa, 0x3f, 0xa7, 0xdb, 0xb4, 0x66, 0xdf, 0x62, 0x66, 0xd6, 0xd1,\n+0x6e, 0x41, 0x8d, 0xf2, 0x2d, 0xb5, 0xea, 0x77, 0x4a, 0x9f, 0x9d, 0x58, 0xe2, 0x2b, 0x59, 0xc0,\n+0x40, 0x23, 0xed, 0x2d, 0x28, 0x82, 0x45, 0x3e, 0x79, 0x54, 0x92, 0x26, 0x98, 0xe0, 0x80, 0x48,\n+0xa8, 0x37, 0xef, 0xf0, 0xd6, 0x79, 0x60, 0x16, 0xde, 0xac, 0xe8, 0x0e, 0xcd, 0x6e, 0xac, 0x44,\n+0x17, 0x38, 0x2f, 0x49, 0xda, 0xe1, 0x45, 0x3e, 0x2a, 0xb9, 0x36, 0x53, 0xcf, 0x3a, 0x50, 0x06,\n+0xf7, 0x2e, 0xe8, 0xc4, 0x57, 0x49, 0x6c, 0x61, 0x21, 0x18, 0xd5, 0x04, 0xad, 0x78, 0x3c, 0x2c,\n+0x3a, 0x80, 0x6b, 0xa7, 0xeb, 0xaf, 0x15, 0x14, 0xe9, 0xd8, 0x89, 0xc1, 0xb9, 0x38, 0x6c, 0xe2,\n+0x91, 0x6c, 0x8a, 0xff, 0x64, 0xb9, 0x77, 0x25, 0x57, 0x30, 0xc0, 0x1b, 0x24, 0xa3, 0xe1, 0xdc,\n+0xe9, 0xdf, 0x47, 0x7c, 0xb5, 0xb4, 0x24, 0x08, 0x05, 0x30, 0xec, 0x2d, 0xbd, 0x0b, 0xbf, 0x45,\n+0xbf, 0x50, 0xb9, 0xa9, 0xf3, 0xeb, 0x98, 0x01, 0x12, 0xad, 0xc8, 0x88, 0xc6, 0x98, 0x34, 0x5f,\n+0x8d, 0x0a, 0x3c, 0xc6, 0xe9, 0xd5, 0x95, 0x95, 0x6d, 0xde, 0x30, 0x82, 0x03, 0x8e, 0x30, 0x82,\n+0x02, 0x76, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x03, 0x3a, 0xf1, 0xe6, 0xa7, 0x11, 0xa9,\n+0xa0, 0xbb, 0x28, 0x64, 0xb1, 0x1d, 0x09, 0xfa, 0xe5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19,\n+0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67,\n+0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f,\n+0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x33, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38,\n+0x30, 0x31, 0x31, 0x35, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x61, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e,\n+0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e,\n+0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20,\n+0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x32, 0x30, 0x82,\n+0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb,\n+0x37, 0xcd, 0x34, 0xdc, 0x7b, 0x6b, 0xc9, 0xb2, 0x68, 0x90, 0xad, 0x4a, 0x75, 0xff, 0x46, 0xba,\n+0x21, 0x0a, 0x08, 0x8d, 0xf5, 0x19, 0x54, 0xc9, 0xfb, 0x88, 0xdb, 0xf3, 0xae, 0xf2, 0x3a, 0x89,\n+0x91, 0x3c, 0x7a, 0xe6, 0xab, 0x06, 0x1a, 0x6b, 0xcf, 0xac, 0x2d, 0xe8, 0x5e, 0x09, 0x24, 0x44,\n+0xba, 0x62, 0x9a, 0x7e, 0xd6, 0xa3, 0xa8, 0x7e, 0xe0, 0x54, 0x75, 0x20, 0x05, 0xac, 0x50, 0xb7,\n+0x9c, 0x63, 0x1a, 0x6c, 0x30, 0xdc, 0xda, 0x1f, 0x19, 0xb1, 0xd7, 0x1e, 0xde, 0xfd, 0xd7, 0xe0,\n+0xcb, 0x94, 0x83, 0x37, 0xae, 0xec, 0x1f, 0x43, 0x4e, 0xdd, 0x7b, 0x2c, 0xd2, 0xbd, 0x2e, 0xa5,\n+0x2f, 0xe4, 0xa9, 0xb8, 0xad, 0x3a, 0xd4, 0x99, 0xa4, 0xb6, 0x25, 0xe9, 0x9b, 0x6b, 0x00, 0x60,\n+0x92, 0x60, 0xff, 0x4f, 0x21, 0x49, 0x18, 0xf7, 0x67, 0x90, 0xab, 0x61, 0x06, 0x9c, 0x8f, 0xf2,\n+0xba, 0xe9, 0xb4, 0xe9, 0x92, 0x32, 0x6b, 0xb5, 0xf3, 0x57, 0xe8, 0x5d, 0x1b, 0xcd, 0x8c, 0x1d,\n+0xab, 0x95, 0x04, 0x95, 0x49, 0xf3, 0x35, 0x2d, 0x96, 0xe3, 0x49, 0x6d, 0xdd, 0x77, 0xe3, 0xfb,\n+0x49, 0x4b, 0xb4, 0xac, 0x55, 0x07, 0xa9, 0x8f, 0x95, 0xb3, 0xb4, 0x23, 0xbb, 0x4c, 0x6d, 0x45,\n+0xf0, 0xf6, 0xa9, 0xb2, 0x95, 0x30, 0xb4, 0xfd, 0x4c, 0x55, 0x8c, 0x27, 0x4a, 0x57, 0x14, 0x7c,\n+0x82, 0x9d, 0xcd, 0x73, 0x92, 0xd3, 0x16, 0x4a, 0x06, 0x0c, 0x8c, 0x50, 0xd1, 0x8f, 0x1e, 0x09,\n+0xbe, 0x17, 0xa1, 0xe6, 0x21, 0xca, 0xfd, 0x83, 0xe5, 0x10, 0xbc, 0x83, 0xa5, 0x0a, 0xc4, 0x67,\n+0x28, 0xf6, 0x73, 0x14, 0x14, 0x3d, 0x46, 0x76, 0xc3, 0x87, 0x14, 0x89, 0x21, 0x34, 0x4d, 0xaf,\n+0x0f, 0x45, 0x0c, 0xa6, 0x49, 0xa1, 0xba, 0xbb, 0x9c, 0xc5, 0xb1, 0x33, 0x83, 0x29, 0x85, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,\n+0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f,\n+0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\n+0x04, 0x16, 0x04, 0x14, 0x4e, 0x22, 0x54, 0x20, 0x18, 0x95, 0xe6, 0xe3, 0x6e, 0xe6, 0x0f, 0xfa,\n+0xfa, 0xb9, 0x12, 0xed, 0x06, 0x17, 0x8f, 0x39, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x60, 0x67, 0x28, 0x94,\n+0x6f, 0x0e, 0x48, 0x63, 0xeb, 0x31, 0xdd, 0xea, 0x67, 0x18, 0xd5, 0x89, 0x7d, 0x3c, 0xc5, 0x8b,\n+0x4a, 0x7f, 0xe9, 0xbe, 0xdb, 0x2b, 0x17, 0xdf, 0xb0, 0x5f, 0x73, 0x77, 0x2a, 0x32, 0x13, 0x39,\n+0x81, 0x67, 0x42, 0x84, 0x23, 0xf2, 0x45, 0x67, 0x35, 0xec, 0x88, 0xbf, 0xf8, 0x8f, 0xb0, 0x61,\n+0x0c, 0x34, 0xa4, 0xae, 0x20, 0x4c, 0x84, 0xc6, 0xdb, 0xf8, 0x35, 0xe1, 0x76, 0xd9, 0xdf, 0xa6,\n+0x42, 0xbb, 0xc7, 0x44, 0x08, 0x86, 0x7f, 0x36, 0x74, 0x24, 0x5a, 0xda, 0x6c, 0x0d, 0x14, 0x59,\n+0x35, 0xbd, 0xf2, 0x49, 0xdd, 0xb6, 0x1f, 0xc9, 0xb3, 0x0d, 0x47, 0x2a, 0x3d, 0x99, 0x2f, 0xbb,\n+0x5c, 0xbb, 0xb5, 0xd4, 0x20, 0xe1, 0x99, 0x5f, 0x53, 0x46, 0x15, 0xdb, 0x68, 0x9b, 0xf0, 0xf3,\n+0x30, 0xd5, 0x3e, 0x31, 0xe2, 0x8d, 0x84, 0x9e, 0xe3, 0x8a, 0xda, 0xda, 0x96, 0x3e, 0x35, 0x13,\n+0xa5, 0x5f, 0xf0, 0xf9, 0x70, 0x50, 0x70, 0x47, 0x41, 0x11, 0x57, 0x19, 0x4e, 0xc0, 0x8f, 0xae,\n+0x06, 0xc4, 0x95, 0x13, 0x17, 0x2f, 0x1b, 0x25, 0x9f, 0x75, 0xf2, 0xb1, 0x8e, 0x99, 0xa1, 0x6f,\n+0x13, 0xb1, 0x41, 0x71, 0xfe, 0x88, 0x2a, 0xc8, 0x4f, 0x10, 0x20, 0x55, 0xd7, 0xf3, 0x14, 0x45,\n+0xe5, 0xe0, 0x44, 0xf4, 0xea, 0x87, 0x95, 0x32, 0x93, 0x0e, 0xfe, 0x53, 0x46, 0xfa, 0x2c, 0x9d,\n+0xff, 0x8b, 0x22, 0xb9, 0x4b, 0xd9, 0x09, 0x45, 0xa4, 0xde, 0xa4, 0xb8, 0x9a, 0x58, 0xdd, 0x1b,\n+0x7d, 0x52, 0x9f, 0x8e, 0x59, 0x43, 0x88, 0x81, 0xa4, 0x9e, 0x26, 0xd5, 0x6f, 0xad, 0xdd, 0x0d,\n+0xc6, 0x37, 0x7d, 0xed, 0x03, 0x92, 0x1b, 0xe5, 0x77, 0x5f, 0x76, 0xee, 0x3c, 0x8d, 0xc4, 0x5d,\n+0x56, 0x5b, 0xa2, 0xd9, 0x66, 0x6e, 0xb3, 0x35, 0x37, 0xe5, 0x32, 0xb6, 0x30, 0x82, 0x02, 0x3f,\n+0x30, 0x82, 0x01, 0xc5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x05, 0x55, 0x56, 0xbc, 0xf2,\n+0x5e, 0xa4, 0x35, 0x35, 0xc3, 0xa4, 0x0f, 0xd5, 0xab, 0x45, 0x72, 0x30, 0x0a, 0x06, 0x08, 0x2a,\n+0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30,\n+0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69,\n+0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62,\n+0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33,\n+0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30,\n+0x31, 0x31, 0x35, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63,\n+0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64,\n+0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47,\n+0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x33, 0x30, 0x76, 0x30,\n+0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00,\n+0x22, 0x03, 0x62, 0x00, 0x04, 0xdd, 0xa7, 0xd9, 0xbb, 0x8a, 0xb8, 0x0b, 0xfb, 0x0b, 0x7f, 0x21,\n+0xd2, 0xf0, 0xbe, 0xbe, 0x73, 0xf3, 0x33, 0x5d, 0x1a, 0xbc, 0x34, 0xea, 0xde, 0xc6, 0x9b, 0xbc,\n+0xd0, 0x95, 0xf6, 0xf0, 0xcc, 0xd0, 0x0b, 0xba, 0x61, 0x5b, 0x51, 0x46, 0x7e, 0x9e, 0x2d, 0x9f,\n+0xee, 0x8e, 0x63, 0x0c, 0x17, 0xec, 0x07, 0x70, 0xf5, 0xcf, 0x84, 0x2e, 0x40, 0x83, 0x9c, 0xe8,\n+0x3f, 0x41, 0x6d, 0x3b, 0xad, 0xd3, 0xa4, 0x14, 0x59, 0x36, 0x78, 0x9d, 0x03, 0x43, 0xee, 0x10,\n+0x13, 0x6c, 0x72, 0xde, 0xae, 0x88, 0xa7, 0xa1, 0x6b, 0xb5, 0x43, 0xce, 0x67, 0xdc, 0x23, 0xff,\n+0x03, 0x1c, 0xa3, 0xe2, 0x3e, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n+0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n+0x0e, 0x04, 0x16, 0x04, 0x14, 0xb3, 0xdb, 0x48, 0xa4, 0xf9, 0xa1, 0xc5, 0xd8, 0xae, 0x36, 0x41,\n+0xcc, 0x11, 0x63, 0x69, 0x62, 0x29, 0xbc, 0x4b, 0xc6, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n+0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0xad, 0xbc, 0xf2,\n+0x6c, 0x3f, 0x12, 0x4a, 0xd1, 0x2d, 0x39, 0xc3, 0x0a, 0x09, 0x97, 0x73, 0xf4, 0x88, 0x36, 0x8c,\n+0x88, 0x27, 0xbb, 0xe6, 0x88, 0x8d, 0x50, 0x85, 0xa7, 0x63, 0xf9, 0x9e, 0x32, 0xde, 0x66, 0x93,\n+0x0f, 0xf1, 0xcc, 0xb1, 0x09, 0x8f, 0xdd, 0x6c, 0xab, 0xfa, 0x6b, 0x7f, 0xa0, 0x02, 0x30, 0x39,\n+0x66, 0x5b, 0xc2, 0x64, 0x8d, 0xb8, 0x9e, 0x50, 0xdc, 0xa8, 0xd5, 0x49, 0xa2, 0xed, 0xc7, 0xdc,\n+0xd1, 0x49, 0x7f, 0x17, 0x01, 0xb8, 0xc8, 0x86, 0x8f, 0x4e, 0x8c, 0x88, 0x2b, 0xa8, 0x9a, 0xa9,\n+0x8a, 0xc5, 0xd1, 0x00, 0xbd, 0xf8, 0x54, 0xe2, 0x9a, 0xe5, 0x5b, 0x7c, 0xb3, 0x27, 0x17, 0x30,\n+0x82, 0x03, 0xc5, 0x30, 0x82, 0x02, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x02, 0xac,\n+0x5c, 0x26, 0x6a, 0x0b, 0x40, 0x9b, 0x8f, 0x0b, 0x79, 0xf2, 0xae, 0x46, 0x25, 0x77, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x6c, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20,\n+0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77,\n+0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x2b,\n+0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72,\n+0x74, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65,\n+0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30,\n+0x36, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31,\n+0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x6c, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e,\n+0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e,\n+0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x2b, 0x30, 0x29,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20,\n+0x48, 0x69, 0x67, 0x68, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x45,\n+0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f,\n+0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc6, 0xcc, 0xe5, 0x73, 0xe6, 0xfb,\n+0xd4, 0xbb, 0xe5, 0x2d, 0x2d, 0x32, 0xa6, 0xdf, 0xe5, 0x81, 0x3f, 0xc9, 0xcd, 0x25, 0x49, 0xb6,\n+0x71, 0x2a, 0xc3, 0xd5, 0x94, 0x34, 0x67, 0xa2, 0x0a, 0x1c, 0xb0, 0x5f, 0x69, 0xa6, 0x40, 0xb1,\n+0xc4, 0xb7, 0xb2, 0x8f, 0xd0, 0x98, 0xa4, 0xa9, 0x41, 0x59, 0x3a, 0xd3, 0xdc, 0x94, 0xd6, 0x3c,\n+0xdb, 0x74, 0x38, 0xa4, 0x4a, 0xcc, 0x4d, 0x25, 0x82, 0xf7, 0x4a, 0xa5, 0x53, 0x12, 0x38, 0xee,\n+0xf3, 0x49, 0x6d, 0x71, 0x91, 0x7e, 0x63, 0xb6, 0xab, 0xa6, 0x5f, 0xc3, 0xa4, 0x84, 0xf8, 0x4f,\n+0x62, 0x51, 0xbe, 0xf8, 0xc5, 0xec, 0xdb, 0x38, 0x92, 0xe3, 0x06, 0xe5, 0x08, 0x91, 0x0c, 0xc4,\n+0x28, 0x41, 0x55, 0xfb, 0xcb, 0x5a, 0x89, 0x15, 0x7e, 0x71, 0xe8, 0x35, 0xbf, 0x4d, 0x72, 0x09,\n+0x3d, 0xbe, 0x3a, 0x38, 0x50, 0x5b, 0x77, 0x31, 0x1b, 0x8d, 0xb3, 0xc7, 0x24, 0x45, 0x9a, 0xa7,\n+0xac, 0x6d, 0x00, 0x14, 0x5a, 0x04, 0xb7, 0xba, 0x13, 0xeb, 0x51, 0x0a, 0x98, 0x41, 0x41, 0x22,\n+0x4e, 0x65, 0x61, 0x87, 0x81, 0x41, 0x50, 0xa6, 0x79, 0x5c, 0x89, 0xde, 0x19, 0x4a, 0x57, 0xd5,\n+0x2e, 0xe6, 0x5d, 0x1c, 0x53, 0x2c, 0x7e, 0x98, 0xcd, 0x1a, 0x06, 0x16, 0xa4, 0x68, 0x73, 0xd0,\n+0x34, 0x04, 0x13, 0x5c, 0xa1, 0x71, 0xd3, 0x5a, 0x7c, 0x55, 0xdb, 0x5e, 0x64, 0xe1, 0x37, 0x87,\n+0x30, 0x56, 0x04, 0xe5, 0x11, 0xb4, 0x29, 0x80, 0x12, 0xf1, 0x79, 0x39, 0x88, 0xa2, 0x02, 0x11,\n+0x7c, 0x27, 0x66, 0xb7, 0x88, 0xb7, 0x78, 0xf2, 0xca, 0x0a, 0xa8, 0x38, 0xab, 0x0a, 0x64, 0xc2,\n+0xbf, 0x66, 0x5d, 0x95, 0x84, 0xc1, 0xa1, 0x25, 0x1e, 0x87, 0x5d, 0x1a, 0x50, 0x0b, 0x20, 0x12,\n+0xcc, 0x41, 0xbb, 0x6e, 0x0b, 0x51, 0x38, 0xb8, 0x4b, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n+0x63, 0x30, 0x61, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n+0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb1,\n+0x3e, 0xc3, 0x69, 0x03, 0xf8, 0xbf, 0x47, 0x01, 0xd4, 0x98, 0x26, 0x1a, 0x08, 0x02, 0xef, 0x63,\n+0x64, 0x2b, 0xc3, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,\n+0xb1, 0x3e, 0xc3, 0x69, 0x03, 0xf8, 0xbf, 0x47, 0x01, 0xd4, 0x98, 0x26, 0x1a, 0x08, 0x02, 0xef,\n+0x63, 0x64, 0x2b, 0xc3, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x1c, 0x1a, 0x06, 0x97, 0xdc, 0xd7, 0x9c, 0x9f,\n+0x3c, 0x88, 0x66, 0x06, 0x08, 0x57, 0x21, 0xdb, 0x21, 0x47, 0xf8, 0x2a, 0x67, 0xaa, 0xbf, 0x18,\n+0x32, 0x76, 0x40, 0x10, 0x57, 0xc1, 0x8a, 0xf3, 0x7a, 0xd9, 0x11, 0x65, 0x8e, 0x35, 0xfa, 0x9e,\n+0xfc, 0x45, 0xb5, 0x9e, 0xd9, 0x4c, 0x31, 0x4b, 0xb8, 0x91, 0xe8, 0x43, 0x2c, 0x8e, 0xb3, 0x78,\n+0xce, 0xdb, 0xe3, 0x53, 0x79, 0x71, 0xd6, 0xe5, 0x21, 0x94, 0x01, 0xda, 0x55, 0x87, 0x9a, 0x24,\n+0x64, 0xf6, 0x8a, 0x66, 0xcc, 0xde, 0x9c, 0x37, 0xcd, 0xa8, 0x34, 0xb1, 0x69, 0x9b, 0x23, 0xc8,\n+0x9e, 0x78, 0x22, 0x2b, 0x70, 0x43, 0xe3, 0x55, 0x47, 0x31, 0x61, 0x19, 0xef, 0x58, 0xc5, 0x85,\n+0x2f, 0x4e, 0x30, 0xf6, 0xa0, 0x31, 0x16, 0x23, 0xc8, 0xe7, 0xe2, 0x65, 0x16, 0x33, 0xcb, 0xbf,\n+0x1a, 0x1b, 0xa0, 0x3d, 0xf8, 0xca, 0x5e, 0x8b, 0x31, 0x8b, 0x60, 0x08, 0x89, 0x2d, 0x0c, 0x06,\n+0x5c, 0x52, 0xb7, 0xc4, 0xf9, 0x0a, 0x98, 0xd1, 0x15, 0x5f, 0x9f, 0x12, 0xbe, 0x7c, 0x36, 0x63,\n+0x38, 0xbd, 0x44, 0xa4, 0x7f, 0xe4, 0x26, 0x2b, 0x0a, 0xc4, 0x97, 0x69, 0x0d, 0xe9, 0x8c, 0xe2,\n+0xc0, 0x10, 0x57, 0xb8, 0xc8, 0x76, 0x12, 0x91, 0x55, 0xf2, 0x48, 0x69, 0xd8, 0xbc, 0x2a, 0x02,\n+0x5b, 0x0f, 0x44, 0xd4, 0x20, 0x31, 0xdb, 0xf4, 0xba, 0x70, 0x26, 0x5d, 0x90, 0x60, 0x9e, 0xbc,\n+0x4b, 0x17, 0x09, 0x2f, 0xb4, 0xcb, 0x1e, 0x43, 0x68, 0xc9, 0x07, 0x27, 0xc1, 0xd2, 0x5c, 0xf7,\n+0xea, 0x21, 0xb9, 0x68, 0x12, 0x9c, 0x3c, 0x9c, 0xbf, 0x9e, 0xfc, 0x80, 0x5c, 0x9b, 0x63, 0xcd,\n+0xec, 0x47, 0xaa, 0x25, 0x27, 0x67, 0xa0, 0x37, 0xf3, 0x00, 0x82, 0x7d, 0x54, 0xd7, 0xa9, 0xf8,\n+0xe9, 0x2e, 0x13, 0xa3, 0x77, 0xe8, 0x1f, 0x4a, 0x30, 0x82, 0x05, 0x90, 0x30, 0x82, 0x03, 0x78,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x05, 0x9b, 0x1b, 0x57, 0x9e, 0x8e, 0x21, 0x32, 0xe2,\n+0x39, 0x07, 0xbd, 0xa7, 0x77, 0x75, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c,\n+0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17,\n+0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63,\n+0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x34, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33,\n+0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30,\n+0x31, 0x31, 0x35, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63,\n+0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64,\n+0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x21, 0x30, 0x1f, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x34, 0x30, 0x82,\n+0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xbf,\n+0xe6, 0x90, 0x73, 0x68, 0xde, 0xbb, 0xe4, 0x5d, 0x4a, 0x3c, 0x30, 0x22, 0x30, 0x69, 0x33, 0xec,\n+0xc2, 0xa7, 0x25, 0x2e, 0xc9, 0x21, 0x3d, 0xf2, 0x8a, 0xd8, 0x59, 0xc2, 0xe1, 0x29, 0xa7, 0x3d,\n+0x58, 0xab, 0x76, 0x9a, 0xcd, 0xae, 0x7b, 0x1b, 0x84, 0x0d, 0xc4, 0x30, 0x1f, 0xf3, 0x1b, 0xa4,\n+0x38, 0x16, 0xeb, 0x56, 0xc6, 0x97, 0x6d, 0x1d, 0xab, 0xb2, 0x79, 0xf2, 0xca, 0x11, 0xd2, 0xe4,\n+0x5f, 0xd6, 0x05, 0x3c, 0x52, 0x0f, 0x52, 0x1f, 0xc6, 0x9e, 0x15, 0xa5, 0x7e, 0xbe, 0x9f, 0xa9,\n+0x57, 0x16, 0x59, 0x55, 0x72, 0xaf, 0x68, 0x93, 0x70, 0xc2, 0xb2, 0xba, 0x75, 0x99, 0x6a, 0x73,\n+0x32, 0x94, 0xd1, 0x10, 0x44, 0x10, 0x2e, 0xdf, 0x82, 0xf3, 0x07, 0x84, 0xe6, 0x74, 0x3b, 0x6d,\n+0x71, 0xe2, 0x2d, 0x0c, 0x1b, 0xee, 0x20, 0xd5, 0xc9, 0x20, 0x1d, 0x63, 0x29, 0x2d, 0xce, 0xec,\n+0x5e, 0x4e, 0xc8, 0x93, 0xf8, 0x21, 0x61, 0x9b, 0x34, 0xeb, 0x05, 0xc6, 0x5e, 0xec, 0x5b, 0x1a,\n+0xbc, 0xeb, 0xc9, 0xcf, 0xcd, 0xac, 0x34, 0x40, 0x5f, 0xb1, 0x7a, 0x66, 0xee, 0x77, 0xc8, 0x48,\n+0xa8, 0x66, 0x57, 0x57, 0x9f, 0x54, 0x58, 0x8e, 0x0c, 0x2b, 0xb7, 0x4f, 0xa7, 0x30, 0xd9, 0x56,\n+0xee, 0xca, 0x7b, 0x5d, 0xe3, 0xad, 0xc9, 0x4f, 0x5e, 0xe5, 0x35, 0xe7, 0x31, 0xcb, 0xda, 0x93,\n+0x5e, 0xdc, 0x8e, 0x8f, 0x80, 0xda, 0xb6, 0x91, 0x98, 0x40, 0x90, 0x79, 0xc3, 0x78, 0xc7, 0xb6,\n+0xb1, 0xc4, 0xb5, 0x6a, 0x18, 0x38, 0x03, 0x10, 0x8d, 0xd8, 0xd4, 0x37, 0xa4, 0x2e, 0x05, 0x7d,\n+0x88, 0xf5, 0x82, 0x3e, 0x10, 0x91, 0x70, 0xab, 0x55, 0x82, 0x41, 0x32, 0xd7, 0xdb, 0x04, 0x73,\n+0x2a, 0x6e, 0x91, 0x01, 0x7c, 0x21, 0x4c, 0xd4, 0xbc, 0xae, 0x1b, 0x03, 0x75, 0x5d, 0x78, 0x66,\n+0xd9, 0x3a, 0x31, 0x44, 0x9a, 0x33, 0x40, 0xbf, 0x08, 0xd7, 0x5a, 0x49, 0xa4, 0xc2, 0xe6, 0xa9,\n+0xa0, 0x67, 0xdd, 0xa4, 0x27, 0xbc, 0xa1, 0x4f, 0x39, 0xb5, 0x11, 0x58, 0x17, 0xf7, 0x24, 0x5c,\n+0x46, 0x8f, 0x64, 0xf7, 0xc1, 0x69, 0x88, 0x76, 0x98, 0x76, 0x3d, 0x59, 0x5d, 0x42, 0x76, 0x87,\n+0x89, 0x97, 0x69, 0x7a, 0x48, 0xf0, 0xe0, 0xa2, 0x12, 0x1b, 0x66, 0x9a, 0x74, 0xca, 0xde, 0x4b,\n+0x1e, 0xe7, 0x0e, 0x63, 0xae, 0xe6, 0xd4, 0xef, 0x92, 0x92, 0x3a, 0x9e, 0x3d, 0xdc, 0x00, 0xe4,\n+0x45, 0x25, 0x89, 0xb6, 0x9a, 0x44, 0x19, 0x2b, 0x7e, 0xc0, 0x94, 0xb4, 0xd2, 0x61, 0x6d, 0xeb,\n+0x33, 0xd9, 0xc5, 0xdf, 0x4b, 0x04, 0x00, 0xcc, 0x7d, 0x1c, 0x95, 0xc3, 0x8f, 0xf7, 0x21, 0xb2,\n+0xb2, 0x11, 0xb7, 0xbb, 0x7f, 0xf2, 0xd5, 0x8c, 0x70, 0x2c, 0x41, 0x60, 0xaa, 0xb1, 0x63, 0x18,\n+0x44, 0x95, 0x1a, 0x76, 0x62, 0x7e, 0xf6, 0x80, 0xb0, 0xfb, 0xe8, 0x64, 0xa6, 0x33, 0xd1, 0x89,\n+0x07, 0xe1, 0xbd, 0xb7, 0xe6, 0x43, 0xa4, 0x18, 0xb8, 0xa6, 0x77, 0x01, 0xe1, 0x0f, 0x94, 0x0c,\n+0x21, 0x1d, 0xb2, 0x54, 0x29, 0x25, 0x89, 0x6c, 0xe5, 0x0e, 0x52, 0x51, 0x47, 0x74, 0xbe, 0x26,\n+0xac, 0xb6, 0x41, 0x75, 0xde, 0x7a, 0xac, 0x5f, 0x8d, 0x3f, 0xc9, 0xbc, 0xd3, 0x41, 0x11, 0x12,\n+0x5b, 0xe5, 0x10, 0x50, 0xeb, 0x31, 0xc5, 0xca, 0x72, 0x16, 0x22, 0x09, 0xdf, 0x7c, 0x4c, 0x75,\n+0x3f, 0x63, 0xec, 0x21, 0x5f, 0xc4, 0x20, 0x51, 0x6b, 0x6f, 0xb1, 0xab, 0x86, 0x8b, 0x4f, 0xc2,\n+0xd6, 0x45, 0x5f, 0x9d, 0x20, 0xfc, 0xa1, 0x1e, 0xc5, 0xc0, 0x8f, 0xa2, 0xb1, 0x7e, 0x0a, 0x26,\n+0x99, 0xf5, 0xe4, 0x69, 0x2f, 0x98, 0x1d, 0x2d, 0xf5, 0xd9, 0xa9, 0xb2, 0x1d, 0xe5, 0x1b, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,\n+0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f,\n+0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\n+0x04, 0x16, 0x04, 0x14, 0xec, 0xd7, 0xe3, 0x82, 0xd2, 0x71, 0x5d, 0x64, 0x4c, 0xdf, 0x2e, 0x67,\n+0x3f, 0xe7, 0xba, 0x98, 0xae, 0x1c, 0x0f, 0x4f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xbb, 0x61, 0xd9, 0x7d,\n+0xa9, 0x6c, 0xbe, 0x17, 0xc4, 0x91, 0x1b, 0xc3, 0xa1, 0xa2, 0x00, 0x8d, 0xe3, 0x64, 0x68, 0x0f,\n+0x56, 0xcf, 0x77, 0xae, 0x70, 0xf9, 0xfd, 0x9a, 0x4a, 0x99, 0xb9, 0xc9, 0x78, 0x5c, 0x0c, 0x0c,\n+0x5f, 0xe4, 0xe6, 0x14, 0x29, 0x56, 0x0b, 0x36, 0x49, 0x5d, 0x44, 0x63, 0xe0, 0xad, 0x9c, 0x96,\n+0x18, 0x66, 0x1b, 0x23, 0x0d, 0x3d, 0x79, 0xe9, 0x6d, 0x6b, 0xd6, 0x54, 0xf8, 0xd2, 0x3c, 0xc1,\n+0x43, 0x40, 0xae, 0x1d, 0x50, 0xf5, 0x52, 0xfc, 0x90, 0x3b, 0xbb, 0x98, 0x99, 0x69, 0x6b, 0xc7,\n+0xc1, 0xa7, 0xa8, 0x68, 0xa4, 0x27, 0xdc, 0x9d, 0xf9, 0x27, 0xae, 0x30, 0x85, 0xb9, 0xf6, 0x67,\n+0x4d, 0x3a, 0x3e, 0x8f, 0x59, 0x39, 0x22, 0x53, 0x44, 0xeb, 0xc8, 0x5d, 0x03, 0xca, 0xed, 0x50,\n+0x7a, 0x7d, 0x62, 0x21, 0x0a, 0x80, 0xc8, 0x73, 0x66, 0xd1, 0xa0, 0x05, 0x60, 0x5f, 0xe8, 0xa5,\n+0xb4, 0xa7, 0xaf, 0xa8, 0xf7, 0x6d, 0x35, 0x9c, 0x7c, 0x5a, 0x8a, 0xd6, 0xa2, 0x38, 0x99, 0xf3,\n+0x78, 0x8b, 0xf4, 0x4d, 0xd2, 0x20, 0x0b, 0xde, 0x04, 0xee, 0x8c, 0x9b, 0x47, 0x81, 0x72, 0x0d,\n+0xc0, 0x14, 0x32, 0xef, 0x30, 0x59, 0x2e, 0xae, 0xe0, 0x71, 0xf2, 0x56, 0xe4, 0x6a, 0x97, 0x6f,\n+0x92, 0x50, 0x6d, 0x96, 0x8d, 0x68, 0x7a, 0x9a, 0xb2, 0x36, 0x14, 0x7a, 0x06, 0xf2, 0x24, 0xb9,\n+0x09, 0x11, 0x50, 0xd7, 0x08, 0xb1, 0xb8, 0x89, 0x7a, 0x84, 0x23, 0x61, 0x42, 0x29, 0xe5, 0xa3,\n+0xcd, 0xa2, 0x20, 0x41, 0xd7, 0xd1, 0x9c, 0x64, 0xd9, 0xea, 0x26, 0xa1, 0x8b, 0x14, 0xd7, 0x4c,\n+0x19, 0xb2, 0x50, 0x41, 0x71, 0x3d, 0x3f, 0x4d, 0x70, 0x23, 0x86, 0x0c, 0x4a, 0xdc, 0x81, 0xd2,\n+0xcc, 0x32, 0x94, 0x84, 0x0d, 0x08, 0x09, 0x97, 0x1c, 0x4f, 0xc0, 0xee, 0x6b, 0x20, 0x74, 0x30,\n+0xd2, 0xe0, 0x39, 0x34, 0x10, 0x85, 0x21, 0x15, 0x01, 0x08, 0xe8, 0x55, 0x32, 0xde, 0x71, 0x49,\n+0xd9, 0x28, 0x17, 0x50, 0x4d, 0xe6, 0xbe, 0x4d, 0xd1, 0x75, 0xac, 0xd0, 0xca, 0xfb, 0x41, 0xb8,\n+0x43, 0xa5, 0xaa, 0xd3, 0xc3, 0x05, 0x44, 0x4f, 0x2c, 0x36, 0x9b, 0xe2, 0xfa, 0xe2, 0x45, 0xb8,\n+0x23, 0x53, 0x6c, 0x06, 0x6f, 0x67, 0x55, 0x7f, 0x46, 0xb5, 0x4c, 0x3f, 0x6e, 0x28, 0x5a, 0x79,\n+0x26, 0xd2, 0xa4, 0xa8, 0x62, 0x97, 0xd2, 0x1e, 0xe2, 0xed, 0x4a, 0x8b, 0xbc, 0x1b, 0xfd, 0x47,\n+0x4a, 0x0d, 0xdf, 0x67, 0x66, 0x7e, 0xb2, 0x5b, 0x41, 0xd0, 0x3b, 0xe4, 0xf4, 0x3b, 0xf4, 0x04,\n+0x63, 0xe9, 0xef, 0xc2, 0x54, 0x00, 0x51, 0xa0, 0x8a, 0x2a, 0xc9, 0xce, 0x78, 0xcc, 0xd5, 0xea,\n+0x87, 0x04, 0x18, 0xb3, 0xce, 0xaf, 0x49, 0x88, 0xaf, 0xf3, 0x92, 0x99, 0xb6, 0xb3, 0xe6, 0x61,\n+0x0f, 0xd2, 0x85, 0x00, 0xe7, 0x50, 0x1a, 0xe4, 0x1b, 0x95, 0x9d, 0x19, 0xa1, 0xb9, 0x9c, 0xb1,\n+0x9b, 0xb1, 0x00, 0x1e, 0xef, 0xd0, 0x0f, 0x4f, 0x42, 0x6c, 0xc9, 0x0a, 0xbc, 0xee, 0x43, 0xfa,\n+0x3a, 0x71, 0xa5, 0xc8, 0x4d, 0x26, 0xa5, 0x35, 0xfd, 0x89, 0x5d, 0xbc, 0x85, 0x62, 0x1d, 0x32,\n+0xd2, 0xa0, 0x2b, 0x54, 0xed, 0x9a, 0x57, 0xc1, 0xdb, 0xfa, 0x10, 0xcf, 0x19, 0xb7, 0x8b, 0x4a,\n+0x1b, 0x8f, 0x01, 0xb6, 0x27, 0x95, 0x53, 0xe8, 0xb6, 0x89, 0x6d, 0x5b, 0xbc, 0x68, 0xd4, 0x23,\n+0xe8, 0x8b, 0x51, 0xa2, 0x56, 0xf9, 0xf0, 0xa6, 0x80, 0xa0, 0xd6, 0x1e, 0xb3, 0xbc, 0x0f, 0x0f,\n+0x53, 0x75, 0x29, 0xaa, 0xea, 0x13, 0x77, 0xe4, 0xde, 0x8c, 0x81, 0x21, 0xad, 0x07, 0x10, 0x47,\n+0x11, 0xad, 0x87, 0x3d, 0x07, 0xd1, 0x75, 0xbc, 0xcf, 0xf3, 0x66, 0x7e, 0x30, 0x82, 0x02, 0x46,\n+0x30, 0x82, 0x01, 0xcd, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0b, 0xa1, 0x5a, 0xfa, 0x1d,\n+0xdf, 0xa0, 0xb5, 0x49, 0x44, 0xaf, 0xcd, 0x24, 0xa0, 0x6c, 0xec, 0x30, 0x0a, 0x06, 0x08, 0x2a,\n+0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30,\n+0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69,\n+0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75,\n+0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x33, 0x30, 0x1e,\n+0x17, 0x0d, 0x31, 0x33, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17,\n+0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x35, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x65,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30,\n+0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74,\n+0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77,\n+0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31,\n+0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65,\n+0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x47, 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n+0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x19, 0xe7, 0xbc,\n+0xac, 0x44, 0x65, 0xed, 0xcd, 0xb8, 0x3f, 0x58, 0xfb, 0x8d, 0xb1, 0x57, 0xa9, 0x44, 0x2d, 0x05,\n+0x15, 0xf2, 0xef, 0x0b, 0xff, 0x10, 0x74, 0x9f, 0xb5, 0x62, 0x52, 0x5f, 0x66, 0x7e, 0x1f, 0xe5,\n+0xdc, 0x1b, 0x45, 0x79, 0x0b, 0xcc, 0xc6, 0x53, 0x0a, 0x9d, 0x8d, 0x5d, 0x02, 0xd9, 0xa9, 0x59,\n+0xde, 0x02, 0x5a, 0xf6, 0x95, 0x2a, 0x0e, 0x8d, 0x38, 0x4a, 0x8a, 0x49, 0xc6, 0xbc, 0xc6, 0x03,\n+0x38, 0x07, 0x5f, 0x55, 0xda, 0x7e, 0x09, 0x6e, 0xe2, 0x7f, 0x5e, 0xd0, 0x45, 0x20, 0x0f, 0x59,\n+0x76, 0x10, 0xd6, 0xa0, 0x24, 0xf0, 0x2d, 0xde, 0x36, 0xf2, 0x6c, 0x29, 0x39, 0xa3, 0x42, 0x30,\n+0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xcb, 0xd0, 0xbd,\n+0xa9, 0xe1, 0x98, 0x05, 0x51, 0xa1, 0x4d, 0x37, 0xa2, 0x83, 0x79, 0xce, 0x8d, 0x1d, 0x2a, 0xe4,\n+0x84, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x67, 0x00,\n+0x30, 0x64, 0x02, 0x30, 0x25, 0xa4, 0x81, 0x45, 0x02, 0x6b, 0x12, 0x4b, 0x75, 0x74, 0x4f, 0xc8,\n+0x23, 0xe3, 0x70, 0xf2, 0x75, 0x72, 0xde, 0x7c, 0x89, 0xf0, 0xcf, 0x91, 0x72, 0x61, 0x9e, 0x5e,\n+0x10, 0x92, 0x59, 0x56, 0xb9, 0x83, 0xc7, 0x10, 0xe7, 0x38, 0xe9, 0x58, 0x26, 0x36, 0x7d, 0xd5,\n+0xe4, 0x34, 0x86, 0x39, 0x02, 0x30, 0x7c, 0x36, 0x53, 0xf0, 0x30, 0xe5, 0x62, 0x63, 0x3a, 0x99,\n+0xe2, 0xb6, 0xa3, 0x3b, 0x9b, 0x34, 0xfa, 0x1e, 0xda, 0x10, 0x92, 0x71, 0x5e, 0x91, 0x13, 0xa7,\n+0xdd, 0xa4, 0x6e, 0x92, 0xcc, 0x32, 0xd6, 0xf5, 0x21, 0x66, 0xc7, 0x2f, 0xea, 0x96, 0x63, 0x6a,\n+0x65, 0x45, 0x92, 0x95, 0x01, 0xb4, 0x30, 0x82, 0x04, 0x00, 0x30, 0x82, 0x02, 0xe8, 0xa0, 0x03,\n+0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54,\n+0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75,\n+0x70, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73,\n+0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34,\n+0x30, 0x36, 0x32, 0x39, 0x31, 0x37, 0x30, 0x36, 0x32, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x30,\n+0x36, 0x32, 0x39, 0x31, 0x37, 0x30, 0x36, 0x32, 0x30, 0x5a, 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79,\n+0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f,\n+0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20,\n+0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n+0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30,\n+0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n+0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00,\n+0xde, 0x9d, 0xd7, 0xea, 0x57, 0x18, 0x49, 0xa1, 0x5b, 0xeb, 0xd7, 0x5f, 0x48, 0x86, 0xea, 0xbe,\n+0xdd, 0xff, 0xe4, 0xef, 0x67, 0x1c, 0xf4, 0x65, 0x68, 0xb3, 0x57, 0x71, 0xa0, 0x5e, 0x77, 0xbb,\n+0xed, 0x9b, 0x49, 0xe9, 0x70, 0x80, 0x3d, 0x56, 0x18, 0x63, 0x08, 0x6f, 0xda, 0xf2, 0xcc, 0xd0,\n+0x3f, 0x7f, 0x02, 0x54, 0x22, 0x54, 0x10, 0xd8, 0xb2, 0x81, 0xd4, 0xc0, 0x75, 0x3d, 0x4b, 0x7f,\n+0xc7, 0x77, 0xc3, 0x3e, 0x78, 0xab, 0x1a, 0x03, 0xb5, 0x20, 0x6b, 0x2f, 0x6a, 0x2b, 0xb1, 0xc5,\n+0x88, 0x7e, 0xc4, 0xbb, 0x1e, 0xb0, 0xc1, 0xd8, 0x45, 0x27, 0x6f, 0xaa, 0x37, 0x58, 0xf7, 0x87,\n+0x26, 0xd7, 0xd8, 0x2d, 0xf6, 0xa9, 0x17, 0xb7, 0x1f, 0x72, 0x36, 0x4e, 0xa6, 0x17, 0x3f, 0x65,\n+0x98, 0x92, 0xdb, 0x2a, 0x6e, 0x5d, 0xa2, 0xfe, 0x88, 0xe0, 0x0b, 0xde, 0x7f, 0xe5, 0x8d, 0x15,\n+0xe1, 0xeb, 0xcb, 0x3a, 0xd5, 0xe2, 0x12, 0xa2, 0x13, 0x2d, 0xd8, 0x8e, 0xaf, 0x5f, 0x12, 0x3d,\n+0xa0, 0x08, 0x05, 0x08, 0xb6, 0x5c, 0xa5, 0x65, 0x38, 0x04, 0x45, 0x99, 0x1e, 0xa3, 0x60, 0x60,\n+0x74, 0xc5, 0x41, 0xa5, 0x72, 0x62, 0x1b, 0x62, 0xc5, 0x1f, 0x6f, 0x5f, 0x1a, 0x42, 0xbe, 0x02,\n+0x51, 0x65, 0xa8, 0xae, 0x23, 0x18, 0x6a, 0xfc, 0x78, 0x03, 0xa9, 0x4d, 0x7f, 0x80, 0xc3, 0xfa,\n+0xab, 0x5a, 0xfc, 0xa1, 0x40, 0xa4, 0xca, 0x19, 0x16, 0xfe, 0xb2, 0xc8, 0xef, 0x5e, 0x73, 0x0d,\n+0xee, 0x77, 0xbd, 0x9a, 0xf6, 0x79, 0x98, 0xbc, 0xb1, 0x07, 0x67, 0xa2, 0x15, 0x0d, 0xdd, 0xa0,\n+0x58, 0xc6, 0x44, 0x7b, 0x0a, 0x3e, 0x62, 0x28, 0x5f, 0xba, 0x41, 0x07, 0x53, 0x58, 0xcf, 0x11,\n+0x7e, 0x38, 0x74, 0xc5, 0xf8, 0xff, 0xb5, 0x69, 0x90, 0x8f, 0x84, 0x74, 0xea, 0x97, 0x1b, 0xaf,\n+0x02, 0x01, 0x03, 0xa3, 0x81, 0xc0, 0x30, 0x81, 0xbd, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\n+0x04, 0x16, 0x04, 0x14, 0xd2, 0xc4, 0xb0, 0xd2, 0x91, 0xd4, 0x4c, 0x11, 0x71, 0xb3, 0x61, 0xcb,\n+0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, 0xd4, 0xe3, 0x30, 0x81, 0x8d, 0x06, 0x03, 0x55, 0x1d, 0x23,\n+0x04, 0x81, 0x85, 0x30, 0x81, 0x82, 0x80, 0x14, 0xd2, 0xc4, 0xb0, 0xd2, 0x91, 0xd4, 0x4c, 0x11,\n+0x71, 0xb3, 0x61, 0xcb, 0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, 0xd4, 0xe3, 0xa1, 0x67, 0xa4, 0x65,\n+0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f,\n+0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e,\n+0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20,\n+0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65,\n+0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n+0x6f, 0x72, 0x69, 0x74, 0x79, 0x82, 0x01, 0x00, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0x4b, 0xf3, 0xb2, 0xca, 0x3e,\n+0x91, 0xfc, 0x12, 0xc6, 0xa1, 0x07, 0x8c, 0x8e, 0x77, 0xa0, 0x33, 0x06, 0x14, 0x5c, 0x90, 0x1e,\n+0x18, 0xf7, 0x08, 0xa6, 0x3d, 0x0a, 0x19, 0xf9, 0x87, 0x80, 0x11, 0x6e, 0x69, 0xe4, 0x96, 0x17,\n+0x30, 0xff, 0x34, 0x91, 0x63, 0x72, 0x38, 0xee, 0xcc, 0x1c, 0x01, 0xa3, 0x1d, 0x94, 0x28, 0xa4,\n+0x31, 0xf6, 0x7a, 0xc4, 0x54, 0xd7, 0xf6, 0xe5, 0x31, 0x58, 0x03, 0xa2, 0xcc, 0xce, 0x62, 0xdb,\n+0x94, 0x45, 0x73, 0xb5, 0xbf, 0x45, 0xc9, 0x24, 0xb5, 0xd5, 0x82, 0x02, 0xad, 0x23, 0x79, 0x69,\n+0x8d, 0xb8, 0xb6, 0x4d, 0xce, 0xcf, 0x4c, 0xca, 0x33, 0x23, 0xe8, 0x1c, 0x88, 0xaa, 0x9d, 0x8b,\n+0x41, 0x6e, 0x16, 0xc9, 0x20, 0xe5, 0x89, 0x9e, 0xcd, 0x3b, 0xda, 0x70, 0xf7, 0x7e, 0x99, 0x26,\n+0x20, 0x14, 0x54, 0x25, 0xab, 0x6e, 0x73, 0x85, 0xe6, 0x9b, 0x21, 0x9d, 0x0a, 0x6c, 0x82, 0x0e,\n+0xa8, 0xf8, 0xc2, 0x0c, 0xfa, 0x10, 0x1e, 0x6c, 0x96, 0xef, 0x87, 0x0d, 0xc4, 0x0f, 0x61, 0x8b,\n+0xad, 0xee, 0x83, 0x2b, 0x95, 0xf8, 0x8e, 0x92, 0x84, 0x72, 0x39, 0xeb, 0x20, 0xea, 0x83, 0xed,\n+0x83, 0xcd, 0x97, 0x6e, 0x08, 0xbc, 0xeb, 0x4e, 0x26, 0xb6, 0x73, 0x2b, 0xe4, 0xd3, 0xf6, 0x4c,\n+0xfe, 0x26, 0x71, 0xe2, 0x61, 0x11, 0x74, 0x4a, 0xff, 0x57, 0x1a, 0x87, 0x0f, 0x75, 0x48, 0x2e,\n+0xcf, 0x51, 0x69, 0x17, 0xa0, 0x02, 0x12, 0x61, 0x95, 0xd5, 0xd1, 0x40, 0xb2, 0x10, 0x4c, 0xee,\n+0xc4, 0xac, 0x10, 0x43, 0xa6, 0xa5, 0x9e, 0x0a, 0xd5, 0x95, 0x62, 0x9a, 0x0d, 0xcf, 0x88, 0x82,\n+0xc5, 0x32, 0x0c, 0xe4, 0x2b, 0x9f, 0x45, 0xe6, 0x0d, 0x9f, 0x28, 0x9c, 0xb1, 0xb9, 0x2a, 0x5a,\n+0x57, 0xad, 0x37, 0x0f, 0xaf, 0x1d, 0x7f, 0xdb, 0xbd, 0x9f, 0x30, 0x82, 0x03, 0xc5, 0x30, 0x82,\n+0x02, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x83, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,\n+0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06,\n+0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65,\n+0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64,\n+0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30,\n+0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,\n+0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30,\n+0x81, 0x83, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e,\n+0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74,\n+0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e,\n+0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x47, 0x6f, 0x20,\n+0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n+0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,\n+0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x71, 0x62, 0x08, 0xf1, 0xfa, 0x59, 0x34, 0xf7, 0x1b,\n+0xc9, 0x18, 0xa3, 0xf7, 0x80, 0x49, 0x58, 0xe9, 0x22, 0x83, 0x13, 0xa6, 0xc5, 0x20, 0x43, 0x01,\n+0x3b, 0x84, 0xf1, 0xe6, 0x85, 0x49, 0x9f, 0x27, 0xea, 0xf6, 0x84, 0x1b, 0x4e, 0xa0, 0xb4, 0xdb,\n+0x70, 0x98, 0xc7, 0x32, 0x01, 0xb1, 0x05, 0x3e, 0x07, 0x4e, 0xee, 0xf4, 0xfa, 0x4f, 0x2f, 0x59,\n+0x30, 0x22, 0xe7, 0xab, 0x19, 0x56, 0x6b, 0xe2, 0x80, 0x07, 0xfc, 0xf3, 0x16, 0x75, 0x80, 0x39,\n+0x51, 0x7b, 0xe5, 0xf9, 0x35, 0xb6, 0x74, 0x4e, 0xa9, 0x8d, 0x82, 0x13, 0xe4, 0xb6, 0x3f, 0xa9,\n+0x03, 0x83, 0xfa, 0xa2, 0xbe, 0x8a, 0x15, 0x6a, 0x7f, 0xde, 0x0b, 0xc3, 0xb6, 0x19, 0x14, 0x05,\n+0xca, 0xea, 0xc3, 0xa8, 0x04, 0x94, 0x3b, 0x46, 0x7c, 0x32, 0x0d, 0xf3, 0x00, 0x66, 0x22, 0xc8,\n+0x8d, 0x69, 0x6d, 0x36, 0x8c, 0x11, 0x18, 0xb7, 0xd3, 0xb2, 0x1c, 0x60, 0xb4, 0x38, 0xfa, 0x02,\n+0x8c, 0xce, 0xd3, 0xdd, 0x46, 0x07, 0xde, 0x0a, 0x3e, 0xeb, 0x5d, 0x7c, 0xc8, 0x7c, 0xfb, 0xb0,\n+0x2b, 0x53, 0xa4, 0x92, 0x62, 0x69, 0x51, 0x25, 0x05, 0x61, 0x1a, 0x44, 0x81, 0x8c, 0x2c, 0xa9,\n+0x43, 0x96, 0x23, 0xdf, 0xac, 0x3a, 0x81, 0x9a, 0x0e, 0x29, 0xc5, 0x1c, 0xa9, 0xe9, 0x5d, 0x1e,\n+0xb6, 0x9e, 0x9e, 0x30, 0x0a, 0x39, 0xce, 0xf1, 0x88, 0x80, 0xfb, 0x4b, 0x5d, 0xcc, 0x32, 0xec,\n+0x85, 0x62, 0x43, 0x25, 0x34, 0x02, 0x56, 0x27, 0x01, 0x91, 0xb4, 0x3b, 0x70, 0x2a, 0x3f, 0x6e,\n+0xb1, 0xe8, 0x9c, 0x88, 0x01, 0x7d, 0x9f, 0xd4, 0xf9, 0xdb, 0x53, 0x6d, 0x60, 0x9d, 0xbf, 0x2c,\n+0xe7, 0x58, 0xab, 0xb8, 0x5f, 0x46, 0xfc, 0xce, 0xc4, 0x1b, 0x03, 0x3c, 0x09, 0xeb, 0x49, 0x31,\n+0x5c, 0x69, 0x46, 0xb3, 0xe0, 0x47, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x3a, 0x9a, 0x85, 0x07, 0x10,\n+0x67, 0x28, 0xb6, 0xef, 0xf6, 0xbd, 0x05, 0x41, 0x6e, 0x20, 0xc1, 0x94, 0xda, 0x0f, 0xde, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82,\n+0x01, 0x01, 0x00, 0x99, 0xdb, 0x5d, 0x79, 0xd5, 0xf9, 0x97, 0x59, 0x67, 0x03, 0x61, 0xf1, 0x7e,\n+0x3b, 0x06, 0x31, 0x75, 0x2d, 0xa1, 0x20, 0x8e, 0x4f, 0x65, 0x87, 0xb4, 0xf7, 0xa6, 0x9c, 0xbc,\n+0xd8, 0xe9, 0x2f, 0xd0, 0xdb, 0x5a, 0xee, 0xcf, 0x74, 0x8c, 0x73, 0xb4, 0x38, 0x42, 0xda, 0x05,\n+0x7b, 0xf8, 0x02, 0x75, 0xb8, 0xfd, 0xa5, 0xb1, 0xd7, 0xae, 0xf6, 0xd7, 0xde, 0x13, 0xcb, 0x53,\n+0x10, 0x7e, 0x8a, 0x46, 0xd1, 0x97, 0xfa, 0xb7, 0x2e, 0x2b, 0x11, 0xab, 0x90, 0xb0, 0x27, 0x80,\n+0xf9, 0xe8, 0x9f, 0x5a, 0xe9, 0x37, 0x9f, 0xab, 0xe4, 0xdf, 0x6c, 0xb3, 0x85, 0x17, 0x9d, 0x3d,\n+0xd9, 0x24, 0x4f, 0x79, 0x91, 0x35, 0xd6, 0x5f, 0x04, 0xeb, 0x80, 0x83, 0xab, 0x9a, 0x02, 0x2d,\n+0xb5, 0x10, 0xf4, 0xd8, 0x90, 0xc7, 0x04, 0x73, 0x40, 0xed, 0x72, 0x25, 0xa0, 0xa9, 0x9f, 0xec,\n+0x9e, 0xab, 0x68, 0x12, 0x99, 0x57, 0xc6, 0x8f, 0x12, 0x3a, 0x09, 0xa4, 0xbd, 0x44, 0xfd, 0x06,\n+0x15, 0x37, 0xc1, 0x9b, 0xe4, 0x32, 0xa3, 0xed, 0x38, 0xe8, 0xd8, 0x64, 0xf3, 0x2c, 0x7e, 0x14,\n+0xfc, 0x02, 0xea, 0x9f, 0xcd, 0xff, 0x07, 0x68, 0x17, 0xdb, 0x22, 0x90, 0x38, 0x2d, 0x7a, 0x8d,\n+0xd1, 0x54, 0xf1, 0x69, 0xe3, 0x5f, 0x33, 0xca, 0x7a, 0x3d, 0x7b, 0x0a, 0xe3, 0xca, 0x7f, 0x5f,\n+0x39, 0xe5, 0xe2, 0x75, 0xba, 0xc5, 0x76, 0x18, 0x33, 0xce, 0x2c, 0xf0, 0x2f, 0x4c, 0xad, 0xf7,\n+0xb1, 0xe7, 0xce, 0x4f, 0xa8, 0xc4, 0x9b, 0x4a, 0x54, 0x06, 0xc5, 0x7f, 0x7d, 0xd5, 0x08, 0x0f,\n+0xe2, 0x1c, 0xfe, 0x7e, 0x17, 0xb8, 0xac, 0x5e, 0xf6, 0xd4, 0x16, 0xb2, 0x43, 0x09, 0x0c, 0x4d,\n+0xf6, 0xa7, 0x6b, 0xb4, 0x99, 0x84, 0x65, 0xca, 0x7a, 0x88, 0xe2, 0xe2, 0x44, 0xbe, 0x5c, 0xf7,\n+0xea, 0x1c, 0xf5, 0x30, 0x82, 0x04, 0x31, 0x30, 0x82, 0x03, 0x19, 0xa0, 0x03, 0x02, 0x01, 0x02,\n+0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,\n+0x05, 0x00, 0x30, 0x81, 0x95, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x47, 0x52, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c,\n+0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61,\n+0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74,\n+0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x20, 0x41,\n+0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x37, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64,\n+0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63,\n+0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52,\n+0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31,\n+0x31, 0x32, 0x30, 0x36, 0x31, 0x33, 0x34, 0x39, 0x35, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31,\n+0x32, 0x30, 0x31, 0x31, 0x33, 0x34, 0x39, 0x35, 0x32, 0x5a, 0x30, 0x81, 0x95, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x52, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63,\n+0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61,\n+0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n+0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x37, 0x48, 0x65, 0x6c, 0x6c, 0x65,\n+0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64,\n+0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74,\n+0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30,\n+0x31, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,\n+0x01, 0x01, 0x00, 0xa9, 0x53, 0x00, 0xe3, 0x2e, 0xa6, 0xf6, 0x8e, 0xfa, 0x60, 0xd8, 0x2d, 0x95,\n+0x3e, 0xf8, 0x2c, 0x2a, 0x54, 0x4e, 0xcd, 0xb9, 0x84, 0x61, 0x94, 0x58, 0x4f, 0x8f, 0x3d, 0x8b,\n+0xe4, 0x43, 0xf3, 0x75, 0x89, 0x8d, 0x51, 0xe4, 0xc3, 0x37, 0xd2, 0x8a, 0x88, 0x4d, 0x79, 0x1e,\n+0xb7, 0x12, 0xdd, 0x43, 0x78, 0x4a, 0x8a, 0x92, 0xe6, 0xd7, 0x48, 0xd5, 0x0f, 0xa4, 0x3a, 0x29,\n+0x44, 0x35, 0xb8, 0x07, 0xf6, 0x68, 0x1d, 0x55, 0xcd, 0x38, 0x51, 0xf0, 0x8c, 0x24, 0x31, 0x85,\n+0xaf, 0x83, 0xc9, 0x7d, 0xe9, 0x77, 0xaf, 0xed, 0x1a, 0x7b, 0x9d, 0x17, 0xf9, 0xb3, 0x9d, 0x38,\n+0x50, 0x0f, 0xa6, 0x5a, 0x79, 0x91, 0x80, 0xaf, 0x37, 0xae, 0xa6, 0xd3, 0x31, 0xfb, 0xb5, 0x26,\n+0x09, 0x9d, 0x3c, 0x5a, 0xef, 0x51, 0xc5, 0x2b, 0xdf, 0x96, 0x5d, 0xeb, 0x32, 0x1e, 0x02, 0xda,\n+0x70, 0x49, 0xec, 0x6e, 0x0c, 0xc8, 0x9a, 0x37, 0x8d, 0xf7, 0xf1, 0x36, 0x60, 0x4b, 0x26, 0x2c,\n+0x82, 0x9e, 0xd0, 0x78, 0xf3, 0x0d, 0x0f, 0x63, 0xa4, 0x51, 0x30, 0xe1, 0xf9, 0x2b, 0x27, 0x12,\n+0x07, 0xd8, 0xea, 0xbd, 0x18, 0x62, 0x98, 0xb0, 0x59, 0x37, 0x7d, 0xbe, 0xee, 0xf3, 0x20, 0x51,\n+0x42, 0x5a, 0x83, 0xef, 0x93, 0xba, 0x69, 0x15, 0xf1, 0x62, 0x9d, 0x9f, 0x99, 0x39, 0x82, 0xa1,\n+0xb7, 0x74, 0x2e, 0x8b, 0xd4, 0xc5, 0x0b, 0x7b, 0x2f, 0xf0, 0xc8, 0x0a, 0xda, 0x3d, 0x79, 0x0a,\n+0x9a, 0x93, 0x1c, 0xa5, 0x28, 0x72, 0x73, 0x91, 0x43, 0x9a, 0xa7, 0xd1, 0x4d, 0x85, 0x84, 0xb9,\n+0xa9, 0x74, 0x8f, 0x14, 0x40, 0xc7, 0xdc, 0xde, 0xac, 0x41, 0x64, 0x6c, 0xb4, 0x19, 0x9b, 0x02,\n+0x63, 0x6d, 0x24, 0x64, 0x8f, 0x44, 0xb2, 0x25, 0xea, 0xce, 0x5d, 0x74, 0x0c, 0x63, 0x32, 0x5c,\n+0x8d, 0x87, 0xe5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x89, 0x30, 0x81, 0x86, 0x30, 0x0f,\n+0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n+0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03,\n+0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, 0x91, 0x42, 0xfd, 0x13, 0x61, 0x4a, 0x23, 0x9e,\n+0x08, 0xa4, 0x29, 0xe5, 0xd8, 0x13, 0x04, 0x23, 0xee, 0x41, 0x25, 0x30, 0x47, 0x06, 0x03, 0x55,\n+0x1d, 0x1e, 0x04, 0x40, 0x30, 0x3e, 0xa0, 0x3c, 0x30, 0x05, 0x82, 0x03, 0x2e, 0x67, 0x72, 0x30,\n+0x05, 0x82, 0x03, 0x2e, 0x65, 0x75, 0x30, 0x06, 0x82, 0x04, 0x2e, 0x65, 0x64, 0x75, 0x30, 0x06,\n+0x82, 0x04, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x05, 0x81, 0x03, 0x2e, 0x67, 0x72, 0x30, 0x05, 0x81,\n+0x03, 0x2e, 0x65, 0x75, 0x30, 0x06, 0x81, 0x04, 0x2e, 0x65, 0x64, 0x75, 0x30, 0x06, 0x81, 0x04,\n+0x2e, 0x6f, 0x72, 0x67, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x1f, 0xef, 0x79, 0x41, 0xe1, 0x7b, 0x6e, 0x3f,\n+0xb2, 0x8c, 0x86, 0x37, 0x42, 0x4a, 0x4e, 0x1c, 0x37, 0x1e, 0x8d, 0x66, 0xba, 0x24, 0x81, 0xc9,\n+0x4f, 0x12, 0x0f, 0x21, 0xc0, 0x03, 0x97, 0x86, 0x25, 0x6d, 0x5d, 0xd3, 0x22, 0x29, 0xa8, 0x6c,\n+0xa2, 0x0d, 0xa9, 0xeb, 0x3d, 0x06, 0x5b, 0x99, 0x3a, 0xc7, 0xcc, 0xc3, 0x9a, 0x34, 0x7f, 0xab,\n+0x0e, 0xc8, 0x4e, 0x1c, 0xe1, 0xfa, 0xe4, 0xdc, 0xcd, 0x0d, 0xbe, 0xbf, 0x24, 0xfe, 0x6c, 0xe7,\n+0x6b, 0xc2, 0x0d, 0xc8, 0x06, 0x9e, 0x4e, 0x8d, 0x61, 0x28, 0xa6, 0x6a, 0xfd, 0xe5, 0xf6, 0x62,\n+0xea, 0x18, 0x3c, 0x4e, 0xa0, 0x53, 0x9d, 0xb2, 0x3a, 0x9c, 0xeb, 0xa5, 0x9c, 0x91, 0x16, 0xb6,\n+0x4d, 0x82, 0xe0, 0x0c, 0x05, 0x48, 0xa9, 0x6c, 0xf5, 0xcc, 0xf8, 0xcb, 0x9d, 0x49, 0xb4, 0xf0,\n+0x02, 0xa5, 0xfd, 0x70, 0x03, 0xed, 0x8a, 0x21, 0xa5, 0xae, 0x13, 0x86, 0x49, 0xc3, 0x33, 0x73,\n+0xbe, 0x87, 0x3b, 0x74, 0x8b, 0x17, 0x45, 0x26, 0x4c, 0x16, 0x91, 0x83, 0xfe, 0x67, 0x7d, 0xcd,\n+0x4d, 0x63, 0x67, 0xfa, 0xf3, 0x03, 0x12, 0x96, 0x78, 0x06, 0x8d, 0xb1, 0x67, 0xed, 0x8e, 0x3f,\n+0xbe, 0x9f, 0x4f, 0x02, 0xf5, 0xb3, 0x09, 0x2f, 0xf3, 0x4c, 0x87, 0xdf, 0x2a, 0xcb, 0x95, 0x7c,\n+0x01, 0xcc, 0xac, 0x36, 0x7a, 0xbf, 0xa2, 0x73, 0x7a, 0xf7, 0x8f, 0xc1, 0xb5, 0x9a, 0xa1, 0x14,\n+0xb2, 0x8f, 0x33, 0x9f, 0x0d, 0xef, 0x22, 0xdc, 0x66, 0x7b, 0x84, 0xbd, 0x45, 0x17, 0x06, 0x3d,\n+0x3c, 0xca, 0xb9, 0x77, 0x34, 0x8f, 0xca, 0xea, 0xcf, 0x3f, 0x31, 0x3e, 0xe3, 0x88, 0xe3, 0x80,\n+0x49, 0x25, 0xc8, 0x97, 0xb5, 0x9d, 0x9a, 0x99, 0x4d, 0xb0, 0x3c, 0xf8, 0x4a, 0x00, 0x9b, 0x64,\n+0xdd, 0x9f, 0x39, 0x4b, 0xd1, 0x27, 0xd7, 0xb8, 0x30, 0x82, 0x03, 0x30, 0x30, 0x82, 0x02, 0x18,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0xe8, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x0d, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x31,\n+0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f,\n+0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20,\n+0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x30, 0x35, 0x31, 0x35, 0x30, 0x35, 0x31, 0x33, 0x31,\n+0x34, 0x5a, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x35, 0x31, 0x35, 0x30, 0x34, 0x35, 0x32, 0x32, 0x39,\n+0x5a, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b,\n+0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x48, 0x6f, 0x6e, 0x67, 0x6b,\n+0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,\n+0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xac, 0xff, 0x38, 0xb6, 0xe9,\n+0x66, 0x02, 0x49, 0xe3, 0xa2, 0xb4, 0xe1, 0x90, 0xf9, 0x40, 0x8f, 0x79, 0xf9, 0xe2, 0xbd, 0x79,\n+0xfe, 0x02, 0xbd, 0xee, 0x24, 0x92, 0x1d, 0x22, 0xf6, 0xda, 0x85, 0x72, 0x69, 0xfe, 0xd7, 0x3f,\n+0x09, 0xd4, 0xdd, 0x91, 0xb5, 0x02, 0x9c, 0xd0, 0x8d, 0x5a, 0xe1, 0x55, 0xc3, 0x50, 0x86, 0xb9,\n+0x29, 0x26, 0xc2, 0xe3, 0xd9, 0xa0, 0xf1, 0x69, 0x03, 0x28, 0x20, 0x80, 0x45, 0x22, 0x2d, 0x56,\n+0xa7, 0x3b, 0x54, 0x95, 0x56, 0x22, 0x59, 0x1f, 0x28, 0xdf, 0x1f, 0x20, 0x3d, 0x6d, 0xa2, 0x36,\n+0xbe, 0x23, 0xa0, 0xb1, 0x6e, 0xb5, 0xb1, 0x27, 0x3f, 0x39, 0x53, 0x09, 0xea, 0xab, 0x6a, 0xe8,\n+0x74, 0xb2, 0xc2, 0x65, 0x5c, 0x8e, 0xbf, 0x7c, 0xc3, 0x78, 0x84, 0xcd, 0x9e, 0x16, 0xfc, 0xf5,\n+0x2e, 0x4f, 0x20, 0x2a, 0x08, 0x9f, 0x77, 0xf3, 0xc5, 0x1e, 0xc4, 0x9a, 0x52, 0x66, 0x1e, 0x48,\n+0x5e, 0xe3, 0x10, 0x06, 0x8f, 0x22, 0x98, 0xe1, 0x65, 0x8e, 0x1b, 0x5d, 0x23, 0x66, 0x3b, 0xb8,\n+0xa5, 0x32, 0x51, 0xc8, 0x86, 0xaa, 0xa1, 0xa9, 0x9e, 0x7f, 0x76, 0x94, 0xc2, 0xa6, 0x6c, 0xb7,\n+0x41, 0xf0, 0xd5, 0xc8, 0x06, 0x38, 0xe6, 0xd4, 0x0c, 0xe2, 0xf3, 0x3b, 0x4c, 0x6d, 0x50, 0x8c,\n+0xc4, 0x83, 0x27, 0xc1, 0x13, 0x84, 0x59, 0x3d, 0x9e, 0x75, 0x74, 0xb6, 0xd8, 0x02, 0x5e, 0x3a,\n+0x90, 0x7a, 0xc0, 0x42, 0x36, 0x72, 0xec, 0x6a, 0x4d, 0xdc, 0xef, 0xc4, 0x00, 0xdf, 0x13, 0x18,\n+0x57, 0x5f, 0x26, 0x78, 0xc8, 0xd6, 0x0a, 0x79, 0x77, 0xbf, 0xf7, 0xaf, 0xb7, 0x76, 0xb9, 0xa5,\n+0x0b, 0x84, 0x17, 0x5d, 0x10, 0xea, 0x6f, 0xe1, 0xab, 0x95, 0x11, 0x5f, 0x6d, 0x3c, 0xa3, 0x5c,\n+0x4d, 0x83, 0x5b, 0xf2, 0xb3, 0x19, 0x8a, 0x80, 0x8b, 0x0b, 0x87, 0x02, 0x03, 0x01, 0x00, 0x01,\n+0xa3, 0x26, 0x30, 0x24, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08,\n+0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x03, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n+0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x0e, 0x46, 0xd5, 0x3c,\n+0xae, 0xe2, 0x87, 0xd9, 0x5e, 0x81, 0x8b, 0x02, 0x98, 0x41, 0x08, 0x8c, 0x4c, 0xbc, 0xda, 0xdb,\n+0xee, 0x27, 0x1b, 0x82, 0xe7, 0x6a, 0x45, 0xec, 0x16, 0x8b, 0x4f, 0x85, 0xa0, 0xf3, 0xb2, 0x70,\n+0xbd, 0x5a, 0x96, 0xba, 0xca, 0x6e, 0x6d, 0xee, 0x46, 0x8b, 0x6e, 0xe7, 0x2a, 0x2e, 0x96, 0xb3,\n+0x19, 0x33, 0xeb, 0xb4, 0x9f, 0xa8, 0xb2, 0x37, 0xee, 0x98, 0xa8, 0x97, 0xb6, 0x2e, 0xb6, 0x67,\n+0x27, 0xd4, 0xa6, 0x49, 0xfd, 0x1c, 0x93, 0x65, 0x76, 0x9e, 0x42, 0x2f, 0xdc, 0x22, 0x6c, 0x9a,\n+0x4f, 0xf2, 0x5a, 0x15, 0x39, 0xb1, 0x71, 0xd7, 0x2b, 0x51, 0xe8, 0x6d, 0x1c, 0x98, 0xc0, 0xd9,\n+0x2a, 0xf4, 0xa1, 0x82, 0x7b, 0xd5, 0xc9, 0x41, 0xa2, 0x23, 0x01, 0x74, 0x38, 0x55, 0x8b, 0x0f,\n+0xb9, 0x2e, 0x67, 0xa2, 0x20, 0x04, 0x37, 0xda, 0x9c, 0x0b, 0xd3, 0x17, 0x21, 0xe0, 0x8f, 0x97,\n+0x79, 0x34, 0x6f, 0x84, 0x48, 0x02, 0x20, 0x33, 0x1b, 0xe6, 0x34, 0x44, 0x9f, 0x91, 0x70, 0xf4,\n+0x80, 0x5e, 0x84, 0x43, 0xc2, 0x29, 0xd2, 0x6c, 0x12, 0x14, 0xe4, 0x61, 0x8d, 0xac, 0x10, 0x90,\n+0x9e, 0x84, 0x50, 0xbb, 0xf0, 0x96, 0x6f, 0x45, 0x9f, 0x8a, 0xf3, 0xca, 0x6c, 0x4f, 0xfa, 0x11,\n+0x3a, 0x15, 0x15, 0x46, 0xc3, 0xcd, 0x1f, 0x83, 0x5b, 0x2d, 0x41, 0x12, 0xed, 0x50, 0x67, 0x41,\n+0x13, 0x3d, 0x21, 0xab, 0x94, 0x8a, 0xaa, 0x4e, 0x7c, 0xc1, 0xb1, 0xfb, 0xa7, 0xd6, 0xb5, 0x27,\n+0x2f, 0x97, 0xab, 0x6e, 0xe0, 0x1d, 0xe2, 0xd1, 0x1c, 0x2c, 0x1f, 0x44, 0xe2, 0xfc, 0xbe, 0x91,\n+0xa1, 0x9c, 0xfb, 0xd6, 0x29, 0x53, 0x73, 0x86, 0x9f, 0x53, 0xd8, 0x43, 0x0e, 0x5d, 0xd6, 0x63,\n+0x82, 0x71, 0x1d, 0x80, 0x74, 0xca, 0xf6, 0xe2, 0x02, 0x6b, 0xd9, 0x5a, 0x30, 0x82, 0x05, 0xf1,\n+0x30, 0x82, 0x03, 0xd9, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x00, 0xb0, 0xb7, 0x5a, 0x16,\n+0x48, 0x5f, 0xbf, 0xe1, 0xcb, 0xf5, 0x8b, 0xd7, 0x19, 0xe6, 0x7d, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x38, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x0c, 0x0b, 0x49, 0x5a, 0x45, 0x4e, 0x50, 0x45, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31,\n+0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0a, 0x49, 0x7a, 0x65, 0x6e, 0x70, 0x65,\n+0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x31, 0x32, 0x31, 0x33, 0x31, 0x33,\n+0x30, 0x38, 0x32, 0x38, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x31, 0x33, 0x30, 0x38, 0x32,\n+0x37, 0x32, 0x35, 0x5a, 0x30, 0x38, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x45, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x49, 0x5a,\n+0x45, 0x4e, 0x50, 0x45, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x0c, 0x0a, 0x49, 0x7a, 0x65, 0x6e, 0x70, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82,\n+0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc9,\n+0xd3, 0x7a, 0xca, 0x0f, 0x1e, 0xac, 0xa7, 0x86, 0xe8, 0x16, 0x65, 0x6a, 0xb1, 0xc2, 0x1b, 0x45,\n+0x32, 0x71, 0x95, 0xd9, 0xfe, 0x10, 0x5b, 0xcc, 0xaf, 0xe7, 0xa5, 0x79, 0x01, 0x8f, 0x89, 0xc3,\n+0xca, 0xf2, 0x55, 0x71, 0xf7, 0x77, 0xbe, 0x77, 0x94, 0xf3, 0x72, 0xa4, 0x2c, 0x44, 0xd8, 0x9e,\n+0x92, 0x9b, 0x14, 0x3a, 0xa1, 0xe7, 0x24, 0x90, 0x0a, 0x0a, 0x56, 0x8e, 0xc5, 0xd8, 0x26, 0x94,\n+0xe1, 0xd9, 0x48, 0xe1, 0x2d, 0x3e, 0xda, 0x0a, 0x72, 0xdd, 0xa3, 0x99, 0x15, 0xda, 0x81, 0xa2,\n+0x87, 0xf4, 0x7b, 0x6e, 0x26, 0x77, 0x89, 0x58, 0xad, 0xd6, 0xeb, 0x0c, 0xb2, 0x41, 0x7a, 0x73,\n+0x6e, 0x6d, 0xdb, 0x7a, 0x78, 0x41, 0xe9, 0x08, 0x88, 0x12, 0x7e, 0x87, 0x2e, 0x66, 0x11, 0x63,\n+0x6c, 0x54, 0xfb, 0x3c, 0x9d, 0x72, 0xc0, 0xbc, 0x2e, 0xff, 0xc2, 0xb7, 0xdd, 0x0d, 0x76, 0xe3,\n+0x3a, 0xd7, 0xf7, 0xb4, 0x68, 0xbe, 0xa2, 0xf5, 0xe3, 0x81, 0x6e, 0xc1, 0x46, 0x6f, 0x5d, 0x8d,\n+0xe0, 0x4d, 0xc6, 0x54, 0x55, 0x89, 0x1a, 0x33, 0x31, 0x0a, 0xb1, 0x57, 0xb9, 0xa3, 0x8a, 0x98,\n+0xc3, 0xec, 0x3b, 0x34, 0xc5, 0x95, 0x41, 0x69, 0x7e, 0x75, 0xc2, 0x3c, 0x20, 0xc5, 0x61, 0xba,\n+0x51, 0x47, 0xa0, 0x20, 0x90, 0x93, 0xa1, 0x90, 0x4b, 0xf3, 0x4e, 0x7c, 0x85, 0x45, 0x54, 0x9a,\n+0xd1, 0x05, 0x26, 0x41, 0xb0, 0xb5, 0x4d, 0x1d, 0x33, 0xbe, 0xc4, 0x03, 0xc8, 0x25, 0x7c, 0xc1,\n+0x70, 0xdb, 0x3b, 0xf4, 0x09, 0x2d, 0x54, 0x27, 0x48, 0xac, 0x2f, 0xe1, 0xc4, 0xac, 0x3e, 0xc8,\n+0xcb, 0x92, 0x4c, 0x53, 0x39, 0x37, 0x23, 0xec, 0xd3, 0x01, 0xf9, 0xe0, 0x09, 0x44, 0x4d, 0x4d,\n+0x64, 0xc0, 0xe1, 0x0d, 0x5a, 0x87, 0x22, 0xbc, 0xad, 0x1b, 0xa3, 0xfe, 0x26, 0xb5, 0x15, 0xf3,\n+0xa7, 0xfc, 0x84, 0x19, 0xe9, 0xec, 0xa1, 0x88, 0xb4, 0x44, 0x69, 0x84, 0x83, 0xf3, 0x89, 0xd1,\n+0x74, 0x06, 0xa9, 0xcc, 0x0b, 0xd6, 0xc2, 0xde, 0x27, 0x85, 0x50, 0x26, 0xca, 0x17, 0xb8, 0xc9,\n+0x7a, 0x87, 0x56, 0x2c, 0x1a, 0x01, 0x1e, 0x6c, 0xbe, 0x13, 0xad, 0x10, 0xac, 0xb5, 0x24, 0xf5,\n+0x38, 0x91, 0xa1, 0xd6, 0x4b, 0xda, 0xf1, 0xbb, 0xd2, 0xde, 0x47, 0xb5, 0xf1, 0xbc, 0x81, 0xf6,\n+0x59, 0x6b, 0xcf, 0x19, 0x53, 0xe9, 0x8d, 0x15, 0xcb, 0x4a, 0xcb, 0xa9, 0x6f, 0x44, 0xe5, 0x1b,\n+0x41, 0xcf, 0xe1, 0x86, 0xa7, 0xca, 0xd0, 0x6a, 0x9f, 0xbc, 0x4c, 0x8d, 0x06, 0x33, 0x5a, 0xa2,\n+0x85, 0xe5, 0x90, 0x35, 0xa0, 0x62, 0x5c, 0x16, 0x4e, 0xf0, 0xe3, 0xa2, 0xfa, 0x03, 0x1a, 0xb4,\n+0x2c, 0x71, 0xb3, 0x58, 0x2c, 0xde, 0x7b, 0x0b, 0xdb, 0x1a, 0x0f, 0xeb, 0xde, 0x21, 0x1f, 0x06,\n+0x77, 0x06, 0x03, 0xb0, 0xc9, 0xef, 0x99, 0xfc, 0xc0, 0xb9, 0x4f, 0x0b, 0x86, 0x28, 0xfe, 0xd2,\n+0xb9, 0xea, 0xe3, 0xda, 0xa5, 0xc3, 0x47, 0x69, 0x12, 0xe0, 0xdb, 0xf0, 0xf6, 0x19, 0x8b, 0xed,\n+0x7b, 0x70, 0xd7, 0x02, 0xd6, 0xed, 0x87, 0x18, 0x28, 0x2c, 0x04, 0x24, 0x4c, 0x77, 0xe4, 0x48,\n+0x8a, 0x1a, 0xc6, 0x3b, 0x9a, 0xd4, 0x0f, 0xca, 0xfa, 0x75, 0xd2, 0x01, 0x40, 0x5a, 0x8d, 0x79,\n+0xbf, 0x8b, 0xcf, 0x4b, 0xcf, 0xaa, 0x16, 0xc1, 0x95, 0xe4, 0xad, 0x4c, 0x8a, 0x3e, 0x17, 0x91,\n+0xd4, 0xb1, 0x62, 0xe5, 0x82, 0xe5, 0x80, 0x04, 0xa4, 0x03, 0x7e, 0x8d, 0xbf, 0xda, 0x7f, 0xa2,\n+0x0f, 0x97, 0x4f, 0x0c, 0xd3, 0x0d, 0xfb, 0xd7, 0xd1, 0xe5, 0x72, 0x7e, 0x1c, 0xc8, 0x77, 0xff,\n+0x5b, 0x9a, 0x0f, 0xb7, 0xae, 0x05, 0x46, 0xe5, 0xf1, 0xa8, 0x16, 0xec, 0x47, 0xa4, 0x17, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xf6, 0x30, 0x81, 0xf3, 0x30, 0x81, 0xb0, 0x06, 0x03, 0x55,\n+0x1d, 0x11, 0x04, 0x81, 0xa8, 0x30, 0x81, 0xa5, 0x81, 0x0f, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x69,\n+0x7a, 0x65, 0x6e, 0x70, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0xa4, 0x81, 0x91, 0x30, 0x81, 0x8e, 0x31,\n+0x47, 0x30, 0x45, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x3e, 0x49, 0x5a, 0x45, 0x4e, 0x50, 0x45,\n+0x20, 0x53, 0x2e, 0x41, 0x2e, 0x20, 0x2d, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x30, 0x31, 0x33,\n+0x33, 0x37, 0x32, 0x36, 0x30, 0x2d, 0x52, 0x4d, 0x65, 0x72, 0x63, 0x2e, 0x56, 0x69, 0x74, 0x6f,\n+0x72, 0x69, 0x61, 0x2d, 0x47, 0x61, 0x73, 0x74, 0x65, 0x69, 0x7a, 0x20, 0x54, 0x31, 0x30, 0x35,\n+0x35, 0x20, 0x46, 0x36, 0x32, 0x20, 0x53, 0x38, 0x31, 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, 0x04,\n+0x09, 0x0c, 0x3a, 0x41, 0x76, 0x64, 0x61, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x4d, 0x65, 0x64, 0x69,\n+0x74, 0x65, 0x72, 0x72, 0x61, 0x6e, 0x65, 0x6f, 0x20, 0x45, 0x74, 0x6f, 0x72, 0x62, 0x69, 0x64,\n+0x65, 0x61, 0x20, 0x31, 0x34, 0x20, 0x2d, 0x20, 0x30, 0x31, 0x30, 0x31, 0x30, 0x20, 0x56, 0x69,\n+0x74, 0x6f, 0x72, 0x69, 0x61, 0x2d, 0x47, 0x61, 0x73, 0x74, 0x65, 0x69, 0x7a, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e,\n+0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1d, 0x1c, 0x65, 0x0e, 0xa8, 0xf2, 0x25,\n+0x7b, 0xb4, 0x91, 0xcf, 0xe4, 0xb1, 0xb1, 0xe6, 0xbd, 0x55, 0x74, 0x6c, 0x05, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,\n+0x00, 0x78, 0xa6, 0x0c, 0x16, 0x4a, 0x9f, 0x4c, 0x88, 0x3a, 0xc0, 0xcb, 0x0e, 0xa5, 0x16, 0x7d,\n+0x9f, 0xb9, 0x48, 0x5f, 0x18, 0x8f, 0x0d, 0x62, 0x36, 0xf6, 0xcd, 0x19, 0x6b, 0xac, 0xab, 0xd5,\n+0xf6, 0x91, 0x7d, 0xae, 0x71, 0xf3, 0x3f, 0xb3, 0x0e, 0x78, 0x85, 0x9b, 0x95, 0xa4, 0x27, 0x21,\n+0x47, 0x42, 0x4a, 0x7c, 0x48, 0x3a, 0xf5, 0x45, 0x7c, 0xb3, 0x0c, 0x8e, 0x51, 0x78, 0xac, 0x95,\n+0x13, 0xde, 0xc6, 0xfd, 0x7d, 0xb8, 0x1a, 0x90, 0x4c, 0xab, 0x92, 0x03, 0xc7, 0xed, 0x42, 0x01,\n+0xce, 0x0f, 0xd8, 0xb1, 0xfa, 0xa2, 0x92, 0xe1, 0x60, 0x6d, 0xae, 0x7a, 0x6b, 0x09, 0xaa, 0xc6,\n+0x29, 0xee, 0x68, 0x49, 0x67, 0x30, 0x80, 0x24, 0x7a, 0x31, 0x16, 0x39, 0x5b, 0x7e, 0xf1, 0x1c,\n+0x2e, 0xdd, 0x6c, 0x09, 0xad, 0xf2, 0x31, 0xc1, 0x82, 0x4e, 0xb9, 0xbb, 0xf9, 0xbe, 0xbf, 0x2a,\n+0x85, 0x3f, 0xc0, 0x40, 0xa3, 0x3a, 0x59, 0xfc, 0x59, 0x4b, 0x3c, 0x28, 0x24, 0xdb, 0xb4, 0x15,\n+0x75, 0xae, 0x0d, 0x88, 0xba, 0x2e, 0x73, 0xc0, 0xbd, 0x58, 0x87, 0xe5, 0x42, 0xf2, 0xeb, 0x5e,\n+0xee, 0x1e, 0x30, 0x22, 0x99, 0xcb, 0x37, 0xd1, 0xc4, 0x21, 0x6c, 0x81, 0xec, 0xbe, 0x6d, 0x26,\n+0xe6, 0x1c, 0xe4, 0x42, 0x20, 0x9e, 0x47, 0xb0, 0xac, 0x83, 0x59, 0x70, 0x2c, 0x35, 0xd6, 0xaf,\n+0x36, 0x34, 0xb4, 0xcd, 0x3b, 0xf8, 0x32, 0xa8, 0xef, 0xe3, 0x78, 0x89, 0xfb, 0x8d, 0x45, 0x2c,\n+0xda, 0x9c, 0xb8, 0x7e, 0x40, 0x1c, 0x61, 0xe7, 0x3e, 0xa2, 0x92, 0x2c, 0x4b, 0xf2, 0xcd, 0xfa,\n+0x98, 0xb6, 0x29, 0xff, 0xf3, 0xf2, 0x7b, 0xa9, 0x1f, 0x2e, 0xa0, 0x93, 0x57, 0x2b, 0xde, 0x85,\n+0x03, 0xf9, 0x69, 0x37, 0xcb, 0x9e, 0x78, 0x6a, 0x05, 0xb4, 0xc5, 0x31, 0x78, 0x89, 0xec, 0x7a,\n+0xa7, 0x85, 0xe1, 0xb9, 0x7b, 0x3c, 0xde, 0xbe, 0x1e, 0x79, 0x84, 0xce, 0x9f, 0x70, 0x0e, 0x59,\n+0xc2, 0x35, 0x2e, 0x90, 0x2a, 0x31, 0xd9, 0xe4, 0x45, 0x7a, 0x41, 0xa4, 0x2e, 0x13, 0x9b, 0x34,\n+0x0e, 0x66, 0x7b, 0x49, 0xab, 0x64, 0x97, 0xd0, 0x46, 0xc3, 0x79, 0x9d, 0x72, 0x50, 0x63, 0xa6,\n+0x98, 0x5b, 0x06, 0xbd, 0x48, 0x6d, 0xd8, 0x39, 0x83, 0x70, 0xe8, 0x35, 0xf0, 0x05, 0xd1, 0xaa,\n+0xbc, 0xe3, 0xdb, 0xc8, 0x02, 0xea, 0x7c, 0xfd, 0x82, 0xda, 0xc2, 0x5b, 0x52, 0x35, 0xae, 0x98,\n+0x3a, 0xad, 0xba, 0x35, 0x93, 0x23, 0xa7, 0x1f, 0x48, 0xdd, 0x35, 0x46, 0x98, 0xb2, 0x10, 0x68,\n+0xe4, 0xa5, 0x31, 0xc2, 0x0a, 0x58, 0x2e, 0x19, 0x81, 0x10, 0xc9, 0x50, 0x75, 0xfc, 0xea, 0x5a,\n+0x16, 0xce, 0x11, 0xd7, 0xee, 0xef, 0x50, 0x88, 0x2d, 0x61, 0xff, 0x3f, 0x42, 0x73, 0x05, 0x94,\n+0x43, 0xd5, 0x8e, 0x3c, 0x4e, 0x01, 0x3a, 0x19, 0xa5, 0x1f, 0x46, 0x4e, 0x77, 0xd0, 0x5d, 0xe5,\n+0x81, 0x22, 0x21, 0x87, 0xfe, 0x94, 0x7d, 0x84, 0xd8, 0x93, 0xad, 0xd6, 0x68, 0x43, 0x48, 0xb2,\n+0xdb, 0xeb, 0x73, 0x24, 0xe7, 0x91, 0x7f, 0x54, 0xa4, 0xb6, 0x80, 0x3e, 0x9d, 0xa3, 0x3c, 0x4c,\n+0x72, 0xc2, 0x57, 0xc4, 0xa0, 0xd4, 0xcc, 0x38, 0x27, 0xce, 0xd5, 0x06, 0x9e, 0xa2, 0x48, 0xd9,\n+0xe9, 0x9f, 0xce, 0x82, 0x70, 0x36, 0x93, 0x9a, 0x3b, 0xdf, 0x96, 0x21, 0xe3, 0x59, 0xb7, 0x0c,\n+0xda, 0x91, 0x37, 0xf0, 0xfd, 0x59, 0x5a, 0xb3, 0x99, 0xc8, 0x69, 0x6c, 0x43, 0x26, 0x01, 0x35,\n+0x63, 0x60, 0x55, 0x89, 0x03, 0x3a, 0x75, 0xd8, 0xba, 0x4a, 0xd9, 0x54, 0xff, 0xee, 0xde, 0x80,\n+0xd8, 0x2d, 0xd1, 0x38, 0xd5, 0x5e, 0x2d, 0x0b, 0x98, 0x7d, 0x3e, 0x6c, 0xdb, 0xfc, 0x26, 0x88,\n+0xc7, 0x30, 0x82, 0x03, 0xc3, 0x30, 0x82, 0x02, 0xab, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01,\n+0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n+0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45,\n+0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x22, 0x54, 0x2d, 0x53, 0x79, 0x73,\n+0x74, 0x65, 0x6d, 0x73, 0x20, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x20,\n+0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x1f, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x16, 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,\n+0x73, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x31, 0x25,\n+0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, 0x54, 0x2d, 0x54, 0x65, 0x6c, 0x65, 0x53,\n+0x65, 0x63, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x6c,\n+0x61, 0x73, 0x73, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x30, 0x30, 0x31, 0x31,\n+0x30, 0x34, 0x30, 0x31, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x33, 0x31, 0x30, 0x30, 0x31, 0x32, 0x33,\n+0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x22,\n+0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70,\n+0x72, 0x69, 0x73, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x47, 0x6d,\n+0x62, 0x48, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x16, 0x54, 0x2d, 0x53,\n+0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e,\n+0x74, 0x65, 0x72, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, 0x54, 0x2d,\n+0x54, 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,\n+0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xaa, 0x5f, 0xda, 0x1b, 0x5f,\n+0xe8, 0x73, 0x91, 0xe5, 0xda, 0x5c, 0xf4, 0xa2, 0xe6, 0x47, 0xe5, 0xf3, 0x68, 0x55, 0x60, 0x05,\n+0x1d, 0x02, 0xa4, 0xb3, 0x9b, 0x59, 0xf3, 0x1e, 0x8a, 0xaf, 0x34, 0xad, 0xfc, 0x0d, 0xc2, 0xd9,\n+0x48, 0x19, 0xee, 0x69, 0x8f, 0xc9, 0x20, 0xfc, 0x21, 0xaa, 0x07, 0x19, 0xed, 0xb0, 0x5c, 0xac,\n+0x65, 0xc7, 0x5f, 0xed, 0x02, 0x7c, 0x7b, 0x7c, 0x2d, 0x1b, 0xd6, 0xba, 0xb9, 0x80, 0xc2, 0x18,\n+0x82, 0x16, 0x84, 0xfa, 0x66, 0xb0, 0x08, 0xc6, 0x54, 0x23, 0x81, 0xe4, 0xcd, 0xb9, 0x49, 0x3f,\n+0xf6, 0x4f, 0x6e, 0x37, 0x48, 0x28, 0x38, 0x0f, 0xc5, 0xbe, 0xe7, 0x68, 0x70, 0xfd, 0x39, 0x97,\n+0x4d, 0xd2, 0xc7, 0x98, 0x91, 0x50, 0xaa, 0xc4, 0x44, 0xb3, 0x23, 0x7d, 0x39, 0x47, 0xe9, 0x52,\n+0x62, 0xd6, 0x12, 0x93, 0x5e, 0xb7, 0x31, 0x96, 0x42, 0x05, 0xfb, 0x76, 0xa7, 0x1e, 0xa3, 0xf5,\n+0xc2, 0xfc, 0xe9, 0x7a, 0xc5, 0x6c, 0xa9, 0x71, 0x4f, 0xea, 0xcb, 0x78, 0xbc, 0x60, 0xaf, 0xc7,\n+0xde, 0xf4, 0xd9, 0xcb, 0xbe, 0x7e, 0x33, 0xa5, 0x6e, 0x94, 0x83, 0xf0, 0x34, 0xfa, 0x21, 0xab,\n+0xea, 0x8e, 0x72, 0xa0, 0x3f, 0xa4, 0xde, 0x30, 0x5b, 0xef, 0x86, 0x4d, 0x6a, 0x95, 0x5b, 0x43,\n+0x44, 0xa8, 0x10, 0x15, 0x1c, 0xe5, 0x01, 0x57, 0xc5, 0x98, 0xf1, 0xe6, 0x06, 0x28, 0x91, 0xaa,\n+0x20, 0xc5, 0xb7, 0x53, 0x26, 0x51, 0x43, 0xb2, 0x0b, 0x11, 0x95, 0x58, 0xe1, 0xc0, 0x0f, 0x76,\n+0xd9, 0xc0, 0x8d, 0x7c, 0x81, 0xf3, 0x72, 0x70, 0x9e, 0x6f, 0xfe, 0x1a, 0x8e, 0xd9, 0x5f, 0x35,\n+0xc6, 0xb2, 0x6f, 0x34, 0x7c, 0xbe, 0x48, 0x4f, 0xe2, 0x5a, 0x39, 0xd7, 0xd8, 0x9d, 0x78, 0x9e,\n+0x9f, 0x86, 0x3e, 0x03, 0x5e, 0x19, 0x8b, 0x44, 0xa2, 0xd5, 0xc7, 0x02, 0x03, 0x01, 0x00, 0x01,\n+0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n+0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+0xbf, 0x59, 0x20, 0x36, 0x00, 0x79, 0xa0, 0xa0, 0x22, 0x6b, 0x8c, 0xd5, 0xf2, 0x61, 0xd2, 0xb8,\n+0x2c, 0xcb, 0x82, 0x4a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x31, 0x03, 0xa2, 0x61, 0x0b, 0x1f, 0x74, 0xe8,\n+0x72, 0x36, 0xc6, 0x6d, 0xf9, 0x4d, 0x9e, 0xfa, 0x22, 0xa8, 0xe1, 0x81, 0x56, 0xcf, 0xcd, 0xbb,\n+0x9f, 0xea, 0xab, 0x91, 0x19, 0x38, 0xaf, 0xaa, 0x7c, 0x15, 0x4d, 0xf3, 0xb6, 0xa3, 0x8d, 0xa5,\n+0xf4, 0x8e, 0xf6, 0x44, 0xa9, 0xa7, 0xe8, 0x21, 0x95, 0xad, 0x3e, 0x00, 0x62, 0x16, 0x88, 0xf0,\n+0x02, 0xba, 0xfc, 0x61, 0x23, 0xe6, 0x33, 0x9b, 0x30, 0x7a, 0x6b, 0x36, 0x62, 0x7b, 0xad, 0x04,\n+0x23, 0x84, 0x58, 0x65, 0xe2, 0xdb, 0x2b, 0x8a, 0xe7, 0x25, 0x53, 0x37, 0x62, 0x53, 0x5f, 0xbc,\n+0xda, 0x01, 0x62, 0x29, 0xa2, 0xa6, 0x27, 0x71, 0xe6, 0x3a, 0x22, 0x7e, 0xc1, 0x6f, 0x1d, 0x95,\n+0x70, 0x20, 0x4a, 0x07, 0x34, 0xdf, 0xea, 0xff, 0x15, 0x80, 0xe5, 0xba, 0xd7, 0x7a, 0xd8, 0x5b,\n+0x75, 0x7c, 0x05, 0x7a, 0x29, 0x47, 0x7e, 0x40, 0xa8, 0x31, 0x13, 0x77, 0xcd, 0x40, 0x3b, 0xb4,\n+0x51, 0x47, 0x7a, 0x2e, 0x11, 0xe3, 0x47, 0x11, 0xde, 0x9d, 0x66, 0xd0, 0x8b, 0xd5, 0x54, 0x66,\n+0xfa, 0x83, 0x55, 0xea, 0x7c, 0xc2, 0x29, 0x89, 0x1b, 0xe9, 0x6f, 0xb3, 0xce, 0xe2, 0x05, 0x84,\n+0xc9, 0x2f, 0x3e, 0x78, 0x85, 0x62, 0x6e, 0xc9, 0x5f, 0xc1, 0x78, 0x63, 0x74, 0x58, 0xc0, 0x48,\n+0x18, 0x0c, 0x99, 0x39, 0xeb, 0xa4, 0xcc, 0x1a, 0xb5, 0x79, 0x5a, 0x8d, 0x15, 0x9c, 0xd8, 0x14,\n+0x0d, 0xf6, 0x7a, 0x07, 0x57, 0xc7, 0x22, 0x83, 0x05, 0x2d, 0x3c, 0x9b, 0x25, 0x26, 0x3d, 0x18,\n+0xb3, 0xa9, 0x43, 0x7c, 0xc8, 0xc8, 0xab, 0x64, 0x8f, 0x0e, 0xa3, 0xbf, 0x9c, 0x1b, 0x9d, 0x30,\n+0xdb, 0xda, 0xd0, 0x19, 0x2e, 0xaa, 0x3c, 0xf1, 0xfb, 0x33, 0x80, 0x76, 0xe4, 0xcd, 0xad, 0x19,\n+0x4f, 0x05, 0x27, 0x8e, 0x13, 0xa1, 0x6e, 0xc2, 0x30, 0x82, 0x03, 0xc3, 0x30, 0x82, 0x02, 0xab,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x0c, 0x22, 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x45, 0x6e, 0x74, 0x65,\n+0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20,\n+0x47, 0x6d, 0x62, 0x48, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x16, 0x54,\n+0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43,\n+0x65, 0x6e, 0x74, 0x65, 0x72, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c,\n+0x54, 0x2d, 0x54, 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x30, 0x1e, 0x17, 0x0d,\n+0x30, 0x38, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x32, 0x39, 0x35, 0x36, 0x5a, 0x17, 0x0d, 0x33,\n+0x33, 0x31, 0x30, 0x30, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x82, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x2b, 0x30, 0x29,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x22, 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,\n+0x20, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76,\n+0x69, 0x63, 0x65, 0x73, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x0c, 0x16, 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x54, 0x72,\n+0x75, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x0c, 0x1c, 0x54, 0x2d, 0x54, 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x20, 0x47,\n+0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20,\n+0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01,\n+0x01, 0x00, 0xbd, 0x75, 0x93, 0xf0, 0x62, 0x22, 0x6f, 0x24, 0xae, 0xe0, 0x7a, 0x76, 0xac, 0x7d,\n+0xbd, 0xd9, 0x24, 0xd5, 0xb8, 0xb7, 0xfc, 0xcd, 0xf0, 0x42, 0xe0, 0xeb, 0x78, 0x88, 0x56, 0x5e,\n+0x9b, 0x9a, 0x54, 0x1d, 0x4d, 0x0c, 0x8a, 0xf6, 0xd3, 0xcf, 0x70, 0xf4, 0x52, 0xb5, 0xd8, 0x93,\n+0x04, 0xe3, 0x46, 0x86, 0x71, 0x41, 0x4a, 0x2b, 0xf0, 0x2a, 0x2c, 0x55, 0x03, 0xd6, 0x48, 0xc3,\n+0xe0, 0x39, 0x38, 0xed, 0xf2, 0x5c, 0x3c, 0x3f, 0x44, 0xbc, 0x93, 0x3d, 0x61, 0xab, 0x4e, 0xcd,\n+0x0d, 0xbe, 0xf0, 0x20, 0x27, 0x58, 0x0e, 0x44, 0x7f, 0x04, 0x1a, 0x87, 0xa5, 0xd7, 0x96, 0x14,\n+0x36, 0x90, 0xd0, 0x49, 0x7b, 0xa1, 0x75, 0xfb, 0x1a, 0x6b, 0x73, 0xb1, 0xf8, 0xce, 0xa9, 0x09,\n+0x2c, 0xf2, 0x53, 0xd5, 0xc3, 0x14, 0x44, 0xb8, 0x86, 0xa5, 0xf6, 0x8b, 0x2b, 0x39, 0xda, 0xa3,\n+0x33, 0x54, 0xd9, 0xfa, 0x72, 0x1a, 0xf7, 0x22, 0x15, 0x1c, 0x88, 0x91, 0x6b, 0x7f, 0x66, 0xe5,\n+0xc3, 0x6a, 0x80, 0xb0, 0x24, 0xf3, 0xdf, 0x86, 0x45, 0x88, 0xfd, 0x19, 0x7f, 0x75, 0x87, 0x1f,\n+0x1f, 0xb1, 0x1b, 0x0a, 0x73, 0x24, 0x5b, 0xb9, 0x65, 0xe0, 0x2c, 0x54, 0xc8, 0x60, 0xd3, 0x66,\n+0x17, 0x3f, 0xe1, 0xcc, 0x54, 0x33, 0x73, 0x91, 0x02, 0x3a, 0xa6, 0x7f, 0x7b, 0x76, 0x39, 0xa2,\n+0x1f, 0x96, 0xb6, 0x38, 0xae, 0xb5, 0xc8, 0x93, 0x74, 0x1d, 0x9e, 0xb9, 0xb4, 0xe5, 0x60, 0x9d,\n+0x2f, 0x56, 0xd1, 0xe0, 0xeb, 0x5e, 0x5b, 0x4c, 0x12, 0x70, 0x0c, 0x6c, 0x44, 0x20, 0xab, 0x11,\n+0xd8, 0xf4, 0x19, 0xf6, 0xd2, 0x9c, 0x52, 0x37, 0xe7, 0xfa, 0xb6, 0xc2, 0x31, 0x3b, 0x4a, 0xd4,\n+0x14, 0x99, 0xad, 0xc7, 0x1a, 0xf5, 0x5d, 0x5f, 0xfa, 0x07, 0xb8, 0x7c, 0x0d, 0x1f, 0xd6, 0x83,\n+0x1e, 0xb3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55,\n+0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03,\n+0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03,\n+0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb5, 0x03, 0xf7, 0x76, 0x3b, 0x61, 0x82, 0x6a, 0x12,\n+0xaa, 0x18, 0x53, 0xeb, 0x03, 0x21, 0x94, 0xbf, 0xfe, 0xce, 0xca, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x56,\n+0x3d, 0xef, 0x94, 0xd5, 0xbd, 0xda, 0x73, 0xb2, 0x58, 0xbe, 0xae, 0x90, 0xad, 0x98, 0x27, 0x97,\n+0xfe, 0x01, 0xb1, 0xb0, 0x52, 0x00, 0xb8, 0x4d, 0xe4, 0x1b, 0x21, 0x74, 0x1b, 0x7e, 0xc0, 0xee,\n+0x5e, 0x69, 0x2a, 0x25, 0xaf, 0x5c, 0xd6, 0x1d, 0xda, 0xd2, 0x79, 0xc9, 0xf3, 0x97, 0x29, 0xe0,\n+0x86, 0x87, 0xde, 0x04, 0x59, 0x0f, 0xf1, 0x59, 0xd4, 0x64, 0x85, 0x4b, 0x99, 0xaf, 0x25, 0x04,\n+0x1e, 0xc9, 0x46, 0xa9, 0x97, 0xde, 0x82, 0xb2, 0x1b, 0x70, 0x9f, 0x9c, 0xf6, 0xaf, 0x71, 0x31,\n+0xdd, 0x7b, 0x05, 0xa5, 0x2c, 0xd3, 0xb9, 0xca, 0x47, 0xf6, 0xca, 0xf2, 0xf6, 0xe7, 0xad, 0xb9,\n+0x48, 0x3f, 0xbc, 0x16, 0xb7, 0xc1, 0x6d, 0xf4, 0xea, 0x09, 0xaf, 0xec, 0xf3, 0xb5, 0xe7, 0x05,\n+0x9e, 0xa6, 0x1e, 0x8a, 0x53, 0x51, 0xd6, 0x93, 0x81, 0xcc, 0x74, 0x93, 0xf6, 0xb9, 0xda, 0xa6,\n+0x25, 0x05, 0x74, 0x79, 0x5a, 0x7e, 0x40, 0x3e, 0x82, 0x4b, 0x26, 0x11, 0x30, 0x6e, 0xe1, 0x3f,\n+0x41, 0xc7, 0x47, 0x00, 0x35, 0xd5, 0xf5, 0xd3, 0xf7, 0x54, 0x3e, 0x81, 0x3d, 0xda, 0x49, 0x6a,\n+0x9a, 0xb3, 0xef, 0x10, 0x3d, 0xe6, 0xeb, 0x6f, 0xd1, 0xc8, 0x22, 0x47, 0xcb, 0xcc, 0xcf, 0x01,\n+0x31, 0x92, 0xd9, 0x18, 0xe3, 0x22, 0xbe, 0x09, 0x1e, 0x1a, 0x3e, 0x5a, 0xb2, 0xe4, 0x6b, 0x0c,\n+0x54, 0x7a, 0x7d, 0x43, 0x4e, 0xb8, 0x89, 0xa5, 0x7b, 0xd7, 0xa2, 0x3d, 0x96, 0x86, 0xcc, 0xf2,\n+0x26, 0x34, 0x2d, 0x6a, 0x92, 0x9d, 0x9a, 0x1a, 0xd0, 0x30, 0xe2, 0x5d, 0x4e, 0x04, 0xb0, 0x5f,\n+0x8b, 0x20, 0x7e, 0x77, 0xc1, 0x3d, 0x95, 0x82, 0xd1, 0x46, 0x9a, 0x3b, 0x3c, 0x78, 0xb8, 0x6f,\n+0xa1, 0xd0, 0x0d, 0x64, 0xa2, 0x78, 0x1e, 0x29, 0x4e, 0x93, 0xc3, 0xa4, 0x54, 0x14, 0x5b, 0x30,\n+0x82, 0x05, 0x41, 0x30, 0x82, 0x03, 0x29, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x0c, 0xbe,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,\n+0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x12,\n+0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x54, 0x41, 0x49, 0x57, 0x41, 0x4e, 0x2d,\n+0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x43, 0x41, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x54,\n+0x57, 0x43, 0x41, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x36, 0x32, 0x37, 0x30, 0x36, 0x32, 0x38,\n+0x33, 0x33, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x35, 0x35, 0x39, 0x35,\n+0x39, 0x5a, 0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54,\n+0x57, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x54, 0x41, 0x49, 0x57,\n+0x41, 0x4e, 0x2d, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x13, 0x13, 0x54, 0x57, 0x43, 0x41, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02,\n+0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb0, 0x05, 0xdb, 0xc8, 0xeb, 0x8c, 0xc4, 0x6e, 0x8a, 0x21,\n+0xef, 0x8e, 0x4d, 0x9c, 0x71, 0x0a, 0x1f, 0x52, 0x70, 0xed, 0x6d, 0x82, 0x9c, 0x97, 0xc5, 0xd7,\n+0x4c, 0x4e, 0x45, 0x49, 0xcb, 0x40, 0x42, 0xb5, 0x12, 0x34, 0x6c, 0x19, 0xc2, 0x74, 0xa4, 0x31,\n+0x5f, 0x85, 0x02, 0x97, 0xec, 0x43, 0x33, 0x0a, 0x53, 0xd2, 0x9c, 0x8c, 0x8e, 0xb7, 0xb8, 0x79,\n+0xdb, 0x2b, 0xd5, 0x6a, 0xf2, 0x8e, 0x66, 0xc4, 0xee, 0x2b, 0x01, 0x07, 0x92, 0xd4, 0xb3, 0xd0,\n+0x02, 0xdf, 0x50, 0xf6, 0x55, 0xaf, 0x66, 0x0e, 0xcb, 0xe0, 0x47, 0x60, 0x2f, 0x2b, 0x32, 0x39,\n+0x35, 0x52, 0x3a, 0x28, 0x83, 0xf8, 0x7b, 0x16, 0xc6, 0x18, 0xb8, 0x62, 0xd6, 0x47, 0x25, 0x91,\n+0xce, 0xf0, 0x19, 0x12, 0x4d, 0xad, 0x63, 0xf5, 0xd3, 0x3f, 0x75, 0x5f, 0x29, 0xf0, 0xa1, 0x30,\n+0x1c, 0x2a, 0xa0, 0x98, 0xa6, 0x15, 0xbd, 0xee, 0xfd, 0x19, 0x36, 0xf0, 0xe2, 0x91, 0x43, 0x8f,\n+0xfa, 0xca, 0xd6, 0x10, 0x27, 0x49, 0x4c, 0xef, 0xdd, 0xc1, 0xf1, 0x85, 0x70, 0x9b, 0xca, 0xea,\n+0xa8, 0x5a, 0x43, 0xfc, 0x6d, 0x86, 0x6f, 0x73, 0xe9, 0x37, 0x45, 0xa9, 0xf0, 0x36, 0xc7, 0xcc,\n+0x88, 0x75, 0x1e, 0xbb, 0x6c, 0x06, 0xff, 0x9b, 0x6b, 0x3e, 0x17, 0xec, 0x61, 0xaa, 0x71, 0x7c,\n+0xc6, 0x1d, 0xa2, 0xf7, 0x49, 0xe9, 0x15, 0xb5, 0x3c, 0xd6, 0xa1, 0x61, 0xf5, 0x11, 0xf7, 0x05,\n+0x6f, 0x1d, 0xfd, 0x11, 0xbe, 0xd0, 0x30, 0x07, 0xc2, 0x29, 0xb0, 0x09, 0x4e, 0x26, 0xdc, 0xe3,\n+0xa2, 0xa8, 0x91, 0x6a, 0x1f, 0xc2, 0x91, 0x45, 0x88, 0x5c, 0xe5, 0x98, 0xb8, 0x71, 0xa5, 0x15,\n+0x19, 0xc9, 0x7c, 0x75, 0x11, 0xcc, 0x70, 0x74, 0x4f, 0x2d, 0x9b, 0x1d, 0x91, 0x44, 0xfd, 0x56,\n+0x28, 0xa0, 0xfe, 0xbb, 0x86, 0x6a, 0xc8, 0xfa, 0x5c, 0x0b, 0x58, 0xdc, 0xc6, 0x4b, 0x76, 0xc8,\n+0xab, 0x22, 0xd9, 0x73, 0x0f, 0xa5, 0xf4, 0x5a, 0x02, 0x89, 0x3f, 0x4f, 0x9e, 0x22, 0x82, 0xee,\n+0xa2, 0x74, 0x53, 0x2a, 0x3d, 0x53, 0x27, 0x69, 0x1d, 0x6c, 0x8e, 0x32, 0x2c, 0x64, 0x00, 0x26,\n+0x63, 0x61, 0x36, 0x4e, 0xa3, 0x46, 0xb7, 0x3f, 0x7d, 0xb3, 0x2d, 0xac, 0x6d, 0x90, 0xa2, 0x95,\n+0xa2, 0xce, 0xcf, 0xda, 0x82, 0xe7, 0x07, 0x34, 0x19, 0x96, 0xe9, 0xb8, 0x21, 0xaa, 0x29, 0x7e,\n+0xa6, 0x38, 0xbe, 0x8e, 0x29, 0x4a, 0x21, 0x66, 0x79, 0x1f, 0xb3, 0xc3, 0xb5, 0x09, 0x67, 0xde,\n+0xd6, 0xd4, 0x07, 0x46, 0xf3, 0x2a, 0xda, 0xe6, 0x22, 0x37, 0x60, 0xcb, 0x81, 0xb6, 0x0f, 0xa0,\n+0x0f, 0xe9, 0xc8, 0x95, 0x7f, 0xbf, 0x55, 0x91, 0x05, 0x7a, 0xcf, 0x3d, 0x15, 0xc0, 0x6f, 0xde,\n+0x09, 0x94, 0x01, 0x83, 0xd7, 0x34, 0x1b, 0xcc, 0x40, 0xa5, 0xf0, 0xb8, 0x9b, 0x67, 0xd5, 0x98,\n+0x91, 0x3b, 0xa7, 0x84, 0x78, 0x95, 0x26, 0xa4, 0x5a, 0x08, 0xf8, 0x2b, 0x74, 0xb4, 0x00, 0x04,\n+0x3c, 0xdf, 0xb8, 0x14, 0x8e, 0xe8, 0xdf, 0xa9, 0x8d, 0x6c, 0x67, 0x92, 0x33, 0x1d, 0xc0, 0xb7,\n+0xd2, 0xec, 0x92, 0xc8, 0xbe, 0x09, 0xbf, 0x2c, 0x29, 0x05, 0x6f, 0x02, 0x6b, 0x9e, 0xef, 0xbc,\n+0xbf, 0x2a, 0xbc, 0x5b, 0xc0, 0x50, 0x8f, 0x41, 0x70, 0x71, 0x87, 0xb2, 0x4d, 0xb7, 0x04, 0xa9,\n+0x84, 0xa3, 0x32, 0xaf, 0xae, 0xee, 0x6b, 0x17, 0x8b, 0xb2, 0xb1, 0xfe, 0x6c, 0xe1, 0x90, 0x8c,\n+0x88, 0xa8, 0x97, 0x48, 0xce, 0xc8, 0x4d, 0xcb, 0xf3, 0x06, 0xcf, 0x5f, 0x6a, 0x0a, 0x42, 0xb1,\n+0x1e, 0x1e, 0x77, 0x2f, 0x8e, 0xa0, 0xe6, 0x92, 0x0e, 0x06, 0xfc, 0x05, 0x22, 0xd2, 0x26, 0xe1,\n+0x31, 0x51, 0x7d, 0x32, 0xdc, 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x23, 0x30, 0x21, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03,\n+0x82, 0x02, 0x01, 0x00, 0x5f, 0x34, 0x81, 0x76, 0xef, 0x96, 0x1d, 0xd5, 0xe5, 0xb5, 0xd9, 0x02,\n+0x63, 0x84, 0x16, 0xc1, 0xae, 0xa0, 0x70, 0x51, 0xa7, 0xf7, 0x4c, 0x47, 0x35, 0xc8, 0x0b, 0xd7,\n+0x28, 0x3d, 0x89, 0x71, 0xd9, 0xaa, 0x33, 0x41, 0xea, 0x14, 0x1b, 0x6c, 0x21, 0x00, 0xc0, 0x6c,\n+0x42, 0x19, 0x7e, 0x9f, 0x69, 0x5b, 0x20, 0x42, 0xdf, 0xa2, 0xd2, 0xda, 0xc4, 0x7c, 0x97, 0x4b,\n+0x8d, 0xb0, 0xe8, 0xac, 0xc8, 0xee, 0xa5, 0x69, 0x04, 0x99, 0x0a, 0x92, 0xa6, 0xab, 0x27, 0x2e,\n+0x1a, 0x4d, 0x81, 0xbf, 0x84, 0xd4, 0x70, 0x1e, 0xad, 0x47, 0xfe, 0xfd, 0x4a, 0x9d, 0x33, 0xe0,\n+0xf2, 0xb9, 0xc4, 0x45, 0x08, 0x21, 0x0a, 0xda, 0x69, 0x69, 0x73, 0x72, 0x0d, 0xbe, 0x34, 0xfe,\n+0x94, 0x8b, 0xad, 0xc3, 0x1e, 0x35, 0xd7, 0xa2, 0x83, 0xef, 0xe5, 0x38, 0xc7, 0xa5, 0x85, 0x1f,\n+0xab, 0xcf, 0x34, 0xec, 0x3f, 0x28, 0xfe, 0x0c, 0xf1, 0x57, 0x86, 0x4e, 0xc9, 0x55, 0xf7, 0x1c,\n+0xd4, 0xd8, 0xa5, 0x7d, 0x06, 0x7a, 0x6f, 0xd5, 0xdf, 0x10, 0xdf, 0x81, 0x4e, 0x21, 0x65, 0xb1,\n+0xb6, 0xe1, 0x17, 0x79, 0x95, 0x45, 0x06, 0xce, 0x5f, 0xcc, 0xdc, 0x46, 0x89, 0x63, 0x68, 0x44,\n+0x8d, 0x93, 0xf4, 0x64, 0x70, 0xa0, 0x3d, 0x9d, 0x28, 0x05, 0xc3, 0x39, 0x70, 0xb8, 0x62, 0x7b,\n+0x20, 0xfd, 0xe4, 0xdb, 0xe9, 0x08, 0xa1, 0xb8, 0x9e, 0x3d, 0x09, 0xc7, 0x4f, 0xfb, 0x2c, 0xf8,\n+0x93, 0x76, 0x41, 0xde, 0x52, 0xe0, 0xe1, 0x57, 0xd2, 0x9d, 0x03, 0xbc, 0x77, 0x9e, 0xfe, 0x9e,\n+0x29, 0x5e, 0xf7, 0xc1, 0x51, 0x60, 0x1f, 0xde, 0xda, 0x0b, 0xb2, 0x2d, 0x75, 0xb7, 0x43, 0x48,\n+0x93, 0xe7, 0xf6, 0x79, 0xc6, 0x84, 0x5d, 0x80, 0x59, 0x60, 0x94, 0xfc, 0x78, 0x98, 0x8f, 0x3c,\n+0x93, 0x51, 0xed, 0x40, 0x90, 0x07, 0xdf, 0x64, 0x63, 0x24, 0xcb, 0x4e, 0x71, 0x05, 0xa1, 0xd7,\n+0x94, 0x1a, 0x88, 0x32, 0xf1, 0x22, 0x74, 0x22, 0xae, 0xa5, 0xa6, 0xd8, 0x12, 0x69, 0x4c, 0x60,\n+0xa3, 0x02, 0xee, 0x2b, 0xec, 0xd4, 0x63, 0x92, 0x0b, 0x5e, 0xbe, 0x2f, 0x76, 0x6b, 0xa3, 0xb6,\n+0x26, 0xbc, 0x8f, 0x03, 0xd8, 0x0a, 0xf2, 0x4c, 0x64, 0x46, 0xbd, 0x39, 0x62, 0xe5, 0x96, 0xeb,\n+0x34, 0x63, 0x11, 0x28, 0xcc, 0x95, 0xf1, 0xad, 0xef, 0xef, 0xdc, 0x80, 0x58, 0x48, 0xe9, 0x4b,\n+0xb8, 0xea, 0x65, 0xac, 0xe9, 0xfc, 0x80, 0xb5, 0xb5, 0xc8, 0x45, 0xf9, 0xac, 0xc1, 0x9f, 0xd9,\n+0xb9, 0xea, 0x62, 0x88, 0x8e, 0xc4, 0xf1, 0x4b, 0x83, 0x12, 0xad, 0xe6, 0x8b, 0x84, 0xd6, 0x9e,\n+0xc2, 0xeb, 0x83, 0x18, 0x9f, 0x6a, 0xbb, 0x1b, 0x24, 0x60, 0x33, 0x70, 0xcc, 0xec, 0xf7, 0x32,\n+0xf3, 0x5c, 0xd9, 0x79, 0x7d, 0xef, 0x9e, 0xa4, 0xfe, 0xc9, 0x23, 0xc3, 0x24, 0xee, 0x15, 0x92,\n+0xb1, 0x3d, 0x91, 0x4f, 0x26, 0x86, 0xbd, 0x66, 0x73, 0x24, 0x13, 0xea, 0xa4, 0xae, 0x63, 0xc1,\n+0xad, 0x7d, 0x84, 0x03, 0x3c, 0x10, 0x78, 0x86, 0x1b, 0x79, 0xe3, 0xc4, 0xf3, 0xf2, 0x04, 0x95,\n+0x20, 0xae, 0x23, 0x82, 0xc4, 0xb3, 0x3a, 0x00, 0x62, 0xbf, 0xe6, 0x36, 0x24, 0xe1, 0x57, 0xba,\n+0xc7, 0x1e, 0x90, 0x75, 0xd5, 0x5f, 0x3f, 0x95, 0x61, 0x2b, 0xc1, 0x3b, 0xcd, 0xe5, 0xb3, 0x68,\n+0x61, 0xd0, 0x46, 0x26, 0xa9, 0x21, 0x52, 0x69, 0x2d, 0xeb, 0x2e, 0xc7, 0xeb, 0x77, 0xce, 0xa6,\n+0x3a, 0xb5, 0x03, 0x33, 0x4f, 0x76, 0xd1, 0xe7, 0x5c, 0x54, 0x01, 0x5d, 0xcb, 0x78, 0xf4, 0xc9,\n+0x0c, 0xbf, 0xcf, 0x12, 0x8e, 0x17, 0x2d, 0x23, 0x68, 0x94, 0xe7, 0xab, 0xfe, 0xa9, 0xb2, 0x2b,\n+0x06, 0xd0, 0x04, 0xcd, 0x30, 0x82, 0x03, 0x7b, 0x30, 0x82, 0x02, 0x63, 0xa0, 0x03, 0x02, 0x01,\n+0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x05, 0x05, 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x54, 0x57, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x54, 0x41, 0x49,\n+0x57, 0x41, 0x4e, 0x2d, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c,\n+0x07, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x0c, 0x21, 0x54, 0x57, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x38, 0x32, 0x38, 0x30, 0x37,\n+0x32, 0x34, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x35, 0x35,\n+0x39, 0x35, 0x39, 0x5a, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x54, 0x57, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x54, 0x41,\n+0x49, 0x57, 0x41, 0x4e, 0x2d, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x0c, 0x07, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x0c, 0x21, 0x54, 0x57, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65,\n+0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n+0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,\n+0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0x7e, 0x72, 0xb8, 0xa4, 0x03, 0x94, 0xe6, 0xa7, 0xde,\n+0x09, 0x38, 0x91, 0x4a, 0x11, 0x40, 0x87, 0xa7, 0x7c, 0x59, 0x64, 0x14, 0x7b, 0xb5, 0x11, 0x10,\n+0xdd, 0xfe, 0xbf, 0xd5, 0xc0, 0xbb, 0x56, 0xe2, 0x85, 0x25, 0xf4, 0x35, 0x72, 0x0f, 0xf8, 0x53,\n+0xd0, 0x41, 0xe1, 0x44, 0x01, 0xc2, 0xb4, 0x1c, 0xc3, 0x31, 0x42, 0x16, 0x47, 0x85, 0x33, 0x22,\n+0x76, 0xb2, 0x0a, 0x6f, 0x0f, 0xe5, 0x25, 0x50, 0x4f, 0x85, 0x86, 0xbe, 0xbf, 0x98, 0x2e, 0x10,\n+0x67, 0x1e, 0xbe, 0x11, 0x05, 0x86, 0x05, 0x90, 0xc4, 0x59, 0xd0, 0x7c, 0x78, 0x10, 0xb0, 0x80,\n+0x5c, 0xb7, 0xe1, 0xc7, 0x2b, 0x75, 0xcb, 0x7c, 0x9f, 0xae, 0xb5, 0xd1, 0x9d, 0x23, 0x37, 0x63,\n+0xa7, 0xdc, 0x42, 0xa2, 0x2d, 0x92, 0x04, 0x1b, 0x50, 0xc1, 0x7b, 0xb8, 0x3e, 0x1b, 0xc9, 0x56,\n+0x04, 0x8b, 0x2f, 0x52, 0x9b, 0xad, 0xa9, 0x56, 0xe9, 0xc1, 0xff, 0xad, 0xa9, 0x58, 0x87, 0x30,\n+0xb6, 0x81, 0xf7, 0x97, 0x45, 0xfc, 0x19, 0x57, 0x3b, 0x2b, 0x6f, 0xe4, 0x47, 0xf4, 0x99, 0x45,\n+0xfe, 0x1d, 0xf1, 0xf8, 0x97, 0xa3, 0x88, 0x1d, 0x37, 0x1c, 0x5c, 0x8f, 0xe0, 0x76, 0x25, 0x9a,\n+0x50, 0xf8, 0xa0, 0x54, 0xff, 0x44, 0x90, 0x76, 0x23, 0xd2, 0x32, 0xc6, 0xc3, 0xab, 0x06, 0xbf,\n+0xfc, 0xfb, 0xbf, 0xf3, 0xad, 0x7d, 0x92, 0x62, 0x02, 0x5b, 0x29, 0xd3, 0x35, 0xa3, 0x93, 0x9a,\n+0x43, 0x64, 0x60, 0x5d, 0xb2, 0xfa, 0x32, 0xff, 0x3b, 0x04, 0xaf, 0x4d, 0x40, 0x6a, 0xf9, 0xc7,\n+0xe3, 0xef, 0x23, 0xfd, 0x6b, 0xcb, 0xe5, 0x0f, 0x8b, 0x38, 0x0d, 0xee, 0x0a, 0xfc, 0xfe, 0x0f,\n+0x98, 0x9f, 0x30, 0x31, 0xdd, 0x6c, 0x52, 0x65, 0xf9, 0x8b, 0x81, 0xbe, 0x22, 0xe1, 0x1c, 0x58,\n+0x03, 0xba, 0x91, 0x1b, 0x89, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x6a, 0x38, 0x5b, 0x26, 0x8d,\n+0xde, 0x8b, 0x5a, 0xf2, 0x4f, 0x7a, 0x54, 0x83, 0x19, 0x18, 0xe3, 0x08, 0x35, 0xa6, 0xba, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82,\n+0x01, 0x01, 0x00, 0x3c, 0xd5, 0x77, 0x3d, 0xda, 0xdf, 0x89, 0xba, 0x87, 0x0c, 0x08, 0x54, 0x6a,\n+0x20, 0x50, 0x92, 0xbe, 0xb0, 0x41, 0x3d, 0xb9, 0x26, 0x64, 0x83, 0x0a, 0x2f, 0xe8, 0x40, 0xc0,\n+0x97, 0x28, 0x27, 0x82, 0x30, 0x4a, 0xc9, 0x93, 0xff, 0x6a, 0xe7, 0xa6, 0x00, 0x7f, 0x89, 0x42,\n+0x9a, 0xd6, 0x11, 0xe5, 0x53, 0xce, 0x2f, 0xcc, 0xf2, 0xda, 0x05, 0xc4, 0xfe, 0xe2, 0x50, 0xc4,\n+0x3a, 0x86, 0x7d, 0xcc, 0xda, 0x7e, 0x10, 0x09, 0x3b, 0x92, 0x35, 0x2a, 0x53, 0xb2, 0xfe, 0xeb,\n+0x2b, 0x05, 0xd9, 0x6c, 0x5d, 0xe6, 0xd0, 0xef, 0xd3, 0x6a, 0x66, 0x9e, 0x15, 0x28, 0x85, 0x7a,\n+0xe8, 0x82, 0x00, 0xac, 0x1e, 0xa7, 0x09, 0x69, 0x56, 0x42, 0xd3, 0x68, 0x51, 0x18, 0xbe, 0x54,\n+0x9a, 0xbf, 0x44, 0x41, 0xba, 0x49, 0xbe, 0x20, 0xba, 0x69, 0x5c, 0xee, 0xb8, 0x77, 0xcd, 0xce,\n+0x6c, 0x1f, 0xad, 0x83, 0x96, 0x18, 0x7d, 0x0e, 0xb5, 0x14, 0x39, 0x84, 0xf1, 0x28, 0xe9, 0x2d,\n+0xa3, 0x9e, 0x7b, 0x1e, 0x7a, 0x72, 0x5a, 0x83, 0xb3, 0x79, 0x6f, 0xef, 0xb4, 0xfc, 0xd0, 0x0a,\n+0xa5, 0x58, 0x4f, 0x46, 0xdf, 0xfb, 0x6d, 0x79, 0x59, 0xf2, 0x84, 0x22, 0x52, 0xae, 0x0f, 0xcc,\n+0xfb, 0x7c, 0x3b, 0xe7, 0x6a, 0xca, 0x47, 0x61, 0xc3, 0x7a, 0xf8, 0xd3, 0x92, 0x04, 0x1f, 0xb8,\n+0x20, 0x84, 0xe1, 0x36, 0x54, 0x16, 0xc7, 0x40, 0xde, 0x3b, 0x8a, 0x73, 0xdc, 0xdf, 0xc6, 0x09,\n+0x4c, 0xdf, 0xec, 0xda, 0xff, 0xd4, 0x53, 0x42, 0xa1, 0xc9, 0xf2, 0x62, 0x1d, 0x22, 0x83, 0x3c,\n+0x97, 0xc5, 0xf9, 0x19, 0x62, 0x27, 0xac, 0x65, 0x22, 0xd7, 0xd3, 0x3c, 0xc6, 0xe5, 0x8e, 0xb2,\n+0x53, 0xcc, 0x49, 0xce, 0xbc, 0x30, 0xfe, 0x7b, 0x0e, 0x33, 0x90, 0xfb, 0xed, 0xd2, 0x14, 0x91,\n+0x1f, 0x07, 0xaf, 0x30, 0x82, 0x05, 0xa2, 0x30, 0x82, 0x03, 0x8a, 0xa0, 0x03, 0x02, 0x01, 0x02,\n+0x02, 0x14, 0x01, 0x94, 0x30, 0x1e, 0xa2, 0x0b, 0xdd, 0xf5, 0xc5, 0x33, 0x2a, 0xb1, 0x43, 0x44,\n+0x71, 0xf8, 0xd6, 0x50, 0x4d, 0x0d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x69, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x4b, 0x52, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1d, 0x4e,\n+0x41, 0x56, 0x45, 0x52, 0x20, 0x42, 0x55, 0x53, 0x49, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x50, 0x4c,\n+0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x2e, 0x31, 0x32, 0x30, 0x30,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x29, 0x4e, 0x41, 0x56, 0x45, 0x52, 0x20, 0x47, 0x6c, 0x6f,\n+0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x38, 0x31, 0x38, 0x30, 0x38, 0x35, 0x38, 0x34, 0x32,\n+0x5a, 0x17, 0x0d, 0x33, 0x37, 0x30, 0x38, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a,\n+0x30, 0x69, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4b, 0x52, 0x31,\n+0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1d, 0x4e, 0x41, 0x56, 0x45, 0x52, 0x20,\n+0x42, 0x55, 0x53, 0x49, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52,\n+0x4d, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03,\n+0x0c, 0x29, 0x4e, 0x41, 0x56, 0x45, 0x52, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52,\n+0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n+0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n+0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb6, 0xd4, 0xf1, 0x93,\n+0x5c, 0xb5, 0x40, 0x89, 0x0a, 0xab, 0x0d, 0x90, 0x5b, 0x50, 0x63, 0xae, 0x90, 0x94, 0x74, 0x17,\n+0x45, 0x72, 0xd6, 0x7b, 0x65, 0x5a, 0x29, 0x4b, 0xa7, 0x56, 0xa0, 0x4b, 0xb8, 0x2f, 0x42, 0x75,\n+0xe9, 0xd9, 0x7b, 0x24, 0x5a, 0x31, 0x65, 0xab, 0x17, 0x17, 0xd1, 0x33, 0x3a, 0xd9, 0x11, 0xdc,\n+0x40, 0x36, 0x87, 0xdf, 0xc7, 0x6a, 0xe9, 0x26, 0x5e, 0x59, 0x8a, 0x77, 0xe3, 0xe8, 0x48, 0x9c,\n+0x31, 0x16, 0xfa, 0x3e, 0x91, 0xb1, 0xca, 0xc9, 0xa3, 0xe2, 0x9f, 0xce, 0x21, 0x53, 0xa3, 0x02,\n+0x36, 0x30, 0xcb, 0x52, 0x02, 0xe5, 0xda, 0x32, 0x5d, 0xc3, 0xc5, 0xe6, 0xf9, 0xee, 0x11, 0xc7,\n+0x8b, 0xc9, 0x44, 0x1e, 0x84, 0x93, 0x18, 0x4a, 0xb4, 0x9f, 0xe5, 0x12, 0x64, 0x69, 0xd0, 0x26,\n+0x85, 0x62, 0x01, 0xb6, 0xc9, 0x02, 0x1d, 0xbe, 0x83, 0x51, 0xbb, 0x5c, 0xda, 0xf8, 0xad, 0x15,\n+0x6a, 0x99, 0xf7, 0x92, 0x54, 0xf7, 0x34, 0x5b, 0xe9, 0xbf, 0xea, 0x29, 0x81, 0x12, 0xd4, 0x53,\n+0x91, 0x96, 0xb3, 0x91, 0x5a, 0xdd, 0xfe, 0x90, 0x73, 0x28, 0xfb, 0x30, 0x46, 0xb5, 0xca, 0x08,\n+0x07, 0xc7, 0x71, 0x72, 0xc9, 0x66, 0xd3, 0x34, 0x97, 0xf6, 0x8c, 0xf4, 0x18, 0x4a, 0xe1, 0xd0,\n+0x3d, 0x5a, 0x45, 0xb6, 0x69, 0xa7, 0x29, 0xfb, 0x23, 0xce, 0x88, 0xd8, 0x12, 0x9c, 0x00, 0x48,\n+0xa8, 0xa6, 0x0f, 0xb3, 0x3b, 0x92, 0x8d, 0x71, 0x0e, 0x74, 0xc5, 0x8b, 0xc8, 0x4c, 0xf9, 0xf4,\n+0x9b, 0x8e, 0xb8, 0x3c, 0x69, 0xed, 0x6f, 0x3b, 0x50, 0x2f, 0x58, 0xed, 0xc4, 0xb0, 0xd0, 0x1c,\n+0x1b, 0x6a, 0x0c, 0xe2, 0xbc, 0x44, 0xaa, 0xd8, 0xcd, 0x14, 0x5d, 0x94, 0x78, 0x61, 0xbf, 0x0e,\n+0x6e, 0xda, 0x2a, 0xbc, 0x2f, 0x0c, 0x0b, 0x71, 0xa6, 0xb3, 0x16, 0x3f, 0x9c, 0xe6, 0xf9, 0xcc,\n+0x9f, 0x53, 0x35, 0xe2, 0x03, 0xa0, 0xa0, 0x18, 0xbf, 0xbb, 0xf1, 0xbe, 0xf4, 0xd6, 0x8c, 0x87,\n+0x0d, 0x42, 0xf7, 0x06, 0xb9, 0xf1, 0x6d, 0xed, 0x04, 0x94, 0xa8, 0xfe, 0xb6, 0xd3, 0x06, 0xc6,\n+0x40, 0x61, 0xdf, 0x9d, 0x9d, 0xf3, 0x54, 0x76, 0xce, 0x53, 0x3a, 0x01, 0xa6, 0x92, 0x41, 0xec,\n+0x04, 0xa3, 0x8f, 0x0d, 0xa2, 0xd5, 0x09, 0xca, 0xd6, 0xcb, 0x9a, 0xf1, 0xef, 0x43, 0x5d, 0xc0,\n+0xab, 0xa5, 0x41, 0xcf, 0x5c, 0x53, 0x70, 0x70, 0xc9, 0x88, 0xa6, 0x2d, 0xd4, 0x6b, 0x61, 0x73,\n+0x50, 0x26, 0x86, 0x61, 0x0e, 0x5f, 0x1b, 0xc2, 0x2b, 0xe2, 0x8c, 0xd5, 0xbb, 0x9d, 0xc1, 0x03,\n+0x42, 0xba, 0x94, 0xda, 0x5f, 0xa9, 0xb0, 0xca, 0xcc, 0x4d, 0x0a, 0xef, 0x47, 0x69, 0x03, 0x2f,\n+0x22, 0xfb, 0xf1, 0x28, 0xce, 0xbf, 0x5d, 0x50, 0x65, 0xa8, 0x90, 0x6d, 0xb3, 0x74, 0xb0, 0x08,\n+0xc7, 0xac, 0xa8, 0xd1, 0xeb, 0x3e, 0x9c, 0xfc, 0x5d, 0x1a, 0x83, 0x2e, 0x2b, 0xcb, 0xb5, 0xf3,\n+0x44, 0x9d, 0x3a, 0xa7, 0x17, 0x61, 0x96, 0xa2, 0x71, 0xd3, 0x70, 0x96, 0x15, 0x4d, 0xb7, 0x4c,\n+0x73, 0xee, 0x19, 0x5c, 0xc5, 0x5b, 0x3e, 0x41, 0xfe, 0xac, 0x75, 0x60, 0x3b, 0x1b, 0x63, 0xce,\n+0x00, 0xdd, 0xda, 0x08, 0x90, 0x62, 0xb4, 0xe5, 0x2d, 0xee, 0x48, 0xa7, 0x6b, 0x17, 0x99, 0x54,\n+0xbe, 0x87, 0x4a, 0xe3, 0xa9, 0x5e, 0x04, 0x4c, 0xeb, 0x10, 0x6d, 0x54, 0xd6, 0xef, 0xf1, 0xe8,\n+0xf2, 0x62, 0x16, 0xcb, 0x80, 0x6b, 0xed, 0x3d, 0xed, 0xf5, 0x1f, 0x30, 0xa5, 0xae, 0x4b, 0xc9,\n+0x13, 0xed, 0x8a, 0x01, 0x01, 0xc9, 0xb8, 0x51, 0x58, 0xc0, 0x66, 0x3a, 0xb1, 0x66, 0x4b, 0xc4,\n+0xd5, 0x31, 0x02, 0x62, 0xe9, 0x74, 0x84, 0x0c, 0xdb, 0x4d, 0x46, 0x2d, 0x02, 0x03, 0x01, 0x00,\n+0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+0xd2, 0x9f, 0x88, 0xdf, 0xa1, 0xcd, 0x2c, 0xbd, 0xec, 0xf5, 0x3b, 0x01, 0x01, 0x93, 0x33, 0x27,\n+0xb2, 0xeb, 0x60, 0x4b, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n+0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x32, 0xca, 0x80, 0xb3, 0x9d, 0x3d, 0x54,\n+0x06, 0xdd, 0xd2, 0xd2, 0x2e, 0xf0, 0xa4, 0x01, 0x21, 0x0b, 0x67, 0x48, 0xca, 0x6d, 0x8e, 0xe0,\n+0xc8, 0xaa, 0x0d, 0xaa, 0x8d, 0x21, 0x57, 0x8f, 0xc6, 0x3e, 0x7a, 0xca, 0xdb, 0x51, 0xd4, 0x52,\n+0xb3, 0xd4, 0x96, 0x84, 0xa5, 0x58, 0x60, 0x7f, 0xe5, 0x0b, 0x8e, 0x1f, 0xf5, 0xdc, 0x0a, 0x15,\n+0x81, 0xe5, 0x3b, 0xb6, 0xb7, 0x22, 0x2f, 0x09, 0x9c, 0x13, 0x16, 0xb1, 0x6c, 0x0c, 0x35, 0x08,\n+0x6d, 0xab, 0x63, 0x72, 0xed, 0xdc, 0xbe, 0xec, 0xc7, 0x57, 0xe6, 0x30, 0x20, 0x71, 0xd6, 0xd7,\n+0x10, 0xc1, 0x13, 0x55, 0x01, 0x8c, 0x2a, 0x43, 0xe4, 0x41, 0xf1, 0xcf, 0x3a, 0x7a, 0x53, 0x92,\n+0xce, 0xa2, 0x03, 0x05, 0x0d, 0x38, 0xdf, 0x02, 0xbb, 0x10, 0x2e, 0xd9, 0x3b, 0xd2, 0x9b, 0x7a,\n+0xc0, 0xa1, 0xa6, 0xf8, 0xb5, 0x31, 0xe6, 0xf4, 0x75, 0xc9, 0xb9, 0x53, 0x99, 0x75, 0x47, 0x22,\n+0x5a, 0x14, 0x15, 0xc7, 0x78, 0x1b, 0xb6, 0x9d, 0xe9, 0x0c, 0xf8, 0x1b, 0x76, 0xf1, 0x85, 0x84,\n+0xde, 0xa1, 0xda, 0x12, 0xef, 0xa4, 0xe2, 0x10, 0x97, 0x7a, 0x78, 0xde, 0x0c, 0x51, 0x97, 0xa8,\n+0x21, 0x40, 0x8b, 0x86, 0xbd, 0x0d, 0xf0, 0x5e, 0x4e, 0x4b, 0x36, 0xbb, 0x3b, 0x20, 0x1f, 0x8a,\n+0x42, 0x56, 0xe1, 0x0b, 0x1a, 0xbf, 0x7b, 0xd0, 0x22, 0x43, 0x2c, 0x44, 0x8c, 0xfb, 0xe5, 0x2a,\n+0xb4, 0x6c, 0x1c, 0x1c, 0xba, 0x94, 0xe0, 0x13, 0x7e, 0x21, 0xe6, 0x9a, 0xc2, 0xcb, 0xc5, 0x42,\n+0x64, 0xb4, 0x1e, 0x94, 0x7b, 0x08, 0x25, 0xc8, 0x71, 0xcc, 0x87, 0x45, 0x57, 0x85, 0xd3, 0x9f,\n+0x29, 0x62, 0x22, 0x83, 0x51, 0x97, 0x00, 0x18, 0x97, 0x77, 0x6a, 0x98, 0x92, 0xc9, 0x7c, 0x60,\n+0x6c, 0xdf, 0x6c, 0x7d, 0x4a, 0xe4, 0x70, 0x4c, 0xc2, 0x9e, 0xb8, 0x1d, 0xf7, 0xd0, 0x34, 0xc7,\n+0x0f, 0xcc, 0xfb, 0xa7, 0xff, 0x03, 0xbe, 0xad, 0x70, 0x90, 0xda, 0x0b, 0xdd, 0xc8, 0x6d, 0x97,\n+0x5f, 0x9a, 0x7f, 0x09, 0x32, 0x41, 0xfd, 0xcd, 0xa2, 0xcc, 0x5a, 0x6d, 0x4c, 0xf2, 0xaa, 0x49,\n+0xfe, 0x66, 0xf8, 0xe9, 0xd8, 0x35, 0xeb, 0x0e, 0x28, 0x1e, 0xee, 0x48, 0x2f, 0x3a, 0xd0, 0x79,\n+0x09, 0x38, 0x7c, 0xa6, 0x22, 0x82, 0x93, 0x95, 0xd0, 0x03, 0xbe, 0xbe, 0x02, 0xa0, 0x05, 0xdd,\n+0x20, 0x22, 0xe3, 0x6f, 0x1d, 0x88, 0x34, 0x60, 0xc6, 0xe6, 0x0a, 0xb9, 0x09, 0x75, 0x0b, 0xf0,\n+0x07, 0xe8, 0x69, 0x96, 0x35, 0xc7, 0xfb, 0x23, 0x81, 0x8e, 0x38, 0x39, 0xb8, 0x45, 0x2b, 0x43,\n+0x78, 0xa2, 0xd1, 0x2c, 0x14, 0xff, 0x0d, 0x28, 0x72, 0x72, 0x95, 0x9b, 0x5e, 0x09, 0xdb, 0x89,\n+0x44, 0x98, 0xaa, 0xa1, 0x49, 0xbb, 0x71, 0x52, 0xf2, 0xbf, 0xf6, 0xff, 0x27, 0xa1, 0x36, 0xaf,\n+0xb8, 0xb6, 0x77, 0x88, 0xdd, 0x3a, 0xa4, 0x6d, 0x9b, 0x34, 0x90, 0xdc, 0x14, 0x5d, 0x30, 0xbf,\n+0xb7, 0xeb, 0x17, 0xe4, 0x87, 0xb7, 0x71, 0xd0, 0xa1, 0xd7, 0x77, 0x15, 0xd4, 0x42, 0xd7, 0xf2,\n+0xf3, 0x31, 0x99, 0x5d, 0x9b, 0xdd, 0x16, 0x6d, 0x3f, 0xea, 0x06, 0x23, 0xf8, 0x46, 0xa2, 0x22,\n+0xed, 0x93, 0xf6, 0xdd, 0x9a, 0xe6, 0x2a, 0x87, 0xb1, 0x98, 0x54, 0xf1, 0x22, 0xf7, 0x6b, 0x45,\n+0xe3, 0xe2, 0x8e, 0x76, 0x1d, 0x9a, 0x8d, 0xc4, 0x06, 0x8d, 0x36, 0xb7, 0x14, 0xf3, 0x9d, 0x54,\n+0x69, 0xb7, 0x8e, 0x3c, 0xd5, 0xa4, 0x6d, 0x93, 0x81, 0xb7, 0xad, 0xf6, 0xbd, 0x64, 0x7b, 0xc2,\n+0xc9, 0x68, 0x39, 0xa0, 0x92, 0x9c, 0xcd, 0x34, 0x86, 0x91, 0x90, 0xfa, 0x64, 0x51, 0x9d, 0xfe,\n+0xfe, 0xeb, 0xa5, 0xf5, 0x75, 0xde, 0x89, 0xf7, 0x72, 0x30, 0x82, 0x05, 0x5a, 0x30, 0x82, 0x03,\n+0x42, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x6e, 0x47, 0xa9, 0xc6, 0x5a, 0xb3, 0xe7, 0x20,\n+0xc5, 0x30, 0x9a, 0x3f, 0x68, 0x52, 0xf2, 0x6f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65,\n+0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x32,\n+0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x36, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n+0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x36, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,\n+0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n+0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n+0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20,\n+0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54,\n+0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f,\n+0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xce, 0xde, 0xfd, 0xa6, 0xfb, 0xec,\n+0xec, 0x14, 0x34, 0x3c, 0x07, 0x06, 0x5a, 0x6c, 0x59, 0xf7, 0x19, 0x35, 0xdd, 0xf7, 0xc1, 0x9d,\n+0x55, 0xaa, 0xd3, 0xcd, 0x3b, 0xa4, 0x93, 0x72, 0xef, 0x0a, 0xfa, 0x6d, 0x9d, 0xf6, 0xf0, 0x85,\n+0x80, 0x5b, 0xa1, 0x48, 0x52, 0x9f, 0x39, 0xc5, 0xb7, 0xee, 0x28, 0xac, 0xef, 0xcb, 0x76, 0x68,\n+0x14, 0xb9, 0xdf, 0xad, 0x01, 0x6c, 0x99, 0x1f, 0xc4, 0x22, 0x1d, 0x9f, 0xfe, 0x72, 0x77, 0xe0,\n+0x2c, 0x5b, 0xaf, 0xe4, 0x04, 0xbf, 0x4f, 0x72, 0xa0, 0x1a, 0x34, 0x98, 0xe8, 0x39, 0x68, 0xec,\n+0x95, 0x25, 0x7b, 0x76, 0xa1, 0xe6, 0x69, 0xb9, 0x85, 0x19, 0xbd, 0x89, 0x8c, 0xfe, 0xad, 0xed,\n+0x36, 0xea, 0x73, 0xbc, 0xff, 0x83, 0xe2, 0xcb, 0x7d, 0xc1, 0xd2, 0xce, 0x4a, 0xb3, 0x8d, 0x05,\n+0x9e, 0x8b, 0x49, 0x93, 0xdf, 0xc1, 0x5b, 0xd0, 0x6e, 0x5e, 0xf0, 0x2e, 0x30, 0x2e, 0x82, 0xfc,\n+0xfa, 0xbc, 0xb4, 0x17, 0x0a, 0x48, 0xe5, 0x88, 0x9b, 0xc5, 0x9b, 0x6b, 0xde, 0xb0, 0xca, 0xb4,\n+0x03, 0xf0, 0xda, 0xf4, 0x90, 0xb8, 0x65, 0x64, 0xf7, 0x5c, 0x4c, 0xad, 0xe8, 0x7e, 0x66, 0x5e,\n+0x99, 0xd7, 0xb8, 0xc2, 0x3e, 0xc8, 0xd0, 0x13, 0x9d, 0xad, 0xee, 0xe4, 0x45, 0x7b, 0x89, 0x55,\n+0xf7, 0x8a, 0x1f, 0x62, 0x52, 0x84, 0x12, 0xb3, 0xc2, 0x40, 0x97, 0xe3, 0x8a, 0x1f, 0x47, 0x91,\n+0xa6, 0x74, 0x5a, 0xd2, 0xf8, 0xb1, 0x63, 0x28, 0x10, 0xb8, 0xb3, 0x09, 0xb8, 0x56, 0x77, 0x40,\n+0xa2, 0x26, 0x98, 0x79, 0xc6, 0xfe, 0xdf, 0x25, 0xee, 0x3e, 0xe5, 0xa0, 0x7f, 0xd4, 0x61, 0x0f,\n+0x51, 0x4b, 0x3c, 0x3f, 0x8c, 0xda, 0xe1, 0x70, 0x74, 0xd8, 0xc2, 0x68, 0xa1, 0xf9, 0xc1, 0x0c,\n+0xe9, 0xa1, 0xe2, 0x7f, 0xbb, 0x55, 0x3c, 0x76, 0x06, 0xee, 0x6a, 0x4e, 0xcc, 0x92, 0x88, 0x30,\n+0x4d, 0x9a, 0xbd, 0x4f, 0x0b, 0x48, 0x9a, 0x84, 0xb5, 0x98, 0xa3, 0xd5, 0xfb, 0x73, 0xc1, 0x57,\n+0x61, 0xdd, 0x28, 0x56, 0x75, 0x13, 0xae, 0x87, 0x8e, 0xe7, 0x0c, 0x51, 0x09, 0x10, 0x75, 0x88,\n+0x4c, 0xbc, 0x8d, 0xf9, 0x7b, 0x3c, 0xd4, 0x22, 0x48, 0x1f, 0x2a, 0xdc, 0xeb, 0x6b, 0xbb, 0x44,\n+0xb1, 0xcb, 0x33, 0x71, 0x32, 0x46, 0xaf, 0xad, 0x4a, 0xf1, 0x8c, 0xe8, 0x74, 0x3a, 0xac, 0xe7,\n+0x1a, 0x22, 0x73, 0x80, 0xd2, 0x30, 0xf7, 0x25, 0x42, 0xc7, 0x22, 0x3b, 0x3b, 0x12, 0xad, 0x96,\n+0x2e, 0xc6, 0xc3, 0x76, 0x07, 0xaa, 0x20, 0xb7, 0x35, 0x49, 0x57, 0xe9, 0x92, 0x49, 0xe8, 0x76,\n+0x16, 0x72, 0x31, 0x67, 0x2b, 0x96, 0x7e, 0x8a, 0xa3, 0xc7, 0x94, 0x56, 0x22, 0xbf, 0x6a, 0x4b,\n+0x7e, 0x01, 0x21, 0xb2, 0x23, 0x32, 0xdf, 0xe4, 0x9a, 0x44, 0x6d, 0x59, 0x5b, 0x5d, 0xf5, 0x00,\n+0xa0, 0x1c, 0x9b, 0xc6, 0x78, 0x97, 0x8d, 0x90, 0xff, 0x9b, 0xc8, 0xaa, 0xb4, 0xaf, 0x11, 0x51,\n+0x39, 0x5e, 0xd9, 0xfb, 0x67, 0xad, 0xd5, 0x5b, 0x11, 0x9d, 0x32, 0x9a, 0x1b, 0xbd, 0xd5, 0xba,\n+0x5b, 0xa5, 0xc9, 0xcb, 0x25, 0x69, 0x53, 0x55, 0x27, 0x5c, 0xe0, 0xca, 0x36, 0xcb, 0x88, 0x61,\n+0xfb, 0x1e, 0xb7, 0xd0, 0xcb, 0xee, 0x16, 0xfb, 0xd3, 0xa6, 0x4c, 0xde, 0x92, 0xa5, 0xd4, 0xe2,\n+0xdf, 0xf5, 0x06, 0x54, 0xde, 0x2e, 0x9d, 0x4b, 0xb4, 0x93, 0x30, 0xaa, 0x81, 0xce, 0xdd, 0x1a,\n+0xdc, 0x51, 0x73, 0x0d, 0x4f, 0x70, 0xe9, 0xe5, 0xb6, 0x16, 0x21, 0x19, 0x79, 0xb2, 0xe6, 0x89,\n+0x0b, 0x75, 0x64, 0xca, 0xd5, 0xab, 0xbc, 0x09, 0xc1, 0x18, 0xa1, 0xff, 0xd4, 0x54, 0xa1, 0x85,\n+0x3c, 0xfd, 0x14, 0x24, 0x03, 0xb2, 0x87, 0xd3, 0xa4, 0xb7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n+0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n+0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xbb,\n+0xff, 0xca, 0x8e, 0x23, 0x9f, 0x4f, 0x99, 0xca, 0xdb, 0xe2, 0x68, 0xa6, 0xa5, 0x15, 0x27, 0x17,\n+0x1e, 0xd9, 0x0e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c,\n+0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xb6, 0x69, 0xf0, 0xa6, 0x77, 0xfe, 0x9e, 0xee, 0x0b,\n+0x81, 0xad, 0xe1, 0xc0, 0xa9, 0xc7, 0xf9, 0x35, 0x1d, 0x40, 0x82, 0xab, 0xe6, 0x04, 0xb4, 0xdf,\n+0xcb, 0xf7, 0x1d, 0x0f, 0x83, 0xf0, 0x7e, 0x13, 0x4d, 0x8d, 0x8c, 0xee, 0xe3, 0x33, 0x22, 0xc3,\n+0x39, 0xfc, 0x40, 0xdf, 0x6e, 0x41, 0x4b, 0x42, 0x53, 0xbe, 0x16, 0x88, 0xf1, 0xd2, 0x38, 0x5e,\n+0xc4, 0x68, 0x99, 0x1c, 0x98, 0x52, 0x93, 0x8c, 0xe7, 0x68, 0xed, 0x1b, 0x6a, 0x73, 0x7a, 0x05,\n+0x40, 0x4d, 0x7f, 0x65, 0x3b, 0xd6, 0x58, 0xf1, 0xce, 0x83, 0x47, 0x60, 0xe3, 0xff, 0x97, 0xa9,\n+0x9c, 0x60, 0x77, 0x18, 0x55, 0xb5, 0x7e, 0x08, 0x93, 0xcf, 0xd0, 0xf6, 0x3c, 0x67, 0x03, 0x15,\n+0x61, 0x09, 0xf9, 0x81, 0x79, 0xf5, 0xec, 0x53, 0xa4, 0x9f, 0xc9, 0x8f, 0x01, 0x8b, 0x73, 0xc4,\n+0x77, 0x76, 0xdc, 0x83, 0xa2, 0xf5, 0x0c, 0x49, 0x1a, 0xa8, 0x76, 0xde, 0x92, 0x9b, 0x64, 0xf8,\n+0xb3, 0x2c, 0xc5, 0x27, 0xd3, 0x07, 0xc0, 0x08, 0x80, 0xa4, 0x98, 0x92, 0xe3, 0x01, 0x96, 0x02,\n+0xaa, 0x02, 0xee, 0x8f, 0x3b, 0xc5, 0xd1, 0x6d, 0x0a, 0x33, 0x30, 0x73, 0x78, 0xb9, 0x4f, 0x54,\n+0x16, 0xbf, 0x0b, 0x07, 0xa1, 0xa4, 0x5c, 0xe6, 0xcb, 0xc9, 0x5c, 0x84, 0x8f, 0x0f, 0xe0, 0x15,\n+0x77, 0x2c, 0x7e, 0x26, 0x7e, 0xda, 0xc4, 0x4b, 0xdb, 0xa7, 0x16, 0x77, 0x07, 0xb0, 0xcd, 0x75,\n+0xe8, 0x72, 0x42, 0xd6, 0x95, 0x84, 0x9d, 0x86, 0x83, 0xf2, 0xe4, 0x90, 0xcd, 0x09, 0x47, 0xd4,\n+0x8b, 0x03, 0x70, 0xda, 0x5a, 0xc6, 0x03, 0x42, 0xf4, 0xed, 0x37, 0xa2, 0xf0, 0x1b, 0x50, 0x54,\n+0x4b, 0x0e, 0xd8, 0x84, 0xde, 0x19, 0x28, 0x99, 0x81, 0x47, 0xae, 0x09, 0x1b, 0x3f, 0x48, 0xd1,\n+0xc3, 0x6f, 0xe2, 0xb0, 0x60, 0x17, 0xf5, 0xee, 0x23, 0x02, 0xa5, 0xda, 0x00, 0x5b, 0x6d, 0x90,\n+0xab, 0xee, 0xa2, 0xe9, 0x1b, 0x3b, 0xe9, 0xc7, 0x44, 0x27, 0x45, 0x8e, 0x6b, 0x9f, 0xf5, 0xa4,\n+0x84, 0xbc, 0x77, 0xf9, 0x6b, 0x97, 0xac, 0x3e, 0x51, 0x45, 0xa2, 0x11, 0xa6, 0xcc, 0x85, 0xee,\n+0x0a, 0x68, 0xf2, 0x3e, 0x50, 0x38, 0x7a, 0x24, 0x62, 0x1e, 0x17, 0x20, 0x37, 0x6d, 0x6a, 0x4d,\n+0xb7, 0x09, 0x9b, 0xc9, 0xfc, 0xa4, 0x58, 0xf5, 0xb6, 0xfb, 0x9c, 0x4e, 0x18, 0xbb, 0x95, 0x02,\n+0xe7, 0xa1, 0xad, 0x9b, 0x07, 0xee, 0x36, 0x6b, 0x24, 0xd2, 0x39, 0x86, 0xc1, 0x93, 0x83, 0x50,\n+0xd2, 0x81, 0x46, 0xa8, 0x5f, 0x62, 0x57, 0x2c, 0xbb, 0x6c, 0x64, 0x88, 0x08, 0x6e, 0xef, 0x13,\n+0x54, 0x5f, 0xdd, 0x2d, 0xc4, 0x67, 0x63, 0xd3, 0xcf, 0x89, 0x37, 0xbf, 0x9d, 0x20, 0xf4, 0xfb,\n+0x7a, 0x83, 0x9b, 0xa0, 0x1e, 0x81, 0x00, 0x50, 0xc2, 0xe4, 0x0c, 0x22, 0x59, 0x52, 0x10, 0xed,\n+0x43, 0x56, 0x87, 0x00, 0xf8, 0x14, 0x52, 0xa7, 0x1d, 0x8b, 0x93, 0x8c, 0xa2, 0x4d, 0x46, 0x7f,\n+0x27, 0xc6, 0x71, 0x9b, 0x24, 0xde, 0xe4, 0xda, 0x86, 0x8b, 0x0d, 0x7e, 0x6b, 0x20, 0xc1, 0xc0,\n+0x9e, 0xe1, 0x65, 0xd8, 0x6a, 0xa3, 0xa6, 0xe8, 0x85, 0x8b, 0x3a, 0x07, 0x08, 0x1c, 0xba, 0xf5,\n+0x8f, 0x55, 0x9a, 0x18, 0x75, 0x7e, 0xe5, 0xec, 0x81, 0x66, 0xd1, 0x21, 0x73, 0xa1, 0x35, 0x44,\n+0x0b, 0x80, 0x3d, 0x5b, 0x9c, 0x5e, 0x6f, 0x2a, 0x17, 0x96, 0xd1, 0x83, 0x23, 0x88, 0x66, 0x6d,\n+0xe6, 0x86, 0xe2, 0x70, 0x32, 0x2f, 0x52, 0x22, 0xe7, 0xc8, 0xe7, 0x7f, 0xc4, 0x2c, 0x60, 0x5d,\n+0x2f, 0xc3, 0xaf, 0x9e, 0x45, 0x05, 0xc3, 0x84, 0x02, 0xb7, 0xfd, 0x2c, 0x08, 0x52, 0x4f, 0x82,\n+0xdd, 0xa3, 0xf0, 0xd4, 0x86, 0x09, 0x02, 0x30, 0x82, 0x02, 0x0c, 0x30, 0x82, 0x01, 0x91, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x6e, 0x47, 0xa9, 0xc7, 0x6c, 0xa9, 0x73, 0x24, 0x40, 0x89,\n+0x0f, 0x03, 0x55, 0xdd, 0x8d, 0x1d, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04,\n+0x03, 0x03, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n+0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67,\n+0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n+0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b,\n+0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x36, 0x30, 0x36, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x36,\n+0x30, 0x36, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x47, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14,\n+0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x52, 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,\n+0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x1f, 0x4f, 0x33, 0x87,\n+0x33, 0x29, 0x8a, 0xa1, 0x84, 0xde, 0xcb, 0xc7, 0x21, 0x58, 0x41, 0x89, 0xea, 0x56, 0x9d, 0x2b,\n+0x4b, 0x85, 0xc6, 0x1d, 0x4c, 0x27, 0xbc, 0x7f, 0x26, 0x51, 0x72, 0x6f, 0xe2, 0x9f, 0xd6, 0xa3,\n+0xca, 0xcc, 0x45, 0x14, 0x46, 0x8b, 0xad, 0xef, 0x7e, 0x86, 0x8c, 0xec, 0xb1, 0x7e, 0x2f, 0xff,\n+0xa9, 0x71, 0x9d, 0x18, 0x84, 0x45, 0x04, 0x41, 0x55, 0x6e, 0x2b, 0xea, 0x26, 0x7f, 0xbb, 0x90,\n+0x01, 0xe3, 0x4b, 0x19, 0xba, 0xe4, 0x54, 0x96, 0x45, 0x09, 0xb1, 0xd5, 0x6c, 0x91, 0x44, 0xad,\n+0x84, 0x13, 0x8e, 0x9a, 0x8c, 0x0d, 0x80, 0x0c, 0x32, 0xf6, 0xe0, 0x27, 0xa3, 0x42, 0x30, 0x40,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n+0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc1, 0xf1, 0x26, 0xba,\n+0xa0, 0x2d, 0xae, 0x85, 0x81, 0xcf, 0xd3, 0xf1, 0x2a, 0x12, 0xbd, 0xb8, 0x0a, 0x67, 0xfd, 0xbc,\n+0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x69, 0x00, 0x30,\n+0x66, 0x02, 0x31, 0x00, 0x80, 0x5b, 0xa4, 0x7c, 0x23, 0xc0, 0x95, 0xa5, 0x2c, 0xdc, 0xbe, 0x89,\n+0x6f, 0x23, 0xb9, 0xa3, 0xdd, 0x65, 0x00, 0x52, 0x5e, 0x91, 0xac, 0xc8, 0x9d, 0x72, 0x74, 0x82,\n+0x53, 0x0b, 0x7d, 0xa9, 0x40, 0xbd, 0x68, 0x60, 0xc5, 0xe1, 0xb8, 0x54, 0x3b, 0xc1, 0x36, 0x17,\n+0x25, 0xd8, 0xc1, 0xbd, 0x02, 0x31, 0x00, 0x9e, 0x35, 0x92, 0x74, 0x85, 0x25, 0x51, 0xf5, 0x24,\n+0xec, 0x64, 0x52, 0x24, 0x50, 0xa5, 0x1f, 0xdb, 0xe8, 0xcb, 0xc9, 0x76, 0xec, 0xec, 0x82, 0x6e,\n+0xf5, 0x85, 0x18, 0x53, 0xe8, 0xb8, 0xe3, 0x9a, 0x29, 0xaa, 0x96, 0xd3, 0x83, 0x23, 0xc9, 0xa4,\n+0x7b, 0x61, 0xb3, 0xcc, 0x02, 0xe8, 0x5d, 0x30, 0x82, 0x02, 0x0a, 0x30, 0x82, 0x01, 0x91, 0xa0,\n+0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x6e, 0x47, 0xa9, 0xc8, 0x8b, 0x94, 0xb6, 0xe8, 0xbb, 0x3b,\n+0x2a, 0xd8, 0xa2, 0xb2, 0xc1, 0x99, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04,\n+0x03, 0x03, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n+0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67,\n+0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n+0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b,\n+0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x34, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x36, 0x30, 0x36, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x36,\n+0x30, 0x36, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x47, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14,\n+0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x52, 0x34, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,\n+0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xf3, 0x74, 0x73, 0xa7,\n+0x68, 0x8b, 0x60, 0xae, 0x43, 0xb8, 0x35, 0xc5, 0x81, 0x30, 0x7b, 0x4b, 0x49, 0x9d, 0xfb, 0xc1,\n+0x61, 0xce, 0xe6, 0xde, 0x46, 0xbd, 0x6b, 0xd5, 0x61, 0x18, 0x35, 0xae, 0x40, 0xdd, 0x73, 0xf7,\n+0x89, 0x91, 0x30, 0x5a, 0xeb, 0x3c, 0xee, 0x85, 0x7c, 0xa2, 0x40, 0x76, 0x3b, 0xa9, 0xc6, 0xb8,\n+0x47, 0xd8, 0x2a, 0xe7, 0x92, 0x91, 0x6a, 0x73, 0xe9, 0xb1, 0x72, 0x39, 0x9f, 0x29, 0x9f, 0xa2,\n+0x98, 0xd3, 0x5f, 0x5e, 0x58, 0x86, 0x65, 0x0f, 0xa1, 0x84, 0x65, 0x06, 0xd1, 0xdc, 0x8b, 0xc9,\n+0xc7, 0x73, 0xc8, 0x8c, 0x6a, 0x2f, 0xe5, 0xc4, 0xab, 0xd1, 0x1d, 0x8a, 0xa3, 0x42, 0x30, 0x40,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n+0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x80, 0x4c, 0xd6, 0xeb,\n+0x74, 0xff, 0x49, 0x36, 0xa3, 0xd5, 0xd8, 0xfc, 0xb5, 0x3e, 0xc5, 0x6a, 0xf0, 0x94, 0x1d, 0x8c,\n+0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x67, 0x00, 0x30,\n+0x64, 0x02, 0x30, 0x6a, 0x50, 0x52, 0x74, 0x08, 0xc4, 0x70, 0xdc, 0x9e, 0x50, 0x74, 0x21, 0xe8,\n+0x8d, 0x7a, 0x21, 0xc3, 0x4f, 0x96, 0x6e, 0x15, 0xd1, 0x22, 0x35, 0x61, 0x2d, 0xfa, 0x08, 0x37,\n+0xee, 0x19, 0x6d, 0xad, 0xdb, 0xb2, 0xcc, 0x7d, 0x07, 0x34, 0xf5, 0x60, 0x19, 0x2c, 0xb5, 0x34,\n+0xd9, 0x6f, 0x20, 0x02, 0x30, 0x03, 0x71, 0xb1, 0xba, 0xa3, 0x60, 0x0b, 0x86, 0xed, 0x9a, 0x08,\n+0x6a, 0x95, 0x68, 0x9f, 0xe2, 0xb3, 0xe1, 0x93, 0x64, 0x7c, 0x5e, 0x93, 0xa6, 0xdf, 0x79, 0x2d,\n+0x8d, 0x85, 0xe3, 0x94, 0xcf, 0x23, 0x5d, 0x71, 0xcc, 0xf2, 0xb0, 0x4d, 0xd6, 0xfe, 0x99, 0xc8,\n+0x94, 0xa9, 0x75, 0xa2, 0xe3, 0x30, 0x82, 0x05, 0x5a, 0x30, 0x82, 0x03, 0x42, 0xa0, 0x03, 0x02,\n+0x01, 0x02, 0x02, 0x10, 0x6e, 0x47, 0xa9, 0xc5, 0x4b, 0x47, 0x0c, 0x0d, 0xec, 0x33, 0xd0, 0x89,\n+0xb9, 0x1c, 0xf4, 0xe1, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0c, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f,\n+0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n+0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x31, 0x30, 0x1e, 0x17, 0x0d,\n+0x31, 0x36, 0x30, 0x36, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33,\n+0x36, 0x30, 0x36, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x47, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75,\n+0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31,\n+0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x52, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02,\n+0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb6, 0x11, 0x02, 0x8b, 0x1e, 0xe3, 0xa1, 0x77, 0x9b, 0x3b,\n+0xdc, 0xbf, 0x94, 0x3e, 0xb7, 0x95, 0xa7, 0x40, 0x3c, 0xa1, 0xfd, 0x82, 0xf9, 0x7d, 0x32, 0x06,\n+0x82, 0x71, 0xf6, 0xf6, 0x8c, 0x7f, 0xfb, 0xe8, 0xdb, 0xbc, 0x6a, 0x2e, 0x97, 0x97, 0xa3, 0x8c,\n+0x4b, 0xf9, 0x2b, 0xf6, 0xb1, 0xf9, 0xce, 0x84, 0x1d, 0xb1, 0xf9, 0xc5, 0x97, 0xde, 0xef, 0xb9,\n+0xf2, 0xa3, 0xe9, 0xbc, 0x12, 0x89, 0x5e, 0xa7, 0xaa, 0x52, 0xab, 0xf8, 0x23, 0x27, 0xcb, 0xa4,\n+0xb1, 0x9c, 0x63, 0xdb, 0xd7, 0x99, 0x7e, 0xf0, 0x0a, 0x5e, 0xeb, 0x68, 0xa6, 0xf4, 0xc6, 0x5a,\n+0x47, 0x0d, 0x4d, 0x10, 0x33, 0xe3, 0x4e, 0xb1, 0x13, 0xa3, 0xc8, 0x18, 0x6c, 0x4b, 0xec, 0xfc,\n+0x09, 0x90, 0xdf, 0x9d, 0x64, 0x29, 0x25, 0x23, 0x07, 0xa1, 0xb4, 0xd2, 0x3d, 0x2e, 0x60, 0xe0,\n+0xcf, 0xd2, 0x09, 0x87, 0xbb, 0xcd, 0x48, 0xf0, 0x4d, 0xc2, 0xc2, 0x7a, 0x88, 0x8a, 0xbb, 0xba,\n+0xcf, 0x59, 0x19, 0xd6, 0xaf, 0x8f, 0xb0, 0x07, 0xb0, 0x9e, 0x31, 0xf1, 0x82, 0xc1, 0xc0, 0xdf,\n+0x2e, 0xa6, 0x6d, 0x6c, 0x19, 0x0e, 0xb5, 0xd8, 0x7e, 0x26, 0x1a, 0x45, 0x03, 0x3d, 0xb0, 0x79,\n+0xa4, 0x94, 0x28, 0xad, 0x0f, 0x7f, 0x26, 0xe5, 0xa8, 0x08, 0xfe, 0x96, 0xe8, 0x3c, 0x68, 0x94,\n+0x53, 0xee, 0x83, 0x3a, 0x88, 0x2b, 0x15, 0x96, 0x09, 0xb2, 0xe0, 0x7a, 0x8c, 0x2e, 0x75, 0xd6,\n+0x9c, 0xeb, 0xa7, 0x56, 0x64, 0x8f, 0x96, 0x4f, 0x68, 0xae, 0x3d, 0x97, 0xc2, 0x84, 0x8f, 0xc0,\n+0xbc, 0x40, 0xc0, 0x0b, 0x5c, 0xbd, 0xf6, 0x87, 0xb3, 0x35, 0x6c, 0xac, 0x18, 0x50, 0x7f, 0x84,\n+0xe0, 0x4c, 0xcd, 0x92, 0xd3, 0x20, 0xe9, 0x33, 0xbc, 0x52, 0x99, 0xaf, 0x32, 0xb5, 0x29, 0xb3,\n+0x25, 0x2a, 0xb4, 0x48, 0xf9, 0x72, 0xe1, 0xca, 0x64, 0xf7, 0xe6, 0x82, 0x10, 0x8d, 0xe8, 0x9d,\n+0xc2, 0x8a, 0x88, 0xfa, 0x38, 0x66, 0x8a, 0xfc, 0x63, 0xf9, 0x01, 0xf9, 0x78, 0xfd, 0x7b, 0x5c,\n+0x77, 0xfa, 0x76, 0x87, 0xfa, 0xec, 0xdf, 0xb1, 0x0e, 0x79, 0x95, 0x57, 0xb4, 0xbd, 0x26, 0xef,\n+0xd6, 0x01, 0xd1, 0xeb, 0x16, 0x0a, 0xbb, 0x8e, 0x0b, 0xb5, 0xc5, 0xc5, 0x8a, 0x55, 0xab, 0xd3,\n+0xac, 0xea, 0x91, 0x4b, 0x29, 0xcc, 0x19, 0xa4, 0x32, 0x25, 0x4e, 0x2a, 0xf1, 0x65, 0x44, 0xd0,\n+0x02, 0xce, 0xaa, 0xce, 0x49, 0xb4, 0xea, 0x9f, 0x7c, 0x83, 0xb0, 0x40, 0x7b, 0xe7, 0x43, 0xab,\n+0xa7, 0x6c, 0xa3, 0x8f, 0x7d, 0x89, 0x81, 0xfa, 0x4c, 0xa5, 0xff, 0xd5, 0x8e, 0xc3, 0xce, 0x4b,\n+0xe0, 0xb5, 0xd8, 0xb3, 0x8e, 0x45, 0xcf, 0x76, 0xc0, 0xed, 0x40, 0x2b, 0xfd, 0x53, 0x0f, 0xb0,\n+0xa7, 0xd5, 0x3b, 0x0d, 0xb1, 0x8a, 0xa2, 0x03, 0xde, 0x31, 0xad, 0xcc, 0x77, 0xea, 0x6f, 0x7b,\n+0x3e, 0xd6, 0xdf, 0x91, 0x22, 0x12, 0xe6, 0xbe, 0xfa, 0xd8, 0x32, 0xfc, 0x10, 0x63, 0x14, 0x51,\n+0x72, 0xde, 0x5d, 0xd6, 0x16, 0x93, 0xbd, 0x29, 0x68, 0x33, 0xef, 0x3a, 0x66, 0xec, 0x07, 0x8a,\n+0x26, 0xdf, 0x13, 0xd7, 0x57, 0x65, 0x78, 0x27, 0xde, 0x5e, 0x49, 0x14, 0x00, 0xa2, 0x00, 0x7f,\n+0x9a, 0xa8, 0x21, 0xb6, 0xa9, 0xb1, 0x95, 0xb0, 0xa5, 0xb9, 0x0d, 0x16, 0x11, 0xda, 0xc7, 0x6c,\n+0x48, 0x3c, 0x40, 0xe0, 0x7e, 0x0d, 0x5a, 0xcd, 0x56, 0x3c, 0xd1, 0x97, 0x05, 0xb9, 0xcb, 0x4b,\n+0xed, 0x39, 0x4b, 0x9c, 0xc4, 0x3f, 0xd2, 0x55, 0x13, 0x6e, 0x24, 0xb0, 0xd6, 0x71, 0xfa, 0xf4,\n+0xc1, 0xba, 0xcc, 0xed, 0x1b, 0xf5, 0xfe, 0x81, 0x41, 0xd8, 0x00, 0x98, 0x3d, 0x3a, 0xc8, 0xae,\n+0x7a, 0x98, 0x37, 0x18, 0x05, 0x95, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe4, 0xaf, 0x2b, 0x26, 0x71,\n+0x1a, 0x2b, 0x48, 0x27, 0x85, 0x2f, 0x52, 0x66, 0x2c, 0xef, 0xf0, 0x89, 0x13, 0x71, 0x3e, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82,\n+0x02, 0x01, 0x00, 0x38, 0x96, 0x0a, 0xee, 0x3d, 0xb4, 0x96, 0x1e, 0x5f, 0xef, 0x9d, 0x9c, 0x0b,\n+0x33, 0x9f, 0x2b, 0xe0, 0xca, 0xfd, 0xd2, 0x8e, 0x0a, 0x1f, 0x41, 0x74, 0xa5, 0x7c, 0xaa, 0x84,\n+0xd4, 0xe5, 0xf2, 0x1e, 0xe6, 0x37, 0x52, 0x32, 0x9c, 0x0b, 0xd1, 0x61, 0x1d, 0xbf, 0x28, 0xc1,\n+0xb6, 0x44, 0x29, 0x35, 0x75, 0x77, 0x98, 0xb2, 0x7c, 0xd9, 0xbd, 0x74, 0xac, 0x8a, 0x68, 0xe3,\n+0xa9, 0x31, 0x09, 0x29, 0x01, 0x60, 0x73, 0xe3, 0x47, 0x7c, 0x53, 0xa8, 0x90, 0x4a, 0x27, 0xef,\n+0x4b, 0xd7, 0x9f, 0x93, 0xe7, 0x82, 0x36, 0xce, 0x9a, 0x68, 0x0c, 0x82, 0xe7, 0xcf, 0xd4, 0x10,\n+0x16, 0x6f, 0x5f, 0x0e, 0x99, 0x5c, 0xf6, 0x1f, 0x71, 0x7d, 0xef, 0xef, 0x7b, 0x2f, 0x7e, 0xea,\n+0x36, 0xd6, 0x97, 0x70, 0x0b, 0x15, 0xee, 0xd7, 0x5c, 0x56, 0x6a, 0x33, 0xa5, 0xe3, 0x49, 0x38,\n+0x0c, 0xb8, 0x7d, 0xfb, 0x8d, 0x85, 0xa4, 0xb1, 0x59, 0x5e, 0xf4, 0x6a, 0xe1, 0xdd, 0xa1, 0xf6,\n+0x64, 0x44, 0xae, 0xe6, 0x51, 0x83, 0x21, 0x66, 0xc6, 0x11, 0x3e, 0xf3, 0xce, 0x47, 0xee, 0x9c,\n+0x28, 0x1f, 0x25, 0xda, 0xff, 0xac, 0x66, 0x95, 0xdd, 0x35, 0x0f, 0x5c, 0xef, 0x20, 0x2c, 0x62,\n+0xfd, 0x91, 0xba, 0xa9, 0xcc, 0xfc, 0x5a, 0x9c, 0x93, 0x81, 0x83, 0x29, 0x97, 0x4a, 0x7c, 0x5a,\n+0x72, 0xb4, 0x39, 0xd0, 0xb7, 0x77, 0xcb, 0x79, 0xfd, 0x69, 0x3a, 0x92, 0x37, 0xed, 0x6e, 0x38,\n+0x65, 0x46, 0x7e, 0xe9, 0x60, 0xbd, 0x79, 0x88, 0x97, 0x5f, 0x38, 0x12, 0xf4, 0xee, 0xaf, 0x5b,\n+0x82, 0xc8, 0x86, 0xd5, 0xe1, 0x99, 0x6d, 0x8c, 0x04, 0xf2, 0x76, 0xba, 0x49, 0xf6, 0x6e, 0xe9,\n+0x6d, 0x1e, 0x5f, 0xa0, 0xef, 0x27, 0x82, 0x76, 0x40, 0xf8, 0xa6, 0xd3, 0x58, 0x5c, 0x0f, 0x2c,\n+0x42, 0xda, 0x42, 0xc6, 0x7b, 0x88, 0x34, 0xc7, 0xc1, 0xd8, 0x45, 0x9b, 0xc1, 0x3e, 0xc5, 0x61,\n+0x1d, 0xd9, 0x63, 0x50, 0x49, 0xf6, 0x34, 0x85, 0x6a, 0xe0, 0x18, 0xc5, 0x6e, 0x47, 0xab, 0x41,\n+0x42, 0x29, 0x9b, 0xf6, 0x60, 0x0d, 0xd2, 0x31, 0xd3, 0x63, 0x98, 0x23, 0x93, 0x5a, 0x00, 0x81,\n+0x48, 0xb4, 0xef, 0xcd, 0x8a, 0xcd, 0xc9, 0xcf, 0x99, 0xee, 0xd9, 0x9e, 0xaa, 0x36, 0xe1, 0x68,\n+0x4b, 0x71, 0x49, 0x14, 0x36, 0x28, 0x3a, 0x3d, 0x1d, 0xce, 0x9a, 0x8f, 0x25, 0xe6, 0x80, 0x71,\n+0x61, 0x2b, 0xb5, 0x7b, 0xcc, 0xf9, 0x25, 0x16, 0x81, 0xe1, 0x31, 0x5f, 0xa1, 0xa3, 0x7e, 0x16,\n+0xa4, 0x9c, 0x16, 0x6a, 0x97, 0x18, 0xbd, 0x76, 0x72, 0xa5, 0x0b, 0x9e, 0x1d, 0x36, 0xe6, 0x2f,\n+0xa1, 0x2f, 0xbe, 0x70, 0x91, 0x0f, 0xa8, 0xe6, 0xda, 0xf8, 0xc4, 0x92, 0x40, 0x6c, 0x25, 0x7e,\n+0x7b, 0xb3, 0x09, 0xdc, 0xb2, 0x17, 0xad, 0x80, 0x44, 0xf0, 0x68, 0xa5, 0x8f, 0x94, 0x75, 0xff,\n+0x74, 0x5a, 0xe8, 0xa8, 0x02, 0x7c, 0x0c, 0x09, 0xe2, 0xa9, 0x4b, 0x0b, 0xa0, 0x85, 0x0b, 0x62,\n+0xb9, 0xef, 0xa1, 0x31, 0x92, 0xfb, 0xef, 0xf6, 0x51, 0x04, 0x89, 0x6c, 0xe8, 0xa9, 0x74, 0xa1,\n+0xbb, 0x17, 0xb3, 0xb5, 0xfd, 0x49, 0x0f, 0x7c, 0x3c, 0xec, 0x83, 0x18, 0x20, 0x43, 0x4e, 0xd5,\n+0x93, 0xba, 0xb4, 0x34, 0xb1, 0x1f, 0x16, 0x36, 0x1f, 0x0c, 0xe6, 0x64, 0x39, 0x16, 0x4c, 0xdc,\n+0xe0, 0xfe, 0x1d, 0xc8, 0xa9, 0x62, 0x3d, 0x40, 0xea, 0xca, 0xc5, 0x34, 0x02, 0xb4, 0xae, 0x89,\n+0x88, 0x33, 0x35, 0xdc, 0x2c, 0x13, 0x73, 0xd8, 0x27, 0xf1, 0xd0, 0x72, 0xee, 0x75, 0x3b, 0x22,\n+0xde, 0x98, 0x68, 0x66, 0x5b, 0xf1, 0xc6, 0x63, 0x47, 0x55, 0x1c, 0xba, 0xa5, 0x08, 0x51, 0x75,\n+0xa6, 0x48, 0x25, 0x30, 0x82, 0x05, 0x5a, 0x30, 0x82, 0x03, 0x42, 0xa0, 0x03, 0x02, 0x01, 0x02,\n+0x02, 0x12, 0x11, 0xd2, 0xbb, 0xb9, 0xd7, 0x23, 0x18, 0x9e, 0x40, 0x5f, 0x0a, 0x9d, 0x2d, 0xd0,\n+0xdf, 0x25, 0x67, 0xd1, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0c, 0x05, 0x00, 0x30, 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f,\n+0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x1c, 0x30,\n+0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69,\n+0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x34, 0x36, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x39, 0x30, 0x33, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x36,\n+0x30, 0x33, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x46, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20,\n+0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13,\n+0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x52, 0x34, 0x36, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n+0x82, 0x02, 0x01, 0x00, 0xac, 0xac, 0x74, 0x32, 0xe8, 0xb3, 0x65, 0xe5, 0xba, 0xed, 0x43, 0x26,\n+0x1d, 0xa6, 0x89, 0x0d, 0x45, 0xba, 0x29, 0x88, 0xb2, 0xa4, 0x1d, 0x63, 0xdd, 0xd3, 0xc1, 0x2c,\n+0x09, 0x57, 0x89, 0x39, 0xa1, 0x55, 0xe9, 0x67, 0x34, 0x77, 0x0c, 0x6e, 0xe4, 0x55, 0x1d, 0x52,\n+0x25, 0xd2, 0x13, 0x6b, 0x5e, 0xe1, 0x1d, 0xa9, 0xb7, 0x7d, 0x89, 0x32, 0x5f, 0x0d, 0x9e, 0x9f,\n+0x2c, 0x7a, 0x63, 0x60, 0x40, 0x1f, 0xa6, 0xb0, 0xb6, 0x78, 0x8f, 0x99, 0x54, 0x96, 0x08, 0x58,\n+0xae, 0xe4, 0x06, 0xbc, 0x62, 0x05, 0x02, 0x16, 0xbf, 0xaf, 0xa8, 0x23, 0x03, 0xb6, 0x94, 0x0f,\n+0xbc, 0x6e, 0x6c, 0xc2, 0xcb, 0xd5, 0xa6, 0xbb, 0x0c, 0xe9, 0xf6, 0xc1, 0x02, 0xfb, 0x21, 0xde,\n+0x66, 0xdd, 0x17, 0xab, 0x74, 0x42, 0xef, 0xf0, 0x74, 0x2f, 0x25, 0xf4, 0xea, 0x6b, 0x55, 0x5b,\n+0x90, 0xdb, 0x9d, 0xdf, 0x5e, 0x87, 0x0a, 0x40, 0xfb, 0xad, 0x19, 0x6b, 0xfb, 0xf7, 0xca, 0x60,\n+0x88, 0xde, 0xda, 0xc1, 0x8f, 0xd6, 0xae, 0xd5, 0x7f, 0xd4, 0x3c, 0x83, 0xee, 0xd7, 0x16, 0x4c,\n+0x83, 0x45, 0x33, 0x6b, 0x27, 0xd0, 0x86, 0xd0, 0x1c, 0x2d, 0x6b, 0xf3, 0xab, 0x7d, 0xf1, 0x85,\n+0xa9, 0xf5, 0x28, 0xd2, 0xad, 0xef, 0xf3, 0x84, 0x4b, 0x1c, 0x87, 0xfc, 0x13, 0xa3, 0x3a, 0x72,\n+0xa2, 0x5a, 0x11, 0x2b, 0xd6, 0x27, 0x71, 0x27, 0xed, 0x81, 0x2d, 0x6d, 0x66, 0x81, 0x92, 0x87,\n+0xb4, 0x1b, 0x58, 0x7a, 0xcc, 0x3f, 0x0a, 0xfa, 0x46, 0x4f, 0x4d, 0x78, 0x5c, 0xf8, 0x2b, 0x48,\n+0xe3, 0x04, 0x84, 0xcb, 0x5d, 0xf6, 0xb4, 0x6a, 0xb3, 0x65, 0xfc, 0x42, 0x9e, 0x51, 0x26, 0x23,\n+0x20, 0xcb, 0x3d, 0x14, 0xf9, 0x81, 0xed, 0x65, 0x16, 0x00, 0x4f, 0x1a, 0x64, 0x97, 0x66, 0x08,\n+0xcf, 0x8c, 0x7b, 0xe3, 0x2b, 0xc0, 0x9d, 0xf9, 0x14, 0xf2, 0x1b, 0xf1, 0x56, 0x6a, 0x16, 0xbf,\n+0x2c, 0x85, 0x85, 0xcd, 0x78, 0x38, 0x9a, 0xeb, 0x42, 0x6a, 0x02, 0x34, 0x18, 0x83, 0x17, 0x4e,\n+0x94, 0x56, 0xf8, 0xb6, 0x82, 0xb5, 0xf3, 0x96, 0xdd, 0x3d, 0xf3, 0xbe, 0x7f, 0x20, 0x77, 0x3e,\n+0x7b, 0x19, 0x23, 0x6b, 0x2c, 0xd4, 0x72, 0x73, 0x43, 0x57, 0x7d, 0xe0, 0xf8, 0xd7, 0x69, 0x4f,\n+0x17, 0x36, 0x04, 0xf9, 0xc0, 0x90, 0x60, 0x37, 0x45, 0xde, 0xe6, 0x0c, 0xd8, 0x74, 0x8d, 0xae,\n+0x9c, 0xa2, 0x6d, 0x74, 0x5d, 0x42, 0xbe, 0x06, 0xf5, 0xd9, 0x64, 0x6e, 0x02, 0x10, 0xac, 0x89,\n+0xb0, 0x4c, 0x3b, 0x07, 0x4d, 0x40, 0x7e, 0x24, 0xc5, 0x8a, 0x98, 0x82, 0x79, 0x8e, 0xa4, 0xa7,\n+0x82, 0x20, 0x8d, 0x23, 0xfa, 0x27, 0x71, 0xc9, 0xdf, 0xc6, 0x41, 0x74, 0xa0, 0x4d, 0xf6, 0x91,\n+0x16, 0xdc, 0x46, 0x8c, 0x5f, 0x29, 0x63, 0x31, 0x59, 0x71, 0x0c, 0xd8, 0x6f, 0xc2, 0xb6, 0x32,\n+0x7d, 0xfb, 0xe6, 0x5d, 0x53, 0xa6, 0x7e, 0x15, 0xfc, 0xbb, 0x75, 0x7c, 0x5d, 0xec, 0xf8, 0xf6,\n+0x17, 0x1c, 0xec, 0xc7, 0x6b, 0x19, 0xcb, 0xf3, 0x7b, 0xf0, 0x2b, 0x07, 0xa5, 0xd9, 0x6c, 0x79,\n+0x54, 0x76, 0x6c, 0x9d, 0x1c, 0xa6, 0x6e, 0x0e, 0xe9, 0x79, 0x0c, 0xa8, 0x23, 0x6a, 0xa3, 0xdf,\n+0x1b, 0x30, 0x31, 0x9f, 0xb1, 0x54, 0x7b, 0xfe, 0x6a, 0xcb, 0x66, 0xaa, 0xdc, 0x65, 0xd0, 0xa2,\n+0x9e, 0x4a, 0x9a, 0x07, 0x21, 0x6b, 0x81, 0x8f, 0xdb, 0xc4, 0x59, 0xfa, 0xde, 0x22, 0xc0, 0x04,\n+0x9c, 0xe3, 0xaa, 0x5b, 0x36, 0x93, 0xe8, 0x3d, 0xbd, 0x7a, 0xa1, 0x9d, 0x0b, 0x76, 0xb1, 0x0b,\n+0xc7, 0x9d, 0xfd, 0xcf, 0x98, 0xa8, 0x06, 0xc2, 0xf8, 0x2a, 0xa3, 0xa1, 0x83, 0xa0, 0xb7, 0x25,\n+0x72, 0xa5, 0x02, 0xe3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x03, 0x5c, 0xab, 0x73, 0x81, 0x87, 0xa8,\n+0xcc, 0xb0, 0xa6, 0xd5, 0x94, 0xe2, 0x36, 0x96, 0x49, 0xff, 0x05, 0x99, 0x2c, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,\n+0x00, 0x7c, 0x78, 0xec, 0xf6, 0x02, 0x2c, 0xbb, 0x5b, 0x7e, 0x92, 0x2b, 0x5d, 0x39, 0xdc, 0xbe,\n+0xd8, 0x1d, 0xa2, 0x42, 0x33, 0x4d, 0xf9, 0xef, 0xa4, 0x2a, 0x3b, 0x44, 0x69, 0x1e, 0xac, 0xd9,\n+0x45, 0xa3, 0x4e, 0x3c, 0xa7, 0xd8, 0x24, 0x51, 0xb2, 0x54, 0x1c, 0x93, 0x4e, 0xc4, 0xef, 0x7b,\n+0x93, 0x85, 0x60, 0x26, 0xea, 0x09, 0x48, 0xe0, 0xf5, 0xbb, 0xc7, 0xe9, 0x68, 0xd2, 0xbb, 0x6a,\n+0x31, 0x71, 0xcc, 0x79, 0xae, 0x11, 0xa8, 0xf0, 0x99, 0xfd, 0xe5, 0x1f, 0xbc, 0x2f, 0xa8, 0xcc,\n+0x57, 0xeb, 0x76, 0xc4, 0x21, 0xa6, 0x47, 0x53, 0x55, 0x4d, 0x68, 0xbf, 0x05, 0xa4, 0xee, 0xd7,\n+0x26, 0xab, 0x62, 0xda, 0x43, 0x37, 0x4b, 0xe2, 0xc6, 0xb5, 0xe5, 0xb2, 0x83, 0x19, 0x3a, 0xc7,\n+0xd3, 0xdb, 0x4d, 0x9e, 0x08, 0x7a, 0xf3, 0xee, 0xcf, 0x3e, 0x62, 0xfb, 0xac, 0xe8, 0x60, 0xcc,\n+0xd1, 0xc7, 0xa1, 0x5c, 0x83, 0x45, 0xc4, 0x45, 0xcc, 0xf3, 0x17, 0x6b, 0x14, 0xc9, 0x04, 0x02,\n+0x3e, 0xd2, 0x24, 0xa6, 0x79, 0xe9, 0x1e, 0xce, 0xa2, 0xe7, 0xc1, 0x59, 0x15, 0x9f, 0x1d, 0xe2,\n+0x4b, 0x9a, 0x3e, 0x9f, 0x76, 0x08, 0x2d, 0x6b, 0xd8, 0xba, 0x57, 0x14, 0xda, 0x83, 0xea, 0xfe,\n+0x8c, 0x55, 0xe9, 0xd0, 0x4e, 0xa9, 0xcc, 0x77, 0x31, 0xb1, 0x44, 0x11, 0x7a, 0x5c, 0xb1, 0x3e,\n+0xd3, 0x14, 0x45, 0x15, 0x18, 0x62, 0x24, 0x13, 0xd2, 0xcb, 0x4d, 0xce, 0x5c, 0x83, 0xc1, 0x36,\n+0xf2, 0x10, 0xb5, 0x0e, 0x88, 0x6d, 0xb8, 0xe1, 0x56, 0x9f, 0x89, 0xde, 0x96, 0x66, 0x39, 0x47,\n+0x64, 0x2c, 0x6e, 0x4d, 0xae, 0x62, 0x7b, 0xbf, 0x60, 0x74, 0x19, 0xb8, 0x56, 0xac, 0x92, 0xac,\n+0x16, 0x32, 0xed, 0xad, 0x68, 0x55, 0xfe, 0x98, 0xba, 0xd3, 0x34, 0xde, 0xf4, 0xc9, 0x61, 0xc3,\n+0x0e, 0x86, 0xf6, 0x4b, 0x84, 0x60, 0xee, 0x0d, 0x7b, 0xb5, 0x32, 0x58, 0x79, 0x91, 0x55, 0x2c,\n+0x81, 0x43, 0xb3, 0x74, 0x1f, 0x7a, 0xaa, 0x25, 0x9e, 0x1d, 0xd7, 0xa1, 0x8b, 0xb9, 0xcd, 0x42,\n+0x2e, 0x04, 0xa4, 0x66, 0x83, 0x4d, 0x89, 0x35, 0xb6, 0x6c, 0xa8, 0x36, 0x4a, 0x79, 0x21, 0x78,\n+0x22, 0xd0, 0x42, 0xbc, 0xd1, 0x40, 0x31, 0x90, 0xa1, 0xbe, 0x04, 0xcf, 0xca, 0x67, 0xed, 0xf5,\n+0xf0, 0x80, 0xd3, 0x60, 0xc9, 0x83, 0x2a, 0x22, 0x05, 0xd0, 0x07, 0x3b, 0x52, 0xbf, 0x0c, 0x9e,\n+0xaa, 0x2b, 0xf9, 0xbb, 0xe6, 0x1f, 0x8f, 0x25, 0xba, 0x85, 0x8d, 0x17, 0x1e, 0x02, 0xfe, 0x5d,\n+0x50, 0x04, 0x57, 0xcf, 0xfe, 0x2d, 0xbc, 0xef, 0x5c, 0xc0, 0x1a, 0xab, 0xb6, 0x9f, 0x24, 0xc6,\n+0xdf, 0x73, 0x68, 0x48, 0x90, 0x2c, 0x14, 0xf4, 0x3f, 0x52, 0x1a, 0xe4, 0xd2, 0xcb, 0x14, 0xc3,\n+0x61, 0x69, 0xcf, 0xe2, 0xf9, 0x18, 0xc5, 0xba, 0x33, 0x9f, 0x14, 0xa3, 0x04, 0x5d, 0xb9, 0x71,\n+0xf7, 0xb5, 0x94, 0xd8, 0xf6, 0x33, 0xc1, 0x5a, 0xc1, 0x34, 0x8b, 0x7c, 0x9b, 0xdd, 0x93, 0x3a,\n+0xe7, 0x13, 0xa2, 0x70, 0x61, 0x9f, 0xaf, 0x8f, 0xeb, 0xd8, 0xc5, 0x75, 0xf8, 0x33, 0x66, 0xd4,\n+0x74, 0x67, 0x3a, 0x37, 0x77, 0x9c, 0xe7, 0xdd, 0xa4, 0x0f, 0x76, 0x43, 0x66, 0x8a, 0x43, 0xf2,\n+0x9f, 0xfb, 0x0c, 0x42, 0x78, 0x63, 0xd1, 0xe2, 0x0f, 0x6f, 0x7b, 0xd4, 0xa1, 0x3d, 0x74, 0x97,\n+0x85, 0xb7, 0x48, 0x39, 0x41, 0xd6, 0x20, 0xfc, 0xd0, 0x3a, 0xb3, 0xfa, 0xe8, 0x6f, 0xc4, 0x8a,\n+0xba, 0x71, 0x37, 0xbe, 0x8b, 0x97, 0xb1, 0x78, 0x31, 0x4f, 0xb3, 0xe7, 0xb6, 0x03, 0x13, 0xce,\n+0x54, 0x9d, 0xae, 0x25, 0x59, 0xcc, 0x7f, 0x35, 0x5f, 0x08, 0xf7, 0x40, 0x45, 0x31, 0x78, 0x2a,\n+0x7a, 0x30, 0x82, 0x02, 0x0b, 0x30, 0x82, 0x01, 0x91, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x12,\n+0x11, 0xd2, 0xbb, 0xba, 0x33, 0x6e, 0xd4, 0xbc, 0xe6, 0x24, 0x68, 0xc5, 0x0d, 0x84, 0x1d, 0x98,\n+0xe8, 0x43, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x46,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30,\n+0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69,\n+0x67, 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x45, 0x34, 0x36, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x33, 0x32, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x36, 0x30, 0x33, 0x32, 0x30, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10,\n+0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61,\n+0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61,\n+0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x45, 0x34, 0x36, 0x30, 0x76,\n+0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04,\n+0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x9c, 0x0e, 0xb1, 0xcf, 0xb7, 0xe8, 0x9e, 0x52, 0x77, 0x75,\n+0x34, 0xfa, 0xa5, 0x46, 0xa7, 0xad, 0x32, 0x19, 0x32, 0xb4, 0x07, 0xa9, 0x27, 0xca, 0x94, 0xbb,\n+0x0c, 0xd2, 0x0a, 0x10, 0xc7, 0xda, 0x89, 0xb0, 0x97, 0x0c, 0x70, 0x13, 0x09, 0x01, 0x8e, 0xd8,\n+0xea, 0x47, 0xea, 0xbe, 0xb2, 0x80, 0x2b, 0xcd, 0xfc, 0x28, 0x0d, 0xdb, 0xac, 0xbc, 0xa4, 0x86,\n+0x37, 0xed, 0x70, 0x08, 0x00, 0x75, 0xea, 0x93, 0x0b, 0x7b, 0x2e, 0x52, 0x9c, 0x23, 0x68, 0x23,\n+0x06, 0x43, 0xec, 0x92, 0x2f, 0x53, 0x84, 0xdb, 0xfb, 0x47, 0x14, 0x07, 0xe8, 0x5f, 0x94, 0x67,\n+0x5d, 0xc9, 0x7a, 0x81, 0x3c, 0x20, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,\n+0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x31, 0x0a, 0x90, 0x8f, 0xb6, 0xc6, 0x9d, 0xd2, 0x44, 0x4b,\n+0x80, 0xb5, 0xa2, 0xe6, 0x1f, 0xb1, 0x12, 0x4f, 0x1b, 0x95, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86,\n+0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0xdf, 0x54,\n+0x90, 0xed, 0x9b, 0xef, 0x8b, 0x94, 0x02, 0x93, 0x17, 0x82, 0x99, 0xbe, 0xb3, 0x9e, 0x2c, 0xf6,\n+0x0b, 0x91, 0x8c, 0x9f, 0x4a, 0x14, 0xb1, 0xf6, 0x64, 0xbc, 0xbb, 0x68, 0x51, 0x13, 0x0c, 0x03,\n+0xf7, 0x15, 0x8b, 0x84, 0x60, 0xb9, 0x8b, 0xff, 0x52, 0x8e, 0xe7, 0x8c, 0xbc, 0x1c, 0x02, 0x30,\n+0x3c, 0xf9, 0x11, 0xd4, 0x8c, 0x4e, 0xc0, 0xc1, 0x61, 0xc2, 0x15, 0x4c, 0xaa, 0xab, 0x1d, 0x0b,\n+0x31, 0x5f, 0x3b, 0x1c, 0xe2, 0x00, 0x97, 0x44, 0x31, 0xe6, 0xfe, 0x73, 0x96, 0x2f, 0xda, 0x96,\n+0xd3, 0xfe, 0x08, 0x07, 0xb3, 0x34, 0x89, 0xbc, 0x05, 0x9f, 0xf7, 0x1e, 0x86, 0xee, 0x8b, 0x70,\n+0x30, 0x82, 0x03, 0xba, 0x30, 0x82, 0x02, 0xa2, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b, 0x04,\n+0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x86, 0x26, 0xe6, 0x0d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06,\n+0x03, 0x55, 0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e,\n+0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x32, 0x31, 0x13, 0x30,\n+0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69,\n+0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f,\n+0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32, 0x31,\n+0x35, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x31, 0x32, 0x31, 0x35,\n+0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52,\n+0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x32, 0x31, 0x13, 0x30, 0x11, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e,\n+0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61,\n+0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,\n+0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa6, 0xcf, 0x24, 0x0e, 0xbe, 0x2e, 0x6f, 0x28, 0x99, 0x45,\n+0x42, 0xc4, 0xab, 0x3e, 0x21, 0x54, 0x9b, 0x0b, 0xd3, 0x7f, 0x84, 0x70, 0xfa, 0x12, 0xb3, 0xcb,\n+0xbf, 0x87, 0x5f, 0xc6, 0x7f, 0x86, 0xd3, 0xb2, 0x30, 0x5c, 0xd6, 0xfd, 0xad, 0xf1, 0x7b, 0xdc,\n+0xe5, 0xf8, 0x60, 0x96, 0x09, 0x92, 0x10, 0xf5, 0xd0, 0x53, 0xde, 0xfb, 0x7b, 0x7e, 0x73, 0x88,\n+0xac, 0x52, 0x88, 0x7b, 0x4a, 0xa6, 0xca, 0x49, 0xa6, 0x5e, 0xa8, 0xa7, 0x8c, 0x5a, 0x11, 0xbc,\n+0x7a, 0x82, 0xeb, 0xbe, 0x8c, 0xe9, 0xb3, 0xac, 0x96, 0x25, 0x07, 0x97, 0x4a, 0x99, 0x2a, 0x07,\n+0x2f, 0xb4, 0x1e, 0x77, 0xbf, 0x8a, 0x0f, 0xb5, 0x02, 0x7c, 0x1b, 0x96, 0xb8, 0xc5, 0xb9, 0x3a,\n+0x2c, 0xbc, 0xd6, 0x12, 0xb9, 0xeb, 0x59, 0x7d, 0xe2, 0xd0, 0x06, 0x86, 0x5f, 0x5e, 0x49, 0x6a,\n+0xb5, 0x39, 0x5e, 0x88, 0x34, 0xec, 0xbc, 0x78, 0x0c, 0x08, 0x98, 0x84, 0x6c, 0xa8, 0xcd, 0x4b,\n+0xb4, 0xa0, 0x7d, 0x0c, 0x79, 0x4d, 0xf0, 0xb8, 0x2d, 0xcb, 0x21, 0xca, 0xd5, 0x6c, 0x5b, 0x7d,\n+0xe1, 0xa0, 0x29, 0x84, 0xa1, 0xf9, 0xd3, 0x94, 0x49, 0xcb, 0x24, 0x62, 0x91, 0x20, 0xbc, 0xdd,\n+0x0b, 0xd5, 0xd9, 0xcc, 0xf9, 0xea, 0x27, 0x0a, 0x2b, 0x73, 0x91, 0xc6, 0x9d, 0x1b, 0xac, 0xc8,\n+0xcb, 0xe8, 0xe0, 0xa0, 0xf4, 0x2f, 0x90, 0x8b, 0x4d, 0xfb, 0xb0, 0x36, 0x1b, 0xf6, 0x19, 0x7a,\n+0x85, 0xe0, 0x6d, 0xf2, 0x61, 0x13, 0x88, 0x5c, 0x9f, 0xe0, 0x93, 0x0a, 0x51, 0x97, 0x8a, 0x5a,\n+0xce, 0xaf, 0xab, 0xd5, 0xf7, 0xaa, 0x09, 0xaa, 0x60, 0xbd, 0xdc, 0xd9, 0x5f, 0xdf, 0x72, 0xa9,\n+0x60, 0x13, 0x5e, 0x00, 0x01, 0xc9, 0x4a, 0xfa, 0x3f, 0xa4, 0xea, 0x07, 0x03, 0x21, 0x02, 0x8e,\n+0x82, 0xca, 0x03, 0xc2, 0x9b, 0x8f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9c, 0x30, 0x81,\n+0x99, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n+0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9b, 0xe2, 0x07,\n+0x57, 0x67, 0x1c, 0x1e, 0xc0, 0x6a, 0x06, 0xde, 0x59, 0xb4, 0x9a, 0x2d, 0xdf, 0xdc, 0x19, 0x86,\n+0x2e, 0x30, 0x36, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2f, 0x30, 0x2d, 0x30, 0x2b, 0xa0, 0x29,\n+0xa0, 0x27, 0x86, 0x25, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x67,\n+0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x72, 0x6f,\n+0x6f, 0x74, 0x2d, 0x72, 0x32, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,\n+0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x9b, 0xe2, 0x07, 0x57, 0x67, 0x1c, 0x1e, 0xc0, 0x6a, 0x06,\n+0xde, 0x59, 0xb4, 0x9a, 0x2d, 0xdf, 0xdc, 0x19, 0x86, 0x2e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x99, 0x81,\n+0x53, 0x87, 0x1c, 0x68, 0x97, 0x86, 0x91, 0xec, 0xe0, 0x4a, 0xb8, 0x44, 0x0b, 0xab, 0x81, 0xac,\n+0x27, 0x4f, 0xd6, 0xc1, 0xb8, 0x1c, 0x43, 0x78, 0xb3, 0x0c, 0x9a, 0xfc, 0xea, 0x2c, 0x3c, 0x6e,\n+0x61, 0x1b, 0x4d, 0x4b, 0x29, 0xf5, 0x9f, 0x05, 0x1d, 0x26, 0xc1, 0xb8, 0xe9, 0x83, 0x00, 0x62,\n+0x45, 0xb6, 0xa9, 0x08, 0x93, 0xb9, 0xa9, 0x33, 0x4b, 0x18, 0x9a, 0xc2, 0xf8, 0x87, 0x88, 0x4e,\n+0xdb, 0xdd, 0x71, 0x34, 0x1a, 0xc1, 0x54, 0xda, 0x46, 0x3f, 0xe0, 0xd3, 0x2a, 0xab, 0x6d, 0x54,\n+0x22, 0xf5, 0x3a, 0x62, 0xcd, 0x20, 0x6f, 0xba, 0x29, 0x89, 0xd7, 0xdd, 0x91, 0xee, 0xd3, 0x5c,\n+0xa2, 0x3e, 0xa1, 0x5b, 0x41, 0xf5, 0xdf, 0xe5, 0x64, 0x43, 0x2d, 0xe9, 0xd5, 0x39, 0xab, 0xd2,\n+0xa2, 0xdf, 0xb7, 0x8b, 0xd0, 0xc0, 0x80, 0x19, 0x1c, 0x45, 0xc0, 0x2d, 0x8c, 0xe8, 0xf8, 0x2d,\n+0xa4, 0x74, 0x56, 0x49, 0xc5, 0x05, 0xb5, 0x4f, 0x15, 0xde, 0x6e, 0x44, 0x78, 0x39, 0x87, 0xa8,\n+0x7e, 0xbb, 0xf3, 0x79, 0x18, 0x91, 0xbb, 0xf4, 0x6f, 0x9d, 0xc1, 0xf0, 0x8c, 0x35, 0x8c, 0x5d,\n+0x01, 0xfb, 0xc3, 0x6d, 0xb9, 0xef, 0x44, 0x6d, 0x79, 0x46, 0x31, 0x7e, 0x0a, 0xfe, 0xa9, 0x82,\n+0xc1, 0xff, 0xef, 0xab, 0x6e, 0x20, 0xc4, 0x50, 0xc9, 0x5f, 0x9d, 0x4d, 0x9b, 0x17, 0x8c, 0x0c,\n+0xe5, 0x01, 0xc9, 0xa0, 0x41, 0x6a, 0x73, 0x53, 0xfa, 0xa5, 0x50, 0xb4, 0x6e, 0x25, 0x0f, 0xfb,\n+0x4c, 0x18, 0xf4, 0xfd, 0x52, 0xd9, 0x8e, 0x69, 0xb1, 0xe8, 0x11, 0x0f, 0xde, 0x88, 0xd8, 0xfb,\n+0x1d, 0x49, 0xf7, 0xaa, 0xde, 0x95, 0xcf, 0x20, 0x78, 0xc2, 0x60, 0x12, 0xdb, 0x25, 0x40, 0x8c,\n+0x6a, 0xfc, 0x7e, 0x42, 0x38, 0x40, 0x64, 0x12, 0xf7, 0x9e, 0x81, 0xe1, 0x93, 0x2e, 0x30, 0x82,\n+0x03, 0x5f, 0x30, 0x82, 0x02, 0x47, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b, 0x04, 0x00, 0x00,\n+0x00, 0x00, 0x01, 0x21, 0x58, 0x53, 0x08, 0xa2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52,\n+0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x33, 0x31, 0x13, 0x30, 0x11, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e,\n+0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61,\n+0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x33, 0x31, 0x38, 0x31,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x33, 0x31, 0x38, 0x31, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x33, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13,\n+0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53,\n+0x69, 0x67, 0x6e, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02,\n+0x82, 0x01, 0x01, 0x00, 0xcc, 0x25, 0x76, 0x90, 0x79, 0x06, 0x78, 0x22, 0x16, 0xf5, 0xc0, 0x83,\n+0xb6, 0x84, 0xca, 0x28, 0x9e, 0xfd, 0x05, 0x76, 0x11, 0xc5, 0xad, 0x88, 0x72, 0xfc, 0x46, 0x02,\n+0x43, 0xc7, 0xb2, 0x8a, 0x9d, 0x04, 0x5f, 0x24, 0xcb, 0x2e, 0x4b, 0xe1, 0x60, 0x82, 0x46, 0xe1,\n+0x52, 0xab, 0x0c, 0x81, 0x47, 0x70, 0x6c, 0xdd, 0x64, 0xd1, 0xeb, 0xf5, 0x2c, 0xa3, 0x0f, 0x82,\n+0x3d, 0x0c, 0x2b, 0xae, 0x97, 0xd7, 0xb6, 0x14, 0x86, 0x10, 0x79, 0xbb, 0x3b, 0x13, 0x80, 0x77,\n+0x8c, 0x08, 0xe1, 0x49, 0xd2, 0x6a, 0x62, 0x2f, 0x1f, 0x5e, 0xfa, 0x96, 0x68, 0xdf, 0x89, 0x27,\n+0x95, 0x38, 0x9f, 0x06, 0xd7, 0x3e, 0xc9, 0xcb, 0x26, 0x59, 0x0d, 0x73, 0xde, 0xb0, 0xc8, 0xe9,\n+0x26, 0x0e, 0x83, 0x15, 0xc6, 0xef, 0x5b, 0x8b, 0xd2, 0x04, 0x60, 0xca, 0x49, 0xa6, 0x28, 0xf6,\n+0x69, 0x3b, 0xf6, 0xcb, 0xc8, 0x28, 0x91, 0xe5, 0x9d, 0x8a, 0x61, 0x57, 0x37, 0xac, 0x74, 0x14,\n+0xdc, 0x74, 0xe0, 0x3a, 0xee, 0x72, 0x2f, 0x2e, 0x9c, 0xfb, 0xd0, 0xbb, 0xbf, 0xf5, 0x3d, 0x00,\n+0xe1, 0x06, 0x33, 0xe8, 0x82, 0x2b, 0xae, 0x53, 0xa6, 0x3a, 0x16, 0x73, 0x8c, 0xdd, 0x41, 0x0e,\n+0x20, 0x3a, 0xc0, 0xb4, 0xa7, 0xa1, 0xe9, 0xb2, 0x4f, 0x90, 0x2e, 0x32, 0x60, 0xe9, 0x57, 0xcb,\n+0xb9, 0x04, 0x92, 0x68, 0x68, 0xe5, 0x38, 0x26, 0x60, 0x75, 0xb2, 0x9f, 0x77, 0xff, 0x91, 0x14,\n+0xef, 0xae, 0x20, 0x49, 0xfc, 0xad, 0x40, 0x15, 0x48, 0xd1, 0x02, 0x31, 0x61, 0x19, 0x5e, 0xb8,\n+0x97, 0xef, 0xad, 0x77, 0xb7, 0x64, 0x9a, 0x7a, 0xbf, 0x5f, 0xc1, 0x13, 0xef, 0x9b, 0x62, 0xfb,\n+0x0d, 0x6c, 0xe0, 0x54, 0x69, 0x16, 0xa9, 0x03, 0xda, 0x6e, 0xe9, 0x83, 0x93, 0x71, 0x76, 0xc6,\n+0x69, 0x85, 0x82, 0x17, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x8f, 0xf0, 0x4b, 0x7f, 0xa8, 0x2e, 0x45,\n+0x24, 0xae, 0x4d, 0x50, 0xfa, 0x63, 0x9a, 0x8b, 0xde, 0xe2, 0xdd, 0x1b, 0xbc, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01,\n+0x00, 0x4b, 0x40, 0xdb, 0xc0, 0x50, 0xaa, 0xfe, 0xc8, 0x0c, 0xef, 0xf7, 0x96, 0x54, 0x45, 0x49,\n+0xbb, 0x96, 0x00, 0x09, 0x41, 0xac, 0xb3, 0x13, 0x86, 0x86, 0x28, 0x07, 0x33, 0xca, 0x6b, 0xe6,\n+0x74, 0xb9, 0xba, 0x00, 0x2d, 0xae, 0xa4, 0x0a, 0xd3, 0xf5, 0xf1, 0xf1, 0x0f, 0x8a, 0xbf, 0x73,\n+0x67, 0x4a, 0x83, 0xc7, 0x44, 0x7b, 0x78, 0xe0, 0xaf, 0x6e, 0x6c, 0x6f, 0x03, 0x29, 0x8e, 0x33,\n+0x39, 0x45, 0xc3, 0x8e, 0xe4, 0xb9, 0x57, 0x6c, 0xaa, 0xfc, 0x12, 0x96, 0xec, 0x53, 0xc6, 0x2d,\n+0xe4, 0x24, 0x6c, 0xb9, 0x94, 0x63, 0xfb, 0xdc, 0x53, 0x68, 0x67, 0x56, 0x3e, 0x83, 0xb8, 0xcf,\n+0x35, 0x21, 0xc3, 0xc9, 0x68, 0xfe, 0xce, 0xda, 0xc2, 0x53, 0xaa, 0xcc, 0x90, 0x8a, 0xe9, 0xf0,\n+0x5d, 0x46, 0x8c, 0x95, 0xdd, 0x7a, 0x58, 0x28, 0x1a, 0x2f, 0x1d, 0xde, 0xcd, 0x00, 0x37, 0x41,\n+0x8f, 0xed, 0x44, 0x6d, 0xd7, 0x53, 0x28, 0x97, 0x7e, 0xf3, 0x67, 0x04, 0x1e, 0x15, 0xd7, 0x8a,\n+0x96, 0xb4, 0xd3, 0xde, 0x4c, 0x27, 0xa4, 0x4c, 0x1b, 0x73, 0x73, 0x76, 0xf4, 0x17, 0x99, 0xc2,\n+0x1f, 0x7a, 0x0e, 0xe3, 0x2d, 0x08, 0xad, 0x0a, 0x1c, 0x2c, 0xff, 0x3c, 0xab, 0x55, 0x0e, 0x0f,\n+0x91, 0x7e, 0x36, 0xeb, 0xc3, 0x57, 0x49, 0xbe, 0xe1, 0x2e, 0x2d, 0x7c, 0x60, 0x8b, 0xc3, 0x41,\n+0x51, 0x13, 0x23, 0x9d, 0xce, 0xf7, 0x32, 0x6b, 0x94, 0x01, 0xa8, 0x99, 0xe7, 0x2c, 0x33, 0x1f,\n+0x3a, 0x3b, 0x25, 0xd2, 0x86, 0x40, 0xce, 0x3b, 0x2c, 0x86, 0x78, 0xc9, 0x61, 0x2f, 0x14, 0xba,\n+0xee, 0xdb, 0x55, 0x6f, 0xdf, 0x84, 0xee, 0x05, 0x09, 0x4d, 0xbd, 0x28, 0xd8, 0x72, 0xce, 0xd3,\n+0x62, 0x50, 0x65, 0x1e, 0xeb, 0x92, 0x97, 0x83, 0x31, 0xd9, 0xb3, 0xb5, 0xca, 0x47, 0x58, 0x3f,\n+0x5f, 0x30, 0x82, 0x03, 0x75, 0x30, 0x82, 0x02, 0x5d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b,\n+0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x15, 0x4b, 0x5a, 0xc3, 0x94, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x57, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x6e,\n+0x76, 0x2d, 0x73, 0x61, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07, 0x52,\n+0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x38, 0x30, 0x39, 0x30, 0x31, 0x31, 0x32, 0x30,\n+0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x30, 0x31, 0x32, 0x38, 0x31, 0x32, 0x30, 0x30,\n+0x30, 0x30, 0x5a, 0x30, 0x57, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f,\n+0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x10, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31,\n+0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c,\n+0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n+0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xda, 0x0e, 0xe6,\n+0x99, 0x8d, 0xce, 0xa3, 0xe3, 0x4f, 0x8a, 0x7e, 0xfb, 0xf1, 0x8b, 0x83, 0x25, 0x6b, 0xea, 0x48,\n+0x1f, 0xf1, 0x2a, 0xb0, 0xb9, 0x95, 0x11, 0x04, 0xbd, 0xf0, 0x63, 0xd1, 0xe2, 0x67, 0x66, 0xcf,\n+0x1c, 0xdd, 0xcf, 0x1b, 0x48, 0x2b, 0xee, 0x8d, 0x89, 0x8e, 0x9a, 0xaf, 0x29, 0x80, 0x65, 0xab,\n+0xe9, 0xc7, 0x2d, 0x12, 0xcb, 0xab, 0x1c, 0x4c, 0x70, 0x07, 0xa1, 0x3d, 0x0a, 0x30, 0xcd, 0x15,\n+0x8d, 0x4f, 0xf8, 0xdd, 0xd4, 0x8c, 0x50, 0x15, 0x1c, 0xef, 0x50, 0xee, 0xc4, 0x2e, 0xf7, 0xfc,\n+0xe9, 0x52, 0xf2, 0x91, 0x7d, 0xe0, 0x6d, 0xd5, 0x35, 0x30, 0x8e, 0x5e, 0x43, 0x73, 0xf2, 0x41,\n+0xe9, 0xd5, 0x6a, 0xe3, 0xb2, 0x89, 0x3a, 0x56, 0x39, 0x38, 0x6f, 0x06, 0x3c, 0x88, 0x69, 0x5b,\n+0x2a, 0x4d, 0xc5, 0xa7, 0x54, 0xb8, 0x6c, 0x89, 0xcc, 0x9b, 0xf9, 0x3c, 0xca, 0xe5, 0xfd, 0x89,\n+0xf5, 0x12, 0x3c, 0x92, 0x78, 0x96, 0xd6, 0xdc, 0x74, 0x6e, 0x93, 0x44, 0x61, 0xd1, 0x8d, 0xc7,\n+0x46, 0xb2, 0x75, 0x0e, 0x86, 0xe8, 0x19, 0x8a, 0xd5, 0x6d, 0x6c, 0xd5, 0x78, 0x16, 0x95, 0xa2,\n+0xe9, 0xc8, 0x0a, 0x38, 0xeb, 0xf2, 0x24, 0x13, 0x4f, 0x73, 0x54, 0x93, 0x13, 0x85, 0x3a, 0x1b,\n+0xbc, 0x1e, 0x34, 0xb5, 0x8b, 0x05, 0x8c, 0xb9, 0x77, 0x8b, 0xb1, 0xdb, 0x1f, 0x20, 0x91, 0xab,\n+0x09, 0x53, 0x6e, 0x90, 0xce, 0x7b, 0x37, 0x74, 0xb9, 0x70, 0x47, 0x91, 0x22, 0x51, 0x63, 0x16,\n+0x79, 0xae, 0xb1, 0xae, 0x41, 0x26, 0x08, 0xc8, 0x19, 0x2b, 0xd1, 0x46, 0xaa, 0x48, 0xd6, 0x64,\n+0x2a, 0xd7, 0x83, 0x34, 0xff, 0x2c, 0x2a, 0xc1, 0x6c, 0x19, 0x43, 0x4a, 0x07, 0x85, 0xe7, 0xd3,\n+0x7c, 0xf6, 0x21, 0x68, 0xef, 0xea, 0xf2, 0x52, 0x9f, 0x7f, 0x93, 0x90, 0xcf, 0x02, 0x03, 0x01,\n+0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n+0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n+0x04, 0x14, 0x60, 0x7b, 0x66, 0x1a, 0x45, 0x0d, 0x97, 0xca, 0x89, 0x50, 0x2f, 0x7d, 0x04, 0xcd,\n+0x34, 0xa8, 0xff, 0xfc, 0xfd, 0x4b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xd6, 0x73, 0xe7, 0x7c, 0x4f, 0x76,\n+0xd0, 0x8d, 0xbf, 0xec, 0xba, 0xa2, 0xbe, 0x34, 0xc5, 0x28, 0x32, 0xb5, 0x7c, 0xfc, 0x6c, 0x9c,\n+0x2c, 0x2b, 0xbd, 0x09, 0x9e, 0x53, 0xbf, 0x6b, 0x5e, 0xaa, 0x11, 0x48, 0xb6, 0xe5, 0x08, 0xa3,\n+0xb3, 0xca, 0x3d, 0x61, 0x4d, 0xd3, 0x46, 0x09, 0xb3, 0x3e, 0xc3, 0xa0, 0xe3, 0x63, 0x55, 0x1b,\n+0xf2, 0xba, 0xef, 0xad, 0x39, 0xe1, 0x43, 0xb9, 0x38, 0xa3, 0xe6, 0x2f, 0x8a, 0x26, 0x3b, 0xef,\n+0xa0, 0x50, 0x56, 0xf9, 0xc6, 0x0a, 0xfd, 0x38, 0xcd, 0xc4, 0x0b, 0x70, 0x51, 0x94, 0x97, 0x98,\n+0x04, 0xdf, 0xc3, 0x5f, 0x94, 0xd5, 0x15, 0xc9, 0x14, 0x41, 0x9c, 0xc4, 0x5d, 0x75, 0x64, 0x15,\n+0x0d, 0xff, 0x55, 0x30, 0xec, 0x86, 0x8f, 0xff, 0x0d, 0xef, 0x2c, 0xb9, 0x63, 0x46, 0xf6, 0xaa,\n+0xfc, 0xdf, 0xbc, 0x69, 0xfd, 0x2e, 0x12, 0x48, 0x64, 0x9a, 0xe0, 0x95, 0xf0, 0xa6, 0xef, 0x29,\n+0x8f, 0x01, 0xb1, 0x15, 0xb5, 0x0c, 0x1d, 0xa5, 0xfe, 0x69, 0x2c, 0x69, 0x24, 0x78, 0x1e, 0xb3,\n+0xa7, 0x1c, 0x71, 0x62, 0xee, 0xca, 0xc8, 0x97, 0xac, 0x17, 0x5d, 0x8a, 0xc2, 0xf8, 0x47, 0x86,\n+0x6e, 0x2a, 0xc4, 0x56, 0x31, 0x95, 0xd0, 0x67, 0x89, 0x85, 0x2b, 0xf9, 0x6c, 0xa6, 0x5d, 0x46,\n+0x9d, 0x0c, 0xaa, 0x82, 0xe4, 0x99, 0x51, 0xdd, 0x70, 0xb7, 0xdb, 0x56, 0x3d, 0x61, 0xe4, 0x6a,\n+0xe1, 0x5c, 0xd6, 0xf6, 0xfe, 0x3d, 0xde, 0x41, 0xcc, 0x07, 0xae, 0x63, 0x52, 0xbf, 0x53, 0x53,\n+0xf4, 0x2b, 0xe9, 0xc7, 0xfd, 0xb6, 0xf7, 0x82, 0x5f, 0x85, 0xd2, 0x41, 0x18, 0xdb, 0x81, 0xb3,\n+0x04, 0x1c, 0xc5, 0x1f, 0xa4, 0x80, 0x6f, 0x15, 0x20, 0xc9, 0xde, 0x0c, 0x88, 0x0a, 0x1d, 0xd6,\n+0x66, 0x55, 0xe2, 0xfc, 0x48, 0xc9, 0x29, 0x26, 0x69, 0xe0, 0x30, 0x82, 0x02, 0x1e, 0x30, 0x82,\n+0x01, 0xa4, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x60, 0x59, 0x49, 0xe0, 0x26, 0x2e, 0xbb,\n+0x55, 0xf9, 0x0a, 0x77, 0x8a, 0x71, 0xf9, 0x4a, 0xd8, 0x6c, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86,\n+0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x50, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04,\n+0x0b, 0x13, 0x1b, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43,\n+0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x35, 0x31, 0x13,\n+0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53,\n+0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c,\n+0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x31, 0x31,\n+0x31, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31,\n+0x39, 0x30, 0x33, 0x31, 0x34, 0x30, 0x37, 0x5a, 0x30, 0x50, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03,\n+0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20,\n+0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x35,\n+0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61,\n+0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a,\n+0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07,\n+0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62,\n+0x00, 0x04, 0x47, 0x45, 0x0e, 0x96, 0xfb, 0x7d, 0x5d, 0xbf, 0xe9, 0x39, 0xd1, 0x21, 0xf8, 0x9f,\n+0x0b, 0xb6, 0xd5, 0x7b, 0x1e, 0x92, 0x3a, 0x48, 0x59, 0x1c, 0xf0, 0x62, 0x31, 0x2d, 0xc0, 0x7a,\n+0x28, 0xfe, 0x1a, 0xa7, 0x5c, 0xb3, 0xb6, 0xcc, 0x97, 0xe7, 0x45, 0xd4, 0x58, 0xfa, 0xd1, 0x77,\n+0x6d, 0x43, 0xa2, 0xc0, 0x87, 0x65, 0x34, 0x0a, 0x1f, 0x7a, 0xdd, 0xeb, 0x3c, 0x33, 0xa1, 0xc5,\n+0x9d, 0x4d, 0xa4, 0x6f, 0x41, 0x95, 0x38, 0x7f, 0xc9, 0x1e, 0x84, 0xeb, 0xd1, 0x9e, 0x49, 0x92,\n+0x87, 0x94, 0x87, 0x0c, 0x3a, 0x85, 0x4a, 0x66, 0x9f, 0x9d, 0x59, 0x93, 0x4d, 0x97, 0x61, 0x06,\n+0x86, 0x4a, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n+0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n+0x04, 0x14, 0x3d, 0xe6, 0x29, 0x48, 0x9b, 0xea, 0x07, 0xca, 0x21, 0x44, 0x4a, 0x26, 0xde, 0x6e,\n+0xde, 0xd2, 0x83, 0xd0, 0x9f, 0x59, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04,\n+0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0xe5, 0x69, 0x12, 0xc9, 0x6e, 0xdb,\n+0xc6, 0x31, 0xba, 0x09, 0x41, 0xe1, 0x97, 0xf8, 0xfb, 0xfd, 0x9a, 0xe2, 0x7d, 0x12, 0xc9, 0xed,\n+0x7c, 0x64, 0xd3, 0xcb, 0x05, 0x25, 0x8b, 0x56, 0xd9, 0xa0, 0xe7, 0x5e, 0x5d, 0x4e, 0x0b, 0x83,\n+0x9c, 0x5b, 0x76, 0x29, 0xa0, 0x09, 0x26, 0x21, 0x6a, 0x62, 0x02, 0x30, 0x71, 0xd2, 0xb5, 0x8f,\n+0x5c, 0xea, 0x3b, 0xe1, 0x78, 0x09, 0x85, 0xa8, 0x75, 0x92, 0x3b, 0xc8, 0x5c, 0xfd, 0x48, 0xef,\n+0x0d, 0x74, 0x22, 0xa8, 0x08, 0xe2, 0x6e, 0xc5, 0x49, 0xce, 0xc7, 0x0c, 0xbc, 0xa7, 0x61, 0x69,\n+0xf1, 0xf7, 0x3b, 0xe1, 0x2a, 0xcb, 0xf9, 0x2b, 0xf3, 0x66, 0x90, 0x37, 0x30, 0x82, 0x05, 0x83,\n+0x30, 0x82, 0x03, 0x6b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0e, 0x45, 0xe6, 0xbb, 0x03, 0x83,\n+0x33, 0xc3, 0x85, 0x65, 0x48, 0xe6, 0xff, 0x45, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03,\n+0x55, 0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20,\n+0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x36, 0x31, 0x13, 0x30, 0x11,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67,\n+0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62,\n+0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x32, 0x31, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x31, 0x32, 0x31, 0x30, 0x30,\n+0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04,\n+0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x36, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31,\n+0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c,\n+0x53, 0x69, 0x67, 0x6e, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a,\n+0x02, 0x82, 0x02, 0x01, 0x00, 0x95, 0x07, 0xe8, 0x73, 0xca, 0x66, 0xf9, 0xec, 0x14, 0xca, 0x7b,\n+0x3c, 0xf7, 0x0d, 0x08, 0xf1, 0xb4, 0x45, 0x0b, 0x2c, 0x82, 0xb4, 0x48, 0xc6, 0xeb, 0x5b, 0x3c,\n+0xae, 0x83, 0xb8, 0x41, 0x92, 0x33, 0x14, 0xa4, 0x6f, 0x7f, 0xe9, 0x2a, 0xcc, 0xc6, 0xb0, 0x88,\n+0x6b, 0xc5, 0xb6, 0x89, 0xd1, 0xc6, 0xb2, 0xff, 0x14, 0xce, 0x51, 0x14, 0x21, 0xec, 0x4a, 0xdd,\n+0x1b, 0x5a, 0xc6, 0xd6, 0x87, 0xee, 0x4d, 0x3a, 0x15, 0x06, 0xed, 0x64, 0x66, 0x0b, 0x92, 0x80,\n+0xca, 0x44, 0xde, 0x73, 0x94, 0x4e, 0xf3, 0xa7, 0x89, 0x7f, 0x4f, 0x78, 0x63, 0x08, 0xc8, 0x12,\n+0x50, 0x6d, 0x42, 0x66, 0x2f, 0x4d, 0xb9, 0x79, 0x28, 0x4d, 0x52, 0x1a, 0x8a, 0x1a, 0x80, 0xb7,\n+0x19, 0x81, 0x0e, 0x7e, 0xc4, 0x8a, 0xbc, 0x64, 0x4c, 0x21, 0x1c, 0x43, 0x68, 0xd7, 0x3d, 0x3c,\n+0x8a, 0xc5, 0xb2, 0x66, 0xd5, 0x90, 0x9a, 0xb7, 0x31, 0x06, 0xc5, 0xbe, 0xe2, 0x6d, 0x32, 0x06,\n+0xa6, 0x1e, 0xf9, 0xb9, 0xeb, 0xaa, 0xa3, 0xb8, 0xbf, 0xbe, 0x82, 0x63, 0x50, 0xd0, 0xf0, 0x18,\n+0x89, 0xdf, 0xe4, 0x0f, 0x79, 0xf5, 0xea, 0xa2, 0x1f, 0x2a, 0xd2, 0x70, 0x2e, 0x7b, 0xe7, 0xbc,\n+0x93, 0xbb, 0x6d, 0x53, 0xe2, 0x48, 0x7c, 0x8c, 0x10, 0x07, 0x38, 0xff, 0x66, 0xb2, 0x77, 0x61,\n+0x7e, 0xe0, 0xea, 0x8c, 0x3c, 0xaa, 0xb4, 0xa4, 0xf6, 0xf3, 0x95, 0x4a, 0x12, 0x07, 0x6d, 0xfd,\n+0x8c, 0xb2, 0x89, 0xcf, 0xd0, 0xa0, 0x61, 0x77, 0xc8, 0x58, 0x74, 0xb0, 0xd4, 0x23, 0x3a, 0xf7,\n+0x5d, 0x3a, 0xca, 0xa2, 0xdb, 0x9d, 0x09, 0xde, 0x5d, 0x44, 0x2d, 0x90, 0xf1, 0x81, 0xcd, 0x57,\n+0x92, 0xfa, 0x7e, 0xbc, 0x50, 0x04, 0x63, 0x34, 0xdf, 0x6b, 0x93, 0x18, 0xbe, 0x6b, 0x36, 0xb2,\n+0x39, 0xe4, 0xac, 0x24, 0x36, 0xb7, 0xf0, 0xef, 0xb6, 0x1c, 0x13, 0x57, 0x93, 0xb6, 0xde, 0xb2,\n+0xf8, 0xe2, 0x85, 0xb7, 0x73, 0xa2, 0xb8, 0x35, 0xaa, 0x45, 0xf2, 0xe0, 0x9d, 0x36, 0xa1, 0x6f,\n+0x54, 0x8a, 0xf1, 0x72, 0x56, 0x6e, 0x2e, 0x88, 0xc5, 0x51, 0x42, 0x44, 0x15, 0x94, 0xee, 0xa3,\n+0xc5, 0x38, 0x96, 0x9b, 0x4e, 0x4e, 0x5a, 0x0b, 0x47, 0xf3, 0x06, 0x36, 0x49, 0x77, 0x30, 0xbc,\n+0x71, 0x37, 0xe5, 0xa6, 0xec, 0x21, 0x08, 0x75, 0xfc, 0xe6, 0x61, 0x16, 0x3f, 0x77, 0xd5, 0xd9,\n+0x91, 0x97, 0x84, 0x0a, 0x6c, 0xd4, 0x02, 0x4d, 0x74, 0xc0, 0x14, 0xed, 0xfd, 0x39, 0xfb, 0x83,\n+0xf2, 0x5e, 0x14, 0xa1, 0x04, 0xb0, 0x0b, 0xe9, 0xfe, 0xee, 0x8f, 0xe1, 0x6e, 0x0b, 0xb2, 0x08,\n+0xb3, 0x61, 0x66, 0x09, 0x6a, 0xb1, 0x06, 0x3a, 0x65, 0x96, 0x59, 0xc0, 0xf0, 0x35, 0xfd, 0xc9,\n+0xda, 0x28, 0x8d, 0x1a, 0x11, 0x87, 0x70, 0x81, 0x0a, 0xa8, 0x9a, 0x75, 0x1d, 0x9e, 0x3a, 0x86,\n+0x05, 0x00, 0x9e, 0xdb, 0x80, 0xd6, 0x25, 0xf9, 0xdc, 0x05, 0x9e, 0x27, 0x59, 0x4c, 0x76, 0x39,\n+0x5b, 0xea, 0xf9, 0xa5, 0xa1, 0xd8, 0x83, 0x0f, 0xd1, 0xff, 0xdf, 0x30, 0x11, 0xf9, 0x85, 0xcf,\n+0x33, 0x48, 0xf5, 0xca, 0x6d, 0x64, 0x14, 0x2c, 0x7a, 0x58, 0x4f, 0xd3, 0x4b, 0x08, 0x49, 0xc5,\n+0x95, 0x64, 0x1a, 0x63, 0x0e, 0x79, 0x3d, 0xf5, 0xb3, 0x8c, 0xca, 0x58, 0xad, 0x9c, 0x42, 0x45,\n+0x79, 0x6e, 0x0e, 0x87, 0x19, 0x5c, 0x54, 0xb1, 0x65, 0xb6, 0xbf, 0x8c, 0x9b, 0xdc, 0x13, 0xe9,\n+0x0d, 0x6f, 0xb8, 0x2e, 0xdc, 0x67, 0x6e, 0xc9, 0x8b, 0x11, 0xb5, 0x84, 0x14, 0x8a, 0x00, 0x19,\n+0x70, 0x83, 0x79, 0x91, 0x97, 0x91, 0xd4, 0x1a, 0x27, 0xbf, 0x37, 0x1e, 0x32, 0x07, 0xd8, 0x14,\n+0x63, 0x3c, 0x28, 0x4c, 0xaf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0e,\n+0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f,\n+0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xae, 0x6c, 0x05, 0xa3, 0x93, 0x13,\n+0xe2, 0xa2, 0xe7, 0xe2, 0xd7, 0x1c, 0xd6, 0xc7, 0xf0, 0x7f, 0xc8, 0x67, 0x53, 0xa0, 0x30, 0x1f,\n+0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xae, 0x6c, 0x05, 0xa3, 0x93,\n+0x13, 0xe2, 0xa2, 0xe7, 0xe2, 0xd7, 0x1c, 0xd6, 0xc7, 0xf0, 0x7f, 0xc8, 0x67, 0x53, 0xa0, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82,\n+0x02, 0x01, 0x00, 0x83, 0x25, 0xed, 0xe8, 0xd1, 0xfd, 0x95, 0x52, 0xcd, 0x9e, 0xc0, 0x04, 0xa0,\n+0x91, 0x69, 0xe6, 0x5c, 0xd0, 0x84, 0xde, 0xdc, 0xad, 0xa2, 0x4f, 0xe8, 0x47, 0x78, 0xd6, 0x65,\n+0x98, 0xa9, 0x5b, 0xa8, 0x3c, 0x87, 0x7c, 0x02, 0x8a, 0xd1, 0x6e, 0xb7, 0x16, 0x73, 0xe6, 0x5f,\n+0xc0, 0x54, 0x98, 0xd5, 0x74, 0xbe, 0xc1, 0xcd, 0xe2, 0x11, 0x91, 0xad, 0x23, 0x18, 0x3d, 0xdd,\n+0xe1, 0x72, 0x44, 0x96, 0xb4, 0x95, 0x5e, 0xc0, 0x7b, 0x8e, 0x99, 0x78, 0x16, 0x43, 0x13, 0x56,\n+0x57, 0xb3, 0xa2, 0xb3, 0x3b, 0xb5, 0x77, 0xdc, 0x40, 0x72, 0xac, 0xa3, 0xeb, 0x9b, 0x35, 0x3e,\n+0xb1, 0x08, 0x21, 0xa1, 0xe7, 0xc4, 0x43, 0x37, 0x79, 0x32, 0xbe, 0xb5, 0xe7, 0x9c, 0x2c, 0x4c,\n+0xbc, 0x43, 0x29, 0x99, 0x8e, 0x30, 0xd3, 0xac, 0x21, 0xe0, 0xe3, 0x1d, 0xfa, 0xd8, 0x07, 0x33,\n+0x76, 0x54, 0x00, 0x22, 0x2a, 0xb9, 0x4d, 0x20, 0x2e, 0x70, 0x68, 0xda, 0xe5, 0x53, 0xfc, 0x83,\n+0x5c, 0xd3, 0x9d, 0xf2, 0xff, 0x44, 0x0c, 0x44, 0x66, 0xf2, 0xd2, 0xe3, 0xbd, 0x46, 0x00, 0x1a,\n+0x6d, 0x02, 0xba, 0x25, 0x5d, 0x8d, 0xa1, 0x31, 0x51, 0xdd, 0x54, 0x46, 0x1c, 0x4d, 0xdb, 0x99,\n+0x96, 0xef, 0x1a, 0x1c, 0x04, 0x5c, 0xa6, 0x15, 0xef, 0x78, 0xe0, 0x79, 0xfe, 0x5d, 0xdb, 0x3e,\n+0xaa, 0x4c, 0x55, 0xfd, 0x9a, 0x15, 0xa9, 0x6f, 0xe1, 0xa6, 0xfb, 0xdf, 0x70, 0x30, 0xe9, 0xc3,\n+0xee, 0x42, 0x46, 0xed, 0xc2, 0x93, 0x05, 0x89, 0xfa, 0x7d, 0x63, 0x7b, 0x3f, 0xd0, 0x71, 0x81,\n+0x7c, 0x00, 0xe8, 0x98, 0xae, 0x0e, 0x78, 0x34, 0xc3, 0x25, 0xfb, 0xaf, 0x0a, 0x9f, 0x20, 0x6b,\n+0xdd, 0x3b, 0x13, 0x8f, 0x12, 0x8c, 0xe2, 0x41, 0x1a, 0x48, 0x7a, 0x73, 0xa0, 0x77, 0x69, 0xc7,\n+0xb6, 0x5c, 0x7f, 0x82, 0xc8, 0x1e, 0xfe, 0x58, 0x1b, 0x28, 0x2b, 0xa8, 0x6c, 0xad, 0x5e, 0x6d,\n+0xc0, 0x05, 0xd2, 0x7b, 0xb7, 0xeb, 0x80, 0xfe, 0x25, 0x37, 0xfe, 0x02, 0x9b, 0x68, 0xac, 0x42,\n+0x5d, 0xc3, 0xee, 0xf5, 0xcc, 0xdc, 0xf0, 0x50, 0x75, 0xd2, 0x36, 0x69, 0x9c, 0xe6, 0x7b, 0x04,\n+0xdf, 0x6e, 0x06, 0x69, 0xb6, 0xde, 0x0a, 0x09, 0x48, 0x59, 0x87, 0xeb, 0x7b, 0x14, 0x60, 0x7a,\n+0x64, 0xaa, 0x69, 0x43, 0xef, 0x91, 0xc7, 0x4c, 0xec, 0x18, 0xdd, 0x6c, 0xef, 0x53, 0x2d, 0x8c,\n+0x99, 0xe1, 0x5e, 0xf2, 0x72, 0x3e, 0xcf, 0x54, 0xc8, 0xbd, 0x67, 0xec, 0xa4, 0x0f, 0x4c, 0x45,\n+0xff, 0xd3, 0xb9, 0x30, 0x23, 0x07, 0x4c, 0x8f, 0x10, 0xbf, 0x86, 0x96, 0xd9, 0x99, 0x5a, 0xb4,\n+0x99, 0x57, 0x1c, 0xa4, 0xcc, 0xbb, 0x15, 0x89, 0x53, 0xba, 0x2c, 0x05, 0x0f, 0xe4, 0xc4, 0x9e,\n+0x19, 0xb1, 0x18, 0x34, 0xd5, 0x4c, 0x9d, 0xba, 0xed, 0xf7, 0x1f, 0xaf, 0x24, 0x95, 0x04, 0x78,\n+0xa8, 0x03, 0xbb, 0xee, 0x81, 0xe5, 0xda, 0x5f, 0x7c, 0x8b, 0x4a, 0xa1, 0x90, 0x74, 0x25, 0xa7,\n+0xb3, 0x3e, 0x4b, 0xc8, 0x2c, 0x56, 0xbd, 0xc7, 0xc8, 0xef, 0x38, 0xe2, 0x5c, 0x92, 0xf0, 0x79,\n+0xf7, 0x9c, 0x84, 0xba, 0x74, 0x2d, 0x61, 0x01, 0x20, 0x7e, 0x7e, 0xd1, 0xf2, 0x4f, 0x07, 0x59,\n+0x5f, 0x8b, 0x2d, 0x43, 0x52, 0xeb, 0x46, 0x0c, 0x94, 0xe1, 0xf5, 0x66, 0x47, 0x79, 0x77, 0xd5,\n+0x54, 0x5b, 0x1f, 0xad, 0x24, 0x37, 0xcb, 0x45, 0x5a, 0x4e, 0xa0, 0x44, 0x48, 0xc8, 0xd8, 0xb0,\n+0x99, 0xc5, 0x15, 0x84, 0x09, 0xf6, 0xd6, 0x49, 0x49, 0xc0, 0x65, 0xb8, 0xe6, 0x1a, 0x71, 0x6e,\n+0xa0, 0xa8, 0xf1, 0x82, 0xe8, 0x45, 0x3e, 0x6c, 0xd6, 0x02, 0xd7, 0x0a, 0x67, 0x83, 0x05, 0x5a,\n+0xc9, 0xa4, 0x10, 0x30, 0x82, 0x04, 0x0a, 0x30, 0x82, 0x02, 0xf2, 0xa0, 0x03, 0x02, 0x01, 0x02,\n+0x02, 0x09, 0x00, 0xc2, 0x7e, 0x43, 0x04, 0x4e, 0x47, 0x3f, 0x19, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,\n+0x55, 0x04, 0x07, 0x0c, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x16, 0x30,\n+0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63,\n+0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e,\n+0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e,\n+0x6f, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x30, 0x39, 0x31, 0x1f,\n+0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69,\n+0x6e, 0x66, 0x6f, 0x40, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, 0x68, 0x75, 0x30,\n+0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x36, 0x31, 0x36, 0x31, 0x31, 0x33, 0x30, 0x31, 0x38, 0x5a,\n+0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x30, 0x31, 0x31, 0x33, 0x30, 0x31, 0x38, 0x5a, 0x30,\n+0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31,\n+0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65,\n+0x73, 0x74, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0d, 0x4d, 0x69, 0x63,\n+0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x0c, 0x1e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x65, 0x2d,\n+0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32,\n+0x30, 0x30, 0x39, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x09, 0x01, 0x16, 0x10, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e,\n+0x6f, 0x2e, 0x68, 0x75, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a,\n+0x02, 0x82, 0x01, 0x01, 0x00, 0xe9, 0xf8, 0x8f, 0xf3, 0x63, 0xad, 0xda, 0x86, 0xd8, 0xa7, 0xe0,\n+0x42, 0xfb, 0xcf, 0x91, 0xde, 0xa6, 0x26, 0xf8, 0x99, 0xa5, 0x63, 0x70, 0xad, 0x9b, 0xae, 0xca,\n+0x33, 0x40, 0x7d, 0x6d, 0x96, 0x6e, 0xa1, 0x0e, 0x44, 0xee, 0xe1, 0x13, 0x9d, 0x94, 0x42, 0x52,\n+0x9a, 0xbd, 0x75, 0x85, 0x74, 0x2c, 0xa8, 0x0e, 0x1d, 0x93, 0xb6, 0x18, 0xb7, 0x8c, 0x2c, 0xa8,\n+0xcf, 0xfb, 0x5c, 0x71, 0xb9, 0xda, 0xec, 0xfe, 0xe8, 0x7e, 0x8f, 0xe4, 0x2f, 0x1d, 0xb2, 0xa8,\n+0x75, 0x87, 0xd8, 0xb7, 0xa1, 0xe5, 0x3b, 0xcf, 0x99, 0x4a, 0x46, 0xd0, 0x83, 0x19, 0x7d, 0xc0,\n+0xa1, 0x12, 0x1c, 0x95, 0x6d, 0x4a, 0xf4, 0xd8, 0xc7, 0xa5, 0x4d, 0x33, 0x2e, 0x85, 0x39, 0x40,\n+0x75, 0x7e, 0x14, 0x7c, 0x80, 0x12, 0x98, 0x50, 0xc7, 0x41, 0x67, 0xb8, 0xa0, 0x80, 0x61, 0x54,\n+0xa6, 0x6c, 0x4e, 0x1f, 0xe0, 0x9d, 0x0e, 0x07, 0xe9, 0xc9, 0xba, 0x33, 0xe7, 0xfe, 0xc0, 0x55,\n+0x28, 0x2c, 0x02, 0x80, 0xa7, 0x19, 0xf5, 0x9e, 0xdc, 0x55, 0x53, 0x03, 0x97, 0x7b, 0x07, 0x48,\n+0xff, 0x99, 0xfb, 0x37, 0x8a, 0x24, 0xc4, 0x59, 0xcc, 0x50, 0x10, 0x63, 0x8e, 0xaa, 0xa9, 0x1a,\n+0xb0, 0x84, 0x1a, 0x86, 0xf9, 0x5f, 0xbb, 0xb1, 0x50, 0x6e, 0xa4, 0xd1, 0x0a, 0xcc, 0xd5, 0x71,\n+0x7e, 0x1f, 0xa7, 0x1b, 0x7c, 0xf5, 0x53, 0x6e, 0x22, 0x5f, 0xcb, 0x2b, 0xe6, 0xd4, 0x7c, 0x5d,\n+0xae, 0xd6, 0xc2, 0xc6, 0x4c, 0xe5, 0x05, 0x01, 0xd9, 0xed, 0x57, 0xfc, 0xc1, 0x23, 0x79, 0xfc,\n+0xfa, 0xc8, 0x24, 0x83, 0x95, 0xf3, 0xb5, 0x6a, 0x51, 0x01, 0xd0, 0x77, 0xd6, 0xe9, 0x12, 0xa1,\n+0xf9, 0x1a, 0x83, 0xfb, 0x82, 0x1b, 0xb9, 0xb0, 0x97, 0xf4, 0x76, 0x06, 0x33, 0x43, 0x49, 0xa0,\n+0xff, 0x0b, 0xb5, 0xfa, 0xb5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x80, 0x30, 0x7e, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xcb, 0x0f, 0xc6, 0xdf, 0x42,\n+0x43, 0xcc, 0x3d, 0xcb, 0xb5, 0x48, 0x23, 0xa1, 0x1a, 0x7a, 0xa6, 0x2a, 0xbb, 0x34, 0x68, 0x30,\n+0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xcb, 0x0f, 0xc6, 0xdf,\n+0x42, 0x43, 0xcc, 0x3d, 0xcb, 0xb5, 0x48, 0x23, 0xa1, 0x1a, 0x7a, 0xa6, 0x2a, 0xbb, 0x34, 0x68,\n+0x30, 0x1b, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x14, 0x30, 0x12, 0x81, 0x10, 0x69, 0x6e, 0x66,\n+0x6f, 0x40, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, 0x68, 0x75, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01,\n+0x00, 0xc9, 0xd1, 0x0e, 0x5e, 0x2e, 0xd5, 0xcc, 0xb3, 0x7c, 0x3e, 0xcb, 0xfc, 0x3d, 0xff, 0x0d,\n+0x28, 0x95, 0x93, 0x04, 0xc8, 0xbf, 0xda, 0xcd, 0x79, 0xb8, 0x43, 0x90, 0xf0, 0xa4, 0xbe, 0xef,\n+0xf2, 0xef, 0x21, 0x98, 0xbc, 0xd4, 0xd4, 0x5d, 0x06, 0xf6, 0xee, 0x42, 0xec, 0x30, 0x6c, 0xa0,\n+0xaa, 0xa9, 0xca, 0xf1, 0xaf, 0x8a, 0xfa, 0x3f, 0x0b, 0x73, 0x6a, 0x3e, 0xea, 0x2e, 0x40, 0x7e,\n+0x1f, 0xae, 0x54, 0x61, 0x79, 0xeb, 0x2e, 0x08, 0x37, 0xd7, 0x23, 0xf3, 0x8c, 0x9f, 0xbe, 0x1d,\n+0xb1, 0xe1, 0xa4, 0x75, 0xdb, 0xa0, 0xe2, 0x54, 0x14, 0xb1, 0xba, 0x1c, 0x29, 0xa4, 0x18, 0xf6,\n+0x12, 0xba, 0xa2, 0x14, 0x14, 0xe3, 0x31, 0x35, 0xc8, 0x40, 0xff, 0xb7, 0xe0, 0x05, 0x76, 0x57,\n+0xc1, 0x1c, 0x59, 0xf2, 0xf8, 0xbf, 0xe4, 0xed, 0x25, 0x62, 0x5c, 0x84, 0xf0, 0x7e, 0x7e, 0x1f,\n+0xb3, 0xbe, 0xf9, 0xb7, 0x21, 0x11, 0xcc, 0x03, 0x01, 0x56, 0x70, 0xa7, 0x10, 0x92, 0x1e, 0x1b,\n+0x34, 0x81, 0x1e, 0xad, 0x9c, 0x1a, 0xc3, 0x04, 0x3c, 0xed, 0x02, 0x61, 0xd6, 0x1e, 0x06, 0xf3,\n+0x5f, 0x3a, 0x87, 0xf2, 0x2b, 0xf1, 0x45, 0x87, 0xe5, 0x3d, 0xac, 0xd1, 0xc7, 0x57, 0x84, 0xbd,\n+0x6b, 0xae, 0xdc, 0xd8, 0xf9, 0xb6, 0x1b, 0x62, 0x70, 0x0b, 0x3d, 0x36, 0xc9, 0x42, 0xf2, 0x32,\n+0xd7, 0x7a, 0x61, 0xe6, 0xd2, 0xdb, 0x3d, 0xcf, 0xc8, 0xa9, 0xc9, 0x9b, 0xdc, 0xdb, 0x58, 0x44,\n+0xd7, 0x6f, 0x38, 0xaf, 0x7f, 0x78, 0xd3, 0xa3, 0xad, 0x1a, 0x75, 0xba, 0x1c, 0xc1, 0x36, 0x7c,\n+0x8f, 0x1e, 0x6d, 0x1c, 0xc3, 0x75, 0x46, 0xae, 0x35, 0x05, 0xa6, 0xf6, 0x5c, 0x3d, 0x21, 0xee,\n+0x56, 0xf0, 0xc9, 0x82, 0x22, 0x2d, 0x7a, 0x54, 0xab, 0x70, 0xc3, 0x7d, 0x22, 0x65, 0x82, 0x70,\n+0x96, 0x30, 0x82, 0x03, 0xbc, 0x30, 0x82, 0x02, 0xa4, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10,\n+0x07, 0x56, 0x22, 0xa4, 0xe8, 0xd4, 0x8a, 0x89, 0x4d, 0xf4, 0x13, 0xc8, 0xf0, 0xf8, 0xea, 0xa5,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,\n+0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20,\n+0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x53, 0x65, 0x63, 0x75, 0x72,\n+0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30,\n+0x36, 0x31, 0x31, 0x30, 0x37, 0x31, 0x39, 0x34, 0x32, 0x32, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x39,\n+0x31, 0x32, 0x33, 0x31, 0x31, 0x39, 0x35, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x4a, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17,\n+0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x47, 0x6c,\n+0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,\n+0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xaf, 0x35, 0x2e, 0xd8, 0xac, 0x6c, 0x55, 0x69,\n+0x06, 0x71, 0xe5, 0x13, 0x68, 0x24, 0xb3, 0x4f, 0xd8, 0xcc, 0x21, 0x47, 0xf8, 0xf1, 0x60, 0x38,\n+0x89, 0x89, 0x03, 0xe9, 0xbd, 0xea, 0x5e, 0x46, 0x53, 0x09, 0xdc, 0x5c, 0xf5, 0x5a, 0xe8, 0xf7,\n+0x45, 0x2a, 0x02, 0xeb, 0x31, 0x61, 0xd7, 0x29, 0x33, 0x4c, 0xce, 0xc7, 0x7c, 0x0a, 0x37, 0x7e,\n+0x0f, 0xba, 0x32, 0x98, 0xe1, 0x1d, 0x97, 0xaf, 0x8f, 0xc7, 0xdc, 0xc9, 0x38, 0x96, 0xf3, 0xdb,\n+0x1a, 0xfc, 0x51, 0xed, 0x68, 0xc6, 0xd0, 0x6e, 0xa4, 0x7c, 0x24, 0xd1, 0xae, 0x42, 0xc8, 0x96,\n+0x50, 0x63, 0x2e, 0xe0, 0xfe, 0x75, 0xfe, 0x98, 0xa7, 0x5f, 0x49, 0x2e, 0x95, 0xe3, 0x39, 0x33,\n+0x64, 0x8e, 0x1e, 0xa4, 0x5f, 0x90, 0xd2, 0x67, 0x3c, 0xb2, 0xd9, 0xfe, 0x41, 0xb9, 0x55, 0xa7,\n+0x09, 0x8e, 0x72, 0x05, 0x1e, 0x8b, 0xdd, 0x44, 0x85, 0x82, 0x42, 0xd0, 0x49, 0xc0, 0x1d, 0x60,\n+0xf0, 0xd1, 0x17, 0x2c, 0x95, 0xeb, 0xf6, 0xa5, 0xc1, 0x92, 0xa3, 0xc5, 0xc2, 0xa7, 0x08, 0x60,\n+0x0d, 0x60, 0x04, 0x10, 0x96, 0x79, 0x9e, 0x16, 0x34, 0xe6, 0xa9, 0xb6, 0xfa, 0x25, 0x45, 0x39,\n+0xc8, 0x1e, 0x65, 0xf9, 0x93, 0xf5, 0xaa, 0xf1, 0x52, 0xdc, 0x99, 0x98, 0x3d, 0xa5, 0x86, 0x1a,\n+0x0c, 0x35, 0x33, 0xfa, 0x4b, 0xa5, 0x04, 0x06, 0x15, 0x1c, 0x31, 0x80, 0xef, 0xaa, 0x18, 0x6b,\n+0xc2, 0x7b, 0xd7, 0xda, 0xce, 0xf9, 0x33, 0x20, 0xd5, 0xf5, 0xbd, 0x6a, 0x33, 0x2d, 0x81, 0x04,\n+0xfb, 0xb0, 0x5c, 0xd4, 0x9c, 0xa3, 0xe2, 0x5c, 0x1d, 0xe3, 0xa9, 0x42, 0x75, 0x5e, 0x7b, 0xd4,\n+0x77, 0xef, 0x39, 0x54, 0xba, 0xc9, 0x0a, 0x18, 0x1b, 0x12, 0x99, 0x49, 0x2f, 0x88, 0x4b, 0xfd,\n+0x50, 0x62, 0xd1, 0x73, 0xe7, 0x8f, 0x7a, 0x43, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9d,\n+0x30, 0x81, 0x9a, 0x30, 0x13, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02,\n+0x04, 0x06, 0x1e, 0x04, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n+0x14, 0xaf, 0x44, 0x04, 0xc2, 0x41, 0x7e, 0x48, 0x83, 0xdb, 0x4e, 0x39, 0x02, 0xec, 0xec, 0x84,\n+0x7a, 0xe6, 0xce, 0xc9, 0xa4, 0x30, 0x34, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2d, 0x30, 0x2b,\n+0x30, 0x29, 0xa0, 0x27, 0xa0, 0x25, 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63,\n+0x72, 0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63,\n+0x6f, 0x6d, 0x2f, 0x53, 0x47, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x10, 0x06, 0x09, 0x2b,\n+0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01,\n+0x00, 0x63, 0x1a, 0x08, 0x40, 0x7d, 0xa4, 0x5e, 0x53, 0x0d, 0x77, 0xd8, 0x7a, 0xae, 0x1f, 0x0d,\n+0x0b, 0x51, 0x16, 0x03, 0xef, 0x18, 0x7c, 0xc8, 0xe3, 0xaf, 0x6a, 0x58, 0x93, 0x14, 0x60, 0x91,\n+0xb2, 0x84, 0xdc, 0x88, 0x4e, 0xbe, 0x39, 0x8a, 0x3a, 0xf3, 0xe6, 0x82, 0x89, 0x5d, 0x01, 0x37,\n+0xb3, 0xab, 0x24, 0xa4, 0x15, 0x0e, 0x92, 0x35, 0x5a, 0x4a, 0x44, 0x5e, 0x4e, 0x57, 0xfa, 0x75,\n+0xce, 0x1f, 0x48, 0xce, 0x66, 0xf4, 0x3c, 0x40, 0x26, 0x92, 0x98, 0x6c, 0x1b, 0xee, 0x24, 0x46,\n+0x0c, 0x17, 0xb3, 0x52, 0xa5, 0xdb, 0xa5, 0x91, 0x91, 0xcf, 0x37, 0xd3, 0x6f, 0xe7, 0x27, 0x08,\n+0x3a, 0x4e, 0x19, 0x1f, 0x3a, 0xa7, 0x58, 0x5c, 0x17, 0xcf, 0x79, 0x3f, 0x8b, 0xe4, 0xa7, 0xd3,\n+0x26, 0x23, 0x9d, 0x26, 0x0f, 0x58, 0x69, 0xfc, 0x47, 0x7e, 0xb2, 0xd0, 0x8d, 0x8b, 0x93, 0xbf,\n+0x29, 0x4f, 0x43, 0x69, 0x74, 0x76, 0x67, 0x4b, 0xcf, 0x07, 0x8c, 0xe6, 0x02, 0xf7, 0xb5, 0xe1,\n+0xb4, 0x43, 0xb5, 0x4b, 0x2d, 0x14, 0x9f, 0xf9, 0xdc, 0x26, 0x0d, 0xbf, 0xa6, 0x47, 0x74, 0x06,\n+0xd8, 0x88, 0xd1, 0x3a, 0x29, 0x30, 0x84, 0xce, 0xd2, 0x39, 0x80, 0x62, 0x1b, 0xa8, 0xc7, 0x57,\n+0x49, 0xbc, 0x6a, 0x55, 0x51, 0x67, 0x15, 0x4a, 0xbe, 0x35, 0x07, 0xe4, 0xd5, 0x75, 0x98, 0x37,\n+0x79, 0x30, 0x14, 0xdb, 0x29, 0x9d, 0x6c, 0xc5, 0x69, 0xcc, 0x47, 0x55, 0xa2, 0x30, 0xf7, 0xcc,\n+0x5c, 0x7f, 0xc2, 0xc3, 0x98, 0x1c, 0x6b, 0x4e, 0x16, 0x80, 0xeb, 0x7a, 0x78, 0x65, 0x45, 0xa2,\n+0x00, 0x1a, 0xaf, 0x0c, 0x0d, 0x55, 0x64, 0x34, 0x48, 0xb8, 0x92, 0xb9, 0xf1, 0xb4, 0x50, 0x29,\n+0xf2, 0x4f, 0x23, 0x1f, 0xda, 0x6c, 0xac, 0x1f, 0x44, 0xe1, 0xdd, 0x23, 0x78, 0x51, 0x5b, 0xc7,\n+0x16, 0x30, 0x82, 0x03, 0xb8, 0x30, 0x82, 0x02, 0xa0, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10,\n+0x0c, 0xf0, 0x8e, 0x5c, 0x08, 0x16, 0xa5, 0xad, 0x42, 0x7f, 0xf0, 0xeb, 0x27, 0x18, 0x59, 0xd0,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,\n+0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20,\n+0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72,\n+0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31,\n+0x31, 0x30, 0x37, 0x31, 0x39, 0x33, 0x31, 0x31, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32,\n+0x33, 0x31, 0x31, 0x39, 0x34, 0x30, 0x35, 0x35, 0x5a, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43,\n+0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x13, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02,\n+0x82, 0x01, 0x01, 0x00, 0xab, 0xa4, 0x81, 0xe5, 0x95, 0xcd, 0xf5, 0xf6, 0x14, 0x8e, 0xc2, 0x4f,\n+0xca, 0xd4, 0xe2, 0x78, 0x95, 0x58, 0x9c, 0x41, 0xe1, 0x0d, 0x99, 0x40, 0x24, 0x17, 0x39, 0x91,\n+0x33, 0x66, 0xe9, 0xbe, 0xe1, 0x83, 0xaf, 0x62, 0x5c, 0x89, 0xd1, 0xfc, 0x24, 0x5b, 0x61, 0xb3,\n+0xe0, 0x11, 0x11, 0x41, 0x1c, 0x1d, 0x6e, 0xf0, 0xb8, 0xbb, 0xf8, 0xde, 0xa7, 0x81, 0xba, 0xa6,\n+0x48, 0xc6, 0x9f, 0x1d, 0xbd, 0xbe, 0x8e, 0xa9, 0x41, 0x3e, 0xb8, 0x94, 0xed, 0x29, 0x1a, 0xd4,\n+0x8e, 0xd2, 0x03, 0x1d, 0x03, 0xef, 0x6d, 0x0d, 0x67, 0x1c, 0x57, 0xd7, 0x06, 0xad, 0xca, 0xc8,\n+0xf5, 0xfe, 0x0e, 0xaf, 0x66, 0x25, 0x48, 0x04, 0x96, 0x0b, 0x5d, 0xa3, 0xba, 0x16, 0xc3, 0x08,\n+0x4f, 0xd1, 0x46, 0xf8, 0x14, 0x5c, 0xf2, 0xc8, 0x5e, 0x01, 0x99, 0x6d, 0xfd, 0x88, 0xcc, 0x86,\n+0xa8, 0xc1, 0x6f, 0x31, 0x42, 0x6c, 0x52, 0x3e, 0x68, 0xcb, 0xf3, 0x19, 0x34, 0xdf, 0xbb, 0x87,\n+0x18, 0x56, 0x80, 0x26, 0xc4, 0xd0, 0xdc, 0xc0, 0x6f, 0xdf, 0xde, 0xa0, 0xc2, 0x91, 0x16, 0xa0,\n+0x64, 0x11, 0x4b, 0x44, 0xbc, 0x1e, 0xf6, 0xe7, 0xfa, 0x63, 0xde, 0x66, 0xac, 0x76, 0xa4, 0x71,\n+0xa3, 0xec, 0x36, 0x94, 0x68, 0x7a, 0x77, 0xa4, 0xb1, 0xe7, 0x0e, 0x2f, 0x81, 0x7a, 0xe2, 0xb5,\n+0x72, 0x86, 0xef, 0xa2, 0x6b, 0x8b, 0xf0, 0x0f, 0xdb, 0xd3, 0x59, 0x3f, 0xba, 0x72, 0xbc, 0x44,\n+0x24, 0x9c, 0xe3, 0x73, 0xb3, 0xf7, 0xaf, 0x57, 0x2f, 0x42, 0x26, 0x9d, 0xa9, 0x74, 0xba, 0x00,\n+0x52, 0xf2, 0x4b, 0xcd, 0x53, 0x7c, 0x47, 0x0b, 0x36, 0x85, 0x0e, 0x66, 0xa9, 0x08, 0x97, 0x16,\n+0x34, 0x57, 0xc1, 0x66, 0xf7, 0x80, 0xe3, 0xed, 0x70, 0x54, 0xc7, 0x93, 0xe0, 0x2e, 0x28, 0x15,\n+0x59, 0x87, 0xba, 0xbb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9d, 0x30, 0x81, 0x9a, 0x30,\n+0x13, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x06, 0x1e, 0x04,\n+0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01,\n+0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x42, 0x32, 0xb6,\n+0x16, 0xfa, 0x04, 0xfd, 0xfe, 0x5d, 0x4b, 0x7a, 0xc3, 0xfd, 0xf7, 0x4c, 0x40, 0x1d, 0x5a, 0x43,\n+0xaf, 0x30, 0x34, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2d, 0x30, 0x2b, 0x30, 0x29, 0xa0, 0x27,\n+0xa0, 0x25, 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x73,\n+0x65, 0x63, 0x75, 0x72, 0x65, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53,\n+0x54, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01,\n+0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x30, 0xed, 0x4f,\n+0x4a, 0xe1, 0x58, 0x3a, 0x52, 0x72, 0x5b, 0xb5, 0xa6, 0xa3, 0x65, 0x18, 0xa6, 0xbb, 0x51, 0x3b,\n+0x77, 0xe9, 0x9d, 0xea, 0xd3, 0x9f, 0x5c, 0xe0, 0x45, 0x65, 0x7b, 0x0d, 0xca, 0x5b, 0xe2, 0x70,\n+0x50, 0xb2, 0x94, 0x05, 0x14, 0xae, 0x49, 0xc7, 0x8d, 0x41, 0x07, 0x12, 0x73, 0x94, 0x7e, 0x0c,\n+0x23, 0x21, 0xfd, 0xbc, 0x10, 0x7f, 0x60, 0x10, 0x5a, 0x72, 0xf5, 0x98, 0x0e, 0xac, 0xec, 0xb9,\n+0x7f, 0xdd, 0x7a, 0x6f, 0x5d, 0xd3, 0x1c, 0xf4, 0xff, 0x88, 0x05, 0x69, 0x42, 0xa9, 0x05, 0x71,\n+0xc8, 0xb7, 0xac, 0x26, 0xe8, 0x2e, 0xb4, 0x8c, 0x6a, 0xff, 0x71, 0xdc, 0xb8, 0xb1, 0xdf, 0x99,\n+0xbc, 0x7c, 0x21, 0x54, 0x2b, 0xe4, 0x58, 0xa2, 0xbb, 0x57, 0x29, 0xae, 0x9e, 0xa9, 0xa3, 0x19,\n+0x26, 0x0f, 0x99, 0x2e, 0x08, 0xb0, 0xef, 0xfd, 0x69, 0xcf, 0x99, 0x1a, 0x09, 0x8d, 0xe3, 0xa7,\n+0x9f, 0x2b, 0xc9, 0x36, 0x34, 0x7b, 0x24, 0xb3, 0x78, 0x4c, 0x95, 0x17, 0xa4, 0x06, 0x26, 0x1e,\n+0xb6, 0x64, 0x52, 0x36, 0x5f, 0x60, 0x67, 0xd9, 0x9c, 0xc5, 0x05, 0x74, 0x0b, 0xe7, 0x67, 0x23,\n+0xd2, 0x08, 0xfc, 0x88, 0xe9, 0xae, 0x8b, 0x7f, 0xe1, 0x30, 0xf4, 0x37, 0x7e, 0xfd, 0xc6, 0x32,\n+0xda, 0x2d, 0x9e, 0x44, 0x30, 0x30, 0x6c, 0xee, 0x07, 0xde, 0xd2, 0x34, 0xfc, 0xd2, 0xff, 0x40,\n+0xf6, 0x4b, 0xf4, 0x66, 0x46, 0x06, 0x54, 0xa6, 0xf2, 0x32, 0x0a, 0x63, 0x26, 0x30, 0x6b, 0x9b,\n+0xd1, 0xdc, 0x8b, 0x47, 0xba, 0xe1, 0xb9, 0xd5, 0x62, 0xd0, 0xa2, 0xa0, 0xf4, 0x67, 0x05, 0x78,\n+0x29, 0x63, 0x1a, 0x6f, 0x04, 0xd6, 0xf8, 0xc6, 0x4c, 0xa3, 0x9a, 0xb1, 0x37, 0xb4, 0x8d, 0xe5,\n+0x28, 0x4b, 0x1d, 0x9e, 0x2c, 0xc2, 0xb8, 0x68, 0xbc, 0xed, 0x02, 0xee, 0x31, 0x30, 0x82, 0x05,\n+0xba, 0x30, 0x82, 0x03, 0xa2, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xbb, 0x40, 0x1c,\n+0x43, 0xf5, 0x5e, 0x4f, 0xb0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x43, 0x48, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53, 0x77,\n+0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x41, 0x47, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03,\n+0x55, 0x04, 0x03, 0x13, 0x16, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x47,\n+0x6f, 0x6c, 0x64, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30,\n+0x36, 0x31, 0x30, 0x32, 0x35, 0x30, 0x38, 0x33, 0x30, 0x33, 0x35, 0x5a, 0x17, 0x0d, 0x33, 0x36,\n+0x31, 0x30, 0x32, 0x35, 0x30, 0x38, 0x33, 0x30, 0x33, 0x35, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x41,\n+0x47, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x53, 0x77, 0x69, 0x73,\n+0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20,\n+0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82,\n+0x02, 0x01, 0x00, 0xaf, 0xe4, 0xee, 0x7e, 0x8b, 0x24, 0x0e, 0x12, 0x6e, 0xa9, 0x50, 0x2d, 0x16,\n+0x44, 0x3b, 0x92, 0x92, 0x5c, 0xca, 0xb8, 0x5d, 0x84, 0x92, 0x42, 0x13, 0x2a, 0xbc, 0x65, 0x57,\n+0x82, 0x40, 0x3e, 0x57, 0x24, 0xcd, 0x50, 0x8b, 0x25, 0x2a, 0xb7, 0x6f, 0xfc, 0xef, 0xa2, 0xd0,\n+0xc0, 0x1f, 0x02, 0x24, 0x4a, 0x13, 0x96, 0x8f, 0x23, 0x13, 0xe6, 0x28, 0x58, 0x00, 0xa3, 0x47,\n+0xc7, 0x06, 0xa7, 0x84, 0x23, 0x2b, 0xbb, 0xbd, 0x96, 0x2b, 0x7f, 0x55, 0xcc, 0x8b, 0xc1, 0x57,\n+0x1f, 0x0e, 0x62, 0x65, 0x0f, 0xdd, 0x3d, 0x56, 0x8a, 0x73, 0xda, 0xae, 0x7e, 0x6d, 0xba, 0x81,\n+0x1c, 0x7e, 0x42, 0x8c, 0x20, 0x35, 0xd9, 0x43, 0x4d, 0x84, 0xfa, 0x84, 0xdb, 0x52, 0x2c, 0xf3,\n+0x0e, 0x27, 0x77, 0x0b, 0x6b, 0xbf, 0x11, 0x2f, 0x72, 0x78, 0x9f, 0x2e, 0xd8, 0x3e, 0xe6, 0x18,\n+0x37, 0x5a, 0x2a, 0x72, 0xf9, 0xda, 0x62, 0x90, 0x92, 0x95, 0xca, 0x1f, 0x9c, 0xe9, 0xb3, 0x3c,\n+0x2b, 0xcb, 0xf3, 0x01, 0x13, 0xbf, 0x5a, 0xcf, 0xc1, 0xb5, 0x0a, 0x60, 0xbd, 0xdd, 0xb5, 0x99,\n+0x64, 0x53, 0xb8, 0xa0, 0x96, 0xb3, 0x6f, 0xe2, 0x26, 0x77, 0x91, 0x8c, 0xe0, 0x62, 0x10, 0x02,\n+0x9f, 0x34, 0x0f, 0xa4, 0xd5, 0x92, 0x33, 0x51, 0xde, 0xbe, 0x8d, 0xba, 0x84, 0x7a, 0x60, 0x3c,\n+0x6a, 0xdb, 0x9f, 0x2b, 0xec, 0xde, 0xde, 0x01, 0x3f, 0x6e, 0x4d, 0xe5, 0x50, 0x86, 0xcb, 0xb4,\n+0xaf, 0xed, 0x44, 0x40, 0xc5, 0xca, 0x5a, 0x8c, 0xda, 0xd2, 0x2b, 0x7c, 0xa8, 0xee, 0xbe, 0xa6,\n+0xe5, 0x0a, 0xaa, 0x0e, 0xa5, 0xdf, 0x05, 0x52, 0xb7, 0x55, 0xc7, 0x22, 0x5d, 0x32, 0x6a, 0x97,\n+0x97, 0x63, 0x13, 0xdb, 0xc9, 0xdb, 0x79, 0x36, 0x7b, 0x85, 0x3a, 0x4a, 0xc5, 0x52, 0x89, 0xf9,\n+0x24, 0xe7, 0x9d, 0x77, 0xa9, 0x82, 0xff, 0x55, 0x1c, 0xa5, 0x71, 0x69, 0x2b, 0xd1, 0x02, 0x24,\n+0xf2, 0xb3, 0x26, 0xd4, 0x6b, 0xda, 0x04, 0x55, 0xe5, 0xc1, 0x0a, 0xc7, 0x6d, 0x30, 0x37, 0x90,\n+0x2a, 0xe4, 0x9e, 0x14, 0x33, 0x5e, 0x16, 0x17, 0x55, 0xc5, 0x5b, 0xb5, 0xcb, 0x34, 0x89, 0x92,\n+0xf1, 0x9d, 0x26, 0x8f, 0xa1, 0x07, 0xd4, 0xc6, 0xb2, 0x78, 0x50, 0xdb, 0x0c, 0x0c, 0x0b, 0x7c,\n+0x0b, 0x8c, 0x41, 0xd7, 0xb9, 0xe9, 0xdd, 0x8c, 0x88, 0xf7, 0xa3, 0x4d, 0xb2, 0x32, 0xcc, 0xd8,\n+0x17, 0xda, 0xcd, 0xb7, 0xce, 0x66, 0x9d, 0xd4, 0xfd, 0x5e, 0xff, 0xbd, 0x97, 0x3e, 0x29, 0x75,\n+0xe7, 0x7e, 0xa7, 0x62, 0x58, 0xaf, 0x25, 0x34, 0xa5, 0x41, 0xc7, 0x3d, 0xbc, 0x0d, 0x50, 0xca,\n+0x03, 0x03, 0x0f, 0x08, 0x5a, 0x1f, 0x95, 0x73, 0x78, 0x62, 0xbf, 0xaf, 0x72, 0x14, 0x69, 0x0e,\n+0xa5, 0xe5, 0x03, 0x0e, 0x78, 0x8e, 0x26, 0x28, 0x42, 0xf0, 0x07, 0x0b, 0x62, 0x20, 0x10, 0x67,\n+0x39, 0x46, 0xfa, 0xa9, 0x03, 0xcc, 0x04, 0x38, 0x7a, 0x66, 0xef, 0x20, 0x83, 0xb5, 0x8c, 0x4a,\n+0x56, 0x8e, 0x91, 0x00, 0xfc, 0x8e, 0x5c, 0x82, 0xde, 0x88, 0xa0, 0xc3, 0xe2, 0x68, 0x6e, 0x7d,\n+0x8d, 0xef, 0x3c, 0xdd, 0x65, 0xf4, 0x5d, 0xac, 0x51, 0xef, 0x24, 0x80, 0xae, 0xaa, 0x56, 0x97,\n+0x6f, 0xf9, 0xad, 0x7d, 0xda, 0x61, 0x3f, 0x98, 0x77, 0x3c, 0xa5, 0x91, 0xb6, 0x1c, 0x8c, 0x26,\n+0xda, 0x65, 0xa2, 0x09, 0x6d, 0xc1, 0xe2, 0x54, 0xe3, 0xb9, 0xca, 0x4c, 0x4c, 0x80, 0x8f, 0x77,\n+0x7b, 0x60, 0x9a, 0x1e, 0xdf, 0xb6, 0xf2, 0x48, 0x1e, 0x0e, 0xba, 0x4e, 0x54, 0x6d, 0x98, 0xe0,\n+0xe1, 0xa2, 0x1a, 0xa2, 0x77, 0x50, 0xcf, 0xc4, 0x63, 0x92, 0xec, 0x47, 0x19, 0x9d, 0xeb, 0xe6,\n+0x6b, 0xce, 0xc1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xac, 0x30, 0x81, 0xa9, 0x30, 0x0e,\n+0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f,\n+0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x5b, 0x25, 0x7b, 0x96, 0xa4, 0x65,\n+0x51, 0x7e, 0xb8, 0x39, 0xf3, 0xc0, 0x78, 0x66, 0x5e, 0xe8, 0x3a, 0xe7, 0xf0, 0xee, 0x30, 0x1f,\n+0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x5b, 0x25, 0x7b, 0x96, 0xa4,\n+0x65, 0x51, 0x7e, 0xb8, 0x39, 0xf3, 0xc0, 0x78, 0x66, 0x5e, 0xe8, 0x3a, 0xe7, 0xf0, 0xee, 0x30,\n+0x46, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3f, 0x30, 0x3d, 0x30, 0x3b, 0x06, 0x09, 0x60, 0x85,\n+0x74, 0x01, 0x59, 0x01, 0x02, 0x01, 0x01, 0x30, 0x2e, 0x30, 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01,\n+0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x72, 0x65,\n+0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x73, 0x77, 0x69, 0x73, 0x73, 0x73, 0x69,\n+0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x27, 0xba, 0xe3, 0x94, 0x7c,\n+0xf1, 0xae, 0xc0, 0xde, 0x17, 0xe6, 0xe5, 0xd8, 0xd5, 0xf5, 0x54, 0xb0, 0x83, 0xf4, 0xbb, 0xcd,\n+0x5e, 0x05, 0x7b, 0x4f, 0x9f, 0x75, 0x66, 0xaf, 0x3c, 0xe8, 0x56, 0x7e, 0xfc, 0x72, 0x78, 0x38,\n+0x03, 0xd9, 0x2b, 0x62, 0x1b, 0x00, 0xb9, 0xf8, 0xe9, 0x60, 0xcd, 0xcc, 0xce, 0x51, 0x8a, 0xc7,\n+0x50, 0x31, 0x6e, 0xe1, 0x4a, 0x7e, 0x18, 0x2f, 0x69, 0x59, 0xb6, 0x3d, 0x64, 0x81, 0x2b, 0xe3,\n+0x83, 0x84, 0xe6, 0x22, 0x87, 0x8e, 0x7d, 0xe0, 0xee, 0x02, 0x99, 0x61, 0xb8, 0x1e, 0xf4, 0xb8,\n+0x2b, 0x88, 0x12, 0x16, 0x84, 0xc2, 0x31, 0x93, 0x38, 0x96, 0x31, 0xa6, 0xb9, 0x3b, 0x53, 0x3f,\n+0xc3, 0x24, 0x93, 0x56, 0x5b, 0x69, 0x92, 0xec, 0xc5, 0xc1, 0xbb, 0x38, 0x00, 0xe3, 0xec, 0x17,\n+0xa9, 0xb8, 0xdc, 0xc7, 0x7c, 0x01, 0x83, 0x9f, 0x32, 0x47, 0xba, 0x52, 0x22, 0x34, 0x1d, 0x32,\n+0x7a, 0x09, 0x56, 0xa7, 0x7c, 0x25, 0x36, 0xa9, 0x3d, 0x4b, 0xda, 0xc0, 0x82, 0x6f, 0x0a, 0xbb,\n+0x12, 0xc8, 0x87, 0x4b, 0x27, 0x11, 0xf9, 0x1e, 0x2d, 0xc7, 0x93, 0x3f, 0x9e, 0xdb, 0x5f, 0x26,\n+0x6b, 0x52, 0xd9, 0x2e, 0x8a, 0xf1, 0x14, 0xc6, 0x44, 0x8d, 0x15, 0xa9, 0xb7, 0xbf, 0xbd, 0xde,\n+0xa6, 0x1a, 0xee, 0xae, 0x2d, 0xfb, 0x48, 0x77, 0x17, 0xfe, 0xbb, 0xec, 0xaf, 0x18, 0xf5, 0x2a,\n+0x51, 0xf0, 0x39, 0x84, 0x97, 0x95, 0x6c, 0x6e, 0x1b, 0xc3, 0x2b, 0xc4, 0x74, 0x60, 0x79, 0x25,\n+0xb0, 0x0a, 0x27, 0xdf, 0xdf, 0x5e, 0xd2, 0x39, 0xcf, 0x45, 0x7d, 0x42, 0x4b, 0xdf, 0xb3, 0x2c,\n+0x1e, 0xc5, 0xc6, 0x5d, 0xca, 0x55, 0x3a, 0xa0, 0x9c, 0x69, 0x9a, 0x8f, 0xda, 0xef, 0xb2, 0xb0,\n+0x3c, 0x9f, 0x87, 0x6c, 0x12, 0x2b, 0x65, 0x70, 0x15, 0x52, 0x31, 0x1a, 0x24, 0xcf, 0x6f, 0x31,\n+0x23, 0x50, 0x1f, 0x8c, 0x4f, 0x8f, 0x23, 0xc3, 0x74, 0x41, 0x63, 0x1c, 0x55, 0xa8, 0x14, 0xdd,\n+0x3e, 0xe0, 0x51, 0x50, 0xcf, 0xf1, 0x1b, 0x30, 0x56, 0x0e, 0x92, 0xb0, 0x82, 0x85, 0xd8, 0x83,\n+0xcb, 0x22, 0x64, 0xbc, 0x2d, 0xb8, 0x25, 0xd5, 0x54, 0xa2, 0xb8, 0x06, 0xea, 0xad, 0x92, 0xa4,\n+0x24, 0xa0, 0xc1, 0x86, 0xb5, 0x4a, 0x13, 0x6a, 0x47, 0xcf, 0x2e, 0x0b, 0x56, 0x95, 0x54, 0xcb,\n+0xce, 0x9a, 0xdb, 0x6a, 0xb4, 0xa6, 0xb2, 0xdb, 0x41, 0x08, 0x86, 0x27, 0x77, 0xf7, 0x6a, 0xa0,\n+0x42, 0x6c, 0x0b, 0x38, 0xce, 0xd7, 0x75, 0x50, 0x32, 0x92, 0xc2, 0xdf, 0x2b, 0x30, 0x22, 0x48,\n+0xd0, 0xd5, 0x41, 0x38, 0x25, 0x5d, 0xa4, 0xe9, 0x5d, 0x9f, 0xc6, 0x94, 0x75, 0xd0, 0x45, 0xfd,\n+0x30, 0x97, 0x43, 0x8f, 0x90, 0xab, 0x0a, 0xc7, 0x86, 0x73, 0x60, 0x4a, 0x69, 0x2d, 0xde, 0xa5,\n+0x78, 0xd7, 0x06, 0xda, 0x6a, 0x9e, 0x4b, 0x3e, 0x77, 0x3a, 0x20, 0x13, 0x22, 0x01, 0xd0, 0xbf,\n+0x68, 0x9e, 0x63, 0x60, 0x6b, 0x35, 0x4d, 0x0b, 0x6d, 0xba, 0xa1, 0x3d, 0xc0, 0x93, 0xe0, 0x7f,\n+0x23, 0xb3, 0x55, 0xad, 0x72, 0x25, 0x4e, 0x46, 0xf9, 0xd2, 0x16, 0xef, 0xb0, 0x64, 0xc1, 0x01,\n+0x9e, 0xe9, 0xca, 0xa0, 0x6a, 0x98, 0x0e, 0xcf, 0xd8, 0x60, 0xf2, 0x2f, 0x49, 0xb8, 0xe4, 0x42,\n+0xe1, 0x38, 0x35, 0x16, 0xf4, 0xc8, 0x6e, 0x4f, 0xf7, 0x81, 0x56, 0xe8, 0xba, 0xa3, 0xbe, 0x23,\n+0xaf, 0xae, 0xfd, 0x6f, 0x03, 0xe0, 0x02, 0x3b, 0x30, 0x76, 0xfa, 0x1b, 0x6d, 0x41, 0xcf, 0x01,\n+0xb1, 0xe9, 0xb8, 0xc9, 0x66, 0xf4, 0xdb, 0x26, 0xf3, 0x3a, 0xa4, 0x74, 0xf2, 0x49, 0x24, 0x5b,\n+0xc9, 0xb0, 0xd0, 0x57, 0xc1, 0xfa, 0x3e, 0x7a, 0xe1, 0x97, 0xc9, 0x30, 0x82, 0x02, 0x40, 0x30,\n+0x82, 0x01, 0xe5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0c, 0x01, 0x54, 0x48, 0xef, 0x21, 0xfd,\n+0x97, 0x59, 0x0d, 0xf5, 0x04, 0x0a, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04,\n+0x03, 0x02, 0x30, 0x71, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48,\n+0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x42, 0x75, 0x64, 0x61,\n+0x70, 0x65, 0x73, 0x74, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0d, 0x4d,\n+0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x17, 0x30, 0x15,\n+0x06, 0x03, 0x55, 0x04, 0x61, 0x0c, 0x0e, 0x56, 0x41, 0x54, 0x48, 0x55, 0x2d, 0x32, 0x33, 0x35,\n+0x38, 0x34, 0x34, 0x39, 0x37, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x15,\n+0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41,\n+0x20, 0x32, 0x30, 0x31, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x38, 0x32, 0x32, 0x31,\n+0x32, 0x30, 0x37, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x38, 0x32, 0x32, 0x31, 0x32,\n+0x30, 0x37, 0x30, 0x36, 0x5a, 0x30, 0x71, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x42,\n+0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x0c, 0x0d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31,\n+0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x61, 0x0c, 0x0e, 0x56, 0x41, 0x54, 0x48, 0x55, 0x2d,\n+0x32, 0x33, 0x35, 0x38, 0x34, 0x34, 0x39, 0x37, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x0c, 0x15, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x37, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,\n+0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,\n+0x42, 0x00, 0x04, 0x96, 0xdc, 0x3d, 0x8a, 0xd8, 0xb0, 0x7b, 0x6f, 0xc6, 0x27, 0xbe, 0x44, 0x90,\n+0xb1, 0xb3, 0x56, 0x15, 0x7b, 0x8e, 0x43, 0x24, 0x7d, 0x1a, 0x84, 0x59, 0xee, 0x63, 0x68, 0xb2,\n+0xc6, 0x5e, 0x87, 0xd0, 0x15, 0x48, 0x1e, 0xa8, 0x90, 0xad, 0xbd, 0x53, 0xa2, 0xda, 0xde, 0x3a,\n+0x90, 0xa6, 0x60, 0x5f, 0x68, 0x32, 0xb5, 0x86, 0x41, 0xdf, 0x87, 0x5b, 0x2c, 0x7b, 0xc5, 0xfe,\n+0x7c, 0x7a, 0xda, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n+0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n+0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n+0x16, 0x04, 0x14, 0x87, 0x11, 0x15, 0x08, 0xd1, 0xaa, 0xc1, 0x78, 0x0c, 0xb1, 0xaf, 0xce, 0xc6,\n+0xc9, 0x90, 0xef, 0xbf, 0x30, 0x04, 0xc0, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18,\n+0x30, 0x16, 0x80, 0x14, 0x87, 0x11, 0x15, 0x08, 0xd1, 0xaa, 0xc1, 0x78, 0x0c, 0xb1, 0xaf, 0xce,\n+0xc6, 0xc9, 0x90, 0xef, 0xbf, 0x30, 0x04, 0xc0, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce,\n+0x3d, 0x04, 0x03, 0x02, 0x03, 0x49, 0x00, 0x30, 0x46, 0x02, 0x21, 0x00, 0xb5, 0x57, 0xdd, 0xd7,\n+0x8a, 0x55, 0x0b, 0x36, 0xe1, 0x86, 0x44, 0xfa, 0xd4, 0xd9, 0x68, 0x8d, 0xb8, 0xdc, 0x23, 0x8a,\n+0x8a, 0x0d, 0xd4, 0x2f, 0x7d, 0xea, 0x73, 0xec, 0xbf, 0x4d, 0x6c, 0xa8, 0x02, 0x21, 0x00, 0xcb,\n+0xa5, 0xb4, 0x12, 0xfa, 0xe7, 0xb5, 0xe8, 0xcf, 0x7e, 0x93, 0xfc, 0xf3, 0x35, 0x8f, 0x6f, 0x4e,\n+0x5a, 0x7c, 0xb4, 0xbc, 0x4e, 0xb2, 0xfc, 0x72, 0xaa, 0x5b, 0x59, 0xf9, 0xe7, 0xdc, 0x31, 0x30,\n+0x82, 0x02, 0x60, 0x30, 0x82, 0x02, 0x07, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0c, 0x0d, 0x6a,\n+0x5f, 0x08, 0x3f, 0x28, 0x5c, 0x3e, 0x51, 0x95, 0xdf, 0x5d, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86,\n+0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13,\n+0x08, 0x49, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,\n+0x04, 0x07, 0x13, 0x07, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x31, 0x21, 0x30, 0x1f, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x77, 0x61, 0x76, 0x65, 0x20,\n+0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3a,\n+0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x31, 0x54, 0x72, 0x75, 0x73, 0x74, 0x77, 0x61,\n+0x76, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x45, 0x43, 0x43, 0x20, 0x50, 0x32,\n+0x35, 0x36, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37,\n+0x30, 0x38, 0x32, 0x33, 0x31, 0x39, 0x33, 0x35, 0x31, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30,\n+0x38, 0x32, 0x33, 0x31, 0x39, 0x33, 0x35, 0x31, 0x30, 0x5a, 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,\n+0x55, 0x04, 0x08, 0x13, 0x08, 0x49, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73, 0x31, 0x10, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x31,\n+0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x77,\n+0x61, 0x76, 0x65, 0x20, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x49, 0x6e,\n+0x63, 0x2e, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x31, 0x54, 0x72, 0x75,\n+0x73, 0x74, 0x77, 0x61, 0x76, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x45, 0x43,\n+0x43, 0x20, 0x50, 0x32, 0x35, 0x36, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n+0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x59,\n+0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48,\n+0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0x7e, 0xfb, 0x6c, 0xe6, 0x23, 0xe3, 0x73,\n+0x32, 0x08, 0xca, 0x60, 0xe6, 0x53, 0x9c, 0xba, 0x74, 0x8d, 0x18, 0xb0, 0x78, 0x90, 0x52, 0x80,\n+0xdd, 0x38, 0xc0, 0x4a, 0x1d, 0xd1, 0xa8, 0xcc, 0x93, 0xa4, 0x97, 0x06, 0x38, 0xca, 0x0d, 0x15,\n+0x62, 0xc6, 0x8e, 0x01, 0x2a, 0x65, 0x9d, 0xaa, 0xdf, 0x34, 0x91, 0x2e, 0x81, 0xc1, 0xe4, 0x33,\n+0x92, 0x31, 0xc4, 0xfd, 0x09, 0x3a, 0xa6, 0x3f, 0xad, 0xa3, 0x43, 0x30, 0x41, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0f,\n+0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x05, 0x03, 0x03, 0x07, 0x06, 0x00, 0x30,\n+0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa3, 0x41, 0x06, 0xac, 0x90, 0x6d,\n+0xd1, 0x4a, 0xeb, 0x75, 0xa5, 0x4a, 0x10, 0x99, 0xb3, 0xb1, 0xa1, 0x8b, 0x4a, 0xf7, 0x30, 0x0a,\n+0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x47, 0x00, 0x30, 0x44, 0x02,\n+0x20, 0x07, 0xe6, 0x54, 0xda, 0x0e, 0xa0, 0x5a, 0xb2, 0xae, 0x11, 0x9f, 0x87, 0xc5, 0xb6, 0xff,\n+0x69, 0xde, 0x25, 0xbe, 0xf8, 0xa0, 0xb7, 0x08, 0xf3, 0x44, 0xce, 0x2a, 0xdf, 0x08, 0x21, 0x0c,\n+0x37, 0x02, 0x20, 0x2d, 0x26, 0x03, 0xa0, 0x05, 0xbd, 0x6b, 0xd1, 0xf6, 0x5c, 0xf8, 0x65, 0xcc,\n+0x86, 0x6d, 0xb3, 0x9c, 0x34, 0x48, 0x63, 0x84, 0x09, 0xc5, 0x8d, 0x77, 0x1a, 0xe2, 0xcc, 0x9c,\n+0xe1, 0x74, 0x7b, 0x30, 0x82, 0x05, 0xda, 0x30, 0x82, 0x03, 0xc2, 0xa0, 0x03, 0x02, 0x01, 0x02,\n+0x02, 0x0c, 0x05, 0xf7, 0x0e, 0x86, 0xda, 0x49, 0xf3, 0x46, 0x35, 0x2e, 0xba, 0xb2, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x88,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x11, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x08, 0x49, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73,\n+0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x43, 0x68, 0x69, 0x63, 0x61,\n+0x67, 0x6f, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x18, 0x54, 0x72, 0x75,\n+0x73, 0x74, 0x77, 0x61, 0x76, 0x65, 0x20, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c,\n+0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x28,\n+0x54, 0x72, 0x75, 0x73, 0x74, 0x77, 0x61, 0x76, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c,\n+0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41,\n+0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x38,\n+0x32, 0x33, 0x31, 0x39, 0x33, 0x34, 0x31, 0x32, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x38, 0x32,\n+0x33, 0x31, 0x39, 0x33, 0x34, 0x31, 0x32, 0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,\n+0x08, 0x0c, 0x08, 0x49, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x31, 0x21, 0x30,\n+0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x77, 0x61, 0x76,\n+0x65, 0x20, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,\n+0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x28, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x77, 0x61, 0x76, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,\n+0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n+0x82, 0x02, 0x01, 0x00, 0xb9, 0x5d, 0x51, 0x28, 0x4b, 0x3c, 0x37, 0x92, 0xd1, 0x82, 0xce, 0xbd,\n+0x1d, 0xbd, 0xcd, 0xdd, 0xb8, 0xab, 0xcf, 0x0a, 0x3e, 0xe1, 0x5d, 0xe5, 0xdc, 0xaa, 0x09, 0xb9,\n+0x57, 0x02, 0x3e, 0xe6, 0x63, 0x61, 0xdf, 0xf2, 0x0f, 0x82, 0x63, 0xae, 0xa3, 0xf7, 0xac, 0x73,\n+0xd1, 0x7c, 0xe7, 0xb3, 0x0b, 0xaf, 0x08, 0x00, 0x09, 0x59, 0x7f, 0xcd, 0x29, 0x2a, 0x88, 0x93,\n+0x87, 0x17, 0x18, 0x80, 0xed, 0x88, 0xb2, 0xb4, 0xb6, 0x10, 0x1f, 0x2d, 0xd6, 0x5f, 0x55, 0xa2,\n+0x13, 0x5d, 0xd1, 0xc6, 0xeb, 0x06, 0x56, 0x89, 0x88, 0xfe, 0xac, 0x32, 0x9d, 0xfd, 0x5c, 0xc3,\n+0x05, 0xc7, 0x6e, 0xee, 0x86, 0x89, 0xba, 0x88, 0x03, 0x9d, 0x72, 0x21, 0x86, 0x90, 0xae, 0x8f,\n+0x03, 0xa5, 0xdc, 0x9f, 0x88, 0x28, 0xcb, 0xa3, 0x92, 0x49, 0x0f, 0xec, 0xd0, 0x0f, 0xe2, 0x6d,\n+0x44, 0x4f, 0x80, 0x6a, 0xb2, 0xd4, 0xe7, 0xa0, 0x0a, 0x53, 0x01, 0xba, 0x8e, 0x97, 0x91, 0x76,\n+0x6e, 0xbc, 0xfc, 0xd5, 0x6b, 0x36, 0xe6, 0x40, 0x88, 0xd6, 0x7b, 0x2f, 0x5f, 0x05, 0xe8, 0x2c,\n+0x6d, 0x11, 0xf3, 0xe7, 0xb2, 0xbe, 0x92, 0x44, 0x4c, 0xd2, 0x97, 0xa4, 0xfe, 0xd2, 0x72, 0x81,\n+0x43, 0x07, 0x9c, 0xe9, 0x11, 0x3e, 0xf5, 0x8b, 0x1a, 0x59, 0x7d, 0x1f, 0x68, 0x58, 0xdd, 0x04,\n+0x00, 0x2c, 0x96, 0xf3, 0x43, 0xb3, 0x7e, 0x98, 0x19, 0x74, 0xd9, 0x9c, 0x73, 0xd9, 0x18, 0xbe,\n+0x41, 0xc7, 0x34, 0x79, 0xd9, 0xf4, 0x62, 0xc2, 0x43, 0xb9, 0xb3, 0x27, 0xb0, 0x22, 0xcb, 0xf9,\n+0x3d, 0x52, 0xc7, 0x30, 0x47, 0xb3, 0xc9, 0x3e, 0xb8, 0x6a, 0xe2, 0xe7, 0xe8, 0x81, 0x70, 0x5e,\n+0x42, 0x8b, 0x4f, 0x26, 0xa5, 0xfe, 0x3a, 0xc2, 0x20, 0x6e, 0xbb, 0xf8, 0x16, 0x8e, 0xcd, 0x0c,\n+0xa9, 0xb4, 0x1b, 0x6c, 0x76, 0x10, 0xe1, 0x58, 0x79, 0x46, 0x3e, 0x54, 0xce, 0x80, 0xa8, 0x57,\n+0x09, 0x37, 0x29, 0x1b, 0x99, 0x13, 0x8f, 0x0c, 0xc8, 0xd6, 0x2c, 0x1c, 0xfb, 0x05, 0xe8, 0x08,\n+0x95, 0x3d, 0x65, 0x46, 0xdc, 0xee, 0xcd, 0x69, 0xe2, 0x4d, 0x8f, 0x87, 0x28, 0x4e, 0x34, 0x0b,\n+0x3e, 0xcf, 0x14, 0xd9, 0xbb, 0xdd, 0xb6, 0x50, 0x9a, 0xad, 0x77, 0xd4, 0x19, 0xd6, 0xda, 0x1a,\n+0x88, 0xc8, 0x4e, 0x1b, 0x27, 0x75, 0xd8, 0xb2, 0x08, 0xf1, 0xae, 0x83, 0x30, 0xb9, 0x11, 0x0e,\n+0xcd, 0x87, 0xf0, 0x84, 0x8d, 0x15, 0x72, 0x7c, 0xa1, 0xef, 0xcc, 0xf2, 0x88, 0x61, 0xba, 0xf4,\n+0x69, 0xbb, 0x0c, 0x8c, 0x0b, 0x75, 0x57, 0x04, 0xb8, 0x4e, 0x2a, 0x14, 0x2e, 0x3d, 0x0f, 0x1c,\n+0x1e, 0x32, 0xa6, 0x62, 0x36, 0xee, 0x66, 0xe2, 0x22, 0xb8, 0x05, 0x40, 0x63, 0x10, 0x22, 0xf3,\n+0x33, 0x1d, 0x74, 0x72, 0x8a, 0x2c, 0xf5, 0x39, 0x29, 0xa0, 0xd3, 0xe7, 0x1b, 0x80, 0x84, 0x2d,\n+0xc5, 0x3d, 0xe3, 0x4d, 0xb1, 0xfd, 0x1a, 0x6f, 0xba, 0x65, 0x07, 0x3b, 0x58, 0xec, 0x42, 0x45,\n+0x26, 0xfb, 0xd8, 0xda, 0x25, 0x72, 0xc4, 0xf6, 0x00, 0xb1, 0x22, 0x79, 0xbd, 0xe3, 0x7c, 0x59,\n+0x62, 0x4a, 0x9c, 0x05, 0x6f, 0x3d, 0xce, 0xe6, 0xd6, 0x47, 0x63, 0x99, 0xc6, 0x24, 0x6f, 0x72,\n+0x12, 0xc8, 0xac, 0x7f, 0x90, 0xb4, 0x0b, 0x91, 0x70, 0xe8, 0xb7, 0xe6, 0x16, 0x10, 0x71, 0x17,\n+0xce, 0xde, 0x06, 0x4f, 0x48, 0x41, 0x7d, 0x35, 0x4a, 0xa3, 0x89, 0xf2, 0xc9, 0x4b, 0x7b, 0x41,\n+0x11, 0x6d, 0x67, 0xb7, 0x08, 0x98, 0x4c, 0xe5, 0x11, 0x19, 0xae, 0x42, 0x80, 0xdc, 0xfb, 0x90,\n+0x05, 0xd4, 0xf8, 0x50, 0xca, 0xbe, 0xe4, 0xad, 0xc7, 0xc2, 0x94, 0xd7, 0x16, 0x9d, 0xe6, 0x17,\n+0x8f, 0xaf, 0x36, 0xfb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x99, 0xe0, 0x19, 0x67, 0x0d, 0x62, 0xdb,\n+0x76, 0xb3, 0xda, 0x3d, 0xb8, 0x5b, 0xe8, 0xfd, 0x42, 0xd2, 0x31, 0x0e, 0x87, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06,\n+0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,\n+0x00, 0x98, 0x73, 0x70, 0xe2, 0xb0, 0xd3, 0xed, 0x39, 0xec, 0x4c, 0x60, 0xd9, 0xa9, 0x12, 0x86,\n+0x17, 0x1e, 0x96, 0xd0, 0xe8, 0x54, 0x28, 0x3b, 0x64, 0x2d, 0x21, 0xa6, 0xf8, 0x9d, 0x56, 0x13,\n+0x6a, 0x48, 0x3d, 0x4f, 0xc7, 0x3e, 0x29, 0xdb, 0x6d, 0x58, 0x83, 0x54, 0x3d, 0x87, 0x7d, 0x23,\n+0x05, 0xd4, 0xe4, 0x1c, 0xdc, 0xe8, 0x38, 0x65, 0x86, 0xc5, 0x75, 0xa7, 0x5a, 0xdb, 0x35, 0x05,\n+0xbd, 0x77, 0xde, 0xbb, 0x29, 0x37, 0x40, 0x05, 0x07, 0xc3, 0x94, 0x52, 0x9f, 0xca, 0x64, 0xdd,\n+0xf1, 0x1b, 0x2b, 0xdc, 0x46, 0x0a, 0x10, 0x02, 0x31, 0xfd, 0x4a, 0x68, 0x0d, 0x07, 0x64, 0x90,\n+0xe6, 0x1e, 0xf5, 0x2a, 0xa1, 0xa8, 0xbb, 0x3c, 0x5d, 0xf9, 0xa3, 0x08, 0x0b, 0x11, 0x0c, 0xf1,\n+0x3f, 0x2d, 0x10, 0x94, 0x6f, 0xfe, 0xe2, 0x34, 0x87, 0x83, 0xd6, 0xcf, 0xe5, 0x1b, 0x35, 0x6d,\n+0xd2, 0x03, 0xe1, 0xb0, 0x0d, 0xa8, 0xa0, 0xaa, 0x46, 0x27, 0x82, 0x36, 0xa7, 0x15, 0xb6, 0x08,\n+0xa6, 0x42, 0x54, 0x57, 0xb6, 0x99, 0x5a, 0xe2, 0x0b, 0x79, 0x90, 0xd7, 0x57, 0x12, 0x51, 0x35,\n+0x19, 0x88, 0x41, 0x68, 0x25, 0xd4, 0x37, 0x17, 0x84, 0x15, 0xfb, 0x01, 0x72, 0xdc, 0x95, 0xde,\n+0x52, 0x26, 0x20, 0x98, 0x26, 0xe2, 0x76, 0xf5, 0x27, 0x6f, 0xfa, 0x00, 0x3b, 0x4a, 0x61, 0xd9,\n+0x0d, 0xcb, 0x51, 0x93, 0x2a, 0xfd, 0x16, 0x06, 0x96, 0xa7, 0x23, 0x9a, 0x23, 0x48, 0xfe, 0x51,\n+0xbd, 0xb6, 0xc4, 0xb0, 0xb1, 0x54, 0xce, 0xde, 0x6c, 0x41, 0xad, 0x16, 0x67, 0x7e, 0xdb, 0xfd,\n+0x38, 0xcd, 0xb9, 0x38, 0x4e, 0xb2, 0xc1, 0x60, 0xcb, 0x9d, 0x17, 0xdf, 0x58, 0x9e, 0x7a, 0x62,\n+0xb2, 0x26, 0x8f, 0x74, 0x95, 0x9b, 0xe4, 0x5b, 0x1d, 0xd2, 0x0f, 0xdd, 0x98, 0x1c, 0x9b, 0x59,\n+0xb9, 0x23, 0xd3, 0x31, 0xa0, 0xa6, 0xff, 0x38, 0xdd, 0xcf, 0x20, 0x4f, 0xe9, 0x58, 0x56, 0x3a,\n+0x67, 0xc3, 0xd1, 0xf6, 0x99, 0x99, 0x9d, 0xba, 0x36, 0xb6, 0x80, 0x2f, 0x88, 0x47, 0x4f, 0x86,\n+0xbf, 0x44, 0x3a, 0x80, 0xe4, 0x37, 0x1c, 0xa6, 0xba, 0xea, 0x97, 0x98, 0x11, 0xd0, 0x84, 0x62,\n+0x47, 0x64, 0x1e, 0xaa, 0xee, 0x40, 0xbf, 0x34, 0xb1, 0x9c, 0x8f, 0x4e, 0xe1, 0xf2, 0x92, 0x4f,\n+0x1f, 0x8e, 0xf3, 0x9e, 0x97, 0xde, 0xf3, 0xa6, 0x79, 0x6a, 0x89, 0x71, 0x4f, 0x4b, 0x27, 0x17,\n+0x48, 0xfe, 0xec, 0xf4, 0x50, 0x0f, 0x4f, 0x49, 0x7d, 0xcc, 0x45, 0xe3, 0xbd, 0x7a, 0x40, 0xc5,\n+0x41, 0xdc, 0x61, 0x56, 0x27, 0x06, 0x69, 0xe5, 0x72, 0x41, 0x81, 0xd3, 0xb6, 0x01, 0x89, 0xa0,\n+0x2f, 0x3a, 0x72, 0x79, 0xfe, 0x3a, 0x30, 0xbf, 0x41, 0xec, 0xc7, 0x62, 0x3e, 0x91, 0x4b, 0xc7,\n+0xd9, 0x31, 0x76, 0x42, 0xf9, 0xf7, 0x3c, 0x63, 0xec, 0x26, 0x8c, 0x73, 0x0c, 0x7d, 0x1a, 0x1d,\n+0xea, 0xa8, 0x7c, 0x87, 0xa8, 0xc2, 0x27, 0x7c, 0xe1, 0x33, 0x41, 0x0f, 0xcf, 0xcf, 0xfc, 0x00,\n+0xa0, 0x22, 0x80, 0x9e, 0x4a, 0xa7, 0x6f, 0x00, 0xb0, 0x41, 0x45, 0xb7, 0x22, 0xca, 0x68, 0x48,\n+0xc5, 0x42, 0xa2, 0xae, 0xdd, 0x1d, 0xf2, 0xe0, 0x6e, 0x4e, 0x05, 0x58, 0xb1, 0xc0, 0x90, 0x16,\n+0x2a, 0xa4, 0x3d, 0x10, 0x40, 0xbe, 0x8f, 0x62, 0x63, 0x83, 0xa9, 0x9c, 0x82, 0x7d, 0x2d, 0x02,\n+0xe9, 0x83, 0x30, 0x7c, 0xcb, 0x27, 0xc9, 0xfd, 0x1e, 0x66, 0x00, 0xb0, 0x2e, 0xd3, 0x21, 0x2f,\n+0x8e, 0x33, 0x16, 0x6c, 0x98, 0xed, 0x10, 0xa8, 0x07, 0xd6, 0xcc, 0x93, 0xcf, 0xdb, 0xd1, 0x69,\n+0x1c, 0xe4, 0xca, 0xc9, 0xe0, 0xb6, 0x9c, 0xe9, 0xce, 0x71, 0x71, 0xde, 0x6c, 0x3f, 0x16, 0xa4,\n+0x79, 0x30, 0x82, 0x02, 0x9d, 0x30, 0x82, 0x02, 0x24, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0c,\n+0x08, 0xbd, 0x85, 0x97, 0x6c, 0x99, 0x27, 0xa4, 0x80, 0x68, 0x47, 0x3b, 0x30, 0x0a, 0x06, 0x08,\n+0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,\n+0x08, 0x13, 0x08, 0x49, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06,\n+0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x31, 0x21, 0x30,\n+0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x77, 0x61, 0x76,\n+0x65, 0x20, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,\n+0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x31, 0x54, 0x72, 0x75, 0x73, 0x74,\n+0x77, 0x61, 0x76, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x45, 0x43, 0x43, 0x20,\n+0x50, 0x33, 0x38, 0x34, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n+0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d,\n+0x31, 0x37, 0x30, 0x38, 0x32, 0x33, 0x31, 0x39, 0x33, 0x36, 0x34, 0x33, 0x5a, 0x17, 0x0d, 0x34,\n+0x32, 0x30, 0x38, 0x32, 0x33, 0x31, 0x39, 0x33, 0x36, 0x34, 0x33, 0x5a, 0x30, 0x81, 0x91, 0x31,\n+0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x11, 0x30, 0x0f,\n+0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x08, 0x49, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73, 0x31,\n+0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67,\n+0x6f, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x72, 0x75, 0x73,\n+0x74, 0x77, 0x61, 0x76, 0x65, 0x20, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20,\n+0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x31, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x77, 0x61, 0x76, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20,\n+0x45, 0x43, 0x43, 0x20, 0x50, 0x33, 0x38, 0x34, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b,\n+0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x6b, 0xda, 0x0d, 0x75, 0x35, 0x08, 0x31, 0x47,\n+0x05, 0xae, 0x45, 0x99, 0x55, 0xf1, 0x11, 0x13, 0x2e, 0x4a, 0xf8, 0x10, 0x31, 0x23, 0xa3, 0x7e,\n+0x83, 0xd3, 0x7f, 0x28, 0x08, 0x3a, 0x26, 0x1a, 0x3a, 0xcf, 0x97, 0x82, 0x1f, 0x80, 0xb7, 0x27,\n+0x09, 0x8f, 0xd1, 0x8e, 0x30, 0xc4, 0x0a, 0x9b, 0x0e, 0xac, 0x58, 0x04, 0xab, 0xf7, 0x36, 0x7d,\n+0x94, 0x23, 0xa4, 0x9b, 0x0a, 0x8a, 0x8b, 0xab, 0xeb, 0xfd, 0x39, 0x25, 0x66, 0xf1, 0x5e, 0xfe,\n+0x8c, 0xae, 0x8d, 0x41, 0x79, 0x9d, 0x09, 0x60, 0xce, 0x28, 0xa9, 0xd3, 0x8a, 0x6d, 0xf3, 0xd6,\n+0x45, 0xd4, 0xf2, 0x98, 0x84, 0x38, 0x65, 0xa0, 0xa3, 0x43, 0x30, 0x41, 0x30, 0x0f, 0x06, 0x03,\n+0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0f, 0x06,\n+0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x05, 0x03, 0x03, 0x07, 0x06, 0x00, 0x30, 0x1d,\n+0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x55, 0xa9, 0x84, 0x89, 0xd2, 0xc1, 0x32,\n+0xbd, 0x18, 0xcb, 0x6c, 0xa6, 0x07, 0x4e, 0xc8, 0xe7, 0x9d, 0xbe, 0x82, 0x90, 0x30, 0x0a, 0x06,\n+0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30,\n+0x37, 0x01, 0x92, 0x97, 0x45, 0x12, 0x7e, 0xa0, 0xf3, 0x3e, 0xad, 0x19, 0x3a, 0x72, 0xdd, 0xf4,\n+0x50, 0x93, 0x03, 0x12, 0xbe, 0x44, 0xd2, 0x4f, 0x41, 0xa4, 0x8c, 0x9c, 0x9d, 0x1f, 0xa3, 0xf6,\n+0xc2, 0x92, 0xe7, 0x48, 0x14, 0xfe, 0x4e, 0x9b, 0xa5, 0x91, 0x57, 0xae, 0xc6, 0x37, 0x72, 0xbb,\n+0x02, 0x30, 0x67, 0x25, 0x0a, 0xb1, 0x0c, 0x5e, 0xee, 0xa9, 0x63, 0x92, 0x6f, 0xe5, 0x90, 0x0b,\n+0xfe, 0x66, 0x22, 0xca, 0x47, 0xfd, 0x8a, 0x31, 0xf7, 0x83, 0xfe, 0x7a, 0xbf, 0x10, 0xbe, 0x18,\n+0x2b, 0x1e, 0x8f, 0xf6, 0x29, 0x1e, 0x94, 0x59, 0xef, 0x8e, 0x21, 0x37, 0xcb, 0x51, 0x98, 0xa5,\n+0x6e, 0x4b, 0x30, 0x82, 0x04, 0x33, 0x30, 0x82, 0x03, 0x1b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x03, 0x09, 0x83, 0xf3, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x44, 0x45, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x44, 0x2d, 0x54,\n+0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x0c, 0x1e, 0x44, 0x2d, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x32, 0x30,\n+0x30, 0x39, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x31, 0x31, 0x30, 0x35, 0x30, 0x38, 0x33, 0x35,\n+0x35, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x31, 0x30, 0x35, 0x30, 0x38, 0x33, 0x35, 0x35,\n+0x38, 0x5a, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44,\n+0x45, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x44, 0x2d, 0x54, 0x72,\n+0x75, 0x73, 0x74, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x0c, 0x1e, 0x44, 0x2d, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n+0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x32, 0x30, 0x30,\n+0x39, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01,\n+0x01, 0x00, 0xd3, 0xb2, 0x4a, 0xcf, 0x7a, 0x47, 0xef, 0x75, 0x9b, 0x23, 0xfa, 0x3a, 0x2f, 0xd6,\n+0x50, 0x45, 0x89, 0x35, 0x3a, 0xc6, 0x6b, 0xdb, 0xfe, 0xdb, 0x00, 0x68, 0xa8, 0xe0, 0x03, 0x11,\n+0x1d, 0x37, 0x50, 0x08, 0x9f, 0x4d, 0x4a, 0x68, 0x94, 0x35, 0xb3, 0x53, 0xd1, 0x94, 0x63, 0xa7,\n+0x20, 0x56, 0xaf, 0xde, 0x51, 0x78, 0xec, 0x2a, 0x3d, 0xf3, 0x48, 0x48, 0x50, 0x3e, 0x0a, 0xdf,\n+0x46, 0x55, 0x8b, 0x27, 0x6d, 0xc3, 0x10, 0x4d, 0x0d, 0x91, 0x52, 0x43, 0xd8, 0x87, 0xe0, 0x5d,\n+0x4e, 0x36, 0xb5, 0x21, 0xca, 0x5f, 0x39, 0x40, 0x04, 0x5f, 0x5b, 0x7e, 0xcc, 0xa3, 0xc6, 0x2b,\n+0xa9, 0x40, 0x1e, 0xd9, 0x36, 0x84, 0xd6, 0x48, 0xf3, 0x92, 0x1e, 0x34, 0x46, 0x20, 0x24, 0xc1,\n+0xa4, 0x51, 0x8e, 0x4a, 0x1a, 0xef, 0x50, 0x3f, 0x69, 0x5d, 0x19, 0x7f, 0x45, 0xc3, 0xc7, 0x01,\n+0x8f, 0x51, 0xc9, 0x23, 0xe8, 0x72, 0xae, 0xb4, 0xbc, 0x56, 0x09, 0x7f, 0x12, 0xcb, 0x1c, 0xb1,\n+0xaf, 0x29, 0x90, 0x0a, 0xc9, 0x55, 0xcc, 0x0f, 0xd3, 0xb4, 0x1a, 0xed, 0x47, 0x35, 0x5a, 0x4a,\n+0xed, 0x9c, 0x73, 0x04, 0x21, 0xd0, 0xaa, 0xbd, 0x0c, 0x13, 0xb5, 0x00, 0xca, 0x26, 0x6c, 0xc4,\n+0x6b, 0x0c, 0x94, 0x5a, 0x95, 0x94, 0xda, 0x50, 0x9a, 0xf1, 0xff, 0xa5, 0x2b, 0x66, 0x31, 0xa4,\n+0xc9, 0x38, 0xa0, 0xdf, 0x1d, 0x1f, 0xb8, 0x09, 0x2e, 0xf3, 0xa7, 0xe8, 0x67, 0x52, 0xab, 0x95,\n+0x1f, 0xe0, 0x46, 0x3e, 0xd8, 0xa4, 0xc3, 0xca, 0x5a, 0xc5, 0x31, 0x80, 0xe8, 0x48, 0x9a, 0x9f,\n+0x94, 0x69, 0xfe, 0x19, 0xdd, 0xd8, 0x73, 0x7c, 0x81, 0xca, 0x96, 0xde, 0x8e, 0xed, 0xb3, 0x32,\n+0x05, 0x65, 0x84, 0x34, 0xe6, 0xe6, 0xfd, 0x57, 0x10, 0xb5, 0x5f, 0x76, 0xbf, 0x2f, 0xb0, 0x10,\n+0x0d, 0xc5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x1a, 0x30, 0x82, 0x01, 0x16, 0x30,\n+0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xfd, 0xda, 0x14, 0xc4, 0x9f,\n+0x30, 0xde, 0x21, 0xbd, 0x1e, 0x42, 0x39, 0xfc, 0xab, 0x63, 0x23, 0x49, 0xe0, 0xf1, 0x84, 0x30,\n+0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n+0x81, 0xd3, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x81, 0xcb, 0x30, 0x81, 0xc8, 0x30, 0x81, 0x80,\n+0xa0, 0x7e, 0xa0, 0x7c, 0x86, 0x7a, 0x6c, 0x64, 0x61, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x69, 0x72,\n+0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e,\n+0x65, 0x74, 0x2f, 0x43, 0x4e, 0x3d, 0x44, 0x2d, 0x54, 0x52, 0x55, 0x53, 0x54, 0x25, 0x32, 0x30,\n+0x52, 0x6f, 0x6f, 0x74, 0x25, 0x32, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x25, 0x32, 0x30, 0x33,\n+0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x32, 0x25, 0x32, 0x30, 0x32, 0x30, 0x30, 0x39,\n+0x2c, 0x4f, 0x3d, 0x44, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x25, 0x32, 0x30, 0x47, 0x6d, 0x62,\n+0x48, 0x2c, 0x43, 0x3d, 0x44, 0x45, 0x3f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n+0x74, 0x65, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x69, 0x73, 0x74,\n+0x30, 0x43, 0xa0, 0x41, 0xa0, 0x3f, 0x86, 0x3d, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,\n+0x77, 0x77, 0x2e, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x63,\n+0x72, 0x6c, 0x2f, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f,\n+0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x33, 0x5f, 0x63, 0x61, 0x5f, 0x32, 0x5f, 0x32, 0x30, 0x30,\n+0x39, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x7f, 0x97, 0xdb, 0x30, 0xc8, 0xdf, 0xa4,\n+0x9c, 0x7d, 0x21, 0x7a, 0x80, 0x70, 0xce, 0x14, 0x12, 0x69, 0x88, 0x14, 0x95, 0x60, 0x44, 0x01,\n+0xac, 0xb2, 0xe9, 0x30, 0x4f, 0x9b, 0x50, 0xc2, 0x66, 0xd8, 0x7e, 0x8d, 0x30, 0xb5, 0x70, 0x31,\n+0xe9, 0xe2, 0x69, 0xc7, 0xf3, 0x70, 0xdb, 0x20, 0x15, 0x86, 0xd0, 0x0d, 0xf0, 0xbe, 0xac, 0x01,\n+0x75, 0x84, 0xce, 0x7e, 0x9f, 0x4d, 0xbf, 0xb7, 0x60, 0x3b, 0x9c, 0xf3, 0xca, 0x1d, 0xe2, 0x5e,\n+0x68, 0xd8, 0xa3, 0x9d, 0x97, 0xe5, 0x40, 0x60, 0xd2, 0x36, 0x21, 0xfe, 0xd0, 0xb4, 0xb8, 0x17,\n+0xda, 0x74, 0xa3, 0x7f, 0xd4, 0xdf, 0xb0, 0x98, 0x02, 0xac, 0x6f, 0x6b, 0x6b, 0x2c, 0x25, 0x24,\n+0x72, 0xa1, 0x65, 0xee, 0x25, 0x5a, 0xe5, 0xe6, 0x32, 0xe7, 0xf2, 0xdf, 0xab, 0x49, 0xfa, 0xf3,\n+0x90, 0x69, 0x23, 0xdb, 0x04, 0xd9, 0xe7, 0x5c, 0x58, 0xfc, 0x65, 0xd4, 0x97, 0xbe, 0xcc, 0xfc,\n+0x2e, 0x0a, 0xcc, 0x25, 0x2a, 0x35, 0x04, 0xf8, 0x60, 0x91, 0x15, 0x75, 0x3d, 0x41, 0xff, 0x23,\n+0x1f, 0x19, 0xc8, 0x6c, 0xeb, 0x82, 0x53, 0x04, 0xa6, 0xe4, 0x4c, 0x22, 0x4d, 0x8d, 0x8c, 0xba,\n+0xce, 0x5b, 0x73, 0xec, 0x64, 0x54, 0x50, 0x6d, 0xd1, 0x9c, 0x55, 0xfb, 0x69, 0xc3, 0x36, 0xc3,\n+0x8c, 0xbc, 0x3c, 0x85, 0xa6, 0x6b, 0x0a, 0x26, 0x0d, 0xe0, 0x93, 0x98, 0x60, 0xae, 0x7e, 0xc6,\n+0x24, 0x97, 0x8a, 0x61, 0x5f, 0x91, 0x8e, 0x66, 0x92, 0x09, 0x87, 0x36, 0xcd, 0x8b, 0x9b, 0x2d,\n+0x3e, 0xf6, 0x51, 0xd4, 0x50, 0xd4, 0x59, 0x28, 0xbd, 0x83, 0xf2, 0xcc, 0x28, 0x7b, 0x53, 0x86,\n+0x6d, 0xd8, 0x26, 0x88, 0x70, 0xd7, 0xea, 0x91, 0xcd, 0x3e, 0xb9, 0xca, 0xc0, 0x90, 0x6e, 0x5a,\n+0xc6, 0x5e, 0x74, 0x65, 0xd7, 0x5c, 0xfe, 0xa3, 0xe2, 0x30, 0x82, 0x04, 0x43, 0x30, 0x82, 0x03,\n+0x2b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x09, 0x83, 0xf4, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x50, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x0c, 0x0c, 0x44, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6d, 0x62, 0x48,\n+0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x21, 0x44, 0x2d, 0x54, 0x52, 0x55,\n+0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20,\n+0x43, 0x41, 0x20, 0x32, 0x20, 0x45, 0x56, 0x20, 0x32, 0x30, 0x30, 0x39, 0x30, 0x1e, 0x17, 0x0d,\n+0x30, 0x39, 0x31, 0x31, 0x30, 0x35, 0x30, 0x38, 0x35, 0x30, 0x34, 0x36, 0x5a, 0x17, 0x0d, 0x32,\n+0x39, 0x31, 0x31, 0x30, 0x35, 0x30, 0x38, 0x35, 0x30, 0x34, 0x36, 0x5a, 0x30, 0x50, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x15, 0x30, 0x13, 0x06,\n+0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x44, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6d,\n+0x62, 0x48, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x21, 0x44, 0x2d, 0x54,\n+0x52, 0x55, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20,\n+0x33, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x45, 0x56, 0x20, 0x32, 0x30, 0x30, 0x39, 0x30, 0x82,\n+0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x99,\n+0xf1, 0x84, 0x34, 0x70, 0xba, 0x2f, 0xb7, 0x30, 0xa0, 0x8e, 0xbd, 0x7c, 0x04, 0xcf, 0xbe, 0x62,\n+0xbc, 0x99, 0xfd, 0x82, 0x97, 0xd2, 0x7a, 0x0a, 0x67, 0x96, 0x38, 0x09, 0xf6, 0x10, 0x4e, 0x95,\n+0x22, 0x73, 0x99, 0x8d, 0xda, 0x15, 0x2d, 0xe7, 0x05, 0xfc, 0x19, 0x73, 0x22, 0xb7, 0x8e, 0x98,\n+0x00, 0xbc, 0x3c, 0x3d, 0xac, 0xa1, 0x6c, 0xfb, 0xd6, 0x79, 0x25, 0x4b, 0xad, 0xf0, 0xcc, 0x64,\n+0xda, 0x88, 0x3e, 0x29, 0xb8, 0x0f, 0x09, 0xd3, 0x34, 0xdd, 0x33, 0xf5, 0x62, 0xd1, 0xe1, 0xcd,\n+0x19, 0xe9, 0xee, 0x18, 0x4f, 0x4c, 0x58, 0xae, 0xe2, 0x1e, 0xd6, 0x0c, 0x5b, 0x15, 0x5a, 0xd8,\n+0x3a, 0xb8, 0xc4, 0x18, 0x64, 0x1e, 0xe3, 0x33, 0xb2, 0xb5, 0x89, 0x77, 0x4e, 0x0c, 0xbf, 0xd9,\n+0x94, 0x6b, 0x13, 0x97, 0x6f, 0x12, 0xa3, 0xfe, 0x99, 0xa9, 0x04, 0xcc, 0x15, 0xec, 0x60, 0x68,\n+0x36, 0xed, 0x08, 0x7b, 0xb7, 0xf5, 0xbf, 0x93, 0xed, 0x66, 0x31, 0x83, 0x8c, 0xc6, 0x71, 0x34,\n+0x87, 0x4e, 0x17, 0xea, 0xaf, 0x8b, 0x91, 0x8d, 0x1c, 0x56, 0x41, 0xae, 0x22, 0x37, 0x5e, 0x37,\n+0xf2, 0x1d, 0xd9, 0xd1, 0x2d, 0x0d, 0x2f, 0x69, 0x51, 0xa7, 0xbe, 0x66, 0xa6, 0x8a, 0x3a, 0x2a,\n+0xbd, 0xc7, 0x1a, 0xb1, 0xe1, 0x14, 0xf0, 0xbe, 0x3a, 0x1d, 0xb9, 0xcf, 0x5b, 0xb1, 0x6a, 0xfe,\n+0xb4, 0xb1, 0x46, 0x20, 0xa2, 0xfb, 0x1e, 0x3b, 0x70, 0xef, 0x93, 0x98, 0x7d, 0x8c, 0x73, 0x96,\n+0xf2, 0xc5, 0xef, 0x85, 0x70, 0xad, 0x29, 0x26, 0xfc, 0x1e, 0x04, 0x3e, 0x1c, 0xa0, 0xd8, 0x0f,\n+0xcb, 0x52, 0x83, 0x62, 0x7c, 0xee, 0x8b, 0x53, 0x95, 0x90, 0xa9, 0x57, 0xa2, 0xea, 0x61, 0x05,\n+0xd8, 0xf9, 0x4d, 0xc4, 0x27, 0xfa, 0x6e, 0xad, 0xed, 0xf9, 0xd7, 0x51, 0xf7, 0x6b, 0xa5, 0x02,\n+0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x24, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0f, 0x06, 0x03,\n+0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06,\n+0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd3, 0x94, 0x8a, 0x4c, 0x62, 0x13, 0x2a, 0x19,\n+0x2e, 0xcc, 0xaf, 0x72, 0x8a, 0x7d, 0x36, 0xd7, 0x9a, 0x1c, 0xdc, 0x67, 0x30, 0x0e, 0x06, 0x03,\n+0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x81, 0xdd, 0x06,\n+0x03, 0x55, 0x1d, 0x1f, 0x04, 0x81, 0xd5, 0x30, 0x81, 0xd2, 0x30, 0x81, 0x87, 0xa0, 0x81, 0x84,\n+0xa0, 0x81, 0x81, 0x86, 0x7f, 0x6c, 0x64, 0x61, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x69, 0x72, 0x65,\n+0x63, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65,\n+0x74, 0x2f, 0x43, 0x4e, 0x3d, 0x44, 0x2d, 0x54, 0x52, 0x55, 0x53, 0x54, 0x25, 0x32, 0x30, 0x52,\n+0x6f, 0x6f, 0x74, 0x25, 0x32, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x25, 0x32, 0x30, 0x33, 0x25,\n+0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x32, 0x25, 0x32, 0x30, 0x45, 0x56, 0x25, 0x32, 0x30,\n+0x32, 0x30, 0x30, 0x39, 0x2c, 0x4f, 0x3d, 0x44, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x25, 0x32,\n+0x30, 0x47, 0x6d, 0x62, 0x48, 0x2c, 0x43, 0x3d, 0x44, 0x45, 0x3f, 0x63, 0x65, 0x72, 0x74, 0x69,\n+0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n+0x6c, 0x69, 0x73, 0x74, 0x30, 0x46, 0xa0, 0x44, 0xa0, 0x42, 0x86, 0x40, 0x68, 0x74, 0x74, 0x70,\n+0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e,\n+0x65, 0x74, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x5f, 0x72,\n+0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x33, 0x5f, 0x63, 0x61, 0x5f, 0x32,\n+0x5f, 0x65, 0x76, 0x5f, 0x32, 0x30, 0x30, 0x39, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,\n+0x34, 0xed, 0x7b, 0x5a, 0x3c, 0xa4, 0x94, 0x88, 0xef, 0x1a, 0x11, 0x75, 0x07, 0x2f, 0xb3, 0xfe,\n+0x3c, 0xfa, 0x1e, 0x51, 0x26, 0xeb, 0x87, 0xf6, 0x29, 0xde, 0xe0, 0xf1, 0xd4, 0xc6, 0x24, 0x09,\n+0xe9, 0xc1, 0xcf, 0x55, 0x1b, 0xb4, 0x30, 0xd9, 0xce, 0x1a, 0xfe, 0x06, 0x51, 0xa6, 0x15, 0xa4,\n+0x2d, 0xef, 0xb2, 0x4b, 0xbf, 0x20, 0x28, 0x25, 0x49, 0xd1, 0xa6, 0x36, 0x77, 0x34, 0xe8, 0x64,\n+0xdf, 0x52, 0xb1, 0x11, 0xc7, 0x73, 0x7a, 0xcd, 0x39, 0x9e, 0xc2, 0xad, 0x8c, 0x71, 0x21, 0xf2,\n+0x5a, 0x6b, 0xaf, 0xdf, 0x3c, 0x4e, 0x55, 0xaf, 0xb2, 0x84, 0x65, 0x14, 0x89, 0xb9, 0x77, 0xcb,\n+0x2a, 0x31, 0xbe, 0xcf, 0xa3, 0x6d, 0xcf, 0x6f, 0x48, 0x94, 0x32, 0x46, 0x6f, 0xe7, 0x71, 0x8c,\n+0xa0, 0xa6, 0x84, 0x19, 0x37, 0x07, 0xf2, 0x03, 0x45, 0x09, 0x2b, 0x86, 0x75, 0x7c, 0xdf, 0x5f,\n+0x69, 0x57, 0x00, 0xdb, 0x6e, 0xd8, 0xa6, 0x72, 0x22, 0x4b, 0x50, 0xd4, 0x75, 0x98, 0x56, 0xdf,\n+0xb7, 0x18, 0xff, 0x43, 0x43, 0x50, 0xae, 0x7a, 0x44, 0x7b, 0xf0, 0x79, 0x51, 0xd7, 0x43, 0x3d,\n+0xa7, 0xd3, 0x81, 0xd3, 0xf0, 0xc9, 0x4f, 0xb9, 0xda, 0xc6, 0x97, 0x86, 0xd0, 0x82, 0xc3, 0xe4,\n+0x42, 0x6d, 0xfe, 0xb0, 0xe2, 0x64, 0x4e, 0x0e, 0x26, 0xe7, 0x40, 0x34, 0x26, 0xb5, 0x08, 0x89,\n+0xd7, 0x08, 0x63, 0x63, 0x38, 0x27, 0x75, 0x1e, 0x33, 0xea, 0x6e, 0xa8, 0xdd, 0x9f, 0x99, 0x4f,\n+0x74, 0x4d, 0x81, 0x89, 0x80, 0x4b, 0xdd, 0x9a, 0x97, 0x29, 0x5c, 0x2f, 0xbe, 0x81, 0x41, 0xb9,\n+0x8c, 0xff, 0xea, 0x7d, 0x60, 0x06, 0x9e, 0xcd, 0xd7, 0x3d, 0xd3, 0x2e, 0xa3, 0x15, 0xbc, 0xa8,\n+0xe6, 0x26, 0xe5, 0x6f, 0xc3, 0xdc, 0xb8, 0x03, 0x21, 0xea, 0x9f, 0x16, 0xf1, 0x2c, 0x54, 0xb5,\n+0x30, 0x82, 0x06, 0x4b, 0x30, 0x82, 0x04, 0x33, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x6a,\n+0x68, 0x3e, 0x9c, 0x51, 0x9b, 0xcb, 0x53, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xb2, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c,\n+0x06, 0x41, 0x6e, 0x6b, 0x61, 0x72, 0x61, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x0c, 0x37, 0x45, 0x2d, 0x54, 0x75, 0xc4, 0x9f, 0x72, 0x61, 0x20, 0x45, 0x42, 0x47, 0x20, 0x42,\n+0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a,\n+0x69, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x76, 0x65, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c,\n+0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x0c, 0x1d, 0x45, 0x2d, 0x54, 0x75, 0x67, 0x72, 0x61, 0x20, 0x53, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x72, 0x6b, 0x65, 0x7a,\n+0x69, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1f, 0x45, 0x2d, 0x54, 0x75,\n+0x67, 0x72, 0x61, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n+0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n+0x33, 0x30, 0x33, 0x30, 0x35, 0x31, 0x32, 0x30, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x33,\n+0x30, 0x33, 0x30, 0x33, 0x31, 0x32, 0x30, 0x39, 0x34, 0x38, 0x5a, 0x30, 0x81, 0xb2, 0x31, 0x0b,\n+0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06,\n+0x03, 0x55, 0x04, 0x07, 0x0c, 0x06, 0x41, 0x6e, 0x6b, 0x61, 0x72, 0x61, 0x31, 0x40, 0x30, 0x3e,\n+0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x37, 0x45, 0x2d, 0x54, 0x75, 0xc4, 0x9f, 0x72, 0x61, 0x20,\n+0x45, 0x42, 0x47, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x54, 0x65, 0x6b,\n+0x6e, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x76, 0x65, 0x20, 0x48, 0x69,\n+0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x31, 0x26,\n+0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1d, 0x45, 0x2d, 0x54, 0x75, 0x67, 0x72, 0x61,\n+0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, 0x4d,\n+0x65, 0x72, 0x6b, 0x65, 0x7a, 0x69, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n+0x1f, 0x45, 0x2d, 0x54, 0x75, 0x67, 0x72, 0x61, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n+0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01,\n+0x00, 0xe2, 0xf5, 0x3f, 0x93, 0x05, 0x51, 0x1e, 0x85, 0x62, 0x54, 0x5e, 0x7a, 0x0b, 0xf5, 0x18,\n+0x07, 0x83, 0xae, 0x7e, 0xaf, 0x7c, 0xf7, 0xd4, 0x8a, 0x6b, 0xa5, 0x63, 0x43, 0x39, 0xb9, 0x4b,\n+0xf7, 0xc3, 0xc6, 0x64, 0x89, 0x3d, 0x94, 0x2e, 0x54, 0x80, 0x52, 0x39, 0x39, 0x07, 0x4b, 0x4b,\n+0xdd, 0x85, 0x07, 0x76, 0x87, 0xcc, 0xbf, 0x2f, 0x95, 0x4c, 0xcc, 0x7d, 0xa7, 0x3d, 0xbc, 0x47,\n+0x0f, 0x98, 0x70, 0xf8, 0x8c, 0x85, 0x1e, 0x74, 0x8e, 0x92, 0x6d, 0x1b, 0x40, 0xd1, 0x99, 0x0d,\n+0xbb, 0x75, 0x6e, 0xc8, 0xa9, 0x6b, 0x9a, 0xc0, 0x84, 0x31, 0xaf, 0xca, 0x43, 0xcb, 0xeb, 0x2b,\n+0x34, 0xe8, 0x8f, 0x97, 0x6b, 0x01, 0x9b, 0xd5, 0x0e, 0x4a, 0x08, 0xaa, 0x5b, 0x92, 0x74, 0x85,\n+0x43, 0xd3, 0x80, 0xae, 0xa1, 0x88, 0x5b, 0xae, 0xb3, 0xea, 0x5e, 0xcb, 0x16, 0x9a, 0x77, 0x44,\n+0xc8, 0xa1, 0xf6, 0x54, 0x68, 0xce, 0xde, 0x8f, 0x97, 0x2b, 0xba, 0x5b, 0x40, 0x02, 0x0c, 0x64,\n+0x17, 0xc0, 0xb5, 0x93, 0xcd, 0xe1, 0xf1, 0x13, 0x66, 0xce, 0x0c, 0x79, 0xef, 0xd1, 0x91, 0x28,\n+0xab, 0x5f, 0xa0, 0x12, 0x52, 0x30, 0x73, 0x19, 0x8e, 0x8f, 0xe1, 0x8c, 0x07, 0xa2, 0xc3, 0xbb,\n+0x4a, 0xf0, 0xea, 0x1f, 0x15, 0xa8, 0xee, 0x25, 0xcc, 0xa4, 0x46, 0xf8, 0x1b, 0x22, 0xef, 0xb3,\n+0x0e, 0x43, 0xba, 0x2c, 0x24, 0xb8, 0xc5, 0x2c, 0x5c, 0xd4, 0x1c, 0xf8, 0x5d, 0x64, 0xbd, 0xc3,\n+0x93, 0x5e, 0x28, 0xa7, 0x3f, 0x27, 0xf1, 0x8e, 0x1e, 0xd3, 0x2a, 0x50, 0x05, 0xa3, 0x55, 0xd9,\n+0xcb, 0xe7, 0x39, 0x53, 0xc0, 0x98, 0x9e, 0x8c, 0x54, 0x62, 0x8b, 0x26, 0xb0, 0xf7, 0x7d, 0x8d,\n+0x7c, 0xe4, 0xc6, 0x9e, 0x66, 0x42, 0x55, 0x82, 0x47, 0xe7, 0xb2, 0x58, 0x8d, 0x66, 0xf7, 0x07,\n+0x7c, 0x2e, 0x36, 0xe6, 0x50, 0x1c, 0x3f, 0xdb, 0x43, 0x24, 0xc5, 0xbf, 0x86, 0x47, 0x79, 0xb3,\n+0x79, 0x1c, 0xf7, 0x5a, 0xf4, 0x13, 0xec, 0x6c, 0xf8, 0x3f, 0xe2, 0x59, 0x1f, 0x95, 0xee, 0x42,\n+0x3e, 0xb9, 0xad, 0xa8, 0x32, 0x85, 0x49, 0x97, 0x46, 0xfe, 0x4b, 0x31, 0x8f, 0x5a, 0xcb, 0xad,\n+0x74, 0x47, 0x1f, 0xe9, 0x91, 0xb7, 0xdf, 0x28, 0x04, 0x22, 0xa0, 0xd4, 0x0f, 0x5d, 0xe2, 0x79,\n+0x4f, 0xea, 0x6c, 0x85, 0x86, 0xbd, 0xa8, 0xa6, 0xce, 0xe4, 0xfa, 0xc3, 0xe1, 0xb3, 0xae, 0xde,\n+0x3c, 0x51, 0xee, 0xcb, 0x13, 0x7c, 0x01, 0x7f, 0x84, 0x0e, 0x5d, 0x51, 0x94, 0x9e, 0x13, 0x0c,\n+0xb6, 0x2e, 0xa5, 0x4c, 0xf9, 0x39, 0x70, 0x36, 0x6f, 0x96, 0xca, 0x2e, 0x0c, 0x44, 0x55, 0xc5,\n+0xca, 0xfa, 0x5d, 0x02, 0xa3, 0xdf, 0xd6, 0x64, 0x8c, 0x5a, 0xb3, 0x01, 0x0a, 0xa9, 0xb5, 0x0a,\n+0x47, 0x17, 0xff, 0xef, 0x91, 0x40, 0x2a, 0x8e, 0xa1, 0x46, 0x3a, 0x31, 0x98, 0xe5, 0x11, 0xfc,\n+0xcc, 0xbb, 0x49, 0x56, 0x8a, 0xfc, 0xb9, 0xd0, 0x61, 0x9a, 0x6f, 0x65, 0x6c, 0xe6, 0xc3, 0xcb,\n+0x3e, 0x75, 0x49, 0xfe, 0x8f, 0xa7, 0xe2, 0x89, 0xc5, 0x67, 0xd7, 0x9d, 0x46, 0x13, 0x4e, 0x31,\n+0x76, 0x3b, 0x24, 0xb3, 0x9e, 0x11, 0x65, 0x86, 0xab, 0x7f, 0xef, 0x1d, 0xd4, 0xf8, 0xbc, 0xe7,\n+0xac, 0x5a, 0x5c, 0xb7, 0x5a, 0x47, 0x5c, 0x55, 0xce, 0x55, 0xb4, 0x22, 0x71, 0x5b, 0x5b, 0x0b,\n+0xf0, 0xcf, 0xdc, 0xa0, 0x61, 0x64, 0xea, 0xa9, 0xd7, 0x68, 0x0a, 0x63, 0xa7, 0xe0, 0x0d, 0x3f,\n+0xa0, 0xaf, 0xd3, 0xaa, 0xd2, 0x7e, 0xef, 0x51, 0xa0, 0xe6, 0x51, 0x2b, 0x55, 0x92, 0x15, 0x17,\n+0x53, 0xcb, 0xb7, 0x66, 0x0e, 0x66, 0x4c, 0xf8, 0xf9, 0x75, 0x4c, 0x90, 0xe7, 0x12, 0x70, 0xc7,\n+0x45, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n+0x0e, 0x04, 0x16, 0x04, 0x14, 0x2e, 0xe3, 0xdb, 0xb2, 0x49, 0xd0, 0x9c, 0x54, 0x79, 0x5c, 0xfa,\n+0x27, 0x2a, 0xfe, 0xcc, 0x4e, 0xd2, 0xe8, 0x4e, 0x54, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n+0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,\n+0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x2e, 0xe3, 0xdb, 0xb2, 0x49, 0xd0, 0x9c, 0x54, 0x79,\n+0x5c, 0xfa, 0x27, 0x2a, 0xfe, 0xcc, 0x4e, 0xd2, 0xe8, 0x4e, 0x54, 0x30, 0x0e, 0x06, 0x03, 0x55,\n+0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x05,\n+0x37, 0x3a, 0xf4, 0x4d, 0xb7, 0x45, 0xe2, 0x45, 0x75, 0x24, 0x8f, 0xb6, 0x77, 0x52, 0xe8, 0x1c,\n+0xd8, 0x10, 0x93, 0x65, 0xf3, 0xf2, 0x59, 0x06, 0xa4, 0x3e, 0x1e, 0x29, 0xec, 0x5d, 0xd1, 0xd0,\n+0xab, 0x7c, 0xe0, 0x0a, 0x90, 0x48, 0x78, 0xed, 0x4e, 0x98, 0x03, 0x99, 0xfe, 0x28, 0x60, 0x91,\n+0x1d, 0x30, 0x1d, 0xb8, 0x63, 0x7c, 0xa8, 0xe6, 0x35, 0xb5, 0xfa, 0xd3, 0x61, 0x76, 0xe6, 0xd6,\n+0x07, 0x4b, 0xca, 0x69, 0x9a, 0xb2, 0x84, 0x7a, 0x77, 0x93, 0x45, 0x17, 0x15, 0x9f, 0x24, 0xd0,\n+0x98, 0x13, 0x12, 0xff, 0xbb, 0xa0, 0x2e, 0xfd, 0x4e, 0x4c, 0x87, 0xf8, 0xce, 0x5c, 0xaa, 0x98,\n+0x1b, 0x05, 0xe0, 0x00, 0x46, 0x4a, 0x82, 0x80, 0xa5, 0x33, 0x8b, 0x28, 0xdc, 0xed, 0x38, 0xd3,\n+0xdf, 0xe5, 0x3e, 0xe9, 0xfe, 0xfb, 0x59, 0xdd, 0x61, 0x84, 0x4f, 0xd2, 0x54, 0x96, 0x13, 0x61,\n+0x13, 0x3e, 0x8f, 0x80, 0x69, 0xbe, 0x93, 0x47, 0xb5, 0x35, 0x43, 0xd2, 0x5a, 0xbb, 0x3d, 0x5c,\n+0xef, 0xb3, 0x42, 0x47, 0xcd, 0x3b, 0x55, 0x13, 0x06, 0xb0, 0x09, 0xdb, 0xfd, 0x63, 0xf6, 0x3a,\n+0x88, 0x0a, 0x99, 0x6f, 0x7e, 0xe1, 0xce, 0x1b, 0x53, 0x6a, 0x44, 0x66, 0x23, 0x51, 0x08, 0x7b,\n+0xbc, 0x5b, 0x52, 0xa2, 0xfd, 0x06, 0x37, 0x38, 0x40, 0x61, 0x8f, 0x4a, 0x96, 0xb8, 0x90, 0x37,\n+0xf8, 0x66, 0xc7, 0x78, 0x90, 0x00, 0x15, 0x2e, 0x8b, 0xad, 0x51, 0x35, 0x53, 0x07, 0xa8, 0x6b,\n+0x68, 0xae, 0xf9, 0x4e, 0x3c, 0x07, 0x26, 0xcd, 0x08, 0x05, 0x70, 0xcc, 0x39, 0x3f, 0x76, 0xbd,\n+0xa5, 0xd3, 0x67, 0x26, 0x01, 0x86, 0xa6, 0x53, 0xd2, 0x60, 0x3b, 0x7c, 0x43, 0x7f, 0x55, 0x8a,\n+0xbc, 0x95, 0x1a, 0xc1, 0x28, 0x39, 0x4c, 0x1f, 0x43, 0xd2, 0x91, 0xf4, 0x72, 0x59, 0x8a, 0xb9,\n+0x56, 0xfc, 0x3f, 0xb4, 0x9d, 0xda, 0x70, 0x9c, 0x76, 0x5a, 0x8c, 0x43, 0x50, 0xee, 0x8e, 0x30,\n+0x72, 0x4d, 0xdf, 0xff, 0x49, 0xf7, 0xc6, 0xa9, 0x67, 0xd9, 0x6d, 0xac, 0x02, 0x11, 0xe2, 0x3a,\n+0x16, 0x25, 0xa7, 0x58, 0x08, 0xcb, 0x6f, 0x53, 0x41, 0x9c, 0x48, 0x38, 0x47, 0x68, 0x33, 0xd1,\n+0xd7, 0xc7, 0x8f, 0xd4, 0x74, 0x21, 0xd4, 0xc3, 0x05, 0x90, 0x7a, 0xff, 0xce, 0x96, 0x88, 0xb1,\n+0x15, 0x29, 0x5d, 0x23, 0xab, 0xd0, 0x60, 0xa1, 0x12, 0x4f, 0xde, 0xf4, 0x17, 0xcd, 0x32, 0xe5,\n+0xc9, 0xbf, 0xc8, 0x43, 0xad, 0xfd, 0x2e, 0x8e, 0xf1, 0xaf, 0xe2, 0xf4, 0x98, 0xfa, 0x12, 0x1f,\n+0x20, 0xd8, 0xc0, 0xa7, 0x0c, 0x85, 0xc5, 0x90, 0xf4, 0x3b, 0x2d, 0x96, 0x26, 0xb1, 0x2c, 0xbe,\n+0x4c, 0xab, 0xeb, 0xb1, 0xd2, 0x8a, 0xc9, 0xdb, 0x78, 0x13, 0x0f, 0x1e, 0x09, 0x9d, 0x6d, 0x8f,\n+0x00, 0x9f, 0x02, 0xda, 0xc1, 0xfa, 0x1f, 0x7a, 0x7a, 0x09, 0xc4, 0x4a, 0xe6, 0x88, 0x2a, 0x97,\n+0x9f, 0x89, 0x8b, 0xfd, 0x37, 0x5f, 0x5f, 0x3a, 0xce, 0x38, 0x59, 0x86, 0x4b, 0xaf, 0x71, 0x0b,\n+0xb4, 0xd8, 0xf2, 0x70, 0x4f, 0x9f, 0x32, 0x13, 0xe3, 0xb0, 0xa7, 0x57, 0xe5, 0xda, 0xda, 0x43,\n+0xcb, 0x84, 0x34, 0xf2, 0x28, 0xc4, 0xea, 0x6d, 0xf4, 0x2a, 0xef, 0xc1, 0x6b, 0x76, 0xda, 0xfb,\n+0x7e, 0xbb, 0x85, 0x3c, 0xd2, 0x53, 0xc2, 0x4d, 0xbe, 0x71, 0xe1, 0x45, 0xd1, 0xfd, 0x23, 0x67,\n+0x0d, 0x13, 0x75, 0xfb, 0xcf, 0x65, 0x67, 0x22, 0x9d, 0xae, 0xb0, 0x09, 0xd1, 0x09, 0xff, 0x1d,\n+0x34, 0xbf, 0xfe, 0x23, 0x97, 0x37, 0xd2, 0x39, 0xfa, 0x3d, 0x0d, 0x06, 0x0b, 0xb4, 0xdb, 0x3b,\n+0xa3, 0xab, 0x6f, 0x5c, 0x1d, 0xb6, 0x7e, 0xe8, 0xb3, 0x82, 0x34, 0xed, 0x06, 0x5c, 0x24, 0x30,\n+0x82, 0x05, 0xbd, 0x30, 0x82, 0x03, 0xa5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x4f, 0x1b,\n+0xd4, 0x2f, 0x54, 0xbb, 0x2f, 0x4b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x43, 0x48, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53,\n+0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x41, 0x47, 0x31, 0x21, 0x30, 0x1f, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20,\n+0x53, 0x69, 0x6c, 0x76, 0x65, 0x72, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e,\n+0x17, 0x0d, 0x30, 0x36, 0x31, 0x30, 0x32, 0x35, 0x30, 0x38, 0x33, 0x32, 0x34, 0x36, 0x5a, 0x17,\n+0x0d, 0x33, 0x36, 0x31, 0x30, 0x32, 0x35, 0x30, 0x38, 0x33, 0x32, 0x34, 0x36, 0x5a, 0x30, 0x47,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, 0x15, 0x30,\n+0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67,\n+0x6e, 0x20, 0x41, 0x47, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x53,\n+0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x53, 0x69, 0x6c, 0x76, 0x65, 0x72, 0x20,\n+0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n+0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30,\n+0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc4, 0xf1, 0x87, 0x7f, 0xd3, 0x78, 0x31, 0xf7,\n+0x38, 0xc9, 0xf8, 0xc3, 0x99, 0x43, 0xbc, 0xc7, 0xf7, 0xbc, 0x37, 0xe7, 0x4e, 0x71, 0xba, 0x4b,\n+0x8f, 0xa5, 0x73, 0x1d, 0x5c, 0x6e, 0x98, 0xae, 0x03, 0x57, 0xae, 0x38, 0x37, 0x43, 0x2f, 0x17,\n+0x3d, 0x1f, 0xc8, 0xce, 0x68, 0x10, 0xc1, 0x78, 0xae, 0x19, 0x03, 0x2b, 0x10, 0xfa, 0x2c, 0x79,\n+0x83, 0xf6, 0xe8, 0xb9, 0x68, 0xb9, 0x55, 0xf2, 0x04, 0x44, 0xa7, 0x39, 0xf9, 0xfc, 0x04, 0x8b,\n+0x1e, 0xf1, 0xa2, 0x4d, 0x27, 0xf9, 0x61, 0x7b, 0xba, 0xb7, 0xe5, 0xa2, 0x13, 0xb6, 0xeb, 0x61,\n+0x3e, 0xd0, 0x6c, 0xd1, 0xe6, 0xfb, 0xfa, 0x5e, 0xed, 0x1d, 0xb4, 0x9e, 0xa0, 0x35, 0x5b, 0xa1,\n+0x92, 0xcb, 0xf0, 0x49, 0x92, 0xfe, 0x85, 0x0a, 0x05, 0x3e, 0xe6, 0xd9, 0x0b, 0xe2, 0x4f, 0xbb,\n+0xdc, 0x95, 0x37, 0xfc, 0x91, 0xe9, 0x32, 0x35, 0x22, 0xd1, 0x1f, 0x3a, 0x4e, 0x27, 0x85, 0x9d,\n+0xb0, 0x15, 0x94, 0x32, 0xda, 0x61, 0x0d, 0x47, 0x4d, 0x60, 0x42, 0xae, 0x92, 0x47, 0xe8, 0x83,\n+0x5a, 0x50, 0x58, 0xe9, 0x8a, 0x8b, 0xb9, 0x5d, 0xa1, 0xdc, 0xdd, 0x99, 0x4a, 0x1f, 0x36, 0x67,\n+0xbb, 0x48, 0xe4, 0x83, 0xb6, 0x37, 0xeb, 0x48, 0x3a, 0xaf, 0x0f, 0x67, 0x8f, 0x17, 0x07, 0xe8,\n+0x04, 0xca, 0xef, 0x6a, 0x31, 0x87, 0xd4, 0xc0, 0xb6, 0xf9, 0x94, 0x71, 0x7b, 0x67, 0x64, 0xb8,\n+0xb6, 0x91, 0x4a, 0x42, 0x7b, 0x65, 0x2e, 0x30, 0x6a, 0x0c, 0xf5, 0x90, 0xee, 0x95, 0xe6, 0xf2,\n+0xcd, 0x82, 0xec, 0xd9, 0xa1, 0x4a, 0xec, 0xf6, 0xb2, 0x4b, 0xe5, 0x45, 0x85, 0xe6, 0x6d, 0x78,\n+0x93, 0x04, 0x2e, 0x9c, 0x82, 0x6d, 0x36, 0xa9, 0xc4, 0x31, 0x64, 0x1f, 0x86, 0x83, 0x0b, 0x2a,\n+0xf4, 0x35, 0x0a, 0x78, 0xc9, 0x55, 0xcf, 0x41, 0xb0, 0x47, 0xe9, 0x30, 0x9f, 0x99, 0xbe, 0x61,\n+0xa8, 0x06, 0x84, 0xb9, 0x28, 0x7a, 0x5f, 0x38, 0xd9, 0x1b, 0xa9, 0x38, 0xb0, 0x83, 0x7f, 0x73,\n+0xc1, 0xc3, 0x3b, 0x48, 0x2a, 0x82, 0x0f, 0x21, 0x9b, 0xb8, 0xcc, 0xa8, 0x35, 0xc3, 0x84, 0x1b,\n+0x83, 0xb3, 0x3e, 0xbe, 0xa4, 0x95, 0x69, 0x01, 0x3a, 0x89, 0x00, 0x78, 0x04, 0xd9, 0xc9, 0xf4,\n+0x99, 0x19, 0xab, 0x56, 0x7e, 0x5b, 0x8b, 0x86, 0x39, 0x15, 0x91, 0xa4, 0x10, 0x2c, 0x09, 0x32,\n+0x80, 0x60, 0xb3, 0x93, 0xc0, 0x2a, 0xb6, 0x18, 0x0b, 0x9d, 0x7e, 0x8d, 0x49, 0xf2, 0x10, 0x4a,\n+0x7f, 0xf9, 0xd5, 0x46, 0x2f, 0x19, 0x92, 0xa3, 0x99, 0xa7, 0x26, 0xac, 0xbb, 0x8c, 0x3c, 0xe6,\n+0x0e, 0xbc, 0x47, 0x07, 0xdc, 0x73, 0x51, 0xf1, 0x70, 0x64, 0x2f, 0x08, 0xf9, 0xb4, 0x47, 0x1d,\n+0x30, 0x6c, 0x44, 0xea, 0x29, 0x37, 0x85, 0x92, 0x68, 0x66, 0xbc, 0x83, 0x38, 0xfe, 0x7b, 0x39,\n+0x2e, 0xd3, 0x50, 0xf0, 0x1f, 0xfb, 0x5e, 0x60, 0xb6, 0xa9, 0xa6, 0xfa, 0x27, 0x41, 0xf1, 0x9b,\n+0x18, 0x72, 0xf2, 0xf5, 0x84, 0x74, 0x4a, 0xc9, 0x67, 0xc4, 0x54, 0xae, 0x48, 0x64, 0xdf, 0x8c,\n+0xd1, 0x6e, 0xb0, 0x1d, 0xe1, 0x07, 0x8f, 0x08, 0x1e, 0x99, 0x9c, 0x71, 0xe9, 0x4c, 0xd8, 0xa5,\n+0xf7, 0x47, 0x12, 0x1f, 0x74, 0xd1, 0x51, 0x9e, 0x86, 0xf3, 0xc2, 0xa2, 0x23, 0x40, 0x0b, 0x73,\n+0xdb, 0x4b, 0xa6, 0xe7, 0x73, 0x06, 0x8c, 0xc1, 0xa0, 0xe9, 0xc1, 0x59, 0xac, 0x46, 0xfa, 0xe6,\n+0x2f, 0xf8, 0xcf, 0x71, 0x9c, 0x46, 0x6d, 0xb9, 0xc4, 0x15, 0x8d, 0x38, 0x79, 0x03, 0x45, 0x48,\n+0xef, 0xc4, 0x5d, 0xd7, 0x08, 0xee, 0x87, 0x39, 0x22, 0x86, 0xb2, 0x0d, 0x0f, 0x58, 0x43, 0xf7,\n+0x71, 0xa9, 0x48, 0x2e, 0xfd, 0xea, 0xd6, 0x1f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xac,\n+0x30, 0x81, 0xa9, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n+0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x17,\n+0xa0, 0xcd, 0xc1, 0xe4, 0x41, 0xb6, 0x3a, 0x5b, 0x3b, 0xcb, 0x45, 0x9d, 0xbd, 0x1c, 0xc2, 0x98,\n+0xfa, 0x86, 0x58, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,\n+0x17, 0xa0, 0xcd, 0xc1, 0xe4, 0x41, 0xb6, 0x3a, 0x5b, 0x3b, 0xcb, 0x45, 0x9d, 0xbd, 0x1c, 0xc2,\n+0x98, 0xfa, 0x86, 0x58, 0x30, 0x46, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3f, 0x30, 0x3d, 0x30,\n+0x3b, 0x06, 0x09, 0x60, 0x85, 0x74, 0x01, 0x59, 0x01, 0x03, 0x01, 0x01, 0x30, 0x2e, 0x30, 0x2c,\n+0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x20, 0x68, 0x74, 0x74, 0x70,\n+0x3a, 0x2f, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x73, 0x77,\n+0x69, 0x73, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00,\n+0x73, 0xc6, 0x81, 0xe0, 0x27, 0xd2, 0x2d, 0x0f, 0xe0, 0x95, 0x30, 0xe2, 0x9a, 0x41, 0x7f, 0x50,\n+0x2c, 0x5f, 0x5f, 0x62, 0x61, 0xa9, 0x86, 0x6a, 0x69, 0x18, 0x0c, 0x74, 0x49, 0xd6, 0x5d, 0x84,\n+0xea, 0x41, 0x52, 0x18, 0x6f, 0x58, 0xad, 0x50, 0x56, 0x20, 0x6a, 0xc6, 0xbd, 0x28, 0x69, 0x58,\n+0x91, 0xdc, 0x91, 0x11, 0x35, 0xa9, 0x3a, 0x1d, 0xbc, 0x1a, 0xa5, 0x60, 0x9e, 0xd8, 0x1f, 0x7f,\n+0x45, 0x91, 0x69, 0xd9, 0x7e, 0xbb, 0x78, 0x72, 0xc1, 0x06, 0x0f, 0x2a, 0xce, 0x8f, 0x85, 0x70,\n+0x61, 0xac, 0xa0, 0xcd, 0x0b, 0xb8, 0x39, 0x29, 0x56, 0x84, 0x32, 0x4e, 0x86, 0xbb, 0x3d, 0xc4,\n+0x2a, 0xd9, 0xd7, 0x1f, 0x72, 0xee, 0xfe, 0x51, 0xa1, 0x22, 0x41, 0xb1, 0x71, 0x02, 0x63, 0x1a,\n+0x82, 0xb0, 0x62, 0xab, 0x5e, 0x57, 0x12, 0x1f, 0xdf, 0xcb, 0xdd, 0x75, 0xa0, 0xc0, 0x5d, 0x79,\n+0x90, 0x8c, 0x1b, 0xe0, 0x50, 0xe6, 0xde, 0x31, 0xfe, 0x98, 0x7b, 0x70, 0x5f, 0xa5, 0x90, 0xd8,\n+0xad, 0xf8, 0x02, 0xb6, 0x6f, 0xd3, 0x60, 0xdd, 0x40, 0x4b, 0x22, 0xc5, 0x3d, 0xad, 0x3a, 0x7a,\n+0x9f, 0x1a, 0x1a, 0x47, 0x91, 0x79, 0x33, 0xba, 0x82, 0xdc, 0x32, 0x69, 0x03, 0x96, 0x6e, 0x1f,\n+0x4b, 0xf0, 0x71, 0xfe, 0xe3, 0x67, 0x72, 0xa0, 0xb1, 0xbf, 0x5c, 0x8b, 0xe4, 0xfa, 0x99, 0x22,\n+0xc7, 0x84, 0xb9, 0x1b, 0x8d, 0x23, 0x97, 0x3f, 0xed, 0x25, 0xe0, 0xcf, 0x65, 0xbb, 0xf5, 0x61,\n+0x04, 0xef, 0xdd, 0x1e, 0xb2, 0x5a, 0x41, 0x22, 0x5a, 0xa1, 0x9f, 0x5d, 0x2c, 0xe8, 0x5b, 0xc9,\n+0x6d, 0xa9, 0x0c, 0x0c, 0x78, 0xaa, 0x60, 0xc6, 0x56, 0x8f, 0x01, 0x5a, 0x0c, 0x68, 0xbc, 0x69,\n+0x19, 0x79, 0xc4, 0x1f, 0x7e, 0x97, 0x05, 0xbf, 0xc5, 0xe9, 0x24, 0x51, 0x5e, 0xd4, 0xd5, 0x4b,\n+0x53, 0xed, 0xd9, 0x23, 0x5a, 0x36, 0x03, 0x65, 0xa3, 0xc1, 0x03, 0xad, 0x41, 0x30, 0xf3, 0x46,\n+0x1b, 0x85, 0x90, 0xaf, 0x65, 0xb5, 0xd5, 0xb1, 0xe4, 0x16, 0x5b, 0x78, 0x75, 0x1d, 0x97, 0x7a,\n+0x6d, 0x59, 0xa9, 0x2a, 0x8f, 0x7b, 0xde, 0xc3, 0x87, 0x89, 0x10, 0x99, 0x49, 0x73, 0x78, 0xc8,\n+0x3d, 0xbd, 0x51, 0x35, 0x74, 0x2a, 0xd5, 0xf1, 0x7e, 0x69, 0x1b, 0x2a, 0xbb, 0x3b, 0xbd, 0x25,\n+0xb8, 0x9a, 0x5a, 0x3d, 0x72, 0x61, 0x90, 0x66, 0x87, 0xee, 0x0c, 0xd6, 0x4d, 0xd4, 0x11, 0x74,\n+0x0b, 0x6a, 0xfe, 0x0b, 0x03, 0xfc, 0xa3, 0x55, 0x57, 0x89, 0xfe, 0x4a, 0xcb, 0xae, 0x5b, 0x17,\n+0x05, 0xc8, 0xf2, 0x8d, 0x23, 0x31, 0x53, 0x38, 0xd2, 0x2d, 0x6a, 0x3f, 0x82, 0xb9, 0x8d, 0x08,\n+0x6a, 0xf7, 0x5e, 0x41, 0x74, 0x6e, 0xc3, 0x11, 0x7e, 0x07, 0xac, 0x29, 0x60, 0x91, 0x3f, 0x38,\n+0xca, 0x57, 0x10, 0x0d, 0xbd, 0x30, 0x2f, 0xc7, 0xa5, 0xe6, 0x41, 0xa0, 0xda, 0xae, 0x05, 0x87,\n+0x9a, 0xa0, 0xa4, 0x65, 0x6c, 0x4c, 0x09, 0x0c, 0x89, 0xba, 0xb8, 0xd3, 0xb9, 0xc0, 0x93, 0x8a,\n+0x30, 0xfa, 0x8d, 0xe5, 0x9a, 0x6b, 0x15, 0x01, 0x4e, 0x67, 0xaa, 0xda, 0x62, 0x56, 0x3e, 0x84,\n+0x08, 0x66, 0xd2, 0xc4, 0x36, 0x7d, 0xa7, 0x3e, 0x10, 0xfc, 0x88, 0xe0, 0xd4, 0x80, 0xe5, 0x00,\n+0xbd, 0xaa, 0xf3, 0x4e, 0x06, 0xa3, 0x7a, 0x6a, 0xf9, 0x62, 0x72, 0xe3, 0x09, 0x4f, 0xeb, 0x9b,\n+0x0e, 0x01, 0x23, 0xf1, 0x9f, 0xbb, 0x7c, 0xdc, 0xdc, 0x6c, 0x11, 0x97, 0x25, 0xb2, 0xf2, 0xb4,\n+0x63, 0x14, 0xd2, 0x06, 0x2a, 0x67, 0x8c, 0x83, 0xf5, 0xce, 0xea, 0x07, 0xd8, 0x9a, 0x6a, 0x1e,\n+0xec, 0xe4, 0x0a, 0xbb, 0x2a, 0x4c, 0xeb, 0x09, 0x60, 0x39, 0xce, 0xca, 0x62, 0xd8, 0x2e, 0x6e,\n+0x30, 0x82, 0x04, 0x30, 0x30, 0x82, 0x03, 0x18, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x50,\n+0x94, 0x6c, 0xec, 0x18, 0xea, 0xd5, 0x9c, 0x4d, 0xd5, 0x97, 0xef, 0x75, 0x8f, 0xa0, 0xad, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81,\n+0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e,\n+0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x15, 0x77, 0x77, 0x77, 0x2e, 0x78, 0x72, 0x61,\n+0x6d, 0x70, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24,\n+0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x58, 0x52, 0x61, 0x6d, 0x70, 0x20, 0x53,\n+0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73,\n+0x20, 0x49, 0x6e, 0x63, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x58,\n+0x52, 0x61, 0x6d, 0x70, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74,\n+0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,\n+0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x31, 0x31, 0x30, 0x31, 0x31, 0x37, 0x31,\n+0x34, 0x30, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x35, 0x30, 0x31, 0x30, 0x31, 0x30, 0x35, 0x33, 0x37,\n+0x31, 0x39, 0x5a, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n+0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x15, 0x77, 0x77,\n+0x77, 0x2e, 0x78, 0x72, 0x61, 0x6d, 0x70, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e,\n+0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x58, 0x52,\n+0x61, 0x6d, 0x70, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x53, 0x65, 0x72,\n+0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55,\n+0x04, 0x03, 0x13, 0x24, 0x58, 0x52, 0x61, 0x6d, 0x70, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c,\n+0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41,\n+0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,\n+0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x98, 0x24, 0x1e, 0xbd, 0x15, 0xb4, 0xba,\n+0xdf, 0xc7, 0x8c, 0xa5, 0x27, 0xb6, 0x38, 0x0b, 0x69, 0xf3, 0xb6, 0x4e, 0xa8, 0x2c, 0x2e, 0x21,\n+0x1d, 0x5c, 0x44, 0xdf, 0x21, 0x5d, 0x7e, 0x23, 0x74, 0xfe, 0x5e, 0x7e, 0xb4, 0x4a, 0xb7, 0xa6,\n+0xad, 0x1f, 0xae, 0xe0, 0x06, 0x16, 0xe2, 0x9b, 0x5b, 0xd9, 0x67, 0x74, 0x6b, 0x5d, 0x80, 0x8f,\n+0x29, 0x9d, 0x86, 0x1b, 0xd9, 0x9c, 0x0d, 0x98, 0x6d, 0x76, 0x10, 0x28, 0x58, 0xe4, 0x65, 0xb0,\n+0x7f, 0x4a, 0x98, 0x79, 0x9f, 0xe0, 0xc3, 0x31, 0x7e, 0x80, 0x2b, 0xb5, 0x8c, 0xc0, 0x40, 0x3b,\n+0x11, 0x86, 0xd0, 0xcb, 0xa2, 0x86, 0x36, 0x60, 0xa4, 0xd5, 0x30, 0x82, 0x6d, 0xd9, 0x6e, 0xd0,\n+0x0f, 0x12, 0x04, 0x33, 0x97, 0x5f, 0x4f, 0x61, 0x5a, 0xf0, 0xe4, 0xf9, 0x91, 0xab, 0xe7, 0x1d,\n+0x3b, 0xbc, 0xe8, 0xcf, 0xf4, 0x6b, 0x2d, 0x34, 0x7c, 0xe2, 0x48, 0x61, 0x1c, 0x8e, 0xf3, 0x61,\n+0x44, 0xcc, 0x6f, 0xa0, 0x4a, 0xa9, 0x94, 0xb0, 0x4d, 0xda, 0xe7, 0xa9, 0x34, 0x7a, 0x72, 0x38,\n+0xa8, 0x41, 0xcc, 0x3c, 0x94, 0x11, 0x7d, 0xeb, 0xc8, 0xa6, 0x8c, 0xb7, 0x86, 0xcb, 0xca, 0x33,\n+0x3b, 0xd9, 0x3d, 0x37, 0x8b, 0xfb, 0x7a, 0x3e, 0x86, 0x2c, 0xe7, 0x73, 0xd7, 0x0a, 0x57, 0xac,\n+0x64, 0x9b, 0x19, 0xeb, 0xf4, 0x0f, 0x04, 0x08, 0x8a, 0xac, 0x03, 0x17, 0x19, 0x64, 0xf4, 0x5a,\n+0x25, 0x22, 0x8d, 0x34, 0x2c, 0xb2, 0xf6, 0x68, 0x1d, 0x12, 0x6d, 0xd3, 0x8a, 0x1e, 0x14, 0xda,\n+0xc4, 0x8f, 0xa6, 0xe2, 0x23, 0x85, 0xd5, 0x7a, 0x0d, 0xbd, 0x6a, 0xe0, 0xe9, 0xec, 0xec, 0x17,\n+0xbb, 0x42, 0x1b, 0x67, 0xaa, 0x25, 0xed, 0x45, 0x83, 0x21, 0xfc, 0xc1, 0xc9, 0x7c, 0xd5, 0x62,\n+0x3e, 0xfa, 0xf2, 0xc5, 0x2d, 0xd3, 0xfd, 0xd4, 0x65, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81,\n+0x9f, 0x30, 0x81, 0x9c, 0x30, 0x13, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14,\n+0x02, 0x04, 0x06, 0x1e, 0x04, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f,\n+0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n+0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n+0x04, 0x14, 0xc6, 0x4f, 0xa2, 0x3d, 0x06, 0x63, 0x84, 0x09, 0x9c, 0xce, 0x62, 0xe4, 0x04, 0xac,\n+0x8d, 0x5c, 0xb5, 0xe9, 0xb6, 0x1b, 0x30, 0x36, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2f, 0x30,\n+0x2d, 0x30, 0x2b, 0xa0, 0x29, 0xa0, 0x27, 0x86, 0x25, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,\n+0x63, 0x72, 0x6c, 0x2e, 0x78, 0x72, 0x61, 0x6d, 0x70, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,\n+0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x58, 0x47, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x10,\n+0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x01,\n+0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,\n+0x82, 0x01, 0x01, 0x00, 0x91, 0x15, 0x39, 0x03, 0x01, 0x1b, 0x67, 0xfb, 0x4a, 0x1c, 0xf9, 0x0a,\n+0x60, 0x5b, 0xa1, 0xda, 0x4d, 0x97, 0x62, 0xf9, 0x24, 0x53, 0x27, 0xd7, 0x82, 0x64, 0x4e, 0x90,\n+0x2e, 0xc3, 0x49, 0x1b, 0x2b, 0x9a, 0xdc, 0xfc, 0xa8, 0x78, 0x67, 0x35, 0xf1, 0x1d, 0xf0, 0x11,\n+0xbd, 0xb7, 0x48, 0xe3, 0x10, 0xf6, 0x0d, 0xdf, 0x3f, 0xd2, 0xc9, 0xb6, 0xaa, 0x55, 0xa4, 0x48,\n+0xba, 0x02, 0xdb, 0xde, 0x59, 0x2e, 0x15, 0x5b, 0x3b, 0x9d, 0x16, 0x7d, 0x47, 0xd7, 0x37, 0xea,\n+0x5f, 0x4d, 0x76, 0x12, 0x36, 0xbb, 0x1f, 0xd7, 0xa1, 0x81, 0x04, 0x46, 0x20, 0xa3, 0x2c, 0x6d,\n+0xa9, 0x9e, 0x01, 0x7e, 0x3f, 0x29, 0xce, 0x00, 0x93, 0xdf, 0xfd, 0xc9, 0x92, 0x73, 0x89, 0x89,\n+0x64, 0x9e, 0xe7, 0x2b, 0xe4, 0x1c, 0x91, 0x2c, 0xd2, 0xb9, 0xce, 0x7d, 0xce, 0x6f, 0x31, 0x99,\n+0xd3, 0xe6, 0xbe, 0xd2, 0x1e, 0x90, 0xf0, 0x09, 0x14, 0x79, 0x5c, 0x23, 0xab, 0x4d, 0xd2, 0xda,\n+0x21, 0x1f, 0x4d, 0x99, 0x79, 0x9d, 0xe1, 0xcf, 0x27, 0x9f, 0x10, 0x9b, 0x1c, 0x88, 0x0d, 0xb0,\n+0x8a, 0x64, 0x41, 0x31, 0xb8, 0x0e, 0x6c, 0x90, 0x24, 0xa4, 0x9b, 0x5c, 0x71, 0x8f, 0xba, 0xbb,\n+0x7e, 0x1c, 0x1b, 0xdb, 0x6a, 0x80, 0x0f, 0x21, 0xbc, 0xe9, 0xdb, 0xa6, 0xb7, 0x40, 0xf4, 0xb2,\n+0x8b, 0xa9, 0xb1, 0xe4, 0xef, 0x9a, 0x1a, 0xd0, 0x3d, 0x69, 0x99, 0xee, 0xa8, 0x28, 0xa3, 0xe1,\n+0x3c, 0xb3, 0xf0, 0xb2, 0x11, 0x9c, 0xcf, 0x7c, 0x40, 0xe6, 0xdd, 0xe7, 0x43, 0x7d, 0xa2, 0xd8,\n+0x3a, 0xb5, 0xa9, 0x8d, 0xf2, 0x34, 0x99, 0xc4, 0xd4, 0x10, 0xe1, 0x06, 0xfd, 0x09, 0x84, 0x10,\n+0x3b, 0xee, 0xc4, 0x4c, 0xf4, 0xec, 0x27, 0x7c, 0x42, 0xc2, 0x74, 0x7c, 0x82, 0x8a, 0x09, 0xc9,\n+0xb4, 0x03, 0x25, 0xbc, 0x30, 0x82, 0x01, 0xe1, 0x30, 0x82, 0x01, 0x87, 0xa0, 0x03, 0x02, 0x01,\n+0x02, 0x02, 0x11, 0x2a, 0x38, 0xa4, 0x1c, 0x96, 0x0a, 0x04, 0xde, 0x42, 0xb2, 0x28, 0xa5, 0x0b,\n+0xe8, 0x34, 0x98, 0x02, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,\n+0x30, 0x50, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47, 0x6c, 0x6f,\n+0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n+0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x34, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30,\n+0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69,\n+0x67, 0x6e, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x31, 0x31, 0x31, 0x33, 0x30, 0x30, 0x30, 0x30,\n+0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x39, 0x30, 0x33, 0x31, 0x34, 0x30,\n+0x37, 0x5a, 0x30, 0x50, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47,\n+0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x34, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,\n+0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31,\n+0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c,\n+0x53, 0x69, 0x67, 0x6e, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,\n+0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xb8,\n+0xc6, 0x79, 0xd3, 0x8f, 0x6c, 0x25, 0x0e, 0x9f, 0x2e, 0x39, 0x19, 0x1c, 0x03, 0xa4, 0xae, 0x9a,\n+0xe5, 0x39, 0x07, 0x09, 0x16, 0xca, 0x63, 0xb1, 0xb9, 0x86, 0xf8, 0x8a, 0x57, 0xc1, 0x57, 0xce,\n+0x42, 0xfa, 0x73, 0xa1, 0xf7, 0x65, 0x42, 0xff, 0x1e, 0xc1, 0x00, 0xb2, 0x6e, 0x73, 0x0e, 0xff,\n+0xc7, 0x21, 0xe5, 0x18, 0xa4, 0xaa, 0xd9, 0x71, 0x3f, 0xa8, 0xd4, 0xb9, 0xce, 0x8c, 0x1d, 0xa3,\n+0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n+0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n+0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x54,\n+0xb0, 0x7b, 0xad, 0x45, 0xb8, 0xe2, 0x40, 0x7f, 0xfb, 0x0a, 0x6e, 0xfb, 0xbe, 0x33, 0xc9, 0x3c,\n+0xa3, 0x84, 0xd5, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,\n+0x48, 0x00, 0x30, 0x45, 0x02, 0x21, 0x00, 0xdc, 0x92, 0xa1, 0xa0, 0x13, 0xa6, 0xcf, 0x03, 0xb0,\n+0xe6, 0xc4, 0x21, 0x97, 0x90, 0xfa, 0x14, 0x57, 0x2d, 0x03, 0xec, 0xee, 0x3c, 0xd3, 0x6e, 0xca,\n+0xa8, 0x6c, 0x76, 0xbc, 0xa2, 0xde, 0xbb, 0x02, 0x20, 0x27, 0xa8, 0x85, 0x27, 0x35, 0x9b, 0x56,\n+0xc6, 0xa3, 0xf2, 0x47, 0xd2, 0xb7, 0x6e, 0x1b, 0x02, 0x00, 0x17, 0xaa, 0x67, 0xa6, 0x15, 0x91,\n+0xde, 0xfa, 0x94, 0xec, 0x7b, 0x0b, 0xf8, 0x9f, 0x84, 0x30, 0x82, 0x06, 0x4b, 0x30, 0x82, 0x04,\n+0x33, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0xd9, 0xb5, 0x43, 0x7f, 0xaf, 0xa9, 0x39,\n+0x0f, 0x00, 0x00, 0x00, 0x00, 0x55, 0x65, 0xad, 0x58, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n+0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xbe, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04,\n+0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,\n+0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, 0x65, 0x20, 0x77,\n+0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x6c,\n+0x65, 0x67, 0x61, 0x6c, 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03,\n+0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x35, 0x20, 0x45, 0x6e,\n+0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x66, 0x6f,\n+0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65,\n+0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29,\n+0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n+0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n+0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x34, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30,\n+0x35, 0x32, 0x37, 0x31, 0x31, 0x31, 0x31, 0x31, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32,\n+0x32, 0x37, 0x31, 0x31, 0x34, 0x31, 0x31, 0x36, 0x5a, 0x30, 0x81, 0xbe, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63,\n+0x2e, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, 0x65, 0x20,\n+0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f,\n+0x6c, 0x65, 0x67, 0x61, 0x6c, 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x31, 0x39, 0x30, 0x37, 0x06,\n+0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x35, 0x20, 0x45,\n+0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x66,\n+0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73,\n+0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+0x29, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65,\n+0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n+0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x34, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d,\n+0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02,\n+0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb1, 0xec, 0x2c, 0x42, 0xee,\n+0xe2, 0xd1, 0x30, 0xff, 0xa5, 0x92, 0x47, 0xe2, 0x2d, 0xc3, 0xba, 0x64, 0x97, 0x6d, 0xca, 0xf7,\n+0x0d, 0xb5, 0x59, 0xc1, 0xb3, 0xcb, 0xa8, 0x68, 0x19, 0xd8, 0xaf, 0x84, 0x6d, 0x30, 0x70, 0x5d,\n+0x7e, 0xf3, 0x2e, 0xd2, 0x53, 0x99, 0xe1, 0xfe, 0x1f, 0x5e, 0xd9, 0x48, 0xaf, 0x5d, 0x13, 0x8d,\n+0xdb, 0xff, 0x63, 0x33, 0x4d, 0xd3, 0x00, 0x02, 0xbc, 0xc4, 0xf8, 0xd1, 0x06, 0x08, 0x94, 0x79,\n+0x58, 0x8a, 0x15, 0xde, 0x29, 0xb3, 0xfd, 0xfd, 0xc4, 0x4f, 0xe8, 0xaa, 0xe2, 0xa0, 0x3b, 0x79,\n+0xcd, 0xbf, 0x6b, 0x43, 0x32, 0xdd, 0xd9, 0x74, 0x10, 0xb9, 0xf7, 0xf4, 0x68, 0xd4, 0xbb, 0xd0,\n+0x87, 0xd5, 0xaa, 0x4b, 0x8a, 0x2a, 0x6f, 0x2a, 0x04, 0xb5, 0xb2, 0xa6, 0xc7, 0xa0, 0x7a, 0xe6,\n+0x48, 0xab, 0xd2, 0xd1, 0x59, 0xcc, 0xd6, 0x7e, 0x23, 0xe6, 0x97, 0x6c, 0xf0, 0x42, 0xe5, 0xdc,\n+0x51, 0x4b, 0x15, 0x41, 0xed, 0x49, 0x4a, 0xc9, 0xde, 0x10, 0x97, 0xd6, 0x76, 0xc1, 0xef, 0xa5,\n+0xb5, 0x36, 0x14, 0x97, 0x35, 0xd8, 0x78, 0x22, 0x35, 0x52, 0xef, 0x43, 0xbd, 0xdb, 0x27, 0xdb,\n+0x61, 0x56, 0x82, 0x34, 0xdc, 0xcb, 0x88, 0x60, 0x0c, 0x0b, 0x5a, 0xe5, 0x2c, 0x01, 0xc6, 0x54,\n+0xaf, 0xd7, 0xaa, 0xc1, 0x10, 0x7b, 0xd2, 0x05, 0x5a, 0xb8, 0x40, 0x9e, 0x86, 0xa7, 0xc3, 0x90,\n+0x86, 0x02, 0x56, 0x52, 0x09, 0x7a, 0x9c, 0xd2, 0x27, 0x82, 0x53, 0x4a, 0x65, 0x52, 0x6a, 0xf5,\n+0x3c, 0xe7, 0xa8, 0xf2, 0x9c, 0xaf, 0x8b, 0xbd, 0xd3, 0x0e, 0xd4, 0xd4, 0x5e, 0x6e, 0x87, 0x9e,\n+0x6a, 0x3d, 0x45, 0x1d, 0xd1, 0x5d, 0x1b, 0xf4, 0xe9, 0x0a, 0xac, 0x60, 0x99, 0xfb, 0x89, 0xb4,\n+0xff, 0x98, 0x2c, 0xcf, 0x7c, 0x1d, 0xe9, 0x02, 0xaa, 0x04, 0x9a, 0x1e, 0xb8, 0xdc, 0x88, 0x6e,\n+0x25, 0xb3, 0x6c, 0x66, 0xf7, 0x3c, 0x90, 0xf3, 0x57, 0xc1, 0xb3, 0x2f, 0xf5, 0x6d, 0xf2, 0xfb,\n+0xca, 0xa1, 0xf8, 0x29, 0x9d, 0x46, 0x8b, 0xb3, 0x6a, 0xf6, 0xe6, 0x67, 0x07, 0xbe, 0x2c, 0x67,\n+0x0a, 0x2a, 0x1f, 0x5a, 0xb2, 0x3e, 0x57, 0xc4, 0xd3, 0x21, 0x21, 0x63, 0x65, 0x52, 0x91, 0x1b,\n+0xb1, 0x99, 0x8e, 0x79, 0x7e, 0xe6, 0xeb, 0x8d, 0x00, 0xd9, 0x5a, 0xaa, 0xea, 0x73, 0xe8, 0xa4,\n+0x82, 0x02, 0x47, 0x96, 0xfe, 0x5b, 0x8e, 0x54, 0x61, 0xa3, 0xeb, 0x2f, 0x4b, 0x30, 0xb0, 0x8b,\n+0x23, 0x75, 0x72, 0x7c, 0x21, 0x3c, 0xc8, 0xf6, 0xf1, 0x74, 0xd4, 0x1c, 0x7b, 0xa3, 0x05, 0x55,\n+0xee, 0xbb, 0x4d, 0x3b, 0x32, 0xbe, 0x9a, 0x77, 0x66, 0x9e, 0xac, 0x69, 0x90, 0x22, 0x07, 0x1f,\n+0x61, 0x3a, 0x96, 0xbe, 0xe5, 0x9a, 0x4f, 0xcc, 0x05, 0x3c, 0x28, 0x59, 0xd3, 0xc1, 0x0c, 0x54,\n+0xa8, 0x59, 0x61, 0xbd, 0xc8, 0x72, 0x4c, 0xe8, 0xdc, 0x9f, 0x87, 0x7f, 0xbd, 0x9c, 0x48, 0x36,\n+0x5e, 0x95, 0xa3, 0x0e, 0xb9, 0x38, 0x24, 0x55, 0xfc, 0x75, 0x66, 0xeb, 0x02, 0xe3, 0x08, 0x34,\n+0x29, 0x4a, 0xc6, 0xe3, 0x2b, 0x2f, 0x33, 0xa0, 0xda, 0xa3, 0x86, 0xa5, 0x12, 0x97, 0xfd, 0x80,\n+0x2b, 0xda, 0x14, 0x42, 0xe3, 0x92, 0xbd, 0x3e, 0xf2, 0x5d, 0x5e, 0x67, 0x74, 0x2e, 0x1c, 0x88,\n+0x47, 0x29, 0x34, 0x5f, 0xe2, 0x32, 0xa8, 0x9c, 0x25, 0x37, 0x8c, 0xba, 0x98, 0x00, 0x97, 0x8b,\n+0x49, 0x96, 0x1e, 0xfd, 0x25, 0x8a, 0xac, 0xdc, 0xda, 0xd8, 0x5d, 0x74, 0x6e, 0x66, 0xb0, 0xff,\n+0x44, 0xdf, 0xa1, 0x18, 0xc6, 0xbe, 0x48, 0x2f, 0x37, 0x94, 0x78, 0xf8, 0x95, 0x4a, 0x3f, 0x7f,\n+0x13, 0x5e, 0x5d, 0x59, 0xfd, 0x74, 0x86, 0x43, 0x63, 0x73, 0x49, 0x02, 0x03, 0x01, 0x00, 0x01,\n+0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n+0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n+0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+0x9f, 0x38, 0xc4, 0x56, 0x23, 0xc3, 0x39, 0xe8, 0xa0, 0x71, 0x6c, 0xe8, 0x54, 0x4c, 0xe4, 0xe8,\n+0x3a, 0xb1, 0xbf, 0x67, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x12, 0xe5, 0x42, 0xa6, 0x7b, 0x8b, 0x0f, 0x0c,\n+0xe4, 0x46, 0xa5, 0xb6, 0x60, 0x40, 0x87, 0x8c, 0x25, 0x7e, 0xad, 0xb8, 0x68, 0x2e, 0x5b, 0xc6,\n+0x40, 0x76, 0x3c, 0x03, 0xf8, 0xc9, 0x59, 0xf4, 0xf3, 0xab, 0x62, 0xce, 0x10, 0x8d, 0xb4, 0x5a,\n+0x64, 0x8c, 0x68, 0xc0, 0xb0, 0x72, 0x43, 0x34, 0xd2, 0x1b, 0x0b, 0xf6, 0x2c, 0x53, 0xd2, 0xca,\n+0x90, 0x4b, 0x86, 0x66, 0xfc, 0xaa, 0x83, 0x22, 0xf4, 0x8b, 0x1a, 0x6f, 0x26, 0x48, 0xac, 0x76,\n+0x77, 0x08, 0xbf, 0xc5, 0x98, 0x5c, 0xf4, 0x26, 0x89, 0x9e, 0x7b, 0xc3, 0xb9, 0x64, 0x32, 0x01,\n+0x7f, 0xd3, 0xc3, 0xdd, 0x58, 0x6d, 0xec, 0xb1, 0xab, 0x84, 0x55, 0x74, 0x77, 0x84, 0x04, 0x27,\n+0x52, 0x6b, 0x86, 0x4c, 0xce, 0xdd, 0xb9, 0x65, 0xff, 0xd6, 0xc6, 0x5e, 0x9f, 0x9a, 0x10, 0x99,\n+0x4b, 0x75, 0x6a, 0xfe, 0x6a, 0xe9, 0x97, 0x20, 0xe4, 0xe4, 0x76, 0x7a, 0xc6, 0xd0, 0x24, 0xaa,\n+0x90, 0xcd, 0x20, 0x90, 0xba, 0x47, 0x64, 0xfb, 0x7f, 0x07, 0xb3, 0x53, 0x78, 0xb5, 0x0a, 0x62,\n+0xf2, 0x73, 0x43, 0xce, 0x41, 0x2b, 0x81, 0x6a, 0x2e, 0x85, 0x16, 0x94, 0x53, 0xd4, 0x6b, 0x5f,\n+0x72, 0x22, 0xab, 0x51, 0x2d, 0x42, 0xd5, 0x00, 0x9c, 0x99, 0xbf, 0xde, 0xbb, 0x94, 0x3b, 0x57,\n+0xfd, 0x9a, 0xf5, 0x86, 0xcb, 0x56, 0x3b, 0x5b, 0x88, 0x01, 0xe5, 0x7c, 0x28, 0x4b, 0x03, 0xf9,\n+0x49, 0x83, 0x7c, 0xb2, 0x7f, 0x7c, 0xe3, 0xed, 0x8e, 0xa1, 0x7f, 0x60, 0x53, 0x8e, 0x55, 0x9d,\n+0x50, 0x34, 0x12, 0x0f, 0xb7, 0x97, 0x7b, 0x6c, 0x87, 0x4a, 0x44, 0xe7, 0xf5, 0x6d, 0xec, 0x80,\n+0x37, 0xf0, 0x58, 0x19, 0x6e, 0x4a, 0x68, 0x76, 0xf0, 0x1f, 0x92, 0xe4, 0xea, 0xb5, 0x92, 0xd3,\n+0x61, 0x51, 0x10, 0x0b, 0xad, 0xa7, 0xd9, 0x5f, 0xc7, 0x5f, 0xdc, 0x1f, 0xa3, 0x5c, 0x8c, 0xa1,\n+0x7e, 0x9b, 0xb7, 0x9e, 0xd3, 0x56, 0x6f, 0x66, 0x5e, 0x07, 0x96, 0x20, 0xed, 0x0b, 0x74, 0xfb,\n+0x66, 0x4e, 0x8b, 0x11, 0x15, 0xe9, 0x81, 0x49, 0x7e, 0x6f, 0xb0, 0xd4, 0x50, 0x7f, 0x22, 0xd7,\n+0x5f, 0x65, 0x02, 0x0d, 0xa6, 0xf4, 0x85, 0x1e, 0xd8, 0xae, 0x06, 0x4b, 0x4a, 0xa7, 0xd2, 0x31,\n+0x66, 0xc2, 0xf8, 0xce, 0xe5, 0x08, 0xa6, 0xa4, 0x02, 0x96, 0x44, 0x68, 0x57, 0xc4, 0xd5, 0x33,\n+0xcf, 0x19, 0x2f, 0x14, 0xc4, 0x94, 0x1c, 0x7b, 0xa4, 0xd9, 0xf0, 0x9f, 0x0e, 0xb1, 0x80, 0xe2,\n+0xd1, 0x9e, 0x11, 0x64, 0xa9, 0x88, 0x11, 0x3a, 0x76, 0x82, 0xe5, 0x62, 0xc2, 0x80, 0xd8, 0xa4,\n+0x83, 0xed, 0x93, 0xef, 0x7c, 0x2f, 0x90, 0xb0, 0x32, 0x4c, 0x96, 0x15, 0x68, 0x48, 0x52, 0xd4,\n+0x99, 0x08, 0xc0, 0x24, 0xe8, 0x1c, 0xe3, 0xb3, 0xa5, 0x21, 0x0e, 0x92, 0xc0, 0x90, 0x1f, 0xcf,\n+0x20, 0x5f, 0xca, 0x3b, 0x38, 0xc7, 0xb7, 0x6d, 0x3a, 0xf3, 0xe6, 0x44, 0xb8, 0x0e, 0x31, 0x6b,\n+0x88, 0x8e, 0x70, 0xeb, 0x9c, 0x17, 0x52, 0xa8, 0x41, 0x94, 0x2e, 0x87, 0xb6, 0xe7, 0xa6, 0x12,\n+0xc5, 0x75, 0xdf, 0x5b, 0xc0, 0x0a, 0x6e, 0x7b, 0xa4, 0xe4, 0x5e, 0x86, 0xf9, 0x36, 0x94, 0xdf,\n+0x77, 0xc3, 0xe9, 0x0d, 0xc0, 0x39, 0xf1, 0x79, 0xbb, 0x46, 0x8e, 0xab, 0x43, 0x59, 0x27, 0xb7,\n+0x20, 0xbb, 0x23, 0xe9, 0x56, 0x40, 0x21, 0xec, 0x31, 0x3d, 0x65, 0xaa, 0x43, 0xf2, 0x3d, 0xdf,\n+0x70, 0x44, 0xe1, 0xba, 0x4d, 0x26, 0x10, 0x3b, 0x98, 0x9f, 0xf3, 0xc8, 0x8e, 0x1b, 0x38, 0x56,\n+0x21, 0x6a, 0x51, 0x93, 0xd3, 0x91, 0xca, 0x46, 0xda, 0x89, 0xb7, 0x3d, 0x53, 0x83, 0x2c, 0x08,\n+0x1f, 0x8b, 0x8f, 0x53, 0xdd, 0xff, 0xac, 0x1f, 0x30, 0x82, 0x03, 0x94, 0x30, 0x82, 0x02, 0x7c,\n+0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0a, 0x31, 0xf5, 0xe4, 0x62, 0x0c, 0x6c, 0x58, 0xed, 0xd6,\n+0xd8, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n+0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x4e, 0x31,\n+0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e,\n+0x20, 0x50, 0x4b, 0x49, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x65,\n+0x4d, 0x75, 0x64, 0x68, 0x72, 0x61, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67,\n+0x69, 0x65, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1c, 0x30, 0x1a, 0x06,\n+0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f,\n+0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30,\n+0x32, 0x31, 0x38, 0x31, 0x38, 0x33, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x33, 0x30, 0x32,\n+0x31, 0x38, 0x31, 0x38, 0x33, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06,\n+0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x4e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,\n+0x0b, 0x13, 0x0a, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x50, 0x4b, 0x49, 0x31, 0x25, 0x30,\n+0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x65, 0x4d, 0x75, 0x64, 0x68, 0x72, 0x61, 0x20,\n+0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x20, 0x4c, 0x69, 0x6d,\n+0x69, 0x74, 0x65, 0x64, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x65,\n+0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20,\n+0x47, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,\n+0x01, 0x01, 0x00, 0x93, 0x4b, 0xbb, 0xe9, 0x66, 0x8a, 0xee, 0x9d, 0x5b, 0xd5, 0x34, 0x93, 0xd0,\n+0x1b, 0x1e, 0xc3, 0xe7, 0x9e, 0xb8, 0x64, 0x33, 0x7f, 0x63, 0x78, 0x68, 0xb4, 0xcd, 0x2e, 0x71,\n+0x75, 0xd7, 0x9b, 0x20, 0xc6, 0x4d, 0x29, 0xbc, 0xb6, 0x68, 0x60, 0x8a, 0xf7, 0x21, 0x9a, 0x56,\n+0x35, 0x5a, 0xf3, 0x76, 0xbd, 0xd8, 0xcd, 0x9a, 0xff, 0x93, 0x56, 0x4b, 0xa5, 0x59, 0x06, 0xa1,\n+0x93, 0x34, 0x29, 0xdd, 0x16, 0x34, 0x75, 0x4e, 0xf2, 0x81, 0xb4, 0xc7, 0x96, 0x4e, 0xad, 0x19,\n+0x15, 0x52, 0x4a, 0xfe, 0x3c, 0x70, 0x75, 0x70, 0xcd, 0xaf, 0x2b, 0xab, 0x15, 0x9a, 0x33, 0x3c,\n+0xaa, 0xb3, 0x8b, 0xaa, 0xcd, 0x43, 0xfd, 0xf5, 0xea, 0x70, 0xff, 0xed, 0xcf, 0x11, 0x3b, 0x94,\n+0xce, 0x4e, 0x32, 0x16, 0xd3, 0x23, 0x40, 0x2a, 0x77, 0xb3, 0xaf, 0x3c, 0x01, 0x2c, 0x6c, 0xed,\n+0x99, 0x2c, 0x8b, 0xd9, 0x4e, 0x69, 0x98, 0xb2, 0xf7, 0x8f, 0x41, 0xb0, 0x32, 0x78, 0x61, 0xd6,\n+0x0d, 0x5f, 0xc3, 0xfa, 0xa2, 0x40, 0x92, 0x1d, 0x5c, 0x17, 0xe6, 0x70, 0x3e, 0x35, 0xe7, 0xa2,\n+0xb7, 0xc2, 0x62, 0xe2, 0xab, 0xa4, 0x38, 0x4c, 0xb5, 0x39, 0x35, 0x6f, 0xea, 0x03, 0x69, 0xfa,\n+0x3a, 0x54, 0x68, 0x85, 0x6d, 0xd6, 0xf2, 0x2f, 0x43, 0x55, 0x1e, 0x91, 0x0d, 0x0e, 0xd8, 0xd5,\n+0x6a, 0xa4, 0x96, 0xd1, 0x13, 0x3c, 0x2c, 0x78, 0x50, 0xe8, 0x3a, 0x92, 0xd2, 0x17, 0x56, 0xe5,\n+0x35, 0x1a, 0x40, 0x1c, 0x3e, 0x8d, 0x2c, 0xed, 0x39, 0xdf, 0x42, 0xe0, 0x83, 0x41, 0x74, 0xdf,\n+0xa3, 0xcd, 0xc2, 0x86, 0x60, 0x48, 0x68, 0xe3, 0x69, 0x0b, 0x54, 0x00, 0x8b, 0xe4, 0x76, 0x69,\n+0x21, 0x0d, 0x79, 0x4e, 0x34, 0x08, 0x5e, 0x14, 0xc2, 0xcc, 0xb1, 0xb7, 0xad, 0xd7, 0x7c, 0x70,\n+0x8a, 0xc7, 0x85, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03,\n+0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xfb, 0xef, 0x0d, 0x86, 0x9e, 0xb0, 0xe3, 0xdd, 0xa9,\n+0xb9, 0xf1, 0x21, 0x17, 0x7f, 0x3e, 0xfc, 0xf0, 0x77, 0x2b, 0x1a, 0x30, 0x0e, 0x06, 0x03, 0x55,\n+0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55,\n+0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,\n+0x59, 0xff, 0xf2, 0x8c, 0xf5, 0x87, 0x7d, 0x71, 0x3d, 0xa3, 0x9f, 0x1b, 0x5b, 0xd1, 0xda, 0xf8,\n+0xd3, 0x9c, 0x6b, 0x36, 0xbd, 0x9b, 0xa9, 0x61, 0xeb, 0xde, 0x16, 0x2c, 0x74, 0x3d, 0x9e, 0xe6,\n+0x75, 0xda, 0xd7, 0xba, 0xa7, 0xbc, 0x42, 0x17, 0xe7, 0x3d, 0x91, 0xeb, 0xe5, 0x7d, 0xdd, 0x3e,\n+0x9c, 0xf1, 0xcf, 0x92, 0xac, 0x6c, 0x48, 0xcc, 0xc2, 0x22, 0x3f, 0x69, 0x3b, 0xc5, 0xb6, 0x15,\n+0x2f, 0xa3, 0x35, 0xc6, 0x68, 0x2a, 0x1c, 0x57, 0xaf, 0x39, 0xef, 0x8d, 0xd0, 0x35, 0xc3, 0x18,\n+0x0c, 0x7b, 0x00, 0x56, 0x1c, 0xcd, 0x8b, 0x19, 0x74, 0xde, 0xbe, 0x0f, 0x12, 0xe0, 0xd0, 0xaa,\n+0xa1, 0x3f, 0x02, 0x34, 0xb1, 0x70, 0xce, 0x9d, 0x18, 0xd6, 0x08, 0x03, 0x09, 0x46, 0xee, 0x60,\n+0xe0, 0x7e, 0xb6, 0xc4, 0x49, 0x04, 0x51, 0x7d, 0x70, 0x60, 0xbc, 0xaa, 0xb2, 0xff, 0x79, 0x72,\n+0x7a, 0xa6, 0x1d, 0x3d, 0x5f, 0x2a, 0xf8, 0xca, 0xe2, 0xfd, 0x39, 0xb7, 0x47, 0xb9, 0xeb, 0x7e,\n+0xdf, 0x04, 0x23, 0xaf, 0xfa, 0x9c, 0x06, 0x07, 0xe9, 0xfb, 0x63, 0x93, 0x80, 0x40, 0xb5, 0xc6,\n+0x6c, 0x0a, 0x31, 0x28, 0xce, 0x0c, 0x9f, 0xcf, 0xb3, 0x23, 0x35, 0x80, 0x41, 0x8d, 0x6c, 0xc4,\n+0x37, 0x7b, 0x81, 0x2f, 0x80, 0xa1, 0x40, 0x42, 0x85, 0xe9, 0xd9, 0x38, 0x8d, 0xe8, 0xa1, 0x53,\n+0xcd, 0x01, 0xbf, 0x69, 0xe8, 0x5a, 0x06, 0xf2, 0x45, 0x0b, 0x90, 0xfa, 0xae, 0xe1, 0xbf, 0x9d,\n+0xf2, 0xae, 0x57, 0x3c, 0xa5, 0xae, 0xb2, 0x56, 0xf4, 0x8b, 0x65, 0x40, 0xe9, 0xfd, 0x31, 0x81,\n+0x2c, 0xf4, 0x39, 0x09, 0xd8, 0xee, 0x6b, 0xa7, 0xb4, 0xa6, 0x1d, 0x15, 0xa5, 0x98, 0xf7, 0x01,\n+0x81, 0xd8, 0x85, 0x7d, 0xf3, 0x51, 0x5c, 0x71, 0x88, 0xde, 0xba, 0xcc, 0x1f, 0x80, 0x7e, 0x4a,\n+0x30, 0x82, 0x02, 0x4e, 0x30, 0x82, 0x01, 0xd3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0a, 0x3c,\n+0xf6, 0x07, 0xa9, 0x68, 0x70, 0x0e, 0xda, 0x8b, 0x84, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n+0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+0x13, 0x02, 0x49, 0x4e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x65,\n+0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x50, 0x4b, 0x49, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55,\n+0x04, 0x0a, 0x13, 0x1c, 0x65, 0x4d, 0x75, 0x64, 0x68, 0x72, 0x61, 0x20, 0x54, 0x65, 0x63, 0x68,\n+0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,\n+0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x65, 0x6d, 0x53, 0x69, 0x67,\n+0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20,\n+0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x32, 0x31, 0x38, 0x31, 0x38, 0x33, 0x30,\n+0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x33, 0x30, 0x32, 0x31, 0x38, 0x31, 0x38, 0x33, 0x30, 0x30,\n+0x30, 0x5a, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49,\n+0x4e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x65, 0x6d, 0x53, 0x69,\n+0x67, 0x6e, 0x20, 0x50, 0x4b, 0x49, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n+0x1c, 0x65, 0x4d, 0x75, 0x64, 0x68, 0x72, 0x61, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c,\n+0x6f, 0x67, 0x69, 0x65, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x20, 0x30,\n+0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45,\n+0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30,\n+0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81,\n+0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x23, 0xa5, 0x0c, 0xb8, 0x2d, 0x12, 0xf5, 0x28, 0xf3,\n+0xb1, 0xb2, 0xdd, 0xe2, 0x02, 0x12, 0x80, 0x9e, 0x39, 0x5f, 0x49, 0x4d, 0x9f, 0xc9, 0x25, 0x34,\n+0x59, 0x74, 0xec, 0xbb, 0x06, 0x1c, 0xe7, 0xc0, 0x72, 0xaf, 0xe8, 0xae, 0x2f, 0xe1, 0x41, 0x54,\n+0x87, 0x14, 0xa8, 0x4a, 0xb2, 0xe8, 0x7c, 0x82, 0xe6, 0x5b, 0x6a, 0xb5, 0xdc, 0xb3, 0x75, 0xce,\n+0x8b, 0x06, 0xd0, 0x86, 0x23, 0xbf, 0x46, 0xd5, 0x8e, 0x0f, 0x3f, 0x04, 0xf4, 0xd7, 0x1c, 0x92,\n+0x7e, 0xf6, 0xa5, 0x63, 0xc2, 0xf5, 0x5f, 0x8e, 0x2e, 0x4f, 0xa1, 0x18, 0x19, 0x02, 0x2b, 0x32,\n+0x0a, 0x82, 0x64, 0x7d, 0x16, 0x93, 0xd1, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7c, 0x5d, 0x02, 0x84, 0x13, 0xd4, 0xcc, 0x8a, 0x9b, 0x81,\n+0xce, 0x17, 0x1c, 0x2e, 0x29, 0x1e, 0x9c, 0x48, 0x63, 0x42, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,\n+0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, 0x2a,\n+0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xbe,\n+0xf3, 0x61, 0xcf, 0x02, 0x10, 0x1d, 0x64, 0x95, 0x07, 0xb8, 0x18, 0x6e, 0x88, 0x85, 0x05, 0x2f,\n+0x83, 0x08, 0x17, 0x90, 0xca, 0x1f, 0x8a, 0x4c, 0xe8, 0x0d, 0x1b, 0x7a, 0xb1, 0xad, 0xd5, 0x81,\n+0x09, 0x47, 0xef, 0x3b, 0xac, 0x08, 0x04, 0x7c, 0x5c, 0x99, 0xb1, 0xed, 0x47, 0x07, 0xd2, 0x02,\n+0x31, 0x00, 0x9d, 0xba, 0x55, 0xfc, 0xa9, 0x4a, 0xe8, 0xed, 0xed, 0xe6, 0x76, 0x01, 0x42, 0x7b,\n+0xc8, 0xf8, 0x60, 0xd9, 0x8d, 0x51, 0x8b, 0x55, 0x3b, 0xfb, 0x8c, 0x7b, 0xeb, 0x65, 0x09, 0xc3,\n+0xf8, 0x96, 0xcd, 0x47, 0xa8, 0x82, 0xf2, 0x16, 0x55, 0x77, 0x24, 0x7e, 0x12, 0x10, 0x95, 0x04,\n+0x2c, 0xa3, 0x30, 0x82, 0x03, 0x73, 0x30, 0x82, 0x02, 0x5b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n+0x0b, 0x00, 0xae, 0xcf, 0x00, 0xba, 0xc4, 0xcf, 0x32, 0xf8, 0x43, 0xb2, 0x30, 0x0d, 0x06, 0x09,\n+0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x56, 0x31, 0x0b, 0x30,\n+0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,\n+0x55, 0x04, 0x0b, 0x13, 0x0a, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x50, 0x4b, 0x49, 0x31,\n+0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x65, 0x4d, 0x75, 0x64, 0x68, 0x72,\n+0x61, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13,\n+0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d,\n+0x20, 0x43, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x32, 0x31, 0x38, 0x31, 0x38, 0x33,\n+0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x33, 0x30, 0x32, 0x31, 0x38, 0x31, 0x38, 0x33, 0x30,\n+0x30, 0x30, 0x5a, 0x30, 0x56, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x65, 0x6d, 0x53,\n+0x69, 0x67, 0x6e, 0x20, 0x50, 0x4b, 0x49, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+0x13, 0x0b, 0x65, 0x4d, 0x75, 0x64, 0x68, 0x72, 0x61, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x1c, 0x30,\n+0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52,\n+0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x43, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30,\n+0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n+0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xcf, 0xeb, 0xa9, 0xb9,\n+0xf1, 0x99, 0x05, 0xcc, 0xd8, 0x28, 0x21, 0x4a, 0xf3, 0x73, 0x34, 0x51, 0x84, 0x56, 0x10, 0xf5,\n+0xa0, 0x4f, 0x2c, 0x12, 0xe3, 0xfa, 0x13, 0x9a, 0x27, 0xd0, 0xcf, 0xf9, 0x79, 0x1a, 0x74, 0x5f,\n+0x1d, 0x79, 0x39, 0xfc, 0x5b, 0xf8, 0x70, 0x8e, 0xe0, 0x92, 0x52, 0xf7, 0xe4, 0x25, 0xf9, 0x54,\n+0x83, 0xd9, 0x1d, 0xd3, 0xc8, 0x5a, 0x85, 0x3f, 0x5e, 0xc7, 0xb6, 0x07, 0xee, 0x3e, 0xc0, 0xce,\n+0x9a, 0xaf, 0xac, 0x56, 0x42, 0x2a, 0x39, 0x25, 0x70, 0xd6, 0xbf, 0xb5, 0x7b, 0x36, 0xad, 0xac,\n+0xf6, 0x73, 0xdc, 0xcd, 0xd7, 0x1d, 0x8a, 0x83, 0xa5, 0xfb, 0x2b, 0x90, 0x15, 0x37, 0x6b, 0x1c,\n+0x26, 0x47, 0xdc, 0x3b, 0x29, 0x56, 0x93, 0x6a, 0xb3, 0xc1, 0x6a, 0x3a, 0x9d, 0x3d, 0xf5, 0xc1,\n+0x97, 0x38, 0x58, 0x05, 0x8b, 0x1c, 0x11, 0xe3, 0xe4, 0xb4, 0xb8, 0x5d, 0x85, 0x1d, 0x83, 0xfe,\n+0x78, 0x5f, 0x0b, 0x45, 0x68, 0x18, 0x48, 0xa5, 0x46, 0x73, 0x34, 0x3b, 0xfe, 0x0f, 0xc8, 0x76,\n+0xbb, 0xc7, 0x18, 0xf3, 0x05, 0xd1, 0x86, 0xf3, 0x85, 0xed, 0xe7, 0xb9, 0xd9, 0x32, 0xad, 0x55,\n+0x88, 0xce, 0xa6, 0xb6, 0x91, 0xb0, 0x4f, 0xac, 0x7e, 0x15, 0x23, 0x96, 0xf6, 0x3f, 0xf0, 0x20,\n+0x34, 0x16, 0xde, 0x0a, 0xc6, 0xc4, 0x04, 0x45, 0x79, 0x7f, 0xa7, 0xfd, 0xbe, 0xd2, 0xa9, 0xa5,\n+0xaf, 0x9c, 0xc5, 0x23, 0x2a, 0xf7, 0x3c, 0x21, 0x6c, 0xbd, 0xaf, 0x8f, 0x4e, 0xc5, 0x3a, 0xb2,\n+0xf3, 0x34, 0x12, 0xfc, 0xdf, 0x80, 0x1a, 0x49, 0xa4, 0xd4, 0xa9, 0x95, 0xf7, 0x9e, 0x89, 0x5e,\n+0xa2, 0x89, 0xac, 0x94, 0xcb, 0xa8, 0x68, 0x9b, 0xaf, 0x8a, 0x65, 0x27, 0xcd, 0x89, 0xee, 0xdd,\n+0x8c, 0xb5, 0x6b, 0x29, 0x70, 0x43, 0xa0, 0x69, 0x0b, 0xe4, 0xb9, 0x0f, 0x02, 0x03, 0x01, 0x00,\n+0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+0xfe, 0xa1, 0xe0, 0x70, 0x1e, 0x2a, 0x03, 0x39, 0x52, 0x5a, 0x42, 0xbe, 0x5c, 0x91, 0x85, 0x7a,\n+0x18, 0xaa, 0x4d, 0xb5, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n+0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n+0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xc2, 0x4a, 0x56, 0xfa, 0x15, 0x21, 0x7b,\n+0x28, 0xa2, 0xe9, 0xe5, 0x1d, 0xfb, 0xf8, 0x2d, 0xc4, 0x39, 0x96, 0x41, 0x4c, 0x3b, 0x27, 0x2c,\n+0xc4, 0x6c, 0x18, 0x15, 0x80, 0xc6, 0xac, 0xaf, 0x47, 0x59, 0x2f, 0x26, 0x0b, 0xe3, 0x36, 0xb0,\n+0xef, 0x3b, 0xfe, 0x43, 0x97, 0x49, 0x32, 0x99, 0x12, 0x15, 0x5b, 0xdf, 0x11, 0x29, 0xff, 0xab,\n+0x53, 0xf8, 0xbb, 0xc1, 0x78, 0x0f, 0xac, 0x9c, 0x53, 0xaf, 0x57, 0xbd, 0x68, 0x8c, 0x3d, 0x69,\n+0x33, 0xf0, 0xa3, 0xa0, 0x23, 0x63, 0x3b, 0x64, 0x67, 0x22, 0x44, 0xad, 0xd5, 0x71, 0xcb, 0x56,\n+0x2a, 0x78, 0x92, 0xa3, 0x4f, 0x12, 0x31, 0x36, 0x36, 0xe2, 0xde, 0xfe, 0x00, 0xc4, 0xa3, 0x60,\n+0x0f, 0x27, 0xad, 0xa0, 0xb0, 0x8a, 0xb5, 0x36, 0x7a, 0x52, 0xa1, 0xbd, 0x27, 0xf4, 0x20, 0x27,\n+0x62, 0xe8, 0x4d, 0x94, 0x24, 0x13, 0xe4, 0x0a, 0x04, 0xe9, 0x3c, 0xab, 0x2e, 0xc8, 0x43, 0x09,\n+0x4a, 0xc6, 0x61, 0x04, 0xe5, 0x49, 0x34, 0x7e, 0xd3, 0xc4, 0xc8, 0xf5, 0x0f, 0xc0, 0xaa, 0xe9,\n+0xba, 0x54, 0x5e, 0xf3, 0x63, 0x2b, 0x4f, 0x4f, 0x50, 0xd4, 0xfe, 0xb9, 0x7b, 0x99, 0x8c, 0x3d,\n+0xc0, 0x2e, 0xbc, 0x02, 0x2b, 0xd3, 0xc4, 0x40, 0xe4, 0x8a, 0x07, 0x31, 0x1e, 0x9b, 0xce, 0x26,\n+0x99, 0x13, 0xfb, 0x11, 0xea, 0x9a, 0x22, 0x0c, 0x11, 0x19, 0xc7, 0x5e, 0x1b, 0x81, 0x50, 0x30,\n+0xc8, 0x96, 0x12, 0x6e, 0xe7, 0xcb, 0x41, 0x7f, 0x91, 0x3b, 0xa2, 0x47, 0xb7, 0x54, 0x80, 0x1b,\n+0xdc, 0x00, 0xcc, 0x9a, 0x90, 0xea, 0xc3, 0xc3, 0x50, 0x06, 0x62, 0x0c, 0x30, 0xc0, 0x15, 0x48,\n+0xa7, 0xa8, 0x59, 0x7c, 0xe1, 0xae, 0x22, 0xa2, 0xe2, 0x0a, 0x7a, 0x0f, 0xfa, 0x62, 0xab, 0x52,\n+0x4c, 0xe1, 0xf1, 0xdf, 0xca, 0xbe, 0x83, 0x0d, 0x42, 0x30, 0x82, 0x02, 0x2b, 0x30, 0x82, 0x01,\n+0xb1, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0a, 0x7b, 0x71, 0xb6, 0x82, 0x56, 0xb8, 0x12, 0x7c,\n+0x9c, 0xa8, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x5a,\n+0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30,\n+0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x50,\n+0x4b, 0x49, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x65, 0x4d, 0x75,\n+0x64, 0x68, 0x72, 0x61, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04,\n+0x03, 0x13, 0x17, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f,\n+0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x43, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x38,\n+0x30, 0x32, 0x31, 0x38, 0x31, 0x38, 0x33, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x33, 0x30,\n+0x32, 0x31, 0x38, 0x31, 0x38, 0x33, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09,\n+0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,\n+0x04, 0x0b, 0x13, 0x0a, 0x65, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x50, 0x4b, 0x49, 0x31, 0x14,\n+0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x65, 0x4d, 0x75, 0x64, 0x68, 0x72, 0x61,\n+0x20, 0x49, 0x6e, 0x63, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x65,\n+0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43,\n+0x41, 0x20, 0x2d, 0x20, 0x43, 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce,\n+0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xfd, 0xa5,\n+0x61, 0xae, 0x7b, 0x26, 0x10, 0x1d, 0xe9, 0xb7, 0x22, 0x30, 0xae, 0x06, 0xf4, 0x81, 0xb3, 0xb1,\n+0x42, 0x71, 0x95, 0x39, 0xbc, 0xd3, 0x52, 0xe3, 0xaf, 0xaf, 0xf9, 0xf2, 0x97, 0x35, 0x92, 0x36,\n+0x46, 0x0e, 0x87, 0x95, 0x8d, 0xb9, 0x39, 0x5a, 0xe9, 0xbb, 0xdf, 0xd0, 0xfe, 0xc8, 0x07, 0x41,\n+0x3c, 0xbb, 0x55, 0x6f, 0x83, 0xa3, 0x6a, 0xfb, 0x62, 0xb0, 0x81, 0x89, 0x02, 0x70, 0x7d, 0x48,\n+0xc5, 0x4a, 0xe3, 0xe9, 0x22, 0x54, 0x22, 0x4d, 0x93, 0xbb, 0x42, 0x0c, 0xaf, 0x77, 0x9c, 0x23,\n+0xa6, 0x7d, 0xd7, 0x61, 0x11, 0xce, 0x65, 0xc7, 0xf8, 0x7f, 0xfe, 0xf5, 0xf2, 0xa9, 0xa3, 0x42,\n+0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xfb, 0x5a, 0x48,\n+0xd0, 0x80, 0x20, 0x40, 0xf2, 0xa8, 0xe9, 0x00, 0x07, 0x69, 0x19, 0x77, 0xa7, 0xe6, 0xc3, 0xf4,\n+0xcf, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n+0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n+0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68,\n+0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0xb4, 0xd8, 0x2f, 0x02, 0x89, 0xfd, 0xb6, 0x4c, 0x62, 0xba,\n+0x43, 0x4e, 0x13, 0x84, 0x72, 0xb5, 0xae, 0xdd, 0x1c, 0xde, 0xd6, 0xb5, 0xdc, 0x56, 0x8f, 0x58,\n+0x40, 0x5a, 0x2d, 0xde, 0x20, 0x4c, 0x22, 0x83, 0xca, 0x93, 0xa8, 0x7e, 0xee, 0x12, 0x40, 0xc7,\n+0xd6, 0x87, 0x4f, 0xf8, 0xdf, 0x85, 0x02, 0x30, 0x1c, 0x14, 0x64, 0xe4, 0x7c, 0x96, 0x83, 0x11,\n+0x9c, 0xb0, 0xd1, 0x5a, 0x61, 0x4b, 0xa6, 0x0f, 0x49, 0xd3, 0x00, 0xfc, 0xa1, 0xfc, 0xe4, 0xa5,\n+0xff, 0x7f, 0xad, 0xd7, 0x30, 0xd0, 0xc7, 0x77, 0x7f, 0xbe, 0x81, 0x07, 0x55, 0x30, 0x50, 0x20,\n+0x14, 0xf5, 0x57, 0x38, 0x0a, 0xa8, 0x31, 0x51, 0x05, 0x86, 0x02, 0x5d, 0x05, 0xac, 0x05, 0xf3,\n+0x02, 0x69, 0x05, 0xc4, 0x05, 0xd3, 0x05, 0xef, 0x05, 0x4b, 0x02, 0x6d, 0x03, 0xb9, 0x03, 0x76,\n+0x05, 0xd6, 0x02, 0x72, 0x05, 0x6f, 0x04, 0x67, 0x01, 0xba, 0x05, 0x8c, 0x05, 0x45, 0x03, 0x45,\n+0x01, 0xf6, 0x06, 0x0f, 0x02, 0xc7, 0x06, 0x5f, 0x04, 0x24, 0x06, 0x33, 0x04, 0x34, 0x05, 0x5e,\n+0x05, 0x4a, 0x02, 0x98, 0x02, 0x91, 0x05, 0xe1, 0x05, 0x87, 0x05, 0x91, 0x04, 0x19, 0x03, 0x4e,\n+0x03, 0xea, 0x05, 0x64, 0x05, 0xbb, 0x05, 0x64, 0x06, 0xa1, 0x05, 0x64, 0x03, 0x71, 0x03, 0x5e,\n+0x03, 0x7b, 0x05, 0xdc, 0x04, 0x13, 0x03, 0xe1, 0x03, 0xf3, 0x05, 0xe2, 0x02, 0x93, 0x04, 0x95,\n+0x05, 0x5a, 0x04, 0x2e, 0x04, 0x36, 0x07, 0xd7, 0x05, 0xbf, 0x03, 0x50, 0x05, 0xb4, 0x05, 0x4a,\n+0x02, 0x02, 0x03, 0x50, 0x06, 0x18, 0x03, 0x7b, 0x05, 0x5d, 0x03, 0x7b, 0x05, 0x5d, 0x05, 0x6d,\n+0x03, 0xac, 0x05, 0x3c, 0x05, 0x64, 0x05, 0x6a, 0x05, 0x74, 0x04, 0x42, 0x02, 0xfd, 0x03, 0x3c,\n+0x03, 0xbf, 0x04, 0x21, 0x03, 0xa5, 0x02, 0x8d, 0x03, 0xbb, 0x03, 0x9a, 0x03, 0xb3, 0x03, 0x92,\n+0x02, 0x43, 0x03, 0xc9, 0x05, 0x94, 0x02, 0x4a, 0x04, 0x04, 0x03, 0xc9, 0x04, 0x35, 0x03, 0x34,\n+0x05, 0xf5, 0x03, 0xc7, 0x03, 0xc7, 0x05, 0x45, 0x03, 0x7f, 0x05, 0xa6, 0x05, 0x5e, 0x02, 0x10,\n+0x02, 0x0e, 0x05, 0x5e, 0x05, 0x5e, 0x02, 0x0f, 0x03, 0xbe, 0x03, 0x63, 0x03, 0x79, 0x02, 0x22,\n+0x05, 0x87, 0x04, 0x0e, 0x03, 0xc0, 0x03, 0xbc, 0x05, 0xbe, 0x02, 0x44, 0x02, 0x64, 0x05, 0xde,\n+0x02, 0xa1, 0x04, 0x37, 0x04, 0x47, 0x06, 0x4f, 0x05, 0xc1, 0x04, 0x34, 0x01, 0xe5, 0x06, 0x4f,\n+0x03, 0x98, 0x02, 0x52, 0x03, 0x77, 0x02, 0x2f, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,\n+0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,\n+0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,\n+0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,\n+0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,\n+0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,\n+0x14, 0x14, 0x14, 0x00, 0x14, 0x14, 0x14, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,\n+0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,\n+0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xdc, 0x2e, 0x1f, 0xd1, 0x61, 0x37, 0x79, 0xe4,\n+0xab, 0xd5, 0xd5, 0xb3, 0x12, 0x71, 0x68, 0x3d, 0x6a, 0x68, 0x9c, 0x22, 0xc8, 0xcb, 0x99, 0x72,\n+0x70, 0x52, 0x0c, 0xf8, 0xe6, 0xbe, 0xb2, 0x04, 0x57, 0x29, 0x2a, 0xcf, 0x42, 0x10, 0xed, 0x35,\n+0x09, 0xcb, 0x59, 0x7f, 0x86, 0xb2, 0x70, 0x8f, 0x1a, 0xc3, 0x39, 0xe3, 0xc0, 0xd9, 0xe9, 0xbf,\n+0xbb, 0x4d, 0xb2, 0x23, 0x9c, 0x5f, 0xd0, 0x6c, 0x63, 0xa3, 0x5f, 0x93, 0xca, 0x93, 0x98, 0x08,\n+0xad, 0x8c, 0x87, 0xa5, 0x2c, 0x5c, 0xc1, 0x37, 0x8d, 0x06, 0x66, 0x74, 0x24, 0x76, 0x3a, 0xf3,\n+0x89, 0xf7, 0xbc, 0xd6, 0xbd, 0x47, 0x7d, 0x2f, 0xbc, 0x10, 0x5f, 0x4b, 0x8c, 0xfb, 0x1c, 0x75,\n+0xbc, 0x02, 0xd3, 0x9f, 0x4e, 0x2e, 0x48, 0xd9, 0xf9, 0x60, 0x54, 0xaa, 0xc4, 0xb3, 0x4f, 0xfa,\n+0x17, 0x9d, 0xcd, 0x1e, 0x8b, 0xd6, 0x39, 0x2b, 0x70, 0xd3, 0x5c, 0xd4, 0xa0, 0xb8, 0x1f, 0xb0,\n+0x00, 0xfc, 0xc5, 0x61, 0xf9, 0x60, 0xbb, 0xd4, 0xe3, 0xd5, 0x34, 0xf6, 0xb8, 0xf5, 0x06, 0x80,\n+0x25, 0xa7, 0x73, 0xdb, 0x46, 0x69, 0xa8, 0x9e, 0x82, 0x21, 0x2d, 0x66, 0xc6, 0xd7, 0xa0, 0xe0,\n+0x15, 0xeb, 0xce, 0x4c, 0x09, 0x77, 0xc4, 0x60, 0x9e, 0x54, 0x6e, 0x03, 0x48, 0x87, 0x14, 0xac,\n+0xe3, 0xc3, 0x9e, 0x90, 0x60, 0x3a, 0xd7, 0xca, 0x89, 0xee, 0xd3, 0xad, 0x8c, 0xb4, 0x50, 0x66,\n+0x35, 0x0f, 0xc8, 0x36, 0x63, 0x5e, 0xe2, 0xa3, 0xec, 0xf9, 0x3b, 0x66, 0x15, 0xce, 0x51, 0x52,\n+0xe3, 0x91, 0x9a, 0x3d, 0x2e, 0x16, 0xa9, 0x4a, 0x18, 0xb5, 0xcb, 0xcc, 0xf5, 0x6f, 0x50, 0xf3,\n+0x23, 0x5f, 0xf8, 0x5d, 0xe7, 0xac, 0xf0, 0xc8, 0xb6, 0xa1, 0x54, 0x39, 0x02, 0xc3, 0xa0, 0x3f,\n+0x8e, 0x8a, 0xbc, 0xfa, 0xd4, 0xf8, 0x1c, 0xa6, 0xd1, 0x3a, 0x0e, 0xfd, 0x01, 0xb9, 0x2f, 0xef,\n+0xbf, 0x11, 0x86, 0x60, 0xf2, 0x4f, 0xd0, 0x41, 0x6e, 0xab, 0x73, 0x1f, 0xe7, 0xd2, 0x6e, 0x49,\n+0x79, 0xb4, 0x59, 0xe6, 0x7b, 0xb6, 0xe5, 0xe4, 0x01, 0x73, 0x80, 0x08, 0x88, 0xc8, 0x1a, 0x58,\n+0xf6, 0xe9, 0x9b, 0x6e, 0x65, 0x3f, 0xc7, 0x8a, 0x86, 0xc6, 0x3c, 0xdd, 0x3c, 0x54, 0x5c, 0x35,\n+0xf8, 0x3a, 0xed, 0x52, 0x0c, 0x47, 0x57, 0xc8, 0xab, 0xb6, 0xdb, 0xd7, 0x06, 0x9e, 0x37, 0xac,\n+0x30, 0x86, 0x07, 0x91, 0x70, 0xc7, 0x9c, 0xc4, 0x19, 0xb1, 0x78, 0xc0, 0xe2, 0xc9, 0x40, 0x9f,\n+0x4d, 0xce, 0xe8, 0x9a, 0xa1, 0x7c, 0xcf, 0x0e, 0x3f, 0x65, 0xc5, 0x29, 0x88, 0x6a, 0x19, 0x51,\n+0xb0, 0x0c, 0xf0, 0x4c, 0x30, 0xf4, 0x05, 0x58, 0x02, 0x48, 0xfd, 0x33, 0xe5, 0x52, 0xaf, 0x4b,\n+0x84, 0xe3, 0x66, 0x52, 0x84, 0x18, 0xcc, 0x85, 0x34, 0xec, 0xbc, 0x0c, 0x94, 0x94, 0x2e, 0x08,\n+0x59, 0x9c, 0xc7, 0xb2, 0x10, 0x4e, 0x0a, 0x08, 0xd3, 0xec, 0xc7, 0x3a, 0x65, 0x6e, 0xcc, 0xe1,\n+0xda, 0x76, 0x9a, 0x56, 0xfb, 0x9c, 0xf3, 0x86, 0x6d, 0x57, 0xe5, 0x81, 0x71, 0x15, 0x67, 0xc8,\n+0xc8, 0xc9, 0xbd, 0x75, 0x5d, 0x72, 0xd0, 0x38, 0x18, 0x6a, 0x9d, 0xf3, 0x71, 0x24, 0x54, 0x0b,\n+0xb4, 0x22, 0x0b, 0x82, 0x99, 0x24, 0x01, 0x0e, 0x9c, 0xbb, 0xe4, 0x0e, 0xfd, 0xbf, 0xfb, 0x97,\n+0x20, 0x93, 0x99, 0x2a, 0x18, 0x87, 0x56, 0xe0, 0x6e, 0x77, 0xee, 0x24, 0x35, 0x3c, 0x4e, 0x73,\n+0x9a, 0x1f, 0xd6, 0xe1, 0xe2, 0x79, 0x7e, 0x2b, 0x44, 0x9e, 0x48, 0xf5, 0xcc, 0x6d, 0x48, 0xd4,\n+0xa0, 0x4b, 0x7f, 0xfe, 0x59, 0x24, 0x2f, 0x83, 0x97, 0x99, 0x9a, 0x86, 0xd9, 0xfe, 0x21, 0x40,\n+0x6e, 0x94, 0x9e, 0xbc, 0x9b, 0x3d, 0x9c, 0x7d, 0x98, 0x20, 0x19, 0xe5, 0x8c, 0x30, 0x62, 0xb2,\n+0xee, 0x6b, 0x49, 0x3c, 0x7a, 0x3f, 0x0d, 0xe3, 0xb1, 0x09, 0xb7, 0x8a, 0xc8, 0xab, 0x19, 0x9f,\n+0x73, 0x33, 0x50, 0xe7, 0xd9, 0x74, 0x3a, 0xe4, 0x30, 0x3d, 0x0d, 0xf7, 0x12, 0xdc, 0x7e, 0x5a,\n+0x05, 0x9f, 0x1e, 0x34, 0x9a, 0xf7, 0xe1, 0x14, 0x81, 0xc4, 0x8c, 0xcc, 0xf5, 0xe4, 0x30, 0xff,\n+0xa5, 0x0c, 0x08, 0x5f, 0x8c, 0x15, 0x67, 0x21, 0x74, 0x01, 0xdf, 0xdf, 0x5b, 0xca, 0x5e, 0xe5,\n+0xde, 0xd2, 0x81, 0xaa, 0xcd, 0xa8, 0x2d, 0x64, 0x51, 0xb6, 0xd9, 0x72, 0x9b, 0x97, 0xe6, 0x4f,\n+0x82, 0xd1, 0x85, 0x73, 0x30, 0xe7, 0x35, 0x04, 0xd3, 0x8e, 0x02, 0x92, 0xfb, 0xe5, 0xa4, 0xd1,\n+0xc4, 0x21, 0xe8, 0xcd, 0xdd, 0x04, 0x09, 0x07, 0xa2, 0xf5, 0x7a, 0x7d, 0x52, 0x53, 0x12, 0x92,\n+0x95, 0xee, 0x38, 0x80, 0x25, 0x0d, 0xa6, 0x59, 0xf7, 0x7d, 0xc5, 0xfd, 0xc4, 0xe8, 0x9a, 0x1b,\n+0x77, 0x64, 0xa7, 0xf5, 0x1d, 0xa0, 0xcc, 0xbf, 0x87, 0x60, 0x9a, 0x6d, 0xe3, 0xfe, 0x2d, 0xfd,\n+0x28, 0xd0, 0x0b, 0xb5, 0xba, 0xb6, 0xa2, 0xc4, 0xbf, 0x06, 0xaa, 0x05, 0x8c, 0x93, 0xfb, 0x2f,\n+0xcc, 0xfa, 0x67, 0x93, 0xf0, 0xb6, 0xb8, 0xd0, 0xa5, 0xc0, 0x1e, 0xf3, 0x53, 0xfd, 0x8c, 0x53,\n+0xdf, 0x83, 0xd7, 0x96, 0xc4, 0xa7, 0xb1, 0xa4, 0x7b, 0x2c, 0x71, 0xfa, 0xdb, 0xe1, 0x4b, 0x90,\n+0x75, 0xff, 0xc4, 0x15, 0x60, 0x85, 0x89, 0x10, 0x21, 0x30, 0xc9, 0xfb, 0x00, 0xd7, 0x4e, 0x98,\n+0xda, 0x87, 0xaa, 0x2a, 0xd0, 0xa7, 0x2e, 0xb1, 0x40, 0x31, 0xa7, 0x4c, 0xa3, 0x97, 0xd6, 0xf3,\n+0x5e, 0xa2, 0x10, 0xe1, 0xab, 0x45, 0x9f, 0x3c, 0x17, 0x64, 0x3c, 0xee, 0x01, 0x70, 0x9c, 0xcc,\n+0x1a, 0x84, 0x62, 0xbc, 0x48, 0x4c, 0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, 0x03, 0xc4, 0x19,\n+0x46, 0xd1, 0x94, 0x6b, 0xed, 0xe7, 0x6f, 0x76, 0x5a, 0xbf, 0x60, 0xec, 0x49, 0x5b, 0xc6, 0xa5,\n+0x77, 0xbb, 0x72, 0x16, 0x71, 0x9b, 0xc4, 0x3d, 0xf2, 0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb,\n+0xee, 0x2f, 0x67, 0x32, 0x96, 0x35, 0x5c, 0xdb, 0xb8, 0xcb, 0x02, 0xd0, 0xc6, 0x17, 0xd0, 0xbc,\n+0xa8, 0xea, 0x02, 0x43, 0xf2, 0x1b, 0x06, 0x99, 0x5d, 0x2b, 0x90, 0x20, 0xb9, 0xd7, 0x9c, 0xe4,\n+0x5b, 0xf8, 0x4d, 0x4f, 0xb2, 0xa5, 0x86, 0xd4, 0x3a, 0xd2, 0xf1, 0x63, 0x9a, 0xa0, 0xbe, 0x09,\n+0xf6, 0x57, 0xb7, 0xde, 0xa0, 0x73, 0x49, 0x99, 0x68, 0xdc, 0x85, 0x5b, 0x65, 0xe3, 0x9b, 0x28,\n+0x2f, 0x57, 0x9f, 0xbd, 0x33, 0xbc, 0x07, 0x48, 0x0a, 0x85, 0xa9, 0x77, 0x65, 0x05, 0x98, 0x7c,\n+0x40, 0x81, 0xf8, 0x0f, 0x97, 0x2c, 0x38, 0xf1, 0x0a, 0xec, 0x3c, 0xcf, 0xbb, 0xaf, 0x7e, 0x02,\n+0x3d, 0xfa, 0xa6, 0xf1, 0x3c, 0x84, 0x8e, 0xad, 0xee, 0x38, 0x98, 0xec, 0xd9, 0x32, 0x32, 0xd4,\n+0xbf, 0x5f, 0xb7, 0xd1, 0xce, 0xdd, 0x1f, 0x86, 0xf4, 0x5b, 0x55, 0xac, 0xdc, 0xd7, 0x10, 0xc2,\n+0x0e, 0xa9, 0x88, 0xe7, 0x7c, 0x0c, 0x32, 0x1f, 0xa7, 0xd9, 0x30, 0x7f, 0xc4, 0x7d, 0x68, 0xa3,\n+0x62, 0xa8, 0xa1, 0xce, 0xab, 0x07, 0x5b, 0x27, 0x9c, 0x5f, 0x00, 0xdf, 0xaa, 0x01, 0xd7, 0x30,\n+0x2b, 0x38, 0x88, 0xa2, 0xb8, 0x6d, 0x4a, 0x9c, 0xf2, 0x11, 0x91, 0x83, 0x53, 0x79, 0xbf, 0x5a,\n+0xaa, 0x2b, 0x4a, 0xcf, 0x54, 0x80, 0xe1, 0xd8, 0x9b, 0xc0, 0x9d, 0xf2, 0xb2, 0x03, 0x66, 0xcb,\n+0x3a, 0xe1, 0x09, 0x86, 0xd4, 0xcf, 0x19, 0xc2, 0x96, 0x76, 0x74, 0x49, 0x76, 0xdc, 0xe0, 0x35,\n+0xc6, 0x63, 0x63, 0x9a, 0x68, 0x90, 0xe4, 0x67, 0xa4, 0xa6, 0x53, 0x80, 0xc7, 0x86, 0x66, 0xa4,\n+0xf1, 0xf7, 0x4b, 0x43, 0xfb, 0x84, 0xbd, 0x6d, 0xa0, 0xc3, 0x8b, 0x44, 0xaa, 0x37, 0xa5, 0x45,\n+0xbf, 0x97, 0x80, 0x5a, 0xd1, 0xf1, 0x78, 0xa2, 0x9b, 0xe9, 0x5d, 0x8d, 0x55, 0xe4, 0x81, 0xd1,\n+0x11, 0x80, 0xbe, 0xd8, 0x89, 0xb9, 0x08, 0xa3, 0x31, 0xf9, 0xa1, 0x24, 0x09, 0x16, 0xb9, 0x70,\n+0xa0, 0x11, 0x0a, 0x23, 0x3e, 0x96, 0xf1, 0x07, 0xec, 0xe2, 0xaf, 0x29, 0xef, 0x82, 0xa5, 0x7f,\n+0xd0, 0x30, 0xa4, 0xb4, 0xd2, 0x87, 0xb4, 0xe3, 0xdf, 0x37, 0x27, 0x93, 0x55, 0xf6, 0x56, 0xea,\n+0x81, 0xe5, 0x36, 0xcc, 0x8c, 0x1e, 0x3f, 0xbd, 0x52, 0xd8, 0x88, 0x3a, 0xc8, 0x9f, 0x78, 0x66,\n+0xed, 0x89, 0xf3, 0x7b, 0x38, 0x70, 0x94, 0xc9, 0x02, 0x02, 0x36, 0xd0, 0x9d, 0x93, 0xc6, 0x53,\n+0x8b, 0x5e, 0xca, 0xaf, 0x3f, 0x9f, 0x1e, 0x0f, 0xe5, 0x99, 0x95, 0xbc, 0x24, 0xf6, 0x94, 0x8f,\n+0x1e, 0x0c, 0xf7, 0xb6, 0x67, 0xf2, 0xe1, 0x92, 0x26, 0x09, 0x45, 0xc0, 0x55, 0x39, 0x2e, 0x77,\n+0x3f, 0x42, 0x4a, 0xa2, 0x9d, 0xc0, 0x67, 0xa6, 0x0c, 0x22, 0xd9, 0x26, 0xf5, 0x45, 0xab, 0xa6,\n+0x65, 0x52, 0x11, 0x27, 0xd8, 0x45, 0xac, 0x63, 0x9a, 0xaf, 0x29, 0x7a, 0xc0, 0x11, 0x35, 0x35,\n+0x26, 0x51, 0x30, 0x00, 0xc3, 0x6a, 0xfe, 0x40, 0xd5, 0xae, 0xd6, 0x3c, 0x07, 0x1f, 0xd2, 0xe7,\n+0x9c, 0xda, 0xc2, 0x6e, 0xa2, 0x40, 0xb4, 0xb0, 0x7a, 0x50, 0x10, 0x50, 0x74, 0xc4, 0xc8, 0xbd,\n+0x65, 0xcd, 0xeb, 0xab, 0x35, 0x1e, 0x00, 0x3e, 0x7e, 0xd5, 0x74, 0xc0, 0x1c, 0xb4, 0x73, 0x47,\n+0x0e, 0x1a, 0x64, 0x2f, 0xe5, 0x9d, 0x59, 0x30, 0x82, 0x47, 0x58, 0xcc, 0xac, 0xfa, 0x08, 0x54,\n+0x36, 0x86, 0x7b, 0x3a, 0xb5, 0x04, 0x4d, 0xf0, 0xc9, 0x80, 0x77, 0xe0, 0x62, 0x92, 0x82, 0xf5,\n+0x46, 0x9c, 0xf3, 0xba, 0xf7, 0x4c, 0xc3, 0xde, 0xb8, 0xa3, 0xad, 0x39, 0xa7, 0xa5, 0x06, 0xb1,\n+0x2c, 0xa6, 0x09, 0x60, 0xee, 0xd1, 0x97, 0xe9, 0x70, 0xae, 0xbc, 0x3b, 0x19, 0x6c, 0xdb, 0x21,\n+0x47, 0xb8, 0xcd, 0xff, 0xe5, 0x6f, 0xee, 0xf8, 0xb2, 0xec, 0x2f, 0x4e, 0x0e, 0xf9, 0x25, 0xb0,\n+0x8e, 0x3c, 0x6b, 0xc3, 0xb5, 0x99, 0xf8, 0xaf, 0xb0, 0x94, 0xf5, 0xe3, 0x20, 0xd6, 0x0a, 0xad,\n+0xce, 0x4e, 0x56, 0xa4, 0x2e, 0x6e, 0x42, 0xed, 0x1a, 0xed, 0xfe, 0x41, 0x39, 0x90, 0xb4, 0x24,\n+0x59, 0xbe, 0x01, 0xf2, 0x52, 0xd5, 0x45, 0xf6, 0x5a, 0x39, 0xdc, 0x11, 0xf0, 0x8f, 0x59, 0x38,\n+0x00, 0xb3, 0xf5, 0x8f, 0x9a, 0x96, 0x0c, 0xd5, 0xeb, 0xfa, 0x7b, 0xaa, 0x17, 0xe8, 0x13, 0x12,\n+0xed, 0x44, 0x19, 0xc0, 0xd3, 0xf0, 0x06, 0x8b, 0xee, 0xa4, 0x7b, 0xbe, 0x42, 0xe7, 0x26, 0x54,\n+0xc8, 0x8e, 0x36, 0x76, 0xe3, 0x71, 0xe0, 0x9e, 0xd8, 0xa7, 0x42, 0xd9, 0xdb, 0x71, 0x91, 0x6b,\n+0x94, 0x93, 0xeb, 0xc3, 0xa3, 0xd1, 0x14, 0xa3, 0xfe, 0xab, 0x00, 0x90, 0x98, 0x9e, 0x24, 0xfc,\n+0xa9, 0xcc, 0x1a, 0x8a, 0xfb, 0x27, 0xb8, 0xbf, 0x30, 0x6e, 0xa8, 0x3b, 0x6a, 0x72, 0x26, 0x7a,\n+0xd0, 0x1e, 0xef, 0x7d, 0xe7, 0x3b, 0x69, 0x51, 0xd4, 0x6c, 0x8d, 0x9f, 0x90, 0x12, 0x66, 0xab,\n+0xb7, 0x63, 0xe7, 0x1a, 0xdd, 0x8d, 0xe9, 0x08, 0xa6, 0x55, 0x83, 0xa4, 0xe0, 0x6a, 0x50, 0x41,\n+0x65, 0x11, 0x42, 0x49, 0xe0, 0x8c, 0x9b, 0xdb, 0x25, 0x49, 0xb3, 0xf1, 0x7c, 0x86, 0xd6, 0xb2,\n+0x42, 0x87, 0x0b, 0xd0, 0x6b, 0xa0, 0xd9, 0xe4, 0x08, 0x76, 0xcd, 0xcb, 0x07, 0xff, 0x24, 0xf6,\n+0xc5, 0xcd, 0xed, 0xbb, 0x90, 0xbc, 0xe2, 0x84, 0x37, 0x46, 0x75, 0xf7, 0x0b, 0x58, 0xe5, 0x8b,\n+0xc6, 0x4c, 0x15, 0x37, 0xa4, 0x40, 0xa9, 0x30, 0xa9, 0x21, 0xbe, 0x47, 0x36, 0x5a, 0x56, 0xff,\n+0xb6, 0x08, 0x7b, 0x0d, 0x7a, 0xcc, 0xac, 0x20, 0x4c, 0x86, 0x56, 0x32, 0x5e, 0xcf, 0xab, 0x6e,\n+0x85, 0x2d, 0x70, 0x57, 0x75, 0x71, 0xa7, 0x19, 0x48, 0x19, 0xbc, 0x9d, 0x9d, 0xea, 0x41, 0x47,\n+0xdf, 0x94, 0xc4, 0x48, 0x77, 0x99, 0xd3, 0x79, 0x45, 0xeb, 0xa2, 0xaf, 0xf4, 0x92, 0xcb, 0x82,\n+0x31, 0x2d, 0x51, 0x8b, 0xa7, 0xa7, 0x21, 0x9d, 0xf3, 0x6d, 0xc8, 0x0f, 0xce, 0xc3, 0x4a, 0xb9,\n+0x99, 0x55, 0xf2, 0xb8, 0xdb, 0x60, 0xbf, 0xa9, 0x7e, 0xbd, 0x56, 0xb5, 0x97, 0x36, 0xa7, 0xd6,\n+0x03, 0xde, 0x50, 0x35, 0x56, 0xd1, 0x4c, 0xbb, 0x66, 0xf0, 0xa3, 0xe2, 0x1b, 0x1b, 0xc3, 0x97,\n+0xb2, 0x3d, 0xd1, 0x55, 0x4e, 0x22, 0x54, 0x20, 0x18, 0x95, 0xe6, 0xe3, 0x6e, 0xe6, 0x0f, 0xfa,\n+0xfa, 0xb9, 0x12, 0xed, 0x06, 0x17, 0x8f, 0x39, 0xb3, 0xdb, 0x48, 0xa4, 0xf9, 0xa1, 0xc5, 0xd8,\n+0xae, 0x36, 0x41, 0xcc, 0x11, 0x63, 0x69, 0x62, 0x29, 0xbc, 0x4b, 0xc6, 0xb1, 0x3e, 0xc3, 0x69,\n+0x03, 0xf8, 0xbf, 0x47, 0x01, 0xd4, 0x98, 0x26, 0x1a, 0x08, 0x02, 0xef, 0x63, 0x64, 0x2b, 0xc3,\n+0xec, 0xd7, 0xe3, 0x82, 0xd2, 0x71, 0x5d, 0x64, 0x4c, 0xdf, 0x2e, 0x67, 0x3f, 0xe7, 0xba, 0x98,\n+0xae, 0x1c, 0x0f, 0x4f, 0xcb, 0xd0, 0xbd, 0xa9, 0xe1, 0x98, 0x05, 0x51, 0xa1, 0x4d, 0x37, 0xa2,\n+0x83, 0x79, 0xce, 0x8d, 0x1d, 0x2a, 0xe4, 0x84, 0xd2, 0xc4, 0xb0, 0xd2, 0x91, 0xd4, 0x4c, 0x11,\n+0x71, 0xb3, 0x61, 0xcb, 0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, 0xd4, 0xe3, 0x3a, 0x9a, 0x85, 0x07,\n+0x10, 0x67, 0x28, 0xb6, 0xef, 0xf6, 0xbd, 0x05, 0x41, 0x6e, 0x20, 0xc1, 0x94, 0xda, 0x0f, 0xde,\n+0xa6, 0x91, 0x42, 0xfd, 0x13, 0x61, 0x4a, 0x23, 0x9e, 0x08, 0xa4, 0x29, 0xe5, 0xd8, 0x13, 0x04,\n+0x23, 0xee, 0x41, 0x25, 0x1d, 0x1c, 0x65, 0x0e, 0xa8, 0xf2, 0x25, 0x7b, 0xb4, 0x91, 0xcf, 0xe4,\n+0xb1, 0xb1, 0xe6, 0xbd, 0x55, 0x74, 0x6c, 0x05, 0xbf, 0x59, 0x20, 0x36, 0x00, 0x79, 0xa0, 0xa0,\n+0x22, 0x6b, 0x8c, 0xd5, 0xf2, 0x61, 0xd2, 0xb8, 0x2c, 0xcb, 0x82, 0x4a, 0xb5, 0x03, 0xf7, 0x76,\n+0x3b, 0x61, 0x82, 0x6a, 0x12, 0xaa, 0x18, 0x53, 0xeb, 0x03, 0x21, 0x94, 0xbf, 0xfe, 0xce, 0xca,\n+0x6a, 0x38, 0x5b, 0x26, 0x8d, 0xde, 0x8b, 0x5a, 0xf2, 0x4f, 0x7a, 0x54, 0x83, 0x19, 0x18, 0xe3,\n+0x08, 0x35, 0xa6, 0xba, 0xd2, 0x9f, 0x88, 0xdf, 0xa1, 0xcd, 0x2c, 0xbd, 0xec, 0xf5, 0x3b, 0x01,\n+0x01, 0x93, 0x33, 0x27, 0xb2, 0xeb, 0x60, 0x4b, 0xbb, 0xff, 0xca, 0x8e, 0x23, 0x9f, 0x4f, 0x99,\n+0xca, 0xdb, 0xe2, 0x68, 0xa6, 0xa5, 0x15, 0x27, 0x17, 0x1e, 0xd9, 0x0e, 0xc1, 0xf1, 0x26, 0xba,\n+0xa0, 0x2d, 0xae, 0x85, 0x81, 0xcf, 0xd3, 0xf1, 0x2a, 0x12, 0xbd, 0xb8, 0x0a, 0x67, 0xfd, 0xbc,\n+0x80, 0x4c, 0xd6, 0xeb, 0x74, 0xff, 0x49, 0x36, 0xa3, 0xd5, 0xd8, 0xfc, 0xb5, 0x3e, 0xc5, 0x6a,\n+0xf0, 0x94, 0x1d, 0x8c, 0xe4, 0xaf, 0x2b, 0x26, 0x71, 0x1a, 0x2b, 0x48, 0x27, 0x85, 0x2f, 0x52,\n+0x66, 0x2c, 0xef, 0xf0, 0x89, 0x13, 0x71, 0x3e, 0x03, 0x5c, 0xab, 0x73, 0x81, 0x87, 0xa8, 0xcc,\n+0xb0, 0xa6, 0xd5, 0x94, 0xe2, 0x36, 0x96, 0x49, 0xff, 0x05, 0x99, 0x2c, 0x31, 0x0a, 0x90, 0x8f,\n+0xb6, 0xc6, 0x9d, 0xd2, 0x44, 0x4b, 0x80, 0xb5, 0xa2, 0xe6, 0x1f, 0xb1, 0x12, 0x4f, 0x1b, 0x95,\n+0x9b, 0xe2, 0x07, 0x57, 0x67, 0x1c, 0x1e, 0xc0, 0x6a, 0x06, 0xde, 0x59, 0xb4, 0x9a, 0x2d, 0xdf,\n+0xdc, 0x19, 0x86, 0x2e, 0x8f, 0xf0, 0x4b, 0x7f, 0xa8, 0x2e, 0x45, 0x24, 0xae, 0x4d, 0x50, 0xfa,\n+0x63, 0x9a, 0x8b, 0xde, 0xe2, 0xdd, 0x1b, 0xbc, 0x60, 0x7b, 0x66, 0x1a, 0x45, 0x0d, 0x97, 0xca,\n+0x89, 0x50, 0x2f, 0x7d, 0x04, 0xcd, 0x34, 0xa8, 0xff, 0xfc, 0xfd, 0x4b, 0x3d, 0xe6, 0x29, 0x48,\n+0x9b, 0xea, 0x07, 0xca, 0x21, 0x44, 0x4a, 0x26, 0xde, 0x6e, 0xde, 0xd2, 0x83, 0xd0, 0x9f, 0x59,\n+0xae, 0x6c, 0x05, 0xa3, 0x93, 0x13, 0xe2, 0xa2, 0xe7, 0xe2, 0xd7, 0x1c, 0xd6, 0xc7, 0xf0, 0x7f,\n+0xc8, 0x67, 0x53, 0xa0, 0xcb, 0x0f, 0xc6, 0xdf, 0x42, 0x43, 0xcc, 0x3d, 0xcb, 0xb5, 0x48, 0x23,\n+0xa1, 0x1a, 0x7a, 0xa6, 0x2a, 0xbb, 0x34, 0x68, 0xaf, 0x44, 0x04, 0xc2, 0x41, 0x7e, 0x48, 0x83,\n+0xdb, 0x4e, 0x39, 0x02, 0xec, 0xec, 0x84, 0x7a, 0xe6, 0xce, 0xc9, 0xa4, 0x42, 0x32, 0xb6, 0x16,\n+0xfa, 0x04, 0xfd, 0xfe, 0x5d, 0x4b, 0x7a, 0xc3, 0xfd, 0xf7, 0x4c, 0x40, 0x1d, 0x5a, 0x43, 0xaf,\n+0x5b, 0x25, 0x7b, 0x96, 0xa4, 0x65, 0x51, 0x7e, 0xb8, 0x39, 0xf3, 0xc0, 0x78, 0x66, 0x5e, 0xe8,\n+0x3a, 0xe7, 0xf0, 0xee, 0x87, 0x11, 0x15, 0x08, 0xd1, 0xaa, 0xc1, 0x78, 0x0c, 0xb1, 0xaf, 0xce,\n+0xc6, 0xc9, 0x90, 0xef, 0xbf, 0x30, 0x04, 0xc0, 0xa3, 0x41, 0x06, 0xac, 0x90, 0x6d, 0xd1, 0x4a,\n+0xeb, 0x75, 0xa5, 0x4a, 0x10, 0x99, 0xb3, 0xb1, 0xa1, 0x8b, 0x4a, 0xf7, 0x99, 0xe0, 0x19, 0x67,\n+0x0d, 0x62, 0xdb, 0x76, 0xb3, 0xda, 0x3d, 0xb8, 0x5b, 0xe8, 0xfd, 0x42, 0xd2, 0x31, 0x0e, 0x87,\n+0x55, 0xa9, 0x84, 0x89, 0xd2, 0xc1, 0x32, 0xbd, 0x18, 0xcb, 0x6c, 0xa6, 0x07, 0x4e, 0xc8, 0xe7,\n+0x9d, 0xbe, 0x82, 0x90, 0xfd, 0xda, 0x14, 0xc4, 0x9f, 0x30, 0xde, 0x21, 0xbd, 0x1e, 0x42, 0x39,\n+0xfc, 0xab, 0x63, 0x23, 0x49, 0xe0, 0xf1, 0x84, 0xd3, 0x94, 0x8a, 0x4c, 0x62, 0x13, 0x2a, 0x19,\n+0x2e, 0xcc, 0xaf, 0x72, 0x8a, 0x7d, 0x36, 0xd7, 0x9a, 0x1c, 0xdc, 0x67, 0x2e, 0xe3, 0xdb, 0xb2,\n+0x49, 0xd0, 0x9c, 0x54, 0x79, 0x5c, 0xfa, 0x27, 0x2a, 0xfe, 0xcc, 0x4e, 0xd2, 0xe8, 0x4e, 0x54,\n+0x17, 0xa0, 0xcd, 0xc1, 0xe4, 0x41, 0xb6, 0x3a, 0x5b, 0x3b, 0xcb, 0x45, 0x9d, 0xbd, 0x1c, 0xc2,\n+0x98, 0xfa, 0x86, 0x58, 0xc6, 0x4f, 0xa2, 0x3d, 0x06, 0x63, 0x84, 0x09, 0x9c, 0xce, 0x62, 0xe4,\n+0x04, 0xac, 0x8d, 0x5c, 0xb5, 0xe9, 0xb6, 0x1b, 0x54, 0xb0, 0x7b, 0xad, 0x45, 0xb8, 0xe2, 0x40,\n+0x7f, 0xfb, 0x0a, 0x6e, 0xfb, 0xbe, 0x33, 0xc9, 0x3c, 0xa3, 0x84, 0xd5, 0x9f, 0x38, 0xc4, 0x56,\n+0x23, 0xc3, 0x39, 0xe8, 0xa0, 0x71, 0x6c, 0xe8, 0x54, 0x4c, 0xe4, 0xe8, 0x3a, 0xb1, 0xbf, 0x67,\n+0xfb, 0xef, 0x0d, 0x86, 0x9e, 0xb0, 0xe3, 0xdd, 0xa9, 0xb9, 0xf1, 0x21, 0x17, 0x7f, 0x3e, 0xfc,\n+0xf0, 0x77, 0x2b, 0x1a, 0x7c, 0x5d, 0x02, 0x84, 0x13, 0xd4, 0xcc, 0x8a, 0x9b, 0x81, 0xce, 0x17,\n+0x1c, 0x2e, 0x29, 0x1e, 0x9c, 0x48, 0x63, 0x42, 0xfe, 0xa1, 0xe0, 0x70, 0x1e, 0x2a, 0x03, 0x39,\n+0x52, 0x5a, 0x42, 0xbe, 0x5c, 0x91, 0x85, 0x7a, 0x18, 0xaa, 0x4d, 0xb5, 0xfb, 0x5a, 0x48, 0xd0,\n+0x80, 0x20, 0x40, 0xf2, 0xa8, 0xe9, 0x00, 0x07, 0x69, 0x19, 0x77, 0xa7, 0xe6, 0xc3, 0xf4, 0xcf,\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-multi/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/CMakeLists.txt\nnew file mode 100644\nindex 0000000..81789cc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/CMakeLists.txt\n@@ -0,0 +1,208 @@\n+project(lws-minimal-http-client-multi C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-multi)\n+set(SRCS minimal-http-client-multi.c)\n+\n+set(requirements 1)\n+set(MBEDTLS 0)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+require_lws_config(LWS_WITH_MBEDTLS 1 MBEDTLS)\n+\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\t\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\t\n+ #\n+ # instantiate the server per sai builder instance, they are running in the same\n+ # machine context in parallel so they can tread on each other otherwise\n+ #\n+ set(PORT_HCM_SRV \u00227670\u0022)\n+ if (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00220\u0022)\n+ set(PORT_HCM_SRV 7671)\n+ endif()\n+ if (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00221\u0022)\n+ set(PORT_HCM_SRV 7672)\n+ endif()\n+ if (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00222\u0022)\n+ set(PORT_HCM_SRV 7673)\n+ endif()\n+ if (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00223\u0022)\n+ set(PORT_HCM_SRV 7674)\n+ endif()\n+\n+\n+# hack\n+if (NOT WIN32 AND LWS_WITH_SERVER)\n+\n+\t#\n+\t# Tests against built server running locally (needs daemonization...)\n+\t#\n+\n+if (WIN32)\n+\tadd_test(NAME st_hcm_srv COMMAND cmd.exe /c start /b $\u003cTARGET_FILE:lws-minimal-http-server-tls\u003e --port ${PORT_HCM_SRV})\n+\tadd_test(NAME ki_hcm_srv COMMAND taskkill /F /IM $\u003cTARGET_FILE_NAME:lws-minimal-http-server-tls\u003e /T)\n+\tadd_test(NAME st_hcmp_srv COMMAND cmd.exe /c start /b $\u003cTARGET_FILE:test-server\u003e -s --port 1${PORT_HCM_SRV})\n+\tadd_test(NAME ki_hcmp_srv COMMAND taskkill /F /IM $\u003cTARGET_FILE_NAME:test-server\u003e /T)\n+else()\n+\t#\n+\t# mbedtls is too slow to keep up on some targets, when ctest is in parallel\n+\t#\n+\tif (VALGRIND AND NOT MBEDTLS)\n+\t\tadd_test(NAME st_hcm_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\thcm_srv ${VALGRIND} --tool\u003dmemcheck $\u003cTARGET_FILE:lws-minimal-http-server-tls\u003e\n+\t\t\t\t--port ${PORT_HCM_SRV})\n+\t\tadd_test(NAME ki_hcm_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\thcm_srv ${VALGRIND} $\u003cTARGET_FILE_NAME:lws-minimal-http-server-tls\u003e\n+\t\t\t\t\t--port ${PORT_HCM_SRV})\n+\t\tadd_test(NAME st_hcmp_srv COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\t\thcmp_srv ${VALGRIND} --tool\u003dmemcheck $\u003cTARGET_FILE:test-server\u003e -s\n+\t\t\t\t\t-r ${CMAKE_SOURCE_DIR}/destdir/usr/local/share/libwebsockets-test-server/\n+\t\t\t\t\t--port 1${PORT_HCM_SRV})\n+\t\tadd_test(NAME ki_hcmp_srv COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\t\thcmp_srv ${VALGRIND} $\u003cTARGET_FILE_NAME:test-server\u003e\n+\t\t\t\t\t--port 1${PORT_HCM_SRV})\n+\telse()\n+\t\tadd_test(NAME st_hcm_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\thcm_srv $\u003cTARGET_FILE:lws-minimal-http-server-tls\u003e\n+\t\t\t\t--port ${PORT_HCM_SRV} )\n+\t\tadd_test(NAME ki_hcm_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\thcm_srv $\u003cTARGET_FILE_NAME:lws-minimal-http-server-tls\u003e\n+\t\t\t\t\t--port ${PORT_HCM_SRV})\n+\t\tadd_test(NAME st_hcmp_srv COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\t\thcmp_srv $\u003cTARGET_FILE:test-server\u003e -s\n+\t\t\t\t\t-r ${CMAKE_SOURCE_DIR}/destdir/usr/local/share/libwebsockets-test-server/\n+\t\t\t\t\t--port 1${PORT_HCM_SRV} )\n+\t\tadd_test(NAME ki_hcmp_srv COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\t\thcmp_srv $\u003cTARGET_FILE_NAME:test-server\u003e\n+\t\t\t\t\t--port 1${PORT_HCM_SRV})\n+\tendif()\n+endif()\n+\n+\tset_tests_properties(st_hcm_srv PROPERTIES\n+ \t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-tls\n+\t\tFIXTURES_SETUP hcm_srv\n+\t\tTIMEOUT 800)\n+\tset_tests_properties(ki_hcm_srv PROPERTIES\n+\t\tFIXTURES_CLEANUP hcm_srv)\n+\n+\tset_tests_properties(st_hcmp_srv PROPERTIES\n+ \t\tWORKING_DIRECTORY .\n+\t\tFIXTURES_SETUP hcmp_srv\n+\t\tTIMEOUT 800)\n+\tset_tests_properties(ki_hcmp_srv PROPERTIES\n+\t\tFIXTURES_CLEANUP hcmp_srv)\n+\n+\t#\n+\t# Tests against local server peer\n+\t#\n+\n+\tadd_test(NAME http-client-multi COMMAND lws-minimal-http-client-multi\n+\t\t\t-l --port ${PORT_HCM_SRV} -d 1151)\n+\tadd_test(NAME http-client-multi-h1 COMMAND lws-minimal-http-client-multi\n+\t\t\t--h1 -l --port ${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-pipe COMMAND lws-minimal-http-client-multi\n+\t\t\t-p -l --port ${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-h1-pipe COMMAND lws-minimal-http-client-multi\n+\t\t\t--h1 -p -l --port ${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-stag COMMAND lws-minimal-http-client-multi\n+\t\t\t-s -l --port ${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-stag-h1 COMMAND lws-minimal-http-client-multi\n+\t\t\t--h1 -s -l --port ${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-stag-pipe COMMAND lws-minimal-http-client-multi\n+\t\t\t-p -s -l --port ${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-stag-h1-pipe COMMAND lws-minimal-http-client-multi\n+\t\t\t--h1 -p -s -l --port ${PORT_HCM_SRV} -d1151)\n+\n+\t# confirm that the pipelined mode really is doing it in one connection\n+\tadd_test(NAME http-client-multi-restrict-pipe COMMAND lws-minimal-http-client-multi -d1151 --limit 1 -p -l --port ${PORT_HCM_SRV})\n+\tadd_test(NAME http-client-multi-restrict-h1-pipe COMMAND lws-minimal-http-client-multi -d1151 --limit 1 --h1 -p -l --port ${PORT_HCM_SRV})\n+\tadd_test(NAME http-client-multi-restrict-stag-pipe COMMAND lws-minimal-http-client-multi -d1151 --limit 1 -p -s -l --port ${PORT_HCM_SRV})\n+\tadd_test(NAME http-client-multi-restrict-stag-h1-pipe COMMAND lws-minimal-http-client-multi -d1151 --limit 1 --h1 -p -s -l --port ${PORT_HCM_SRV})\n+\t# confirm that we do fail with a one connection limit and no pipelining\n+\tadd_test(NAME http-client-multi-restrict-nopipe-fail COMMAND lws-minimal-http-client-multi --limit 1 -l --port ${PORT_HCM_SRV} -d1151)\n+\tset_property(TEST http-client-multi-restrict-nopipe-fail PROPERTY WILL_FAIL TRUE)\n+\tadd_test(NAME http-client-multi-restrict-h1-nopipe-fail COMMAND lws-minimal-http-client-multi --limit 1 --h1 -l --port ${PORT_HCM_SRV} -d1151)\n+\tset_property(TEST http-client-multi-restrict-h1-nopipe-fail PROPERTY WILL_FAIL TRUE)\n+\n+\tset_tests_properties(http-client-multi-restrict-pipe\n+\t\t\t http-client-multi-restrict-h1-pipe\n+\t\t\t http-client-multi-restrict-stag-pipe\n+\t\t\t http-client-multi-restrict-stag-h1-pipe\n+\t\t\t http-client-multi-restrict-nopipe-fail\n+\t\t\t http-client-multi-restrict-h1-nopipe-fail\n+\t\t\t http-client-multi\n+\t\t\t http-client-multi-h1\n+\t\t\t http-client-multi-pipe\n+\t\t\t http-client-multi-h1-pipe\n+\t\t\t http-client-multi-stag\n+\t\t\t http-client-multi-stag-h1\n+\t\t\t http-client-multi-stag-pipe\n+\t\t\t http-client-multi-stag-h1-pipe\n+\t\t\t PROPERTIES\n+\t\t\t FIXTURES_REQUIRED \u0022hcm_srv\u0022\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-multi\n+\t\t\t TIMEOUT 50)\n+\n+\t# POSTs against local http-server-form-post\n+\tadd_test(NAME http-client-multi-post COMMAND lws-minimal-http-client-multi\n+\t\t\t--post -l --port 1${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-post-h1 COMMAND lws-minimal-http-client-multi\n+\t\t\t--post --h1 -l --port 1${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-post-pipe COMMAND lws-minimal-http-client-multi\n+\t\t\t--post -p -l --port 1${PORT_HCM_SRV} -d1151)\n+\tif (VALGRIND)\n+\t\tadd_test(NAME http-client-multi-post-h1-pipe COMMAND ${VALGRIND} --tool\u003dmemcheck $\u003cTARGET_FILE:lws-minimal-http-client-multi\u003e\n+\t\t\t--post --h1 -p -l --port 1${PORT_HCM_SRV} -d1151)\t\n+\telse()\n+\t\tadd_test(NAME http-client-multi-post-h1-pipe COMMAND lws-minimal-http-client-multi\n+\t\t\t--post --h1 -p -l --port 1${PORT_HCM_SRV} -d1151)\n+\tendif()\n+\tadd_test(NAME http-client-multi-post-stag COMMAND lws-minimal-http-client-multi\n+\t\t\t--post -s -l -d1151 --port 1${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-post-stag-h1 COMMAND lws-minimal-http-client-multi\n+\t\t\t--post --h1 -d1151 -s -l --port 1${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-post-stag-pipe COMMAND lws-minimal-http-client-multi\n+\t\t\t--post -p -s -l --port 1${PORT_HCM_SRV} -d1151)\n+\tadd_test(NAME http-client-multi-post-stag-h1-pipe COMMAND lws-minimal-http-client-multi\n+\t\t\t--post --h1 -p -s -l --port 1${PORT_HCM_SRV} -d1151)\n+\tset_tests_properties(http-client-multi-post\n+\t\t\t http-client-multi-post-h1\n+\t\t\t http-client-multi-post-pipe\n+\t\t\t http-client-multi-post-h1-pipe\n+\t\t\t http-client-multi-post-stag\n+\t\t\t http-client-multi-post-stag-h1\n+\t\t\t http-client-multi-post-stag-pipe\n+\t\t\t http-client-multi-post-stag-h1-pipe\n+\t\t\t PROPERTIES\n+\t\t\t \tFIXTURES_REQUIRED \u0022hcmp_srv\u0022\n+\t\t\t \tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-multi\n+\t\t\t \tTIMEOUT 20)\n+\n+endif(NOT WIN32 AND LWS_WITH_SERVER)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-multi/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/README.md\nnew file mode 100644\nindex 0000000..784e5cb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/README.md\n@@ -0,0 +1,30 @@\n+# lws minimal http client multi\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+The application goes to https://warmcat.com and receives the page data\n+same as minimal http client.\n+\n+However it does it for 8 client connections concurrently.\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-s|Stagger the connections by 100ms, the last by 1s\n+-p|Use http/1.1 pipelining or h2 simultaneous streams\n+--h1|Force http/1 only\n+-l|Connect to server on https://localhost:7681 instead of https://warmcat.com:443\n+-n|Read numbered files like /1.png, /2.png etc. Default is just read /\n+--uv|Use libuv event loop if lws built for it\n+--event|Use libevent event loop if lws built for it\n+--ev|Use libev event loop if lws built for it\n+--post|POST to the server rather than GET\n+-c\u003cn\u003e|Create n connections (n can be 1 .. 8)\n+--path \u003cpath\u003e|Force the URL path (should start with /)\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-multi/minimal-http-client-multi.c b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/minimal-http-client-multi.c\nnew file mode 100644\nindex 0000000..d0d11f3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/minimal-http-client-multi.c\n@@ -0,0 +1,705 @@\n+/*\n+ * lws-minimal-http-client-multi\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws, which makes\n+ * 8 downloads simultaneously from warmcat.com.\n+ *\n+ * Currently that takes the form of 8 individual simultaneous tcp and\n+ * tls connections, which happen concurrently. Notice that the ordering\n+ * of the returned payload may be intermingled for the various connections.\n+ *\n+ * By default the connections happen all together at the beginning and operate\n+ * concurrently, which is fast. However this is resource-intenstive, there are\n+ * 8 tcp connections, 8 tls tunnels on both the client and server. You can\n+ * instead opt to have the connections happen one after the other inside a\n+ * single tcp connection and tls tunnel, using HTTP/1.1 pipelining. To be\n+ * eligible to be pipelined on another existing connection to the same server,\n+ * the client connection must have the LCCSCF_PIPELINE flag on its\n+ * info.ssl_connection member (this is independent of whether the connection\n+ * is in ssl mode or not).\n+ *\n+ * HTTP/1.0: Pipelining only possible if Keep-Alive: yes sent by server\n+ * HTTP/1.1: always possible... serializes requests\n+ * HTTP/2: always possible... all requests sent as individual streams in parallel\n+ *\n+ * Note: stats are kept on tls session reuse and checked depending on mode\n+ *\n+ * - default: no reuse expected (connections made too quickly at once)\n+ * - staggered, no pipeline: n - 1 reuse expected\n+ * - staggered, pipelined: no reuse expected\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cassert.h\u003e\n+#include \u003ctime.h\u003e\n+#if !defined(WIN32)\n+#include \u003csys/stat.h\u003e\n+#include \u003cfcntl.h\u003e\n+#include \u003cunistd.h\u003e\n+#endif\n+\n+#define COUNT 8\n+\n+struct cliuser {\n+\tint index;\n+};\n+\n+static int completed, failed, numbered, stagger_idx, posting, count \u003d COUNT,\n+#if defined(LWS_WITH_TLS_SESSIONS)\n+\t reuse,\n+#endif\n+\t staggered;\n+static lws_sorted_usec_list_t sul_stagger;\n+static struct lws_client_connect_info i;\n+static struct lws *client_wsi[COUNT];\n+static char urlpath[64], intr;\n+static struct lws_context *context;\n+\n+/* we only need this for tracking POST emit state */\n+\n+struct pss {\n+\tchar body_part;\n+};\n+\n+#if defined(LWS_WITH_TLS_SESSIONS) \u0026\u0026 !defined(LWS_WITH_MBEDTLS) \u0026\u0026 !defined(WIN32)\n+\n+/* this should work OK on win32, but not adapted for non-posix file apis */\n+\n+static int\n+sess_save_cb(struct lws_context *cx, struct lws_tls_session_dump *info)\n+{\n+\tchar path[128];\n+\tint fd, n;\n+\n+\tlws_snprintf(path, sizeof(path), \u0022%s/lws_tls_sess_%s\u0022, (const char *)info-\u003eopaque,\n+\t\t\tinfo-\u003etag);\n+\tfd \u003d open(path, LWS_O_WRONLY | O_CREAT | O_TRUNC, 0600);\n+\tif (fd \u003c 0) {\n+\t\tlwsl_warn(\u0022%s: cannot open %s\u005cn\u0022, __func__, path);\n+\t\treturn 1;\n+\t}\n+\n+\tn \u003d (int)write(fd, info-\u003eblob, info-\u003eblob_len);\n+\n+\tclose(fd);\n+\n+\treturn n !\u003d (int)info-\u003eblob_len;\n+}\n+\n+static int\n+sess_load_cb(struct lws_context *cx, struct lws_tls_session_dump *info)\n+{\n+\tstruct stat sta;\n+\tchar path[128];\n+\tint fd, n;\n+\n+\tlws_snprintf(path, sizeof(path), \u0022%s/lws_tls_sess_%s\u0022, (const char *)info-\u003eopaque,\n+\t\t\tinfo-\u003etag);\n+\tfd \u003d open(path, LWS_O_RDONLY);\n+\tif (fd \u003c 0)\n+\t\treturn 1;\n+\n+\tif (fstat(fd, \u0026sta) || !sta.st_size)\n+\t\tgoto bail;\n+\n+\tinfo-\u003eblob \u003d malloc((size_t)sta.st_size);\n+\t/* caller will free this */\n+\tif (!info-\u003eblob)\n+\t\tgoto bail;\n+\n+\tinfo-\u003eblob_len \u003d (size_t)sta.st_size;\n+\n+\tn \u003d (int)read(fd, info-\u003eblob, info-\u003eblob_len);\n+\tclose(fd);\n+\n+\treturn n !\u003d (int)info-\u003eblob_len;\n+\n+bail:\n+\tclose(fd);\n+\n+\treturn 1;\n+}\n+#endif\n+\n+#if defined(LWS_WITH_CONMON)\n+void\n+dump_conmon_data(struct lws *wsi)\n+{\n+\tconst struct addrinfo *ai;\n+\tstruct lws_conmon cm;\n+\tchar ads[48];\n+\n+\tlws_conmon_wsi_take(wsi, \u0026cm);\n+\n+\tlws_sa46_write_numeric_address(\u0026cm.peer46, ads, sizeof(ads));\n+\tlwsl_notice(\u0022%s: peer %s, dns: %uus, sockconn: %uus, tls: %uus, txn_resp: %uus\u005cn\u0022,\n+\t\t __func__, ads,\n+\t\t (unsigned int)cm.ciu_dns,\n+\t\t (unsigned int)cm.ciu_sockconn,\n+\t\t (unsigned int)cm.ciu_tls,\n+\t\t (unsigned int)cm.ciu_txn_resp);\n+\n+\tai \u003d cm.dns_results_copy;\n+\twhile (ai) {\n+\t\tlws_sa46_write_numeric_address((lws_sockaddr46 *)ai-\u003eai_addr, ads, sizeof(ads));\n+\t\tlwsl_notice(\u0022%s: DNS %s\u005cn\u0022, __func__, ads);\n+\t\tai \u003d ai-\u003eai_next;\n+\t}\n+\n+\t/*\n+\t * This destroys the DNS list in the lws_conmon that we took\n+\t * responsibility for when we used lws_conmon_wsi_take()\n+\t */\n+\n+\tlws_conmon_release(\u0026cm);\n+}\n+#endif\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tchar buf[LWS_PRE + 1024], *start \u003d \u0026buf[LWS_PRE], *p \u003d start,\n+\t *end \u003d \u0026buf[sizeof(buf) - LWS_PRE - 1];\n+\tint n, idx \u003d (int)(intptr_t)lws_get_opaque_user_data(wsi);\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP: idx: %d, resp %u\u005cn\u0022,\n+\t\t\t\tidx, lws_http_client_http_response(wsi));\n+\n+#if defined(LWS_WITH_TLS_SESSIONS) \u0026\u0026 !defined(LWS_WITH_MBEDTLS) \u0026\u0026 !defined(WIN32)\n+\t\tif (lws_tls_session_is_reused(wsi))\n+\t\t\treuse++;\n+\t\telse\n+\t\t\t/*\n+\t\t\t * Attempt to store any new session into\n+\t\t\t * external storage\n+\t\t\t */\n+\t\t\tif (lws_tls_session_dump_save(lws_get_vhost_by_name(context, \u0022default\u0022),\n+\t\t\t\t\ti.host, (uint16_t)i.port,\n+\t\t\t\t\tsess_save_cb, \u0022/tmp\u0022))\n+\t\tlwsl_warn(\u0022%s: session save failed\u005cn\u0022, __func__);\n+#endif\n+\t\tbreak;\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tclient_wsi[idx] \u003d NULL;\n+\t\tfailed++;\n+\n+#if defined(LWS_WITH_CONMON)\n+\t\tdump_conmon_data(wsi);\n+#endif\n+\n+\t\tgoto finished;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: conn %d: read %d\u005cn\u0022, idx, (int)len);\n+\t\tlwsl_hexdump_info(in, len);\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:\n+\n+\t\t/*\n+\t\t * Tell lws we are going to send the body next...\n+\t\t */\n+\t\tif (posting \u0026\u0026 !lws_http_is_redirected_to_get(wsi)) {\n+\t\t\tlwsl_user(\u0022%s: conn %d, doing POST flow\u005cn\u0022, __func__, idx);\n+\t\t\tlws_client_http_body_pending(wsi, 1);\n+\t\t\tlws_callback_on_writable(wsi);\n+\t\t} else\n+\t\t\tlwsl_user(\u0022%s: conn %d, doing GET flow\u005cn\u0022, __func__, idx);\n+\t\tbreak;\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP %s: idx %d\u005cn\u0022,\n+\t\t\t lws_wsi_tag(wsi), idx);\n+\t\tclient_wsi[idx] \u003d NULL;\n+\t\tgoto finished;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tlwsl_info(\u0022%s: closed: %s\u005cn\u0022, __func__, lws_wsi_tag(client_wsi[idx]));\n+\n+#if defined(LWS_WITH_CONMON)\n+\t\tdump_conmon_data(wsi);\n+#endif\n+\n+\t\tif (client_wsi[idx]) {\n+\t\t\t/*\n+\t\t\t * If it completed normally, it will have been set to\n+\t\t\t * NULL then already. So we are dealing with an\n+\t\t\t * abnormal, failing, close\n+\t\t\t */\n+\t\t\tclient_wsi[idx] \u003d NULL;\n+\t\t\tfailed++;\n+\t\t\tgoto finished;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_HTTP_WRITEABLE:\n+\t\tif (!posting)\n+\t\t\tbreak;\n+\t\tif (lws_http_is_redirected_to_get(wsi))\n+\t\t\tbreak;\n+\t\tlwsl_info(\u0022LWS_CALLBACK_CLIENT_HTTP_WRITEABLE: %s, idx %d,\u0022\n+\t\t\t\t\u0022 part %d\u005cn\u0022, lws_wsi_tag(wsi), idx, pss-\u003ebody_part);\n+\n+\t\tn \u003d LWS_WRITE_HTTP;\n+\n+\t\t/*\n+\t\t * For a small body like this, we could prepare it in memory and\n+\t\t * send it all at once. But to show how to handle, eg,\n+\t\t * arbitrary-sized file payloads, or huge form-data fields, the\n+\t\t * sending is done in multiple passes through the event loop.\n+\t\t */\n+\n+\t\tswitch (pss-\u003ebody_part++) {\n+\t\tcase 0:\n+\t\t\tif (lws_client_http_multipart(wsi, \u0022text\u0022, NULL, NULL,\n+\t\t\t\t\t\t \u0026p, end))\n+\t\t\t\treturn -1;\n+\t\t\t/* notice every usage of the boundary starts with -- */\n+\t\t\tp +\u003d lws_snprintf(p, lws_ptr_diff_size_t(end, p), \u0022my text field\u005cxd\u005cxa\u0022);\n+\t\t\tbreak;\n+\t\tcase 1:\n+\t\t\tif (lws_client_http_multipart(wsi, \u0022file\u0022, \u0022myfile.txt\u0022,\n+\t\t\t\t\t\t \u0022text/plain\u0022, \u0026p, end))\n+\t\t\t\treturn -1;\n+\t\t\tp +\u003d lws_snprintf(p, lws_ptr_diff_size_t(end, p),\n+\t\t\t\t\t\u0022This is the contents of the \u0022\n+\t\t\t\t\t\u0022uploaded file.\u005cxd\u005cxa\u0022\n+\t\t\t\t\t\u0022\u005cxd\u005cxa\u0022);\n+\t\t\tbreak;\n+\t\tcase 2:\n+\t\t\tif (lws_client_http_multipart(wsi, NULL, NULL, NULL,\n+\t\t\t\t\t\t \u0026p, end))\n+\t\t\t\treturn -1;\n+\t\t\tlws_client_http_body_pending(wsi, 0);\n+\t\t\t /* necessary to support H2, it means we will write no\n+\t\t\t * more on this stream */\n+\t\t\tn \u003d LWS_WRITE_HTTP_FINAL;\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\t/*\n+\t\t\t * We can get extra callbacks here, if nothing to do,\n+\t\t\t * then do nothing.\n+\t\t\t */\n+\t\t\treturn 0;\n+\t\t}\n+\n+\t\tif (lws_write(wsi, (uint8_t *)start, lws_ptr_diff_size_t(p, start), (enum lws_write_protocol)n)\n+\t\t\t\t!\u003d lws_ptr_diff(p, start))\n+\t\t\treturn 1;\n+\n+\t\tif (n !\u003d LWS_WRITE_HTTP_FINAL)\n+\t\t\tlws_callback_on_writable(wsi);\n+\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+\n+finished:\n+\tif (++completed \u003d\u003d count) {\n+\t\tif (!failed)\n+\t\t\tlwsl_user(\u0022Done: all OK\u005cn\u0022);\n+\t\telse\n+\t\t\tlwsl_err(\u0022Done: failed: %d\u005cn\u0022, failed);\n+\t\tintr \u003d 1;\n+\t\t/*\n+\t\t * This is how we can exit the event loop even when it's an\n+\t\t * event library backing it... it will start and stage the\n+\t\t * destroy to happen after we exited this service for each pt\n+\t\t */\n+\t\tlws_context_destroy(lws_get_context(wsi));\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, callback_http, sizeof(struct pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\n+static int\n+my_metric_report(lws_metric_pub_t *mp)\n+{\n+\tlws_metric_bucket_t *sub \u003d mp-\u003eu.hist.head;\n+\tchar buf[192];\n+\n+\tdo {\n+\t\tif (lws_metrics_format(mp, \u0026sub, buf, sizeof(buf)))\n+\t\t\tlwsl_user(\u0022%s: %s\u005cn\u0022, __func__, buf);\n+\t} while ((mp-\u003eflags \u0026 LWSMTFL_REPORT_HIST) \u0026\u0026 sub);\n+\n+\t/* 0 \u003d leave metric to accumulate, 1 \u003d reset the metric */\n+\n+\treturn 1;\n+}\n+\n+static const lws_system_ops_t system_ops \u003d {\n+\t.metric_report \u003d my_metric_report,\n+};\n+\n+#endif\n+\n+static void\n+stagger_cb(lws_sorted_usec_list_t *sul);\n+\n+static void\n+lws_try_client_connection(struct lws_client_connect_info *i, int m)\n+{\n+\tchar path[128];\n+\n+\tif (numbered) {\n+\t\tlws_snprintf(path, sizeof(path), \u0022/%d.png\u0022, m + 1);\n+\t\ti-\u003epath \u003d path;\n+\t} else\n+\t\ti-\u003epath \u003d urlpath;\n+\n+\ti-\u003epwsi \u003d \u0026client_wsi[m];\n+\ti-\u003eopaque_user_data \u003d (void *)(intptr_t)m;\n+\n+\tif (!lws_client_connect_via_info(i)) {\n+\t\tfailed++;\n+\t\tlwsl_user(\u0022%s: failed: conn idx %d\u005cn\u0022, __func__, m);\n+\t\tif (++completed \u003d\u003d count) {\n+\t\t\tlwsl_user(\u0022Done: failed: %d\u005cn\u0022, failed);\n+\t\t\tlws_context_destroy(context);\n+\t\t}\n+\t} else\n+\t\tlwsl_user(\u0022started connection %s: idx %d (%s)\u005cn\u0022,\n+\t\t\t lws_wsi_tag(client_wsi[m]), m, i-\u003epath);\n+}\n+\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d mgr-\u003eparent;\n+\tint m;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL || target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\t/* all the system prerequisites are ready */\n+\n+\tif (!staggered)\n+\t\t/*\n+\t\t * just pile on all the connections at once, testing the\n+\t\t * pipeline queuing before the first is connected\n+\t\t */\n+\t\tfor (m \u003d 0; m \u003c count; m++)\n+\t\t\tlws_try_client_connection(\u0026i, m);\n+\telse\n+\t\t/*\n+\t\t * delay the connections slightly\n+\t\t */\n+\t\tlws_sul_schedule(context, 0, \u0026sul_stagger, stagger_cb,\n+\t\t\t\t 50 * LWS_US_PER_MS);\n+\n+\treturn 0;\n+}\n+\n+static void\n+signal_cb(void *handle, int signum)\n+{\n+\tswitch (signum) {\n+\tcase SIGTERM:\n+\tcase SIGINT:\n+\t\tbreak;\n+\tdefault:\n+\t\tlwsl_err(\u0022%s: signal %d\u005cn\u0022, __func__, signum);\n+\t\tbreak;\n+\t}\n+\tlws_context_destroy(context);\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tsignal_cb(NULL, sig);\n+}\n+\n+#if defined(WIN32)\n+int gettimeofday(struct timeval * tp, struct timezone * tzp)\n+{\n+ // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's\n+ // This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC)\n+ // until 00:00:00 January 1, 1970 \n+ static const uint64_t EPOCH \u003d ((uint64_t) 116444736000000000ULL);\n+\n+ SYSTEMTIME system_time;\n+ FILETIME file_time;\n+ uint64_t time;\n+\n+ GetSystemTime( \u0026system_time );\n+ SystemTimeToFileTime( \u0026system_time, \u0026file_time );\n+ time \u003d ((uint64_t)file_time.dwLowDateTime ) ;\n+ time +\u003d ((uint64_t)file_time.dwHighDateTime) \u003c\u003c 32;\n+\n+ tp-\u003etv_sec \u003d (long) ((time - EPOCH) / 10000000L);\n+ tp-\u003etv_usec \u003d (long) (system_time.wMilliseconds * 1000);\n+ return 0;\n+}\n+#endif\n+\n+unsigned long long us(void)\n+{\n+\tstruct timeval t;\n+\n+\tgettimeofday(\u0026t, NULL);\n+\n+\treturn ((unsigned long long)t.tv_sec * 1000000ull) + (unsigned long long)t.tv_usec;\n+}\n+\n+static void\n+stagger_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tlws_usec_t next;\n+\n+\t/*\n+\t * open the connections at 100ms intervals, with the\n+\t * last one being after 1s, testing both queuing, and\n+\t * direct H2 stream addition stability\n+\t */\n+\tlws_try_client_connection(\u0026i, stagger_idx++);\n+\n+\tif (stagger_idx \u003d\u003d count)\n+\t\treturn;\n+\n+\tnext \u003d 150 * LWS_US_PER_MS;\n+\tif (stagger_idx \u003d\u003d count - 1)\n+\t\tnext +\u003d 400 * LWS_US_PER_MS;\n+\n+#if defined(LWS_WITH_TLS_SESSIONS)\n+\tif (stagger_idx \u003d\u003d 1)\n+\t\tnext +\u003d 600 * LWS_US_PER_MS;\n+#endif\n+\n+\tlws_sul_schedule(context, 0, \u0026sul_stagger, stagger_cb, next);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tstruct lws_context_creation_info info;\n+\tunsigned long long start;\n+\tconst char *p;\n+#if defined(LWS_WITH_TLS_SESSIONS)\n+\tint pl \u003d 0;\n+#endif\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tinfo.signal_cb \u003d signal_cb;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--uv\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBUV;\n+\telse\n+\t\tif (lws_cmdline_option(argc, argv, \u0022--event\u0022))\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEVENT;\n+\t\telse\n+\t\t\tif (lws_cmdline_option(argc, argv, \u0022--ev\u0022))\n+\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEV;\n+\t\t\telse\n+\t\t\t\tif (lws_cmdline_option(argc, argv, \u0022--glib\u0022))\n+\t\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_GLIB;\n+\t\t\t\telse\n+\t\t\t\t\tsignal(SIGINT, sigint_handler);\n+\n+\tstaggered \u003d !!lws_cmdline_option(argc, argv, \u0022-s\u0022);\n+\n+\tlwsl_user(\u0022LWS minimal http client [-s (staggered)] [-p (pipeline)]\u005cn\u0022);\n+\tlwsl_user(\u0022 [--h1 (http/1 only)] [-l (localhost)] [-d \u003clogs\u003e]\u005cn\u0022);\n+\tlwsl_user(\u0022 [-n (numbered)] [--post]\u005cn\u0022);\n+\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * COUNT client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and COUNT + 1 (allowing for h2\n+\t * network wsi) that we will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + COUNT + 1;\n+\tinfo.register_notifier_list \u003d na;\n+\tinfo.pcontext \u003d \u0026context;\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\tinfo.system_ops \u003d \u0026system_ops;\n+#endif\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+\n+\t/* vhost option allowing tls session reuse, requires\n+\t * LWS_WITH_TLS_SESSIONS build option */\n+\tif (lws_cmdline_option(argc, argv, \u0022--no-tls-session-reuse\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DISABLE_TLS_SESSION_CACHE;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--limit\u0022)))\n+\t\tinfo.simultaneous_ssl_restriction \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--ssl-handshake-serialize\u0022)))\n+\t\t/* We only consider simultaneous_ssl_restriction \u003e 1 use cases.\n+\t\t * If ssl isn't limited or only 1 is allowed, we don't care.\n+\t\t */\n+\t\tinfo.simultaneous_ssl_handshake_restriction \u003d atoi(p);\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+#if defined(LWS_ROLE_H2) \u0026\u0026 defined(LWS_ROLE_H1)\n+\ti.alpn \u003d \u0022h2,http/1.1\u0022;\n+#elif defined(LWS_ROLE_H2)\n+\ti.alpn \u003d \u0022h2\u0022;\n+#elif defined(LWS_ROLE_H1)\n+\ti.alpn \u003d \u0022http/1.1\u0022;\n+#endif\n+\n+\ti.context \u003d context;\n+\ti.ssl_connection \u003d LCCSCF_USE_SSL |\n+\t\t\t LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--post\u0022)) {\n+\t\tposting \u003d 1;\n+\t\ti.method \u003d \u0022POST\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_HTTP_MULTIPART_MIME;\n+\t} else\n+\t\ti.method \u003d \u0022GET\u0022;\n+\n+\t/* enables h1 or h2 connection sharing */\n+\tif (lws_cmdline_option(argc, argv, \u0022-p\u0022)) {\n+\t\ti.ssl_connection |\u003d LCCSCF_PIPELINE;\n+#if defined(LWS_WITH_TLS_SESSIONS)\n+\t\tpl \u003d 1;\n+#endif\n+\t}\n+\n+#if defined(LWS_WITH_CONMON)\n+\tif (lws_cmdline_option(argc, argv, \u0022--conmon\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_CONMON;\n+#endif\n+\n+\t/* force h1 even if h2 available */\n+\tif (lws_cmdline_option(argc, argv, \u0022--h1\u0022))\n+\t\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\tstrcpy(urlpath, \u0022/\u0022);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t\tif (posting)\n+\t\t\tstrcpy(urlpath, \u0022/formtest\u0022);\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022libwebsockets.org\u0022;\n+\t\tif (posting)\n+\t\t\tstrcpy(urlpath, \u0022/testserver/formtest\u0022);\n+\t}\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--no-tls\u0022))\n+\t\ti.ssl_connection \u0026\u003d ~(LCCSCF_USE_SSL);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-n\u0022))\n+\t\tnumbered \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--server\u0022)))\n+\t\ti.address \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--port\u0022)))\n+\t\ti.port \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--path\u0022)))\n+\t\tlws_strncpy(urlpath, p, sizeof(urlpath));\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022)))\n+\t\tif (atoi(p) \u003c\u003d COUNT \u0026\u0026 atoi(p))\n+\t\t\tcount \u003d atoi(p);\n+\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.protocol \u003d protocols[0].name;\n+\n+#if defined(LWS_WITH_TLS_SESSIONS) \u0026\u0026 !defined(LWS_WITH_MBEDTLS) \u0026\u0026 !defined(WIN32)\n+\t/*\n+\t * Attempt to preload a session from external storage\n+\t */\n+\tif (lws_tls_session_dump_load(lws_get_vhost_by_name(context, \u0022default\u0022),\n+\t\t\t\t i.host, (uint16_t)i.port, sess_load_cb, \u0022/tmp\u0022))\n+\t\tlwsl_warn(\u0022%s: session load failed\u005cn\u0022, __func__);\n+#endif\n+\n+\tstart \u003d us();\n+\twhile (!intr \u0026\u0026 !lws_service(context, 0))\n+\t\t;\n+\n+#if defined(LWS_WITH_TLS_SESSIONS)\n+\tlwsl_user(\u0022%s: session reuse count %d\u005cn\u0022, __func__, reuse);\n+\n+\tif (staggered \u0026\u0026 !pl \u0026\u0026 !reuse) {\n+\t\tlwsl_err(\u0022%s: failing, expected 1 .. %d reused\u005cn\u0022, __func__, count - 1);\n+\t\t// too difficult to reproduce in CI\n+\t\t// failed \u003d 1;\n+\t}\n+#endif\n+\n+\tlwsl_user(\u0022Duration: %lldms\u005cn\u0022, (us() - start) / 1000);\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Exiting with %d\u005cn\u0022, failed || completed !\u003d count);\n+\n+\treturn failed || completed !\u003d count;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-multi/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-post/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-post/CMakeLists.txt\nnew file mode 100644\nindex 0000000..e2aa5ed\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-post/CMakeLists.txt\n@@ -0,0 +1,109 @@\n+project(lws-minimal-http-client-post C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client-post)\n+set(SRCS minimal-http-client-post.c)\n+\n+set(requirements 1)\n+set(MBEDTLS 0)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+require_lws_config(LWS_WITH_MBEDTLS 1 MBEDTLS)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\t\n+\t#\n+\t# instantiate the server per sai builder instance, they are running in the same\n+\t# machine context in parallel so they can tread on each other otherwise\n+\t#\n+\tset(PORT_HCP_SRV \u00227640\u0022)\n+\tif (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00220\u0022)\n+\t\tset(PORT_HCP_SRV 7641)\n+\tendif()\n+\tif (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00221\u0022)\n+\t\tset(PORT_HCP_SRV 7642)\n+\tendif()\n+\tif (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00222\u0022)\n+\t\tset(PORT_HCP_SRV 7643)\n+\tendif()\n+\tif (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00223\u0022)\n+\t\tset(PORT_HCP_SRV 7644)\n+\tendif()\n+\t\n+# hack\n+if (NOT WIN32 AND LWS_WITH_SERVER)\n+\n+\t#\n+\t# Tests against built server running locally (needs daemonization...)\n+\t#\n+\n+if (WIN32)\n+\tadd_test(NAME st_hcp_srv COMMAND cmd.exe /c start /b $\u003cTARGET_FILE:test-server\u003e -s --port ${PORT_HCP_SRV})\n+\tadd_test(NAME ki_hcp_srv COMMAND taskkill /F /IM $\u003cTARGET_FILE_NAME:test-server\u003e /T)\n+else()\n+\t#\n+\t# mbedtls is too slow to keep up on some targets, when ctest is in parallel\n+\t#\n+\tif (VALGRIND AND NOT MBEDTLS)\n+\t\tadd_test(NAME st_hcp_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\t\thcp_srv ${VALGRIND} --tool\u003dmemcheck \n+\t\t\t\t\t$\u003cTARGET_FILE:test-server\u003e\n+\t\t\t\t\t-r ${CMAKE_SOURCE_DIR}/destdir/usr/local/share/libwebsockets-test-server/\n+\t\t\t\t\t-s --port ${PORT_HCP_SRV} -d1151)\n+\t\tadd_test(NAME ki_hcp_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh hcp_srv ${VALGRIND}\n+\t\t\t\t\t$\u003cTARGET_FILE_NAME:test-server\u003e --port ${PORT_HCP_SRV})\n+\telse()\n+\t\tadd_test(NAME st_hcp_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\t\thcp_srv\n+\t\t\t\t\t$\u003cTARGET_FILE:test-server\u003e\n+\t\t\t\t\t-r ${CMAKE_SOURCE_DIR}/destdir/usr/local/share/libwebsockets-test-server/\n+\t\t\t\t\t-s --port ${PORT_HCP_SRV} )\n+\t\tadd_test(NAME ki_hcp_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh hcp_srv\n+\t\t\t\t\t$\u003cTARGET_FILE_NAME:test-server\u003e --port ${PORT_HCP_SRV})\n+\tendif()\n+endif()\n+\n+\tset_tests_properties(st_hcp_srv PROPERTIES\n+\t\t\t\t\t WORKING_DIRECTORY .\n+\t\t\t\t\t FIXTURES_SETUP hcp_srv\n+\t\t\t\t\t TIMEOUT 800)\n+\tset_tests_properties(ki_hcp_srv PROPERTIES\n+\t\t\t\t\t FIXTURES_CLEANUP hcp_srv)\n+\n+\tadd_test(NAME http-client-post COMMAND\n+\t\tlws-minimal-http-client-post -l --port ${PORT_HCP_SRV})\n+\tadd_test(NAME http-client-post-m COMMAND\n+\t\tlws-minimal-http-client-post -l -m --port ${PORT_HCP_SRV})\n+\tadd_test(NAME http-client-post-h1 COMMAND\n+\t\tlws-minimal-http-client-post -l --h1 --port ${PORT_HCP_SRV})\n+\tadd_test(NAME http-client-post-m-h1 COMMAND\n+\t\tlws-minimal-http-client-post -l -m --h1 --port ${PORT_HCP_SRV})\n+\tset_tests_properties(http-client-post\n+\t\t\t http-client-post-m\n+\t\t\t http-client-post-h1\n+\t\t\t http-client-post-m-h1\n+\t\t\t PROPERTIES\n+\t\t\t FIXTURES_REQUIRED \u0022hcp_srv\u0022\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-post\n+\t\t\t TIMEOUT 20)\n+endif()\n+\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-post/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-post/README.md\nnew file mode 100644\nindex 0000000..9a7ff28\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-post/README.md\n@@ -0,0 +1,74 @@\n+# lws minimal http client POST\n+\n+This example demonstrates a multipart POST to\n+\n+https://libwebsockets.org/testserver/formtest\n+\n+setting both a form variable and uploading a\n+short file.\n+\n+The result of the POST form processing is captured\n+and displayed in a hexdump.\n+\n+This is programmatically POSTing to the same\n+form you can access at\n+\n+https://libwebsockets.org/testserver\n+\n+in the \u0022POST\u0022 tab with file upload.\n+\n+By default the client action occurs using http/2 if\n+your lws was built with `-DLWS_WITH_HTTP2\u003d1`.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-client-post\n+[2018/04/03 13:13:10:7891] USER: LWS minimal http client - POST\n+[2018/04/03 13:13:10:7905] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 on\n+[2018/04/03 13:13:10:7984] NOTICE: created client ssl context for default\n+[2018/04/03 13:13:12:8444] USER: LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER\n+[2018/04/03 13:13:12:8444] USER: LWS_CALLBACK_CLIENT_HTTP_WRITEABLE\n+[2018/04/03 13:13:12:8445] USER: LWS_CALLBACK_CLIENT_HTTP_WRITEABLE\n+[2018/04/03 13:13:12:8445] USER: LWS_CALLBACK_CLIENT_HTTP_WRITEABLE\n+[2018/04/03 13:13:13:1437] USER: LWS_CALLBACK_CLIENT_HTTP_WRITEABLE\n+[2018/04/03 13:13:13:1440] USER: LWS_CALLBACK_CLIENT_HTTP_WRITEABLE\n+[2018/04/03 13:13:13:1440] USER: RECEIVE_CLIENT_HTTP_READ: read 402\n+[2018/04/03 13:13:13:1441] NOTICE: \n+[2018/04/03 13:13:13:1441] NOTICE: 0000: 3C 68 74 6D 6C 3E 3C 62 6F 64 79 3E 3C 68 31 3E \u003chtml\u003e\u003cbody\u003e\u003ch1\u003e\n+[2018/04/03 13:13:13:1441] NOTICE: 0010: 46 6F 72 6D 20 72 65 73 75 6C 74 73 20 28 61 66 Form results (af\n+[2018/04/03 13:13:13:1441] NOTICE: 0020: 74 65 72 20 75 72 6C 64 65 63 6F 64 69 6E 67 29 ter urldecoding)\n+[2018/04/03 13:13:13:1441] NOTICE: 0030: 3C 2F 68 31 3E 3C 74 61 62 6C 65 3E 3C 74 72 3E \u003c/h1\u003e\u003ctable\u003e\u003ctr\u003e\n+[2018/04/03 13:13:13:1441] NOTICE: 0040: 3C 74 64 3E 4E 61 6D 65 3C 2F 74 64 3E 3C 74 64 \u003ctd\u003eName\u003c/td\u003e\u003ctd\n+[2018/04/03 13:13:13:1441] NOTICE: 0050: 3E 4C 65 6E 67 74 68 3C 2F 74 64 3E 3C 74 64 3E \u003eLength\u003c/td\u003e\u003ctd\u003e\n+[2018/04/03 13:13:13:1441] NOTICE: 0060: 56 61 6C 75 65 3C 2F 74 64 3E 3C 2F 74 72 3E 3C Value\u003c/td\u003e\u003c/tr\u003e\u003c\n+[2018/04/03 13:13:13:1441] NOTICE: 0070: 74 72 3E 3C 74 64 3E 3C 62 3E 74 65 78 74 3C 2F tr\u003e\u003ctd\u003e\u003cb\u003etext\u003c/\n+[2018/04/03 13:13:13:1441] NOTICE: 0080: 62 3E 3C 2F 74 64 3E 3C 74 64 3E 31 33 3C 2F 74 b\u003e\u003c/td\u003e\u003ctd\u003e13\u003c/t\n+[2018/04/03 13:13:13:1441] NOTICE: 0090: 64 3E 3C 74 64 3E 6D 79 20 74 65 78 74 20 66 69 d\u003e\u003ctd\u003emy text fi\n+[2018/04/03 13:13:13:1441] NOTICE: 00A0: 65 6C 64 3C 2F 74 64 3E 3C 2F 74 72 3E 3C 74 72 eld\u003c/td\u003e\u003c/tr\u003e\u003ctr\n+[2018/04/03 13:13:13:1441] NOTICE: 00B0: 3E 3C 74 64 3E 3C 62 3E 73 65 6E 64 3C 2F 62 3E \u003e\u003ctd\u003e\u003cb\u003esend\u003c/b\u003e\n+[2018/04/03 13:13:13:1441] NOTICE: 00C0: 3C 2F 74 64 3E 3C 74 64 3E 30 3C 2F 74 64 3E 3C \u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003c\n+[2018/04/03 13:13:13:1442] NOTICE: 00D0: 74 64 3E 4E 55 4C 4C 3C 2F 74 64 3E 3C 2F 74 72 td\u003eNULL\u003c/td\u003e\u003c/tr\n+[2018/04/03 13:13:13:1442] NOTICE: 00E0: 3E 3C 74 72 3E 3C 74 64 3E 3C 62 3E 66 69 6C 65 \u003e\u003ctr\u003e\u003ctd\u003e\u003cb\u003efile\n+[2018/04/03 13:13:13:1442] NOTICE: 00F0: 3C 2F 62 3E 3C 2F 74 64 3E 3C 74 64 3E 30 3C 2F \u003c/b\u003e\u003c/td\u003e\u003ctd\u003e0\u003c/\n+[2018/04/03 13:13:13:1442] NOTICE: 0100: 74 64 3E 3C 74 64 3E 4E 55 4C 4C 3C 2F 74 64 3E td\u003e\u003ctd\u003eNULL\u003c/td\u003e\n+[2018/04/03 13:13:13:1442] NOTICE: 0110: 3C 2F 74 72 3E 3C 74 72 3E 3C 74 64 3E 3C 62 3E \u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cb\u003e\n+[2018/04/03 13:13:13:1442] NOTICE: 0120: 75 70 6C 6F 61 64 3C 2F 62 3E 3C 2F 74 64 3E 3C upload\u003c/b\u003e\u003c/td\u003e\u003c\n+[2018/04/03 13:13:13:1442] NOTICE: 0130: 74 64 3E 30 3C 2F 74 64 3E 3C 74 64 3E 4E 55 4C td\u003e0\u003c/td\u003e\u003ctd\u003eNUL\n+[2018/04/03 13:13:13:1442] NOTICE: 0140: 4C 3C 2F 74 64 3E 3C 2F 74 72 3E 3C 2F 74 61 62 L\u003c/td\u003e\u003c/tr\u003e\u003c/tab\n+[2018/04/03 13:13:13:1442] NOTICE: 0150: 6C 65 3E 3C 62 72 3E 3C 62 3E 66 69 6C 65 6E 61 le\u003e\u003cbr\u003e\u003cb\u003efilena\n+[2018/04/03 13:13:13:1442] NOTICE: 0160: 6D 65 3A 3C 2F 62 3E 20 6D 79 66 69 6C 65 2E 74 me:\u003c/b\u003e myfile.t\n+[2018/04/03 13:13:13:1442] NOTICE: 0170: 78 74 2C 20 3C 62 3E 6C 65 6E 67 74 68 3C 2F 62 xt, \u003cb\u003elength\u003c/b\n+[2018/04/03 13:13:13:1442] NOTICE: 0180: 3E 20 34 34 3C 2F 62 6F 64 79 3E 3C 2F 68 74 6D \u003e 44\u003c/body\u003e\u003c/htm\n+[2018/04/03 13:13:13:1442] NOTICE: 0190: 6C 3E l\u003e \n+[2018/04/03 13:13:13:1442] NOTICE: \n+[2018/04/03 13:13:13:1442] USER: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n+[2018/04/03 13:13:13:1455] USER: Completed\n+```\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-post/libwebsockets.org.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-post/libwebsockets.org.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-post/libwebsockets.org.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client-post/minimal-http-client-post.c b/minimal-examples-lowlevel/http-client/minimal-http-client-post/minimal-http-client-post.c\nnew file mode 100644\nindex 0000000..3bff115\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client-post/minimal-http-client-post.c\n@@ -0,0 +1,277 @@\n+/*\n+ * lws-minimal-http-client-post\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws and POST.\n+ *\n+ * It POSTs both form data and a file to the form at\n+ * https://libwebsockets.org/testserver/formtest and dumps\n+ * the html page received generated by the POST handler.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 0, status, count_clients \u003d 1, completed;\n+static struct lws *client_wsi[4];\n+\n+struct pss {\n+\tchar body_part;\n+};\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tchar buf[LWS_PRE + 1024], *start \u003d \u0026buf[LWS_PRE], *p \u003d start,\n+\t\t*end \u003d \u0026buf[sizeof(buf) - LWS_PRE - 1];\n+\tint n;\n+\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tbad \u003d 1;\n+\t\tif (++completed \u003d\u003d count_clients)\n+\t\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tfor (n \u003d 0; n \u003c count_clients; n++)\n+\t\t\tif (client_wsi[n] \u003d\u003d wsi) {\n+\t\t\t\tclient_wsi[n] \u003d NULL;\n+\t\t\t\tbad |\u003d status !\u003d 200;\n+\t\t\t\tif (++completed \u003d\u003d count_clients)\n+\t\t\t\t\t/* abort poll wait */\n+\t\t\t\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\t\t}\n+\t\tbreak;\n+\n+\t/* ...callbacks related to receiving the result... */\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\t\tlwsl_user(\u0022Connected with server response: %d\u005cn\u0022, status);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+\t\tlwsl_hexdump_notice(in, len);\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\tn \u003d sizeof(buf) - LWS_PRE;\n+\t\tif (lws_http_client_read(wsi, \u0026p, \u0026n) \u003c 0)\n+\t\t\treturn -1;\n+\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tbad |\u003d status !\u003d 200;\n+\t\t/*\n+\t\t * Do this to mark us as having processed the completion\n+\t\t * so close doesn't duplicate (with pipelining, completion !\u003d\n+\t\t * connection close\n+\t\t */\n+\t\tfor (n \u003d 0; n \u003c count_clients; n++)\n+\t\t\tif (client_wsi[n] \u003d\u003d wsi)\n+\t\t\t\tclient_wsi[n] \u003d NULL;\n+\t\tif (++completed \u003d\u003d count_clients)\n+\t\t\t/* abort poll wait */\n+\t\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\tbreak;\n+\n+\t/* ...callbacks related to generating the POST... */\n+\n+\tcase LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:\n+\t\t/*\n+\t\t * Tell lws we are going to send the body next...\n+\t\t */\n+\t\tif (!lws_http_is_redirected_to_get(wsi)) {\n+\t\t\tlwsl_user(\u0022%s: doing POST flow\u005cn\u0022, __func__);\n+\t\t\tlws_client_http_body_pending(wsi, 1);\n+\t\t\tlws_callback_on_writable(wsi);\n+\t\t} else\n+\t\t\tlwsl_user(\u0022%s: doing GET flow\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_HTTP_WRITEABLE:\n+\t\tif (lws_http_is_redirected_to_get(wsi))\n+\t\t\tbreak;\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_HTTP_WRITEABLE\u005cn\u0022);\n+\t\tn \u003d LWS_WRITE_HTTP;\n+\n+\t\t/*\n+\t\t * For a small body like this, we could prepare it in memory and\n+\t\t * send it all at once. But to show how to handle, eg,\n+\t\t * arbitrary-sized file payloads, or huge form-data fields, the\n+\t\t * sending is done in multiple passes through the event loop.\n+\t\t */\n+\n+\t\tswitch (pss-\u003ebody_part++) {\n+\t\tcase 0:\n+\t\t\tif (lws_client_http_multipart(wsi, \u0022text\u0022, NULL, NULL,\n+\t\t\t\t\t\t \u0026p, end))\n+\t\t\t\treturn -1;\n+\t\t\t/* notice every usage of the boundary starts with -- */\n+\t\t\tp +\u003d lws_snprintf(p, lws_ptr_diff_size_t(end, p), \u0022my text field\u005cxd\u005cxa\u0022);\n+\t\t\tbreak;\n+\t\tcase 1:\n+\t\t\tif (lws_client_http_multipart(wsi, \u0022file\u0022, \u0022myfile.txt\u0022,\n+\t\t\t\t\t\t \u0022text/plain\u0022, \u0026p, end))\n+\t\t\t\treturn -1;\n+\t\t\tp +\u003d lws_snprintf(p, lws_ptr_diff_size_t(end, p),\n+\t\t\t\t\t\u0022This is the contents of the \u0022\n+\t\t\t\t\t\u0022uploaded file.\u005cxd\u005cxa\u0022\n+\t\t\t\t\t\u0022\u005cxd\u005cxa\u0022);\n+\t\t\tbreak;\n+\t\tcase 2:\n+\t\t\tif (lws_client_http_multipart(wsi, NULL, NULL, NULL,\n+\t\t\t\t\t\t \u0026p, end))\n+\t\t\t\treturn -1;\n+\t\t\tlws_client_http_body_pending(wsi, 0);\n+\t\t\t /* necessary to support H2, it means we will write no\n+\t\t\t * more on this stream */\n+\t\t\tn \u003d LWS_WRITE_HTTP_FINAL;\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\t/*\n+\t\t\t * We can get extra callbacks here, if nothing to do,\n+\t\t\t * then do nothing.\n+\t\t\t */\n+\t\t\treturn 0;\n+\t\t}\n+\n+\t\tif (lws_write(wsi, (uint8_t *)start, lws_ptr_diff_size_t(p, start), (enum lws_write_protocol)n)\n+\t\t\t\t!\u003d lws_ptr_diff(p, start))\n+\t\t\treturn 1;\n+\n+\t\tif (n !\u003d LWS_WRITE_HTTP_FINAL)\n+\t\t\tlws_callback_on_writable(wsi);\n+\n+\t\treturn 0;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\tsizeof(struct pss),\n+\t\t0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_client_connect_info i;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tlwsl_user(\u0022LWS minimal http client - POST [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-m\u0022))\n+\t\tcount_clients \u003d LWS_ARRAY_SIZE(client_wsi);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d (unsigned int)(1 + count_clients + 1);\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tif (!lws_cmdline_option(argc, argv, \u0022-l\u0022))\n+\t\tinfo.client_ssl_ca_filepath \u003d \u0022./libwebsockets.org.cer\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\ti.ssl_connection \u003d LCCSCF_USE_SSL | LCCSCF_HTTP_MULTIPART_MIME;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t\ti.path \u003d \u0022/formtest\u0022;\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022libwebsockets.org\u0022;\n+\t\ti.path \u003d \u0022/testserver/formtest\u0022;\n+\t}\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--form1\u0022))\n+\t\ti.path \u003d \u0022/form1\u0022;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--port\u0022)))\n+\t\ti.port \u003d atoi(p);\n+\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022POST\u0022;\n+\n+\t/* force h1 even if h2 available */\n+\tif (lws_cmdline_option(argc, argv, \u0022--h1\u0022))\n+\t\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\n+\tfor (n \u003d 0; n \u003c count_clients; n++) {\n+\t\ti.pwsi \u003d \u0026client_wsi[n];\n+\t\tlwsl_notice(\u0022%s: connecting to %s:%d\u005cn\u0022, __func__,\n+\t\t\t i.address, i.port);\n+\t\tif (!lws_client_connect_via_info(\u0026i))\n+\t\t\tcompleted++;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 completed !\u003d count_clients \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client/CMakeLists.txt\nnew file mode 100644\nindex 0000000..73c0cdb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client/CMakeLists.txt\n@@ -0,0 +1,169 @@\n+project(lws-minimal-http-client C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-client)\n+set(SRCS minimal-http-client.c)\n+\n+set(has_fault_injection 1)\n+set(has_h2 1)\n+set(has_plugins 1)\n+set(has_ss_policy_parse 1)\n+set(has_no_system_vhost 1)\n+set(has_async_dns 1)\n+set(has_mbedtls 1)\n+\n+set(requirements 1)\n+\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+require_lws_config(LWS_ROLE_H2 1 has_h2)\n+require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection)\n+require_lws_config(LWS_WITH_EVLIB_PLUGINS 1 has_plugins)\n+require_lws_config(LWS_WITH_EVENT_LIBS 1 has_plugins)\n+\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 has_ss_policy_parse)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 has_ss_policy_parse)\n+\n+require_lws_config(LWS_WITH_SYS_ASYNC_DNS 0 has_no_system_vhost)\n+require_lws_config(LWS_WITH_SYS_NTPCLIENT 0 has_no_system_vhost)\n+require_lws_config(LWS_WITH_SYS_DHCP_CLIENT 0 has_no_system_vhost)\n+\n+require_lws_config(LWS_WITH_SYS_ASYNC_DNS 1 has_async_dns)\n+require_lws_config(LWS_WITH_MBEDTLS 1 has_mbedtls)\n+\n+message(\u0022FI ${has_fault_injection}\u0022)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\t\n+\tsai_resource(warmcat_conns 1 40 http_client_warmcat)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE)\n+\t\tset(mytests http-client-warmcat-h1)\n+\t\tif (has_h2)\n+\t\t\tadd_test(NAME http-client-warmcat COMMAND lws-minimal-http-client )\n+\t\t\tlist(APPEND mytests http-client-warmcat)\n+\t\tendif()\n+\n+\n+\t\tadd_test(NAME http-client-warmcat-h1 COMMAND lws-minimal-http-client --h1)\n+\t\t\t\t \n+\t\tif (has_fault_injection)\n+\n+\t\t\tmessage(\u0022... has LWS_WITH_SYS_FAULT_INJECTION\u0022)\n+\t\t\n+\t\t\t# creation related faults\n+\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx1)\n+\t\t\tadd_test(NAME http-client-fi-ctx1 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail1\u0022)\n+\t\t\t\n+\t\t\t# if (has_plugins)\n+\t\t\t# !!! need to actually select an available evlib plugin to trigger this\n+\t\t\t#\tlist(APPEND mytests http-client-fi-pi)\n+\t\t\t#\tadd_test(NAME http-client-fi-pi COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_plugin_init\u0022)\n+\t\t\t# endif()\n+\n+\t\t\tlist(APPEND mytests http-client-fi-ctx2)\n+\t\t\tadd_test(NAME http-client-fi-ctx2 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_sel\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx3)\n+\t\t\tadd_test(NAME http-client-fi-ctx3 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_oom_ctx\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx4)\n+\t\t\tadd_test(NAME http-client-fi-ctx4 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_privdrop\u0022)\n+\n+\t\t\tlist(APPEND mytests http-client-fi-ctx5)\n+\t\t\tadd_test(NAME http-client-fi-ctx5 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_maxfds\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx6)\n+\t\t\tadd_test(NAME http-client-fi-ctx6 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_oom_fds\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx7)\n+\t\t\tadd_test(NAME http-client-fi-ctx7 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_plat_init\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx8)\n+\t\t\tadd_test(NAME http-client-fi-ctx8 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_init\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx9)\n+\t\t\tadd_test(NAME http-client-fi-ctx9 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_pt\u0022)\n+\t\t\t\n+\t\t\tif (NOT has_no_system_vhost)\n+\t\t\t\n+\t\t\t\tlist(APPEND mytests http-client-fi-ctx10)\n+\t\t\t\tadd_test(NAME http-client-fi-ctx10 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_sys_vh\u0022)\n+\t\t\t\n+\t\t\t\tlist(APPEND mytests http-client-fi-ctx11)\n+\t\t\t\tadd_test(NAME http-client-fi-ctx11 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_sys_vh_init\u0022)\n+\t\t\t\t\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-ctx12)\n+\t\t\tadd_test(NAME http-client-fi-ctx12 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_def_vh\u0022)\n+\t\t\t\n+\n+\t\t\tlist(APPEND mytests http-client-fi-vh1)\n+\t\t\tadd_test(NAME http-client-fi-vh1 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_oom\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-vh2)\n+\t\t\tadd_test(NAME http-client-fi-vh2 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_pcols_oom\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-vh3)\n+\t\t\tadd_test(NAME http-client-fi-vh3 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_ssl_srv\u0022)\n+\n+\t\t\tlist(APPEND mytests http-client-fi-vh4)\n+\t\t\tadd_test(NAME http-client-fi-vh4 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_ssl_cli\u0022)\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-vh5)\n+\t\t\tadd_test(NAME http-client-fi-vh5 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_srv_init\u0022)\n+\n+\n+\t\t\tlist(APPEND mytests http-client-fi-dnsfail)\n+\t\t\tadd_test(NAME http-client-fi-dnsfail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection \u0022wsi\u003duser/dnsfail\u0022)\n+\t\t\t\n+\t\t\tif (has_async_dns)\n+\t\t\t\tlist(APPEND mytests http-client-fi-connfail)\n+\t\t\t\tadd_test(NAME http-client-fi-connfail COMMAND lws-minimal-http-client --expected-exit 2 --fault-injection \u0022wsi\u003duser/connfail\u0022)\n+\t\t\telse()\n+\t\t\t\tlist(APPEND mytests http-client-fi-connfail)\n+\t\t\t\tadd_test(NAME http-client-fi-connfail COMMAND lws-minimal-http-client --expected-exit 2 --fault-injection \u0022wsi\u003duser/connfail\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tlist(APPEND mytests http-client-fi-user-est-fail)\n+\t\t\tadd_test(NAME http-client-fi-user-est-fail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection \u0022wsi/user_reject_at_est\u0022)\t\n+\t\telse()\n+\t\t\tmessage(\u0022... NO LWS_WITH_SYS_FAULT_INJECTION\u0022)\n+\t\tendif()\n+\t\tif (has_mbedtls)\n+\t\t\tlist(APPEND mytests http-client-mbedtls-wrong-ca)\n+\t\t\tadd_test(NAME http-client-mbedtls-wrong-ca COMMAND lws-minimal-http-client -w --expected-exit 3)\n+\t\t\tmessage(\u0022... adding mbedtls wrong CA test\u0022)\n+\t\telse()\n+\t\t\tmessage(\u0022... skipping mbedtls wrong CA test\u0022)\n+\t\tendif()\n+\t\n+\t\tset_tests_properties(${mytests} PROPERTIES\n+\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client\n+\t\t TIMEOUT 20)\n+\t\t\t\t \n+ \t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(${mytests} PROPERTIES\n+\t\t\t\t\t FIXTURES_REQUIRED \u0022res_http_client_warmcat\u0022)\n+\t\tendif()\t\t\n+\t\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client/README.md\nnew file mode 100644\nindex 0000000..09df8ef\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client/README.md\n@@ -0,0 +1,79 @@\n+# lws minimal http client\n+\n+The application goes to either https://warmcat.com or\n+https://localhost:7681 (with `-l` option) and receives the page data.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-l| Connect to https://localhost:7681 and accept selfsigned cert\n+--h1|Specify http/1.1 only using ALPN, rejects h2 even if server supports it\n+--server \u003cname\u003e|set server name to connect to\n+-k|Apply tls option LCCSCF_ALLOW_INSECURE\n+-j|Apply tls option LCCSCF_ALLOW_SELFSIGNED\n+-m|Apply tls option LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK\n+-e|Apply tls option LCCSCF_ALLOW_EXPIRED\n+-b|Apply tls option LCCSCF_CACHE_COOKIES\n+-w|For mbedtls/wolfssl, load wrong CA cert (expected to fail)\n+-c \u003ccookie jar file\u003e|Set filepath used for cookie jar\n+-v|Connection validity use 3s / 10s instead of default 5m / 5m10s\n+--nossl| disable ssl connection\n+--user \u003cusername\u003e| Set Basic Auth username\n+--password \u003cpassword\u003e | Set Basic Auth password\n+\n+```\n+ $ ./lws-minimal-http-client\n+[2018/03/04 14:43:20:8562] USER: LWS minimal http client\n+[2018/03/04 14:43:20:8571] NOTICE: Creating Vhost 'default' port -1, 1 protocols, IPv6 on\n+[2018/03/04 14:43:20:8616] NOTICE: created client ssl context for default\n+[2018/03/04 14:43:20:8617] NOTICE: lws_client_connect_2: 0x1814dc0: address warmcat.com\n+[2018/03/04 14:43:21:1496] NOTICE: lws_client_connect_2: 0x1814dc0: address warmcat.com\n+[2018/03/04 14:43:22:0154] NOTICE: lws_client_interpret_server_handshake: incoming content length 26520\n+[2018/03/04 14:43:22:0154] NOTICE: lws_client_interpret_server_handshake: client connection up\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3022] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3022] USER: RECEIVE_CLIENT_HTTP_READ: read 974\n+[2018/03/04 14:43:22:3022] NOTICE: lws_http_client_read: transaction completed says -1\n+[2018/03/04 14:43:23:3042] USER: Completed\n+```\n+\n+You can also test the client Basic Auth support against the http-server/minimal-http-server-basicauth\n+example. In one console window run the server and in the other\n+\n+```\n+$ lws-minimal-http-client -l --nossl --path /secret/index.html --user user --password password\n+```\n+\n+The Basic Auth credentials for the test server are literally username \u0022user\u0022 and password \u0022password\u0022.\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client/minimal-http-client.c b/minimal-examples-lowlevel/http-client/minimal-http-client/minimal-http-client.c\nnew file mode 100644\nindex 0000000..f151356\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client/minimal-http-client.c\n@@ -0,0 +1,427 @@\n+/*\n+ * lws-minimal-http-client\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there. You\n+ * can dump the page data by changing the #if 0 below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, status, conmon;\n+#if defined(LWS_WITH_HTTP2)\n+static int long_poll;\n+#endif\n+static struct lws *client_wsi;\n+static const char *ba_user, *ba_password;\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping \u003d 3,\n+\t.secs_since_valid_hangup \u003d 10,\n+};\n+\n+#if defined(LWS_WITH_CONMON)\n+void\n+dump_conmon_data(struct lws *wsi)\n+{\n+\tconst struct addrinfo *ai;\n+\tstruct lws_conmon cm;\n+\tchar ads[48];\n+\n+\tlws_conmon_wsi_take(wsi, \u0026cm);\n+\n+\tlws_sa46_write_numeric_address(\u0026cm.peer46, ads, sizeof(ads));\n+\tlwsl_notice(\u0022%s: peer %s, dns: %uus, sockconn: %uus, tls: %uus, txn_resp: %uus\u005cn\u0022,\n+\t\t __func__, ads,\n+\t\t (unsigned int)cm.ciu_dns,\n+\t\t (unsigned int)cm.ciu_sockconn,\n+\t\t (unsigned int)cm.ciu_tls,\n+\t\t (unsigned int)cm.ciu_txn_resp);\n+\n+\tai \u003d cm.dns_results_copy;\n+\twhile (ai) {\n+\t\tlws_sa46_write_numeric_address((lws_sockaddr46 *)ai-\u003eai_addr, ads, sizeof(ads));\n+\t\tlwsl_notice(\u0022%s: DNS %s\u005cn\u0022, __func__, ads);\n+\t\tai \u003d ai-\u003eai_next;\n+\t}\n+\n+\t/*\n+\t * This destroys the DNS list in the lws_conmon that we took\n+\t * responsibility for when we used lws_conmon_wsi_take()\n+\t */\n+\n+\tlws_conmon_release(\u0026cm);\n+}\n+#endif\n+\n+static const char *ua \u003d \u0022Mozilla/5.0 (X11; Linux x86_64) \u0022\n+\t\t\t\u0022AppleWebKit/537.36 (KHTML, like Gecko) \u0022\n+\t\t\t\u0022Chrome/51.0.2704.103 Safari/537.36\u0022,\n+\t\t *acc \u003d \u0022*/*\u0022;\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 3; /* connection failed before we could make connection */\n+\t\tlws_cancel_service(lws_get_context(wsi));\n+\n+#if defined(LWS_WITH_CONMON)\n+\tif (conmon)\n+\t\tdump_conmon_data(wsi);\n+#endif\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buf[128];\n+\n+\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n+\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n+\n+\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n+\t\t\t\t\tbuf, status);\n+\t\t}\n+#if defined(LWS_WITH_HTTP2)\n+\t\tif (long_poll) {\n+\t\t\tlwsl_user(\u0022%s: Client entering long poll mode\u005cn\u0022, __func__);\n+\t\t\tlws_h2_client_stream_long_poll_rxonly(wsi);\n+\t\t}\n+#endif\n+\n+\t\tif (lws_fi_user_wsi_fi(wsi, \u0022user_reject_at_est\u0022))\n+\t\t\treturn -1;\n+\n+\t\tbreak;\n+\n+\t/* you only need this if you need to do Basic Auth */\n+\tcase LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:\n+\t{\n+\t\tunsigned char **p \u003d (unsigned char **)in, *end \u003d (*p) + len;\n+\n+\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_USER_AGENT,\n+\t\t\t\t(unsigned char *)ua, (int)strlen(ua), p, end))\n+\t\t\treturn -1;\n+\n+\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_ACCEPT,\n+\t\t\t\t(unsigned char *)acc, (int)strlen(acc), p, end))\n+\t\t\treturn -1;\n+#if defined(LWS_WITH_HTTP_BASIC_AUTH)\n+\t\t{\n+\t\tchar b[128];\n+\n+\t\tif (!ba_user || !ba_password)\n+\t\t\tbreak;\n+\n+\t\tif (lws_http_basic_auth_gen(ba_user, ba_password, b, sizeof(b)))\n+\t\t\tbreak;\n+\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_AUTHORIZATION,\n+\t\t\t\t(unsigned char *)b, (int)strlen(b), p, end))\n+\t\t\treturn -1;\n+\t\t}\n+#endif\n+\t\tbreak;\n+\t}\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+#if defined(LWS_WITH_HTTP2)\n+\t\tif (long_poll) {\n+\t\t\tchar dotstar[128];\n+\t\t\tlws_strnncpy(dotstar, (const char *)in, len,\n+\t\t\t\t sizeof(dotstar));\n+\t\t\tlwsl_notice(\u0022long poll rx: %d '%s'\u005cn\u0022, (int)len,\n+\t\t\t\t\tdotstar);\n+\t\t}\n+#endif\n+#if 0\n+\t\tlwsl_hexdump_notice(in, len);\n+#endif\n+\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_fi_user_wsi_fi(wsi, \u0022user_reject_at_rx\u0022))\n+\t\t\t\treturn -1;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+#if defined(LWS_WITH_CONMON)\n+\t\tif (conmon)\n+\t\t\tdump_conmon_data(wsi);\n+#endif\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+struct args {\n+\tint argc;\n+\tconst char **argv;\n+};\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d mgr-\u003eparent;\n+\tstruct lws_client_connect_info i;\n+\tstruct args *a \u003d lws_context_user(context);\n+\tconst char *p;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL || target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\tlwsl_info(\u0022%s: operational\u005cn\u0022, __func__);\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\tif (!lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-n\u0022)) {\n+\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+#if defined(LWS_WITH_HTTP2)\n+\t\t/* requires h2 */\n+\t\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--long-poll\u0022)) {\n+\t\t\tlwsl_user(\u0022%s: long poll mode\u005cn\u0022, __func__);\n+\t\t\tlong_poll \u003d 1;\n+\t\t}\n+#endif\n+\t}\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022warmcat.com\u0022;\n+\t}\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--nossl\u0022))\n+\t\ti.ssl_connection \u003d 0;\n+\n+\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t LCCSCF_ACCEPT_TLS_DOWNGRADE_REDIRECTS |\n+\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n+\n+\ti.alpn \u003d \u0022h2,http/1.1\u0022;\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--h1\u0022))\n+\t\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--h2-prior-knowledge\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_H2_PRIOR_KNOWLEDGE;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-p\u0022)))\n+\t\ti.port \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--user\u0022)))\n+\t\tba_user \u003d p;\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--password\u0022)))\n+\t\tba_password \u003d p;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-j\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-k\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_INSECURE;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-b\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_CACHE_COOKIES;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-m\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-e\u0022))\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_EXPIRED;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-f\u0022))) {\n+\t\ti.ssl_connection |\u003d LCCSCF_H2_MANUAL_RXFLOW;\n+\t\ti.manual_initial_tx_credit \u003d atoi(p);\n+\t\tlwsl_notice(\u0022%s: manual peer tx credit %d\u005cn\u0022, __func__,\n+\t\t\t\ti.manual_initial_tx_credit);\n+\t}\n+\n+#if defined(LWS_WITH_CONMON)\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--conmon\u0022)) {\n+\t\ti.ssl_connection |\u003d LCCSCF_CONMON;\n+\t\tconmon \u003d 1;\n+\t}\n+#endif\n+\n+\t/* the default validity check is 5m / 5m10s... -v \u003d 3s / 10s */\n+\n+\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-v\u0022))\n+\t\ti.retry_and_idle_policy \u003d \u0026retry;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--server\u0022)))\n+\t\ti.address \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--path\u0022)))\n+\t\ti.path \u003d p;\n+\telse\n+\t\ti.path \u003d \u0022/\u0022;\n+\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\ti.pwsi \u003d \u0026client_wsi;\n+\ti.fi_wsi_name \u003d \u0022user\u0022;\n+\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tlwsl_err(\u0022Client creation failed\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 2; /* could not even start client connection */\n+\t\tlws_cancel_service(context);\n+\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t\t system_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0, expected \u003d 0;\n+\tstruct args args;\n+\tconst char *p;\n+\t// uint8_t memcert[4096];\n+\n+\targs.argc \u003d argc;\n+\targs.argv \u003d argv;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal http client [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.user \u003d \u0026args;\n+\tinfo.register_notifier_list \u003d na;\n+\tinfo.connect_timeout_secs \u003d 30;\n+\n+#if defined(LWS_WITH_CACHE_NSCOOKIEJAR)\n+\tinfo.http_nsc_filepath \u003d \u0022./cookies.txt\u0022;\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022)))\n+\t\tinfo.http_nsc_filepath \u003d p;\n+#endif\n+\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tif (lws_cmdline_option(argc, argv, \u0022-w\u0022))\n+\t\t/* option to confirm we are validating against the right cert */\n+\t\tinfo.client_ssl_ca_filepath \u003d \u0022./wrong.cer\u0022;\n+\telse\n+\t\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+#if 0\n+\tn \u003d open(\u0022./warmcat.com.cer\u0022, O_RDONLY);\n+\tif (n \u003e\u003d 0) {\n+\t\tinfo.client_ssl_ca_mem_len \u003d read(n, memcert, sizeof(memcert));\n+\t\tinfo.client_ssl_ca_mem \u003d memcert;\n+\t\tclose(n);\n+\t\tn \u003d 0;\n+\t\tmemcert[info.client_ssl_ca_mem_len++] \u003d '\u005c0';\n+\t}\n+#endif\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tbad \u003d 5;\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+bail:\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n+\t\texpected \u003d atoi(p);\n+\n+\tif (bad \u003d\u003d expected) {\n+\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, expected);\n+\t\treturn 0;\n+\t} else\n+\t\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, bad, expected);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-client/minimal-http-client/wrong.cer b/minimal-examples-lowlevel/http-client/minimal-http-client/wrong.cer\nnew file mode 100644\nindex 0000000..3503566\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-client/minimal-http-client/wrong.cer\n@@ -0,0 +1,21 @@\n+-----BEGIN CERTIFICATE-----\n+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n+b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\n+b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\n+ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n+9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\n+IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\n+VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n+93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\n+jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n+AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\n+A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\n+U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\n+N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\n+o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n+5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\n+rqXRfboQnoZsG4q5WTP468SQvvG5\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/http-server/README.md b/minimal-examples-lowlevel/http-server/README.md\nnew file mode 100644\nindex 0000000..a6d0b8e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/README.md\n@@ -0,0 +1,24 @@\n+|Example|Demonstrates|\n+---|---\n+minimal-http-server-basicauth|Shows how to protect a mount using a password file and basic auth\n+minimal-http-server-custom-headers|Shows how to query custom headers that lws doesn't already know\n+minimal-http-server-deaddrop|Shows how to use the deaddrop drag and drop file upload + sharing plugin\n+minimal-http-server-dynamic|Serves both static and dynamically generated http content\n+minimal-http-server-eventlib-foreign|Demonstrates integrating lws with a foreign event library\n+minimal-http-server-eventlib-demos|Using the demo plugins with event libraries\n+minimal-http-server-eventlib|Same as minimal-http-server but works with a supported event library\n+minimal-http-server-form-get|Process a GET form\n+minimal-http-server-form-post-file|Process a multipart POST form with file transfer\n+minimal-http-server-form-post|Process a POST form (no file transfer)\n+minimal-http-server-fulltext-search|Demonstrates using lws Fulltext Search\n+minimal-http-server-mimetypes|Shows how to add support for additional mimetypes at runtime\n+minimal-http-server-multivhost|Same as minimal-http-server but three different vhosts\n+minimal-http-server-proxy|Reverse Proxy\n+minimal-http-server-smp|Multiple service threads\n+minimal-http-server-sse-ring|Server Side Events with ringbuffer and threaded event sources\n+minimal-http-server-sse|Simple Server Side Events\n+minimal-http-server-tls-80|Serves a directory over http/1 or http/2 with TLS (SSL), custom 404 handler, redirect to https on port 80\n+minimal-http-server-tls-mem|Serves using TLS with the cert and key provided as memory buffers instead of files\n+minimal-http-server-tls|Serves a directory over http/1 or http/2 with TLS (SSL), custom 404 handler\n+minimal-http-server|Serves a directory over http/1, custom 404 handler\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/CMakeLists.txt\nnew file mode 100644\nindex 0000000..ac5e278\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-basicauth C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-basicauth)\n+set(SRCS minimal-http-server-basicauth.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_HTTP_BASIC_AUTH 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/README.md\nnew file mode 100644\nindex 0000000..7cf7751\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/README.md\n@@ -0,0 +1,34 @@\n+# lws minimal http server basic auth\n+\n+This demonstrates how to protect a mount using a password\n+file outside of the mount itself.\n+\n+The demo has two mounts, a normal one at / and one protected\n+by basic auth at /secret.\n+\n+The file at ./ba-passwords contains valid user:password\n+combinations.\n+\n+## Discovering the authenticated user\n+\n+After a successful authentication, the `WSI_TOKEN_HTTP_AUTHORIZATION` token\n+contains the authenticated username.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-basic-auth\n+[2018/04/19 08:40:05:1333] USER: LWS minimal http server basic auth | visit http://localhost:7681\n+[2018/04/19 08:40:05:1333] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+```\n+\n+Visit http://localhost:7681, and follow the link there to the secret area.\n+\n+Give your browser \u0022user\u0022 and \u0022password\u0022 as the credentials.\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/ba-passwords b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/ba-passwords\nnew file mode 100644\nindex 0000000..28b9bb2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/ba-passwords\n@@ -0,0 +1 @@\n+user:password\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/minimal-http-server-basicauth.c b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/minimal-http-server-basicauth.c\nnew file mode 100644\nindex 0000000..1336d28\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/minimal-http-server-basicauth.c\n@@ -0,0 +1,113 @@\n+/*\n+ * lws-minimal-http-server-basicauth\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server with a second mount that\n+ * is protected using a password file and basic auth.\n+ *\n+ * To keep it simple, it serves the static stuff from the subdirectory\n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ *\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003ctime.h\u003e\n+\n+static int interrupted;\n+\n+/* override the default mount for /secret in the URL space */\n+\n+static const struct lws_http_mount mount_secret \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/secret\u0022,\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-secret-origin\u0022,\n+\t/* .def */\t\t\t\u0022index.html\u0022,\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE, /* dynamic */\n+\t/* .mountpoint_len */\t\t7,\t\t/* char count */\n+\t/* .basic_auth_login_file */\t\u0022./ba-passwords\u0022,\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\t\u0026mount_secret,\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server basic auth | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/index.html\nnew file mode 100644\nindex 0000000..0b35368\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/index.html\n@@ -0,0 +1,25 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server basic auth example\u003c/b\u003e.\n+\t\t\u003cp\u003e\n+\t\tThis is a static page served from ./mount-origin/index.html.\n+\t\t\u003cp\u003e\n+\t\tStuff down /secret in the URL space is protected by Basic Auth.\u003cbr\u003e\n+\t\tYour browser will ask for a username / password combination, and\u003cbr\u003e\n+\t\tlws will check it against ./ba-passwords, which contains a list of\u003cbr\u003e\n+\t\t\u0022username:password\u0022 one per line.\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\tThe example content for ba-passwords is literally \u0022user:password\u0022.\u003cbr\u003e\n+\t\tClick on the link into the protected area of the URL space below\u003cbr\u003e\n+\t\tand give your browser the credentials \u0022user\u0022 and \u0022password\u0022.\n+\t\t\u003cp\u003e\n+\t\t\u003ca href\u003d\u0022/secret/\u0022 target\u003d_blank\u003e/secret\u003c/a\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/index.html\nnew file mode 100644\nindex 0000000..a0bb441\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/index.html\n@@ -0,0 +1,11 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tThis is the big secret protected by \u003cb\u003ebasic auth\u003c/b\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/CMakeLists.txt\nnew file mode 100644\nindex 0000000..18ef350\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-cgi C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-cgi)\n+set(SRCS minimal-http-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CGI 1 requirements)\n+require_lws_config(LWS_WITHOUT_SERVER 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/README.md\nnew file mode 100644\nindex 0000000..9f3143a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/README.md\n@@ -0,0 +1,28 @@\n+# lws minimal http server-cgi\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+This example runs a script ./my-cgi-script.sh when you vist /\n+\n+The script dumps some information from /proc on stdout, which\n+is proxied back to the browser, script output on stderr is\n+printed in the console.\n+\n+It's able to serve the script output over h1 using chunked encoding,\n+and over h2 having stripped the chunked encoding from the script\n+output.\n+\n+```\n+ $ ./lws-minimal-http-server-cgi\n+[2019/11/18 16:31:29:5481] U: LWS minimal http server | visit http://localhost:7681\n+[2019/11/18 16:31:40:2176] N: CGI-stderr: lwstest script stderr: REQUEST_METHOD was GET\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/minimal-http-server.c\nnew file mode 100644\nindex 0000000..1e8bc91\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/minimal-http-server.c\n@@ -0,0 +1,105 @@\n+/*\n+ * lws-minimal-http-server-cgi\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+static char cgi_script_fullpath[256];\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\tcgi_script_fullpath, /* cgi script */\n+\t/* .def */\t\t\t\u0022/\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_CGI,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server | visit http://localhost:7681\u005cn\u0022);\n+\n+\t{\n+\t\tchar cwd[128];\n+\t\tcwd[0] \u003d '\u005c0';\n+\t\tgetcwd(cwd, sizeof(cwd));\n+\n+\t\tlws_snprintf(cgi_script_fullpath, sizeof(cgi_script_fullpath),\n+\t\t\t\t\u0022%s/my-cgi-script.sh\u0022, cwd);\n+\t}\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 1000);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/my-cgi-script.sh b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/my-cgi-script.sh\nnew file mode 100755\nindex 0000000..5a96c37\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/my-cgi-script.sh\n@@ -0,0 +1,36 @@\n+#!/bin/sh\n+\n+echo -e -n \u0022content-type: text/html\u005cx0d\u005cx0a\u0022\n+echo -e -n \u0022transfer-encoding: chunked\u005cx0d\u005cx0a\u0022\n+echo -e -n \u0022\u005cx0d\u005cx0a\u0022\n+\n+echo \u0022\u003chtml\u003e\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e\u003cbody\u003e\u0022\n+echo \u0022\u003ch1\u003elwstest script stdout\u003c/h1\u003e\u0022\n+\u003e\u00262 echo -n \u0022lwstest script stderr: REQUEST_METHOD was $REQUEST_METHOD\u0022\n+\n+echo \u0022\u003ch2\u003eREQUEST_METHOD\u003d$REQUEST_METHOD\u003c/h2\u003e\u0022\n+\n+if [ \u0022$REQUEST_METHOD\u0022 \u003d \u0022POST\u0022 ] ; then\n+\t\u003e\u00262 echo \u0022lwstest script stderr: doing read\u0022\n+\techo \u0022CONTENT_LENGTH\u003d$CONTENT_LENGTH\u0022\n+\tread -n $CONTENT_LENGTH line\n+\t\u003e\u00262 echo \u0022lwstest script stderr: done read $line\u0022\n+\n+\techo \u0022read\u003d\u005c\u0022$line\u005c\u0022\u0022\n+else\n+\techo \u0022\u003ctable\u003e\u0022\n+\techo \u0022\u003ctr\u003e\u003ctd colspan\u003d\u005c\u00222\u005c\u0022\u003e/proc/meminfo\u003c/td\u003e\u003c/tr\u003e\u0022\n+\tcat /proc/meminfo | while read line ; do\n+\t\tA\u003d`echo \u0022$line\u0022 | cut -d: -f1`\n+\t\tB\u003d`echo \u0022$line\u0022 | tr -s ' ' | cut -d' ' -f2-`\n+\t\techo -e \u0022\u003ctr\u003e\u003ctd\u003e$A\u003c/td\u003e\u0022\n+\t\techo -e \u0022\u003ctd\u003e$B\u003c/td\u003e\u003c/tr\u003e\u0022\n+\tdone\n+\techo \u0022\u003c/table\u003e\u0022\n+fi\n+\n+echo \u0022\u003cbr/\u003edone\u0022\n+echo \u0022\u003c/body\u003e\u003c/html\u003e\u0022\n+sleep 0.5\n+exit 0\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/CMakeLists.txt\nnew file mode 100644\nindex 0000000..f113424\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-custom-headers C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-custom-headers)\n+set(SRCS minimal-http-server-custom-headers.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CUSTOM_HEADERS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/README.md\nnew file mode 100644\nindex 0000000..9666d02\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/README.md\n@@ -0,0 +1,20 @@\n+# lws minimal http server dynamic content\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-dynamic\n+[2018/03/20 10:24:24:7099] USER: LWS minimal http server dynamic | visit http://localhost:7681\n+[2018/03/20 10:24:24:7099] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+```\n+\n+Visit http://localhost:7681, which is all static content.\n+\n+Click on the link to /dyn/anything, this opens a new tab with dynamicly-produced content.\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/minimal-http-server-custom-headers.c b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/minimal-http-server-custom-headers.c\nnew file mode 100644\nindex 0000000..d9a1f31\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/minimal-http-server-custom-headers.c\n@@ -0,0 +1,223 @@\n+/*\n+ * lws-minimal-http-server-custom-headers\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server that can produce dynamic http\n+ * content as well as static content.\n+ *\n+ * To keep it simple, it serves the static stuff from the subdirectory\n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ *\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003ctime.h\u003e\n+\n+static int interrupted;\n+\n+struct pss {\n+\tchar result[128 + LWS_PRE];\n+\tint len;\n+};\n+\n+/*\n+ * This just lets us override LWS_CALLBACK_HTTP handling before passing it\n+ * and everything else to the default handler.\n+ */\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tuint8_t buf[LWS_PRE + 2048], *start \u003d \u0026buf[LWS_PRE], *p \u003d start,\n+\t\t*end \u003d \u0026buf[sizeof(buf) - LWS_PRE - 1];\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tchar value[32], *pr \u003d \u0026pss-\u003eresult[LWS_PRE];\n+\tsize_t e \u003d sizeof(pss-\u003eresult) - LWS_PRE;\n+\tint n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_HTTP:\n+\t\t/*\n+\t\t * LWS doesn't have the \u0022DNT\u0022 header built-in. But we can\n+\t\t * query it using the \u0022custom\u0022 versions of the header apis.\n+\t\t *\n+\t\t * You can set your modern browser to issue DNT, look in the\n+\t\t * privacy settings of your browser.\n+\t\t */\n+\n+\t\tpss-\u003elen \u003d 0;\n+\t\tn \u003d lws_hdr_custom_length(wsi, \u0022dnt:\u0022, 4);\n+\t\tif (n \u003c 0)\n+\t\t\tpss-\u003elen \u003d lws_snprintf(pr, e,\n+\t\t\t\t\t\u0022%s: DNT header not found\u005cn\u0022, __func__);\n+\t\telse {\n+\n+\t\t\tpss-\u003elen \u003d lws_snprintf(pr, e,\n+\t\t\t\t\t\u0022%s: DNT length %d\u003cbr\u003e\u0022, __func__, n);\n+\t\t\tn \u003d lws_hdr_custom_copy(wsi, value, sizeof(value), \u0022dnt:\u0022, 4);\n+\t\t\tif (n \u003c 0)\n+\t\t\t\tpss-\u003elen +\u003d lws_snprintf(pr + pss-\u003elen, e - (unsigned int)pss-\u003elen,\n+\t\t\t\t\t\u0022%s: unable to get DNT value\u005cn\u0022, __func__);\n+\t\t\telse\n+\n+\t\t\t\tpss-\u003elen +\u003d lws_snprintf(pr + pss-\u003elen , e - (unsigned int)pss-\u003elen,\n+\t\t\t\t\t\u0022%s: DNT value '%s'\u005cn\u0022, __func__, value);\n+\t\t}\n+\n+\t\tlwsl_user(\u0022%s\u005cn\u0022, pr);\n+\n+\t\tif (lws_add_http_common_headers(wsi, HTTP_STATUS_OK,\n+\t\t\t\t\u0022text/html\u0022, (lws_filepos_t)pss-\u003elen, \u0026p, end))\n+\t\t\treturn 1;\n+\n+\t\tif (lws_finalize_write_http_header(wsi, start, \u0026p, end))\n+\t\t\treturn 1;\n+\n+\n+\t\t/* write the body separately */\n+\t\tlws_callback_on_writable(wsi);\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_HTTP_WRITEABLE:\n+\n+\t\tstrcpy((char *)start, \u0022hello\u0022);\n+\n+\t\tif (lws_write(wsi, (uint8_t *)pr, (unsigned int)pss-\u003elen, LWS_WRITE_HTTP_FINAL) !\u003d pss-\u003elen)\n+\t\t\treturn 1;\n+\n+\t\tif (lws_http_transaction_completed(wsi))\n+\t\t\treturn -1;\n+\t\treturn 0;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, callback_http, sizeof(struct pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static const struct lws_http_mount mount_dyn \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/dyn\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\tNULL,\t/* protocol */\n+\t/* .def */\t\t\tNULL,\n+\t/* .protocol */\t\t\t\u0022http\u0022,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_CALLBACK, /* dynamic */\n+\t/* .mountpoint_len */\t\t4,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\t\u0026mount_dyn,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\u0022./mount-origin\u0022,\t/* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server custom headers | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\t/* for testing ah queue, not useful in real world */\n+\tif (lws_cmdline_option(argc, argv, \u0022--ah1\u0022))\n+\t\tinfo.max_http_header_pool \u003d 1;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* http on 7681 */\n+\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.vhost_name \u003d \u0022http\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create tls vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* https on 7682 */\n+\n+\tinfo.port \u003d 7682;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+#if defined(LWS_WITH_TLS)\n+\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+#endif\n+\tinfo.vhost_name \u003d \u0022https\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create tls vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/404.html\nnew file mode 100644\nindex 0000000..6f85f25\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e\n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/error.css b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/error.css\nnew file mode 100644\nindex 0000000..e69de29\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/error.css\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/index.html\nnew file mode 100644\nindex 0000000..a5fbbd7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/index.html\n@@ -0,0 +1,20 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server custom headers example\u003c/b\u003e.\n+\t\t\u003cp\u003e\n+\t\tThe idea is it will tell you what your browser sent for DNT, a header lws doesn't already know.\n+\t\t\u003cp\u003e\n+\t\tAt the moment the custom header api only works on h1.\n+\t\t\u003cp\u003e\n+\n+\t\t\u003ca href\u003d\u0022http://127.0.0.1:7681/dyn/xxx\u0022 \u003eShow DNT header using h1 over http\u003c/a\u003e\u003cbr\u003e\n+\t\t\u003ca href\u003d\u0022https://127.0.0.1:7682/dyn/xxx\u0022 \u003eShow DNT header using h1 (h2 if enabled) over https\u003c/a\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/CMakeLists.txt\nnew file mode 100644\nindex 0000000..fee8fbc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/CMakeLists.txt\n@@ -0,0 +1,34 @@\n+project(lws-minimal-http-server-deaddrop C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-deaddrop)\n+set(SRCS minimal-http-server-deaddrop.c)\n+\n+# NOTE... if you are building this standalone, you must point LWS_PLUGINS_DIR\n+# to the lws plugins dir so it can pick up the plugin source. Eg,\n+# cmake . -DLWS_PLUGINS_DIR\u003d~/libwebsockets/plugins\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_HTTP_BASIC_AUTH 1 requirements)\n+\n+if (requirements AND UNIX)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (LWS_PLUGINS_DIR)\n+\t\tinclude_directories(${LWS_PLUGINS_DIR})\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/README.md\nnew file mode 100644\nindex 0000000..4a07ad4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/README.md\n@@ -0,0 +1,49 @@\n+# lws minimal http server deaddrop\n+\n+This demonstrates how you can leverage the lws deaddrop plugin to make a\n+secure, modern html5 file upload and sharing application.\n+\n+The demo is protected by basic auth credentials defined in the file at\n+./ba-passwords - by default the credentials are user: user1, password: password;\n+and user: user2, password: password again.\n+\n+You can upload files and have them appear on a shared, downloadable list that\n+is dynamically updated to all clients open on the page. Only the authenticated\n+uploader is able to delete the files he uploaded.\n+\n+Multiple simultaneous ongoing file uploads are supported.\n+\n+## build\n+\n+To build this standalone, you must tell cmake where the lws source tree\n+./plugins directory can be found, since it relies on including the source\n+of the raw-proxy plugin.\n+\n+```\n+ $ cmake . -DLWS_PLUGINS_DIR\u003d~/libwebsockets/plugins \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-deaddrop\n+[2018/12/01 10:31:09:7108] USER: LWS minimal http server deaddrop | visit https://localhost:7681\n+[2018/12/01 10:31:09:8511] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/12/01 10:31:09:8522] NOTICE: Using SSL mode\n+[2018/12/01 10:31:10:0755] NOTICE: SSL ECDH curve 'prime256v1'\n+[2018/12/01 10:31:10:2562] NOTICE: lws_tls_client_create_vhost_context: doing cert filepath localhost-100y.cert\n+[2018/12/01 10:31:10:2581] NOTICE: Loaded client cert localhost-100y.cert\n+[2018/12/01 10:31:10:2583] NOTICE: lws_tls_client_create_vhost_context: doing private key filepath\n+[2018/12/01 10:31:10:2593] NOTICE: Loaded client cert private key localhost-100y.key\n+[2018/12/01 10:31:10:2596] NOTICE: created client ssl context for default\n+[2018/12/01 10:31:10:5290] NOTICE: deaddrop: vh default, upload dir ./uploads, max size 10000000\n+[2018/12/01 10:31:10:5376] NOTICE: vhost default: cert expiry: 730203d\n+...\n+```\n+\n+Visit https://localhost:7681, and follow the link there to the secret area.\n+\n+Give your browser \u0022user1\u0022 and \u0022password\u0022 as the credentials. For testing to\n+confirm what a different user sees, you can also log in as \u0022user2\u0022 and\n+\u0022password\u0022.\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/ba-passwords b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/ba-passwords\nnew file mode 100644\nindex 0000000..cd9feb0\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/ba-passwords\n@@ -0,0 +1,2 @@\n+user1:password\n+user2:password\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/minimal-http-server-deaddrop.c b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/minimal-http-server-deaddrop.c\nnew file mode 100644\nindex 0000000..97902ac\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/minimal-http-server-deaddrop.c\n@@ -0,0 +1,173 @@\n+/*\n+ * lws-minimal-http-server-deaddrop\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates how you can leverage the lws deaddrop plugin to make a\n+ * secure, modern html5 file upload and sharing application.\n+ *\n+ * Because the guts are in a plugin, you can avoid all this setup by using the\n+ * plugin from lwsws and do the config in JSON.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003ctime.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022../plugins/deaddrop/protocol_lws_deaddrop.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+ LWS_PLUGIN_PROTOCOL_DEADDROP,\n+ LWS_PROTOCOL_LIST_TERM\n+};\n+\n+\n+static int interrupted;\n+\n+/*\n+ * teach the /get mount how to present various filetypes to the client...\n+ * lws won't serve files it doesn't know the mimetype for as a security\n+ * measure.\n+ */\n+\n+static struct lws_protocol_vhost_options em3 \u003d {\n+ NULL, NULL, \u0022.zip\u0022, \u0022application/zip\u0022\n+}, em2 \u003d {\n+\t\u0026em3, NULL, \u0022.pdf\u0022, \u0022application/pdf\u0022\n+}, extra_mimetypes \u003d {\n+\t\u0026em2, NULL, \u0022.tar.gz\u0022, \u0022application/x-gzip\u0022\n+};\n+\n+/* wire up /upload URLs to the plugin (protected by basic auth) */\n+\n+static const struct lws_http_mount mount_upload \u003d {\n+\t/* .mount_next */\t\tNULL,\n+\t/* .mountpoint */\t\t\u0022/upload\u0022,\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022lws-deaddrop\u0022,\n+\t/* .def */\t\t\t\u0022\u0022,\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_CALLBACK,\n+\t/* .mountpoint_len */\t\t7,\t\t/* char count */\n+\t/* .basic_auth_login_file */\t\u0022./ba-passwords\u0022,\n+};\n+\n+/* wire up /get URLs to the upload directory (protected by basic auth) */\n+\n+static const struct lws_http_mount mount_get \u003d {\n+\t/* .mount_next */\t\t\u0026mount_upload,\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/get\u0022,\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./uploads\u0022,\n+\t/* .def */\t\t\t\u0022\u0022,\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\t\u0026extra_mimetypes,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE, /* dynamic */\n+\t/* .mountpoint_len */\t\t4,\t\t/* char count */\n+\t/* .basic_auth_login_file */\t\u0022./ba-passwords\u0022,\n+};\n+\n+/* wire up / to serve from ./mount-origin (protected by basic auth) */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\t\u0026mount_get,\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\t\u0022./ba-passwords\u0022,\n+};\n+\n+/* pass config options to the deaddrop plugin using pvos */\n+\n+static struct lws_protocol_vhost_options pvo3 \u003d {\n+\t/* make the wss also require to pass basic auth */\n+\tNULL, NULL, \u0022basic-auth\u0022, \u0022./ba-passwords\u0022\n+}, pvo2 \u003d {\n+\t\u0026pvo3, NULL, \u0022max-size\u0022, \u002210000000\u0022\n+}, pvo1 \u003d {\n+ \u0026pvo2, NULL, \u0022upload-dir\u0022, \u0022./uploads\u0022 /* would be an absolute path */\n+}, pvo \u003d {\n+ NULL, /* \u0022next\u0022 pvo linked-list */\n+ \u0026pvo1, /* \u0022child\u0022 pvo linked-list */\n+ \u0022lws-deaddrop\u0022, /* protocol name we belong to on this vhost */\n+ \u0022\u0022 /* ignored */\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server deaddrop | visit https://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.pvo \u003d \u0026pvo;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+#if defined(LWS_WITH_TLS)\n+\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.css b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.css\nnew file mode 100644\nindex 0000000..549e362\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.css\n@@ -0,0 +1,70 @@\n+.td { padding: 8px }\n+.h1 { }\n+.dd-fileinfo { font-size: 8pt; }\n+table td { \n+ display: table-cell;\n+ vertical-align: top;\n+ background-color: rgba(247, 247, 232, 0.6);\n+ text-align: center\n+}\n+table {\n+ \tborder: 2px solid #ccc;\n+\tpadding: 4px;\n+\tborder-radius: 12px;\n+\ttransition: background-color 0.5s ease;\n+}\n+table.nb { border: 0px; border-radius: 0px; transition: opacity 0.5s; }\n+table.noconn { background-color: #ddd; }\n+\n+div { transition: opacity 0.5s; }\n+div.da { padding-left: 20px; padding-right:20px; }\n+div.trot {\n+\tanimation: scale 0.5s linear infinite;\n+}\n+div.uplbox { padding-bottom: 8px; }\n+div.disa { opacity: 0.2; }\n+\n+td.ogn { text-align:left; font-size: 8pt; padding-left: 4px; padding-right: 4px;}\n+td.dow { text-align:left; font-size: 9pt; padding-left: 4px; padding-right: 4px;}\n+td.r { text-align: right; }\n+td.err { color: red; font-weight: bold; }\n+td.vm { display: table-cell; vertical-align: middle; padding-top: 12px; padding-bottom: 12px; }\n+\n+h3 { font-size: 12pt; margin-bottom: 6px; }\n+span { font-size: 9pt; }\n+a { font-size: 9pt; }\n+\n+input.ubtn { font-size: 16pt; margin-top: 4px; text-align: center }\n+\n+img.working {\n+\tdisplay: inline-block;\n+\tfloat:left;\n+\tbackground: url(\u0022data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKICAgICB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzMHB4IiB2aWV3Qm94PSIwIDAgMjQgMzAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwIDUwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CiAgICA8cmVjdCB4PSIwIiB5PSIxMCIgd2lkdGg9IjQiIGhlaWdodD0iMTAiIGZpbGw9IiMzMzMiIG9wYWNpdHk9IjAuMiI+CiAgICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9Im9wYWNpdHkiIGF0dHJpYnV0ZVR5cGU9IlhNTCIgdmFsdWVzPSIwLjI7IDE7IC4yIiBiZWdpbj0iMHMiIGR1cj0iMC42cyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIC8+CiAgICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImhlaWdodCIgYXR0cmlidXRlVHlwZT0iWE1MIiB2YWx1ZXM9IjEwOyAyMDsgMTAiIGJlZ2luPSIwcyIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICAgICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ieSIgYXR0cmlidXRlVHlwZT0iWE1MIiB2YWx1ZXM9IjEwOyA1OyAxMCIgYmVnaW49IjBzIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0iOCIgeT0iMTAiIHdpZHRoPSI0IiBoZWlnaHQ9IjEwIiBmaWxsPSIjMzMzIiAgb3BhY2l0eT0iMC4yIj4KICAgICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ib3BhY2l0eSIgYXR0cmlidXRlVHlwZT0iWE1MIiB2YWx1ZXM9IjAuMjsgMTsgLjIiIGJlZ2luPSIwLjE1cyIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICAgICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iaGVpZ2h0IiBhdHRyaWJ1dGVUeXBlPSJYTUwiIHZhbHVlcz0iMTA7IDIwOyAxMCIgYmVnaW49IjAuMTVzIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogICAgICA8YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJ5IiBhdHRyaWJ1dGVUeXBlPSJYTUwiIHZhbHVlcz0iMTA7IDU7IDEwIiBiZWdpbj0iMC4xNXMiIGR1cj0iMC42cyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIC8+CiAgICA8L3JlY3Q+CiAgICA8cmVjdCB4PSIxNiIgeT0iMTAiIHdpZHRoPSI0IiBoZWlnaHQ9IjEwIiBmaWxsPSIjMzMzIiAgb3BhY2l0eT0iMC4yIj4KICAgICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ib3BhY2l0eSIgYXR0cmlidXRlVHlwZT0iWE1MIiB2YWx1ZXM9IjAuMjsgMTsgLjIiIGJlZ2luPSIwLjNzIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogICAgICA8YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJoZWlnaHQiIGF0dHJpYnV0ZVR5cGU9IlhNTCIgdmFsdWVzPSIxMDsgMjA7IDEwIiBiZWdpbj0iMC4zcyIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICAgICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ieSIgYXR0cmlidXRlVHlwZT0iWE1MIiB2YWx1ZXM9IjEwOyA1OyAxMCIgYmVnaW49IjAuM3MiIGR1cj0iMC42cyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIC8+CiAgICA8L3JlY3Q+Cjwvc3ZnPg\u003d\u003d\u0022);\n+\twidth:0px;\n+\theight:0px;\n+\tcursor:pointer;\n+\tpadding:0.6em 1em;\n+\tbackground-repeat: no-repeat;\n+\tvertical-align:middle;\n+\tcolor: rgba(0, 0, 0, 0);\n+}\n+\n+img.delbtn {\n+\tdisplay: inline-block;\n+\tfloat:left;\n+\tbackground: url(\u0022data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzNC4yMTcxMzMgMzQuMTQ0MjQ5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZWZzPgoJCTxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjEzNTguNSIgY3k9Ijk3Ny43MiIgcj0iNC4xMTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41MDM1IDAgMCAyLjQ5NDQgLTI1NzcuNCAtMTgyMy44KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KCQk8L3JhZGlhbEdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEzNjYuMyIgeDI9IjEzNDQuOCIgeTE9Ijk3OC4xOSIgeTI9Ijk1OC43MyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMjE3NCAtMTA3Ni4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjOWM5NzlkIiBvZmZzZXQ9IjAiLz4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI2Y0ZmVmMyIgc3RvcC1vcGFjaXR5PSIuNzQwMTYiIG9mZnNldD0iMSIvPgoJCTwvbGluZWFyR3JhZGllbnQ+Cgk8L2RlZnM+Cgk8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4MzQuMjkgMTIzLjc1KSI+CgkJPGcgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KCQkJPGNpcmNsZSBjeD0iLTgxNy4yMiIgY3k9Ii0xMDYuNjgiIHI9IjE2LjA5IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS45NjUiLz4KCQkJPHBhdGggZD0ibS04MjUuNjctMTE0LjcxYzE3LjMzIDE3LjMzIDE3IDE2Ljk5OSAxNyAxNi45OTkiIGZpbGw9IiNmNTUiIHN0cm9rZT0iI2EwMCIgc3Ryb2tlLXdpZHRoPSIxLjY2NSIvPgoJCQk8cGF0aCBkPSJtLTgwOC45Ni0xMTQuNjFjLTE3LjMzIDE3LjMzLTE3IDE2Ljk5OS0xNyAxNi45OTkiIGZpbGw9IiNmNTUiIHN0cm9rZT0iI2EwMCIgc3Ryb2tlLXdpZHRoPSIxLjY2NSIvPgoJCTwvZz4KCQk8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg1NS44ODUpIiBjeD0iLTUzNC45NiIgY3k9IjYxNS4wNyIgcng9IjYuMTg4MyIgcnk9IjEwLjI2NyIgZmlsbD0idXJsKCNhKSIvPgoJPC9nPgo8L3N2Zz4\u003d\u0022);\n+\twidth:0px;\n+\theight:0px;\n+\tcursor:pointer;\n+\tpadding:0.45em;\n+\tbackground-repeat: no-repeat;\n+\tvertical-align:middle;\n+\tcolor: rgba(0, 0, 0, 0);\n+}\n+\n+@keyframes scale {\n+ 50% {\n+ opacity: 0.5;\n+ transform:scale(1.1) rotate(2deg);\n+ }\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.js b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.js\nnew file mode 100644\nindex 0000000..5168859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.js\n@@ -0,0 +1,296 @@\n+(function() {\n+\n+\tvar server_max_size \u003d 0, ws;\n+\n+\tfunction san(s)\n+\t{\n+\t\tif (!s)\n+\t\t\treturn \u0022\u0022;\n+\n+\t\treturn s.replace(/\u0026/g, \u0022\u0026amp;\u0022).\n+\t\treplace(/\u005c\u003c/g, \u0022\u0026lt;\u0022).\n+\t\treplace(/\u005c\u003e/g, \u0022\u0026gt;\u0022).\n+\t\treplace(/\u005c\u0022/g, \u0022\u0026quot;\u0022).\n+\t\treplace(/%/g, \u0022\u0026#37;\u0022);\n+\t}\n+\n+\tfunction lws_urlencode(s)\n+\t{\n+\t\treturn encodeURI(s).replace(/@/g, \u0022%40\u0022);\n+\t}\n+\n+\tfunction trim(num)\n+\t{\n+\t\tvar s \u003d num.toString();\n+\n+\t\tif (!s.indexOf(\u0022.\u0022))\n+\t\t\treturn s;\n+\n+\t\twhile (s.length \u0026\u0026 s[s.length - 1] \u003d\u003d\u003d \u00220\u0022)\n+\t\t\ts \u003d s.substring(0, s.length - 1);\n+\n+\t\tif (s[s.length - 1] \u003d\u003d\u003d \u0022.\u0022)\n+\t\t\ts \u003d s.substring(0, s.length - 1);\n+\n+\t\treturn s;\n+\t}\n+\n+\tfunction humanize(n)\n+\t{\n+\t\tif (n \u003c 1024)\n+\t\t\treturn n + \u0022B\u0022;\n+\n+\t\tif (n \u003c 1024 * 1024)\n+\t\t\treturn trim((n / 1024).toFixed(2)) + \u0022KiB\u0022;\n+\n+\t\tif (n \u003c 1024 * 1024 * 1024)\n+\t\t\treturn trim((n / (1024 * 1024)).toFixed(2)) + \u0022MiB\u0022;\n+\n+\t\treturn trim((n / (1024 * 1024 * 1024)).toFixed(2)) + \u0022GiB\u0022;\n+\t}\n+\n+\tfunction da_enter(e)\n+\t{\n+\t\tvar da \u003d document.getElementById(\u0022da\u0022);\n+\n+\t\te.preventDefault();\n+\t\tda.classList.add(\u0022trot\u0022);\n+\t}\n+\n+\tfunction da_leave(e)\n+\t{\n+\t\tvar da \u003d document.getElementById(\u0022da\u0022);\n+\n+\t\te.preventDefault();\t\n+\t\tda.classList.remove(\u0022trot\u0022);\n+\t}\n+\n+\tfunction da_over(e)\n+\t{\n+\t\tvar da \u003d document.getElementById(\u0022da\u0022);\n+\n+\t\te.preventDefault();\t\t\n+\t\tda.classList.add(\u0022trot\u0022);\n+\t}\n+\n+\tfunction clear_errors() {\n+\t\tvar n, t \u003d document.getElementById(\u0022ongoing\u0022);\n+\n+\t\tfor (n \u003d 0; n \u003c t.rows.length; n++)\n+\t\t\tif (t.rows[n].cells[0].classList.contains(\u0022err\u0022))\n+\t\t\t\tt.deleteRow(n);\n+\t}\n+\n+\tfunction do_upload(file) {\n+\t\tvar formData \u003d new FormData();\n+\t\tvar t \u003d document.getElementById(\u0022ongoing\u0022);\n+\n+\t\tformData.append(\u0022file\u0022, file);\n+\n+\t\tvar row \u003d t.insertRow(0), c1 \u003d row.insertCell(0),\n+\t\tc2 \u003d row.insertCell(1), c3 \u003d row.insertCell(2);\n+\n+\t\tc1.classList.add(\u0022ogn\u0022);\n+\t\tc1.classList.add(\u0022r\u0022);\n+\n+\t\tif (file.size \u003e server_max_size) {\n+\t\t\tc1.innerHTML \u003d \u0022Too Large\u0022;\n+\t\t\tc1.classList.add(\u0022err\u0022);\n+\t\t} else\n+\t\t\tc1.innerHTML \u003d \u0022\u003cimg class\u003d\u005c\u0022working\u005c\u0022\u003e\u0022;\n+\n+\t\tc2.classList.add(\u0022ogn\u0022);\n+\t\tc2.classList.add(\u0022r\u0022);\n+\t\tc2.innerHTML \u003d humanize(file.size);\n+\n+\t\tc3.classList.add(\u0022ogn\u0022);\n+\t\tc3.innerHTML \u003d file.name;\n+\n+\t\tif (file.size \u003e server_max_size)\n+\t\t\treturn;\n+\n+\t\tfetch(\u0022upload/\u0022 + lws_urlencode(file.name), {\n+\t\t\tmethod: \u0022POST\u0022,\n+\t\t\tbody: formData\n+\t\t})\n+\t\t.then((e) \u003d\u003e { /* this just means we got a response code */\t\t\t \n+\t\t\tvar us \u003d e.url.split(\u0022/\u0022), ul \u003d us[us.length - 1], n;\n+\n+\t\t\tfor (n \u003d 0; n \u003c t.rows.length; n++)\n+\t\t\t\tif (ul \u003d\u003d\u003d lws_urlencode(\n+\t\t\t\t\t t.rows[n].cells[2].textContent)) {\n+\t\t\t\t\tif (e.ok \u003d\u003d\u003d true) {\n+\t\t\t\t\t\tt.deleteRow(n);\n+\t\t\t\t\t} else {\n+\t\t\t\t\t\tt.rows[n].cells[0].textContent \u003d\n+\t\t\t\t\t\u0022Failed \u0022 + san(e.status.toString());\n+\t\t\t\t\t\tt.rows[n].cells[0].\n+\t\t\t\t\t\t\tclassList.add(\u0022err\u0022);\n+\t\t\t\t\t}\n+\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t})\n+\t\t.catch((e) \u003d\u003e {\n+\t\t\tvar us \u003d e.url.split(\u0022/\u0022), ul \u003d us[us.length - 1], n;\n+\n+\t\t\tfor (n \u003d 0; n \u003c t.rows.length; n++)\n+\t\t\t\tif (ul \u003d\u003d\u003d lws_urlencode(\n+\t\t\t\t\t t.rows[n].cells[2].textContent)) {\n+\t\t\t\t\tt.rows[n].cells[0] \u003d \u0022FAIL\u0022;\n+\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t});\n+\t}\n+\n+\tfunction da_drop(e) {\n+\t\tvar da \u003d document.getElementById(\u0022da\u0022);\n+\n+\t\te.preventDefault();\t\t\n+\t\tda.classList.remove(\u0022trot\u0022);\n+\n+\t\tclear_errors();\n+\n+\t\t([...e.dataTransfer.files]).forEach(do_upload);\n+\t}\n+\n+\tfunction upl_button(e) {\n+\t\tvar fi \u003d document.getElementById(\u0022file\u0022);\n+\n+\t\tclear_errors();\n+\t\te.preventDefault();\n+\n+\t\t([...fi.files]).forEach(do_upload);\n+\t}\n+\n+\tfunction body_drop(e) {\n+\t\te.preventDefault();\n+\t}\n+\n+\tfunction inp() {\n+\t\tvar fi \u003d document.getElementById(\u0022file\u0022),\n+\t\tupl \u003d document.getElementById(\u0022upl\u0022);\n+\t\tconsole.log(\u0022inp\u0022);\n+\t\tupl.disabled \u003d !fi.files.length;\n+\t}\n+\n+\tfunction delfile(e)\n+\t{\n+\t\te.stopPropagation();\n+\t\te.preventDefault();\n+\n+\t\tws.send(\u0022{\u005c\u0022del\u005c\u0022:\u005c\u0022\u0022 + decodeURI(e.target.getAttribute(\u0022file\u0022)) +\n+\t\t\u0022\u005c\u0022}\u0022);\n+\t}\n+\n+\tfunction get_appropriate_ws_url(extra_url)\n+\t{\n+\t\tvar pcol;\n+\t\tvar u \u003d document.URL;\n+\n+\t\t/*\n+\t\t * We open the websocket encrypted if this page came on an\n+\t\t * https:// url itself, otherwise unencrypted\n+\t\t */\n+\n+\t\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\t\tpcol \u003d \u0022wss://\u0022;\n+\t\t\tu \u003d u.substr(8);\n+\t\t} else {\n+\t\t\tpcol \u003d \u0022ws://\u0022;\n+\t\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\t\tu \u003d u.substr(7);\n+\t\t}\n+\n+\t\tu \u003d u.split(\u0022/\u0022);\n+\n+\t\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\t\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+\t}\n+\n+\tfunction new_ws(urlpath, protocol)\n+\t{\n+\t\treturn new WebSocket(urlpath, protocol);\n+\t}\n+\n+\tdocument.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\t\tvar da \u003d document.getElementById(\u0022da\u0022),\n+\t\tfi \u003d document.getElementById(\u0022file\u0022),\n+\t\tupl \u003d document.getElementById(\u0022upl\u0022);\n+\n+\t\tda.addEventListener(\u0022dragenter\u0022, da_enter, false);\n+\t\tda.addEventListener(\u0022dragleave\u0022, da_leave, false);\n+\t\tda.addEventListener(\u0022dragover\u0022, da_over, false);\n+\t\tda.addEventListener(\u0022drop\u0022, da_drop, false);\n+\n+\t\tupl.addEventListener(\u0022click\u0022, upl_button, false);\t\t\n+\t\tfi.addEventListener(\u0022change\u0022, inp, false);\n+\n+\t\twindow.addEventListener(\u0022dragover\u0022, body_drop, false);\n+\t\twindow.addEventListener(\u0022drop\u0022, body_drop, false);\n+\n+\t\tws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-deaddrop\u0022);\n+\t\ttry {\n+\t\t\tws.onopen \u003d function() {\n+\t\t\t\tvar dd \u003d document.getElementById(\u0022ddrop\u0022),\n+\t\t\t\tda \u003d document.getElementById(\u0022da\u0022);\n+\n+\t\t\t\tdd.classList.remove(\u0022noconn\u0022);\n+\t\t\t\tda.classList.remove(\u0022disa\u0022);\n+\t\t\t};\n+\n+\t\t\tws.onmessage \u003d function got_packet(msg) {\n+\t\t\t\tvar j \u003d JSON.parse(msg.data), s \u003d \u0022\u0022, n,\n+\t\t\t\tt \u003d document.getElementById(\u0022dd-list\u0022);\n+\n+\t\t\t\tserver_max_size \u003d j.max_size;\n+\t\t\t\tdocument.getElementById(\u0022size\u0022).innerHTML \u003d\n+\t\t\t\t\t\u0022Server maximum file size \u0022 +\n+\t\t\t\t\thumanize(j.max_size);\n+\n+\t\t\t\ts +\u003d \u0022\u003ctable class\u003d\u005c\u0022nb\u005c\u0022\u003e\u0022;\n+\t\t\t\tfor (n \u003d 0; n \u003c j.files.length; n++) {\n+\t\t\t\t\tvar date \u003d new Date(j.files[n].mtime * 1000);\n+\t\t\t\t\ts +\u003d \u0022\u003ctr\u003e\u003ctd class\u003d\u005c\u0022dow r\u005c\u0022\u003e\u0022 +\n+\t\t\t\t\thumanize(j.files[n].size) +\n+\t\t\t\t\t\u0022\u003c/td\u003e\u003ctd class\u003d\u005c\u0022dow\u005c\u0022\u003e\u0022 +\n+\t\t\t\t\tdate.toDateString() + \u0022 \u0022 +\n+\t\t\t\t\tdate.toLocaleTimeString() +\n+\t\t\t\t\t\u0022\u003c/td\u003e\u003ctd\u003e\u0022;\n+\t\t\t\t\tif (j.files[n].yours \u003d\u003d\u003d 1)\n+\t\t\t\t\t\ts +\u003d \u0022\u003cimg id\u003d\u005c\u0022d\u0022 + n +\n+\t\t\t\t\t \u0022\u005c\u0022 class\u003d\u005c\u0022delbtn\u005c\u0022 file\u003d\u005c\u0022\u0022 +\n+\t\t\t\t\t\tlws_urlencode(san(j.files[n].name)) + \u0022\u005c\u0022\u003e\u0022;\n+\t\t\t\t\telse\n+\t\t\t\t\t\ts +\u003d \u0022 \u0022;\n+\n+\t\t\t\t\ts +\u003d \u0022\u003c/td\u003e\u003ctd class\u003d\u005c\u0022ogn\u005c\u0022\u003e\u003ca href\u003d\u005c\u0022get/\u0022 +\n+\t\t\t\t\tlws_urlencode(san(j.files[n].name)) +\n+\t\t\t\t\t \u0022\u005c\u0022 download\u003e\u0022 +\n+\t\t\t\t\tsan(j.files[n].name) + \u0022\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u0022;\n+\t\t\t\t}\n+\t\t\t\ts +\u003d \u0022\u003c/table\u003e\u0022;\n+\n+\t\t\t\tt.innerHTML \u003d s;\n+\n+\t\t\t\tfor (n \u003d 0; n \u003c j.files.length; n++) {\n+\t\t\t\t\tvar d \u003d document.getElementById(\u0022d\u0022 + n);\n+\t\t\t\t\tif (d)\n+\t\t\t\t\t\td.addEventListener(\u0022click\u0022,\n+\t\t\t\t\t\t\t\tdelfile, false);\n+\t\t\t\t}\n+\t\t\t};\n+\n+\t\t\tws.onclose \u003d function() {\n+\t\t\t\tvar dd \u003d document.getElementById(\u0022ddrop\u0022),\n+\t\t\t\tda \u003d document.getElementById(\u0022da\u0022);\n+\n+\t\t\t\tdd.classList.add(\u0022noconn\u0022);\n+\t\t\t\tda.classList.add(\u0022disa\u0022);\n+\t\t\t};\n+\t\t} catch(exception) {\n+\t\t\talert(\u0022\u003cp\u003eError \u0022 + exception);\n+\t\t}\n+\n+\t});\n+}());\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/drop.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/drop.svg\nnew file mode 100644\nindex 0000000..f413cf0\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/drop.svg\n@@ -0,0 +1,102 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002249.443mm\u0022 height\u003d\u002249.443mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 49.442779 49.442779\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+\t\u003cdefs\u003e\n+\t\t\u003cfilter id\u003d\u0022d\u0022 x\u003d\u0022-.088487\u0022 y\u003d\u0022-.064772\u0022 width\u003d\u00221.177\u0022 height\u003d\u00221.1295\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+\t\t\t\u003cfeGaussianBlur stdDeviation\u003d\u00220.15643472\u0022/\u003e\n+\t\t\u003c/filter\u003e\n+\t\t\u003cfilter id\u003d\u0022e\u0022 x\u003d\u0022-.088487\u0022 y\u003d\u0022-.064772\u0022 width\u003d\u00221.177\u0022 height\u003d\u00221.1295\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+\t\t\t\u003cfeGaussianBlur stdDeviation\u003d\u00220.15643472\u0022/\u003e\n+\t\t\u003c/filter\u003e\n+\t\t\u003clinearGradient id\u003d\u0022c\u0022 x1\u003d\u0022208.34\u0022 x2\u003d\u0022352.29\u0022 y1\u003d\u002232.317\u0022 y2\u003d\u0022159.6\u0022 gradientTransform\u003d\u0022matrix(.26458 0 0 .26458 -586.44 -188.57)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+\t\t\t\u003cstop stop-opacity\u003d\u0022.49606\u0022 offset\u003d\u00220\u0022/\u003e\n+\t\t\t\u003cstop stop-color\u003d\u0022#fff6d5\u0022 stop-opacity\u003d\u00220\u0022 offset\u003d\u00221\u0022/\u003e\n+\t\t\u003c/linearGradient\u003e\n+\t\t\u003clinearGradient id\u003d\u0022b\u0022 x1\u003d\u0022365.17\u0022 x2\u003d\u0022216.93\u0022 y1\u003d\u0022163.64\u0022 y2\u003d\u002236.61\u0022 gradientTransform\u003d\u0022matrix(.26458 0 0 .26458 -586.5 -188.43)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+\t\t\t\u003cstop stop-color\u003d\u0022#fff\u0022 offset\u003d\u00220\u0022/\u003e\n+\t\t\t\u003cstop stop-color\u003d\u0022#fff\u0022 stop-opacity\u003d\u0022.007874\u0022 offset\u003d\u00221\u0022/\u003e\n+\t\t\u003c/linearGradient\u003e\n+\t\t\u003clinearGradient id\u003d\u0022a\u0022 x1\u003d\u0022-529.78\u0022 x2\u003d\u0022-494.03\u0022 y1\u003d\u0022-175.41\u0022 y2\u003d\u0022-147.94\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+\t\t\t\u003cstop stop-color\u003d\u0022#c1dc5f\u0022 stop-opacity\u003d\u0022.61417\u0022 offset\u003d\u00220\u0022/\u003e\n+\t\t\t\u003cstop stop-color\u003d\u0022#a9aa52\u0022 stop-opacity\u003d\u0022.8937\u0022 offset\u003d\u00221\u0022/\u003e\n+\t\t\u003c/linearGradient\u003e\n+\t\u003c/defs\u003e\n+\t\u003cg transform\u003d\u0022translate(536.12 186.96)\u0022\u003e\n+\t\t\u003ccircle cx\u003d\u0022-511.4\u0022 cy\u003d\u0022-162.24\u0022 r\u003d\u002224.457\u0022 fill\u003d\u0022url(#a)\u0022/\u003e\n+\t\t\u003cg transform\u003d\u0022matrix(.78726 0 0 .78726 -108.47 -33.661)\u0022\u003e\n+\t\t\t\u003cg stroke\u003d\u0022#000\u0022\u003e\n+\t\t\t\t\u003cpath transform\u003d\u0022matrix(2.9413 0 0 2.9413 -4498.4 -3189.2)\u0022 d\u003d\u0022m1354 1027.2v5.7964h4.2429v-4.5102l-1.211-1.211-0.075-0.075z\u0022 filter\u003d\u0022url(#e)\u0022 stroke-width\u003d\u0022.26458px\u0022/\u003e\n+\t\t\t\t\u003cpath transform\u003d\u0022matrix(2.9413 0 0 2.9413 -4498.4 -3189.2)\u0022 d\u003d\u0022m1353.2 1025.7v5.7964h4.2429v-4.5101l-1.2111-1.2111-0.075-0.075z\u0022 filter\u003d\u0022url(#d)\u0022 stroke-width\u003d\u0022.26458px\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-516.24-168.48v17.049h12.479v-13.266l-3.5622-3.5619-0.22056-0.22058z\u0022 fill\u003d\u0022#ececec\u0022 stroke-width\u003d\u0022.77821px\u0022/\u003e\n+\t\t\t\u003c/g\u003e\n+\t\t\t\u003cg fill\u003d\u0022none\u0022 stroke\u003d\u0022#4d4d4d\u0022 stroke-width\u003d\u0022.77821px\u0022\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-513.59-164.94h7.2225\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-513.56-162.83h7.2222\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-513.57-160.59h7.2222\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-513.55-158.48h7.2225\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-513.57-156.27h7.2222\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-513.55-154.16h7.2225\u0022/\u003e\n+\t\t\t\u003c/g\u003e\n+\t\t\t\u003cpath d\u003d\u0022m-518.5-172.78v17.048h12.479v-13.265l-3.5622-3.5622-0.22057-0.22059z\u0022 fill\u003d\u0022#fff\u0022 stroke\u003d\u0022#000\u0022 stroke-width\u003d\u0022.77821px\u0022/\u003e\n+\t\t\t\u003cg fill\u003d\u0022none\u0022 stroke\u003d\u0022#000\u0022 stroke-width\u003d\u0022.77821px\u0022\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-515.99-169.38h7.2225\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-515.82-167.13h7.2222\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-515.83-164.89h7.2223\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-515.81-162.78h7.2225\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-515.83-160.57h7.2223\u0022/\u003e\n+\t\t\t\t\u003cpath d\u003d\u0022m-515.81-158.46h7.2225\u0022/\u003e\n+\t\t\t\u003c/g\u003e\n+\t\t\u003c/g\u003e\n+\t\t\u003cg\u003e\n+\t\t\t\u003cg\u003e\n+\t\t\t\t\u003cg dominant-baseline\u003d\u0022auto\u0022 fill\u003d\u0022#540\u0022 stroke-width\u003d\u0022.023836\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022to upload\u0022\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-518.24-173.3q0.0983 0 0.1743-0.0268v0.17877q-0.0983 0.0447-0.25251 0.0447-0.37541 0-0.37541-0.56088v-1.7206h-0.21899v-0.12514l0.21452-0.0626 0.0693-0.57653h0.14749v0.57653h0.38435v0.18771h-0.38435v1.6603q0 0.24581 0.0536 0.33519 0.0536 0.0894 0.1877 0.0894z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-516.32-174.37q0 0.61228-0.19441 0.93854-0.19218 0.32401-0.55195 0.32401-0.3553 0-0.54525-0.32401-0.1877-0.32626-0.1877-0.93854 0-1.2536 0.74189-1.2536 0.3486 0 0.54301 0.32848 0.19441 0.32849 0.19441 0.92513zm-1.2581 0q0 0.52513 0.12514 0.79329 0.12514 0.26815 0.39106 0.26815 0.52066 0 0.52066-1.0614 0-1.0525-0.52066-1.0525-0.27262 0-0.39553 0.26368-0.12067 0.26369-0.12067 0.78882z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-514.72-175.57v1.5821q0 0.35978 0.0849 0.52514 0.0872 0.16536 0.26592 0.16536 0.27486 0 0.40223-0.22123 0.12961-0.22346 0.12961-0.71954v-1.3318h0.21005v2.4246h-0.17877l-0.0268-0.33966h-0.0179q-0.0782 0.18547-0.21676 0.28603-0.13854 0.0983-0.30167 0.0983-0.29273 0-0.42904-0.20781-0.13408-0.20782-0.13408-0.67933v-1.5821z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-512.19-173.11q-0.18323 0-0.33519-0.10055-0.14972-0.10279-0.22793-0.27933h-0.0201l0.0156 0.26592v1.1687h-0.21228v-3.524h0.1743l0.0223 0.33296h0.0201q0.0894-0.18324 0.22793-0.28156 0.14078-0.0983 0.30614-0.0983 0.71061 0 0.71061 1.2536 0 0.60558-0.1743 0.93407-0.1743 0.32848-0.50726 0.32848zm-0.0425-2.315q-0.26592 0-0.39553 0.23463-0.12961 0.23464-0.12961 0.73519v0.0693q0 0.55866 0.13185 0.82234 0.13184 0.26145 0.40223 0.26145 0.25027 0 0.37094-0.25922 0.1229-0.26145 0.1229-0.81116 0-0.52513-0.11396-0.78882-0.11397-0.26368-0.38882-0.26368z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-510.77-173.15h-0.21228v-3.477h0.21228z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-508.76-174.37q0 0.61228-0.19441 0.93854-0.19217 0.32401-0.55195 0.32401-0.3553 0-0.54524-0.32401-0.18771-0.32626-0.18771-0.93854 0-1.2536 0.74189-1.2536 0.3486 0 0.54301 0.32848 0.19441 0.32849 0.19441 0.92513zm-1.2581 0q0 0.52513 0.12514 0.79329 0.12513 0.26815 0.39105 0.26815 0.52067 0 0.52067-1.0614 0-1.0525-0.52067-1.0525-0.27262 0-0.39552 0.26368-0.12067 0.26369-0.12067 0.78882z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-507.28-173.15-0.0268-0.33966h-9e-3q-0.1743 0.38435-0.52737 0.38435-0.23687 0-0.38212-0.1877-0.14302-0.18994-0.14302-0.50726 0-0.34636 0.20782-0.54748 0.20782-0.20335 0.58324-0.22122l0.26145-0.0134v-0.20112q0-0.33966-0.0849-0.49385-0.0849-0.15642-0.28156-0.15642-0.20782 0-0.42458 0.13631l-0.0916-0.16759q0.25252-0.15642 0.52961-0.15642 0.29943 0 0.43128 0.18994 0.13184 0.1877 0.13184 0.63016v1.6514zm-0.5162-0.13631q0.22793 0 0.35307-0.22346 0.12738-0.2257 0.12738-0.63686v-0.25251l-0.25252 0.0134q-0.29273 0.0156-0.43574 0.16313-0.14078 0.14525-0.14078 0.42681 0 0.26368 0.0938 0.38659 0.0939 0.1229 0.25474 0.1229z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-505.87-173.11q-0.70614 0-0.70614-1.2536 0-0.61675 0.17654-0.93854 0.17653-0.32401 0.52066-0.32401 0.16313 0 0.30838 0.0939 0.14748 0.0938 0.23463 0.25921h0.0179l-9e-3 -0.27038v-1.0883h0.21229v3.477h-0.1743l-0.0179-0.33966h-0.0201q-0.0872 0.18547-0.2257 0.28603-0.13854 0.0983-0.31731 0.0983zm0.0134-0.18547q0.25474 0 0.39105-0.23463 0.13855-0.23687 0.13855-0.69497v-0.13854q0-0.54971-0.13408-0.80446-0.13184-0.25698-0.40446-0.25698-0.26145 0-0.37542 0.27486-0.11396 0.27262-0.11396 0.79105 0 0.5229 0.11843 0.79328 0.11844 0.27039 0.37989 0.27039z\u0022/\u003e\n+\t\t\t\t\u003c/g\u003e\n+\t\t\t\t\u003cg dominant-baseline\u003d\u0022auto\u0022 fill\u003d\u0022#540\u0022 stroke-width\u003d\u0022.023836\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022Drop files here\u0022\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-520.62-179.04q0 1.6648-1.0391 1.6648h-0.581v-3.267h0.59441q0.50502 0 0.76424 0.40894 0.26144 0.40669 0.26144 1.1933zm-0.23016 0.0134q0-0.69049-0.20335-1.0525-0.20335-0.362-0.60111-0.362h-0.36648v2.8648h0.3486q0.42458 0 0.62346-0.37094 0.19888-0.37095 0.19888-1.0793z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-519.37-179.85q0.11397 0 0.21229 0.0313l-0.0514 0.21228q-0.0804-0.0335-0.16536-0.0335-0.1229 0-0.23016 0.12737-0.10503 0.12514-0.16536 0.35083-0.0603 0.2257-0.0603 0.49832v1.2849h-0.21229v-2.4246h0.1743l0.0224 0.42457h0.0156q0.16983-0.4715 0.46033-0.4715z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-517.43-178.6q0 0.61228-0.19441 0.93853-0.19218 0.32402-0.55195 0.32402-0.3553 0-0.54524-0.32402-0.18771-0.32625-0.18771-0.93853 0-1.2536 0.74189-1.2536 0.3486 0 0.54301 0.32849t0.19441 0.92513zm-1.2581 0q0 0.52513 0.12513 0.79328 0.12514 0.26816 0.39106 0.26816 0.52066 0 0.52066-1.0614 0-1.0525-0.52066-1.0525-0.27262 0-0.39552 0.26368-0.12067 0.26368-0.12067 0.78882z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-516.11-177.33q-0.18324 0-0.33519-0.10056-0.14972-0.10279-0.22793-0.27932h-0.0201l0.0156 0.26592v1.1687h-0.21229v-3.524h0.1743l0.0224 0.33296h0.0201q0.0894-0.18324 0.22793-0.28156 0.14078-0.0983 0.30614-0.0983 0.71061 0 0.71061 1.2536 0 0.60558-0.1743 0.93406-0.1743 0.32849-0.50726 0.32849zm-0.0425-2.315q-0.26592 0-0.39552 0.23463-0.12961 0.23464-0.12961 0.73519v0.0693q0 0.55865 0.13184 0.82234 0.13184 0.26145 0.40223 0.26145 0.25028 0 0.37095-0.25922 0.1229-0.26145 0.1229-0.81116 0-0.52514-0.11397-0.78882-0.11396-0.26368-0.38882-0.26368z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-513.42-179.61h-0.37988v2.2368h-0.21006v-2.2368h-0.30837v-0.12067l0.30837-0.0916v-0.18324q0-0.46256 0.1095-0.66591 0.10949-0.20335 0.37988-0.20335 0.15642 0 0.2838 0.0559l-0.0737 0.19665q-0.11843-0.0559-0.21452-0.0559-0.10949 0-0.16536 0.0648-0.0559 0.0648-0.0827 0.21005t-0.0268 0.40223v0.20335h0.37988zm0.60558 2.2368h-0.21229v-2.4246h0.21229zm-0.24357-3.0972q0-0.10056 0.0402-0.15642 0.0425-0.0559 0.10726-0.0559 0.0603 0 0.0961 0.0559t0.0358 0.15642q0 0.0961-0.0358 0.15419-0.0358 0.0559-0.0961 0.0559-0.0648 0-0.10726-0.0559-0.0402-0.0581-0.0402-0.15419z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-511.95-177.38h-0.21229v-3.477h0.21229z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-510.61-177.33q-0.38435 0-0.59217-0.32625-0.20558-0.32849-0.20558-0.91396 0-0.62122 0.18323-0.94747 0.18548-0.32849 0.53184-0.32849 0.30167 0 0.47597 0.28827 0.1743 0.28603 0.1743 0.77317v0.19665h-1.1486q4e-3 0.5296 0.14972 0.79328 0.14525 0.26369 0.44022 0.26369 0.22793 0 0.48044-0.14972v0.20558q-0.2324 0.14525-0.48938 0.14525zm-0.0961-2.324q-0.43798 0-0.48044 0.87373h0.93184q0-0.39999-0.12291-0.63686-0.12067-0.23687-0.32849-0.23687z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-508.55-177.99q0 0.30614-0.16089 0.48044-0.16089 0.17206-0.4648 0.17206-0.16536 0-0.2905-0.0425t-0.19441-0.0939v-0.24804q0.0827 0.0827 0.21899 0.13408 0.13631 0.0492 0.27933 0.0492 0.18771 0 0.29497-0.12291 0.10726-0.1229 0.10726-0.32848 0-0.1609-0.0782-0.27039-0.076-0.11173-0.29274-0.25251-0.24804-0.15642-0.33966-0.25028-0.0894-0.0938-0.14078-0.21005-0.0492-0.1162-0.0492-0.27709 0-0.26145 0.17653-0.43128 0.17654-0.17207 0.44916-0.17207 0.29273 0 0.48938 0.13855l-0.1095 0.18547q-0.18323-0.1229-0.38882-0.1229-0.1877 0-0.29943 0.11173-0.11174 0.10949-0.11174 0.2905 0 0.16089 0.076 0.27038 0.076 0.10727 0.32179 0.26145 0.24133 0.15866 0.33072 0.25475 0.0894 0.0939 0.13184 0.21005 0.0447 0.11397 0.0447 0.26369z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-506.11-177.38v-1.6715q0-0.32849-0.0872-0.4648-0.0849-0.13854-0.27932-0.13854-0.25698 0-0.38659 0.22793t-0.12961 0.71954v1.3274h-0.21228v-3.477h0.21228v1.1285q0 0.15418-9e-3 0.25698h0.0179q0.0715-0.18101 0.21452-0.27933 0.14525-0.10056 0.30168-0.10056 0.30837 0 0.43798 0.20112 0.12961 0.20111 0.12961 0.59887v1.6715z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-504.57-177.33q-0.38435 0-0.59217-0.32625-0.20558-0.32849-0.20558-0.91396 0-0.62122 0.18324-0.94747 0.18547-0.32849 0.53183-0.32849 0.30168 0 0.47597 0.28827 0.1743 0.28603 0.1743 0.77317v0.19665h-1.1486q4e-3 0.5296 0.14971 0.79328 0.14525 0.26369 0.44022 0.26369 0.22793 0 0.48044-0.14972v0.20558q-0.2324 0.14525-0.48938 0.14525zm-0.0961-2.324q-0.43799 0-0.48045 0.87373h0.93184q0-0.39999-0.12291-0.63686-0.12067-0.23687-0.32848-0.23687z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-502.79-179.85q0.11396 0 0.21228 0.0313l-0.0514 0.21228q-0.0805-0.0335-0.16536-0.0335-0.12291 0-0.23017 0.12737-0.10502 0.12514-0.16536 0.35083-0.0603 0.2257-0.0603 0.49832v1.2849h-0.21229v-2.4246h0.1743l0.0223 0.42457h0.0156q0.16983-0.4715 0.46033-0.4715z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-501.52-177.33q-0.38435 0-0.59217-0.32625-0.20559-0.32849-0.20559-0.91396 0-0.62122 0.18324-0.94747 0.18547-0.32849 0.53184-0.32849 0.30167 0 0.47597 0.28827 0.1743 0.28603 0.1743 0.77317v0.19665h-1.1486q4e-3 0.5296 0.14972 0.79328 0.14525 0.26369 0.44022 0.26369 0.22793 0 0.48044-0.14972v0.20558q-0.2324 0.14525-0.48938 0.14525zm-0.0961-2.324q-0.43798 0-0.48044 0.87373h0.93183q0-0.39999-0.1229-0.63686-0.12067-0.23687-0.32849-0.23687z\u0022/\u003e\n+\t\t\t\t\u003c/g\u003e\n+\t\t\t\t\u003cg dominant-baseline\u003d\u0022auto\u0022 fill\u003d\u0022#786721\u0022 stroke-width\u003d\u0022.21029\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022multiple selection OK\u0022\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-521.09-144.73v-1.2141q0-0.44852-0.26286-0.44852-0.18073 0-0.26123 0.15772-0.0789 0.15608-0.0789 0.46167v1.0432h-0.15443v-1.2141q0-0.22672-0.0641-0.3368-0.0641-0.11172-0.19879-0.11172-0.17744 0-0.25794 0.16101t-0.0805 0.52245v0.97918h-0.15608v-1.7826h0.13143l0.0131 0.24808h0.0148q0.10679-0.28258 0.36309-0.28258 0.14786 0 0.23329 0.0789 0.0854 0.0789 0.12322 0.23001 0.0641-0.16429 0.15772-0.23658 0.0937-0.0723 0.24316-0.0723 0.20208 0 0.29572 0.15608 0.0936 0.15443 0.0936 0.49616v1.1648z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-520.31-146.51v1.1632q0 0.26451 0.0624 0.38609 0.0641 0.12157 0.19551 0.12157 0.20208 0 0.29572-0.16265 0.0953-0.16429 0.0953-0.52902v-0.97918h0.15444v1.7826h-0.13144l-0.0197-0.24972h-0.0132q-0.0575 0.13636-0.15936 0.21029-0.10186 0.0723-0.22179 0.0723-0.21523 0-0.31545-0.15279-0.0986-0.15279-0.0986-0.49945v-1.1632z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-518.88-144.73h-0.15608v-2.5564h0.15608z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-518.07-144.84q0.0723 0 0.12815-0.0197v0.13143q-0.0723 0.0329-0.18565 0.0329-0.27601 0-0.27601-0.41237v-1.265h-0.16101v-0.092l0.15772-0.046 0.0509-0.42387h0.10843v0.42387h0.28258v0.13801h-0.28258v1.2207q0 0.18072 0.0394 0.24644 0.0394 0.0657 0.138 0.0657z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-517.51-144.73h-0.15608v-1.7826h0.15608zm-0.17908-2.2771q0-0.0739 0.0296-0.115 0.0312-0.0411 0.0789-0.0411 0.0444 0 0.0707 0.0411t0.0263 0.115q0 0.0707-0.0263 0.11336-0.0263 0.0411-0.0707 0.0411-0.0476 0-0.0789-0.0411-0.0296-0.0427-0.0296-0.11336z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-516.46-144.69q-0.13471 0-0.24643-0.0739-0.11008-0.0756-0.16758-0.20537h-0.0148l0.0115 0.19551v0.85925h-0.15608v-2.5909h0.12815l0.0164 0.2448h0.0148q0.0657-0.13472 0.16758-0.20701 0.1035-0.0723 0.22508-0.0723 0.52245 0 0.52245 0.92168 0 0.44523-0.12815 0.68674t-0.37295 0.24151zm-0.0312-1.7021q-0.19551 0-0.2908 0.17251-0.0953 0.17251-0.0953 0.54052v0.0509q0 0.41073 0.0969 0.6046 0.0969 0.19222 0.29573 0.19222 0.18401 0 0.27273-0.19058 0.0904-0.19222 0.0904-0.59638 0-0.38609-0.0838-0.57995-0.0838-0.19387-0.28587-0.19387z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-515.41-144.73h-0.15608v-2.5564h0.15608z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-514.43-144.69q-0.28259 0-0.43538-0.23987-0.15115-0.24151-0.15115-0.67195 0-0.45673 0.13472-0.6966 0.13636-0.24151 0.39102-0.24151 0.22179 0 0.34994 0.21194 0.12815 0.21029 0.12815 0.56845v0.14458h-0.84446q3e-3 0.38937 0.11007 0.58323 0.10679 0.19387 0.32366 0.19387 0.16758 0 0.35323-0.11008v0.15115q-0.17087 0.10679-0.3598 0.10679zm-0.0707-1.7086q-0.32201 0-0.35323 0.64238h0.6851q0-0.29408-0.0904-0.46823-0.0887-0.17415-0.24151-0.17415z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-512.29-145.17q0 0.22508-0.11829 0.35323-0.11829 0.1265-0.34173 0.1265-0.12157 0-0.21358-0.0312-0.092-0.0312-0.14293-0.069v-0.18236q0.0608 0.0608 0.16101 0.0986 0.10021 0.0362 0.20536 0.0362 0.13801 0 0.21687-0.0904 0.0789-0.0904 0.0789-0.24151 0-0.11829-0.0575-0.1988-0.0559-0.0821-0.21523-0.18565-0.18236-0.115-0.24972-0.184-0.0657-0.069-0.10351-0.15444-0.0361-0.0854-0.0361-0.20372 0-0.19222 0.12979-0.31709 0.12979-0.1265 0.33023-0.1265 0.21522 0 0.3598 0.10186l-0.0805 0.13636q-0.13472-0.0904-0.28587-0.0904-0.13801 0-0.22015 0.0822-0.0821 0.0805-0.0821 0.21358 0 0.11829 0.0559 0.19879 0.0559 0.0789 0.23658 0.19222 0.17744 0.11665 0.24315 0.1873 0.0657 0.069 0.0969 0.15443 0.0329 0.0838 0.0329 0.19387z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-511.42-144.69q-0.28258 0-0.43537-0.23987-0.15115-0.24151-0.15115-0.67195 0-0.45673 0.13472-0.6966 0.13636-0.24151 0.39101-0.24151 0.2218 0 0.34995 0.21194 0.12814 0.21029 0.12814 0.56845v0.14458h-0.84446q3e-3 0.38937 0.11008 0.58323 0.10679 0.19387 0.32365 0.19387 0.16758 0 0.35323-0.11008v0.15115q-0.17086 0.10679-0.3598 0.10679zm-0.0706-1.7086q-0.32202 0-0.35323 0.64238h0.6851q0-0.29408-0.0904-0.46823-0.0887-0.17415-0.24151-0.17415z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-510.45-144.73h-0.15608v-2.5564h0.15608z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-509.47-144.69q-0.28258 0-0.43537-0.23987-0.15115-0.24151-0.15115-0.67195 0-0.45673 0.13472-0.6966 0.13636-0.24151 0.39102-0.24151 0.22179 0 0.34994 0.21194 0.12815 0.21029 0.12815 0.56845v0.14458h-0.84447q3e-3 0.38937 0.11008 0.58323 0.10679 0.19387 0.32366 0.19387 0.16757 0 0.35322-0.11008v0.15115q-0.17086 0.10679-0.3598 0.10679zm-0.0706-1.7086q-0.32201 0-0.35323 0.64238h0.6851q0-0.29408-0.0904-0.46823-0.0887-0.17415-0.24151-0.17415z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-508.2-144.69q-0.2678 0-0.40416-0.23165-0.13472-0.2333-0.13472-0.68346 0-0.45673 0.13636-0.69495 0.13801-0.23987 0.40581-0.23987 0.16593 0 0.27601 0.0608l-0.0608 0.138q-0.11008-0.0509-0.20208-0.0509-0.39266 0-0.39266 0.78368 0 0.7771 0.39266 0.7771 0.11665 0 0.25301-0.0526v0.13143q-0.0542 0.0296-0.13308 0.046-0.0789 0.0164-0.13636 0.0164z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-507.28-144.84q0.0723 0 0.12815-0.0197v0.13143q-0.0723 0.0329-0.18565 0.0329-0.27601 0-0.27601-0.41237v-1.265h-0.161v-0.092l0.15772-0.046 0.0509-0.42387h0.10843v0.42387h0.28258v0.13801h-0.28258v1.2207q0 0.18072 0.0394 0.24644 0.0394 0.0657 0.138 0.0657z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-506.72-144.73h-0.15608v-1.7826h0.15608zm-0.17908-2.2771q0-0.0739 0.0296-0.115 0.0312-0.0411 0.0789-0.0411 0.0444 0 0.0707 0.0411t0.0263 0.115q0 0.0707-0.0263 0.11336-0.0263 0.0411-0.0707 0.0411-0.0476 0-0.0789-0.0411-0.0296-0.0427-0.0296-0.11336z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-505.24-145.62q0 0.45016-0.14293 0.69003-0.14129 0.23822-0.4058 0.23822-0.26123 0-0.40088-0.23822-0.138-0.23987-0.138-0.69003 0-0.92168 0.54545-0.92168 0.25629 0 0.39923 0.24151 0.14293 0.24151 0.14293 0.68017zm-0.92496 0q0 0.38609 0.092 0.58324t0.28751 0.19715q0.3828 0 0.3828-0.78039 0-0.77382-0.3828-0.77382-0.20043 0-0.2908 0.19387-0.0887 0.19386-0.0887 0.57995z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-504.04-144.73v-1.2289q0-0.44359-0.26287-0.44359-0.20044 0-0.29408 0.16593-0.092 0.16594-0.092 0.52738v0.97918h-0.15607v-1.7826h0.13143l0.0131 0.24808h0.0148q0.0559-0.13472 0.16101-0.20865 0.10514-0.0739 0.22508-0.0739 0.20701 0 0.31051 0.13965 0.1035 0.138 0.1035 0.44523v1.2322z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-501.45-145.93q0 0.59638-0.17908 0.91675-0.17743 0.32037-0.51423 0.32037-0.34009 0-0.51588-0.32201-0.17579-0.32366-0.17579-0.9184 0-0.62102 0.17415-0.92496t0.52245-0.30394q0.33515 0 0.51095 0.32037 0.17743 0.31872 0.17743 0.91182zm-1.2174 0q0 0.53559 0.13307 0.80996 0.13472 0.27273 0.39102 0.27273 0.25794 0 0.39101-0.27109 0.13472-0.27108 0.13472-0.8116 0-0.53395-0.13143-0.80503-0.13143-0.27273-0.38937-0.27273-0.26451 0-0.39759 0.27601-0.13143 0.27437-0.13143 0.80175z\u0022/\u003e\n+\t\t\t\t\t\u003cpath d\u003d\u0022m-499.91-144.73h-0.18072l-0.56517-1.1977-0.18565 0.2448v0.95289h-0.16101v-2.402h0.16101v1.2716q0.0838-0.15772 0.70974-1.2716h0.1758l-0.60296 1.0564z\u0022/\u003e\n+\t\t\t\t\u003c/g\u003e\n+\t\t\t\u003c/g\u003e\n+\t\t\t\u003cpath d\u003d\u0022m-511.33-186.63a24.457 24.457 0 0 0 -24.457 24.457 24.457 24.457 0 0 0 24.457 24.457 24.457 24.457 0 0 0 24.457 -24.457 24.457 24.457 0 0 0 -24.457 -24.457zm0.0667 1.7198a22.804 22.804 0 0 1 22.804 22.804 22.804 22.804 0 0 1 -22.804 22.804 22.804 22.804 0 0 1 -22.804 -22.804 22.804 22.804 0 0 1 22.804 -22.804z\u0022 fill\u003d\u0022url(#c)\u0022/\u003e\n+\t\t\t\u003cpath d\u003d\u0022m-511.4-186.5a24.457 24.457 0 0 0 -24.457 24.457 24.457 24.457 0 0 0 24.457 24.457 24.457 24.457 0 0 0 24.457 -24.457 24.457 24.457 0 0 0 -24.457 -24.457zm0.0667 1.7198a22.804 22.804 0 0 1 22.804 22.804 22.804 22.804 0 0 1 -22.804 22.804 22.804 22.804 0 0 1 -22.804 -22.804 22.804 22.804 0 0 1 22.804 -22.804z\u0022 fill\u003d\u0022url(#b)\u0022/\u003e\n+\t\t\u003c/g\u003e\n+\t\t\u003ccircle cx\u003d\u0022-511.47\u0022 cy\u003d\u0022-162.18\u0022 r\u003d\u002224.457\u0022 fill\u003d\u0022none\u0022 stroke\u003d\u0022#d4aa00\u0022 stroke-dasharray\u003d\u00221.58700002, 1.58700002\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-linejoin\u003d\u0022round\u0022 stroke-width\u003d\u0022.529\u0022/\u003e\n+\t\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/index.html\nnew file mode 100644\nindex 0000000..6788572\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/index.html\n@@ -0,0 +1,35 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003clink rel\u003d\u0022stylesheet\u0022 type\u003d\u0022text/css\u0022 href\u003d\u0022deaddrop.css\u0022/\u003e\n+ \u003cscript src\u003d\u0022deaddrop.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+ \u003cbody\u003e\n+ \t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\n+ \t\u0026nbsp;\u003cbr\u003e\n+\t\u003cdiv class\u003d\u0022uplbox\u0022\u003e\n+\t \u003ctable id\u003d\u0022ddrop\u0022 class\u003d\u0022noconn\u0022\u003e\n+\t \u003ctr\u003e\u003ctd class\u003d\u0022vm\u0022\u003e\n+\t \t\u003cdiv id\u003d\u0022da\u0022 class\u003d\u0022da\u0022\u003e\u003cimg class\u003d\u0022disa\u0022 src\u003d\u0022drop.svg\u0022\u003e\u003c/div\u003e\n+\t \u003c/td\u003e\u003ctd\u003e\n+\t \u003ch3\u003e...or select files to upload:\u003c/h3\u003e\n+\t \u003cspan id\u003d\u0022size\u0022\u003e\u003c/span\u003e\u003cbr\u003e\n+\t \u003cform name\u003dmultipart action\u003d\u0022upload\u0022 method\u003d\u0022post\u0022\n+\t\t enctype\u003d\u0022multipart/form-data\u0022\u003e\n+\t \u003cinput multiple type\u003d\u0022file\u0022 name\u003d\u0022file\u0022 id\u003d\u0022file\u0022 size\u003d\u002220\u0022\u003e\n+\t \u003cspan id\u003d\u0022file_info\u0022 class\u003d\u0022dd-fileinfo\u0022\u003e\u003c/span\u003e\n+\t \u003cbr\u003e\n+\t \u003cinput id\u003d\u0022upl\u0022 type\u003d\u0022submit\u0022 name\u003d\u0022Upload\u0022 value\u003d\u0022Upload\u0022\n+\t \t class\u003d\u0022ubtn\u0022 disabled\u003e\n+\t \u003c/form\u003e\n+\t \u003ctable id\u003d\u0022ongoing\u0022 class\u003d\u0022nb\u0022\u003e\u003c/table\u003e\n+\t \u003c/td\u003e\u003c/tr\u003e\n+\t \u003ctr\u003e\u003ctd colspan\u003d\u00222\u0022\u003e\n+\t \t\u003cdiv id\u003d\u0022dd-list\u0022 class\u003d\u0022dd-list\u0022\u003e\n+\t\t\u003c!-- deaddrop-list --\u003e\n+\t\t\u003c/div\u003e\n+\t \u003c/td\u003e\u003c/tr\u003e\n+\t \u003c/table\u003e\n+\t\u003c/div\u003e\n+ \u003c/body\u003e\n+\u003c/html\u003e\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/uploads/user1/placeholder.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/uploads/user1/placeholder.txt\nnew file mode 100644\nindex 0000000..2d1be9e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/uploads/user1/placeholder.txt\n@@ -0,0 +1 @@\n+git doesn't support empty dirs...\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/CMakeLists.txt\nnew file mode 100644\nindex 0000000..e8affdb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-dynamic C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-dynamic)\n+set(SRCS minimal-http-server-dynamic.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/README.md\nnew file mode 100644\nindex 0000000..9666d02\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/README.md\n@@ -0,0 +1,20 @@\n+# lws minimal http server dynamic content\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-dynamic\n+[2018/03/20 10:24:24:7099] USER: LWS minimal http server dynamic | visit http://localhost:7681\n+[2018/03/20 10:24:24:7099] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+```\n+\n+Visit http://localhost:7681, which is all static content.\n+\n+Click on the link to /dyn/anything, this opens a new tab with dynamicly-produced content.\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/minimal-http-server-dynamic.c b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/minimal-http-server-dynamic.c\nnew file mode 100644\nindex 0000000..f919146\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/minimal-http-server-dynamic.c\n@@ -0,0 +1,343 @@\n+/*\n+ * lws-minimal-http-server-dynamic\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server that can produce dynamic http\n+ * content as well as static content.\n+ *\n+ * To keep it simple, it serves the static stuff from the subdirectory\n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ *\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003ctime.h\u003e\n+\n+/*\n+ * Unlike ws, http is a stateless protocol. This pss only exists for the\n+ * duration of a single http transaction. With http/1.1 keep-alive and http/2,\n+ * that is unrelated to (shorter than) the lifetime of the network connection.\n+ */\n+struct pss {\n+\tchar path[128];\n+\n+\tint times;\n+\tint budget;\n+\n+\tint content_lines;\n+};\n+\n+static int interrupted;\n+\n+static int\n+callback_dynamic_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tuint8_t buf[LWS_PRE + 2048], *start \u003d \u0026buf[LWS_PRE], *p \u003d start,\n+\t\t*end \u003d \u0026buf[sizeof(buf) - LWS_PRE - 1];\n+\ttime_t t;\n+\tint n;\n+#if defined(LWS_HAVE_CTIME_R)\n+\tchar date[32];\n+#endif\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_HTTP:\n+\n+\t\t/*\n+\t\t * If you want to know the full url path used, you can get it\n+\t\t * like this\n+\t\t *\n+\t\t * n \u003d lws_hdr_copy(wsi, buf, sizeof(buf), WSI_TOKEN_GET_URI);\n+\t\t *\n+\t\t * The base path is the first (n - strlen((const char *)in))\n+\t\t * chars in buf.\n+\t\t */\n+\n+\t\t/*\n+\t\t * In contains the url part after the place the mount was\n+\t\t * positioned at, eg, if positioned at \u0022/dyn\u0022 and given\n+\t\t * \u0022/dyn/mypath\u0022, in will contain /mypath\n+\t\t */\n+\t\tlws_snprintf(pss-\u003epath, sizeof(pss-\u003epath), \u0022%s\u0022,\n+\t\t\t\t(const char *)in);\n+\n+\t\tlws_get_peer_simple(wsi, (char *)buf, sizeof(buf));\n+\t\tlwsl_notice(\u0022%s: HTTP: connection %s, path %s\u005cn\u0022, __func__,\n+\t\t\t\t(const char *)buf, pss-\u003epath);\n+\n+\t\t/*\n+\t\t * Demonstrates how to retreive a urlarg x\u003dvalue\n+\t\t */\n+\n+\t\t{\n+\t\t\tchar value[100];\n+\t\t\tint z \u003d lws_get_urlarg_by_name_safe(wsi, \u0022x\u0022, value,\n+\t\t\t\t\t sizeof(value) - 1);\n+\n+\t\t\tif (z \u003e\u003d 0)\n+\t\t\t\tlwsl_hexdump_notice(value, (size_t)z);\n+\t\t}\n+\n+\t\t/*\n+\t\t * prepare and write http headers... with regards to content-\n+\t\t * length, there are three approaches:\n+\t\t *\n+\t\t * - http/1.0 or connection:close: no need, but no pipelining\n+\t\t * - http/1.1 or connected:keep-alive\n+\t\t * (keep-alive is default for 1.1): content-length required\n+\t\t * - http/2: no need, LWS_WRITE_HTTP_FINAL closes the stream\n+\t\t *\n+\t\t * giving the api below LWS_ILLEGAL_HTTP_CONTENT_LEN instead of\n+\t\t * a content length forces the connection response headers to\n+\t\t * send back \u0022connection: close\u0022, disabling keep-alive.\n+\t\t *\n+\t\t * If you know the final content-length, it's always OK to give\n+\t\t * it and keep-alive can work then if otherwise possible. But\n+\t\t * often you don't know it and avoiding having to compute it\n+\t\t * at header-time makes life easier at the server.\n+\t\t */\n+\t\tif (lws_add_http_common_headers(wsi, HTTP_STATUS_OK,\n+\t\t\t\t\u0022text/html\u0022,\n+\t\t\t\tLWS_ILLEGAL_HTTP_CONTENT_LEN, /* no content len */\n+\t\t\t\t\u0026p, end))\n+\t\t\treturn 1;\n+\t\tif (lws_finalize_write_http_header(wsi, start, \u0026p, end))\n+\t\t\treturn 1;\n+\n+\t\tpss-\u003etimes \u003d 0;\n+\t\tpss-\u003ebudget \u003d atoi((char *)in + 1);\n+\t\tpss-\u003econtent_lines \u003d 0;\n+\t\tif (!pss-\u003ebudget)\n+\t\t\tpss-\u003ebudget \u003d 10;\n+\n+\t\t/* write the body separately */\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_HTTP_WRITEABLE:\n+\n+\t\tif (!pss || pss-\u003etimes \u003e pss-\u003ebudget)\n+\t\t\tbreak;\n+\n+\t\t/*\n+\t\t * We send a large reply in pieces of around 2KB each.\n+\t\t *\n+\t\t * For http/1, it's possible to send a large buffer at once,\n+\t\t * but lws will malloc() up a temp buffer to hold any data\n+\t\t * that the kernel didn't accept in one go. This is expensive\n+\t\t * in memory and cpu, so it's better to stage the creation of\n+\t\t * the data to be sent each time.\n+\t\t *\n+\t\t * For http/2, large data frames would block the whole\n+\t\t * connection, not just the stream and are not allowed. Lws\n+\t\t * will call back on writable when the stream both has transmit\n+\t\t * credit and the round-robin fair access for sibling streams\n+\t\t * allows it.\n+\t\t *\n+\t\t * For http/2, we must send the last part with\n+\t\t * LWS_WRITE_HTTP_FINAL to close the stream representing\n+\t\t * this transaction.\n+\t\t */\n+\t\tn \u003d LWS_WRITE_HTTP;\n+\t\tif (pss-\u003etimes \u003d\u003d pss-\u003ebudget)\n+\t\t\tn \u003d LWS_WRITE_HTTP_FINAL;\n+\n+\t\tif (!pss-\u003etimes) {\n+\t\t\t/*\n+\t\t\t * the first time, we print some html title\n+\t\t\t */\n+\t\t\tt \u003d time(NULL);\n+\t\t\t/*\n+\t\t\t * to work with http/2, we must take care about LWS_PRE\n+\t\t\t * valid behind the buffer we will send.\n+\t\t\t */\n+\t\t\tp +\u003d lws_snprintf((char *)p, lws_ptr_diff_size_t(end, p), \u0022\u003chtml\u003e\u0022\n+\t\t\t\t\u0022\u003chead\u003e\u003cmeta charset\u003dutf-8 \u0022\n+\t\t\t\t\u0022http-equiv\u003d\u005c\u0022Content-Language\u005c\u0022 \u0022\n+\t\t\t\t\u0022content\u003d\u005c\u0022en\u005c\u0022/\u003e\u003c/head\u003e\u003cbody\u003e\u0022\n+\t\t\t\t\u0022\u003cimg src\u003d\u005c\u0022/libwebsockets.org-logo.svg\u005c\u0022\u003e\u0022\n+\t\t\t\t\u0022\u003cbr\u003eDynamic content for '%s' from mountpoint.\u0022\n+\t\t\t\t\u0022\u003cbr\u003eTime: %s\u003cbr\u003e\u003cbr\u003e\u0022\n+\t\t\t\t\u0022\u003c/body\u003e\u003c/html\u003e\u0022, pss-\u003epath,\n+#if defined(LWS_HAVE_CTIME_R)\n+\t\t\t\tctime_r(\u0026t, date));\n+#else\n+\t\t\t\tctime(\u0026t));\n+#endif\n+\t\t} else {\n+\t\t\t/*\n+\t\t\t * after the first time, we create bulk content.\n+\t\t\t *\n+\t\t\t * Again we take care about LWS_PRE valid behind the\n+\t\t\t * buffer we will send.\n+\t\t\t */\n+\n+\t\t\twhile (lws_ptr_diff(end, p) \u003e 80)\n+\t\t\t\tp +\u003d lws_snprintf((char *)p, lws_ptr_diff_size_t(end, p),\n+\t\t\t\t\t\u0022%d.%d: this is some content... \u0022,\n+\t\t\t\t\tpss-\u003etimes, pss-\u003econtent_lines++);\n+\n+\t\t\tp +\u003d lws_snprintf((char *)p, lws_ptr_diff_size_t(end, p), \u0022\u003cbr\u003e\u003cbr\u003e\u0022);\n+\t\t}\n+\n+\t\tpss-\u003etimes++;\n+\t\tif (lws_write(wsi, (uint8_t *)start, lws_ptr_diff_size_t(p, start), (enum lws_write_protocol)n) !\u003d\n+\t\t\t\tlws_ptr_diff(p, start))\n+\t\t\treturn 1;\n+\n+\t\t/*\n+\t\t * HTTP/1.0 no keepalive: close network connection\n+\t\t * HTTP/1.1 or HTTP1.0 + KA: wait / process next transaction\n+\t\t * HTTP/2: stream ended, parent connection remains up\n+\t\t */\n+\t\tif (n \u003d\u003d LWS_WRITE_HTTP_FINAL) {\n+\t\t if (lws_http_transaction_completed(wsi))\n+\t\t\treturn -1;\n+\t\t} else\n+\t\t\tlws_callback_on_writable(wsi);\n+\n+\t\treturn 0;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols defprot \u003d\n+\t{ \u0022defprot\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 }, protocol \u003d\n+\t{ \u0022http\u0022, callback_dynamic_http, sizeof(struct pss), 0, 0, NULL, 0 };\n+\n+static const struct lws_protocols *pprotocols[] \u003d { \u0026defprot, \u0026protocol, NULL };\n+\n+/* override the default mount for /dyn in the URL space */\n+\n+static const struct lws_http_mount mount_dyn \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/dyn\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\tNULL,\t/* protocol */\n+\t/* .def */\t\t\tNULL,\n+\t/* .protocol */\t\t\t\u0022http\u0022,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_CALLBACK, /* dynamic */\n+\t/* .mountpoint_len */\t\t4,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\u0026mount_dyn,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\u0022./mount-origin\u0022,\t/* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server dynamic | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\t/* for testing ah queue, not useful in real world */\n+\tif (lws_cmdline_option(argc, argv, \u0022--ah1\u0022))\n+\t\tinfo.max_http_header_pool \u003d 1;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* http on 7681 */\n+\n+\tinfo.port \u003d 7681;\n+\tinfo.pprotocols \u003d pprotocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.vhost_name \u003d \u0022http\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create tls vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* https on 7682 */\n+\n+\tinfo.port \u003d 7682;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+#if defined(LWS_WITH_TLS)\n+\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+#endif\n+\tinfo.vhost_name \u003d \u0022localhost\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create tls vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/index.html\nnew file mode 100644\nindex 0000000..8fe93d7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server dynamic content example\u003c/b\u003e.\n+\t\t\u003cp\u003e\n+\t\tThis is a static page served from ./mount-origin/index.html.\n+\t\t\u003cp\u003e\n+\t\tStuff down /dyn in the URL space is generated dynamically\u003cbr\u003e\n+\t\tby the callback. For example, click on\n+\t\t\u003ca href\u003d\u0022/dyn/anything\u0022 target\u003d_blank\u003e/dyn/anything\u003c/a\u003e to\n+\t\tsee dynamic content.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5f023f9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/CMakeLists.txt\n@@ -0,0 +1,28 @@\n+project(lws-minimal-http-server-eventlib-custom C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-eventlib-custom)\n+set(SRCS minimal-http-server.c)\n+\n+if (WIN32)\n+else()\n+\tset(requirements 1)\n+\trequire_lws_config(LWS_ROLE_H1 1 requirements)\n+\trequire_lws_config(LWS_WITH_SERVER 1 requirements)\n+\trequire_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+\tif (requirements)\n+\t\tadd_executable(${SAMP} ${SRCS})\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP} websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/README.md\nnew file mode 100644\nindex 0000000..cc8794b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/README.md\n@@ -0,0 +1,18 @@\n+# lws minimal http server\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server\n+[2018/03/04 09:30:02:7986] USER: LWS minimal http server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/minimal-http-server.c\nnew file mode 100644\nindex 0000000..e969fea\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/minimal-http-server.c\n@@ -0,0 +1,464 @@\n+/*\n+ * lws-minimal-http-server-eventlib-custom\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server using lws, on top of a custom \u0022event\n+ * library\u0022 that uses an existing application POLL loop.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \u0022./mount-origin\u0022 of\n+ * the dir it was started in. Change mount.origin to serve from elsewhere.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+static struct lws_context *context;\n+\n+#define MAX_CUSTOM_POLLFDS\t64\n+\n+/* this represents the existing application poll loop context we want lws\n+ * to cooperate with */\n+\n+typedef struct custom_poll_ctx {\n+\tstruct lws_pollfd\tpollfds[MAX_CUSTOM_POLLFDS];\n+\tint\t\t\tcount_pollfds;\n+} custom_poll_ctx_t;\n+\n+/* for this example we just have the one, but it is passed into lws as a\n+ * foreign loop pointer, and all callbacks have access to it via that, so it\n+ * is not needed to be defined at file scope. */\n+static custom_poll_ctx_t a_cpcx;\n+\n+/*\n+ * These are the custom event loop operators that just make the custom event\n+ * loop able to work by itself. These would already exist in some form in an\n+ * existing application.\n+ */\n+\n+static struct lws_pollfd *\n+custom_poll_find_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd)\n+{\n+\tint n;\n+\n+\tfor (n \u003d 0; n \u003c cpcx-\u003ecount_pollfds; n++)\n+\t\tif (cpcx-\u003epollfds[n].fd \u003d\u003d fd)\n+\t\t\treturn \u0026cpcx-\u003epollfds[n];\n+\n+\treturn NULL;\n+}\n+\n+static int\n+custom_poll_add_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd, int events)\n+{\n+\tstruct lws_pollfd *pfd;\n+\n+\tlwsl_info(\u0022%s: ADD fd %d, ev %d\u005cn\u0022, __func__, fd, events);\n+\n+\tpfd \u003d custom_poll_find_fd(cpcx, fd);\n+\tif (pfd) {\n+\t\tlwsl_err(\u0022%s: ADD fd %d already in ext table\u005cn\u0022, __func__, fd);\n+\t\treturn 1;\n+\t}\n+\n+\tif (cpcx-\u003ecount_pollfds \u003d\u003d LWS_ARRAY_SIZE(cpcx-\u003epollfds)) {\n+\t\tlwsl_err(\u0022%s: no room left\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tpfd \u003d \u0026cpcx-\u003epollfds[cpcx-\u003ecount_pollfds++];\n+\tpfd-\u003efd \u003d fd;\n+\tpfd-\u003eevents \u003d (short)events;\n+\tpfd-\u003erevents \u003d 0;\n+\n+\treturn 0;\n+}\n+\n+static int\n+custom_poll_del_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd)\n+{\n+\tstruct lws_pollfd *pfd;\n+\n+\tlwsl_info(\u0022%s: DEL fd %d\u005cn\u0022, __func__, fd);\n+\n+\tpfd \u003d custom_poll_find_fd(cpcx, fd);\n+\tif (!pfd) {\n+\t\tlwsl_err(\u0022%s: DEL fd %d missing in ext table\u005cn\u0022, __func__, fd);\n+\t\treturn 1;\n+\t}\n+\n+\tif (cpcx-\u003ecount_pollfds \u003e 1)\n+\t\t*pfd \u003d cpcx-\u003epollfds[cpcx-\u003ecount_pollfds - 1];\n+\n+\tcpcx-\u003ecount_pollfds--;\n+\n+\treturn 0;\n+}\n+\n+static int\n+custom_poll_change_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd,\n+\t\t int events_add, int events_remove)\n+{\n+\tstruct lws_pollfd *pfd;\n+\n+\tlwsl_info(\u0022%s: CHG fd %d, ev_add %d, ev_rem %d\u005cn\u0022, __func__, fd,\n+\t\t\tevents_add, events_remove);\n+\n+\tpfd \u003d custom_poll_find_fd(cpcx, fd);\n+\tif (!pfd)\n+\t\treturn 1;\n+\n+\tpfd-\u003eevents \u003d (short)((pfd-\u003eevents \u0026 (~events_remove)) | events_add);\n+\n+\treturn 0;\n+}\n+\n+int\n+custom_poll_run(custom_poll_ctx_t *cpcx)\n+{\n+\tint n;\n+\n+\twhile (!interrupted) {\n+\n+\t\t/*\n+\t\t * Notice that the existing loop must consult with lws about\n+\t\t * the maximum wait timeout to use. Lws will reduce the\n+\t\t * timeout to the earliest scheduled event time if any earlier\n+\t\t * than the provided timeout.\n+\t\t */\n+\n+\t\tn \u003d lws_service_adjust_timeout(context, 5000, 0);\n+\n+\t\tlwsl_debug(\u0022%s: entering poll wait %dms\u005cn\u0022, __func__, n);\n+\n+\t\tn \u003d poll(cpcx-\u003epollfds, (nfds_t)cpcx-\u003ecount_pollfds, n);\n+\n+\t\tlwsl_debug(\u0022%s: exiting poll ret %d\u005cn\u0022, __func__, n);\n+\n+\t\tif (n \u003c\u003d 0)\n+\t\t\tcontinue;\n+\n+\t\tfor (n \u003d 0; n \u003c cpcx-\u003ecount_pollfds; n++) {\n+\t\t\tlws_sockfd_type fd \u003d cpcx-\u003epollfds[n].fd;\n+\t\t\tint m;\n+\n+\t\t\tif (!cpcx-\u003epollfds[n].revents)\n+\t\t\t\tcontinue;\n+\n+\t\t\tm \u003d lws_service_fd(context, \u0026cpcx-\u003epollfds[n]);\n+\n+\t\t\t/* if something closed, retry this slot since may have been\n+\t\t\t * swapped with end fd */\n+\t\t\tif (m \u0026\u0026 cpcx-\u003epollfds[n].fd !\u003d fd)\n+\t\t\t\tn--;\n+\n+\t\t\tif (m \u003c 0)\n+\t\t\t\t/* lws feels something bad happened, but\n+\t\t\t\t * the outer application may not care */\n+\t\t\t\tcontinue;\n+\t\t\tif (!m) {\n+\t\t\t\t/* check if it is an fd owned by the\n+\t\t\t\t * application */\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+\n+/*\n+ * These is the custom \u0022event library\u0022 interface layer between lws event lib\n+ * support and the custom loop implementation above. We only need to support\n+ * a few key apis.\n+ *\n+ * We are user code, so all the internal lws objects are opaque. But there are\n+ * enough public helpers to get everything done.\n+ */\n+\n+/* one of these is appended to each pt for our use */\n+struct pt_eventlibs_custom {\n+\tcustom_poll_ctx_t\t\t*io_loop;\n+};\n+\n+/*\n+ * During lws context creation, we get called with the foreign loop pointer\n+ * that was passed in the creation info struct. Stash it in our private part\n+ * of the pt, so we can reference it in the other callbacks subsequently.\n+ */\n+\n+static int\n+init_pt_custom(struct lws_context *cx, void *_loop, int tsi)\n+{\n+\tstruct pt_eventlibs_custom *priv \u003d (struct pt_eventlibs_custom *)\n+\t\t\t\t\t lws_evlib_tsi_to_evlib_pt(cx, tsi);\n+\n+\t/* store the loop we are bound to in our private part of the pt */\n+\n+\tpriv-\u003eio_loop \u003d (custom_poll_ctx_t *)_loop;\n+\n+\treturn 0;\n+}\n+\n+static int\n+sock_accept_custom(struct lws *wsi)\n+{\n+\tstruct pt_eventlibs_custom *priv \u003d (struct pt_eventlibs_custom *)\n+\t\t\t\t\t\tlws_evlib_wsi_to_evlib_pt(wsi);\n+\n+\treturn custom_poll_add_fd(priv-\u003eio_loop, lws_get_socket_fd(wsi), POLLIN);\n+}\n+\n+static void\n+io_custom(struct lws *wsi, unsigned int flags)\n+{\n+\tstruct pt_eventlibs_custom *priv \u003d (struct pt_eventlibs_custom *)\n+\t\t\t\t\t\tlws_evlib_wsi_to_evlib_pt(wsi);\n+\tint e_add \u003d 0, e_remove \u003d 0;\n+\n+\tif (flags \u0026 LWS_EV_START) {\n+\t\tif (flags \u0026 LWS_EV_WRITE)\n+\t\t\te_add |\u003d POLLOUT;\n+\n+\t\tif (flags \u0026 LWS_EV_READ)\n+\t\t\te_add |\u003d POLLIN;\n+\t} else {\n+\t\tif (flags \u0026 LWS_EV_WRITE)\n+\t\t\te_remove |\u003d POLLOUT;\n+\n+\t\tif (flags \u0026 LWS_EV_READ)\n+\t\t\te_remove |\u003d POLLIN;\n+\t}\n+\n+\tcustom_poll_change_fd(priv-\u003eio_loop, lws_get_socket_fd(wsi),\n+\t\t\t e_add, e_remove);\n+}\n+\n+static int\n+wsi_logical_close_custom(struct lws *wsi)\n+{\n+\tstruct pt_eventlibs_custom *priv \u003d (struct pt_eventlibs_custom *)\n+\t\t\t\t\t\tlws_evlib_wsi_to_evlib_pt(wsi);\n+\treturn custom_poll_del_fd(priv-\u003eio_loop, lws_get_socket_fd(wsi));\n+}\n+\n+static const struct lws_event_loop_ops event_loop_ops_custom \u003d {\n+\t.name\t\t\t\t\u003d \u0022custom\u0022,\n+\n+\t.init_pt\t\t\t\u003d init_pt_custom,\n+\t.init_vhost_listen_wsi\t\t\u003d sock_accept_custom,\n+\t.sock_accept\t\t\t\u003d sock_accept_custom,\n+\t.io\t\t\t\t\u003d io_custom,\n+\t.wsi_logical_close\t\t\u003d wsi_logical_close_custom,\n+\n+\t.evlib_size_pt\t\t\t\u003d sizeof(struct pt_eventlibs_custom)\n+};\n+\n+static const lws_plugin_evlib_t evlib_custom \u003d {\n+\t.hdr \u003d {\n+\t\t\u0022custom event loop\u0022,\n+\t\t\u0022lws_evlib_plugin\u0022,\n+\t\tLWS_BUILD_HASH,\n+\t\tLWS_PLUGIN_API_MAGIC\n+\t},\n+\n+\t.ops\t\u003d \u0026event_loop_ops_custom\n+};\n+\n+/*\n+ * The rest is just the normal minimal example for lws, with a couple of extra\n+ * lines wiring up the custom event library handlers above.\n+ */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/*\n+ * This demonstrates a client connection operating on the same loop\n+ * It's optional...\n+ */\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP: resp %u\u005cn\u0022,\n+\t\t\t\tlws_http_client_http_response(wsi));\n+\t\tbreak;\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+\t\tlwsl_hexdump_info(in, len);\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP %s\u005cn\u0022,\n+\t\t\t lws_wsi_tag(wsi));\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tlwsl_info(\u0022%s: closed: %s\u005cn\u0022, __func__, lws_wsi_tag(wsi));\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{ \u0022httptest\u0022, callback_http, 0, 0, 0, NULL, 0},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int\n+do_client_conn(void)\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\n+\ti.context\t\t\u003d context;\n+\n+\ti.ssl_connection\t\u003d LCCSCF_USE_SSL;\n+\ti.port\t\t\t\u003d 443;\n+\ti.address\t\t\u003d \u0022warmcat.com\u0022;\n+\n+\ti.ssl_connection\t|\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n+\ti.path\t\t\t\u003d \u0022/\u0022;\n+\ti.host\t\t\t\u003d i.address;\n+\ti.origin\t\t\u003d i.address;\n+\ti.method\t\t\u003d \u0022GET\u0022;\n+\ti.protocol\t\u003d protocols[0].name;\n+#if defined(LWS_WITH_SYS_FAULT_INJECTION)\n+\ti.fi_wsi_name\t\t\u003d \u0022user\u0022;\n+#endif\n+\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tlwsl_err(\u0022Client creation failed\u005cn\u0022);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tlwsl_notice(\u0022Client creation OK\u005cn\u0022);\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * End of client part\n+ *\n+ * Initialization part --\u003e\n+ */\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tvoid *foreign_loops[1];\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\t/*\n+\t * init the existing custom event loop here if anything to do, don't\n+\t * run it yet. In our example, no init required.\n+\t */\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tinfo.event_lib_custom \u003d \u0026evlib_custom; /* bind lws to our custom event\n+\t\t\t\t\t\t* lib implementation above */\n+\tforeign_loops[0] \u003d \u0026a_cpcx; /* pass in the custom poll object as the\n+\t\t\t\t * foreign loop object we will bind to */\n+\tinfo.foreign_loops \u003d foreign_loops;\n+\n+\t/* optional to demonstrate client connection */\n+\tinfo.protocols \u003d protocols;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* optional to demonstrate client connection */\n+\tdo_client_conn();\n+\n+\t/*\n+\t * We're going to run the custom loop now, instead of the lws loop.\n+\t * We have told lws to cooperate with this loop to get stuff done.\n+\t *\n+\t * We only come back from this when interrupted gets set by SIGINT\n+\t */\n+\n+\tcustom_poll_run(\u0026a_cpcx);\n+\n+\t/* clean up lws part */\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/index.html\nnew file mode 100644\nindex 0000000..bc9ffa4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/index.html\n@@ -0,0 +1,15 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/symlink.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/symlink.html\nnew file mode 120000\nindex 0000000..64233a9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/symlink.html\n@@ -0,0 +1 @@\n+index.html\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/CMakeLists.txt\nnew file mode 100644\nindex 0000000..6fe0548\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-eventlib-demos C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-eventlib-demos)\n+set(SRCS minimal-http-server-eventlib-demos.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/README.md\nnew file mode 100644\nindex 0000000..90720e4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/README.md\n@@ -0,0 +1,30 @@\n+# lws minimal http server eventlib demos\n+\n+This demonstrates a slightly more complex demo that can use\n+any of the event loops (it defaults to poll)\n+\n+It uses statically included plugins to provide the lws test server functions\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+--uv|Use the libuv event library (lws must have been configured with `-DLWS_WITH_LIBUV\u003d1`)\n+--event|Use the libevent library (lws must have been configured with `-DLWS_WITH_LIBEVENT\u003d1`)\n+--ev|Use the libev event library (lws must have been configured with `-DLWS_WITH_LIBEV\u003d1`)\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-eventlib-demos\n+[2018/03/04 09:30:02:7986] USER: LWS minimal http server-eventlib-demos | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/minimal-http-server-eventlib-demos.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/minimal-http-server-eventlib-demos.c\nnew file mode 100644\nindex 0000000..be060da\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/minimal-http-server-eventlib-demos.c\n@@ -0,0 +1,204 @@\n+/*\n+ * lws-minimal-http-server-eventlib\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http[s] server that can work with any of the\n+ * supported event loop backends, or the default poll() one.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022../../../plugins/protocol_lws_mirror.c\u0022\n+#include \u0022../../../plugins/protocol_lws_status.c\u0022\n+#include \u0022../../../plugins/protocol_dumb_increment.c\u0022\n+#include \u0022../../../plugins/protocol_post_demo.c\u0022\n+\n+static struct lws_context *context;\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t/* first protocol must always be HTTP handler */\n+\n+\t{ \u0022http-only\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_DUMB_INCREMENT,\n+\tLWS_PLUGIN_PROTOCOL_MIRROR,\n+\tLWS_PLUGIN_PROTOCOL_LWS_STATUS,\n+\tLWS_PLUGIN_PROTOCOL_POST_DEMO,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+/*\n+ * mount handlers for sections of the URL space\n+ */\n+\n+static const struct lws_http_mount mount_ziptest_uncomm \u003d {\n+\tNULL,\t\t\t/* linked-list pointer to next*/\n+\t\u0022/uncommziptest\u0022,\t\t/* mountpoint in URL namespace on this vhost */\n+\t\u0022./mount-origin/candide-uncompressed.zip\u0022,\t/* handler */\n+\tNULL,\t/* default filename if none given */\n+\tNULL,\n+\tNULL,\n+\tNULL,\n+\tNULL,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\tLWSMPRO_FILE,\t/* origin points to a callback */\n+\t14,\t\t\t/* strlen(\u0022/ziptest\u0022), ie length of the mountpoint */\n+\tNULL,\n+}, mount_ziptest \u003d {\n+\t(struct lws_http_mount *)\u0026mount_ziptest_uncomm,\t\t\t/* linked-list pointer to next*/\n+\t\u0022/ziptest\u0022,\t\t/* mountpoint in URL namespace on this vhost */\n+\t\u0022./mount-origin/candide.zip\u0022,\t/* handler */\n+\tNULL,\t/* default filename if none given */\n+\tNULL,\n+\tNULL,\n+\tNULL,\n+\tNULL,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\tLWSMPRO_FILE,\t/* origin points to a callback */\n+\t8,\t\t\t/* strlen(\u0022/ziptest\u0022), ie length of the mountpoint */\n+\tNULL,\n+\n+}, mount_post \u003d {\n+\t(struct lws_http_mount *)\u0026mount_ziptest, /* linked-list pointer to next*/\n+\t\u0022/formtest\u0022,\t\t/* mountpoint in URL namespace on this vhost */\n+\t\u0022protocol-post-demo\u0022,\t/* handler */\n+\tNULL,\t/* default filename if none given */\n+\tNULL,\n+\tNULL,\n+\tNULL,\n+\tNULL,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\t0,\n+\tLWSMPRO_CALLBACK,\t/* origin points to a callback */\n+\t9,\t\t\t/* strlen(\u0022/formtest\u0022), ie length of the mountpoint */\n+\tNULL,\n+\n+}, mount \u003d {\n+\t/* .mount_next */\t\t\u0026mount_post,\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022test.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void signal_cb(void *handle, int signum)\n+{\n+\tlwsl_err(\u0022%s: signal %d\u005cn\u0022, __func__, signum);\n+\n+\tswitch (signum) {\n+\tcase SIGTERM:\n+\tcase SIGINT:\n+\t\tbreak;\n+\tdefault:\n+\n+\t\tbreak;\n+\t}\n+\tlws_context_destroy(context);\n+}\n+\n+void sigint_handler(int sig)\n+{\n+\tsignal_cb(NULL, sig);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server eventlib | visit http://localhost:7681\u005cn\u0022);\n+\tlwsl_user(\u0022 [-s (ssl)] [--uv (libuv)] [--ev (libev)] [--event (libevent)]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.pcontext \u003d \u0026context;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.signal_cb \u003d signal_cb;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#if defined(LWS_WITH_TLS)\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+#endif\n+\t}\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--uv\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBUV;\n+\telse\n+\t\tif (lws_cmdline_option(argc, argv, \u0022--event\u0022))\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEVENT;\n+\t\telse\n+\t\t\tif (lws_cmdline_option(argc, argv, \u0022--ev\u0022))\n+\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEV;\n+\t\t\telse\n+\t\t\t\tif (lws_cmdline_option(argc, argv, \u0022--glib\u0022))\n+\t\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_GLIB;\n+\t\t\t\telse\n+\t\t\t\t\tsignal(SIGINT, sigint_handler);\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (!lws_service(context, 0))\n+\t\t;\n+\n+\tlwsl_info(\u0022calling external context destroy\u005cn\u0022);\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide-uncompressed.zip b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide-uncompressed.zip\nnew file mode 100644\nindex 0000000..55856bc\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide-uncompressed.zip differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide.zip b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide.zip\nnew file mode 100644\nindex 0000000..82a6619\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide.zip differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/http2.png\nnew file mode 100644\nindex 0000000..b4129e7\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/http2.png differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/leaf.jpg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/leaf.jpg\nnew file mode 100644\nindex 0000000..1a3f46b\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/leaf.jpg differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/lws-common.js b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/lws-common.js\nnew file mode 100644\nindex 0000000..096909f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/lws-common.js\n@@ -0,0 +1,125 @@\n+/*\n+ * This section around grayOut came from here:\n+ * http://www.codingforums.com/archive/index.php/t-151720.html\n+ * Assumed public domain\n+ *\n+ * Init like this in your main html script, this also reapplies the gray\n+ *\n+ * lws_gray_out(true,{'zindex':'499'});\n+ *\n+ * To remove the gray\n+ *\n+ * lws_gray_out(false);\n+ *\n+ */\n+\n+function gsize(ptype)\n+{\n+\tvar h \u003d document.compatMode \u003d\u003d\u003d \u0022CSS1Compat\u0022 \u0026\u0026\n+\t\t!window.opera ?\n+\t\t\tdocument.documentElement.clientHeight :\n+\t\t\t\t\t\tdocument.body.clientHeight;\n+\tvar w \u003d document.compatMode \u003d\u003d\u003d \u0022CSS1Compat\u0022 \u0026\u0026\n+\t\t!window.opera ? \n+\t\t\tdocument.documentElement.clientWidth :\n+\t\t\t\t\t\tdocument.body.clientWidth;\n+\tvar pageWidth, pageHeight, t;\n+\n+\tif (document.body \u0026\u0026 \n+\t\t (document.body.scrollWidth || document.body.scrollHeight)) {\n+\t\tt \u003d document.body.scrollWidth;\n+\t\tpageWidth \u003d (w \u003e t) ? (\u0022\u0022 + w + \u0022px\u0022) : (\u0022\u0022 + (t) + \u0022px\u0022);\n+\t\tt \u003d document.body.scrollHeight;\n+\t\tpageHeight \u003d (h \u003e t) ? (\u0022\u0022 + h + \u0022px\u0022) : (\u0022\u0022 + (t) + \u0022px\u0022);\n+\t} else if (document.body.offsetWidth) {\n+\t\tt \u003d document.body.offsetWidth;\n+\t\tpageWidth \u003d (w \u003e t) ? (\u0022\u0022 + w + \u0022px\u0022) : (\u0022\u0022 + (t) + \u0022px\u0022);\n+\t\tt \u003d document.body.offsetHeight;\n+\t\tpageHeight \u003d(h \u003e t) ? (\u0022\u0022 + h + \u0022px\u0022) : (\u0022\u0022 + (t) + \u0022px\u0022);\n+\t} else {\n+\t\tpageWidth \u003d \u0022100%\u0022;\n+\t\tpageHeight \u003d \u0022100%\u0022;\n+\t}\n+\treturn (ptype \u003d\u003d\u003d 1) ? pageWidth : pageHeight;\n+}\n+\n+function addEvent( obj, type, fn ) {\n+\tif ( obj.attachEvent ) {\n+\t\tobj[\u0022e\u0022 + type + fn] \u003d fn;\n+\t\tobj[type+fn] \u003d function() { obj[\u0022e\u0022 + type + fn]( window.event );};\n+\t\tobj.attachEvent(\u0022on\u0022 + type, obj[type + fn]);\n+\t} else\n+\t\tobj.addEventListener(type, fn, false);\n+}\n+\n+function removeEvent( obj, type, fn ) {\n+\tif ( obj.detachEvent ) {\n+\t\tobj.detachEvent(\u0022on\u0022 + type, obj[type + fn]);\n+\t\tobj[type + fn] \u003d null;\n+\t} else\n+\t\tobj.removeEventListener(type, fn, false);\n+}\n+\n+function lws_gray_out(vis, _options) {\n+\n+\tvar options \u003d _options || {};\n+\tvar zindex \u003d options.zindex || 50;\n+\tvar opacity \u003d options.opacity || 70;\n+\tvar opaque \u003d (opacity / 100);\n+\tvar bgcolor \u003d options.bgcolor || \u0022#000000\u0022;\n+\tvar dark \u003d document.getElementById(\u0022darkenScreenObject\u0022);\n+\n+\tif (!dark) {\n+\t\tvar tbody \u003d document.getElementsByTagName(\u0022body\u0022)[0];\n+\t\tvar tnode \u003d document.createElement(\u0022div\u0022);\n+\t\ttnode.style.position \u003d \u0022absolute\u0022;\n+\t\ttnode.style.top \u003d \u00220px\u0022;\n+\t\ttnode.style.left \u003d \u00220px\u0022;\n+\t\ttnode.style.overflow \u003d \u0022hidden\u0022;\n+\t\ttnode.style.display \u003d\u0022none\u0022;\n+\t\ttnode.id \u003d \u0022darkenScreenObject\u0022;\n+\t\ttbody.appendChild(tnode);\n+\t\tdark \u003d document.getElementById(\u0022darkenScreenObject\u0022);\n+\t}\n+\tif (vis) {\n+\t\tdark.style.opacity \u003d opaque;\n+\t\tdark.style.MozOpacity \u003d opaque;\n+\t\t// dark.style.filter \u003d'alpha(opacity\u003d'+opacity+')';\n+\t\tdark.style.zIndex \u003d zindex;\n+\t\tdark.style.backgroundColor \u003d bgcolor;\n+\t\tdark.style.width \u003d gsize(1);\n+\t\tdark.style.height \u003d gsize(0);\n+\t\tdark.style.display \u003d \u0022block\u0022;\n+\t\taddEvent(window, \u0022resize\u0022,\n+\t\t\tfunction() {\n+\t\t\t\tdark.style.height \u003d gsize(0);\n+\t\t\t\tdark.style.width \u003d gsize(1);\n+\t\t\t}\n+\t\t);\n+\t} else {\n+\t\tdark.style.display \u003d \u0022none\u0022;\n+\t\tremoveEvent(window, \u0022resize\u0022,\n+\t\t\tfunction() {\n+\t\t\t\tdark.style.height \u003d gsize(0);\n+\t\t\t\tdark.style.width \u003d gsize(1);\n+\t\t\t}\n+\t\t);\n+\t}\n+}\n+\n+/*\n+ * end of grayOut related stuff\n+ */\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+ \n+function lws_san(s)\n+{\n+\tif (s.search(\u0022\u003c\u0022) !\u003d\u003d -1)\n+\t\treturn \u0022invalid string\u0022;\n+\t\n+\treturn s;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.css b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.css\nnew file mode 100644\nindex 0000000..6cd32e7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.css\n@@ -0,0 +1,190 @@\n+\n+span.title {\n+\tfont-size:18pt;\n+\tfont-family: Arial;\n+\tfont-weight:normal;\n+\ttext-align:center;\n+\tcolor:#000000;\n+}\n+span.mount {\n+\tfont-size:10pt;\n+\tfont-family: Arial;\n+\tfont-weight:normal;\n+\ttext-align:center;\n+\tcolor:#000000;\n+}\n+span.mountname {\n+\tfont-size:14pt;\n+\tfont-family: Arial;\n+\tfont-weight:bold;\n+\ttext-align:center;\n+\tcolor:#404010;\n+}\n+span.n {\n+\tfont-size:12pt;\n+\tfont-family: Arial;\n+\tfont-weight:normal;\n+\ttext-align:center;\n+\tcolor:#808020;\n+}\n+span.v {\n+\tfont-size:12pt;\n+\tfont-family: Arial;\n+\tfont-weight:bold;\n+\ttext-align:center;\n+\tcolor:#202020;\n+}\n+span.m1 {\n+\tfont-size:12pt;\n+\tfont-family: Arial;\n+\tfont-weight:bold;\n+\ttext-align:center;\n+\tcolor:#202020;\n+}\n+span.m2 {\n+\tfont-size:12pt;\n+\tfont-family: Arial;\n+\tfont-weight:normal;\n+\ttext-align:center;\n+\tcolor:#202020;\n+}\n+\n+.browser { font-size:12pt; font-family: Arial; font-weight:normal; text-align:center; color:#ffff00; vertical-align:middle; text-align:center; background:#d0b070; padding:12px; -webkit-border-radius:10px; border-radius:10px;}\n+.group2 { vertical-align:middle;\n+\ttext-align:center;\n+\tbackground:#f0f0e0; \n+\tpadding:12px; \n+\t-webkit-border-radius:10px; \n+\tborder-radius:10px; }\n+.explain { vertical-align:middle;\n+\ttext-align:center;\n+\tbackground:#f0f0c0; padding:12px;\n+\t-webkit-border-radius:10px;\n+\tborder-radius:10px;\n+\tcolor:#404000;\n+\tpadding:3px;\n+}\n+td.wsstatus { vertical-align:middle; width:200px; height:50px;\n+\ttext-align:center;\n+\tbackground:#f0f0c0; padding:6px;\n+\t-webkit-border-radius:8px;\n+\tborder-radius:8px;\n+\tcolor:#404000; }\n+.tdform { vertical-align:middle; width:200px; height:50px;\n+\ttext-align:center;\n+\tbackground:#f0f0d0; padding:6px;\n+\t-webkit-border-radius:8px;\n+\tmargin:10px;\n+\tborder-radius:8px;\n+\tborder: 1px solid black;\n+\tborder-collapse: collapse;font-size:18pt; font-family: Arial; font-weight:normal; text-align:center; color:#000000; \n+\tcolor:#404000; }\n+\t\n+td.l { vertical-align:middle;\n+\ttext-align:center;\n+\tbackground:#d0d0b0; \n+\tpadding:3px; \n+\t-webkit-border-radius:3px;\n+\tborder-radius:3px; }\n+\t\n+td.bigger { font-size:120%; }\n+\n+div.bgw { background:white }\n+div.conninfo {\n+\tborder: solid 2px #e0d040;\n+\tpadding: 4px;\n+\twidth: 500px;\n+\theight:350px;\n+\toverflow: auto;\n+}\n+span.f12 { font-size:12pt }\n+\t\n+.content { vertical-align:top; text-align:center; background:#fffff0; padding:12px; -webkit-border-radius:10px; border-radius:10px; }\n+.canvas { vertical-align:top; text-align:center; background:#efefd0; padding:12px; -webkit-border-radius:10px; border-radius:10px; }\n+.tabs {\n+ position: relative; \n+ min-height: 750px; /* This part sucks */\n+ clear: both;\n+ margin: 25px 0;\n+}\n+.tab {\n+ float: left;\n+}\n+.tab label {\n+ background: #eee; \n+ padding: 10px; \n+ border: 1px solid #ccc; \n+ margin-left: -1px; \n+ position: relative;\n+ left: 1px; \n+}\n+.tab [type\u003dradio] {\n+ display: none; \n+}\n+.content {\n+ position: absolute;\n+ top: 28px;\n+ left: 0;\n+ background: white;\n+ right: 0;\n+ bottom: 0;\n+ padding: 20px;\n+ border: 1px solid #ccc; \n+}\n+[type\u003dradio]:checked ~ label {\n+ background: white;\n+ border-bottom: 1px solid white;\n+ z-index: 2;\n+}\n+[type\u003dradio]:checked ~ label ~ .content {\n+ z-index: 1;\n+}\n+\n+\ttd.wsstatus { vertical-align:middle; width:200px; height:50px;\n+\t\ttext-align:center;\n+\t\tbackground:#f0f0c0; padding:6px;\n+\t\t-webkit-border-radius:8px;\n+\t\tborder-radius:8px;\n+\t\tcolor:#404000; }\n+\ttd.l { vertical-align:middle;\n+\t\ttext-align:center;\n+\t\tbackground:#d0d0b0; \n+\t\tpadding:3px; \n+\t\t-webkit-border-radius:3px; \n+\t\tborder-radius:3px; }\n+\ttd.dl { vertical-align:middle;\n+\t\ttext-align:center;\n+\t\tbackground:#c0c0c0; \n+\t\tpadding:3px; \n+\t\t-webkit-border-radius:3px; \n+\t\tborder-radius:3px; }\n+\ttd.c { vertical-align:middle;\n+\t\ttext-align:center;\n+\t\tbackground:#c0c0a0; \n+\t\tpadding:3px; \n+\t\t-webkit-border-radius:3px; \n+\t\tborder-radius:3px; }\n+\ttd.c0 { vertical-align:middle;\n+\t\ttext-align:center;\n+\t\tbackground:#b0b090; \n+\t\tpadding:3px; \n+\t\t-webkit-border-radius:3px; \n+\t\tborder-radius:3px; }\n+\ttd.dc0 { vertical-align:middle;\n+\t\ttext-align:center;\n+\t\tbackground:#a0a0a0; \n+\t\tpadding:3px; \n+\t\t-webkit-border-radius:3px; \n+\t\tborder-radius:3px; }\n+\ttd.c1 { vertical-align:middle;\n+\t\ttext-align:center;\n+\t\tbackground:#c0c0c0; \n+\t\tpadding:3px; \n+\t\t-webkit-border-radius:3px; \n+\t\tborder-radius:3px; }\n+\ttd.t { vertical-align:middle;\n+\t\ttext-align:center;\n+\t\tbackground:#e0e0c0; \n+\t\tpadding:3px; \n+\t\t-webkit-border-radius:3px; \n+\t\tborder-radius:3px; }\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.html\nnew file mode 100644\nindex 0000000..047bcc8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.html\n@@ -0,0 +1,261 @@\n+\u003c!DOCTYPE html\u003e\n+\u003chtml lang\u003d\u0022en\u0022\u003e\n+\u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003clink rel\u003d\u0022stylesheet\u0022 type\u003d\u0022text/css\u0022 href\u003d\u0022test.css\u0022/\u003e\n+ \u003cscript type\u003d'text/javascript' src\u003d\u0022/lws-common.js\u0022\u003e\u003c/script\u003e\n+ \u003cscript type\u003d'text/javascript' src\u003d'test.js'\u003e\u003c/script\u003e\n+ \u003ctitle\u003eMinimal Websocket test app\u003c/title\u003e\n+\u003c/head\u003e\n+\n+\u003cbody\u003e\n+\u003cheader\u003e\u003c/header\u003e\n+\u003carticle\u003e\n+\n+\u003ctable\u003e\u003ctr\u003e\u003ctd\u003e\n+\n+\u003ctable width\u003d800px\u003e\n+ \u003ctr\u003e\n+ \u003ctd valign\u003dmiddle align\u003dcenter\u003e\n+ \u003ca href\u003d\u0022https://libwebsockets.org\u0022\u003e\n+\t \u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003c/a\u003e\n+ \u003c/td\u003e\n+ \u003ctd\u003e\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003c/td\u003e\n+ \u003ctd\u003e\n+\t\u003csection class\u003d\u0022browser\u0022\u003e\n+\t\u003cdiv id\u003dbrow\u003e...\u003c/div\u003e\u003c/section\u003e\n+ \u003c/td\u003e\n+ \u003ctd width\u003d\u002264\u0022 height\u003d\u002264\u0022 id\u003d\u0022wstransport\u0022\u003e\u003c/td\u003e\n+ \u003ctd width\u003d\u002264\u0022 height\u003d\u002264\u0022 id\u003d\u0022transport\u0022\u003e\u003c/td\u003e\n+ \u003c/tr\u003e\n+\n+\u003c/table\u003e\n+\u003c/td\u003e\u003c/tr\u003e\n+\u003ctr\u003e\u003ctd colspan\u003d2 align\u003dcenter\u003e\n+Click \u003ca href\u003d\u0022leaf.jpg\u0022 target\u003d\u0022_blank\u0022\u003eHere\u003c/a\u003e to\n+have the test server send a big picture by http.\n+\u003c/td\u003e\u003c/tr\u003e\n+\u003ctr\u003e\u003ctd colspan\u003d2\u003e\n+\u003cdiv class\u003d\u0022tabs\u0022\u003e\n+\n+ \u003cdiv class\u003d\u0022tab\u0022\u003e\n+ \u003cinput type\u003d\u0022radio\u0022 id\u003d\u0022tab-1\u0022 name\u003d\u0022tab-group-1\u0022 checked\u003e\n+ \u003clabel for\u003d\u0022tab-1\u0022\u003eDumb Increment Demo\u003c/label\u003e\n+ \n+ \u003cdiv class\u003d\u0022content\u0022\u003e\n+ \u003cdiv id\u003d\u0022dumb\u0022 class\u003d\u0022group2\u0022\u003e\n+ \u003ctable\u003e\n+ \u003ctr\u003e\n+\t \u003ctd id\u003dwsdi_statustd align\u003dcenter class\u003d\u0022wsstatus\u0022\u003e\n+\t \u003cspan id\u003dwsdi_status\u003eWebsocket connection not initialized\n+\t \t\u003c/span\u003e\u003c/td\u003e\n+ \u003ctd\u003e\u003cspan class\u003d\u0022title\u0022\u003edumb increment-protocol\u003c/span\u003e\u003c/td\u003e\n+\t \u003c/tr\u003e\n+\t \u003ctr\u003e\n+\t \u003ctd class\u003d\u0022explain\u0022 colspan\u003d2\u003e\n+The incrementing number is coming from the server at 20Hz and is individual for\n+each connection to the server... try opening a second browser window.\n+\u003cbr/\u003e\u003cbr/\u003e\n+The button sends a message over the websocket link to ask the server\n+to zero just this connection's number.\n+\t \u003c/td\u003e\n+\t \u003c/tr\u003e\n+\t \u003ctr\u003e\n+\t \u003ctd align\u003dcenter\u003e\u003cdiv id\u003dnumber class\u003d\u0022bigger\u0022\u003e \u003c/div\u003e\u003c/td\u003e\n+\t \u003ctd align\u003dcenter\u003e\n+\t \u003cinput type\u003dbutton id\u003doffset value\u003d\u0022Reset counter\u0022\u003e\n+\t \u003cinput type\u003dbutton id\u003djunk value\u003d\u0022Send junk\u0022\u003e\n+\t \u003c/td\u003e\n+\t \u003c/tr\u003e\n+\t \u003c/table\u003e\n+\t\u003c/div\u003e\n+ \u003c/div\u003e \n+ \u003c/div\u003e\n+\n+ \u003cdiv class\u003d\u0022tab\u0022\u003e\n+ \u003cinput type\u003d\u0022radio\u0022 id\u003d\u0022tab-2\u0022 name\u003d\u0022tab-group-1\u0022\u003e\n+ \u003clabel for\u003d\u0022tab-2\u0022\u003eMirror Demo\u003c/label\u003e\n+ \n+ \u003cdiv class\u003d\u0022content\u0022\u003e\n+ \u003cdiv id\u003d\u0022mirror\u0022 class\u003d\u0022group2\u0022\u003e\n+ \u003ctable\u003e\n+ \u003ctr\u003e\n+\t \u003ctd colspan\u003d1 id\u003dwslm_statustd align\u003dcenter class\u003d\u0022wsstatus\u0022\u003e\n+\t \u003cspan id\u003dwslm_status\u003eWebsocket connection not initialized\u003c/span\u003e\n+\t\u003c/td\u003e\n+ \u003ctd\u003e\n+ \u003cspan class\u003d\u0022title\u0022\u003elws-mirror-protocol\u003c/span\u003e\n+ \u003c/td\u003e\n+ \u003c/tr\u003e\n+ \u003ctr\u003e\n+ \u003ctd colspan\u003d2\u003e\n+ \u003cdiv class\u003d\u0022explain\u0022\u003e\n+Use the mouse to draw on the canvas below -- all other browser windows open\n+on this page see your drawing in realtime and you can see any of theirs as\n+well.\n+\u003cbr/\u003e\u003cbr/\u003e\n+The lws-mirror protocol doesn't interpret what is being sent to it, it just\n+re-sends it to every other websocket it has a connection with using that\n+protocol, including the guy who sent the packet.\n+\u003cbr/\u003e\u003cbr/\u003e\n+\u003cb\u003elibwebsockets-test-client\u003c/b\u003e joins in by spamming circles on to this\n+shared canvas when run.\n+ \u003c/div\u003e\n+ \u003c/td\u003e\n+ \u003c/tr\u003e\n+ \u003ctr\u003e\n+\t\u003ctd colspan\u003d2\u003eDrawing color:\n+\t \u003cselect id\u003d\u0022color\u0022\u003e\n+\t\t\u003coption value\u003d#000000\u003eBlack\u003c/option\u003e\n+\t\t\u003coption value\u003d#0000ff\u003eBlue\u003c/option\u003e\n+\t\t\u003coption value\u003d#20ff20\u003eGreen\u003c/option\u003e\n+\t\t\u003coption value\u003d#802020\u003eDark Red\u003c/option\u003e\n+\t \u003c/select\u003e\n+ \u003c/tr\u003e\n+ \u003ctr\u003e\n+\t \u003ctd colspan\u003d2 width\u003d500 height\u003d320\u003e\n+\t\t\u003cdiv id\u003d\u0022wslm_drawing\u0022 class\u003d\u0022bgw\u0022\u003e\u003c/div\u003e\n+\t\u003c/td\u003e\n+ \u003c/tr\u003e\n+ \u003c/table\u003e\n+ \u003c/div\u003e\n+ \u003c/div\u003e \n+ \u003c/div\u003e\n+ \n+ \u003cdiv class\u003d\u0022tab\u0022\u003e\n+ \u003cinput type\u003d\u0022radio\u0022 id\u003d\u0022tab-3\u0022 name\u003d\u0022tab-group-1\u0022\u003e\n+ \u003clabel for\u003d\u0022tab-3\u0022\u003eClose Testing\u003c/label\u003e\n+ \n+ \u003cdiv class\u003d\u0022content\u0022\u003e\n+\u003cdiv id\u003d\u0022ot\u0022 class\u003d\u0022group2\u0022\u003e\n+ \u003ctable\u003e\n+ \u003ctr\u003e\n+ \u003ctd\u003e\n+\n+\t\t\u003c/td\u003e\u003c/tr\u003e\n+\t\t\u003ctr\u003e\u003ctd id\u003dot_statustd align\u003dcenter class\u003d\u0022wsstatus\u0022\u003e\n+\t\t \u003cspan id\u003dot_status\u003eWebsocket connection not initialized\u003c/span\u003e\n+\t\t\u003c/td\u003e\n+\t\t\u003ctd colspan\u003d2\u003e\u003cspan class\u003d\u0022title\u0022\u003eOpen and close testing\n+\t\t\t\t\u003c/span\u003e\u003c/td\u003e\n+\t\t\u003c/tr\u003e\n+\t\t\u003ctr\u003e\t\n+\u003ctd class\u003d\u0022explain\u0022 colspan\u003d3 \u003e\n+To help with open and close testing, you can open and close a connection by\n+hand using the buttons.\u003cbr\u003e\n+ \u0022\u003cb\u003eClose\u003c/b\u003e\u0022 closes the connection from the browser with code 3000\n+ and reason 'Bye!\u0022.\u003cbr\u003e\n+ \u0022\u003cb\u003eRequest Server Close\u003c/b\u003e\u0022 sends a message asking the server to\n+initiate the close, which it does with code 1001 and reason \u0022Seeya\u0022.\n+\u003c/td\u003e\u003c/tr\u003e\n+\t\u003ctr\u003e\n+\t\u003ctd align\u003dcenter\u003e\n+\t \u003cinput type\u003d\u0022button\u0022 id\u003d\u0022ot_open_btn\u0022 value\u003d\u0022Open\u0022\u003e\u003c/td\u003e\n+\t\u003ctd align\u003dcenter\u003e\n+\t \u003cinput type\u003d\u0022button\u0022 id\u003d\u0022ot_close_btn\u0022 disabled value\u003d\u0022Close\u0022 \u003e\u003c/td\u003e\n+\t\u003ctd align\u003dcenter\u003e\n+\t \u003cinput type\u003d\u0022button\u0022 id\u003d\u0022ot_req_close_btn\u0022 disabled\n+\t \t value\u003d\u0022Request Server Close\u0022 \u003e\u003c/td\u003e\n+\t\u003c/tr\u003e\n+\n+\u003c/table\u003e\n+\n+\u003c/div\u003e\n+ \u003c/div\u003e \n+ \u003c/div\u003e\n+ \n+ \u003cdiv class\u003d\u0022tab\u0022\u003e\n+ \u003cinput type\u003d\u0022radio\u0022 id\u003d\u0022tab-4\u0022 name\u003d\u0022tab-group-1\u0022\u003e\n+ \u003clabel for\u003d\u0022tab-4\u0022\u003eServer info\u003c/label\u003e\n+\n+ \u003cdiv class\u003d\u0022content\u0022\u003e\n+\u003cdiv id\u003d\u0022ot\u0022 class\u003d\u0022group2\u0022\u003e\n+ \u003ctable\u003e\n+ \u003ctr\u003e\n+\t\u003ctd id\u003ds_statustd align\u003dcenter class\u003d\u0022wsstatus\u0022\u003e\n+\t \u003cdiv id\u003ds_status\u003eWebsocket connection not initialized\u003c/div\u003e\n+\t\u003c/td\u003e\n+\t \u003ctd colspan\u003d1\u003e\n+\t\u003cspan class\u003d\u0022title\u0022\u003eServer Info\u003c/span\u003e\n+\t\t\u003cinput type\u003dbutton id\u003dpmd value\u003d\u0022Test pmd\u0022\u003e\n+\n+\t\u003c/td\u003e\n+\t\u003c/tr\u003e\u003ctr\u003e\n+\u003ctd class\u003d\u0022explain\u0022 colspan\u003d2\u003e\n+This information is sent by the server over a ws[s] link and updated live\n+whenever the information changes server-side.\n+\u003c/td\u003e\u003c/tr\u003e\n+\t\u003ctr\u003e\n+\t\u003ctd align\u003dcenter colspan\u003d2\u003e\u003cdiv id\u003dservinfo\u003e\u003c/div\u003e\u003c/td\u003e\n+\t\u003c/tr\u003e\n+\t\u003ctr\u003e\n+\t\u003ctd align\u003dcenter colspan\u003d2\u003e\u003cdiv id\u003dconninfo class\u003d\u0022conninfo\u0022\u003e\u003c/div\u003e\u003c/td\u003e\n+\t\u003c/tr\u003e\n+\u003c/table\u003e\n+\u003c/div\u003e\n+ \u003c/div\u003e \n+ \u003c/div\u003e\n+\n+ \u003cdiv class\u003d\u0022tab\u0022\u003e\n+ \u003cinput type\u003d\u0022radio\u0022 id\u003d\u0022tab-5\u0022 name\u003d\u0022tab-group-1\u0022\u003e\n+ \u003clabel for\u003d\u0022tab-5\u0022\u003ePOST\u003c/label\u003e\n+\n+ \u003cdiv class\u003d\u0022content\u0022\u003e\n+\u003cdiv id\u003d\u0022ot\u0022 class\u003d\u0022group2\u0022\u003e\n+ \u003ctable width\u003d100%\u003e\n+ \u003ctr\u003e\n+\t \u003ctd colspan\u003d1\u003e\n+\u003cspan class\u003d\u0022title\u0022\u003ePOST Form testing\u003c/span\u003e\n+\t\u003c/td\u003e\n+\t\u003c/tr\u003e\u003ctr\u003e\n+\u003ctd class\u003d\u0022explain\u0022 colspan\u003d2\u003e\n+This tests POST handling in lws.\n+\u003c/td\u003e\u003c/tr\u003e\n+\t\u003ctr\u003e\n+\t\u003ctd align\u003dcenter colspan\u003d2 class\u003dtdform\u003e\u003cdiv id\u003dpostinfo\u003e\n+\tFORM 1: send with urlencoded POST body args\u003cbr\u003e\n+\t\u003cform action\u003d\u0022formtest\u0022 method\u003d\u0022post\u0022\u003e\n+ \u003cspan class\u003d\u0022f12\u0022\u003eSome text: \u003c/span\u003e\n+ \u003cinput type\u003d\u0022text\u0022 name\u003d\u0022text\u0022 value\u003d\u0022Give me some text\u0022\u003e\u003cbr\u003e\n+ \u003cinput type\u003d\u0022submit\u0022 name\u003d\u0022send\u0022 value\u003d\u0022Send the form\u0022\u003e\n+\t\u003c/form\u003e\n+\t\u003c/div\u003e\u003c/td\u003e\n+\t\u003c/tr\u003e\n+\n+\n+\t\u003ctr\u003e\n+\t\u003ctd align\u003dcenter colspan\u003d2 class\u003dtdform\u003e\u003cdiv id\u003dpostinfo \u003e\n+\tFORM 2: send with multipart/form-data\u003cbr\u003e\n+\t(can handle file upload, test limited to 100KB)\u003cbr\u003e\n+\t\u003cform name\u003dmultipart action\u003d\u0022formtest\u0022 method\u003d\u0022post\u0022\n+\t enctype\u003d\u0022multipart/form-data\u0022\u003e\n+ \u003cspan class\u003d\u0022f12\u0022\u003eSome text: \u003c/span\u003e\n+ \u003cinput type\u003d\u0022text\u0022 name\u003d\u0022text\u0022 value\u003d\u0022Give me some text\u0022\u003e\n+\u003cbr\u003e\n+ \u003cinput type\u003d\u0022file\u0022 name\u003d\u0022file\u0022 id\u003d\u0022file\u0022 size\u003d\u002220\u0022\u003e\u0026nbsp;\n+ \u003cspan id\u003dfile_info class\u003d\u0022f12\u0022\u003e\u003c/span\u003e\u003cbr\u003e\n+ \u003cinput type\u003d\u0022submit\u0022 id\u003d\u0022upload\u0022 name\u003d\u0022upload\u0022 disabled\u003d1 value\u003d\u0022Upload\u0022\u003e\n+\t\u003c/form\u003e\n+\t\u003c/div\u003e\u003c/td\u003e\n+\t\u003c/tr\u003e\n+\t\n+\u003c/table\u003e\n+\u003c/div\u003e\n+ \u003c/div\u003e \n+ \u003c/div\u003e\n+\n+\u003c/div\u003e\n+\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n+\n+Looking for support?\n+\u003ca href\u003d\u0022https://libwebsockets.org\u0022\u003ehttps://libwebsockets.org\u003c/a\u003e,\n+\u003ca href\u003d\u0022https://github.com/warmcat/libwebsockets\u0022\u003e\n+\thttps://github.com/warmcat/libwebsockets\u003c/a\u003e\u003c/a\u003e\u003cbr/\u003e\n+Join the mailing list:\n+\u003ca href\u003d\u0022https://libwebsockets.org/mailman/listinfo/libwebsockets\u0022\u003e\n+\thttps://libwebsockets.org/mailman/listinfo/libwebsockets\u003c/a\u003e\n+\n+\u003c/article\u003e\n+\n+\u003c/body\u003e\n+\u003c/html\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.js b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.js\nnew file mode 100644\nindex 0000000..74bba69\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.js\n@@ -0,0 +1,543 @@\n+(function () {\n+function check_file()\n+{\n+\tvar f \u003d document.getElementById(\u0022file\u0022).files[0];\n+\tvar max_len \u003d 100000;\n+\tvar dis \u003d 0;\n+\t\n+\tif (f) {\n+\t\tif (f.size \u003e\u003d max_len) {\n+\t\t\tdis \u003d 1;\n+\t\t\tdocument.getElementById(\u0022file_info\u0022).innerHTML \u003d\n+\t\t\t\t\u0022\u003cspan style\u003d\u005c\u0022color:red;font-weight:bold\u005c\u0022\u003eFile larger than \u0022 +\n+\t\t\t\t\t\t\tmax_len+\u0022\u003c/span\u003e\u0022;\n+\t\t} else\n+\t\t\tdocument.getElementById(\u0022file_info\u0022).innerHTML \u003d\n+\t\t\t\t\u0022File length \u0022+f.size;\n+\t} else\n+\t\tdis \u003d 1;\n+\t\n+\tdocument.getElementById(\u0022upload\u0022).disabled \u003d dis;\n+}\n+\n+/*\n+ * We display untrusted stuff in html context... reject anything\n+ * that has HTML stuff in it\n+ */\n+\n+function san(s)\n+{\n+\tif (s.search(\u0022\u003c\u0022) !\u003d\u003d -1)\n+\t\treturn \u0022invalid string\u0022;\n+\t\n+\treturn s;\n+}\n+\n+/* BrowserDetect came from http://www.quirksmode.org/js/detect.html */\n+\n+var BrowserDetect \u003d {\n+\tinit: function () {\n+\t\tthis.browser \u003d this.searchString(this.dataBrowser) ||\n+\t\t\t\t\t\t\u0022An unknown browser\u0022;\n+\t\tthis.version \u003d this.searchVersion(navigator.userAgent)\n+\t\t\t|| this.searchVersion(navigator.appVersion)\n+\t\t\t|| \u0022an unknown version\u0022;\n+\t\tthis.OS \u003d this.searchString(this.dataOS) || \u0022an unknown OS\u0022;\n+\t},\n+\tsearchString: function (data) {\n+\t\tfor (var i\u003d0;i\u003cdata.length;i++)\t{\n+\t\t\tvar dataString \u003d data[i].string;\n+\t\t\tvar dataProp \u003d data[i].prop;\n+\t\t\tthis.versionSearchString \u003d data[i].versionSearch || data[i].identity;\n+\t\t\tif (dataString) {\n+\t\t\t\tif (dataString.indexOf(data[i].subString) !\u003d\u003d -1)\n+\t\t\t\t\treturn data[i].identity;\n+\t\t\t}\n+\t\t\telse if (dataProp)\n+\t\t\t\treturn data[i].identity;\n+\t\t}\n+\t},\n+\tsearchVersion: function (dataString) {\n+\t\tvar index \u003d dataString.indexOf(this.versionSearchString);\n+\t\tif (index \u003d\u003d\u003d -1) return 0;\n+\t\treturn parseFloat(dataString.substring(index +\n+\t\t\t\t\t\t\t\t\t\tthis.versionSearchString.length + 1));\n+\t},\n+\tdataBrowser: [\n+\t\t{\n+\t\t\tstring: navigator.userAgent,\n+\t\t\tsubString: \u0022Chrome\u0022,\n+\t\t\tidentity: \u0022Chrome\u0022\n+\t\t},\n+\t\t{ \tstring: navigator.userAgent,\n+\t\t\tsubString: \u0022OmniWeb\u0022,\n+\t\t\tversionSearch: \u0022OmniWeb/\u0022,\n+\t\t\tidentity: \u0022OmniWeb\u0022\n+\t\t},\n+\t\t{\n+\t\t\tstring: navigator.vendor,\n+\t\t\tsubString: \u0022Apple\u0022,\n+\t\t\tidentity: \u0022Safari\u0022,\n+\t\t\tversionSearch: \u0022Version\u0022\n+\t\t},\n+\t\t{\n+\t\t\tprop: window.opera,\n+\t\t\tidentity: \u0022Opera\u0022,\n+\t\t\tversionSearch: \u0022Version\u0022\n+\t\t},\n+\t\t{\n+\t\t\tstring: navigator.vendor,\n+\t\t\tsubString: \u0022iCab\u0022,\n+\t\t\tidentity: \u0022iCab\u0022\n+\t\t},\n+\t\t{\n+\t\t\tstring: navigator.vendor,\n+\t\t\tsubString: \u0022KDE\u0022,\n+\t\t\tidentity: \u0022Konqueror\u0022\n+\t\t},\n+\t\t{\n+\t\t\tstring: navigator.userAgent,\n+\t\t\tsubString: \u0022Firefox\u0022,\n+\t\t\tidentity: \u0022Firefox\u0022\n+\t\t},\n+\t\t{\n+\t\t\tstring: navigator.vendor,\n+\t\t\tsubString: \u0022Camino\u0022,\n+\t\t\tidentity: \u0022Camino\u0022\n+\t\t},\n+\t\t{\t\t// for newer Netscapes (6+)\n+\t\t\tstring: navigator.userAgent,\n+\t\t\tsubString: \u0022Netscape\u0022,\n+\t\t\tidentity: \u0022Netscape\u0022\n+\t\t},\n+\t\t{\n+\t\t\tstring: navigator.userAgent,\n+\t\t\tsubString: \u0022MSIE\u0022,\n+\t\t\tidentity: \u0022Explorer\u0022,\n+\t\t\tversionSearch: \u0022MSIE\u0022\n+\t\t},\n+\t\t{\n+\t\t\tstring: navigator.userAgent,\n+\t\t\tsubString: \u0022Gecko\u0022,\n+\t\t\tidentity: \u0022Mozilla\u0022,\n+\t\t\tversionSearch: \u0022rv\u0022\n+\t\t},\n+\t\t{ \t\t// for older Netscapes (4-)\n+\t\t\tstring: navigator.userAgent,\n+\t\t\tsubString: \u0022Mozilla\u0022,\n+\t\t\tidentity: \u0022Netscape\u0022,\n+\t\t\tversionSearch: \u0022Mozilla\u0022\n+\t\t}\n+\t],\n+\tdataOS : [\n+\t\t{\n+\t\t\tstring: navigator.platform,\n+\t\t\tsubString: \u0022Win\u0022,\n+\t\t\tidentity: \u0022Windows\u0022\n+\t\t},\n+\t\t{\n+\t\t\tstring: navigator.platform,\n+\t\t\tsubString: \u0022Mac\u0022,\n+\t\t\tidentity: \u0022Mac\u0022\n+\t\t},\n+\t\t{\n+\t\t\t string: navigator.userAgent,\n+\t\t\t subString: \u0022iPhone\u0022,\n+\t\t\t identity: \u0022iPhone/iPod\u0022\n+\t },\n+\t\t{\n+\t\t\tstring: navigator.platform,\n+\t\t\tsubString: \u0022Linux\u0022,\n+\t\t\tidentity: \u0022Linux\u0022\n+\t\t}\n+\t]\n+\n+};\n+\n+var pos \u003d 0;\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+var params \u003d {};\n+\n+if (location.search) {\n+ var parts \u003d location.search.substring(1).split(\u0022\u0026\u0022);\n+\n+ for (var i \u003d 0; i \u003c parts.length; i++) {\n+ var nv \u003d parts[i].split(\u0022\u003d\u0022);\n+ if (!nv[0]) continue;\n+ params[nv[0]] \u003d nv[1] || true;\n+ }\n+}\n+\n+var socket_di;\n+\n+var mirror_name \u003d \u0022\u0022;\n+if (params.mirror)\n+\tmirror_name \u003d params.mirror;\n+\n+\tconsole.log(mirror_name);\n+\n+function ws_open_dumb_increment()\n+{\n+\tsocket_di \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022dumb-increment-protocol\u0022);\n+\n+\ttry {\n+\t\tsocket_di.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022wsdi_statustd\u0022).style.backgroundColor \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\u0022#40ff40\u0022;\n+\t\t\tdocument.getElementById(\u0022wsdi_status\u0022).innerHTML \u003d\n+\t\t\t\t\u0022 \u003cb\u003ewebsocket connection opened\u003c/b\u003e\u003cbr\u003e\u0022 +\n+\t\t\t\tsan(socket_di.extensions);\n+\t\t};\n+\n+\t\tsocket_di.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tdocument.getElementById(\u0022number\u0022).textContent \u003d msg.data + \u0022\u005cn\u0022;\n+\t\t};\n+\n+\t\tsocket_di.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022wsdi_statustd\u0022).style.backgroundColor \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\u0022#ff4040\u0022;\n+\t\t\tdocument.getElementById(\u0022wsdi_status\u0022).textContent \u003d\n+\t\t\t\t\t\t\t\t\t\u0022 websocket connection CLOSED \u0022;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError\u0022 + exception); \n+\t}\n+}\n+\t\n+\tvar socket_status, jso, s;\n+\t\n+function ws_open_status()\n+{\t\n+\t\n+\tsocket_status \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-status\u0022);\n+\n+\ttry {\n+\t\tsocket_status.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022s_statustd\u0022).style.backgroundColor \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\u0022#40ff40\u0022;\n+\t\t\tdocument.getElementById(\u0022s_status\u0022).innerHTML \u003d\n+\t\t\t\t\u0022 \u003cb\u003ewebsocket connection opened\u003c/b\u003e\u003cbr\u003e\u0022 +\n+\t\t\t\tsan(socket_status.extensions);\n+\t\t};\n+\n+\t\tsocket_status.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tvar s;\n+\t\t\t\n+\t\t\tconsole.log(msg.data);\n+\t\t\t\n+\t\t\tjso \u003d JSON.parse(msg.data);\n+\t\t\t\n+\t\t\tif (jso.wss_over_h2 \u003d\u003d\u003d \u00221\u0022)\n+\t\t\t\tdocument.getElementById(\u0022wstransport\u0022).innerHTML \u003d\n+\t\t\t\t\t\t\t\t\t\t\u0022\u003cimg src\u003d\u005c\u0022./wss-over-h2.png\u005c\u0022\u003e\u0022;\n+\t\t\t\n+\t\t\tdocument.getElementById(\u0022servinfo\u0022).innerHTML \u003d \n+\t\t\t\t\u0022\u003ctable\u003e\u003ctr\u003e\u003ctd class\u003dl\u003eBuild info\u003c/td\u003e\u003ctd\u003e\u0022+\n+\t\t\t\t\tsan(jso.version) + \u0022\u003c/td\u003e\u003c/tr\u003e\u0022 +\n+\t\t\t\t\t\u0022\u003ctr\u003e\u003ctd class\u003dl\u003eServer info\u003c/td\u003e\u003ctd\u003e\u0022 +\n+\t\t\t\t\tsan(jso.hostname) + \u0022\u003c/td\u003e\u003c/tr\u003e\u0022 +\n+\t\t\t\t\t\u0022\u003c/table\u003e\u0022;\n+\t\t\ts\u003d\u0022\u003ctable\u003e\u0022;\n+\t\t\tvar n;\n+\t\t\tfor (n \u003d 0; n \u003c jso.conns.length; n++) {\n+\t\t\t\tvar d \u003d new Date(parseInt(jso.conns[n].time, 10) * 1000);\n+\t\t\t\t\n+\t\t\t\ts \u003d s + \u0022\u003ctr\u003e\u003ctd class\u003dl\u003eclient \u0022 + (n + 1) +\n+\t\t\t\t\u0022\u003c/td\u003e\u003ctd\u003e\u003cb\u003e\u0022 + san(jso.conns[n].peer) +\n+\t\t\t\t\u0022\u003c/b\u003e\u003cbr\u003e\u0022 + san(d.toString()) +\n+\t\t\t\t\u0022\u003cbr\u003e\u0022 + san(jso.conns[n].ua) +\n+\t\t\t\t\u0022\u003c/td\u003e\u003c/tr\u003e\u0022;\n+\t\t\t}\n+\t\t\ts \u003d s + \u0022\u003c/table\u003e\u0022;\n+\t\t\t\n+\t\t\tdocument.getElementById(\u0022conninfo\u0022).innerHTML \u003d s;\n+\t\t};\n+\n+\t\tsocket_status.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022s_statustd\u0022).style.backgroundColor \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\u0022#ff4040\u0022;\n+\t\t\tdocument.getElementById(\u0022s_status\u0022).textContent \u003d\n+\t\t\t\t\t\t\t\t\u0022 websocket connection CLOSED \u0022;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError\u0022 + exception); \n+\t}\n+}\n+\n+function reset() {\n+\tsocket_di.send(\u0022reset\u005cn\u0022);\n+}\n+\n+\n+function junk() {\n+\tfor(var word \u003d \u0022\u0022; word.length \u003c 9000; word +\u003d \u0022a\u0022){}\n+\tsocket_di.send(word);\n+}\n+\n+function on_pmd() {\n+\tsocket_status.send(\u0022{ \u005c\u0022RequestType\u005c\u0022:\u005c\u0022DDoS\u005c\u0022, \u005c\u0022blob\u005c\u0022:\u005c\u0022data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAJbElEQVR4Xu2af4xUVxXHv+e9O0OhIEibgrRlF8rOG6CWKiumrUlTo6byj6mmNFta2DdQsRJJrP5j+0cnjSVp1BoSU1yzO28LEeL6h7GJNhpJNa2CBQ1gd9k3QPlRBU2LLV0W2p173zFvZvbtzOybmbd7J9DEd/+befece97nfe+95/4gxEWLAGlZx8aIAWqKIAYYA9QkoGkeKzAGqElA0zxWYAxQk4CmeazAGKAmAU3zWIExQE0CmuaxAmOAmgQ0zWMFxgA1CWiaxwqMAWoS0DRvrQJ3ujeb17Hrx6SuzLwV32x7VzO+1pj3HJprJue8BcBQCSONRzr+2RrHaO2OtHDc1wDcUwqOj0s7nWpVoDp+hOMeA5Au+zggbesuHX+Vti1VoOh3j4BxRxEf8xmVSbe3KlAdP2bOPUmEpaXviiGZsVbq+IsBxgCnpp9YgVPjNan2RwagmXMfUpnUAEAc9k6Rx8AHB0zzy3euU5nUXk02RXMzl+9Ssw8PYN06FeYvOkAmM5dfpzLWL6LGFXkSMR13jIAEmKXMpBM6AIXjeih+BVLqTEcSWfJ/T71ks4bZ9vAYgU1/epC2ZegAFLnhAogEM0tV5x1r/UcGKBw3UJ1sTyVwH8laZ5EU2DO4WCTFmXFbOTbnemxZdHnq9AAMvDVTjF4ObKVS7di8IvA97jOSArNsiLZ8oGBpW5HYRKrkB1IFcGwkiS2dhWkB7B1qE6Z5uiUAew7NEsk5o4EveEtgLw98TwngwIApRlcFoogBVnzdSArUAWg6+T4QS3U69Xi98eiqK7A4vnX1+YsldWbPJmSzk8fJa6FAP67FXTv9sVLZqU1k9rvHibGsmKQzBlTGeih0gqgcA69CFxaO+zKA+4uxEF6W3dbaSXFdA4Bmzt1DhK5SLHycTMd9n4A5pT9oSNqp0GXO1VagcFx/cphZhnZF2tasjwJAkRs+CqJPFvEBIzHA8a8ScQyMAdbbTGgJwAY7FS3LA3edXCyUbJoHitzwKIhK3Zb5ssykr5/Uha9BHigc9whQ3nHyu7DIDe8A0TY/OI/xtJexngnP5ocLRCRAkLLbas1KhOGps6lE2MxvOO6TBvBsMS7Pe8rbtHz7pLhavRLpdwtgCDCkzIS/o9Gff8pg/n55EtlRSqT7h+8B0xhs62AYvHJlf524QZ3duzs0pfCT7aj7gQNsmqPHH1V2qr9+ewBePHYXIICNHfsb1TNzw7Y6e343svdNWh35dpHyQL9iKUV5VGVSu+qt94tx7DrZCa8wA93pP0deiTR80fLDyACjOGthncgAp9FmqwG+CsbnynHkpW1Z04ip5Sai3x0CY3kpU+P9sjt9d6saaSlA9JybJWaMXARDyRFjLrZ1fNiqQLX8DAwmxai4CCAhzblzsWFhsH7W8lvM8eOiRSAGqIUvVqAmvhhgDFCbgKaDqY+B2ayBBV2fQJJnwzQlSL6HjcsvhMaRHUwG/2dXjjWMtXdwPjBjPryCARKXIcQ7sJd8EOn9fFuTbkCBCDOMUZw69596SXWVv4HB2bicXAClBARdwqm95+stEurFER1gz6GESM45DGBFmLNJW+C5E7cKUmfH68pkoh3rl046r8CL7s3CQ+hdFQY2KNvaXS94o8/\u005c\u0022 }\u0022);\n+\tsocket_status.send(\u0022{ \u005c\u0022RequestType\u005c\u0022:\u005c\u0022SendImage\u005c\u0022, \u005c\u0022RequestID\u005c\u0022:\u005c\u0022283463389\u005c\u0022, \u005c\u0022toType\u005c\u0022:\u005c\u0022toUser\u005c\u0022, \u005c\u0022toID\u005c\u0022:\u005c\u00221036\u005c\u0022, \u005c\u0022fileType\u005c\u0022:\u005c\u0022image/jpeg\u005c\u0022, \u005c\u0022blob\u005c\u0022:\u005c\u0022data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAGqAoADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArlviX43Pw78H3fipdHl1RreSGJLSKQRtK0kqxgBiDjlvSuprhvjNpmoav4INnpljPdznU9Ok8qCMu2xbuJmbA5wFBJPYA0AL4r+K2j+G/hxH8Rra0k1G3ureOezto3CPOXXcFBwcHbk9O1bmg+L9H12wW7juEimSygvrmAtlreOVCy7jjngN+VeOal4L8Vz3Wv8Ag99DvG0Hw5b317pEixMUupLpS0UUf94w5ZMD1FWdLfW/CFxqcF34S126l1vwxpttZfZdPllU3EUMitFIyqREcuOXIHXninYD0y8+KPgCwNkt34ntU/tCGO4tyA7BopPuOSBhQc8bsVYXxtpEc+tHULm2tbPRVheW5afIKyAkEjHy9OOTnNeEHQNX0bw/pTQaH4l0/W38NabbNCNFkvbS/kjgUeTMqrmF1bKncVx1rZ1Lwz4tuV1bVL3wpdSJDf8Ah+/urCGBmFzFAxaeOIf8tNv90ZzgDvRYD2fw34w8NeLoppvDurRXqwNslChlZD1GVYAj8q0rq9tLIRtd3CRCVxGhc4BY9Bn3rlfBl/Z61reqazp/g660q3kjhiW8u7SS0muyoOR5UiqwVc4DEc89q2fFQSTRprVtFk1VrjESWyjhmPQs38AHXdkYx60gNivPb74uwWXhPW/EX/CPzyXmjal/ZQ05Zh5k85ZFjCtjjcZFxxXXeGdO1LSdDtNP1bUPtt1CmJJvXngZ74HGcDOM4FeYXfhPXm+Nq28elXDeG7yaHXbi68s+SLmGORRGW6bi7RNjr8hoA6XU/i3p1pYeHr+w043a+INPk1NMziMQwIiNuY7T/fA/OtS8+J3gnSntLbWtftbO6u4IpxESzhA4BG5gMKPc4ryPSvBHipIvGdheaDei20HT7jRtB/ct/pMLzSSK0Yx8w8t4k47oaj8XaLqVglzJpmjeIbfV7rRLSAWw0WS/sdUdIiBFJsX9yQSVJZhgHPanYD1B/jD4PsfEWseHNdvo9Nm0q7itUeRiwn8yGOQN8q/IP3m3k9R1ra8ceLoPBfgzVfGTWpvYdMs3vPKSQL5qqucBsHGfXFebDwpq15YfE681LwvIuoaotuLdRbl/NK2EAKxHHzgSBxx3Bre+IukavqHwA1TRbPTbq41GXw75C2scTNM0vkAbAgGS2eMYzmgDt9c1xNF0CfXXiRlhjWQo8mwckDlsHHX0rMf4leCYNUg0O78QW0OoT+WogO4gO+Nql8bQTkYBIrjfFvjJfFvgjUfDeleE/Fq3s1qgQXHh68gQlXTI3PGBnr3rjdc0rWtM1K8Ph3QdeXVbq6tJW0250iS50/UGUIPN89V2wEYOSzfKVziiwHsPhL4k+GfGer6zoujXLvcaLcfZ5gyMA3yg7gSOmTj8K6qvPfh9aT6V418b2d3ot5bG81NL22uDZusE0Jt4l+WXGwkMrZUHI9K9CpAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVma34m8OeGvsf/CQ67YaZ/aNyllafa7hIvtFw/3Yk3EbnPZRyaANOiisbQfGfhHxTc39l4a8T6XqtxpUohvorO7jme1kOcLIFJKHg8HHQ0AbNFZ2u+ItA8MWa6j4j1qx0u1eVIFmvLhYUMjnCoGYgbieg6mi08R+H7/VrnQbLW7G41KzjSa4s47hWmhjb7rOgOVB7EjmgDRoorO1/wAQ6D4V0uXXPE2tWOladAVEt3ezrDChZgq5diAMkgDnqRQBo0UgORkUtABRVbUtT07RrCfVNWvreys7VDJPcTyCOONB1ZmPAHuaNO1LT9XsYNT0q9gvLO5QSQzwSB45EPRlYcEe4oAs0VT1fWNJ8P6Zcazrup2un2FonmT3V1KsUUS+rMxAA9zU9tc297bRXlnPHPBOiyxSxsGV0YZDAjggggg0AS0UUmRnGeaAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqrqGpWumQ+dcsQCcKBySaaTk7ITairstUVz3/AAmdh/z63H/jv+NH/CZ2H/Prcf8Ajv8AjW31ar/KZfWKfc6Giue/4TOw/wCfW4/8d/xo/wCEzsP+fW4/8d/xo+rVf5Q+sU+50NFc9/wmdh/z63H/AI7/AI0f8JnYf8+tx/47/jR9Wq/yh9Yp9zoaK57/AITOw/59bj/x3/GtDTNcstVLJBuWRRkow5xUyoVIK8kVGtCTsmaNFFFZGgUUUUAFFFFABXin7YfhS78TfAbxBeaUCup+HVj16ykUZaOS1cSkr7lVYfjXtdVtRsLXVLC50y+hWW3u4nhljboyMMEH8DQBxNz8UNOb4IH4tQyrHaz6AurREH7peEMg/wC+mAr52/Zu8OXnwh+KfhZtT3xn4seHLi9u1JO3+0Y5DcA/UxMwA9qxNG1PUX+COl/s0vcNJrFt46m8ITg9Xs7aYzE/TyvK9sGvaf2ptPTwl4J8LfEvS4WB+HGuWGolYx8xsg4imT6eU7E/SgBn7Qif8Jp8Ufhb8KU/eQTanJ4h1KP0gtgBG3/fbH8q6zw7rXw8j+M/jO3stIltPENlpdrNq2oSSnypbfLbAATgbcEk4rmPh40fj39pfx146jdZ7DwtYWnhrT5lOV8woJ7gA/70gH4Vm6DDpFx+0b8XLfX7mO30yXwzZpeTSSCNY4T5gdix4UAZ57UAbEH7S2r67YyeJfAvwY8TeIfDCFzHq0UkcX2iNTgyRRN8zrwcHIzXK/tQ+P8Aw78Sf2QNf8X+Grh3sriWzVllXZJDIt5EHjcdmB6irvg3wv8AtE/BnwxZ6B4BPhj4ieEbGEDSkkujZXv2Xqi7yDG+FxghuRiuE+Mvivwf4x/Y78djw34Tl8MXVtq8EOs6TKuJLe+a7hMhPJB3cEEcGgD2LU/2htUjt5tY8J/CHxL4j8O2u7fq9u0cccqL96SFG+aROCQeMjpXo/gHx34f+JPhSx8Y+GLhpbC/Qsu9drowOGRh2YHgitXTNNsdM0q10mxtkitLaBIIoVGFWNVwFA9McV4l+xt8vw28QQrwkPjDV0Reyr5q8D86AO2/aF/5Ij40/wCwRN/KpPgF/wAkX8G/9giD/wBBqP8AaF/5Ij40/wCwRN/KpPgF/wAkX8G/9giD/wBBoAn+Nt74T074UeJb7xzpcupaDDZFr+0ico8se5flBBBHOO9Y3iH4w+Gfh/4c8Jabo3h/UtV1HxDZxLoWh2QDTyRLCG5ZjhVVcZY1D+1X/wAm8eOv+wWf/Q1rktd+Hep+Lrb4aeLPh5440vRvHnhbQIns7W+Hmw3NrNbxrKskaneFPHzAH9aAOn8P/H+ZvF2neC/iJ8OtY8GX2tFk0uW6lSe3unUZKCRcbWx2IryTxZ8WPF1p+1VodxD8JvFM/wBj0TULaOxjeLddruT9+g3Y2jHfnmuq174jeNPDus+HbL9o/wCEumHSm1SKHT/EWk3v2m3t71uI2eMhZI89Bwa1vEP/ACeL4Q/7FbUv/Qo6APcrOeS6tIbmW3e3eWNXaKT70ZIztOO46VNRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXKeNSfNtRnjax/UV1dcp41/wBda/7rfzFdOD/jI58V/CZzVeear8Q9V0r4tWHg6e3g/sa8tlDT4PmR3D58vJ6YYgL9WFeh15/4t+HOo+IdY1fVrW/t4JLnTYobB23boLuKQSRyHA+6GVTxzxX0eF9lzNVdrf0/keFiPacqdPe5Qb4sXMPxG1fRbiGIeH9Js2Zp1UmWSdCBJjnGFZtv1U11Ws/ELw1oKeZqc8sajS5NX3bMj7OhQHv97Mi8Vx8fwf1MWcEMmq2rTto89reTYbMt7LIZXlAx90uSfXmn/wDCAePdSujfaxceHo3h8PzaNDAvmTxu7PEdz7lX5SI8EDkZ4zXVKGFk009Fo/Pz+ZzxniIp3Wr/AK/A2n+JNneQwG3t77S5jfQWzx39n8zrIpK7drYwcdcnGOlWrP4m+H77V49LtrXUmimuTaRX/wBm/wBFeYdUD5znIxnGM965DTvhN4lW4M00+n6fafbbW5XT4Lya4iTyg+91aRQQW3gbeny1veGPCXjXw+bTQFvdK/sKyvJLlZlLm6ljZy4jKFdo+ZuWDHipqU8Mk+V/j/V/QcJ4htcyO/rV8LkjWoAD1D5/75NZVavhf/kNwfR//QTXk1v4cvRnp0f4kfU7uiiivBPZCiiigAooooAKKKKAPEbP9mu3tf2kLv47HX1ayngLx6P5JxFetFHG9wGzjJEYzxnnrXqHjzwlZePfBWueC9RIW31uwnsJGIztEiFdw9xnNb1FAHl/7O/wZl+B/wAPh4Tv9eGt6ncXk99f6j5Rj+0SyOSCQSTwu1eT2p0HwVtp/iH428Wa3qEV7pfjPSItIn0/yirLGoYPl88hgxHAFenUUAeC+G/hh+0R8OdFh8D+CPiV4fvvD9kgttNm1nS3lvLK3UYSPcjqsm0YA3L0Apus/suyan8E/EXw0HjBpNc8VX8Wp6prdzb7vNuFmRziNSMLhNoGeM175RQAijaoX0GK8/8Agp8L7j4TeG9T0G51iPUm1DW73VhIkJjCLOwITBJyRjr3r0GigDm/iP4Tl8d+BNc8HQ3q2b6vZvarOybxGW7lQRn868h8L/CT9qDwj4e0/wAM6R8dPC62WmQLbwB/C+5gijjJMnNfQVFAHhmsfCL46eNfBviXwX8QPi1oWo2euaebSE2ugfZzBIWB3kh8sMDGOK0PGHwM128bwh4o8B+MF0Pxh4Q09NNivHtvNtr238tUkimiJ5VtoI5yp6GvY6KAPDL/AOEXxa+Juo6Snxj8ZaIdB0i9i1AaVolg8Qu54jmNpZJHZtoPO1cVr/FL4ReMvEPxB8PfFD4c+MLLRNa0O1uLGSO+sftMFzBNjIIDKQRtGCDXrlFAENmt0lpCl9KklwsaiV0XarPjkgdhntU1FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZ+r6RDq0IR2KOnKOO1aFFVGTg+aO4pRUlZnKf8IVN/wBBBP8Av2f8aP8AhCpv+ggn/fs/411dFb/XK3cw+q0uxyn/AAhU3/QQT/v2f8aP+EKm/wCggn/fs/411dFH1yt3D6rS7HKf8IVN/wBBBP8Av2f8aP8AhCpv+ggn/fs/411dFH1yt3D6rS7HKf8ACFTf9BBP+/Z/xrT0bw7FpUhuHl82XGAcYArYoqZ4mrNcrZUcPTg7pBRRRWBsFFFFABRRRQAVFcPcRqDbwLK2eQX24H5GpaKAKX2jVP8AoGx/+BH/ANjR9o1T/oGx/wDgR/8AY1dooApfaNU/6Bsf/gR/9jR9o1T/AKBsf/gR/wDY1dooApfaNU/6Bsf/AIEf/Y0faNU/6Bsf/gR/9jV2igCl9o1T/oGx/wDgR/8AY0faNU/6Bsf/AIEf/Y1dooApfaNU/wCgbH/4Ef8A2NH2jVP+gbH/AOBH/wBjV2igCl9o1T/oGx/+BH/2NH2jVP8AoGx/+BH/ANjV2igCl9o1T/oGx/8AgR/9jR9o1T/oGx/+BH/2NXaKAKX2jVP+gbH/AOBH/wBjR9o1T/oGx/8AgR/9jV2igCl9o1T/AKBsf/gR/wDY0faNU/6Bsf8A4Ef/AGNXaKAKX2jVP+gbH/4Ef/Y0faNU/wCgbH/4Ef8A2NXaKAKX2jVP+gbH/wCBH/2NH2jVP+gbH/4Ef/Y1dooApfaNU/6Bsf8A4Ef/AGNH2jVP+gbH/wCBH/2NXaKAKX2jVP8AoGx/+BH/ANjR9o1T/oGx/wDgR/8AY1dooApfaNU/6Bsf/gR/9jR9o1T/AKBsf/gR/wDY1dooApfaNU/6Bsf/AIEf/Y0faNU/6Bsf/gR/9jV2igCl9o1T/oGx/wDgR/8AY0faNU/6Bsf/AIEf/Y1dooApfaNU/wCgbH/4Ef8A2NH2jVP+gbH/AOBH/wBjV2igCl9o1T/oGx/+BH/2NH2jVP8AoGx/+BH/ANjV2igCl9o1T/oGx/8AgR/9jR9o1T/oGx/+BH/2NXaKAKX2jVP+gbH/AOBH/wBjR9o1T/oGx/8AgR/9jV2igCl9o1T/AKBsf/gR/wDY0faNU/6Bsf8A4Ef/AGNXaKAKX2jVP+gbH/4Ef/Y0faNU/wCgbH/4Ef8A2NXaKAKX2jVP+gbH/wCBH/2NH2jVP+gbH/4Ef/Y1dooApfaNU/6Bsf8A4Ef/AGNH2jVP+gbH/wCBH/2NXaKAKX2jVP8AoGx/+BH/ANjR9o1T/oGx/wDgR/8AY1dooApfaNU/6Bsf/gR/9jR9o1T/AKBsf/gR/wDY1dooApfaNU/6Bsf/AIEf/Y0faNU/6Bsf/gR/9jV2igCl9o1T/oGx/wDgR/8AY0faNU/6Bsf/AIEf/Y1dooApfaNU/wCgbH/4Ef8A2NH2jVP+gbH/AOBH/wBjV2igCl9o1T/oGx/+BH/2NH2jVP8AoGx/+BH/ANjV2igCl9o1T/oGx/8AgR/9jR9o1T/oGx/+BH/2NXaKAKX2jVP+gbH/AOBH/wBjR9o1T/oGx/8AgR/9jV2igCl9o1T/AKBsf/gR/wDY0faNU/6Bsf8A4Ef/AGNXaKAKX2jVP+gbH/4Ef/Y0faNU/wCgbH/4Ef8A2NXaKAKX2jVP+gbH/wCBH/2NH2jVP+gbH/4Ef/Y1dooApfaNU/6Bsf8A4Ef/AGNOSfUWdRJp8aqSMsJ84HrjFW6KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACioZry0t/8AX3Mcf+8wFUZvEekxcfaN5/2VJosBqUVz03jC3GRBau3+8QKozeLb9/8AVRRxj86fKwOvorg5tc1Sb7124HoOKjtdUvba4WcXDtgjILZBFPlA9AoooqQCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACori5gtYzLcSqijualrkPFsztfpAWO1EBA9zTSuBqzeK9NjyIxJIfYYFUpvGMh/497NR/vtn+Vc3RV8qA1pvE+rS/dlWMf7Kj+tUZtRv7j/XXcrD0LnFV6KdkAUUUUAFFFFABQOtFA60AelDpS0g6UtZAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcb4r/5Cv/bJf612Vcb4r/5Cv/bJf61UdwMaiiirAKKKVVZztVSSewFACUVch0fU5/8AV2UuD3K4H61eh8KanJ/rDFF/vNn+VF0Bi0V08Pg5BzPeE+yrV2HwxpUX3o3kP+01LmQHF0DrXb3ui6b9ilCWqIVQkEdQRXEDrQncD0odKWkHSlrMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArjfFf8AyFf+2S/1rsq43xX/AMhX/tkv9aqO4FfSNGl1UuVkEaJwWIzzW7D4RsU5lmlkPpnApvg//jzn/wCuv9BW/Q27gZ8Og6TD92zRv9/5v51djhihG2KJUHooxT6KkAooooAKKKKAIbz/AI9Jv+ubfyrzoda9FvP+PSb/AK5t/KvOh1q4gelDpS0g6UtQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVxviv8A5Cv/AGyX+tdlXG+K/wDkK/8AbJf61UdwNPwf/wAec3/XX+grfrA8H/8AHnN/11/oK36T3AKKKKQBRRRQAUUUUAQ3n/HpN/1zb+VedDrXot5/x6Tf9c2/lXnQ61cQPSh0paQdKWoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK43xX/yFf+2S/wBa7KuN8V/8hX/tkv8AWqjuBp+D/wDjzm/66/0Fb9YHg/8A485v+uv9BW/Se4BRRRSAKKKKACiiigCG8/49Jv8Arm38q86HWvRbz/j0m/65t/KvOh1q4gelDpS0g6UtQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVxviv/AJCv/bJf612Vcb4r/wCQr/2yX+tVHcDT8H/8ec3/AF1/oK36wPB//HnN/wBdf6Ct+k9wCiiikAUUVDc3dtZp5lzMsY7ZPX6UATUViy+K9MQ4QSye4XH86j/4S+w/59p/yH+NOzA2Lw4tJs/882/lXnQ610GqeKBdW7W9pCyBxhmbGce1c+OtXFWA9KHSlpB0pazAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiioLy9t7GEz3MgVR09SfQUAT0Vy9z4vkJItLYAdi55/Kqh8Vaqe8Q+iVXKwOzri/FDq+qttOdqKp+vNNfxNqrqV81Fz3C81mO7yOXdizMcknvTirAdV4P/AOPOb/rr/QVv1geD/wDjzm/66/0Fb9S9wCiiikBXv7tLG1kuX/gHA9TXBXd3PeztPO5Zj09h6Cuq8WFhpqgdDIM/rXH1cUAUUUVQBQOtFS2sTT3MUKjJdwv5mgD0UdKWkpayAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuH8QX73l+67j5cR2qP5mu4rzzUI2ivZ43HIc/zqo7gV6KKKsAooooA6zweP8AQpj/ANNf6Ct+snwzbNb6WjMMGUl/w7fpWtWb3AKKKKQFXU7IX9lJbHgsMqfQ1wU8EttK0MyFWU4INej1UvtLstQXFzECezDgiqTsB5/RXUyeDoScxXjKPQrmmr4OT+K+P4J/9eq5kBzFdH4Y0h/MGo3CFQv+rB7n1rSs/DWnWrB2VpWHQv0/KtUAAYAwBUuXYBaKKKkAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5/xFocl03220XMgHzr/e966CimnYDzZ0eNtsiFSOxGKbXok9laXP8Ar7dH9yOar/2FpH/PjH+tVzAcGAScAZNbOjeH57yRZrpCkAOcHgt7V1EOm2Fucw2kan6Zq1ScgEVQoCqAABgAUtFFSAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUV4145vPGfw28Sv8A8InG2oW3jeZbK0jnmythqTD5ZOTnyioJIHdR60Aey0V4pot5490ix1zSvB+pWctl4LPk3UupK8s+qXIjE07bs/uwS5A68+grpPCfxLv/ABPLr08dvFFb2Oj2WoWyEfMJJUlLqx7gGMYp2A9HorzjVPEWp678BR4qlYR3+oaBDev5JKASvGrHb3AyaxtB8X/ELw7NpFh4ludIvYNT0CW9tgmYPIlhiVgskrHDKRnLHGDSA9gorwvw/wDFbxvqGrSaLDrOj61PdaLcajbS2dlIkEU0WCYlkJ2zAhsblP4Vrat8a7qy0hPENnZxT2lj4dl1fUI8c/aMhI4Qf4cvv59ENOwHr1FeA/8AC8fFNlb38S3mn6zP/Z5u4JYbCa3jt5lkRTE+8fMCH4bg8Hiuz8P+IfHL+K7fwp4tu9Omi1zRZdRtZLOFo2tmVo1ZGyfm4k4PHTpRYD0uivJNOtPG2hfFTw/4WTxTHcaRZ+H4xLHLAS8/l/Izls/fLDOfTitz4oeLdY8OzaXZaVruk6QL1pDJcXiGeVto4SKBSGkJ7kdAKQHf0V4x4c+KXjbxtpnhvStE+wWWs6oL57u7uLd/KjjtZjESsJw25yM7SRt71l6B4v8AH2malq3h1prKTxFrPij+zop3LNbQItuZXkCHnGxGwvHJ/GnYD3uivAL3x54w+HviHxjdeKLy0vbyKPTbW0liV1t2MgbEhi5K4AOQM5IqxafG7xKTceH7aSy1fU7uezttNv1s5bW3Ek8yxESK4z8m4NwTkA9KLAe70V5R4afxxa/GWXTPF2qWl6q6BHJDJaI0UbgzSZLRkkBgQRnJyAPpTvin4+8SeHNXaw0bX9H08Q2LXSwy27Xl1dOOiiGM7lX/AG8HrSA9Vorxaw+I/wAR/GCyT+Gm0nToYfDljrjG5haUl5oi5iGCOOOvb0Naum/Fy9tlj1TxNBBBpt14ck1iFkHPmwf69M98g7gPRTTsB6pRXC6v4n8W6D8JD4q1C2tR4gisIZ5odpESzuVDJjrgFiPwrmbfxD8Y7vxPH4STVPD8ct5pX9rrdm1ci3UMqmLZn5yTIvzZHAPFKwHsFFeY/Dn4ma14vv8AQre/treFdR8PR6lOsYJxP5jo20/3fl4FcrffGDxsdO0y/mu7HQ7C5F75uqz6dLcWwlimKRxPs4iBUElmOOKdgPeKK8XvPibfaZfT+IpYbG6n/wCER0+8X7LcmSCS4muJUARgdpTcQQwGSK7fwkfiZDqYj8Xy6Ve2Fxa+cs9mhia3myP3RUklxgn5h6dOaQHY0V5D4m8S+L/DfxV1e9l1iCXQ9P8ADceoiwEJ3N+9lUDdn7xZfvemB2q5pPjD4gaXqXhe68XSaXcab4skEEcVpEySWUjxNJGCxP7wELtJ4wTTsB6lRXI+J/Fl74Z8WaNb3nlDRNThuI5JSvzx3KAMoz6Mu7j/AGTXIaV48+IXi2+0/QdFfTdNury1uNVkubmAyLFarKI4kCAjczbgxORgUgPXaK8s8JfE7xBrHiPRvDWqWtrFdedq1lqZiyVaa0dEDxk9FbcTg+uO1ZsnxM+IGq67beHPD0GmLcXusahp6zXCNshighVw5xyTyeO5wOOtFgPZaK5Pxz4i1jwnpWl6rH5EsS39vBqRKHHkvlSy+nzlfzrhrD4weJNTn1TToLS1S6m1mytNGJUkSWssxjkkbnkoEkY49BRYD2WivBrn4i+KtFspTYPDpmnyeINcgutVlspryK3MV46xq6qcoGAPzEhRjirEGv8AjrxV408MTeHNf0dLi98OXslxcxMbmzIW4hAkRAQGJ4HJGNx9KdgPcaK4zwL4n1TxX8Pm1jV44Y9Qj+2WlwYMhDLBI8TMueQCUJH1rzPRfFvibS9J0a40XTpNX1NPCmrXkELO7PNLHdIFXGfm6+hPGBRYD3+ivALz4i+Mte8F+JU0zxto095YW8E4kjs3trq3LPh45LdzvXthz15GK9p8J/2ofDOmNrV3Hc3rWsbTTRpsV2IzkDtxilYDWooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsPxJ4TsvE11ot3eXM8TaJqCajCI8Yd1UgK2QePm7YNblFAHCa58K4tU1PVb7TPFWraNBrwX+1bWz8ry7ohAhbLoWRigCkoVJAqG/+D2nyXckuieI9U0W1u9Oi0u9tbPy9lxbxghRllLI2GYblIPJ5r0Gii4HNxeBtOh8AwfD1bu5Nlb6dFpqzEr5pjRAoY8Y3YX0xWf4l+FeheKrS1sdSu7wQ2ulXGkBY2Ub4povLYk4zux0x3rtKKAOD0b4XXGneItL8T3/AI21fUrvSraSzjWaOBI2gfb8hVI1GcqDuHzH1xTtK+D3hTTNL8R6M/2i6tPE25blJnH7uMhv3cZABVQXcjuCa7qigDgH+FDahY3Nl4h8ba5qwmtltImnMKmGMOGyAiAMx2jLMCfeuh/4RCxHiTTPE32mf7Rpeny6dHHxsZHZCWbjOf3Y6HHJreooA57UvB0V94v07xjDq13aXNhA1q8MQjMdzESTtfcpI5OcqQfeqninwE+v6/YeJtN8SX+jajYW8toJbaOGTfDIVLKVlRgOVUggZ4rrKKAPNrD4KWekWNlDo/i3WLS90y7u7iyvx5TzRpcPvlibehEiljn5wT70sHwT0u3spwPE2sNqkuqLrMeqM0Znhugu3co27SCuQVIIwSMYr0iincDzmP4L6dM2s3eteJtX1PUNb+zvLeSmNHhkh/1bxBFCoR0wBj25NWbj4Tw6rp93B4h8Waxqd7cNBJBfu0cUlo8L743iWNVRWDAEnbzjnIrvaKVwOM8OfDh9G8UzeMtU8WaprWqT2a2LPdLEiCNWLAKkaKq8seg569aj174YprHiG+16z8U6ppn9rWkdlqEFsIitxEm7ADMheM4ZhlCp5rt6KAOH8IfCrTfCNlNaRazf3hm0mDRy84jBEMKFEI2qBu2nGfauf8UfDf8AtF/Bvgmz028l07RLtbq41GRlCmBQ2+FsY3eYG2kYxgk9q9YoouBleJ/D1r4q0G78P3k0sMF2qqzxY3ABg3GQR2qtb+D7G28SxeJ0uZzcQ6YdKEZxsMZdG3dM7sxjvjk1vUUAedW/wZtNLg0ZNA8Wavpk+kWTad9oiELNcW5YttcMhAOScMoBGetGn/B86BYWdn4Y8c65pr2scsLyfuZ/PSR953pKjLuB6MAD716LRQB55ZfBDwjZae2lJLePato0OjGNnH3I5XlWXIGQ+9yfTgcVr+GPAb6DqY1jU/E+p65dxWpsrd7wRqIISQSFWNVBJ2rljknHWusooA5TXvh7p+v+JD4huNRuoxNpp0q7tFCGK5t9zsA25SwIMjcqQaz9D+FUWl6npV7qXirVtYt9B3f2VaXfleXakqUDZRAzkKxUFyxANd3RQBwHxh0C/wDF+jWXhWw0q4ma8u45GvEYKlmqn5mY5zkqWUAepq/rXw5t7y70zVNA12+0HUdKtDYRXNmsbl7chcxukisjDKqRkZBHFdhRQB55/wAKc0+0tNK/sTxJqunanpc9zc/2mhjknuJLhg07SiRWVtzDPTjtirHhj4R6P4Y1Cy1ODWNSu57K7u70NcOrGSS4jCPuwo44yMfy4ru6KLgZfifw/Z+KtAvvD2oPIlvfRGJ2jIDLzkMM9wQCPpXM6V8IfDuk614c1uC7vGm8N2ktrAjsu2YuCDJIMcuNzYIx9413VFAHBn4VfY2a48PeMNY0m6a+vr1pYhFIr/apmldGjkRkIDMdpIyB3qfwl8K9E8IajZ6rY3t3LPa2dzaMZSuJTPKkjyMABhtyDgYGCeK7WigDC8N+EbHwzoM3h+0uZ5YZp7qcvJjcDPK8jDgAYBcgewFc6vwc0NbW1tU1fVI/sel3WlRSRSiOQJPKspkDKAQ6soxjj1Brv6KAPPf+FQwX76jdeJvFWp6xe39gNNW5ljgiaGAMWG0RIqk7jnLA10Wg+F73RZ7SWfxVqmoJa2IsvJn8tY5CGBEpVFA3gDbxgYzxmugooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD//Z\u005c\u0022}\u0022);\n+\tsocket_status.send(\u0022{ \u005c\u0022RequestType\u005c\u0022:\u005c\u0022SendImage\u005c\u0022, \u005c\u0022RequestID\u005c\u0022:\u005c\u0022788346414\u005c\u0022, \u005c\u0022toType\u005c\u0022:\u005c\u0022toUser\u005c\u0022, \u005c\u0022toID\u005c\u0022:\u005c\u00221036\u005c\u0022, \u005c\u0022fileType\u005c\u0022:\u005c\u0022image/jpeg\u005c\u0022, \u005c\u0022blob\u005c\u0022:\u005c\u0022data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAHgAoADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAopNy/wB4fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/AHh+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv8AeH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/wB4fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/AHh+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv8AeH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/wB4fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/AHh+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv8AeH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv94fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/wB4fnRuX+8PzoAWik3L/eH50bl/vD86AFopNy/3h+dG5f7w/OgBaKTcv94fnRuX+8PzoAxst6mky3940UmRQA7J9TRk+ppKKAAFh/EaCWP8RoooAXJ9TRk+ppKKADL/AN40Zf8AvGkwKMCgA3N/eNG5v7xoI70Ad6AF3Mf4iPxpMsP4j+dHSlxmgBCWH8R/OlBb+8fzpCM96OgoAVWb+8fzoLN6n86OBTSc0AOy3940Zb+8aTg0YFACkv8A3jRlv7xpNvvSYx3oAXLn+I0Ev/eNAwOc0YBNABubHU/nSbm/vH86VaMc5oATc394/nTt3+0aTb70baAAl8/eP50uW/vGk20baADc3940B27k0babQA/Lf3jRlv7xpMAdTRgHpQA4lj/EaTLf3jTSMUvFAC5b+8aMt/eNJjHNGAelAC5b+8aMt/eNJxQSD3oAXLf3jRlv7xpNvvRjHegBSW/vGgFv7xpuB60YHrQA7Lf3jRlv7xpAQO9IMDvQA7Lf3jRlv7xpuM96XbQAuW/vGjLf3jSfLR8tAC5b+8aAW/vGkAFJgetADst/eNGW/vGk2+9IAPWgB5LH+I0mW/vGmkYpeKAFy3940Zb+8aTGOaMA9KAFy3940Zb+8aTigkHvQAuW/vGjLf3jSbfejGO9ACkt/eNALf3jTcD1owPWgB2Wz940mWzjcaP4aMDFAC5b+8aPm/vGmjA70pGaAF+b+8aPm/vGm4HrRgetADst/eNALf3jTcD1pQPegBQX/vGjLf3jSAClOO9AAS2fvGgFs/eNJgYzRgYzQApLf3jQS3940hA9aQjHegB2W/vGjLf3jTcD1owPWgB1FFFABRRRQAUUUUAGc0UnzUtACZFGRRk+lGT6UALSZx2paMigApMr1paTJ9KAA57UDPelpPmoAMCjAoyKMigA+Wj5aMn0oyfSgBcYowKKKAEwKCAO1Lz6UhJoAMg0ZApfwo/CgBMCjApAT0FOoATAowKWigBMCjgUZPpRk+lAAeDmlpDycUtACfNSgGkzntRz9KADn1oOR3oyBQSD3oAXoKRTnqaXp1ozmgAooooAKKT5qPmoAXPGaQEmlBzScCgAwfWjB9aMijIoADntQM96BnvQc9qAFpP4qXPOKOM0AITilHNHtRQAnzUoBpM57Uc/SgA59aDkd6MgUEg96AF6CkU56ml6daM5oAKKKKACik+aj5qADqOKFpQc0ZFACEZpQMUgPrS0AIc9qBnvQc9qBnvQAtJto3UtACE54FKOKAc0ZxQAUUm72o3e1AAc9qTBFKCaDntQAtFITigHNACg5oJxQBigjNAATQPeikyKAFoozijOaACg57UUUAJgUv4Ugz3paAEwKMCl59KOfSgAooooATgUGl59KKADgUmRS0mT6UALRwKKTJ9KADg0vAoOR2pMn0oACfalyKTJ9KUnFABRjFFGRQAcdBzQeODwPSuN+IXxa8EfDLTW1DxZq8NrGASFJyx/Ac189aj/AMFFvhRaXTQ2K/aVU4D/ADCgD635AyRj3oPTI596+evh3+218HvHl8mlx6wlrdyHARwcZ+pr362vrW8tFvbW4SSJ13KynIIoAm45/hPal6ngY968W179q34XeHfGjeBtQ1YDUldY/L2Hqa9lgnS6hSdPuSorg+xGRQA89KWkPSloAQDFLRRQAc+lI1LnFITxQANSjgUUUAIc8sB16ilHp+leZ/Fz4++Bfgy1jH4xvxbPqG7yvlJzt+ldN8PfH+hfErw1beKfDtx59ldZ8t8Yzg4oA6XHt06UuOpHJpMkHPf0rB8ceM9H8A+HLnxNrkvlWVqAZG69aAN4nC5xk96Mc4HXtXlvwq/aJ8AfF2+ubHwjqQmltSBINpHX616iB6jPvQA7A60UUhGaAA57UtIc9qWgABzSYpQMUZoAQ9KWkPSloAQDFLRRQAc+lI1LnFITxQANSjiiigAooooAMYoPNIc9qWgAHSiijPOKACiiigBPmo+ag57Upz2oATrQDmjpQBigBaKKKAEBz2paQYzSk4oAQnFKeKQjNKeaAEY0ueM0YzQelAAcnvR+NJxnOaOtAC4zRSEZpaACiiigAooooAKKBzRQAUUUUAH40UHHeigAopMCjAoAX8aPxpDjvScetADufWjn1pDjvQMdqADB9aMH1oyKMigA59aXn1pDjvSkjvQAgyc4rmfiR40sfh94O1LxPqMgWO0iJBJ744/Wum6jBr5Z/wCChOuXen/Bi6s7aRkW5xvIPo1AHxBdah8R/wBrj4vnTo7u4aGe4ZQoY7Y0B/LpX2j4Q/4J4/CnTdESDX4ft96yAyS5K849K8x/4Ji+FbSX/hIvEVzErzr5XkuRyvXNfoGAoHAz70Afl5+1T+x3cfBy2HjPwJPM2nodzxxAgxc8c9TXuP7Anxn1/wAV+Hb3wT4j8+STTY8RSSggnIPrX2B4h8N6N4p02TStbtEubab78bDg1z/hv4V+BfBBnu/DWix2csincy9+KAPzF+M8m39rm4ZjhRdxdT06V+j+rfHf4X+BrCytPEfii3t5fs8YKr838I9K/MH9qI6j/wANIawulyFblp40jYDueK+h/CP7Auv+OvDCeJfG3jO4i1O6hDrEyltvHHf0oA+1vBnxW8B+P4xJ4X1+C6B7AgH8utdaCBkk5B6e1fjday+NP2avjpHoEGq3BksrqOMqWO11cgdM46Gv0i/aI+Nn/Cqvg5/wk0L41G6tIzAueSWUZP60Ad74w+MHw+8CKW8SeIbe229VDBiPwFZ3hX4+/CzxpdCz8PeKLeeU8YY7f51+dfwU+A/j39qnVr3xb4p8Tz2tk8m4SsxIcEnjGe1bHx6/ZA8SfAnSR448G+LJruCyIeXYSu054780Afp7G6yrvQh1PRgeKz9a8RaN4dtGvdX1CG0iQZLO4Gfzr5i/Yq/aIu/iN4GvNK8S3e/UdDiy0jHlxg/0FfLPx9+LPjv9oP4vt4A8MXs6WInMMMUTEdPvHIoA+/JP2pfgjHfGwk8YwifO3btOM/WvQ/D/AIr0DxVbC70LU4LqMjIKOCfyr4bsv+CbUkvhcXdx41mGpvF5m3YchsZxnNeS/BzWfiz+zv8AGhPC98uoXGmpOIrhSrMrg8Kc84oA9N/4KiFheeEDuwczYHr0r6E/YZOf2fNAYntJwe3zV86f8FN5zcDwRc7cNMkjn2yAa2vhh+0h4f8Agn+y3owa5SbWJ45RBbhuc7utAH2jrXxE8HeHbr7Hq+u20Ew6ozjNeTftU69pev8A7P2v32lXAmhZF+ZenWvjP4OfCf4lftUeO38ceKdQu4tIabe77yFK54AANfX/AO0f4N0rwN+zTq+g6OhjhtokVcsWJOeetAHy/wD8E6NWsNI8R+Ib7VLyO2hjZSWdgB39a+1Zf2nfgvFqR0mTxhCtyG2425GfrX5UfAnwN45+JnimTwV4TvJrW3vpMXUkf8IBr6s8Xf8ABOO7sfC8moaL4xmn1OCIyFdpBY4yec0Afd+i6/pHiG0F9o2oRXMDAEFGBq+8ixxtJKQEHcnFflj+yj8a/GPwg+K8fw78V3s7afLMYZklYnZjgdfU19O/tw/tEX/w08I2eieGLny9Q1qM7ZF6oMD+hoA9y8VfHn4XeDJWt9f8UW8MgOMKd38qd4T+Ovwy8bTeToHii3mc8BWIX+dfnz8AP2Q/F3x7sH8b+L/EN1Z2t0S0buWbfzzxnioPj/8AsneMv2ereLxr4T8Q3V5ZW7b5HQlAnPHGeaAP1Gmu7eC3N08gMaruLA8Yrmbb4p+BLu8TT4fEVs1ySVEe8A5/Ovn/APYt+Ok/xm8DXXhjxROZb+yjEUjE8sDx/KvmD9rj4NeKfgj8QI/G/hm5vP7Knm85cSMRHg5PfuaAP1Ha4hihNzJIqx7dxYngCuWh+KngWe7+wQ+ILd7gttCKwJJ/CvhLxj+3edT+BltoemztH4luofJlYdUxx+oq5+wr+z7rXiPUh8VfGU939n3mSzSSRsSEk7uM0AfoYjh1DL0IBFOPtTY0WNAi9FAApSaAFOT3opOBRkGgBaKKKAAmijIoJxQAmD60YPrRkUZFAC/jQOKQAUvAoATPGaM8ZoPSg9KAFooooAAc0E4oooAKKM5ooATgUvBpODS8CgAopMijIoAWiiigBM84paT+KjHOaAAUZ5xS0e9ABRRRQAUUUUAJ81HzUmB60YHrQAvzUfNSYHrRgetAClvSgZ70tJkUALRSA5oJxQAtI1GRQT2oAGoPShqD0oAAcmj+KgHn60fxUAB7YoPSgnmgnigAB4znrXzR+3v4TvPEHwS1C7so2lktApCqOeWr6XyNpBXkdKy/Evh+x8T6Jd6HqcKvFdxlCp5HSgD8+f8Agml4/sNH1vXPB+ozrHPfmNbdWOOVzmv0ZJ6gYr8mPjT8BviX+zf8Qz4u8JJcPYrMZra5hUngnJGB+VereEv+Ckuv6XoyWPiXwXNdXUKBfOZypcgemKAPsT9oX4sR/B/4dX3ilNjXUQHkxFgCxzivF/2Vf2pfFvx31nVLLUtNMNvZr97dkcg18ffFn41fFX9qjxFbaLY6Rdw2Uj7YrRVJVQfVsV94/slfs/j4LeAWfU4h/a9/FuuOORxxQB8MfGlFk/a4uFcAj7ZD1/Cv1f0dVTRbJEGB9mj/APQBX5UfGWyvH/a2uHWznK/a4fmEZI7d6/VjSfl0ezXv9mj/APQRQB+U/wC2QAP2oJ8Lg/bLbt7ivb/+Ch73q/DXwWsDN5JtB5uOn3VxXi/7Y1jezftNzSRWk7j7ZbfMsZI6r3r7e/aK+DUvxf8AgfDpmnW+7Uraxia3Hf7oJ/lQB8Ufs/eG/wBrDUvBFvP8JrnGjHOxVKZHPfPNdx4q+FX7c3ifRbjR/EtwJrCcASI7RqPzrhPgN+0J45/Zf1a78I+JvDt1PYb9vlEECPB7HHeu5+Nf7dPib4laGfCXgHw7dWcl5hWmj3E5zx2oA2P2afgB8T/hND4l1XxBbRwQ3FuxPlzq+fkPYGvKP2NTbP8AtMRPqpUuLqfbv79fWvrb9jb4Z+OrHwXfav8AEW5nkl1iLEcMpJ2jBH9a+Tfjp8LfHv7OvxjPjnw7p85sTOZraWJSQRnLdKAP1aBVUBBBGPyFeb618Qvg1ZeJX0jVbywGrKyqytEpbcenNfJw/wCCj8p8IG1bwfMdX8nys7jndjGeleU/s7/Df4h/H74zr478QxXkVgJ/NuJX3KMdVGKAPRf+CoLo7eDnh6MsxXHcYGK+VdI+C/xL8TfD6bx3a2E8mjaeAyHdkcnnAr6u/wCCmunXIbwXb20EswgWRPkQnoAO1e7/ALHPh201j9mrS9I1awGy5ilR1dMHknrQB5F/wT7+PdlNp/8Awq7W3igurc7bbIAL85NfQX7YRB+A2vt1BROfxr8+/jp8MvFP7N/xmXXvDkVwtq9x5ttJEhIIzlhxX1r45+KsPxf/AGTdR1eCGUXawRrPEUO4EHFAHj//AATVOlDxTr3nbBdl18vPXvnFfovPsMTBz8m07s9xivxa+Cni/wCIPwo8Uv448PaReTW9lJm4QIwyCcelfVnij/go7cXPhOW10nwjPDqs8Xl5ycqcYJxigDwj9oQRp+1tfroG3aLy32lOnUZrr/29/tv/AAmvhtrzd5XlQ7M9Purmsz9lb4Q+MfjV8YY/Hviayn/s+GYzXM0qkbs8r1r6l/bh/Z51H4leDrPXPDFoZNQ0OM7Y1HMg4/kBQB67+zCbD/hTegiwKeWYjkrjk1T/AGsf7OPwR13+0dhTyxgN65r4c/Z7/a68W/AnTj4H8WeHrq7sbViibwy+Wc89uai/aF/ay8X/AB/ij8FeEvD11a2M7BHCBm83J47cUAdD/wAE2zc/8J9riwqRbiQbj2xzivq79sXxF4E0j4TalB4yjhla4TFvG33ic9u9cN+x78G5PgT8Or3xj4xgMF5eRCaRCMlcAkfnXyf8cPHnjX9qD4vw+G9Ftbs6atx5dvFsYKFzhjQB876W9tZ67bajfWbyaeLoOFIIBTf6/Sv2n+Avinwh4q+G+kah4N8lbIQhfKTqpAAOfxr5/wDHv7E3h6b4EW+haPZr/bunW5lS4A+ZifmIr54/ZA+NXiT4JfECTwL4qhu00u4n8ly0bERkHA7dzQB+poPpSDOeaitLqG+tormE/LKgcfQjNS8YwaADvR3o70d6AAnFHQUEZpaAAc80HnikJxS4xQAU3JpQc0EZoAU8UgNKeaQCgA3UZFHy0fLQAZFGRR8tHy0AGQaMgUny0fLQAuRRn3pDtxSjaaADvR3o70d6ADn1oOR3oIHrRgHpQAEkDrQARzRjPNAAoACcUtITiloAQDvS0UUAJ3o70d6O9AC0UUGgBAeaCOc0mBig4xQDVg5zkUvPrQMdKBjPFJK/UNWHA4ozQwxQRTt5hdCE0ueKRqXHFHzC6BaAecYoFIetO6DQUkjvQcgdaQ896OtK6DQXIHSjIoA4pB1o1DUM0ZoHWlajUNRaMUh6YoWlqBS1PRdM1u2az1OyhuYmGCsiA/zrzLUv2V/gjrF013f+DIWlY5JDkD9K9ZODgmg4DYLZFPUZyHhL4SfD7wOAPDvh62tj2YoGI/E115A/1eARjFKeRjHSj5cZzk+lOzE7HJXnwr8DX+sHXbzQoJL1iG84gZyK6tFVVWNQAEGAPQU8YIwBSdyCdxPalqLc5TWvhd4I17UjrOraFBPeFg3mMBnI6V1EUccUaQxgeWi7QuO1PHXnj0o3EfL2FFhnGeLPg98PPG0vmeI/DltPJ/eChT+grO8O/AL4U+FrsX2jeFreKVTkFhu/nXooOBn0oJzyOlFgGRxRQxpHDGqIvACjAFZ+u+GtE8SWr2OuWEN1E4xh0BxWkOufXtRz0zg0rtB7zPK3/Zf+Cz3f2tvBkPmk7t27jP0r0LQvDei+GrNNP0TT4bWKMYARAP1rSIz06+tKD2LZI600nILM57xR4C8LeMjC3iPS4rtrfOwuM4zWlouh6X4c0+PStHtVt7SP7iKOBV7nlg2c0vG0ZGCKAOf8TeBPCvjARf8ACQaPDeeVnbvUZGarWXw08GaZpU+i2mjRR2VxjzIh0P4V1HGN4GCetB9hgetAHJad8KvAWmW1xaWfh21SO5H71SgOf0rmpv2Zvgxc3IvJfCEAk3bg2e/0r1IEgbs5IoXptxwaAMzQfDWheGLJdP0OwhtYIhgBEAzWk6LIrCVAynjBGQaXg8E5pM8H+8egoA4PxN8C/hj4vuTda74Xt5ZW5LKoX+VL4X+B/wAMfB9yLnQfC9vFKvIZlDY/MV3mcDBPTtS8AdeT2p2sw0XQpalpOn6rZNpl9CJLZxhkAwMVzuifCjwJ4d1AappPh+3guUJKOFBPPWuu7YB4WjqcjqaSTb0YIR1V1MTKCMYxXGXvwe+Heo6k2qXXh23a5dg28KAcjvXaZ6ZOcUDjhjgetF0O5Fb20NpAlvAMKgCgegFSnOQc0ZA+ajjv3ouguLRSAYpScUm3HYQhOKWjIFFHqAhGaWk3Uuad0AUUgOaDzTugFHFNPWnZpo60XQCnpQOlLRRdAIM96Dk0ZFGRS0QW1uGD60YPrRkUZFK6YO973A9KAMUtJupgAOaCcUZA4oPSgBc0mD60ZAoyKADJ9KMn0oyKMigANABpcZpuB60ALg+tGD60ZFGRQAvPrRRkUUAJg+tGD60YFGBQAHPagjNGBQCACc9KG1b3gbSXvBjvnHvRjuR+NeX/ABB/aE8BfD+8bTr7UUe7X70YycfiK4cftneAedqcDqea46mMoU92cVTMMNSdnI+iM/7X6UZ/2v0r54/4bO8Bdk/nR/w2d4B/ufzqf7QofzELNMK/tH0OcHvQMDvXzv8A8NneAv7n86P+GzvAX9z+dH9oYf8AmD+1ML/MfRHPrRz6187/APDZ3gP+5/Oj/hs7wH/c/nR/aFD+YP7Uwv8AMfRB3HvSYP8AEa+eD+2d4C7J/Omy/tpeAIo8uvT61rTxtGbsmH9qYX+Y+icn1oHHevmj/huj4c/3P50f8Nz/AA6/ufzr2FleKkrqI/7Uw38x9L4PpQQT2r5nP7c/w4/55/zo/wCG6Phx3jP60/7KxX8of2phv5j6ZNA4/wD118zf8N0fDf8A55n9aP8Ahuj4b/8APM/rR/ZWK/lF/aWH/mPpgcUdTXzP/wAN0fDf/nmf1o/4bn+HHaM/rT/srFfyh/aeG/mPpnnOB0pAMn6V8zn9uf4c8/uzx9asWf7bnw6vrlLaKP5n+tH9lYr+Ul5thIK8pH0jn/apPoa8NH7WHgkgEJ/Oj/hq/wAFdk/nT/snFP7Bxf6yZbF2lUPc8H1owfWvDP8Ahq/wX/d/nR/w1f4L/u/zo/sjF/yh/rLlv/Pw9zz/ALX6UZ9/0rwz/hrDwV/c/nR/w1f4K/ufzpf2Ti/5Q/1ly3/n4e5k+9A69a8M/wCGsPBX9z+dH/DV/gofwfzprKMU/sjXEuXJfGe5kkKTnk0AgMQK8MP7V/gv72z+dXNL/ae8Iatex2FvH+8f61FTLMVBX5S6Gf4CtKymez5HrRn/AGv0rhB8VtNIBFu2D9aX/haunf8APu361wNW0Z7SaaujusH1owfWuE/4Wrp3/Pu360f8LV07/n3b9aBnd5/2v0oz/tfpXCf8LV07/n3b9aP+Fq6d/wA+7frQB3fXvSH1zXC/8LV07/n3b9aP+Fq6d/z7t+tAHdHjk85pQDjrxXC/8LV0wHi3bH41R1T41aJpVv8AabqEhR9axxFanhoe2qOyNKVGVeXLBHpBDY4NAz3NePf8NI+Ev7v86P8AhpHwlj7v868KXFWWN6VLHpvIsdNXjA9hyfSjn0rx7/hpHwn/AHf50n/DSXhP+7/Oj/WrK/8An4P+wcd/IexfhRz6V49/w0n4U/u/zo/4aT8J+n86P9asr/5+B/YWO/kPYefSgZHavHv+GkvCfp/Oj/hpLwp6fzprivLLXdQP7Ax/8h7CB37mgnHJPSvHz+0l4U/u9PrWN4j/AGtvBHhu3FxdD5W+taUeJMtxMuWNQqPD+Pe0D3nPtRn2/WvmA/t2/Dj+7/Ok/wCG7fhx/cP616Sx9D+Y2/1WzP8A59M+oM+360Z9v1r5f/4bu+HH9w/rR/w3d8OP7h/Wj6/Q/mD/AFWzT/n0z6gz7frRn2/Wvl//AIbu+HB/gP60f8N3fDj+4f1p/XqH8wf6rZp/z6Z9QZpMj0r5g/4bt+HH9w/rSj9u34b/ANw/rS+v0P5h/wCq2af8+mfTxzwc8GlIGeelfMcP7dfw2aRUYbVY8nnivZfhx8X/AAZ8TrP7V4Z1RLgoBuToR+dXTxdGo7JnLisix+DhzVoWR3GBRnFIDmlxmult9DyNluIRmgDFAIoJxQAfNR81Hy0fLQApz2oGe9J8tHy0AAOe1BOO1G6jdQAZ5xR/FS55xSfxUALRz6UnzUc+tAC0UUUAFFFFACcHLetY3i6+k07w7f3kJ+ZIWI/I1skk4OOBXPeP9p8I6mB3gb+RqKvwMyry9x+h+ZHiPUr7Xtcu9Sv5WkkkmcfMc9CapfZMZIA5q3sBvLknn9/Jj/vo1YWMAZ71+e1qj52flderLnkjM+yn+7R9kI6CtTyh6UeUPSsXOSdkY+0ktDK+yn+7S/ZT6VqeUPSjyhjOKfPJD9pK9rmX9k9qPsp9K1PKHpR5Q9KFO60H7WWzMo2xGeKo6pBttJDjtXRGNcEkVl62irYyYHQV6GVyviYJ9wjVu7HExQbh071L9m5HFS2Y+Q8d6thAa/pXDQjKlGy6IcqjUtWUPsgoFoK0PKo8ut/ZQWpPtJt6Gf8AZBR9kHpWh5dHl0eyXQftGt2Z5tKPsnPStDy6PLpuiJVuhnG268Ve0CDbq0P1pzR8ZqxoqY1WH60vZR7GGJqP2TPSoLYsi8dqn+xHd0q1Yx5iX6VdEIHOKtU0fn9WvJS3Mj7H7Uv2L2rW8kelHkj0o9mk0kiPrGm5k/YvQUfYj6VriIelHlewodKKshfWJRd4syPsXtR9i9q1vJHpR5I9KPZK6G8RJK9zHNlz0rc8CwbPFFnx/FUTQgdK0vByAeKLPA/jrz8ypWw0rHs5BXlLHU031Pqe00xXhjIQcqO3tVj+x1I/1Y/KtbS4Fa2iyP4F/lWkLZcdK/LJ/Ez+jKXwL0OY/sdP+eQ/Kj+x0/55D8q6j7MPQUfZl9BUlnL/ANjp/wA8h+VH9jp/zyH5V1H2ZfQUfZh6CgDl/wCx0/55D8qP7HT/AJ5D8q6j7MPQUfZh6CgDljpA/wCeYx9K4H4tWSw+HnOwD8PevZZLdQM4ry741RKvhtyPUfzr5/idtZbUPWyTXGwR4BHaZHAqUWRx0rQtIlKjirawJ6V/M9SvKMnqftlOlHkWhifYj6UGxz2rb8lPSgQIe1R9Zk1uV7GOljE+xcfdo+w/7Nbfkp6UeSnpU/Wp7Jh7GLaujE+xe1H2I+lbnkL6UeQvpVfWJ8urGqMXJJGEbJvSvNfjNBs0mH8a9kkhXB4ryj42pjSocep/nXs5DXlLGQVzowlH98rnhywbuop32fBq1EgqXy81+tqbaPs44eLitCh9nGelH2cDtWh5Q9KPL9qfPbqX9VjfYz/s6+lH2celaHlD+7R5Y9KTqX0QfVoJNWM/7MB2pfs6+lX/ACx/dpPLX0oc7ISw0exnmADOT16V7T+yX4n1TQ/i3pem21w/kXjMJV3ccDjivJWjHOF6da9F/ZsG340+Hzjje+fyrrwVR+1jqeDxHhYf2fUuuh+qcZLRo3qoNPOccVFBnyY/9wfyqT5q+6Xwn8vTilKXqLQBimg4pQc1RAfxUNRjnNH8VABkUuRRz6Uc+lACZFGRRk+lHPpQAHpQOlLRQAUUUUAFFFFABRRRQAh6Vzvj/wD5FLUv+uDfyNdEOc1zvxA/5FLUv+uDfyNZVvgZlX/hy9D8yf8Al5uP+u8n/oRqyOlVx/x9XH/XeT/0I1aAr86qfGz8nr/HL1A9RluvQ0AHgbcepz1o7EYz6V6P8Lvgn4i+JQlns42htYlyZcZyadKlOtLlp7ioYedafLT1Z5zgnIxmun+H/wAP9b+IGsw6VpVs5RmHmNjhRW7pfwR8YXvjM+E202RXjkAd8cBfX8q+0/AHw/8ACvwd8K+dKYklSPdNO3UnFelg8ulXqc1TRI9fL8oliJ81TRLc+Zvi5+zTN4H8PRa3pdyJljXNxkYwa8AKkEgr0OGr3r9oH493XjO7m0DRJCumxkqWH8deDHnG7qefrXPmHsvaWo7HLmaoKrbDidjWRrufsMn0rXI4NZGu/wDHjJ9KrKrPFwXmcCepylkBtH1NXF6VTs/uD8auL0r+n8M7YeK8kKau7sXoQSeOwpOnbHtS4J4ByB0969Z+Fn7PHiz4oabcarZwNDbwrujcj79KtXpYWHNVZpRoVMTK1M8mABbIruvhP8J/EHxR12HTdMt38ncPOl28KK2vB37PvjXxH43bwpNp0sIgkAmkI4Uf/qr738G+DPBfwI8Fb5DDB5EW6aZgMsa8TM86jh48lDWTPZy7KJV3zV9Io+Pfj/8Asv3Pwy0iLxDpFwJrJFHng8bD/XmvnVjghvzFe9ftG/tD6h8TtSl0XSnMejwsVAB4krwckkliceld+VLEOhzYndnDmUqCq8uH2Qh6VNo//ITi+tQnpU+jf8hOH616LR5GJ/gs9Z08fukq+DVHT/8AUp9KvDvVxR+d1viF6YK9uvtR1BP3g3X2o5+WvRPBnwW8ReMdGn1eCMxxqu6IY+/61jiMRTw0eao7GuDwNbHVHToRuzzvAHAGAK7T4cfDXVfH2pi3ghZLYEeZLjgCr3gr4P8AiDxJ4jOk3No8Mdu+JnI7V9X6bp/hn4VeGOTFBHAmST1Jrw81zqNL93h9ZM+u4f4XliZe3xq5acT5l+LnwYn8CRrqFk4ltSBu7bT/AFrycAZGOlel/F74sX3j3UmtYnKWEbEKg715qMngngdK9PK/b/V08R8R4GffVPrklgvgQ1hxitHweP8Aip7PP9+s9q0fB/Piiz/36WaL/ZpJmnDzisfTXW59jaT/AMe0X+4v8q1FrL0n/j2i/wBxf5VqDpX5RP4mf0lS+Begc8DGcdqD97nr29qGIXndhQCSfSvCfH37W3gHwJ42tPB9xcpIXcpPID/qj2qSz3bv0+prxn9oL9ozw58F9Ckle4S41KUfuIA3JP8ASs745ftQ+Efh14OXUtNv4ry+vYibaNG7kf8A16/O1U+IX7SHxCABnu7i8l99qLn8hxQB+hP7MX7TVl8arB7G/iaDU7cncuCQwJ45+lfQGSTnHTrXjf7O37PehfBfw6kcSh9WuEU3E2OSa9lOeMNn8KAGS/dryz43f8i5J+H869Tl+7Xlnxt/5FyT6j+dfP8AE7Tyyoevkf8AvsDxW05UfSrvQVStBhV+lXB0r+X63xP1P3Ck7U0GB/hS8HqKFUllK9+MV3WmfCTxBqXh+TWkjYEDdHFjlh3roweW4jMZNYdXsYYnG0MIlKu7XOF2jcAOQf1rufh18M7/AMY3PmyQtHZp1cjrVj4d/C3VPE2pbr+FobWFvm3DrX0BqGpeH/h1oG3EcSxJgKOpNfa8OcJqSeLzBWprv1Pl864hcGsNgdZv8D5x+I3w9n8GXow++3f7prjM/wAIHPb2rqPHnji/8Y6m9zKSLdSfLT0Fct83ds4r5LOvqzxklgvgPosqWIeGj9Z+LqNkHymvJfjeP+JVDj3/AJ1605yDXk3xw50mH6n+dbcO6Y6ET2cIl7eJ4zF0qeoYugqev2B7H29NqMUg4+8TgUnQYIx71JDDLcTLDCpZ2IUL6k17Rbfss+ObnwL/AMJgsDl9m8W+3kitaeHlVWhw47M8Nl0l9Zmo32PFApY/J1PQV7v+z9+zVrHxRn/tPVIXt9LQH5mX73HH61e/Z5/Zm1jx7rSal4jspLfTLaTL7xjfg/8A1q+zvHPjnwT8B/BXlRiCHyItsUS4yxxXr4HLo8nta2x8FxPxhUVRYDKveqy6rofn18dPgxqHwi8QiwkkElpOT5MnHzAdeO1eY46DORXc/Fn4qa38U/EUmrapKRAHPkx/3BXC8keory8T7P2j9nsfdZOsX9Sh9dd6ltRH6V6H+zf/AMlq0D/ff+VeeP0r0P8AZv8A+S16B/vP/KrwS/fROTiPXL6nofqfbHMMf+4KkJxUdt/qI/8AdH8qlr71fCfyrW+J+oUgHNLRVGYhGe9KRmiigApPmpaT5qAFPtSDPelPtSDPegBaMiijAoATrR0paKACiiigAooooAMVzvxAA/4RLUuf+WDfyNdDj3rnviAMeEtSP/TBv5Gsq2kGY19KTPzJH/H1cf8AXeT/ANCNWR1FV1/4+rn/AK7yf+hGrA7V+d1fjZ+UV9arFP6Gvoz9mr462/hMxeEteVFs3O2ObAG3/GvnPHG3OPUUqM8Tb0Yqy8hga0wteeHmpwNcJip4OoqkT9RZ9S8M2FhJ4ldrdUZN5m4yRj1r4z+Pvx+v/Gd5LoegzNHpsRKsVb79eb3XxX8Y3vhmPwrPqsn2KIYxnkj61xuSSWLEnv716eLzV4iHJT0PYx+ePE0/Z0lbuKxLEsxJJ9aKQUA5rxNz53fcQ96ydd/48ZPpWse9ZOu/8eMn0r0Mq/3uHqVHc5Sz+4KuLVSy+4PqatrX9PYbWhG/ZClJ82gobDAgYAORX1v+yl+0ZZ6EsPgfxN5cUBIWGUgDFfJBA4+bOf0p0c8tvIkkLFGQ5BBwc1jj8DTzCl7OR04HFTwVX2iP1y1bW/CfhnTJvFVw9rFGyeY0wAy3HFfAn7Rf7ReqfEnVZdH0e4eLSIWKqqnHmV57rfxi8ca94atvCmoavLJZW4KhemR9a4jcxADHNeNluQrCy9rX1fQ9bMM6liV7Ojog5PJPWgZ70c0gz3r6bW10fP2V7MG61Po//ITh+tQN1qfR/wDkJw/WkzDE/wAFnrdgcxJ9BV/PSqFgMRJ9BV/0qon53W+MVSVYSDqpyPevpH4BfGWyihh8K63sjI+WKQ8Bq+bQOPX29KfBPJbyLNBKUKHII4INcOY4Cnj6bpz3PTyXN6mT4lVobdT9BNa1vw74Z06bW53hhTbuLgD5vSvkL4s/FvUfHWoyW9vM0dhGxEag9a5zXPiJ4m1/TLfS9Qv3eCEFQOma5gf7TV5eVZEsHP2lfWXQ+gz/AIulmUVRw/ux6hnNFFFfSHw71dxDWh4OP/FT2n+/Wea0PB3/ACM9p/v15uaf7tI93h7/AJGEPU+x9J/49ov9xf5VqLWXpP8Ax7Rf7i/yrUWvyifxM/pKl8C9Bs8azRPC4yJFKt9CK/PX9sD9ljV9H1G5+IPhKOW4tpG8yaMEkx/jX6Gjhsk9aq6lplpq1nLY6hAs8MylWVhkEVJZ+MngnwV43+KviK28MWSXVy6vsO8kiMd+tfp9+z1+zz4d+Dfh6FRbRy6pMgM9wV5zXVeBfgt4E+Ht/d6j4d0aK3mum3O/U59s13g65z06UAAAPNAwe1LSAY70ANk/1Zryv42f8i3J+H869Uk/1Zryv42f8i3J+H86+f4n/wCRZUPXyP8A32B4ta/dH0q6eoqla/dH0q6eor+Xq/xM/caX8NDomMUqP3Qgivo74RfFCx1i0j0PVCkdyg2qT0YV83H72c/Sp7O9ubC4jubSUxOhySK9zh7PquR1lUirxe6PJznKaebUeSWjWzPsbxJ4k0Pwfpcl6/lJxkBcDJr5b8deOdQ8X6k8s07CIE+XGOgFUfEPi7WfEpRdSu2kSMYVegFYoO3kHr39K9niXi6ebr2ND3YHnZJw5HLf3tb3ph0FA5FIOuKOp4r4Y+pW42Toa8m+N/8AyCYfqa9ak6V5L8cP+QVF9TXucPf79A6MJ/GR41D92phyKhh+7Uw4r9etdWZ9vT1SZa02/m028hv7fG+FwwyM5wa/Q39mv9obQfH+jw+GtcaGHUIkCbWxh/6V+dJycnOCa0dB1/VPDmpRappFy8E8JyCprvwWM+pvyPm+JuHKfENDlbtNbM/Ur4n/ABP8H/CDw3Les0ETlSYokABY/hX5vfFf4seIfijr8+p6lcP5Ic+VDu4UVn+OviX4q+IN0s/iHUZJ/KUCNScDp6VynGPQ1vjsyeI92HwnmcK8H08kXtsR71TuLRRRXk+h92rX0GSdK9D/AGbv+S16B/vP/KvPJfu16H+zd/yWrQP99/5V2YP+NE8LiPTL6iXY/VG34gj/ANwfyqSo4P8AUx/7g/lUlfexfuo/lOprNt92FAGKCcUVRmJjnNB6UtFACHpS0h6UtABRRRQAUUUUAFFFFABRRRQAUUUUAGMsR61zvxAwPCGp5/54N/I10OTuA9Ky/E2ntquh3lggy0sLAfXBqKq5oMyrq9Nn5eJzdXBzx50n/oRqyvI54Bq/4q8N6l4U8RXuk6payRPHMxUlTggknrWasqbfvZPpX53WpyjN6H5Xiaco1XoS0UzzV9aTzU9RWXJNdDD2c+iJKTB9ab5qetIZU7mhwl0QOnN7okoqMyoO4pfNX1/Wjkl2Dkl2HHpWVrv/AB5S/StEypjiszXHU2UmPSvRyqLWLhddSowl2OUs87B9aueuTVKzYBOfWrXmJzzX9M4acPZRbfRBKEnokSYPrRg+tM80daXzV9a256b1TJ5Ki0aHUUzzEHejzEPWhVV3B02ug/B9aMH1pvmrSeatNVIN2uHsprWw5j2qxo3Opw896qmRc1Y0ZgdVi+tJzj3McTCXsXoeuaef3S89hV8YwOazrB1ES5PYVd81OOaqM49z88rUanN8LJKKZ5y+opfMT+8Kp1ILVsyWHqb8rHUUzzk9R+dHmp6inzR6MPYztqmPopnnJ6j86POT1H50c8e4OjU/lY5ulaPg8Z8T2f8Av1lGZDxkVp+D2U+J7PB/jrzcznF4eVme5w/TmsfBtM+yNJ/49ov9xf5VqD2NYulX1oLeMGZPuD+IelaI1Cz7zx/99CvyqfxM/o+l8CLLUo+tVf7Qs/8AnvH/AN9Cg6hZ9p4/++hUllnB9aMH1qr/AGhZ/wDPeP8A76o/tCz/AOe8f/fVAFoYoOKrf2hZf890/wC+hR/aFl/z3T/voUATy/dxmvK/jdn/AIRyTnuP516W+oWewkTx/wDfQrzD403EEvh6QJIrHjgHPevA4mTeW1Ej1skaWNg2eN2h4H0q4elUbWRNo57Va82PH3hX8w1qNTmfus/b6dSHs1qSUH61H5sfrR5sfZh+dZOjWbvys09pB63Hk89aUnio/MT+8KPNTGMj86FRqr7LEqkU7XHnpQtM8yP1A/GgSx+o/On7Gp/KxKpC+4rk7SDXk3xw/wCQVF9T/OvV3ljKk5FeTfG8g6XDj1P869zh6lNY6LaZ0YWpD2y1PHIcham5x1qCJuKl3DGK/XeSUldI+2hXpctnJfePopu8elIXHalyN6NF+2pS2kvvHUtM3il3ijkklZIft6ezkvvHUU3eKTeKfI3okL29GWikr+oPggdh6V6J+zfx8a9Ay3LO/wCHFedFwScjPpXt/wCyR4B1rX/ihY67HZyCz09iZJGXA5HFdmChL2sdD5zijF06WXT95bH6S25P2eL/AHR/KpabEu2NU/ugCnGvu0vdR/LtWXNNpAelIBigHNLTICiiigAooooAKRaWigAopcH0NGD6GgBo6UtAVsdDS4PoaAEowKXB9DRg+hoASilwfQ0bT6GgBoPFID+tP2N/dP5Umw56Gl7z0YWvuch4u+Ffgfxud3iLRI7lu7A7T+YrlG/Zb+C+Qf8AhFj/AN/mr1raR2NG3sQR+FYywtOW6OWeEoTeqPJf+GW/gvjJ8Lf+R2o/4Zb+C2M/8It/5HavWtr47/lRtOO/5VH1Sl/KT9Rw/Y8lH7LnwWH/ADK//kZqP+GW/gt/0K//AJGavW9rf3T+VG1v7p/Kj6pS/lD6jh/5TyQ/sufBU/8AMrn/AL/NR/wy78F/+hW/8jtXrWxvQ/lRhvf8qHhKP8ofUcP/ACnkv/DLnwXzz4WP/f8Aakk/ZX+Ckow3hXI/67NXrZR+pB/KlKsRwD+VXDD0ou6QfUcP/KeM/wDDI3wJ/wChR/8AI7Uf8Mi/Ar/oUv8AyO1eyhWx0P5UYbP3TXorG10rKTH9Rw/8p4z/AMMi/Av/AKFL/wAjtS/8Mi/Ar/oUv/I7V7LsPoaNh9DT+u4j+Zh9Rw/8p41/wyL8Cv8AoUv/ACO1H/DI3wK/6FL/AMjtXsuG9D+VGG9DR9exH8zD6jh/5Txr/hkb4Ff9Cj/5Hag/si/Ar/oUf/I7V7LsPoaNh9DR9dxH8zD6jh/5Txo/sjfAwAf8UlwP+m7VLbfsn/A+1mE9t4Sww/6btXsAQg5IODQVPoQPpR9er/zMmWX0JKzieZ/8M6fCYdPD2P8Atq1H/DO3wn/6F8/9/Wr0zBHY0YJ7H8qP7Qr/AMzOZ5LgnvBHmZ/Z1+FA/wCZfP8A39agfs6/Cg/8y+f+/rV6YVbPQ/lQA3ofyp/X6/8AMw/sTBfyI8z/AOGdvhP/ANC8f+/rUf8ADO3wn/6F4/8Af1q9M5/umjn+6aX16v8AzMP7EwX/AD7R5of2dPhT/wBC8f8Av81N/wCGdPhV/wBC8f8Av61emkE/wGk2n+4aax9f+Zg8jwT+wjzT/hnP4UFiP+EePP8A01arFj8Avhhp1yt3Z6BslTofNNeiEEjaSQfpS7Tx8pI7molja8tHJmlPKMHSd1BXOVHwz8I9rBx/21NH/CtPCX/PjJ/39aup2n+6aNp/umuZu56KVlY5b/hWnhH/AJ8ZP+/rUf8ACtPCP/PjJ/39aup2n+6aNh7KaBnLf8K08Jf8+En/AH9aj/hWnhL/AJ8JP+/rV1JDd0NADdkNAHLH4a+Ev+fCQ/8AbVqT/hWnhP8A58JP+/zV1O0/3DRtP9w0Acv/AMK08In5Rp8mP+uzVXvfhP4Hvo/Ju9LZl95WNdkEI4OfypMMOCpIrKrRjiI8s1oVCq6UrxPPj8Cvhz/DouP+2ho/4UV8Of8AoDH/AL+GvQQpH8JoCE/wGvLWQZfJ3nTR3vM8Sl7s39558fgV8Ou2jH/v6aT/AIUV8O/+gN/5FNehFTn7po2kdFNP+wMv/wCfaJ/tTF/zv7zz7/hRfw7/AOgMf+/rUn/Civh3/wBAb/yK1eh4/wBk0Y/2TR/YGX/8+0P+1MX/ADv7zz0/Ar4ddtGP/f00n/Ci/h0P+YL/AORGr0LaT2NJtP8AdNC4fwFv4aB5pi/53955/wD8KL+HWMHRj/38NZ2sfs2/CfXIfJ1PQPNT08xq9SKnGMGja4GApAqqWTYKjK6poazXFr7b+88U/wCGP/gX28J/+Rmo/wCGP/gZ/wBCn/5Hava9r/5FG1/Su76rSX2TX+2sb/z8f3s8UP7IHwK7+Ff/ACM1A/ZA+BX/AEKn/kZq9rCnupoKHspo+q0v5Q/trHf8/X97PFP+GPvgX/0Kf/kZqP8Ahj/4Gf8AQp/+R2r2sq3YGja/p+lH1Wl/KH9tY7/n6/vZ4mf2QPgX28K/+RmpR+x/8CyP+RU/8jNXtW1v7hpdpHRTR9Vpdg/trHf8/H97PF4v2QvgdG4b/hE+VOR++avSvCvgnw54LshYeH9MjtYlGPlHP51vBTkkgk+lCq3J2EVUcPGHQwrZlisQuWrNteoCil2n+6fyo2n0NbX6HBs7oTpRS7T6GjafQ0AJSYFO2n0NGD6GgBM4oo2k9jS7T6GgBKM5pdp9DSbSOxoA2tq/3R+VG1f7o/KlooATav8AdH5UbV/uj8qWigBNq/3R+VG1f7o/KlooATav90flRtX+6PypaKAGlR2UflSbB6CnfjSHPehXFZMNqjsPypML/dFKtLkdKA2EwvoKMJ6D8qNvvRt96Bi/L6CjC+gpNvvRt96A0FwPQUbV/uj8qTHvRt96QC4X0FJhfQUbfejb70wDC/3R+VGF/uj8qXHSjHSgBML/AHR+VGF/uj8qXHSjHSkGgmF/uj8qML/dH5UuOlGOlAaCYX+6Pyowv90flS46UY96YaBtX+6PypNo/uj8qdSZFAtRNq/3RRgDHyilyKTbS1GLtX+6Pyo2r/dH5UYo20C0Dav90flRtX+6Pyo20baA0Dav90flRtX+6PypNvvS7aY9g2r/AHR+VN2+wp9FK7Fa4m1f7o/Kjav90flS0UxibV/uj8qNq/3R+VLRQAm1f7o/Kjav90flS0UAJtX+6Pyo2r/dH5UtFACbV7gflSYT0H5U6kyKV2hbjSF7AUYHoKfRRa4xuxfQUbF9BTqKYDdi+go2L6D8qdRQAzavt+VKFX0FKDmlpagN2p3Ao2r/AHRTqTFMWobV/uj8qNq/3R+VGKNtINA2r/dH5UbV/uj8qNtG2gNA2r/dH5UbV/uj8qNtG2gNA2r/AHR+VG1f7o/KjbRtoDQQKOuBS7V9BR+NLRqwGkKP4RS7V/uj8qWm7fejYYu1f7o/Kjav90flS0UwE2r/AHR+VG1f7o/KlooATav90flRtX+6PypaKAE2r/dH5UbV/uj8qWigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/9k\u003d\u005c\u0022}\u0022);\n+}\n+\n+var socket_ot;\n+\n+function ot_open() {\n+\tsocket_ot \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022dumb-increment-protocol\u0022);\n+\n+\tconsole.log(\u0022ot_open\u0022);\n+\n+\ttry {\n+\t\tsocket_ot.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022ot_statustd\u0022).style.backgroundColor \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\u0022#40ff40\u0022;\n+\t\t\tdocument.getElementById(\u0022ot_status\u0022).innerHTML \u003d\n+\t\t\t\t\t\u0022 \u003cb\u003ewebsocket connection opened\u003c/b\u003e\u003cbr\u003e\u0022 +\n+\t\t\t\t\tsan(socket_di.extensions);\n+\t\t\tdocument.getElementById(\u0022ot_open_btn\u0022).disabled \u003d true;\n+\t\t\tdocument.getElementById(\u0022ot_close_btn\u0022).disabled \u003d false;\n+\t\t\tdocument.getElementById(\u0022ot_req_close_btn\u0022).disabled \u003d false;\n+\t\t\tconsole.log(\u0022ot_open.onopen\u0022);\n+\t\t};\n+\n+\t\tsocket_ot.onclose \u003d function(e){\n+\t\t\tdocument.getElementById(\u0022ot_statustd\u0022).style.backgroundColor \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\u0022#ff4040\u0022;\n+\t\t\tdocument.getElementById(\u0022ot_status\u0022).textContent \u003d\n+\t\t\t\t\t\t\u0022 websocket connection CLOSED, code: \u0022 + e.code +\n+\t\t\t\t\t\t\u0022, reason: \u0022 + e.reason;\n+\t\t\tdocument.getElementById(\u0022ot_open_btn\u0022).disabled \u003d false;\n+\t\t\tdocument.getElementById(\u0022ot_close_btn\u0022).disabled \u003d true;\n+\t\t\tdocument.getElementById(\u0022ot_req_close_btn\u0022).disabled \u003d true;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError\u0022 + exception); \n+\t}\n+}\n+\n+/* browser will close the ws in a controlled way */\n+function ot_close() {\n+\tsocket_ot.close(3000, \u0022Bye!\u0022);\n+}\n+\n+/* we ask the server to close the ws in a controlled way */\n+function ot_req_close() {\n+\tsocket_ot.send(\u0022closeme\u005cn\u0022);\n+}\n+\n+var socket_lm;\n+var pending \u003d \u0022\u0022;\n+\n+function lm_timer_handler(ev) {\n+\tsocket_lm.send(pending);\n+\tpending\u003d\u0022\u0022;\n+}\n+\n+/* lws-mirror protocol */\n+\n+var down \u003d 0;\n+var no_last \u003d 1;\n+var last_x \u003d 0, last_y \u003d 0;\n+var ctx;\n+var color \u003d \u0022#000000\u0022;\n+var lm_timer;\n+\n+function ev_mousemove (ev) {\n+\tvar x, y;\n+\n+\tif (ev.offsetX) {\n+\t\tx \u003d ev.offsetX;\n+\t\ty \u003d ev.offsetY;\n+\t} else {\n+\t\tx \u003d ev.layerX - offsetX;\n+\t\ty \u003d ev.layerY - offsetY;\n+\n+\t}\n+\n+\tif (!down)\n+\t\treturn;\n+\tif (no_last) {\n+\t\tno_last \u003d 0;\n+\t\tlast_x \u003d x;\n+\t\tlast_y \u003d y;\n+\t\treturn;\n+\t}\n+\tpending \u003d pending + \u0022d \u0022 + color + \u0022 \u0022 + last_x + \u0022 \u0022 + last_y +\n+\t\t\t\u0022 \u0022 + x + \u0022 \u0022 + y + \u0022;\u0022;\n+\t\t\t\n+\tif (pending.length \u003e 400) {\n+\t\tsocket_lm.send(pending);\n+\t\tclearTimeout(lm_timer);\n+\t\tpending \u003d \u0022\u0022;\n+\t} else\n+\t\tlm_timer \u003d setTimeout(lm_timer_handler, 1);\n+\n+\tlast_x \u003d x;\n+\tlast_y \u003d y;\n+}\n+\n+function ev_mousedown (ev) {\n+\tdown \u003d 1;\n+}\n+\n+function ev_mouseup(ev) {\n+\tdown \u003d 0;\n+\tno_last \u003d 1;\n+}\n+\n+\n+function ws_open_mirror()\n+{\t\n+\tsocket_lm \u003d new_ws(get_appropriate_ws_url(\u0022?mirror\u003d\u0022 + mirror_name),\n+\t\t\t\u0022lws-mirror-protocol\u0022);\n+\ttry {\n+\t\tsocket_lm.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022wslm_statustd\u0022).style.backgroundColor \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\u0022#40ff40\u0022;\n+\t\t\tdocument.getElementById(\u0022wslm_status\u0022).innerHTML \u003d\n+\t\t\t\t\t\t\t\t\u0022 \u003cb\u003ewebsocket connection opened\u003c/b\u003e\u003cbr\u003e\u0022 +\n+\t\t\t\t\t\t\t\tsan(socket_lm.extensions);\n+\t\t\tlws_gray_out(false);\n+\t\t};\n+\n+\t\tsocket_lm.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tj \u003d msg.data.split(\u0022;\u0022);\n+\t\t\tvar f \u003d 0;\n+\t\t\twhile (f \u003c j.length - 1) {\n+\t\t\t\ti \u003d j[f].split(\u0022 \u0022);\n+\t\t\t\tif (i[0] \u003d\u003d\u003d \u0022d\u0022) {\n+\t\t\t\t\tctx.strokeStyle \u003d i[1];\n+\t\t\t\t\tctx.beginPath();\n+\t\t\t\t\tctx.moveTo(+(i[2]), +(i[3]));\n+\t\t\t\t\tctx.lineTo(+(i[4]), +(i[5]));\n+\t\t\t\t\tctx.stroke();\n+\t\t\t\t}\n+\t\t\t\tif (i[0] \u003d\u003d\u003d \u0022c\u0022) {\n+\t\t\t\t\tctx.strokeStyle \u003d i[1];\n+\t\t\t\t\tctx.beginPath();\n+\t\t\t\t\tctx.arc(+(i[2]), +(i[3]), +(i[4]), 0, Math.PI*2, true); \n+\t\t\t\t\tctx.stroke();\n+\t\t\t\t}\n+\n+\t\t\t\tf++;\n+\t\t\t}\n+\t\t};\n+\n+\t\tsocket_lm.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022wslm_statustd\u0022).style.backgroundColor \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\u0022#ff4040\u0022;\n+\t\t\tdocument.getElementById(\u0022wslm_status\u0022).textContent \u003d\n+\t\t\t\t\t\t\t\t\t\t\t\u0022 websocket connection CLOSED \u0022;\n+\t\t\tlws_gray_out(true,{\u0022zindex\u0022:\u0022499\u0022});\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError\u0022 + exception); \n+\t}\n+\n+\tvar canvas \u003d document.createElement(\u0022canvas\u0022);\n+\tcanvas.height \u003d 300;\n+\tcanvas.width \u003d 480;\n+\tctx \u003d canvas.getContext(\u00222d\u0022);\n+\n+\tdocument.getElementById(\u0022wslm_drawing\u0022).appendChild(canvas);\n+\n+\tcanvas.addEventListener(\u0022mousemove\u0022, ev_mousemove, false);\n+\tcanvas.addEventListener(\u0022mousedown\u0022, ev_mousedown, false);\n+\tcanvas.addEventListener(\u0022mouseup\u0022, ev_mouseup, false);\n+\n+\toffsetX \u003d offsetY \u003d 0;\n+\telement \u003d canvas;\n+ if (element.offsetParent) {\n+ do {\n+ offsetX +\u003d element.offsetLeft;\n+ offsetY +\u003d element.offsetTop;\n+ element \u003d element.offsetParent;\n+ } while (element);\n+ }\n+}\n+\n+function update_color() {\n+\tcolor \u003d document.getElementById(\u0022color\u0022).value;\n+}\n+\n+/* stuff that has to be delayed until all the page assets are loaded */\n+\n+window.addEventListener(\u0022load\u0022, function() {\n+\t\n+\tlws_gray_out(true,{\u0022zindex\u0022:\u0022499\u0022});\n+\n+\tdocument.getElementById(\u0022file\u0022).onchange \u003d check_file;\n+\tdocument.getElementById(\u0022offset\u0022).onclick \u003d reset;\n+\tdocument.getElementById(\u0022junk\u0022).onclick \u003d junk;\n+\tdocument.getElementById(\u0022color\u0022).onclick \u003d update_color;\n+\tdocument.getElementById(\u0022ot_open_btn\u0022).onclick \u003d ot_open;\n+\tdocument.getElementById(\u0022ot_close_btn\u0022).onclick \u003d ot_close;\n+\tdocument.getElementById(\u0022ot_req_close_btn\u0022).onclick \u003d ot_req_close;\n+\tdocument.getElementById(\u0022pmd\u0022).onclick \u003d on_pmd;\n+\n+\tvar transport_protocol \u003d \u0022\u0022;\n+\n+\tif ( performance \u0026\u0026 performance.timing.nextHopProtocol ) {\n+\t transport_protocol \u003d performance.timing.nextHopProtocol;\n+\t} else if ( window.chrome \u0026\u0026 window.chrome.loadTimes ) {\n+\t transport_protocol \u003d window.chrome.loadTimes().connectionInfo;\n+\t} else {\n+\n+\t var p \u003d performance.getEntriesByType(\u0022resource\u0022);\n+\t for (var i\u003d0; i \u003c p.length; i++) {\n+\tvar value \u003d \u0022nextHopProtocol\u0022 in p[i];\n+\t if (value)\n+\t transport_protocol \u003d p[i].nextHopProtocol;\n+\t }\n+\t }\n+\t \n+\t console.log(\u0022transport protocol \u0022 + transport_protocol);\n+\t \n+\t if (transport_protocol \u003d\u003d\u003d \u0022h2\u0022)\n+\t\t document.getElementById(\u0022transport\u0022).innerHTML \u003d\n+\t\t\t \t\t\t\t\t\t\t\t\u0022\u003cimg src\u003d\u005c\u0022./http2.png\u005c\u0022\u003e\u0022;\n+\n+\t BrowserDetect.init();\n+\n+\t document.getElementById(\u0022brow\u0022).textContent \u003d \u0022 \u0022 +\n+\t \t\tBrowserDetect.browser + \u0022 \u0022 + BrowserDetect.version + \u0022 \u0022 +\n+\t \t\tBrowserDetect.OS +\u0022 \u0022;\n+\n+\t document.getElementById(\u0022number\u0022).textContent \u003d\n+\t\t get_appropriate_ws_url(mirror_name);\n+\t \n+\t /* create the ws connections back to the server */\n+\t \n+\t ws_open_dumb_increment();\n+\t ws_open_status();\n+\t ws_open_mirror();\n+\n+}, false);\n+\n+}());\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/wss-over-h2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/wss-over-h2.png\nnew file mode 100644\nindex 0000000..1a62d83\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/wss-over-h2.png differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt\nnew file mode 100644\nindex 0000000..b1b65bf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt\n@@ -0,0 +1,185 @@\n+project(lws-minimal-http-server-eventlib-foreign C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-eventlib-foreign)\n+set(SRCS minimal-http-server-eventlib-foreign.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cn#if defined(LWS_WITH_LIBUV)\u005cn return 0;\u005cn#else\u005cn fail;\u005cn#endif\u005cn return 0;\u005cn}\u005cn\u0022 LWS_WITH_LIBUV)\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cn#if defined(LWS_WITH_LIBEVENT)\u005cn return 0;\u005cn#else\u005cn fail;\u005cn#endif\u005cn return 0;\u005cn}\u005cn\u0022 LWS_WITH_LIBEVENT)\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cn#if defined(LWS_WITH_LIBEV)\u005cn return 0;\u005cn#else\u005cn fail;\u005cn#endif\u005cn return 0;\u005cn}\u005cn\u0022 LWS_WITH_LIBEV)\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cn#if defined(LWS_WITH_GLIB)\u005cn return 0;\u005cn#else\u005cn fail;\u005cn#endif\u005cn return 0;\u005cn}\u005cn\u0022 LWS_WITH_GLIB)\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cn#if defined(LWS_WITH_SDEVENT)\u005cn return 0;\u005cn#else\u005cn fail;\u005cn#endif\u005cn return 0;\u005cn}\u005cn\u0022 LWS_WITH_SDEVENT)\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cn#if defined(LWS_WITH_ULOOP)\u005cn return 0;\u005cn#else\u005cn fail;\u005cn#endif\u005cn return 0;\u005cn}\u005cn\u0022 LWS_WITH_ULOOP)\n+\n+if (LWS_WITH_LIBUV)\n+\tfind_path(LIBUV_INCLUDE_DIRS NAMES uv.h)\n+\tfind_library(LIBUV_LIBRARIES NAMES uv)\n+\tmessage(\u0022libuv include dir: ${LIBUV_INCLUDE_DIRS}\u0022)\n+\tmessage(\u0022libuv libraries: ${LIBUV_LIBRARIES}\u0022)\n+\tinclude_directories(\u0022${LIBUV_INCLUDE_DIRS}\u0022)\n+\tset(extralibs ${extralibs} ${LIBUV_LIBRARIES})\n+\tlist(APPEND SRCS libuv.c)\n+endif()\n+if (LWS_WITH_LIBEVENT)\n+\tfind_path(LIBEVENT_INCLUDE_DIRS NAMES event2/event.h)\n+\tfind_library(LIBEVENT_LIBRARIES NAMES event)\n+\tmessage(\u0022libevent include dir: ${LIBEVENT_INCLUDE_DIRS}\u0022)\n+\tmessage(\u0022libevent libraries: ${LIBEVENT_LIBRARIES}\u0022)\n+\tinclude_directories(\u0022${LIBEVENT_INCLUDE_DIRS}\u0022)\n+\tset(extralibs ${extralibs} ${LIBEVENT_LIBRARIES})\n+\tlist(APPEND SRCS libevent.c)\n+endif()\n+if (LWS_WITH_LIBEV)\n+\tfind_path(LIBEV_INCLUDE_DIRS NAMES ev.h)\n+\tfind_library(LIBEV_LIBRARIES NAMES ev)\n+\tmessage(\u0022libev include dir: ${LIBEV_INCLUDE_DIRS}\u0022)\n+\tmessage(\u0022libev libraries: ${LIBEV_LIBRARIES}\u0022)\n+\tinclude_directories(\u0022${LIBEV_INCLUDE_DIRS}\u0022)\n+\tset(extralibs ${extralibs} ${LIBEV_LIBRARIES})\n+\tlist(APPEND SRCS libev.c)\n+endif()\n+if (LWS_WITH_GLIB)\n+\tset(LWS_GLIB_INCLUDE_DIRS CACHE PATH \u0022Path to the glib include directory\u0022)\n+\tset(LWS_GLIB_LIBRARIES CACHE PATH \u0022Path to the glib library\u0022)\n+\t\tinclude (FindPkgConfig)\n+\tif (NOT GLIB_FOUND)\n+\t\tfind_path(GLIB_INCLUDE_DIRS NAMES glib-2.0/glib.h)\n+\t\tfind_library(GLIB_LIBRARIES NAMES glib-2.0)\n+\t\tif(GLIB_INCLUDE_DIRS AND GLIB_LIBRARIES)\n+\t\t\tset(GLIB_FOUND 1)\n+\t\tendif()\n+\t\tif (GLIB_INCLUDE_DIRS)\n+\t\t\tset(GLIB_INCLUDE_DIRS \u0022${GLIB_INCLUDE_DIRS}/glib-2.0\u0022)\n+\t\tendif()\n+\tendif()\n+\tPKG_SEARCH_MODULE(LWS_GLIB2 glib-2.0)\n+\tif (LWS_GLIB2_FOUND)\n+\t\tlist(APPEND GLIB_INCLUDE_DIRS \u0022${LWS_GLIB2_INCLUDE_DIRS}\u0022)\n+\tendif()\n+\tmessage(\u0022glib include dir: ${GLIB_INCLUDE_DIRS}\u0022)\n+\tmessage(\u0022glib libraries: ${GLIB_LIBRARIES}\u0022)\n+\tinclude_directories(\u0022${GLIB_INCLUDE_DIRS}\u0022)\n+\tset(extralibs ${extralibs} ${GLIB_LIBRARIES})\n+\tlist(APPEND SRCS glib.c)\n+endif()\n+if (LWS_WITH_SDEVENT)\n+\tfind_path(LIBSYSTEMD_INCLUDE_DIRS NAMES systemd/sd-event.h)\n+\tfind_library(LIBSYSTEMD_LIBRARIES NAMES systemd)\n+\tmessage(\u0022libsystemd include dir: ${LIBSYSTEMD_INCLUDE_DIRS}\u0022)\n+\tmessage(\u0022libsystemd libraries: ${LIBSYSTEMD_LIBRARIES}\u0022)\n+\tinclude_directories(\u0022${LIBSYSTEMD_INCLUDE_DIRS}\u0022)\n+\tset(extralibs ${extralibs} ${LIBSYSTEMD_LIBRARIES})\n+\tlist(APPEND SRCS libsdevent.c)\n+endif()\n+if (LWS_WITH_ULOOP)\n+\tfind_path(LIBUBOX_INCLUDE_DIRS NAMES libubox/uloop.h)\n+\tfind_library(LIBUBOX_LIBRARIES NAMES ubox)\n+\tmessage(\u0022libubox include dir: ${LIBUBOX_INCLUDE_DIRS}\u0022)\n+\tmessage(\u0022libubox libraries: ${LIBUBOX_LIBRARIES}\u0022)\n+\tinclude_directories(\u0022${LIBUBOX_INCLUDE_DIRS}\u0022)\n+\tset(extralibs ${extralibs} ${LIBUBOX_LIBRARIES})\n+\tlist(APPEND SRCS uloop.c)\n+endif()\n+\n+message(\u0022Extra libs: ${extralibs}\u0022)\n+\n+if (NOT LWS_WITH_LIBUV AND NOT LWS_WITH_LIBEVENT AND NOT LWS_WITH_LIBEV AND NOT LWS_WITH_GLIB AND NOT LWS_WITH_ULOOP)\n+\tset(requirements 0)\n+endif()\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\t\n+\t#\n+\t# tests are running in the same machine context in parallel so they\n+\t# compete for the same ports. Select a base port from which sai\n+\t# instance we are running in, add another digit at the actual test\n+\t# according to which subtest it is. Then there can be no clashes\n+\t# regardless of how many build and tests in parallel.\n+\t#\n+\n+\tset(PORT_HSEF_SRV \u0022961\u0022)\n+\tif (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00220\u0022)\n+\t\tset(PORT_HSEF_SRV 962)\n+\tendif()\n+\tif (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00221\u0022)\n+\t\tset(PORT_HSEF_SRV 963)\n+\tendif()\n+\tif (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00222\u0022)\n+\t\tset(PORT_HSEF_SRV 964)\n+\tendif()\n+\tif (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00223\u0022)\n+\t\tset(PORT_HSEF_SRV 965)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${extralibs} ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${extralibs} ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\t\n+\t# notice we override the evlib plugin source via LD_LIBRARY_PATH so\n+\t# we are using the evlibs we just built, if any\n+\t\n+\tif (LWS_WITH_LIBUV)\n+\t\tadd_test(NAME hs_evlib_foreign_uv COMMAND lws-minimal-http-server-eventlib-foreign --uv -p ${PORT_HSEF_SRV}1)\n+\t\tset_tests_properties(hs_evlib_foreign_uv\n+\t\t\t PROPERTIES\n+\t\t\t ENVIRONMENT \u0022LD_LIBRARY_PATH\u003d${CMAKE_BINARY_DIR}/lib\u0022\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign\n+\t\t\t TIMEOUT 50)\n+\tendif()\n+\tif (LWS_WITH_LIBEVENT)\n+\t\tadd_test(NAME hs_evlib_foreign_event COMMAND lws-minimal-http-server-eventlib-foreign --event -p ${PORT_HSEF_SRV}2)\n+\t\tset_tests_properties(hs_evlib_foreign_event\n+\t\t\t PROPERTIES\n+\t\t\t ENVIRONMENT \u0022LD_LIBRARY_PATH\u003d${CMAKE_BINARY_DIR}/lib\u0022\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign\n+\t\t\t TIMEOUT 50)\n+\tendif()\n+\tif (LWS_WITH_LIBEV)\n+\t\tadd_test(NAME hs_evlib_foreign_ev COMMAND lws-minimal-http-server-eventlib-foreign --ev -p ${PORT_HSEF_SRV}3)\n+\t\tset_tests_properties(hs_evlib_foreign_ev\n+\t\t\t PROPERTIES\n+\t\t\t ENVIRONMENT \u0022LD_LIBRARY_PATH\u003d${CMAKE_BINARY_DIR}/lib\u0022\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign\n+\t\t\t TIMEOUT 50)\n+\tendif()\n+\tif (LWS_WITH_GLIB)\n+\t\tadd_test(NAME hs_evlib_foreign_glib COMMAND lws-minimal-http-server-eventlib-foreign --glib -p ${PORT_HSEF_SRV}4)\n+\t\tset_tests_properties(hs_evlib_foreign_glib\n+\t\t\t PROPERTIES\n+\t\t\t ENVIRONMENT \u0022LD_LIBRARY_PATH\u003d${CMAKE_BINARY_DIR}/lib\u0022\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign\n+\t\t\t TIMEOUT 50)\n+\tendif()\n+\tif (LWS_WITH_SDEVENT)\n+\t\tadd_test(NAME hs_evlib_foreign_sd COMMAND lws-minimal-http-server-eventlib-foreign --sd -p ${PORT_HSEF_SRV}5)\n+\t\tset_tests_properties(hs_evlib_foreign_sd\n+\t\t\t PROPERTIES\n+\t\t\t ENVIRONMENT \u0022LD_LIBRARY_PATH\u003d${CMAKE_BINARY_DIR}/lib\u0022\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign\n+\t\t\t TIMEOUT 50)\n+\tendif()\n+\tif (LWS_WITH_SDEVENT)\n+\t\tadd_test(NAME hs_evlib_foreign_uloop COMMAND lws-minimal-http-server-eventlib-foreign --uloop -p ${PORT_HSEF_SRV}5)\n+\t\tset_tests_properties(hs_evlib_foreign_uloop\n+\t\t\t PROPERTIES\n+\t\t\t ENVIRONMENT \u0022LD_LIBRARY_PATH\u003d${CMAKE_BINARY_DIR}/lib\u0022\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign\n+\t\t\t TIMEOUT 50)\n+\tendif()\n+\t\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/README.md\nnew file mode 100644\nindex 0000000..0a4aa5f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/README.md\n@@ -0,0 +1,59 @@\n+# lws minimal http server eventlib foreign\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+--uv|Use the libuv event library (lws must have been configured with `-DLWS_WITH_LIBUV\u003d1`)\n+--event|Use the libevent library (lws must have been configured with `-DLWS_WITH_LIBEVENT\u003d1`)\n+--ev|Use the libev event library (lws must have been configured with `-DLWS_WITH_LIBEV\u003d1`)\n+--sd|Use the systemd event library (lws must have been configured with `-DLWS_WITH_SDEVENT\u003d1`)\n+\n+Notice libevent and libev cannot coexist in the one library. But all the other combinations are OK.\n+\n+x|libuv|libevent|libev\n+---|---|---|---\n+libuv|-|OK|OK\n+libevent|OK|-|no\n+libev|OK|no|-\n+\n+This demonstrates having lws take part in a libuv loop owned by\n+something else, with its own objects running in the loop.\n+\n+Lws can join the loop, and clean up perfectly after itself without\n+leaving anything behind or making trouble in the larger loop, which\n+does not need to stop during lws creation or destruction.\n+\n+First the foreign loop is created with a 1s timer, and runs alone for 5s.\n+\n+Then the lws context is created inside the timer callback and runs for 10s...\n+during this period you can visit http://localhost:7681 for normal lws\n+service using the foreign loop.\n+\n+After the 10s are up, the lws context is destroyed inside the foreign loop\n+timer. The foreign loop runs alone again for a further 5s and then\n+exits itself.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-eventlib-foreign\n+[2018/03/29 12:19:31:3480] USER: LWS minimal http server eventlib + foreign loop | visit http://localhost:7681\n+[2018/03/29 12:19:31:3724] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/29 12:19:31:3804] NOTICE: Using foreign event loop...\n+[2018/03/29 12:19:31:3938] USER: Foreign 1Hz timer\n+[2018/03/29 12:19:32:4011] USER: Foreign 1Hz timer\n+[2018/03/29 12:19:33:4024] USER: Foreign 1Hz timer\n+^C[2018/03/29 12:19:33:8868] NOTICE: Signal 2 caught, exiting...\n+[2018/03/29 12:19:33:8963] USER: main: starting exit cleanup...\n+[2018/03/29 12:19:33:9064] USER: main: lws context destroyed: cleaning the foreign loop\n+[2018/03/29 12:19:33:9108] USER: main: exiting...\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/glib.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/glib.c\nnew file mode 100644\nindex 0000000..fd06e8b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/glib.c\n@@ -0,0 +1,96 @@\n+/*\n+ * lws-minimal-http-server-eventlib-foreign\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The glib specific code\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u003cglib-2.0/glib.h\u003e\n+#include \u003cglib-unix.h\u003e\n+\n+#include \u0022private.h\u0022\n+\n+#if !defined(G_SOURCE_FUNC)\n+#define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void)) (f))\n+#endif\n+\n+typedef struct lws_glib_tag {\n+\tGSource\t\t\t*gs;\n+\tguint\t\t\ttag;\n+} lws_glib_tag_t;\n+\n+#define lws_gs_valid(t)\t\t (t.gs)\n+#define lws_gs_destroy(t)\t if (lws_gs_valid(t)) { \u005c\n+\t\t\t\t\tg_source_remove(t.tag); \u005c\n+\t\t\t\t\tg_source_unref(t.gs); \u005c\n+\t\t\t\t\tt.gs \u003d NULL; t.tag \u003d 0; }\n+\n+static GMainLoop *loop_glib;\n+static lws_glib_tag_t timer_outer_glib, sighandler_glib;\n+\n+static int\n+timer_cb_glib(void *p)\n+{\n+\tforeign_timer_service(loop_glib);\n+\treturn 1;\n+}\n+\n+static void\n+signal_cb_glib(void *p)\n+{\n+\tsignal_cb(SIGINT);\n+}\n+\n+static void\n+foreign_event_loop_init_and_run_glib(void)\n+{\n+\t/* we create and start our \u0022foreign loop\u0022 */\n+\n+\tloop_glib \u003d g_main_loop_new(NULL, 0);\n+\n+\tsighandler_glib.gs \u003d g_unix_signal_source_new(SIGINT);\n+\tg_source_set_callback(sighandler_glib.gs, G_SOURCE_FUNC(signal_cb_glib),\n+\t\t\t NULL, NULL);\n+\tsighandler_glib.tag \u003d g_source_attach(sighandler_glib.gs,\n+\t\t\t\t\t g_main_loop_get_context(loop_glib));\n+\n+\ttimer_outer_glib.gs \u003d g_timeout_source_new(1000);\n+\tg_source_set_callback(timer_outer_glib.gs, timer_cb_glib, NULL, NULL);\n+\ttimer_outer_glib.tag \u003d g_source_attach(timer_outer_glib.gs,\n+\t\t\t\t\t g_main_loop_get_context(loop_glib));\n+\n+\tg_main_loop_run(loop_glib);\n+}\n+\n+static void\n+foreign_event_loop_stop_glib(void)\n+{\n+\tg_main_loop_quit(loop_glib);\n+}\n+\n+static void\n+foreign_event_loop_cleanup_glib(void)\n+{\n+\t/* cleanup the foreign loop assets */\n+\n+\tlws_gs_destroy(sighandler_glib);\n+\tlws_gs_destroy(timer_outer_glib);\n+\n+\tg_main_loop_unref(loop_glib);\n+\tloop_glib \u003d NULL;\n+}\n+\n+const struct ops ops_glib \u003d {\n+\tforeign_event_loop_init_and_run_glib,\n+\tforeign_event_loop_stop_glib,\n+\tforeign_event_loop_cleanup_glib\n+};\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libev.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libev.c\nnew file mode 100644\nindex 0000000..dcab933\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libev.c\n@@ -0,0 +1,76 @@\n+/*\n+ * lws-minimal-http-server-eventlib-foreign\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The libev specific code\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003cev.h\u003e\n+\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u0022private.h\u0022\n+\n+static struct ev_loop *loop_ev;\n+static struct ev_timer timer_outer_ev;\n+static struct ev_signal sighandler_ev;\n+\n+static void\n+timer_cb_ev(struct ev_loop *loop, struct ev_timer *watcher, int revents)\n+{\n+\tforeign_timer_service(loop_ev);\n+}\n+\n+static void\n+signal_cb_ev(struct ev_loop *loop, struct ev_signal *watcher, int revents)\n+{\n+\tsignal_cb(watcher-\u003esignum);\n+}\n+\n+static void\n+foreign_event_loop_init_and_run_libev(void)\n+{\n+\t/* we create and start our \u0022foreign loop\u0022 */\n+\n+\tloop_ev \u003d ev_loop_new(0);\n+\n+\tev_signal_init(\u0026sighandler_ev, signal_cb_ev, SIGINT);\n+\tev_signal_start(loop_ev, \u0026sighandler_ev);\n+\n+\tev_timer_init(\u0026timer_outer_ev, timer_cb_ev, 0, 1);\n+\tev_timer_start(loop_ev, \u0026timer_outer_ev);\n+\n+\tev_run(loop_ev, 0);\n+}\n+\n+static void\n+foreign_event_loop_stop_libev(void)\n+{\n+\tev_break(loop_ev, EVBREAK_ALL);\n+}\n+\n+static void\n+foreign_event_loop_cleanup_libev(void)\n+{\n+\t/* cleanup the foreign loop assets */\n+\n+\tev_timer_stop(loop_ev, \u0026timer_outer_ev);\n+\tev_signal_stop(loop_ev, \u0026sighandler_ev);\n+\n+\tev_run(loop_ev, 0);\n+\tev_loop_destroy(loop_ev);\n+}\n+\n+const struct ops ops_libev \u003d {\n+\tforeign_event_loop_init_and_run_libev,\n+\tforeign_event_loop_stop_libev,\n+\tforeign_event_loop_cleanup_libev\n+};\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libevent.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libevent.c\nnew file mode 100644\nindex 0000000..a6c8510\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libevent.c\n@@ -0,0 +1,84 @@\n+/*\n+ * lws-minimal-http-server-eventlib-foreign\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The libevent specific code\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003cevent2/event.h\u003e\n+\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u0022private.h\u0022\n+\n+static struct event_base *loop_event;\n+static struct event *timer_outer_event;\n+static struct event *sighandler_event;\n+\n+static void\n+timer_cb_event(evutil_socket_t fd, short event, void *arg)\n+{\n+\tforeign_timer_service(loop_event);\n+}\n+\n+static void\n+signal_cb_event(evutil_socket_t fd, short event, void *arg)\n+{\n+\tsignal_cb((int)(lws_intptr_t)arg);\n+}\n+\n+static void\n+foreign_event_loop_init_and_run_libevent(void)\n+{\n+\tstruct timeval tv;\n+\n+\t/* we create and start our \u0022foreign loop\u0022 */\n+\n+\ttv.tv_sec \u003d 1;\n+\ttv.tv_usec \u003d 0;\n+\tevent_enable_debug_mode();\n+\n+\tloop_event \u003d event_base_new();\n+\tsighandler_event \u003d evsignal_new((struct event_base *)loop_event, SIGINT, signal_cb_event,\n+ (void*)SIGINT);\n+\n+\ttimer_outer_event \u003d event_new((struct event_base *)loop_event, -1, EV_PERSIST,\n+ timer_cb_event, NULL);\n+\t//evtimer_new(loop_event, timer_cb_event, NULL);\n+\tevtimer_add(timer_outer_event, \u0026tv);\n+\n+\tevent_base_loop(loop_event, 0);\n+}\n+\n+static void\n+foreign_event_loop_stop_libevent(void)\n+{\n+\tevent_base_loopexit(loop_event, NULL);\n+}\n+\n+static void\n+foreign_event_loop_cleanup_libevent(void)\n+{\n+\t/* cleanup the foreign loop assets */\n+\n+\tevtimer_del(timer_outer_event);\n+\tevent_free(timer_outer_event);\n+\tevsignal_del(sighandler_event);\n+\tevent_free(sighandler_event);\n+\n+\tevent_base_loop(loop_event, 0);\n+\tevent_base_free(loop_event);\n+}\n+\n+const struct ops ops_libevent \u003d {\n+\tforeign_event_loop_init_and_run_libevent,\n+\tforeign_event_loop_stop_libevent,\n+\tforeign_event_loop_cleanup_libevent\n+};\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libsdevent.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libsdevent.c\nnew file mode 100644\nindex 0000000..bc712c4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libsdevent.c\n@@ -0,0 +1,86 @@\n+/*\n+ * lws-minimal-http-server-eventlib-foreign\n+ *\n+ * Written in 2020 by Christian Fuchs \u003cchristian.fuchs@scs.ch\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The sdevent specific code\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u003csystemd/sd-event.h\u003e\n+\n+#include \u0022private.h\u0022\n+\n+static struct sd_event *sd_loop;\n+static sd_event_source *sd_timer;\n+static sd_event_source *sd_signal;\n+\n+static int\n+timer_cb_sd(sd_event_source *source, uint64_t now, void *user)\n+{\n+\tforeign_timer_service(sd_loop);\n+\n+\tif (sd_timer) {\n+\t\tsd_event_source_set_time(sd_timer, now + 1000000);\n+\t\tsd_event_source_set_enabled(sd_timer, SD_EVENT_ON);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+signal_cb_sd(sd_event_source *source, const struct signalfd_siginfo *si,\n+ void *user)\n+{\n+\tsignal_cb((int)si-\u003essi_signo);\n+\treturn 0;\n+}\n+\n+static void\n+foreign_event_loop_init_and_run_libsdevent(void)\n+{\n+\tuint64_t now;\n+\n+\t/* we create and start our \u0022foreign loop\u0022 */\n+\n+\tsd_event_default(\u0026sd_loop);\n+\tsd_event_add_signal(sd_loop, \u0026sd_signal, SIGINT, signal_cb_sd, NULL);\n+\n+\tsd_event_now(sd_loop, CLOCK_MONOTONIC, \u0026now);\n+\tsd_event_add_time(sd_loop, \u0026sd_timer, CLOCK_MONOTONIC, now,\n+\t\t\t (uint64_t) 1000, timer_cb_sd, NULL);\n+\n+\tsd_event_loop(sd_loop);\n+}\n+\n+static void\n+foreign_event_loop_stop_libsdevent(void)\n+{\n+\tsd_event_exit(sd_loop, 0);\n+}\n+\n+static void\n+foreign_event_loop_cleanup_libsdevent(void)\n+{\n+\tsd_event_source_set_enabled(sd_timer, SD_EVENT_OFF);\n+\tsd_timer \u003d sd_event_source_unref(sd_timer);\n+\n+\tsd_event_source_set_enabled(sd_signal, SD_EVENT_OFF);\n+\tsd_signal \u003d sd_event_source_unref(sd_signal);\n+\n+\tsd_loop \u003d sd_event_unref(sd_loop);\n+}\n+\n+const struct ops ops_sdevent \u003d {\n+\tforeign_event_loop_init_and_run_libsdevent,\n+\tforeign_event_loop_stop_libsdevent,\n+\tforeign_event_loop_cleanup_libsdevent\n+};\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libuv.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libuv.c\nnew file mode 100644\nindex 0000000..df1550d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libuv.c\n@@ -0,0 +1,91 @@\n+/*\n+ * lws-minimal-http-server-eventlib-foreign\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The libuv specific code\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u003cuv.h\u003e\n+#ifdef LWS_HAVE_UV_VERSION_H\n+#include \u003cuv-version.h\u003e\n+#endif\n+#ifdef LWS_HAVE_NEW_UV_VERSION_H\n+#include \u003cuv/version.h\u003e\n+#endif\n+\n+#include \u0022private.h\u0022\n+\n+static uv_loop_t loop_uv;\n+static uv_timer_t timer_outer_uv;\n+static uv_signal_t sighandler_uv;\n+\n+static void\n+timer_cb_uv(uv_timer_t *t)\n+{\n+\tforeign_timer_service(\u0026loop_uv);\n+}\n+\n+static void\n+signal_cb_uv(uv_signal_t *watcher, int signum)\n+{\n+\tsignal_cb(signum);\n+}\n+\n+static void\n+foreign_event_loop_init_and_run_libuv(void)\n+{\n+\t/* we create and start our \u0022foreign loop\u0022 */\n+\n+#if (UV_VERSION_MAJOR \u003e 0) // Travis...\n+\tuv_loop_init(\u0026loop_uv);\n+#endif\n+\tuv_signal_init(\u0026loop_uv, \u0026sighandler_uv);\n+\tuv_signal_start(\u0026sighandler_uv, signal_cb_uv, SIGINT);\n+\n+\tuv_timer_init(\u0026loop_uv, \u0026timer_outer_uv);\n+#if (UV_VERSION_MAJOR \u003e 0) // Travis...\n+\tuv_timer_start(\u0026timer_outer_uv, timer_cb_uv, 0, 1000);\n+#else\n+\t(void)timer_cb_uv;\n+#endif\n+\n+\tuv_run(\u0026loop_uv, UV_RUN_DEFAULT);\n+}\n+\n+static void\n+foreign_event_loop_stop_libuv(void)\n+{\n+\tuv_stop(\u0026loop_uv);\n+}\n+\n+static void\n+foreign_event_loop_cleanup_libuv(void)\n+{\n+\t/* cleanup the foreign loop assets */\n+\n+\tuv_timer_stop(\u0026timer_outer_uv);\n+\tuv_close((uv_handle_t*)\u0026timer_outer_uv, NULL);\n+\tuv_signal_stop(\u0026sighandler_uv);\n+\tuv_close((uv_handle_t *)\u0026sighandler_uv, NULL);\n+\n+\tuv_run(\u0026loop_uv, UV_RUN_DEFAULT);\n+#if (UV_VERSION_MAJOR \u003e 0) // Travis...\n+\tuv_loop_close(\u0026loop_uv);\n+#endif\n+}\n+\n+const struct ops ops_libuv \u003d {\n+\tforeign_event_loop_init_and_run_libuv,\n+\tforeign_event_loop_stop_libuv,\n+\tforeign_event_loop_cleanup_libuv\n+};\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/minimal-http-server-eventlib-foreign.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/minimal-http-server-eventlib-foreign.c\nnew file mode 100644\nindex 0000000..a2a695d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/minimal-http-server-eventlib-foreign.c\n@@ -0,0 +1,341 @@\n+/*\n+ * lws-minimal-http-server-eventlib-foreign\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws that\n+ * uses a libuv event loop created outside lws. It shows how lws can\n+ * participate in someone else's event loop and clean up after itself.\n+ *\n+ * You choose the event loop to work with at runtime, by giving the\n+ * --uv, --event or --ev switch. Lws has to have been configured to build the\n+ * selected event lib support.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u0022private.h\u0022\n+\n+static struct lws_context_creation_info info;\n+static const struct ops *ops \u003d NULL;\n+struct lws_context *context;\n+int lifetime \u003d 5, reported;\n+\n+enum {\n+\tTEST_STATE_CREATE_LWS_CONTEXT,\n+\tTEST_STATE_DESTROY_LWS_CONTEXT,\n+\tTEST_STATE_EXIT\n+};\n+\n+static int sequence \u003d TEST_STATE_CREATE_LWS_CONTEXT;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void\n+signal_cb(int signum)\n+{\n+\tlwsl_notice(\u0022Signal %d caught, exiting...\u005cn\u0022, signum);\n+\n+\tswitch (signum) {\n+\tcase SIGTERM:\n+\tcase SIGINT:\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\tlws_context_destroy(context);\n+}\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP: resp %u\u005cn\u0022,\n+\t\t\t\tlws_http_client_http_response(wsi));\n+\t\tbreak;\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+\t\tlwsl_hexdump_info(in, len);\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP %s\u005cn\u0022,\n+\t\t\t lws_wsi_tag(wsi));\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tlwsl_info(\u0022%s: closed: %s\u005cn\u0022, __func__, lws_wsi_tag(wsi));\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{ \u0022httptest\u0022, callback_http, 0, 0, 0, NULL, 0},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int\n+do_client_conn(void)\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\n+\ti.context\t\t\u003d context;\n+\n+\ti.ssl_connection\t\u003d LCCSCF_USE_SSL;\n+\ti.port\t\t\t\u003d 443;\n+\ti.address\t\t\u003d \u0022warmcat.com\u0022;\n+\n+\ti.ssl_connection\t|\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n+\t\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n+\ti.path\t\t\t\u003d \u0022/\u0022;\n+\ti.host\t\t\t\u003d i.address;\n+\ti.origin\t\t\u003d i.address;\n+\ti.method\t\t\u003d \u0022GET\u0022;\n+\ti.local_protocol_name\t\u003d protocols[0].name;\n+#if defined(LWS_WITH_SYS_FAULT_INJECTION)\n+\ti.fi_wsi_name\t\t\u003d \u0022user\u0022;\n+#endif\n+\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tlwsl_err(\u0022Client creation failed\u005cn\u0022);\n+\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+\n+/* this is called at 1Hz using a foreign loop timer */\n+\n+void\n+foreign_timer_service(void *foreign_loop)\n+{\n+\tvoid *foreign_loops[1];\n+\n+\tlwsl_user(\u0022Foreign 1Hz timer\u005cn\u0022);\n+\n+\tif (sequence \u003d\u003d TEST_STATE_EXIT \u0026\u0026 !context \u0026\u0026 !reported) {\n+\t\t/*\n+\t\t * at this point the lws_context_destroy() we did earlier\n+\t\t * has completed and the entire context is wholly destroyed\n+\t\t */\n+\t\tlwsl_user(\u0022lws_destroy_context() done, continuing for 5s\u005cn\u0022);\n+\t\treported \u003d 1;\n+\t}\n+\n+\tif (--lifetime)\n+\t\treturn;\n+\n+\tswitch (sequence++) {\n+\tcase TEST_STATE_CREATE_LWS_CONTEXT:\n+\t\t/* this only has to exist for the duration of create context */\n+\t\tforeign_loops[0] \u003d foreign_loop;\n+\t\tinfo.foreign_loops \u003d foreign_loops;\n+\n+\t\tcontext \u003d lws_create_context(\u0026info);\n+\t\tif (!context) {\n+\t\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\t\treturn;\n+\t\t}\n+\t\tlwsl_user(\u0022LWS Context created and will be active for 10s\u005cn\u0022);\n+\n+\t\tdo_client_conn();\n+\n+\t\tlifetime \u003d 11;\n+\t\tbreak;\n+\n+\tcase TEST_STATE_DESTROY_LWS_CONTEXT:\n+\t\t/* cleanup the lws part */\n+\t\tlwsl_user(\u0022Destroying lws context and continuing loop for 5s\u005cn\u0022);\n+\t\tlws_context_destroy(context);\n+\t\tlifetime \u003d 6;\n+\t\tbreak;\n+\n+\tcase TEST_STATE_EXIT:\n+\t\tlwsl_user(\u0022Deciding to exit foreign loop too\u005cn\u0022);\n+\t\tops-\u003estop();\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tconst char *p;\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server eventlib + foreign loop |\u0022\n+\t\t \u0022 visit http://localhost:7681\u005cn\u0022);\n+\n+\t/*\n+\t * We prepare the info here, but don't use it until later in the\n+\t * timer callback, to demonstrate the independence of the foreign loop\n+\t * and lws.\n+\t */\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\tinfo.port \u003d atoi(p);\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.pcontext \u003d \u0026context;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+\n+\t/*\n+\t * We configure lws to use the chosen event loop, and select the\n+\t * matching event-lib specific code for our demo operations\n+\t */\n+\n+#if defined(LWS_WITH_LIBUV)\n+\tif (lws_cmdline_option(argc, argv, \u0022--uv\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBUV;\n+\t\tops \u003d \u0026ops_libuv;\n+\t\tlwsl_notice(\u0022%s: using libuv event loop\u005cn\u0022, __func__);\n+\t} else\n+#endif\n+#if defined(LWS_WITH_LIBEVENT)\n+\t\tif (lws_cmdline_option(argc, argv, \u0022--event\u0022)) {\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEVENT;\n+\t\t\tops \u003d \u0026ops_libevent;\n+\t\t\tlwsl_notice(\u0022%s: using libevent loop\u005cn\u0022, __func__);\n+\t\t} else\n+#endif\n+#if defined(LWS_WITH_LIBEV)\n+\t\t\tif (lws_cmdline_option(argc, argv, \u0022--ev\u0022)) {\n+\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEV;\n+\t\t\t\tops \u003d \u0026ops_libev;\n+\t\t\t\tlwsl_notice(\u0022%s: using libev loop\u005cn\u0022, __func__);\n+\t\t\t} else\n+#endif\n+#if defined(LWS_WITH_GLIB)\n+\t\t\t\tif (lws_cmdline_option(argc, argv, \u0022--glib\u0022)) {\n+\t\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_GLIB;\n+\t\t\t\t\tops \u003d \u0026ops_glib;\n+\t\t\t\t\tlwsl_notice(\u0022%s: using glib loop\u005cn\u0022, __func__);\n+\t\t\t\t} else\n+#endif\n+#if defined(LWS_WITH_SDEVENT)\n+\t\t\t\t\tif (lws_cmdline_option(argc, argv, \u0022--sd\u0022)) {\n+\t\t\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_SDEVENT;\n+\t\t\t\t\t\tops \u003d \u0026ops_sdevent;\n+\t\t\t\t\t\tlwsl_notice(\u0022%s: using sd-event loop\u005cn\u0022, __func__);\n+\t\t\t\t\t} else\n+#endif\n+#if defined(LWS_WITH_ULOOP)\n+\t\t\t\t\tif (lws_cmdline_option(argc, argv, \u0022--uloop\u0022)) {\n+\t\t\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_ULOOP;\n+\t\t\t\t\t\tops \u003d \u0026ops_uloop;\n+\t\t\t\t\t\tlwsl_notice(\u0022%s: using uloop loop\u005cn\u0022, __func__);\n+\t\t\t\t\t} else\n+#endif\n+\t\t\t\t{\n+\t\t\t\tlwsl_err(\u0022This app only makes sense when used\u005cn\u0022);\n+\t\t\t\tlwsl_err(\u0022 with a foreign loop, --uv, --event, --glib, --ev or --sd\u005cn\u0022);\n+\n+\t\t\t\treturn 1;\n+\t\t\t\t}\n+\n+\tlwsl_user(\u0022 This app creates a foreign event loop with a timer +\u005cn\u0022);\n+\tlwsl_user(\u0022 signalhandler, and performs a test in three phases:\u005cn\u0022);\n+\tlwsl_user(\u0022\u005cn\u0022);\n+\tlwsl_user(\u0022 1) 5s: Runs the loop with just the timer\u005cn\u0022);\n+\tlwsl_user(\u0022 2) 10s: create an lws context serving on localhost:7681\u005cn\u0022);\n+\tlwsl_user(\u0022 using the same foreign loop. Destroy it after 10s.\u005cn\u0022);\n+\tlwsl_user(\u0022 3) 5s: Run the loop again with just the timer\u005cn\u0022);\n+\tlwsl_user(\u0022\u005cn\u0022);\n+\tlwsl_user(\u0022 Finally close only the timer and signalhandler and\u005cn\u0022);\n+\tlwsl_user(\u0022 exit the loop cleanly\u005cn\u0022);\n+\tlwsl_user(\u0022\u005cn\u0022);\n+\n+\t/* foreign loop specific startup and run */\n+\n+\tops-\u003einit_and_run();\n+\n+\tlws_context_destroy(context);\n+\n+\t/* foreign loop specific cleanup and exit */\n+\n+\tops-\u003ecleanup();\n+\n+\tlwsl_user(\u0022%s: exiting...\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/index.html\nnew file mode 100644\nindex 0000000..bee267a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/index.html\n@@ -0,0 +1,16 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server eventlib foreign loop example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tThe timer messages in the console are coming from\u003cbr\u003e\n+\t\ta timer on the event library lib loop set up before the lws context\u003cbr\u003e\n+\t\tstarted using it.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/private.h b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/private.h\nnew file mode 100644\nindex 0000000..17928c6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/private.h\n@@ -0,0 +1,15 @@\n+\n+\n+struct ops {\n+\tvoid (*init_and_run)(void);\n+\tvoid (*stop)(void);\n+\tvoid (*cleanup)(void);\n+};\n+\n+extern struct lws_context *context;\n+extern int lifetime, reported;\n+\n+void foreign_timer_service(void *foreign_loop);\n+void signal_cb(int signum);\n+\n+extern const struct ops ops_libuv, ops_libevent, ops_glib, ops_libev, ops_sdevent, ops_uloop;\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/uloop.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/uloop.c\nnew file mode 100644\nindex 0000000..c528e89\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/uloop.c\n@@ -0,0 +1,59 @@\n+/*\n+ * lws-minimal-http-server-eventlib-foreign\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The uloop specific code\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+#include \u003clibubox/uloop.h\u003e\n+\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u0022private.h\u0022\n+\n+static struct uloop_timeout timer_outer_uloop;\n+\n+static void\n+timer_cb_uloop(struct uloop_timeout *ti)\n+{\n+\tforeign_timer_service(NULL);\n+\tuloop_timeout_set(\u0026timer_outer_uloop, 1090);\n+}\n+\n+static void\n+foreign_event_loop_init_and_run_uloop(void)\n+{\n+\tuloop_init();\n+\n+\ttimer_outer_uloop.cb \u003d timer_cb_uloop;\n+\tuloop_timeout_add(\u0026timer_outer_uloop);\n+\n+\tuloop_timeout_set(\u0026timer_outer_uloop, 1090);\n+\n+\tuloop_run();\n+}\n+\n+static void\n+foreign_event_loop_stop_uloop(void)\n+{\n+\tuloop_end();\n+}\n+\n+static void\n+foreign_event_loop_cleanup_uloop(void)\n+{\n+\tuloop_timeout_cancel(\u0026timer_outer_uloop);\n+}\n+\n+const struct ops ops_uloop \u003d {\n+\tforeign_event_loop_init_and_run_uloop,\n+\tforeign_event_loop_stop_uloop,\n+\tforeign_event_loop_cleanup_uloop\n+};\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..087202d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-http-server-eventlib-smp C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-eventlib-smp)\n+set(SRCS minimal-http-server-eventlib-smp.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared ${PTHREAD_LIB})\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/README.md\nnew file mode 100644\nindex 0000000..56dfcc4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/README.md\n@@ -0,0 +1,33 @@\n+# lws minimal http server eventlib\n+\n+WARNING: this is under development, it's not stable.\n+\n+This demonstrates a minimal http server that can use any of the event libraries\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-t \u003cthreads\u003e|Number of threads to use.\n+--uv|Use the libuv event library (lws must have been configured with `-DLWS_WITH_LIBUV\u003d1`)\n+--event|Use the libevent library (lws must have been configured with `-DLWS_WITH_LIBEVENT\u003d1`)\n+--ev|Use the libev event library (lws must have been configured with `-DLWS_WITH_LIBEV\u003d1`)\n+\n+## build\n+\n+lilbwebsockets must have been built with `LWS_MAX_SMP` greater than 1 to use\n+multiple threads.\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-eventlib-smp\n+[2018/03/04 09:30:02:7986] USER: LWS minimal http server-eventlib | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/minimal-http-server-eventlib-smp.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/minimal-http-server-eventlib-smp.c\nnew file mode 100644\nindex 0000000..7a7f3f7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/minimal-http-server-eventlib-smp.c\n@@ -0,0 +1,171 @@\n+/*\n+ * lws-minimal-http-server-eventlib-smp\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http[s] server that can work with any of the\n+ * supported event loop backends, or the default poll() one.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+\n+#include \u003cpthread.h\u003e\n+\n+#define COUNT_THREADS 8\n+\n+static struct lws_context *context;\n+static volatile int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void *thread_service(void *threadid)\n+{\n+\twhile (lws_service_tsi(context, 10000,\n+\t\t\t (int)(lws_intptr_t)threadid) \u003e\u003d 0 \u0026\u0026\n+\t !interrupted)\n+\t\t;\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+void signal_cb(void *handle, int signum)\n+{\n+\tinterrupted \u003d 1;\n+\n+\tswitch (signum) {\n+\tcase SIGTERM:\n+\tcase SIGINT:\n+\t\tbreak;\n+\tdefault:\n+\t\tlwsl_err(\u0022%s: signal %d\u005cn\u0022, __func__, signum);\n+\t\tbreak;\n+\t}\n+\tlws_context_destroy(context);\n+}\n+\n+void sigint_handler(int sig)\n+{\n+\tsignal_cb(NULL, sig);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tpthread_t pthread_service[COUNT_THREADS];\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tvoid *retval;\n+\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server eventlib SMP | visit http://localhost:7681\u005cn\u0022);\n+\tlwsl_user(\u0022 [-s (ssl)] [--uv (libuv)] [--ev (libev)] [--event (libevent)]\u005cn\u0022);\n+\tlwsl_user(\u0022WARNING: Not stable, under development!\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.pcontext \u003d \u0026context;\n+\tinfo.signal_cb \u003d signal_cb;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-t\u0022))) {\n+\t\tinfo.count_threads \u003d (unsigned int)atoi(p);\n+\t\tif (info.count_threads \u003c 1 || info.count_threads \u003e LWS_MAX_SMP)\n+\t\t\treturn 1;\n+\t} else\n+\t\tinfo.count_threads \u003d COUNT_THREADS;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--uv\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBUV;\n+\telse\n+\t\tif (lws_cmdline_option(argc, argv, \u0022--event\u0022))\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEVENT;\n+\t\telse\n+\t\t\tif (lws_cmdline_option(argc, argv, \u0022--ev\u0022))\n+\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEV;\n+\t\t\telse\n+\t\t\t\tif (lws_cmdline_option(argc, argv, \u0022--glib\u0022))\n+\t\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_GLIB;\n+\t\t\t\telse\n+\t\t\t\t\tsignal(SIGINT, sigint_handler);\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tlwsl_notice(\u0022 Service threads: %d\u005cn\u0022, lws_get_count_threads(context));\n+\n+\t/* start all the service threads */\n+\n+\tfor (n \u003d 0; n \u003c lws_get_count_threads(context); n++)\n+\t\tif (pthread_create(\u0026pthread_service[n], NULL, thread_service,\n+\t\t\t\t (void *)(lws_intptr_t)n))\n+\t\t\tlwsl_err(\u0022Failed to start service thread\u005cn\u0022);\n+\n+\t/* wait for all the service threads to exit */\n+\n+\twhile ((--n) \u003e\u003d 0)\n+\t\tpthread_join(pthread_service[n], \u0026retval);\n+\n+\tlwsl_notice(\u0022%s: calling external context destroy\u005cn\u0022, __func__);\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/index.html\nnew file mode 100644\nindex 0000000..8da5b66\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/index.html\n@@ -0,0 +1,15 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server event loop example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/CMakeLists.txt\nnew file mode 100644\nindex 0000000..57badf3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-eventlib C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-eventlib)\n+set(SRCS minimal-http-server-eventlib.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/README.md\nnew file mode 100644\nindex 0000000..ecfb733\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/README.md\n@@ -0,0 +1,27 @@\n+# lws minimal http server eventlib\n+\n+This demonstrates a minimal http server that can use any of the event libraries\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+--uv|Use the libuv event library (lws must have been configured with `-DLWS_WITH_LIBUV\u003d1`)\n+--event|Use the libevent library (lws must have been configured with `-DLWS_WITH_LIBEVENT\u003d1`)\n+--ev|Use the libev event library (lws must have been configured with `-DLWS_WITH_LIBEV\u003d1`)\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-eventlib\n+[2018/03/04 09:30:02:7986] USER: LWS minimal http server-eventlib | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/minimal-http-server-eventlib.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/minimal-http-server-eventlib.c\nnew file mode 100644\nindex 0000000..a1fed6d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/minimal-http-server-eventlib.c\n@@ -0,0 +1,124 @@\n+/*\n+ * lws-minimal-http-server-eventlib\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http[s] server that can work with any of the\n+ * supported event loop backends, or the default poll() one.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static struct lws_context *context;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void signal_cb(void *handle, int signum)\n+{\n+\tswitch (signum) {\n+\tcase SIGTERM:\n+\tcase SIGINT:\n+\t\tbreak;\n+\tdefault:\n+\t\tlwsl_err(\u0022%s: signal %d\u005cn\u0022, __func__, signum);\n+\t\tbreak;\n+\t}\n+\tlws_context_destroy(context);\n+}\n+\n+void sigint_handler(int sig)\n+{\n+\tsignal_cb(NULL, sig);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server eventlib | visit http://localhost:7681\u005cn\u0022);\n+\tlwsl_user(\u0022 [-s (ssl)] [--uv (libuv)] [--ev (libev)] [--event (libevent)]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.pcontext \u003d \u0026context;\n+\tinfo.signal_cb \u003d signal_cb;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--uv\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBUV;\n+\telse\n+\t\tif (lws_cmdline_option(argc, argv, \u0022--event\u0022))\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEVENT;\n+\t\telse\n+\t\t\tif (lws_cmdline_option(argc, argv, \u0022--ev\u0022))\n+\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBEV;\n+\t\t\telse\n+\t\t\t\tif (lws_cmdline_option(argc, argv, \u0022--glib\u0022))\n+\t\t\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_GLIB;\n+\t\t\t\telse\n+\t\t\t\t\tsignal(SIGINT, sigint_handler);\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (!lws_service(context, 0))\n+\t\t;\n+\n+\tlwsl_info(\u0022calling external context destroy\u005cn\u0022);\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/index.html\nnew file mode 100644\nindex 0000000..8da5b66\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/index.html\n@@ -0,0 +1,15 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server event loop example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/CMakeLists.txt\nnew file mode 100644\nindex 0000000..0ef0f3c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-form-get C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-form-get)\n+set(SRCS minimal-http-server-form-get.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/README.md\nnew file mode 100644\nindex 0000000..a22d8c2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/README.md\n@@ -0,0 +1,21 @@\n+# lws minimal http server form GET\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-form-get\n+[2018/03/29 08:29:41:7044] USER: LWS minimal http server form GET | visit http://localhost:7681\n+[2018/03/29 08:29:41:7044] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/29 08:29:49:8601] USER: text1: (len 4) 'xxxx'\n+[2018/03/29 08:29:49:8601] USER: send: (len 6) 'Submit'\n+```\n+\n+Visit http://localhost:7681, submit the form.\n+\n+The form parameters are dumped to the log and you are redirected to a different page.\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/minimal-http-server-form-get.c b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/minimal-http-server-form-get.c\nnew file mode 100644\nindex 0000000..d0ce969\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/minimal-http-server-form-get.c\n@@ -0,0 +1,147 @@\n+/*\n+ * lws-minimal-http-server-form-get\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server that performs a form GET with a couple\n+ * of parameters. It dumps the parameters to the console log and redirects\n+ * to another page.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+\n+static const char * param_names[] \u003d {\n+\t\u0022text1\u0022,\n+\t\u0022send\u0022\n+};\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tuint8_t buf[LWS_PRE + LWS_RECOMMENDED_MIN_HEADER_SPACE],\n+\t\t*start \u003d \u0026buf[LWS_PRE], *p \u003d start,\n+\t\t*end \u003d \u0026buf[sizeof(buf) - 1];\n+\tint n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_HTTP:\n+\n+\t\tif (!lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI))\n+\t\t\t/* not a GET */\n+\t\t\tbreak;\n+\t\tlwsl_err(\u0022%s: %s\u005cn\u0022, __func__, (const char *)in);\n+\t\tif (strcmp((const char *)in, \u0022/form1\u0022))\n+\t\t\t/* not our form URL */\n+\t\t\tbreak;\n+\n+\t\t/* we just dump the decoded things to the log */\n+\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(param_names); n++) {\n+\t\t\tint rv \u003d lws_get_urlarg_by_name_safe(wsi, param_names[n],\n+\t\t\t\t\t(char *)buf, sizeof(buf));\n+\t\t\tif (rv \u003c 0)\n+\t\t\t\tlwsl_user(\u0022%s: undefined\u005cn\u0022, param_names[n]);\n+\t\t\telse\n+\t\t\t\tlwsl_user(\u0022%s: (len %d) '%s'\u005cn\u0022, param_names[n],\n+\t\t\t\t\t (int)rv, buf);\n+\t\t}\n+\n+\t\t/*\n+\t\t * Our response is to redirect to a static page. We could\n+\t\t * have generated a dynamic html page here instead.\n+\t\t */\n+\n+\t\tif (lws_http_redirect(wsi, HTTP_STATUS_MOVED_PERMANENTLY,\n+\t\t\t\t (unsigned char *)\u0022after-form1.html\u0022,\n+\t\t\t\t 16, \u0026p, end) \u003c 0)\n+\t\t\treturn -1;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, callback_http, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t NULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\u0022./mount-origin\u0022,\t/* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server GET | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/404.html\nnew file mode 100644\nindex 0000000..6f85f25\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e\n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/after-form1.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/after-form1.html\nnew file mode 100644\nindex 0000000..938ccb7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/after-form1.html\n@@ -0,0 +1,12 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tThanks for posting the form.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/index.html\nnew file mode 100644\nindex 0000000..147ce5f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/index.html\n@@ -0,0 +1,23 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http form GET example\u003c/b\u003e.\n+\t\t\u003cp\u003e\n+\t\tThis is a static page served from ./mount-origin/index.html.\n+\t\t\u003cp\u003e\n+\t\tWhen you submit the form below, you will see the values of the\u003cbr\u003e\n+\t\tform parameters reported on the console log.\n+\t\t\u003cp\u003e\n+\t\t\u003cform action\u003d\u0022/form1\u0022 method\u003d\u0022get\u0022\u003e\n+\t\t\tType some text:\u003cbr\u003e\n+\t\t\t\u003cinput type\u003d\u0022text\u0022 name\u003d\u0022text1\u0022\u003e\u003cbr\u003e\n+\t\t\t\u003cinput type\u003d\u0022submit\u0022 name\u003d\u0022send\u0022 value\u003d\u0022Submit\u0022\u003e\n+\t\t\u003c/form\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/CMakeLists.txt\nnew file mode 100644\nindex 0000000..f1b5c36\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-form-post-file C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-form-post-file)\n+set(SRCS minimal-http-server-form-post-file.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/README.md\nnew file mode 100644\nindex 0000000..d0fce2c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/README.md\n@@ -0,0 +1,23 @@\n+# lws minimal http server form POST file\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-form-post-file\n+[2018/03/29 09:58:30:8800] USER: LWS minimal http server POST file | visit http://localhost:7681\n+[2018/03/29 09:58:30:8800] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/29 09:58:45:3284] USER: file_upload_cb: upload done, written 2729 to wss-over-h2.png\n+[2018/03/29 09:58:45:3284] USER: text1: (len 3) 'xxx'\n+[2018/03/29 09:58:45:3284] USER: send: (len 6) 'Submit'\n+```\n+\n+Visit http://localhost:7681, select a file to upload and submit the form.\n+\n+The file is uploaded and saved in the cwd, the form parameters are dumped to the log and\n+you are redirected to a different page.\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c\nnew file mode 100644\nindex 0000000..0b41f40\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c\n@@ -0,0 +1,262 @@\n+/*\n+ * lws-minimal-http-server-form-post-file\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server that performs POST with a couple\n+ * of parameters and a file upload, all in multipart (mime) form mode.\n+ * It saves the uploaded file in the current directory, dumps the parameters to\n+ * the console log and redirects to another page.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if !defined(WIN32)\n+#include \u003cunistd.h\u003e\n+#endif\n+#include \u003cfcntl.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003cerrno.h\u003e\n+\n+/*\n+ * Unlike ws, http is a stateless protocol. This pss only exists for the\n+ * duration of a single http transaction. With http/1.1 keep-alive and http/2,\n+ * that is unrelated to (shorter than) the lifetime of the network connection.\n+ */\n+struct pss {\n+\tstruct lws_spa *spa;\t\t/* lws helper decodes multipart form */\n+\tchar filename[128];\t\t/* the filename of the uploaded file */\n+\tunsigned long long file_length; /* the amount of bytes uploaded */\n+\tint fd;\t\t\t\t/* fd on file being saved */\n+};\n+\n+static int interrupted;\n+\n+static const char * const param_names[] \u003d {\n+\t\u0022text1\u0022,\n+\t\u0022send\u0022,\n+};\n+\n+enum enum_param_names {\n+\tEPN_TEXT1,\n+\tEPN_SEND,\n+};\n+\n+static int\n+file_upload_cb(void *data, const char *name, const char *filename,\n+\t char *buf, int len, enum lws_spa_fileupload_states state)\n+{\n+\tstruct pss *pss \u003d (struct pss *)data;\n+\n+\tswitch (state) {\n+\tcase LWS_UFS_OPEN:\n+\t\t/* take a copy of the provided filename */\n+\t\tlws_strncpy(pss-\u003efilename, filename, sizeof(pss-\u003efilename) - 1);\n+\t\t/* remove any scary things like .. */\n+\t\tlws_filename_purify_inplace(pss-\u003efilename);\n+\t\t/* open a file of that name for write in the cwd */\n+\t\tpss-\u003efd \u003d lws_open(pss-\u003efilename, O_CREAT | O_TRUNC | O_RDWR, 0600);\n+\t\tif (pss-\u003efd \u003d\u003d -1) {\n+\t\t\tlwsl_notice(\u0022Failed to open output file %s\u005cn\u0022,\n+\t\t\t\t pss-\u003efilename);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tbreak;\n+\tcase LWS_UFS_FINAL_CONTENT:\n+\tcase LWS_UFS_CONTENT:\n+\t\tif (len) {\n+\t\t\tint n;\n+\n+\t\t\tpss-\u003efile_length +\u003d (unsigned int)len;\n+\n+\t\t\tn \u003d (int)write(pss-\u003efd, buf, (unsigned int)len);\n+\t\t\tif (n \u003c len) {\n+\t\t\t\tlwsl_notice(\u0022Problem writing file %d\u005cn\u0022, errno);\n+\t\t\t}\n+\t\t}\n+\t\tif (state \u003d\u003d LWS_UFS_CONTENT)\n+\t\t\t/* wasn't the last part of the file */\n+\t\t\tbreak;\n+\n+\t\t/* the file upload is completed */\n+\n+\t\tlwsl_user(\u0022%s: upload done, written %lld to %s\u005cn\u0022, __func__,\n+\t\t\t pss-\u003efile_length, pss-\u003efilename);\n+\n+\t\tclose(pss-\u003efd);\n+\t\tpss-\u003efd \u003d -1;\n+\t\tbreak;\n+\tcase LWS_UFS_CLOSE:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tuint8_t buf[LWS_PRE + LWS_RECOMMENDED_MIN_HEADER_SPACE], *start \u003d \u0026buf[LWS_PRE],\n+\t\t*p \u003d start, *end \u003d \u0026buf[sizeof(buf) - 1];\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tint n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_HTTP:\n+\n+\t\t/*\n+\t\t * Manually report that our form target URL exists\n+\t\t *\n+\t\t * you can also do this by adding a mount for the form URL\n+\t\t * to the protocol with type LWSMPRO_CALLBACK, then no need\n+\t\t * to trap LWS_CALLBACK_HTTP.\n+\t\t */\n+\n+\t\tif (!strcmp((const char *)in, \u0022/form1\u0022))\n+\t\t\t/* assertively allow it to exist in the URL space */\n+\t\t\treturn 0;\n+\n+\t\t/* default to 404-ing the URL if not mounted */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_BODY:\n+\n+\t\t/* create the POST argument parser if not already existing */\n+\n+\t\tif (!pss-\u003espa) {\n+\t\t\tpss-\u003espa \u003d lws_spa_create(wsi, param_names,\n+\t\t\t\t\tLWS_ARRAY_SIZE(param_names), 1024,\n+\t\t\t\t\tfile_upload_cb, pss);\n+\t\t\tif (!pss-\u003espa)\n+\t\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/* let it parse the POST data */\n+\n+\t\tif (lws_spa_process(pss-\u003espa, in, (int)len))\n+\t\t\treturn -1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_BODY_COMPLETION:\n+\n+\t\t/* inform the spa no more payload data coming */\n+\n+\t\tlws_spa_finalize(pss-\u003espa);\n+\n+\t\t/* we just dump the decoded things to the log */\n+\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(param_names); n++) {\n+\t\t\tif (!lws_spa_get_string(pss-\u003espa, n))\n+\t\t\t\tlwsl_user(\u0022%s: undefined\u005cn\u0022, param_names[n]);\n+\t\t\telse\n+\t\t\t\tlwsl_user(\u0022%s: (len %d) '%s'\u005cn\u0022,\n+\t\t\t\t param_names[n],\n+\t\t\t\t lws_spa_get_length(pss-\u003espa, n),\n+\t\t\t\t lws_spa_get_string(pss-\u003espa, n));\n+\t\t}\n+\n+\t\t/*\n+\t\t * Our response is to redirect to a static page. We could\n+\t\t * have generated a dynamic html page here instead.\n+\t\t */\n+\n+\t\tif (lws_http_redirect(wsi, HTTP_STATUS_MOVED_PERMANENTLY,\n+\t\t\t\t (unsigned char *)\u0022after-form1.html\u0022,\n+\t\t\t\t 16, \u0026p, end) \u003c 0)\n+\t\t\treturn -1;\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_DROP_PROTOCOL:\n+\t\t/* called when our wsi user_space is going to be destroyed */\n+\t\tif (pss-\u003espa) {\n+\t\t\tlws_spa_destroy(pss-\u003espa);\n+\t\t\tpss-\u003espa \u003d NULL;\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, callback_http, sizeof(struct pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t NULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\u0022./mount-origin\u0022,\t/* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server POST file | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/404.html\nnew file mode 100644\nindex 0000000..6f85f25\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e\n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/after-form1.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/after-form1.html\nnew file mode 100644\nindex 0000000..b01062e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/after-form1.html\n@@ -0,0 +1,14 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tThanks for posting the form.\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\tThe file you uploaded should have been saved in the current directory.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/index.html\nnew file mode 100644\nindex 0000000..06ffd24\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/index.html\n@@ -0,0 +1,29 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http form POST file example\u003c/b\u003e.\n+\t\t\u003cp\u003e\n+\t\tThis is a static page served from ./mount-origin/index.html.\n+\t\t\u003cp\u003e\n+\t\tWhen you POST the form below, you will see the values of the\u003cbr\u003e\n+\t\tform parameters reported on the console log, and the file will\n+\t\tbe uploaded and saved in the current working directory.\n+\t\t\u003cp\u003e\n+\t\t\u003cform name\u003dmultipart action\u003d\u0022/form1\u0022 method\u003d\u0022post\u0022 enctype\u003d\u0022multipart/form-data\u0022\u003e\n+\t\t\tType some text:\u003cbr\u003e\n+\t\t\t\u003cinput type\u003d\u0022text\u0022 name\u003d\u0022text1\u0022\u003e\u003cbr\u003e\n+\t\t\t\u003cbr\u003e\n+\t\t\tSelect a file to upload: \n+\t\t\t\u003cinput type\u003d\u0022file\u0022 name\u003d\u0022file\u0022 id\u003d\u0022file\u0022 size\u003d\u002220\u0022\u003e\u0026nbsp;\n+\t\t\t\t\u003cspan id\u003dfile_info style\u003d\u0022font-size:12pt;\u0022\u003e\u003c/span\u003e\u003cbr\u003e\n+\t\t\t\u003cbr\u003e\n+\t\t\t\u003cinput type\u003d\u0022submit\u0022 name\u003d\u0022send\u0022 value\u003d\u0022Submit\u0022\u003e\n+\t\t\u003c/form\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/CMakeLists.txt\nnew file mode 100644\nindex 0000000..c7e0a11\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-form-post-lwsac C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-form-post-lwsac)\n+set(SRCS minimal-http-server-form-post.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/README.md\nnew file mode 100644\nindex 0000000..910b4ce\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/README.md\n@@ -0,0 +1,23 @@\n+# lws minimal http server form POST lwsac\n+\n+Shows how to parse the form using an lwsac to hold the form data\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-form-post-lwsac\n+[2018/03/29 08:29:41:7044] USER: LWS minimal http server form POST | visit http://localhost:7681\n+[2018/03/29 08:29:41:7044] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/29 08:29:49:8601] USER: text1: (len 4) 'xxxx'\n+[2018/03/29 08:29:49:8601] USER: send: (len 6) 'Submit'\n+```\n+\n+Visit http://localhost:7681, submit the form.\n+\n+The form parameters are dumped to the log and you are redirected to a different page.\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/minimal-http-server-form-post.c b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/minimal-http-server-form-post.c\nnew file mode 100644\nindex 0000000..225cdd6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/minimal-http-server-form-post.c\n@@ -0,0 +1,219 @@\n+/*\n+ * lws-minimal-http-server-form-post-lwsac\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server that performs POST with a couple\n+ * of parameters. It dumps the parameters to the console log and redirects\n+ * to another page.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/*\n+ * Unlike ws, http is a stateless protocol. This pss only exists for the\n+ * duration of a single http transaction. With http/1.1 keep-alive and http/2,\n+ * that is unrelated to (shorter than) the lifetime of the network connection.\n+ */\n+struct pss {\n+\tstruct lws_spa *spa;\n+\tstruct lwsac *ac;\n+};\n+\n+static int interrupted;\n+\n+static const char * const param_names[] \u003d {\n+\t\u0022text1\u0022,\n+\t\u0022send\u0022,\n+};\n+\n+enum enum_param_names {\n+\tEPN_TEXT1,\n+\tEPN_SEND,\n+};\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tuint8_t buf[LWS_PRE + LWS_RECOMMENDED_MIN_HEADER_SPACE], *start \u003d \u0026buf[LWS_PRE],\n+\t\t*p \u003d start, *end \u003d \u0026buf[sizeof(buf) - 1];\n+\tint n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_HTTP:\n+\n+\t\t/*\n+\t\t * Manually report that our form target URL exists\n+\t\t *\n+\t\t * you can also do this by adding a mount for the form URL\n+\t\t * to the protocol with type LWSMPRO_CALLBACK, then no need\n+\t\t * to trap LWS_CALLBACK_HTTP.\n+\t\t */\n+\n+\t\tif (!strcmp((const char *)in, \u0022/form1\u0022))\n+\t\t\t/* assertively allow it to exist in the URL space */\n+\t\t\treturn 0;\n+\n+\t\t/* default to 404-ing the URL if not mounted */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_BODY:\n+\n+\t\t/* create the POST argument parser if not already existing */\n+\n+\t\tif (!pss-\u003espa) {\n+\t\t\tlws_spa_create_info_t i;\n+\n+\t\t\tmemset(\u0026i, 0, sizeof(i));\n+\t\t\ti.param_names \u003d param_names;\n+\t\t\ti.count_params \u003d LWS_ARRAY_SIZE(param_names);\n+\t\t\ti.ac \u003d \u0026pss-\u003eac;\n+\t\t\ti.ac_chunk_size \u003d 512;\n+\n+\t\t\tpss-\u003espa \u003d lws_spa_create_via_info(wsi, \u0026i); /* no file upload */\n+\t\t\tif (!pss-\u003espa)\n+\t\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/* let it parse the POST data */\n+\n+\t\tif (lws_spa_process(pss-\u003espa, in, (int)len))\n+\t\t\treturn -1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_BODY_COMPLETION:\n+\n+\t\t/* inform the spa no more payload data coming */\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_HTTP_BODY_COMPLETION\u005cn\u0022);\n+\t\tlws_spa_finalize(pss-\u003espa);\n+\n+\t\t/* we just dump the decoded things to the log */\n+\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(param_names); n++) {\n+\t\t\tif (!lws_spa_get_string(pss-\u003espa, n))\n+\t\t\t\tlwsl_user(\u0022%s: undefined\u005cn\u0022, param_names[n]);\n+\t\t\telse\n+\t\t\t\tlwsl_user(\u0022%s: (len %d) '%s'\u005cn\u0022,\n+\t\t\t\t param_names[n],\n+\t\t\t\t lws_spa_get_length(pss-\u003espa, n),\n+\t\t\t\t lws_spa_get_string(pss-\u003espa, n));\n+\t\t}\n+\n+\t\tlwsac_free(\u0026pss-\u003eac);\n+\n+\t\t/*\n+\t\t * Our response is to redirect to a static page. We could\n+\t\t * have generated a dynamic html page here instead.\n+\t\t */\n+\n+\t\tif (lws_http_redirect(wsi, HTTP_STATUS_MOVED_PERMANENTLY,\n+\t\t\t\t (unsigned char *)\u0022after-form1.html\u0022,\n+\t\t\t\t 16, \u0026p, end) \u003c 0)\n+\t\t\treturn -1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_DROP_PROTOCOL:\n+\t\t/* called when our wsi user_space is going to be destroyed */\n+\t\tif (pss-\u003espa) {\n+\t\t\tlws_spa_destroy(pss-\u003espa);\n+\t\t\tpss-\u003espa \u003d NULL;\n+\t\t}\n+\t\tlwsac_free(\u0026pss-\u003eac);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, callback_http, sizeof(struct pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t NULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\u0022./mount-origin\u0022,\t/* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server POST | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#if defined(LWS_WITH_TLS)\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+#endif\n+\t}\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/CMakeLists.txt\nnew file mode 100644\nindex 0000000..ac3e4ff\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-form-post C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-form-post)\n+set(SRCS minimal-http-server-form-post.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/README.md\nnew file mode 100644\nindex 0000000..b89353c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/README.md\n@@ -0,0 +1,21 @@\n+# lws minimal http server form POST\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-form-post\n+[2018/03/29 08:29:41:7044] USER: LWS minimal http server form POST | visit http://localhost:7681\n+[2018/03/29 08:29:41:7044] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/29 08:29:49:8601] USER: text1: (len 4) 'xxxx'\n+[2018/03/29 08:29:49:8601] USER: send: (len 6) 'Submit'\n+```\n+\n+Visit http://localhost:7681, submit the form.\n+\n+The form parameters are dumped to the log and you are redirected to a different page.\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/minimal-http-server-form-post.c b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/minimal-http-server-form-post.c\nnew file mode 100644\nindex 0000000..58af16e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/minimal-http-server-form-post.c\n@@ -0,0 +1,223 @@\n+/*\n+ * lws-minimal-http-server-form-post\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server that performs POST with a couple\n+ * of parameters. It dumps the parameters to the console log and redirects\n+ * to another page.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/*\n+ * Unlike ws, http is a stateless protocol. This pss only exists for the\n+ * duration of a single http transaction. With http/1.1 keep-alive and http/2,\n+ * that is unrelated to (shorter than) the lifetime of the network connection.\n+ */\n+struct pss {\n+\tstruct lws_spa *spa;\n+};\n+\n+static int interrupted, use303;\n+\n+static const char * const param_names[] \u003d {\n+\t\u0022text1\u0022,\n+\t\u0022send\u0022,\n+};\n+\n+enum enum_param_names {\n+\tEPN_TEXT1,\n+\tEPN_SEND,\n+};\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tuint8_t buf[LWS_PRE + LWS_RECOMMENDED_MIN_HEADER_SPACE], *start \u003d \u0026buf[LWS_PRE],\n+\t\t*p \u003d start, *end \u003d \u0026buf[sizeof(buf) - 1];\n+\tint n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_HTTP:\n+\n+\t\t/*\n+\t\t * Manually report that our form target URL exists\n+\t\t *\n+\t\t * you can also do this by adding a mount for the form URL\n+\t\t * to the protocol with type LWSMPRO_CALLBACK, then no need\n+\t\t * to trap LWS_CALLBACK_HTTP.\n+\t\t */\n+\n+\t\tif (!strcmp((const char *)in, \u0022/form1\u0022))\n+\t\t\t/* assertively allow it to exist in the URL space */\n+\t\t\treturn 0;\n+\n+\t\t/* default to 404-ing the URL if not mounted */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_BODY:\n+\n+\t\t/* create the POST argument parser if not already existing */\n+\n+\t\tif (!pss-\u003espa) {\n+\t\t\tpss-\u003espa \u003d lws_spa_create(wsi, param_names,\n+\t\t\t\t\tLWS_ARRAY_SIZE(param_names), 1024,\n+\t\t\t\t\tNULL, NULL); /* no file upload */\n+\t\t\tif (!pss-\u003espa)\n+\t\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/* let it parse the POST data */\n+\n+\t\tif (lws_spa_process(pss-\u003espa, in, (int)len))\n+\t\t\treturn -1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tif (pss-\u003espa \u0026\u0026 lws_spa_destroy(pss-\u003espa))\n+\t\t\treturn -1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_BODY_COMPLETION:\n+\n+\t\t/* inform the spa no more payload data coming */\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_HTTP_BODY_COMPLETION\u005cn\u0022);\n+\t\tlws_spa_finalize(pss-\u003espa);\n+\n+\t\t/* we just dump the decoded things to the log */\n+\n+\t\tif (pss-\u003espa)\n+\t\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(param_names); n++) {\n+\t\t\t\tif (!lws_spa_get_string(pss-\u003espa, n))\n+\t\t\t\t\tlwsl_user(\u0022%s: undefined\u005cn\u0022, param_names[n]);\n+\t\t\t\telse\n+\t\t\t\t\tlwsl_user(\u0022%s: (len %d) '%s'\u005cn\u0022,\n+\t\t\t\t\t param_names[n],\n+\t\t\t\t\t lws_spa_get_length(pss-\u003espa, n),\n+\t\t\t\t\t lws_spa_get_string(pss-\u003espa, n));\n+\t\t\t}\n+\n+\t\t/*\n+\t\t * Our response is to redirect to a static page. We could\n+\t\t * have generated a dynamic html page here instead.\n+\t\t */\n+\n+\t\tif (lws_http_redirect(wsi, use303 ? HTTP_STATUS_SEE_OTHER :\n+\t\t\t\t\t HTTP_STATUS_MOVED_PERMANENTLY,\n+\t\t\t\t (unsigned char *)\u0022after-form1.html\u0022,\n+\t\t\t\t 16, \u0026p, end) \u003c 0)\n+\t\t\treturn -1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_DROP_PROTOCOL:\n+\t\t/* called when our wsi user_space is going to be destroyed */\n+\t\tif (pss-\u003espa) {\n+\t\t\tlws_spa_destroy(pss-\u003espa);\n+\t\t\tpss-\u003espa \u003d NULL;\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, callback_http, sizeof(struct pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t NULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\u0022./mount-origin\u0022,\t/* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server POST | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--port\u0022)))\n+\t\tinfo.port \u003d atoi(p);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--303\u0022)) {\n+\t\tlwsl_user(\u0022%s: using 303 redirect\u005cn\u0022, __func__);\n+\t\tuse303 \u003d 1;\n+\t}\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/404.html\nnew file mode 100644\nindex 0000000..6f85f25\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e\n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/after-form1.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/after-form1.html\nnew file mode 100644\nindex 0000000..938ccb7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/after-form1.html\n@@ -0,0 +1,12 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tThanks for posting the form.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/index.html\nnew file mode 100644\nindex 0000000..12ab4f4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/index.html\n@@ -0,0 +1,23 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003d\u0022utf-8\u0022 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http POST example\u003c/b\u003e.\n+\t\t\u003cp\u003e\n+\t\tThis is a static page served from ./mount-origin/index.html.\n+\t\t\u003cp\u003e\n+\t\tWhen you POST the form below, you will see the values of the\u003cbr\u003e\n+\t\tform parameters reported on the console log.\n+\t\t\u003cp\u003e\n+\t\t\u003cform action\u003d\u0022/form1\u0022 method\u003d\u0022post\u0022\u003e\n+\t\t\tType some text:\u003cbr\u003e\n+\t\t\t\u003cinput type\u003d\u0022text\u0022 name\u003d\u0022text1\u0022\u003e\u003cbr\u003e\n+\t\t\t\u003cinput type\u003d\u0022submit\u0022 name\u003d\u0022send\u0022 value\u003d\u0022Submit\u0022\u003e\n+\t\t\u003c/form\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/CMakeLists.txt\nnew file mode 100644\nindex 0000000..160e054\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/CMakeLists.txt\n@@ -0,0 +1,27 @@\n+project(lws-minimal-http-server-fulltext-search C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-fulltext-search)\n+set(SRCS minimal-http-server.c)\n+\n+include_directories(../../../plugins)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_FTS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/README.md\nnew file mode 100644\nindex 0000000..cc8794b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/README.md\n@@ -0,0 +1,18 @@\n+# lws minimal http server\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server\n+[2018/03/04 09:30:02:7986] USER: LWS minimal http server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/lws-fts.index b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/lws-fts.index\nnew file mode 100644\nindex 0000000..b38484b\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/lws-fts.index differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/minimal-http-server.c\nnew file mode 100644\nindex 0000000..010ef74\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/minimal-http-server.c\n@@ -0,0 +1,126 @@\n+/*\n+ * lws-minimal-http-server-fts\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates how to use lws full-text search\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u003cprotocol_fulltext_demo.c\u003e\n+\n+const char *index_filepath \u003d \u0022./lws-fts.index\u0022;\n+static int interrupted;\n+\n+static struct lws_protocols protocols[] \u003d {\n+\tLWS_PLUGIN_PROTOCOL_FULLTEXT_DEMO,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static struct lws_protocol_vhost_options pvo_idx \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022indexpath\u0022,\t\t/* pvo name */\n+\tNULL\t/* filled in at runtime */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_idx,\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-test-fts\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t/* ignored */\n+};\n+\n+/* override the default mount for /fts in the URL space */\n+\n+static const struct lws_http_mount mount_fts \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/fts\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\tNULL,\t/* protocol */\n+\t/* .def */\t\t\tNULL,\n+\t/* .protocol */\t\t\t\u0022lws-test-fts\u0022,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_CALLBACK, /* dynamic */\n+\t/* .mountpoint_len */\t\t4,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\t\u0026mount_fts,\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server fulltext search | \u0022\n+\t\t \u0022visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tpvo_idx.value \u003d index_filepath;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/dorian-gray-wikipedia.jpg b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/dorian-gray-wikipedia.jpg\nnew file mode 100644\nindex 0000000..00e54da\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/dorian-gray-wikipedia.jpg differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/index.html\nnew file mode 100644\nindex 0000000..d1f7d25\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/index.html\n@@ -0,0 +1,30 @@\n+\u003c!DOCTYPE html\u003e\n+\u003chtml\u003e\n+\n+\u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022lws-fts.js\u0022\u003e\u003c/script\u003e\n+ \u003clink rel\u003d\u0022stylesheet\u0022 type\u003d\u0022text/css\u0022 href\u003d\u0022lws-fts.css\u0022/\u003e\n+\u003c/head\u003e\n+\n+\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\u003cdiv class\u003d\u0022searchbg\u0022\u003e\n+\n+\u003cspan class\u003d\u0022title\u0022\u003eThe Picture of Dorian Gray\u003c/span\u003e\u003cbr\u003e\n+\n+\t\u003ctable class\u003d\u0022searchtable\u0022\u003e\n+\t\t\u003ctr\u003e\n+\t\t \u003ctd rowspan\u003d'2'\u003e\u003cimg class\u003d'eyeglass'\u003e\u003c/td\u003e\n+\t\t \u003ctd class\u003d'searchboxtitle'\u003eFulltext search\u003cbr\u003e\n+\t\t\t\u003cinput type\u003d'text' id\u003d'lws_fts' class\u003d'nonviable'\n+\t\t\t\tname\u003d'lws_fts' maxlength\u003d'80'\u003e\n+\t\t\u003cdiv class\u003d'acomplete' id\u003d'acomplete'\u003e\u003c/div\u003e\n+\t\t\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n+\n+\t\u003cdiv class\u003d'searchresults' id\u003d'searchresults'\u003e\u003c/div\u003e\n+\u003c/div\u003e\n+\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.css b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.css\nnew file mode 100644\nindex 0000000..c1bfdb3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.css\n@@ -0,0 +1,154 @@\n+span.title {\n+\tfont-size: 24pt;\n+\ttext-align: center;\n+}\n+\n+img.eyeglass {\n+\tdisplay: inline-block;\n+ background: url(\u0022data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAyMjQuMDUyMjIgMjU2LjQ4MjE1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZWZzPgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjkwOS4xMSIgeDI9Ijk5Ni42OSIgeTE9Ii03MS4wMzUiIHkyPSItMzEuNjEzIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05MTYuMDYgMTA1LjU4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjNGQ0ZDRkIiBvZmZzZXQ9IjAiLz4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iIzgwODA4MCIgc3RvcC1vcGFjaXR5PSIuMDgyNjQ1IiBvZmZzZXQ9IjEiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEwMjAuMyIgeDI9IjEwMTcuNiIgeTE9Ii0zNy44NjMiIHkyPSItMzUuMzgzIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05MTYuMDYgMTA1LjU4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjOTk5IiBvZmZzZXQ9IjAiLz4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iIzk5OSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDg1NTgiIHk9Ii0uMTIyNiIgd2lkdGg9IjEuMTcxMiIgaGVpZ2h0PSIxLjI0NTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDc2NDQ5MzkiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJkIiB4PSItLjIxNjYxIiB5PSItLjI5NDQ1IiB3aWR0aD0iMS40MzMyIiBoZWlnaHQ9IjEuNTg4OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KCQkJPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS40NjkwMTk0Ii8+CgkJPC9maWx0ZXI+CgkJPGZpbHRlciBpZD0iZSIgeD0iLS4wNTkyMjgiIHk9Ii0uMDc3NjUyIiB3aWR0aD0iMS4xMTg1IiBoZWlnaHQ9IjEuMTU1MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KCQkJPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMy40NzIzODc4Ii8+CgkJPC9maWx0ZXI+CgkJPGZpbHRlciBpZD0iZiIgeD0iLS4wNzUwNTMiIHk9Ii0uMDY3MDAzIiB3aWR0aD0iMS4xNTAxIiBoZWlnaHQ9IjEuMTM0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgoJCQk8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjMwNjQ1MzgiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJqIiB4PSItLjcwMzc4IiB5PSItLjY5MDc0IiB3aWR0aD0iMi40MDc2IiBoZWlnaHQ9IjIuMzgxNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KCQkJPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNC4xMTIwODgiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJpIiB4PSItLjA2MSIgeT0iLS4wOTUzNDUiIHdpZHRoPSIxLjEyMiIgaGVpZ2h0PSIxLjE5MDciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzU4ODkwNDIiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJoIiB4PSItLjA3OTU4NyIgeT0iLS4xNjc5NyIgd2lkdGg9IjEuMTU5MiIgaGVpZ2h0PSIxLjMzNTkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNTgwMDg2MTUiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJnIiB4PSItLjAzMjI5NSIgeT0iLS4wMjgwMDkiIHdpZHRoPSIxLjA2NDYiIGhlaWdodD0iMS4wNTYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMjM0MzQ2OCIvPgoJCTwvZmlsdGVyPgoJCTxmaWx0ZXIgaWQ9ImsiIHg9Ii0uMTY2NDgiIHk9Ii0uMzQ5ODEiIHdpZHRoPSIxLjMzMyIgaGVpZ2h0PSIxLjY5OTYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMuODg4NzYzNiIvPgoJCTwvZmlsdGVyPgoJCTxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDM1OTIyIiB5PSItLjA0NzIxMSIgd2lkdGg9IjEuMDcxOCIgaGVpZ2h0PSIxLjA5NDQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMDUzNDk2NiIvPgoJCTwvZmlsdGVyPgoJCTxmaWx0ZXIgaWQ9ImwiIHg9Ii0uMDM1OTIyIiB5PSItLjA0NzIxMSIgd2lkdGg9IjEuMDcxOCIgaGVpZ2h0PSIxLjA5NDQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMTg1OTg3NSIvPgoJCTwvZmlsdGVyPgoJPC9kZWZzPgoJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTkuMDQ0IDUzLjQ5MSkiPgoJCTxwYXRoIGQ9Im0tOC44MDY4IDI2LjA4MmMtMy4wMzI4LTM1LjM1MyAyOC43MTItNjIuMTY3IDY0LjY1My02NC4wMTcgMjIuOTg5LTIuNTkzMiA2Ni44MTkgOS4wNDY5IDgyLjk1NSA0Ni4yOTMtMS4yODAxLTIxLjkyMy0yNS45NjctNjguMjkxLTEwOC43OC00OS4yOTMtMjUuMzc2IDguMjg5Mi01MS4zMzYgMzUuMzQ3LTQxLjQxMSA2My41NTZ6IiBmaWxsPSIjOTk5Ii8+CgkJPGVsbGlwc2UgY3g9IjYzLjgzMiIgY3k9IjEzLjY5NyIgcng9Ijc1LjgwNyIgcnk9IjU3LjY3OSIgZmlsbD0iI2IzYjNiMyIgZmlsbC1vcGFjaXR5PSIuNDQyMTUiLz4KCQk8cGF0aCBkPSJtNjIuNzU1LTQ3LjQ3MmE3Ny43ODQgNTkuMTgzIDAgMCAwIC03Ny43ODMgNTkuMTgzIDc3Ljc4NCA1OS4xODMgMCAwIDAgNzcuNzgzIDU5LjE4MyA3Ny43ODQgNTkuMTgzIDAgMCAwIDc3Ljc4NCAtNTkuMTgzIDc3Ljc4NCA1OS4xODMgMCAwIDAgLTc3Ljc4NCAtNTkuMTgzem0wLjEyNjEgMi4xMDI3YTc1LjgxNyA1Ny42ODcgMCAwIDEgNzUuODE3IDU3LjY4NiA3NS44MTcgNTcuNjg3IDAgMCAxIC03NS44MTcgNTcuNjg3IDc1LjgxNyA1Ny42ODcgMCAwIDEgLTc1LjgxNyAtNTcuNjg3IDc1LjgxNyA1Ny42ODcgMCAwIDEgNzUuODE3IC01Ny42ODZ6IiBmaWxsPSIjODA4MDgwIi8+CgkJPGVsbGlwc2UgY3g9IjYzLjYxMSIgY3k9IjE3LjE4OCIgcng9IjczLjAyNSIgcnk9IjU1LjU2MiIgZmlsbD0iI2IzYjNiMyIgZmlsbC1vcGFjaXR5PSIuNTUzNzIiIGZpbHRlcj0idXJsKCNsKSIvPgoJCTxwYXRoIGQ9Im0xMzkuNDMgMTguMjI0Yy0xLjEyMjUgMzYuMDg2LTMzLjMxMyA2My4xMjUtNzUuMzMxIDYzLjEyNS00Mi4wMTcgMC03Ny45NS0zNC43MS03Ny45NS02Ni42NzkgNy4yOTY1IDIxLjUzOCAyNS4xMTEgNTIuMTA4IDc4LjY5OCA1Mi4zMDkgNTMuOTYyLTIuNjA1NCA2OS45MDUtMzQuODg3IDc0LjU4Mi00OC43NTR6IiBmaWxsPSIjODA4MDgwIi8+CgkJPGVsbGlwc2UgY3g9IjYwLjQ5NiIgY3k9IjEyLjEyOSIgcng9IjY4LjU5OSIgcnk9IjUyLjE5NSIgZmlsbD0iI2VjZWNlYyIgZmlsbC1vcGFjaXR5PSIuNTQ1NDUiIGZpbHRlcj0idXJsKCNtKSIvPgoJCTxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC45MTQ2MSAtLjUzNjUyIC41MzY1MiAuOTE0NjEgLTg5NC4zNCA0NDguMjkpIiBjeD0iOTY5Ljk1IiBjeT0iNjMuNzI0IiByeD0iMjguNDQzIiByeT0iMTIuNDM1IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii44MDE2NSIgZmlsdGVyPSJ1cmwoI2spIi8+CgkJPHBhdGggZD0ibTg2LjU0NSA3NS4wODYgMy42NjU0IDUuMjU0OCAyLjAwNDggMS42ODM3IDIuMDkxMSAwLjc2Mzg1IDAuOTQ2NiAwLjQ0MTc0IDkuMjMyMyAxMy43MzQgMS4xMDUyIDUuNDI2NSA2Mi43MTIgODkuOTA3YzguMTA1IDkuNjI1MiAyOC45OTUgMTIuMDIgMzIuMzM3LTMuMDkwNiAzLjE1MzItMTMuMTg1LTkuNDY5Mi0yMS42NTItMTYuNDY3LTMwLjc0OC0xOS41NDgtMjIuMzU4LTQ3LjU3LTU1LjE3OS01OC4yODgtNjcuNDQ1LTMuNTc0My0yLjIxMjQtMy4wOTY5LTAuOTY3NTUtNS45NDg3LTMuMjQ2Ni0yLjg1MTktMi4yNzkxLTcuNDI5Mi04LjAxODgtMTAuMjAyLTExLjEyOC0wLjgzNjMtMC45Mzc4Ny0wLjE5ODQtNC4xMDIyLTAuOTg4NS00Ljk4NTktMi41OTg4LTIuOTA2Ny00LjkwMy01LjQ3MTEtNi42MTkzLTcuMzY4NS02Ljc2NjctNC4xOTItMTguMTk3IDIuNDc2MS0xNS41ODIgMTAuODAyeiIgZmlsbD0iIzY2NiIvPgoJCTxnIGZpbGw9IiM0ZDRkNGQiPgoJCQk8cGF0aCBkPSJtMTEzLjQ5IDk0LjI2MmMzLjUwNzEgOS4xNTc4IDYuMDYwNiAxOC44NjUgMTAuODM0IDI3LjQzMiA2Ljg4NTggMTAuMTY2IDEyLjYyNCAyMS4yMzMgMjEuNDE2IDI5Ljk0NyA1LjUyNDggNS44Mzk1IDEwLjIwOSAxMi42NjggMTcuMzU4IDE2LjY2NCA1Ljk5MyA2LjI1NCAxNC45MjUgNS41MDU2IDIxLjk5MSA5LjQ3MTIgNy4xMjEzIDIuNDAzOCAxNi4yMTUgMTIuMjIgMTAuNDQgMTkuMTk3LTguMjk5MiA1Ljk1NjItMTkuOTU3IDIuNDY3Mi0yNi44NDMtNC4xNDItNi41OTU5LTguMjQ1Mi0xMi4xODUtMTcuNDA5LTE4LjM5LTI2LjAxLTE0Ljg4OC0yMS41MDUtMjkuNzEtNDMuMDc2LTQ0LjU5OC02NC41OCAxLjMyMjQtMy44ODcgMy40MjM2LTYuNjg0NiA3Ljc5MTYtNy45Nzg3eiIgZmlsdGVyPSJ1cmwoI2cpIi8+CgkJCTxwYXRoIGQ9Im0xMDguNDMgNzIuMTg2Yy0yLjA0NzctMC40OTI2NS00LjEyNDItMS4yMTE1LTYuMjQyNS0wLjY0OTA3LTIuODIxNiAwLjI1ODIzLTUuMjYxOSAxLjkyMjMtNy4xMjgyIDMuOTY2Ni0xLjA5NDggMC45MjI5MyAxLjU3NS0wLjM3OTc2IDIuMTg4NC0wLjQxOCAyLjA4ODItMC41MTk4NSA0LjI5MDItMC40OTI3MiA2LjQyNDctMC4zMTQ5MyAzLjAyNTUgMC4yMTIyMSA1LjMzMDUgMi4zMTc3IDcuNTYzNiA0LjEzNTIgMC42MTI0IDAuNDkyMzYgMS42OTg4IDEuMjIzMiAwLjU1MiAwLjE5MjkyLTAuODQ4NS0xLjE4MjYtMi41OTM1LTEuOTIwNC0yLjg3NjctMy4zODM0LTAuMTYwNC0xLjE3NjQtMC4zMjA5LTIuMzUyOC0wLjQ4MTMtMy41MjkyeiIgZmlsdGVyPSJ1cmwoI2gpIi8+CgkJCTxwYXRoIGQ9Im0xMTguMzUgODYuMjE3Yy0yLjQzODggMC4wMjQtNC45NzU3LTAuMjc1MjYtNy4yNTQ3IDAuODEzNzYtMi43MDYzIDAuODYzNzEtNC44OTc1IDIuMDc2MS04LjI3MzYgMS45OTI2LTEuMDk4NS0wLjE4MjktMi4zNTk0LTEuMTY2Mi0zLjgzMjUtMi4zNTM0LTEuNTU4My0xLjI1NTgtMy4yMjE1LTMuMjE1My0zLjY5NS0zLjMyMjIgMi45MTQ1IDQuNDE3NSA2LjEwOTYgOS4wMjIyIDkuMDI0MiAxMy40NCAwLjM1NSAxLjU2MTUgMC43MTQ4IDQuOTY2OCAxLjMwMjEgNS42NjI4IDIuNTQzOS0zLjI1NDcgNS4wMTgzLTYuNzQ4IDguNzIzMy04Ljc3OTggMi42ODQ4LTEuNDkyNiA1LjUwOTgtMy40MDAyIDguNzQ1MS0yLjk1NDQgMC45MDg5IDAuMTMyOTUgMy4zOTA3IDAuMjE4NDEgMS4xNTQ5LTAuNTU4MS0yLjEwODctMS4wNjU2LTQuMzA2NS0yLjEzNTUtNS44OTM4LTMuOTQxeiIgZmlsdGVyPSJ1cmwoI2kpIi8+CgkJPC9nPgoJCTxlbGxpcHNlIGN4PSIxODguMTMiIGN5PSIxODUuMTciIHJ4PSI3LjAxMTUiIHJ5PSI3LjE0MzciIGZpbGw9IiM5OTkiIGZpbHRlcj0idXJsKCNqKSIvPgoJCTxnIGZpbGw9IiNiM2IzYjMiPgoJCQk8cGF0aCBkPSJtMTI1LjIgOTMuNTUxYy0xLjkxLTAuMjc5MjItMy43NTc3LTAuMDIwNi01LjU1NjMgMC42NjE0Ni0wLjg2MTcgMS4zMzE2LTAuODQ5MyAyLjUzNzkgMC40NDI5IDMuNTYwOSAxOS45NjEgMjUuNDQ4IDM5LjkyMSA1MC44OTYgNTkuODgyIDc2LjM0MyAyLjgwNzIgMC42MTM3IDUuNjEwMiAxLjQ4ODIgOC40MiAxLjkzOSAxLjU3MDQtMC4zNDM4MyAzLjQwMi0wLjQ4OTAzIDQuMzg1MS0xLjY3NzkgMC4zMDg3LTIuMTczOS0xLjkzMzctMy4zNDY5LTIuOTkxNS00Ljk3NDEtMjEuNTI4LTI1LjI4NC00My4wNTUtNTAuNTY4LTY0LjU4Mi03NS44NTN6IiBmaWx0ZXI9InVybCgjZikiLz4KCQkJPHBhdGggZD0ibTEwMy45MS0zMi4zOTFjNy4yMzI3IDEzLjM0OCAxMS44MiAzMC4wNjkgNi4wMTA0IDQ0LjY1LTguMjg4MiAxNi4yNTktMjQuNDQ0IDI3LjQ4NC00Mi42MjEgMjkuNTc1LTIwLjU0MSA1LjMzMTktNDMuNjc4IDUuNjI3OS02Mi4zMzUtNS41NDYzLTE3LjgyOC01LjEyNTQgNC40MzQ4IDE0LjgzNiAxMC4xNTkgMTcuNjQ0IDMxLjMyOSAxOS4yMjUgNzUuMDUyIDE2LjY0NyAxMDQuMDUtNS45NDA5IDEyLjE3Ni0xMC44MjggMjIuOTY0LTI2LjMyNSAxOC43OTQtNDMuNDQ4LTMuOTA5NS0yMi4yNTYtMjMuNzAzLTM4LjEwNC00NC4xMzQtNDUuMDYgMy4xMTc0IDMuMDA1NCA2Ljg3NzEgNS4yMTggMTAuMDc2IDguMTI3MXoiIGZpbGwtb3BhY2l0eT0iLjQwOTA5IiBmaWx0ZXI9InVybCgjZSkiLz4KCQkJPHBhdGggZD0ibTEwMi4wNyA3NC45OTJoNC40OTAybDIuOTkzNCAxLjY4MzggOC43OTMxIDkuOTE1Ny00LjExNTktMC45MzU0NC0yLjYxOTIgMS4zMDk2eiIgZmlsbC1vcGFjaXR5PSIuNDA5MDkiIGZpbHRlcj0idXJsKCNkKSIvPgoJCTwvZz4KCQk8Zz4KCQkJPHBhdGggZD0ibTk1Ljc3IDYyLjk5MiA2LjQxNjEgOC40MDA1IDIuOTEwNS0wLjA2NjEgMi4wNTA1IDAuMzMwNzMgMS45ODQ0IDAuNjYxNDYtMC4zOTY5LTAuNzkzNzUtNi40MTYyLTcuMjA5OS0xLjM4OS0wLjcyNzYxLTIuMjQ5LTAuNTI5MTYtMS4wNTgzLTAuMDY2MnoiIGZpbGw9InVybCgjYikiIGZpbHRlcj0idXJsKCNjKSIvPgoJCQk8cGF0aCBkPSJtLTE0LjM2MyAxNC4xNzYgMC43OTM3NSAxMC4wNTQgNS4wMjcxIDExLjY0MiA1LjAyNzEgMTAuMDU0IDkuNzg5NiAxMC44NDggMTIuNDM1IDEwLjg0OCAxNC44MTcgNy42NzI5IDEyLjk2NSAzLjcwNDIgMTEuOTA2IDIuMTE2N2g4LjczMTJsMjAuNjM4LTIuNjQ1OCAxLjA1ODMtMS4wNTgzLTIuMzgxMy0zLjQzOTYgMC41MjkyLTUuODIwOCAzLjQzOTYtMi4zODEyIDMuNzA0Mi0yLjExNjcgNy45Mzc1LTQuNDk3OS0xNS4wODEgNC43NjI1LTE3LjcyNyAzLjE3NS0yMC42MzgtMS4wNTgzLTE2LjY2OS0zLjcwNDItMTYuOTMzLTguMjAyMS0xMS4xMTItOC40NjY3LTExLjkwNi0xNi40MDR6IiBmaWxsPSJ1cmwoI2EpIi8+CgkJCTx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDUyLjY0MikiIHg9IjIyMS4yMzgzNCIgeT0iLTM0LjUzODExMyIgZG9taW5hbnQtYmFzZWxpbmU9ImF1dG8iIGZpbGw9IiM2NjY2NjYiIGZvbnQtZmFtaWx5PSInT3BlbiBTYW5zJyIgZm9udC1zaXplPSI4LjkxMDNweCIgbGV0dGVyLXNwYWNpbmc9IjBweCIgc3Ryb2tlLXdpZHRoPSIuMDQ2NDA4IiB0ZXh0LWFsaWduPSJjZW50ZXIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHdvcmQtc3BhY2luZz0iMHB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtYWx0ZXJuYXRlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LXZhcmlhbnQtcG9zaXRpb246bm9ybWFsO2xpbmUtaGVpZ2h0OjEuMjU7c2hhcGUtcGFkZGluZzowO3RleHQtZGVjb3JhdGlvbi1jb2xvcjojMDAwMDAwO3RleHQtZGVjb3JhdGlvbi1saW5lOm5vbmU7dGV4dC1kZWNvcmF0aW9uLXN0eWxlOnNvbGlkO3RleHQtaW5kZW50OjA7dGV4dC1vcmllbnRhdGlvbjptaXhlZDt0ZXh0LXRyYW5zZm9ybTpub25lO3doaXRlLXNwYWNlOm5vcm1hbCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHRzcGFuIHg9IjIyMS4yMzgzNCIgeT0iLTM0LjUzODExMyIgZmlsbD0iIzY2NjY2NiIgc3Ryb2tlLXdpZHRoPSIuMDQ2NDA4Ij5naW90b2hhc2hpPC90c3Bhbj48L3RleHQ+CgkJPC9nPgoJPC9nPgo8L3N2Zz4\u003d\u0022);\n+ width:0px;\n+ height:0px;\n+ padding:2em 1.6em;\n+ vertical-align:middle;\n+\tmargin-right: 0.1em;\n+ background-repeat: no-repeat;\n+ color: rgba(0, 0, 0, 0);\n+}\n+\n+img.spinner {\n+\tdisplay: inline-block;\n+\tbackground: url(\u0022data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiCiAgaWQ9InN2Zy1zcGlubmVyIiAKICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgeD0iMHB4IiAKICB5PSIwcHgiIAogIHZpZXdCb3g9Ii0xMTIgLTEyOCA0NDggNTEyIgogIHhtbDpzcGFjZT0icHJlc2VydmUiPgoKCTxkZWZzPgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjkwOS4xMSIgeDI9Ijk5Ni42OSIgeTE9Ii03MS4wMzUiIHkyPSItMzEuNjEzIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05MTYuMDYgMTA1LjU4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjNGQ0ZDRkIiBvZmZzZXQ9IjAiLz4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iIzgwODA4MCIgc3RvcC1vcGFjaXR5PSIuMDgyNjQ1IiBvZmZzZXQ9IjEiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEwMjAuMyIgeDI9IjEwMTcuNiIgeTE9Ii0zNy44NjMiIHkyPSItMzUuMzgzIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05MTYuMDYgMTA1LjU4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjOTk5IiBvZmZzZXQ9IjAiLz4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iIzk5OSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDg1NTgiIHk9Ii0uMTIyNiIgd2lkdGg9IjEuMTcxMiIgaGVpZ2h0PSIxLjI0NTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDc2NDQ5MzkiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJkIiB4PSItLjIxNjYxIiB5PSItLjI5NDQ1IiB3aWR0aD0iMS40MzMyIiBoZWlnaHQ9IjEuNTg4OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KCQkJPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS40NjkwMTk0Ii8+CgkJPC9maWx0ZXI+CgkJPGZpbHRlciBpZD0iZSIgeD0iLS4wNTkyMjgiIHk9Ii0uMDc3NjUyIiB3aWR0aD0iMS4xMTg1IiBoZWlnaHQ9IjEuMTU1MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KCQkJPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMy40NzIzODc4Ii8+CgkJPC9maWx0ZXI+CgkJPGZpbHRlciBpZD0iZiIgeD0iLS4wNzUwNTMiIHk9Ii0uMDY3MDAzIiB3aWR0aD0iMS4xNTAxIiBoZWlnaHQ9IjEuMTM0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgoJCQk8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjMwNjQ1MzgiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJqIiB4PSItLjcwMzc4IiB5PSItLjY5MDc0IiB3aWR0aD0iMi40MDc2IiBoZWlnaHQ9IjIuMzgxNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KCQkJPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNC4xMTIwODgiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJpIiB4PSItLjA2MSIgeT0iLS4wOTUzNDUiIHdpZHRoPSIxLjEyMiIgaGVpZ2h0PSIxLjE5MDciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzU4ODkwNDIiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJoIiB4PSItLjA3OTU4NyIgeT0iLS4xNjc5NyIgd2lkdGg9IjEuMTU5MiIgaGVpZ2h0PSIxLjMzNTkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNTgwMDg2MTUiLz4KCQk8L2ZpbHRlcj4KCQk8ZmlsdGVyIGlkPSJnIiB4PSItLjAzMjI5NSIgeT0iLS4wMjgwMDkiIHdpZHRoPSIxLjA2NDYiIGhlaWdodD0iMS4wNTYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMjM0MzQ2OCIvPgoJCTwvZmlsdGVyPgoJCTxmaWx0ZXIgaWQ9ImsiIHg9Ii0uMTY2NDgiIHk9Ii0uMzQ5ODEiIHdpZHRoPSIxLjMzMyIgaGVpZ2h0PSIxLjY5OTYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMuODg4NzYzNiIvPgoJCTwvZmlsdGVyPgoJCTxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDM1OTIyIiB5PSItLjA0NzIxMSIgd2lkdGg9IjEuMDcxOCIgaGVpZ2h0PSIxLjA5NDQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMDUzNDk2NiIvPgoJCTwvZmlsdGVyPgoJCTxmaWx0ZXIgaWQ9ImwiIHg9Ii0uMDM1OTIyIiB5PSItLjA0NzIxMSIgd2lkdGg9IjEuMDcxOCIgaGVpZ2h0PSIxLjA5NDQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CgkJCTxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMTg1OTg3NSIvPgoJCTwvZmlsdGVyPgoJPC9kZWZzPgoJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTkuMDQ0IDUzLjQ5MSkiPgoJCTxwYXRoIGQ9Im0tOC44MDY4IDI2LjA4MmMtMy4wMzI4LTM1LjM1MyAyOC43MTItNjIuMTY3IDY0LjY1My02NC4wMTcgMjIuOTg5LTIuNTkzMiA2Ni44MTkgOS4wNDY5IDgyLjk1NSA0Ni4yOTMtMS4yODAxLTIxLjkyMy0yNS45NjctNjguMjkxLTEwOC43OC00OS4yOTMtMjUuMzc2IDguMjg5Mi01MS4zMzYgMzUuMzQ3LTQxLjQxMSA2My41NTZ6IiBmaWxsPSIjOTk5Ii8+CgkJPGVsbGlwc2UgY3g9IjYzLjgzMiIgY3k9IjEzLjY5NyIgcng9Ijc1LjgwNyIgcnk9IjU3LjY3OSIgZmlsbD0iI2IzYjNiMyIgZmlsbC1vcGFjaXR5PSIuNDQyMTUiLz4KCQk8cGF0aCBkPSJtNjIuNzU1LTQ3LjQ3MmE3Ny43ODQgNTkuMTgzIDAgMCAwIC03Ny43ODMgNTkuMTgzIDc3Ljc4NCA1OS4xODMgMCAwIDAgNzcuNzgzIDU5LjE4MyA3Ny43ODQgNTkuMTgzIDAgMCAwIDc3Ljc4NCAtNTkuMTgzIDc3Ljc4NCA1OS4xODMgMCAwIDAgLTc3Ljc4NCAtNTkuMTgzem0wLjEyNjEgMi4xMDI3YTc1LjgxNyA1Ny42ODcgMCAwIDEgNzUuODE3IDU3LjY4NiA3NS44MTcgNTcuNjg3IDAgMCAxIC03NS44MTcgNTcuNjg3IDc1LjgxNyA1Ny42ODcgMCAwIDEgLTc1LjgxNyAtNTcuNjg3IDc1LjgxNyA1Ny42ODcgMCAwIDEgNzUuODE3IC01Ny42ODZ6IiBmaWxsPSIjODA4MDgwIi8+CgkJPGVsbGlwc2UgY3g9IjYzLjYxMSIgY3k9IjE3LjE4OCIgcng9IjczLjAyNSIgcnk9IjU1LjU2MiIgZmlsbD0iI2IzYjNiMyIgZmlsbC1vcGFjaXR5PSIuNTUzNzIiIGZpbHRlcj0idXJsKCNsKSIvPgoJCTxwYXRoIGQ9Im0xMzkuNDMgMTguMjI0Yy0xLjEyMjUgMzYuMDg2LTMzLjMxMyA2My4xMjUtNzUuMzMxIDYzLjEyNS00Mi4wMTcgMC03Ny45NS0zNC43MS03Ny45NS02Ni42NzkgNy4yOTY1IDIxLjUzOCAyNS4xMTEgNTIuMTA4IDc4LjY5OCA1Mi4zMDkgNTMuOTYyLTIuNjA1NCA2OS45MDUtMzQuODg3IDc0LjU4Mi00OC43NTR6IiBmaWxsPSIjODA4MDgwIi8+CgkJPGVsbGlwc2UgY3g9IjYwLjQ5NiIgY3k9IjEyLjEyOSIgcng9IjY4LjU5OSIgcnk9IjUyLjE5NSIgZmlsbD0iI2VjZWNlYyIgZmlsbC1vcGFjaXR5PSIuNTQ1NDUiIGZpbHRlcj0idXJsKCNtKSIvPgoJCTxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC45MTQ2MSAtLjUzNjUyIC41MzY1MiAuOTE0NjEgLTg5NC4zNCA0NDguMjkpIiBjeD0iOTY5Ljk1IiBjeT0iNjMuNzI0IiByeD0iMjguNDQzIiByeT0iMTIuNDM1IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii44MDE2NSIgZmlsdGVyPSJ1cmwoI2spIi8+CgkJPHBhdGggZD0ibTg2LjU0NSA3NS4wODYgMy42NjU0IDUuMjU0OCAyLjAwNDggMS42ODM3IDIuMDkxMSAwLjc2Mzg1IDAuOTQ2NiAwLjQ0MTc0IDkuMjMyMyAxMy43MzQgMS4xMDUyIDUuNDI2NSA2Mi43MTIgODkuOTA3YzguMTA1IDkuNjI1MiAyOC45OTUgMTIuMDIgMzIuMzM3LTMuMDkwNiAzLjE1MzItMTMuMTg1LTkuNDY5Mi0yMS42NTItMTYuNDY3LTMwLjc0OC0xOS41NDgtMjIuMzU4LTQ3LjU3LTU1LjE3OS01OC4yODgtNjcuNDQ1LTMuNTc0My0yLjIxMjQtMy4wOTY5LTAuOTY3NTUtNS45NDg3LTMuMjQ2Ni0yLjg1MTktMi4yNzkxLTcuNDI5Mi04LjAxODgtMTAuMjAyLTExLjEyOC0wLjgzNjMtMC45Mzc4Ny0wLjE5ODQtNC4xMDIyLTAuOTg4NS00Ljk4NTktMi41OTg4LTIuOTA2Ny00LjkwMy01LjQ3MTEtNi42MTkzLTcuMzY4NS02Ljc2NjctNC4xOTItMTguMTk3IDIuNDc2MS0xNS41ODIgMTAuODAyeiIgZmlsbD0iIzY2NiIvPgoJCTxnIGZpbGw9IiM0ZDRkNGQiPgoJCQk8cGF0aCBkPSJtMTEzLjQ5IDk0LjI2MmMzLjUwNzEgOS4xNTc4IDYuMDYwNiAxOC44NjUgMTAuODM0IDI3LjQzMiA2Ljg4NTggMTAuMTY2IDEyLjYyNCAyMS4yMzMgMjEuNDE2IDI5Ljk0NyA1LjUyNDggNS44Mzk1IDEwLjIwOSAxMi42NjggMTcuMzU4IDE2LjY2NCA1Ljk5MyA2LjI1NCAxNC45MjUgNS41MDU2IDIxLjk5MSA5LjQ3MTIgNy4xMjEzIDIuNDAzOCAxNi4yMTUgMTIuMjIgMTAuNDQgMTkuMTk3LTguMjk5MiA1Ljk1NjItMTkuOTU3IDIuNDY3Mi0yNi44NDMtNC4xNDItNi41OTU5LTguMjQ1Mi0xMi4xODUtMTcuNDA5LTE4LjM5LTI2LjAxLTE0Ljg4OC0yMS41MDUtMjkuNzEtNDMuMDc2LTQ0LjU5OC02NC41OCAxLjMyMjQtMy44ODcgMy40MjM2LTYuNjg0NiA3Ljc5MTYtNy45Nzg3eiIgZmlsdGVyPSJ1cmwoI2cpIi8+CgkJCTxwYXRoIGQ9Im0xMDguNDMgNzIuMTg2Yy0yLjA0NzctMC40OTI2NS00LjEyNDItMS4yMTE1LTYuMjQyNS0wLjY0OTA3LTIuODIxNiAwLjI1ODIzLTUuMjYxOSAxLjkyMjMtNy4xMjgyIDMuOTY2Ni0xLjA5NDggMC45MjI5MyAxLjU3NS0wLjM3OTc2IDIuMTg4NC0wLjQxOCAyLjA4ODItMC41MTk4NSA0LjI5MDItMC40OTI3MiA2LjQyNDctMC4zMTQ5MyAzLjAyNTUgMC4yMTIyMSA1LjMzMDUgMi4zMTc3IDcuNTYzNiA0LjEzNTIgMC42MTI0IDAuNDkyMzYgMS42OTg4IDEuMjIzMiAwLjU1MiAwLjE5MjkyLTAuODQ4NS0xLjE4MjYtMi41OTM1LTEuOTIwNC0yLjg3NjctMy4zODM0LTAuMTYwNC0xLjE3NjQtMC4zMjA5LTIuMzUyOC0wLjQ4MTMtMy41MjkyeiIgZmlsdGVyPSJ1cmwoI2gpIi8+CgkJCTxwYXRoIGQ9Im0xMTguMzUgODYuMjE3Yy0yLjQzODggMC4wMjQtNC45NzU3LTAuMjc1MjYtNy4yNTQ3IDAuODEzNzYtMi43MDYzIDAuODYzNzEtNC44OTc1IDIuMDc2MS04LjI3MzYgMS45OTI2LTEuMDk4NS0wLjE4MjktMi4zNTk0LTEuMTY2Mi0zLjgzMjUtMi4zNTM0LTEuNTU4My0xLjI1NTgtMy4yMjE1LTMuMjE1My0zLjY5NS0zLjMyMjIgMi45MTQ1IDQuNDE3NSA2LjEwOTYgOS4wMjIyIDkuMDI0MiAxMy40NCAwLjM1NSAxLjU2MTUgMC43MTQ4IDQuOTY2OCAxLjMwMjEgNS42NjI4IDIuNTQzOS0zLjI1NDcgNS4wMTgzLTYuNzQ4IDguNzIzMy04Ljc3OTggMi42ODQ4LTEuNDkyNiA1LjUwOTgtMy40MDAyIDguNzQ1MS0yLjk1NDQgMC45MDg5IDAuMTMyOTUgMy4zOTA3IDAuMjE4NDEgMS4xNTQ5LTAuNTU4MS0yLjEwODctMS4wNjU2LTQuMzA2NS0yLjEzNTUtNS44OTM4LTMuOTQxeiIgZmlsdGVyPSJ1cmwoI2kpIi8+CgkJPC9nPgoJCTxlbGxpcHNlIGN4PSIxODguMTMiIGN5PSIxODUuMTciIHJ4PSI3LjAxMTUiIHJ5PSI3LjE0MzciIGZpbGw9IiM5OTkiIGZpbHRlcj0idXJsKCNqKSIvPgoJCTxnIGZpbGw9IiNiM2IzYjMiPgoJCQk8cGF0aCBkPSJtMTI1LjIgOTMuNTUxYy0xLjkxLTAuMjc5MjItMy43NTc3LTAuMDIwNi01LjU1NjMgMC42NjE0Ni0wLjg2MTcgMS4zMzE2LTAuODQ5MyAyLjUzNzkgMC40NDI5IDMuNTYwOSAxOS45NjEgMjUuNDQ4IDM5LjkyMSA1MC44OTYgNTkuODgyIDc2LjM0MyAyLjgwNzIgMC42MTM3IDUuNjEwMiAxLjQ4ODIgOC40MiAxLjkzOSAxLjU3MDQtMC4zNDM4MyAzLjQwMi0wLjQ4OTAzIDQuMzg1MS0xLjY3NzkgMC4zMDg3LTIuMTczOS0xLjkzMzctMy4zNDY5LTIuOTkxNS00Ljk3NDEtMjEuNTI4LTI1LjI4NC00My4wNTUtNTAuNTY4LTY0LjU4Mi03NS44NTN6IiBmaWx0ZXI9InVybCgjZikiLz4KCQkJPHBhdGggZD0ibTEwMy45MS0zMi4zOTFjNy4yMzI3IDEzLjM0OCAxMS44MiAzMC4wNjkgNi4wMTA0IDQ0LjY1LTguMjg4MiAxNi4yNTktMjQuNDQ0IDI3LjQ4NC00Mi42MjEgMjkuNTc1LTIwLjU0MSA1LjMzMTktNDMuNjc4IDUuNjI3OS02Mi4zMzUtNS41NDYzLTE3LjgyOC01LjEyNTQgNC40MzQ4IDE0LjgzNiAxMC4xNTkgMTcuNjQ0IDMxLjMyOSAxOS4yMjUgNzUuMDUyIDE2LjY0NyAxMDQuMDUtNS45NDA5IDEyLjE3Ni0xMC44MjggMjIuOTY0LTI2LjMyNSAxOC43OTQtNDMuNDQ4LTMuOTA5NS0yMi4yNTYtMjMuNzAzLTM4LjEwNC00NC4xMzQtNDUuMDYgMy4xMTc0IDMuMDA1NCA2Ljg3NzEgNS4yMTggMTAuMDc2IDguMTI3MXoiIGZpbGwtb3BhY2l0eT0iLjQwOTA5IiBmaWx0ZXI9InVybCgjZSkiLz4KCQkJPHBhdGggZD0ibTEwMi4wNyA3NC45OTJoNC40OTAybDIuOTkzNCAxLjY4MzggOC43OTMxIDkuOTE1Ny00LjExNTktMC45MzU0NC0yLjYxOTIgMS4zMDk2eiIgZmlsbC1vcGFjaXR5PSIuNDA5MDkiIGZpbHRlcj0idXJsKCNkKSIvPgoJCTwvZz4KCQk8Zz4KCQkJPHBhdGggZD0ibTk1Ljc3IDYyLjk5MiA2LjQxNjEgOC40MDA1IDIuOTEwNS0wLjA2NjEgMi4wNTA1IDAuMzMwNzMgMS45ODQ0IDAuNjYxNDYtMC4zOTY5LTAuNzkzNzUtNi40MTYyLTcuMjA5OS0xLjM4OS0wLjcyNzYxLTIuMjQ5LTAuNTI5MTYtMS4wNTgzLTAuMDY2MnoiIGZpbGw9InVybCgjYikiIGZpbHRlcj0idXJsKCNjKSIvPgoJCQk8cGF0aCBkPSJtLTE0LjM2MyAxNC4xNzYgMC43OTM3NSAxMC4wNTQgNS4wMjcxIDExLjY0MiA1LjAyNzEgMTAuMDU0IDkuNzg5NiAxMC44NDggMTIuNDM1IDEwLjg0OCAxNC44MTcgNy42NzI5IDEyLjk2NSAzLjcwNDIgMTEuOTA2IDIuMTE2N2g4LjczMTJsMjAuNjM4LTIuNjQ1OCAxLjA1ODMtMS4wNTgzLTIuMzgxMy0zLjQzOTYgMC41MjkyLTUuODIwOCAzLjQzOTYtMi4zODEyIDMuNzA0Mi0yLjExNjcgNy45Mzc1LTQuNDk3OS0xNS4wODEgNC43NjI1LTE3LjcyNyAzLjE3NS0yMC42MzgtMS4wNTgzLTE2LjY2OS0zLjcwNDItMTYuOTMzLTguMjAyMS0xMS4xMTItOC40NjY3LTExLjkwNi0xNi40MDR6IiBmaWxsPSJ1cmwoI2EpIi8+CgkJCTx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDUyLjY0MikiIHg9IjIyMS4yMzgzNCIgeT0iLTM0LjUzODExMyIgZG9taW5hbnQtYmFzZWxpbmU9ImF1dG8iIGZpbGw9IiM2NjY2NjYiIGZvbnQtZmFtaWx5PSInT3BlbiBTYW5zJyIgZm9udC1zaXplPSI4LjkxMDNweCIgbGV0dGVyLXNwYWNpbmc9IjBweCIgc3Ryb2tlLXdpZHRoPSIuMDQ2NDA4IiB0ZXh0LWFsaWduPSJjZW50ZXIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHdvcmQtc3BhY2luZz0iMHB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtYWx0ZXJuYXRlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LXZhcmlhbnQtcG9zaXRpb246bm9ybWFsO2xpbmUtaGVpZ2h0OjEuMjU7c2hhcGUtcGFkZGluZzowO3RleHQtZGVjb3JhdGlvbi1jb2xvcjojMDAwMDAwO3RleHQtZGVjb3JhdGlvbi1saW5lOm5vbmU7dGV4dC1kZWNvcmF0aW9uLXN0eWxlOnNvbGlkO3RleHQtaW5kZW50OjA7dGV4dC1vcmllbnRhdGlvbjptaXhlZDt0ZXh0LXRyYW5zZm9ybTpub25lO3doaXRlLXNwYWNlOm5vcm1hbCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHRzcGFuIHg9IjIyMS4yMzgzNCIgeT0iLTM0LjUzODExMyIgZmlsbD0iIzY2NjY2NiIgc3Ryb2tlLXdpZHRoPSIuMDQ2NDA4Ij5naW90b2hhc2hpPC90c3Bhbj48L3RleHQ+CgkJPC9nPgoJPC9nPgogIAogIDxhbmltYXRlVHJhbnNmb3JtIAogICAgYXR0cmlidXRlVHlwZT0ieG1sIgogICAgYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIgogICAgdHlwZT0icm90YXRlIiAKICAgIGZyb209IjAgMCAwIgogICAgdG89IjM2MCAwIDAiIAogICAgZHVyPSIyMi44cyIKICAgIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIgogIC8+IAo8L3N2Zz4\u003d\u0022);\n+\twidth:0px;\n+\theight:0px;\n+\tpadding:2.25em 2em 2.25em 2em;\n+\tmargin: 0 0.8em;\n+\tbackground-repeat: no-repeat;\n+\tline-height:100%;\n+\tvertical-align:middle;\n+\tcolor: rgba(0, 0, 0, 0);\n+}\n+\n+img.noentry {\n+\tdisplay: inline-block;\n+\tbackground: url(\u0022data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzMy4wNTQyMDcgMzMuMDQ0NzI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgoJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY5LjY1MSAtNjguODExKSI+CgkJPGNpcmNsZSBjeD0iODYuMzk1IiBjeT0iODUuMzQiIHI9IjE1Ljk0OSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iLjc0MiIvPgoJCTxwYXRoIGQ9Im04My4zMDYgMTAxLjY4Yy0yLjI5MDItMC40MDg2NC00Ljg2NTItMS40OTg5LTYuNzktMi44NzQ5LTMuNTAwOC0yLjUwMjYtNS45NDE1LTYuNDIyNS02LjY5NzItMTAuNzU2LTAuMjIzMDEtMS4yNzg5LTAuMjIzMDEtNC4xNDUzIDAtNS40MjQyIDAuNDIzNTYtMi40Mjg5IDEuNDc1NC00Ljk1OTIgMi44ODE2LTYuOTMxOSAyLjQ5MTMtMy40OTQ5IDYuNDQ3LTUuOTYyNCAxMC43NjYtNi43MTU1IDEuMjc4OS0wLjIyMzAyIDQuMTQ1NC0wLjIyMzAyIDUuNDI0MiAwIDIuNDM2MiAwLjQyNDg0IDQuOTU3NyAxLjQ3NDggNi45NTA0IDIuODk0MiAzLjQ2ODQgMi40NzA2IDUuOTYxOSA2LjQ1NzQgNi42ODk5IDEwLjY5NiAwLjIzMDA0IDEuMzM5NiAwLjIzMzc4IDQuMTgxOSA4ZS0zIDUuNDgxMi0wLjM4NzA1IDIuMjE5NS0xLjM2ODcgNC43MjA2LTIuNTMxMiA2LjQ0OTItMi41ODEyIDMuODM4Mi02LjUzNyA2LjM5OTctMTEuMTE2IDcuMTk4My0xLjI1MjIgMC4yMTgzNi00LjMxODQgMC4yMDkxNC01LjU4NDYtMC4wMTczem0tMy45Mjc2LTUuODQ5NmMwLTAuNDY0NzEgMC4wNjQ1LTAuNDQxODMtMS4yODk3LTAuNDU3NDctMC41NDgxMi02ZS0zIC0xLjA2MjUtMC4wNTQzLTEuMTQzMS0wLjEwNjQxLTAuMTg3OTktMC4xMjE2LTAuMTkyNTYtMS4xNjA1LTZlLTMgLTEuMzQ3MiAwLjA3NzMtMC4wNzczIDAuNDQ2NjktMC4xNDA2NSAwLjgyMDY5LTAuMTQwNjVoMC42ODAwMXYtMC44MjA3aC0wLjY4OTA5Yy0wLjgyNjc2IDAtMC45ODA2OC0wLjEzOTMtMC45MzAxNi0wLjg0MTM0bDAuMDM2Ni0wLjUwNjk0IDAuOTM3OTUtMC4wMjk0YzEuMzg3NS0wLjA0MzcgMS40ODctMC4wODAyIDEuNDQzNC0wLjUzMTRsLTAuMDM2NC0wLjM3NzAyaC0zLjE2NTZsLTAuMDMxNCAyLjc4NDUtMC4wMzE0IDIuNzg0NWgzLjQwNDN6bTEuNzU4Ni0xLjI5OTRjMC0xLjI2NTMgMC4wMzYyLTEuNjk3OCAwLjEzODkyLTEuNjYzNSAwLjA3NjQgMC4wMjU0IDAuNTYxNTMgMC43OTQ4NiAxLjA3ODEgMS43MDk4IDAuOTEzMzMgMS42MTc1IDAuOTUwMDQgMS42NjM1IDEuMzI4OCAxLjY2MzVoMC4zODk0OWwtMC4wMzE0LTIuNzg0NS0wLjAzMTQtMi43ODQ1aC0wLjcwMzQ2bC0wLjA1ODcgMS41NTQxYy0wLjAzMjMgMC44NTQ3NS0wLjEwODUxIDEuNTU5Ni0wLjE2OTMyIDEuNTY2NC0wLjA2MSA4ZS0zIC0wLjUxMDY5LTAuNjkyNTctMC45OTk1LTEuNTU0MS0wLjg3MzQtMS41Mzk0LTAuODk1NzgtMS41NjY0LTEuMjk2Mi0xLjU2NjRoLTAuNDA3NGwtMC4wMzE0IDIuNzg0NS0wLjAzMTQgMi43ODQ1aDAuODI0OTN6bTUuOTc5NC0wLjY5MzY5IDAuMDU4Ny0yLjM0NDkgMC41ODYyMy0wLjA1ODdjMC41NjAxNi0wLjA1NiAwLjU4NjIxLTAuMDc0MyAwLjU4NjIxLTAuNDEwMzV2LTAuMzUxNzJsLTEuNjYxOC0wLjAzMjVjLTEuNTkzMS0wLjAzMTItMS42NjUtMC4wMjI1LTEuNzM5IDAuMjEwOC0wLjExODMzIDAuMzcyOTkgMC4xNDEwNCAwLjU4Mzc1IDAuNzE4NTkgMC41ODM3NWgwLjUxMzIzdjIuMzI1M2MwIDEuMjc4OSAwLjAzNzcgMi4zNjMgMC4wODM3IDIuNDA5IDAuMDQ2IDAuMDQ2IDAuMjQzODkgMC4wNjgxIDAuNDM5NjcgMC4wNDg5bDAuMzU1OTQtMC4wMzQ4em0zLjA0ODMgMS4xNzI0IDAuMDU4Ny0xLjE3MjQgMC40MjAzNy0wLjAzNTJjMC4yNDM0LTAuMDIwNCAwLjQ3NDAyIDAuMDI5NCAwLjU0Nzc1IDAuMTE4MzQgMC4wNyAwLjA4NDUgMC4zMDQxOCAwLjYyNzg0IDAuNTIwMjcgMS4yMDc2IDAuMzkxNzMgMS4wNTExIDAuMzk0MTkgMS4wNTQzIDAuODI5ODQgMS4wOTA2IDAuNTM2MzIgMC4wNDQ2IDAuNTQwNzEtNmUtMyAwLjEwMTAxLTEuMTUyOS0wLjUyODg5LTEuMzc5OC0wLjUyNDA4LTEuMzE3OS0wLjEzNTQ1LTEuNzUzIDAuNTUwMjUtMC42MTYzNCAwLjYwNTQzLTEuMzg2NiAwLjE0OTExLTIuMDgyOS0wLjMwNDEtMC40NjQwOS0wLjgyOTM1LTAuNjE2NjMtMi4xMjM0LTAuNjE2NjMtMC45NTI5NSAwLTEuMTc2NSAwLjAzMzctMS4yMzQ4IDAuMTg1NDgtMC4xMDA2MyAwLjI2MjI0LTAuMDg4OSA1LjI2ODEgMC4wMTM1IDUuMzY5NiAwLjA0NiAwLjA0NiAwLjI0Mzg4IDAuMDY3OSAwLjQzOTY2IDAuMDQ4OWwwLjM1NTkzLTAuMDM0OHptMC4wNDc1LTIuMjE0MmMtMC4wMzQzLTAuMDg5My0wLjA0NTgtMC4zOTI3MS0wLjAyNTYtMC42NzQxNGwwLjAzNjctMC41MTE2OSAwLjcxOTE0LTAuMDM0NmMwLjU0MDI1LTAuMDI2IDAuNzY2MjkgMC4wMTM1IDAuOTA4NjMgMC4xNTQ4OSAwLjI3ODA1IDAuMjc4MDcgMC4yNDA3MiAwLjgyNzAxLTAuMDcxIDEuMDQ1NC0wLjMzNjk0IDAuMjM2MDEtMS40NzkzIDAuMjUwNjItMS41Njc4IDAuMDJ6bTYuMzc1NiAyLjE4MTEgMC4wMzM1LTEuMjA1NiAwLjg3NTE3LTEuNDM4MmMwLjQ4MTM1LTAuNzkxMDMgMC44NzUxOS0xLjUwNDcgMC44NzUxOS0xLjU4NiAwLTAuMDk5MS0wLjE0NDY5LTAuMTM1ODQtMC40Mzg5NC0wLjExMTQtMC4zOTgxOSAwLjAzMzEtMC40ODQzNyAwLjEwNzE3LTAuOTI4MjcgMC43OTg0Ni0wLjI2OTE1IDAuNDE5MTYtMC41NzI4MiAwLjg2NzYtMC42NzQ4OCAwLjk5NjU4bC0wLjE4NTQ4IDAuMjM0NDYtMC4xODU0OC0wLjIzNDQ2Yy0wLjEwMTk4LTAuMTI4OTItMC40MDU3My0wLjU3NzQyLTAuNjc0ODctMC45OTY1OC0wLjQ0MzkxLTAuNjkxMzMtMC41MzAwOS0wLjc2NTQ0LTAuOTI4MjgtMC43OTg0Ni0wLjMxMzI2LTAuMDI2LTAuNDM4OTQgMC4wMS0wLjQzODk0IDAuMTI2MDMgMCAwLjA4OTMgMC4zOTU3MSAwLjgwMDIgMC44NzkzMyAxLjU3OThsMC44NzkzMiAxLjQxNzV2MS4xNjI5YzAgMC42Mzk2MSAwLjAzNzcgMS4yMDA2IDAuMDgzNyAxLjI0NjYgMC4wNDYgMC4wNDYgMC4yNDM4OCAwLjA2ODEgMC40Mzk2NSAwLjA0ODlsMC4zNTU5Ni0wLjAzNDh6bTMuNjM2Mi02LjczMThjMC4xNDg3NC0wLjE0ODczIDAuMjExMzgtNC45MzE4IDAuMDY5NS01LjMwMTUtMC4wNjQzLTAuMTY3NTktMS40MTctMC4xODU0OC0xNC4xMTUtMC4xODU0OC0xMi42OTggMC0xNC4wNTEgMC4wMTczLTE0LjExNSAwLjE4NTQ4LTAuMTI0MyAwLjMyMzktMC4wNzk1IDQuOTczIDAuMDUwMiA1LjIxNTQgMC4xMTg5MSAwLjIyMjI1IDAuMzk5MTIgMC4yMjY3OSAxNC4wNDYgMC4yMjY3OSAxMC42NzQgMCAxMy45NTctMC4wMzI5IDE0LjA2NS0wLjE0MDY1em0tMTAuNDQtOC40OTYyYzAuNzAwNzctMC41MjMyIDEuMDYyNC0xLjkyOTYgMC44NDUzNy0zLjI4OC0wLjIxNjIxLTEuMzUzMy0wLjg0MTIxLTIuMDI1Ny0xLjg4MzktMi4wMjY1LTEuMDcxLTllLTQgLTEuODAyMyAwLjg4Njc1LTEuOTM5MyAyLjM1MzYtMC4xMzQzIDEuNDM4OSAwLjMxMTM4IDIuNjQ4NyAxLjEzMjkgMy4wNzQ5IDAuNTExMjUgMC4yNjUyNCAxLjQxMTUgMC4yMDk1OSAxLjg0NDktMC4xMTM5em0tMS42NDUxLTAuODMwNjVjLTAuMzExNDktMC4zNDQxOC0wLjQzNjY3LTAuODI2MzctMC40MzY2Ny0xLjY4MTkgMC0wLjk0OTY1IDAuMjA1MzUtMS41Mjg3IDAuNjQ0MTItMS44MTYyIDAuNjY0MjctMC40MzUyNCAxLjMyODIgMC4xODA0OCAxLjQzMjMgMS4zMjgzIDAuMTM5MTEgMS41MzMyLTAuMjM1NDEgMi4zNzUyLTEuMDU2MyAyLjM3NTItMC4yMjk4MyAwLTAuNDc1OS0wLjA4NjYtMC41ODMzOC0wLjIwNTR6bS01LjY2NjUgMC44NDA2NGMwLjAzOTEtMC4xMDE5OCAwLjA3MTItMC44NDA2MiAwLjA3MTItMS42NDE0IDAtMC44MDA3NyAwLjAzOTYtMS40NTU5IDAuMDg3OS0xLjQ1NTcgMC4wNDgzIDllLTUgMC40OTEzOSAwLjcyNTUzIDAuOTg0NSAxLjYxMjEgMC44MjcwOSAxLjQ4NyAwLjkyNDc1IDEuNjE0OCAxLjI2MDQgMS42NDg2IDAuMjAwMzggMC4wMjAyIDAuMzY1NDgtMC4wMTkyIDAuMzY3NTQtMC4wODc5IDJlLTMgLTAuMDY4NSA0ZS0zIC0xLjIzMjYgNGUtMyAtMi41ODY4IDAtMS4zNTQyLTJlLTMgLTIuNTE4Mi00ZS0zIC0yLjU4NjgtMmUtMyAtMC4wNjk1LTAuMTcyMjEtMC4xMDg1Mi0wLjM4NDc4LTAuMDg3OWwtMC4zODEwMiAwLjAzNjctMC4wMzI3IDEuNDk0OGMtMC4wMTczIDAuODIyMTYtMC4wNzM5IDEuNDk0OC0wLjEyMzkyIDEuNDk0OC0wLjA1MDIgMC0wLjQ2NTEyLTAuNjcyNjgtMC45MjIxOS0xLjQ5NDgtMC43NzY1OC0xLjM5Ny0wLjg1NTk3LTEuNDk3NC0xLjIxMi0xLjUzMjktMC4yMjU0Ni0wLjAyMjUtMC40MjExNiAwLjAyNTQtMC40Nzk0MiAwLjExNzE3LTAuMTExNzkgMC4xNzY0NC0wLjEzOTg4IDQuNzg1Ny0wLjAzMDggNS4wNjk4IDAuMDQxNCAwLjEwNzc1IDAuMjA4MTEgMC4xODU0OCAwLjM5NzgxIDAuMTg1NDggMC4xODk3MSAwIDAuMzU2NDktMC4wNzc3IDAuMzk3ODItMC4xODU0OHoiIGZpbGw9IiNlYzIyMjkiIHN0cm9rZS13aWR0aD0iLjExNzI0Ii8+Cgk8L2c+Cjwvc3ZnPgo\u003d\u0022);\n+\twidth:0px;\n+\theight:0px;\n+\tpadding:2.25em 2em 2.25em 2em;\n+\tmargin: 0 0.8em;\n+\tbackground-repeat: no-repeat;\n+\tline-height:100%;\n+\tvertical-align:middle;\n+\tfont-size: 20pt;\n+\tcolor: rgba(0, 0, 0, 0);\n+}\n+\n+div.searchbg {\n+\tbackground-repeat: no-repeat;\n+\tbackground-image: url(\u0022dorian-gray-wikipedia.jpg\u0022);\n+\tbackground-position: left top;\n+\twidth: 561px;\n+\theight: 844px;\n+\tpadding: 10px;\n+\tpadding-top: 20px;\n+\ttext-align:center;\n+}\n+\n+table.searchtable {\n+\tposition:relative;\n+\tdisplay:inline-table;\n+\tpadding-top: 6px;\n+}\n+\n+div.acomplete {\n+\tposition:absolute;\n+\tdisplay:block;\n+\tfloat:right;\n+\ttext-align:left;\n+\tbackground-color: #aaa;\n+\tfont-size: 12pt;\n+\tmax-height: 50vh;\n+\tright:0px;\n+\tmargin: 0px;\n+\tpadding: 0px 1px;\n+\toverflow:auto;\n+\topacity: 0;\n+\tz-index: 4;\n+\tborder: 1px solid gray;\n+\tborder-radius: 3px;\n+\tbackground-color: white;\n+\twhite-space: nowrap;\n+\tbox-shadow: 0px 5px 15px gray;\n+\ttransition: opacity 0.3s;\n+\tfont-weight:normal\n+}\n+\n+div.acomplete ul {\n+\tlist-style-type: none;\n+\tpadding: 0px 2px;\n+\tcursor: pointer;\n+}\n+\n+div.acomplete ul li {\n+\tmargin: 2px;\n+\tpadding: 1px;\n+\tfont-size: 14px;\n+\tleft: 0px;\n+}\n+\n+div.acomplete ul li:hover {\n+\tbackground-color: lightblue;\n+}\n+\n+div.acomplete ul li:active {\n+\tbackground-color: blue;\n+\tcolor: white;\n+}\n+\n+div.searchresults {\n+\tposition:absolute;\n+\tdisplay:block;\n+\tfloat:right;\n+\ttext-align:left;\n+\tfont-size: 9pt;\n+\twidth: 100%;\n+\tmax-height: 600px;\n+\tleft:0px;\n+\tmargin: 4px 20px;\n+\tmargin-top: 24px;\n+\tpadding: 0px 20px;\n+\toverflow: scroll;\n+\topacity: 0;\n+\tz-index: 3;\n+\tborder: 1px solid gray;\n+\tborder-radius: 3px;\n+\tbackground-color: rgba(255,255,255,0.7);\n+\twhite-space: nowrap;\n+\tbox-shadow: 0px 5px 15px gray;\n+\ttransition: opacity 0.3s;\n+\tfont-weight:normal;\n+}\n+\n+div.filepath {\n+\tfont-size: 14pt;\n+\tpadding: 12px 0px;\n+}\n+\n+input.viable {\n+\tcolor: #000\n+}\n+\n+input.nonviable {\n+\tcolor: #aaa\n+}\n+\n+td.searchboxtitle {\n+\ttext-align:right;\n+\tfont-size: 15pt;\n+}\n+\n+td.r {\n+\ttext-align:right;\n+\tcolor: #aaa;\n+\twidth:99%;\n+}\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.js b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.js\nnew file mode 100644\nindex 0000000..af4731a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.js\n@@ -0,0 +1,220 @@\n+/* lws-fts.js - JS supporting lws fulltext search\n+ *\n+ * Copyright (C) 2010 - 2019 Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining a copy\n+ * of this software and associated documentation files (the \u0022Software\u0022), to\n+ * deal in the Software without restriction, including without limitation the\n+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n+ * sell copies of the Software, and to permit persons to whom the Software is\n+ * furnished to do so, subject to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included in\n+ * all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \u0022AS IS\u0022, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n+ * IN THE SOFTWARE.\n+ */\n+\n+\n+(function() {\n+\t\n+\tvar last_ac \u003d \u0022\u0022;\n+\t\n+\tfunction san(s)\n+\t{\n+\t\ts.replace(/\u003c/g, \u0022!\u0022);\n+\t\ts.replace(/%/g, \u0022!\u0022);\n+\t\t\n+\t\treturn s;\n+\t}\n+\t\n+\tfunction lws_fts_choose()\n+\t{\n+\t\tvar xhr \u003d new XMLHttpRequest();\n+\t\tvar sr \u003d document.getElementById(\u0022searchresults\u0022);\n+\t\tvar ac \u003d document.getElementById(\u0022acomplete\u0022);\n+\t\tvar inp \u003d document.getElementById(\u0022lws_fts\u0022);\n+\n+\t\txhr.onopen \u003d function(e) {\n+\t\t\txhr.setRequestHeader(\u0022cache-control\u0022, \u0022max-age\u003d0\u0022);\n+\t\t};\n+\n+\t\txhr.onload \u003d function(e) {\t\n+\t\t\tvar jj, n, m, s \u003d \u0022\u0022, lic \u003d 0;\n+\t\t\tvar sr \u003d document.getElementById(\u0022searchresults\u0022);\n+\t\t\tvar inp \u003d document.getElementById(\u0022lws_fts\u0022);\n+\t\t\tsr.style.width \u003d (parseInt(sr.parentNode.offsetWidth, 10) - 88) + \u0022px\u0022;\n+\t\t\tsr.style.opacity \u003d \u00221\u0022;\n+\t\t\tinp.blur();\n+\t\t\t\n+\t\t\t// console.log(xhr.responseText);\n+\t\t\tjj \u003d JSON.parse(xhr.responseText);\n+\t\t\t\n+\t\t\tif (jj.fp) {\n+\t\t\t\tlic \u003d jj.fp.length;\t\t\t\t\t\t\n+\t\t\t\tfor (n \u003d 0; n \u003c lic; n++) {\n+\t\t\t\t\t\n+\t\t\t\t\ts +\u003d \u0022\u003cdiv class\u003d'filepath'\u003e\u0022 + jj.fp[n].path + \u0022\u003c/div\u003e\u0022;\n+\t\t\t\t\t\n+\t\t\t\t\ts +\u003d \u0022\u003ctable\u003e\u0022;\n+\t\t\t\t\tfor (m \u003d 0; m \u003c jj.fp[n].hits.length; m++)\n+\t\t\t\t\t\ts +\u003d \u0022\u003ctr\u003e\u003ctd class\u003d'r'\u003e\u0022 + jj.fp[n].hits[m].l +\n+\t\t\t\t\t\t\t \u0022\u003c/td\u003e\u003ctd\u003e\u0022 + jj.fp[n].hits[m].s +\n+\t\t\t\t\t\t\t \u0022\u003c/td\u003e\u003c/tr\u003e\u0022;\n+\t\t\t\t\t\n+\t\t\t\t\ts +\u003d \u0022\u003c/table\u003e\u0022;\n+\t\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\t\n+\t\t\tsr.innerHTML \u003d s;\n+\t\t};\n+\t\t\n+\t\tinp.blur();\n+\t\tac.style.opacity \u003d \u00220\u0022;\n+\t\tsr.style.innerHTML \u003d \u0022\u0022;\n+\t\txhr.open(\u0022GET\u0022, \u0022../fts/r/\u0022 + document.getElementById(\u0022lws_fts\u0022).value);\n+\t\txhr.send();\n+\t}\n+\t\n+\tfunction lws_fts_ac_select(e)\n+\t{\n+\t\tvar t \u003d e.target;\n+\n+\t\twhile (t) {\n+\t\t\tif (t.getAttribute \u0026\u0026 t.getAttribute(\u0022string\u0022)) {\n+\t\t\t\tdocument.getElementById(\u0022lws_fts\u0022).value \u003d\n+\t\t\t\t\t\tt.getAttribute(\u0022string\u0022);\n+\n+\t\t\t\tlws_fts_choose();\n+\t\t\t}\n+\n+\t\t\tt \u003d t.parentNode;\n+\t\t}\n+\t}\n+\t\n+\tfunction lws_fts_search_input()\n+\t{\n+\t\tvar ac \u003d document.getElementById(\u0022acomplete\u0022),\n+\t\t sb \u003d document.getElementById(\u0022lws_fts\u0022);\n+\t\t\n+\t\tif (last_ac \u003d\u003d\u003d sb.value)\n+\t\t\treturn;\n+\t\t\n+\t\tlast_ac \u003d sb.value;\n+\t\t\n+\t\tac.style.width \u003d (parseInt(sb.offsetWidth, 10) - 2) + \u0022px\u0022;\n+\t\tac.style.opacity \u003d \u00221\u0022;\n+\t\t\n+\t\t/* detect loss of focus for popup menu */\n+\t\tsb.addEventListener(\u0022focusout\u0022, function(e) {\n+\t\t\t\tac.style.opacity \u003d \u00220\u0022;\n+\t\t});\n+\t\t\n+\t\t\n+\t\tvar xhr \u003d new XMLHttpRequest();\n+\n+\t\txhr.onopen \u003d function(e) {\n+\t\t\txhr.setRequestHeader(\u0022cache-control\u0022, \u0022max-age\u003d0\u0022);\n+\t\t};\n+\t\txhr.onload \u003d function(e) {\n+\t\t\tvar jj, n, s \u003d \u0022\u0022, lic \u003d 0;\n+\t\t\tvar inp \u003d document.getElementById(\u0022lws_fts\u0022);\n+\t\t\tvar ac \u003d document.getElementById(\u0022acomplete\u0022);\n+\t\t\t\n+\t\t\t// console.log(xhr.responseText);\n+\t\t\tjj \u003d JSON.parse(xhr.responseText);\n+\t\t\t\n+\t\t\tswitch(parseInt(jj.indexed, 10)) {\n+\t\t\tcase 0: /* there is no index */\n+\t\t\t\tbreak;\n+\n+\t\t\tcase 1: /* yay there is an index */\n+\t\t\t\n+\t\t\t\t\tif (jj.ac) {\n+\t\t\t\t\t\tlic \u003d jj.ac.length;\n+\t\t\t\t\t\ts +\u003d \u0022\u003cul id\u003d'menu-ul'\u003e\u0022;\n+\t\t\t\t\t\tfor (n \u003d 0; n \u003c lic; n++) {\n+\n+\t\t\t\t\t\t\tif (jj.ac[n] \u0026\u0026 parseInt(jj.ac[n].matches, 10))\n+\t\t\t\t\t\t\t\ts +\u003d \u0022\u003cli id\u003d'mi_ac\u0022 + n + \u0022' string\u003d'\u0022 +\n+\t\t\t\t\t\t\t\t\tsan(jj.ac[n].ac) + \n+\t\t\t\t\t\t\t\t\t\u0022'\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd\u003e\u0022 + san(jj.ac[n].ac) +\n+\t\t\t\t\t\t\t\t\t\u0022\u003c/td\u003e\u003ctd class\u003d'r'\u003e\u0022 +\n+\t\t\t\t\t\t\t\t\tparseInt(jj.ac[n].matches, 10) +\n+\t\t\t\t\t\t\t\t\t\u0022\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/li\u003e\u0022;\n+\t\t\t\t\t\t}\n+\t\t\t\t\t\t\n+\t\t\t\t\t\ts +\u003d \u0022\u003c/ul\u003e\u0022;\n+\n+\t\t\t\t\t if (!lic) {\n+\t\t\t\t\t\t//s \u003d \u0022\u003cimg class\u003d'noentry'\u003e\u0022;\n+\t\t\t\t\t\tinp.className \u003d \u0022nonviable\u0022;\n+\t\t\t\t\t\tac.style.opacity \u003d \u00220\u0022;\n+\t\t\t\t\t } else {\n+\t\t\t\t\t\t inp.className \u003d \u0022viable\u0022;\n+\t\t\t\t\t\t ac.style.opacity \u003d \u00221\u0022;\n+\t\t\t\t\t }\n+\t\t\t\t\t}\n+\n+\t\t\t\tbreak;\n+\t\t\t\t\n+\t\t\tdefault:\n+\t\t\t\t\n+\t\t\t\t/* an index is being built... */\n+\t\t\t\t\n+\t\t\t\ts \u003d \u0022\u003ctable\u003e\u003ctr\u003e\u003ctd\u003e\u003cimg class\u003d'spinner'\u003e\u003c/td\u003e\u003ctd\u003e\u0022 +\n+\t\t\t\t\t\u0022\u003ctable\u003e\u003ctr\u003e\u003ctd\u003eIndexing\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0022 +\n+\t\t\t\t\t\u0022\u003cdiv id\u003d'bar1' class\u003d'bar1'\u003e\u0022 +\n+\t\t\t\t\t\u0022\u003cdiv id\u003d'bar2' class\u003d'bar2'\u003e\u0022 +\n+\t\t\t\t\tjj.index_done + \u0022\u0026nbsp;/\u0026nbsp;\u0022 + jj.index_files +\n+\t\t\t\t\t\u0022\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u0022 +\n+\t\t\t\t\t\u0022\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u0022;\n+\t\t\t\n+\t\t\t\tsetTimeout(lws_fts_search_input, 300);\n+\t\t\t\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\t\n+\t\t\tac.innerHTML \u003d s;\n+\t\t\t\n+\t\t\tfor (n \u003d 0; n \u003c lic; n++)\n+\t\t\t\tif (document.getElementById(\u0022mi_ac\u0022 + n))\n+\t\t\t\t\tdocument.getElementById(\u0022mi_ac\u0022 + n).\n+\t\t\t\t\t\taddEventListener(\u0022click\u0022, lws_fts_ac_select);\n+\t\t\tif (jj.index_files) {\n+\t\t\t\tdocument.getElementById(\u0022bar2\u0022).style.width \u003d\n+\t\t\t\t\t((150 * jj.index_done) / (jj.index_files + 1)) + \u0022px\u0022;\n+\t\t\t}\n+\t\t};\n+\t\t\n+\t\txhr.open(\u0022GET\u0022, \u0022../fts/a/\u0022 + document.getElementById(\u0022lws_fts\u0022).value);\n+\t\txhr.send();\n+\t}\n+\n+\tdocument.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\t\tvar inp \u003d document.getElementById(\u0022lws_fts\u0022);\n+\n+\t\tinp.addEventListener(\u0022input\u0022, lws_fts_search_input, false);\n+\n+\t\tinp.addEventListener(\u0022keydown\u0022,\n+\t\t\t\tfunction(e) {\n+\t\t\tvar inp \u003d document.getElementById(\u0022lws_fts\u0022);\n+\t\t\tvar sr \u003d document.getElementById(\u0022searchresults\u0022);\n+\t\t\tvar ac \u003d document.getElementById(\u0022acomplete\u0022);\n+\t\t\tif (e.key \u003d\u003d\u003d \u0022Enter\u0022 \u0026\u0026 inp.className \u003d\u003d\u003d \u0022viable\u0022) {\n+\t\t\t\tlws_fts_choose();\n+\t\t\t\tsr.focus();\n+\t\t\t\tac.style.opacity \u003d \u00220\u0022;\n+\t\t\t}\n+\t\t}, false);\n+\n+\t}, false);\n+\t\n+}());\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/the-picture-of-dorian-gray.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/the-picture-of-dorian-gray.txt\nnew file mode 100644\nindex 0000000..f4ffc49\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/the-picture-of-dorian-gray.txt\n@@ -0,0 +1,8904 @@\n+The Project Gutenberg EBook of The Picture of Dorian Gray, by Oscar Wilde\r\n+\r\n+This eBook is for the use of anyone anywhere at no cost and with\r\n+almost no restrictions whatsoever. You may copy it, give it away or\r\n+re-use it under the terms of the Project Gutenberg License included\r\n+with this eBook or online at www.gutenberg.net\r\n+\r\n+\r\n+Title: The Picture of Dorian Gray\r\n+\r\n+Author: Oscar Wilde\r\n+\r\n+Release Date: June 9, 2008 [EBook #174]\r\n+[This file last updated on July 2, 2011]\r\n+[This file last updated on July 23, 2014]\r\n+\r\n+\r\n+Language: English\r\n+\r\n+\r\n+*** START OF THIS PROJECT GUTENBERG EBOOK THE PICTURE OF DORIAN GRAY ***\r\n+\r\n+\r\n+\r\n+\r\n+Produced by Judith Boss. HTML version by Al Haines.\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+The Picture of Dorian Gray\r\n+\r\n+by\r\n+\r\n+Oscar Wilde\r\n+\r\n+\r\n+\r\n+\r\n+THE PREFACE\r\n+\r\n+The artist is the creator of beautiful things. To reveal art and\r\n+conceal the artist is art's aim. The critic is he who can translate\r\n+into another manner or a new material his impression of beautiful\r\n+things.\r\n+\r\n+The highest as the lowest form of criticism is a mode of autobiography.\r\n+Those who find ugly meanings in beautiful things are corrupt without\r\n+being charming. This is a fault.\r\n+\r\n+Those who find beautiful meanings in beautiful things are the\r\n+cultivated. For these there is hope. They are the elect to whom\r\n+beautiful things mean only beauty.\r\n+\r\n+There is no such thing as a moral or an immoral book. Books are well\r\n+written, or badly written. That is all.\r\n+\r\n+The nineteenth century dislike of realism is the rage of Caliban seeing\r\n+his own face in a glass.\r\n+\r\n+The nineteenth century dislike of romanticism is the rage of Caliban\r\n+not seeing his own face in a glass. The moral life of man forms part\r\n+of the subject-matter of the artist, but the morality of art consists\r\n+in the perfect use of an imperfect medium. No artist desires to prove\r\n+anything. Even things that are true can be proved. No artist has\r\n+ethical sympathies. An ethical sympathy in an artist is an\r\n+unpardonable mannerism of style. No artist is ever morbid. The artist\r\n+can express everything. Thought and language are to the artist\r\n+instruments of an art. Vice and virtue are to the artist materials for\r\n+an art. From the point of view of form, the type of all the arts is\r\n+the art of the musician. From the point of view of feeling, the\r\n+actor's craft is the type. All art is at once surface and symbol.\r\n+Those who go beneath the surface do so at their peril. Those who read\r\n+the symbol do so at their peril. It is the spectator, and not life,\r\n+that art really mirrors. Diversity of opinion about a work of art\r\n+shows that the work is new, complex, and vital. When critics disagree,\r\n+the artist is in accord with himself. We can forgive a man for making\r\n+a useful thing as long as he does not admire it. The only excuse for\r\n+making a useless thing is that one admires it intensely.\r\n+\r\n+ All art is quite useless.\r\n+\r\n+ OSCAR WILDE\r\n+\r\n+\r\n+\r\n+\r\n+CHAPTER 1\r\n+\r\n+The studio was filled with the rich odour of roses, and when the light\r\n+summer wind stirred amidst the trees of the garden, there came through\r\n+the open door the heavy scent of the lilac, or the more delicate\r\n+perfume of the pink-flowering thorn.\r\n+\r\n+From the corner of the divan of Persian saddle-bags on which he was\r\n+lying, smoking, as was his custom, innumerable cigarettes, Lord Henry\r\n+Wotton could just catch the gleam of the honey-sweet and honey-coloured\r\n+blossoms of a laburnum, whose tremulous branches seemed hardly able to\r\n+bear the burden of a beauty so flamelike as theirs; and now and then\r\n+the fantastic shadows of birds in flight flitted across the long\r\n+tussore-silk curtains that were stretched in front of the huge window,\r\n+producing a kind of momentary Japanese effect, and making him think of\r\n+those pallid, jade-faced painters of Tokyo who, through the medium of\r\n+an art that is necessarily immobile, seek to convey the sense of\r\n+swiftness and motion. The sullen murmur of the bees shouldering their\r\n+way through the long unmown grass, or circling with monotonous\r\n+insistence round the dusty gilt horns of the straggling woodbine,\r\n+seemed to make the stillness more oppressive. The dim roar of London\r\n+was like the bourdon note of a distant organ.\r\n+\r\n+In the centre of the room, clamped to an upright easel, stood the\r\n+full-length portrait of a young man of extraordinary personal beauty,\r\n+and in front of it, some little distance away, was sitting the artist\r\n+himself, Basil Hallward, whose sudden disappearance some years ago\r\n+caused, at the time, such public excitement and gave rise to so many\r\n+strange conjectures.\r\n+\r\n+As the painter looked at the gracious and comely form he had so\r\n+skilfully mirrored in his art, a smile of pleasure passed across his\r\n+face, and seemed about to linger there. But he suddenly started up,\r\n+and closing his eyes, placed his fingers upon the lids, as though he\r\n+sought to imprison within his brain some curious dream from which he\r\n+feared he might awake.\r\n+\r\n+\u0022It is your best work, Basil, the best thing you have ever done,\u0022 said\r\n+Lord Henry languidly. \u0022You must certainly send it next year to the\r\n+Grosvenor. The Academy is too large and too vulgar. Whenever I have\r\n+gone there, there have been either so many people that I have not been\r\n+able to see the pictures, which was dreadful, or so many pictures that\r\n+I have not been able to see the people, which was worse. The Grosvenor\r\n+is really the only place.\u0022\r\n+\r\n+\u0022I don't think I shall send it anywhere,\u0022 he answered, tossing his head\r\n+back in that odd way that used to make his friends laugh at him at\r\n+Oxford. \u0022No, I won't send it anywhere.\u0022\r\n+\r\n+Lord Henry elevated his eyebrows and looked at him in amazement through\r\n+the thin blue wreaths of smoke that curled up in such fanciful whorls\r\n+from his heavy, opium-tainted cigarette. \u0022Not send it anywhere? My\r\n+dear fellow, why? Have you any reason? What odd chaps you painters\r\n+are! You do anything in the world to gain a reputation. As soon as\r\n+you have one, you seem to want to throw it away. It is silly of you,\r\n+for there is only one thing in the world worse than being talked about,\r\n+and that is not being talked about. A portrait like this would set you\r\n+far above all the young men in England, and make the old men quite\r\n+jealous, if old men are ever capable of any emotion.\u0022\r\n+\r\n+\u0022I know you will laugh at me,\u0022 he replied, \u0022but I really can't exhibit\r\n+it. I have put too much of myself into it.\u0022\r\n+\r\n+Lord Henry stretched himself out on the divan and laughed.\r\n+\r\n+\u0022Yes, I knew you would; but it is quite true, all the same.\u0022\r\n+\r\n+\u0022Too much of yourself in it! Upon my word, Basil, I didn't know you\r\n+were so vain; and I really can't see any resemblance between you, with\r\n+your rugged strong face and your coal-black hair, and this young\r\n+Adonis, who looks as if he was made out of ivory and rose-leaves. Why,\r\n+my dear Basil, he is a Narcissus, and you--well, of course you have an\r\n+intellectual expression and all that. But beauty, real beauty, ends\r\n+where an intellectual expression begins. Intellect is in itself a mode\r\n+of exaggeration, and destroys the harmony of any face. The moment one\r\n+sits down to think, one becomes all nose, or all forehead, or something\r\n+horrid. Look at the successful men in any of the learned professions.\r\n+How perfectly hideous they are! Except, of course, in the Church. But\r\n+then in the Church they don't think. A bishop keeps on saying at the\r\n+age of eighty what he was told to say when he was a boy of eighteen,\r\n+and as a natural consequence he always looks absolutely delightful.\r\n+Your mysterious young friend, whose name you have never told me, but\r\n+whose picture really fascinates me, never thinks. I feel quite sure of\r\n+that. He is some brainless beautiful creature who should be always\r\n+here in winter when we have no flowers to look at, and always here in\r\n+summer when we want something to chill our intelligence. Don't flatter\r\n+yourself, Basil: you are not in the least like him.\u0022\r\n+\r\n+\u0022You don't understand me, Harry,\u0022 answered the artist. \u0022Of course I am\r\n+not like him. I know that perfectly well. Indeed, I should be sorry\r\n+to look like him. You shrug your shoulders? I am telling you the\r\n+truth. There is a fatality about all physical and intellectual\r\n+distinction, the sort of fatality that seems to dog through history the\r\n+faltering steps of kings. It is better not to be different from one's\r\n+fellows. The ugly and the stupid have the best of it in this world.\r\n+They can sit at their ease and gape at the play. If they know nothing\r\n+of victory, they are at least spared the knowledge of defeat. They\r\n+live as we all should live--undisturbed, indifferent, and without\r\n+disquiet. They neither bring ruin upon others, nor ever receive it\r\n+from alien hands. Your rank and wealth, Harry; my brains, such as they\r\n+are--my art, whatever it may be worth; Dorian Gray's good looks--we\r\n+shall all suffer for what the gods have given us, suffer terribly.\u0022\r\n+\r\n+\u0022Dorian Gray? Is that his name?\u0022 asked Lord Henry, walking across the\r\n+studio towards Basil Hallward.\r\n+\r\n+\u0022Yes, that is his name. I didn't intend to tell it to you.\u0022\r\n+\r\n+\u0022But why not?\u0022\r\n+\r\n+\u0022Oh, I can't explain. When I like people immensely, I never tell their\r\n+names to any one. It is like surrendering a part of them. I have\r\n+grown to love secrecy. It seems to be the one thing that can make\r\n+modern life mysterious or marvellous to us. The commonest thing is\r\n+delightful if one only hides it. When I leave town now I never tell my\r\n+people where I am going. If I did, I would lose all my pleasure. It\r\n+is a silly habit, I dare say, but somehow it seems to bring a great\r\n+deal of romance into one's life. I suppose you think me awfully\r\n+foolish about it?\u0022\r\n+\r\n+\u0022Not at all,\u0022 answered Lord Henry, \u0022not at all, my dear Basil. You\r\n+seem to forget that I am married, and the one charm of marriage is that\r\n+it makes a life of deception absolutely necessary for both parties. I\r\n+never know where my wife is, and my wife never knows what I am doing.\r\n+When we meet--we do meet occasionally, when we dine out together, or go\r\n+down to the Duke's--we tell each other the most absurd stories with the\r\n+most serious faces. My wife is very good at it--much better, in fact,\r\n+than I am. She never gets confused over her dates, and I always do.\r\n+But when she does find me out, she makes no row at all. I sometimes\r\n+wish she would; but she merely laughs at me.\u0022\r\n+\r\n+\u0022I hate the way you talk about your married life, Harry,\u0022 said Basil\r\n+Hallward, strolling towards the door that led into the garden. \u0022I\r\n+believe that you are really a very good husband, but that you are\r\n+thoroughly ashamed of your own virtues. You are an extraordinary\r\n+fellow. You never say a moral thing, and you never do a wrong thing.\r\n+Your cynicism is simply a pose.\u0022\r\n+\r\n+\u0022Being natural is simply a pose, and the most irritating pose I know,\u0022\r\n+cried Lord Henry, laughing; and the two young men went out into the\r\n+garden together and ensconced themselves on a long bamboo seat that\r\n+stood in the shade of a tall laurel bush. The sunlight slipped over\r\n+the polished leaves. In the grass, white daisies were tremulous.\r\n+\r\n+After a pause, Lord Henry pulled out his watch. \u0022I am afraid I must be\r\n+going, Basil,\u0022 he murmured, \u0022and before I go, I insist on your\r\n+answering a question I put to you some time ago.\u0022\r\n+\r\n+\u0022What is that?\u0022 said the painter, keeping his eyes fixed on the ground.\r\n+\r\n+\u0022You know quite well.\u0022\r\n+\r\n+\u0022I do not, Harry.\u0022\r\n+\r\n+\u0022Well, I will tell you what it is. I want you to explain to me why you\r\n+won't exhibit Dorian Gray's picture. I want the real reason.\u0022\r\n+\r\n+\u0022I told you the real reason.\u0022\r\n+\r\n+\u0022No, you did not. You said it was because there was too much of\r\n+yourself in it. Now, that is childish.\u0022\r\n+\r\n+\u0022Harry,\u0022 said Basil Hallward, looking him straight in the face, \u0022every\r\n+portrait that is painted with feeling is a portrait of the artist, not\r\n+of the sitter. The sitter is merely the accident, the occasion. It is\r\n+not he who is revealed by the painter; it is rather the painter who, on\r\n+the coloured canvas, reveals himself. The reason I will not exhibit\r\n+this picture is that I am afraid that I have shown in it the secret of\r\n+my own soul.\u0022\r\n+\r\n+Lord Henry laughed. \u0022And what is that?\u0022 he asked.\r\n+\r\n+\u0022I will tell you,\u0022 said Hallward; but an expression of perplexity came\r\n+over his face.\r\n+\r\n+\u0022I am all expectation, Basil,\u0022 continued his companion, glancing at him.\r\n+\r\n+\u0022Oh, there is really very little to tell, Harry,\u0022 answered the painter;\r\n+\u0022and I am afraid you will hardly understand it. Perhaps you will\r\n+hardly believe it.\u0022\r\n+\r\n+Lord Henry smiled, and leaning down, plucked a pink-petalled daisy from\r\n+the grass and examined it. \u0022I am quite sure I shall understand it,\u0022 he\r\n+replied, gazing intently at the little golden, white-feathered disk,\r\n+\u0022and as for believing things, I can believe anything, provided that it\r\n+is quite incredible.\u0022\r\n+\r\n+The wind shook some blossoms from the trees, and the heavy\r\n+lilac-blooms, with their clustering stars, moved to and fro in the\r\n+languid air. A grasshopper began to chirrup by the wall, and like a\r\n+blue thread a long thin dragon-fly floated past on its brown gauze\r\n+wings. Lord Henry felt as if he could hear Basil Hallward's heart\r\n+beating, and wondered what was coming.\r\n+\r\n+\u0022The story is simply this,\u0022 said the painter after some time. \u0022Two\r\n+months ago I went to a crush at Lady Brandon's. You know we poor\r\n+artists have to show ourselves in society from time to time, just to\r\n+remind the public that we are not savages. With an evening coat and a\r\n+white tie, as you told me once, anybody, even a stock-broker, can gain\r\n+a reputation for being civilized. Well, after I had been in the room\r\n+about ten minutes, talking to huge overdressed dowagers and tedious\r\n+academicians, I suddenly became conscious that some one was looking at\r\n+me. I turned half-way round and saw Dorian Gray for the first time.\r\n+When our eyes met, I felt that I was growing pale. A curious sensation\r\n+of terror came over me. I knew that I had come face to face with some\r\n+one whose mere personality was so fascinating that, if I allowed it to\r\n+do so, it would absorb my whole nature, my whole soul, my very art\r\n+itself. I did not want any external influence in my life. You know\r\n+yourself, Harry, how independent I am by nature. I have always been my\r\n+own master; had at least always been so, till I met Dorian Gray.\r\n+Then--but I don't know how to explain it to you. Something seemed to\r\n+tell me that I was on the verge of a terrible crisis in my life. I had\r\n+a strange feeling that fate had in store for me exquisite joys and\r\n+exquisite sorrows. I grew afraid and turned to quit the room. It was\r\n+not conscience that made me do so: it was a sort of cowardice. I take\r\n+no credit to myself for trying to escape.\u0022\r\n+\r\n+\u0022Conscience and cowardice are really the same things, Basil.\r\n+Conscience is the trade-name of the firm. That is all.\u0022\r\n+\r\n+\u0022I don't believe that, Harry, and I don't believe you do either.\r\n+However, whatever was my motive--and it may have been pride, for I used\r\n+to be very proud--I certainly struggled to the door. There, of course,\r\n+I stumbled against Lady Brandon. 'You are not going to run away so\r\n+soon, Mr. Hallward?' she screamed out. You know her curiously shrill\r\n+voice?\u0022\r\n+\r\n+\u0022Yes; she is a peacock in everything but beauty,\u0022 said Lord Henry,\r\n+pulling the daisy to bits with his long nervous fingers.\r\n+\r\n+\u0022I could not get rid of her. She brought me up to royalties, and\r\n+people with stars and garters, and elderly ladies with gigantic tiaras\r\n+and parrot noses. She spoke of me as her dearest friend. I had only\r\n+met her once before, but she took it into her head to lionize me. I\r\n+believe some picture of mine had made a great success at the time, at\r\n+least had been chattered about in the penny newspapers, which is the\r\n+nineteenth-century standard of immortality. Suddenly I found myself\r\n+face to face with the young man whose personality had so strangely\r\n+stirred me. We were quite close, almost touching. Our eyes met again.\r\n+It was reckless of me, but I asked Lady Brandon to introduce me to him.\r\n+Perhaps it was not so reckless, after all. It was simply inevitable.\r\n+We would have spoken to each other without any introduction. I am sure\r\n+of that. Dorian told me so afterwards. He, too, felt that we were\r\n+destined to know each other.\u0022\r\n+\r\n+\u0022And how did Lady Brandon describe this wonderful young man?\u0022 asked his\r\n+companion. \u0022I know she goes in for giving a rapid _precis_ of all her\r\n+guests. I remember her bringing me up to a truculent and red-faced old\r\n+gentleman covered all over with orders and ribbons, and hissing into my\r\n+ear, in a tragic whisper which must have been perfectly audible to\r\n+everybody in the room, the most astounding details. I simply fled. I\r\n+like to find out people for myself. But Lady Brandon treats her guests\r\n+exactly as an auctioneer treats his goods. She either explains them\r\n+entirely away, or tells one everything about them except what one wants\r\n+to know.\u0022\r\n+\r\n+\u0022Poor Lady Brandon! You are hard on her, Harry!\u0022 said Hallward\r\n+listlessly.\r\n+\r\n+\u0022My dear fellow, she tried to found a _salon_, and only succeeded in\r\n+opening a restaurant. How could I admire her? But tell me, what did\r\n+she say about Mr. Dorian Gray?\u0022\r\n+\r\n+\u0022Oh, something like, 'Charming boy--poor dear mother and I absolutely\r\n+inseparable. Quite forget what he does--afraid he--doesn't do\r\n+anything--oh, yes, plays the piano--or is it the violin, dear Mr.\r\n+Gray?' Neither of us could help laughing, and we became friends at\r\n+once.\u0022\r\n+\r\n+\u0022Laughter is not at all a bad beginning for a friendship, and it is far\r\n+the best ending for one,\u0022 said the young lord, plucking another daisy.\r\n+\r\n+Hallward shook his head. \u0022You don't understand what friendship is,\r\n+Harry,\u0022 he murmured--\u0022or what enmity is, for that matter. You like\r\n+every one; that is to say, you are indifferent to every one.\u0022\r\n+\r\n+\u0022How horribly unjust of you!\u0022 cried Lord Henry, tilting his hat back\r\n+and looking up at the little clouds that, like ravelled skeins of\r\n+glossy white silk, were drifting across the hollowed turquoise of the\r\n+summer sky. \u0022Yes; horribly unjust of you. I make a great difference\r\n+between people. I choose my friends for their good looks, my\r\n+acquaintances for their good characters, and my enemies for their good\r\n+intellects. A man cannot be too careful in the choice of his enemies.\r\n+I have not got one who is a fool. They are all men of some\r\n+intellectual power, and consequently they all appreciate me. Is that\r\n+very vain of me? I think it is rather vain.\u0022\r\n+\r\n+\u0022I should think it was, Harry. But according to your category I must\r\n+be merely an acquaintance.\u0022\r\n+\r\n+\u0022My dear old Basil, you are much more than an acquaintance.\u0022\r\n+\r\n+\u0022And much less than a friend. A sort of brother, I suppose?\u0022\r\n+\r\n+\u0022Oh, brothers! I don't care for brothers. My elder brother won't die,\r\n+and my younger brothers seem never to do anything else.\u0022\r\n+\r\n+\u0022Harry!\u0022 exclaimed Hallward, frowning.\r\n+\r\n+\u0022My dear fellow, I am not quite serious. But I can't help detesting my\r\n+relations. I suppose it comes from the fact that none of us can stand\r\n+other people having the same faults as ourselves. I quite sympathize\r\n+with the rage of the English democracy against what they call the vices\r\n+of the upper orders. The masses feel that drunkenness, stupidity, and\r\n+immorality should be their own special property, and that if any one of\r\n+us makes an ass of himself, he is poaching on their preserves. When\r\n+poor Southwark got into the divorce court, their indignation was quite\r\n+magnificent. And yet I don't suppose that ten per cent of the\r\n+proletariat live correctly.\u0022\r\n+\r\n+\u0022I don't agree with a single word that you have said, and, what is\r\n+more, Harry, I feel sure you don't either.\u0022\r\n+\r\n+Lord Henry stroked his pointed brown beard and tapped the toe of his\r\n+patent-leather boot with a tasselled ebony cane. \u0022How English you are\r\n+Basil! That is the second time you have made that observation. If one\r\n+puts forward an idea to a true Englishman--always a rash thing to\r\n+do--he never dreams of considering whether the idea is right or wrong.\r\n+The only thing he considers of any importance is whether one believes\r\n+it oneself. Now, the value of an idea has nothing whatsoever to do\r\n+with the sincerity of the man who expresses it. Indeed, the\r\n+probabilities are that the more insincere the man is, the more purely\r\n+intellectual will the idea be, as in that case it will not be coloured\r\n+by either his wants, his desires, or his prejudices. However, I don't\r\n+propose to discuss politics, sociology, or metaphysics with you. I\r\n+like persons better than principles, and I like persons with no\r\n+principles better than anything else in the world. Tell me more about\r\n+Mr. Dorian Gray. How often do you see him?\u0022\r\n+\r\n+\u0022Every day. I couldn't be happy if I didn't see him every day. He is\r\n+absolutely necessary to me.\u0022\r\n+\r\n+\u0022How extraordinary! I thought you would never care for anything but\r\n+your art.\u0022\r\n+\r\n+\u0022He is all my art to me now,\u0022 said the painter gravely. \u0022I sometimes\r\n+think, Harry, that there are only two eras of any importance in the\r\n+world's history. The first is the appearance of a new medium for art,\r\n+and the second is the appearance of a new personality for art also.\r\n+What the invention of oil-painting was to the Venetians, the face of\r\n+Antinous was to late Greek sculpture, and the face of Dorian Gray will\r\n+some day be to me. It is not merely that I paint from him, draw from\r\n+him, sketch from him. Of course, I have done all that. But he is much\r\n+more to me than a model or a sitter. I won't tell you that I am\r\n+dissatisfied with what I have done of him, or that his beauty is such\r\n+that art cannot express it. There is nothing that art cannot express,\r\n+and I know that the work I have done, since I met Dorian Gray, is good\r\n+work, is the best work of my life. But in some curious way--I wonder\r\n+will you understand me?--his personality has suggested to me an\r\n+entirely new manner in art, an entirely new mode of style. I see\r\n+things differently, I think of them differently. I can now recreate\r\n+life in a way that was hidden from me before. 'A dream of form in days\r\n+of thought'--who is it who says that? I forget; but it is what Dorian\r\n+Gray has been to me. The merely visible presence of this lad--for he\r\n+seems to me little more than a lad, though he is really over\r\n+twenty--his merely visible presence--ah! I wonder can you realize all\r\n+that that means? Unconsciously he defines for me the lines of a fresh\r\n+school, a school that is to have in it all the passion of the romantic\r\n+spirit, all the perfection of the spirit that is Greek. The harmony of\r\n+soul and body--how much that is! We in our madness have separated the\r\n+two, and have invented a realism that is vulgar, an ideality that is\r\n+void. Harry! if you only knew what Dorian Gray is to me! You remember\r\n+that landscape of mine, for which Agnew offered me such a huge price\r\n+but which I would not part with? It is one of the best things I have\r\n+ever done. And why is it so? Because, while I was painting it, Dorian\r\n+Gray sat beside me. Some subtle influence passed from him to me, and\r\n+for the first time in my life I saw in the plain woodland the wonder I\r\n+had always looked for and always missed.\u0022\r\n+\r\n+\u0022Basil, this is extraordinary! I must see Dorian Gray.\u0022\r\n+\r\n+Hallward got up from the seat and walked up and down the garden. After\r\n+some time he came back. \u0022Harry,\u0022 he said, \u0022Dorian Gray is to me simply\r\n+a motive in art. You might see nothing in him. I see everything in\r\n+him. He is never more present in my work than when no image of him is\r\n+there. He is a suggestion, as I have said, of a new manner. I find\r\n+him in the curves of certain lines, in the loveliness and subtleties of\r\n+certain colours. That is all.\u0022\r\n+\r\n+\u0022Then why won't you exhibit his portrait?\u0022 asked Lord Henry.\r\n+\r\n+\u0022Because, without intending it, I have put into it some expression of\r\n+all this curious artistic idolatry, of which, of course, I have never\r\n+cared to speak to him. He knows nothing about it. He shall never know\r\n+anything about it. But the world might guess it, and I will not bare\r\n+my soul to their shallow prying eyes. My heart shall never be put\r\n+under their microscope. There is too much of myself in the thing,\r\n+Harry--too much of myself!\u0022\r\n+\r\n+\u0022Poets are not so scrupulous as you are. They know how useful passion\r\n+is for publication. Nowadays a broken heart will run to many editions.\u0022\r\n+\r\n+\u0022I hate them for it,\u0022 cried Hallward. \u0022An artist should create\r\n+beautiful things, but should put nothing of his own life into them. We\r\n+live in an age when men treat art as if it were meant to be a form of\r\n+autobiography. We have lost the abstract sense of beauty. Some day I\r\n+will show the world what it is; and for that reason the world shall\r\n+never see my portrait of Dorian Gray.\u0022\r\n+\r\n+\u0022I think you are wrong, Basil, but I won't argue with you. It is only\r\n+the intellectually lost who ever argue. Tell me, is Dorian Gray very\r\n+fond of you?\u0022\r\n+\r\n+The painter considered for a few moments. \u0022He likes me,\u0022 he answered\r\n+after a pause; \u0022I know he likes me. Of course I flatter him\r\n+dreadfully. I find a strange pleasure in saying things to him that I\r\n+know I shall be sorry for having said. As a rule, he is charming to\r\n+me, and we sit in the studio and talk of a thousand things. Now and\r\n+then, however, he is horribly thoughtless, and seems to take a real\r\n+delight in giving me pain. Then I feel, Harry, that I have given away\r\n+my whole soul to some one who treats it as if it were a flower to put\r\n+in his coat, a bit of decoration to charm his vanity, an ornament for a\r\n+summer's day.\u0022\r\n+\r\n+\u0022Days in summer, Basil, are apt to linger,\u0022 murmured Lord Henry.\r\n+\u0022Perhaps you will tire sooner than he will. It is a sad thing to think\r\n+of, but there is no doubt that genius lasts longer than beauty. That\r\n+accounts for the fact that we all take such pains to over-educate\r\n+ourselves. In the wild struggle for existence, we want to have\r\n+something that endures, and so we fill our minds with rubbish and\r\n+facts, in the silly hope of keeping our place. The thoroughly\r\n+well-informed man--that is the modern ideal. And the mind of the\r\n+thoroughly well-informed man is a dreadful thing. It is like a\r\n+_bric-a-brac_ shop, all monsters and dust, with everything priced above\r\n+its proper value. I think you will tire first, all the same. Some day\r\n+you will look at your friend, and he will seem to you to be a little\r\n+out of drawing, or you won't like his tone of colour, or something.\r\n+You will bitterly reproach him in your own heart, and seriously think\r\n+that he has behaved very badly to you. The next time he calls, you\r\n+will be perfectly cold and indifferent. It will be a great pity, for\r\n+it will alter you. What you have told me is quite a romance, a romance\r\n+of art one might call it, and the worst of having a romance of any kind\r\n+is that it leaves one so unromantic.\u0022\r\n+\r\n+\u0022Harry, don't talk like that. As long as I live, the personality of\r\n+Dorian Gray will dominate me. You can't feel what I feel. You change\r\n+too often.\u0022\r\n+\r\n+\u0022Ah, my dear Basil, that is exactly why I can feel it. Those who are\r\n+faithful know only the trivial side of love: it is the faithless who\r\n+know love's tragedies.\u0022 And Lord Henry struck a light on a dainty\r\n+silver case and began to smoke a cigarette with a self-conscious and\r\n+satisfied air, as if he had summed up the world in a phrase. There was\r\n+a rustle of chirruping sparrows in the green lacquer leaves of the ivy,\r\n+and the blue cloud-shadows chased themselves across the grass like\r\n+swallows. How pleasant it was in the garden! And how delightful other\r\n+people's emotions were!--much more delightful than their ideas, it\r\n+seemed to him. One's own soul, and the passions of one's\r\n+friends--those were the fascinating things in life. He pictured to\r\n+himself with silent amusement the tedious luncheon that he had missed\r\n+by staying so long with Basil Hallward. Had he gone to his aunt's, he\r\n+would have been sure to have met Lord Goodbody there, and the whole\r\n+conversation would have been about the feeding of the poor and the\r\n+necessity for model lodging-houses. Each class would have preached the\r\n+importance of those virtues, for whose exercise there was no necessity\r\n+in their own lives. The rich would have spoken on the value of thrift,\r\n+and the idle grown eloquent over the dignity of labour. It was\r\n+charming to have escaped all that! As he thought of his aunt, an idea\r\n+seemed to strike him. He turned to Hallward and said, \u0022My dear fellow,\r\n+I have just remembered.\u0022\r\n+\r\n+\u0022Remembered what, Harry?\u0022\r\n+\r\n+\u0022Where I heard the name of Dorian Gray.\u0022\r\n+\r\n+\u0022Where was it?\u0022 asked Hallward, with a slight frown.\r\n+\r\n+\u0022Don't look so angry, Basil. It was at my aunt, Lady Agatha's. She\r\n+told me she had discovered a wonderful young man who was going to help\r\n+her in the East End, and that his name was Dorian Gray. I am bound to\r\n+state that she never told me he was good-looking. Women have no\r\n+appreciation of good looks; at least, good women have not. She said\r\n+that he was very earnest and had a beautiful nature. I at once\r\n+pictured to myself a creature with spectacles and lank hair, horribly\r\n+freckled, and tramping about on huge feet. I wish I had known it was\r\n+your friend.\u0022\r\n+\r\n+\u0022I am very glad you didn't, Harry.\u0022\r\n+\r\n+\u0022Why?\u0022\r\n+\r\n+\u0022I don't want you to meet him.\u0022\r\n+\r\n+\u0022You don't want me to meet him?\u0022\r\n+\r\n+\u0022No.\u0022\r\n+\r\n+\u0022Mr. Dorian Gray is in the studio, sir,\u0022 said the butler, coming into\r\n+the garden.\r\n+\r\n+\u0022You must introduce me now,\u0022 cried Lord Henry, laughing.\r\n+\r\n+The painter turned to his servant, who stood blinking in the sunlight.\r\n+\u0022Ask Mr. Gray to wait, Parker: I shall be in in a few moments.\u0022 The\r\n+man bowed and went up the walk.\r\n+\r\n+Then he looked at Lord Henry. \u0022Dorian Gray is my dearest friend,\u0022 he\r\n+said. \u0022He has a simple and a beautiful nature. Your aunt was quite\r\n+right in what she said of him. Don't spoil him. Don't try to\r\n+influence him. Your influence would be bad. The world is wide, and\r\n+has many marvellous people in it. Don't take away from me the one\r\n+person who gives to my art whatever charm it possesses: my life as an\r\n+artist depends on him. Mind, Harry, I trust you.\u0022 He spoke very\r\n+slowly, and the words seemed wrung out of him almost against his will.\r\n+\r\n+\u0022What nonsense you talk!\u0022 said Lord Henry, smiling, and taking Hallward\r\n+by the arm, he almost led him into the house.\r\n+\r\n+\r\n+\r\n+CHAPTER 2\r\n+\r\n+As they entered they saw Dorian Gray. He was seated at the piano, with\r\n+his back to them, turning over the pages of a volume of Schumann's\r\n+\u0022Forest Scenes.\u0022 \u0022You must lend me these, Basil,\u0022 he cried. \u0022I want\r\n+to learn them. They are perfectly charming.\u0022\r\n+\r\n+\u0022That entirely depends on how you sit to-day, Dorian.\u0022\r\n+\r\n+\u0022Oh, I am tired of sitting, and I don't want a life-sized portrait of\r\n+myself,\u0022 answered the lad, swinging round on the music-stool in a\r\n+wilful, petulant manner. When he caught sight of Lord Henry, a faint\r\n+blush coloured his cheeks for a moment, and he started up. \u0022I beg your\r\n+pardon, Basil, but I didn't know you had any one with you.\u0022\r\n+\r\n+\u0022This is Lord Henry Wotton, Dorian, an old Oxford friend of mine. I\r\n+have just been telling him what a capital sitter you were, and now you\r\n+have spoiled everything.\u0022\r\n+\r\n+\u0022You have not spoiled my pleasure in meeting you, Mr. Gray,\u0022 said Lord\r\n+Henry, stepping forward and extending his hand. \u0022My aunt has often\r\n+spoken to me about you. You are one of her favourites, and, I am\r\n+afraid, one of her victims also.\u0022\r\n+\r\n+\u0022I am in Lady Agatha's black books at present,\u0022 answered Dorian with a\r\n+funny look of penitence. \u0022I promised to go to a club in Whitechapel\r\n+with her last Tuesday, and I really forgot all about it. We were to\r\n+have played a duet together--three duets, I believe. I don't know what\r\n+she will say to me. I am far too frightened to call.\u0022\r\n+\r\n+\u0022Oh, I will make your peace with my aunt. She is quite devoted to you.\r\n+And I don't think it really matters about your not being there. The\r\n+audience probably thought it was a duet. When Aunt Agatha sits down to\r\n+the piano, she makes quite enough noise for two people.\u0022\r\n+\r\n+\u0022That is very horrid to her, and not very nice to me,\u0022 answered Dorian,\r\n+laughing.\r\n+\r\n+Lord Henry looked at him. Yes, he was certainly wonderfully handsome,\r\n+with his finely curved scarlet lips, his frank blue eyes, his crisp\r\n+gold hair. There was something in his face that made one trust him at\r\n+once. All the candour of youth was there, as well as all youth's\r\n+passionate purity. One felt that he had kept himself unspotted from\r\n+the world. No wonder Basil Hallward worshipped him.\r\n+\r\n+\u0022You are too charming to go in for philanthropy, Mr. Gray--far too\r\n+charming.\u0022 And Lord Henry flung himself down on the divan and opened\r\n+his cigarette-case.\r\n+\r\n+The painter had been busy mixing his colours and getting his brushes\r\n+ready. He was looking worried, and when he heard Lord Henry's last\r\n+remark, he glanced at him, hesitated for a moment, and then said,\r\n+\u0022Harry, I want to finish this picture to-day. Would you think it\r\n+awfully rude of me if I asked you to go away?\u0022\r\n+\r\n+Lord Henry smiled and looked at Dorian Gray. \u0022Am I to go, Mr. Gray?\u0022\r\n+he asked.\r\n+\r\n+\u0022Oh, please don't, Lord Henry. I see that Basil is in one of his sulky\r\n+moods, and I can't bear him when he sulks. Besides, I want you to tell\r\n+me why I should not go in for philanthropy.\u0022\r\n+\r\n+\u0022I don't know that I shall tell you that, Mr. Gray. It is so tedious a\r\n+subject that one would have to talk seriously about it. But I\r\n+certainly shall not run away, now that you have asked me to stop. You\r\n+don't really mind, Basil, do you? You have often told me that you\r\n+liked your sitters to have some one to chat to.\u0022\r\n+\r\n+Hallward bit his lip. \u0022If Dorian wishes it, of course you must stay.\r\n+Dorian's whims are laws to everybody, except himself.\u0022\r\n+\r\n+Lord Henry took up his hat and gloves. \u0022You are very pressing, Basil,\r\n+but I am afraid I must go. I have promised to meet a man at the\r\n+Orleans. Good-bye, Mr. Gray. Come and see me some afternoon in Curzon\r\n+Street. I am nearly always at home at five o'clock. Write to me when\r\n+you are coming. I should be sorry to miss you.\u0022\r\n+\r\n+\u0022Basil,\u0022 cried Dorian Gray, \u0022if Lord Henry Wotton goes, I shall go,\r\n+too. You never open your lips while you are painting, and it is\r\n+horribly dull standing on a platform and trying to look pleasant. Ask\r\n+him to stay. I insist upon it.\u0022\r\n+\r\n+\u0022Stay, Harry, to oblige Dorian, and to oblige me,\u0022 said Hallward,\r\n+gazing intently at his picture. \u0022It is quite true, I never talk when I\r\n+am working, and never listen either, and it must be dreadfully tedious\r\n+for my unfortunate sitters. I beg you to stay.\u0022\r\n+\r\n+\u0022But what about my man at the Orleans?\u0022\r\n+\r\n+The painter laughed. \u0022I don't think there will be any difficulty about\r\n+that. Sit down again, Harry. And now, Dorian, get up on the platform,\r\n+and don't move about too much, or pay any attention to what Lord Henry\r\n+says. He has a very bad influence over all his friends, with the\r\n+single exception of myself.\u0022\r\n+\r\n+Dorian Gray stepped up on the dais with the air of a young Greek\r\n+martyr, and made a little _moue_ of discontent to Lord Henry, to whom he\r\n+had rather taken a fancy. He was so unlike Basil. They made a\r\n+delightful contrast. And he had such a beautiful voice. After a few\r\n+moments he said to him, \u0022Have you really a very bad influence, Lord\r\n+Henry? As bad as Basil says?\u0022\r\n+\r\n+\u0022There is no such thing as a good influence, Mr. Gray. All influence\r\n+is immoral--immoral from the scientific point of view.\u0022\r\n+\r\n+\u0022Why?\u0022\r\n+\r\n+\u0022Because to influence a person is to give him one's own soul. He does\r\n+not think his natural thoughts, or burn with his natural passions. His\r\n+virtues are not real to him. His sins, if there are such things as\r\n+sins, are borrowed. He becomes an echo of some one else's music, an\r\n+actor of a part that has not been written for him. The aim of life is\r\n+self-development. To realize one's nature perfectly--that is what each\r\n+of us is here for. People are afraid of themselves, nowadays. They\r\n+have forgotten the highest of all duties, the duty that one owes to\r\n+one's self. Of course, they are charitable. They feed the hungry and\r\n+clothe the beggar. But their own souls starve, and are naked. Courage\r\n+has gone out of our race. Perhaps we never really had it. The terror\r\n+of society, which is the basis of morals, the terror of God, which is\r\n+the secret of religion--these are the two things that govern us. And\r\n+yet--\u0022\r\n+\r\n+\u0022Just turn your head a little more to the right, Dorian, like a good\r\n+boy,\u0022 said the painter, deep in his work and conscious only that a look\r\n+had come into the lad's face that he had never seen there before.\r\n+\r\n+\u0022And yet,\u0022 continued Lord Henry, in his low, musical voice, and with\r\n+that graceful wave of the hand that was always so characteristic of\r\n+him, and that he had even in his Eton days, \u0022I believe that if one man\r\n+were to live out his life fully and completely, were to give form to\r\n+every feeling, expression to every thought, reality to every dream--I\r\n+believe that the world would gain such a fresh impulse of joy that we\r\n+would forget all the maladies of mediaevalism, and return to the\r\n+Hellenic ideal--to something finer, richer than the Hellenic ideal, it\r\n+may be. But the bravest man amongst us is afraid of himself. The\r\n+mutilation of the savage has its tragic survival in the self-denial\r\n+that mars our lives. We are punished for our refusals. Every impulse\r\n+that we strive to strangle broods in the mind and poisons us. The body\r\n+sins once, and has done with its sin, for action is a mode of\r\n+purification. Nothing remains then but the recollection of a pleasure,\r\n+or the luxury of a regret. The only way to get rid of a temptation is\r\n+to yield to it. Resist it, and your soul grows sick with longing for\r\n+the things it has forbidden to itself, with desire for what its\r\n+monstrous laws have made monstrous and unlawful. It has been said that\r\n+the great events of the world take place in the brain. It is in the\r\n+brain, and the brain only, that the great sins of the world take place\r\n+also. You, Mr. Gray, you yourself, with your rose-red youth and your\r\n+rose-white boyhood, you have had passions that have made you afraid,\r\n+thoughts that have filled you with terror, day-dreams and sleeping\r\n+dreams whose mere memory might stain your cheek with shame--\u0022\r\n+\r\n+\u0022Stop!\u0022 faltered Dorian Gray, \u0022stop! you bewilder me. I don't know\r\n+what to say. There is some answer to you, but I cannot find it. Don't\r\n+speak. Let me think. Or, rather, let me try not to think.\u0022\r\n+\r\n+For nearly ten minutes he stood there, motionless, with parted lips and\r\n+eyes strangely bright. He was dimly conscious that entirely fresh\r\n+influences were at work within him. Yet they seemed to him to have\r\n+come really from himself. The few words that Basil's friend had said\r\n+to him--words spoken by chance, no doubt, and with wilful paradox in\r\n+them--had touched some secret chord that had never been touched before,\r\n+but that he felt was now vibrating and throbbing to curious pulses.\r\n+\r\n+Music had stirred him like that. Music had troubled him many times.\r\n+But music was not articulate. It was not a new world, but rather\r\n+another chaos, that it created in us. Words! Mere words! How\r\n+terrible they were! How clear, and vivid, and cruel! One could not\r\n+escape from them. And yet what a subtle magic there was in them! They\r\n+seemed to be able to give a plastic form to formless things, and to\r\n+have a music of their own as sweet as that of viol or of lute. Mere\r\n+words! Was there anything so real as words?\r\n+\r\n+Yes; there had been things in his boyhood that he had not understood.\r\n+He understood them now. Life suddenly became fiery-coloured to him.\r\n+It seemed to him that he had been walking in fire. Why had he not\r\n+known it?\r\n+\r\n+With his subtle smile, Lord Henry watched him. He knew the precise\r\n+psychological moment when to say nothing. He felt intensely\r\n+interested. He was amazed at the sudden impression that his words had\r\n+produced, and, remembering a book that he had read when he was sixteen,\r\n+a book which had revealed to him much that he had not known before, he\r\n+wondered whether Dorian Gray was passing through a similar experience.\r\n+He had merely shot an arrow into the air. Had it hit the mark? How\r\n+fascinating the lad was!\r\n+\r\n+Hallward painted away with that marvellous bold touch of his, that had\r\n+the true refinement and perfect delicacy that in art, at any rate comes\r\n+only from strength. He was unconscious of the silence.\r\n+\r\n+\u0022Basil, I am tired of standing,\u0022 cried Dorian Gray suddenly. \u0022I must\r\n+go out and sit in the garden. The air is stifling here.\u0022\r\n+\r\n+\u0022My dear fellow, I am so sorry. When I am painting, I can't think of\r\n+anything else. But you never sat better. You were perfectly still.\r\n+And I have caught the effect I wanted--the half-parted lips and the\r\n+bright look in the eyes. I don't know what Harry has been saying to\r\n+you, but he has certainly made you have the most wonderful expression.\r\n+I suppose he has been paying you compliments. You mustn't believe a\r\n+word that he says.\u0022\r\n+\r\n+\u0022He has certainly not been paying me compliments. Perhaps that is the\r\n+reason that I don't believe anything he has told me.\u0022\r\n+\r\n+\u0022You know you believe it all,\u0022 said Lord Henry, looking at him with his\r\n+dreamy languorous eyes. \u0022I will go out to the garden with you. It is\r\n+horribly hot in the studio. Basil, let us have something iced to\r\n+drink, something with strawberries in it.\u0022\r\n+\r\n+\u0022Certainly, Harry. Just touch the bell, and when Parker comes I will\r\n+tell him what you want. I have got to work up this background, so I\r\n+will join you later on. Don't keep Dorian too long. I have never been\r\n+in better form for painting than I am to-day. This is going to be my\r\n+masterpiece. It is my masterpiece as it stands.\u0022\r\n+\r\n+Lord Henry went out to the garden and found Dorian Gray burying his\r\n+face in the great cool lilac-blossoms, feverishly drinking in their\r\n+perfume as if it had been wine. He came close to him and put his hand\r\n+upon his shoulder. \u0022You are quite right to do that,\u0022 he murmured.\r\n+\u0022Nothing can cure the soul but the senses, just as nothing can cure the\r\n+senses but the soul.\u0022\r\n+\r\n+The lad started and drew back. He was bareheaded, and the leaves had\r\n+tossed his rebellious curls and tangled all their gilded threads.\r\n+There was a look of fear in his eyes, such as people have when they are\r\n+suddenly awakened. His finely chiselled nostrils quivered, and some\r\n+hidden nerve shook the scarlet of his lips and left them trembling.\r\n+\r\n+\u0022Yes,\u0022 continued Lord Henry, \u0022that is one of the great secrets of\r\n+life--to cure the soul by means of the senses, and the senses by means\r\n+of the soul. You are a wonderful creation. You know more than you\r\n+think you know, just as you know less than you want to know.\u0022\r\n+\r\n+Dorian Gray frowned and turned his head away. He could not help liking\r\n+the tall, graceful young man who was standing by him. His romantic,\r\n+olive-coloured face and worn expression interested him. There was\r\n+something in his low languid voice that was absolutely fascinating.\r\n+His cool, white, flowerlike hands, even, had a curious charm. They\r\n+moved, as he spoke, like music, and seemed to have a language of their\r\n+own. But he felt afraid of him, and ashamed of being afraid. Why had\r\n+it been left for a stranger to reveal him to himself? He had known\r\n+Basil Hallward for months, but the friendship between them had never\r\n+altered him. Suddenly there had come some one across his life who\r\n+seemed to have disclosed to him life's mystery. And, yet, what was\r\n+there to be afraid of? He was not a schoolboy or a girl. It was\r\n+absurd to be frightened.\r\n+\r\n+\u0022Let us go and sit in the shade,\u0022 said Lord Henry. \u0022Parker has brought\r\n+out the drinks, and if you stay any longer in this glare, you will be\r\n+quite spoiled, and Basil will never paint you again. You really must\r\n+not allow yourself to become sunburnt. It would be unbecoming.\u0022\r\n+\r\n+\u0022What can it matter?\u0022 cried Dorian Gray, laughing, as he sat down on\r\n+the seat at the end of the garden.\r\n+\r\n+\u0022It should matter everything to you, Mr. Gray.\u0022\r\n+\r\n+\u0022Why?\u0022\r\n+\r\n+\u0022Because you have the most marvellous youth, and youth is the one thing\r\n+worth having.\u0022\r\n+\r\n+\u0022I don't feel that, Lord Henry.\u0022\r\n+\r\n+\u0022No, you don't feel it now. Some day, when you are old and wrinkled\r\n+and ugly, when thought has seared your forehead with its lines, and\r\n+passion branded your lips with its hideous fires, you will feel it, you\r\n+will feel it terribly. Now, wherever you go, you charm the world.\r\n+Will it always be so? ... You have a wonderfully beautiful face, Mr.\r\n+Gray. Don't frown. You have. And beauty is a form of genius--is\r\n+higher, indeed, than genius, as it needs no explanation. It is of the\r\n+great facts of the world, like sunlight, or spring-time, or the\r\n+reflection in dark waters of that silver shell we call the moon. It\r\n+cannot be questioned. It has its divine right of sovereignty. It\r\n+makes princes of those who have it. You smile? Ah! when you have lost\r\n+it you won't smile.... People say sometimes that beauty is only\r\n+superficial. That may be so, but at least it is not so superficial as\r\n+thought is. To me, beauty is the wonder of wonders. It is only\r\n+shallow people who do not judge by appearances. The true mystery of\r\n+the world is the visible, not the invisible.... Yes, Mr. Gray, the\r\n+gods have been good to you. But what the gods give they quickly take\r\n+away. You have only a few years in which to live really, perfectly,\r\n+and fully. When your youth goes, your beauty will go with it, and then\r\n+you will suddenly discover that there are no triumphs left for you, or\r\n+have to content yourself with those mean triumphs that the memory of\r\n+your past will make more bitter than defeats. Every month as it wanes\r\n+brings you nearer to something dreadful. Time is jealous of you, and\r\n+wars against your lilies and your roses. You will become sallow, and\r\n+hollow-cheeked, and dull-eyed. You will suffer horribly.... Ah!\r\n+realize your youth while you have it. Don't squander the gold of your\r\n+days, listening to the tedious, trying to improve the hopeless failure,\r\n+or giving away your life to the ignorant, the common, and the vulgar.\r\n+These are the sickly aims, the false ideals, of our age. Live! Live\r\n+the wonderful life that is in you! Let nothing be lost upon you. Be\r\n+always searching for new sensations. Be afraid of nothing.... A new\r\n+Hedonism--that is what our century wants. You might be its visible\r\n+symbol. With your personality there is nothing you could not do. The\r\n+world belongs to you for a season.... The moment I met you I saw that\r\n+you were quite unconscious of what you really are, of what you really\r\n+might be. There was so much in you that charmed me that I felt I must\r\n+tell you something about yourself. I thought how tragic it would be if\r\n+you were wasted. For there is such a little time that your youth will\r\n+last--such a little time. The common hill-flowers wither, but they\r\n+blossom again. The laburnum will be as yellow next June as it is now.\r\n+In a month there will be purple stars on the clematis, and year after\r\n+year the green night of its leaves will hold its purple stars. But we\r\n+never get back our youth. The pulse of joy that beats in us at twenty\r\n+becomes sluggish. Our limbs fail, our senses rot. We degenerate into\r\n+hideous puppets, haunted by the memory of the passions of which we were\r\n+too much afraid, and the exquisite temptations that we had not the\r\n+courage to yield to. Youth! Youth! There is absolutely nothing in\r\n+the world but youth!\u0022\r\n+\r\n+Dorian Gray listened, open-eyed and wondering. The spray of lilac fell\r\n+from his hand upon the gravel. A furry bee came and buzzed round it\r\n+for a moment. Then it began to scramble all over the oval stellated\r\n+globe of the tiny blossoms. He watched it with that strange interest\r\n+in trivial things that we try to develop when things of high import\r\n+make us afraid, or when we are stirred by some new emotion for which we\r\n+cannot find expression, or when some thought that terrifies us lays\r\n+sudden siege to the brain and calls on us to yield. After a time the\r\n+bee flew away. He saw it creeping into the stained trumpet of a Tyrian\r\n+convolvulus. The flower seemed to quiver, and then swayed gently to\r\n+and fro.\r\n+\r\n+Suddenly the painter appeared at the door of the studio and made\r\n+staccato signs for them to come in. They turned to each other and\r\n+smiled.\r\n+\r\n+\u0022I am waiting,\u0022 he cried. \u0022Do come in. The light is quite perfect,\r\n+and you can bring your drinks.\u0022\r\n+\r\n+They rose up and sauntered down the walk together. Two green-and-white\r\n+butterflies fluttered past them, and in the pear-tree at the corner of\r\n+the garden a thrush began to sing.\r\n+\r\n+\u0022You are glad you have met me, Mr. Gray,\u0022 said Lord Henry, looking at\r\n+him.\r\n+\r\n+\u0022Yes, I am glad now. I wonder shall I always be glad?\u0022\r\n+\r\n+\u0022Always! That is a dreadful word. It makes me shudder when I hear it.\r\n+Women are so fond of using it. They spoil every romance by trying to\r\n+make it last for ever. It is a meaningless word, too. The only\r\n+difference between a caprice and a lifelong passion is that the caprice\r\n+lasts a little longer.\u0022\r\n+\r\n+As they entered the studio, Dorian Gray put his hand upon Lord Henry's\r\n+arm. \u0022In that case, let our friendship be a caprice,\u0022 he murmured,\r\n+flushing at his own boldness, then stepped up on the platform and\r\n+resumed his pose.\r\n+\r\n+Lord Henry flung himself into a large wicker arm-chair and watched him.\r\n+The sweep and dash of the brush on the canvas made the only sound that\r\n+broke the stillness, except when, now and then, Hallward stepped back\r\n+to look at his work from a distance. In the slanting beams that\r\n+streamed through the open doorway the dust danced and was golden. The\r\n+heavy scent of the roses seemed to brood over everything.\r\n+\r\n+After about a quarter of an hour Hallward stopped painting, looked for\r\n+a long time at Dorian Gray, and then for a long time at the picture,\r\n+biting the end of one of his huge brushes and frowning. \u0022It is quite\r\n+finished,\u0022 he cried at last, and stooping down he wrote his name in\r\n+long vermilion letters on the left-hand corner of the canvas.\r\n+\r\n+Lord Henry came over and examined the picture. It was certainly a\r\n+wonderful work of art, and a wonderful likeness as well.\r\n+\r\n+\u0022My dear fellow, I congratulate you most warmly,\u0022 he said. \u0022It is the\r\n+finest portrait of modern times. Mr. Gray, come over and look at\r\n+yourself.\u0022\r\n+\r\n+The lad started, as if awakened from some dream.\r\n+\r\n+\u0022Is it really finished?\u0022 he murmured, stepping down from the platform.\r\n+\r\n+\u0022Quite finished,\u0022 said the painter. \u0022And you have sat splendidly\r\n+to-day. I am awfully obliged to you.\u0022\r\n+\r\n+\u0022That is entirely due to me,\u0022 broke in Lord Henry. \u0022Isn't it, Mr.\r\n+Gray?\u0022\r\n+\r\n+Dorian made no answer, but passed listlessly in front of his picture\r\n+and turned towards it. When he saw it he drew back, and his cheeks\r\n+flushed for a moment with pleasure. A look of joy came into his eyes,\r\n+as if he had recognized himself for the first time. He stood there\r\n+motionless and in wonder, dimly conscious that Hallward was speaking to\r\n+him, but not catching the meaning of his words. The sense of his own\r\n+beauty came on him like a revelation. He had never felt it before.\r\n+Basil Hallward's compliments had seemed to him to be merely the\r\n+charming exaggeration of friendship. He had listened to them, laughed\r\n+at them, forgotten them. They had not influenced his nature. Then had\r\n+come Lord Henry Wotton with his strange panegyric on youth, his\r\n+terrible warning of its brevity. That had stirred him at the time, and\r\n+now, as he stood gazing at the shadow of his own loveliness, the full\r\n+reality of the description flashed across him. Yes, there would be a\r\n+day when his face would be wrinkled and wizen, his eyes dim and\r\n+colourless, the grace of his figure broken and deformed. The scarlet\r\n+would pass away from his lips and the gold steal from his hair. The\r\n+life that was to make his soul would mar his body. He would become\r\n+dreadful, hideous, and uncouth.\r\n+\r\n+As he thought of it, a sharp pang of pain struck through him like a\r\n+knife and made each delicate fibre of his nature quiver. His eyes\r\n+deepened into amethyst, and across them came a mist of tears. He felt\r\n+as if a hand of ice had been laid upon his heart.\r\n+\r\n+\u0022Don't you like it?\u0022 cried Hallward at last, stung a little by the\r\n+lad's silence, not understanding what it meant.\r\n+\r\n+\u0022Of course he likes it,\u0022 said Lord Henry. \u0022Who wouldn't like it? It\r\n+is one of the greatest things in modern art. I will give you anything\r\n+you like to ask for it. I must have it.\u0022\r\n+\r\n+\u0022It is not my property, Harry.\u0022\r\n+\r\n+\u0022Whose property is it?\u0022\r\n+\r\n+\u0022Dorian's, of course,\u0022 answered the painter.\r\n+\r\n+\u0022He is a very lucky fellow.\u0022\r\n+\r\n+\u0022How sad it is!\u0022 murmured Dorian Gray with his eyes still fixed upon\r\n+his own portrait. \u0022How sad it is! I shall grow old, and horrible, and\r\n+dreadful. But this picture will remain always young. It will never be\r\n+older than this particular day of June.... If it were only the other\r\n+way! If it were I who was to be always young, and the picture that was\r\n+to grow old! For that--for that--I would give everything! Yes, there\r\n+is nothing in the whole world I would not give! I would give my soul\r\n+for that!\u0022\r\n+\r\n+\u0022You would hardly care for such an arrangement, Basil,\u0022 cried Lord\r\n+Henry, laughing. \u0022It would be rather hard lines on your work.\u0022\r\n+\r\n+\u0022I should object very strongly, Harry,\u0022 said Hallward.\r\n+\r\n+Dorian Gray turned and looked at him. \u0022I believe you would, Basil.\r\n+You like your art better than your friends. I am no more to you than a\r\n+green bronze figure. Hardly as much, I dare say.\u0022\r\n+\r\n+The painter stared in amazement. It was so unlike Dorian to speak like\r\n+that. What had happened? He seemed quite angry. His face was flushed\r\n+and his cheeks burning.\r\n+\r\n+\u0022Yes,\u0022 he continued, \u0022I am less to you than your ivory Hermes or your\r\n+silver Faun. You will like them always. How long will you like me?\r\n+Till I have my first wrinkle, I suppose. I know, now, that when one\r\n+loses one's good looks, whatever they may be, one loses everything.\r\n+Your picture has taught me that. Lord Henry Wotton is perfectly right.\r\n+Youth is the only thing worth having. When I find that I am growing\r\n+old, I shall kill myself.\u0022\r\n+\r\n+Hallward turned pale and caught his hand. \u0022Dorian! Dorian!\u0022 he cried,\r\n+\u0022don't talk like that. I have never had such a friend as you, and I\r\n+shall never have such another. You are not jealous of material things,\r\n+are you?--you who are finer than any of them!\u0022\r\n+\r\n+\u0022I am jealous of everything whose beauty does not die. I am jealous of\r\n+the portrait you have painted of me. Why should it keep what I must\r\n+lose? Every moment that passes takes something from me and gives\r\n+something to it. Oh, if it were only the other way! If the picture\r\n+could change, and I could be always what I am now! Why did you paint\r\n+it? It will mock me some day--mock me horribly!\u0022 The hot tears welled\r\n+into his eyes; he tore his hand away and, flinging himself on the\r\n+divan, he buried his face in the cushions, as though he was praying.\r\n+\r\n+\u0022This is your doing, Harry,\u0022 said the painter bitterly.\r\n+\r\n+Lord Henry shrugged his shoulders. \u0022It is the real Dorian Gray--that\r\n+is all.\u0022\r\n+\r\n+\u0022It is not.\u0022\r\n+\r\n+\u0022If it is not, what have I to do with it?\u0022\r\n+\r\n+\u0022You should have gone away when I asked you,\u0022 he muttered.\r\n+\r\n+\u0022I stayed when you asked me,\u0022 was Lord Henry's answer.\r\n+\r\n+\u0022Harry, I can't quarrel with my two best friends at once, but between\r\n+you both you have made me hate the finest piece of work I have ever\r\n+done, and I will destroy it. What is it but canvas and colour? I will\r\n+not let it come across our three lives and mar them.\u0022\r\n+\r\n+Dorian Gray lifted his golden head from the pillow, and with pallid\r\n+face and tear-stained eyes, looked at him as he walked over to the deal\r\n+painting-table that was set beneath the high curtained window. What\r\n+was he doing there? His fingers were straying about among the litter\r\n+of tin tubes and dry brushes, seeking for something. Yes, it was for\r\n+the long palette-knife, with its thin blade of lithe steel. He had\r\n+found it at last. He was going to rip up the canvas.\r\n+\r\n+With a stifled sob the lad leaped from the couch, and, rushing over to\r\n+Hallward, tore the knife out of his hand, and flung it to the end of\r\n+the studio. \u0022Don't, Basil, don't!\u0022 he cried. \u0022It would be murder!\u0022\r\n+\r\n+\u0022I am glad you appreciate my work at last, Dorian,\u0022 said the painter\r\n+coldly when he had recovered from his surprise. \u0022I never thought you\r\n+would.\u0022\r\n+\r\n+\u0022Appreciate it? I am in love with it, Basil. It is part of myself. I\r\n+feel that.\u0022\r\n+\r\n+\u0022Well, as soon as you are dry, you shall be varnished, and framed, and\r\n+sent home. Then you can do what you like with yourself.\u0022 And he walked\r\n+across the room and rang the bell for tea. \u0022You will have tea, of\r\n+course, Dorian? And so will you, Harry? Or do you object to such\r\n+simple pleasures?\u0022\r\n+\r\n+\u0022I adore simple pleasures,\u0022 said Lord Henry. \u0022They are the last refuge\r\n+of the complex. But I don't like scenes, except on the stage. What\r\n+absurd fellows you are, both of you! I wonder who it was defined man\r\n+as a rational animal. It was the most premature definition ever given.\r\n+Man is many things, but he is not rational. I am glad he is not, after\r\n+all--though I wish you chaps would not squabble over the picture. You\r\n+had much better let me have it, Basil. This silly boy doesn't really\r\n+want it, and I really do.\u0022\r\n+\r\n+\u0022If you let any one have it but me, Basil, I shall never forgive you!\u0022\r\n+cried Dorian Gray; \u0022and I don't allow people to call me a silly boy.\u0022\r\n+\r\n+\u0022You know the picture is yours, Dorian. I gave it to you before it\r\n+existed.\u0022\r\n+\r\n+\u0022And you know you have been a little silly, Mr. Gray, and that you\r\n+don't really object to being reminded that you are extremely young.\u0022\r\n+\r\n+\u0022I should have objected very strongly this morning, Lord Henry.\u0022\r\n+\r\n+\u0022Ah! this morning! You have lived since then.\u0022\r\n+\r\n+There came a knock at the door, and the butler entered with a laden\r\n+tea-tray and set it down upon a small Japanese table. There was a\r\n+rattle of cups and saucers and the hissing of a fluted Georgian urn.\r\n+Two globe-shaped china dishes were brought in by a page. Dorian Gray\r\n+went over and poured out the tea. The two men sauntered languidly to\r\n+the table and examined what was under the covers.\r\n+\r\n+\u0022Let us go to the theatre to-night,\u0022 said Lord Henry. \u0022There is sure\r\n+to be something on, somewhere. I have promised to dine at White's, but\r\n+it is only with an old friend, so I can send him a wire to say that I\r\n+am ill, or that I am prevented from coming in consequence of a\r\n+subsequent engagement. I think that would be a rather nice excuse: it\r\n+would have all the surprise of candour.\u0022\r\n+\r\n+\u0022It is such a bore putting on one's dress-clothes,\u0022 muttered Hallward.\r\n+\u0022And, when one has them on, they are so horrid.\u0022\r\n+\r\n+\u0022Yes,\u0022 answered Lord Henry dreamily, \u0022the costume of the nineteenth\r\n+century is detestable. It is so sombre, so depressing. Sin is the\r\n+only real colour-element left in modern life.\u0022\r\n+\r\n+\u0022You really must not say things like that before Dorian, Harry.\u0022\r\n+\r\n+\u0022Before which Dorian? The one who is pouring out tea for us, or the\r\n+one in the picture?\u0022\r\n+\r\n+\u0022Before either.\u0022\r\n+\r\n+\u0022I should like to come to the theatre with you, Lord Henry,\u0022 said the\r\n+lad.\r\n+\r\n+\u0022Then you shall come; and you will come, too, Basil, won't you?\u0022\r\n+\r\n+\u0022I can't, really. I would sooner not. I have a lot of work to do.\u0022\r\n+\r\n+\u0022Well, then, you and I will go alone, Mr. Gray.\u0022\r\n+\r\n+\u0022I should like that awfully.\u0022\r\n+\r\n+The painter bit his lip and walked over, cup in hand, to the picture.\r\n+\u0022I shall stay with the real Dorian,\u0022 he said, sadly.\r\n+\r\n+\u0022Is it the real Dorian?\u0022 cried the original of the portrait, strolling\r\n+across to him. \u0022Am I really like that?\u0022\r\n+\r\n+\u0022Yes; you are just like that.\u0022\r\n+\r\n+\u0022How wonderful, Basil!\u0022\r\n+\r\n+\u0022At least you are like it in appearance. But it will never alter,\u0022\r\n+sighed Hallward. \u0022That is something.\u0022\r\n+\r\n+\u0022What a fuss people make about fidelity!\u0022 exclaimed Lord Henry. \u0022Why,\r\n+even in love it is purely a question for physiology. It has nothing to\r\n+do with our own will. Young men want to be faithful, and are not; old\r\n+men want to be faithless, and cannot: that is all one can say.\u0022\r\n+\r\n+\u0022Don't go to the theatre to-night, Dorian,\u0022 said Hallward. \u0022Stop and\r\n+dine with me.\u0022\r\n+\r\n+\u0022I can't, Basil.\u0022\r\n+\r\n+\u0022Why?\u0022\r\n+\r\n+\u0022Because I have promised Lord Henry Wotton to go with him.\u0022\r\n+\r\n+\u0022He won't like you the better for keeping your promises. He always\r\n+breaks his own. I beg you not to go.\u0022\r\n+\r\n+Dorian Gray laughed and shook his head.\r\n+\r\n+\u0022I entreat you.\u0022\r\n+\r\n+The lad hesitated, and looked over at Lord Henry, who was watching them\r\n+from the tea-table with an amused smile.\r\n+\r\n+\u0022I must go, Basil,\u0022 he answered.\r\n+\r\n+\u0022Very well,\u0022 said Hallward, and he went over and laid down his cup on\r\n+the tray. \u0022It is rather late, and, as you have to dress, you had\r\n+better lose no time. Good-bye, Harry. Good-bye, Dorian. Come and see\r\n+me soon. Come to-morrow.\u0022\r\n+\r\n+\u0022Certainly.\u0022\r\n+\r\n+\u0022You won't forget?\u0022\r\n+\r\n+\u0022No, of course not,\u0022 cried Dorian.\r\n+\r\n+\u0022And ... Harry!\u0022\r\n+\r\n+\u0022Yes, Basil?\u0022\r\n+\r\n+\u0022Remember what I asked you, when we were in the garden this morning.\u0022\r\n+\r\n+\u0022I have forgotten it.\u0022\r\n+\r\n+\u0022I trust you.\u0022\r\n+\r\n+\u0022I wish I could trust myself,\u0022 said Lord Henry, laughing. \u0022Come, Mr.\r\n+Gray, my hansom is outside, and I can drop you at your own place.\r\n+Good-bye, Basil. It has been a most interesting afternoon.\u0022\r\n+\r\n+As the door closed behind them, the painter flung himself down on a\r\n+sofa, and a look of pain came into his face.\r\n+\r\n+\r\n+\r\n+CHAPTER 3\r\n+\r\n+At half-past twelve next day Lord Henry Wotton strolled from Curzon\r\n+Street over to the Albany to call on his uncle, Lord Fermor, a genial\r\n+if somewhat rough-mannered old bachelor, whom the outside world called\r\n+selfish because it derived no particular benefit from him, but who was\r\n+considered generous by Society as he fed the people who amused him.\r\n+His father had been our ambassador at Madrid when Isabella was young\r\n+and Prim unthought of, but had retired from the diplomatic service in a\r\n+capricious moment of annoyance on not being offered the Embassy at\r\n+Paris, a post to which he considered that he was fully entitled by\r\n+reason of his birth, his indolence, the good English of his dispatches,\r\n+and his inordinate passion for pleasure. The son, who had been his\r\n+father's secretary, had resigned along with his chief, somewhat\r\n+foolishly as was thought at the time, and on succeeding some months\r\n+later to the title, had set himself to the serious study of the great\r\n+aristocratic art of doing absolutely nothing. He had two large town\r\n+houses, but preferred to live in chambers as it was less trouble, and\r\n+took most of his meals at his club. He paid some attention to the\r\n+management of his collieries in the Midland counties, excusing himself\r\n+for this taint of industry on the ground that the one advantage of\r\n+having coal was that it enabled a gentleman to afford the decency of\r\n+burning wood on his own hearth. In politics he was a Tory, except when\r\n+the Tories were in office, during which period he roundly abused them\r\n+for being a pack of Radicals. He was a hero to his valet, who bullied\r\n+him, and a terror to most of his relations, whom he bullied in turn.\r\n+Only England could have produced him, and he always said that the\r\n+country was going to the dogs. His principles were out of date, but\r\n+there was a good deal to be said for his prejudices.\r\n+\r\n+When Lord Henry entered the room, he found his uncle sitting in a rough\r\n+shooting-coat, smoking a cheroot and grumbling over _The Times_. \u0022Well,\r\n+Harry,\u0022 said the old gentleman, \u0022what brings you out so early? I\r\n+thought you dandies never got up till two, and were not visible till\r\n+five.\u0022\r\n+\r\n+\u0022Pure family affection, I assure you, Uncle George. I want to get\r\n+something out of you.\u0022\r\n+\r\n+\u0022Money, I suppose,\u0022 said Lord Fermor, making a wry face. \u0022Well, sit\r\n+down and tell me all about it. Young people, nowadays, imagine that\r\n+money is everything.\u0022\r\n+\r\n+\u0022Yes,\u0022 murmured Lord Henry, settling his button-hole in his coat; \u0022and\r\n+when they grow older they know it. But I don't want money. It is only\r\n+people who pay their bills who want that, Uncle George, and I never pay\r\n+mine. Credit is the capital of a younger son, and one lives charmingly\r\n+upon it. Besides, I always deal with Dartmoor's tradesmen, and\r\n+consequently they never bother me. What I want is information: not\r\n+useful information, of course; useless information.\u0022\r\n+\r\n+\u0022Well, I can tell you anything that is in an English Blue Book, Harry,\r\n+although those fellows nowadays write a lot of nonsense. When I was in\r\n+the Diplomatic, things were much better. But I hear they let them in\r\n+now by examination. What can you expect? Examinations, sir, are pure\r\n+humbug from beginning to end. If a man is a gentleman, he knows quite\r\n+enough, and if he is not a gentleman, whatever he knows is bad for him.\u0022\r\n+\r\n+\u0022Mr. Dorian Gray does not belong to Blue Books, Uncle George,\u0022 said\r\n+Lord Henry languidly.\r\n+\r\n+\u0022Mr. Dorian Gray? Who is he?\u0022 asked Lord Fermor, knitting his bushy\r\n+white eyebrows.\r\n+\r\n+\u0022That is what I have come to learn, Uncle George. Or rather, I know\r\n+who he is. He is the last Lord Kelso's grandson. His mother was a\r\n+Devereux, Lady Margaret Devereux. I want you to tell me about his\r\n+mother. What was she like? Whom did she marry? You have known nearly\r\n+everybody in your time, so you might have known her. I am very much\r\n+interested in Mr. Gray at present. I have only just met him.\u0022\r\n+\r\n+\u0022Kelso's grandson!\u0022 echoed the old gentleman. \u0022Kelso's grandson! ...\r\n+Of course.... I knew his mother intimately. I believe I was at her\r\n+christening. She was an extraordinarily beautiful girl, Margaret\r\n+Devereux, and made all the men frantic by running away with a penniless\r\n+young fellow--a mere nobody, sir, a subaltern in a foot regiment, or\r\n+something of that kind. Certainly. I remember the whole thing as if\r\n+it happened yesterday. The poor chap was killed in a duel at Spa a few\r\n+months after the marriage. There was an ugly story about it. They\r\n+said Kelso got some rascally adventurer, some Belgian brute, to insult\r\n+his son-in-law in public--paid him, sir, to do it, paid him--and that\r\n+the fellow spitted his man as if he had been a pigeon. The thing was\r\n+hushed up, but, egad, Kelso ate his chop alone at the club for some\r\n+time afterwards. He brought his daughter back with him, I was told,\r\n+and she never spoke to him again. Oh, yes; it was a bad business. The\r\n+girl died, too, died within a year. So she left a son, did she? I had\r\n+forgotten that. What sort of boy is he? If he is like his mother, he\r\n+must be a good-looking chap.\u0022\r\n+\r\n+\u0022He is very good-looking,\u0022 assented Lord Henry.\r\n+\r\n+\u0022I hope he will fall into proper hands,\u0022 continued the old man. \u0022He\r\n+should have a pot of money waiting for him if Kelso did the right thing\r\n+by him. His mother had money, too. All the Selby property came to\r\n+her, through her grandfather. Her grandfather hated Kelso, thought him\r\n+a mean dog. He was, too. Came to Madrid once when I was there. Egad,\r\n+I was ashamed of him. The Queen used to ask me about the English noble\r\n+who was always quarrelling with the cabmen about their fares. They\r\n+made quite a story of it. I didn't dare show my face at Court for a\r\n+month. I hope he treated his grandson better than he did the jarvies.\u0022\r\n+\r\n+\u0022I don't know,\u0022 answered Lord Henry. \u0022I fancy that the boy will be\r\n+well off. He is not of age yet. He has Selby, I know. He told me so.\r\n+And ... his mother was very beautiful?\u0022\r\n+\r\n+\u0022Margaret Devereux was one of the loveliest creatures I ever saw,\r\n+Harry. What on earth induced her to behave as she did, I never could\r\n+understand. She could have married anybody she chose. Carlington was\r\n+mad after her. She was romantic, though. All the women of that family\r\n+were. The men were a poor lot, but, egad! the women were wonderful.\r\n+Carlington went on his knees to her. Told me so himself. She laughed\r\n+at him, and there wasn't a girl in London at the time who wasn't after\r\n+him. And by the way, Harry, talking about silly marriages, what is\r\n+this humbug your father tells me about Dartmoor wanting to marry an\r\n+American? Ain't English girls good enough for him?\u0022\r\n+\r\n+\u0022It is rather fashionable to marry Americans just now, Uncle George.\u0022\r\n+\r\n+\u0022I'll back English women against the world, Harry,\u0022 said Lord Fermor,\r\n+striking the table with his fist.\r\n+\r\n+\u0022The betting is on the Americans.\u0022\r\n+\r\n+\u0022They don't last, I am told,\u0022 muttered his uncle.\r\n+\r\n+\u0022A long engagement exhausts them, but they are capital at a\r\n+steeplechase. They take things flying. I don't think Dartmoor has a\r\n+chance.\u0022\r\n+\r\n+\u0022Who are her people?\u0022 grumbled the old gentleman. \u0022Has she got any?\u0022\r\n+\r\n+Lord Henry shook his head. \u0022American girls are as clever at concealing\r\n+their parents, as English women are at concealing their past,\u0022 he said,\r\n+rising to go.\r\n+\r\n+\u0022They are pork-packers, I suppose?\u0022\r\n+\r\n+\u0022I hope so, Uncle George, for Dartmoor's sake. I am told that\r\n+pork-packing is the most lucrative profession in America, after\r\n+politics.\u0022\r\n+\r\n+\u0022Is she pretty?\u0022\r\n+\r\n+\u0022She behaves as if she was beautiful. Most American women do. It is\r\n+the secret of their charm.\u0022\r\n+\r\n+\u0022Why can't these American women stay in their own country? They are\r\n+always telling us that it is the paradise for women.\u0022\r\n+\r\n+\u0022It is. That is the reason why, like Eve, they are so excessively\r\n+anxious to get out of it,\u0022 said Lord Henry. \u0022Good-bye, Uncle George.\r\n+I shall be late for lunch, if I stop any longer. Thanks for giving me\r\n+the information I wanted. I always like to know everything about my\r\n+new friends, and nothing about my old ones.\u0022\r\n+\r\n+\u0022Where are you lunching, Harry?\u0022\r\n+\r\n+\u0022At Aunt Agatha's. I have asked myself and Mr. Gray. He is her latest\r\n+_protege_.\u0022\r\n+\r\n+\u0022Humph! tell your Aunt Agatha, Harry, not to bother me any more with\r\n+her charity appeals. I am sick of them. Why, the good woman thinks\r\n+that I have nothing to do but to write cheques for her silly fads.\u0022\r\n+\r\n+\u0022All right, Uncle George, I'll tell her, but it won't have any effect.\r\n+Philanthropic people lose all sense of humanity. It is their\r\n+distinguishing characteristic.\u0022\r\n+\r\n+The old gentleman growled approvingly and rang the bell for his\r\n+servant. Lord Henry passed up the low arcade into Burlington Street\r\n+and turned his steps in the direction of Berkeley Square.\r\n+\r\n+So that was the story of Dorian Gray's parentage. Crudely as it had\r\n+been told to him, it had yet stirred him by its suggestion of a\r\n+strange, almost modern romance. A beautiful woman risking everything\r\n+for a mad passion. A few wild weeks of happiness cut short by a\r\n+hideous, treacherous crime. Months of voiceless agony, and then a\r\n+child born in pain. The mother snatched away by death, the boy left to\r\n+solitude and the tyranny of an old and loveless man. Yes; it was an\r\n+interesting background. It posed the lad, made him more perfect, as it\r\n+were. Behind every exquisite thing that existed, there was something\r\n+tragic. Worlds had to be in travail, that the meanest flower might\r\n+blow.... And how charming he had been at dinner the night before, as\r\n+with startled eyes and lips parted in frightened pleasure he had sat\r\n+opposite to him at the club, the red candleshades staining to a richer\r\n+rose the wakening wonder of his face. Talking to him was like playing\r\n+upon an exquisite violin. He answered to every touch and thrill of the\r\n+bow.... There was something terribly enthralling in the exercise of\r\n+influence. No other activity was like it. To project one's soul into\r\n+some gracious form, and let it tarry there for a moment; to hear one's\r\n+own intellectual views echoed back to one with all the added music of\r\n+passion and youth; to convey one's temperament into another as though\r\n+it were a subtle fluid or a strange perfume: there was a real joy in\r\n+that--perhaps the most satisfying joy left to us in an age so limited\r\n+and vulgar as our own, an age grossly carnal in its pleasures, and\r\n+grossly common in its aims.... He was a marvellous type, too, this lad,\r\n+whom by so curious a chance he had met in Basil's studio, or could be\r\n+fashioned into a marvellous type, at any rate. Grace was his, and the\r\n+white purity of boyhood, and beauty such as old Greek marbles kept for\r\n+us. There was nothing that one could not do with him. He could be\r\n+made a Titan or a toy. What a pity it was that such beauty was\r\n+destined to fade! ... And Basil? From a psychological point of view,\r\n+how interesting he was! The new manner in art, the fresh mode of\r\n+looking at life, suggested so strangely by the merely visible presence\r\n+of one who was unconscious of it all; the silent spirit that dwelt in\r\n+dim woodland, and walked unseen in open field, suddenly showing\r\n+herself, Dryadlike and not afraid, because in his soul who sought for\r\n+her there had been wakened that wonderful vision to which alone are\r\n+wonderful things revealed; the mere shapes and patterns of things\r\n+becoming, as it were, refined, and gaining a kind of symbolical value,\r\n+as though they were themselves patterns of some other and more perfect\r\n+form whose shadow they made real: how strange it all was! He\r\n+remembered something like it in history. Was it not Plato, that artist\r\n+in thought, who had first analyzed it? Was it not Buonarotti who had\r\n+carved it in the coloured marbles of a sonnet-sequence? But in our own\r\n+century it was strange.... Yes; he would try to be to Dorian Gray\r\n+what, without knowing it, the lad was to the painter who had fashioned\r\n+the wonderful portrait. He would seek to dominate him--had already,\r\n+indeed, half done so. He would make that wonderful spirit his own.\r\n+There was something fascinating in this son of love and death.\r\n+\r\n+Suddenly he stopped and glanced up at the houses. He found that he had\r\n+passed his aunt's some distance, and, smiling to himself, turned back.\r\n+When he entered the somewhat sombre hall, the butler told him that they\r\n+had gone in to lunch. He gave one of the footmen his hat and stick and\r\n+passed into the dining-room.\r\n+\r\n+\u0022Late as usual, Harry,\u0022 cried his aunt, shaking her head at him.\r\n+\r\n+He invented a facile excuse, and having taken the vacant seat next to\r\n+her, looked round to see who was there. Dorian bowed to him shyly from\r\n+the end of the table, a flush of pleasure stealing into his cheek.\r\n+Opposite was the Duchess of Harley, a lady of admirable good-nature and\r\n+good temper, much liked by every one who knew her, and of those ample\r\n+architectural proportions that in women who are not duchesses are\r\n+described by contemporary historians as stoutness. Next to her sat, on\r\n+her right, Sir Thomas Burdon, a Radical member of Parliament, who\r\n+followed his leader in public life and in private life followed the\r\n+best cooks, dining with the Tories and thinking with the Liberals, in\r\n+accordance with a wise and well-known rule. The post on her left was\r\n+occupied by Mr. Erskine of Treadley, an old gentleman of considerable\r\n+charm and culture, who had fallen, however, into bad habits of silence,\r\n+having, as he explained once to Lady Agatha, said everything that he\r\n+had to say before he was thirty. His own neighbour was Mrs. Vandeleur,\r\n+one of his aunt's oldest friends, a perfect saint amongst women, but so\r\n+dreadfully dowdy that she reminded one of a badly bound hymn-book.\r\n+Fortunately for him she had on the other side Lord Faudel, a most\r\n+intelligent middle-aged mediocrity, as bald as a ministerial statement\r\n+in the House of Commons, with whom she was conversing in that intensely\r\n+earnest manner which is the one unpardonable error, as he remarked once\r\n+himself, that all really good people fall into, and from which none of\r\n+them ever quite escape.\r\n+\r\n+\u0022We are talking about poor Dartmoor, Lord Henry,\u0022 cried the duchess,\r\n+nodding pleasantly to him across the table. \u0022Do you think he will\r\n+really marry this fascinating young person?\u0022\r\n+\r\n+\u0022I believe she has made up her mind to propose to him, Duchess.\u0022\r\n+\r\n+\u0022How dreadful!\u0022 exclaimed Lady Agatha. \u0022Really, some one should\r\n+interfere.\u0022\r\n+\r\n+\u0022I am told, on excellent authority, that her father keeps an American\r\n+dry-goods store,\u0022 said Sir Thomas Burdon, looking supercilious.\r\n+\r\n+\u0022My uncle has already suggested pork-packing, Sir Thomas.\u0022\r\n+\r\n+\u0022Dry-goods! What are American dry-goods?\u0022 asked the duchess, raising\r\n+her large hands in wonder and accentuating the verb.\r\n+\r\n+\u0022American novels,\u0022 answered Lord Henry, helping himself to some quail.\r\n+\r\n+The duchess looked puzzled.\r\n+\r\n+\u0022Don't mind him, my dear,\u0022 whispered Lady Agatha. \u0022He never means\r\n+anything that he says.\u0022\r\n+\r\n+\u0022When America was discovered,\u0022 said the Radical member--and he began to\r\n+give some wearisome facts. Like all people who try to exhaust a\r\n+subject, he exhausted his listeners. The duchess sighed and exercised\r\n+her privilege of interruption. \u0022I wish to goodness it never had been\r\n+discovered at all!\u0022 she exclaimed. \u0022Really, our girls have no chance\r\n+nowadays. It is most unfair.\u0022\r\n+\r\n+\u0022Perhaps, after all, America never has been discovered,\u0022 said Mr.\r\n+Erskine; \u0022I myself would say that it had merely been detected.\u0022\r\n+\r\n+\u0022Oh! but I have seen specimens of the inhabitants,\u0022 answered the\r\n+duchess vaguely. \u0022I must confess that most of them are extremely\r\n+pretty. And they dress well, too. They get all their dresses in\r\n+Paris. I wish I could afford to do the same.\u0022\r\n+\r\n+\u0022They say that when good Americans die they go to Paris,\u0022 chuckled Sir\r\n+Thomas, who had a large wardrobe of Humour's cast-off clothes.\r\n+\r\n+\u0022Really! And where do bad Americans go to when they die?\u0022 inquired the\r\n+duchess.\r\n+\r\n+\u0022They go to America,\u0022 murmured Lord Henry.\r\n+\r\n+Sir Thomas frowned. \u0022I am afraid that your nephew is prejudiced\r\n+against that great country,\u0022 he said to Lady Agatha. \u0022I have travelled\r\n+all over it in cars provided by the directors, who, in such matters,\r\n+are extremely civil. I assure you that it is an education to visit it.\u0022\r\n+\r\n+\u0022But must we really see Chicago in order to be educated?\u0022 asked Mr.\r\n+Erskine plaintively. \u0022I don't feel up to the journey.\u0022\r\n+\r\n+Sir Thomas waved his hand. \u0022Mr. Erskine of Treadley has the world on\r\n+his shelves. We practical men like to see things, not to read about\r\n+them. The Americans are an extremely interesting people. They are\r\n+absolutely reasonable. I think that is their distinguishing\r\n+characteristic. Yes, Mr. Erskine, an absolutely reasonable people. I\r\n+assure you there is no nonsense about the Americans.\u0022\r\n+\r\n+\u0022How dreadful!\u0022 cried Lord Henry. \u0022I can stand brute force, but brute\r\n+reason is quite unbearable. There is something unfair about its use.\r\n+It is hitting below the intellect.\u0022\r\n+\r\n+\u0022I do not understand you,\u0022 said Sir Thomas, growing rather red.\r\n+\r\n+\u0022I do, Lord Henry,\u0022 murmured Mr. Erskine, with a smile.\r\n+\r\n+\u0022Paradoxes are all very well in their way....\u0022 rejoined the baronet.\r\n+\r\n+\u0022Was that a paradox?\u0022 asked Mr. Erskine. \u0022I did not think so. Perhaps\r\n+it was. Well, the way of paradoxes is the way of truth. To test\r\n+reality we must see it on the tight rope. When the verities become\r\n+acrobats, we can judge them.\u0022\r\n+\r\n+\u0022Dear me!\u0022 said Lady Agatha, \u0022how you men argue! I am sure I never can\r\n+make out what you are talking about. Oh! Harry, I am quite vexed with\r\n+you. Why do you try to persuade our nice Mr. Dorian Gray to give up\r\n+the East End? I assure you he would be quite invaluable. They would\r\n+love his playing.\u0022\r\n+\r\n+\u0022I want him to play to me,\u0022 cried Lord Henry, smiling, and he looked\r\n+down the table and caught a bright answering glance.\r\n+\r\n+\u0022But they are so unhappy in Whitechapel,\u0022 continued Lady Agatha.\r\n+\r\n+\u0022I can sympathize with everything except suffering,\u0022 said Lord Henry,\r\n+shrugging his shoulders. \u0022I cannot sympathize with that. It is too\r\n+ugly, too horrible, too distressing. There is something terribly\r\n+morbid in the modern sympathy with pain. One should sympathize with\r\n+the colour, the beauty, the joy of life. The less said about life's\r\n+sores, the better.\u0022\r\n+\r\n+\u0022Still, the East End is a very important problem,\u0022 remarked Sir Thomas\r\n+with a grave shake of the head.\r\n+\r\n+\u0022Quite so,\u0022 answered the young lord. \u0022It is the problem of slavery,\r\n+and we try to solve it by amusing the slaves.\u0022\r\n+\r\n+The politician looked at him keenly. \u0022What change do you propose,\r\n+then?\u0022 he asked.\r\n+\r\n+Lord Henry laughed. \u0022I don't desire to change anything in England\r\n+except the weather,\u0022 he answered. \u0022I am quite content with philosophic\r\n+contemplation. But, as the nineteenth century has gone bankrupt\r\n+through an over-expenditure of sympathy, I would suggest that we should\r\n+appeal to science to put us straight. The advantage of the emotions is\r\n+that they lead us astray, and the advantage of science is that it is\r\n+not emotional.\u0022\r\n+\r\n+\u0022But we have such grave responsibilities,\u0022 ventured Mrs. Vandeleur\r\n+timidly.\r\n+\r\n+\u0022Terribly grave,\u0022 echoed Lady Agatha.\r\n+\r\n+Lord Henry looked over at Mr. Erskine. \u0022Humanity takes itself too\r\n+seriously. It is the world's original sin. If the caveman had known\r\n+how to laugh, history would have been different.\u0022\r\n+\r\n+\u0022You are really very comforting,\u0022 warbled the duchess. \u0022I have always\r\n+felt rather guilty when I came to see your dear aunt, for I take no\r\n+interest at all in the East End. For the future I shall be able to\r\n+look her in the face without a blush.\u0022\r\n+\r\n+\u0022A blush is very becoming, Duchess,\u0022 remarked Lord Henry.\r\n+\r\n+\u0022Only when one is young,\u0022 she answered. \u0022When an old woman like myself\r\n+blushes, it is a very bad sign. Ah! Lord Henry, I wish you would tell\r\n+me how to become young again.\u0022\r\n+\r\n+He thought for a moment. \u0022Can you remember any great error that you\r\n+committed in your early days, Duchess?\u0022 he asked, looking at her across\r\n+the table.\r\n+\r\n+\u0022A great many, I fear,\u0022 she cried.\r\n+\r\n+\u0022Then commit them over again,\u0022 he said gravely. \u0022To get back one's\r\n+youth, one has merely to repeat one's follies.\u0022\r\n+\r\n+\u0022A delightful theory!\u0022 she exclaimed. \u0022I must put it into practice.\u0022\r\n+\r\n+\u0022A dangerous theory!\u0022 came from Sir Thomas's tight lips. Lady Agatha\r\n+shook her head, but could not help being amused. Mr. Erskine listened.\r\n+\r\n+\u0022Yes,\u0022 he continued, \u0022that is one of the great secrets of life.\r\n+Nowadays most people die of a sort of creeping common sense, and\r\n+discover when it is too late that the only things one never regrets are\r\n+one's mistakes.\u0022\r\n+\r\n+A laugh ran round the table.\r\n+\r\n+He played with the idea and grew wilful; tossed it into the air and\r\n+transformed it; let it escape and recaptured it; made it iridescent\r\n+with fancy and winged it with paradox. The praise of folly, as he went\r\n+on, soared into a philosophy, and philosophy herself became young, and\r\n+catching the mad music of pleasure, wearing, one might fancy, her\r\n+wine-stained robe and wreath of ivy, danced like a Bacchante over the\r\n+hills of life, and mocked the slow Silenus for being sober. Facts fled\r\n+before her like frightened forest things. Her white feet trod the huge\r\n+press at which wise Omar sits, till the seething grape-juice rose round\r\n+her bare limbs in waves of purple bubbles, or crawled in red foam over\r\n+the vat's black, dripping, sloping sides. It was an extraordinary\r\n+improvisation. He felt that the eyes of Dorian Gray were fixed on him,\r\n+and the consciousness that amongst his audience there was one whose\r\n+temperament he wished to fascinate seemed to give his wit keenness and\r\n+to lend colour to his imagination. He was brilliant, fantastic,\r\n+irresponsible. He charmed his listeners out of themselves, and they\r\n+followed his pipe, laughing. Dorian Gray never took his gaze off him,\r\n+but sat like one under a spell, smiles chasing each other over his lips\r\n+and wonder growing grave in his darkening eyes.\r\n+\r\n+At last, liveried in the costume of the age, reality entered the room\r\n+in the shape of a servant to tell the duchess that her carriage was\r\n+waiting. She wrung her hands in mock despair. \u0022How annoying!\u0022 she\r\n+cried. \u0022I must go. I have to call for my husband at the club, to take\r\n+him to some absurd meeting at Willis's Rooms, where he is going to be\r\n+in the chair. If I am late he is sure to be furious, and I couldn't\r\n+have a scene in this bonnet. It is far too fragile. A harsh word\r\n+would ruin it. No, I must go, dear Agatha. Good-bye, Lord Henry, you\r\n+are quite delightful and dreadfully demoralizing. I am sure I don't\r\n+know what to say about your views. You must come and dine with us some\r\n+night. Tuesday? Are you disengaged Tuesday?\u0022\r\n+\r\n+\u0022For you I would throw over anybody, Duchess,\u0022 said Lord Henry with a\r\n+bow.\r\n+\r\n+\u0022Ah! that is very nice, and very wrong of you,\u0022 she cried; \u0022so mind you\r\n+come\u0022; and she swept out of the room, followed by Lady Agatha and the\r\n+other ladies.\r\n+\r\n+When Lord Henry had sat down again, Mr. Erskine moved round, and taking\r\n+a chair close to him, placed his hand upon his arm.\r\n+\r\n+\u0022You talk books away,\u0022 he said; \u0022why don't you write one?\u0022\r\n+\r\n+\u0022I am too fond of reading books to care to write them, Mr. Erskine. I\r\n+should like to write a novel certainly, a novel that would be as lovely\r\n+as a Persian carpet and as unreal. But there is no literary public in\r\n+England for anything except newspapers, primers, and encyclopaedias.\r\n+Of all people in the world the English have the least sense of the\r\n+beauty of literature.\u0022\r\n+\r\n+\u0022I fear you are right,\u0022 answered Mr. Erskine. \u0022I myself used to have\r\n+literary ambitions, but I gave them up long ago. And now, my dear\r\n+young friend, if you will allow me to call you so, may I ask if you\r\n+really meant all that you said to us at lunch?\u0022\r\n+\r\n+\u0022I quite forget what I said,\u0022 smiled Lord Henry. \u0022Was it all very bad?\u0022\r\n+\r\n+\u0022Very bad indeed. In fact I consider you extremely dangerous, and if\r\n+anything happens to our good duchess, we shall all look on you as being\r\n+primarily responsible. But I should like to talk to you about life.\r\n+The generation into which I was born was tedious. Some day, when you\r\n+are tired of London, come down to Treadley and expound to me your\r\n+philosophy of pleasure over some admirable Burgundy I am fortunate\r\n+enough to possess.\u0022\r\n+\r\n+\u0022I shall be charmed. A visit to Treadley would be a great privilege.\r\n+It has a perfect host, and a perfect library.\u0022\r\n+\r\n+\u0022You will complete it,\u0022 answered the old gentleman with a courteous\r\n+bow. \u0022And now I must bid good-bye to your excellent aunt. I am due at\r\n+the Athenaeum. It is the hour when we sleep there.\u0022\r\n+\r\n+\u0022All of you, Mr. Erskine?\u0022\r\n+\r\n+\u0022Forty of us, in forty arm-chairs. We are practising for an English\r\n+Academy of Letters.\u0022\r\n+\r\n+Lord Henry laughed and rose. \u0022I am going to the park,\u0022 he cried.\r\n+\r\n+As he was passing out of the door, Dorian Gray touched him on the arm.\r\n+\u0022Let me come with you,\u0022 he murmured.\r\n+\r\n+\u0022But I thought you had promised Basil Hallward to go and see him,\u0022\r\n+answered Lord Henry.\r\n+\r\n+\u0022I would sooner come with you; yes, I feel I must come with you. Do\r\n+let me. And you will promise to talk to me all the time? No one talks\r\n+so wonderfully as you do.\u0022\r\n+\r\n+\u0022Ah! I have talked quite enough for to-day,\u0022 said Lord Henry, smiling.\r\n+\u0022All I want now is to look at life. You may come and look at it with\r\n+me, if you care to.\u0022\r\n+\r\n+\r\n+\r\n+CHAPTER 4\r\n+\r\n+One afternoon, a month later, Dorian Gray was reclining in a luxurious\r\n+arm-chair, in the little library of Lord Henry's house in Mayfair. It\r\n+was, in its way, a very charming room, with its high panelled\r\n+wainscoting of olive-stained oak, its cream-coloured frieze and ceiling\r\n+of raised plasterwork, and its brickdust felt carpet strewn with silk,\r\n+long-fringed Persian rugs. On a tiny satinwood table stood a statuette\r\n+by Clodion, and beside it lay a copy of Les Cent Nouvelles, bound for\r\n+Margaret of Valois by Clovis Eve and powdered with the gilt daisies\r\n+that Queen had selected for her device. Some large blue china jars and\r\n+parrot-tulips were ranged on the mantelshelf, and through the small\r\n+leaded panes of the window streamed the apricot-coloured light of a\r\n+summer day in London.\r\n+\r\n+Lord Henry had not yet come in. He was always late on principle, his\r\n+principle being that punctuality is the thief of time. So the lad was\r\n+looking rather sulky, as with listless fingers he turned over the pages\r\n+of an elaborately illustrated edition of Manon Lescaut that he had\r\n+found in one of the book-cases. The formal monotonous ticking of the\r\n+Louis Quatorze clock annoyed him. Once or twice he thought of going\r\n+away.\r\n+\r\n+At last he heard a step outside, and the door opened. \u0022How late you\r\n+are, Harry!\u0022 he murmured.\r\n+\r\n+\u0022I am afraid it is not Harry, Mr. Gray,\u0022 answered a shrill voice.\r\n+\r\n+He glanced quickly round and rose to his feet. \u0022I beg your pardon. I\r\n+thought--\u0022\r\n+\r\n+\u0022You thought it was my husband. It is only his wife. You must let me\r\n+introduce myself. I know you quite well by your photographs. I think\r\n+my husband has got seventeen of them.\u0022\r\n+\r\n+\u0022Not seventeen, Lady Henry?\u0022\r\n+\r\n+\u0022Well, eighteen, then. And I saw you with him the other night at the\r\n+opera.\u0022 She laughed nervously as she spoke, and watched him with her\r\n+vague forget-me-not eyes. She was a curious woman, whose dresses\r\n+always looked as if they had been designed in a rage and put on in a\r\n+tempest. She was usually in love with somebody, and, as her passion\r\n+was never returned, she had kept all her illusions. She tried to look\r\n+picturesque, but only succeeded in being untidy. Her name was\r\n+Victoria, and she had a perfect mania for going to church.\r\n+\r\n+\u0022That was at Lohengrin, Lady Henry, I think?\u0022\r\n+\r\n+\u0022Yes; it was at dear Lohengrin. I like Wagner's music better than\r\n+anybody's. It is so loud that one can talk the whole time without other\r\n+people hearing what one says. That is a great advantage, don't you\r\n+think so, Mr. Gray?\u0022\r\n+\r\n+The same nervous staccato laugh broke from her thin lips, and her\r\n+fingers began to play with a long tortoise-shell paper-knife.\r\n+\r\n+Dorian smiled and shook his head: \u0022I am afraid I don't think so, Lady\r\n+Henry. I never talk during music--at least, during good music. If one\r\n+hears bad music, it is one's duty to drown it in conversation.\u0022\r\n+\r\n+\u0022Ah! that is one of Harry's views, isn't it, Mr. Gray? I always hear\r\n+Harry's views from his friends. It is the only way I get to know of\r\n+them. But you must not think I don't like good music. I adore it, but\r\n+I am afraid of it. It makes me too romantic. I have simply worshipped\r\n+pianists--two at a time, sometimes, Harry tells me. I don't know what\r\n+it is about them. Perhaps it is that they are foreigners. They all\r\n+are, ain't they? Even those that are born in England become foreigners\r\n+after a time, don't they? It is so clever of them, and such a\r\n+compliment to art. Makes it quite cosmopolitan, doesn't it? You have\r\n+never been to any of my parties, have you, Mr. Gray? You must come. I\r\n+can't afford orchids, but I spare no expense in foreigners. They make\r\n+one's rooms look so picturesque. But here is Harry! Harry, I came in\r\n+to look for you, to ask you something--I forget what it was--and I\r\n+found Mr. Gray here. We have had such a pleasant chat about music. We\r\n+have quite the same ideas. No; I think our ideas are quite different.\r\n+But he has been most pleasant. I am so glad I've seen him.\u0022\r\n+\r\n+\u0022I am charmed, my love, quite charmed,\u0022 said Lord Henry, elevating his\r\n+dark, crescent-shaped eyebrows and looking at them both with an amused\r\n+smile. \u0022So sorry I am late, Dorian. I went to look after a piece of\r\n+old brocade in Wardour Street and had to bargain for hours for it.\r\n+Nowadays people know the price of everything and the value of nothing.\u0022\r\n+\r\n+\u0022I am afraid I must be going,\u0022 exclaimed Lady Henry, breaking an\r\n+awkward silence with her silly sudden laugh. \u0022I have promised to drive\r\n+with the duchess. Good-bye, Mr. Gray. Good-bye, Harry. You are\r\n+dining out, I suppose? So am I. Perhaps I shall see you at Lady\r\n+Thornbury's.\u0022\r\n+\r\n+\u0022I dare say, my dear,\u0022 said Lord Henry, shutting the door behind her\r\n+as, looking like a bird of paradise that had been out all night in the\r\n+rain, she flitted out of the room, leaving a faint odour of\r\n+frangipanni. Then he lit a cigarette and flung himself down on the\r\n+sofa.\r\n+\r\n+\u0022Never marry a woman with straw-coloured hair, Dorian,\u0022 he said after a\r\n+few puffs.\r\n+\r\n+\u0022Why, Harry?\u0022\r\n+\r\n+\u0022Because they are so sentimental.\u0022\r\n+\r\n+\u0022But I like sentimental people.\u0022\r\n+\r\n+\u0022Never marry at all, Dorian. Men marry because they are tired; women,\r\n+because they are curious: both are disappointed.\u0022\r\n+\r\n+\u0022I don't think I am likely to marry, Harry. I am too much in love.\r\n+That is one of your aphorisms. I am putting it into practice, as I do\r\n+everything that you say.\u0022\r\n+\r\n+\u0022Who are you in love with?\u0022 asked Lord Henry after a pause.\r\n+\r\n+\u0022With an actress,\u0022 said Dorian Gray, blushing.\r\n+\r\n+Lord Henry shrugged his shoulders. \u0022That is a rather commonplace\r\n+_debut_.\u0022\r\n+\r\n+\u0022You would not say so if you saw her, Harry.\u0022\r\n+\r\n+\u0022Who is she?\u0022\r\n+\r\n+\u0022Her name is Sibyl Vane.\u0022\r\n+\r\n+\u0022Never heard of her.\u0022\r\n+\r\n+\u0022No one has. People will some day, however. She is a genius.\u0022\r\n+\r\n+\u0022My dear boy, no woman is a genius. Women are a decorative sex. They\r\n+never have anything to say, but they say it charmingly. Women\r\n+represent the triumph of matter over mind, just as men represent the\r\n+triumph of mind over morals.\u0022\r\n+\r\n+\u0022Harry, how can you?\u0022\r\n+\r\n+\u0022My dear Dorian, it is quite true. I am analysing women at present, so\r\n+I ought to know. The subject is not so abstruse as I thought it was.\r\n+I find that, ultimately, there are only two kinds of women, the plain\r\n+and the coloured. The plain women are very useful. If you want to\r\n+gain a reputation for respectability, you have merely to take them down\r\n+to supper. The other women are very charming. They commit one\r\n+mistake, however. They paint in order to try and look young. Our\r\n+grandmothers painted in order to try and talk brilliantly. _Rouge_ and\r\n+_esprit_ used to go together. That is all over now. As long as a woman\r\n+can look ten years younger than her own daughter, she is perfectly\r\n+satisfied. As for conversation, there are only five women in London\r\n+worth talking to, and two of these can't be admitted into decent\r\n+society. However, tell me about your genius. How long have you known\r\n+her?\u0022\r\n+\r\n+\u0022Ah! Harry, your views terrify me.\u0022\r\n+\r\n+\u0022Never mind that. How long have you known her?\u0022\r\n+\r\n+\u0022About three weeks.\u0022\r\n+\r\n+\u0022And where did you come across her?\u0022\r\n+\r\n+\u0022I will tell you, Harry, but you mustn't be unsympathetic about it.\r\n+After all, it never would have happened if I had not met you. You\r\n+filled me with a wild desire to know everything about life. For days\r\n+after I met you, something seemed to throb in my veins. As I lounged\r\n+in the park, or strolled down Piccadilly, I used to look at every one\r\n+who passed me and wonder, with a mad curiosity, what sort of lives they\r\n+led. Some of them fascinated me. Others filled me with terror. There\r\n+was an exquisite poison in the air. I had a passion for sensations....\r\n+Well, one evening about seven o'clock, I determined to go out in search\r\n+of some adventure. I felt that this grey monstrous London of ours,\r\n+with its myriads of people, its sordid sinners, and its splendid sins,\r\n+as you once phrased it, must have something in store for me. I fancied\r\n+a thousand things. The mere danger gave me a sense of delight. I\r\n+remembered what you had said to me on that wonderful evening when we\r\n+first dined together, about the search for beauty being the real secret\r\n+of life. I don't know what I expected, but I went out and wandered\r\n+eastward, soon losing my way in a labyrinth of grimy streets and black\r\n+grassless squares. About half-past eight I passed by an absurd little\r\n+theatre, with great flaring gas-jets and gaudy play-bills. A hideous\r\n+Jew, in the most amazing waistcoat I ever beheld in my life, was\r\n+standing at the entrance, smoking a vile cigar. He had greasy\r\n+ringlets, and an enormous diamond blazed in the centre of a soiled\r\n+shirt. 'Have a box, my Lord?' he said, when he saw me, and he took off\r\n+his hat with an air of gorgeous servility. There was something about\r\n+him, Harry, that amused me. He was such a monster. You will laugh at\r\n+me, I know, but I really went in and paid a whole guinea for the\r\n+stage-box. To the present day I can't make out why I did so; and yet if\r\n+I hadn't--my dear Harry, if I hadn't--I should have missed the greatest\r\n+romance of my life. I see you are laughing. It is horrid of you!\u0022\r\n+\r\n+\u0022I am not laughing, Dorian; at least I am not laughing at you. But you\r\n+should not say the greatest romance of your life. You should say the\r\n+first romance of your life. You will always be loved, and you will\r\n+always be in love with love. A _grande passion_ is the privilege of\r\n+people who have nothing to do. That is the one use of the idle classes\r\n+of a country. Don't be afraid. There are exquisite things in store\r\n+for you. This is merely the beginning.\u0022\r\n+\r\n+\u0022Do you think my nature so shallow?\u0022 cried Dorian Gray angrily.\r\n+\r\n+\u0022No; I think your nature so deep.\u0022\r\n+\r\n+\u0022How do you mean?\u0022\r\n+\r\n+\u0022My dear boy, the people who love only once in their lives are really\r\n+the shallow people. What they call their loyalty, and their fidelity,\r\n+I call either the lethargy of custom or their lack of imagination.\r\n+Faithfulness is to the emotional life what consistency is to the life\r\n+of the intellect--simply a confession of failure. Faithfulness! I\r\n+must analyse it some day. The passion for property is in it. There\r\n+are many things that we would throw away if we were not afraid that\r\n+others might pick them up. But I don't want to interrupt you. Go on\r\n+with your story.\u0022\r\n+\r\n+\u0022Well, I found myself seated in a horrid little private box, with a\r\n+vulgar drop-scene staring me in the face. I looked out from behind the\r\n+curtain and surveyed the house. It was a tawdry affair, all Cupids and\r\n+cornucopias, like a third-rate wedding-cake. The gallery and pit were\r\n+fairly full, but the two rows of dingy stalls were quite empty, and\r\n+there was hardly a person in what I suppose they called the\r\n+dress-circle. Women went about with oranges and ginger-beer, and there\r\n+was a terrible consumption of nuts going on.\u0022\r\n+\r\n+\u0022It must have been just like the palmy days of the British drama.\u0022\r\n+\r\n+\u0022Just like, I should fancy, and very depressing. I began to wonder\r\n+what on earth I should do when I caught sight of the play-bill. What\r\n+do you think the play was, Harry?\u0022\r\n+\r\n+\u0022I should think 'The Idiot Boy', or 'Dumb but Innocent'. Our fathers\r\n+used to like that sort of piece, I believe. The longer I live, Dorian,\r\n+the more keenly I feel that whatever was good enough for our fathers is\r\n+not good enough for us. In art, as in politics, _les grandperes ont\r\n+toujours tort_.\u0022\r\n+\r\n+\u0022This play was good enough for us, Harry. It was Romeo and Juliet. I\r\n+must admit that I was rather annoyed at the idea of seeing Shakespeare\r\n+done in such a wretched hole of a place. Still, I felt interested, in\r\n+a sort of way. At any rate, I determined to wait for the first act.\r\n+There was a dreadful orchestra, presided over by a young Hebrew who sat\r\n+at a cracked piano, that nearly drove me away, but at last the\r\n+drop-scene was drawn up and the play began. Romeo was a stout elderly\r\n+gentleman, with corked eyebrows, a husky tragedy voice, and a figure\r\n+like a beer-barrel. Mercutio was almost as bad. He was played by the\r\n+low-comedian, who had introduced gags of his own and was on most\r\n+friendly terms with the pit. They were both as grotesque as the\r\n+scenery, and that looked as if it had come out of a country-booth. But\r\n+Juliet! Harry, imagine a girl, hardly seventeen years of age, with a\r\n+little, flowerlike face, a small Greek head with plaited coils of\r\n+dark-brown hair, eyes that were violet wells of passion, lips that were\r\n+like the petals of a rose. She was the loveliest thing I had ever seen\r\n+in my life. You said to me once that pathos left you unmoved, but that\r\n+beauty, mere beauty, could fill your eyes with tears. I tell you,\r\n+Harry, I could hardly see this girl for the mist of tears that came\r\n+across me. And her voice--I never heard such a voice. It was very low\r\n+at first, with deep mellow notes that seemed to fall singly upon one's\r\n+ear. Then it became a little louder, and sounded like a flute or a\r\n+distant hautboy. In the garden-scene it had all the tremulous ecstasy\r\n+that one hears just before dawn when nightingales are singing. There\r\n+were moments, later on, when it had the wild passion of violins. You\r\n+know how a voice can stir one. Your voice and the voice of Sibyl Vane\r\n+are two things that I shall never forget. When I close my eyes, I hear\r\n+them, and each of them says something different. I don't know which to\r\n+follow. Why should I not love her? Harry, I do love her. She is\r\n+everything to me in life. Night after night I go to see her play. One\r\n+evening she is Rosalind, and the next evening she is Imogen. I have\r\n+seen her die in the gloom of an Italian tomb, sucking the poison from\r\n+her lover's lips. I have watched her wandering through the forest of\r\n+Arden, disguised as a pretty boy in hose and doublet and dainty cap.\r\n+She has been mad, and has come into the presence of a guilty king, and\r\n+given him rue to wear and bitter herbs to taste of. She has been\r\n+innocent, and the black hands of jealousy have crushed her reedlike\r\n+throat. I have seen her in every age and in every costume. Ordinary\r\n+women never appeal to one's imagination. They are limited to their\r\n+century. No glamour ever transfigures them. One knows their minds as\r\n+easily as one knows their bonnets. One can always find them. There is\r\n+no mystery in any of them. They ride in the park in the morning and\r\n+chatter at tea-parties in the afternoon. They have their stereotyped\r\n+smile and their fashionable manner. They are quite obvious. But an\r\n+actress! How different an actress is! Harry! why didn't you tell me\r\n+that the only thing worth loving is an actress?\u0022\r\n+\r\n+\u0022Because I have loved so many of them, Dorian.\u0022\r\n+\r\n+\u0022Oh, yes, horrid people with dyed hair and painted faces.\u0022\r\n+\r\n+\u0022Don't run down dyed hair and painted faces. There is an extraordinary\r\n+charm in them, sometimes,\u0022 said Lord Henry.\r\n+\r\n+\u0022I wish now I had not told you about Sibyl Vane.\u0022\r\n+\r\n+\u0022You could not have helped telling me, Dorian. All through your life\r\n+you will tell me everything you do.\u0022\r\n+\r\n+\u0022Yes, Harry, I believe that is true. I cannot help telling you things.\r\n+You have a curious influence over me. If I ever did a crime, I would\r\n+come and confess it to you. You would understand me.\u0022\r\n+\r\n+\u0022People like you--the wilful sunbeams of life--don't commit crimes,\r\n+Dorian. But I am much obliged for the compliment, all the same. And\r\n+now tell me--reach me the matches, like a good boy--thanks--what are\r\n+your actual relations with Sibyl Vane?\u0022\r\n+\r\n+Dorian Gray leaped to his feet, with flushed cheeks and burning eyes.\r\n+\u0022Harry! Sibyl Vane is sacred!\u0022\r\n+\r\n+\u0022It is only the sacred things that are worth touching, Dorian,\u0022 said\r\n+Lord Henry, with a strange touch of pathos in his voice. \u0022But why\r\n+should you be annoyed? I suppose she will belong to you some day.\r\n+When one is in love, one always begins by deceiving one's self, and one\r\n+always ends by deceiving others. That is what the world calls a\r\n+romance. You know her, at any rate, I suppose?\u0022\r\n+\r\n+\u0022Of course I know her. On the first night I was at the theatre, the\r\n+horrid old Jew came round to the box after the performance was over and\r\n+offered to take me behind the scenes and introduce me to her. I was\r\n+furious with him, and told him that Juliet had been dead for hundreds\r\n+of years and that her body was lying in a marble tomb in Verona. I\r\n+think, from his blank look of amazement, that he was under the\r\n+impression that I had taken too much champagne, or something.\u0022\r\n+\r\n+\u0022I am not surprised.\u0022\r\n+\r\n+\u0022Then he asked me if I wrote for any of the newspapers. I told him I\r\n+never even read them. He seemed terribly disappointed at that, and\r\n+confided to me that all the dramatic critics were in a conspiracy\r\n+against him, and that they were every one of them to be bought.\u0022\r\n+\r\n+\u0022I should not wonder if he was quite right there. But, on the other\r\n+hand, judging from their appearance, most of them cannot be at all\r\n+expensive.\u0022\r\n+\r\n+\u0022Well, he seemed to think they were beyond his means,\u0022 laughed Dorian.\r\n+\u0022By this time, however, the lights were being put out in the theatre,\r\n+and I had to go. He wanted me to try some cigars that he strongly\r\n+recommended. I declined. The next night, of course, I arrived at the\r\n+place again. When he saw me, he made me a low bow and assured me that\r\n+I was a munificent patron of art. He was a most offensive brute,\r\n+though he had an extraordinary passion for Shakespeare. He told me\r\n+once, with an air of pride, that his five bankruptcies were entirely\r\n+due to 'The Bard,' as he insisted on calling him. He seemed to think\r\n+it a distinction.\u0022\r\n+\r\n+\u0022It was a distinction, my dear Dorian--a great distinction. Most\r\n+people become bankrupt through having invested too heavily in the prose\r\n+of life. To have ruined one's self over poetry is an honour. But when\r\n+did you first speak to Miss Sibyl Vane?\u0022\r\n+\r\n+\u0022The third night. She had been playing Rosalind. I could not help\r\n+going round. I had thrown her some flowers, and she had looked at\r\n+me--at least I fancied that she had. The old Jew was persistent. He\r\n+seemed determined to take me behind, so I consented. It was curious my\r\n+not wanting to know her, wasn't it?\u0022\r\n+\r\n+\u0022No; I don't think so.\u0022\r\n+\r\n+\u0022My dear Harry, why?\u0022\r\n+\r\n+\u0022I will tell you some other time. Now I want to know about the girl.\u0022\r\n+\r\n+\u0022Sibyl? Oh, she was so shy and so gentle. There is something of a\r\n+child about her. Her eyes opened wide in exquisite wonder when I told\r\n+her what I thought of her performance, and she seemed quite unconscious\r\n+of her power. I think we were both rather nervous. The old Jew stood\r\n+grinning at the doorway of the dusty greenroom, making elaborate\r\n+speeches about us both, while we stood looking at each other like\r\n+children. He would insist on calling me 'My Lord,' so I had to assure\r\n+Sibyl that I was not anything of the kind. She said quite simply to\r\n+me, 'You look more like a prince. I must call you Prince Charming.'\u0022\r\n+\r\n+\u0022Upon my word, Dorian, Miss Sibyl knows how to pay compliments.\u0022\r\n+\r\n+\u0022You don't understand her, Harry. She regarded me merely as a person\r\n+in a play. She knows nothing of life. She lives with her mother, a\r\n+faded tired woman who played Lady Capulet in a sort of magenta\r\n+dressing-wrapper on the first night, and looks as if she had seen\r\n+better days.\u0022\r\n+\r\n+\u0022I know that look. It depresses me,\u0022 murmured Lord Henry, examining\r\n+his rings.\r\n+\r\n+\u0022The Jew wanted to tell me her history, but I said it did not interest\r\n+me.\u0022\r\n+\r\n+\u0022You were quite right. There is always something infinitely mean about\r\n+other people's tragedies.\u0022\r\n+\r\n+\u0022Sibyl is the only thing I care about. What is it to me where she came\r\n+from? From her little head to her little feet, she is absolutely and\r\n+entirely divine. Every night of my life I go to see her act, and every\r\n+night she is more marvellous.\u0022\r\n+\r\n+\u0022That is the reason, I suppose, that you never dine with me now. I\r\n+thought you must have some curious romance on hand. You have; but it\r\n+is not quite what I expected.\u0022\r\n+\r\n+\u0022My dear Harry, we either lunch or sup together every day, and I have\r\n+been to the opera with you several times,\u0022 said Dorian, opening his\r\n+blue eyes in wonder.\r\n+\r\n+\u0022You always come dreadfully late.\u0022\r\n+\r\n+\u0022Well, I can't help going to see Sibyl play,\u0022 he cried, \u0022even if it is\r\n+only for a single act. I get hungry for her presence; and when I think\r\n+of the wonderful soul that is hidden away in that little ivory body, I\r\n+am filled with awe.\u0022\r\n+\r\n+\u0022You can dine with me to-night, Dorian, can't you?\u0022\r\n+\r\n+He shook his head. \u0022To-night she is Imogen,\u0022 he answered, \u0022and\r\n+to-morrow night she will be Juliet.\u0022\r\n+\r\n+\u0022When is she Sibyl Vane?\u0022\r\n+\r\n+\u0022Never.\u0022\r\n+\r\n+\u0022I congratulate you.\u0022\r\n+\r\n+\u0022How horrid you are! She is all the great heroines of the world in\r\n+one. She is more than an individual. You laugh, but I tell you she\r\n+has genius. I love her, and I must make her love me. You, who know\r\n+all the secrets of life, tell me how to charm Sibyl Vane to love me! I\r\n+want to make Romeo jealous. I want the dead lovers of the world to\r\n+hear our laughter and grow sad. I want a breath of our passion to stir\r\n+their dust into consciousness, to wake their ashes into pain. My God,\r\n+Harry, how I worship her!\u0022 He was walking up and down the room as he\r\n+spoke. Hectic spots of red burned on his cheeks. He was terribly\r\n+excited.\r\n+\r\n+Lord Henry watched him with a subtle sense of pleasure. How different\r\n+he was now from the shy frightened boy he had met in Basil Hallward's\r\n+studio! His nature had developed like a flower, had borne blossoms of\r\n+scarlet flame. Out of its secret hiding-place had crept his soul, and\r\n+desire had come to meet it on the way.\r\n+\r\n+\u0022And what do you propose to do?\u0022 said Lord Henry at last.\r\n+\r\n+\u0022I want you and Basil to come with me some night and see her act. I\r\n+have not the slightest fear of the result. You are certain to\r\n+acknowledge her genius. Then we must get her out of the Jew's hands.\r\n+She is bound to him for three years--at least for two years and eight\r\n+months--from the present time. I shall have to pay him something, of\r\n+course. When all that is settled, I shall take a West End theatre and\r\n+bring her out properly. She will make the world as mad as she has made\r\n+me.\u0022\r\n+\r\n+\u0022That would be impossible, my dear boy.\u0022\r\n+\r\n+\u0022Yes, she will. She has not merely art, consummate art-instinct, in\r\n+her, but she has personality also; and you have often told me that it\r\n+is personalities, not principles, that move the age.\u0022\r\n+\r\n+\u0022Well, what night shall we go?\u0022\r\n+\r\n+\u0022Let me see. To-day is Tuesday. Let us fix to-morrow. She plays\r\n+Juliet to-morrow.\u0022\r\n+\r\n+\u0022All right. The Bristol at eight o'clock; and I will get Basil.\u0022\r\n+\r\n+\u0022Not eight, Harry, please. Half-past six. We must be there before the\r\n+curtain rises. You must see her in the first act, where she meets\r\n+Romeo.\u0022\r\n+\r\n+\u0022Half-past six! What an hour! It will be like having a meat-tea, or\r\n+reading an English novel. It must be seven. No gentleman dines before\r\n+seven. Shall you see Basil between this and then? Or shall I write to\r\n+him?\u0022\r\n+\r\n+\u0022Dear Basil! I have not laid eyes on him for a week. It is rather\r\n+horrid of me, as he has sent me my portrait in the most wonderful\r\n+frame, specially designed by himself, and, though I am a little jealous\r\n+of the picture for being a whole month younger than I am, I must admit\r\n+that I delight in it. Perhaps you had better write to him. I don't\r\n+want to see him alone. He says things that annoy me. He gives me good\r\n+advice.\u0022\r\n+\r\n+Lord Henry smiled. \u0022People are very fond of giving away what they need\r\n+most themselves. It is what I call the depth of generosity.\u0022\r\n+\r\n+\u0022Oh, Basil is the best of fellows, but he seems to me to be just a bit\r\n+of a Philistine. Since I have known you, Harry, I have discovered\r\n+that.\u0022\r\n+\r\n+\u0022Basil, my dear boy, puts everything that is charming in him into his\r\n+work. The consequence is that he has nothing left for life but his\r\n+prejudices, his principles, and his common sense. The only artists I\r\n+have ever known who are personally delightful are bad artists. Good\r\n+artists exist simply in what they make, and consequently are perfectly\r\n+uninteresting in what they are. A great poet, a really great poet, is\r\n+the most unpoetical of all creatures. But inferior poets are\r\n+absolutely fascinating. The worse their rhymes are, the more\r\n+picturesque they look. The mere fact of having published a book of\r\n+second-rate sonnets makes a man quite irresistible. He lives the\r\n+poetry that he cannot write. The others write the poetry that they\r\n+dare not realize.\u0022\r\n+\r\n+\u0022I wonder is that really so, Harry?\u0022 said Dorian Gray, putting some\r\n+perfume on his handkerchief out of a large, gold-topped bottle that\r\n+stood on the table. \u0022It must be, if you say it. And now I am off.\r\n+Imogen is waiting for me. Don't forget about to-morrow. Good-bye.\u0022\r\n+\r\n+As he left the room, Lord Henry's heavy eyelids drooped, and he began\r\n+to think. Certainly few people had ever interested him so much as\r\n+Dorian Gray, and yet the lad's mad adoration of some one else caused\r\n+him not the slightest pang of annoyance or jealousy. He was pleased by\r\n+it. It made him a more interesting study. He had been always\r\n+enthralled by the methods of natural science, but the ordinary\r\n+subject-matter of that science had seemed to him trivial and of no\r\n+import. And so he had begun by vivisecting himself, as he had ended by\r\n+vivisecting others. Human life--that appeared to him the one thing\r\n+worth investigating. Compared to it there was nothing else of any\r\n+value. It was true that as one watched life in its curious crucible of\r\n+pain and pleasure, one could not wear over one's face a mask of glass,\r\n+nor keep the sulphurous fumes from troubling the brain and making the\r\n+imagination turbid with monstrous fancies and misshapen dreams. There\r\n+were poisons so subtle that to know their properties one had to sicken\r\n+of them. There were maladies so strange that one had to pass through\r\n+them if one sought to understand their nature. And, yet, what a great\r\n+reward one received! How wonderful the whole world became to one! To\r\n+note the curious hard logic of passion, and the emotional coloured life\r\n+of the intellect--to observe where they met, and where they separated,\r\n+at what point they were in unison, and at what point they were at\r\n+discord--there was a delight in that! What matter what the cost was?\r\n+One could never pay too high a price for any sensation.\r\n+\r\n+He was conscious--and the thought brought a gleam of pleasure into his\r\n+brown agate eyes--that it was through certain words of his, musical\r\n+words said with musical utterance, that Dorian Gray's soul had turned\r\n+to this white girl and bowed in worship before her. To a large extent\r\n+the lad was his own creation. He had made him premature. That was\r\n+something. Ordinary people waited till life disclosed to them its\r\n+secrets, but to the few, to the elect, the mysteries of life were\r\n+revealed before the veil was drawn away. Sometimes this was the effect\r\n+of art, and chiefly of the art of literature, which dealt immediately\r\n+with the passions and the intellect. But now and then a complex\r\n+personality took the place and assumed the office of art, was indeed,\r\n+in its way, a real work of art, life having its elaborate masterpieces,\r\n+just as poetry has, or sculpture, or painting.\r\n+\r\n+Yes, the lad was premature. He was gathering his harvest while it was\r\n+yet spring. The pulse and passion of youth were in him, but he was\r\n+becoming self-conscious. It was delightful to watch him. With his\r\n+beautiful face, and his beautiful soul, he was a thing to wonder at.\r\n+It was no matter how it all ended, or was destined to end. He was like\r\n+one of those gracious figures in a pageant or a play, whose joys seem\r\n+to be remote from one, but whose sorrows stir one's sense of beauty,\r\n+and whose wounds are like red roses.\r\n+\r\n+Soul and body, body and soul--how mysterious they were! There was\r\n+animalism in the soul, and the body had its moments of spirituality.\r\n+The senses could refine, and the intellect could degrade. Who could\r\n+say where the fleshly impulse ceased, or the psychical impulse began?\r\n+How shallow were the arbitrary definitions of ordinary psychologists!\r\n+And yet how difficult to decide between the claims of the various\r\n+schools! Was the soul a shadow seated in the house of sin? Or was the\r\n+body really in the soul, as Giordano Bruno thought? The separation of\r\n+spirit from matter was a mystery, and the union of spirit with matter\r\n+was a mystery also.\r\n+\r\n+He began to wonder whether we could ever make psychology so absolute a\r\n+science that each little spring of life would be revealed to us. As it\r\n+was, we always misunderstood ourselves and rarely understood others.\r\n+Experience was of no ethical value. It was merely the name men gave to\r\n+their mistakes. Moralists had, as a rule, regarded it as a mode of\r\n+warning, had claimed for it a certain ethical efficacy in the formation\r\n+of character, had praised it as something that taught us what to follow\r\n+and showed us what to avoid. But there was no motive power in\r\n+experience. It was as little of an active cause as conscience itself.\r\n+All that it really demonstrated was that our future would be the same\r\n+as our past, and that the sin we had done once, and with loathing, we\r\n+would do many times, and with joy.\r\n+\r\n+It was clear to him that the experimental method was the only method by\r\n+which one could arrive at any scientific analysis of the passions; and\r\n+certainly Dorian Gray was a subject made to his hand, and seemed to\r\n+promise rich and fruitful results. His sudden mad love for Sibyl Vane\r\n+was a psychological phenomenon of no small interest. There was no\r\n+doubt that curiosity had much to do with it, curiosity and the desire\r\n+for new experiences, yet it was not a simple, but rather a very complex\r\n+passion. What there was in it of the purely sensuous instinct of\r\n+boyhood had been transformed by the workings of the imagination,\r\n+changed into something that seemed to the lad himself to be remote from\r\n+sense, and was for that very reason all the more dangerous. It was the\r\n+passions about whose origin we deceived ourselves that tyrannized most\r\n+strongly over us. Our weakest motives were those of whose nature we\r\n+were conscious. It often happened that when we thought we were\r\n+experimenting on others we were really experimenting on ourselves.\r\n+\r\n+While Lord Henry sat dreaming on these things, a knock came to the\r\n+door, and his valet entered and reminded him it was time to dress for\r\n+dinner. He got up and looked out into the street. The sunset had\r\n+smitten into scarlet gold the upper windows of the houses opposite.\r\n+The panes glowed like plates of heated metal. The sky above was like a\r\n+faded rose. He thought of his friend's young fiery-coloured life and\r\n+wondered how it was all going to end.\r\n+\r\n+When he arrived home, about half-past twelve o'clock, he saw a telegram\r\n+lying on the hall table. He opened it and found it was from Dorian\r\n+Gray. It was to tell him that he was engaged to be married to Sibyl\r\n+Vane.\r\n+\r\n+\r\n+\r\n+CHAPTER 5\r\n+\r\n+\u0022Mother, Mother, I am so happy!\u0022 whispered the girl, burying her face\r\n+in the lap of the faded, tired-looking woman who, with back turned to\r\n+the shrill intrusive light, was sitting in the one arm-chair that their\r\n+dingy sitting-room contained. \u0022I am so happy!\u0022 she repeated, \u0022and you\r\n+must be happy, too!\u0022\r\n+\r\n+Mrs. Vane winced and put her thin, bismuth-whitened hands on her\r\n+daughter's head. \u0022Happy!\u0022 she echoed, \u0022I am only happy, Sibyl, when I\r\n+see you act. You must not think of anything but your acting. Mr.\r\n+Isaacs has been very good to us, and we owe him money.\u0022\r\n+\r\n+The girl looked up and pouted. \u0022Money, Mother?\u0022 she cried, \u0022what does\r\n+money matter? Love is more than money.\u0022\r\n+\r\n+\u0022Mr. Isaacs has advanced us fifty pounds to pay off our debts and to\r\n+get a proper outfit for James. You must not forget that, Sibyl. Fifty\r\n+pounds is a very large sum. Mr. Isaacs has been most considerate.\u0022\r\n+\r\n+\u0022He is not a gentleman, Mother, and I hate the way he talks to me,\u0022\r\n+said the girl, rising to her feet and going over to the window.\r\n+\r\n+\u0022I don't know how we could manage without him,\u0022 answered the elder\r\n+woman querulously.\r\n+\r\n+Sibyl Vane tossed her head and laughed. \u0022We don't want him any more,\r\n+Mother. Prince Charming rules life for us now.\u0022 Then she paused. A\r\n+rose shook in her blood and shadowed her cheeks. Quick breath parted\r\n+the petals of her lips. They trembled. Some southern wind of passion\r\n+swept over her and stirred the dainty folds of her dress. \u0022I love\r\n+him,\u0022 she said simply.\r\n+\r\n+\u0022Foolish child! foolish child!\u0022 was the parrot-phrase flung in answer.\r\n+The waving of crooked, false-jewelled fingers gave grotesqueness to the\r\n+words.\r\n+\r\n+The girl laughed again. The joy of a caged bird was in her voice. Her\r\n+eyes caught the melody and echoed it in radiance, then closed for a\r\n+moment, as though to hide their secret. When they opened, the mist of\r\n+a dream had passed across them.\r\n+\r\n+Thin-lipped wisdom spoke at her from the worn chair, hinted at\r\n+prudence, quoted from that book of cowardice whose author apes the name\r\n+of common sense. She did not listen. She was free in her prison of\r\n+passion. Her prince, Prince Charming, was with her. She had called on\r\n+memory to remake him. She had sent her soul to search for him, and it\r\n+had brought him back. His kiss burned again upon her mouth. Her\r\n+eyelids were warm with his breath.\r\n+\r\n+Then wisdom altered its method and spoke of espial and discovery. This\r\n+young man might be rich. If so, marriage should be thought of.\r\n+Against the shell of her ear broke the waves of worldly cunning. The\r\n+arrows of craft shot by her. She saw the thin lips moving, and smiled.\r\n+\r\n+Suddenly she felt the need to speak. The wordy silence troubled her.\r\n+\u0022Mother, Mother,\u0022 she cried, \u0022why does he love me so much? I know why\r\n+I love him. I love him because he is like what love himself should be.\r\n+But what does he see in me? I am not worthy of him. And yet--why, I\r\n+cannot tell--though I feel so much beneath him, I don't feel humble. I\r\n+feel proud, terribly proud. Mother, did you love my father as I love\r\n+Prince Charming?\u0022\r\n+\r\n+The elder woman grew pale beneath the coarse powder that daubed her\r\n+cheeks, and her dry lips twitched with a spasm of pain. Sybil rushed\r\n+to her, flung her arms round her neck, and kissed her. \u0022Forgive me,\r\n+Mother. I know it pains you to talk about our father. But it only\r\n+pains you because you loved him so much. Don't look so sad. I am as\r\n+happy to-day as you were twenty years ago. Ah! let me be happy for\r\n+ever!\u0022\r\n+\r\n+\u0022My child, you are far too young to think of falling in love. Besides,\r\n+what do you know of this young man? You don't even know his name. The\r\n+whole thing is most inconvenient, and really, when James is going away\r\n+to Australia, and I have so much to think of, I must say that you\r\n+should have shown more consideration. However, as I said before, if he\r\n+is rich ...\u0022\r\n+\r\n+\u0022Ah! Mother, Mother, let me be happy!\u0022\r\n+\r\n+Mrs. Vane glanced at her, and with one of those false theatrical\r\n+gestures that so often become a mode of second nature to a\r\n+stage-player, clasped her in her arms. At this moment, the door opened\r\n+and a young lad with rough brown hair came into the room. He was\r\n+thick-set of figure, and his hands and feet were large and somewhat\r\n+clumsy in movement. He was not so finely bred as his sister. One\r\n+would hardly have guessed the close relationship that existed between\r\n+them. Mrs. Vane fixed her eyes on him and intensified her smile. She\r\n+mentally elevated her son to the dignity of an audience. She felt sure\r\n+that the _tableau_ was interesting.\r\n+\r\n+\u0022You might keep some of your kisses for me, Sibyl, I think,\u0022 said the\r\n+lad with a good-natured grumble.\r\n+\r\n+\u0022Ah! but you don't like being kissed, Jim,\u0022 she cried. \u0022You are a\r\n+dreadful old bear.\u0022 And she ran across the room and hugged him.\r\n+\r\n+James Vane looked into his sister's face with tenderness. \u0022I want you\r\n+to come out with me for a walk, Sibyl. I don't suppose I shall ever\r\n+see this horrid London again. I am sure I don't want to.\u0022\r\n+\r\n+\u0022My son, don't say such dreadful things,\u0022 murmured Mrs. Vane, taking up\r\n+a tawdry theatrical dress, with a sigh, and beginning to patch it. She\r\n+felt a little disappointed that he had not joined the group. It would\r\n+have increased the theatrical picturesqueness of the situation.\r\n+\r\n+\u0022Why not, Mother? I mean it.\u0022\r\n+\r\n+\u0022You pain me, my son. I trust you will return from Australia in a\r\n+position of affluence. I believe there is no society of any kind in\r\n+the Colonies--nothing that I would call society--so when you have made\r\n+your fortune, you must come back and assert yourself in London.\u0022\r\n+\r\n+\u0022Society!\u0022 muttered the lad. \u0022I don't want to know anything about\r\n+that. I should like to make some money to take you and Sibyl off the\r\n+stage. I hate it.\u0022\r\n+\r\n+\u0022Oh, Jim!\u0022 said Sibyl, laughing, \u0022how unkind of you! But are you\r\n+really going for a walk with me? That will be nice! I was afraid you\r\n+were going to say good-bye to some of your friends--to Tom Hardy, who\r\n+gave you that hideous pipe, or Ned Langton, who makes fun of you for\r\n+smoking it. It is very sweet of you to let me have your last\r\n+afternoon. Where shall we go? Let us go to the park.\u0022\r\n+\r\n+\u0022I am too shabby,\u0022 he answered, frowning. \u0022Only swell people go to the\r\n+park.\u0022\r\n+\r\n+\u0022Nonsense, Jim,\u0022 she whispered, stroking the sleeve of his coat.\r\n+\r\n+He hesitated for a moment. \u0022Very well,\u0022 he said at last, \u0022but don't be\r\n+too long dressing.\u0022 She danced out of the door. One could hear her\r\n+singing as she ran upstairs. Her little feet pattered overhead.\r\n+\r\n+He walked up and down the room two or three times. Then he turned to\r\n+the still figure in the chair. \u0022Mother, are my things ready?\u0022 he asked.\r\n+\r\n+\u0022Quite ready, James,\u0022 she answered, keeping her eyes on her work. For\r\n+some months past she had felt ill at ease when she was alone with this\r\n+rough stern son of hers. Her shallow secret nature was troubled when\r\n+their eyes met. She used to wonder if he suspected anything. The\r\n+silence, for he made no other observation, became intolerable to her.\r\n+She began to complain. Women defend themselves by attacking, just as\r\n+they attack by sudden and strange surrenders. \u0022I hope you will be\r\n+contented, James, with your sea-faring life,\u0022 she said. \u0022You must\r\n+remember that it is your own choice. You might have entered a\r\n+solicitor's office. Solicitors are a very respectable class, and in\r\n+the country often dine with the best families.\u0022\r\n+\r\n+\u0022I hate offices, and I hate clerks,\u0022 he replied. \u0022But you are quite\r\n+right. I have chosen my own life. All I say is, watch over Sibyl.\r\n+Don't let her come to any harm. Mother, you must watch over her.\u0022\r\n+\r\n+\u0022James, you really talk very strangely. Of course I watch over Sibyl.\u0022\r\n+\r\n+\u0022I hear a gentleman comes every night to the theatre and goes behind to\r\n+talk to her. Is that right? What about that?\u0022\r\n+\r\n+\u0022You are speaking about things you don't understand, James. In the\r\n+profession we are accustomed to receive a great deal of most gratifying\r\n+attention. I myself used to receive many bouquets at one time. That\r\n+was when acting was really understood. As for Sibyl, I do not know at\r\n+present whether her attachment is serious or not. But there is no\r\n+doubt that the young man in question is a perfect gentleman. He is\r\n+always most polite to me. Besides, he has the appearance of being\r\n+rich, and the flowers he sends are lovely.\u0022\r\n+\r\n+\u0022You don't know his name, though,\u0022 said the lad harshly.\r\n+\r\n+\u0022No,\u0022 answered his mother with a placid expression in her face. \u0022He\r\n+has not yet revealed his real name. I think it is quite romantic of\r\n+him. He is probably a member of the aristocracy.\u0022\r\n+\r\n+James Vane bit his lip. \u0022Watch over Sibyl, Mother,\u0022 he cried, \u0022watch\r\n+over her.\u0022\r\n+\r\n+\u0022My son, you distress me very much. Sibyl is always under my special\r\n+care. Of course, if this gentleman is wealthy, there is no reason why\r\n+she should not contract an alliance with him. I trust he is one of the\r\n+aristocracy. He has all the appearance of it, I must say. It might be\r\n+a most brilliant marriage for Sibyl. They would make a charming\r\n+couple. His good looks are really quite remarkable; everybody notices\r\n+them.\u0022\r\n+\r\n+The lad muttered something to himself and drummed on the window-pane\r\n+with his coarse fingers. He had just turned round to say something\r\n+when the door opened and Sibyl ran in.\r\n+\r\n+\u0022How serious you both are!\u0022 she cried. \u0022What is the matter?\u0022\r\n+\r\n+\u0022Nothing,\u0022 he answered. \u0022I suppose one must be serious sometimes.\r\n+Good-bye, Mother; I will have my dinner at five o'clock. Everything is\r\n+packed, except my shirts, so you need not trouble.\u0022\r\n+\r\n+\u0022Good-bye, my son,\u0022 she answered with a bow of strained stateliness.\r\n+\r\n+She was extremely annoyed at the tone he had adopted with her, and\r\n+there was something in his look that had made her feel afraid.\r\n+\r\n+\u0022Kiss me, Mother,\u0022 said the girl. Her flowerlike lips touched the\r\n+withered cheek and warmed its frost.\r\n+\r\n+\u0022My child! my child!\u0022 cried Mrs. Vane, looking up to the ceiling in\r\n+search of an imaginary gallery.\r\n+\r\n+\u0022Come, Sibyl,\u0022 said her brother impatiently. He hated his mother's\r\n+affectations.\r\n+\r\n+They went out into the flickering, wind-blown sunlight and strolled\r\n+down the dreary Euston Road. The passersby glanced in wonder at the\r\n+sullen heavy youth who, in coarse, ill-fitting clothes, was in the\r\n+company of such a graceful, refined-looking girl. He was like a common\r\n+gardener walking with a rose.\r\n+\r\n+Jim frowned from time to time when he caught the inquisitive glance of\r\n+some stranger. He had that dislike of being stared at, which comes on\r\n+geniuses late in life and never leaves the commonplace. Sibyl,\r\n+however, was quite unconscious of the effect she was producing. Her\r\n+love was trembling in laughter on her lips. She was thinking of Prince\r\n+Charming, and, that she might think of him all the more, she did not\r\n+talk of him, but prattled on about the ship in which Jim was going to\r\n+sail, about the gold he was certain to find, about the wonderful\r\n+heiress whose life he was to save from the wicked, red-shirted\r\n+bushrangers. For he was not to remain a sailor, or a supercargo, or\r\n+whatever he was going to be. Oh, no! A sailor's existence was\r\n+dreadful. Fancy being cooped up in a horrid ship, with the hoarse,\r\n+hump-backed waves trying to get in, and a black wind blowing the masts\r\n+down and tearing the sails into long screaming ribands! He was to\r\n+leave the vessel at Melbourne, bid a polite good-bye to the captain,\r\n+and go off at once to the gold-fields. Before a week was over he was to\r\n+come across a large nugget of pure gold, the largest nugget that had\r\n+ever been discovered, and bring it down to the coast in a waggon\r\n+guarded by six mounted policemen. The bushrangers were to attack them\r\n+three times, and be defeated with immense slaughter. Or, no. He was\r\n+not to go to the gold-fields at all. They were horrid places, where\r\n+men got intoxicated, and shot each other in bar-rooms, and used bad\r\n+language. He was to be a nice sheep-farmer, and one evening, as he was\r\n+riding home, he was to see the beautiful heiress being carried off by a\r\n+robber on a black horse, and give chase, and rescue her. Of course,\r\n+she would fall in love with him, and he with her, and they would get\r\n+married, and come home, and live in an immense house in London. Yes,\r\n+there were delightful things in store for him. But he must be very\r\n+good, and not lose his temper, or spend his money foolishly. She was\r\n+only a year older than he was, but she knew so much more of life. He\r\n+must be sure, also, to write to her by every mail, and to say his\r\n+prayers each night before he went to sleep. God was very good, and\r\n+would watch over him. She would pray for him, too, and in a few years\r\n+he would come back quite rich and happy.\r\n+\r\n+The lad listened sulkily to her and made no answer. He was heart-sick\r\n+at leaving home.\r\n+\r\n+Yet it was not this alone that made him gloomy and morose.\r\n+Inexperienced though he was, he had still a strong sense of the danger\r\n+of Sibyl's position. This young dandy who was making love to her could\r\n+mean her no good. He was a gentleman, and he hated him for that, hated\r\n+him through some curious race-instinct for which he could not account,\r\n+and which for that reason was all the more dominant within him. He was\r\n+conscious also of the shallowness and vanity of his mother's nature,\r\n+and in that saw infinite peril for Sibyl and Sibyl's happiness.\r\n+Children begin by loving their parents; as they grow older they judge\r\n+them; sometimes they forgive them.\r\n+\r\n+His mother! He had something on his mind to ask of her, something that\r\n+he had brooded on for many months of silence. A chance phrase that he\r\n+had heard at the theatre, a whispered sneer that had reached his ears\r\n+one night as he waited at the stage-door, had set loose a train of\r\n+horrible thoughts. He remembered it as if it had been the lash of a\r\n+hunting-crop across his face. His brows knit together into a wedge-like\r\n+furrow, and with a twitch of pain he bit his underlip.\r\n+\r\n+\u0022You are not listening to a word I am saying, Jim,\u0022 cried Sibyl, \u0022and I\r\n+am making the most delightful plans for your future. Do say something.\u0022\r\n+\r\n+\u0022What do you want me to say?\u0022\r\n+\r\n+\u0022Oh! that you will be a good boy and not forget us,\u0022 she answered,\r\n+smiling at him.\r\n+\r\n+He shrugged his shoulders. \u0022You are more likely to forget me than I am\r\n+to forget you, Sibyl.\u0022\r\n+\r\n+She flushed. \u0022What do you mean, Jim?\u0022 she asked.\r\n+\r\n+\u0022You have a new friend, I hear. Who is he? Why have you not told me\r\n+about him? He means you no good.\u0022\r\n+\r\n+\u0022Stop, Jim!\u0022 she exclaimed. \u0022You must not say anything against him. I\r\n+love him.\u0022\r\n+\r\n+\u0022Why, you don't even know his name,\u0022 answered the lad. \u0022Who is he? I\r\n+have a right to know.\u0022\r\n+\r\n+\u0022He is called Prince Charming. Don't you like the name. Oh! you silly\r\n+boy! you should never forget it. If you only saw him, you would think\r\n+him the most wonderful person in the world. Some day you will meet\r\n+him--when you come back from Australia. You will like him so much.\r\n+Everybody likes him, and I ... love him. I wish you could come to the\r\n+theatre to-night. He is going to be there, and I am to play Juliet.\r\n+Oh! how I shall play it! Fancy, Jim, to be in love and play Juliet!\r\n+To have him sitting there! To play for his delight! I am afraid I may\r\n+frighten the company, frighten or enthrall them. To be in love is to\r\n+surpass one's self. Poor dreadful Mr. Isaacs will be shouting 'genius'\r\n+to his loafers at the bar. He has preached me as a dogma; to-night he\r\n+will announce me as a revelation. I feel it. And it is all his, his\r\n+only, Prince Charming, my wonderful lover, my god of graces. But I am\r\n+poor beside him. Poor? What does that matter? When poverty creeps in\r\n+at the door, love flies in through the window. Our proverbs want\r\n+rewriting. They were made in winter, and it is summer now; spring-time\r\n+for me, I think, a very dance of blossoms in blue skies.\u0022\r\n+\r\n+\u0022He is a gentleman,\u0022 said the lad sullenly.\r\n+\r\n+\u0022A prince!\u0022 she cried musically. \u0022What more do you want?\u0022\r\n+\r\n+\u0022He wants to enslave you.\u0022\r\n+\r\n+\u0022I shudder at the thought of being free.\u0022\r\n+\r\n+\u0022I want you to beware of him.\u0022\r\n+\r\n+\u0022To see him is to worship him; to know him is to trust him.\u0022\r\n+\r\n+\u0022Sibyl, you are mad about him.\u0022\r\n+\r\n+She laughed and took his arm. \u0022You dear old Jim, you talk as if you\r\n+were a hundred. Some day you will be in love yourself. Then you will\r\n+know what it is. Don't look so sulky. Surely you should be glad to\r\n+think that, though you are going away, you leave me happier than I have\r\n+ever been before. Life has been hard for us both, terribly hard and\r\n+difficult. But it will be different now. You are going to a new\r\n+world, and I have found one. Here are two chairs; let us sit down and\r\n+see the smart people go by.\u0022\r\n+\r\n+They took their seats amidst a crowd of watchers. The tulip-beds\r\n+across the road flamed like throbbing rings of fire. A white\r\n+dust--tremulous cloud of orris-root it seemed--hung in the panting air.\r\n+The brightly coloured parasols danced and dipped like monstrous\r\n+butterflies.\r\n+\r\n+She made her brother talk of himself, his hopes, his prospects. He\r\n+spoke slowly and with effort. They passed words to each other as\r\n+players at a game pass counters. Sibyl felt oppressed. She could not\r\n+communicate her joy. A faint smile curving that sullen mouth was all\r\n+the echo she could win. After some time she became silent. Suddenly\r\n+she caught a glimpse of golden hair and laughing lips, and in an open\r\n+carriage with two ladies Dorian Gray drove past.\r\n+\r\n+She started to her feet. \u0022There he is!\u0022 she cried.\r\n+\r\n+\u0022Who?\u0022 said Jim Vane.\r\n+\r\n+\u0022Prince Charming,\u0022 she answered, looking after the victoria.\r\n+\r\n+He jumped up and seized her roughly by the arm. \u0022Show him to me.\r\n+Which is he? Point him out. I must see him!\u0022 he exclaimed; but at\r\n+that moment the Duke of Berwick's four-in-hand came between, and when\r\n+it had left the space clear, the carriage had swept out of the park.\r\n+\r\n+\u0022He is gone,\u0022 murmured Sibyl sadly. \u0022I wish you had seen him.\u0022\r\n+\r\n+\u0022I wish I had, for as sure as there is a God in heaven, if he ever does\r\n+you any wrong, I shall kill him.\u0022\r\n+\r\n+She looked at him in horror. He repeated his words. They cut the air\r\n+like a dagger. The people round began to gape. A lady standing close\r\n+to her tittered.\r\n+\r\n+\u0022Come away, Jim; come away,\u0022 she whispered. He followed her doggedly\r\n+as she passed through the crowd. He felt glad at what he had said.\r\n+\r\n+When they reached the Achilles Statue, she turned round. There was\r\n+pity in her eyes that became laughter on her lips. She shook her head\r\n+at him. \u0022You are foolish, Jim, utterly foolish; a bad-tempered boy,\r\n+that is all. How can you say such horrible things? You don't know\r\n+what you are talking about. You are simply jealous and unkind. Ah! I\r\n+wish you would fall in love. Love makes people good, and what you said\r\n+was wicked.\u0022\r\n+\r\n+\u0022I am sixteen,\u0022 he answered, \u0022and I know what I am about. Mother is no\r\n+help to you. She doesn't understand how to look after you. I wish now\r\n+that I was not going to Australia at all. I have a great mind to chuck\r\n+the whole thing up. I would, if my articles hadn't been signed.\u0022\r\n+\r\n+\u0022Oh, don't be so serious, Jim. You are like one of the heroes of those\r\n+silly melodramas Mother used to be so fond of acting in. I am not\r\n+going to quarrel with you. I have seen him, and oh! to see him is\r\n+perfect happiness. We won't quarrel. I know you would never harm any\r\n+one I love, would you?\u0022\r\n+\r\n+\u0022Not as long as you love him, I suppose,\u0022 was the sullen answer.\r\n+\r\n+\u0022I shall love him for ever!\u0022 she cried.\r\n+\r\n+\u0022And he?\u0022\r\n+\r\n+\u0022For ever, too!\u0022\r\n+\r\n+\u0022He had better.\u0022\r\n+\r\n+She shrank from him. Then she laughed and put her hand on his arm. He\r\n+was merely a boy.\r\n+\r\n+At the Marble Arch they hailed an omnibus, which left them close to\r\n+their shabby home in the Euston Road. It was after five o'clock, and\r\n+Sibyl had to lie down for a couple of hours before acting. Jim\r\n+insisted that she should do so. He said that he would sooner part with\r\n+her when their mother was not present. She would be sure to make a\r\n+scene, and he detested scenes of every kind.\r\n+\r\n+In Sybil's own room they parted. There was jealousy in the lad's\r\n+heart, and a fierce murderous hatred of the stranger who, as it seemed\r\n+to him, had come between them. Yet, when her arms were flung round his\r\n+neck, and her fingers strayed through his hair, he softened and kissed\r\n+her with real affection. There were tears in his eyes as he went\r\n+downstairs.\r\n+\r\n+His mother was waiting for him below. She grumbled at his\r\n+unpunctuality, as he entered. He made no answer, but sat down to his\r\n+meagre meal. The flies buzzed round the table and crawled over the\r\n+stained cloth. Through the rumble of omnibuses, and the clatter of\r\n+street-cabs, he could hear the droning voice devouring each minute that\r\n+was left to him.\r\n+\r\n+After some time, he thrust away his plate and put his head in his\r\n+hands. He felt that he had a right to know. It should have been told\r\n+to him before, if it was as he suspected. Leaden with fear, his mother\r\n+watched him. Words dropped mechanically from her lips. A tattered\r\n+lace handkerchief twitched in her fingers. When the clock struck six,\r\n+he got up and went to the door. Then he turned back and looked at her.\r\n+Their eyes met. In hers he saw a wild appeal for mercy. It enraged\r\n+him.\r\n+\r\n+\u0022Mother, I have something to ask you,\u0022 he said. Her eyes wandered\r\n+vaguely about the room. She made no answer. \u0022Tell me the truth. I\r\n+have a right to know. Were you married to my father?\u0022\r\n+\r\n+She heaved a deep sigh. It was a sigh of relief. The terrible moment,\r\n+the moment that night and day, for weeks and months, she had dreaded,\r\n+had come at last, and yet she felt no terror. Indeed, in some measure\r\n+it was a disappointment to her. The vulgar directness of the question\r\n+called for a direct answer. The situation had not been gradually led\r\n+up to. It was crude. It reminded her of a bad rehearsal.\r\n+\r\n+\u0022No,\u0022 she answered, wondering at the harsh simplicity of life.\r\n+\r\n+\u0022My father was a scoundrel then!\u0022 cried the lad, clenching his fists.\r\n+\r\n+She shook her head. \u0022I knew he was not free. We loved each other very\r\n+much. If he had lived, he would have made provision for us. Don't\r\n+speak against him, my son. He was your father, and a gentleman.\r\n+Indeed, he was highly connected.\u0022\r\n+\r\n+An oath broke from his lips. \u0022I don't care for myself,\u0022 he exclaimed,\r\n+\u0022but don't let Sibyl.... It is a gentleman, isn't it, who is in love\r\n+with her, or says he is? Highly connected, too, I suppose.\u0022\r\n+\r\n+For a moment a hideous sense of humiliation came over the woman. Her\r\n+head drooped. She wiped her eyes with shaking hands. \u0022Sibyl has a\r\n+mother,\u0022 she murmured; \u0022I had none.\u0022\r\n+\r\n+The lad was touched. He went towards her, and stooping down, he kissed\r\n+her. \u0022I am sorry if I have pained you by asking about my father,\u0022 he\r\n+said, \u0022but I could not help it. I must go now. Good-bye. Don't forget\r\n+that you will have only one child now to look after, and believe me\r\n+that if this man wrongs my sister, I will find out who he is, track him\r\n+down, and kill him like a dog. I swear it.\u0022\r\n+\r\n+The exaggerated folly of the threat, the passionate gesture that\r\n+accompanied it, the mad melodramatic words, made life seem more vivid\r\n+to her. She was familiar with the atmosphere. She breathed more\r\n+freely, and for the first time for many months she really admired her\r\n+son. She would have liked to have continued the scene on the same\r\n+emotional scale, but he cut her short. Trunks had to be carried down\r\n+and mufflers looked for. The lodging-house drudge bustled in and out.\r\n+There was the bargaining with the cabman. The moment was lost in\r\n+vulgar details. It was with a renewed feeling of disappointment that\r\n+she waved the tattered lace handkerchief from the window, as her son\r\n+drove away. She was conscious that a great opportunity had been\r\n+wasted. She consoled herself by telling Sibyl how desolate she felt\r\n+her life would be, now that she had only one child to look after. She\r\n+remembered the phrase. It had pleased her. Of the threat she said\r\n+nothing. It was vividly and dramatically expressed. She felt that\r\n+they would all laugh at it some day.\r\n+\r\n+\r\n+\r\n+CHAPTER 6\r\n+\r\n+\u0022I suppose you have heard the news, Basil?\u0022 said Lord Henry that\r\n+evening as Hallward was shown into a little private room at the Bristol\r\n+where dinner had been laid for three.\r\n+\r\n+\u0022No, Harry,\u0022 answered the artist, giving his hat and coat to the bowing\r\n+waiter. \u0022What is it? Nothing about politics, I hope! They don't\r\n+interest me. There is hardly a single person in the House of Commons\r\n+worth painting, though many of them would be the better for a little\r\n+whitewashing.\u0022\r\n+\r\n+\u0022Dorian Gray is engaged to be married,\u0022 said Lord Henry, watching him\r\n+as he spoke.\r\n+\r\n+Hallward started and then frowned. \u0022Dorian engaged to be married!\u0022 he\r\n+cried. \u0022Impossible!\u0022\r\n+\r\n+\u0022It is perfectly true.\u0022\r\n+\r\n+\u0022To whom?\u0022\r\n+\r\n+\u0022To some little actress or other.\u0022\r\n+\r\n+\u0022I can't believe it. Dorian is far too sensible.\u0022\r\n+\r\n+\u0022Dorian is far too wise not to do foolish things now and then, my dear\r\n+Basil.\u0022\r\n+\r\n+\u0022Marriage is hardly a thing that one can do now and then, Harry.\u0022\r\n+\r\n+\u0022Except in America,\u0022 rejoined Lord Henry languidly. \u0022But I didn't say\r\n+he was married. I said he was engaged to be married. There is a great\r\n+difference. I have a distinct remembrance of being married, but I have\r\n+no recollection at all of being engaged. I am inclined to think that I\r\n+never was engaged.\u0022\r\n+\r\n+\u0022But think of Dorian's birth, and position, and wealth. It would be\r\n+absurd for him to marry so much beneath him.\u0022\r\n+\r\n+\u0022If you want to make him marry this girl, tell him that, Basil. He is\r\n+sure to do it, then. Whenever a man does a thoroughly stupid thing, it\r\n+is always from the noblest motives.\u0022\r\n+\r\n+\u0022I hope the girl is good, Harry. I don't want to see Dorian tied to\r\n+some vile creature, who might degrade his nature and ruin his\r\n+intellect.\u0022\r\n+\r\n+\u0022Oh, she is better than good--she is beautiful,\u0022 murmured Lord Henry,\r\n+sipping a glass of vermouth and orange-bitters. \u0022Dorian says she is\r\n+beautiful, and he is not often wrong about things of that kind. Your\r\n+portrait of him has quickened his appreciation of the personal\r\n+appearance of other people. It has had that excellent effect, amongst\r\n+others. We are to see her to-night, if that boy doesn't forget his\r\n+appointment.\u0022\r\n+\r\n+\u0022Are you serious?\u0022\r\n+\r\n+\u0022Quite serious, Basil. I should be miserable if I thought I should\r\n+ever be more serious than I am at the present moment.\u0022\r\n+\r\n+\u0022But do you approve of it, Harry?\u0022 asked the painter, walking up and\r\n+down the room and biting his lip. \u0022You can't approve of it, possibly.\r\n+It is some silly infatuation.\u0022\r\n+\r\n+\u0022I never approve, or disapprove, of anything now. It is an absurd\r\n+attitude to take towards life. We are not sent into the world to air\r\n+our moral prejudices. I never take any notice of what common people\r\n+say, and I never interfere with what charming people do. If a\r\n+personality fascinates me, whatever mode of expression that personality\r\n+selects is absolutely delightful to me. Dorian Gray falls in love with\r\n+a beautiful girl who acts Juliet, and proposes to marry her. Why not?\r\n+If he wedded Messalina, he would be none the less interesting. You\r\n+know I am not a champion of marriage. The real drawback to marriage is\r\n+that it makes one unselfish. And unselfish people are colourless.\r\n+They lack individuality. Still, there are certain temperaments that\r\n+marriage makes more complex. They retain their egotism, and add to it\r\n+many other egos. They are forced to have more than one life. They\r\n+become more highly organized, and to be highly organized is, I should\r\n+fancy, the object of man's existence. Besides, every experience is of\r\n+value, and whatever one may say against marriage, it is certainly an\r\n+experience. I hope that Dorian Gray will make this girl his wife,\r\n+passionately adore her for six months, and then suddenly become\r\n+fascinated by some one else. He would be a wonderful study.\u0022\r\n+\r\n+\u0022You don't mean a single word of all that, Harry; you know you don't.\r\n+If Dorian Gray's life were spoiled, no one would be sorrier than\r\n+yourself. You are much better than you pretend to be.\u0022\r\n+\r\n+Lord Henry laughed. \u0022The reason we all like to think so well of others\r\n+is that we are all afraid for ourselves. The basis of optimism is\r\n+sheer terror. We think that we are generous because we credit our\r\n+neighbour with the possession of those virtues that are likely to be a\r\n+benefit to us. We praise the banker that we may overdraw our account,\r\n+and find good qualities in the highwayman in the hope that he may spare\r\n+our pockets. I mean everything that I have said. I have the greatest\r\n+contempt for optimism. As for a spoiled life, no life is spoiled but\r\n+one whose growth is arrested. If you want to mar a nature, you have\r\n+merely to reform it. As for marriage, of course that would be silly,\r\n+but there are other and more interesting bonds between men and women.\r\n+I will certainly encourage them. They have the charm of being\r\n+fashionable. But here is Dorian himself. He will tell you more than I\r\n+can.\u0022\r\n+\r\n+\u0022My dear Harry, my dear Basil, you must both congratulate me!\u0022 said the\r\n+lad, throwing off his evening cape with its satin-lined wings and\r\n+shaking each of his friends by the hand in turn. \u0022I have never been so\r\n+happy. Of course, it is sudden--all really delightful things are. And\r\n+yet it seems to me to be the one thing I have been looking for all my\r\n+life.\u0022 He was flushed with excitement and pleasure, and looked\r\n+extraordinarily handsome.\r\n+\r\n+\u0022I hope you will always be very happy, Dorian,\u0022 said Hallward, \u0022but I\r\n+don't quite forgive you for not having let me know of your engagement.\r\n+You let Harry know.\u0022\r\n+\r\n+\u0022And I don't forgive you for being late for dinner,\u0022 broke in Lord\r\n+Henry, putting his hand on the lad's shoulder and smiling as he spoke.\r\n+\u0022Come, let us sit down and try what the new _chef_ here is like, and then\r\n+you will tell us how it all came about.\u0022\r\n+\r\n+\u0022There is really not much to tell,\u0022 cried Dorian as they took their\r\n+seats at the small round table. \u0022What happened was simply this. After\r\n+I left you yesterday evening, Harry, I dressed, had some dinner at that\r\n+little Italian restaurant in Rupert Street you introduced me to, and\r\n+went down at eight o'clock to the theatre. Sibyl was playing Rosalind.\r\n+Of course, the scenery was dreadful and the Orlando absurd. But Sibyl!\r\n+You should have seen her! When she came on in her boy's clothes, she\r\n+was perfectly wonderful. She wore a moss-coloured velvet jerkin with\r\n+cinnamon sleeves, slim, brown, cross-gartered hose, a dainty little\r\n+green cap with a hawk's feather caught in a jewel, and a hooded cloak\r\n+lined with dull red. She had never seemed to me more exquisite. She\r\n+had all the delicate grace of that Tanagra figurine that you have in\r\n+your studio, Basil. Her hair clustered round her face like dark leaves\r\n+round a pale rose. As for her acting--well, you shall see her\r\n+to-night. She is simply a born artist. I sat in the dingy box\r\n+absolutely enthralled. I forgot that I was in London and in the\r\n+nineteenth century. I was away with my love in a forest that no man\r\n+had ever seen. After the performance was over, I went behind and spoke\r\n+to her. As we were sitting together, suddenly there came into her eyes\r\n+a look that I had never seen there before. My lips moved towards hers.\r\n+We kissed each other. I can't describe to you what I felt at that\r\n+moment. It seemed to me that all my life had been narrowed to one\r\n+perfect point of rose-coloured joy. She trembled all over and shook\r\n+like a white narcissus. Then she flung herself on her knees and kissed\r\n+my hands. I feel that I should not tell you all this, but I can't help\r\n+it. Of course, our engagement is a dead secret. She has not even told\r\n+her own mother. I don't know what my guardians will say. Lord Radley\r\n+is sure to be furious. I don't care. I shall be of age in less than a\r\n+year, and then I can do what I like. I have been right, Basil, haven't\r\n+I, to take my love out of poetry and to find my wife in Shakespeare's\r\n+plays? Lips that Shakespeare taught to speak have whispered their\r\n+secret in my ear. I have had the arms of Rosalind around me, and\r\n+kissed Juliet on the mouth.\u0022\r\n+\r\n+\u0022Yes, Dorian, I suppose you were right,\u0022 said Hallward slowly.\r\n+\r\n+\u0022Have you seen her to-day?\u0022 asked Lord Henry.\r\n+\r\n+Dorian Gray shook his head. \u0022I left her in the forest of Arden; I\r\n+shall find her in an orchard in Verona.\u0022\r\n+\r\n+Lord Henry sipped his champagne in a meditative manner. \u0022At what\r\n+particular point did you mention the word marriage, Dorian? And what\r\n+did she say in answer? Perhaps you forgot all about it.\u0022\r\n+\r\n+\u0022My dear Harry, I did not treat it as a business transaction, and I did\r\n+not make any formal proposal. I told her that I loved her, and she\r\n+said she was not worthy to be my wife. Not worthy! Why, the whole\r\n+world is nothing to me compared with her.\u0022\r\n+\r\n+\u0022Women are wonderfully practical,\u0022 murmured Lord Henry, \u0022much more\r\n+practical than we are. In situations of that kind we often forget to\r\n+say anything about marriage, and they always remind us.\u0022\r\n+\r\n+Hallward laid his hand upon his arm. \u0022Don't, Harry. You have annoyed\r\n+Dorian. He is not like other men. He would never bring misery upon\r\n+any one. His nature is too fine for that.\u0022\r\n+\r\n+Lord Henry looked across the table. \u0022Dorian is never annoyed with me,\u0022\r\n+he answered. \u0022I asked the question for the best reason possible, for\r\n+the only reason, indeed, that excuses one for asking any\r\n+question--simple curiosity. I have a theory that it is always the\r\n+women who propose to us, and not we who propose to the women. Except,\r\n+of course, in middle-class life. But then the middle classes are not\r\n+modern.\u0022\r\n+\r\n+Dorian Gray laughed, and tossed his head. \u0022You are quite incorrigible,\r\n+Harry; but I don't mind. It is impossible to be angry with you. When\r\n+you see Sibyl Vane, you will feel that the man who could wrong her\r\n+would be a beast, a beast without a heart. I cannot understand how any\r\n+one can wish to shame the thing he loves. I love Sibyl Vane. I want\r\n+to place her on a pedestal of gold and to see the world worship the\r\n+woman who is mine. What is marriage? An irrevocable vow. You mock at\r\n+it for that. Ah! don't mock. It is an irrevocable vow that I want to\r\n+take. Her trust makes me faithful, her belief makes me good. When I\r\n+am with her, I regret all that you have taught me. I become different\r\n+from what you have known me to be. I am changed, and the mere touch of\r\n+Sibyl Vane's hand makes me forget you and all your wrong, fascinating,\r\n+poisonous, delightful theories.\u0022\r\n+\r\n+\u0022And those are ...?\u0022 asked Lord Henry, helping himself to some salad.\r\n+\r\n+\u0022Oh, your theories about life, your theories about love, your theories\r\n+about pleasure. All your theories, in fact, Harry.\u0022\r\n+\r\n+\u0022Pleasure is the only thing worth having a theory about,\u0022 he answered\r\n+in his slow melodious voice. \u0022But I am afraid I cannot claim my theory\r\n+as my own. It belongs to Nature, not to me. Pleasure is Nature's\r\n+test, her sign of approval. When we are happy, we are always good, but\r\n+when we are good, we are not always happy.\u0022\r\n+\r\n+\u0022Ah! but what do you mean by good?\u0022 cried Basil Hallward.\r\n+\r\n+\u0022Yes,\u0022 echoed Dorian, leaning back in his chair and looking at Lord\r\n+Henry over the heavy clusters of purple-lipped irises that stood in the\r\n+centre of the table, \u0022what do you mean by good, Harry?\u0022\r\n+\r\n+\u0022To be good is to be in harmony with one's self,\u0022 he replied, touching\r\n+the thin stem of his glass with his pale, fine-pointed fingers.\r\n+\u0022Discord is to be forced to be in harmony with others. One's own\r\n+life--that is the important thing. As for the lives of one's\r\n+neighbours, if one wishes to be a prig or a Puritan, one can flaunt\r\n+one's moral views about them, but they are not one's concern. Besides,\r\n+individualism has really the higher aim. Modern morality consists in\r\n+accepting the standard of one's age. I consider that for any man of\r\n+culture to accept the standard of his age is a form of the grossest\r\n+immorality.\u0022\r\n+\r\n+\u0022But, surely, if one lives merely for one's self, Harry, one pays a\r\n+terrible price for doing so?\u0022 suggested the painter.\r\n+\r\n+\u0022Yes, we are overcharged for everything nowadays. I should fancy that\r\n+the real tragedy of the poor is that they can afford nothing but\r\n+self-denial. Beautiful sins, like beautiful things, are the privilege\r\n+of the rich.\u0022\r\n+\r\n+\u0022One has to pay in other ways but money.\u0022\r\n+\r\n+\u0022What sort of ways, Basil?\u0022\r\n+\r\n+\u0022Oh! I should fancy in remorse, in suffering, in ... well, in the\r\n+consciousness of degradation.\u0022\r\n+\r\n+Lord Henry shrugged his shoulders. \u0022My dear fellow, mediaeval art is\r\n+charming, but mediaeval emotions are out of date. One can use them in\r\n+fiction, of course. But then the only things that one can use in\r\n+fiction are the things that one has ceased to use in fact. Believe me,\r\n+no civilized man ever regrets a pleasure, and no uncivilized man ever\r\n+knows what a pleasure is.\u0022\r\n+\r\n+\u0022I know what pleasure is,\u0022 cried Dorian Gray. \u0022It is to adore some\r\n+one.\u0022\r\n+\r\n+\u0022That is certainly better than being adored,\u0022 he answered, toying with\r\n+some fruits. \u0022Being adored is a nuisance. Women treat us just as\r\n+humanity treats its gods. They worship us, and are always bothering us\r\n+to do something for them.\u0022\r\n+\r\n+\u0022I should have said that whatever they ask for they had first given to\r\n+us,\u0022 murmured the lad gravely. \u0022They create love in our natures. They\r\n+have a right to demand it back.\u0022\r\n+\r\n+\u0022That is quite true, Dorian,\u0022 cried Hallward.\r\n+\r\n+\u0022Nothing is ever quite true,\u0022 said Lord Henry.\r\n+\r\n+\u0022This is,\u0022 interrupted Dorian. \u0022You must admit, Harry, that women give\r\n+to men the very gold of their lives.\u0022\r\n+\r\n+\u0022Possibly,\u0022 he sighed, \u0022but they invariably want it back in such very\r\n+small change. That is the worry. Women, as some witty Frenchman once\r\n+put it, inspire us with the desire to do masterpieces and always\r\n+prevent us from carrying them out.\u0022\r\n+\r\n+\u0022Harry, you are dreadful! I don't know why I like you so much.\u0022\r\n+\r\n+\u0022You will always like me, Dorian,\u0022 he replied. \u0022Will you have some\r\n+coffee, you fellows? Waiter, bring coffee, and _fine-champagne_, and\r\n+some cigarettes. No, don't mind the cigarettes--I have some. Basil, I\r\n+can't allow you to smoke cigars. You must have a cigarette. A\r\n+cigarette is the perfect type of a perfect pleasure. It is exquisite,\r\n+and it leaves one unsatisfied. What more can one want? Yes, Dorian,\r\n+you will always be fond of me. I represent to you all the sins you\r\n+have never had the courage to commit.\u0022\r\n+\r\n+\u0022What nonsense you talk, Harry!\u0022 cried the lad, taking a light from a\r\n+fire-breathing silver dragon that the waiter had placed on the table.\r\n+\u0022Let us go down to the theatre. When Sibyl comes on the stage you will\r\n+have a new ideal of life. She will represent something to you that you\r\n+have never known.\u0022\r\n+\r\n+\u0022I have known everything,\u0022 said Lord Henry, with a tired look in his\r\n+eyes, \u0022but I am always ready for a new emotion. I am afraid, however,\r\n+that, for me at any rate, there is no such thing. Still, your\r\n+wonderful girl may thrill me. I love acting. It is so much more real\r\n+than life. Let us go. Dorian, you will come with me. I am so sorry,\r\n+Basil, but there is only room for two in the brougham. You must follow\r\n+us in a hansom.\u0022\r\n+\r\n+They got up and put on their coats, sipping their coffee standing. The\r\n+painter was silent and preoccupied. There was a gloom over him. He\r\n+could not bear this marriage, and yet it seemed to him to be better\r\n+than many other things that might have happened. After a few minutes,\r\n+they all passed downstairs. He drove off by himself, as had been\r\n+arranged, and watched the flashing lights of the little brougham in\r\n+front of him. A strange sense of loss came over him. He felt that\r\n+Dorian Gray would never again be to him all that he had been in the\r\n+past. Life had come between them.... His eyes darkened, and the\r\n+crowded flaring streets became blurred to his eyes. When the cab drew\r\n+up at the theatre, it seemed to him that he had grown years older.\r\n+\r\n+\r\n+\r\n+CHAPTER 7\r\n+\r\n+For some reason or other, the house was crowded that night, and the fat\r\n+Jew manager who met them at the door was beaming from ear to ear with\r\n+an oily tremulous smile. He escorted them to their box with a sort of\r\n+pompous humility, waving his fat jewelled hands and talking at the top\r\n+of his voice. Dorian Gray loathed him more than ever. He felt as if\r\n+he had come to look for Miranda and had been met by Caliban. Lord\r\n+Henry, upon the other hand, rather liked him. At least he declared he\r\n+did, and insisted on shaking him by the hand and assuring him that he\r\n+was proud to meet a man who had discovered a real genius and gone\r\n+bankrupt over a poet. Hallward amused himself with watching the faces\r\n+in the pit. The heat was terribly oppressive, and the huge sunlight\r\n+flamed like a monstrous dahlia with petals of yellow fire. The youths\r\n+in the gallery had taken off their coats and waistcoats and hung them\r\n+over the side. They talked to each other across the theatre and shared\r\n+their oranges with the tawdry girls who sat beside them. Some women\r\n+were laughing in the pit. Their voices were horribly shrill and\r\n+discordant. The sound of the popping of corks came from the bar.\r\n+\r\n+\u0022What a place to find one's divinity in!\u0022 said Lord Henry.\r\n+\r\n+\u0022Yes!\u0022 answered Dorian Gray. \u0022It was here I found her, and she is\r\n+divine beyond all living things. When she acts, you will forget\r\n+everything. These common rough people, with their coarse faces and\r\n+brutal gestures, become quite different when she is on the stage. They\r\n+sit silently and watch her. They weep and laugh as she wills them to\r\n+do. She makes them as responsive as a violin. She spiritualizes them,\r\n+and one feels that they are of the same flesh and blood as one's self.\u0022\r\n+\r\n+\u0022The same flesh and blood as one's self! Oh, I hope not!\u0022 exclaimed\r\n+Lord Henry, who was scanning the occupants of the gallery through his\r\n+opera-glass.\r\n+\r\n+\u0022Don't pay any attention to him, Dorian,\u0022 said the painter. \u0022I\r\n+understand what you mean, and I believe in this girl. Any one you love\r\n+must be marvellous, and any girl who has the effect you describe must\r\n+be fine and noble. To spiritualize one's age--that is something worth\r\n+doing. If this girl can give a soul to those who have lived without\r\n+one, if she can create the sense of beauty in people whose lives have\r\n+been sordid and ugly, if she can strip them of their selfishness and\r\n+lend them tears for sorrows that are not their own, she is worthy of\r\n+all your adoration, worthy of the adoration of the world. This\r\n+marriage is quite right. I did not think so at first, but I admit it\r\n+now. The gods made Sibyl Vane for you. Without her you would have\r\n+been incomplete.\u0022\r\n+\r\n+\u0022Thanks, Basil,\u0022 answered Dorian Gray, pressing his hand. \u0022I knew that\r\n+you would understand me. Harry is so cynical, he terrifies me. But\r\n+here is the orchestra. It is quite dreadful, but it only lasts for\r\n+about five minutes. Then the curtain rises, and you will see the girl\r\n+to whom I am going to give all my life, to whom I have given everything\r\n+that is good in me.\u0022\r\n+\r\n+A quarter of an hour afterwards, amidst an extraordinary turmoil of\r\n+applause, Sibyl Vane stepped on to the stage. Yes, she was certainly\r\n+lovely to look at--one of the loveliest creatures, Lord Henry thought,\r\n+that he had ever seen. There was something of the fawn in her shy\r\n+grace and startled eyes. A faint blush, like the shadow of a rose in a\r\n+mirror of silver, came to her cheeks as she glanced at the crowded\r\n+enthusiastic house. She stepped back a few paces and her lips seemed\r\n+to tremble. Basil Hallward leaped to his feet and began to applaud.\r\n+Motionless, and as one in a dream, sat Dorian Gray, gazing at her.\r\n+Lord Henry peered through his glasses, murmuring, \u0022Charming! charming!\u0022\r\n+\r\n+The scene was the hall of Capulet's house, and Romeo in his pilgrim's\r\n+dress had entered with Mercutio and his other friends. The band, such\r\n+as it was, struck up a few bars of music, and the dance began. Through\r\n+the crowd of ungainly, shabbily dressed actors, Sibyl Vane moved like a\r\n+creature from a finer world. Her body swayed, while she danced, as a\r\n+plant sways in the water. The curves of her throat were the curves of\r\n+a white lily. Her hands seemed to be made of cool ivory.\r\n+\r\n+Yet she was curiously listless. She showed no sign of joy when her\r\n+eyes rested on Romeo. The few words she had to speak--\r\n+\r\n+ Good pilgrim, you do wrong your hand too much,\r\n+ Which mannerly devotion shows in this;\r\n+ For saints have hands that pilgrims' hands do touch,\r\n+ And palm to palm is holy palmers' kiss--\r\n+\r\n+with the brief dialogue that follows, were spoken in a thoroughly\r\n+artificial manner. The voice was exquisite, but from the point of view\r\n+of tone it was absolutely false. It was wrong in colour. It took away\r\n+all the life from the verse. It made the passion unreal.\r\n+\r\n+Dorian Gray grew pale as he watched her. He was puzzled and anxious.\r\n+Neither of his friends dared to say anything to him. She seemed to\r\n+them to be absolutely incompetent. They were horribly disappointed.\r\n+\r\n+Yet they felt that the true test of any Juliet is the balcony scene of\r\n+the second act. They waited for that. If she failed there, there was\r\n+nothing in her.\r\n+\r\n+She looked charming as she came out in the moonlight. That could not\r\n+be denied. But the staginess of her acting was unbearable, and grew\r\n+worse as she went on. Her gestures became absurdly artificial. She\r\n+overemphasized everything that she had to say. The beautiful passage--\r\n+\r\n+ Thou knowest the mask of night is on my face,\r\n+ Else would a maiden blush bepaint my cheek\r\n+ For that which thou hast heard me speak to-night--\r\n+\r\n+was declaimed with the painful precision of a schoolgirl who has been\r\n+taught to recite by some second-rate professor of elocution. When she\r\n+leaned over the balcony and came to those wonderful lines--\r\n+\r\n+ Although I joy in thee,\r\n+ I have no joy of this contract to-night:\r\n+ It is too rash, too unadvised, too sudden;\r\n+ Too like the lightning, which doth cease to be\r\n+ Ere one can say, \u0022It lightens.\u0022 Sweet, good-night!\r\n+ This bud of love by summer's ripening breath\r\n+ May prove a beauteous flower when next we meet--\r\n+\r\n+she spoke the words as though they conveyed no meaning to her. It was\r\n+not nervousness. Indeed, so far from being nervous, she was absolutely\r\n+self-contained. It was simply bad art. She was a complete failure.\r\n+\r\n+Even the common uneducated audience of the pit and gallery lost their\r\n+interest in the play. They got restless, and began to talk loudly and\r\n+to whistle. The Jew manager, who was standing at the back of the\r\n+dress-circle, stamped and swore with rage. The only person unmoved was\r\n+the girl herself.\r\n+\r\n+When the second act was over, there came a storm of hisses, and Lord\r\n+Henry got up from his chair and put on his coat. \u0022She is quite\r\n+beautiful, Dorian,\u0022 he said, \u0022but she can't act. Let us go.\u0022\r\n+\r\n+\u0022I am going to see the play through,\u0022 answered the lad, in a hard\r\n+bitter voice. \u0022I am awfully sorry that I have made you waste an\r\n+evening, Harry. I apologize to you both.\u0022\r\n+\r\n+\u0022My dear Dorian, I should think Miss Vane was ill,\u0022 interrupted\r\n+Hallward. \u0022We will come some other night.\u0022\r\n+\r\n+\u0022I wish she were ill,\u0022 he rejoined. \u0022But she seems to me to be simply\r\n+callous and cold. She has entirely altered. Last night she was a\r\n+great artist. This evening she is merely a commonplace mediocre\r\n+actress.\u0022\r\n+\r\n+\u0022Don't talk like that about any one you love, Dorian. Love is a more\r\n+wonderful thing than art.\u0022\r\n+\r\n+\u0022They are both simply forms of imitation,\u0022 remarked Lord Henry. \u0022But\r\n+do let us go. Dorian, you must not stay here any longer. It is not\r\n+good for one's morals to see bad acting. Besides, I don't suppose you\r\n+will want your wife to act, so what does it matter if she plays Juliet\r\n+like a wooden doll? She is very lovely, and if she knows as little\r\n+about life as she does about acting, she will be a delightful\r\n+experience. There are only two kinds of people who are really\r\n+fascinating--people who know absolutely everything, and people who know\r\n+absolutely nothing. Good heavens, my dear boy, don't look so tragic!\r\n+The secret of remaining young is never to have an emotion that is\r\n+unbecoming. Come to the club with Basil and myself. We will smoke\r\n+cigarettes and drink to the beauty of Sibyl Vane. She is beautiful.\r\n+What more can you want?\u0022\r\n+\r\n+\u0022Go away, Harry,\u0022 cried the lad. \u0022I want to be alone. Basil, you must\r\n+go. Ah! can't you see that my heart is breaking?\u0022 The hot tears came\r\n+to his eyes. His lips trembled, and rushing to the back of the box, he\r\n+leaned up against the wall, hiding his face in his hands.\r\n+\r\n+\u0022Let us go, Basil,\u0022 said Lord Henry with a strange tenderness in his\r\n+voice, and the two young men passed out together.\r\n+\r\n+A few moments afterwards the footlights flared up and the curtain rose\r\n+on the third act. Dorian Gray went back to his seat. He looked pale,\r\n+and proud, and indifferent. The play dragged on, and seemed\r\n+interminable. Half of the audience went out, tramping in heavy boots\r\n+and laughing. The whole thing was a _fiasco_. The last act was played\r\n+to almost empty benches. The curtain went down on a titter and some\r\n+groans.\r\n+\r\n+As soon as it was over, Dorian Gray rushed behind the scenes into the\r\n+greenroom. The girl was standing there alone, with a look of triumph\r\n+on her face. Her eyes were lit with an exquisite fire. There was a\r\n+radiance about her. Her parted lips were smiling over some secret of\r\n+their own.\r\n+\r\n+When he entered, she looked at him, and an expression of infinite joy\r\n+came over her. \u0022How badly I acted to-night, Dorian!\u0022 she cried.\r\n+\r\n+\u0022Horribly!\u0022 he answered, gazing at her in amazement. \u0022Horribly! It\r\n+was dreadful. Are you ill? You have no idea what it was. You have no\r\n+idea what I suffered.\u0022\r\n+\r\n+The girl smiled. \u0022Dorian,\u0022 she answered, lingering over his name with\r\n+long-drawn music in her voice, as though it were sweeter than honey to\r\n+the red petals of her mouth. \u0022Dorian, you should have understood. But\r\n+you understand now, don't you?\u0022\r\n+\r\n+\u0022Understand what?\u0022 he asked, angrily.\r\n+\r\n+\u0022Why I was so bad to-night. Why I shall always be bad. Why I shall\r\n+never act well again.\u0022\r\n+\r\n+He shrugged his shoulders. \u0022You are ill, I suppose. When you are ill\r\n+you shouldn't act. You make yourself ridiculous. My friends were\r\n+bored. I was bored.\u0022\r\n+\r\n+She seemed not to listen to him. She was transfigured with joy. An\r\n+ecstasy of happiness dominated her.\r\n+\r\n+\u0022Dorian, Dorian,\u0022 she cried, \u0022before I knew you, acting was the one\r\n+reality of my life. It was only in the theatre that I lived. I\r\n+thought that it was all true. I was Rosalind one night and Portia the\r\n+other. The joy of Beatrice was my joy, and the sorrows of Cordelia\r\n+were mine also. I believed in everything. The common people who acted\r\n+with me seemed to me to be godlike. The painted scenes were my world.\r\n+I knew nothing but shadows, and I thought them real. You came--oh, my\r\n+beautiful love!--and you freed my soul from prison. You taught me what\r\n+reality really is. To-night, for the first time in my life, I saw\r\n+through the hollowness, the sham, the silliness of the empty pageant in\r\n+which I had always played. To-night, for the first time, I became\r\n+conscious that the Romeo was hideous, and old, and painted, that the\r\n+moonlight in the orchard was false, that the scenery was vulgar, and\r\n+that the words I had to speak were unreal, were not my words, were not\r\n+what I wanted to say. You had brought me something higher, something\r\n+of which all art is but a reflection. You had made me understand what\r\n+love really is. My love! My love! Prince Charming! Prince of life!\r\n+I have grown sick of shadows. You are more to me than all art can ever\r\n+be. What have I to do with the puppets of a play? When I came on\r\n+to-night, I could not understand how it was that everything had gone\r\n+from me. I thought that I was going to be wonderful. I found that I\r\n+could do nothing. Suddenly it dawned on my soul what it all meant.\r\n+The knowledge was exquisite to me. I heard them hissing, and I smiled.\r\n+What could they know of love such as ours? Take me away, Dorian--take\r\n+me away with you, where we can be quite alone. I hate the stage. I\r\n+might mimic a passion that I do not feel, but I cannot mimic one that\r\n+burns me like fire. Oh, Dorian, Dorian, you understand now what it\r\n+signifies? Even if I could do it, it would be profanation for me to\r\n+play at being in love. You have made me see that.\u0022\r\n+\r\n+He flung himself down on the sofa and turned away his face. \u0022You have\r\n+killed my love,\u0022 he muttered.\r\n+\r\n+She looked at him in wonder and laughed. He made no answer. She came\r\n+across to him, and with her little fingers stroked his hair. She knelt\r\n+down and pressed his hands to her lips. He drew them away, and a\r\n+shudder ran through him.\r\n+\r\n+Then he leaped up and went to the door. \u0022Yes,\u0022 he cried, \u0022you have\r\n+killed my love. You used to stir my imagination. Now you don't even\r\n+stir my curiosity. You simply produce no effect. I loved you because\r\n+you were marvellous, because you had genius and intellect, because you\r\n+realized the dreams of great poets and gave shape and substance to the\r\n+shadows of art. You have thrown it all away. You are shallow and\r\n+stupid. My God! how mad I was to love you! What a fool I have been!\r\n+You are nothing to me now. I will never see you again. I will never\r\n+think of you. I will never mention your name. You don't know what you\r\n+were to me, once. Why, once ... Oh, I can't bear to think of it! I\r\n+wish I had never laid eyes upon you! You have spoiled the romance of\r\n+my life. How little you can know of love, if you say it mars your art!\r\n+Without your art, you are nothing. I would have made you famous,\r\n+splendid, magnificent. The world would have worshipped you, and you\r\n+would have borne my name. What are you now? A third-rate actress with\r\n+a pretty face.\u0022\r\n+\r\n+The girl grew white, and trembled. She clenched her hands together,\r\n+and her voice seemed to catch in her throat. \u0022You are not serious,\r\n+Dorian?\u0022 she murmured. \u0022You are acting.\u0022\r\n+\r\n+\u0022Acting! I leave that to you. You do it so well,\u0022 he answered\r\n+bitterly.\r\n+\r\n+She rose from her knees and, with a piteous expression of pain in her\r\n+face, came across the room to him. She put her hand upon his arm and\r\n+looked into his eyes. He thrust her back. \u0022Don't touch me!\u0022 he cried.\r\n+\r\n+A low moan broke from her, and she flung herself at his feet and lay\r\n+there like a trampled flower. \u0022Dorian, Dorian, don't leave me!\u0022 she\r\n+whispered. \u0022I am so sorry I didn't act well. I was thinking of you\r\n+all the time. But I will try--indeed, I will try. It came so suddenly\r\n+across me, my love for you. I think I should never have known it if\r\n+you had not kissed me--if we had not kissed each other. Kiss me again,\r\n+my love. Don't go away from me. I couldn't bear it. Oh! don't go\r\n+away from me. My brother ... No; never mind. He didn't mean it. He\r\n+was in jest.... But you, oh! can't you forgive me for to-night? I will\r\n+work so hard and try to improve. Don't be cruel to me, because I love\r\n+you better than anything in the world. After all, it is only once that\r\n+I have not pleased you. But you are quite right, Dorian. I should\r\n+have shown myself more of an artist. It was foolish of me, and yet I\r\n+couldn't help it. Oh, don't leave me, don't leave me.\u0022 A fit of\r\n+passionate sobbing choked her. She crouched on the floor like a\r\n+wounded thing, and Dorian Gray, with his beautiful eyes, looked down at\r\n+her, and his chiselled lips curled in exquisite disdain. There is\r\n+always something ridiculous about the emotions of people whom one has\r\n+ceased to love. Sibyl Vane seemed to him to be absurdly melodramatic.\r\n+Her tears and sobs annoyed him.\r\n+\r\n+\u0022I am going,\u0022 he said at last in his calm clear voice. \u0022I don't wish\r\n+to be unkind, but I can't see you again. You have disappointed me.\u0022\r\n+\r\n+She wept silently, and made no answer, but crept nearer. Her little\r\n+hands stretched blindly out, and appeared to be seeking for him. He\r\n+turned on his heel and left the room. In a few moments he was out of\r\n+the theatre.\r\n+\r\n+Where he went to he hardly knew. He remembered wandering through dimly\r\n+lit streets, past gaunt, black-shadowed archways and evil-looking\r\n+houses. Women with hoarse voices and harsh laughter had called after\r\n+him. Drunkards had reeled by, cursing and chattering to themselves\r\n+like monstrous apes. He had seen grotesque children huddled upon\r\n+door-steps, and heard shrieks and oaths from gloomy courts.\r\n+\r\n+As the dawn was just breaking, he found himself close to Covent Garden.\r\n+The darkness lifted, and, flushed with faint fires, the sky hollowed\r\n+itself into a perfect pearl. Huge carts filled with nodding lilies\r\n+rumbled slowly down the polished empty street. The air was heavy with\r\n+the perfume of the flowers, and their beauty seemed to bring him an\r\n+anodyne for his pain. He followed into the market and watched the men\r\n+unloading their waggons. A white-smocked carter offered him some\r\n+cherries. He thanked him, wondered why he refused to accept any money\r\n+for them, and began to eat them listlessly. They had been plucked at\r\n+midnight, and the coldness of the moon had entered into them. A long\r\n+line of boys carrying crates of striped tulips, and of yellow and red\r\n+roses, defiled in front of him, threading their way through the huge,\r\n+jade-green piles of vegetables. Under the portico, with its grey,\r\n+sun-bleached pillars, loitered a troop of draggled bareheaded girls,\r\n+waiting for the auction to be over. Others crowded round the swinging\r\n+doors of the coffee-house in the piazza. The heavy cart-horses slipped\r\n+and stamped upon the rough stones, shaking their bells and trappings.\r\n+Some of the drivers were lying asleep on a pile of sacks. Iris-necked\r\n+and pink-footed, the pigeons ran about picking up seeds.\r\n+\r\n+After a little while, he hailed a hansom and drove home. For a few\r\n+moments he loitered upon the doorstep, looking round at the silent\r\n+square, with its blank, close-shuttered windows and its staring blinds.\r\n+The sky was pure opal now, and the roofs of the houses glistened like\r\n+silver against it. From some chimney opposite a thin wreath of smoke\r\n+was rising. It curled, a violet riband, through the nacre-coloured air.\r\n+\r\n+In the huge gilt Venetian lantern, spoil of some Doge's barge, that\r\n+hung from the ceiling of the great, oak-panelled hall of entrance,\r\n+lights were still burning from three flickering jets: thin blue petals\r\n+of flame they seemed, rimmed with white fire. He turned them out and,\r\n+having thrown his hat and cape on the table, passed through the library\r\n+towards the door of his bedroom, a large octagonal chamber on the\r\n+ground floor that, in his new-born feeling for luxury, he had just had\r\n+decorated for himself and hung with some curious Renaissance tapestries\r\n+that had been discovered stored in a disused attic at Selby Royal. As\r\n+he was turning the handle of the door, his eye fell upon the portrait\r\n+Basil Hallward had painted of him. He started back as if in surprise.\r\n+Then he went on into his own room, looking somewhat puzzled. After he\r\n+had taken the button-hole out of his coat, he seemed to hesitate.\r\n+Finally, he came back, went over to the picture, and examined it. In\r\n+the dim arrested light that struggled through the cream-coloured silk\r\n+blinds, the face appeared to him to be a little changed. The\r\n+expression looked different. One would have said that there was a\r\n+touch of cruelty in the mouth. It was certainly strange.\r\n+\r\n+He turned round and, walking to the window, drew up the blind. The\r\n+bright dawn flooded the room and swept the fantastic shadows into dusky\r\n+corners, where they lay shuddering. But the strange expression that he\r\n+had noticed in the face of the portrait seemed to linger there, to be\r\n+more intensified even. The quivering ardent sunlight showed him the\r\n+lines of cruelty round the mouth as clearly as if he had been looking\r\n+into a mirror after he had done some dreadful thing.\r\n+\r\n+He winced and, taking up from the table an oval glass framed in ivory\r\n+Cupids, one of Lord Henry's many presents to him, glanced hurriedly\r\n+into its polished depths. No line like that warped his red lips. What\r\n+did it mean?\r\n+\r\n+He rubbed his eyes, and came close to the picture, and examined it\r\n+again. There were no signs of any change when he looked into the\r\n+actual painting, and yet there was no doubt that the whole expression\r\n+had altered. It was not a mere fancy of his own. The thing was\r\n+horribly apparent.\r\n+\r\n+He threw himself into a chair and began to think. Suddenly there\r\n+flashed across his mind what he had said in Basil Hallward's studio the\r\n+day the picture had been finished. Yes, he remembered it perfectly.\r\n+He had uttered a mad wish that he himself might remain young, and the\r\n+portrait grow old; that his own beauty might be untarnished, and the\r\n+face on the canvas bear the burden of his passions and his sins; that\r\n+the painted image might be seared with the lines of suffering and\r\n+thought, and that he might keep all the delicate bloom and loveliness\r\n+of his then just conscious boyhood. Surely his wish had not been\r\n+fulfilled? Such things were impossible. It seemed monstrous even to\r\n+think of them. And, yet, there was the picture before him, with the\r\n+touch of cruelty in the mouth.\r\n+\r\n+Cruelty! Had he been cruel? It was the girl's fault, not his. He had\r\n+dreamed of her as a great artist, had given his love to her because he\r\n+had thought her great. Then she had disappointed him. She had been\r\n+shallow and unworthy. And, yet, a feeling of infinite regret came over\r\n+him, as he thought of her lying at his feet sobbing like a little\r\n+child. He remembered with what callousness he had watched her. Why\r\n+had he been made like that? Why had such a soul been given to him?\r\n+But he had suffered also. During the three terrible hours that the\r\n+play had lasted, he had lived centuries of pain, aeon upon aeon of\r\n+torture. His life was well worth hers. She had marred him for a\r\n+moment, if he had wounded her for an age. Besides, women were better\r\n+suited to bear sorrow than men. They lived on their emotions. They\r\n+only thought of their emotions. When they took lovers, it was merely\r\n+to have some one with whom they could have scenes. Lord Henry had told\r\n+him that, and Lord Henry knew what women were. Why should he trouble\r\n+about Sibyl Vane? She was nothing to him now.\r\n+\r\n+But the picture? What was he to say of that? It held the secret of\r\n+his life, and told his story. It had taught him to love his own\r\n+beauty. Would it teach him to loathe his own soul? Would he ever look\r\n+at it again?\r\n+\r\n+No; it was merely an illusion wrought on the troubled senses. The\r\n+horrible night that he had passed had left phantoms behind it.\r\n+Suddenly there had fallen upon his brain that tiny scarlet speck that\r\n+makes men mad. The picture had not changed. It was folly to think so.\r\n+\r\n+Yet it was watching him, with its beautiful marred face and its cruel\r\n+smile. Its bright hair gleamed in the early sunlight. Its blue eyes\r\n+met his own. A sense of infinite pity, not for himself, but for the\r\n+painted image of himself, came over him. It had altered already, and\r\n+would alter more. Its gold would wither into grey. Its red and white\r\n+roses would die. For every sin that he committed, a stain would fleck\r\n+and wreck its fairness. But he would not sin. The picture, changed or\r\n+unchanged, would be to him the visible emblem of conscience. He would\r\n+resist temptation. He would not see Lord Henry any more--would not, at\r\n+any rate, listen to those subtle poisonous theories that in Basil\r\n+Hallward's garden had first stirred within him the passion for\r\n+impossible things. He would go back to Sibyl Vane, make her amends,\r\n+marry her, try to love her again. Yes, it was his duty to do so. She\r\n+must have suffered more than he had. Poor child! He had been selfish\r\n+and cruel to her. The fascination that she had exercised over him\r\n+would return. They would be happy together. His life with her would\r\n+be beautiful and pure.\r\n+\r\n+He got up from his chair and drew a large screen right in front of the\r\n+portrait, shuddering as he glanced at it. \u0022How horrible!\u0022 he murmured\r\n+to himself, and he walked across to the window and opened it. When he\r\n+stepped out on to the grass, he drew a deep breath. The fresh morning\r\n+air seemed to drive away all his sombre passions. He thought only of\r\n+Sibyl. A faint echo of his love came back to him. He repeated her\r\n+name over and over again. The birds that were singing in the\r\n+dew-drenched garden seemed to be telling the flowers about her.\r\n+\r\n+\r\n+\r\n+CHAPTER 8\r\n+\r\n+It was long past noon when he awoke. His valet had crept several times\r\n+on tiptoe into the room to see if he was stirring, and had wondered\r\n+what made his young master sleep so late. Finally his bell sounded,\r\n+and Victor came in softly with a cup of tea, and a pile of letters, on\r\n+a small tray of old Sevres china, and drew back the olive-satin\r\n+curtains, with their shimmering blue lining, that hung in front of the\r\n+three tall windows.\r\n+\r\n+\u0022Monsieur has well slept this morning,\u0022 he said, smiling.\r\n+\r\n+\u0022What o'clock is it, Victor?\u0022 asked Dorian Gray drowsily.\r\n+\r\n+\u0022One hour and a quarter, Monsieur.\u0022\r\n+\r\n+How late it was! He sat up, and having sipped some tea, turned over\r\n+his letters. One of them was from Lord Henry, and had been brought by\r\n+hand that morning. He hesitated for a moment, and then put it aside.\r\n+The others he opened listlessly. They contained the usual collection\r\n+of cards, invitations to dinner, tickets for private views, programmes\r\n+of charity concerts, and the like that are showered on fashionable\r\n+young men every morning during the season. There was a rather heavy\r\n+bill for a chased silver Louis-Quinze toilet-set that he had not yet\r\n+had the courage to send on to his guardians, who were extremely\r\n+old-fashioned people and did not realize that we live in an age when\r\n+unnecessary things are our only necessities; and there were several\r\n+very courteously worded communications from Jermyn Street money-lenders\r\n+offering to advance any sum of money at a moment's notice and at the\r\n+most reasonable rates of interest.\r\n+\r\n+After about ten minutes he got up, and throwing on an elaborate\r\n+dressing-gown of silk-embroidered cashmere wool, passed into the\r\n+onyx-paved bathroom. The cool water refreshed him after his long\r\n+sleep. He seemed to have forgotten all that he had gone through. A\r\n+dim sense of having taken part in some strange tragedy came to him once\r\n+or twice, but there was the unreality of a dream about it.\r\n+\r\n+As soon as he was dressed, he went into the library and sat down to a\r\n+light French breakfast that had been laid out for him on a small round\r\n+table close to the open window. It was an exquisite day. The warm air\r\n+seemed laden with spices. A bee flew in and buzzed round the\r\n+blue-dragon bowl that, filled with sulphur-yellow roses, stood before\r\n+him. He felt perfectly happy.\r\n+\r\n+Suddenly his eye fell on the screen that he had placed in front of the\r\n+portrait, and he started.\r\n+\r\n+\u0022Too cold for Monsieur?\u0022 asked his valet, putting an omelette on the\r\n+table. \u0022I shut the window?\u0022\r\n+\r\n+Dorian shook his head. \u0022I am not cold,\u0022 he murmured.\r\n+\r\n+Was it all true? Had the portrait really changed? Or had it been\r\n+simply his own imagination that had made him see a look of evil where\r\n+there had been a look of joy? Surely a painted canvas could not alter?\r\n+The thing was absurd. It would serve as a tale to tell Basil some day.\r\n+It would make him smile.\r\n+\r\n+And, yet, how vivid was his recollection of the whole thing! First in\r\n+the dim twilight, and then in the bright dawn, he had seen the touch of\r\n+cruelty round the warped lips. He almost dreaded his valet leaving the\r\n+room. He knew that when he was alone he would have to examine the\r\n+portrait. He was afraid of certainty. When the coffee and cigarettes\r\n+had been brought and the man turned to go, he felt a wild desire to\r\n+tell him to remain. As the door was closing behind him, he called him\r\n+back. The man stood waiting for his orders. Dorian looked at him for\r\n+a moment. \u0022I am not at home to any one, Victor,\u0022 he said with a sigh.\r\n+The man bowed and retired.\r\n+\r\n+Then he rose from the table, lit a cigarette, and flung himself down on\r\n+a luxuriously cushioned couch that stood facing the screen. The screen\r\n+was an old one, of gilt Spanish leather, stamped and wrought with a\r\n+rather florid Louis-Quatorze pattern. He scanned it curiously,\r\n+wondering if ever before it had concealed the secret of a man's life.\r\n+\r\n+Should he move it aside, after all? Why not let it stay there? What\r\n+was the use of knowing? If the thing was true, it was terrible. If it\r\n+was not true, why trouble about it? But what if, by some fate or\r\n+deadlier chance, eyes other than his spied behind and saw the horrible\r\n+change? What should he do if Basil Hallward came and asked to look at\r\n+his own picture? Basil would be sure to do that. No; the thing had to\r\n+be examined, and at once. Anything would be better than this dreadful\r\n+state of doubt.\r\n+\r\n+He got up and locked both doors. At least he would be alone when he\r\n+looked upon the mask of his shame. Then he drew the screen aside and\r\n+saw himself face to face. It was perfectly true. The portrait had\r\n+altered.\r\n+\r\n+As he often remembered afterwards, and always with no small wonder, he\r\n+found himself at first gazing at the portrait with a feeling of almost\r\n+scientific interest. That such a change should have taken place was\r\n+incredible to him. And yet it was a fact. Was there some subtle\r\n+affinity between the chemical atoms that shaped themselves into form\r\n+and colour on the canvas and the soul that was within him? Could it be\r\n+that what that soul thought, they realized?--that what it dreamed, they\r\n+made true? Or was there some other, more terrible reason? He\r\n+shuddered, and felt afraid, and, going back to the couch, lay there,\r\n+gazing at the picture in sickened horror.\r\n+\r\n+One thing, however, he felt that it had done for him. It had made him\r\n+conscious how unjust, how cruel, he had been to Sibyl Vane. It was not\r\n+too late to make reparation for that. She could still be his wife.\r\n+His unreal and selfish love would yield to some higher influence, would\r\n+be transformed into some nobler passion, and the portrait that Basil\r\n+Hallward had painted of him would be a guide to him through life, would\r\n+be to him what holiness is to some, and conscience to others, and the\r\n+fear of God to us all. There were opiates for remorse, drugs that\r\n+could lull the moral sense to sleep. But here was a visible symbol of\r\n+the degradation of sin. Here was an ever-present sign of the ruin men\r\n+brought upon their souls.\r\n+\r\n+Three o'clock struck, and four, and the half-hour rang its double\r\n+chime, but Dorian Gray did not stir. He was trying to gather up the\r\n+scarlet threads of life and to weave them into a pattern; to find his\r\n+way through the sanguine labyrinth of passion through which he was\r\n+wandering. He did not know what to do, or what to think. Finally, he\r\n+went over to the table and wrote a passionate letter to the girl he had\r\n+loved, imploring her forgiveness and accusing himself of madness. He\r\n+covered page after page with wild words of sorrow and wilder words of\r\n+pain. There is a luxury in self-reproach. When we blame ourselves, we\r\n+feel that no one else has a right to blame us. It is the confession,\r\n+not the priest, that gives us absolution. When Dorian had finished the\r\n+letter, he felt that he had been forgiven.\r\n+\r\n+Suddenly there came a knock to the door, and he heard Lord Henry's\r\n+voice outside. \u0022My dear boy, I must see you. Let me in at once. I\r\n+can't bear your shutting yourself up like this.\u0022\r\n+\r\n+He made no answer at first, but remained quite still. The knocking\r\n+still continued and grew louder. Yes, it was better to let Lord Henry\r\n+in, and to explain to him the new life he was going to lead, to quarrel\r\n+with him if it became necessary to quarrel, to part if parting was\r\n+inevitable. He jumped up, drew the screen hastily across the picture,\r\n+and unlocked the door.\r\n+\r\n+\u0022I am so sorry for it all, Dorian,\u0022 said Lord Henry as he entered.\r\n+\u0022But you must not think too much about it.\u0022\r\n+\r\n+\u0022Do you mean about Sibyl Vane?\u0022 asked the lad.\r\n+\r\n+\u0022Yes, of course,\u0022 answered Lord Henry, sinking into a chair and slowly\r\n+pulling off his yellow gloves. \u0022It is dreadful, from one point of\r\n+view, but it was not your fault. Tell me, did you go behind and see\r\n+her, after the play was over?\u0022\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022I felt sure you had. Did you make a scene with her?\u0022\r\n+\r\n+\u0022I was brutal, Harry--perfectly brutal. But it is all right now. I am\r\n+not sorry for anything that has happened. It has taught me to know\r\n+myself better.\u0022\r\n+\r\n+\u0022Ah, Dorian, I am so glad you take it in that way! I was afraid I\r\n+would find you plunged in remorse and tearing that nice curly hair of\r\n+yours.\u0022\r\n+\r\n+\u0022I have got through all that,\u0022 said Dorian, shaking his head and\r\n+smiling. \u0022I am perfectly happy now. I know what conscience is, to\r\n+begin with. It is not what you told me it was. It is the divinest\r\n+thing in us. Don't sneer at it, Harry, any more--at least not before\r\n+me. I want to be good. I can't bear the idea of my soul being\r\n+hideous.\u0022\r\n+\r\n+\u0022A very charming artistic basis for ethics, Dorian! I congratulate you\r\n+on it. But how are you going to begin?\u0022\r\n+\r\n+\u0022By marrying Sibyl Vane.\u0022\r\n+\r\n+\u0022Marrying Sibyl Vane!\u0022 cried Lord Henry, standing up and looking at him\r\n+in perplexed amazement. \u0022But, my dear Dorian--\u0022\r\n+\r\n+\u0022Yes, Harry, I know what you are going to say. Something dreadful\r\n+about marriage. Don't say it. Don't ever say things of that kind to\r\n+me again. Two days ago I asked Sibyl to marry me. I am not going to\r\n+break my word to her. She is to be my wife.\u0022\r\n+\r\n+\u0022Your wife! Dorian! ... Didn't you get my letter? I wrote to you this\r\n+morning, and sent the note down by my own man.\u0022\r\n+\r\n+\u0022Your letter? Oh, yes, I remember. I have not read it yet, Harry. I\r\n+was afraid there might be something in it that I wouldn't like. You\r\n+cut life to pieces with your epigrams.\u0022\r\n+\r\n+\u0022You know nothing then?\u0022\r\n+\r\n+\u0022What do you mean?\u0022\r\n+\r\n+Lord Henry walked across the room, and sitting down by Dorian Gray,\r\n+took both his hands in his own and held them tightly. \u0022Dorian,\u0022 he\r\n+said, \u0022my letter--don't be frightened--was to tell you that Sibyl Vane\r\n+is dead.\u0022\r\n+\r\n+A cry of pain broke from the lad's lips, and he leaped to his feet,\r\n+tearing his hands away from Lord Henry's grasp. \u0022Dead! Sibyl dead!\r\n+It is not true! It is a horrible lie! How dare you say it?\u0022\r\n+\r\n+\u0022It is quite true, Dorian,\u0022 said Lord Henry, gravely. \u0022It is in all\r\n+the morning papers. I wrote down to you to ask you not to see any one\r\n+till I came. There will have to be an inquest, of course, and you must\r\n+not be mixed up in it. Things like that make a man fashionable in\r\n+Paris. But in London people are so prejudiced. Here, one should never\r\n+make one's _debut_ with a scandal. One should reserve that to give an\r\n+interest to one's old age. I suppose they don't know your name at the\r\n+theatre? If they don't, it is all right. Did any one see you going\r\n+round to her room? That is an important point.\u0022\r\n+\r\n+Dorian did not answer for a few moments. He was dazed with horror.\r\n+Finally he stammered, in a stifled voice, \u0022Harry, did you say an\r\n+inquest? What did you mean by that? Did Sibyl--? Oh, Harry, I can't\r\n+bear it! But be quick. Tell me everything at once.\u0022\r\n+\r\n+\u0022I have no doubt it was not an accident, Dorian, though it must be put\r\n+in that way to the public. It seems that as she was leaving the\r\n+theatre with her mother, about half-past twelve or so, she said she had\r\n+forgotten something upstairs. They waited some time for her, but she\r\n+did not come down again. They ultimately found her lying dead on the\r\n+floor of her dressing-room. She had swallowed something by mistake,\r\n+some dreadful thing they use at theatres. I don't know what it was,\r\n+but it had either prussic acid or white lead in it. I should fancy it\r\n+was prussic acid, as she seems to have died instantaneously.\u0022\r\n+\r\n+\u0022Harry, Harry, it is terrible!\u0022 cried the lad.\r\n+\r\n+\u0022Yes; it is very tragic, of course, but you must not get yourself mixed\r\n+up in it. I see by _The Standard_ that she was seventeen. I should have\r\n+thought she was almost younger than that. She looked such a child, and\r\n+seemed to know so little about acting. Dorian, you mustn't let this\r\n+thing get on your nerves. You must come and dine with me, and\r\n+afterwards we will look in at the opera. It is a Patti night, and\r\n+everybody will be there. You can come to my sister's box. She has got\r\n+some smart women with her.\u0022\r\n+\r\n+\u0022So I have murdered Sibyl Vane,\u0022 said Dorian Gray, half to himself,\r\n+\u0022murdered her as surely as if I had cut her little throat with a knife.\r\n+Yet the roses are not less lovely for all that. The birds sing just as\r\n+happily in my garden. And to-night I am to dine with you, and then go\r\n+on to the opera, and sup somewhere, I suppose, afterwards. How\r\n+extraordinarily dramatic life is! If I had read all this in a book,\r\n+Harry, I think I would have wept over it. Somehow, now that it has\r\n+happened actually, and to me, it seems far too wonderful for tears.\r\n+Here is the first passionate love-letter I have ever written in my\r\n+life. Strange, that my first passionate love-letter should have been\r\n+addressed to a dead girl. Can they feel, I wonder, those white silent\r\n+people we call the dead? Sibyl! Can she feel, or know, or listen?\r\n+Oh, Harry, how I loved her once! It seems years ago to me now. She\r\n+was everything to me. Then came that dreadful night--was it really\r\n+only last night?--when she played so badly, and my heart almost broke.\r\n+She explained it all to me. It was terribly pathetic. But I was not\r\n+moved a bit. I thought her shallow. Suddenly something happened that\r\n+made me afraid. I can't tell you what it was, but it was terrible. I\r\n+said I would go back to her. I felt I had done wrong. And now she is\r\n+dead. My God! My God! Harry, what shall I do? You don't know the\r\n+danger I am in, and there is nothing to keep me straight. She would\r\n+have done that for me. She had no right to kill herself. It was\r\n+selfish of her.\u0022\r\n+\r\n+\u0022My dear Dorian,\u0022 answered Lord Henry, taking a cigarette from his case\r\n+and producing a gold-latten matchbox, \u0022the only way a woman can ever\r\n+reform a man is by boring him so completely that he loses all possible\r\n+interest in life. If you had married this girl, you would have been\r\n+wretched. Of course, you would have treated her kindly. One can\r\n+always be kind to people about whom one cares nothing. But she would\r\n+have soon found out that you were absolutely indifferent to her. And\r\n+when a woman finds that out about her husband, she either becomes\r\n+dreadfully dowdy, or wears very smart bonnets that some other woman's\r\n+husband has to pay for. I say nothing about the social mistake, which\r\n+would have been abject--which, of course, I would not have allowed--but\r\n+I assure you that in any case the whole thing would have been an\r\n+absolute failure.\u0022\r\n+\r\n+\u0022I suppose it would,\u0022 muttered the lad, walking up and down the room\r\n+and looking horribly pale. \u0022But I thought it was my duty. It is not\r\n+my fault that this terrible tragedy has prevented my doing what was\r\n+right. I remember your saying once that there is a fatality about good\r\n+resolutions--that they are always made too late. Mine certainly were.\u0022\r\n+\r\n+\u0022Good resolutions are useless attempts to interfere with scientific\r\n+laws. Their origin is pure vanity. Their result is absolutely _nil_.\r\n+They give us, now and then, some of those luxurious sterile emotions\r\n+that have a certain charm for the weak. That is all that can be said\r\n+for them. They are simply cheques that men draw on a bank where they\r\n+have no account.\u0022\r\n+\r\n+\u0022Harry,\u0022 cried Dorian Gray, coming over and sitting down beside him,\r\n+\u0022why is it that I cannot feel this tragedy as much as I want to? I\r\n+don't think I am heartless. Do you?\u0022\r\n+\r\n+\u0022You have done too many foolish things during the last fortnight to be\r\n+entitled to give yourself that name, Dorian,\u0022 answered Lord Henry with\r\n+his sweet melancholy smile.\r\n+\r\n+The lad frowned. \u0022I don't like that explanation, Harry,\u0022 he rejoined,\r\n+\u0022but I am glad you don't think I am heartless. I am nothing of the\r\n+kind. I know I am not. And yet I must admit that this thing that has\r\n+happened does not affect me as it should. It seems to me to be simply\r\n+like a wonderful ending to a wonderful play. It has all the terrible\r\n+beauty of a Greek tragedy, a tragedy in which I took a great part, but\r\n+by which I have not been wounded.\u0022\r\n+\r\n+\u0022It is an interesting question,\u0022 said Lord Henry, who found an\r\n+exquisite pleasure in playing on the lad's unconscious egotism, \u0022an\r\n+extremely interesting question. I fancy that the true explanation is\r\n+this: It often happens that the real tragedies of life occur in such\r\n+an inartistic manner that they hurt us by their crude violence, their\r\n+absolute incoherence, their absurd want of meaning, their entire lack\r\n+of style. They affect us just as vulgarity affects us. They give us\r\n+an impression of sheer brute force, and we revolt against that.\r\n+Sometimes, however, a tragedy that possesses artistic elements of\r\n+beauty crosses our lives. If these elements of beauty are real, the\r\n+whole thing simply appeals to our sense of dramatic effect. Suddenly\r\n+we find that we are no longer the actors, but the spectators of the\r\n+play. Or rather we are both. We watch ourselves, and the mere wonder\r\n+of the spectacle enthralls us. In the present case, what is it that\r\n+has really happened? Some one has killed herself for love of you. I\r\n+wish that I had ever had such an experience. It would have made me in\r\n+love with love for the rest of my life. The people who have adored\r\n+me--there have not been very many, but there have been some--have\r\n+always insisted on living on, long after I had ceased to care for them,\r\n+or they to care for me. They have become stout and tedious, and when I\r\n+meet them, they go in at once for reminiscences. That awful memory of\r\n+woman! What a fearful thing it is! And what an utter intellectual\r\n+stagnation it reveals! One should absorb the colour of life, but one\r\n+should never remember its details. Details are always vulgar.\u0022\r\n+\r\n+\u0022I must sow poppies in my garden,\u0022 sighed Dorian.\r\n+\r\n+\u0022There is no necessity,\u0022 rejoined his companion. \u0022Life has always\r\n+poppies in her hands. Of course, now and then things linger. I once\r\n+wore nothing but violets all through one season, as a form of artistic\r\n+mourning for a romance that would not die. Ultimately, however, it did\r\n+die. I forget what killed it. I think it was her proposing to\r\n+sacrifice the whole world for me. That is always a dreadful moment.\r\n+It fills one with the terror of eternity. Well--would you believe\r\n+it?--a week ago, at Lady Hampshire's, I found myself seated at dinner\r\n+next the lady in question, and she insisted on going over the whole\r\n+thing again, and digging up the past, and raking up the future. I had\r\n+buried my romance in a bed of asphodel. She dragged it out again and\r\n+assured me that I had spoiled her life. I am bound to state that she\r\n+ate an enormous dinner, so I did not feel any anxiety. But what a lack\r\n+of taste she showed! The one charm of the past is that it is the past.\r\n+But women never know when the curtain has fallen. They always want a\r\n+sixth act, and as soon as the interest of the play is entirely over,\r\n+they propose to continue it. If they were allowed their own way, every\r\n+comedy would have a tragic ending, and every tragedy would culminate in\r\n+a farce. They are charmingly artificial, but they have no sense of\r\n+art. You are more fortunate than I am. I assure you, Dorian, that not\r\n+one of the women I have known would have done for me what Sibyl Vane\r\n+did for you. Ordinary women always console themselves. Some of them\r\n+do it by going in for sentimental colours. Never trust a woman who\r\n+wears mauve, whatever her age may be, or a woman over thirty-five who\r\n+is fond of pink ribbons. It always means that they have a history.\r\n+Others find a great consolation in suddenly discovering the good\r\n+qualities of their husbands. They flaunt their conjugal felicity in\r\n+one's face, as if it were the most fascinating of sins. Religion\r\n+consoles some. Its mysteries have all the charm of a flirtation, a\r\n+woman once told me, and I can quite understand it. Besides, nothing\r\n+makes one so vain as being told that one is a sinner. Conscience makes\r\n+egotists of us all. Yes; there is really no end to the consolations\r\n+that women find in modern life. Indeed, I have not mentioned the most\r\n+important one.\u0022\r\n+\r\n+\u0022What is that, Harry?\u0022 said the lad listlessly.\r\n+\r\n+\u0022Oh, the obvious consolation. Taking some one else's admirer when one\r\n+loses one's own. In good society that always whitewashes a woman. But\r\n+really, Dorian, how different Sibyl Vane must have been from all the\r\n+women one meets! There is something to me quite beautiful about her\r\n+death. I am glad I am living in a century when such wonders happen.\r\n+They make one believe in the reality of the things we all play with,\r\n+such as romance, passion, and love.\u0022\r\n+\r\n+\u0022I was terribly cruel to her. You forget that.\u0022\r\n+\r\n+\u0022I am afraid that women appreciate cruelty, downright cruelty, more\r\n+than anything else. They have wonderfully primitive instincts. We\r\n+have emancipated them, but they remain slaves looking for their\r\n+masters, all the same. They love being dominated. I am sure you were\r\n+splendid. I have never seen you really and absolutely angry, but I can\r\n+fancy how delightful you looked. And, after all, you said something to\r\n+me the day before yesterday that seemed to me at the time to be merely\r\n+fanciful, but that I see now was absolutely true, and it holds the key\r\n+to everything.\u0022\r\n+\r\n+\u0022What was that, Harry?\u0022\r\n+\r\n+\u0022You said to me that Sibyl Vane represented to you all the heroines of\r\n+romance--that she was Desdemona one night, and Ophelia the other; that\r\n+if she died as Juliet, she came to life as Imogen.\u0022\r\n+\r\n+\u0022She will never come to life again now,\u0022 muttered the lad, burying his\r\n+face in his hands.\r\n+\r\n+\u0022No, she will never come to life. She has played her last part. But\r\n+you must think of that lonely death in the tawdry dressing-room simply\r\n+as a strange lurid fragment from some Jacobean tragedy, as a wonderful\r\n+scene from Webster, or Ford, or Cyril Tourneur. The girl never really\r\n+lived, and so she has never really died. To you at least she was\r\n+always a dream, a phantom that flitted through Shakespeare's plays and\r\n+left them lovelier for its presence, a reed through which Shakespeare's\r\n+music sounded richer and more full of joy. The moment she touched\r\n+actual life, she marred it, and it marred her, and so she passed away.\r\n+Mourn for Ophelia, if you like. Put ashes on your head because\r\n+Cordelia was strangled. Cry out against Heaven because the daughter of\r\n+Brabantio died. But don't waste your tears over Sibyl Vane. She was\r\n+less real than they are.\u0022\r\n+\r\n+There was a silence. The evening darkened in the room. Noiselessly,\r\n+and with silver feet, the shadows crept in from the garden. The\r\n+colours faded wearily out of things.\r\n+\r\n+After some time Dorian Gray looked up. \u0022You have explained me to\r\n+myself, Harry,\u0022 he murmured with something of a sigh of relief. \u0022I\r\n+felt all that you have said, but somehow I was afraid of it, and I\r\n+could not express it to myself. How well you know me! But we will not\r\n+talk again of what has happened. It has been a marvellous experience.\r\n+That is all. I wonder if life has still in store for me anything as\r\n+marvellous.\u0022\r\n+\r\n+\u0022Life has everything in store for you, Dorian. There is nothing that\r\n+you, with your extraordinary good looks, will not be able to do.\u0022\r\n+\r\n+\u0022But suppose, Harry, I became haggard, and old, and wrinkled? What\r\n+then?\u0022\r\n+\r\n+\u0022Ah, then,\u0022 said Lord Henry, rising to go, \u0022then, my dear Dorian, you\r\n+would have to fight for your victories. As it is, they are brought to\r\n+you. No, you must keep your good looks. We live in an age that reads\r\n+too much to be wise, and that thinks too much to be beautiful. We\r\n+cannot spare you. And now you had better dress and drive down to the\r\n+club. We are rather late, as it is.\u0022\r\n+\r\n+\u0022I think I shall join you at the opera, Harry. I feel too tired to eat\r\n+anything. What is the number of your sister's box?\u0022\r\n+\r\n+\u0022Twenty-seven, I believe. It is on the grand tier. You will see her\r\n+name on the door. But I am sorry you won't come and dine.\u0022\r\n+\r\n+\u0022I don't feel up to it,\u0022 said Dorian listlessly. \u0022But I am awfully\r\n+obliged to you for all that you have said to me. You are certainly my\r\n+best friend. No one has ever understood me as you have.\u0022\r\n+\r\n+\u0022We are only at the beginning of our friendship, Dorian,\u0022 answered Lord\r\n+Henry, shaking him by the hand. \u0022Good-bye. I shall see you before\r\n+nine-thirty, I hope. Remember, Patti is singing.\u0022\r\n+\r\n+As he closed the door behind him, Dorian Gray touched the bell, and in\r\n+a few minutes Victor appeared with the lamps and drew the blinds down.\r\n+He waited impatiently for him to go. The man seemed to take an\r\n+interminable time over everything.\r\n+\r\n+As soon as he had left, he rushed to the screen and drew it back. No;\r\n+there was no further change in the picture. It had received the news\r\n+of Sibyl Vane's death before he had known of it himself. It was\r\n+conscious of the events of life as they occurred. The vicious cruelty\r\n+that marred the fine lines of the mouth had, no doubt, appeared at the\r\n+very moment that the girl had drunk the poison, whatever it was. Or\r\n+was it indifferent to results? Did it merely take cognizance of what\r\n+passed within the soul? He wondered, and hoped that some day he would\r\n+see the change taking place before his very eyes, shuddering as he\r\n+hoped it.\r\n+\r\n+Poor Sibyl! What a romance it had all been! She had often mimicked\r\n+death on the stage. Then Death himself had touched her and taken her\r\n+with him. How had she played that dreadful last scene? Had she cursed\r\n+him, as she died? No; she had died for love of him, and love would\r\n+always be a sacrament to him now. She had atoned for everything by the\r\n+sacrifice she had made of her life. He would not think any more of\r\n+what she had made him go through, on that horrible night at the\r\n+theatre. When he thought of her, it would be as a wonderful tragic\r\n+figure sent on to the world's stage to show the supreme reality of\r\n+love. A wonderful tragic figure? Tears came to his eyes as he\r\n+remembered her childlike look, and winsome fanciful ways, and shy\r\n+tremulous grace. He brushed them away hastily and looked again at the\r\n+picture.\r\n+\r\n+He felt that the time had really come for making his choice. Or had\r\n+his choice already been made? Yes, life had decided that for\r\n+him--life, and his own infinite curiosity about life. Eternal youth,\r\n+infinite passion, pleasures subtle and secret, wild joys and wilder\r\n+sins--he was to have all these things. The portrait was to bear the\r\n+burden of his shame: that was all.\r\n+\r\n+A feeling of pain crept over him as he thought of the desecration that\r\n+was in store for the fair face on the canvas. Once, in boyish mockery\r\n+of Narcissus, he had kissed, or feigned to kiss, those painted lips\r\n+that now smiled so cruelly at him. Morning after morning he had sat\r\n+before the portrait wondering at its beauty, almost enamoured of it, as\r\n+it seemed to him at times. Was it to alter now with every mood to\r\n+which he yielded? Was it to become a monstrous and loathsome thing, to\r\n+be hidden away in a locked room, to be shut out from the sunlight that\r\n+had so often touched to brighter gold the waving wonder of its hair?\r\n+The pity of it! the pity of it!\r\n+\r\n+For a moment, he thought of praying that the horrible sympathy that\r\n+existed between him and the picture might cease. It had changed in\r\n+answer to a prayer; perhaps in answer to a prayer it might remain\r\n+unchanged. And yet, who, that knew anything about life, would\r\n+surrender the chance of remaining always young, however fantastic that\r\n+chance might be, or with what fateful consequences it might be fraught?\r\n+Besides, was it really under his control? Had it indeed been prayer\r\n+that had produced the substitution? Might there not be some curious\r\n+scientific reason for it all? If thought could exercise its influence\r\n+upon a living organism, might not thought exercise an influence upon\r\n+dead and inorganic things? Nay, without thought or conscious desire,\r\n+might not things external to ourselves vibrate in unison with our moods\r\n+and passions, atom calling to atom in secret love or strange affinity?\r\n+But the reason was of no importance. He would never again tempt by a\r\n+prayer any terrible power. If the picture was to alter, it was to\r\n+alter. That was all. Why inquire too closely into it?\r\n+\r\n+For there would be a real pleasure in watching it. He would be able to\r\n+follow his mind into its secret places. This portrait would be to him\r\n+the most magical of mirrors. As it had revealed to him his own body,\r\n+so it would reveal to him his own soul. And when winter came upon it,\r\n+he would still be standing where spring trembles on the verge of\r\n+summer. When the blood crept from its face, and left behind a pallid\r\n+mask of chalk with leaden eyes, he would keep the glamour of boyhood.\r\n+Not one blossom of his loveliness would ever fade. Not one pulse of\r\n+his life would ever weaken. Like the gods of the Greeks, he would be\r\n+strong, and fleet, and joyous. What did it matter what happened to the\r\n+coloured image on the canvas? He would be safe. That was everything.\r\n+\r\n+He drew the screen back into its former place in front of the picture,\r\n+smiling as he did so, and passed into his bedroom, where his valet was\r\n+already waiting for him. An hour later he was at the opera, and Lord\r\n+Henry was leaning over his chair.\r\n+\r\n+\r\n+\r\n+CHAPTER 9\r\n+\r\n+As he was sitting at breakfast next morning, Basil Hallward was shown\r\n+into the room.\r\n+\r\n+\u0022I am so glad I have found you, Dorian,\u0022 he said gravely. \u0022I called\r\n+last night, and they told me you were at the opera. Of course, I knew\r\n+that was impossible. But I wish you had left word where you had really\r\n+gone to. I passed a dreadful evening, half afraid that one tragedy\r\n+might be followed by another. I think you might have telegraphed for\r\n+me when you heard of it first. I read of it quite by chance in a late\r\n+edition of _The Globe_ that I picked up at the club. I came here at once\r\n+and was miserable at not finding you. I can't tell you how\r\n+heart-broken I am about the whole thing. I know what you must suffer.\r\n+But where were you? Did you go down and see the girl's mother? For a\r\n+moment I thought of following you there. They gave the address in the\r\n+paper. Somewhere in the Euston Road, isn't it? But I was afraid of\r\n+intruding upon a sorrow that I could not lighten. Poor woman! What a\r\n+state she must be in! And her only child, too! What did she say about\r\n+it all?\u0022\r\n+\r\n+\u0022My dear Basil, how do I know?\u0022 murmured Dorian Gray, sipping some\r\n+pale-yellow wine from a delicate, gold-beaded bubble of Venetian glass\r\n+and looking dreadfully bored. \u0022I was at the opera. You should have\r\n+come on there. I met Lady Gwendolen, Harry's sister, for the first\r\n+time. We were in her box. She is perfectly charming; and Patti sang\r\n+divinely. Don't talk about horrid subjects. If one doesn't talk about\r\n+a thing, it has never happened. It is simply expression, as Harry\r\n+says, that gives reality to things. I may mention that she was not the\r\n+woman's only child. There is a son, a charming fellow, I believe. But\r\n+he is not on the stage. He is a sailor, or something. And now, tell\r\n+me about yourself and what you are painting.\u0022\r\n+\r\n+\u0022You went to the opera?\u0022 said Hallward, speaking very slowly and with a\r\n+strained touch of pain in his voice. \u0022You went to the opera while\r\n+Sibyl Vane was lying dead in some sordid lodging? You can talk to me\r\n+of other women being charming, and of Patti singing divinely, before\r\n+the girl you loved has even the quiet of a grave to sleep in? Why,\r\n+man, there are horrors in store for that little white body of hers!\u0022\r\n+\r\n+\u0022Stop, Basil! I won't hear it!\u0022 cried Dorian, leaping to his feet.\r\n+\u0022You must not tell me about things. What is done is done. What is\r\n+past is past.\u0022\r\n+\r\n+\u0022You call yesterday the past?\u0022\r\n+\r\n+\u0022What has the actual lapse of time got to do with it? It is only\r\n+shallow people who require years to get rid of an emotion. A man who\r\n+is master of himself can end a sorrow as easily as he can invent a\r\n+pleasure. I don't want to be at the mercy of my emotions. I want to\r\n+use them, to enjoy them, and to dominate them.\u0022\r\n+\r\n+\u0022Dorian, this is horrible! Something has changed you completely. You\r\n+look exactly the same wonderful boy who, day after day, used to come\r\n+down to my studio to sit for his picture. But you were simple,\r\n+natural, and affectionate then. You were the most unspoiled creature\r\n+in the whole world. Now, I don't know what has come over you. You\r\n+talk as if you had no heart, no pity in you. It is all Harry's\r\n+influence. I see that.\u0022\r\n+\r\n+The lad flushed up and, going to the window, looked out for a few\r\n+moments on the green, flickering, sun-lashed garden. \u0022I owe a great\r\n+deal to Harry, Basil,\u0022 he said at last, \u0022more than I owe to you. You\r\n+only taught me to be vain.\u0022\r\n+\r\n+\u0022Well, I am punished for that, Dorian--or shall be some day.\u0022\r\n+\r\n+\u0022I don't know what you mean, Basil,\u0022 he exclaimed, turning round. \u0022I\r\n+don't know what you want. What do you want?\u0022\r\n+\r\n+\u0022I want the Dorian Gray I used to paint,\u0022 said the artist sadly.\r\n+\r\n+\u0022Basil,\u0022 said the lad, going over to him and putting his hand on his\r\n+shoulder, \u0022you have come too late. Yesterday, when I heard that Sibyl\r\n+Vane had killed herself--\u0022\r\n+\r\n+\u0022Killed herself! Good heavens! is there no doubt about that?\u0022 cried\r\n+Hallward, looking up at him with an expression of horror.\r\n+\r\n+\u0022My dear Basil! Surely you don't think it was a vulgar accident? Of\r\n+course she killed herself.\u0022\r\n+\r\n+The elder man buried his face in his hands. \u0022How fearful,\u0022 he\r\n+muttered, and a shudder ran through him.\r\n+\r\n+\u0022No,\u0022 said Dorian Gray, \u0022there is nothing fearful about it. It is one\r\n+of the great romantic tragedies of the age. As a rule, people who act\r\n+lead the most commonplace lives. They are good husbands, or faithful\r\n+wives, or something tedious. You know what I mean--middle-class virtue\r\n+and all that kind of thing. How different Sibyl was! She lived her\r\n+finest tragedy. She was always a heroine. The last night she\r\n+played--the night you saw her--she acted badly because she had known\r\n+the reality of love. When she knew its unreality, she died, as Juliet\r\n+might have died. She passed again into the sphere of art. There is\r\n+something of the martyr about her. Her death has all the pathetic\r\n+uselessness of martyrdom, all its wasted beauty. But, as I was saying,\r\n+you must not think I have not suffered. If you had come in yesterday\r\n+at a particular moment--about half-past five, perhaps, or a quarter to\r\n+six--you would have found me in tears. Even Harry, who was here, who\r\n+brought me the news, in fact, had no idea what I was going through. I\r\n+suffered immensely. Then it passed away. I cannot repeat an emotion.\r\n+No one can, except sentimentalists. And you are awfully unjust, Basil.\r\n+You come down here to console me. That is charming of you. You find\r\n+me consoled, and you are furious. How like a sympathetic person! You\r\n+remind me of a story Harry told me about a certain philanthropist who\r\n+spent twenty years of his life in trying to get some grievance\r\n+redressed, or some unjust law altered--I forget exactly what it was.\r\n+Finally he succeeded, and nothing could exceed his disappointment. He\r\n+had absolutely nothing to do, almost died of _ennui_, and became a\r\n+confirmed misanthrope. And besides, my dear old Basil, if you really\r\n+want to console me, teach me rather to forget what has happened, or to\r\n+see it from a proper artistic point of view. Was it not Gautier who\r\n+used to write about _la consolation des arts_? I remember picking up a\r\n+little vellum-covered book in your studio one day and chancing on that\r\n+delightful phrase. Well, I am not like that young man you told me of\r\n+when we were down at Marlow together, the young man who used to say\r\n+that yellow satin could console one for all the miseries of life. I\r\n+love beautiful things that one can touch and handle. Old brocades,\r\n+green bronzes, lacquer-work, carved ivories, exquisite surroundings,\r\n+luxury, pomp--there is much to be got from all these. But the artistic\r\n+temperament that they create, or at any rate reveal, is still more to\r\n+me. To become the spectator of one's own life, as Harry says, is to\r\n+escape the suffering of life. I know you are surprised at my talking\r\n+to you like this. You have not realized how I have developed. I was a\r\n+schoolboy when you knew me. I am a man now. I have new passions, new\r\n+thoughts, new ideas. I am different, but you must not like me less. I\r\n+am changed, but you must always be my friend. Of course, I am very\r\n+fond of Harry. But I know that you are better than he is. You are not\r\n+stronger--you are too much afraid of life--but you are better. And how\r\n+happy we used to be together! Don't leave me, Basil, and don't quarrel\r\n+with me. I am what I am. There is nothing more to be said.\u0022\r\n+\r\n+The painter felt strangely moved. The lad was infinitely dear to him,\r\n+and his personality had been the great turning point in his art. He\r\n+could not bear the idea of reproaching him any more. After all, his\r\n+indifference was probably merely a mood that would pass away. There\r\n+was so much in him that was good, so much in him that was noble.\r\n+\r\n+\u0022Well, Dorian,\u0022 he said at length, with a sad smile, \u0022I won't speak to\r\n+you again about this horrible thing, after to-day. I only trust your\r\n+name won't be mentioned in connection with it. The inquest is to take\r\n+place this afternoon. Have they summoned you?\u0022\r\n+\r\n+Dorian shook his head, and a look of annoyance passed over his face at\r\n+the mention of the word \u0022inquest.\u0022 There was something so crude and\r\n+vulgar about everything of the kind. \u0022They don't know my name,\u0022 he\r\n+answered.\r\n+\r\n+\u0022But surely she did?\u0022\r\n+\r\n+\u0022Only my Christian name, and that I am quite sure she never mentioned\r\n+to any one. She told me once that they were all rather curious to\r\n+learn who I was, and that she invariably told them my name was Prince\r\n+Charming. It was pretty of her. You must do me a drawing of Sibyl,\r\n+Basil. I should like to have something more of her than the memory of\r\n+a few kisses and some broken pathetic words.\u0022\r\n+\r\n+\u0022I will try and do something, Dorian, if it would please you. But you\r\n+must come and sit to me yourself again. I can't get on without you.\u0022\r\n+\r\n+\u0022I can never sit to you again, Basil. It is impossible!\u0022 he exclaimed,\r\n+starting back.\r\n+\r\n+The painter stared at him. \u0022My dear boy, what nonsense!\u0022 he cried.\r\n+\u0022Do you mean to say you don't like what I did of you? Where is it?\r\n+Why have you pulled the screen in front of it? Let me look at it. It\r\n+is the best thing I have ever done. Do take the screen away, Dorian.\r\n+It is simply disgraceful of your servant hiding my work like that. I\r\n+felt the room looked different as I came in.\u0022\r\n+\r\n+\u0022My servant has nothing to do with it, Basil. You don't imagine I let\r\n+him arrange my room for me? He settles my flowers for me\r\n+sometimes--that is all. No; I did it myself. The light was too strong\r\n+on the portrait.\u0022\r\n+\r\n+\u0022Too strong! Surely not, my dear fellow? It is an admirable place for\r\n+it. Let me see it.\u0022 And Hallward walked towards the corner of the\r\n+room.\r\n+\r\n+A cry of terror broke from Dorian Gray's lips, and he rushed between\r\n+the painter and the screen. \u0022Basil,\u0022 he said, looking very pale, \u0022you\r\n+must not look at it. I don't wish you to.\u0022\r\n+\r\n+\u0022Not look at my own work! You are not serious. Why shouldn't I look\r\n+at it?\u0022 exclaimed Hallward, laughing.\r\n+\r\n+\u0022If you try to look at it, Basil, on my word of honour I will never\r\n+speak to you again as long as I live. I am quite serious. I don't\r\n+offer any explanation, and you are not to ask for any. But, remember,\r\n+if you touch this screen, everything is over between us.\u0022\r\n+\r\n+Hallward was thunderstruck. He looked at Dorian Gray in absolute\r\n+amazement. He had never seen him like this before. The lad was\r\n+actually pallid with rage. His hands were clenched, and the pupils of\r\n+his eyes were like disks of blue fire. He was trembling all over.\r\n+\r\n+\u0022Dorian!\u0022\r\n+\r\n+\u0022Don't speak!\u0022\r\n+\r\n+\u0022But what is the matter? Of course I won't look at it if you don't\r\n+want me to,\u0022 he said, rather coldly, turning on his heel and going over\r\n+towards the window. \u0022But, really, it seems rather absurd that I\r\n+shouldn't see my own work, especially as I am going to exhibit it in\r\n+Paris in the autumn. I shall probably have to give it another coat of\r\n+varnish before that, so I must see it some day, and why not to-day?\u0022\r\n+\r\n+\u0022To exhibit it! You want to exhibit it?\u0022 exclaimed Dorian Gray, a\r\n+strange sense of terror creeping over him. Was the world going to be\r\n+shown his secret? Were people to gape at the mystery of his life?\r\n+That was impossible. Something--he did not know what--had to be done\r\n+at once.\r\n+\r\n+\u0022Yes; I don't suppose you will object to that. Georges Petit is going\r\n+to collect all my best pictures for a special exhibition in the Rue de\r\n+Seze, which will open the first week in October. The portrait will\r\n+only be away a month. I should think you could easily spare it for\r\n+that time. In fact, you are sure to be out of town. And if you keep\r\n+it always behind a screen, you can't care much about it.\u0022\r\n+\r\n+Dorian Gray passed his hand over his forehead. There were beads of\r\n+perspiration there. He felt that he was on the brink of a horrible\r\n+danger. \u0022You told me a month ago that you would never exhibit it,\u0022 he\r\n+cried. \u0022Why have you changed your mind? You people who go in for\r\n+being consistent have just as many moods as others have. The only\r\n+difference is that your moods are rather meaningless. You can't have\r\n+forgotten that you assured me most solemnly that nothing in the world\r\n+would induce you to send it to any exhibition. You told Harry exactly\r\n+the same thing.\u0022 He stopped suddenly, and a gleam of light came into\r\n+his eyes. He remembered that Lord Henry had said to him once, half\r\n+seriously and half in jest, \u0022If you want to have a strange quarter of\r\n+an hour, get Basil to tell you why he won't exhibit your picture. He\r\n+told me why he wouldn't, and it was a revelation to me.\u0022 Yes, perhaps\r\n+Basil, too, had his secret. He would ask him and try.\r\n+\r\n+\u0022Basil,\u0022 he said, coming over quite close and looking him straight in\r\n+the face, \u0022we have each of us a secret. Let me know yours, and I shall\r\n+tell you mine. What was your reason for refusing to exhibit my\r\n+picture?\u0022\r\n+\r\n+The painter shuddered in spite of himself. \u0022Dorian, if I told you, you\r\n+might like me less than you do, and you would certainly laugh at me. I\r\n+could not bear your doing either of those two things. If you wish me\r\n+never to look at your picture again, I am content. I have always you\r\n+to look at. If you wish the best work I have ever done to be hidden\r\n+from the world, I am satisfied. Your friendship is dearer to me than\r\n+any fame or reputation.\u0022\r\n+\r\n+\u0022No, Basil, you must tell me,\u0022 insisted Dorian Gray. \u0022I think I have a\r\n+right to know.\u0022 His feeling of terror had passed away, and curiosity\r\n+had taken its place. He was determined to find out Basil Hallward's\r\n+mystery.\r\n+\r\n+\u0022Let us sit down, Dorian,\u0022 said the painter, looking troubled. \u0022Let us\r\n+sit down. And just answer me one question. Have you noticed in the\r\n+picture something curious?--something that probably at first did not\r\n+strike you, but that revealed itself to you suddenly?\u0022\r\n+\r\n+\u0022Basil!\u0022 cried the lad, clutching the arms of his chair with trembling\r\n+hands and gazing at him with wild startled eyes.\r\n+\r\n+\u0022I see you did. Don't speak. Wait till you hear what I have to say.\r\n+Dorian, from the moment I met you, your personality had the most\r\n+extraordinary influence over me. I was dominated, soul, brain, and\r\n+power, by you. You became to me the visible incarnation of that unseen\r\n+ideal whose memory haunts us artists like an exquisite dream. I\r\n+worshipped you. I grew jealous of every one to whom you spoke. I\r\n+wanted to have you all to myself. I was only happy when I was with\r\n+you. When you were away from me, you were still present in my art....\r\n+Of course, I never let you know anything about this. It would have\r\n+been impossible. You would not have understood it. I hardly\r\n+understood it myself. I only knew that I had seen perfection face to\r\n+face, and that the world had become wonderful to my eyes--too\r\n+wonderful, perhaps, for in such mad worships there is peril, the peril\r\n+of losing them, no less than the peril of keeping them.... Weeks and\r\n+weeks went on, and I grew more and more absorbed in you. Then came a\r\n+new development. I had drawn you as Paris in dainty armour, and as\r\n+Adonis with huntsman's cloak and polished boar-spear. Crowned with\r\n+heavy lotus-blossoms you had sat on the prow of Adrian's barge, gazing\r\n+across the green turbid Nile. You had leaned over the still pool of\r\n+some Greek woodland and seen in the water's silent silver the marvel of\r\n+your own face. And it had all been what art should be--unconscious,\r\n+ideal, and remote. One day, a fatal day I sometimes think, I\r\n+determined to paint a wonderful portrait of you as you actually are,\r\n+not in the costume of dead ages, but in your own dress and in your own\r\n+time. Whether it was the realism of the method, or the mere wonder of\r\n+your own personality, thus directly presented to me without mist or\r\n+veil, I cannot tell. But I know that as I worked at it, every flake\r\n+and film of colour seemed to me to reveal my secret. I grew afraid\r\n+that others would know of my idolatry. I felt, Dorian, that I had told\r\n+too much, that I had put too much of myself into it. Then it was that\r\n+I resolved never to allow the picture to be exhibited. You were a\r\n+little annoyed; but then you did not realize all that it meant to me.\r\n+Harry, to whom I talked about it, laughed at me. But I did not mind\r\n+that. When the picture was finished, and I sat alone with it, I felt\r\n+that I was right.... Well, after a few days the thing left my studio,\r\n+and as soon as I had got rid of the intolerable fascination of its\r\n+presence, it seemed to me that I had been foolish in imagining that I\r\n+had seen anything in it, more than that you were extremely good-looking\r\n+and that I could paint. Even now I cannot help feeling that it is a\r\n+mistake to think that the passion one feels in creation is ever really\r\n+shown in the work one creates. Art is always more abstract than we\r\n+fancy. Form and colour tell us of form and colour--that is all. It\r\n+often seems to me that art conceals the artist far more completely than\r\n+it ever reveals him. And so when I got this offer from Paris, I\r\n+determined to make your portrait the principal thing in my exhibition.\r\n+It never occurred to me that you would refuse. I see now that you were\r\n+right. The picture cannot be shown. You must not be angry with me,\r\n+Dorian, for what I have told you. As I said to Harry, once, you are\r\n+made to be worshipped.\u0022\r\n+\r\n+Dorian Gray drew a long breath. The colour came back to his cheeks,\r\n+and a smile played about his lips. The peril was over. He was safe\r\n+for the time. Yet he could not help feeling infinite pity for the\r\n+painter who had just made this strange confession to him, and wondered\r\n+if he himself would ever be so dominated by the personality of a\r\n+friend. Lord Henry had the charm of being very dangerous. But that\r\n+was all. He was too clever and too cynical to be really fond of.\r\n+Would there ever be some one who would fill him with a strange\r\n+idolatry? Was that one of the things that life had in store?\r\n+\r\n+\u0022It is extraordinary to me, Dorian,\u0022 said Hallward, \u0022that you should\r\n+have seen this in the portrait. Did you really see it?\u0022\r\n+\r\n+\u0022I saw something in it,\u0022 he answered, \u0022something that seemed to me very\r\n+curious.\u0022\r\n+\r\n+\u0022Well, you don't mind my looking at the thing now?\u0022\r\n+\r\n+Dorian shook his head. \u0022You must not ask me that, Basil. I could not\r\n+possibly let you stand in front of that picture.\u0022\r\n+\r\n+\u0022You will some day, surely?\u0022\r\n+\r\n+\u0022Never.\u0022\r\n+\r\n+\u0022Well, perhaps you are right. And now good-bye, Dorian. You have been\r\n+the one person in my life who has really influenced my art. Whatever I\r\n+have done that is good, I owe to you. Ah! you don't know what it cost\r\n+me to tell you all that I have told you.\u0022\r\n+\r\n+\u0022My dear Basil,\u0022 said Dorian, \u0022what have you told me? Simply that you\r\n+felt that you admired me too much. That is not even a compliment.\u0022\r\n+\r\n+\u0022It was not intended as a compliment. It was a confession. Now that I\r\n+have made it, something seems to have gone out of me. Perhaps one\r\n+should never put one's worship into words.\u0022\r\n+\r\n+\u0022It was a very disappointing confession.\u0022\r\n+\r\n+\u0022Why, what did you expect, Dorian? You didn't see anything else in the\r\n+picture, did you? There was nothing else to see?\u0022\r\n+\r\n+\u0022No; there was nothing else to see. Why do you ask? But you mustn't\r\n+talk about worship. It is foolish. You and I are friends, Basil, and\r\n+we must always remain so.\u0022\r\n+\r\n+\u0022You have got Harry,\u0022 said the painter sadly.\r\n+\r\n+\u0022Oh, Harry!\u0022 cried the lad, with a ripple of laughter. \u0022Harry spends\r\n+his days in saying what is incredible and his evenings in doing what is\r\n+improbable. Just the sort of life I would like to lead. But still I\r\n+don't think I would go to Harry if I were in trouble. I would sooner\r\n+go to you, Basil.\u0022\r\n+\r\n+\u0022You will sit to me again?\u0022\r\n+\r\n+\u0022Impossible!\u0022\r\n+\r\n+\u0022You spoil my life as an artist by refusing, Dorian. No man comes\r\n+across two ideal things. Few come across one.\u0022\r\n+\r\n+\u0022I can't explain it to you, Basil, but I must never sit to you again.\r\n+There is something fatal about a portrait. It has a life of its own.\r\n+I will come and have tea with you. That will be just as pleasant.\u0022\r\n+\r\n+\u0022Pleasanter for you, I am afraid,\u0022 murmured Hallward regretfully. \u0022And\r\n+now good-bye. I am sorry you won't let me look at the picture once\r\n+again. But that can't be helped. I quite understand what you feel\r\n+about it.\u0022\r\n+\r\n+As he left the room, Dorian Gray smiled to himself. Poor Basil! How\r\n+little he knew of the true reason! And how strange it was that,\r\n+instead of having been forced to reveal his own secret, he had\r\n+succeeded, almost by chance, in wresting a secret from his friend! How\r\n+much that strange confession explained to him! The painter's absurd\r\n+fits of jealousy, his wild devotion, his extravagant panegyrics, his\r\n+curious reticences--he understood them all now, and he felt sorry.\r\n+There seemed to him to be something tragic in a friendship so coloured\r\n+by romance.\r\n+\r\n+He sighed and touched the bell. The portrait must be hidden away at\r\n+all costs. He could not run such a risk of discovery again. It had\r\n+been mad of him to have allowed the thing to remain, even for an hour,\r\n+in a room to which any of his friends had access.\r\n+\r\n+\r\n+\r\n+CHAPTER 10\r\n+\r\n+When his servant entered, he looked at him steadfastly and wondered if\r\n+he had thought of peering behind the screen. The man was quite\r\n+impassive and waited for his orders. Dorian lit a cigarette and walked\r\n+over to the glass and glanced into it. He could see the reflection of\r\n+Victor's face perfectly. It was like a placid mask of servility.\r\n+There was nothing to be afraid of, there. Yet he thought it best to be\r\n+on his guard.\r\n+\r\n+Speaking very slowly, he told him to tell the house-keeper that he\r\n+wanted to see her, and then to go to the frame-maker and ask him to\r\n+send two of his men round at once. It seemed to him that as the man\r\n+left the room his eyes wandered in the direction of the screen. Or was\r\n+that merely his own fancy?\r\n+\r\n+After a few moments, in her black silk dress, with old-fashioned thread\r\n+mittens on her wrinkled hands, Mrs. Leaf bustled into the library. He\r\n+asked her for the key of the schoolroom.\r\n+\r\n+\u0022The old schoolroom, Mr. Dorian?\u0022 she exclaimed. \u0022Why, it is full of\r\n+dust. I must get it arranged and put straight before you go into it.\r\n+It is not fit for you to see, sir. It is not, indeed.\u0022\r\n+\r\n+\u0022I don't want it put straight, Leaf. I only want the key.\u0022\r\n+\r\n+\u0022Well, sir, you'll be covered with cobwebs if you go into it. Why, it\r\n+hasn't been opened for nearly five years--not since his lordship died.\u0022\r\n+\r\n+He winced at the mention of his grandfather. He had hateful memories\r\n+of him. \u0022That does not matter,\u0022 he answered. \u0022I simply want to see\r\n+the place--that is all. Give me the key.\u0022\r\n+\r\n+\u0022And here is the key, sir,\u0022 said the old lady, going over the contents\r\n+of her bunch with tremulously uncertain hands. \u0022Here is the key. I'll\r\n+have it off the bunch in a moment. But you don't think of living up\r\n+there, sir, and you so comfortable here?\u0022\r\n+\r\n+\u0022No, no,\u0022 he cried petulantly. \u0022Thank you, Leaf. That will do.\u0022\r\n+\r\n+She lingered for a few moments, and was garrulous over some detail of\r\n+the household. He sighed and told her to manage things as she thought\r\n+best. She left the room, wreathed in smiles.\r\n+\r\n+As the door closed, Dorian put the key in his pocket and looked round\r\n+the room. His eye fell on a large, purple satin coverlet heavily\r\n+embroidered with gold, a splendid piece of late seventeenth-century\r\n+Venetian work that his grandfather had found in a convent near Bologna.\r\n+Yes, that would serve to wrap the dreadful thing in. It had perhaps\r\n+served often as a pall for the dead. Now it was to hide something that\r\n+had a corruption of its own, worse than the corruption of death\r\n+itself--something that would breed horrors and yet would never die.\r\n+What the worm was to the corpse, his sins would be to the painted image\r\n+on the canvas. They would mar its beauty and eat away its grace. They\r\n+would defile it and make it shameful. And yet the thing would still\r\n+live on. It would be always alive.\r\n+\r\n+He shuddered, and for a moment he regretted that he had not told Basil\r\n+the true reason why he had wished to hide the picture away. Basil\r\n+would have helped him to resist Lord Henry's influence, and the still\r\n+more poisonous influences that came from his own temperament. The love\r\n+that he bore him--for it was really love--had nothing in it that was\r\n+not noble and intellectual. It was not that mere physical admiration\r\n+of beauty that is born of the senses and that dies when the senses\r\n+tire. It was such love as Michelangelo had known, and Montaigne, and\r\n+Winckelmann, and Shakespeare himself. Yes, Basil could have saved him.\r\n+But it was too late now. The past could always be annihilated.\r\n+Regret, denial, or forgetfulness could do that. But the future was\r\n+inevitable. There were passions in him that would find their terrible\r\n+outlet, dreams that would make the shadow of their evil real.\r\n+\r\n+He took up from the couch the great purple-and-gold texture that\r\n+covered it, and, holding it in his hands, passed behind the screen.\r\n+Was the face on the canvas viler than before? It seemed to him that it\r\n+was unchanged, and yet his loathing of it was intensified. Gold hair,\r\n+blue eyes, and rose-red lips--they all were there. It was simply the\r\n+expression that had altered. That was horrible in its cruelty.\r\n+Compared to what he saw in it of censure or rebuke, how shallow Basil's\r\n+reproaches about Sibyl Vane had been!--how shallow, and of what little\r\n+account! His own soul was looking out at him from the canvas and\r\n+calling him to judgement. A look of pain came across him, and he flung\r\n+the rich pall over the picture. As he did so, a knock came to the\r\n+door. He passed out as his servant entered.\r\n+\r\n+\u0022The persons are here, Monsieur.\u0022\r\n+\r\n+He felt that the man must be got rid of at once. He must not be\r\n+allowed to know where the picture was being taken to. There was\r\n+something sly about him, and he had thoughtful, treacherous eyes.\r\n+Sitting down at the writing-table he scribbled a note to Lord Henry,\r\n+asking him to send him round something to read and reminding him that\r\n+they were to meet at eight-fifteen that evening.\r\n+\r\n+\u0022Wait for an answer,\u0022 he said, handing it to him, \u0022and show the men in\r\n+here.\u0022\r\n+\r\n+In two or three minutes there was another knock, and Mr. Hubbard\r\n+himself, the celebrated frame-maker of South Audley Street, came in\r\n+with a somewhat rough-looking young assistant. Mr. Hubbard was a\r\n+florid, red-whiskered little man, whose admiration for art was\r\n+considerably tempered by the inveterate impecuniosity of most of the\r\n+artists who dealt with him. As a rule, he never left his shop. He\r\n+waited for people to come to him. But he always made an exception in\r\n+favour of Dorian Gray. There was something about Dorian that charmed\r\n+everybody. It was a pleasure even to see him.\r\n+\r\n+\u0022What can I do for you, Mr. Gray?\u0022 he said, rubbing his fat freckled\r\n+hands. \u0022I thought I would do myself the honour of coming round in\r\n+person. I have just got a beauty of a frame, sir. Picked it up at a\r\n+sale. Old Florentine. Came from Fonthill, I believe. Admirably\r\n+suited for a religious subject, Mr. Gray.\u0022\r\n+\r\n+\u0022I am so sorry you have given yourself the trouble of coming round, Mr.\r\n+Hubbard. I shall certainly drop in and look at the frame--though I\r\n+don't go in much at present for religious art--but to-day I only want a\r\n+picture carried to the top of the house for me. It is rather heavy, so\r\n+I thought I would ask you to lend me a couple of your men.\u0022\r\n+\r\n+\u0022No trouble at all, Mr. Gray. I am delighted to be of any service to\r\n+you. Which is the work of art, sir?\u0022\r\n+\r\n+\u0022This,\u0022 replied Dorian, moving the screen back. \u0022Can you move it,\r\n+covering and all, just as it is? I don't want it to get scratched\r\n+going upstairs.\u0022\r\n+\r\n+\u0022There will be no difficulty, sir,\u0022 said the genial frame-maker,\r\n+beginning, with the aid of his assistant, to unhook the picture from\r\n+the long brass chains by which it was suspended. \u0022And, now, where\r\n+shall we carry it to, Mr. Gray?\u0022\r\n+\r\n+\u0022I will show you the way, Mr. Hubbard, if you will kindly follow me.\r\n+Or perhaps you had better go in front. I am afraid it is right at the\r\n+top of the house. We will go up by the front staircase, as it is\r\n+wider.\u0022\r\n+\r\n+He held the door open for them, and they passed out into the hall and\r\n+began the ascent. The elaborate character of the frame had made the\r\n+picture extremely bulky, and now and then, in spite of the obsequious\r\n+protests of Mr. Hubbard, who had the true tradesman's spirited dislike\r\n+of seeing a gentleman doing anything useful, Dorian put his hand to it\r\n+so as to help them.\r\n+\r\n+\u0022Something of a load to carry, sir,\u0022 gasped the little man when they\r\n+reached the top landing. And he wiped his shiny forehead.\r\n+\r\n+\u0022I am afraid it is rather heavy,\u0022 murmured Dorian as he unlocked the\r\n+door that opened into the room that was to keep for him the curious\r\n+secret of his life and hide his soul from the eyes of men.\r\n+\r\n+He had not entered the place for more than four years--not, indeed,\r\n+since he had used it first as a play-room when he was a child, and then\r\n+as a study when he grew somewhat older. It was a large,\r\n+well-proportioned room, which had been specially built by the last Lord\r\n+Kelso for the use of the little grandson whom, for his strange likeness\r\n+to his mother, and also for other reasons, he had always hated and\r\n+desired to keep at a distance. It appeared to Dorian to have but\r\n+little changed. There was the huge Italian _cassone_, with its\r\n+fantastically painted panels and its tarnished gilt mouldings, in which\r\n+he had so often hidden himself as a boy. There the satinwood book-case\r\n+filled with his dog-eared schoolbooks. On the wall behind it was\r\n+hanging the same ragged Flemish tapestry where a faded king and queen\r\n+were playing chess in a garden, while a company of hawkers rode by,\r\n+carrying hooded birds on their gauntleted wrists. How well he\r\n+remembered it all! Every moment of his lonely childhood came back to\r\n+him as he looked round. He recalled the stainless purity of his boyish\r\n+life, and it seemed horrible to him that it was here the fatal portrait\r\n+was to be hidden away. How little he had thought, in those dead days,\r\n+of all that was in store for him!\r\n+\r\n+But there was no other place in the house so secure from prying eyes as\r\n+this. He had the key, and no one else could enter it. Beneath its\r\n+purple pall, the face painted on the canvas could grow bestial, sodden,\r\n+and unclean. What did it matter? No one could see it. He himself\r\n+would not see it. Why should he watch the hideous corruption of his\r\n+soul? He kept his youth--that was enough. And, besides, might not\r\n+his nature grow finer, after all? There was no reason that the future\r\n+should be so full of shame. Some love might come across his life, and\r\n+purify him, and shield him from those sins that seemed to be already\r\n+stirring in spirit and in flesh--those curious unpictured sins whose\r\n+very mystery lent them their subtlety and their charm. Perhaps, some\r\n+day, the cruel look would have passed away from the scarlet sensitive\r\n+mouth, and he might show to the world Basil Hallward's masterpiece.\r\n+\r\n+No; that was impossible. Hour by hour, and week by week, the thing\r\n+upon the canvas was growing old. It might escape the hideousness of\r\n+sin, but the hideousness of age was in store for it. The cheeks would\r\n+become hollow or flaccid. Yellow crow's feet would creep round the\r\n+fading eyes and make them horrible. The hair would lose its\r\n+brightness, the mouth would gape or droop, would be foolish or gross,\r\n+as the mouths of old men are. There would be the wrinkled throat, the\r\n+cold, blue-veined hands, the twisted body, that he remembered in the\r\n+grandfather who had been so stern to him in his boyhood. The picture\r\n+had to be concealed. There was no help for it.\r\n+\r\n+\u0022Bring it in, Mr. Hubbard, please,\u0022 he said, wearily, turning round.\r\n+\u0022I am sorry I kept you so long. I was thinking of something else.\u0022\r\n+\r\n+\u0022Always glad to have a rest, Mr. Gray,\u0022 answered the frame-maker, who\r\n+was still gasping for breath. \u0022Where shall we put it, sir?\u0022\r\n+\r\n+\u0022Oh, anywhere. Here: this will do. I don't want to have it hung up.\r\n+Just lean it against the wall. Thanks.\u0022\r\n+\r\n+\u0022Might one look at the work of art, sir?\u0022\r\n+\r\n+Dorian started. \u0022It would not interest you, Mr. Hubbard,\u0022 he said,\r\n+keeping his eye on the man. He felt ready to leap upon him and fling\r\n+him to the ground if he dared to lift the gorgeous hanging that\r\n+concealed the secret of his life. \u0022I shan't trouble you any more now.\r\n+I am much obliged for your kindness in coming round.\u0022\r\n+\r\n+\u0022Not at all, not at all, Mr. Gray. Ever ready to do anything for you,\r\n+sir.\u0022 And Mr. Hubbard tramped downstairs, followed by the assistant,\r\n+who glanced back at Dorian with a look of shy wonder in his rough\r\n+uncomely face. He had never seen any one so marvellous.\r\n+\r\n+When the sound of their footsteps had died away, Dorian locked the door\r\n+and put the key in his pocket. He felt safe now. No one would ever\r\n+look upon the horrible thing. No eye but his would ever see his shame.\r\n+\r\n+On reaching the library, he found that it was just after five o'clock\r\n+and that the tea had been already brought up. On a little table of\r\n+dark perfumed wood thickly incrusted with nacre, a present from Lady\r\n+Radley, his guardian's wife, a pretty professional invalid who had\r\n+spent the preceding winter in Cairo, was lying a note from Lord Henry,\r\n+and beside it was a book bound in yellow paper, the cover slightly torn\r\n+and the edges soiled. A copy of the third edition of _The St. James's\r\n+Gazette_ had been placed on the tea-tray. It was evident that Victor had\r\n+returned. He wondered if he had met the men in the hall as they were\r\n+leaving the house and had wormed out of them what they had been doing.\r\n+He would be sure to miss the picture--had no doubt missed it already,\r\n+while he had been laying the tea-things. The screen had not been set\r\n+back, and a blank space was visible on the wall. Perhaps some night he\r\n+might find him creeping upstairs and trying to force the door of the\r\n+room. It was a horrible thing to have a spy in one's house. He had\r\n+heard of rich men who had been blackmailed all their lives by some\r\n+servant who had read a letter, or overheard a conversation, or picked\r\n+up a card with an address, or found beneath a pillow a withered flower\r\n+or a shred of crumpled lace.\r\n+\r\n+He sighed, and having poured himself out some tea, opened Lord Henry's\r\n+note. It was simply to say that he sent him round the evening paper,\r\n+and a book that might interest him, and that he would be at the club at\r\n+eight-fifteen. He opened _The St. James's_ languidly, and looked through\r\n+it. A red pencil-mark on the fifth page caught his eye. It drew\r\n+attention to the following paragraph:\r\n+\r\n+\r\n+INQUEST ON AN ACTRESS.--An inquest was held this morning at the Bell\r\n+Tavern, Hoxton Road, by Mr. Danby, the District Coroner, on the body of\r\n+Sibyl Vane, a young actress recently engaged at the Royal Theatre,\r\n+Holborn. A verdict of death by misadventure was returned.\r\n+Considerable sympathy was expressed for the mother of the deceased, who\r\n+was greatly affected during the giving of her own evidence, and that of\r\n+Dr. Birrell, who had made the post-mortem examination of the deceased.\r\n+\r\n+\r\n+He frowned, and tearing the paper in two, went across the room and\r\n+flung the pieces away. How ugly it all was! And how horribly real\r\n+ugliness made things! He felt a little annoyed with Lord Henry for\r\n+having sent him the report. And it was certainly stupid of him to have\r\n+marked it with red pencil. Victor might have read it. The man knew\r\n+more than enough English for that.\r\n+\r\n+Perhaps he had read it and had begun to suspect something. And, yet,\r\n+what did it matter? What had Dorian Gray to do with Sibyl Vane's\r\n+death? There was nothing to fear. Dorian Gray had not killed her.\r\n+\r\n+His eye fell on the yellow book that Lord Henry had sent him. What was\r\n+it, he wondered. He went towards the little, pearl-coloured octagonal\r\n+stand that had always looked to him like the work of some strange\r\n+Egyptian bees that wrought in silver, and taking up the volume, flung\r\n+himself into an arm-chair and began to turn over the leaves. After a\r\n+few minutes he became absorbed. It was the strangest book that he had\r\n+ever read. It seemed to him that in exquisite raiment, and to the\r\n+delicate sound of flutes, the sins of the world were passing in dumb\r\n+show before him. Things that he had dimly dreamed of were suddenly\r\n+made real to him. Things of which he had never dreamed were gradually\r\n+revealed.\r\n+\r\n+It was a novel without a plot and with only one character, being,\r\n+indeed, simply a psychological study of a certain young Parisian who\r\n+spent his life trying to realize in the nineteenth century all the\r\n+passions and modes of thought that belonged to every century except his\r\n+own, and to sum up, as it were, in himself the various moods through\r\n+which the world-spirit had ever passed, loving for their mere\r\n+artificiality those renunciations that men have unwisely called virtue,\r\n+as much as those natural rebellions that wise men still call sin. The\r\n+style in which it was written was that curious jewelled style, vivid\r\n+and obscure at once, full of _argot_ and of archaisms, of technical\r\n+expressions and of elaborate paraphrases, that characterizes the work\r\n+of some of the finest artists of the French school of _Symbolistes_.\r\n+There were in it metaphors as monstrous as orchids and as subtle in\r\n+colour. The life of the senses was described in the terms of mystical\r\n+philosophy. One hardly knew at times whether one was reading the\r\n+spiritual ecstasies of some mediaeval saint or the morbid confessions\r\n+of a modern sinner. It was a poisonous book. The heavy odour of\r\n+incense seemed to cling about its pages and to trouble the brain. The\r\n+mere cadence of the sentences, the subtle monotony of their music, so\r\n+full as it was of complex refrains and movements elaborately repeated,\r\n+produced in the mind of the lad, as he passed from chapter to chapter,\r\n+a form of reverie, a malady of dreaming, that made him unconscious of\r\n+the falling day and creeping shadows.\r\n+\r\n+Cloudless, and pierced by one solitary star, a copper-green sky gleamed\r\n+through the windows. He read on by its wan light till he could read no\r\n+more. Then, after his valet had reminded him several times of the\r\n+lateness of the hour, he got up, and going into the next room, placed\r\n+the book on the little Florentine table that always stood at his\r\n+bedside and began to dress for dinner.\r\n+\r\n+It was almost nine o'clock before he reached the club, where he found\r\n+Lord Henry sitting alone, in the morning-room, looking very much bored.\r\n+\r\n+\u0022I am so sorry, Harry,\u0022 he cried, \u0022but really it is entirely your\r\n+fault. That book you sent me so fascinated me that I forgot how the\r\n+time was going.\u0022\r\n+\r\n+\u0022Yes, I thought you would like it,\u0022 replied his host, rising from his\r\n+chair.\r\n+\r\n+\u0022I didn't say I liked it, Harry. I said it fascinated me. There is a\r\n+great difference.\u0022\r\n+\r\n+\u0022Ah, you have discovered that?\u0022 murmured Lord Henry. And they passed\r\n+into the dining-room.\r\n+\r\n+\r\n+\r\n+CHAPTER 11\r\n+\r\n+For years, Dorian Gray could not free himself from the influence of\r\n+this book. Or perhaps it would be more accurate to say that he never\r\n+sought to free himself from it. He procured from Paris no less than\r\n+nine large-paper copies of the first edition, and had them bound in\r\n+different colours, so that they might suit his various moods and the\r\n+changing fancies of a nature over which he seemed, at times, to have\r\n+almost entirely lost control. The hero, the wonderful young Parisian\r\n+in whom the romantic and the scientific temperaments were so strangely\r\n+blended, became to him a kind of prefiguring type of himself. And,\r\n+indeed, the whole book seemed to him to contain the story of his own\r\n+life, written before he had lived it.\r\n+\r\n+In one point he was more fortunate than the novel's fantastic hero. He\r\n+never knew--never, indeed, had any cause to know--that somewhat\r\n+grotesque dread of mirrors, and polished metal surfaces, and still\r\n+water which came upon the young Parisian so early in his life, and was\r\n+occasioned by the sudden decay of a beau that had once, apparently,\r\n+been so remarkable. It was with an almost cruel joy--and perhaps in\r\n+nearly every joy, as certainly in every pleasure, cruelty has its\r\n+place--that he used to read the latter part of the book, with its\r\n+really tragic, if somewhat overemphasized, account of the sorrow and\r\n+despair of one who had himself lost what in others, and the world, he\r\n+had most dearly valued.\r\n+\r\n+For the wonderful beauty that had so fascinated Basil Hallward, and\r\n+many others besides him, seemed never to leave him. Even those who had\r\n+heard the most evil things against him--and from time to time strange\r\n+rumours about his mode of life crept through London and became the\r\n+chatter of the clubs--could not believe anything to his dishonour when\r\n+they saw him. He had always the look of one who had kept himself\r\n+unspotted from the world. Men who talked grossly became silent when\r\n+Dorian Gray entered the room. There was something in the purity of his\r\n+face that rebuked them. His mere presence seemed to recall to them the\r\n+memory of the innocence that they had tarnished. They wondered how one\r\n+so charming and graceful as he was could have escaped the stain of an\r\n+age that was at once sordid and sensual.\r\n+\r\n+Often, on returning home from one of those mysterious and prolonged\r\n+absences that gave rise to such strange conjecture among those who were\r\n+his friends, or thought that they were so, he himself would creep\r\n+upstairs to the locked room, open the door with the key that never left\r\n+him now, and stand, with a mirror, in front of the portrait that Basil\r\n+Hallward had painted of him, looking now at the evil and aging face on\r\n+the canvas, and now at the fair young face that laughed back at him\r\n+from the polished glass. The very sharpness of the contrast used to\r\n+quicken his sense of pleasure. He grew more and more enamoured of his\r\n+own beauty, more and more interested in the corruption of his own soul.\r\n+He would examine with minute care, and sometimes with a monstrous and\r\n+terrible delight, the hideous lines that seared the wrinkling forehead\r\n+or crawled around the heavy sensual mouth, wondering sometimes which\r\n+were the more horrible, the signs of sin or the signs of age. He would\r\n+place his white hands beside the coarse bloated hands of the picture,\r\n+and smile. He mocked the misshapen body and the failing limbs.\r\n+\r\n+There were moments, indeed, at night, when, lying sleepless in his own\r\n+delicately scented chamber, or in the sordid room of the little\r\n+ill-famed tavern near the docks which, under an assumed name and in\r\n+disguise, it was his habit to frequent, he would think of the ruin he\r\n+had brought upon his soul with a pity that was all the more poignant\r\n+because it was purely selfish. But moments such as these were rare.\r\n+That curiosity about life which Lord Henry had first stirred in him, as\r\n+they sat together in the garden of their friend, seemed to increase\r\n+with gratification. The more he knew, the more he desired to know. He\r\n+had mad hungers that grew more ravenous as he fed them.\r\n+\r\n+Yet he was not really reckless, at any rate in his relations to\r\n+society. Once or twice every month during the winter, and on each\r\n+Wednesday evening while the season lasted, he would throw open to the\r\n+world his beautiful house and have the most celebrated musicians of the\r\n+day to charm his guests with the wonders of their art. His little\r\n+dinners, in the settling of which Lord Henry always assisted him, were\r\n+noted as much for the careful selection and placing of those invited,\r\n+as for the exquisite taste shown in the decoration of the table, with\r\n+its subtle symphonic arrangements of exotic flowers, and embroidered\r\n+cloths, and antique plate of gold and silver. Indeed, there were many,\r\n+especially among the very young men, who saw, or fancied that they saw,\r\n+in Dorian Gray the true realization of a type of which they had often\r\n+dreamed in Eton or Oxford days, a type that was to combine something of\r\n+the real culture of the scholar with all the grace and distinction and\r\n+perfect manner of a citizen of the world. To them he seemed to be of\r\n+the company of those whom Dante describes as having sought to \u0022make\r\n+themselves perfect by the worship of beauty.\u0022 Like Gautier, he was one\r\n+for whom \u0022the visible world existed.\u0022\r\n+\r\n+And, certainly, to him life itself was the first, the greatest, of the\r\n+arts, and for it all the other arts seemed to be but a preparation.\r\n+Fashion, by which what is really fantastic becomes for a moment\r\n+universal, and dandyism, which, in its own way, is an attempt to assert\r\n+the absolute modernity of beauty, had, of course, their fascination for\r\n+him. His mode of dressing, and the particular styles that from time to\r\n+time he affected, had their marked influence on the young exquisites of\r\n+the Mayfair balls and Pall Mall club windows, who copied him in\r\n+everything that he did, and tried to reproduce the accidental charm of\r\n+his graceful, though to him only half-serious, fopperies.\r\n+\r\n+For, while he was but too ready to accept the position that was almost\r\n+immediately offered to him on his coming of age, and found, indeed, a\r\n+subtle pleasure in the thought that he might really become to the\r\n+London of his own day what to imperial Neronian Rome the author of the\r\n+Satyricon once had been, yet in his inmost heart he desired to be\r\n+something more than a mere _arbiter elegantiarum_, to be consulted on the\r\n+wearing of a jewel, or the knotting of a necktie, or the conduct of a\r\n+cane. He sought to elaborate some new scheme of life that would have\r\n+its reasoned philosophy and its ordered principles, and find in the\r\n+spiritualizing of the senses its highest realization.\r\n+\r\n+The worship of the senses has often, and with much justice, been\r\n+decried, men feeling a natural instinct of terror about passions and\r\n+sensations that seem stronger than themselves, and that they are\r\n+conscious of sharing with the less highly organized forms of existence.\r\n+But it appeared to Dorian Gray that the true nature of the senses had\r\n+never been understood, and that they had remained savage and animal\r\n+merely because the world had sought to starve them into submission or\r\n+to kill them by pain, instead of aiming at making them elements of a\r\n+new spirituality, of which a fine instinct for beauty was to be the\r\n+dominant characteristic. As he looked back upon man moving through\r\n+history, he was haunted by a feeling of loss. So much had been\r\n+surrendered! and to such little purpose! There had been mad wilful\r\n+rejections, monstrous forms of self-torture and self-denial, whose\r\n+origin was fear and whose result was a degradation infinitely more\r\n+terrible than that fancied degradation from which, in their ignorance,\r\n+they had sought to escape; Nature, in her wonderful irony, driving out\r\n+the anchorite to feed with the wild animals of the desert and giving to\r\n+the hermit the beasts of the field as his companions.\r\n+\r\n+Yes: there was to be, as Lord Henry had prophesied, a new Hedonism\r\n+that was to recreate life and to save it from that harsh uncomely\r\n+puritanism that is having, in our own day, its curious revival. It was\r\n+to have its service of the intellect, certainly, yet it was never to\r\n+accept any theory or system that would involve the sacrifice of any\r\n+mode of passionate experience. Its aim, indeed, was to be experience\r\n+itself, and not the fruits of experience, sweet or bitter as they might\r\n+be. Of the asceticism that deadens the senses, as of the vulgar\r\n+profligacy that dulls them, it was to know nothing. But it was to\r\n+teach man to concentrate himself upon the moments of a life that is\r\n+itself but a moment.\r\n+\r\n+There are few of us who have not sometimes wakened before dawn, either\r\n+after one of those dreamless nights that make us almost enamoured of\r\n+death, or one of those nights of horror and misshapen joy, when through\r\n+the chambers of the brain sweep phantoms more terrible than reality\r\n+itself, and instinct with that vivid life that lurks in all grotesques,\r\n+and that lends to Gothic art its enduring vitality, this art being, one\r\n+might fancy, especially the art of those whose minds have been troubled\r\n+with the malady of reverie. Gradually white fingers creep through the\r\n+curtains, and they appear to tremble. In black fantastic shapes, dumb\r\n+shadows crawl into the corners of the room and crouch there. Outside,\r\n+there is the stirring of birds among the leaves, or the sound of men\r\n+going forth to their work, or the sigh and sob of the wind coming down\r\n+from the hills and wandering round the silent house, as though it\r\n+feared to wake the sleepers and yet must needs call forth sleep from\r\n+her purple cave. Veil after veil of thin dusky gauze is lifted, and by\r\n+degrees the forms and colours of things are restored to them, and we\r\n+watch the dawn remaking the world in its antique pattern. The wan\r\n+mirrors get back their mimic life. The flameless tapers stand where we\r\n+had left them, and beside them lies the half-cut book that we had been\r\n+studying, or the wired flower that we had worn at the ball, or the\r\n+letter that we had been afraid to read, or that we had read too often.\r\n+Nothing seems to us changed. Out of the unreal shadows of the night\r\n+comes back the real life that we had known. We have to resume it where\r\n+we had left off, and there steals over us a terrible sense of the\r\n+necessity for the continuance of energy in the same wearisome round of\r\n+stereotyped habits, or a wild longing, it may be, that our eyelids\r\n+might open some morning upon a world that had been refashioned anew in\r\n+the darkness for our pleasure, a world in which things would have fresh\r\n+shapes and colours, and be changed, or have other secrets, a world in\r\n+which the past would have little or no place, or survive, at any rate,\r\n+in no conscious form of obligation or regret, the remembrance even of\r\n+joy having its bitterness and the memories of pleasure their pain.\r\n+\r\n+It was the creation of such worlds as these that seemed to Dorian Gray\r\n+to be the true object, or amongst the true objects, of life; and in his\r\n+search for sensations that would be at once new and delightful, and\r\n+possess that element of strangeness that is so essential to romance, he\r\n+would often adopt certain modes of thought that he knew to be really\r\n+alien to his nature, abandon himself to their subtle influences, and\r\n+then, having, as it were, caught their colour and satisfied his\r\n+intellectual curiosity, leave them with that curious indifference that\r\n+is not incompatible with a real ardour of temperament, and that,\r\n+indeed, according to certain modern psychologists, is often a condition\r\n+of it.\r\n+\r\n+It was rumoured of him once that he was about to join the Roman\r\n+Catholic communion, and certainly the Roman ritual had always a great\r\n+attraction for him. The daily sacrifice, more awful really than all\r\n+the sacrifices of the antique world, stirred him as much by its superb\r\n+rejection of the evidence of the senses as by the primitive simplicity\r\n+of its elements and the eternal pathos of the human tragedy that it\r\n+sought to symbolize. He loved to kneel down on the cold marble\r\n+pavement and watch the priest, in his stiff flowered dalmatic, slowly\r\n+and with white hands moving aside the veil of the tabernacle, or\r\n+raising aloft the jewelled, lantern-shaped monstrance with that pallid\r\n+wafer that at times, one would fain think, is indeed the \u0022_panis\r\n+caelestis_,\u0022 the bread of angels, or, robed in the garments of the\r\n+Passion of Christ, breaking the Host into the chalice and smiting his\r\n+breast for his sins. The fuming censers that the grave boys, in their\r\n+lace and scarlet, tossed into the air like great gilt flowers had their\r\n+subtle fascination for him. As he passed out, he used to look with\r\n+wonder at the black confessionals and long to sit in the dim shadow of\r\n+one of them and listen to men and women whispering through the worn\r\n+grating the true story of their lives.\r\n+\r\n+But he never fell into the error of arresting his intellectual\r\n+development by any formal acceptance of creed or system, or of\r\n+mistaking, for a house in which to live, an inn that is but suitable\r\n+for the sojourn of a night, or for a few hours of a night in which\r\n+there are no stars and the moon is in travail. Mysticism, with its\r\n+marvellous power of making common things strange to us, and the subtle\r\n+antinomianism that always seems to accompany it, moved him for a\r\n+season; and for a season he inclined to the materialistic doctrines of\r\n+the _Darwinismus_ movement in Germany, and found a curious pleasure in\r\n+tracing the thoughts and passions of men to some pearly cell in the\r\n+brain, or some white nerve in the body, delighting in the conception of\r\n+the absolute dependence of the spirit on certain physical conditions,\r\n+morbid or healthy, normal or diseased. Yet, as has been said of him\r\n+before, no theory of life seemed to him to be of any importance\r\n+compared with life itself. He felt keenly conscious of how barren all\r\n+intellectual speculation is when separated from action and experiment.\r\n+He knew that the senses, no less than the soul, have their spiritual\r\n+mysteries to reveal.\r\n+\r\n+And so he would now study perfumes and the secrets of their\r\n+manufacture, distilling heavily scented oils and burning odorous gums\r\n+from the East. He saw that there was no mood of the mind that had not\r\n+its counterpart in the sensuous life, and set himself to discover their\r\n+true relations, wondering what there was in frankincense that made one\r\n+mystical, and in ambergris that stirred one's passions, and in violets\r\n+that woke the memory of dead romances, and in musk that troubled the\r\n+brain, and in champak that stained the imagination; and seeking often\r\n+to elaborate a real psychology of perfumes, and to estimate the several\r\n+influences of sweet-smelling roots and scented, pollen-laden flowers;\r\n+of aromatic balms and of dark and fragrant woods; of spikenard, that\r\n+sickens; of hovenia, that makes men mad; and of aloes, that are said to\r\n+be able to expel melancholy from the soul.\r\n+\r\n+At another time he devoted himself entirely to music, and in a long\r\n+latticed room, with a vermilion-and-gold ceiling and walls of\r\n+olive-green lacquer, he used to give curious concerts in which mad\r\n+gipsies tore wild music from little zithers, or grave, yellow-shawled\r\n+Tunisians plucked at the strained strings of monstrous lutes, while\r\n+grinning Negroes beat monotonously upon copper drums and, crouching\r\n+upon scarlet mats, slim turbaned Indians blew through long pipes of\r\n+reed or brass and charmed--or feigned to charm--great hooded snakes and\r\n+horrible horned adders. The harsh intervals and shrill discords of\r\n+barbaric music stirred him at times when Schubert's grace, and Chopin's\r\n+beautiful sorrows, and the mighty harmonies of Beethoven himself, fell\r\n+unheeded on his ear. He collected together from all parts of the world\r\n+the strangest instruments that could be found, either in the tombs of\r\n+dead nations or among the few savage tribes that have survived contact\r\n+with Western civilizations, and loved to touch and try them. He had\r\n+the mysterious _juruparis_ of the Rio Negro Indians, that women are not\r\n+allowed to look at and that even youths may not see till they have been\r\n+subjected to fasting and scourging, and the earthen jars of the\r\n+Peruvians that have the shrill cries of birds, and flutes of human\r\n+bones such as Alfonso de Ovalle heard in Chile, and the sonorous green\r\n+jaspers that are found near Cuzco and give forth a note of singular\r\n+sweetness. He had painted gourds filled with pebbles that rattled when\r\n+they were shaken; the long _clarin_ of the Mexicans, into which the\r\n+performer does not blow, but through which he inhales the air; the\r\n+harsh _ture_ of the Amazon tribes, that is sounded by the sentinels who\r\n+sit all day long in high trees, and can be heard, it is said, at a\r\n+distance of three leagues; the _teponaztli_, that has two vibrating\r\n+tongues of wood and is beaten with sticks that are smeared with an\r\n+elastic gum obtained from the milky juice of plants; the _yotl_-bells of\r\n+the Aztecs, that are hung in clusters like grapes; and a huge\r\n+cylindrical drum, covered with the skins of great serpents, like the\r\n+one that Bernal Diaz saw when he went with Cortes into the Mexican\r\n+temple, and of whose doleful sound he has left us so vivid a\r\n+description. The fantastic character of these instruments fascinated\r\n+him, and he felt a curious delight in the thought that art, like\r\n+Nature, has her monsters, things of bestial shape and with hideous\r\n+voices. Yet, after some time, he wearied of them, and would sit in his\r\n+box at the opera, either alone or with Lord Henry, listening in rapt\r\n+pleasure to \u0022Tannhauser\u0022 and seeing in the prelude to that great work\r\n+of art a presentation of the tragedy of his own soul.\r\n+\r\n+On one occasion he took up the study of jewels, and appeared at a\r\n+costume ball as Anne de Joyeuse, Admiral of France, in a dress covered\r\n+with five hundred and sixty pearls. This taste enthralled him for\r\n+years, and, indeed, may be said never to have left him. He would often\r\n+spend a whole day settling and resettling in their cases the various\r\n+stones that he had collected, such as the olive-green chrysoberyl that\r\n+turns red by lamplight, the cymophane with its wirelike line of silver,\r\n+the pistachio-coloured peridot, rose-pink and wine-yellow topazes,\r\n+carbuncles of fiery scarlet with tremulous, four-rayed stars, flame-red\r\n+cinnamon-stones, orange and violet spinels, and amethysts with their\r\n+alternate layers of ruby and sapphire. He loved the red gold of the\r\n+sunstone, and the moonstone's pearly whiteness, and the broken rainbow\r\n+of the milky opal. He procured from Amsterdam three emeralds of\r\n+extraordinary size and richness of colour, and had a turquoise _de la\r\n+vieille roche_ that was the envy of all the connoisseurs.\r\n+\r\n+He discovered wonderful stories, also, about jewels. In Alphonso's\r\n+Clericalis Disciplina a serpent was mentioned with eyes of real\r\n+jacinth, and in the romantic history of Alexander, the Conqueror of\r\n+Emathia was said to have found in the vale of Jordan snakes \u0022with\r\n+collars of real emeralds growing on their backs.\u0022 There was a gem in\r\n+the brain of the dragon, Philostratus told us, and \u0022by the exhibition\r\n+of golden letters and a scarlet robe\u0022 the monster could be thrown into\r\n+a magical sleep and slain. According to the great alchemist, Pierre de\r\n+Boniface, the diamond rendered a man invisible, and the agate of India\r\n+made him eloquent. The cornelian appeased anger, and the hyacinth\r\n+provoked sleep, and the amethyst drove away the fumes of wine. The\r\n+garnet cast out demons, and the hydropicus deprived the moon of her\r\n+colour. The selenite waxed and waned with the moon, and the meloceus,\r\n+that discovers thieves, could be affected only by the blood of kids.\r\n+Leonardus Camillus had seen a white stone taken from the brain of a\r\n+newly killed toad, that was a certain antidote against poison. The\r\n+bezoar, that was found in the heart of the Arabian deer, was a charm\r\n+that could cure the plague. In the nests of Arabian birds was the\r\n+aspilates, that, according to Democritus, kept the wearer from any\r\n+danger by fire.\r\n+\r\n+The King of Ceilan rode through his city with a large ruby in his hand,\r\n+as the ceremony of his coronation. The gates of the palace of John the\r\n+Priest were \u0022made of sardius, with the horn of the horned snake\r\n+inwrought, so that no man might bring poison within.\u0022 Over the gable\r\n+were \u0022two golden apples, in which were two carbuncles,\u0022 so that the\r\n+gold might shine by day and the carbuncles by night. In Lodge's\r\n+strange romance 'A Margarite of America', it was stated that in the\r\n+chamber of the queen one could behold \u0022all the chaste ladies of the\r\n+world, inchased out of silver, looking through fair mirrours of\r\n+chrysolites, carbuncles, sapphires, and greene emeraults.\u0022 Marco Polo\r\n+had seen the inhabitants of Zipangu place rose-coloured pearls in the\r\n+mouths of the dead. A sea-monster had been enamoured of the pearl that\r\n+the diver brought to King Perozes, and had slain the thief, and mourned\r\n+for seven moons over its loss. When the Huns lured the king into the\r\n+great pit, he flung it away--Procopius tells the story--nor was it ever\r\n+found again, though the Emperor Anastasius offered five hundred-weight\r\n+of gold pieces for it. The King of Malabar had shown to a certain\r\n+Venetian a rosary of three hundred and four pearls, one for every god\r\n+that he worshipped.\r\n+\r\n+When the Duke de Valentinois, son of Alexander VI, visited Louis XII of\r\n+France, his horse was loaded with gold leaves, according to Brantome,\r\n+and his cap had double rows of rubies that threw out a great light.\r\n+Charles of England had ridden in stirrups hung with four hundred and\r\n+twenty-one diamonds. Richard II had a coat, valued at thirty thousand\r\n+marks, which was covered with balas rubies. Hall described Henry VIII,\r\n+on his way to the Tower previous to his coronation, as wearing \u0022a\r\n+jacket of raised gold, the placard embroidered with diamonds and other\r\n+rich stones, and a great bauderike about his neck of large balasses.\u0022\r\n+The favourites of James I wore ear-rings of emeralds set in gold\r\n+filigrane. Edward II gave to Piers Gaveston a suit of red-gold armour\r\n+studded with jacinths, a collar of gold roses set with\r\n+turquoise-stones, and a skull-cap _parseme_ with pearls. Henry II wore\r\n+jewelled gloves reaching to the elbow, and had a hawk-glove sewn with\r\n+twelve rubies and fifty-two great orients. The ducal hat of Charles\r\n+the Rash, the last Duke of Burgundy of his race, was hung with\r\n+pear-shaped pearls and studded with sapphires.\r\n+\r\n+How exquisite life had once been! How gorgeous in its pomp and\r\n+decoration! Even to read of the luxury of the dead was wonderful.\r\n+\r\n+Then he turned his attention to embroideries and to the tapestries that\r\n+performed the office of frescoes in the chill rooms of the northern\r\n+nations of Europe. As he investigated the subject--and he always had\r\n+an extraordinary faculty of becoming absolutely absorbed for the moment\r\n+in whatever he took up--he was almost saddened by the reflection of the\r\n+ruin that time brought on beautiful and wonderful things. He, at any\r\n+rate, had escaped that. Summer followed summer, and the yellow\r\n+jonquils bloomed and died many times, and nights of horror repeated the\r\n+story of their shame, but he was unchanged. No winter marred his face\r\n+or stained his flowerlike bloom. How different it was with material\r\n+things! Where had they passed to? Where was the great crocus-coloured\r\n+robe, on which the gods fought against the giants, that had been worked\r\n+by brown girls for the pleasure of Athena? Where the huge velarium\r\n+that Nero had stretched across the Colosseum at Rome, that Titan sail\r\n+of purple on which was represented the starry sky, and Apollo driving a\r\n+chariot drawn by white, gilt-reined steeds? He longed to see the\r\n+curious table-napkins wrought for the Priest of the Sun, on which were\r\n+displayed all the dainties and viands that could be wanted for a feast;\r\n+the mortuary cloth of King Chilperic, with its three hundred golden\r\n+bees; the fantastic robes that excited the indignation of the Bishop of\r\n+Pontus and were figured with \u0022lions, panthers, bears, dogs, forests,\r\n+rocks, hunters--all, in fact, that a painter can copy from nature\u0022; and\r\n+the coat that Charles of Orleans once wore, on the sleeves of which\r\n+were embroidered the verses of a song beginning \u0022_Madame, je suis tout\r\n+joyeux_,\u0022 the musical accompaniment of the words being wrought in gold\r\n+thread, and each note, of square shape in those days, formed with four\r\n+pearls. He read of the room that was prepared at the palace at Rheims\r\n+for the use of Queen Joan of Burgundy and was decorated with \u0022thirteen\r\n+hundred and twenty-one parrots, made in broidery, and blazoned with the\r\n+king's arms, and five hundred and sixty-one butterflies, whose wings\r\n+were similarly ornamented with the arms of the queen, the whole worked\r\n+in gold.\u0022 Catherine de Medicis had a mourning-bed made for her of\r\n+black velvet powdered with crescents and suns. Its curtains were of\r\n+damask, with leafy wreaths and garlands, figured upon a gold and silver\r\n+ground, and fringed along the edges with broideries of pearls, and it\r\n+stood in a room hung with rows of the queen's devices in cut black\r\n+velvet upon cloth of silver. Louis XIV had gold embroidered caryatides\r\n+fifteen feet high in his apartment. The state bed of Sobieski, King of\r\n+Poland, was made of Smyrna gold brocade embroidered in turquoises with\r\n+verses from the Koran. Its supports were of silver gilt, beautifully\r\n+chased, and profusely set with enamelled and jewelled medallions. It\r\n+had been taken from the Turkish camp before Vienna, and the standard of\r\n+Mohammed had stood beneath the tremulous gilt of its canopy.\r\n+\r\n+And so, for a whole year, he sought to accumulate the most exquisite\r\n+specimens that he could find of textile and embroidered work, getting\r\n+the dainty Delhi muslins, finely wrought with gold-thread palmates and\r\n+stitched over with iridescent beetles' wings; the Dacca gauzes, that\r\n+from their transparency are known in the East as \u0022woven air,\u0022 and\r\n+\u0022running water,\u0022 and \u0022evening dew\u0022; strange figured cloths from Java;\r\n+elaborate yellow Chinese hangings; books bound in tawny satins or fair\r\n+blue silks and wrought with _fleurs-de-lis_, birds and images; veils of\r\n+_lacis_ worked in Hungary point; Sicilian brocades and stiff Spanish\r\n+velvets; Georgian work, with its gilt coins, and Japanese _Foukousas_,\r\n+with their green-toned golds and their marvellously plumaged birds.\r\n+\r\n+He had a special passion, also, for ecclesiastical vestments, as indeed\r\n+he had for everything connected with the service of the Church. In the\r\n+long cedar chests that lined the west gallery of his house, he had\r\n+stored away many rare and beautiful specimens of what is really the\r\n+raiment of the Bride of Christ, who must wear purple and jewels and\r\n+fine linen that she may hide the pallid macerated body that is worn by\r\n+the suffering that she seeks for and wounded by self-inflicted pain.\r\n+He possessed a gorgeous cope of crimson silk and gold-thread damask,\r\n+figured with a repeating pattern of golden pomegranates set in\r\n+six-petalled formal blossoms, beyond which on either side was the\r\n+pine-apple device wrought in seed-pearls. The orphreys were divided\r\n+into panels representing scenes from the life of the Virgin, and the\r\n+coronation of the Virgin was figured in coloured silks upon the hood.\r\n+This was Italian work of the fifteenth century. Another cope was of\r\n+green velvet, embroidered with heart-shaped groups of acanthus-leaves,\r\n+from which spread long-stemmed white blossoms, the details of which\r\n+were picked out with silver thread and coloured crystals. The morse\r\n+bore a seraph's head in gold-thread raised work. The orphreys were\r\n+woven in a diaper of red and gold silk, and were starred with\r\n+medallions of many saints and martyrs, among whom was St. Sebastian.\r\n+He had chasubles, also, of amber-coloured silk, and blue silk and gold\r\n+brocade, and yellow silk damask and cloth of gold, figured with\r\n+representations of the Passion and Crucifixion of Christ, and\r\n+embroidered with lions and peacocks and other emblems; dalmatics of\r\n+white satin and pink silk damask, decorated with tulips and dolphins\r\n+and _fleurs-de-lis_; altar frontals of crimson velvet and blue linen; and\r\n+many corporals, chalice-veils, and sudaria. In the mystic offices to\r\n+which such things were put, there was something that quickened his\r\n+imagination.\r\n+\r\n+For these treasures, and everything that he collected in his lovely\r\n+house, were to be to him means of forgetfulness, modes by which he\r\n+could escape, for a season, from the fear that seemed to him at times\r\n+to be almost too great to be borne. Upon the walls of the lonely\r\n+locked room where he had spent so much of his boyhood, he had hung with\r\n+his own hands the terrible portrait whose changing features showed him\r\n+the real degradation of his life, and in front of it had draped the\r\n+purple-and-gold pall as a curtain. For weeks he would not go there,\r\n+would forget the hideous painted thing, and get back his light heart,\r\n+his wonderful joyousness, his passionate absorption in mere existence.\r\n+Then, suddenly, some night he would creep out of the house, go down to\r\n+dreadful places near Blue Gate Fields, and stay there, day after day,\r\n+until he was driven away. On his return he would sit in front of the\r\n+picture, sometimes loathing it and himself, but filled, at other\r\n+times, with that pride of individualism that is half the\r\n+fascination of sin, and smiling with secret pleasure at the misshapen\r\n+shadow that had to bear the burden that should have been his own.\r\n+\r\n+After a few years he could not endure to be long out of England, and\r\n+gave up the villa that he had shared at Trouville with Lord Henry, as\r\n+well as the little white walled-in house at Algiers where they had more\r\n+than once spent the winter. He hated to be separated from the picture\r\n+that was such a part of his life, and was also afraid that during his\r\n+absence some one might gain access to the room, in spite of the\r\n+elaborate bars that he had caused to be placed upon the door.\r\n+\r\n+He was quite conscious that this would tell them nothing. It was true\r\n+that the portrait still preserved, under all the foulness and ugliness\r\n+of the face, its marked likeness to himself; but what could they learn\r\n+from that? He would laugh at any one who tried to taunt him. He had\r\n+not painted it. What was it to him how vile and full of shame it\r\n+looked? Even if he told them, would they believe it?\r\n+\r\n+Yet he was afraid. Sometimes when he was down at his great house in\r\n+Nottinghamshire, entertaining the fashionable young men of his own rank\r\n+who were his chief companions, and astounding the county by the wanton\r\n+luxury and gorgeous splendour of his mode of life, he would suddenly\r\n+leave his guests and rush back to town to see that the door had not\r\n+been tampered with and that the picture was still there. What if it\r\n+should be stolen? The mere thought made him cold with horror. Surely\r\n+the world would know his secret then. Perhaps the world already\r\n+suspected it.\r\n+\r\n+For, while he fascinated many, there were not a few who distrusted him.\r\n+He was very nearly blackballed at a West End club of which his birth\r\n+and social position fully entitled him to become a member, and it was\r\n+said that on one occasion, when he was brought by a friend into the\r\n+smoking-room of the Churchill, the Duke of Berwick and another\r\n+gentleman got up in a marked manner and went out. Curious stories\r\n+became current about him after he had passed his twenty-fifth year. It\r\n+was rumoured that he had been seen brawling with foreign sailors in a\r\n+low den in the distant parts of Whitechapel, and that he consorted with\r\n+thieves and coiners and knew the mysteries of their trade. His\r\n+extraordinary absences became notorious, and, when he used to reappear\r\n+again in society, men would whisper to each other in corners, or pass\r\n+him with a sneer, or look at him with cold searching eyes, as though\r\n+they were determined to discover his secret.\r\n+\r\n+Of such insolences and attempted slights he, of course, took no notice,\r\n+and in the opinion of most people his frank debonair manner, his\r\n+charming boyish smile, and the infinite grace of that wonderful youth\r\n+that seemed never to leave him, were in themselves a sufficient answer\r\n+to the calumnies, for so they termed them, that were circulated about\r\n+him. It was remarked, however, that some of those who had been most\r\n+intimate with him appeared, after a time, to shun him. Women who had\r\n+wildly adored him, and for his sake had braved all social censure and\r\n+set convention at defiance, were seen to grow pallid with shame or\r\n+horror if Dorian Gray entered the room.\r\n+\r\n+Yet these whispered scandals only increased in the eyes of many his\r\n+strange and dangerous charm. His great wealth was a certain element of\r\n+security. Society--civilized society, at least--is never very ready to\r\n+believe anything to the detriment of those who are both rich and\r\n+fascinating. It feels instinctively that manners are of more\r\n+importance than morals, and, in its opinion, the highest respectability\r\n+is of much less value than the possession of a good _chef_. And, after\r\n+all, it is a very poor consolation to be told that the man who has\r\n+given one a bad dinner, or poor wine, is irreproachable in his private\r\n+life. Even the cardinal virtues cannot atone for half-cold _entrees_, as\r\n+Lord Henry remarked once, in a discussion on the subject, and there is\r\n+possibly a good deal to be said for his view. For the canons of good\r\n+society are, or should be, the same as the canons of art. Form is\r\n+absolutely essential to it. It should have the dignity of a ceremony,\r\n+as well as its unreality, and should combine the insincere character of\r\n+a romantic play with the wit and beauty that make such plays delightful\r\n+to us. Is insincerity such a terrible thing? I think not. It is\r\n+merely a method by which we can multiply our personalities.\r\n+\r\n+Such, at any rate, was Dorian Gray's opinion. He used to wonder at the\r\n+shallow psychology of those who conceive the ego in man as a thing\r\n+simple, permanent, reliable, and of one essence. To him, man was a\r\n+being with myriad lives and myriad sensations, a complex multiform\r\n+creature that bore within itself strange legacies of thought and\r\n+passion, and whose very flesh was tainted with the monstrous maladies\r\n+of the dead. He loved to stroll through the gaunt cold picture-gallery\r\n+of his country house and look at the various portraits of those whose\r\n+blood flowed in his veins. Here was Philip Herbert, described by\r\n+Francis Osborne, in his Memoires on the Reigns of Queen Elizabeth and\r\n+King James, as one who was \u0022caressed by the Court for his handsome\r\n+face, which kept him not long company.\u0022 Was it young Herbert's life\r\n+that he sometimes led? Had some strange poisonous germ crept from body\r\n+to body till it had reached his own? Was it some dim sense of that\r\n+ruined grace that had made him so suddenly, and almost without cause,\r\n+give utterance, in Basil Hallward's studio, to the mad prayer that had\r\n+so changed his life? Here, in gold-embroidered red doublet, jewelled\r\n+surcoat, and gilt-edged ruff and wristbands, stood Sir Anthony Sherard,\r\n+with his silver-and-black armour piled at his feet. What had this\r\n+man's legacy been? Had the lover of Giovanna of Naples bequeathed him\r\n+some inheritance of sin and shame? Were his own actions merely the\r\n+dreams that the dead man had not dared to realize? Here, from the\r\n+fading canvas, smiled Lady Elizabeth Devereux, in her gauze hood, pearl\r\n+stomacher, and pink slashed sleeves. A flower was in her right hand,\r\n+and her left clasped an enamelled collar of white and damask roses. On\r\n+a table by her side lay a mandolin and an apple. There were large\r\n+green rosettes upon her little pointed shoes. He knew her life, and\r\n+the strange stories that were told about her lovers. Had he something\r\n+of her temperament in him? These oval, heavy-lidded eyes seemed to\r\n+look curiously at him. What of George Willoughby, with his powdered\r\n+hair and fantastic patches? How evil he looked! The face was\r\n+saturnine and swarthy, and the sensual lips seemed to be twisted with\r\n+disdain. Delicate lace ruffles fell over the lean yellow hands that\r\n+were so overladen with rings. He had been a macaroni of the eighteenth\r\n+century, and the friend, in his youth, of Lord Ferrars. What of the\r\n+second Lord Beckenham, the companion of the Prince Regent in his\r\n+wildest days, and one of the witnesses at the secret marriage with Mrs.\r\n+Fitzherbert? How proud and handsome he was, with his chestnut curls\r\n+and insolent pose! What passions had he bequeathed? The world had\r\n+looked upon him as infamous. He had led the orgies at Carlton House.\r\n+The star of the Garter glittered upon his breast. Beside him hung the\r\n+portrait of his wife, a pallid, thin-lipped woman in black. Her blood,\r\n+also, stirred within him. How curious it all seemed! And his mother\r\n+with her Lady Hamilton face and her moist, wine-dashed lips--he knew\r\n+what he had got from her. He had got from her his beauty, and his\r\n+passion for the beauty of others. She laughed at him in her loose\r\n+Bacchante dress. There were vine leaves in her hair. The purple\r\n+spilled from the cup she was holding. The carnations of the painting\r\n+had withered, but the eyes were still wonderful in their depth and\r\n+brilliancy of colour. They seemed to follow him wherever he went.\r\n+\r\n+Yet one had ancestors in literature as well as in one's own race,\r\n+nearer perhaps in type and temperament, many of them, and certainly\r\n+with an influence of which one was more absolutely conscious. There\r\n+were times when it appeared to Dorian Gray that the whole of history\r\n+was merely the record of his own life, not as he had lived it in act\r\n+and circumstance, but as his imagination had created it for him, as it\r\n+had been in his brain and in his passions. He felt that he had known\r\n+them all, those strange terrible figures that had passed across the\r\n+stage of the world and made sin so marvellous and evil so full of\r\n+subtlety. It seemed to him that in some mysterious way their lives had\r\n+been his own.\r\n+\r\n+The hero of the wonderful novel that had so influenced his life had\r\n+himself known this curious fancy. In the seventh chapter he tells how,\r\n+crowned with laurel, lest lightning might strike him, he had sat, as\r\n+Tiberius, in a garden at Capri, reading the shameful books of\r\n+Elephantis, while dwarfs and peacocks strutted round him and the\r\n+flute-player mocked the swinger of the censer; and, as Caligula, had\r\n+caroused with the green-shirted jockeys in their stables and supped in\r\n+an ivory manger with a jewel-frontleted horse; and, as Domitian, had\r\n+wandered through a corridor lined with marble mirrors, looking round\r\n+with haggard eyes for the reflection of the dagger that was to end his\r\n+days, and sick with that ennui, that terrible _taedium vitae_, that comes\r\n+on those to whom life denies nothing; and had peered through a clear\r\n+emerald at the red shambles of the circus and then, in a litter of\r\n+pearl and purple drawn by silver-shod mules, been carried through the\r\n+Street of Pomegranates to a House of Gold and heard men cry on Nero\r\n+Caesar as he passed by; and, as Elagabalus, had painted his face with\r\n+colours, and plied the distaff among the women, and brought the Moon\r\n+from Carthage and given her in mystic marriage to the Sun.\r\n+\r\n+Over and over again Dorian used to read this fantastic chapter, and the\r\n+two chapters immediately following, in which, as in some curious\r\n+tapestries or cunningly wrought enamels, were pictured the awful and\r\n+beautiful forms of those whom vice and blood and weariness had made\r\n+monstrous or mad: Filippo, Duke of Milan, who slew his wife and\r\n+painted her lips with a scarlet poison that her lover might suck death\r\n+from the dead thing he fondled; Pietro Barbi, the Venetian, known as\r\n+Paul the Second, who sought in his vanity to assume the title of\r\n+Formosus, and whose tiara, valued at two hundred thousand florins, was\r\n+bought at the price of a terrible sin; Gian Maria Visconti, who used\r\n+hounds to chase living men and whose murdered body was covered with\r\n+roses by a harlot who had loved him; the Borgia on his white horse,\r\n+with Fratricide riding beside him and his mantle stained with the blood\r\n+of Perotto; Pietro Riario, the young Cardinal Archbishop of Florence,\r\n+child and minion of Sixtus IV, whose beauty was equalled only by his\r\n+debauchery, and who received Leonora of Aragon in a pavilion of white\r\n+and crimson silk, filled with nymphs and centaurs, and gilded a boy\r\n+that he might serve at the feast as Ganymede or Hylas; Ezzelin, whose\r\n+melancholy could be cured only by the spectacle of death, and who had a\r\n+passion for red blood, as other men have for red wine--the son of the\r\n+Fiend, as was reported, and one who had cheated his father at dice when\r\n+gambling with him for his own soul; Giambattista Cibo, who in mockery\r\n+took the name of Innocent and into whose torpid veins the blood of\r\n+three lads was infused by a Jewish doctor; Sigismondo Malatesta, the\r\n+lover of Isotta and the lord of Rimini, whose effigy was burned at Rome\r\n+as the enemy of God and man, who strangled Polyssena with a napkin, and\r\n+gave poison to Ginevra d'Este in a cup of emerald, and in honour of a\r\n+shameful passion built a pagan church for Christian worship; Charles\r\n+VI, who had so wildly adored his brother's wife that a leper had warned\r\n+him of the insanity that was coming on him, and who, when his brain had\r\n+sickened and grown strange, could only be soothed by Saracen cards\r\n+painted with the images of love and death and madness; and, in his\r\n+trimmed jerkin and jewelled cap and acanthuslike curls, Grifonetto\r\n+Baglioni, who slew Astorre with his bride, and Simonetto with his page,\r\n+and whose comeliness was such that, as he lay dying in the yellow\r\n+piazza of Perugia, those who had hated him could not choose but weep,\r\n+and Atalanta, who had cursed him, blessed him.\r\n+\r\n+There was a horrible fascination in them all. He saw them at night,\r\n+and they troubled his imagination in the day. The Renaissance knew of\r\n+strange manners of poisoning--poisoning by a helmet and a lighted\r\n+torch, by an embroidered glove and a jewelled fan, by a gilded pomander\r\n+and by an amber chain. Dorian Gray had been poisoned by a book. There\r\n+were moments when he looked on evil simply as a mode through which he\r\n+could realize his conception of the beautiful.\r\n+\r\n+\r\n+\r\n+CHAPTER 12\r\n+\r\n+It was on the ninth of November, the eve of his own thirty-eighth\r\n+birthday, as he often remembered afterwards.\r\n+\r\n+He was walking home about eleven o'clock from Lord Henry's, where he\r\n+had been dining, and was wrapped in heavy furs, as the night was cold\r\n+and foggy. At the corner of Grosvenor Square and South Audley Street,\r\n+a man passed him in the mist, walking very fast and with the collar of\r\n+his grey ulster turned up. He had a bag in his hand. Dorian\r\n+recognized him. It was Basil Hallward. A strange sense of fear, for\r\n+which he could not account, came over him. He made no sign of\r\n+recognition and went on quickly in the direction of his own house.\r\n+\r\n+But Hallward had seen him. Dorian heard him first stopping on the\r\n+pavement and then hurrying after him. In a few moments, his hand was\r\n+on his arm.\r\n+\r\n+\u0022Dorian! What an extraordinary piece of luck! I have been waiting for\r\n+you in your library ever since nine o'clock. Finally I took pity on\r\n+your tired servant and told him to go to bed, as he let me out. I am\r\n+off to Paris by the midnight train, and I particularly wanted to see\r\n+you before I left. I thought it was you, or rather your fur coat, as\r\n+you passed me. But I wasn't quite sure. Didn't you recognize me?\u0022\r\n+\r\n+\u0022In this fog, my dear Basil? Why, I can't even recognize Grosvenor\r\n+Square. I believe my house is somewhere about here, but I don't feel\r\n+at all certain about it. I am sorry you are going away, as I have not\r\n+seen you for ages. But I suppose you will be back soon?\u0022\r\n+\r\n+\u0022No: I am going to be out of England for six months. I intend to take\r\n+a studio in Paris and shut myself up till I have finished a great\r\n+picture I have in my head. However, it wasn't about myself I wanted to\r\n+talk. Here we are at your door. Let me come in for a moment. I have\r\n+something to say to you.\u0022\r\n+\r\n+\u0022I shall be charmed. But won't you miss your train?\u0022 said Dorian Gray\r\n+languidly as he passed up the steps and opened the door with his\r\n+latch-key.\r\n+\r\n+The lamplight struggled out through the fog, and Hallward looked at his\r\n+watch. \u0022I have heaps of time,\u0022 he answered. \u0022The train doesn't go\r\n+till twelve-fifteen, and it is only just eleven. In fact, I was on my\r\n+way to the club to look for you, when I met you. You see, I shan't\r\n+have any delay about luggage, as I have sent on my heavy things. All I\r\n+have with me is in this bag, and I can easily get to Victoria in twenty\r\n+minutes.\u0022\r\n+\r\n+Dorian looked at him and smiled. \u0022What a way for a fashionable painter\r\n+to travel! A Gladstone bag and an ulster! Come in, or the fog will\r\n+get into the house. And mind you don't talk about anything serious.\r\n+Nothing is serious nowadays. At least nothing should be.\u0022\r\n+\r\n+Hallward shook his head, as he entered, and followed Dorian into the\r\n+library. There was a bright wood fire blazing in the large open\r\n+hearth. The lamps were lit, and an open Dutch silver spirit-case\r\n+stood, with some siphons of soda-water and large cut-glass tumblers, on\r\n+a little marqueterie table.\r\n+\r\n+\u0022You see your servant made me quite at home, Dorian. He gave me\r\n+everything I wanted, including your best gold-tipped cigarettes. He is\r\n+a most hospitable creature. I like him much better than the Frenchman\r\n+you used to have. What has become of the Frenchman, by the bye?\u0022\r\n+\r\n+Dorian shrugged his shoulders. \u0022I believe he married Lady Radley's\r\n+maid, and has established her in Paris as an English dressmaker.\r\n+Anglomania is very fashionable over there now, I hear. It seems silly\r\n+of the French, doesn't it? But--do you know?--he was not at all a bad\r\n+servant. I never liked him, but I had nothing to complain about. One\r\n+often imagines things that are quite absurd. He was really very\r\n+devoted to me and seemed quite sorry when he went away. Have another\r\n+brandy-and-soda? Or would you like hock-and-seltzer? I always take\r\n+hock-and-seltzer myself. There is sure to be some in the next room.\u0022\r\n+\r\n+\u0022Thanks, I won't have anything more,\u0022 said the painter, taking his cap\r\n+and coat off and throwing them on the bag that he had placed in the\r\n+corner. \u0022And now, my dear fellow, I want to speak to you seriously.\r\n+Don't frown like that. You make it so much more difficult for me.\u0022\r\n+\r\n+\u0022What is it all about?\u0022 cried Dorian in his petulant way, flinging\r\n+himself down on the sofa. \u0022I hope it is not about myself. I am tired\r\n+of myself to-night. I should like to be somebody else.\u0022\r\n+\r\n+\u0022It is about yourself,\u0022 answered Hallward in his grave deep voice, \u0022and\r\n+I must say it to you. I shall only keep you half an hour.\u0022\r\n+\r\n+Dorian sighed and lit a cigarette. \u0022Half an hour!\u0022 he murmured.\r\n+\r\n+\u0022It is not much to ask of you, Dorian, and it is entirely for your own\r\n+sake that I am speaking. I think it right that you should know that\r\n+the most dreadful things are being said against you in London.\u0022\r\n+\r\n+\u0022I don't wish to know anything about them. I love scandals about other\r\n+people, but scandals about myself don't interest me. They have not got\r\n+the charm of novelty.\u0022\r\n+\r\n+\u0022They must interest you, Dorian. Every gentleman is interested in his\r\n+good name. You don't want people to talk of you as something vile and\r\n+degraded. Of course, you have your position, and your wealth, and all\r\n+that kind of thing. But position and wealth are not everything. Mind\r\n+you, I don't believe these rumours at all. At least, I can't believe\r\n+them when I see you. Sin is a thing that writes itself across a man's\r\n+face. It cannot be concealed. People talk sometimes of secret vices.\r\n+There are no such things. If a wretched man has a vice, it shows\r\n+itself in the lines of his mouth, the droop of his eyelids, the\r\n+moulding of his hands even. Somebody--I won't mention his name, but\r\n+you know him--came to me last year to have his portrait done. I had\r\n+never seen him before, and had never heard anything about him at the\r\n+time, though I have heard a good deal since. He offered an extravagant\r\n+price. I refused him. There was something in the shape of his fingers\r\n+that I hated. I know now that I was quite right in what I fancied\r\n+about him. His life is dreadful. But you, Dorian, with your pure,\r\n+bright, innocent face, and your marvellous untroubled youth--I can't\r\n+believe anything against you. And yet I see you very seldom, and you\r\n+never come down to the studio now, and when I am away from you, and I\r\n+hear all these hideous things that people are whispering about you, I\r\n+don't know what to say. Why is it, Dorian, that a man like the Duke of\r\n+Berwick leaves the room of a club when you enter it? Why is it that so\r\n+many gentlemen in London will neither go to your house or invite you to\r\n+theirs? You used to be a friend of Lord Staveley. I met him at dinner\r\n+last week. Your name happened to come up in conversation, in\r\n+connection with the miniatures you have lent to the exhibition at the\r\n+Dudley. Staveley curled his lip and said that you might have the most\r\n+artistic tastes, but that you were a man whom no pure-minded girl\r\n+should be allowed to know, and whom no chaste woman should sit in the\r\n+same room with. I reminded him that I was a friend of yours, and asked\r\n+him what he meant. He told me. He told me right out before everybody.\r\n+It was horrible! Why is your friendship so fatal to young men? There\r\n+was that wretched boy in the Guards who committed suicide. You were\r\n+his great friend. There was Sir Henry Ashton, who had to leave England\r\n+with a tarnished name. You and he were inseparable. What about Adrian\r\n+Singleton and his dreadful end? What about Lord Kent's only son and\r\n+his career? I met his father yesterday in St. James's Street. He\r\n+seemed broken with shame and sorrow. What about the young Duke of\r\n+Perth? What sort of life has he got now? What gentleman would\r\n+associate with him?\u0022\r\n+\r\n+\u0022Stop, Basil. You are talking about things of which you know nothing,\u0022\r\n+said Dorian Gray, biting his lip, and with a note of infinite contempt\r\n+in his voice. \u0022You ask me why Berwick leaves a room when I enter it.\r\n+It is because I know everything about his life, not because he knows\r\n+anything about mine. With such blood as he has in his veins, how could\r\n+his record be clean? You ask me about Henry Ashton and young Perth.\r\n+Did I teach the one his vices, and the other his debauchery? If Kent's\r\n+silly son takes his wife from the streets, what is that to me? If\r\n+Adrian Singleton writes his friend's name across a bill, am I his\r\n+keeper? I know how people chatter in England. The middle classes air\r\n+their moral prejudices over their gross dinner-tables, and whisper\r\n+about what they call the profligacies of their betters in order to try\r\n+and pretend that they are in smart society and on intimate terms with\r\n+the people they slander. In this country, it is enough for a man to\r\n+have distinction and brains for every common tongue to wag against him.\r\n+And what sort of lives do these people, who pose as being moral, lead\r\n+themselves? My dear fellow, you forget that we are in the native land\r\n+of the hypocrite.\u0022\r\n+\r\n+\u0022Dorian,\u0022 cried Hallward, \u0022that is not the question. England is bad\r\n+enough I know, and English society is all wrong. That is the reason\r\n+why I want you to be fine. You have not been fine. One has a right to\r\n+judge of a man by the effect he has over his friends. Yours seem to\r\n+lose all sense of honour, of goodness, of purity. You have filled them\r\n+with a madness for pleasure. They have gone down into the depths. You\r\n+led them there. Yes: you led them there, and yet you can smile, as\r\n+you are smiling now. And there is worse behind. I know you and Harry\r\n+are inseparable. Surely for that reason, if for none other, you should\r\n+not have made his sister's name a by-word.\u0022\r\n+\r\n+\u0022Take care, Basil. You go too far.\u0022\r\n+\r\n+\u0022I must speak, and you must listen. You shall listen. When you met\r\n+Lady Gwendolen, not a breath of scandal had ever touched her. Is there\r\n+a single decent woman in London now who would drive with her in the\r\n+park? Why, even her children are not allowed to live with her. Then\r\n+there are other stories--stories that you have been seen creeping at\r\n+dawn out of dreadful houses and slinking in disguise into the foulest\r\n+dens in London. Are they true? Can they be true? When I first heard\r\n+them, I laughed. I hear them now, and they make me shudder. What\r\n+about your country-house and the life that is led there? Dorian, you\r\n+don't know what is said about you. I won't tell you that I don't want\r\n+to preach to you. I remember Harry saying once that every man who\r\n+turned himself into an amateur curate for the moment always began by\r\n+saying that, and then proceeded to break his word. I do want to preach\r\n+to you. I want you to lead such a life as will make the world respect\r\n+you. I want you to have a clean name and a fair record. I want you to\r\n+get rid of the dreadful people you associate with. Don't shrug your\r\n+shoulders like that. Don't be so indifferent. You have a wonderful\r\n+influence. Let it be for good, not for evil. They say that you\r\n+corrupt every one with whom you become intimate, and that it is quite\r\n+sufficient for you to enter a house for shame of some kind to follow\r\n+after. I don't know whether it is so or not. How should I know? But\r\n+it is said of you. I am told things that it seems impossible to doubt.\r\n+Lord Gloucester was one of my greatest friends at Oxford. He showed me\r\n+a letter that his wife had written to him when she was dying alone in\r\n+her villa at Mentone. Your name was implicated in the most terrible\r\n+confession I ever read. I told him that it was absurd--that I knew you\r\n+thoroughly and that you were incapable of anything of the kind. Know\r\n+you? I wonder do I know you? Before I could answer that, I should\r\n+have to see your soul.\u0022\r\n+\r\n+\u0022To see my soul!\u0022 muttered Dorian Gray, starting up from the sofa and\r\n+turning almost white from fear.\r\n+\r\n+\u0022Yes,\u0022 answered Hallward gravely, and with deep-toned sorrow in his\r\n+voice, \u0022to see your soul. But only God can do that.\u0022\r\n+\r\n+A bitter laugh of mockery broke from the lips of the younger man. \u0022You\r\n+shall see it yourself, to-night!\u0022 he cried, seizing a lamp from the\r\n+table. \u0022Come: it is your own handiwork. Why shouldn't you look at\r\n+it? You can tell the world all about it afterwards, if you choose.\r\n+Nobody would believe you. If they did believe you, they would like me\r\n+all the better for it. I know the age better than you do, though you\r\n+will prate about it so tediously. Come, I tell you. You have\r\n+chattered enough about corruption. Now you shall look on it face to\r\n+face.\u0022\r\n+\r\n+There was the madness of pride in every word he uttered. He stamped\r\n+his foot upon the ground in his boyish insolent manner. He felt a\r\n+terrible joy at the thought that some one else was to share his secret,\r\n+and that the man who had painted the portrait that was the origin of\r\n+all his shame was to be burdened for the rest of his life with the\r\n+hideous memory of what he had done.\r\n+\r\n+\u0022Yes,\u0022 he continued, coming closer to him and looking steadfastly into\r\n+his stern eyes, \u0022I shall show you my soul. You shall see the thing\r\n+that you fancy only God can see.\u0022\r\n+\r\n+Hallward started back. \u0022This is blasphemy, Dorian!\u0022 he cried. \u0022You\r\n+must not say things like that. They are horrible, and they don't mean\r\n+anything.\u0022\r\n+\r\n+\u0022You think so?\u0022 He laughed again.\r\n+\r\n+\u0022I know so. As for what I said to you to-night, I said it for your\r\n+good. You know I have been always a stanch friend to you.\u0022\r\n+\r\n+\u0022Don't touch me. Finish what you have to say.\u0022\r\n+\r\n+A twisted flash of pain shot across the painter's face. He paused for\r\n+a moment, and a wild feeling of pity came over him. After all, what\r\n+right had he to pry into the life of Dorian Gray? If he had done a\r\n+tithe of what was rumoured about him, how much he must have suffered!\r\n+Then he straightened himself up, and walked over to the fire-place, and\r\n+stood there, looking at the burning logs with their frostlike ashes and\r\n+their throbbing cores of flame.\r\n+\r\n+\u0022I am waiting, Basil,\u0022 said the young man in a hard clear voice.\r\n+\r\n+He turned round. \u0022What I have to say is this,\u0022 he cried. \u0022You must\r\n+give me some answer to these horrible charges that are made against\r\n+you. If you tell me that they are absolutely untrue from beginning to\r\n+end, I shall believe you. Deny them, Dorian, deny them! Can't you see\r\n+what I am going through? My God! don't tell me that you are bad, and\r\n+corrupt, and shameful.\u0022\r\n+\r\n+Dorian Gray smiled. There was a curl of contempt in his lips. \u0022Come\r\n+upstairs, Basil,\u0022 he said quietly. \u0022I keep a diary of my life from day\r\n+to day, and it never leaves the room in which it is written. I shall\r\n+show it to you if you come with me.\u0022\r\n+\r\n+\u0022I shall come with you, Dorian, if you wish it. I see I have missed my\r\n+train. That makes no matter. I can go to-morrow. But don't ask me to\r\n+read anything to-night. All I want is a plain answer to my question.\u0022\r\n+\r\n+\u0022That shall be given to you upstairs. I could not give it here. You\r\n+will not have to read long.\u0022\r\n+\r\n+\r\n+\r\n+CHAPTER 13\r\n+\r\n+He passed out of the room and began the ascent, Basil Hallward\r\n+following close behind. They walked softly, as men do instinctively at\r\n+night. The lamp cast fantastic shadows on the wall and staircase. A\r\n+rising wind made some of the windows rattle.\r\n+\r\n+When they reached the top landing, Dorian set the lamp down on the\r\n+floor, and taking out the key, turned it in the lock. \u0022You insist on\r\n+knowing, Basil?\u0022 he asked in a low voice.\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022I am delighted,\u0022 he answered, smiling. Then he added, somewhat\r\n+harshly, \u0022You are the one man in the world who is entitled to know\r\n+everything about me. You have had more to do with my life than you\r\n+think\u0022; and, taking up the lamp, he opened the door and went in. A\r\n+cold current of air passed them, and the light shot up for a moment in\r\n+a flame of murky orange. He shuddered. \u0022Shut the door behind you,\u0022 he\r\n+whispered, as he placed the lamp on the table.\r\n+\r\n+Hallward glanced round him with a puzzled expression. The room looked\r\n+as if it had not been lived in for years. A faded Flemish tapestry, a\r\n+curtained picture, an old Italian _cassone_, and an almost empty\r\n+book-case--that was all that it seemed to contain, besides a chair and\r\n+a table. As Dorian Gray was lighting a half-burned candle that was\r\n+standing on the mantelshelf, he saw that the whole place was covered\r\n+with dust and that the carpet was in holes. A mouse ran scuffling\r\n+behind the wainscoting. There was a damp odour of mildew.\r\n+\r\n+\u0022So you think that it is only God who sees the soul, Basil? Draw that\r\n+curtain back, and you will see mine.\u0022\r\n+\r\n+The voice that spoke was cold and cruel. \u0022You are mad, Dorian, or\r\n+playing a part,\u0022 muttered Hallward, frowning.\r\n+\r\n+\u0022You won't? Then I must do it myself,\u0022 said the young man, and he tore\r\n+the curtain from its rod and flung it on the ground.\r\n+\r\n+An exclamation of horror broke from the painter's lips as he saw in the\r\n+dim light the hideous face on the canvas grinning at him. There was\r\n+something in its expression that filled him with disgust and loathing.\r\n+Good heavens! it was Dorian Gray's own face that he was looking at!\r\n+The horror, whatever it was, had not yet entirely spoiled that\r\n+marvellous beauty. There was still some gold in the thinning hair and\r\n+some scarlet on the sensual mouth. The sodden eyes had kept something\r\n+of the loveliness of their blue, the noble curves had not yet\r\n+completely passed away from chiselled nostrils and from plastic throat.\r\n+Yes, it was Dorian himself. But who had done it? He seemed to\r\n+recognize his own brushwork, and the frame was his own design. The\r\n+idea was monstrous, yet he felt afraid. He seized the lighted candle,\r\n+and held it to the picture. In the left-hand corner was his own name,\r\n+traced in long letters of bright vermilion.\r\n+\r\n+It was some foul parody, some infamous ignoble satire. He had never\r\n+done that. Still, it was his own picture. He knew it, and he felt as\r\n+if his blood had changed in a moment from fire to sluggish ice. His\r\n+own picture! What did it mean? Why had it altered? He turned and\r\n+looked at Dorian Gray with the eyes of a sick man. His mouth twitched,\r\n+and his parched tongue seemed unable to articulate. He passed his hand\r\n+across his forehead. It was dank with clammy sweat.\r\n+\r\n+The young man was leaning against the mantelshelf, watching him with\r\n+that strange expression that one sees on the faces of those who are\r\n+absorbed in a play when some great artist is acting. There was neither\r\n+real sorrow in it nor real joy. There was simply the passion of the\r\n+spectator, with perhaps a flicker of triumph in his eyes. He had taken\r\n+the flower out of his coat, and was smelling it, or pretending to do so.\r\n+\r\n+\u0022What does this mean?\u0022 cried Hallward, at last. His own voice sounded\r\n+shrill and curious in his ears.\r\n+\r\n+\u0022Years ago, when I was a boy,\u0022 said Dorian Gray, crushing the flower in\r\n+his hand, \u0022you met me, flattered me, and taught me to be vain of my\r\n+good looks. One day you introduced me to a friend of yours, who\r\n+explained to me the wonder of youth, and you finished a portrait of me\r\n+that revealed to me the wonder of beauty. In a mad moment that, even\r\n+now, I don't know whether I regret or not, I made a wish, perhaps you\r\n+would call it a prayer....\u0022\r\n+\r\n+\u0022I remember it! Oh, how well I remember it! No! the thing is\r\n+impossible. The room is damp. Mildew has got into the canvas. The\r\n+paints I used had some wretched mineral poison in them. I tell you the\r\n+thing is impossible.\u0022\r\n+\r\n+\u0022Ah, what is impossible?\u0022 murmured the young man, going over to the\r\n+window and leaning his forehead against the cold, mist-stained glass.\r\n+\r\n+\u0022You told me you had destroyed it.\u0022\r\n+\r\n+\u0022I was wrong. It has destroyed me.\u0022\r\n+\r\n+\u0022I don't believe it is my picture.\u0022\r\n+\r\n+\u0022Can't you see your ideal in it?\u0022 said Dorian bitterly.\r\n+\r\n+\u0022My ideal, as you call it...\u0022\r\n+\r\n+\u0022As you called it.\u0022\r\n+\r\n+\u0022There was nothing evil in it, nothing shameful. You were to me such\r\n+an ideal as I shall never meet again. This is the face of a satyr.\u0022\r\n+\r\n+\u0022It is the face of my soul.\u0022\r\n+\r\n+\u0022Christ! what a thing I must have worshipped! It has the eyes of a\r\n+devil.\u0022\r\n+\r\n+\u0022Each of us has heaven and hell in him, Basil,\u0022 cried Dorian with a\r\n+wild gesture of despair.\r\n+\r\n+Hallward turned again to the portrait and gazed at it. \u0022My God! If it\r\n+is true,\u0022 he exclaimed, \u0022and this is what you have done with your life,\r\n+why, you must be worse even than those who talk against you fancy you\r\n+to be!\u0022 He held the light up again to the canvas and examined it. The\r\n+surface seemed to be quite undisturbed and as he had left it. It was\r\n+from within, apparently, that the foulness and horror had come.\r\n+Through some strange quickening of inner life the leprosies of sin were\r\n+slowly eating the thing away. The rotting of a corpse in a watery\r\n+grave was not so fearful.\r\n+\r\n+His hand shook, and the candle fell from its socket on the floor and\r\n+lay there sputtering. He placed his foot on it and put it out. Then\r\n+he flung himself into the rickety chair that was standing by the table\r\n+and buried his face in his hands.\r\n+\r\n+\u0022Good God, Dorian, what a lesson! What an awful lesson!\u0022 There was no\r\n+answer, but he could hear the young man sobbing at the window. \u0022Pray,\r\n+Dorian, pray,\u0022 he murmured. \u0022What is it that one was taught to say in\r\n+one's boyhood? 'Lead us not into temptation. Forgive us our sins.\r\n+Wash away our iniquities.' Let us say that together. The prayer of\r\n+your pride has been answered. The prayer of your repentance will be\r\n+answered also. I worshipped you too much. I am punished for it. You\r\n+worshipped yourself too much. We are both punished.\u0022\r\n+\r\n+Dorian Gray turned slowly around and looked at him with tear-dimmed\r\n+eyes. \u0022It is too late, Basil,\u0022 he faltered.\r\n+\r\n+\u0022It is never too late, Dorian. Let us kneel down and try if we cannot\r\n+remember a prayer. Isn't there a verse somewhere, 'Though your sins be\r\n+as scarlet, yet I will make them as white as snow'?\u0022\r\n+\r\n+\u0022Those words mean nothing to me now.\u0022\r\n+\r\n+\u0022Hush! Don't say that. You have done enough evil in your life. My\r\n+God! Don't you see that accursed thing leering at us?\u0022\r\n+\r\n+Dorian Gray glanced at the picture, and suddenly an uncontrollable\r\n+feeling of hatred for Basil Hallward came over him, as though it had\r\n+been suggested to him by the image on the canvas, whispered into his\r\n+ear by those grinning lips. The mad passions of a hunted animal\r\n+stirred within him, and he loathed the man who was seated at the table,\r\n+more than in his whole life he had ever loathed anything. He glanced\r\n+wildly around. Something glimmered on the top of the painted chest\r\n+that faced him. His eye fell on it. He knew what it was. It was a\r\n+knife that he had brought up, some days before, to cut a piece of cord,\r\n+and had forgotten to take away with him. He moved slowly towards it,\r\n+passing Hallward as he did so. As soon as he got behind him, he seized\r\n+it and turned round. Hallward stirred in his chair as if he was going\r\n+to rise. He rushed at him and dug the knife into the great vein that\r\n+is behind the ear, crushing the man's head down on the table and\r\n+stabbing again and again.\r\n+\r\n+There was a stifled groan and the horrible sound of some one choking\r\n+with blood. Three times the outstretched arms shot up convulsively,\r\n+waving grotesque, stiff-fingered hands in the air. He stabbed him\r\n+twice more, but the man did not move. Something began to trickle on\r\n+the floor. He waited for a moment, still pressing the head down. Then\r\n+he threw the knife on the table, and listened.\r\n+\r\n+He could hear nothing, but the drip, drip on the threadbare carpet. He\r\n+opened the door and went out on the landing. The house was absolutely\r\n+quiet. No one was about. For a few seconds he stood bending over the\r\n+balustrade and peering down into the black seething well of darkness.\r\n+Then he took out the key and returned to the room, locking himself in\r\n+as he did so.\r\n+\r\n+The thing was still seated in the chair, straining over the table with\r\n+bowed head, and humped back, and long fantastic arms. Had it not been\r\n+for the red jagged tear in the neck and the clotted black pool that was\r\n+slowly widening on the table, one would have said that the man was\r\n+simply asleep.\r\n+\r\n+How quickly it had all been done! He felt strangely calm, and walking\r\n+over to the window, opened it and stepped out on the balcony. The wind\r\n+had blown the fog away, and the sky was like a monstrous peacock's\r\n+tail, starred with myriads of golden eyes. He looked down and saw the\r\n+policeman going his rounds and flashing the long beam of his lantern on\r\n+the doors of the silent houses. The crimson spot of a prowling hansom\r\n+gleamed at the corner and then vanished. A woman in a fluttering shawl\r\n+was creeping slowly by the railings, staggering as she went. Now and\r\n+then she stopped and peered back. Once, she began to sing in a hoarse\r\n+voice. The policeman strolled over and said something to her. She\r\n+stumbled away, laughing. A bitter blast swept across the square. The\r\n+gas-lamps flickered and became blue, and the leafless trees shook their\r\n+black iron branches to and fro. He shivered and went back, closing the\r\n+window behind him.\r\n+\r\n+Having reached the door, he turned the key and opened it. He did not\r\n+even glance at the murdered man. He felt that the secret of the whole\r\n+thing was not to realize the situation. The friend who had painted the\r\n+fatal portrait to which all his misery had been due had gone out of his\r\n+life. That was enough.\r\n+\r\n+Then he remembered the lamp. It was a rather curious one of Moorish\r\n+workmanship, made of dull silver inlaid with arabesques of burnished\r\n+steel, and studded with coarse turquoises. Perhaps it might be missed\r\n+by his servant, and questions would be asked. He hesitated for a\r\n+moment, then he turned back and took it from the table. He could not\r\n+help seeing the dead thing. How still it was! How horribly white the\r\n+long hands looked! It was like a dreadful wax image.\r\n+\r\n+Having locked the door behind him, he crept quietly downstairs. The\r\n+woodwork creaked and seemed to cry out as if in pain. He stopped\r\n+several times and waited. No: everything was still. It was merely\r\n+the sound of his own footsteps.\r\n+\r\n+When he reached the library, he saw the bag and coat in the corner.\r\n+They must be hidden away somewhere. He unlocked a secret press that\r\n+was in the wainscoting, a press in which he kept his own curious\r\n+disguises, and put them into it. He could easily burn them afterwards.\r\n+Then he pulled out his watch. It was twenty minutes to two.\r\n+\r\n+He sat down and began to think. Every year--every month, almost--men\r\n+were strangled in England for what he had done. There had been a\r\n+madness of murder in the air. Some red star had come too close to the\r\n+earth.... And yet, what evidence was there against him? Basil Hallward\r\n+had left the house at eleven. No one had seen him come in again. Most\r\n+of the servants were at Selby Royal. His valet had gone to bed....\r\n+Paris! Yes. It was to Paris that Basil had gone, and by the midnight\r\n+train, as he had intended. With his curious reserved habits, it would\r\n+be months before any suspicions would be roused. Months! Everything\r\n+could be destroyed long before then.\r\n+\r\n+A sudden thought struck him. He put on his fur coat and hat and went\r\n+out into the hall. There he paused, hearing the slow heavy tread of\r\n+the policeman on the pavement outside and seeing the flash of the\r\n+bull's-eye reflected in the window. He waited and held his breath.\r\n+\r\n+After a few moments he drew back the latch and slipped out, shutting\r\n+the door very gently behind him. Then he began ringing the bell. In\r\n+about five minutes his valet appeared, half-dressed and looking very\r\n+drowsy.\r\n+\r\n+\u0022I am sorry to have had to wake you up, Francis,\u0022 he said, stepping in;\r\n+\u0022but I had forgotten my latch-key. What time is it?\u0022\r\n+\r\n+\u0022Ten minutes past two, sir,\u0022 answered the man, looking at the clock and\r\n+blinking.\r\n+\r\n+\u0022Ten minutes past two? How horribly late! You must wake me at nine\r\n+to-morrow. I have some work to do.\u0022\r\n+\r\n+\u0022All right, sir.\u0022\r\n+\r\n+\u0022Did any one call this evening?\u0022\r\n+\r\n+\u0022Mr. Hallward, sir. He stayed here till eleven, and then he went away\r\n+to catch his train.\u0022\r\n+\r\n+\u0022Oh! I am sorry I didn't see him. Did he leave any message?\u0022\r\n+\r\n+\u0022No, sir, except that he would write to you from Paris, if he did not\r\n+find you at the club.\u0022\r\n+\r\n+\u0022That will do, Francis. Don't forget to call me at nine to-morrow.\u0022\r\n+\r\n+\u0022No, sir.\u0022\r\n+\r\n+The man shambled down the passage in his slippers.\r\n+\r\n+Dorian Gray threw his hat and coat upon the table and passed into the\r\n+library. For a quarter of an hour he walked up and down the room,\r\n+biting his lip and thinking. Then he took down the Blue Book from one\r\n+of the shelves and began to turn over the leaves. \u0022Alan Campbell, 152,\r\n+Hertford Street, Mayfair.\u0022 Yes; that was the man he wanted.\r\n+\r\n+\r\n+\r\n+CHAPTER 14\r\n+\r\n+At nine o'clock the next morning his servant came in with a cup of\r\n+chocolate on a tray and opened the shutters. Dorian was sleeping quite\r\n+peacefully, lying on his right side, with one hand underneath his\r\n+cheek. He looked like a boy who had been tired out with play, or study.\r\n+\r\n+The man had to touch him twice on the shoulder before he woke, and as\r\n+he opened his eyes a faint smile passed across his lips, as though he\r\n+had been lost in some delightful dream. Yet he had not dreamed at all.\r\n+His night had been untroubled by any images of pleasure or of pain.\r\n+But youth smiles without any reason. It is one of its chiefest charms.\r\n+\r\n+He turned round, and leaning upon his elbow, began to sip his\r\n+chocolate. The mellow November sun came streaming into the room. The\r\n+sky was bright, and there was a genial warmth in the air. It was\r\n+almost like a morning in May.\r\n+\r\n+Gradually the events of the preceding night crept with silent,\r\n+blood-stained feet into his brain and reconstructed themselves there\r\n+with terrible distinctness. He winced at the memory of all that he had\r\n+suffered, and for a moment the same curious feeling of loathing for\r\n+Basil Hallward that had made him kill him as he sat in the chair came\r\n+back to him, and he grew cold with passion. The dead man was still\r\n+sitting there, too, and in the sunlight now. How horrible that was!\r\n+Such hideous things were for the darkness, not for the day.\r\n+\r\n+He felt that if he brooded on what he had gone through he would sicken\r\n+or grow mad. There were sins whose fascination was more in the memory\r\n+than in the doing of them, strange triumphs that gratified the pride\r\n+more than the passions, and gave to the intellect a quickened sense of\r\n+joy, greater than any joy they brought, or could ever bring, to the\r\n+senses. But this was not one of them. It was a thing to be driven out\r\n+of the mind, to be drugged with poppies, to be strangled lest it might\r\n+strangle one itself.\r\n+\r\n+When the half-hour struck, he passed his hand across his forehead, and\r\n+then got up hastily and dressed himself with even more than his usual\r\n+care, giving a good deal of attention to the choice of his necktie and\r\n+scarf-pin and changing his rings more than once. He spent a long time\r\n+also over breakfast, tasting the various dishes, talking to his valet\r\n+about some new liveries that he was thinking of getting made for the\r\n+servants at Selby, and going through his correspondence. At some of\r\n+the letters, he smiled. Three of them bored him. One he read several\r\n+times over and then tore up with a slight look of annoyance in his\r\n+face. \u0022That awful thing, a woman's memory!\u0022 as Lord Henry had once\r\n+said.\r\n+\r\n+After he had drunk his cup of black coffee, he wiped his lips slowly\r\n+with a napkin, motioned to his servant to wait, and going over to the\r\n+table, sat down and wrote two letters. One he put in his pocket, the\r\n+other he handed to the valet.\r\n+\r\n+\u0022Take this round to 152, Hertford Street, Francis, and if Mr. Campbell\r\n+is out of town, get his address.\u0022\r\n+\r\n+As soon as he was alone, he lit a cigarette and began sketching upon a\r\n+piece of paper, drawing first flowers and bits of architecture, and\r\n+then human faces. Suddenly he remarked that every face that he drew\r\n+seemed to have a fantastic likeness to Basil Hallward. He frowned, and\r\n+getting up, went over to the book-case and took out a volume at hazard.\r\n+He was determined that he would not think about what had happened until\r\n+it became absolutely necessary that he should do so.\r\n+\r\n+When he had stretched himself on the sofa, he looked at the title-page\r\n+of the book. It was Gautier's Emaux et Camees, Charpentier's\r\n+Japanese-paper edition, with the Jacquemart etching. The binding was\r\n+of citron-green leather, with a design of gilt trellis-work and dotted\r\n+pomegranates. It had been given to him by Adrian Singleton. As he\r\n+turned over the pages, his eye fell on the poem about the hand of\r\n+Lacenaire, the cold yellow hand \u0022_du supplice encore mal lavee_,\u0022 with\r\n+its downy red hairs and its \u0022_doigts de faune_.\u0022 He glanced at his own\r\n+white taper fingers, shuddering slightly in spite of himself, and\r\n+passed on, till he came to those lovely stanzas upon Venice:\r\n+\r\n+ Sur une gamme chromatique,\r\n+ Le sein de perles ruisselant,\r\n+ La Venus de l'Adriatique\r\n+ Sort de l'eau son corps rose et blanc.\r\n+\r\n+ Les domes, sur l'azur des ondes\r\n+ Suivant la phrase au pur contour,\r\n+ S'enflent comme des gorges rondes\r\n+ Que souleve un soupir d'amour.\r\n+\r\n+ L'esquif aborde et me depose,\r\n+ Jetant son amarre au pilier,\r\n+ Devant une facade rose,\r\n+ Sur le marbre d'un escalier.\r\n+\r\n+\r\n+How exquisite they were! As one read them, one seemed to be floating\r\n+down the green water-ways of the pink and pearl city, seated in a black\r\n+gondola with silver prow and trailing curtains. The mere lines looked\r\n+to him like those straight lines of turquoise-blue that follow one as\r\n+one pushes out to the Lido. The sudden flashes of colour reminded him\r\n+of the gleam of the opal-and-iris-throated birds that flutter round the\r\n+tall honeycombed Campanile, or stalk, with such stately grace, through\r\n+the dim, dust-stained arcades. Leaning back with half-closed eyes, he\r\n+kept saying over and over to himself:\r\n+\r\n+ \u0022Devant une facade rose,\r\n+ Sur le marbre d'un escalier.\u0022\r\n+\r\n+The whole of Venice was in those two lines. He remembered the autumn\r\n+that he had passed there, and a wonderful love that had stirred him to\r\n+mad delightful follies. There was romance in every place. But Venice,\r\n+like Oxford, had kept the background for romance, and, to the true\r\n+romantic, background was everything, or almost everything. Basil had\r\n+been with him part of the time, and had gone wild over Tintoret. Poor\r\n+Basil! What a horrible way for a man to die!\r\n+\r\n+He sighed, and took up the volume again, and tried to forget. He read\r\n+of the swallows that fly in and out of the little _cafe_ at Smyrna where\r\n+the Hadjis sit counting their amber beads and the turbaned merchants\r\n+smoke their long tasselled pipes and talk gravely to each other; he\r\n+read of the Obelisk in the Place de la Concorde that weeps tears of\r\n+granite in its lonely sunless exile and longs to be back by the hot,\r\n+lotus-covered Nile, where there are Sphinxes, and rose-red ibises, and\r\n+white vultures with gilded claws, and crocodiles with small beryl eyes\r\n+that crawl over the green steaming mud; he began to brood over those\r\n+verses which, drawing music from kiss-stained marble, tell of that\r\n+curious statue that Gautier compares to a contralto voice, the \u0022_monstre\r\n+charmant_\u0022 that couches in the porphyry-room of the Louvre. But after a\r\n+time the book fell from his hand. He grew nervous, and a horrible fit\r\n+of terror came over him. What if Alan Campbell should be out of\r\n+England? Days would elapse before he could come back. Perhaps he\r\n+might refuse to come. What could he do then? Every moment was of\r\n+vital importance.\r\n+\r\n+They had been great friends once, five years before--almost\r\n+inseparable, indeed. Then the intimacy had come suddenly to an end.\r\n+When they met in society now, it was only Dorian Gray who smiled: Alan\r\n+Campbell never did.\r\n+\r\n+He was an extremely clever young man, though he had no real\r\n+appreciation of the visible arts, and whatever little sense of the\r\n+beauty of poetry he possessed he had gained entirely from Dorian. His\r\n+dominant intellectual passion was for science. At Cambridge he had\r\n+spent a great deal of his time working in the laboratory, and had taken\r\n+a good class in the Natural Science Tripos of his year. Indeed, he was\r\n+still devoted to the study of chemistry, and had a laboratory of his\r\n+own in which he used to shut himself up all day long, greatly to the\r\n+annoyance of his mother, who had set her heart on his standing for\r\n+Parliament and had a vague idea that a chemist was a person who made up\r\n+prescriptions. He was an excellent musician, however, as well, and\r\n+played both the violin and the piano better than most amateurs. In\r\n+fact, it was music that had first brought him and Dorian Gray\r\n+together--music and that indefinable attraction that Dorian seemed to\r\n+be able to exercise whenever he wished--and, indeed, exercised often\r\n+without being conscious of it. They had met at Lady Berkshire's the\r\n+night that Rubinstein played there, and after that used to be always\r\n+seen together at the opera and wherever good music was going on. For\r\n+eighteen months their intimacy lasted. Campbell was always either at\r\n+Selby Royal or in Grosvenor Square. To him, as to many others, Dorian\r\n+Gray was the type of everything that is wonderful and fascinating in\r\n+life. Whether or not a quarrel had taken place between them no one\r\n+ever knew. But suddenly people remarked that they scarcely spoke when\r\n+they met and that Campbell seemed always to go away early from any\r\n+party at which Dorian Gray was present. He had changed, too--was\r\n+strangely melancholy at times, appeared almost to dislike hearing\r\n+music, and would never himself play, giving as his excuse, when he was\r\n+called upon, that he was so absorbed in science that he had no time\r\n+left in which to practise. And this was certainly true. Every day he\r\n+seemed to become more interested in biology, and his name appeared once\r\n+or twice in some of the scientific reviews in connection with certain\r\n+curious experiments.\r\n+\r\n+This was the man Dorian Gray was waiting for. Every second he kept\r\n+glancing at the clock. As the minutes went by he became horribly\r\n+agitated. At last he got up and began to pace up and down the room,\r\n+looking like a beautiful caged thing. He took long stealthy strides.\r\n+His hands were curiously cold.\r\n+\r\n+The suspense became unbearable. Time seemed to him to be crawling with\r\n+feet of lead, while he by monstrous winds was being swept towards the\r\n+jagged edge of some black cleft of precipice. He knew what was waiting\r\n+for him there; saw it, indeed, and, shuddering, crushed with dank hands\r\n+his burning lids as though he would have robbed the very brain of sight\r\n+and driven the eyeballs back into their cave. It was useless. The\r\n+brain had its own food on which it battened, and the imagination, made\r\n+grotesque by terror, twisted and distorted as a living thing by pain,\r\n+danced like some foul puppet on a stand and grinned through moving\r\n+masks. Then, suddenly, time stopped for him. Yes: that blind,\r\n+slow-breathing thing crawled no more, and horrible thoughts, time being\r\n+dead, raced nimbly on in front, and dragged a hideous future from its\r\n+grave, and showed it to him. He stared at it. Its very horror made\r\n+him stone.\r\n+\r\n+At last the door opened and his servant entered. He turned glazed eyes\r\n+upon him.\r\n+\r\n+\u0022Mr. Campbell, sir,\u0022 said the man.\r\n+\r\n+A sigh of relief broke from his parched lips, and the colour came back\r\n+to his cheeks.\r\n+\r\n+\u0022Ask him to come in at once, Francis.\u0022 He felt that he was himself\r\n+again. His mood of cowardice had passed away.\r\n+\r\n+The man bowed and retired. In a few moments, Alan Campbell walked in,\r\n+looking very stern and rather pale, his pallor being intensified by his\r\n+coal-black hair and dark eyebrows.\r\n+\r\n+\u0022Alan! This is kind of you. I thank you for coming.\u0022\r\n+\r\n+\u0022I had intended never to enter your house again, Gray. But you said it\r\n+was a matter of life and death.\u0022 His voice was hard and cold. He\r\n+spoke with slow deliberation. There was a look of contempt in the\r\n+steady searching gaze that he turned on Dorian. He kept his hands in\r\n+the pockets of his Astrakhan coat, and seemed not to have noticed the\r\n+gesture with which he had been greeted.\r\n+\r\n+\u0022Yes: it is a matter of life and death, Alan, and to more than one\r\n+person. Sit down.\u0022\r\n+\r\n+Campbell took a chair by the table, and Dorian sat opposite to him.\r\n+The two men's eyes met. In Dorian's there was infinite pity. He knew\r\n+that what he was going to do was dreadful.\r\n+\r\n+After a strained moment of silence, he leaned across and said, very\r\n+quietly, but watching the effect of each word upon the face of him he\r\n+had sent for, \u0022Alan, in a locked room at the top of this house, a room\r\n+to which nobody but myself has access, a dead man is seated at a table.\r\n+He has been dead ten hours now. Don't stir, and don't look at me like\r\n+that. Who the man is, why he died, how he died, are matters that do\r\n+not concern you. What you have to do is this--\u0022\r\n+\r\n+\u0022Stop, Gray. I don't want to know anything further. Whether what you\r\n+have told me is true or not true doesn't concern me. I entirely\r\n+decline to be mixed up in your life. Keep your horrible secrets to\r\n+yourself. They don't interest me any more.\u0022\r\n+\r\n+\u0022Alan, they will have to interest you. This one will have to interest\r\n+you. I am awfully sorry for you, Alan. But I can't help myself. You\r\n+are the one man who is able to save me. I am forced to bring you into\r\n+the matter. I have no option. Alan, you are scientific. You know\r\n+about chemistry and things of that kind. You have made experiments.\r\n+What you have got to do is to destroy the thing that is upstairs--to\r\n+destroy it so that not a vestige of it will be left. Nobody saw this\r\n+person come into the house. Indeed, at the present moment he is\r\n+supposed to be in Paris. He will not be missed for months. When he is\r\n+missed, there must be no trace of him found here. You, Alan, you must\r\n+change him, and everything that belongs to him, into a handful of ashes\r\n+that I may scatter in the air.\u0022\r\n+\r\n+\u0022You are mad, Dorian.\u0022\r\n+\r\n+\u0022Ah! I was waiting for you to call me Dorian.\u0022\r\n+\r\n+\u0022You are mad, I tell you--mad to imagine that I would raise a finger to\r\n+help you, mad to make this monstrous confession. I will have nothing\r\n+to do with this matter, whatever it is. Do you think I am going to\r\n+peril my reputation for you? What is it to me what devil's work you\r\n+are up to?\u0022\r\n+\r\n+\u0022It was suicide, Alan.\u0022\r\n+\r\n+\u0022I am glad of that. But who drove him to it? You, I should fancy.\u0022\r\n+\r\n+\u0022Do you still refuse to do this for me?\u0022\r\n+\r\n+\u0022Of course I refuse. I will have absolutely nothing to do with it. I\r\n+don't care what shame comes on you. You deserve it all. I should not\r\n+be sorry to see you disgraced, publicly disgraced. How dare you ask\r\n+me, of all men in the world, to mix myself up in this horror? I should\r\n+have thought you knew more about people's characters. Your friend Lord\r\n+Henry Wotton can't have taught you much about psychology, whatever else\r\n+he has taught you. Nothing will induce me to stir a step to help you.\r\n+You have come to the wrong man. Go to some of your friends. Don't\r\n+come to me.\u0022\r\n+\r\n+\u0022Alan, it was murder. I killed him. You don't know what he had made\r\n+me suffer. Whatever my life is, he had more to do with the making or\r\n+the marring of it than poor Harry has had. He may not have intended\r\n+it, the result was the same.\u0022\r\n+\r\n+\u0022Murder! Good God, Dorian, is that what you have come to? I shall not\r\n+inform upon you. It is not my business. Besides, without my stirring\r\n+in the matter, you are certain to be arrested. Nobody ever commits a\r\n+crime without doing something stupid. But I will have nothing to do\r\n+with it.\u0022\r\n+\r\n+\u0022You must have something to do with it. Wait, wait a moment; listen to\r\n+me. Only listen, Alan. All I ask of you is to perform a certain\r\n+scientific experiment. You go to hospitals and dead-houses, and the\r\n+horrors that you do there don't affect you. If in some hideous\r\n+dissecting-room or fetid laboratory you found this man lying on a\r\n+leaden table with red gutters scooped out in it for the blood to flow\r\n+through, you would simply look upon him as an admirable subject. You\r\n+would not turn a hair. You would not believe that you were doing\r\n+anything wrong. On the contrary, you would probably feel that you were\r\n+benefiting the human race, or increasing the sum of knowledge in the\r\n+world, or gratifying intellectual curiosity, or something of that kind.\r\n+What I want you to do is merely what you have often done before.\r\n+Indeed, to destroy a body must be far less horrible than what you are\r\n+accustomed to work at. And, remember, it is the only piece of evidence\r\n+against me. If it is discovered, I am lost; and it is sure to be\r\n+discovered unless you help me.\u0022\r\n+\r\n+\u0022I have no desire to help you. You forget that. I am simply\r\n+indifferent to the whole thing. It has nothing to do with me.\u0022\r\n+\r\n+\u0022Alan, I entreat you. Think of the position I am in. Just before you\r\n+came I almost fainted with terror. You may know terror yourself some\r\n+day. No! don't think of that. Look at the matter purely from the\r\n+scientific point of view. You don't inquire where the dead things on\r\n+which you experiment come from. Don't inquire now. I have told you\r\n+too much as it is. But I beg of you to do this. We were friends once,\r\n+Alan.\u0022\r\n+\r\n+\u0022Don't speak about those days, Dorian--they are dead.\u0022\r\n+\r\n+\u0022The dead linger sometimes. The man upstairs will not go away. He is\r\n+sitting at the table with bowed head and outstretched arms. Alan!\r\n+Alan! If you don't come to my assistance, I am ruined. Why, they will\r\n+hang me, Alan! Don't you understand? They will hang me for what I\r\n+have done.\u0022\r\n+\r\n+\u0022There is no good in prolonging this scene. I absolutely refuse to do\r\n+anything in the matter. It is insane of you to ask me.\u0022\r\n+\r\n+\u0022You refuse?\u0022\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022I entreat you, Alan.\u0022\r\n+\r\n+\u0022It is useless.\u0022\r\n+\r\n+The same look of pity came into Dorian Gray's eyes. Then he stretched\r\n+out his hand, took a piece of paper, and wrote something on it. He\r\n+read it over twice, folded it carefully, and pushed it across the\r\n+table. Having done this, he got up and went over to the window.\r\n+\r\n+Campbell looked at him in surprise, and then took up the paper, and\r\n+opened it. As he read it, his face became ghastly pale and he fell\r\n+back in his chair. A horrible sense of sickness came over him. He\r\n+felt as if his heart was beating itself to death in some empty hollow.\r\n+\r\n+After two or three minutes of terrible silence, Dorian turned round and\r\n+came and stood behind him, putting his hand upon his shoulder.\r\n+\r\n+\u0022I am so sorry for you, Alan,\u0022 he murmured, \u0022but you leave me no\r\n+alternative. I have a letter written already. Here it is. You see\r\n+the address. If you don't help me, I must send it. If you don't help\r\n+me, I will send it. You know what the result will be. But you are\r\n+going to help me. It is impossible for you to refuse now. I tried to\r\n+spare you. You will do me the justice to admit that. You were stern,\r\n+harsh, offensive. You treated me as no man has ever dared to treat\r\n+me--no living man, at any rate. I bore it all. Now it is for me to\r\n+dictate terms.\u0022\r\n+\r\n+Campbell buried his face in his hands, and a shudder passed through him.\r\n+\r\n+\u0022Yes, it is my turn to dictate terms, Alan. You know what they are.\r\n+The thing is quite simple. Come, don't work yourself into this fever.\r\n+The thing has to be done. Face it, and do it.\u0022\r\n+\r\n+A groan broke from Campbell's lips and he shivered all over. The\r\n+ticking of the clock on the mantelpiece seemed to him to be dividing\r\n+time into separate atoms of agony, each of which was too terrible to be\r\n+borne. He felt as if an iron ring was being slowly tightened round his\r\n+forehead, as if the disgrace with which he was threatened had already\r\n+come upon him. The hand upon his shoulder weighed like a hand of lead.\r\n+It was intolerable. It seemed to crush him.\r\n+\r\n+\u0022Come, Alan, you must decide at once.\u0022\r\n+\r\n+\u0022I cannot do it,\u0022 he said, mechanically, as though words could alter\r\n+things.\r\n+\r\n+\u0022You must. You have no choice. Don't delay.\u0022\r\n+\r\n+He hesitated a moment. \u0022Is there a fire in the room upstairs?\u0022\r\n+\r\n+\u0022Yes, there is a gas-fire with asbestos.\u0022\r\n+\r\n+\u0022I shall have to go home and get some things from the laboratory.\u0022\r\n+\r\n+\u0022No, Alan, you must not leave the house. Write out on a sheet of\r\n+notepaper what you want and my servant will take a cab and bring the\r\n+things back to you.\u0022\r\n+\r\n+Campbell scrawled a few lines, blotted them, and addressed an envelope\r\n+to his assistant. Dorian took the note up and read it carefully. Then\r\n+he rang the bell and gave it to his valet, with orders to return as\r\n+soon as possible and to bring the things with him.\r\n+\r\n+As the hall door shut, Campbell started nervously, and having got up\r\n+from the chair, went over to the chimney-piece. He was shivering with a\r\n+kind of ague. For nearly twenty minutes, neither of the men spoke. A\r\n+fly buzzed noisily about the room, and the ticking of the clock was\r\n+like the beat of a hammer.\r\n+\r\n+As the chime struck one, Campbell turned round, and looking at Dorian\r\n+Gray, saw that his eyes were filled with tears. There was something in\r\n+the purity and refinement of that sad face that seemed to enrage him.\r\n+\u0022You are infamous, absolutely infamous!\u0022 he muttered.\r\n+\r\n+\u0022Hush, Alan. You have saved my life,\u0022 said Dorian.\r\n+\r\n+\u0022Your life? Good heavens! what a life that is! You have gone from\r\n+corruption to corruption, and now you have culminated in crime. In\r\n+doing what I am going to do--what you force me to do--it is not of your\r\n+life that I am thinking.\u0022\r\n+\r\n+\u0022Ah, Alan,\u0022 murmured Dorian with a sigh, \u0022I wish you had a thousandth\r\n+part of the pity for me that I have for you.\u0022 He turned away as he\r\n+spoke and stood looking out at the garden. Campbell made no answer.\r\n+\r\n+After about ten minutes a knock came to the door, and the servant\r\n+entered, carrying a large mahogany chest of chemicals, with a long coil\r\n+of steel and platinum wire and two rather curiously shaped iron clamps.\r\n+\r\n+\u0022Shall I leave the things here, sir?\u0022 he asked Campbell.\r\n+\r\n+\u0022Yes,\u0022 said Dorian. \u0022And I am afraid, Francis, that I have another\r\n+errand for you. What is the name of the man at Richmond who supplies\r\n+Selby with orchids?\u0022\r\n+\r\n+\u0022Harden, sir.\u0022\r\n+\r\n+\u0022Yes--Harden. You must go down to Richmond at once, see Harden\r\n+personally, and tell him to send twice as many orchids as I ordered,\r\n+and to have as few white ones as possible. In fact, I don't want any\r\n+white ones. It is a lovely day, Francis, and Richmond is a very pretty\r\n+place--otherwise I wouldn't bother you about it.\u0022\r\n+\r\n+\u0022No trouble, sir. At what time shall I be back?\u0022\r\n+\r\n+Dorian looked at Campbell. \u0022How long will your experiment take, Alan?\u0022\r\n+he said in a calm indifferent voice. The presence of a third person in\r\n+the room seemed to give him extraordinary courage.\r\n+\r\n+Campbell frowned and bit his lip. \u0022It will take about five hours,\u0022 he\r\n+answered.\r\n+\r\n+\u0022It will be time enough, then, if you are back at half-past seven,\r\n+Francis. Or stay: just leave my things out for dressing. You can\r\n+have the evening to yourself. I am not dining at home, so I shall not\r\n+want you.\u0022\r\n+\r\n+\u0022Thank you, sir,\u0022 said the man, leaving the room.\r\n+\r\n+\u0022Now, Alan, there is not a moment to be lost. How heavy this chest is!\r\n+I'll take it for you. You bring the other things.\u0022 He spoke rapidly\r\n+and in an authoritative manner. Campbell felt dominated by him. They\r\n+left the room together.\r\n+\r\n+When they reached the top landing, Dorian took out the key and turned\r\n+it in the lock. Then he stopped, and a troubled look came into his\r\n+eyes. He shuddered. \u0022I don't think I can go in, Alan,\u0022 he murmured.\r\n+\r\n+\u0022It is nothing to me. I don't require you,\u0022 said Campbell coldly.\r\n+\r\n+Dorian half opened the door. As he did so, he saw the face of his\r\n+portrait leering in the sunlight. On the floor in front of it the torn\r\n+curtain was lying. He remembered that the night before he had\r\n+forgotten, for the first time in his life, to hide the fatal canvas,\r\n+and was about to rush forward, when he drew back with a shudder.\r\n+\r\n+What was that loathsome red dew that gleamed, wet and glistening, on\r\n+one of the hands, as though the canvas had sweated blood? How horrible\r\n+it was!--more horrible, it seemed to him for the moment, than the\r\n+silent thing that he knew was stretched across the table, the thing\r\n+whose grotesque misshapen shadow on the spotted carpet showed him that\r\n+it had not stirred, but was still there, as he had left it.\r\n+\r\n+He heaved a deep breath, opened the door a little wider, and with\r\n+half-closed eyes and averted head, walked quickly in, determined that\r\n+he would not look even once upon the dead man. Then, stooping down and\r\n+taking up the gold-and-purple hanging, he flung it right over the\r\n+picture.\r\n+\r\n+There he stopped, feeling afraid to turn round, and his eyes fixed\r\n+themselves on the intricacies of the pattern before him. He heard\r\n+Campbell bringing in the heavy chest, and the irons, and the other\r\n+things that he had required for his dreadful work. He began to wonder\r\n+if he and Basil Hallward had ever met, and, if so, what they had\r\n+thought of each other.\r\n+\r\n+\u0022Leave me now,\u0022 said a stern voice behind him.\r\n+\r\n+He turned and hurried out, just conscious that the dead man had been\r\n+thrust back into the chair and that Campbell was gazing into a\r\n+glistening yellow face. As he was going downstairs, he heard the key\r\n+being turned in the lock.\r\n+\r\n+It was long after seven when Campbell came back into the library. He\r\n+was pale, but absolutely calm. \u0022I have done what you asked me to do,\u0022\r\n+he muttered. \u0022And now, good-bye. Let us never see each other again.\u0022\r\n+\r\n+\u0022You have saved me from ruin, Alan. I cannot forget that,\u0022 said Dorian\r\n+simply.\r\n+\r\n+As soon as Campbell had left, he went upstairs. There was a horrible\r\n+smell of nitric acid in the room. But the thing that had been sitting\r\n+at the table was gone.\r\n+\r\n+\r\n+\r\n+CHAPTER 15\r\n+\r\n+That evening, at eight-thirty, exquisitely dressed and wearing a large\r\n+button-hole of Parma violets, Dorian Gray was ushered into Lady\r\n+Narborough's drawing-room by bowing servants. His forehead was\r\n+throbbing with maddened nerves, and he felt wildly excited, but his\r\n+manner as he bent over his hostess's hand was as easy and graceful as\r\n+ever. Perhaps one never seems so much at one's ease as when one has to\r\n+play a part. Certainly no one looking at Dorian Gray that night could\r\n+have believed that he had passed through a tragedy as horrible as any\r\n+tragedy of our age. Those finely shaped fingers could never have\r\n+clutched a knife for sin, nor those smiling lips have cried out on God\r\n+and goodness. He himself could not help wondering at the calm of his\r\n+demeanour, and for a moment felt keenly the terrible pleasure of a\r\n+double life.\r\n+\r\n+It was a small party, got up rather in a hurry by Lady Narborough, who\r\n+was a very clever woman with what Lord Henry used to describe as the\r\n+remains of really remarkable ugliness. She had proved an excellent\r\n+wife to one of our most tedious ambassadors, and having buried her\r\n+husband properly in a marble mausoleum, which she had herself designed,\r\n+and married off her daughters to some rich, rather elderly men, she\r\n+devoted herself now to the pleasures of French fiction, French cookery,\r\n+and French _esprit_ when she could get it.\r\n+\r\n+Dorian was one of her especial favourites, and she always told him that\r\n+she was extremely glad she had not met him in early life. \u0022I know, my\r\n+dear, I should have fallen madly in love with you,\u0022 she used to say,\r\n+\u0022and thrown my bonnet right over the mills for your sake. It is most\r\n+fortunate that you were not thought of at the time. As it was, our\r\n+bonnets were so unbecoming, and the mills were so occupied in trying to\r\n+raise the wind, that I never had even a flirtation with anybody.\r\n+However, that was all Narborough's fault. He was dreadfully\r\n+short-sighted, and there is no pleasure in taking in a husband who\r\n+never sees anything.\u0022\r\n+\r\n+Her guests this evening were rather tedious. The fact was, as she\r\n+explained to Dorian, behind a very shabby fan, one of her married\r\n+daughters had come up quite suddenly to stay with her, and, to make\r\n+matters worse, had actually brought her husband with her. \u0022I think it\r\n+is most unkind of her, my dear,\u0022 she whispered. \u0022Of course I go and\r\n+stay with them every summer after I come from Homburg, but then an old\r\n+woman like me must have fresh air sometimes, and besides, I really wake\r\n+them up. You don't know what an existence they lead down there. It is\r\n+pure unadulterated country life. They get up early, because they have\r\n+so much to do, and go to bed early, because they have so little to\r\n+think about. There has not been a scandal in the neighbourhood since\r\n+the time of Queen Elizabeth, and consequently they all fall asleep\r\n+after dinner. You shan't sit next either of them. You shall sit by me\r\n+and amuse me.\u0022\r\n+\r\n+Dorian murmured a graceful compliment and looked round the room. Yes:\r\n+it was certainly a tedious party. Two of the people he had never seen\r\n+before, and the others consisted of Ernest Harrowden, one of those\r\n+middle-aged mediocrities so common in London clubs who have no enemies,\r\n+but are thoroughly disliked by their friends; Lady Ruxton, an\r\n+overdressed woman of forty-seven, with a hooked nose, who was always\r\n+trying to get herself compromised, but was so peculiarly plain that to\r\n+her great disappointment no one would ever believe anything against\r\n+her; Mrs. Erlynne, a pushing nobody, with a delightful lisp and\r\n+Venetian-red hair; Lady Alice Chapman, his hostess's daughter, a dowdy\r\n+dull girl, with one of those characteristic British faces that, once\r\n+seen, are never remembered; and her husband, a red-cheeked,\r\n+white-whiskered creature who, like so many of his class, was under the\r\n+impression that inordinate joviality can atone for an entire lack of\r\n+ideas.\r\n+\r\n+He was rather sorry he had come, till Lady Narborough, looking at the\r\n+great ormolu gilt clock that sprawled in gaudy curves on the\r\n+mauve-draped mantelshelf, exclaimed: \u0022How horrid of Henry Wotton to be\r\n+so late! I sent round to him this morning on chance and he promised\r\n+faithfully not to disappoint me.\u0022\r\n+\r\n+It was some consolation that Harry was to be there, and when the door\r\n+opened and he heard his slow musical voice lending charm to some\r\n+insincere apology, he ceased to feel bored.\r\n+\r\n+But at dinner he could not eat anything. Plate after plate went away\r\n+untasted. Lady Narborough kept scolding him for what she called \u0022an\r\n+insult to poor Adolphe, who invented the _menu_ specially for you,\u0022 and\r\n+now and then Lord Henry looked across at him, wondering at his silence\r\n+and abstracted manner. From time to time the butler filled his glass\r\n+with champagne. He drank eagerly, and his thirst seemed to increase.\r\n+\r\n+\u0022Dorian,\u0022 said Lord Henry at last, as the _chaud-froid_ was being handed\r\n+round, \u0022what is the matter with you to-night? You are quite out of\r\n+sorts.\u0022\r\n+\r\n+\u0022I believe he is in love,\u0022 cried Lady Narborough, \u0022and that he is\r\n+afraid to tell me for fear I should be jealous. He is quite right. I\r\n+certainly should.\u0022\r\n+\r\n+\u0022Dear Lady Narborough,\u0022 murmured Dorian, smiling, \u0022I have not been in\r\n+love for a whole week--not, in fact, since Madame de Ferrol left town.\u0022\r\n+\r\n+\u0022How you men can fall in love with that woman!\u0022 exclaimed the old lady.\r\n+\u0022I really cannot understand it.\u0022\r\n+\r\n+\u0022It is simply because she remembers you when you were a little girl,\r\n+Lady Narborough,\u0022 said Lord Henry. \u0022She is the one link between us and\r\n+your short frocks.\u0022\r\n+\r\n+\u0022She does not remember my short frocks at all, Lord Henry. But I\r\n+remember her very well at Vienna thirty years ago, and how _decolletee_\r\n+she was then.\u0022\r\n+\r\n+\u0022She is still _decolletee_,\u0022 he answered, taking an olive in his long\r\n+fingers; \u0022and when she is in a very smart gown she looks like an\r\n+_edition de luxe_ of a bad French novel. She is really wonderful, and\r\n+full of surprises. Her capacity for family affection is extraordinary.\r\n+When her third husband died, her hair turned quite gold from grief.\u0022\r\n+\r\n+\u0022How can you, Harry!\u0022 cried Dorian.\r\n+\r\n+\u0022It is a most romantic explanation,\u0022 laughed the hostess. \u0022But her\r\n+third husband, Lord Henry! You don't mean to say Ferrol is the fourth?\u0022\r\n+\r\n+\u0022Certainly, Lady Narborough.\u0022\r\n+\r\n+\u0022I don't believe a word of it.\u0022\r\n+\r\n+\u0022Well, ask Mr. Gray. He is one of her most intimate friends.\u0022\r\n+\r\n+\u0022Is it true, Mr. Gray?\u0022\r\n+\r\n+\u0022She assures me so, Lady Narborough,\u0022 said Dorian. \u0022I asked her\r\n+whether, like Marguerite de Navarre, she had their hearts embalmed and\r\n+hung at her girdle. She told me she didn't, because none of them had\r\n+had any hearts at all.\u0022\r\n+\r\n+\u0022Four husbands! Upon my word that is _trop de zele_.\u0022\r\n+\r\n+\u0022_Trop d'audace_, I tell her,\u0022 said Dorian.\r\n+\r\n+\u0022Oh! she is audacious enough for anything, my dear. And what is Ferrol\r\n+like? I don't know him.\u0022\r\n+\r\n+\u0022The husbands of very beautiful women belong to the criminal classes,\u0022\r\n+said Lord Henry, sipping his wine.\r\n+\r\n+Lady Narborough hit him with her fan. \u0022Lord Henry, I am not at all\r\n+surprised that the world says that you are extremely wicked.\u0022\r\n+\r\n+\u0022But what world says that?\u0022 asked Lord Henry, elevating his eyebrows.\r\n+\u0022It can only be the next world. This world and I are on excellent\r\n+terms.\u0022\r\n+\r\n+\u0022Everybody I know says you are very wicked,\u0022 cried the old lady,\r\n+shaking her head.\r\n+\r\n+Lord Henry looked serious for some moments. \u0022It is perfectly\r\n+monstrous,\u0022 he said, at last, \u0022the way people go about nowadays saying\r\n+things against one behind one's back that are absolutely and entirely\r\n+true.\u0022\r\n+\r\n+\u0022Isn't he incorrigible?\u0022 cried Dorian, leaning forward in his chair.\r\n+\r\n+\u0022I hope so,\u0022 said his hostess, laughing. \u0022But really, if you all\r\n+worship Madame de Ferrol in this ridiculous way, I shall have to marry\r\n+again so as to be in the fashion.\u0022\r\n+\r\n+\u0022You will never marry again, Lady Narborough,\u0022 broke in Lord Henry.\r\n+\u0022You were far too happy. When a woman marries again, it is because she\r\n+detested her first husband. When a man marries again, it is because he\r\n+adored his first wife. Women try their luck; men risk theirs.\u0022\r\n+\r\n+\u0022Narborough wasn't perfect,\u0022 cried the old lady.\r\n+\r\n+\u0022If he had been, you would not have loved him, my dear lady,\u0022 was the\r\n+rejoinder. \u0022Women love us for our defects. If we have enough of them,\r\n+they will forgive us everything, even our intellects. You will never\r\n+ask me to dinner again after saying this, I am afraid, Lady Narborough,\r\n+but it is quite true.\u0022\r\n+\r\n+\u0022Of course it is true, Lord Henry. If we women did not love you for\r\n+your defects, where would you all be? Not one of you would ever be\r\n+married. You would be a set of unfortunate bachelors. Not, however,\r\n+that that would alter you much. Nowadays all the married men live like\r\n+bachelors, and all the bachelors like married men.\u0022\r\n+\r\n+\u0022_Fin de siecle_,\u0022 murmured Lord Henry.\r\n+\r\n+\u0022_Fin du globe_,\u0022 answered his hostess.\r\n+\r\n+\u0022I wish it were _fin du globe_,\u0022 said Dorian with a sigh. \u0022Life is a\r\n+great disappointment.\u0022\r\n+\r\n+\u0022Ah, my dear,\u0022 cried Lady Narborough, putting on her gloves, \u0022don't\r\n+tell me that you have exhausted life. When a man says that one knows\r\n+that life has exhausted him. Lord Henry is very wicked, and I\r\n+sometimes wish that I had been; but you are made to be good--you look\r\n+so good. I must find you a nice wife. Lord Henry, don't you think\r\n+that Mr. Gray should get married?\u0022\r\n+\r\n+\u0022I am always telling him so, Lady Narborough,\u0022 said Lord Henry with a\r\n+bow.\r\n+\r\n+\u0022Well, we must look out for a suitable match for him. I shall go\r\n+through Debrett carefully to-night and draw out a list of all the\r\n+eligible young ladies.\u0022\r\n+\r\n+\u0022With their ages, Lady Narborough?\u0022 asked Dorian.\r\n+\r\n+\u0022Of course, with their ages, slightly edited. But nothing must be done\r\n+in a hurry. I want it to be what _The Morning Post_ calls a suitable\r\n+alliance, and I want you both to be happy.\u0022\r\n+\r\n+\u0022What nonsense people talk about happy marriages!\u0022 exclaimed Lord\r\n+Henry. \u0022A man can be happy with any woman, as long as he does not love\r\n+her.\u0022\r\n+\r\n+\u0022Ah! what a cynic you are!\u0022 cried the old lady, pushing back her chair\r\n+and nodding to Lady Ruxton. \u0022You must come and dine with me soon\r\n+again. You are really an admirable tonic, much better than what Sir\r\n+Andrew prescribes for me. You must tell me what people you would like\r\n+to meet, though. I want it to be a delightful gathering.\u0022\r\n+\r\n+\u0022I like men who have a future and women who have a past,\u0022 he answered.\r\n+\u0022Or do you think that would make it a petticoat party?\u0022\r\n+\r\n+\u0022I fear so,\u0022 she said, laughing, as she stood up. \u0022A thousand pardons,\r\n+my dear Lady Ruxton,\u0022 she added, \u0022I didn't see you hadn't finished your\r\n+cigarette.\u0022\r\n+\r\n+\u0022Never mind, Lady Narborough. I smoke a great deal too much. I am\r\n+going to limit myself, for the future.\u0022\r\n+\r\n+\u0022Pray don't, Lady Ruxton,\u0022 said Lord Henry. \u0022Moderation is a fatal\r\n+thing. Enough is as bad as a meal. More than enough is as good as a\r\n+feast.\u0022\r\n+\r\n+Lady Ruxton glanced at him curiously. \u0022You must come and explain that\r\n+to me some afternoon, Lord Henry. It sounds a fascinating theory,\u0022 she\r\n+murmured, as she swept out of the room.\r\n+\r\n+\u0022Now, mind you don't stay too long over your politics and scandal,\u0022\r\n+cried Lady Narborough from the door. \u0022If you do, we are sure to\r\n+squabble upstairs.\u0022\r\n+\r\n+The men laughed, and Mr. Chapman got up solemnly from the foot of the\r\n+table and came up to the top. Dorian Gray changed his seat and went\r\n+and sat by Lord Henry. Mr. Chapman began to talk in a loud voice about\r\n+the situation in the House of Commons. He guffawed at his adversaries.\r\n+The word _doctrinaire_--word full of terror to the British\r\n+mind--reappeared from time to time between his explosions. An\r\n+alliterative prefix served as an ornament of oratory. He hoisted the\r\n+Union Jack on the pinnacles of thought. The inherited stupidity of the\r\n+race--sound English common sense he jovially termed it--was shown to be\r\n+the proper bulwark for society.\r\n+\r\n+A smile curved Lord Henry's lips, and he turned round and looked at\r\n+Dorian.\r\n+\r\n+\u0022Are you better, my dear fellow?\u0022 he asked. \u0022You seemed rather out of\r\n+sorts at dinner.\u0022\r\n+\r\n+\u0022I am quite well, Harry. I am tired. That is all.\u0022\r\n+\r\n+\u0022You were charming last night. The little duchess is quite devoted to\r\n+you. She tells me she is going down to Selby.\u0022\r\n+\r\n+\u0022She has promised to come on the twentieth.\u0022\r\n+\r\n+\u0022Is Monmouth to be there, too?\u0022\r\n+\r\n+\u0022Oh, yes, Harry.\u0022\r\n+\r\n+\u0022He bores me dreadfully, almost as much as he bores her. She is very\r\n+clever, too clever for a woman. She lacks the indefinable charm of\r\n+weakness. It is the feet of clay that make the gold of the image\r\n+precious. Her feet are very pretty, but they are not feet of clay.\r\n+White porcelain feet, if you like. They have been through the fire,\r\n+and what fire does not destroy, it hardens. She has had experiences.\u0022\r\n+\r\n+\u0022How long has she been married?\u0022 asked Dorian.\r\n+\r\n+\u0022An eternity, she tells me. I believe, according to the peerage, it is\r\n+ten years, but ten years with Monmouth must have been like eternity,\r\n+with time thrown in. Who else is coming?\u0022\r\n+\r\n+\u0022Oh, the Willoughbys, Lord Rugby and his wife, our hostess, Geoffrey\r\n+Clouston, the usual set. I have asked Lord Grotrian.\u0022\r\n+\r\n+\u0022I like him,\u0022 said Lord Henry. \u0022A great many people don't, but I find\r\n+him charming. He atones for being occasionally somewhat overdressed by\r\n+being always absolutely over-educated. He is a very modern type.\u0022\r\n+\r\n+\u0022I don't know if he will be able to come, Harry. He may have to go to\r\n+Monte Carlo with his father.\u0022\r\n+\r\n+\u0022Ah! what a nuisance people's people are! Try and make him come. By\r\n+the way, Dorian, you ran off very early last night. You left before\r\n+eleven. What did you do afterwards? Did you go straight home?\u0022\r\n+\r\n+Dorian glanced at him hurriedly and frowned.\r\n+\r\n+\u0022No, Harry,\u0022 he said at last, \u0022I did not get home till nearly three.\u0022\r\n+\r\n+\u0022Did you go to the club?\u0022\r\n+\r\n+\u0022Yes,\u0022 he answered. Then he bit his lip. \u0022No, I don't mean that. I\r\n+didn't go to the club. I walked about. I forget what I did.... How\r\n+inquisitive you are, Harry! You always want to know what one has been\r\n+doing. I always want to forget what I have been doing. I came in at\r\n+half-past two, if you wish to know the exact time. I had left my\r\n+latch-key at home, and my servant had to let me in. If you want any\r\n+corroborative evidence on the subject, you can ask him.\u0022\r\n+\r\n+Lord Henry shrugged his shoulders. \u0022My dear fellow, as if I cared!\r\n+Let us go up to the drawing-room. No sherry, thank you, Mr. Chapman.\r\n+Something has happened to you, Dorian. Tell me what it is. You are\r\n+not yourself to-night.\u0022\r\n+\r\n+\u0022Don't mind me, Harry. I am irritable, and out of temper. I shall\r\n+come round and see you to-morrow, or next day. Make my excuses to Lady\r\n+Narborough. I shan't go upstairs. I shall go home. I must go home.\u0022\r\n+\r\n+\u0022All right, Dorian. I dare say I shall see you to-morrow at tea-time.\r\n+The duchess is coming.\u0022\r\n+\r\n+\u0022I will try to be there, Harry,\u0022 he said, leaving the room. As he\r\n+drove back to his own house, he was conscious that the sense of terror\r\n+he thought he had strangled had come back to him. Lord Henry's casual\r\n+questioning had made him lose his nerve for the moment, and he wanted\r\n+his nerve still. Things that were dangerous had to be destroyed. He\r\n+winced. He hated the idea of even touching them.\r\n+\r\n+Yet it had to be done. He realized that, and when he had locked the\r\n+door of his library, he opened the secret press into which he had\r\n+thrust Basil Hallward's coat and bag. A huge fire was blazing. He\r\n+piled another log on it. The smell of the singeing clothes and burning\r\n+leather was horrible. It took him three-quarters of an hour to consume\r\n+everything. At the end he felt faint and sick, and having lit some\r\n+Algerian pastilles in a pierced copper brazier, he bathed his hands and\r\n+forehead with a cool musk-scented vinegar.\r\n+\r\n+Suddenly he started. His eyes grew strangely bright, and he gnawed\r\n+nervously at his underlip. Between two of the windows stood a large\r\n+Florentine cabinet, made out of ebony and inlaid with ivory and blue\r\n+lapis. He watched it as though it were a thing that could fascinate\r\n+and make afraid, as though it held something that he longed for and yet\r\n+almost loathed. His breath quickened. A mad craving came over him.\r\n+He lit a cigarette and then threw it away. His eyelids drooped till\r\n+the long fringed lashes almost touched his cheek. But he still watched\r\n+the cabinet. At last he got up from the sofa on which he had been\r\n+lying, went over to it, and having unlocked it, touched some hidden\r\n+spring. A triangular drawer passed slowly out. His fingers moved\r\n+instinctively towards it, dipped in, and closed on something. It was a\r\n+small Chinese box of black and gold-dust lacquer, elaborately wrought,\r\n+the sides patterned with curved waves, and the silken cords hung with\r\n+round crystals and tasselled in plaited metal threads. He opened it.\r\n+Inside was a green paste, waxy in lustre, the odour curiously heavy and\r\n+persistent.\r\n+\r\n+He hesitated for some moments, with a strangely immobile smile upon his\r\n+face. Then shivering, though the atmosphere of the room was terribly\r\n+hot, he drew himself up and glanced at the clock. It was twenty\r\n+minutes to twelve. He put the box back, shutting the cabinet doors as\r\n+he did so, and went into his bedroom.\r\n+\r\n+As midnight was striking bronze blows upon the dusky air, Dorian Gray,\r\n+dressed commonly, and with a muffler wrapped round his throat, crept\r\n+quietly out of his house. In Bond Street he found a hansom with a good\r\n+horse. He hailed it and in a low voice gave the driver an address.\r\n+\r\n+The man shook his head. \u0022It is too far for me,\u0022 he muttered.\r\n+\r\n+\u0022Here is a sovereign for you,\u0022 said Dorian. \u0022You shall have another if\r\n+you drive fast.\u0022\r\n+\r\n+\u0022All right, sir,\u0022 answered the man, \u0022you will be there in an hour,\u0022 and\r\n+after his fare had got in he turned his horse round and drove rapidly\r\n+towards the river.\r\n+\r\n+\r\n+\r\n+CHAPTER 16\r\n+\r\n+A cold rain began to fall, and the blurred street-lamps looked ghastly\r\n+in the dripping mist. The public-houses were just closing, and dim men\r\n+and women were clustering in broken groups round their doors. From\r\n+some of the bars came the sound of horrible laughter. In others,\r\n+drunkards brawled and screamed.\r\n+\r\n+Lying back in the hansom, with his hat pulled over his forehead, Dorian\r\n+Gray watched with listless eyes the sordid shame of the great city, and\r\n+now and then he repeated to himself the words that Lord Henry had said\r\n+to him on the first day they had met, \u0022To cure the soul by means of the\r\n+senses, and the senses by means of the soul.\u0022 Yes, that was the\r\n+secret. He had often tried it, and would try it again now. There were\r\n+opium dens where one could buy oblivion, dens of horror where the\r\n+memory of old sins could be destroyed by the madness of sins that were\r\n+new.\r\n+\r\n+The moon hung low in the sky like a yellow skull. From time to time a\r\n+huge misshapen cloud stretched a long arm across and hid it. The\r\n+gas-lamps grew fewer, and the streets more narrow and gloomy. Once the\r\n+man lost his way and had to drive back half a mile. A steam rose from\r\n+the horse as it splashed up the puddles. The sidewindows of the hansom\r\n+were clogged with a grey-flannel mist.\r\n+\r\n+\u0022To cure the soul by means of the senses, and the senses by means of\r\n+the soul!\u0022 How the words rang in his ears! His soul, certainly, was\r\n+sick to death. Was it true that the senses could cure it? Innocent\r\n+blood had been spilled. What could atone for that? Ah! for that there\r\n+was no atonement; but though forgiveness was impossible, forgetfulness\r\n+was possible still, and he was determined to forget, to stamp the thing\r\n+out, to crush it as one would crush the adder that had stung one.\r\n+Indeed, what right had Basil to have spoken to him as he had done? Who\r\n+had made him a judge over others? He had said things that were\r\n+dreadful, horrible, not to be endured.\r\n+\r\n+On and on plodded the hansom, going slower, it seemed to him, at each\r\n+step. He thrust up the trap and called to the man to drive faster.\r\n+The hideous hunger for opium began to gnaw at him. His throat burned\r\n+and his delicate hands twitched nervously together. He struck at the\r\n+horse madly with his stick. The driver laughed and whipped up. He\r\n+laughed in answer, and the man was silent.\r\n+\r\n+The way seemed interminable, and the streets like the black web of some\r\n+sprawling spider. The monotony became unbearable, and as the mist\r\n+thickened, he felt afraid.\r\n+\r\n+Then they passed by lonely brickfields. The fog was lighter here, and\r\n+he could see the strange, bottle-shaped kilns with their orange,\r\n+fanlike tongues of fire. A dog barked as they went by, and far away in\r\n+the darkness some wandering sea-gull screamed. The horse stumbled in a\r\n+rut, then swerved aside and broke into a gallop.\r\n+\r\n+After some time they left the clay road and rattled again over\r\n+rough-paven streets. Most of the windows were dark, but now and then\r\n+fantastic shadows were silhouetted against some lamplit blind. He\r\n+watched them curiously. They moved like monstrous marionettes and made\r\n+gestures like live things. He hated them. A dull rage was in his\r\n+heart. As they turned a corner, a woman yelled something at them from\r\n+an open door, and two men ran after the hansom for about a hundred\r\n+yards. The driver beat at them with his whip.\r\n+\r\n+It is said that passion makes one think in a circle. Certainly with\r\n+hideous iteration the bitten lips of Dorian Gray shaped and reshaped\r\n+those subtle words that dealt with soul and sense, till he had found in\r\n+them the full expression, as it were, of his mood, and justified, by\r\n+intellectual approval, passions that without such justification would\r\n+still have dominated his temper. From cell to cell of his brain crept\r\n+the one thought; and the wild desire to live, most terrible of all\r\n+man's appetites, quickened into force each trembling nerve and fibre.\r\n+Ugliness that had once been hateful to him because it made things real,\r\n+became dear to him now for that very reason. Ugliness was the one\r\n+reality. The coarse brawl, the loathsome den, the crude violence of\r\n+disordered life, the very vileness of thief and outcast, were more\r\n+vivid, in their intense actuality of impression, than all the gracious\r\n+shapes of art, the dreamy shadows of song. They were what he needed\r\n+for forgetfulness. In three days he would be free.\r\n+\r\n+Suddenly the man drew up with a jerk at the top of a dark lane. Over\r\n+the low roofs and jagged chimney-stacks of the houses rose the black\r\n+masts of ships. Wreaths of white mist clung like ghostly sails to the\r\n+yards.\r\n+\r\n+\u0022Somewhere about here, sir, ain't it?\u0022 he asked huskily through the\r\n+trap.\r\n+\r\n+Dorian started and peered round. \u0022This will do,\u0022 he answered, and\r\n+having got out hastily and given the driver the extra fare he had\r\n+promised him, he walked quickly in the direction of the quay. Here and\r\n+there a lantern gleamed at the stern of some huge merchantman. The\r\n+light shook and splintered in the puddles. A red glare came from an\r\n+outward-bound steamer that was coaling. The slimy pavement looked like\r\n+a wet mackintosh.\r\n+\r\n+He hurried on towards the left, glancing back now and then to see if he\r\n+was being followed. In about seven or eight minutes he reached a small\r\n+shabby house that was wedged in between two gaunt factories. In one of\r\n+the top-windows stood a lamp. He stopped and gave a peculiar knock.\r\n+\r\n+After a little time he heard steps in the passage and the chain being\r\n+unhooked. The door opened quietly, and he went in without saying a\r\n+word to the squat misshapen figure that flattened itself into the\r\n+shadow as he passed. At the end of the hall hung a tattered green\r\n+curtain that swayed and shook in the gusty wind which had followed him\r\n+in from the street. He dragged it aside and entered a long low room\r\n+which looked as if it had once been a third-rate dancing-saloon. Shrill\r\n+flaring gas-jets, dulled and distorted in the fly-blown mirrors that\r\n+faced them, were ranged round the walls. Greasy reflectors of ribbed\r\n+tin backed them, making quivering disks of light. The floor was\r\n+covered with ochre-coloured sawdust, trampled here and there into mud,\r\n+and stained with dark rings of spilled liquor. Some Malays were\r\n+crouching by a little charcoal stove, playing with bone counters and\r\n+showing their white teeth as they chattered. In one corner, with his\r\n+head buried in his arms, a sailor sprawled over a table, and by the\r\n+tawdrily painted bar that ran across one complete side stood two\r\n+haggard women, mocking an old man who was brushing the sleeves of his\r\n+coat with an expression of disgust. \u0022He thinks he's got red ants on\r\n+him,\u0022 laughed one of them, as Dorian passed by. The man looked at her\r\n+in terror and began to whimper.\r\n+\r\n+At the end of the room there was a little staircase, leading to a\r\n+darkened chamber. As Dorian hurried up its three rickety steps, the\r\n+heavy odour of opium met him. He heaved a deep breath, and his\r\n+nostrils quivered with pleasure. When he entered, a young man with\r\n+smooth yellow hair, who was bending over a lamp lighting a long thin\r\n+pipe, looked up at him and nodded in a hesitating manner.\r\n+\r\n+\u0022You here, Adrian?\u0022 muttered Dorian.\r\n+\r\n+\u0022Where else should I be?\u0022 he answered, listlessly. \u0022None of the chaps\r\n+will speak to me now.\u0022\r\n+\r\n+\u0022I thought you had left England.\u0022\r\n+\r\n+\u0022Darlington is not going to do anything. My brother paid the bill at\r\n+last. George doesn't speak to me either.... I don't care,\u0022 he added\r\n+with a sigh. \u0022As long as one has this stuff, one doesn't want friends.\r\n+I think I have had too many friends.\u0022\r\n+\r\n+Dorian winced and looked round at the grotesque things that lay in such\r\n+fantastic postures on the ragged mattresses. The twisted limbs, the\r\n+gaping mouths, the staring lustreless eyes, fascinated him. He knew in\r\n+what strange heavens they were suffering, and what dull hells were\r\n+teaching them the secret of some new joy. They were better off than he\r\n+was. He was prisoned in thought. Memory, like a horrible malady, was\r\n+eating his soul away. From time to time he seemed to see the eyes of\r\n+Basil Hallward looking at him. Yet he felt he could not stay. The\r\n+presence of Adrian Singleton troubled him. He wanted to be where no\r\n+one would know who he was. He wanted to escape from himself.\r\n+\r\n+\u0022I am going on to the other place,\u0022 he said after a pause.\r\n+\r\n+\u0022On the wharf?\u0022\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022That mad-cat is sure to be there. They won't have her in this place\r\n+now.\u0022\r\n+\r\n+Dorian shrugged his shoulders. \u0022I am sick of women who love one.\r\n+Women who hate one are much more interesting. Besides, the stuff is\r\n+better.\u0022\r\n+\r\n+\u0022Much the same.\u0022\r\n+\r\n+\u0022I like it better. Come and have something to drink. I must have\r\n+something.\u0022\r\n+\r\n+\u0022I don't want anything,\u0022 murmured the young man.\r\n+\r\n+\u0022Never mind.\u0022\r\n+\r\n+Adrian Singleton rose up wearily and followed Dorian to the bar. A\r\n+half-caste, in a ragged turban and a shabby ulster, grinned a hideous\r\n+greeting as he thrust a bottle of brandy and two tumblers in front of\r\n+them. The women sidled up and began to chatter. Dorian turned his\r\n+back on them and said something in a low voice to Adrian Singleton.\r\n+\r\n+A crooked smile, like a Malay crease, writhed across the face of one of\r\n+the women. \u0022We are very proud to-night,\u0022 she sneered.\r\n+\r\n+\u0022For God's sake don't talk to me,\u0022 cried Dorian, stamping his foot on\r\n+the ground. \u0022What do you want? Money? Here it is. Don't ever talk\r\n+to me again.\u0022\r\n+\r\n+Two red sparks flashed for a moment in the woman's sodden eyes, then\r\n+flickered out and left them dull and glazed. She tossed her head and\r\n+raked the coins off the counter with greedy fingers. Her companion\r\n+watched her enviously.\r\n+\r\n+\u0022It's no use,\u0022 sighed Adrian Singleton. \u0022I don't care to go back.\r\n+What does it matter? I am quite happy here.\u0022\r\n+\r\n+\u0022You will write to me if you want anything, won't you?\u0022 said Dorian,\r\n+after a pause.\r\n+\r\n+\u0022Perhaps.\u0022\r\n+\r\n+\u0022Good night, then.\u0022\r\n+\r\n+\u0022Good night,\u0022 answered the young man, passing up the steps and wiping\r\n+his parched mouth with a handkerchief.\r\n+\r\n+Dorian walked to the door with a look of pain in his face. As he drew\r\n+the curtain aside, a hideous laugh broke from the painted lips of the\r\n+woman who had taken his money. \u0022There goes the devil's bargain!\u0022 she\r\n+hiccoughed, in a hoarse voice.\r\n+\r\n+\u0022Curse you!\u0022 he answered, \u0022don't call me that.\u0022\r\n+\r\n+She snapped her fingers. \u0022Prince Charming is what you like to be\r\n+called, ain't it?\u0022 she yelled after him.\r\n+\r\n+The drowsy sailor leaped to his feet as she spoke, and looked wildly\r\n+round. The sound of the shutting of the hall door fell on his ear. He\r\n+rushed out as if in pursuit.\r\n+\r\n+Dorian Gray hurried along the quay through the drizzling rain. His\r\n+meeting with Adrian Singleton had strangely moved him, and he wondered\r\n+if the ruin of that young life was really to be laid at his door, as\r\n+Basil Hallward had said to him with such infamy of insult. He bit his\r\n+lip, and for a few seconds his eyes grew sad. Yet, after all, what did\r\n+it matter to him? One's days were too brief to take the burden of\r\n+another's errors on one's shoulders. Each man lived his own life and\r\n+paid his own price for living it. The only pity was one had to pay so\r\n+often for a single fault. One had to pay over and over again, indeed.\r\n+In her dealings with man, destiny never closed her accounts.\r\n+\r\n+There are moments, psychologists tell us, when the passion for sin, or\r\n+for what the world calls sin, so dominates a nature that every fibre of\r\n+the body, as every cell of the brain, seems to be instinct with fearful\r\n+impulses. Men and women at such moments lose the freedom of their\r\n+will. They move to their terrible end as automatons move. Choice is\r\n+taken from them, and conscience is either killed, or, if it lives at\r\n+all, lives but to give rebellion its fascination and disobedience its\r\n+charm. For all sins, as theologians weary not of reminding us, are\r\n+sins of disobedience. When that high spirit, that morning star of\r\n+evil, fell from heaven, it was as a rebel that he fell.\r\n+\r\n+Callous, concentrated on evil, with stained mind, and soul hungry for\r\n+rebellion, Dorian Gray hastened on, quickening his step as he went, but\r\n+as he darted aside into a dim archway, that had served him often as a\r\n+short cut to the ill-famed place where he was going, he felt himself\r\n+suddenly seized from behind, and before he had time to defend himself,\r\n+he was thrust back against the wall, with a brutal hand round his\r\n+throat.\r\n+\r\n+He struggled madly for life, and by a terrible effort wrenched the\r\n+tightening fingers away. In a second he heard the click of a revolver,\r\n+and saw the gleam of a polished barrel, pointing straight at his head,\r\n+and the dusky form of a short, thick-set man facing him.\r\n+\r\n+\u0022What do you want?\u0022 he gasped.\r\n+\r\n+\u0022Keep quiet,\u0022 said the man. \u0022If you stir, I shoot you.\u0022\r\n+\r\n+\u0022You are mad. What have I done to you?\u0022\r\n+\r\n+\u0022You wrecked the life of Sibyl Vane,\u0022 was the answer, \u0022and Sibyl Vane\r\n+was my sister. She killed herself. I know it. Her death is at your\r\n+door. I swore I would kill you in return. For years I have sought\r\n+you. I had no clue, no trace. The two people who could have described\r\n+you were dead. I knew nothing of you but the pet name she used to call\r\n+you. I heard it to-night by chance. Make your peace with God, for\r\n+to-night you are going to die.\u0022\r\n+\r\n+Dorian Gray grew sick with fear. \u0022I never knew her,\u0022 he stammered. \u0022I\r\n+never heard of her. You are mad.\u0022\r\n+\r\n+\u0022You had better confess your sin, for as sure as I am James Vane, you\r\n+are going to die.\u0022 There was a horrible moment. Dorian did not know\r\n+what to say or do. \u0022Down on your knees!\u0022 growled the man. \u0022I give you\r\n+one minute to make your peace--no more. I go on board to-night for\r\n+India, and I must do my job first. One minute. That's all.\u0022\r\n+\r\n+Dorian's arms fell to his side. Paralysed with terror, he did not know\r\n+what to do. Suddenly a wild hope flashed across his brain. \u0022Stop,\u0022 he\r\n+cried. \u0022How long ago is it since your sister died? Quick, tell me!\u0022\r\n+\r\n+\u0022Eighteen years,\u0022 said the man. \u0022Why do you ask me? What do years\r\n+matter?\u0022\r\n+\r\n+\u0022Eighteen years,\u0022 laughed Dorian Gray, with a touch of triumph in his\r\n+voice. \u0022Eighteen years! Set me under the lamp and look at my face!\u0022\r\n+\r\n+James Vane hesitated for a moment, not understanding what was meant.\r\n+Then he seized Dorian Gray and dragged him from the archway.\r\n+\r\n+Dim and wavering as was the wind-blown light, yet it served to show him\r\n+the hideous error, as it seemed, into which he had fallen, for the face\r\n+of the man he had sought to kill had all the bloom of boyhood, all the\r\n+unstained purity of youth. He seemed little more than a lad of twenty\r\n+summers, hardly older, if older indeed at all, than his sister had been\r\n+when they had parted so many years ago. It was obvious that this was\r\n+not the man who had destroyed her life.\r\n+\r\n+He loosened his hold and reeled back. \u0022My God! my God!\u0022 he cried, \u0022and\r\n+I would have murdered you!\u0022\r\n+\r\n+Dorian Gray drew a long breath. \u0022You have been on the brink of\r\n+committing a terrible crime, my man,\u0022 he said, looking at him sternly.\r\n+\u0022Let this be a warning to you not to take vengeance into your own\r\n+hands.\u0022\r\n+\r\n+\u0022Forgive me, sir,\u0022 muttered James Vane. \u0022I was deceived. A chance\r\n+word I heard in that damned den set me on the wrong track.\u0022\r\n+\r\n+\u0022You had better go home and put that pistol away, or you may get into\r\n+trouble,\u0022 said Dorian, turning on his heel and going slowly down the\r\n+street.\r\n+\r\n+James Vane stood on the pavement in horror. He was trembling from head\r\n+to foot. After a little while, a black shadow that had been creeping\r\n+along the dripping wall moved out into the light and came close to him\r\n+with stealthy footsteps. He felt a hand laid on his arm and looked\r\n+round with a start. It was one of the women who had been drinking at\r\n+the bar.\r\n+\r\n+\u0022Why didn't you kill him?\u0022 she hissed out, putting haggard face quite\r\n+close to his. \u0022I knew you were following him when you rushed out from\r\n+Daly's. You fool! You should have killed him. He has lots of money,\r\n+and he's as bad as bad.\u0022\r\n+\r\n+\u0022He is not the man I am looking for,\u0022 he answered, \u0022and I want no man's\r\n+money. I want a man's life. The man whose life I want must be nearly\r\n+forty now. This one is little more than a boy. Thank God, I have not\r\n+got his blood upon my hands.\u0022\r\n+\r\n+The woman gave a bitter laugh. \u0022Little more than a boy!\u0022 she sneered.\r\n+\u0022Why, man, it's nigh on eighteen years since Prince Charming made me\r\n+what I am.\u0022\r\n+\r\n+\u0022You lie!\u0022 cried James Vane.\r\n+\r\n+She raised her hand up to heaven. \u0022Before God I am telling the truth,\u0022\r\n+she cried.\r\n+\r\n+\u0022Before God?\u0022\r\n+\r\n+\u0022Strike me dumb if it ain't so. He is the worst one that comes here.\r\n+They say he has sold himself to the devil for a pretty face. It's nigh\r\n+on eighteen years since I met him. He hasn't changed much since then.\r\n+I have, though,\u0022 she added, with a sickly leer.\r\n+\r\n+\u0022You swear this?\u0022\r\n+\r\n+\u0022I swear it,\u0022 came in hoarse echo from her flat mouth. \u0022But don't give\r\n+me away to him,\u0022 she whined; \u0022I am afraid of him. Let me have some\r\n+money for my night's lodging.\u0022\r\n+\r\n+He broke from her with an oath and rushed to the corner of the street,\r\n+but Dorian Gray had disappeared. When he looked back, the woman had\r\n+vanished also.\r\n+\r\n+\r\n+\r\n+CHAPTER 17\r\n+\r\n+A week later Dorian Gray was sitting in the conservatory at Selby\r\n+Royal, talking to the pretty Duchess of Monmouth, who with her husband,\r\n+a jaded-looking man of sixty, was amongst his guests. It was tea-time,\r\n+and the mellow light of the huge, lace-covered lamp that stood on the\r\n+table lit up the delicate china and hammered silver of the service at\r\n+which the duchess was presiding. Her white hands were moving daintily\r\n+among the cups, and her full red lips were smiling at something that\r\n+Dorian had whispered to her. Lord Henry was lying back in a\r\n+silk-draped wicker chair, looking at them. On a peach-coloured divan\r\n+sat Lady Narborough, pretending to listen to the duke's description of\r\n+the last Brazilian beetle that he had added to his collection. Three\r\n+young men in elaborate smoking-suits were handing tea-cakes to some of\r\n+the women. The house-party consisted of twelve people, and there were\r\n+more expected to arrive on the next day.\r\n+\r\n+\u0022What are you two talking about?\u0022 said Lord Henry, strolling over to\r\n+the table and putting his cup down. \u0022I hope Dorian has told you about\r\n+my plan for rechristening everything, Gladys. It is a delightful idea.\u0022\r\n+\r\n+\u0022But I don't want to be rechristened, Harry,\u0022 rejoined the duchess,\r\n+looking up at him with her wonderful eyes. \u0022I am quite satisfied with\r\n+my own name, and I am sure Mr. Gray should be satisfied with his.\u0022\r\n+\r\n+\u0022My dear Gladys, I would not alter either name for the world. They are\r\n+both perfect. I was thinking chiefly of flowers. Yesterday I cut an\r\n+orchid, for my button-hole. It was a marvellous spotted thing, as\r\n+effective as the seven deadly sins. In a thoughtless moment I asked\r\n+one of the gardeners what it was called. He told me it was a fine\r\n+specimen of _Robinsoniana_, or something dreadful of that kind. It is a\r\n+sad truth, but we have lost the faculty of giving lovely names to\r\n+things. Names are everything. I never quarrel with actions. My one\r\n+quarrel is with words. That is the reason I hate vulgar realism in\r\n+literature. The man who could call a spade a spade should be compelled\r\n+to use one. It is the only thing he is fit for.\u0022\r\n+\r\n+\u0022Then what should we call you, Harry?\u0022 she asked.\r\n+\r\n+\u0022His name is Prince Paradox,\u0022 said Dorian.\r\n+\r\n+\u0022I recognize him in a flash,\u0022 exclaimed the duchess.\r\n+\r\n+\u0022I won't hear of it,\u0022 laughed Lord Henry, sinking into a chair. \u0022From\r\n+a label there is no escape! I refuse the title.\u0022\r\n+\r\n+\u0022Royalties may not abdicate,\u0022 fell as a warning from pretty lips.\r\n+\r\n+\u0022You wish me to defend my throne, then?\u0022\r\n+\r\n+\u0022Yes.\u0022\r\n+\r\n+\u0022I give the truths of to-morrow.\u0022\r\n+\r\n+\u0022I prefer the mistakes of to-day,\u0022 she answered.\r\n+\r\n+\u0022You disarm me, Gladys,\u0022 he cried, catching the wilfulness of her mood.\r\n+\r\n+\u0022Of your shield, Harry, not of your spear.\u0022\r\n+\r\n+\u0022I never tilt against beauty,\u0022 he said, with a wave of his hand.\r\n+\r\n+\u0022That is your error, Harry, believe me. You value beauty far too much.\u0022\r\n+\r\n+\u0022How can you say that? I admit that I think that it is better to be\r\n+beautiful than to be good. But on the other hand, no one is more ready\r\n+than I am to acknowledge that it is better to be good than to be ugly.\u0022\r\n+\r\n+\u0022Ugliness is one of the seven deadly sins, then?\u0022 cried the duchess.\r\n+\u0022What becomes of your simile about the orchid?\u0022\r\n+\r\n+\u0022Ugliness is one of the seven deadly virtues, Gladys. You, as a good\r\n+Tory, must not underrate them. Beer, the Bible, and the seven deadly\r\n+virtues have made our England what she is.\u0022\r\n+\r\n+\u0022You don't like your country, then?\u0022 she asked.\r\n+\r\n+\u0022I live in it.\u0022\r\n+\r\n+\u0022That you may censure it the better.\u0022\r\n+\r\n+\u0022Would you have me take the verdict of Europe on it?\u0022 he inquired.\r\n+\r\n+\u0022What do they say of us?\u0022\r\n+\r\n+\u0022That Tartuffe has emigrated to England and opened a shop.\u0022\r\n+\r\n+\u0022Is that yours, Harry?\u0022\r\n+\r\n+\u0022I give it to you.\u0022\r\n+\r\n+\u0022I could not use it. It is too true.\u0022\r\n+\r\n+\u0022You need not be afraid. Our countrymen never recognize a description.\u0022\r\n+\r\n+\u0022They are practical.\u0022\r\n+\r\n+\u0022They are more cunning than practical. When they make up their ledger,\r\n+they balance stupidity by wealth, and vice by hypocrisy.\u0022\r\n+\r\n+\u0022Still, we have done great things.\u0022\r\n+\r\n+\u0022Great things have been thrust on us, Gladys.\u0022\r\n+\r\n+\u0022We have carried their burden.\u0022\r\n+\r\n+\u0022Only as far as the Stock Exchange.\u0022\r\n+\r\n+She shook her head. \u0022I believe in the race,\u0022 she cried.\r\n+\r\n+\u0022It represents the survival of the pushing.\u0022\r\n+\r\n+\u0022It has development.\u0022\r\n+\r\n+\u0022Decay fascinates me more.\u0022\r\n+\r\n+\u0022What of art?\u0022 she asked.\r\n+\r\n+\u0022It is a malady.\u0022\r\n+\r\n+\u0022Love?\u0022\r\n+\r\n+\u0022An illusion.\u0022\r\n+\r\n+\u0022Religion?\u0022\r\n+\r\n+\u0022The fashionable substitute for belief.\u0022\r\n+\r\n+\u0022You are a sceptic.\u0022\r\n+\r\n+\u0022Never! Scepticism is the beginning of faith.\u0022\r\n+\r\n+\u0022What are you?\u0022\r\n+\r\n+\u0022To define is to limit.\u0022\r\n+\r\n+\u0022Give me a clue.\u0022\r\n+\r\n+\u0022Threads snap. You would lose your way in the labyrinth.\u0022\r\n+\r\n+\u0022You bewilder me. Let us talk of some one else.\u0022\r\n+\r\n+\u0022Our host is a delightful topic. Years ago he was christened Prince\r\n+Charming.\u0022\r\n+\r\n+\u0022Ah! don't remind me of that,\u0022 cried Dorian Gray.\r\n+\r\n+\u0022Our host is rather horrid this evening,\u0022 answered the duchess,\r\n+colouring. \u0022I believe he thinks that Monmouth married me on purely\r\n+scientific principles as the best specimen he could find of a modern\r\n+butterfly.\u0022\r\n+\r\n+\u0022Well, I hope he won't stick pins into you, Duchess,\u0022 laughed Dorian.\r\n+\r\n+\u0022Oh! my maid does that already, Mr. Gray, when she is annoyed with me.\u0022\r\n+\r\n+\u0022And what does she get annoyed with you about, Duchess?\u0022\r\n+\r\n+\u0022For the most trivial things, Mr. Gray, I assure you. Usually because\r\n+I come in at ten minutes to nine and tell her that I must be dressed by\r\n+half-past eight.\u0022\r\n+\r\n+\u0022How unreasonable of her! You should give her warning.\u0022\r\n+\r\n+\u0022I daren't, Mr. Gray. Why, she invents hats for me. You remember the\r\n+one I wore at Lady Hilstone's garden-party? You don't, but it is nice\r\n+of you to pretend that you do. Well, she made it out of nothing. All\r\n+good hats are made out of nothing.\u0022\r\n+\r\n+\u0022Like all good reputations, Gladys,\u0022 interrupted Lord Henry. \u0022Every\r\n+effect that one produces gives one an enemy. To be popular one must be\r\n+a mediocrity.\u0022\r\n+\r\n+\u0022Not with women,\u0022 said the duchess, shaking her head; \u0022and women rule\r\n+the world. I assure you we can't bear mediocrities. We women, as some\r\n+one says, love with our ears, just as you men love with your eyes, if\r\n+you ever love at all.\u0022\r\n+\r\n+\u0022It seems to me that we never do anything else,\u0022 murmured Dorian.\r\n+\r\n+\u0022Ah! then, you never really love, Mr. Gray,\u0022 answered the duchess with\r\n+mock sadness.\r\n+\r\n+\u0022My dear Gladys!\u0022 cried Lord Henry. \u0022How can you say that? Romance\r\n+lives by repetition, and repetition converts an appetite into an art.\r\n+Besides, each time that one loves is the only time one has ever loved.\r\n+Difference of object does not alter singleness of passion. It merely\r\n+intensifies it. We can have in life but one great experience at best,\r\n+and the secret of life is to reproduce that experience as often as\r\n+possible.\u0022\r\n+\r\n+\u0022Even when one has been wounded by it, Harry?\u0022 asked the duchess after\r\n+a pause.\r\n+\r\n+\u0022Especially when one has been wounded by it,\u0022 answered Lord Henry.\r\n+\r\n+The duchess turned and looked at Dorian Gray with a curious expression\r\n+in her eyes. \u0022What do you say to that, Mr. Gray?\u0022 she inquired.\r\n+\r\n+Dorian hesitated for a moment. Then he threw his head back and\r\n+laughed. \u0022I always agree with Harry, Duchess.\u0022\r\n+\r\n+\u0022Even when he is wrong?\u0022\r\n+\r\n+\u0022Harry is never wrong, Duchess.\u0022\r\n+\r\n+\u0022And does his philosophy make you happy?\u0022\r\n+\r\n+\u0022I have never searched for happiness. Who wants happiness? I have\r\n+searched for pleasure.\u0022\r\n+\r\n+\u0022And found it, Mr. Gray?\u0022\r\n+\r\n+\u0022Often. Too often.\u0022\r\n+\r\n+The duchess sighed. \u0022I am searching for peace,\u0022 she said, \u0022and if I\r\n+don't go and dress, I shall have none this evening.\u0022\r\n+\r\n+\u0022Let me get you some orchids, Duchess,\u0022 cried Dorian, starting to his\r\n+feet and walking down the conservatory.\r\n+\r\n+\u0022You are flirting disgracefully with him,\u0022 said Lord Henry to his\r\n+cousin. \u0022You had better take care. He is very fascinating.\u0022\r\n+\r\n+\u0022If he were not, there would be no battle.\u0022\r\n+\r\n+\u0022Greek meets Greek, then?\u0022\r\n+\r\n+\u0022I am on the side of the Trojans. They fought for a woman.\u0022\r\n+\r\n+\u0022They were defeated.\u0022\r\n+\r\n+\u0022There are worse things than capture,\u0022 she answered.\r\n+\r\n+\u0022You gallop with a loose rein.\u0022\r\n+\r\n+\u0022Pace gives life,\u0022 was the _riposte_.\r\n+\r\n+\u0022I shall write it in my diary to-night.\u0022\r\n+\r\n+\u0022What?\u0022\r\n+\r\n+\u0022That a burnt child loves the fire.\u0022\r\n+\r\n+\u0022I am not even singed. My wings are untouched.\u0022\r\n+\r\n+\u0022You use them for everything, except flight.\u0022\r\n+\r\n+\u0022Courage has passed from men to women. It is a new experience for us.\u0022\r\n+\r\n+\u0022You have a rival.\u0022\r\n+\r\n+\u0022Who?\u0022\r\n+\r\n+He laughed. \u0022Lady Narborough,\u0022 he whispered. \u0022She perfectly adores\r\n+him.\u0022\r\n+\r\n+\u0022You fill me with apprehension. The appeal to antiquity is fatal to us\r\n+who are romanticists.\u0022\r\n+\r\n+\u0022Romanticists! You have all the methods of science.\u0022\r\n+\r\n+\u0022Men have educated us.\u0022\r\n+\r\n+\u0022But not explained you.\u0022\r\n+\r\n+\u0022Describe us as a sex,\u0022 was her challenge.\r\n+\r\n+\u0022Sphinxes without secrets.\u0022\r\n+\r\n+She looked at him, smiling. \u0022How long Mr. Gray is!\u0022 she said. \u0022Let us\r\n+go and help him. I have not yet told him the colour of my frock.\u0022\r\n+\r\n+\u0022Ah! you must suit your frock to his flowers, Gladys.\u0022\r\n+\r\n+\u0022That would be a premature surrender.\u0022\r\n+\r\n+\u0022Romantic art begins with its climax.\u0022\r\n+\r\n+\u0022I must keep an opportunity for retreat.\u0022\r\n+\r\n+\u0022In the Parthian manner?\u0022\r\n+\r\n+\u0022They found safety in the desert. I could not do that.\u0022\r\n+\r\n+\u0022Women are not always allowed a choice,\u0022 he answered, but hardly had he\r\n+finished the sentence before from the far end of the conservatory came\r\n+a stifled groan, followed by the dull sound of a heavy fall. Everybody\r\n+started up. The duchess stood motionless in horror. And with fear in\r\n+his eyes, Lord Henry rushed through the flapping palms to find Dorian\r\n+Gray lying face downwards on the tiled floor in a deathlike swoon.\r\n+\r\n+He was carried at once into the blue drawing-room and laid upon one of\r\n+the sofas. After a short time, he came to himself and looked round\r\n+with a dazed expression.\r\n+\r\n+\u0022What has happened?\u0022 he asked. \u0022Oh! I remember. Am I safe here,\r\n+Harry?\u0022 He began to tremble.\r\n+\r\n+\u0022My dear Dorian,\u0022 answered Lord Henry, \u0022you merely fainted. That was\r\n+all. You must have overtired yourself. You had better not come down\r\n+to dinner. I will take your place.\u0022\r\n+\r\n+\u0022No, I will come down,\u0022 he said, struggling to his feet. \u0022I would\r\n+rather come down. I must not be alone.\u0022\r\n+\r\n+He went to his room and dressed. There was a wild recklessness of\r\n+gaiety in his manner as he sat at table, but now and then a thrill of\r\n+terror ran through him when he remembered that, pressed against the\r\n+window of the conservatory, like a white handkerchief, he had seen the\r\n+face of James Vane watching him.\r\n+\r\n+\r\n+\r\n+CHAPTER 18\r\n+\r\n+The next day he did not leave the house, and, indeed, spent most of the\r\n+time in his own room, sick with a wild terror of dying, and yet\r\n+indifferent to life itself. The consciousness of being hunted, snared,\r\n+tracked down, had begun to dominate him. If the tapestry did but\r\n+tremble in the wind, he shook. The dead leaves that were blown against\r\n+the leaded panes seemed to him like his own wasted resolutions and wild\r\n+regrets. When he closed his eyes, he saw again the sailor's face\r\n+peering through the mist-stained glass, and horror seemed once more to\r\n+lay its hand upon his heart.\r\n+\r\n+But perhaps it had been only his fancy that had called vengeance out of\r\n+the night and set the hideous shapes of punishment before him. Actual\r\n+life was chaos, but there was something terribly logical in the\r\n+imagination. It was the imagination that set remorse to dog the feet\r\n+of sin. It was the imagination that made each crime bear its misshapen\r\n+brood. In the common world of fact the wicked were not punished, nor\r\n+the good rewarded. Success was given to the strong, failure thrust\r\n+upon the weak. That was all. Besides, had any stranger been prowling\r\n+round the house, he would have been seen by the servants or the\r\n+keepers. Had any foot-marks been found on the flower-beds, the\r\n+gardeners would have reported it. Yes, it had been merely fancy.\r\n+Sibyl Vane's brother had not come back to kill him. He had sailed away\r\n+in his ship to founder in some winter sea. From him, at any rate, he\r\n+was safe. Why, the man did not know who he was, could not know who he\r\n+was. The mask of youth had saved him.\r\n+\r\n+And yet if it had been merely an illusion, how terrible it was to think\r\n+that conscience could raise such fearful phantoms, and give them\r\n+visible form, and make them move before one! What sort of life would\r\n+his be if, day and night, shadows of his crime were to peer at him from\r\n+silent corners, to mock him from secret places, to whisper in his ear\r\n+as he sat at the feast, to wake him with icy fingers as he lay asleep!\r\n+As the thought crept through his brain, he grew pale with terror, and\r\n+the air seemed to him to have become suddenly colder. Oh! in what a\r\n+wild hour of madness he had killed his friend! How ghastly the mere\r\n+memory of the scene! He saw it all again. Each hideous detail came\r\n+back to him with added horror. Out of the black cave of time, terrible\r\n+and swathed in scarlet, rose the image of his sin. When Lord Henry\r\n+came in at six o'clock, he found him crying as one whose heart will\r\n+break.\r\n+\r\n+It was not till the third day that he ventured to go out. There was\r\n+something in the clear, pine-scented air of that winter morning that\r\n+seemed to bring him back his joyousness and his ardour for life. But\r\n+it was not merely the physical conditions of environment that had\r\n+caused the change. His own nature had revolted against the excess of\r\n+anguish that had sought to maim and mar the perfection of its calm.\r\n+With subtle and finely wrought temperaments it is always so. Their\r\n+strong passions must either bruise or bend. They either slay the man,\r\n+or themselves die. Shallow sorrows and shallow loves live on. The\r\n+loves and sorrows that are great are destroyed by their own plenitude.\r\n+Besides, he had convinced himself that he had been the victim of a\r\n+terror-stricken imagination, and looked back now on his fears with\r\n+something of pity and not a little of contempt.\r\n+\r\n+After breakfast, he walked with the duchess for an hour in the garden\r\n+and then drove across the park to join the shooting-party. The crisp\r\n+frost lay like salt upon the grass. The sky was an inverted cup of\r\n+blue metal. A thin film of ice bordered the flat, reed-grown lake.\r\n+\r\n+At the corner of the pine-wood he caught sight of Sir Geoffrey\r\n+Clouston, the duchess's brother, jerking two spent cartridges out of\r\n+his gun. He jumped from the cart, and having told the groom to take\r\n+the mare home, made his way towards his guest through the withered\r\n+bracken and rough undergrowth.\r\n+\r\n+\u0022Have you had good sport, Geoffrey?\u0022 he asked.\r\n+\r\n+\u0022Not very good, Dorian. I think most of the birds have gone to the\r\n+open. I dare say it will be better after lunch, when we get to new\r\n+ground.\u0022\r\n+\r\n+Dorian strolled along by his side. The keen aromatic air, the brown\r\n+and red lights that glimmered in the wood, the hoarse cries of the\r\n+beaters ringing out from time to time, and the sharp snaps of the guns\r\n+that followed, fascinated him and filled him with a sense of delightful\r\n+freedom. He was dominated by the carelessness of happiness, by the\r\n+high indifference of joy.\r\n+\r\n+Suddenly from a lumpy tussock of old grass some twenty yards in front\r\n+of them, with black-tipped ears erect and long hinder limbs throwing it\r\n+forward, started a hare. It bolted for a thicket of alders. Sir\r\n+Geoffrey put his gun to his shoulder, but there was something in the\r\n+animal's grace of movement that strangely charmed Dorian Gray, and he\r\n+cried out at once, \u0022Don't shoot it, Geoffrey. Let it live.\u0022\r\n+\r\n+\u0022What nonsense, Dorian!\u0022 laughed his companion, and as the hare bounded\r\n+into the thicket, he fired. There were two cries heard, the cry of a\r\n+hare in pain, which is dreadful, the cry of a man in agony, which is\r\n+worse.\r\n+\r\n+\u0022Good heavens! I have hit a beater!\u0022 exclaimed Sir Geoffrey. \u0022What an\r\n+ass the man was to get in front of the guns! Stop shooting there!\u0022 he\r\n+called out at the top of his voice. \u0022A man is hurt.\u0022\r\n+\r\n+The head-keeper came running up with a stick in his hand.\r\n+\r\n+\u0022Where, sir? Where is he?\u0022 he shouted. At the same time, the firing\r\n+ceased along the line.\r\n+\r\n+\u0022Here,\u0022 answered Sir Geoffrey angrily, hurrying towards the thicket.\r\n+\u0022Why on earth don't you keep your men back? Spoiled my shooting for\r\n+the day.\u0022\r\n+\r\n+Dorian watched them as they plunged into the alder-clump, brushing the\r\n+lithe swinging branches aside. In a few moments they emerged, dragging\r\n+a body after them into the sunlight. He turned away in horror. It\r\n+seemed to him that misfortune followed wherever he went. He heard Sir\r\n+Geoffrey ask if the man was really dead, and the affirmative answer of\r\n+the keeper. The wood seemed to him to have become suddenly alive with\r\n+faces. There was the trampling of myriad feet and the low buzz of\r\n+voices. A great copper-breasted pheasant came beating through the\r\n+boughs overhead.\r\n+\r\n+After a few moments--that were to him, in his perturbed state, like\r\n+endless hours of pain--he felt a hand laid on his shoulder. He started\r\n+and looked round.\r\n+\r\n+\u0022Dorian,\u0022 said Lord Henry, \u0022I had better tell them that the shooting is\r\n+stopped for to-day. It would not look well to go on.\u0022\r\n+\r\n+\u0022I wish it were stopped for ever, Harry,\u0022 he answered bitterly. \u0022The\r\n+whole thing is hideous and cruel. Is the man ...?\u0022\r\n+\r\n+He could not finish the sentence.\r\n+\r\n+\u0022I am afraid so,\u0022 rejoined Lord Henry. \u0022He got the whole charge of\r\n+shot in his chest. He must have died almost instantaneously. Come;\r\n+let us go home.\u0022\r\n+\r\n+They walked side by side in the direction of the avenue for nearly\r\n+fifty yards without speaking. Then Dorian looked at Lord Henry and\r\n+said, with a heavy sigh, \u0022It is a bad omen, Harry, a very bad omen.\u0022\r\n+\r\n+\u0022What is?\u0022 asked Lord Henry. \u0022Oh! this accident, I suppose. My dear\r\n+fellow, it can't be helped. It was the man's own fault. Why did he\r\n+get in front of the guns? Besides, it is nothing to us. It is rather\r\n+awkward for Geoffrey, of course. It does not do to pepper beaters. It\r\n+makes people think that one is a wild shot. And Geoffrey is not; he\r\n+shoots very straight. But there is no use talking about the matter.\u0022\r\n+\r\n+Dorian shook his head. \u0022It is a bad omen, Harry. I feel as if\r\n+something horrible were going to happen to some of us. To myself,\r\n+perhaps,\u0022 he added, passing his hand over his eyes, with a gesture of\r\n+pain.\r\n+\r\n+The elder man laughed. \u0022The only horrible thing in the world is _ennui_,\r\n+Dorian. That is the one sin for which there is no forgiveness. But we\r\n+are not likely to suffer from it unless these fellows keep chattering\r\n+about this thing at dinner. I must tell them that the subject is to be\r\n+tabooed. As for omens, there is no such thing as an omen. Destiny\r\n+does not send us heralds. She is too wise or too cruel for that.\r\n+Besides, what on earth could happen to you, Dorian? You have\r\n+everything in the world that a man can want. There is no one who would\r\n+not be delighted to change places with you.\u0022\r\n+\r\n+\u0022There is no one with whom I would not change places, Harry. Don't\r\n+laugh like that. I am telling you the truth. The wretched peasant who\r\n+has just died is better off than I am. I have no terror of death. It\r\n+is the coming of death that terrifies me. Its monstrous wings seem to\r\n+wheel in the leaden air around me. Good heavens! don't you see a man\r\n+moving behind the trees there, watching me, waiting for me?\u0022\r\n+\r\n+Lord Henry looked in the direction in which the trembling gloved hand\r\n+was pointing. \u0022Yes,\u0022 he said, smiling, \u0022I see the gardener waiting for\r\n+you. I suppose he wants to ask you what flowers you wish to have on\r\n+the table to-night. How absurdly nervous you are, my dear fellow! You\r\n+must come and see my doctor, when we get back to town.\u0022\r\n+\r\n+Dorian heaved a sigh of relief as he saw the gardener approaching. The\r\n+man touched his hat, glanced for a moment at Lord Henry in a hesitating\r\n+manner, and then produced a letter, which he handed to his master.\r\n+\u0022Her Grace told me to wait for an answer,\u0022 he murmured.\r\n+\r\n+Dorian put the letter into his pocket. \u0022Tell her Grace that I am\r\n+coming in,\u0022 he said, coldly. The man turned round and went rapidly in\r\n+the direction of the house.\r\n+\r\n+\u0022How fond women are of doing dangerous things!\u0022 laughed Lord Henry.\r\n+\u0022It is one of the qualities in them that I admire most. A woman will\r\n+flirt with anybody in the world as long as other people are looking on.\u0022\r\n+\r\n+\u0022How fond you are of saying dangerous things, Harry! In the present\r\n+instance, you are quite astray. I like the duchess very much, but I\r\n+don't love her.\u0022\r\n+\r\n+\u0022And the duchess loves you very much, but she likes you less, so you\r\n+are excellently matched.\u0022\r\n+\r\n+\u0022You are talking scandal, Harry, and there is never any basis for\r\n+scandal.\u0022\r\n+\r\n+\u0022The basis of every scandal is an immoral certainty,\u0022 said Lord Henry,\r\n+lighting a cigarette.\r\n+\r\n+\u0022You would sacrifice anybody, Harry, for the sake of an epigram.\u0022\r\n+\r\n+\u0022The world goes to the altar of its own accord,\u0022 was the answer.\r\n+\r\n+\u0022I wish I could love,\u0022 cried Dorian Gray with a deep note of pathos in\r\n+his voice. \u0022But I seem to have lost the passion and forgotten the\r\n+desire. I am too much concentrated on myself. My own personality has\r\n+become a burden to me. I want to escape, to go away, to forget. It\r\n+was silly of me to come down here at all. I think I shall send a wire\r\n+to Harvey to have the yacht got ready. On a yacht one is safe.\u0022\r\n+\r\n+\u0022Safe from what, Dorian? You are in some trouble. Why not tell me\r\n+what it is? You know I would help you.\u0022\r\n+\r\n+\u0022I can't tell you, Harry,\u0022 he answered sadly. \u0022And I dare say it is\r\n+only a fancy of mine. This unfortunate accident has upset me. I have\r\n+a horrible presentiment that something of the kind may happen to me.\u0022\r\n+\r\n+\u0022What nonsense!\u0022\r\n+\r\n+\u0022I hope it is, but I can't help feeling it. Ah! here is the duchess,\r\n+looking like Artemis in a tailor-made gown. You see we have come back,\r\n+Duchess.\u0022\r\n+\r\n+\u0022I have heard all about it, Mr. Gray,\u0022 she answered. \u0022Poor Geoffrey is\r\n+terribly upset. And it seems that you asked him not to shoot the hare.\r\n+How curious!\u0022\r\n+\r\n+\u0022Yes, it was very curious. I don't know what made me say it. Some\r\n+whim, I suppose. It looked the loveliest of little live things. But I\r\n+am sorry they told you about the man. It is a hideous subject.\u0022\r\n+\r\n+\u0022It is an annoying subject,\u0022 broke in Lord Henry. \u0022It has no\r\n+psychological value at all. Now if Geoffrey had done the thing on\r\n+purpose, how interesting he would be! I should like to know some one\r\n+who had committed a real murder.\u0022\r\n+\r\n+\u0022How horrid of you, Harry!\u0022 cried the duchess. \u0022Isn't it, Mr. Gray?\r\n+Harry, Mr. Gray is ill again. He is going to faint.\u0022\r\n+\r\n+Dorian drew himself up with an effort and smiled. \u0022It is nothing,\r\n+Duchess,\u0022 he murmured; \u0022my nerves are dreadfully out of order. That is\r\n+all. I am afraid I walked too far this morning. I didn't hear what\r\n+Harry said. Was it very bad? You must tell me some other time. I\r\n+think I must go and lie down. You will excuse me, won't you?\u0022\r\n+\r\n+They had reached the great flight of steps that led from the\r\n+conservatory on to the terrace. As the glass door closed behind\r\n+Dorian, Lord Henry turned and looked at the duchess with his slumberous\r\n+eyes. \u0022Are you very much in love with him?\u0022 he asked.\r\n+\r\n+She did not answer for some time, but stood gazing at the landscape.\r\n+\u0022I wish I knew,\u0022 she said at last.\r\n+\r\n+He shook his head. \u0022Knowledge would be fatal. It is the uncertainty\r\n+that charms one. A mist makes things wonderful.\u0022\r\n+\r\n+\u0022One may lose one's way.\u0022\r\n+\r\n+\u0022All ways end at the same point, my dear Gladys.\u0022\r\n+\r\n+\u0022What is that?\u0022\r\n+\r\n+\u0022Disillusion.\u0022\r\n+\r\n+\u0022It was my _debut_ in life,\u0022 she sighed.\r\n+\r\n+\u0022It came to you crowned.\u0022\r\n+\r\n+\u0022I am tired of strawberry leaves.\u0022\r\n+\r\n+\u0022They become you.\u0022\r\n+\r\n+\u0022Only in public.\u0022\r\n+\r\n+\u0022You would miss them,\u0022 said Lord Henry.\r\n+\r\n+\u0022I will not part with a petal.\u0022\r\n+\r\n+\u0022Monmouth has ears.\u0022\r\n+\r\n+\u0022Old age is dull of hearing.\u0022\r\n+\r\n+\u0022Has he never been jealous?\u0022\r\n+\r\n+\u0022I wish he had been.\u0022\r\n+\r\n+He glanced about as if in search of something. \u0022What are you looking\r\n+for?\u0022 she inquired.\r\n+\r\n+\u0022The button from your foil,\u0022 he answered. \u0022You have dropped it.\u0022\r\n+\r\n+She laughed. \u0022I have still the mask.\u0022\r\n+\r\n+\u0022It makes your eyes lovelier,\u0022 was his reply.\r\n+\r\n+She laughed again. Her teeth showed like white seeds in a scarlet\r\n+fruit.\r\n+\r\n+Upstairs, in his own room, Dorian Gray was lying on a sofa, with terror\r\n+in every tingling fibre of his body. Life had suddenly become too\r\n+hideous a burden for him to bear. The dreadful death of the unlucky\r\n+beater, shot in the thicket like a wild animal, had seemed to him to\r\n+pre-figure death for himself also. He had nearly swooned at what Lord\r\n+Henry had said in a chance mood of cynical jesting.\r\n+\r\n+At five o'clock he rang his bell for his servant and gave him orders to\r\n+pack his things for the night-express to town, and to have the brougham\r\n+at the door by eight-thirty. He was determined not to sleep another\r\n+night at Selby Royal. It was an ill-omened place. Death walked there\r\n+in the sunlight. The grass of the forest had been spotted with blood.\r\n+\r\n+Then he wrote a note to Lord Henry, telling him that he was going up to\r\n+town to consult his doctor and asking him to entertain his guests in\r\n+his absence. As he was putting it into the envelope, a knock came to\r\n+the door, and his valet informed him that the head-keeper wished to see\r\n+him. He frowned and bit his lip. \u0022Send him in,\u0022 he muttered, after\r\n+some moments' hesitation.\r\n+\r\n+As soon as the man entered, Dorian pulled his chequebook out of a\r\n+drawer and spread it out before him.\r\n+\r\n+\u0022I suppose you have come about the unfortunate accident of this\r\n+morning, Thornton?\u0022 he said, taking up a pen.\r\n+\r\n+\u0022Yes, sir,\u0022 answered the gamekeeper.\r\n+\r\n+\u0022Was the poor fellow married? Had he any people dependent on him?\u0022\r\n+asked Dorian, looking bored. \u0022If so, I should not like them to be left\r\n+in want, and will send them any sum of money you may think necessary.\u0022\r\n+\r\n+\u0022We don't know who he is, sir. That is what I took the liberty of\r\n+coming to you about.\u0022\r\n+\r\n+\u0022Don't know who he is?\u0022 said Dorian, listlessly. \u0022What do you mean?\r\n+Wasn't he one of your men?\u0022\r\n+\r\n+\u0022No, sir. Never saw him before. Seems like a sailor, sir.\u0022\r\n+\r\n+The pen dropped from Dorian Gray's hand, and he felt as if his heart\r\n+had suddenly stopped beating. \u0022A sailor?\u0022 he cried out. \u0022Did you say\r\n+a sailor?\u0022\r\n+\r\n+\u0022Yes, sir. He looks as if he had been a sort of sailor; tattooed on\r\n+both arms, and that kind of thing.\u0022\r\n+\r\n+\u0022Was there anything found on him?\u0022 said Dorian, leaning forward and\r\n+looking at the man with startled eyes. \u0022Anything that would tell his\r\n+name?\u0022\r\n+\r\n+\u0022Some money, sir--not much, and a six-shooter. There was no name of any\r\n+kind. A decent-looking man, sir, but rough-like. A sort of sailor we\r\n+think.\u0022\r\n+\r\n+Dorian started to his feet. A terrible hope fluttered past him. He\r\n+clutched at it madly. \u0022Where is the body?\u0022 he exclaimed. \u0022Quick! I\r\n+must see it at once.\u0022\r\n+\r\n+\u0022It is in an empty stable in the Home Farm, sir. The folk don't like\r\n+to have that sort of thing in their houses. They say a corpse brings\r\n+bad luck.\u0022\r\n+\r\n+\u0022The Home Farm! Go there at once and meet me. Tell one of the grooms\r\n+to bring my horse round. No. Never mind. I'll go to the stables\r\n+myself. It will save time.\u0022\r\n+\r\n+In less than a quarter of an hour, Dorian Gray was galloping down the\r\n+long avenue as hard as he could go. The trees seemed to sweep past him\r\n+in spectral procession, and wild shadows to fling themselves across his\r\n+path. Once the mare swerved at a white gate-post and nearly threw him.\r\n+He lashed her across the neck with his crop. She cleft the dusky air\r\n+like an arrow. The stones flew from her hoofs.\r\n+\r\n+At last he reached the Home Farm. Two men were loitering in the yard.\r\n+He leaped from the saddle and threw the reins to one of them. In the\r\n+farthest stable a light was glimmering. Something seemed to tell him\r\n+that the body was there, and he hurried to the door and put his hand\r\n+upon the latch.\r\n+\r\n+There he paused for a moment, feeling that he was on the brink of a\r\n+discovery that would either make or mar his life. Then he thrust the\r\n+door open and entered.\r\n+\r\n+On a heap of sacking in the far corner was lying the dead body of a man\r\n+dressed in a coarse shirt and a pair of blue trousers. A spotted\r\n+handkerchief had been placed over the face. A coarse candle, stuck in\r\n+a bottle, sputtered beside it.\r\n+\r\n+Dorian Gray shuddered. He felt that his could not be the hand to take\r\n+the handkerchief away, and called out to one of the farm-servants to\r\n+come to him.\r\n+\r\n+\u0022Take that thing off the face. I wish to see it,\u0022 he said, clutching\r\n+at the door-post for support.\r\n+\r\n+When the farm-servant had done so, he stepped forward. A cry of joy\r\n+broke from his lips. The man who had been shot in the thicket was\r\n+James Vane.\r\n+\r\n+He stood there for some minutes looking at the dead body. As he rode\r\n+home, his eyes were full of tears, for he knew he was safe.\r\n+\r\n+\r\n+\r\n+CHAPTER 19\r\n+\r\n+\u0022There is no use your telling me that you are going to be good,\u0022 cried\r\n+Lord Henry, dipping his white fingers into a red copper bowl filled\r\n+with rose-water. \u0022You are quite perfect. Pray, don't change.\u0022\r\n+\r\n+Dorian Gray shook his head. \u0022No, Harry, I have done too many dreadful\r\n+things in my life. I am not going to do any more. I began my good\r\n+actions yesterday.\u0022\r\n+\r\n+\u0022Where were you yesterday?\u0022\r\n+\r\n+\u0022In the country, Harry. I was staying at a little inn by myself.\u0022\r\n+\r\n+\u0022My dear boy,\u0022 said Lord Henry, smiling, \u0022anybody can be good in the\r\n+country. There are no temptations there. That is the reason why\r\n+people who live out of town are so absolutely uncivilized.\r\n+Civilization is not by any means an easy thing to attain to. There are\r\n+only two ways by which man can reach it. One is by being cultured, the\r\n+other by being corrupt. Country people have no opportunity of being\r\n+either, so they stagnate.\u0022\r\n+\r\n+\u0022Culture and corruption,\u0022 echoed Dorian. \u0022I have known something of\r\n+both. It seems terrible to me now that they should ever be found\r\n+together. For I have a new ideal, Harry. I am going to alter. I\r\n+think I have altered.\u0022\r\n+\r\n+\u0022You have not yet told me what your good action was. Or did you say\r\n+you had done more than one?\u0022 asked his companion as he spilled into his\r\n+plate a little crimson pyramid of seeded strawberries and, through a\r\n+perforated, shell-shaped spoon, snowed white sugar upon them.\r\n+\r\n+\u0022I can tell you, Harry. It is not a story I could tell to any one\r\n+else. I spared somebody. It sounds vain, but you understand what I\r\n+mean. She was quite beautiful and wonderfully like Sibyl Vane. I\r\n+think it was that which first attracted me to her. You remember Sibyl,\r\n+don't you? How long ago that seems! Well, Hetty was not one of our\r\n+own class, of course. She was simply a girl in a village. But I\r\n+really loved her. I am quite sure that I loved her. All during this\r\n+wonderful May that we have been having, I used to run down and see her\r\n+two or three times a week. Yesterday she met me in a little orchard.\r\n+The apple-blossoms kept tumbling down on her hair, and she was\r\n+laughing. We were to have gone away together this morning at dawn.\r\n+Suddenly I determined to leave her as flowerlike as I had found her.\u0022\r\n+\r\n+\u0022I should think the novelty of the emotion must have given you a thrill\r\n+of real pleasure, Dorian,\u0022 interrupted Lord Henry. \u0022But I can finish\r\n+your idyll for you. You gave her good advice and broke her heart.\r\n+That was the beginning of your reformation.\u0022\r\n+\r\n+\u0022Harry, you are horrible! You mustn't say these dreadful things.\r\n+Hetty's heart is not broken. Of course, she cried and all that. But\r\n+there is no disgrace upon her. She can live, like Perdita, in her\r\n+garden of mint and marigold.\u0022\r\n+\r\n+\u0022And weep over a faithless Florizel,\u0022 said Lord Henry, laughing, as he\r\n+leaned back in his chair. \u0022My dear Dorian, you have the most curiously\r\n+boyish moods. Do you think this girl will ever be really content now\r\n+with any one of her own rank? I suppose she will be married some day\r\n+to a rough carter or a grinning ploughman. Well, the fact of having\r\n+met you, and loved you, will teach her to despise her husband, and she\r\n+will be wretched. From a moral point of view, I cannot say that I\r\n+think much of your great renunciation. Even as a beginning, it is\r\n+poor. Besides, how do you know that Hetty isn't floating at the\r\n+present moment in some starlit mill-pond, with lovely water-lilies\r\n+round her, like Ophelia?\u0022\r\n+\r\n+\u0022I can't bear this, Harry! You mock at everything, and then suggest\r\n+the most serious tragedies. I am sorry I told you now. I don't care\r\n+what you say to me. I know I was right in acting as I did. Poor\r\n+Hetty! As I rode past the farm this morning, I saw her white face at\r\n+the window, like a spray of jasmine. Don't let us talk about it any\r\n+more, and don't try to persuade me that the first good action I have\r\n+done for years, the first little bit of self-sacrifice I have ever\r\n+known, is really a sort of sin. I want to be better. I am going to be\r\n+better. Tell me something about yourself. What is going on in town?\r\n+I have not been to the club for days.\u0022\r\n+\r\n+\u0022The people are still discussing poor Basil's disappearance.\u0022\r\n+\r\n+\u0022I should have thought they had got tired of that by this time,\u0022 said\r\n+Dorian, pouring himself out some wine and frowning slightly.\r\n+\r\n+\u0022My dear boy, they have only been talking about it for six weeks, and\r\n+the British public are really not equal to the mental strain of having\r\n+more than one topic every three months. They have been very fortunate\r\n+lately, however. They have had my own divorce-case and Alan Campbell's\r\n+suicide. Now they have got the mysterious disappearance of an artist.\r\n+Scotland Yard still insists that the man in the grey ulster who left\r\n+for Paris by the midnight train on the ninth of November was poor\r\n+Basil, and the French police declare that Basil never arrived in Paris\r\n+at all. I suppose in about a fortnight we shall be told that he has\r\n+been seen in San Francisco. It is an odd thing, but every one who\r\n+disappears is said to be seen at San Francisco. It must be a\r\n+delightful city, and possess all the attractions of the next world.\u0022\r\n+\r\n+\u0022What do you think has happened to Basil?\u0022 asked Dorian, holding up his\r\n+Burgundy against the light and wondering how it was that he could\r\n+discuss the matter so calmly.\r\n+\r\n+\u0022I have not the slightest idea. If Basil chooses to hide himself, it\r\n+is no business of mine. If he is dead, I don't want to think about\r\n+him. Death is the only thing that ever terrifies me. I hate it.\u0022\r\n+\r\n+\u0022Why?\u0022 said the younger man wearily.\r\n+\r\n+\u0022Because,\u0022 said Lord Henry, passing beneath his nostrils the gilt\r\n+trellis of an open vinaigrette box, \u0022one can survive everything\r\n+nowadays except that. Death and vulgarity are the only two facts in\r\n+the nineteenth century that one cannot explain away. Let us have our\r\n+coffee in the music-room, Dorian. You must play Chopin to me. The man\r\n+with whom my wife ran away played Chopin exquisitely. Poor Victoria!\r\n+I was very fond of her. The house is rather lonely without her. Of\r\n+course, married life is merely a habit, a bad habit. But then one\r\n+regrets the loss even of one's worst habits. Perhaps one regrets them\r\n+the most. They are such an essential part of one's personality.\u0022\r\n+\r\n+Dorian said nothing, but rose from the table, and passing into the next\r\n+room, sat down to the piano and let his fingers stray across the white\r\n+and black ivory of the keys. After the coffee had been brought in, he\r\n+stopped, and looking over at Lord Henry, said, \u0022Harry, did it ever\r\n+occur to you that Basil was murdered?\u0022\r\n+\r\n+Lord Henry yawned. \u0022Basil was very popular, and always wore a\r\n+Waterbury watch. Why should he have been murdered? He was not clever\r\n+enough to have enemies. Of course, he had a wonderful genius for\r\n+painting. But a man can paint like Velasquez and yet be as dull as\r\n+possible. Basil was really rather dull. He only interested me once,\r\n+and that was when he told me, years ago, that he had a wild adoration\r\n+for you and that you were the dominant motive of his art.\u0022\r\n+\r\n+\u0022I was very fond of Basil,\u0022 said Dorian with a note of sadness in his\r\n+voice. \u0022But don't people say that he was murdered?\u0022\r\n+\r\n+\u0022Oh, some of the papers do. It does not seem to me to be at all\r\n+probable. I know there are dreadful places in Paris, but Basil was not\r\n+the sort of man to have gone to them. He had no curiosity. It was his\r\n+chief defect.\u0022\r\n+\r\n+\u0022What would you say, Harry, if I told you that I had murdered Basil?\u0022\r\n+said the younger man. He watched him intently after he had spoken.\r\n+\r\n+\u0022I would say, my dear fellow, that you were posing for a character that\r\n+doesn't suit you. All crime is vulgar, just as all vulgarity is crime.\r\n+It is not in you, Dorian, to commit a murder. I am sorry if I hurt\r\n+your vanity by saying so, but I assure you it is true. Crime belongs\r\n+exclusively to the lower orders. I don't blame them in the smallest\r\n+degree. I should fancy that crime was to them what art is to us,\r\n+simply a method of procuring extraordinary sensations.\u0022\r\n+\r\n+\u0022A method of procuring sensations? Do you think, then, that a man who\r\n+has once committed a murder could possibly do the same crime again?\r\n+Don't tell me that.\u0022\r\n+\r\n+\u0022Oh! anything becomes a pleasure if one does it too often,\u0022 cried Lord\r\n+Henry, laughing. \u0022That is one of the most important secrets of life.\r\n+I should fancy, however, that murder is always a mistake. One should\r\n+never do anything that one cannot talk about after dinner. But let us\r\n+pass from poor Basil. I wish I could believe that he had come to such\r\n+a really romantic end as you suggest, but I can't. I dare say he fell\r\n+into the Seine off an omnibus and that the conductor hushed up the\r\n+scandal. Yes: I should fancy that was his end. I see him lying now\r\n+on his back under those dull-green waters, with the heavy barges\r\n+floating over him and long weeds catching in his hair. Do you know, I\r\n+don't think he would have done much more good work. During the last\r\n+ten years his painting had gone off very much.\u0022\r\n+\r\n+Dorian heaved a sigh, and Lord Henry strolled across the room and began\r\n+to stroke the head of a curious Java parrot, a large, grey-plumaged\r\n+bird with pink crest and tail, that was balancing itself upon a bamboo\r\n+perch. As his pointed fingers touched it, it dropped the white scurf\r\n+of crinkled lids over black, glasslike eyes and began to sway backwards\r\n+and forwards.\r\n+\r\n+\u0022Yes,\u0022 he continued, turning round and taking his handkerchief out of\r\n+his pocket; \u0022his painting had quite gone off. It seemed to me to have\r\n+lost something. It had lost an ideal. When you and he ceased to be\r\n+great friends, he ceased to be a great artist. What was it separated\r\n+you? I suppose he bored you. If so, he never forgave you. It's a\r\n+habit bores have. By the way, what has become of that wonderful\r\n+portrait he did of you? I don't think I have ever seen it since he\r\n+finished it. Oh! I remember your telling me years ago that you had\r\n+sent it down to Selby, and that it had got mislaid or stolen on the\r\n+way. You never got it back? What a pity! it was really a\r\n+masterpiece. I remember I wanted to buy it. I wish I had now. It\r\n+belonged to Basil's best period. Since then, his work was that curious\r\n+mixture of bad painting and good intentions that always entitles a man\r\n+to be called a representative British artist. Did you advertise for\r\n+it? You should.\u0022\r\n+\r\n+\u0022I forget,\u0022 said Dorian. \u0022I suppose I did. But I never really liked\r\n+it. I am sorry I sat for it. The memory of the thing is hateful to\r\n+me. Why do you talk of it? It used to remind me of those curious\r\n+lines in some play--Hamlet, I think--how do they run?--\r\n+\r\n+ \u0022Like the painting of a sorrow,\r\n+ A face without a heart.\u0022\r\n+\r\n+Yes: that is what it was like.\u0022\r\n+\r\n+Lord Henry laughed. \u0022If a man treats life artistically, his brain is\r\n+his heart,\u0022 he answered, sinking into an arm-chair.\r\n+\r\n+Dorian Gray shook his head and struck some soft chords on the piano.\r\n+\u0022'Like the painting of a sorrow,'\u0022 he repeated, \u0022'a face without a\r\n+heart.'\u0022\r\n+\r\n+The elder man lay back and looked at him with half-closed eyes. \u0022By\r\n+the way, Dorian,\u0022 he said after a pause, \u0022'what does it profit a man if\r\n+he gain the whole world and lose--how does the quotation run?--his own\r\n+soul'?\u0022\r\n+\r\n+The music jarred, and Dorian Gray started and stared at his friend.\r\n+\u0022Why do you ask me that, Harry?\u0022\r\n+\r\n+\u0022My dear fellow,\u0022 said Lord Henry, elevating his eyebrows in surprise,\r\n+\u0022I asked you because I thought you might be able to give me an answer.\r\n+That is all. I was going through the park last Sunday, and close by\r\n+the Marble Arch there stood a little crowd of shabby-looking people\r\n+listening to some vulgar street-preacher. As I passed by, I heard the\r\n+man yelling out that question to his audience. It struck me as being\r\n+rather dramatic. London is very rich in curious effects of that kind.\r\n+A wet Sunday, an uncouth Christian in a mackintosh, a ring of sickly\r\n+white faces under a broken roof of dripping umbrellas, and a wonderful\r\n+phrase flung into the air by shrill hysterical lips--it was really very\r\n+good in its way, quite a suggestion. I thought of telling the prophet\r\n+that art had a soul, but that man had not. I am afraid, however, he\r\n+would not have understood me.\u0022\r\n+\r\n+\u0022Don't, Harry. The soul is a terrible reality. It can be bought, and\r\n+sold, and bartered away. It can be poisoned, or made perfect. There\r\n+is a soul in each one of us. I know it.\u0022\r\n+\r\n+\u0022Do you feel quite sure of that, Dorian?\u0022\r\n+\r\n+\u0022Quite sure.\u0022\r\n+\r\n+\u0022Ah! then it must be an illusion. The things one feels absolutely\r\n+certain about are never true. That is the fatality of faith, and the\r\n+lesson of romance. How grave you are! Don't be so serious. What have\r\n+you or I to do with the superstitions of our age? No: we have given\r\n+up our belief in the soul. Play me something. Play me a nocturne,\r\n+Dorian, and, as you play, tell me, in a low voice, how you have kept\r\n+your youth. You must have some secret. I am only ten years older than\r\n+you are, and I am wrinkled, and worn, and yellow. You are really\r\n+wonderful, Dorian. You have never looked more charming than you do\r\n+to-night. You remind me of the day I saw you first. You were rather\r\n+cheeky, very shy, and absolutely extraordinary. You have changed, of\r\n+course, but not in appearance. I wish you would tell me your secret.\r\n+To get back my youth I would do anything in the world, except take\r\n+exercise, get up early, or be respectable. Youth! There is nothing\r\n+like it. It's absurd to talk of the ignorance of youth. The only\r\n+people to whose opinions I listen now with any respect are people much\r\n+younger than myself. They seem in front of me. Life has revealed to\r\n+them her latest wonder. As for the aged, I always contradict the aged.\r\n+I do it on principle. If you ask them their opinion on something that\r\n+happened yesterday, they solemnly give you the opinions current in\r\n+1820, when people wore high stocks, believed in everything, and knew\r\n+absolutely nothing. How lovely that thing you are playing is! I\r\n+wonder, did Chopin write it at Majorca, with the sea weeping round the\r\n+villa and the salt spray dashing against the panes? It is marvellously\r\n+romantic. What a blessing it is that there is one art left to us that\r\n+is not imitative! Don't stop. I want music to-night. It seems to me\r\n+that you are the young Apollo and that I am Marsyas listening to you.\r\n+I have sorrows, Dorian, of my own, that even you know nothing of. The\r\n+tragedy of old age is not that one is old, but that one is young. I am\r\n+amazed sometimes at my own sincerity. Ah, Dorian, how happy you are!\r\n+What an exquisite life you have had! You have drunk deeply of\r\n+everything. You have crushed the grapes against your palate. Nothing\r\n+has been hidden from you. And it has all been to you no more than the\r\n+sound of music. It has not marred you. You are still the same.\u0022\r\n+\r\n+\u0022I am not the same, Harry.\u0022\r\n+\r\n+\u0022Yes, you are the same. I wonder what the rest of your life will be.\r\n+Don't spoil it by renunciations. At present you are a perfect type.\r\n+Don't make yourself incomplete. You are quite flawless now. You need\r\n+not shake your head: you know you are. Besides, Dorian, don't deceive\r\n+yourself. Life is not governed by will or intention. Life is a\r\n+question of nerves, and fibres, and slowly built-up cells in which\r\n+thought hides itself and passion has its dreams. You may fancy\r\n+yourself safe and think yourself strong. But a chance tone of colour\r\n+in a room or a morning sky, a particular perfume that you had once\r\n+loved and that brings subtle memories with it, a line from a forgotten\r\n+poem that you had come across again, a cadence from a piece of music\r\n+that you had ceased to play--I tell you, Dorian, that it is on things\r\n+like these that our lives depend. Browning writes about that\r\n+somewhere; but our own senses will imagine them for us. There are\r\n+moments when the odour of _lilas blanc_ passes suddenly across me, and I\r\n+have to live the strangest month of my life over again. I wish I could\r\n+change places with you, Dorian. The world has cried out against us\r\n+both, but it has always worshipped you. It always will worship you.\r\n+You are the type of what the age is searching for, and what it is\r\n+afraid it has found. I am so glad that you have never done anything,\r\n+never carved a statue, or painted a picture, or produced anything\r\n+outside of yourself! Life has been your art. You have set yourself to\r\n+music. Your days are your sonnets.\u0022\r\n+\r\n+Dorian rose up from the piano and passed his hand through his hair.\r\n+\u0022Yes, life has been exquisite,\u0022 he murmured, \u0022but I am not going to\r\n+have the same life, Harry. And you must not say these extravagant\r\n+things to me. You don't know everything about me. I think that if you\r\n+did, even you would turn from me. You laugh. Don't laugh.\u0022\r\n+\r\n+\u0022Why have you stopped playing, Dorian? Go back and give me the\r\n+nocturne over again. Look at that great, honey-coloured moon that\r\n+hangs in the dusky air. She is waiting for you to charm her, and if\r\n+you play she will come closer to the earth. You won't? Let us go to\r\n+the club, then. It has been a charming evening, and we must end it\r\n+charmingly. There is some one at White's who wants immensely to know\r\n+you--young Lord Poole, Bournemouth's eldest son. He has already copied\r\n+your neckties, and has begged me to introduce him to you. He is quite\r\n+delightful and rather reminds me of you.\u0022\r\n+\r\n+\u0022I hope not,\u0022 said Dorian with a sad look in his eyes. \u0022But I am tired\r\n+to-night, Harry. I shan't go to the club. It is nearly eleven, and I\r\n+want to go to bed early.\u0022\r\n+\r\n+\u0022Do stay. You have never played so well as to-night. There was\r\n+something in your touch that was wonderful. It had more expression\r\n+than I had ever heard from it before.\u0022\r\n+\r\n+\u0022It is because I am going to be good,\u0022 he answered, smiling. \u0022I am a\r\n+little changed already.\u0022\r\n+\r\n+\u0022You cannot change to me, Dorian,\u0022 said Lord Henry. \u0022You and I will\r\n+always be friends.\u0022\r\n+\r\n+\u0022Yet you poisoned me with a book once. I should not forgive that.\r\n+Harry, promise me that you will never lend that book to any one. It\r\n+does harm.\u0022\r\n+\r\n+\u0022My dear boy, you are really beginning to moralize. You will soon be\r\n+going about like the converted, and the revivalist, warning people\r\n+against all the sins of which you have grown tired. You are much too\r\n+delightful to do that. Besides, it is no use. You and I are what we\r\n+are, and will be what we will be. As for being poisoned by a book,\r\n+there is no such thing as that. Art has no influence upon action. It\r\n+annihilates the desire to act. It is superbly sterile. The books that\r\n+the world calls immoral are books that show the world its own shame.\r\n+That is all. But we won't discuss literature. Come round to-morrow. I\r\n+am going to ride at eleven. We might go together, and I will take you\r\n+to lunch afterwards with Lady Branksome. She is a charming woman, and\r\n+wants to consult you about some tapestries she is thinking of buying.\r\n+Mind you come. Or shall we lunch with our little duchess? She says\r\n+she never sees you now. Perhaps you are tired of Gladys? I thought\r\n+you would be. Her clever tongue gets on one's nerves. Well, in any\r\n+case, be here at eleven.\u0022\r\n+\r\n+\u0022Must I really come, Harry?\u0022\r\n+\r\n+\u0022Certainly. The park is quite lovely now. I don't think there have\r\n+been such lilacs since the year I met you.\u0022\r\n+\r\n+\u0022Very well. I shall be here at eleven,\u0022 said Dorian. \u0022Good night,\r\n+Harry.\u0022 As he reached the door, he hesitated for a moment, as if he\r\n+had something more to say. Then he sighed and went out.\r\n+\r\n+\r\n+\r\n+CHAPTER 20\r\n+\r\n+It was a lovely night, so warm that he threw his coat over his arm and\r\n+did not even put his silk scarf round his throat. As he strolled home,\r\n+smoking his cigarette, two young men in evening dress passed him. He\r\n+heard one of them whisper to the other, \u0022That is Dorian Gray.\u0022 He\r\n+remembered how pleased he used to be when he was pointed out, or stared\r\n+at, or talked about. He was tired of hearing his own name now. Half\r\n+the charm of the little village where he had been so often lately was\r\n+that no one knew who he was. He had often told the girl whom he had\r\n+lured to love him that he was poor, and she had believed him. He had\r\n+told her once that he was wicked, and she had laughed at him and\r\n+answered that wicked people were always very old and very ugly. What a\r\n+laugh she had!--just like a thrush singing. And how pretty she had\r\n+been in her cotton dresses and her large hats! She knew nothing, but\r\n+she had everything that he had lost.\r\n+\r\n+When he reached home, he found his servant waiting up for him. He sent\r\n+him to bed, and threw himself down on the sofa in the library, and\r\n+began to think over some of the things that Lord Henry had said to him.\r\n+\r\n+Was it really true that one could never change? He felt a wild longing\r\n+for the unstained purity of his boyhood--his rose-white boyhood, as\r\n+Lord Henry had once called it. He knew that he had tarnished himself,\r\n+filled his mind with corruption and given horror to his fancy; that he\r\n+had been an evil influence to others, and had experienced a terrible\r\n+joy in being so; and that of the lives that had crossed his own, it had\r\n+been the fairest and the most full of promise that he had brought to\r\n+shame. But was it all irretrievable? Was there no hope for him?\r\n+\r\n+Ah! in what a monstrous moment of pride and passion he had prayed that\r\n+the portrait should bear the burden of his days, and he keep the\r\n+unsullied splendour of eternal youth! All his failure had been due to\r\n+that. Better for him that each sin of his life had brought its sure\r\n+swift penalty along with it. There was purification in punishment.\r\n+Not \u0022Forgive us our sins\u0022 but \u0022Smite us for our iniquities\u0022 should be\r\n+the prayer of man to a most just God.\r\n+\r\n+The curiously carved mirror that Lord Henry had given to him, so many\r\n+years ago now, was standing on the table, and the white-limbed Cupids\r\n+laughed round it as of old. He took it up, as he had done on that\r\n+night of horror when he had first noted the change in the fatal\r\n+picture, and with wild, tear-dimmed eyes looked into its polished\r\n+shield. Once, some one who had terribly loved him had written to him a\r\n+mad letter, ending with these idolatrous words: \u0022The world is changed\r\n+because you are made of ivory and gold. The curves of your lips\r\n+rewrite history.\u0022 The phrases came back to his memory, and he repeated\r\n+them over and over to himself. Then he loathed his own beauty, and\r\n+flinging the mirror on the floor, crushed it into silver splinters\r\n+beneath his heel. It was his beauty that had ruined him, his beauty\r\n+and the youth that he had prayed for. But for those two things, his\r\n+life might have been free from stain. His beauty had been to him but a\r\n+mask, his youth but a mockery. What was youth at best? A green, an\r\n+unripe time, a time of shallow moods, and sickly thoughts. Why had he\r\n+worn its livery? Youth had spoiled him.\r\n+\r\n+It was better not to think of the past. Nothing could alter that. It\r\n+was of himself, and of his own future, that he had to think. James\r\n+Vane was hidden in a nameless grave in Selby churchyard. Alan Campbell\r\n+had shot himself one night in his laboratory, but had not revealed the\r\n+secret that he had been forced to know. The excitement, such as it\r\n+was, over Basil Hallward's disappearance would soon pass away. It was\r\n+already waning. He was perfectly safe there. Nor, indeed, was it the\r\n+death of Basil Hallward that weighed most upon his mind. It was the\r\n+living death of his own soul that troubled him. Basil had painted the\r\n+portrait that had marred his life. He could not forgive him that. It\r\n+was the portrait that had done everything. Basil had said things to\r\n+him that were unbearable, and that he had yet borne with patience. The\r\n+murder had been simply the madness of a moment. As for Alan Campbell,\r\n+his suicide had been his own act. He had chosen to do it. It was\r\n+nothing to him.\r\n+\r\n+A new life! That was what he wanted. That was what he was waiting\r\n+for. Surely he had begun it already. He had spared one innocent\r\n+thing, at any rate. He would never again tempt innocence. He would be\r\n+good.\r\n+\r\n+As he thought of Hetty Merton, he began to wonder if the portrait in\r\n+the locked room had changed. Surely it was not still so horrible as it\r\n+had been? Perhaps if his life became pure, he would be able to expel\r\n+every sign of evil passion from the face. Perhaps the signs of evil\r\n+had already gone away. He would go and look.\r\n+\r\n+He took the lamp from the table and crept upstairs. As he unbarred the\r\n+door, a smile of joy flitted across his strangely young-looking face\r\n+and lingered for a moment about his lips. Yes, he would be good, and\r\n+the hideous thing that he had hidden away would no longer be a terror\r\n+to him. He felt as if the load had been lifted from him already.\r\n+\r\n+He went in quietly, locking the door behind him, as was his custom, and\r\n+dragged the purple hanging from the portrait. A cry of pain and\r\n+indignation broke from him. He could see no change, save that in the\r\n+eyes there was a look of cunning and in the mouth the curved wrinkle of\r\n+the hypocrite. The thing was still loathsome--more loathsome, if\r\n+possible, than before--and the scarlet dew that spotted the hand seemed\r\n+brighter, and more like blood newly spilled. Then he trembled. Had it\r\n+been merely vanity that had made him do his one good deed? Or the\r\n+desire for a new sensation, as Lord Henry had hinted, with his mocking\r\n+laugh? Or that passion to act a part that sometimes makes us do things\r\n+finer than we are ourselves? Or, perhaps, all these? And why was the\r\n+red stain larger than it had been? It seemed to have crept like a\r\n+horrible disease over the wrinkled fingers. There was blood on the\r\n+painted feet, as though the thing had dripped--blood even on the hand\r\n+that had not held the knife. Confess? Did it mean that he was to\r\n+confess? To give himself up and be put to death? He laughed. He felt\r\n+that the idea was monstrous. Besides, even if he did confess, who\r\n+would believe him? There was no trace of the murdered man anywhere.\r\n+Everything belonging to him had been destroyed. He himself had burned\r\n+what had been below-stairs. The world would simply say that he was mad.\r\n+They would shut him up if he persisted in his story.... Yet it was\r\n+his duty to confess, to suffer public shame, and to make public\r\n+atonement. There was a God who called upon men to tell their sins to\r\n+earth as well as to heaven. Nothing that he could do would cleanse him\r\n+till he had told his own sin. His sin? He shrugged his shoulders.\r\n+The death of Basil Hallward seemed very little to him. He was thinking\r\n+of Hetty Merton. For it was an unjust mirror, this mirror of his soul\r\n+that he was looking at. Vanity? Curiosity? Hypocrisy? Had there\r\n+been nothing more in his renunciation than that? There had been\r\n+something more. At least he thought so. But who could tell? ... No.\r\n+There had been nothing more. Through vanity he had spared her. In\r\n+hypocrisy he had worn the mask of goodness. For curiosity's sake he\r\n+had tried the denial of self. He recognized that now.\r\n+\r\n+But this murder--was it to dog him all his life? Was he always to be\r\n+burdened by his past? Was he really to confess? Never. There was\r\n+only one bit of evidence left against him. The picture itself--that\r\n+was evidence. He would destroy it. Why had he kept it so long? Once\r\n+it had given him pleasure to watch it changing and growing old. Of\r\n+late he had felt no such pleasure. It had kept him awake at night.\r\n+When he had been away, he had been filled with terror lest other eyes\r\n+should look upon it. It had brought melancholy across his passions.\r\n+Its mere memory had marred many moments of joy. It had been like\r\n+conscience to him. Yes, it had been conscience. He would destroy it.\r\n+\r\n+He looked round and saw the knife that had stabbed Basil Hallward. He\r\n+had cleaned it many times, till there was no stain left upon it. It\r\n+was bright, and glistened. As it had killed the painter, so it would\r\n+kill the painter's work, and all that that meant. It would kill the\r\n+past, and when that was dead, he would be free. It would kill this\r\n+monstrous soul-life, and without its hideous warnings, he would be at\r\n+peace. He seized the thing, and stabbed the picture with it.\r\n+\r\n+There was a cry heard, and a crash. The cry was so horrible in its\r\n+agony that the frightened servants woke and crept out of their rooms.\r\n+Two gentlemen, who were passing in the square below, stopped and looked\r\n+up at the great house. They walked on till they met a policeman and\r\n+brought him back. The man rang the bell several times, but there was\r\n+no answer. Except for a light in one of the top windows, the house was\r\n+all dark. After a time, he went away and stood in an adjoining portico\r\n+and watched.\r\n+\r\n+\u0022Whose house is that, Constable?\u0022 asked the elder of the two gentlemen.\r\n+\r\n+\u0022Mr. Dorian Gray's, sir,\u0022 answered the policeman.\r\n+\r\n+They looked at each other, as they walked away, and sneered. One of\r\n+them was Sir Henry Ashton's uncle.\r\n+\r\n+Inside, in the servants' part of the house, the half-clad domestics\r\n+were talking in low whispers to each other. Old Mrs. Leaf was crying\r\n+and wringing her hands. Francis was as pale as death.\r\n+\r\n+After about a quarter of an hour, he got the coachman and one of the\r\n+footmen and crept upstairs. They knocked, but there was no reply.\r\n+They called out. Everything was still. Finally, after vainly trying\r\n+to force the door, they got on the roof and dropped down on to the\r\n+balcony. The windows yielded easily--their bolts were old.\r\n+\r\n+When they entered, they found hanging upon the wall a splendid portrait\r\n+of their master as they had last seen him, in all the wonder of his\r\n+exquisite youth and beauty. Lying on the floor was a dead man, in\r\n+evening dress, with a knife in his heart. He was withered, wrinkled,\r\n+and loathsome of visage. It was not till they had examined the rings\r\n+that they recognized who it was.\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+End of Project Gutenberg's The Picture of Dorian Gray, by Oscar Wilde\r\n+\r\n+*** END OF THIS PROJECT GUTENBERG EBOOK THE PICTURE OF DORIAN GRAY ***\r\n+\r\n+***** This file should be named 174.txt or 174.zip *****\r\n+This and all associated files of various formats will be found in:\r\n+ http://www.gutenberg.org/1/7/174/\r\n+\r\n+Produced by Judith Boss. HTML version by Al Haines.\r\n+\r\n+Updated editions will replace the previous one--the old editions\r\n+will be renamed.\r\n+\r\n+Creating the works from public domain print editions means that no\r\n+one owns a United States copyright in these works, so the Foundation\r\n+(and you!) can copy and distribute it in the United States without\r\n+permission and without paying copyright royalties. Special rules,\r\n+set forth in the General Terms of Use part of this license, apply to\r\n+copying and distributing Project Gutenberg-tm electronic works to\r\n+protect the PROJECT GUTENBERG-tm concept and trademark. Project\r\n+Gutenberg is a registered trademark, and may not be used if you\r\n+charge for the eBooks, unless you receive specific permission. If you\r\n+do not charge anything for copies of this eBook, complying with the\r\n+rules is very easy. You may use this eBook for nearly any purpose\r\n+such as creation of derivative works, reports, performances and\r\n+research. They may be modified and printed and given away--you may do\r\n+practically ANYTHING with public domain eBooks. Redistribution is\r\n+subject to the trademark license, especially commercial\r\n+redistribution.\r\n+\r\n+\r\n+\r\n+*** START: FULL LICENSE ***\r\n+\r\n+THE FULL PROJECT GUTENBERG LICENSE\r\n+PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK\r\n+\r\n+To protect the Project Gutenberg-tm mission of promoting the free\r\n+distribution of electronic works, by using or distributing this work\r\n+(or any other work associated in any way with the phrase \u0022Project\r\n+Gutenberg\u0022), you agree to comply with all the terms of the Full Project\r\n+Gutenberg-tm License (available with this file or online at\r\n+http://gutenberg.net/license).\r\n+\r\n+\r\n+Section 1. General Terms of Use and Redistributing Project Gutenberg-tm\r\n+electronic works\r\n+\r\n+1.A. By reading or using any part of this Project Gutenberg-tm\r\n+electronic work, you indicate that you have read, understand, agree to\r\n+and accept all the terms of this license and intellectual property\r\n+(trademark/copyright) agreement. If you do not agree to abide by all\r\n+the terms of this agreement, you must cease using and return or destroy\r\n+all copies of Project Gutenberg-tm electronic works in your possession.\r\n+If you paid a fee for obtaining a copy of or access to a Project\r\n+Gutenberg-tm electronic work and you do not agree to be bound by the\r\n+terms of this agreement, you may obtain a refund from the person or\r\n+entity to whom you paid the fee as set forth in paragraph 1.E.8.\r\n+\r\n+1.B. \u0022Project Gutenberg\u0022 is a registered trademark. It may only be\r\n+used on or associated in any way with an electronic work by people who\r\n+agree to be bound by the terms of this agreement. There are a few\r\n+things that you can do with most Project Gutenberg-tm electronic works\r\n+even without complying with the full terms of this agreement. See\r\n+paragraph 1.C below. There are a lot of things you can do with Project\r\n+Gutenberg-tm electronic works if you follow the terms of this agreement\r\n+and help preserve free future access to Project Gutenberg-tm electronic\r\n+works. See paragraph 1.E below.\r\n+\r\n+1.C. The Project Gutenberg Literary Archive Foundation (\u0022the Foundation\u0022\r\n+or PGLAF), owns a compilation copyright in the collection of Project\r\n+Gutenberg-tm electronic works. Nearly all the individual works in the\r\n+collection are in the public domain in the United States. If an\r\n+individual work is in the public domain in the United States and you are\r\n+located in the United States, we do not claim a right to prevent you from\r\n+copying, distributing, performing, displaying or creating derivative\r\n+works based on the work as long as all references to Project Gutenberg\r\n+are removed. Of course, we hope that you will support the Project\r\n+Gutenberg-tm mission of promoting free access to electronic works by\r\n+freely sharing Project Gutenberg-tm works in compliance with the terms of\r\n+this agreement for keeping the Project Gutenberg-tm name associated with\r\n+the work. You can easily comply with the terms of this agreement by\r\n+keeping this work in the same format with its attached full Project\r\n+Gutenberg-tm License when you share it without charge with others.\r\n+\r\n+1.D. The copyright laws of the place where you are located also govern\r\n+what you can do with this work. Copyright laws in most countries are in\r\n+a constant state of change. If you are outside the United States, check\r\n+the laws of your country in addition to the terms of this agreement\r\n+before downloading, copying, displaying, performing, distributing or\r\n+creating derivative works based on this work or any other Project\r\n+Gutenberg-tm work. The Foundation makes no representations concerning\r\n+the copyright status of any work in any country outside the United\r\n+States.\r\n+\r\n+1.E. Unless you have removed all references to Project Gutenberg:\r\n+\r\n+1.E.1. The following sentence, with active links to, or other immediate\r\n+access to, the full Project Gutenberg-tm License must appear prominently\r\n+whenever any copy of a Project Gutenberg-tm work (any work on which the\r\n+phrase \u0022Project Gutenberg\u0022 appears, or with which the phrase \u0022Project\r\n+Gutenberg\u0022 is associated) is accessed, displayed, performed, viewed,\r\n+copied or distributed:\r\n+\r\n+This eBook is for the use of anyone anywhere at no cost and with\r\n+almost no restrictions whatsoever. You may copy it, give it away or\r\n+re-use it under the terms of the Project Gutenberg License included\r\n+with this eBook or online at www.gutenberg.net\r\n+\r\n+1.E.2. If an individual Project Gutenberg-tm electronic work is derived\r\n+from the public domain (does not contain a notice indicating that it is\r\n+posted with permission of the copyright holder), the work can be copied\r\n+and distributed to anyone in the United States without paying any fees\r\n+or charges. If you are redistributing or providing access to a work\r\n+with the phrase \u0022Project Gutenberg\u0022 associated with or appearing on the\r\n+work, you must comply either with the requirements of paragraphs 1.E.1\r\n+through 1.E.7 or obtain permission for the use of the work and the\r\n+Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or\r\n+1.E.9.\r\n+\r\n+1.E.3. If an individual Project Gutenberg-tm electronic work is posted\r\n+with the permission of the copyright holder, your use and distribution\r\n+must comply with both paragraphs 1.E.1 through 1.E.7 and any additional\r\n+terms imposed by the copyright holder. Additional terms will be linked\r\n+to the Project Gutenberg-tm License for all works posted with the\r\n+permission of the copyright holder found at the beginning of this work.\r\n+\r\n+1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm\r\n+License terms from this work, or any files containing a part of this\r\n+work or any other work associated with Project Gutenberg-tm.\r\n+\r\n+1.E.5. Do not copy, display, perform, distribute or redistribute this\r\n+electronic work, or any part of this electronic work, without\r\n+prominently displaying the sentence set forth in paragraph 1.E.1 with\r\n+active links or immediate access to the full terms of the Project\r\n+Gutenberg-tm License.\r\n+\r\n+1.E.6. You may convert to and distribute this work in any binary,\r\n+compressed, marked up, nonproprietary or proprietary form, including any\r\n+word processing or hypertext form. However, if you provide access to or\r\n+distribute copies of a Project Gutenberg-tm work in a format other than\r\n+\u0022Plain Vanilla ASCII\u0022 or other format used in the official version\r\n+posted on the official Project Gutenberg-tm web site (www.gutenberg.net),\r\n+you must, at no additional cost, fee or expense to the user, provide a\r\n+copy, a means of exporting a copy, or a means of obtaining a copy upon\r\n+request, of the work in its original \u0022Plain Vanilla ASCII\u0022 or other\r\n+form. Any alternate format must include the full Project Gutenberg-tm\r\n+License as specified in paragraph 1.E.1.\r\n+\r\n+1.E.7. Do not charge a fee for access to, viewing, displaying,\r\n+performing, copying or distributing any Project Gutenberg-tm works\r\n+unless you comply with paragraph 1.E.8 or 1.E.9.\r\n+\r\n+1.E.8. You may charge a reasonable fee for copies of or providing\r\n+access to or distributing Project Gutenberg-tm electronic works provided\r\n+that\r\n+\r\n+- You pay a royalty fee of 20% of the gross profits you derive from\r\n+ the use of Project Gutenberg-tm works calculated using the method\r\n+ you already use to calculate your applicable taxes. The fee is\r\n+ owed to the owner of the Project Gutenberg-tm trademark, but he\r\n+ has agreed to donate royalties under this paragraph to the\r\n+ Project Gutenberg Literary Archive Foundation. Royalty payments\r\n+ must be paid within 60 days following each date on which you\r\n+ prepare (or are legally required to prepare) your periodic tax\r\n+ returns. Royalty payments should be clearly marked as such and\r\n+ sent to the Project Gutenberg Literary Archive Foundation at the\r\n+ address specified in Section 4, \u0022Information about donations to\r\n+ the Project Gutenberg Literary Archive Foundation.\u0022\r\n+\r\n+- You provide a full refund of any money paid by a user who notifies\r\n+ you in writing (or by e-mail) within 30 days of receipt that s/he\r\n+ does not agree to the terms of the full Project Gutenberg-tm\r\n+ License. You must require such a user to return or\r\n+ destroy all copies of the works possessed in a physical medium\r\n+ and discontinue all use of and all access to other copies of\r\n+ Project Gutenberg-tm works.\r\n+\r\n+- You provide, in accordance with paragraph 1.F.3, a full refund of any\r\n+ money paid for a work or a replacement copy, if a defect in the\r\n+ electronic work is discovered and reported to you within 90 days\r\n+ of receipt of the work.\r\n+\r\n+- You comply with all other terms of this agreement for free\r\n+ distribution of Project Gutenberg-tm works.\r\n+\r\n+1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm\r\n+electronic work or group of works on different terms than are set\r\n+forth in this agreement, you must obtain permission in writing from\r\n+both the Project Gutenberg Literary Archive Foundation and Michael\r\n+Hart, the owner of the Project Gutenberg-tm trademark. Contact the\r\n+Foundation as set forth in Section 3 below.\r\n+\r\n+1.F.\r\n+\r\n+1.F.1. Project Gutenberg volunteers and employees expend considerable\r\n+effort to identify, do copyright research on, transcribe and proofread\r\n+public domain works in creating the Project Gutenberg-tm\r\n+collection. Despite these efforts, Project Gutenberg-tm electronic\r\n+works, and the medium on which they may be stored, may contain\r\n+\u0022Defects,\u0022 such as, but not limited to, incomplete, inaccurate or\r\n+corrupt data, transcription errors, a copyright or other intellectual\r\n+property infringement, a defective or damaged disk or other medium, a\r\n+computer virus, or computer codes that damage or cannot be read by\r\n+your equipment.\r\n+\r\n+1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the \u0022Right\r\n+of Replacement or Refund\u0022 described in paragraph 1.F.3, the Project\r\n+Gutenberg Literary Archive Foundation, the owner of the Project\r\n+Gutenberg-tm trademark, and any other party distributing a Project\r\n+Gutenberg-tm electronic work under this agreement, disclaim all\r\n+liability to you for damages, costs and expenses, including legal\r\n+fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT\r\n+LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE\r\n+PROVIDED IN PARAGRAPH F3. YOU AGREE THAT THE FOUNDATION, THE\r\n+TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE\r\n+LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR\r\n+INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH\r\n+DAMAGE.\r\n+\r\n+1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a\r\n+defect in this electronic work within 90 days of receiving it, you can\r\n+receive a refund of the money (if any) you paid for it by sending a\r\n+written explanation to the person you received the work from. If you\r\n+received the work on a physical medium, you must return the medium with\r\n+your written explanation. The person or entity that provided you with\r\n+the defective work may elect to provide a replacement copy in lieu of a\r\n+refund. If you received the work electronically, the person or entity\r\n+providing it to you may choose to give you a second opportunity to\r\n+receive the work electronically in lieu of a refund. If the second copy\r\n+is also defective, you may demand a refund in writing without further\r\n+opportunities to fix the problem.\r\n+\r\n+1.F.4. Except for the limited right of replacement or refund set forth\r\n+in paragraph 1.F.3, this work is provided to you 'AS-IS' WITH NO OTHER\r\n+WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\r\n+WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE.\r\n+\r\n+1.F.5. Some states do not allow disclaimers of certain implied\r\n+warranties or the exclusion or limitation of certain types of damages.\r\n+If any disclaimer or limitation set forth in this agreement violates the\r\n+law of the state applicable to this agreement, the agreement shall be\r\n+interpreted to make the maximum disclaimer or limitation permitted by\r\n+the applicable state law. The invalidity or unenforceability of any\r\n+provision of this agreement shall not void the remaining provisions.\r\n+\r\n+1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the\r\n+trademark owner, any agent or employee of the Foundation, anyone\r\n+providing copies of Project Gutenberg-tm electronic works in accordance\r\n+with this agreement, and any volunteers associated with the production,\r\n+promotion and distribution of Project Gutenberg-tm electronic works,\r\n+harmless from all liability, costs and expenses, including legal fees,\r\n+that arise directly or indirectly from any of the following which you do\r\n+or cause to occur: (a) distribution of this or any Project Gutenberg-tm\r\n+work, (b) alteration, modification, or additions or deletions to any\r\n+Project Gutenberg-tm work, and (c) any Defect you cause.\r\n+\r\n+\r\n+Section 2. Information about the Mission of Project Gutenberg-tm\r\n+\r\n+Project Gutenberg-tm is synonymous with the free distribution of\r\n+electronic works in formats readable by the widest variety of computers\r\n+including obsolete, old, middle-aged and new computers. It exists\r\n+because of the efforts of hundreds of volunteers and donations from\r\n+people in all walks of life.\r\n+\r\n+Volunteers and financial support to provide volunteers with the\r\n+assistance they need, is critical to reaching Project Gutenberg-tm's\r\n+goals and ensuring that the Project Gutenberg-tm collection will\r\n+remain freely available for generations to come. In 2001, the Project\r\n+Gutenberg Literary Archive Foundation was created to provide a secure\r\n+and permanent future for Project Gutenberg-tm and future generations.\r\n+To learn more about the Project Gutenberg Literary Archive Foundation\r\n+and how your efforts and donations can help, see Sections 3 and 4\r\n+and the Foundation web page at http://www.pglaf.org.\r\n+\r\n+\r\n+Section 3. Information about the Project Gutenberg Literary Archive\r\n+Foundation\r\n+\r\n+The Project Gutenberg Literary Archive Foundation is a non profit\r\n+501(c)(3) educational corporation organized under the laws of the\r\n+state of Mississippi and granted tax exempt status by the Internal\r\n+Revenue Service. The Foundation's EIN or federal tax identification\r\n+number is 64-6221541. Its 501(c)(3) letter is posted at\r\n+http://pglaf.org/fundraising. Contributions to the Project Gutenberg\r\n+Literary Archive Foundation are tax deductible to the full extent\r\n+permitted by U.S. federal laws and your state's laws.\r\n+\r\n+The Foundation's principal office is located at 4557 Melan Dr. S.\r\n+Fairbanks, AK, 99712., but its volunteers and employees are scattered\r\n+throughout numerous locations. Its business office is located at\r\n+809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email\r\n+business@pglaf.org. Email contact links and up to date contact\r\n+information can be found at the Foundation's web site and official\r\n+page at http://pglaf.org\r\n+\r\n+For additional contact information:\r\n+ Dr. Gregory B. Newby\r\n+ Chief Executive and Director\r\n+ gbnewby@pglaf.org\r\n+\r\n+\r\n+Section 4. Information about Donations to the Project Gutenberg\r\n+Literary Archive Foundation\r\n+\r\n+Project Gutenberg-tm depends upon and cannot survive without wide\r\n+spread public support and donations to carry out its mission of\r\n+increasing the number of public domain and licensed works that can be\r\n+freely distributed in machine readable form accessible by the widest\r\n+array of equipment including outdated equipment. Many small donations\r\n+($1 to $5,000) are particularly important to maintaining tax exempt\r\n+status with the IRS.\r\n+\r\n+The Foundation is committed to complying with the laws regulating\r\n+charities and charitable donations in all 50 states of the United\r\n+States. Compliance requirements are not uniform and it takes a\r\n+considerable effort, much paperwork and many fees to meet and keep up\r\n+with these requirements. We do not solicit donations in locations\r\n+where we have not received written confirmation of compliance. To\r\n+SEND DONATIONS or determine the status of compliance for any\r\n+particular state visit http://pglaf.org\r\n+\r\n+While we cannot and do not solicit contributions from states where we\r\n+have not met the solicitation requirements, we know of no prohibition\r\n+against accepting unsolicited donations from donors in such states who\r\n+approach us with offers to donate.\r\n+\r\n+International donations are gratefully accepted, but we cannot make\r\n+any statements concerning tax treatment of donations received from\r\n+outside the United States. U.S. laws alone swamp our small staff.\r\n+\r\n+Please check the Project Gutenberg Web pages for current donation\r\n+methods and addresses. Donations are accepted in a number of other\r\n+ways including including checks, online payments and credit card\r\n+donations. To donate, please visit: http://pglaf.org/donate\r\n+\r\n+\r\n+Section 5. General Information About Project Gutenberg-tm electronic\r\n+works.\r\n+\r\n+Professor Michael S. Hart is the originator of the Project Gutenberg-tm\r\n+concept of a library of electronic works that could be freely shared\r\n+with anyone. For thirty years, he produced and distributed Project\r\n+Gutenberg-tm eBooks with only a loose network of volunteer support.\r\n+\r\n+\r\n+Project Gutenberg-tm eBooks are often created from several printed\r\n+editions, all of which are confirmed as Public Domain in the U.S.\r\n+unless a copyright notice is included. Thus, we do not necessarily\r\n+keep eBooks in compliance with any particular paper edition.\r\n+\r\n+\r\n+Most people start at our Web site which has the main PG search facility:\r\n+\r\n+ http://www.gutenberg.net\r\n+\r\n+This Web site includes information about Project Gutenberg-tm,\r\n+including how to make donations to the Project Gutenberg Literary\r\n+Archive Foundation, how to help produce our new eBooks, and how to\r\n+subscribe to our email newsletter to hear about new eBooks.\r\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/CMakeLists.txt\nnew file mode 100644\nindex 0000000..2cabcc3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-h2-long-poll C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-h2-long-poll)\n+set(SRCS minimal-http-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_HTTP2 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/README.md\nnew file mode 100644\nindex 0000000..c327e8f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/README.md\n@@ -0,0 +1,25 @@\n+# lws minimal http server\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+-s|Serve using TLS selfsigned cert (ie, connect to it with https://...)\n+-v|Connection validity use 3s / 10s instead of default 5m / 5m10s\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server\n+[2018/03/04 09:30:02:7986] USER: LWS minimal http server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/minimal-http-server.c\nnew file mode 100644\nindex 0000000..c5614e5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/minimal-http-server.c\n@@ -0,0 +1,158 @@\n+/*\n+ * lws-minimal-http-server-h2-long-poll\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates an h2 server that supports \u0022long poll\u0022\n+ * immortal client connections. For simplicity it doesn't serve\n+ * any regular files, you can add a mount to do it if you want.\n+ *\n+ * The protocol keeps the long poll h2 stream open, and sends\n+ * the time on the stream once per minute. Normally idle h2\n+ * connections are closed by default within 30s, so this demonstrates\n+ * the stream and network connection are operating as \u0022immortal\u0022\n+ * on both sides.\n+ *\n+ * See http-client/minimal-http-client-h2-long-poll for the\n+ * client example that connects and transitions the stream to the\n+ * immortal long poll mode.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+\n+struct pss {\n+\tstruct lws *wsi;\n+\tlws_sorted_usec_list_t sul;\n+\tchar pending;\n+};\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping \u003d 5,\n+\t.secs_since_valid_hangup \u003d 10,\n+};\n+\n+static void\n+sul_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tstruct pss *pss \u003d (struct pss *)lws_container_of(sul, struct pss, sul);\n+\n+\tpss-\u003epending \u003d 1;\n+\tlws_callback_on_writable(pss-\u003ewsi);\n+\t/* interval 1min... longer than any normal timeout */\n+\tlws_sul_schedule(lws_get_context(pss-\u003ewsi), 0, \u0026pss-\u003esul, sul_cb,\n+\t\t\t\t60 * LWS_US_PER_SEC);\n+}\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tstruct pss * pss \u003d (struct pss *)user;\n+\tuint8_t buf[LWS_PRE + LWS_RECOMMENDED_MIN_HEADER_SPACE],\n+\t\t*start \u003d \u0026buf[LWS_PRE], *p \u003d start,\n+\t\t*end \u003d p + sizeof(buf) - LWS_PRE;\n+\tint m, n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_HTTP:\n+\t\tlwsl_user(\u0022%s: connect\u005cn\u0022, __func__);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\n+\t\tif (lws_add_http_common_headers(wsi, HTTP_STATUS_OK,\n+\t\t\t\t\u0022text/html\u0022,\n+\t\t\t\tLWS_ILLEGAL_HTTP_CONTENT_LEN, /* no content len */\n+\t\t\t\t\u0026p, end))\n+\t\t\treturn 1;\n+\t\tif (lws_finalize_write_http_header(wsi, start, \u0026p, end))\n+\t\t\treturn 1;\n+\n+\t\tsul_cb(\u0026pss-\u003esul);\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_CLOSED_HTTP:\n+\t\tif (!pss)\n+\t\t\tbreak;\n+\t\tlws_sul_cancel(\u0026pss-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_HTTP_WRITEABLE:\n+\t\tif (!pss-\u003epending)\n+\t\t\tbreak;\n+\t\tn \u003d lws_snprintf((char *)p, sizeof(buf) - LWS_PRE, \u0022%llu\u0022,\n+\t\t\t\t (unsigned long long)lws_now_usecs());\n+\t\tm \u003d lws_write(wsi, p, (unsigned int)n, LWS_WRITE_HTTP);\n+\t\tif (m \u003c n) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to socket\u005cn\u0022, n);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, callback_http, sizeof(struct pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server h2 long poll\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+#if defined(LWS_WITH_TLS)\n+\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+#endif\n+\tinfo.protocols \u003d protocols;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\tLWS_SERVER_OPTION_VH_H2_HALF_CLOSED_LONG_POLL |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\t/* the default validity check is 5m / 5m10s... -v \u003d 5s / 10s */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-v\u0022))\n+\t\tinfo.retry_and_idle_policy \u003d \u0026retry;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/CMakeLists.txt\nnew file mode 100644\nindex 0000000..c0e9328\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-mimetypes C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-mimetypes)\n+set(SRCS minimal-http-server-mimetypes.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/README.md\nnew file mode 100644\nindex 0000000..3240d30\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/README.md\n@@ -0,0 +1,21 @@\n+# lws minimal http server mimetypes\n+\n+This is the same as the basic minimal http server, but it demonstrates how to\n+add support for extra mimetypes to a mount.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server\n+[2018/03/04 09:30:02:7986] USER: LWS minimal http server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681 and click on the link to download the test.tar.bz2 file.\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/minimal-http-server-mimetypes.c b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/minimal-http-server-mimetypes.c\nnew file mode 100644\nindex 0000000..6603821\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/minimal-http-server-mimetypes.c\n@@ -0,0 +1,94 @@\n+/*\n+ * lws-minimal-http-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+\n+static const struct lws_protocol_vhost_options pvo_mime \u003d {\n+\tNULL,\t\t\t\t/* \u0022next\u0022 pvo linked-list */\n+\tNULL,\t\t\t\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022.bz2\u0022,\t\t\t\t/* file suffix to match */\n+\t\u0022application/x-bzip2\u0022\t\t/* mimetype to use */\n+};\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\t\u0026pvo_mime,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/index.html\nnew file mode 100644\nindex 0000000..5c60e88\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/index.html\n@@ -0,0 +1,24 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server + mimetypes example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tThis shows how to teach a mount new bindings between file\u003cbr\u003e\n+\t\tsuffix and mimetype used to serve it.\u003cp\u003e\n+\n+\t\tLws has a bunch of built-in ones, but you can add as many\u003cbr\u003e\n+\t\tas you like when defining the mount.\u003cp\u003e\n+\n+\t\tFor example, lws doesn't know the suffix \u003cb\u003e[.tar].bz2\u003c/b\u003e\u003cbr\u003e\n+\t\timplies the mimetype \u003ci\u003eapplication/x-bzip2\u003c/i\u003e, but we taught\u003cbr\u003e\n+\t\tthis mount about that relationship in the example code, so it\u003cbr\u003e\n+\t\tknows how to serve \u003ca href\u003d\u0022test.tar.bz2\u0022\u003ethis example test.tar.bz2\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/test.tar.bz2 b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/test.tar.bz2\nnew file mode 100644\nindex 0000000..730b7ee\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/test.tar.bz2 differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/CMakeLists.txt\nnew file mode 100644\nindex 0000000..c4c5c45\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-multivhost C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-multivhost)\n+set(SRCS minimal-http-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/README.md\nnew file mode 100644\nindex 0000000..26c99a1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/README.md\n@@ -0,0 +1,48 @@\n+# lws minimal http server multivhost\n+\n+This creates a single server that creates three vhosts listening on both :7681 and\n+:7682. Two separate vhosts share listening on :7682.\n+\n+|vhost|listens on port|serves|\n+---|---|---\n+localhost1|7681|./mount-origin-localhost1\n+localhost2|7682|./mount-origin-localhost2\n+localhost3|7682|./mount-origin-localhost3\n+\n+Notice the last two both listen on 7682. If you visit http://localhost:7682,\n+by default you will get mapped to the first one, localhost2.\n+\n+However if you edit /etc/hosts on your machine and add\n+\n+```\n+127.0.0.1 localhost3\n+```\n+\n+so that you can visit http://localhost3:7682 in your browser, lws will use the\n+`Host: localhost3` header sent by your browser to select the localhost3 vhost\n+for the connection, and you will be served content from ./mount-origin-localhost3\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+--die-after-vhost | For testing failure handling\n+\n+```\n+ $ ./lws-minimal-http-server-multivhost\n+[2018/03/16 09:37:20:0866] USER: LWS minimal http server-multivhost | visit http://localhost:7681 / 7682\n+[2018/03/16 09:37:20:0867] NOTICE: Creating Vhost 'localhost1' port 7681, 1 protocols, IPv6 off\n+[2018/03/16 09:37:20:0868] NOTICE: Creating Vhost 'localhost2' port 7682, 1 protocols, IPv6 off\n+[2018/03/16 09:37:20:0869] NOTICE: Creating Vhost 'localhost3' port 7682, 1 protocols, IPv6 off\n+[2018/03/16 09:37:20:0869] NOTICE: using listen skt from vhost localhost2\n+```\n+\n+Visit http://localhost:7681 and http://localhost:7682\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/minimal-http-server.c\nnew file mode 100644\nindex 0000000..0e90016\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/minimal-http-server.c\n@@ -0,0 +1,187 @@\n+/*\n+ * lws-minimal-http-server-multivhost\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount_localhost1 \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin-localhost1\u0022,\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+}, mount_localhost2 \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin-localhost2\u0022,\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+}, mount_localhost3 \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin-localhost3\u0022,\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+void vh_destruction_notification(struct lws_vhost *vh, void *arg)\n+{\n+\tlwsl_user(\u0022%s: called, arg: %p\u005cn\u0022, __func__, arg);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *new_vhost;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server-multivhost | visit http://localhost:7681 / 7682\u005cn\u0022);\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\t/*\n+\t * Because of LWS_SERVER_OPTION_EXPLICIT_VHOSTS, this only creates\n+\t * the context and no longer creates a default vhost\n+\t */\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* it's our job now to create the vhosts we want:\n+\t *\n+\t * - \u0022localhost1\u0022 listen on 7681 and serve ./mount-origin-localhost1/\n+\t * - \u0022localhost2\u0022 listen on 7682 and serve ./mount-origin-localhost2/\n+\t * - \u0022localhost3\u0022 share 7682 and serve ./mount-origin-localhost3/\n+\t *\n+\t * Note lws supports dynamic vhost creation and destruction at runtime.\n+\t * When using multi-vhost with your own protocols, you must provide a\n+\t * pvo for each vhost naming each protocol you want enabled on it.\n+\t * minimal-ws-server-threads demonstrates how to provide pvos.\n+\t */\n+\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount_localhost1;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.vhost_name \u003d \u0022localhost1\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create first vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tinfo.port \u003d 7682;\n+\tinfo.mounts \u003d \u0026mount_localhost2;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.vhost_name \u003d \u0022localhost2\u0022;\n+\n+\tif (!lws_cmdline_option(argc, argv, \u0022--kill-7682\u0022)) {\n+\n+\t\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\t\tlwsl_err(\u0022Failed to create second vhost\u005cn\u0022);\n+\t\t\tgoto bail;\n+\t\t}\n+\t}\n+\n+\t/* a second vhost listens on port 7682 */\n+\tinfo.mounts \u003d \u0026mount_localhost3;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.vhost_name \u003d \u0022localhost3\u0022;\n+\tinfo.finalize \u003d vh_destruction_notification;\n+\tinfo.finalize_arg \u003d NULL;\n+\n+\tnew_vhost \u003d lws_create_vhost(context, \u0026info);\n+\tif (!new_vhost) {\n+\t\tlwsl_err(\u0022Failed to create third vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--kill-7682\u0022))\n+\t\tlws_vhost_destroy(new_vhost);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--die-after-vhost\u0022)) {\n+\t\tlwsl_warn(\u0022bailing after creating vhosts\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/404.html\nnew file mode 100644\nindex 0000000..8f66287\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404 (vhost localhost1)\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/index.html\nnew file mode 100644\nindex 0000000..042a0b9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/index.html\n@@ -0,0 +1,18 @@\n+ \u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\n+\t\tHello from the \u003cb\u003eminimal http server multivhost example\u003c/b\u003e.\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\tThis was served from \u003ci\u003e./mount-origin-\u003cb\u003elocalhost1\u003c/b\u003e/index.html\u003c/i\u003e\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/404.html\nnew file mode 100644\nindex 0000000..3f1a438\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404 (vhost localhost2)\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/index.html\nnew file mode 100644\nindex 0000000..2a12308\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/index.html\n@@ -0,0 +1,17 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server multivhost example\u003c/b\u003e.\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\tThis was served from \u003ci\u003e./mount-origin-\u003cb\u003elocalhost2\u003c/b\u003e/index.html\u003c/i\u003e\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/404.html\nnew file mode 100644\nindex 0000000..c891f79\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404 (vhost localhost3)\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/index.html\nnew file mode 100644\nindex 0000000..a38b75c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/index.html\n@@ -0,0 +1,17 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server multivhost example\u003c/b\u003e.\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\tThis was served from \u003ci\u003e./mount-origin-\u003cb\u003elocalhost3\u003c/b\u003e/index.html\u003c/i\u003e\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/CMakeLists.txt\nnew file mode 100644\nindex 0000000..59c53a3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-http-server-proxy C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-proxy)\n+set(SRCS minimal-http-server-proxy.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_HTTP_PROXY 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/minimal-http-server-proxy.c b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/minimal-http-server-proxy.c\nnew file mode 100644\nindex 0000000..af9b1a2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/minimal-http-server-proxy.c\n@@ -0,0 +1,84 @@\n+/*\n+ * lws-minimal-http-server-proxy\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal tls reverse proxy\n+ */\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022warmcat.com/\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_HTTPS,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server proxy | visit https://localhost:7681\u005cn\u0022);\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/http2.png\nnew file mode 100644\nindex 0000000..439bfa4\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/http2.png differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/index.html\nnew file mode 100644\nindex 0000000..35c26ca\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/index.html\n@@ -0,0 +1,17 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\n+\t\tHello from the \u003cb\u003eminimal https server example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\t\u003cbr\u003e\n+\t\t\u003cdiv id\u003d\u0022transport\u0022\u003e\u003c/div\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..3f6a91d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-http-server-smp C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-smp)\n+set(SRCS minimal-http-server-smp.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/README.md\nnew file mode 100644\nindex 0000000..33471a7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/README.md\n@@ -0,0 +1,34 @@\n+# lws minimal http server with multithreaded service\n+\n+Lws supports multithreaded service... build lws with `-DLWS_MAP_SMP\u003d\u003cmax number of threads\u003e`, the\n+default is 1. If nonzero, some extra pthreads locking is built into lws and it supports multiple\n+independent service threads.\n+\n+\n+\n+When an incoming connection is accepted, it is bound to the pt with the lowest current wsi\n+count, to keep the load on the threads balanced. Only the pt the wsi is bound to can service\n+the thread, so although there can be as many wsi being serviced simultaneously as there are\n+service threads, a wsi can only be service by the pt it is bound to.\n+\n+The effectiveness of the scalability depends on the load. Here is an example of roughly what can be expected\n+\n+\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-smp\n+[2018/03/07 17:44:20:2409] USER: LWS minimal http server SMP | visit http://localhost:7681\n+[2018/03/07 17:44:20:2410] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+[2018/03/07 17:44:20:2411] NOTICE: Service threads: 10\n+```\n+\n+Visit http://localhost:7681 and use ab or other testing tools\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/minimal-http-server-smp.c b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/minimal-http-server-smp.c\nnew file mode 100644\nindex 0000000..b542c64\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/minimal-http-server-smp.c\n@@ -0,0 +1,140 @@\n+/*\n+ * lws-minimal-http-server-smp\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal multithreaded http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ *\n+ * Also for simplicity the number of threads is set in the code... note that\n+ * the real number of threads possible is decided by the LWS_MAX_SMP that lws\n+ * was configured with, by default that is 1. Lws will limit the number of\n+ * requested threads to the number possible.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+#define COUNT_THREADS 8\n+\n+static struct lws_context *context;\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void *thread_service(void *threadid)\n+{\n+\twhile (lws_service_tsi(context, 10000,\n+\t\t\t (int)(lws_intptr_t)threadid) \u003e\u003d 0 \u0026\u0026\n+\t !interrupted)\n+\t\t;\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+\tlws_cancel_service(context);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tpthread_t pthread_service[COUNT_THREADS];\n+\tstruct lws_context_creation_info info;\n+\tvoid *retval;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server SMP | visit http://127.0.0.1:7681\u005cn\u0022);\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-t\u0022))) {\n+\t\tinfo.count_threads \u003d (unsigned int)atoi(p);\n+\t\tif (info.count_threads \u003c 1 || info.count_threads \u003e LWS_MAX_SMP)\n+\t\t\treturn 1;\n+\t} else\n+\t\tinfo.count_threads \u003d COUNT_THREADS;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tlwsl_notice(\u0022 Service threads: %d\u005cn\u0022, lws_get_count_threads(context));\n+\n+\t/* start all the service threads */\n+\n+\tfor (n \u003d 0; n \u003c lws_get_count_threads(context); n++)\n+\t\tif (pthread_create(\u0026pthread_service[n], NULL, thread_service,\n+\t\t\t\t (void *)(lws_intptr_t)n))\n+\t\t\tlwsl_err(\u0022Failed to start service thread\u005cn\u0022);\n+\n+\t/* wait for all the service threads to exit */\n+\n+\twhile ((--n) \u003e\u003d 0)\n+\t\tpthread_join(pthread_service[n], \u0026retval);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/index.html\nnew file mode 100644\nindex 0000000..e677926\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/index.html\n@@ -0,0 +1,12 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server SMP example\u003c/b\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/CMakeLists.txt\nnew file mode 100644\nindex 0000000..e5e2e7b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server-sse-ring C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+\n+set(SAMP lws-minimal-http-server-sse-ring)\n+set(SRCS minimal-http-server-sse-ring.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/README.md\nnew file mode 100644\nindex 0000000..08c21bb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/README.md\n@@ -0,0 +1,27 @@\n+# lws minimal http Server Side Events + ringbuffer\n+\n+This demonstates serving both normal content and\n+content over Server Side Events, where all clients\n+see the same data via a ringbuffer.\n+\n+Two separate threads generate content into the\n+ringbuffer at random intervals.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-sse\n+[2018/04/20 06:09:56:9974] USER: LWS minimal http Server-Side Events + ring | visit http://localhost:7681\n+[2018/04/20 06:09:57:0148] NOTICE: Creating Vhost 'default' port 7681, 2 protocols, IPv6 off\n+```\n+\n+Visit http://localhost:7681, which connects back to the server using SSE\n+and displays the incoming data. Connecting from multiple browsers shows\n+the same content from the server ringbuffer.\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/minimal-http-server-sse-ring.c b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/minimal-http-server-sse-ring.c\nnew file mode 100644\nindex 0000000..faef2f6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/minimal-http-server-sse-ring.c\n@@ -0,0 +1,403 @@\n+/*\n+ * lws-minimal-http-server-sse\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server that can serve both normal static\n+ * content and server-side event connections.\n+ *\n+ * To keep it simple, it serves the static stuff from the subdirectory\n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ *\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdlib.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+#include \u003ctime.h\u003e\n+\n+/* one of these created for each message in the ringbuffer */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/*\n+ * Unlike ws, http is a stateless protocol. This pss only exists for the\n+ * duration of a single http transaction. With http/1.1 keep-alive and http/2,\n+ * that is unrelated to (shorter than) the lifetime of the network connection.\n+ */\n+struct pss {\n+\tstruct pss *pss_list;\n+\tstruct lws *wsi;\n+\tuint32_t tail;\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct vhd {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tstruct pss *pss_list; /* linked-list of live pss*/\n+\tpthread_t pthread_spam[2];\n+\n+\tpthread_mutex_t lock_ring; /* serialize access to the ring buffer */\n+\tstruct lws_ring *ring; /* ringbuffer holding unsent messages */\n+\tchar finished;\n+};\n+\n+static int interrupted;\n+\n+#if defined(WIN32)\n+static void usleep(unsigned long l) { Sleep(l / 1000); }\n+#endif\n+\n+\n+/* destroys the message when everyone has had a copy of it */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+/*\n+ * This runs under the \u0022spam thread\u0022 thread context only.\n+ *\n+ * We spawn two threads that generate messages with this.\n+ *\n+ */\n+\n+static void *\n+thread_spam(void *d)\n+{\n+\tstruct vhd *vhd \u003d (struct vhd *)d;\n+\tstruct msg amsg;\n+\tint len \u003d 128, index \u003d 1, n, whoami \u003d 0;\n+\n+\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\tif (pthread_equal(pthread_self(), vhd-\u003epthread_spam[n]))\n+\t\t\twhoami \u003d n + 1;\n+\n+\tdo {\n+\t\t/* don't generate output if nobody connected */\n+\t\tif (!vhd-\u003epss_list)\n+\t\t\tgoto wait;\n+\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\t/* only create if space in ringbuffer */\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(vhd-\u003ering);\n+\t\tif (!n) {\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\n+\t\tamsg.payload \u003d malloc((unsigned int)len);\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\t\tn \u003d lws_snprintf((char *)amsg.payload, (unsigned int)len,\n+\t\t\t \u0022%s: tid: %d, msg: %d\u0022, __func__, whoami, index++);\n+\t\tamsg.len \u003d (unsigned int)n;\n+\t\tn \u003d (int)lws_ring_insert(vhd-\u003ering, \u0026amsg, 1);\n+\t\tif (n !\u003d 1) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t} else\n+\t\t\t/*\n+\t\t\t * This will cause a LWS_CALLBACK_EVENT_WAIT_CANCELLED\n+\t\t\t * in the lws service thread context.\n+\t\t\t */\n+\t\t\tlws_cancel_service(vhd-\u003econtext);\n+\n+wait_unlock:\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\n+wait:\n+\t\t/* rand() would make more sense but coverity shrieks */\n+\t\tusleep((useconds_t)(100000 + (time(NULL) \u0026 0xffff)));\n+\n+\t} while (!vhd-\u003efinished);\n+\n+\tlwsl_notice(\u0022thread_spam %d exiting\u005cn\u0022, whoami);\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+\n+static int\n+callback_sse(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tstruct vhd *vhd \u003d (struct vhd *)lws_protocol_vh_priv_get(\n+\t\t\tlws_get_vhost(wsi), lws_get_protocol(wsi));\n+\tuint8_t buf[LWS_PRE + LWS_RECOMMENDED_MIN_HEADER_SPACE],\n+\t\t*start \u003d \u0026buf[LWS_PRE], *p \u003d start,\n+\t\t*end \u003d \u0026buf[sizeof(buf) - 1];\n+\tconst struct msg *pmsg;\n+\tvoid *retval;\n+\tint n;\n+\n+\tswitch (reason) {\n+\n+\t/* --- vhost protocol lifecycle --- */\n+\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi), sizeof(struct vhd));\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!vhd-\u003ering)\n+\t\t\treturn 1;\n+\n+\t\tpthread_mutex_init(\u0026vhd-\u003elock_ring, NULL);\n+\n+\t\t/* start the content-creating threads */\n+\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tif (pthread_create(\u0026vhd-\u003epthread_spam[n], NULL,\n+\t\t\t\t\t thread_spam, vhd)) {\n+\t\t\t\tlwsl_err(\u0022thread creation failed\u005cn\u0022);\n+\t\t\t\tgoto init_fail;\n+\t\t\t}\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tinit_fail:\n+\t\tvhd-\u003efinished \u003d 1;\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tpthread_join(vhd-\u003epthread_spam[n], \u0026retval);\n+\n+\t\tif (vhd-\u003ering)\n+\t\t\tlws_ring_destroy(vhd-\u003ering);\n+\n+\t\tpthread_mutex_destroy(\u0026vhd-\u003elock_ring);\n+\t\treturn 0;\n+\n+\t/* --- http connection lifecycle --- */\n+\n+\tcase LWS_CALLBACK_HTTP:\n+\t\t/*\n+\t\t * `in` contains the url part after our mountpoint /sse, if any\n+\t\t * you can use this to determine what data to return and store\n+\t\t * that in the pss\n+\t\t */\n+\t\tlwsl_info(\u0022%s: LWS_CALLBACK_HTTP: '%s'\u005cn\u0022, __func__,\n+\t\t\t (const char *)in);\n+\n+\t\t/* SSE requires a http OK response with this content-type */\n+\n+\t\tif (lws_add_http_common_headers(wsi, HTTP_STATUS_OK,\n+\t\t\t\t\t\t\u0022text/event-stream\u0022,\n+\t\t\t\t\t\tLWS_ILLEGAL_HTTP_CONTENT_LEN,\n+\t\t\t\t\t\t\u0026p, end))\n+\t\t\treturn 1;\n+\n+\t\tif (lws_finalize_write_http_header(wsi, start, \u0026p, end))\n+\t\t\treturn 1;\n+\n+\t\t/* add ourselves to the list of live pss held in the vhd */\n+\n+\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+\t\tpss-\u003etail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\n+\t\t/*\n+\t\t * This tells lws we are no longer a normal http stream,\n+\t\t * but are an \u0022immortal\u0022 (plus or minus whatever timeout you\n+\t\t * set on it afterwards) SSE stream. In http/2 case that also\n+\t\t * stops idle timeouts being applied to the network connection\n+\t\t * while this wsi is still open.\n+\t\t */\n+\t\tlws_http_mark_sse(wsi);\n+\n+\t\t/* write the body separately */\n+\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_CLOSED_HTTP:\n+\t\t/* remove our closing pss from the list of live pss */\n+\n+\t\tlws_ll_fwd_remove(struct pss, pss_list, pss, vhd-\u003epss_list);\n+\t\treturn 0;\n+\n+\t/* --- data transfer --- */\n+\n+\tcase LWS_CALLBACK_HTTP_WRITEABLE:\n+\n+\t\tlwsl_info(\u0022%s: LWS_CALLBACK_HTTP_WRITEABLE\u005cn\u0022, __func__);\n+\n+\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg)\n+\t\t\tbreak;\n+\n+\t\tp +\u003d lws_snprintf((char *)p, lws_ptr_diff_size_t(end, p),\n+\t\t\t\t \u0022data: %s\u005cx0d\u005cx0a\u005cx0d\u005cx0a\u0022,\n+\t\t\t\t (const char *)pmsg-\u003epayload);\n+\n+\t\tif (lws_write(wsi, (uint8_t *)start, lws_ptr_diff_size_t(p, start),\n+\t\t\t LWS_WRITE_HTTP) !\u003d lws_ptr_diff(p, start))\n+\t\t\treturn 1;\n+\n+\t\tlws_ring_consume_and_update_oldest_tail(\n+\t\t\tvhd-\u003ering,\t/* lws_ring object */\n+\t\t\tstruct pss,\t/* type of objects with tails */\n+\t\t\t\u0026pss-\u003etail,\t/* tail of guy doing the consuming */\n+\t\t\t1,\t/* number of payload objects being consumed */\n+\t\t\tvhd-\u003epss_list,\t/* head of list of objects with tails */\n+\t\t\ttail,\t/* member name of tail in objects with tails */\n+\t\t\tpss_list /* member name of next object in objects with tails */\n+\t\t);\n+\n+\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(pss-\u003ewsi);\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_EVENT_WAIT_CANCELLED:\n+\t\tif (!vhd)\n+\t\t\tbreak;\n+\t\t/*\n+\t\t * let everybody know we want to write something on them\n+\t\t * as soon as they are ready\n+\t\t */\n+\t\tlws_start_foreach_llp(struct pss **, ppss, vhd-\u003epss_list) {\n+\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\treturn 0;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\t{ \u0022sse\u0022, callback_sse, sizeof(struct pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+/* override the default mount for /sse in the URL space */\n+\n+static const struct lws_http_mount mount_sse \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/sse\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\tNULL,\t\t/* protocol */\n+\t/* .def */\t\t\tNULL,\n+\t/* .protocol */\t\t\t\u0022sse\u0022,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_CALLBACK, /* dynamic */\n+\t/* .mountpoint_len */\t\t4,\t\t /* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\t\u0026mount_sse,\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http Server-Side Events + ring | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/example.js\nnew file mode 100644\nindex 0000000..ed9bba1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/example.js\n@@ -0,0 +1,38 @@\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar head \u003d 0, tail \u003d 0, ring \u003d new Array(), es;\n+\n+\tes \u003d new EventSource(\u0022/sse/sourcename\u0022);\n+\ttry {\n+\t\tes.onopen \u003d function() {\n+\t\t\t// console.log(\u0022EventSource opened\u0022);\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t};\n+\n+\t\tes.onmessage \u003d function got_packet(msg) {\n+\t\t\tvar n, s \u003d \u0022\u0022;\n+\n+\t\t\t// console.log(msg.data);\n+\t\t\tring[head] \u003d msg.data + \u0022\u005cn\u0022;\n+\t\t\thead \u003d (head + 1) % 50;\n+\t\t\tif (tail \u003d\u003d\u003d head)\n+\t\t\t\ttail \u003d (tail + 1) % 50;\n+\t\n+\t\t\tn \u003d tail;\n+\t\t\tdo {\n+\t\t\t\ts \u003d s + ring[n];\n+\t\t\t\tn \u003d (n + 1) % 50;\n+\t\t\t} while (n !\u003d\u003d head);\n+\t\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d s; \n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\n+\t\t/* there is no onclose() for EventSource */\n+\t\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\n+}, false);\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/index.html\nnew file mode 100644\nindex 0000000..576c9eb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/index.html\n@@ -0,0 +1,23 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http Server Side Events + Ring example\u003c/b\u003e.\n+\t\t\u003cp\u003e\n+\t\tThis is a static page served from ./mount-origin/index.html.\n+\t\t\u003cp\u003e\n+\t\tIt connects back to the server at \u003ci\u003e/sse/sourcename\u003c/i\u003e using EventSource()\u003cbr\u003e\n+\t\tand displays the perioding incoming event data below.\n+\t\t\u003cp\u003e\n+\t\tThe data is being produced by two asynchronous threads at the server,\n+\t\twhich each sleep for a random period inbetween samples.\n+\t\t\u003cp\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d60 rows\u003d20\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/CMakeLists.txt\nnew file mode 100644\nindex 0000000..116052d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-sse C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-sse)\n+set(SRCS minimal-http-server-sse.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/README.md\nnew file mode 100644\nindex 0000000..cc8f478\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/README.md\n@@ -0,0 +1,25 @@\n+# lws minimal http Server Side Events\n+\n+This demonstates serving both normal content and\n+content over Server Side Events.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+You can give -s to listen using https on port :443\n+\n+```\n+ $ ./lws-minimal-http-server-sse\n+[2018/04/20 06:09:56:9974] USER: LWS minimal http Server-Side Events | visit http://localhost:7681\n+[2018/04/20 06:09:57:0148] NOTICE: Creating Vhost 'default' port 7681, 2 protocols, IPv6 off\n+```\n+\n+Visit http://localhost:7681, which connects back to the server using SSE\n+and displays the incoming data. Connecting from multiple browsers shows\n+content individual to the connection.\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/minimal-http-server-sse.c b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/minimal-http-server-sse.c\nnew file mode 100644\nindex 0000000..a87a7c2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/minimal-http-server-sse.c\n@@ -0,0 +1,233 @@\n+/*\n+ * lws-minimal-http-server-sse\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http server that can serve both normal static\n+ * content and server-side event connections.\n+ *\n+ * To keep it simple, it serves the static stuff from the subdirectory\n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ *\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003ctime.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+/*\n+ * Unlike ws, http is a stateless protocol. This pss only exists for the\n+ * duration of a single http transaction. With http/1.1 keep-alive and http/2,\n+ * that is unrelated to (shorter than) the lifetime of the network connection.\n+ */\n+struct pss {\n+\ttime_t established;\n+};\n+\n+static int interrupted;\n+\n+#define SECS_REPORT 3\n+\n+static int\n+callback_sse(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tuint8_t buf[LWS_PRE + LWS_RECOMMENDED_MIN_HEADER_SPACE], *start \u003d \u0026buf[LWS_PRE],\n+\t\t*p \u003d start, *end \u003d \u0026buf[sizeof(buf) - 1];\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_HTTP:\n+\t\t/*\n+\t\t * `in` contains the url part after our mountpoint /sse, if any\n+\t\t * you can use this to determine what data to return and store\n+\t\t * that in the pss\n+\t\t */\n+\t\tlwsl_notice(\u0022%s: LWS_CALLBACK_HTTP: '%s'\u005cn\u0022, __func__,\n+\t\t\t (const char *)in);\n+\n+\t\tpss-\u003eestablished \u003d time(NULL);\n+\n+\t\t/* SSE requires a response with this content-type */\n+\n+\t\tif (lws_add_http_common_headers(wsi, HTTP_STATUS_OK,\n+\t\t\t\t\t\t\u0022text/event-stream\u0022,\n+\t\t\t\t\t\tLWS_ILLEGAL_HTTP_CONTENT_LEN,\n+\t\t\t\t\t\t\u0026p, end))\n+\t\t\treturn 1;\n+\n+\t\tif (lws_finalize_write_http_header(wsi, start, \u0026p, end))\n+\t\t\treturn 1;\n+\n+\t\t/*\n+\t\t * This tells lws we are no longer a normal http stream,\n+\t\t * but are an \u0022immortal\u0022 (plus or minus whatever timeout you\n+\t\t * set on it afterwards) SSE stream. In http/2 case that also\n+\t\t * stops idle timeouts being applied to the network connection\n+\t\t * while this wsi is still open.\n+\t\t */\n+\t\tlws_http_mark_sse(wsi);\n+\n+\t\t/* write the body separately */\n+\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_HTTP_WRITEABLE:\n+\n+\t\tlwsl_notice(\u0022%s: LWS_CALLBACK_HTTP_WRITEABLE\u005cn\u0022, __func__);\n+\n+\t\tif (!pss)\n+\t\t\tbreak;\n+\n+\t\t/*\n+\t\t * to keep this demo as simple as possible, each client has his\n+\t\t * own private data and timer.\n+\t\t */\n+\n+\t\tp +\u003d lws_snprintf((char *)p, lws_ptr_diff_size_t(end, p),\n+\t\t\t\t \u0022data: %llu\u005cx0d\u005cx0a\u005cx0d\u005cx0a\u0022,\n+\t\t\t\t (unsigned long long)(time(NULL) -\n+\t\t\t\t pss-\u003eestablished));\n+\n+\t\tif (lws_write(wsi, (uint8_t *)start, lws_ptr_diff_size_t(p, start),\n+\t\t\t LWS_WRITE_HTTP) !\u003d lws_ptr_diff(p, start))\n+\t\t\treturn 1;\n+\n+\t\tlws_set_timer_usecs(wsi, SECS_REPORT * LWS_USEC_PER_SEC);\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_TIMER:\n+\n+\t\tlwsl_notice(\u0022%s: LWS_CALLBACK_TIMER\u005cn\u0022, __func__);\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\treturn 0;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\t{ \u0022sse\u0022, callback_sse, sizeof(struct pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+/* override the default mount for /sse in the URL space */\n+\n+static const struct lws_http_mount mount_sse \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/sse\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\tNULL,\t\t/* protocol */\n+\t/* .def */\t\t\tNULL,\n+\t/* .protocol */\t\t\t\u0022sse\u0022,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_CALLBACK, /* dynamic */\n+\t/* .mountpoint_len */\t\t4,\t\t /* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/* default mount serves the URL space from ./mount-origin */\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\t\u0026mount_sse,\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http Server-Side Events | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\n+\tinfo.protocols \u003d protocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\tinfo.port \u003d 7681;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.port \u003d 443;\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/example.js\nnew file mode 100644\nindex 0000000..cfb89ea\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/example.js\n@@ -0,0 +1,38 @@\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+var head \u003d 0, tail \u003d 0, ring \u003d new Array(), es;\n+\n+\tes \u003d new EventSource(\u0022/sse/sourcename\u0022);\n+\ttry {\n+\t\tes.onopen \u003d function() {\n+\t\t\t// console.log(\u0022EventSource opened\u0022);\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t};\n+\n+\t\tes.onmessage \u003d function got_packet(msg) {\n+\t\t\tvar n, s \u003d \u0022\u0022;\n+\t\n+\t\t\t// console.log(msg.data);\n+\t\t\tring[head] \u003d msg.data + \u0022\u005cn\u0022;\n+\t\t\thead \u003d (head + 1) % 50;\n+\t\t\tif (tail \u003d\u003d\u003d head)\n+\t\t\t\ttail \u003d (tail + 1) % 50;\n+\t\n+\t\t\tn \u003d tail;\n+\t\t\tdo {\n+\t\t\t\ts \u003d s + ring[n];\n+\t\t\t\tn \u003d (n + 1) % 50;\n+\t\t\t} while (n !\u003d\u003d head);\n+\t\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d s; \n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\n+\t\t/* there is no onclose() for EventSource */\n+\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError\u0022 + exception); \n+\t}\n+\n+}, false);\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/index.html\nnew file mode 100644\nindex 0000000..42f6b83\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/index.html\n@@ -0,0 +1,20 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http Server Side Events example\u003c/b\u003e.\n+\t\t\u003cp\u003e\n+\t\tThis is a static page served from ./mount-origin/index.html.\n+\t\t\u003cp\u003e\n+\t\tIt connects back to the server at \u003ci\u003e/sse/sourcename\u003c/i\u003e using EventSource()\u003cbr\u003e\n+\t\tand displays the periodic incoming event data below.\n+\t\t\u003cp\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d20\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/CMakeLists.txt\nnew file mode 100644\nindex 0000000..46ac74c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-tls-80 C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-tls-80)\n+set(SRCS minimal-http-server-tls-80.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/README.md\nnew file mode 100644\nindex 0000000..83a7a94\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/README.md\n@@ -0,0 +1,64 @@\n+# lws minimal http server with tls and port 80 redirect\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Because this listens on low ports (80 + 443), it must be run as root.\n+\n+```\n+ $ sudo ./lws-minimal-http-server-tls-80\n+[2018/03/20 13:23:13:0131] USER: LWS minimal http server TLS | visit https://localhost:7681\n+[2018/03/20 13:23:13:0142] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/20 13:23:13:0142] NOTICE: Using SSL mode\n+[2018/03/20 13:23:13:0146] NOTICE: SSL ECDH curve 'prime256v1'\n+[2018/03/20 13:23:13:0146] NOTICE: HTTP2 / ALPN enabled\n+[2018/03/20 13:23:13:0195] NOTICE: lws_tls_client_create_vhost_context: doing cert filepath localhost-100y.cert\n+[2018/03/20 13:23:13:0195] NOTICE: Loaded client cert localhost-100y.cert\n+[2018/03/20 13:23:13:0195] NOTICE: lws_tls_client_create_vhost_context: doing private key filepath\n+[2018/03/20 13:23:13:0196] NOTICE: Loaded client cert private key localhost-100y.key\n+[2018/03/20 13:23:13:0196] NOTICE: created client ssl context for default\n+[2018/03/20 13:23:14:0207] NOTICE: vhost default: cert expiry: 730459d\n+```\n+\n+Visit http://localhost\n+\n+This will go first to port 80 using http, where it will be redirected to\n+https and port 443\n+\n+```\n+07:41:48.596918 IP localhost.http \u003e localhost.52662: Flags [P.], seq 1:100, ack 416, win 350, options [nop,nop,TS val 3906619933 ecr 3906619933], length 99: HTTP: HTTP/1.1 301 Redirect\n+\t0x0000: 4500 0097 3f8f 4000 4006 fccf 7f00 0001 E...?.@.@.......\n+\t0x0010: 7f00 0001 0050 cdb6 6601 dfa7 922a 4c06 .....P..f....*L.\n+\t0x0020: 8018 015e fe8b 0000 0101 080a e8da 4a1d ...^..........J.\n+\t0x0030: e8da 4a1d 4854 5450 2f31 2e31 2033 3031 ..J.HTTP/1.1.301\n+\t0x0040: 2052 6564 6972 6563 740d 0a6c 6f63 6174 .Redirect..locat\n+\t0x0050: 696f 6e3a 2068 7474 7073 3a2f 2f6c 6f63 ion:.https://loc\n+\t0x0060: 616c 686f 7374 2f0d 0a63 6f6e 7465 6e74 alhost/..content\n+\t0x0070: 2d74 7970 653a 2074 6578 742f 6874 6d6c -type:.text/html\n+\t0x0080: 0d0a 636f 6e74 656e 742d 6c65 6e67 7468 ..content-length\n+\t0x0090: 3a20 300d 0a0d 0a\n+```\n+\n+Because :443 uses a selfsigned certificate, you will have to make an exception for it in your browser.\n+\n+## Certificate creation\n+\n+The selfsigned certs provided were created with\n+\n+```\n+echo -e \u0022GB\u005cnErewhon\u005cnAll around\u005cnlibwebsockets-test\u005cn\u005cnlocalhost\u005cnnone@invalid.org\u005cn\u0022 | openssl req -new -newkey rsa:4096 -days 36500 -nodes -x509 -keyout \u0022localhost-100y.key\u0022 -out \u0022localhost-100y.cert\u0022\n+```\n+\n+they cover \u0022localhost\u0022 and last 100 years from 2018-03-20.\n+\n+You can replace them with commercial certificates matching your hostname.\n+\n+## HTTP/2\n+\n+If you built lws with `-DLWS_WITH_HTTP2\u003d1` at cmake, this simple server is also http/2 capable\n+out of the box. If the index.html was loaded over http/2, it will display an HTTP 2 png.\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/minimal-http-server-tls-80.c b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/minimal-http-server-tls-80.c\nnew file mode 100644\nindex 0000000..178500d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/minimal-http-server-tls-80.c\n@@ -0,0 +1,136 @@\n+/*\n+ * lws-minimal-http-server-tls-80\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws,\n+ * with three extra lines giving it tls (ssl) capabilities, which in\n+ * turn allow operation with HTTP/2 if lws was configured for it.\n+ *\n+ * In addition, it runs a vhost on port 80 with the job of redirecting\n+ * and upgrading http clients that came in on port 80 to https on port 443.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ *\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount80 \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022localhost/\u0022,\n+\t/* .def */\t\t\t\u0022/\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_REDIR_HTTPS, /* https redir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server TLS + 80 | visit https://localhost\u005cn\u0022);\n+\tlwsl_user(\u0022 Run as ROOT so can listen on 443\u005cn\u0022);\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\n+\tinfo.port \u003d 80;\n+\tinfo.mounts \u003d \u0026mount80;\n+\tinfo.vhost_name \u003d \u0022localhost80\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create tls vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tinfo.port \u003d 443;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\tinfo.vhost_name \u003d \u0022localhost\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create tls vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/404.html\nnew file mode 100644\nindex 0000000..aa63b71\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/404.html\n@@ -0,0 +1,13 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/example.js\nnew file mode 100644\nindex 0000000..389dc7f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/example.js\n@@ -0,0 +1,21 @@\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar transport_protocol \u003d \u0022\u0022;\n+\t\n+\tif (performance \u0026\u0026 performance.timing.nextHopProtocol) {\n+\t transport_protocol \u003d performance.timing.nextHopProtocol;\n+\t} else if (window.chrome \u0026\u0026 window.chrome.loadTimes) {\n+\t transport_protocol \u003d window.chrome.loadTimes().connectionInfo;\n+\t} else {\n+\t var p \u003d performance.getEntriesByType(\u0022resource\u0022);\n+\t for (var i \u003d 0; i \u003c p.length; i++) {\n+\t\tvar value \u003d \u0022nextHopProtocol\u0022 in p[i];\n+\t\t if (value)\n+\t\t transport_protocol \u003d p[i].nextHopProtocol;\n+\t }\n+\t}\n+\t \n+\tif (transport_protocol \u003d\u003d\u003d \u0022h2\u0022)\n+\t\tdocument.getElementById(\u0022transport\u0022).innerHTML \u003d \u0022\u003cimg src\u003d\u005c\u0022/http2.png\u005c\u0022\u003e\u0022;\n+\n+}, false);\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/http2.png\nnew file mode 100644\nindex 0000000..439bfa4\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/http2.png differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/index.html\nnew file mode 100644\nindex 0000000..0753551\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/index.html\n@@ -0,0 +1,18 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal https server example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\t\u003cbr\u003e\n+\t\t\u003cdiv id\u003d\u0022transport\u0022\u003e\u003c/div\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/CMakeLists.txt\nnew file mode 100644\nindex 0000000..1f8f63f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-tls-mem C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-tls-mem)\n+set(SRCS minimal-http-server-tls-mem.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/README.md\nnew file mode 100644\nindex 0000000..e139c54\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/README.md\n@@ -0,0 +1,60 @@\n+# lws minimal http server with tls and certs from memory\n+\n+This is the same as the minimal-http-server-tls example, but shows how\n+to init the vhost with both PEM or DER certs from memory instead of files.\n+\n+The server listens on port 7681 (initialized with PEM in-memory certs) and\n+port 7682 (initialized with DER in-memory certs).\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-tls-mem\n+[2019/02/14 14:46:40:9783] USER: LWS minimal http server TLS | visit https://localhost:7681\n+[2019/02/14 14:46:40:9784] NOTICE: Using SSL mode\n+[2019/02/14 14:46:40:9784] NOTICE: lws_tls_server_vhost_backend_init: vh first: mem CA OK\n+parsing as der\n+[2019/02/14 14:46:40:9849] NOTICE: no client cert required\n+[2019/02/14 14:46:40:9849] NOTICE: created client ssl context for first\n+[2019/02/14 14:46:40:9849] NOTICE: Using SSL mode\n+[2019/02/14 14:46:40:9850] NOTICE: lws_tls_server_vhost_backend_init: vh second: mem CA OK\n+parsing as der\n+[2019/02/14 14:46:40:9894] NOTICE: no client cert required\n+[2019/02/14 14:46:40:9894] NOTICE: created client ssl context for second\n+[2019/02/14 14:46:40:9894] NOTICE: vhost first: cert expiry: 36167d\n+[2019/02/14 14:46:40:9894] NOTICE: vhost second: cert expiry: 36167d\n+[2018/03/20 13:23:14:0207] NOTICE: vhost default: cert expiry: 730459d\n+```\n+\n+Visit https://127.0.0.1:7681 and https://127.0.0.1:7682\n+\n+Because it uses a selfsigned certificate, you will have to make an exception for it in your browser.\n+\n+## Certificate creation\n+\n+The selfsigned certs provided were created with\n+\n+```\n+echo -e \u0022GB\u005cnErewhon\u005cnAll around\u005cnlibwebsockets-test\u005cn\u005cnlocalhost\u005cnnone@invalid.org\u005cn\u0022 | openssl req -new -newkey rsa:4096 -days 36500 -nodes -x509 -keyout \u0022localhost-100y.key\u0022 -out \u0022localhost-100y.cert\u0022\n+```\n+\n+they cover \u0022localhost\u0022 and last 100 years from 2018-03-20.\n+\n+You can replace them with commercial certificates matching your hostname.\n+\n+The der content was made from PEM like this\n+\n+```\n+ $ cat ../minimal-http-server-tls/localhost-100y.key | grep -v ^- | base64 -d | hexdump -C | tr -s ' ' | cut -d' ' -f2- | cut -d' ' -f-16 | sed \u0022s/|.*//g\u0022 | sed \u0022s/0000.*//g\u0022 | sed \u0022s/^/0x/g\u0022 | sed \u0022s/\u005c /\u005c,\u005c 0x/g\u0022 | sed \u0022s/\u005c$/,/g\u0022 | sed \u0022s/0x,//g\u0022\n+```\n+\n+## HTTP/2\n+\n+If you built lws with `-DLWS_WITH_HTTP2\u003d1` at cmake, this simple server is also http/2 capable\n+out of the box. If the index.html was loaded over http/2, it will display an HTTP 2 png.\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/minimal-http-server-tls-mem.c b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/minimal-http-server-tls-mem.c\nnew file mode 100644\nindex 0000000..56304bf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/minimal-http-server-tls-mem.c\n@@ -0,0 +1,465 @@\n+/*\n+ * lws-minimal-http-server-tls\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws,\n+ * with three extra lines giving it tls (ssl) capabilities, which in\n+ * turn allow operation with HTTP/2 if lws was configured for it.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ *\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/* the cert and key as PEM */\n+\n+static const char *cert_pem \u003d\n+\t\u0022-----BEGIN CERTIFICATE-----\u005cn\u0022\n+\t\u0022MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\u005cn\u0022\n+\t\u0022VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\u005cn\u0022\n+\t\u0022MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\u005cn\u0022\n+\t\u0022HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\u005cn\u0022\n+\t\u0022WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\u005cn\u0022\n+\t\u0022d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\u005cn\u0022\n+\t\u0022cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\u005cn\u0022\n+\t\u0022aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\u005cn\u0022\n+\t\u0022aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\u005cn\u0022\n+\t\u0022Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\u005cn\u0022\n+\t\u0022LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\u005cn\u0022\n+\t\u0022KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\u005cn\u0022\n+\t\u0022jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\u005cn\u0022\n+\t\u0022Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\u005cn\u0022\n+\t\u0022TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\u005cn\u0022\n+\t\u0022Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\u005cn\u0022\n+\t\u0022nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\u005cn\u0022\n+\t\u0022GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\u005cn\u0022\n+\t\u0022sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\u005cn\u0022\n+\t\u00229mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\u005cn\u0022\n+\t\u0022jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\u005cn\u0022\n+\t\u0022YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\u005cn\u0022\n+\t\u0022xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\u005cn\u0022\n+\t\u0022wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\u005cn\u0022\n+\t\u0022H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\u005cn\u0022\n+\t\u0022xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\u005cn\u0022\n+\t\u0022ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\u005cn\u0022\n+\t\u00221WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\u005cn\u0022\n+\t\u0022AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\u005cn\u0022\n+\t\u0022mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\u005cn\u0022\n+\t\u00228sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\u005cn\u0022\n+\t\u0022e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\u005cn\u0022\n+\t\u0022-----END CERTIFICATE-----\u005cn\u0022,\n+\n+\t\t*key_pem \u003d\n+\t\u0022-----BEGIN PRIVATE KEY-----\u005cn\u0022\n+\t\u0022MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\u005cn\u0022\n+\t\u0022PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\u005cn\u0022\n+\t\u0022nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\u005cn\u0022\n+\t\u0022toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\u005cn\u0022\n+\t\u00220xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\u005cn\u0022\n+\t\u0022J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\u005cn\u0022\n+\t\u0022Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\u005cn\u0022\n+\t\u0022uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\u005cn\u0022\n+\t\u0022fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\u005cn\u0022\n+\t\u0022zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\u005cn\u0022\n+\t\u0022ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\u005cn\u0022\n+\t\u0022QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\u005cn\u0022\n+\t\u0022qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\u005cn\u0022\n+\t\u0022vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\u005cn\u0022\n+\t\u0022fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\u005cn\u0022\n+\t\u0022Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\u005cn\u0022\n+\t\u0022G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\u005cn\u0022\n+\t\u0022HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\u005cn\u0022\n+\t\u0022YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\u005cn\u0022\n+\t\u0022xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\u005cn\u0022\n+\t\u0022esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\u005cn\u0022\n+\t\u0022zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\u005cn\u0022\n+\t\u0022mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\u005cn\u0022\n+\t\u0022au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\u005cn\u0022\n+\t\u002240QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\u005cn\u0022\n+\t\u0022YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\u005cn\u0022\n+\t\u0022PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\u005cn\u0022\n+\t\u0022W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\u005cn\u0022\n+\t\u0022naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\u005cn\u0022\n+\t\u00222ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\u005cn\u0022\n+\t\u002239I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\u005cn\u0022\n+\t\u0022J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\u005cn\u0022\n+\t\u0022R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\u005cn\u0022\n+\t\u0022Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\u005cn\u0022\n+\t\u0022BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\u005cn\u0022\n+\t\u0022fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\u005cn\u0022\n+\t\u0022x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\u005cn\u0022\n+\t\u0022UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\u005cn\u0022\n+\t\u0022OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\u005cn\u0022\n+\t\u002265uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\u005cn\u0022\n+\t\u0022aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\u005cn\u0022\n+\t\u0022SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\u005cn\u0022\n+\t\u0022me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\u005cn\u0022\n+\t\u0022G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\u005cn\u0022\n+\t\u0022TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\u005cn\u0022\n+\t\u002256s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\u005cn\u0022\n+\t\u0022gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\u005cn\u0022\n+\t\u0022Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\u005cn\u0022\n+\t\u0022NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\u005cn\u0022\n+\t\u0022fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\u005cn\u0022\n+\t\u0022-----END PRIVATE KEY-----\u005cn\u0022\n+\t;\n+\n+static const uint8_t cert_der[] \u003d {\n+\t0x30, 0x82, 0x05, 0xe6, 0x30, 0x82, 0x03, 0xce, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00,\n+\t0xda, 0xb9, 0xd0, 0x8b, 0xb0, 0x3c, 0x52, 0xa0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+\t0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x86, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+\t0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08,\n+\t0x0c, 0x07, 0x45, 0x72, 0x65, 0x77, 0x68, 0x6f, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,\n+\t0x04, 0x07, 0x0c, 0x0a, 0x41, 0x6c, 0x6c, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x31, 0x1b,\n+\t0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x12, 0x6c, 0x69, 0x62, 0x77, 0x65, 0x62, 0x73,\n+\t0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x31, 0x12, 0x30, 0x10, 0x06,\n+\t0x03, 0x55, 0x04, 0x03, 0x0c, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x31,\n+\t0x1f, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10,\n+\t0x6e, 0x6f, 0x6e, 0x65, 0x40, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2e, 0x6f, 0x72, 0x67,\n+\t0x30, 0x20, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x33, 0x32, 0x30, 0x30, 0x34, 0x31, 0x36, 0x30, 0x37,\n+\t0x5a, 0x18, 0x0f, 0x32, 0x31, 0x31, 0x38, 0x30, 0x32, 0x32, 0x34, 0x30, 0x34, 0x31, 0x36, 0x30,\n+\t0x37, 0x5a, 0x30, 0x81, 0x86, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+\t0x47, 0x42, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x07, 0x45, 0x72, 0x65,\n+\t0x77, 0x68, 0x6f, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0a, 0x41,\n+\t0x6c, 0x6c, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55,\n+\t0x04, 0x0a, 0x0c, 0x12, 0x6c, 0x69, 0x62, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74,\n+\t0x73, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n+\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x09,\n+\t0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x6e, 0x6f, 0x6e, 0x65, 0x40,\n+\t0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x82, 0x02, 0x22, 0x30,\n+\t0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n+\t0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa3, 0x62, 0xdb, 0x96,\n+\t0x68, 0x80, 0x82, 0x63, 0x4b, 0x49, 0x3e, 0xe6, 0xf1, 0xa4, 0x88, 0x08, 0x2f, 0xe5, 0x96, 0x9b,\n+\t0x3f, 0xdf, 0x98, 0xaf, 0x08, 0x42, 0xbd, 0x75, 0x5a, 0xd7, 0x9e, 0xeb, 0xf2, 0x14, 0xc9, 0x49,\n+\t0x68, 0xe4, 0x8e, 0xb4, 0xda, 0x6a, 0xb5, 0xa9, 0xc2, 0xe1, 0x4f, 0xf9, 0x26, 0xa6, 0x84, 0x7c,\n+\t0x0e, 0x2d, 0xc3, 0x02, 0x61, 0xca, 0x9d, 0x25, 0x9d, 0x3d, 0x6b, 0x67, 0xd4, 0x1b, 0x57, 0x2c,\n+\t0x4a, 0xcb, 0x95, 0x48, 0x87, 0x81, 0x90, 0xeb, 0x65, 0x62, 0x27, 0x98, 0x40, 0x63, 0x28, 0xcd,\n+\t0x43, 0x65, 0xff, 0x82, 0xbc, 0xd1, 0x99, 0xf8, 0x4c, 0xcf, 0x80, 0x1b, 0xf9, 0x9d, 0x37, 0xa4,\n+\t0x2d, 0x67, 0x1f, 0x23, 0x96, 0x59, 0xb6, 0x81, 0xae, 0x20, 0xfd, 0x43, 0x97, 0xf2, 0x24, 0x34,\n+\t0x3c, 0x3c, 0xcc, 0x5c, 0xf8, 0x72, 0x98, 0x8c, 0x7b, 0xf0, 0x45, 0x19, 0xe9, 0xb2, 0xc5, 0xd1,\n+\t0xe1, 0x2e, 0xb2, 0x87, 0x4a, 0x6f, 0x04, 0xa3, 0xe9, 0xd3, 0xef, 0x7e, 0x2d, 0x22, 0xd9, 0xc7,\n+\t0x29, 0x3f, 0xe6, 0xe8, 0x34, 0x94, 0xd3, 0x19, 0x59, 0xd7, 0x77, 0x7a, 0x7a, 0x12, 0xd1, 0x9b,\n+\t0xbf, 0xfe, 0x37, 0x1e, 0x3b, 0x33, 0x75, 0xcc, 0x4d, 0x11, 0xf9, 0xa8, 0xa3, 0xff, 0xed, 0x34,\n+\t0xc4, 0xda, 0xcd, 0x14, 0xeb, 0xe3, 0x34, 0xb6, 0xc1, 0x88, 0xdb, 0x3a, 0x51, 0x8b, 0xe9, 0xba,\n+\t0x8f, 0x38, 0x4d, 0xc8, 0xc0, 0x53, 0x27, 0x5b, 0xb9, 0xf2, 0xa0, 0x1e, 0xdd, 0x95, 0xb9, 0xff,\n+\t0xe6, 0x00, 0x8a, 0xe6, 0x58, 0x00, 0x1e, 0xa7, 0xe5, 0xb8, 0x54, 0xa7, 0x8a, 0x05, 0xb8, 0x1e,\n+\t0x70, 0x61, 0xb7, 0x01, 0xcb, 0x05, 0x51, 0xf2, 0xe8, 0xc8, 0x9e, 0x91, 0x7c, 0x6e, 0xe5, 0x90,\n+\t0x52, 0x3c, 0xb9, 0x37, 0xca, 0x52, 0x36, 0x9e, 0xec, 0xcd, 0xd6, 0x2c, 0x9c, 0xb2, 0x69, 0xbc,\n+\t0x07, 0x74, 0xb2, 0x26, 0xeb, 0x34, 0xf8, 0xc2, 0xd0, 0x54, 0x02, 0x36, 0xba, 0x4d, 0x8e, 0x02,\n+\t0x66, 0x20, 0xad, 0xfe, 0x98, 0xa9, 0x38, 0x91, 0x75, 0xfb, 0x65, 0x3c, 0x1e, 0x7e, 0x80, 0x33,\n+\t0x4c, 0xae, 0x25, 0xda, 0x91, 0xcd, 0xb8, 0x2e, 0x77, 0x41, 0x57, 0x3f, 0x10, 0x5f, 0xbe, 0x18,\n+\t0x12, 0xc0, 0xc6, 0x6b, 0xc2, 0x0e, 0xaf, 0x59, 0xa4, 0xc2, 0x18, 0x8b, 0xb3, 0xa6, 0xce, 0x49,\n+\t0x00, 0x28, 0xa0, 0xbd, 0x51, 0xee, 0x84, 0x7f, 0x6d, 0x7b, 0x2c, 0x54, 0x02, 0x14, 0x80, 0x4a,\n+\t0x23, 0x3b, 0xfd, 0x72, 0x08, 0xbd, 0x7f, 0x03, 0xcc, 0x2e, 0x1a, 0xca, 0x95, 0xea, 0x15, 0x44,\n+\t0xdb, 0x1e, 0x70, 0x1b, 0x02, 0x3f, 0x9e, 0xbd, 0x5a, 0x02, 0x57, 0x85, 0x49, 0xf0, 0x7f, 0x69,\n+\t0x68, 0x9f, 0x87, 0xc4, 0x66, 0xbd, 0xfe, 0xbd, 0x1b, 0x9c, 0xf6, 0xc8, 0x5f, 0xaa, 0x75, 0x74,\n+\t0x9c, 0xf3, 0x75, 0x20, 0xc4, 0xa7, 0xcd, 0x70, 0x9a, 0xb2, 0xde, 0xc8, 0xd9, 0xf8, 0xae, 0x45,\n+\t0x77, 0x48, 0xcf, 0xde, 0x8a, 0x8e, 0x51, 0x90, 0xa4, 0xfe, 0x17, 0x7c, 0xd5, 0x40, 0xf9, 0x11,\n+\t0x8b, 0xed, 0xa3, 0x27, 0x58, 0xe1, 0x48, 0x69, 0x5a, 0xca, 0x58, 0xbc, 0xc0, 0xb6, 0x0c, 0xe8,\n+\t0x18, 0xc4, 0xef, 0x3f, 0xf0, 0x2e, 0x7a, 0x12, 0x97, 0x9d, 0xc0, 0x49, 0x85, 0x8b, 0x56, 0xd2,\n+\t0x5b, 0x53, 0x8a, 0x85, 0x71, 0xfb, 0x9c, 0x93, 0x61, 0x20, 0x19, 0x5a, 0x5f, 0x88, 0xb2, 0xc9,\n+\t0x97, 0x8d, 0xe7, 0xf1, 0x26, 0xa6, 0x22, 0xdb, 0xfe, 0xd0, 0x5a, 0x6b, 0xf5, 0x40, 0x2f, 0x69,\n+\t0xb0, 0xd7, 0x23, 0x4c, 0xc6, 0x81, 0x40, 0xb3, 0x74, 0xdd, 0x3d, 0x50, 0x7a, 0x56, 0xec, 0xed,\n+\t0x8d, 0xbb, 0xb3, 0x17, 0x44, 0x9c, 0xd5, 0x2d, 0x87, 0x89, 0x08, 0xfb, 0x02, 0x03, 0x01, 0x00,\n+\t0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+\t0xf6, 0x66, 0x14, 0xdb, 0x7b, 0x56, 0xdb, 0x3b, 0x28, 0x9a, 0x42, 0x93, 0x01, 0x76, 0xab, 0x8e,\n+\t0xbd, 0xaf, 0x8e, 0xeb, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80,\n+\t0x14, 0xf6, 0x66, 0x14, 0xdb, 0x7b, 0x56, 0xdb, 0x3b, 0x28, 0x9a, 0x42, 0x93, 0x01, 0x76, 0xab,\n+\t0x8e, 0xbd, 0xaf, 0x8e, 0xeb, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n+\t0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+\t0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x36, 0x32, 0x01, 0x32, 0xba, 0x30,\n+\t0x60, 0xd0, 0x9b, 0x84, 0x02, 0x5d, 0x3f, 0xb7, 0x61, 0x96, 0x14, 0xf6, 0x45, 0x41, 0x51, 0x75,\n+\t0xe4, 0x54, 0x24, 0x3d, 0x08, 0xc6, 0xb1, 0xff, 0x86, 0x4b, 0xdb, 0xea, 0x6c, 0x87, 0x1e, 0x72,\n+\t0xbc, 0x9c, 0xe6, 0x1e, 0xcc, 0x53, 0xe3, 0x52, 0x59, 0x91, 0x29, 0x48, 0x0d, 0x10, 0x3b, 0x80,\n+\t0xc5, 0xb9, 0xd7, 0x67, 0x33, 0xdd, 0x09, 0x13, 0x55, 0xf5, 0x5d, 0xa6, 0x4a, 0x16, 0xd7, 0xbc,\n+\t0x2c, 0xa2, 0x0d, 0x8e, 0xd6, 0x09, 0x01, 0x36, 0x06, 0x7e, 0x38, 0xcf, 0x6e, 0x8e, 0xd2, 0xe5,\n+\t0x95, 0x93, 0xee, 0xc3, 0x34, 0xd2, 0xc7, 0xf4, 0x19, 0xe4, 0xc1, 0x4b, 0x4e, 0x9c, 0xcf, 0x4f,\n+\t0xc2, 0xd9, 0x83, 0xf6, 0x98, 0x56, 0x7b, 0x19, 0xb8, 0xab, 0x61, 0xa7, 0x4e, 0xc8, 0x8b, 0xe9,\n+\t0x49, 0x7a, 0x73, 0x2d, 0x10, 0x95, 0x32, 0x56, 0x29, 0x52, 0xc4, 0x51, 0x04, 0x3a, 0xc9, 0xd6,\n+\t0xb9, 0xf3, 0x67, 0xb6, 0xdc, 0x9d, 0x40, 0x5e, 0xab, 0x6a, 0x15, 0xca, 0x5f, 0xa0, 0x4d, 0xf8,\n+\t0x1f, 0x76, 0x9f, 0x12, 0x21, 0xb2, 0xf3, 0xcd, 0x9b, 0xf9, 0x90, 0x62, 0xc2, 0x47, 0x95, 0xfa,\n+\t0x8a, 0xba, 0x5d, 0x51, 0x7c, 0xb0, 0x5c, 0xab, 0xf7, 0x36, 0x2b, 0xbf, 0xd0, 0xaf, 0x59, 0x36,\n+\t0x25, 0x92, 0x94, 0xd0, 0x7c, 0xb4, 0xd9, 0x4a, 0xc8, 0x0f, 0x74, 0x41, 0xd8, 0x55, 0xc8, 0xef,\n+\t0xc5, 0x0d, 0x83, 0xf9, 0x7c, 0x83, 0x47, 0x46, 0x91, 0x2d, 0x19, 0x6f, 0xc5, 0x46, 0xbd, 0x74,\n+\t0x71, 0x85, 0x1c, 0xb2, 0x02, 0x1b, 0x7e, 0x09, 0xba, 0xae, 0x40, 0x8b, 0xa9, 0x4c, 0xd4, 0x4b,\n+\t0x28, 0x0f, 0xc1, 0xd2, 0xb0, 0x9a, 0x4c, 0x72, 0x6a, 0xc7, 0xec, 0xc5, 0xb0, 0xd9, 0xc2, 0xa4,\n+\t0xba, 0x30, 0xb7, 0xac, 0xc7, 0x45, 0x4e, 0xdb, 0x5e, 0xf3, 0x7c, 0x05, 0xd6, 0xeb, 0x85, 0xe0,\n+\t0x58, 0xd4, 0x0b, 0xbd, 0xbe, 0x4a, 0x67, 0x10, 0x37, 0xb0, 0x37, 0xf3, 0xa0, 0x42, 0xfe, 0x79,\n+\t0x36, 0x4d, 0x3b, 0x09, 0x6b, 0x04, 0xc3, 0xce, 0xac, 0x0e, 0xbb, 0xf5, 0x5d, 0x66, 0xfd, 0xa0,\n+\t0xd5, 0x6a, 0x53, 0x1e, 0x5b, 0xa6, 0x94, 0x29, 0x59, 0x78, 0xff, 0x86, 0xfe, 0x39, 0x12, 0xc8,\n+\t0x3c, 0x2a, 0x36, 0x74, 0xee, 0xd5, 0xaa, 0x1d, 0x0e, 0x65, 0x1a, 0xe3, 0x16, 0x68, 0x75, 0xf8,\n+\t0x4f, 0xd4, 0x75, 0x8f, 0xc1, 0x42, 0x85, 0x72, 0xaf, 0x28, 0x42, 0xbd, 0x78, 0xf1, 0x06, 0x00,\n+\t0x00, 0xe9, 0x5b, 0x50, 0xe2, 0x50, 0x53, 0xb4, 0x30, 0x45, 0x67, 0x75, 0x55, 0xb9, 0xf0, 0x84,\n+\t0x3b, 0x50, 0x59, 0x70, 0xbd, 0xd8, 0x0d, 0xb0, 0xd6, 0x7f, 0xf1, 0x91, 0x94, 0x91, 0xd4, 0x13,\n+\t0x3f, 0x35, 0x44, 0x83, 0x86, 0x40, 0x52, 0x51, 0x4d, 0x56, 0x8c, 0xc6, 0xd6, 0x83, 0xa1, 0xa0,\n+\t0x9a, 0x72, 0x19, 0x2d, 0x17, 0xab, 0x40, 0x2b, 0xb5, 0x3a, 0x8c, 0xeb, 0xf3, 0xba, 0xce, 0x42,\n+\t0xa4, 0x1a, 0x90, 0xf9, 0x32, 0xb7, 0xc0, 0x54, 0x48, 0xd2, 0xb7, 0x2b, 0x8d, 0xa3, 0xda, 0xa7,\n+\t0x1f, 0x84, 0x03, 0x8d, 0x75, 0x19, 0x7c, 0x1e, 0xaf, 0x10, 0xb3, 0x9a, 0x6e, 0xa7, 0x2f, 0xac,\n+\t0xf2, 0xc7, 0x42, 0x18, 0x39, 0x70, 0x47, 0x72, 0x4d, 0x08, 0xcb, 0xfa, 0xbb, 0x8f, 0x0e, 0x2b,\n+\t0xce, 0xc5, 0xe2, 0x67, 0x08, 0xc6, 0x19, 0x12, 0x79, 0xf1, 0x49, 0x50, 0x52, 0x08, 0xdb, 0x9a,\n+\t0x42, 0x18, 0xde, 0x56, 0xb4, 0x4e, 0x29, 0xe6, 0x5f, 0xbd, 0x72, 0x73, 0xb5, 0x1a, 0xb2, 0x17,\n+\t0x7b, 0x61, 0xe5, 0xff, 0xb3, 0x34, 0x73, 0xf9, 0x5b, 0x67, 0x81, 0x6f, 0x5e, 0x00, 0x11, 0x95,\n+\t0xec, 0x76, 0xae, 0x48, 0x12, 0xd0, 0xa6, 0xb4, 0xe8, 0x71,\n+}, key_der[] \u003d {\n+\t0x30, 0x82, 0x09, 0x43, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+\t0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x09, 0x2d, 0x30, 0x82, 0x09, 0x29, 0x02, 0x01,\n+\t0x00, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa3, 0x62, 0xdb, 0x96, 0x68, 0x80, 0x82, 0x63, 0x4b, 0x49,\n+\t0x3e, 0xe6, 0xf1, 0xa4, 0x88, 0x08, 0x2f, 0xe5, 0x96, 0x9b, 0x3f, 0xdf, 0x98, 0xaf, 0x08, 0x42,\n+\t0xbd, 0x75, 0x5a, 0xd7, 0x9e, 0xeb, 0xf2, 0x14, 0xc9, 0x49, 0x68, 0xe4, 0x8e, 0xb4, 0xda, 0x6a,\n+\t0xb5, 0xa9, 0xc2, 0xe1, 0x4f, 0xf9, 0x26, 0xa6, 0x84, 0x7c, 0x0e, 0x2d, 0xc3, 0x02, 0x61, 0xca,\n+\t0x9d, 0x25, 0x9d, 0x3d, 0x6b, 0x67, 0xd4, 0x1b, 0x57, 0x2c, 0x4a, 0xcb, 0x95, 0x48, 0x87, 0x81,\n+\t0x90, 0xeb, 0x65, 0x62, 0x27, 0x98, 0x40, 0x63, 0x28, 0xcd, 0x43, 0x65, 0xff, 0x82, 0xbc, 0xd1,\n+\t0x99, 0xf8, 0x4c, 0xcf, 0x80, 0x1b, 0xf9, 0x9d, 0x37, 0xa4, 0x2d, 0x67, 0x1f, 0x23, 0x96, 0x59,\n+\t0xb6, 0x81, 0xae, 0x20, 0xfd, 0x43, 0x97, 0xf2, 0x24, 0x34, 0x3c, 0x3c, 0xcc, 0x5c, 0xf8, 0x72,\n+\t0x98, 0x8c, 0x7b, 0xf0, 0x45, 0x19, 0xe9, 0xb2, 0xc5, 0xd1, 0xe1, 0x2e, 0xb2, 0x87, 0x4a, 0x6f,\n+\t0x04, 0xa3, 0xe9, 0xd3, 0xef, 0x7e, 0x2d, 0x22, 0xd9, 0xc7, 0x29, 0x3f, 0xe6, 0xe8, 0x34, 0x94,\n+\t0xd3, 0x19, 0x59, 0xd7, 0x77, 0x7a, 0x7a, 0x12, 0xd1, 0x9b, 0xbf, 0xfe, 0x37, 0x1e, 0x3b, 0x33,\n+\t0x75, 0xcc, 0x4d, 0x11, 0xf9, 0xa8, 0xa3, 0xff, 0xed, 0x34, 0xc4, 0xda, 0xcd, 0x14, 0xeb, 0xe3,\n+\t0x34, 0xb6, 0xc1, 0x88, 0xdb, 0x3a, 0x51, 0x8b, 0xe9, 0xba, 0x8f, 0x38, 0x4d, 0xc8, 0xc0, 0x53,\n+\t0x27, 0x5b, 0xb9, 0xf2, 0xa0, 0x1e, 0xdd, 0x95, 0xb9, 0xff, 0xe6, 0x00, 0x8a, 0xe6, 0x58, 0x00,\n+\t0x1e, 0xa7, 0xe5, 0xb8, 0x54, 0xa7, 0x8a, 0x05, 0xb8, 0x1e, 0x70, 0x61, 0xb7, 0x01, 0xcb, 0x05,\n+\t0x51, 0xf2, 0xe8, 0xc8, 0x9e, 0x91, 0x7c, 0x6e, 0xe5, 0x90, 0x52, 0x3c, 0xb9, 0x37, 0xca, 0x52,\n+\t0x36, 0x9e, 0xec, 0xcd, 0xd6, 0x2c, 0x9c, 0xb2, 0x69, 0xbc, 0x07, 0x74, 0xb2, 0x26, 0xeb, 0x34,\n+\t0xf8, 0xc2, 0xd0, 0x54, 0x02, 0x36, 0xba, 0x4d, 0x8e, 0x02, 0x66, 0x20, 0xad, 0xfe, 0x98, 0xa9,\n+\t0x38, 0x91, 0x75, 0xfb, 0x65, 0x3c, 0x1e, 0x7e, 0x80, 0x33, 0x4c, 0xae, 0x25, 0xda, 0x91, 0xcd,\n+\t0xb8, 0x2e, 0x77, 0x41, 0x57, 0x3f, 0x10, 0x5f, 0xbe, 0x18, 0x12, 0xc0, 0xc6, 0x6b, 0xc2, 0x0e,\n+\t0xaf, 0x59, 0xa4, 0xc2, 0x18, 0x8b, 0xb3, 0xa6, 0xce, 0x49, 0x00, 0x28, 0xa0, 0xbd, 0x51, 0xee,\n+\t0x84, 0x7f, 0x6d, 0x7b, 0x2c, 0x54, 0x02, 0x14, 0x80, 0x4a, 0x23, 0x3b, 0xfd, 0x72, 0x08, 0xbd,\n+\t0x7f, 0x03, 0xcc, 0x2e, 0x1a, 0xca, 0x95, 0xea, 0x15, 0x44, 0xdb, 0x1e, 0x70, 0x1b, 0x02, 0x3f,\n+\t0x9e, 0xbd, 0x5a, 0x02, 0x57, 0x85, 0x49, 0xf0, 0x7f, 0x69, 0x68, 0x9f, 0x87, 0xc4, 0x66, 0xbd,\n+\t0xfe, 0xbd, 0x1b, 0x9c, 0xf6, 0xc8, 0x5f, 0xaa, 0x75, 0x74, 0x9c, 0xf3, 0x75, 0x20, 0xc4, 0xa7,\n+\t0xcd, 0x70, 0x9a, 0xb2, 0xde, 0xc8, 0xd9, 0xf8, 0xae, 0x45, 0x77, 0x48, 0xcf, 0xde, 0x8a, 0x8e,\n+\t0x51, 0x90, 0xa4, 0xfe, 0x17, 0x7c, 0xd5, 0x40, 0xf9, 0x11, 0x8b, 0xed, 0xa3, 0x27, 0x58, 0xe1,\n+\t0x48, 0x69, 0x5a, 0xca, 0x58, 0xbc, 0xc0, 0xb6, 0x0c, 0xe8, 0x18, 0xc4, 0xef, 0x3f, 0xf0, 0x2e,\n+\t0x7a, 0x12, 0x97, 0x9d, 0xc0, 0x49, 0x85, 0x8b, 0x56, 0xd2, 0x5b, 0x53, 0x8a, 0x85, 0x71, 0xfb,\n+\t0x9c, 0x93, 0x61, 0x20, 0x19, 0x5a, 0x5f, 0x88, 0xb2, 0xc9, 0x97, 0x8d, 0xe7, 0xf1, 0x26, 0xa6,\n+\t0x22, 0xdb, 0xfe, 0xd0, 0x5a, 0x6b, 0xf5, 0x40, 0x2f, 0x69, 0xb0, 0xd7, 0x23, 0x4c, 0xc6, 0x81,\n+\t0x40, 0xb3, 0x74, 0xdd, 0x3d, 0x50, 0x7a, 0x56, 0xec, 0xed, 0x8d, 0xbb, 0xb3, 0x17, 0x44, 0x9c,\n+\t0xd5, 0x2d, 0x87, 0x89, 0x08, 0xfb, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x02, 0x00, 0x55,\n+\t0x9e, 0xf0, 0xc4, 0x19, 0x6f, 0x7e, 0xe4, 0xda, 0x07, 0x40, 0x57, 0x76, 0x3a, 0x6a, 0xaf, 0x1f,\n+\t0xaa, 0x89, 0x0a, 0x42, 0xa6, 0xc2, 0x34, 0xb7, 0x77, 0x82, 0x21, 0x85, 0xc1, 0x89, 0x1e, 0xcc,\n+\t0x75, 0xe8, 0x25, 0xf8, 0x3a, 0x0e, 0x2e, 0xe8, 0x67, 0x13, 0x5c, 0x2b, 0x2c, 0x37, 0xe4, 0xb1,\n+\t0x44, 0x82, 0x19, 0x20, 0xb5, 0x0a, 0x84, 0xad, 0x0a, 0xa8, 0xdf, 0x95, 0x4f, 0x22, 0x81, 0xfe,\n+\t0xbd, 0x75, 0x29, 0x58, 0xe8, 0xe7, 0x0a, 0x63, 0x38, 0x9a, 0xe1, 0x40, 0xf7, 0xf7, 0x17, 0xea,\n+\t0x66, 0x0c, 0x73, 0xc4, 0xe6, 0x26, 0xc8, 0x34, 0x7b, 0x02, 0xdd, 0x04, 0x23, 0x99, 0x57, 0x0f,\n+\t0xb0, 0x3c, 0x00, 0x65, 0x6a, 0xac, 0xfe, 0xd1, 0x43, 0xa2, 0x48, 0xc3, 0x1f, 0xb6, 0x99, 0x3d,\n+\t0x7f, 0x3f, 0x49, 0xc0, 0x67, 0x7c, 0x11, 0x1c, 0x81, 0xb1, 0x3f, 0xad, 0x93, 0x74, 0x22, 0xe8,\n+\t0x3d, 0x2f, 0x3d, 0x95, 0x6c, 0x0b, 0x52, 0xaa, 0xc7, 0x12, 0xff, 0x73, 0x02, 0x05, 0x77, 0x71,\n+\t0xdf, 0xd9, 0x90, 0x6d, 0x25, 0x77, 0xb4, 0x28, 0x19, 0xf5, 0xa6, 0x4b, 0x56, 0x86, 0xde, 0x40,\n+\t0x2a, 0xac, 0x7d, 0x9a, 0x57, 0x76, 0x3a, 0xf9, 0x7b, 0x36, 0x38, 0x22, 0x0b, 0x51, 0x71, 0xf6,\n+\t0xbf, 0x9f, 0x67, 0x0f, 0xe2, 0x39, 0xa6, 0xc5, 0x17, 0x04, 0x00, 0xe1, 0xda, 0xfe, 0x47, 0xc9,\n+\t0x84, 0x30, 0xaf, 0xfb, 0x6d, 0xde, 0x15, 0x5d, 0xf4, 0x35, 0xa3, 0xf4, 0x06, 0x19, 0xb3, 0x13,\n+\t0x1b, 0xeb, 0xa5, 0x16, 0xbb, 0x22, 0x0f, 0x23, 0xfe, 0xac, 0x12, 0x00, 0x68, 0x60, 0xb4, 0x8b,\n+\t0xb8, 0x03, 0x8c, 0xb0, 0x08, 0x05, 0x07, 0x83, 0x84, 0xfe, 0x34, 0xf5, 0x98, 0x6c, 0xc0, 0x81,\n+\t0x1c, 0xfc, 0x60, 0x6d, 0x38, 0x35, 0x37, 0xef, 0x66, 0xb6, 0x09, 0x02, 0xbf, 0xbb, 0x84, 0x3f,\n+\t0x1c, 0x14, 0x2f, 0xb8, 0x1b, 0x4a, 0x14, 0xd9, 0x06, 0x52, 0x8a, 0x0b, 0x80, 0x20, 0x9b, 0x17,\n+\t0x1c, 0xe0, 0x35, 0x41, 0x9c, 0xf3, 0x71, 0x81, 0xff, 0xa2, 0x30, 0x6c, 0x43, 0x3b, 0x47, 0x9b,\n+\t0x97, 0xaa, 0xc1, 0x62, 0x13, 0xbd, 0x4b, 0xa6, 0x6a, 0xe8, 0x0f, 0x28, 0xca, 0x4e, 0x54, 0x3c,\n+\t0x61, 0x99, 0x29, 0x21, 0xc2, 0xcd, 0x54, 0xbc, 0x34, 0xba, 0xca, 0x06, 0x60, 0x71, 0x66, 0xda,\n+\t0xbb, 0xc2, 0xc8, 0x45, 0x65, 0x7e, 0xc1, 0x37, 0x51, 0xbf, 0x1c, 0x17, 0x24, 0xc5, 0x93, 0x9d,\n+\t0x12, 0x78, 0xe7, 0x05, 0xd9, 0x02, 0xf6, 0xc7, 0x32, 0xa6, 0x99, 0xb6, 0x44, 0xa5, 0x78, 0x25,\n+\t0xc4, 0x11, 0xd1, 0xd2, 0x18, 0xe0, 0xa2, 0x7d, 0x08, 0x28, 0x90, 0xc6, 0x7e, 0x8a, 0xf8, 0x6c,\n+\t0x73, 0xbb, 0x36, 0xdf, 0xb5, 0x11, 0xc7, 0xbc, 0xbb, 0x6a, 0x13, 0x10, 0xab, 0xe9, 0xcf, 0x96,\n+\t0x88, 0x9f, 0x8e, 0x0e, 0x78, 0x2e, 0x66, 0x02, 0x94, 0x46, 0xcb, 0xcd, 0xff, 0xd1, 0xbb, 0xec,\n+\t0x7a, 0xc9, 0xd6, 0x8c, 0x31, 0x3f, 0x6c, 0x6a, 0x68, 0x4f, 0xca, 0x85, 0xbb, 0x2f, 0xb4, 0xba,\n+\t0xb0, 0xc4, 0x3c, 0xd2, 0x1d, 0xe3, 0x85, 0xdc, 0x26, 0x6d, 0x48, 0x44, 0x89, 0x46, 0xe7, 0xa1,\n+\t0x2b, 0xc4, 0x2d, 0xe5, 0xd2, 0xcd, 0x75, 0xc2, 0xb2, 0x29, 0x4e, 0x65, 0xd7, 0x72, 0x4a, 0xb0,\n+\t0xcc, 0x54, 0x7d, 0xb3, 0x6c, 0xfb, 0x7f, 0x4c, 0xe3, 0x7b, 0x2c, 0x6a, 0x66, 0x0e, 0x0d, 0x4c,\n+\t0xf2, 0x3b, 0xc2, 0x43, 0x37, 0x33, 0xc0, 0x57, 0x96, 0xfa, 0x76, 0x19, 0x30, 0x48, 0x7a, 0x8c,\n+\t0x6b, 0x58, 0x1e, 0x15, 0xdd, 0x80, 0x2b, 0xc2, 0xef, 0x10, 0x17, 0xcd, 0x10, 0x06, 0x05, 0x73,\n+\t0x9a, 0x01, 0xe5, 0xdb, 0x89, 0xd3, 0x83, 0x4d, 0x14, 0x1f, 0x53, 0xa3, 0x66, 0xc0, 0x01, 0x02,\n+\t0x82, 0x01, 0x01, 0x00, 0xce, 0xc5, 0xfb, 0x52, 0x0d, 0xb4, 0xaa, 0x1b, 0x2b, 0x5c, 0x5a, 0xa3,\n+\t0xd8, 0x3f, 0x74, 0x99, 0x1c, 0x05, 0x83, 0x03, 0x43, 0xb8, 0x00, 0x21, 0x0c, 0xf9, 0xe0, 0xb0,\n+\t0x6a, 0xef, 0x40, 0x4a, 0xeb, 0x65, 0xd0, 0x80, 0xe5, 0x34, 0x33, 0x09, 0xf2, 0x70, 0xb6, 0xa6,\n+\t0x1d, 0xb9, 0x04, 0xc7, 0xb9, 0x84, 0x70, 0xd6, 0xa7, 0x67, 0x06, 0x40, 0x9a, 0x20, 0xee, 0x96,\n+\t0x7f, 0xde, 0xa4, 0x28, 0x81, 0x08, 0x68, 0xda, 0x05, 0x27, 0x88, 0xa0, 0xe2, 0x7c, 0xde, 0xfb,\n+\t0xe3, 0x44, 0x1d, 0xca, 0x49, 0x65, 0x4f, 0x34, 0xd5, 0x44, 0xea, 0xa6, 0x3f, 0xcf, 0x9e, 0x7e,\n+\t0xb7, 0x88, 0xbe, 0xa9, 0x73, 0x1e, 0x6b, 0xaa, 0x68, 0x67, 0xc6, 0xb3, 0x9a, 0x13, 0x91, 0x96,\n+\t0x96, 0x8f, 0x9b, 0x2e, 0xf8, 0x1f, 0x9b, 0x4f, 0xef, 0x6b, 0x23, 0x06, 0x5c, 0xc1, 0xfb, 0x39,\n+\t0x61, 0x12, 0x0d, 0x85, 0x04, 0x71, 0xd7, 0xba, 0x9a, 0xfb, 0xec, 0x61, 0xe6, 0x67, 0xc4, 0xdb,\n+\t0x97, 0x3e, 0x33, 0xd7, 0xe2, 0x20, 0x14, 0xe2, 0x35, 0x2a, 0x38, 0x95, 0x3c, 0x56, 0x30, 0x14,\n+\t0xa1, 0x9c, 0xaf, 0x31, 0xac, 0x66, 0x8c, 0x12, 0x63, 0x7b, 0x5b, 0x4a, 0x93, 0x31, 0xb1, 0x47,\n+\t0x3e, 0x04, 0x33, 0xe4, 0x57, 0x31, 0x46, 0x30, 0x82, 0xab, 0x01, 0xe2, 0x97, 0x03, 0x41, 0x78,\n+\t0xb0, 0xd3, 0xa7, 0xf6, 0x44, 0x08, 0x40, 0x7b, 0xcb, 0x7e, 0x24, 0x85, 0x58, 0x79, 0xdf, 0x59,\n+\t0x81, 0x13, 0x69, 0x8d, 0xcd, 0x25, 0x48, 0x41, 0xc1, 0x99, 0x3f, 0x52, 0x3f, 0x0e, 0xf5, 0xe3,\n+\t0x5b, 0xb5, 0x14, 0x35, 0xd8, 0x05, 0xc2, 0x28, 0xbf, 0x19, 0x6f, 0xba, 0x33, 0x4b, 0x94, 0x0f,\n+\t0x2d, 0xb7, 0x51, 0x54, 0x29, 0x6c, 0x5c, 0xdc, 0x57, 0xca, 0x35, 0x0b, 0x69, 0xd9, 0x73, 0x81,\n+\t0x5b, 0xe3, 0x3c, 0x01, 0x02, 0x82, 0x01, 0x01, 0x00, 0xca, 0x48, 0x99, 0x05, 0xc3, 0x0b, 0x91,\n+\t0x9d, 0xa5, 0x49, 0x4b, 0xa5, 0xb1, 0x38, 0xa8, 0xd7, 0xf0, 0xc0, 0xae, 0xf7, 0xf7, 0x0a, 0x3e,\n+\t0x7c, 0x01, 0xbf, 0x69, 0xa6, 0x23, 0x68, 0xe0, 0x1b, 0x11, 0xd3, 0xc3, 0x9b, 0x2b, 0xdd, 0xa8,\n+\t0x66, 0x17, 0x97, 0x93, 0x6f, 0xc6, 0x68, 0xd7, 0xd0, 0x68, 0xc3, 0x2b, 0x4d, 0xfa, 0xda, 0xfa,\n+\t0xd9, 0x91, 0x68, 0x20, 0x10, 0x3d, 0x51, 0xb7, 0x3d, 0x7a, 0xc1, 0x00, 0x53, 0xc9, 0x77, 0x7e,\n+\t0x08, 0x1d, 0x7c, 0xcf, 0x36, 0x72, 0xe4, 0x7d, 0xb0, 0x67, 0x1f, 0x41, 0x5a, 0x02, 0x87, 0xcb,\n+\t0x4c, 0x83, 0xa0, 0x4f, 0xf0, 0x80, 0x4b, 0x3a, 0x66, 0xd2, 0x52, 0x13, 0x77, 0x3c, 0x6d, 0xa6,\n+\t0xdf, 0xd2, 0x3c, 0xd3, 0x6b, 0xb4, 0x7c, 0x53, 0x55, 0x40, 0x22, 0x4a, 0x87, 0x1d, 0x66, 0xd4,\n+\t0xc1, 0x45, 0x2c, 0xeb, 0xbb, 0x95, 0x57, 0x03, 0x4b, 0xd2, 0x4d, 0xfa, 0x86, 0x15, 0x3d, 0xbe,\n+\t0x8c, 0x0d, 0xf0, 0x4b, 0x9b, 0x98, 0xce, 0x88, 0xfb, 0x98, 0x90, 0x56, 0x78, 0x80, 0x7e, 0xfd,\n+\t0x27, 0xb8, 0x17, 0x23, 0x4f, 0xd8, 0x2a, 0x16, 0x89, 0xef, 0x25, 0xed, 0x85, 0x85, 0x64, 0x76,\n+\t0xb4, 0x85, 0xe8, 0x4a, 0x28, 0x7a, 0xbe, 0x11, 0x66, 0x09, 0x9a, 0xeb, 0x60, 0xdd, 0xd5, 0x53,\n+\t0x73, 0x4a, 0xad, 0xc9, 0x06, 0x8e, 0xab, 0x62, 0x31, 0x7b, 0x2e, 0xf7, 0x7e, 0x47, 0x00, 0xc2,\n+\t0x47, 0x5b, 0x61, 0x1e, 0xb9, 0x9f, 0xfc, 0x85, 0xe9, 0x97, 0x1a, 0x4d, 0x56, 0x4a, 0x0c, 0x57,\n+\t0x1b, 0x73, 0x6e, 0xba, 0xdb, 0x82, 0x70, 0xb6, 0xe5, 0x09, 0xaf, 0x45, 0x87, 0x34, 0xae, 0x54,\n+\t0xbf, 0x92, 0xf3, 0x38, 0xc9, 0x08, 0x4c, 0x1f, 0x77, 0x80, 0xec, 0x8c, 0x9c, 0x0d, 0x93, 0x29,\n+\t0x63, 0xed, 0x31, 0x9b, 0xb2, 0x3b, 0x8d, 0x34, 0xfb, 0x02, 0x82, 0x01, 0x00, 0x62, 0xb3, 0x28,\n+\t0x83, 0x03, 0x5d, 0xd0, 0xb1, 0x05, 0x62, 0xa1, 0x35, 0x82, 0x7c, 0xcf, 0xb8, 0x62, 0x22, 0xd3,\n+\t0x65, 0xd4, 0x86, 0x59, 0x31, 0x6d, 0x93, 0x3d, 0x48, 0x98, 0xd2, 0xb9, 0x7a, 0xc9, 0xa0, 0xa1,\n+\t0x05, 0x55, 0xe3, 0x33, 0xd5, 0xb4, 0xaf, 0x4e, 0xd0, 0x3e, 0x71, 0xd9, 0xb1, 0x48, 0x81, 0xca,\n+\t0xa6, 0xfb, 0xe3, 0x76, 0x9d, 0x91, 0xb4, 0xd4, 0x8e, 0x6c, 0x5d, 0x27, 0x38, 0xda, 0x56, 0xdc,\n+\t0x4d, 0xed, 0x95, 0xf0, 0x66, 0xf3, 0x95, 0xad, 0x8e, 0xc8, 0xed, 0xf3, 0xd6, 0x62, 0x70, 0x84,\n+\t0x7d, 0x70, 0xab, 0xe3, 0xe2, 0x15, 0xa5, 0x92, 0x3f, 0x64, 0x76, 0x56, 0xa4, 0x65, 0xfa, 0x08,\n+\t0x64, 0xa0, 0x4f, 0xa1, 0x0e, 0x8c, 0x26, 0x79, 0x21, 0x4b, 0x9f, 0x22, 0xf1, 0x29, 0xa9, 0x54,\n+\t0xa6, 0xb4, 0x5f, 0x0c, 0xa9, 0xf5, 0xce, 0xf6, 0x8f, 0x6e, 0x21, 0x82, 0xe8, 0x92, 0xb5, 0x90,\n+\t0xc7, 0x57, 0x41, 0x97, 0x95, 0x27, 0xb9, 0x32, 0xc3, 0xab, 0x0f, 0x1b, 0x0a, 0x1a, 0xbb, 0x3b,\n+\t0x9c, 0xba, 0xc9, 0xfb, 0x96, 0x68, 0xe5, 0xaf, 0x2f, 0xb9, 0xf1, 0x23, 0xc3, 0x6f, 0x4a, 0xc7,\n+\t0xe3, 0xe3, 0x2e, 0xb7, 0xe6, 0x02, 0x1a, 0xff, 0x47, 0x45, 0x78, 0x16, 0x19, 0x11, 0xf1, 0xc8,\n+\t0x52, 0x51, 0x9d, 0x35, 0x5a, 0x26, 0xc1, 0x7c, 0x18, 0x13, 0x38, 0x04, 0xfd, 0xcd, 0x7d, 0xae,\n+\t0xe2, 0x28, 0xc1, 0x7e, 0xc7, 0x53, 0xf3, 0x60, 0xc4, 0xc5, 0x93, 0x31, 0x98, 0x69, 0x6b, 0x39,\n+\t0x71, 0x81, 0xeb, 0x17, 0xc9, 0xb7, 0xa5, 0xf9, 0x83, 0x5c, 0x7c, 0x34, 0x38, 0x7b, 0x74, 0x4c,\n+\t0x38, 0xcc, 0xf7, 0x64, 0x58, 0x9a, 0x31, 0xa2, 0x6c, 0x18, 0x63, 0x5f, 0xe3, 0xef, 0x9d, 0xf5,\n+\t0x39, 0x8c, 0x82, 0x4e, 0x0d, 0xb3, 0xaa, 0x03, 0xb3, 0xa4, 0xdb, 0xf4, 0x01, 0x02, 0x82, 0x01,\n+\t0x01, 0x00, 0x96, 0x33, 0x77, 0xe4, 0x8e, 0x62, 0x8d, 0xba, 0x88, 0x1b, 0xb7, 0x9f, 0x0d, 0xcb,\n+\t0xeb, 0x9b, 0x84, 0x7a, 0x1e, 0xb1, 0xa2, 0xef, 0x29, 0x5c, 0x7d, 0x13, 0xbb, 0x88, 0x10, 0xac,\n+\t0xf4, 0x13, 0x45, 0x96, 0x7f, 0x9d, 0x3d, 0xe2, 0x36, 0x03, 0xb0, 0xaa, 0xed, 0x60, 0x46, 0xec,\n+\t0x5c, 0xab, 0xb4, 0xce, 0x8e, 0xde, 0x35, 0x51, 0xda, 0x88, 0x28, 0xef, 0x2f, 0x37, 0xbf, 0xc0,\n+\t0x68, 0x96, 0xaf, 0x0a, 0x96, 0x8a, 0xa0, 0x83, 0x28, 0xc3, 0x2f, 0xda, 0x18, 0x26, 0xef, 0x02,\n+\t0xf8, 0xcd, 0x3e, 0x95, 0x37, 0xba, 0x75, 0x3c, 0x8d, 0xd9, 0x7f, 0xb7, 0x4f, 0x04, 0x5e, 0xce,\n+\t0xfd, 0x4b, 0x92, 0x0a, 0x3d, 0xc8, 0x00, 0xc7, 0xce, 0xec, 0x4d, 0x38, 0xbb, 0x28, 0x33, 0x79,\n+\t0x49, 0x8b, 0x78, 0xb6, 0xbd, 0xae, 0x3c, 0x47, 0xb9, 0xdc, 0xd4, 0xd7, 0xb9, 0x26, 0xad, 0x8a,\n+\t0x51, 0xb9, 0x40, 0x2c, 0x84, 0xc4, 0x81, 0x0b, 0x3a, 0xec, 0xd6, 0x00, 0xc2, 0xb3, 0x83, 0xb0,\n+\t0x80, 0x88, 0x89, 0x4d, 0x4b, 0xd7, 0xe8, 0x59, 0xe2, 0xf2, 0x56, 0x40, 0x60, 0x09, 0x0e, 0x92,\n+\t0x99, 0xef, 0xcb, 0xf2, 0xd6, 0xbe, 0x99, 0x40, 0xf2, 0xdf, 0xb2, 0xba, 0xbc, 0x2d, 0xf8, 0x8e,\n+\t0x1f, 0x6f, 0x2b, 0xdc, 0xab, 0xc0, 0x5e, 0x97, 0xe3, 0x82, 0x2d, 0x46, 0x83, 0x89, 0x69, 0xf0,\n+\t0x9a, 0x55, 0xf1, 0x88, 0xfb, 0x5e, 0xf9, 0xab, 0xf7, 0x96, 0x72, 0xa4, 0xd7, 0xe2, 0xaf, 0x88,\n+\t0x1b, 0x8b, 0x4a, 0x96, 0xce, 0x2c, 0x2f, 0x89, 0xa0, 0x38, 0x92, 0xea, 0xfa, 0xb6, 0xb9, 0xd1,\n+\t0xa6, 0x0c, 0xc5, 0xb7, 0x2e, 0xa2, 0x69, 0x9c, 0xb4, 0xf3, 0x17, 0x53, 0xa0, 0xab, 0xad, 0x8c,\n+\t0x90, 0xa4, 0xf4, 0xc7, 0x30, 0xd5, 0x43, 0x43, 0x2d, 0xad, 0xb4, 0x57, 0x6c, 0xab, 0xd8, 0x8a,\n+\t0x4e, 0x77, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc9, 0xad, 0xff, 0xcc, 0xaf, 0x3d, 0xf9, 0x52, 0xfb,\n+\t0x1b, 0xf7, 0x92, 0x0f, 0xd9, 0x06, 0xf4, 0x7d, 0x24, 0x1d, 0x48, 0x9f, 0x69, 0xf7, 0xad, 0x40,\n+\t0x98, 0x60, 0x3e, 0x3b, 0x45, 0xe2, 0x85, 0xa8, 0x9d, 0x37, 0x56, 0x6a, 0xb9, 0x0b, 0xd9, 0xd8,\n+\t0xe7, 0xab, 0x3d, 0xc3, 0xb3, 0x94, 0x3b, 0xca, 0x5e, 0xac, 0x15, 0xe5, 0x25, 0x89, 0x8a, 0x65,\n+\t0x08, 0x4e, 0xe3, 0x6f, 0x77, 0x96, 0xfc, 0x59, 0x0f, 0x62, 0x2a, 0xe0, 0xd7, 0x19, 0x6d, 0x54,\n+\t0x82, 0x32, 0x81, 0xc0, 0x53, 0x38, 0x73, 0x63, 0x76, 0xeb, 0x76, 0x0b, 0x52, 0x23, 0x16, 0xb6,\n+\t0x80, 0x6b, 0xde, 0x18, 0x07, 0xb3, 0x67, 0x7f, 0x2a, 0x28, 0x85, 0x36, 0xe9, 0xd9, 0x33, 0xed,\n+\t0xd7, 0x84, 0x09, 0x8e, 0x2f, 0xae, 0xc4, 0x64, 0xc2, 0x1a, 0x53, 0x5b, 0x42, 0xc6, 0x54, 0x2a,\n+\t0x63, 0x71, 0x0a, 0x1a, 0x2a, 0xfc, 0xa6, 0x02, 0x80, 0xa6, 0x02, 0xcf, 0x15, 0xda, 0x83, 0x2b,\n+\t0x66, 0x2c, 0x35, 0x61, 0x0f, 0x6e, 0x39, 0x4a, 0x16, 0xc0, 0xea, 0xa6, 0xd7, 0x06, 0x6a, 0x99,\n+\t0x57, 0x0e, 0x5e, 0xf3, 0xc8, 0x4b, 0x68, 0x16, 0x02, 0xcd, 0xdf, 0x42, 0x55, 0xa3, 0x1f, 0xd8,\n+\t0x64, 0x71, 0x04, 0xcc, 0xb1, 0x46, 0x97, 0x40, 0x33, 0x83, 0xd1, 0xaa, 0xa4, 0x49, 0x8d, 0xc4,\n+\t0x36, 0xa3, 0xaf, 0x6c, 0x25, 0x75, 0xfe, 0x85, 0x29, 0x46, 0x2d, 0xf4, 0xef, 0xa9, 0x21, 0x0a,\n+\t0x80, 0x17, 0x23, 0x56, 0xca, 0x4a, 0x7f, 0xc0, 0xbd, 0x1d, 0xca, 0x0c, 0xfd, 0x78, 0x07, 0x9b,\n+\t0x68, 0x1c, 0x8f, 0xc5, 0xe4, 0xe4, 0xd2, 0x12, 0x21, 0xa1, 0x84, 0x77, 0xac, 0x81, 0x1a, 0xec,\n+\t0x7c, 0x1a, 0xe9, 0x11, 0x8d, 0x48, 0x01, 0x3b, 0x4f, 0xab, 0x5b, 0x5a, 0x05, 0x96, 0x68, 0x81,\n+\t0x1a, 0x88, 0xde, 0xb3, 0xa4, 0x90, 0xf9,\n+\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */, ret \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server TLS | visit https://localhost:7681\u005cn\u0022);\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-h\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.server_ssl_cert_mem\t\t\u003d cert_pem;\n+\tinfo.server_ssl_cert_mem_len\t\t\u003d (unsigned int)strlen(cert_pem);\n+\tinfo.server_ssl_private_key_mem\t\t\u003d key_pem;\n+\tinfo.server_ssl_private_key_mem_len\t\u003d (unsigned int)strlen(key_pem);\n+\tinfo.vhost_name \u003d \u0022first\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create first vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\tinfo.port \u003d 7682;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.server_ssl_cert_mem\t\t\u003d cert_der;\n+\tinfo.server_ssl_cert_mem_len\t\t\u003d (unsigned int)sizeof(cert_der);\n+\tinfo.server_ssl_private_key_mem\t\t\u003d key_der;\n+\tinfo.server_ssl_private_key_mem_len\t\u003d (unsigned int)sizeof(key_der);\n+\tinfo.vhost_name \u003d \u0022second\u0022;\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022Failed to create second vhost\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tret \u003d 0;\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\treturn ret;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/404.html\nnew file mode 100644\nindex 0000000..6fdd6bf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/404.html\n@@ -0,0 +1,11 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/example.js\nnew file mode 100644\nindex 0000000..88c245a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/example.js\n@@ -0,0 +1,22 @@\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar transport_protocol \u003d \u0022\u0022;\n+\t\n+\tif ( performance \u0026\u0026 performance.timing.nextHopProtocol ) {\n+\t transport_protocol \u003d performance.timing.nextHopProtocol;\n+\t} else if ( window.chrome \u0026\u0026 window.chrome.loadTimes ) {\n+\t transport_protocol \u003d window.chrome.loadTimes().connectionInfo;\n+\t} else {\n+\t\n+\t var p \u003d performance.getEntriesByType(\u0022resource\u0022);\n+\t for (var i\u003d0; i \u003c p.length; i++) {\n+\t\tvar value \u003d \u0022nextHopProtocol\u0022 in p[i];\n+\t\t if (value)\n+\t\t transport_protocol \u003d p[i].nextHopProtocol;\n+\t }\n+\t }\n+\t \n+\t if (transport_protocol \u003d\u003d\u003d \u0022h2\u0022)\n+\t \tdocument.getElementById(\u0022transport\u0022).innerHTML \u003d \u0022\u003cimg src\u003d\u005c\u0022/http2.png\u005c\u0022\u003e\u0022;\n+\n+}, false);\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/http2.png\nnew file mode 100644\nindex 0000000..439bfa4\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/http2.png differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/index.html\nnew file mode 100644\nindex 0000000..c9a1293\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/index.html\n@@ -0,0 +1,17 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal https server example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\t\u003cbr\u003e\n+\t\t\u003cdiv id\u003d\u0022transport\u0022\u003e\u003c/div\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/CMakeLists.txt\nnew file mode 100644\nindex 0000000..9e771b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-http-server-tls C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server-tls)\n+set(SRCS minimal-http-server-tls.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/README.md\nnew file mode 100644\nindex 0000000..b10ffed\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/README.md\n@@ -0,0 +1,45 @@\n+# lws minimal http server with tls\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server-tls\n+[2018/03/20 13:23:13:0131] USER: LWS minimal http server TLS | visit https://localhost:7681\n+[2018/03/20 13:23:13:0142] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/20 13:23:13:0142] NOTICE: Using SSL mode\n+[2018/03/20 13:23:13:0146] NOTICE: SSL ECDH curve 'prime256v1'\n+[2018/03/20 13:23:13:0146] NOTICE: HTTP2 / ALPN enabled\n+[2018/03/20 13:23:13:0195] NOTICE: lws_tls_client_create_vhost_context: doing cert filepath localhost-100y.cert\n+[2018/03/20 13:23:13:0195] NOTICE: Loaded client cert localhost-100y.cert\n+[2018/03/20 13:23:13:0195] NOTICE: lws_tls_client_create_vhost_context: doing private key filepath\n+[2018/03/20 13:23:13:0196] NOTICE: Loaded client cert private key localhost-100y.key\n+[2018/03/20 13:23:13:0196] NOTICE: created client ssl context for default\n+[2018/03/20 13:23:14:0207] NOTICE: vhost default: cert expiry: 730459d\n+```\n+\n+Visit https://localhost:7681\n+\n+Because it uses a selfsigned certificate, you will have to make an exception for it in your browser.\n+\n+## Certificate creation\n+\n+The selfsigned certs provided were created with\n+\n+```\n+echo -e \u0022GB\u005cnErewhon\u005cnAll around\u005cnlibwebsockets-test\u005cn\u005cnlocalhost\u005cnnone@invalid.org\u005cn\u0022 | openssl req -new -newkey rsa:4096 -days 36500 -nodes -x509 -keyout \u0022localhost-100y.key\u0022 -out \u0022localhost-100y.cert\u0022\n+```\n+\n+they cover \u0022localhost\u0022 and last 100 years from 2018-03-20.\n+\n+You can replace them with commercial certificates matching your hostname.\n+\n+## HTTP/2\n+\n+If you built lws with `-DLWS_WITH_HTTP2\u003d1` at cmake, this simple server is also http/2 capable\n+out of the box. If the index.html was loaded over http/2, it will display an HTTP 2 png.\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/minimal-http-server-tls.c b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/minimal-http-server-tls.c\nnew file mode 100644\nindex 0000000..a72a231\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/minimal-http-server-tls.c\n@@ -0,0 +1,150 @@\n+/*\n+ * lws-minimal-http-server-tls\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws,\n+ * with three extra lines giving it tls (ssl) capabilities, which in\n+ * turn allow operation with HTTP/2 if lws was configured for it.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ *\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cerrno.h\u003e\n+\n+static int interrupted;\n+\n+#if defined(LWS_WITH_PLUGINS)\n+static const char * const plugin_dirs[] \u003d {\n+\tLWS_INSTALL_DATADIR\u0022/libwebsockets-test-server/plugins/\u0022,\n+\tNULL\n+};\n+#endif\n+\n+static const struct lws_http_mount\n+#if defined(LWS_WITH_SYS_METRICS)\n+\tmount_metrics \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/metrics\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022lws-openmetrics\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022x\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\t\u0022lws-openmetrics\u0022,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_CALLBACK, /* bind to callback */\n+\t/* .mountpoint_len */\t\t8,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+\t},\n+#endif\n+\tmount \u003d {\n+#if defined(LWS_WITH_SYS_METRICS)\n+\t/* .mount_next */\t\t\u0026mount_metrics,\t\t/* linked-list \u0022next\u0022 */\n+#else\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+#endif\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\t\u0022http-only\u0022,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+#if !defined(WIN32)\n+void sigint_handler(int sig, siginfo_t *siginfo, void *context)\n+{\n+\tpid_t sender_pid \u003d siginfo-\u003esi_pid;\n+\tlwsl_err(\u0022%s: sig %d from pid %lu\u005cn\u0022, __func__, sig, (unsigned long)sender_pid);\n+\tinterrupted \u003d 1;\n+}\n+#else\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+#endif\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+#if !defined(WIN32)\n+\tstruct sigaction siga;\n+#endif\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+#if !defined(WIN32)\n+\tmemset(\u0026siga, 0, sizeof(siga));\n+\tsiga.sa_sigaction \u003d sigint_handler;\n+\tsiga.sa_flags |\u003d SA_SIGINFO; // get detail info\n+\n+\t // change signal action,\n+\tif (sigaction(SIGINT, \u0026siga, NULL) !\u003d 0) {\n+\t printf(\u0022error sigaction()\u0022);\n+\t return errno;\n+\t }\n+#else\n+\tsignal(SIGINT, sigint_handler);\n+#endif\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tlwsl_user(\u0022LWS minimal http server TLS | visit https://localhost:7681\u005cn\u0022);\n+\n+\tinfo.port \u003d 7681;\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--port\u0022)))\n+\t\tinfo.port \u003d atoi(p);\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\tinfo.fo_listen_queue \u003d 32;\n+\n+#if defined(LWS_WITH_PLUGINS)\n+\tinfo.plugin_dirs \u003d plugin_dirs;\n+#endif\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-h\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/404.html\nnew file mode 100644\nindex 0000000..6fdd6bf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/404.html\n@@ -0,0 +1,11 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/example.js\nnew file mode 100644\nindex 0000000..a90e446\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/example.js\n@@ -0,0 +1,21 @@\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar transport_protocol \u003d \u0022\u0022;\n+\t\n+\tif ( performance \u0026\u0026 performance.timing.nextHopProtocol ) {\n+\t transport_protocol \u003d performance.timing.nextHopProtocol;\n+\t} else if ( window.chrome \u0026\u0026 window.chrome.loadTimes ) {\n+\t transport_protocol \u003d window.chrome.loadTimes().connectionInfo;\n+\t} else {\n+\t\n+\t var p \u003d performance.getEntriesByType(\u0022resource\u0022);\n+\t for (var i\u003d0; i \u003c p.length; i++) {\n+\t\tvar value \u003d \u0022nextHopProtocol\u0022 in p[i];\n+\t\t if (value)\n+\t\t transport_protocol \u003d p[i].nextHopProtocol;\n+\t }\n+\t }\n+\t \n+\t if (transport_protocol \u003d\u003d\u003d \u0022h2\u0022)\n+\t \tdocument.getElementById(\u0022transport\u0022).innerHTML \u003d \u0022\u003cimg src\u003d\u005c\u0022/http2.png\u005c\u0022\u003e\u0022;\n+}, false);\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/http2.png\nnew file mode 100644\nindex 0000000..439bfa4\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/http2.png differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/index.html\nnew file mode 100644\nindex 0000000..c9a1293\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/index.html\n@@ -0,0 +1,17 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal https server example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\t\u003cbr\u003e\n+\t\t\u003cdiv id\u003d\u0022transport\u0022\u003e\u003c/div\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server/CMakeLists.txt\nnew file mode 100644\nindex 0000000..b1df7af\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-http-server C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-http-server)\n+set(SRCS minimal-http-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server/README.md\nnew file mode 100644\nindex 0000000..cc8794b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server/README.md\n@@ -0,0 +1,18 @@\n+# lws minimal http server\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-http-server\n+[2018/03/04 09:30:02:7986] USER: LWS minimal http server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server/minimal-http-server.c\nnew file mode 100644\nindex 0000000..7bd74e2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server/minimal-http-server.c\n@@ -0,0 +1,90 @@\n+/*\n+ * lws-minimal-http-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http server | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--h2-prior-knowledge\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_H2_PRIOR_KNOWLEDGE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/index.html\nnew file mode 100644\nindex 0000000..bc9ffa4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/index.html\n@@ -0,0 +1,15 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal http server example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/mqtt-client/README.md b/minimal-examples-lowlevel/mqtt-client/README.md\nnew file mode 100644\nindex 0000000..625e9c7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/README.md\n@@ -0,0 +1,4 @@\n+|name|demonstrates|\n+---|---\n+minimal-mqtt-client|Simple demo for mqtt client operation\n+minimal-mqtt-client-multi|Demonstrates automatic binding / muxing of independent connections to share a single tcp / tls connection\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/CMakeLists.txt b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/CMakeLists.txt\nnew file mode 100644\nindex 0000000..bb03aae\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-mqtt-client-multi C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-mqtt-client-multi)\n+set(SRCS minimal-mqtt-client-multi.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_MQTT 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/README.md b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/README.md\nnew file mode 100644\nindex 0000000..a999ba5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/README.md\n@@ -0,0 +1,24 @@\n+# lws minimal MQTT client multi\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+The application goes to https://warmcat.com and receives the page data\n+same as minimal http client.\n+\n+However it does it for 8 client connections concurrently.\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-c \u003cconns\u003e|Count of simultaneous connections (default 8)\n+-s|Stagger the connections by 100ms, the last by 1s\n+-p|Use stream binding\n+\n+\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c\nnew file mode 100644\nindex 0000000..31f2aa2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c\n@@ -0,0 +1,444 @@\n+/*\n+ * lws-minimal-mqtt-client\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ * Sakthi Kannan \u003csaktr@amazon.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+#include \u003cassert.h\u003e\n+\n+#define COUNT 8\n+\n+struct test_item {\n+\tstruct lws_context\t\t*context;\n+\tstruct lws\t\t\t*wsi;\n+\tlws_sorted_usec_list_t\t\tsul;\n+} items[COUNT];\n+\n+enum {\n+\tSTATE_SUBSCRIBE,\t/* subscribe to the topic */\n+\tSTATE_WAIT_SUBACK,\n+\tSTATE_PUBLISH_QOS0,\t/* Send the message in QoS0 */\n+\tSTATE_WAIT_ACK0,\t/* Wait for the synthetic \u0022ack\u0022 */\n+\tSTATE_PUBLISH_QOS1,\t/* Send the message in QoS1 */\n+\tSTATE_WAIT_ACK1,\t/* Wait for the real ack (or timeout + retry) */\n+\tSTATE_UNSUBSCRIBE,\n+\tSTATE_WAIT_UNSUBACK,\n+\n+\tSTATE_TEST_FINISH\n+};\n+\n+static int interrupted, do_ssl, pipeline, stagger_us \u003d 5000, okay,\n+\t done, count \u003d COUNT;\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping\t\t\u003d 20, /* if idle, PINGREQ after secs */\n+\t.secs_since_valid_hangup\t\u003d 25, /* hangup if still idle secs */\n+};\n+\n+static const lws_mqtt_client_connect_param_t client_connect_param \u003d {\n+\t.client_id\t\t\t\u003d NULL,\n+\t.keep_alive\t\t\t\u003d 60,\n+\t.clean_start\t\t\t\u003d 1,\n+\t.will_param \u003d {\n+\t\t.topic\t\t\t\u003d \u0022good/bye\u0022,\n+\t\t.message\t\t\u003d \u0022sign-off\u0022,\n+\t\t.qos\t\t\t\u003d 0,\n+\t\t.retain\t\t\t\u003d 0,\n+\t},\n+\t.username\t\t\t\u003d \u0022lwsUser\u0022,\n+\t.password\t\t\t\u003d \u0022mySecretPassword\u0022,\n+};\n+\n+static lws_mqtt_topic_elem_t topics[] \u003d {\n+\t[0] \u003d { .name \u003d \u0022test/topic0\u0022, .qos \u003d QOS0 },\n+\t[1] \u003d { .name \u003d \u0022test/topic1\u0022, .qos \u003d QOS1 },\n+};\n+\n+static lws_mqtt_subscribe_param_t sub_param \u003d {\n+\t.topic\t\t\t\t\u003d \u0026topics[0],\n+\t.num_topics\t\t\t\u003d LWS_ARRAY_SIZE(topics),\n+};\n+\n+static const char * const test_string \u003d\n+\t\u0022No one would have believed in the last years of the nineteenth \u0022\n+\t\u0022century that this world was being watched keenly and closely by \u0022\n+\t\u0022intelligences greater than man's and yet as mortal as his own; that as \u0022\n+\t\u0022men busied themselves about their various concerns they were \u0022\n+\t\u0022scrutinised and studied, perhaps almost as narrowly as a man with a \u0022\n+\t\u0022microscope might scrutinise the transient creatures that swarm and \u0022\n+\t\u0022multiply in a drop of water. With infinite complacency men went to \u0022\n+\t\u0022and fro over this globe about their little affairs, serene in their \u0022\n+\t\u0022assurance of their empire over matter. It is possible that the \u0022\n+\t\u0022infusoria under the microscope do the same. No one gave a thought to \u0022\n+\t\u0022the older worlds of space as sources of human danger, or thought of \u0022\n+\t\u0022them only to dismiss the idea of life upon them as impossible or \u0022\n+\t\u0022improbable. It is curious to recall some of the mental habits of \u0022\n+\t\u0022those departed days. At most terrestrial men fancied there might be \u0022\n+\t\u0022other men upon Mars, perhaps inferior to themselves and ready to \u0022\n+\t\u0022welcome a missionary enterprise. Yet across the gulf of space, minds \u0022\n+\t\u0022that are to our minds as ours are to those of the beasts that perish, \u0022\n+\t\u0022intellects vast and cool and unsympathetic, regarded this earth with \u0022\n+\t\u0022envious eyes, and slowly and surely drew their plans against us. And \u0022\n+\t\u0022early in the twentieth century came the great disillusionment. \u0022;\n+\n+/* this reflects the length of the string above */\n+#define TEST_STRING_LEN 1337\n+\n+struct pss {\n+\tlws_mqtt_publish_param_t\tpub_param;\n+\tint\t\t\t\tstate;\n+\tsize_t\t\t\t\tpos;\n+\tint\t\t\t\tretries;\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static int\n+connect_client(struct lws_context *context, struct test_item *item)\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof i);\n+\n+\ti.mqtt_cp \u003d \u0026client_connect_param;\n+\ti.opaque_user_data \u003d item;\n+\ti.protocol \u003d \u0022test-mqtt\u0022;\n+\ti.address \u003d \u0022localhost\u0022;\n+\ti.host \u003d \u0022localhost\u0022;\n+\ti.pwsi \u003d \u0026item-\u003ewsi;\n+\ti.context \u003d context;\n+\ti.method \u003d \u0022MQTT\u0022;\n+\ti.alpn \u003d \u0022mqtt\u0022;\n+\ti.port \u003d 1883;\n+\n+\tif (do_ssl) {\n+\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t\ti.port \u003d 8883;\n+\t}\n+\n+\tif (pipeline)\n+\t\ti.ssl_connection |\u003d LCCSCF_PIPELINE;\n+\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tlwsl_err(\u0022%s: Client Connect Failed\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+start_conn(struct lws_sorted_usec_list *sul)\n+{\n+\tstruct test_item *item \u003d lws_container_of(sul, struct test_item, sul);\n+\n+\tlwsl_notice(\u0022%s: item %d\u005cn\u0022, __func__, (int)(item - \u0026items[0]));\n+\n+\tif (connect_client(item-\u003econtext, item))\n+\t\tinterrupted \u003d 1;\n+}\n+\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d mgr-\u003eparent;\n+\tint n;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL ||\n+\t target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\t/*\n+\t* We delay trying to do the client connection until the protocols have\n+\t* been initialized for each vhost... this happens after we have network\n+\t* and time so we can judge tls cert validity.\n+\t*\n+\t* Stagger the connection attempts so we get some joining before the\n+\t* first has connected and some afterwards\n+\t*/\n+\n+\tfor (n \u003d 0; n \u003c count; n++) {\n+\t\titems[n].context \u003d context;\n+\t\tlws_sul_schedule(context, 0, \u0026items[n].sul, start_conn,\n+\t\t\t\t n * stagger_us);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+\n+static int\n+callback_mqtt(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tstruct test_item *item \u003d (struct test_item *)lws_get_opaque_user_data(wsi);\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tlws_mqtt_publish_param_t *pub;\n+\tsize_t chunk;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022%s: CLIENT_CONNECTION_ERROR: %s\u005cn\u0022, __func__,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\n+\t\tif (++done \u003d\u003d count)\n+\t\t\tgoto finish_test;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_CLIENT_CLOSED:\n+\t\tlwsl_user(\u0022%s: item %d: CLIENT_CLOSED %p\u005cn\u0022, __func__, (int)(item - \u0026items[0]), wsi);\n+\n+\t\tif (++done \u003d\u003d count)\n+\t\t\tgoto finish_test;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: MQTT_CLIENT_ESTABLISHED: %p\u005cn\u0022, __func__, wsi);\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_MQTT_SUBSCRIBED:\n+\t\tlwsl_user(\u0022%s: MQTT_SUBSCRIBED\u005cn\u0022, __func__);\n+\n+\t\t/* then we can get on with the actual test part */\n+\n+\t\tpss-\u003estate++;\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_UNSUBSCRIBED:\n+\t\tlwsl_user(\u0022%s: item %d: UNSUBSCRIBED: %p: Received unsuback\u005cn\u0022,\n+\t\t\t __func__, (int)(item - \u0026item[0]), wsi);\n+\t\tokay++;\n+\n+\t\tif (++pss-\u003estate \u003d\u003d STATE_TEST_FINISH) {\n+\t\t\tlwsl_notice(\u0022%s: MQTT_UNSUBACK ending stream %d successfully(%d/%d)\u005cn\u0022,\n+\t\t\t\t __func__, (int)(item - \u0026items[0]), okay, count);\n+\t\t\t/* We are done, request to close */\n+\t\t\treturn -1;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_CLIENT_WRITEABLE:\n+\n+\t\t/*\n+\t\t * Extra WRITEABLE may appear here other than ones we asked\n+\t\t * for, so we must consult our own state to decide if we want\n+\t\t * to make use of the opportunity\n+\t\t */\n+\n+\t\tswitch (pss-\u003estate) {\n+\t\tcase STATE_SUBSCRIBE:\n+\t\t\tlwsl_user(\u0022%s: item %d: WRITEABLE: %p: Subscribing\u005cn\u0022, __func__, (int)(item - \u0026items[0]), wsi);\n+\n+\t\t\tif (lws_mqtt_client_send_subcribe(wsi, \u0026sub_param)) {\n+\t\t\t\tlwsl_notice(\u0022%s: subscribe failed\u005cn\u0022, __func__);\n+\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t\tpss-\u003estate++;\n+\t\t\tbreak;\n+\n+\t\tcase STATE_PUBLISH_QOS0:\n+\t\tcase STATE_PUBLISH_QOS1:\n+\n+\t\t\tlwsl_user(\u0022%s: item %d: WRITEABLE: %p: Publish\u005cn\u0022, __func__, (int)(item - \u0026items[0]), wsi);\n+\n+\t\t\tpss-\u003epub_param.topic\t\u003d pss-\u003estate \u003d\u003d STATE_PUBLISH_QOS0 ?\n+\t\t\t\t\t\t\u0022test/topic0\u0022 : \u0022test/topic1\u0022;\n+\t\t\tpss-\u003epub_param.topic_len \u003d (uint16_t)strlen(pss-\u003epub_param.topic);\n+\t\t\tpss-\u003epub_param.qos \u003d\n+\t\t\t\tpss-\u003estate \u003d\u003d STATE_PUBLISH_QOS0 ? QOS0 : QOS1;\n+\t\t\tpss-\u003epub_param.payload_len \u003d TEST_STRING_LEN;\n+\n+\t\t\t/* We send the message out 300 bytes or less at at time */\n+\n+\t\t\tchunk \u003d 300;\n+\n+\t\t\tif (chunk \u003e TEST_STRING_LEN - pss-\u003epos)\n+\t\t\t\tchunk \u003d TEST_STRING_LEN - pss-\u003epos;\n+\n+\t\t\tlwsl_notice(\u0022%s: sending %d at +%d\u005cn\u0022, __func__,\n+\t\t\t\t\t(int)chunk, (int)pss-\u003epos);\n+\n+\t\t\tif (lws_mqtt_client_send_publish(wsi, \u0026pss-\u003epub_param,\n+\t\t\t\t\ttest_string + pss-\u003epos, (uint32_t)chunk,\n+\t\t\t\t\t(pss-\u003epos + chunk \u003d\u003d TEST_STRING_LEN))) {\n+\t\t\t\tlwsl_notice(\u0022%s: publish failed\u005cn\u0022, __func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\n+\t\t\tpss-\u003epos +\u003d chunk;\n+\n+\t\t\tif (pss-\u003epos \u003d\u003d TEST_STRING_LEN) {\n+\t\t\t\tlwsl_debug(\u0022%s: sent message\u005cn\u0022, __func__);\n+\t\t\t\tpss-\u003epos \u003d 0;\n+\t\t\t\tpss-\u003estate++;\n+\t\t\t}\n+\t\t\tbreak;\n+\n+\t\tcase STATE_UNSUBSCRIBE:\n+\t\t\tlwsl_user(\u0022%s: item %d: UNSUBSCRIBE: %p: Send unsub\u005cn\u0022,\n+\t\t\t\t __func__, (int)(item - \u0026item[0]), wsi);\n+\t\t\tpss-\u003estate++;\n+\t\t\tif (lws_mqtt_client_send_unsubcribe(wsi, \u0026sub_param)) {\n+\t\t\t\tlwsl_notice(\u0022%s: subscribe failed\u005cn\u0022, __func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_MQTT_ACK:\n+\t\tlwsl_user(\u0022%s: item %d: MQTT_ACK (state %d)\u005cn\u0022, __func__, (int)(item - \u0026items[0]), pss-\u003estate);\n+\t\t/*\n+\t\t * We can forget about the message we just sent, it's done.\n+\t\t *\n+\t\t * For our test, that's the indication we can close the wsi.\n+\t\t */\n+\n+\t\tpss-\u003estate++;\n+\t\tif (pss-\u003estate !\u003d STATE_TEST_FINISH) {\n+\t\t\tlws_callback_on_writable(wsi);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_RESEND:\n+\t\tlwsl_user(\u0022%s: MQTT_RESEND\u005cn\u0022, __func__);\n+\t\t/*\n+\t\t * We must resend the packet ID mentioned in len\n+\t\t */\n+\t\tif (++pss-\u003eretries \u003d\u003d 3) {\n+\t\t\tlwsl_notice(\u0022%s: too many retries\u005cn\u0022, __func__);\n+\t\t\treturn 1; /* kill the connection */\n+\t\t}\n+\t\tpss-\u003estate--;\n+\t\tpss-\u003epos \u003d 0;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_CLIENT_RX:\n+\t\tpub \u003d (lws_mqtt_publish_param_t *)in;\n+\t\tassert(pub);\n+\t\tlwsl_user(\u0022%s: item %d: MQTT_CLIENT_RX (%s) pos %d/%d len %d\u005cn\u0022, __func__,\n+\t\t\t (int)(item - \u0026items[0]), pub-\u003etopic, (int)pub-\u003epayload_pos,\n+\t\t\t (int)pub-\u003epayload_len, (int)len);\n+\n+\t\t//lwsl_hexdump_info(pub-\u003epayload, len);\n+\n+\t\treturn 0;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+\n+finish_test:\n+\tinterrupted \u003d 1;\n+\tlws_cancel_service(lws_get_context(wsi));\n+\n+\treturn 0;\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t.name\t\t\t\u003d \u0022test-mqtt\u0022,\n+\t\t.callback\t\t\u003d callback_mqtt,\n+\t\t.per_session_data_size\t\u003d sizeof(struct pss)\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+int main(int argc, const char **argv)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t\t system_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tdo_ssl \u003d !!lws_cmdline_option(argc, argv, \u0022-s\u0022);\n+\tif (do_ssl)\n+\t\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-p\u0022))\n+\t\tpipeline \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\tstagger_us \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022)))\n+\t\tcount \u003d atoi(p);\n+\n+\tif (count \u003e COUNT) {\n+\t\tcount \u003d COUNT;\n+\t\tlwsl_err(\u0022%s: clipped count at max %d\u005cn\u0022, __func__, count);\n+\t}\n+\n+\tlwsl_user(\u0022LWS minimal MQTT client %s [-d\u003cverbosity\u003e][-s]\u005cn\u0022,\n+\t\t\tdo_ssl ? \u0022tls enabled\u0022: \u0022unencrypted\u0022);\n+\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.register_notifier_list \u003d na;\n+\tinfo.fd_limit_per_thread \u003d 1 + COUNT + 1;\n+\tinfo.retry_and_idle_policy \u003d \u0026retry;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./mosq-ca.crt\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* Event loop */\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlwsl_user(\u0022%s: Completed: %d/%d ok, %s\u005cn\u0022, __func__, okay, count,\n+\t\t\tokay !\u003d count ? \u0022failed\u0022 : \u0022OK\u0022);\n+\tlws_context_destroy(context);\n+\n+\treturn okay !\u003d count;\n+}\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/selftest.sh.broken-on-travis b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/selftest.sh.broken-on-travis\nnew file mode 100755\nindex 0000000..a2fdb59\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/selftest.sh.broken-on-travis\n@@ -0,0 +1,32 @@\n+#!/bin/bash\n+#\n+# $1: path to minimal example binaries...\n+# if lws is built with -DLWS_WITH_MINIMAL_EXAMPLES\u003d1\n+# that will be ./bin from your build dir\n+#\n+# $2: path for logs and results. The results will go\n+# in a subdir named after the directory this script\n+# is in\n+#\n+# $3: offset for test index count\n+#\n+# $4: total test count\n+#\n+# $5: path to ./minimal-examples dir in lws\n+#\n+# Test return code 0: OK, 254: timed out, other: error indication\n+\n+. $5/selftests-library.sh\n+\n+COUNT_TESTS\u003d1\n+\n+#dotest $1 $2 warmcat\n+\n+Q\u003d`which mosquitto`\n+spawn \u0022\u0022 /tmp $Q -v\n+dotest $1 $2 -p-i100000 -p -i 100000\n+\n+kill $SPID 2\u003e/dev/null\n+wait $SPID 2\u003e/dev/null\n+exit $FAILS\n+\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/warmcat.com.cer b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/warmcat.com.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/warmcat.com.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/wget-log b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/wget-log\nnew file mode 100644\nindex 0000000..bf3c762\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/wget-log\n@@ -0,0 +1,11 @@\n+--2018-11-25 07:54:30-- https://www.gravatar.com/avatar/c50933ca2aa61e0fe2c43d46bb6b59cb/?s\u003d128\n+Resolving www.gravatar.com (www.gravatar.com)... 192.0.73.2, 2a04:fa87:fffe::c000:4902\n+Connecting to www.gravatar.com (www.gravatar.com)|192.0.73.2|:443... connected.\n+HTTP request sent, awaiting response... 200 OK\n+Length: 24761 (24K) [image/png]\n+Saving to: ‘/tmp/q’\n+\n+\r/tmp/q 0%[ ] 0 --.-KB/s \r/tmp/q 100%[\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003e] 24.18K --.-KB/s in 0.01s\n+\n+2018-11-25 07:54:31 (2.04 MB/s) - ‘/tmp/q’ saved [24761/24761]\n+\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/CMakeLists.txt b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/CMakeLists.txt\nnew file mode 100644\nindex 0000000..1b688c7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-minimal-mqtt-client C)\n+cmake_minimum_required(VERSION 2.8.12)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-mqtt-client)\n+set(SRCS minimal-mqtt-client.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_MQTT 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/README.md b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/README.md\nnew file mode 100644\nindex 0000000..909f672\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/README.md\n@@ -0,0 +1,51 @@\n+# lws minimal MQTT client\n+\n+The application connects to a broker at localhost 1883 (unencrypted) or\n+8883 (tls)\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-s| Use tls and connect to port 8883 instead of 1883\n+\n+Start mosquitto server locally\n+\n+```\n+$ mosquitto\n+```\n+\n+Run the example\n+\n+```\n+[2020/01/31 10:40:23:7789] U: LWS minimal MQTT client unencrypted [-d\u003cverbosity\u003e][-s]\n+[2020/01/31 10:40:23:8539] N: lws_mqtt_generate_id: User space provided a client ID 'lwsMqttClient'\n+[2020/01/31 10:40:23:9893] N: _lws_mqtt_rx_parser: migrated nwsi 0x50febd0 to sid 1 0x5106820\n+[2020/01/31 10:40:23:9899] U: callback_mqtt: MQTT_CLIENT_ESTABLISHED\n+[2020/01/31 10:40:23:9967] U: callback_mqtt: WRITEABLE: Subscribing\n+[2020/01/31 10:40:24:0068] U: callback_mqtt: MQTT_SUBSCRIBED\n+```\n+\n+Send something to the test client\n+\n+\n+```\n+mosquitto_pub -h 127.0.0.1 -p 1883 -t test/topic0 -m \u0022hello\u0022\n+```\n+\n+Observe it received at the test client\n+\n+```\n+[2020/01/31 10:40:27:1845] U: callback_mqtt: MQTT_CLIENT_RX\n+[2020/01/31 10:40:27:1870] N: \n+[2020/01/31 10:40:27:1945] N: 0000: 74 65 73 74 2F 74 6F 70 69 63 30 test/topic0 \n+[2020/01/31 10:40:27:1952] N: \n+\n+```\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c\nnew file mode 100644\nindex 0000000..8eb9542\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c\n@@ -0,0 +1,351 @@\n+/*\n+ * lws-minimal-mqtt-client\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ * Sakthi Kannan \u003csaktr@amazon.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+#include \u003cassert.h\u003e\n+\n+enum {\n+\tSTATE_SUBSCRIBE,\t/* subscribe to the topic */\n+\tSTATE_PUBLISH_QOS0,\t/* Send the message in QoS0 */\n+\tSTATE_WAIT_ACK0,\t/* Wait for the synthetic \u0022ack\u0022 */\n+\tSTATE_PUBLISH_QOS1,\t/* Send the message in QoS1 */\n+\tSTATE_WAIT_ACK1,\t/* Wait for the real ack (or timeout + retry) */\n+\n+\tSTATE_TEST_FINISH\n+};\n+\n+static int interrupted, bad \u003d 1, do_ssl;\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping\t\t\u003d 20, /* if idle, PINGREQ after secs */\n+\t.secs_since_valid_hangup\t\u003d 25, /* hangup if still idle secs */\n+};\n+\n+static const lws_mqtt_client_connect_param_t client_connect_param \u003d {\n+\t.client_id\t\t\t\u003d \u0022lwsMqttClient\u0022,\n+\t.keep_alive\t\t\t\u003d 60,\n+\t.clean_start\t\t\t\u003d 1,\n+\t.client_id_nofree\t\t\u003d 1,\n+\t.will_param \u003d {\n+\t\t.topic\t\t\t\u003d \u0022good/bye\u0022,\n+\t\t.message\t\t\u003d \u0022sign-off\u0022,\n+\t\t.qos\t\t\t\u003d 0,\n+\t\t.retain\t\t\t\u003d 0,\n+\t},\n+\t.username\t\t\t\u003d \u0022lwsUser\u0022,\n+\t.password\t\t\t\u003d \u0022mySecretPassword\u0022,\n+};\n+\n+static lws_mqtt_publish_param_t pub_param;\n+\n+static lws_mqtt_topic_elem_t topics[] \u003d {\n+\t[0] \u003d { .name \u003d \u0022test/topic0\u0022, .qos \u003d QOS0 },\n+\t[1] \u003d { .name \u003d \u0022test/topic1\u0022, .qos \u003d QOS1 },\n+};\n+\n+static lws_mqtt_subscribe_param_t sub_param \u003d {\n+\t.topic\t\t\t\t\u003d \u0026topics[0],\n+\t.num_topics\t\t\t\u003d LWS_ARRAY_SIZE(topics),\n+};\n+\n+static const char * const test_string \u003d\n+\t\u0022No one would have believed in the last years of the nineteenth \u0022\n+\t\u0022century that this world was being watched keenly and closely by \u0022\n+\t\u0022intelligences greater than man's and yet as mortal as his own; that as \u0022\n+\t\u0022men busied themselves about their various concerns they were \u0022\n+\t\u0022scrutinised and studied, perhaps almost as narrowly as a man with a \u0022\n+\t\u0022microscope might scrutinise the transient creatures that swarm and \u0022\n+\t\u0022multiply in a drop of water. With infinite complacency men went to \u0022\n+\t\u0022and fro over this globe about their little affairs, serene in their \u0022\n+\t\u0022assurance of their empire over matter. It is possible that the \u0022\n+\t\u0022infusoria under the microscope do the same. No one gave a thought to \u0022\n+\t\u0022the older worlds of space as sources of human danger, or thought of \u0022\n+\t\u0022them only to dismiss the idea of life upon them as impossible or \u0022\n+\t\u0022improbable. It is curious to recall some of the mental habits of \u0022\n+\t\u0022those departed days. At most terrestrial men fancied there might be \u0022\n+\t\u0022other men upon Mars, perhaps inferior to themselves and ready to \u0022\n+\t\u0022welcome a missionary enterprise. Yet across the gulf of space, minds \u0022\n+\t\u0022that are to our minds as ours are to those of the beasts that perish, \u0022\n+\t\u0022intellects vast and cool and unsympathetic, regarded this earth with \u0022\n+\t\u0022envious eyes, and slowly and surely drew their plans against us. And \u0022\n+\t\u0022early in the twentieth century came the great disillusionment. \u0022;\n+\n+/* this reflects the length of the string above */\n+#define TEST_STRING_LEN 1337\n+\n+struct pss {\n+\tint\t\tstate;\n+\tsize_t\t\tpos;\n+\tint\t\tretries;\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static int\n+connect_client(struct lws_context *context)\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof i);\n+\n+\ti.mqtt_cp \u003d \u0026client_connect_param;\n+\ti.address \u003d \u0022localhost\u0022;\n+\ti.host \u003d \u0022localhost\u0022;\n+\ti.protocol \u003d \u0022mqtt\u0022;\n+\ti.context \u003d context;\n+\ti.method \u003d \u0022MQTT\u0022;\n+\ti.alpn \u003d \u0022mqtt\u0022;\n+\ti.port \u003d 1883;\n+\n+\tif (do_ssl) {\n+\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t\ti.port \u003d 8883;\n+\t}\n+\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tlwsl_err(\u0022%s: Client Connect Failed\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d mgr-\u003eparent;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL ||\n+\t target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\t/*\n+\t* We delay trying to do the client connection until\n+\t* the protocols have been initialized for each\n+\t* vhost... this happens after we have network and\n+\t* time so we can judge tls cert validity.\n+\t*/\n+\n+\tif (connect_client(context))\n+\t\tinterrupted \u003d 1;\n+\n+\treturn 0;\n+ }\n+\n+\n+static int\n+callback_mqtt(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tlws_mqtt_publish_param_t *pub;\n+\tsize_t chunk;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022%s: CLIENT_CONNECTION_ERROR: %s\u005cn\u0022, __func__,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_CLIENT_CLOSED:\n+\t\tlwsl_user(\u0022%s: CLIENT_CLOSED\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: MQTT_CLIENT_ESTABLISHED\u005cn\u0022, __func__);\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_MQTT_SUBSCRIBED:\n+\t\tlwsl_user(\u0022%s: MQTT_SUBSCRIBED\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_CLIENT_WRITEABLE:\n+\t\t/*\n+\t\t * Extra WRITEABLE may appear here other than ones we asked\n+\t\t * for, so we must consult our own state to decide if we want\n+\t\t * to make use of the opportunity\n+\t\t */\n+\n+\t\tswitch (pss-\u003estate) {\n+\t\tcase STATE_SUBSCRIBE:\n+\t\t\tlwsl_user(\u0022%s: WRITEABLE: Subscribing\u005cn\u0022, __func__);\n+\n+\t\t\tif (lws_mqtt_client_send_subcribe(wsi, \u0026sub_param)) {\n+\t\t\t\tlwsl_notice(\u0022%s: subscribe failed\u005cn\u0022, __func__);\n+\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t\tpss-\u003estate++;\n+\t\t\tbreak;\n+\n+\t\tcase STATE_PUBLISH_QOS0:\n+\t\tcase STATE_PUBLISH_QOS1:\n+\n+\t\t\tlwsl_user(\u0022%s: WRITEABLE: Publish\u005cn\u0022, __func__);\n+\n+\t\t\tpub_param.topic\t\u003d \u0022test/topic\u0022;\n+\t\t\tpub_param.topic_len \u003d (uint16_t)strlen(pub_param.topic);\n+\t\t\tpub_param.qos \u003d pss-\u003estate \u003d\u003d STATE_PUBLISH_QOS0 ? QOS0 : QOS1;\n+\t\t\tpub_param.payload_len \u003d TEST_STRING_LEN;\n+\n+\t\t\t/* We send the message out 300 bytes or less at at time */\n+\n+\t\t\tchunk \u003d 300;\n+\n+\t\t\tif (chunk \u003e TEST_STRING_LEN - pss-\u003epos)\n+\t\t\t\tchunk \u003d TEST_STRING_LEN - pss-\u003epos;\n+\n+\t\t\tif (lws_mqtt_client_send_publish(wsi, \u0026pub_param,\n+\t\t\t\t\ttest_string + pss-\u003epos, (uint32_t)chunk,\n+\t\t\t\t\t(pss-\u003epos + chunk \u003d\u003d TEST_STRING_LEN)))\n+\t\t\t\treturn -1;\n+\n+\t\t\tpss-\u003epos +\u003d chunk;\n+\n+\t\t\tif (pss-\u003epos \u003d\u003d TEST_STRING_LEN) {\n+\t\t\t\tpss-\u003epos \u003d 0;\n+\t\t\t\tpss-\u003estate++;\n+\t\t\t}\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\treturn 0;\n+\n+\tcase LWS_CALLBACK_MQTT_ACK:\n+\t\tlwsl_user(\u0022%s: MQTT_ACK\u005cn\u0022, __func__);\n+\t\t/*\n+\t\t * We can forget about the message we just sent, it's done.\n+\t\t *\n+\t\t * For our test, that's the indication we can close the wsi.\n+\t\t */\n+\n+\t\tpss-\u003estate++;\n+\t\tif (pss-\u003estate !\u003d STATE_TEST_FINISH)\n+\t\t\tbreak;\n+\n+\t\t/* Oh we are done then */\n+\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_RESEND:\n+\t\tlwsl_user(\u0022%s: MQTT_RESEND\u005cn\u0022, __func__);\n+\t\t/*\n+\t\t * We must resend the packet ID mentioned in len\n+\t\t */\n+\t\tif (++pss-\u003eretries \u003d\u003d 3) {\n+\t\t\tinterrupted \u003d 1;\n+\t\t\tbreak;\n+\t\t}\n+\t\tpss-\u003estate--;\n+\t\tpss-\u003epos \u003d 0;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_MQTT_CLIENT_RX:\n+\t\tlwsl_user(\u0022%s: MQTT_CLIENT_RX\u005cn\u0022, __func__);\n+\n+\t\tpub \u003d (lws_mqtt_publish_param_t *)in;\n+\t\tassert(pub);\n+\n+\t\tlwsl_hexdump_notice(pub-\u003etopic, pub-\u003etopic_len);\n+\t\tlwsl_hexdump_notice(pub-\u003epayload, pub-\u003epayload_len);\n+\n+\t\treturn 0;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t.name\t\t\t\u003d \u0022mqtt\u0022,\n+\t\t.callback\t\t\u003d callback_mqtt,\n+\t\t.per_session_data_size\t\u003d sizeof(struct pss)\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+int main(int argc, const char **argv)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t\t system_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tdo_ssl \u003d !!lws_cmdline_option(argc, argv, \u0022-s\u0022);\n+\tif (do_ssl)\n+\t\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\tlwsl_user(\u0022LWS minimal MQTT client %s [-d\u003cverbosity\u003e][-s]\u005cn\u0022,\n+\t\t\tdo_ssl ? \u0022tls enabled\u0022: \u0022unencrypted\u0022);\n+\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.register_notifier_list \u003d na;\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\tinfo.retry_and_idle_policy \u003d \u0026retry;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./mosq-ca.crt\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* Event loop */\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\tlws_context_destroy(context);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-ca.crt b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-ca.crt\nnew file mode 100644\nindex 0000000..ee3d976\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-ca.crt\n@@ -0,0 +1,22 @@\n+-----BEGIN CERTIFICATE-----\n+MIIDjzCCAnegAwIBAgIUAVMnfaOq8yiLnvIB/obE689mulMwDQYJKoZIhvcNAQEL\n+BQAwVjELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UE\n+CgwTRGVmYXVsdCBDb21wYW55IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTE5\n+MTEyMDA1NTYyNFoYDzIxMTkxMDI3MDU1NjI0WjBWMQswCQYDVQQGEwJYWDEVMBMG\n+A1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRk\n+MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\n+AoIBAQCyw+kBLg9lCGlBceil0lNqgh7fyguin8IFm5X60bfSJ/pV6i8dZZplVjE+\n+g75iFEFBYyfn+6bOPdinfQ7Uu+l6t6y2HWbK6MkoypF/g7cdtUFy9s4cUX0467BZ\n+hMPJUc4UfnD+bYcXoguPJ6/OH84+Ayg6uvm5nJ32pDiXr6gMd5YljdXaJpCeeh4w\n+O2UBD1HffyPIklIPT59lxv2ZvKnZbE4UE1uaLLvTWiT+X+gA3i0Syxkq5RlZ61DE\n+3MyIYAUVSf3coNXCSdJ9wrOsGoP+X+T+aDjnFCCnqus3QX3JOHTKf4+tBoF65cNP\n+mnHXb5/ZQCcR9HMofacalMpjiGb7AgMBAAGjUzBRMB0GA1UdDgQWBBTl3poLE/22\n+R4RXTMoXPHMlc3QRjzAfBgNVHSMEGDAWgBTl3poLE/22R4RXTMoXPHMlc3QRjzAP\n+BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCwWVnNjKRH9CCBv3yT\n+Djah51q3NH3E+f1IcBZz2c5WbJHxEtP4QC57ou2x3hC7Cur9iOqIO57VW8vnFP2Y\n+bD9oHb46grsGhwuaSuA2AlFZ5EuUAe2cgEj5/3Ihd3HYsXN3rfRO1PVGN1iRG1sE\n+xAxENNm6nOS1Ht1Zy5YmMiSPzghcsTnpg44AqsmowbIED75EpumLwY2NbAl9/7JL\n+EJil3cxEZ8rl2DVWPU3hAwrOfhl/rkQTCcigyPvZvAqsJ9vYhZftrF6njUsqr5kL\n+KHENu5ySKPNk5gFR17WjWoqT6iEOZN25qyfFhBRzjpCX6zD1gx0sYcVryCnTH5Y4\n+Drjh\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.crt b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.crt\nnew file mode 100644\nindex 0000000..46952b5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.crt\n@@ -0,0 +1,20 @@\n+-----BEGIN CERTIFICATE-----\n+MIIDNTCCAh0CFFu5XIMrh5gPYnjTr8UrXA3UiWqHMA0GCSqGSIb3DQEBCwUAMFYx\n+CzAJBgNVBAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0Rl\n+ZmF1bHQgQ29tcGFueSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAgFw0xOTExMjAw\n+NTU4NTdaGA8yMTE5MTAyNzA1NTg1N1owVjELMAkGA1UEBhMCWFgxFTATBgNVBAcM\n+DERlZmF1bHQgQ2l0eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDESMBAG\n+A1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n+tldZ5yGrBsLR/7G4b48pwQSSG6fp4egiZdeFV7SRNfbMzpuIDlFdZM9zdcoQQrTl\n+24aVIGwkvfsMD33Hb/D1WW+r8UFnq4CutigwXArXUxoFX6fa0rwEEjuxwG3f7+xm\n+vb6p/KXomyWcdAUmAvALaDXIUDEc3tH+Hxik5z36YjIqRjH16jhhs/6T8B3xAWuR\n+jnDknJWv36QruMIyPUqYYkl2zl4VXUKBgWZr31Opm08kb/FrWJ6lQ7912jZC8G2L\n+rtwZJB/1psBrX3Oj/Quj+BWHmzkosqVae2G5zAhphZ2NMrdSVfxdctNmakH8oTwf\n+hRas8DE2olW3whUkfKG2DQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAKEQ7LpPdU\n+XbJKushJ7wmuljQn3pmW9SjzFMlL9o59KLHWAmxzTDaAm6r3SGgHeSz3ZLwqtJ8I\n+7pCxQxI6V1ySMkWI1mfi4KPSavxBRaST4o8+YIKJt4c5aLB1seHoghx3Q/jXEGEB\n+9dFyLMK6u3EhYSletQNeMVGaeK1q/nVZdHNk4LXVIHsXnKlxyMnW3v18iaV3ZhVd\n+doAWMpnbY91AyCXjOmQrfQaHLL6n3r1Xk2L+cRO3nSor54UIXqIJxHZtj+ZYOy3Z\n+C5AkQ1yyTTOtEz9WB0Bk2O4ZfNgJO+1MbQSfL0m0YKpuaFnMHD9g5ufUlJGR2aMI\n+nw1F/oGZoNUl\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.key b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.key\nnew file mode 100644\nindex 0000000..255528d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.key\n@@ -0,0 +1,27 @@\n+-----BEGIN RSA PRIVATE KEY-----\n+MIIEpQIBAAKCAQEAtldZ5yGrBsLR/7G4b48pwQSSG6fp4egiZdeFV7SRNfbMzpuI\n+DlFdZM9zdcoQQrTl24aVIGwkvfsMD33Hb/D1WW+r8UFnq4CutigwXArXUxoFX6fa\n+0rwEEjuxwG3f7+xmvb6p/KXomyWcdAUmAvALaDXIUDEc3tH+Hxik5z36YjIqRjH1\n+6jhhs/6T8B3xAWuRjnDknJWv36QruMIyPUqYYkl2zl4VXUKBgWZr31Opm08kb/Fr\n+WJ6lQ7912jZC8G2LrtwZJB/1psBrX3Oj/Quj+BWHmzkosqVae2G5zAhphZ2NMrdS\n+VfxdctNmakH8oTwfhRas8DE2olW3whUkfKG2DQIDAQABAoIBACMctwc3CIQIx/+A\n+7Y8t9lBg3PHOZ89EsDsEQX0eHEhT+iRe9tgq+t0KxaUNAAyYYRrg056mtHyQ90WU\n+Zu87a0OJqYaPnbL82KfjHUzcGZK7FAXTgOPLqM0KCbSQc+rzjuVC7eDk4eHeYD5H\n+L4apSskKckRe8LxHm7PJPxf4a1q1EuMEfAyJhh7Tot0oVsG/wABGFUuJVJWXnec1\n+0ukPowKh9bg7UyEecwyeYGzXqNqvbjhS3J0dBkjG5vfxuVHae2yIeXk6ZNsCw6tO\n+K8bklmsmbWAFR5SKpsNve8X/6nlclP0taDDZsz0KSbxJEd2DuRhFcdiRWEoryZVp\n+7DOORFECgYEA5sdsRjQoHaU85QZuM7ff6NpNT7kMIJbjHRdiauEBakLHs8yVLNEp\n+Vvg5fcZY4PumqPKyGEjUD6DenlLvb4OBGqzKGGhAJaLz9cpVoWWPz8y1NRBfPjlB\n+FQdB4GdtBQGXwnZoD9kXPjYHlk4nwZZ/Sitm2w6RibiIxE0adnwLhP8CgYEAykTE\n+5NZ88OGGf0RWUt54OxTl4fChAcvK93KkdlK9nbokXHs7VIl4QpKPFu1nuMDrkVI4\n+fVYwRDcZUjyxqbpBSf/M6T/kuEsMWBYYGv5c9/U87y0UWHbphN0TSdML2DJp9BTy\n+uy4RleQovof2kOr6sOsKP8lhBGSlhXyJDKn1iPMCgYEAnpvc7HsYPxe7vGQpBV6Q\n+g0bV777seNF7EhlqSK6P/GodOpOWyxCN6vn6+ViC6U3Lgz4Z7NrQ9FTJ6+JwMSIe\n+byjmVNQBklxmcz02kRBuQJEe0XOJIgjTlBJC0moC4Xfwx3P9nTbE5LrZiBH6/O/k\n+WCNwM4nVuOOdC906HMiwWh0CgYEAqn3m3ODydXQTk2i9vqIpA9vsnVLf1Ay8a3El\n+sVqy26VQCugQrYQmay7wD6pS2Ec9CMQeO3+PtaAf5tKkCmWlrMNCLIWfu7v+jq0o\n+6m/nW1ZKY2xDDwJEeaqDHKIZBMYRyxxxMVd2mTq1IUynh6WZY9DqVbPf4/0WC/tZ\n+5ePIxAMCgYEAwwBNT2xjG1mWD4eANvKjQgrsxKFttmaXXCiixZJR+tsQc5bff5Yb\n+IgvvkIwLHoNpL2Nk7sEjS4sUtAKwzCtIMwvPnhQedICnOEteZ8NPfaFmPewcovcL\n+gv9k+mFActZ7H8i9FXLrZHyEzOXZaM/vY/mHbrlJSWnSDZsvnVzQv+o\u003d\n+-----END RSA PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/raw/README.md b/minimal-examples-lowlevel/raw/README.md\nnew file mode 100644\nindex 0000000..ea3bd7a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/README.md\n@@ -0,0 +1,11 @@\n+|name|demonstrates|\n+---|---\n+minimal-raw-adopt-tcp|Shows how to have lws adopt an existing tcp socket something else had connected\n+minimal-raw-adopt-udp|Shows how to create a udp socket and read and write on it\n+minimal-raw-fallback-http|Shows how to run a normal http(s) server that falls back to a specified role + protocol\n+minimal-raw-file|Shows how to adopt a file descriptor (device node, fifo, file, etc) into the lws event loop and handle events\n+minimal-raw-netcat|Writes stdin to a remote server and prints results on stdout\n+minimal-raw-proxy-fallback|Shows how to run a normal http(s) server that falls back to a proxied connection to a specified IP and port\n+minimal-raw-proxy|Shows how to set up a vhost so it listens for connections and proxies them to a specified IP and port\n+minimal-raw-vhost|Shows how to set up a vhost that listens and accepts RAW socket connections\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..ec79159\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-minimal-raw-adopt-tcp C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-adopt-tcp)\n+set(SRCS minimal-raw-adopt-tcp.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/README.md b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/README.md\nnew file mode 100644\nindex 0000000..605c722\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/README.md\n@@ -0,0 +1,57 @@\n+# lws minimal ws server raw adopt tcp\n+\n+This example is only meaningful if you are integrating lws in another\n+app which generates its own connected sockets. In some cases you may\n+want lws to \u0022adopt\u0022 the socket.\n+\n+(If you simply want a connected client raw socket using lws alone, you\n+can just use lws_client_connect_via_info() with info.method \u003d \u0022RAW\u0022.\n+http-client/minimal-http-client shows how to do that, just set\n+info.method to \u0022RAW\u0022.)\n+\n+This example demonstrates how to adopt a foreign, connected socket into lws\n+as a raw wsi, bound to a specific lws protocol.\n+\n+The example connects a socket itself to libwebsockets.org:80, and then\n+has lws adopt it as a raw wsi. The lws protocol writes \u0022GET / HTTP/1.1\u0022\n+to the socket and hexdumps what was sent back.\n+\n+The socket won't close until the server side times it out, since it's\n+a raw socket that doesn't understand it's looking at http.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-raw-adopt-tcp\n+[2018/03/23 09:03:57:1960] USER: LWS minimal raw adopt tcp\n+[2018/03/23 09:03:57:1961] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/23 09:03:57:2079] USER: Starting connect...\n+[2018/03/23 09:03:57:4963] USER: Connected...\n+[2018/03/23 09:03:57:4963] USER: LWS_CALLBACK_RAW_ADOPT\n+[2018/03/23 09:03:57:7842] USER: LWS_CALLBACK_RAW_RX (186)\n+[2018/03/23 09:03:57:7842] NOTICE: \n+[2018/03/23 09:03:57:7842] NOTICE: 0000: 48 54 54 50 2F 31 2E 31 20 33 30 31 20 52 65 64 HTTP/1.1 301 Red\n+[2018/03/23 09:03:57:7842] NOTICE: 0010: 69 72 65 63 74 0D 0A 73 65 72 76 65 72 3A 20 6C irect..server: l\n+[2018/03/23 09:03:57:7842] NOTICE: 0020: 77 73 77 73 0D 0A 53 74 72 69 63 74 2D 54 72 61 wsws..Strict-Tra\n+[2018/03/23 09:03:57:7843] NOTICE: 0030: 6E 73 70 6F 72 74 2D 53 65 63 75 72 69 74 79 3A nsport-Security:\n+[2018/03/23 09:03:57:7843] NOTICE: 0040: 20 6D 61 78 2D 61 67 65 3D 31 35 37 36 38 30 30 max-age\u003d1576800\n+[2018/03/23 09:03:57:7843] NOTICE: 0050: 30 20 3B 20 69 6E 63 6C 75 64 65 53 75 62 44 6F 0 ; includeSubDo\n+[2018/03/23 09:03:57:7843] NOTICE: 0060: 6D 61 69 6E 73 0D 0A 6C 6F 63 61 74 69 6F 6E 3A mains..location:\n+[2018/03/23 09:03:57:7843] NOTICE: 0070: 20 68 74 74 70 73 3A 2F 2F 6C 69 62 77 65 62 73 https://libwebs\n+[2018/03/23 09:03:57:7843] NOTICE: 0080: 6F 63 6B 65 74 73 2E 6F 72 67 0D 0A 63 6F 6E 74 ockets.org..cont\n+[2018/03/23 09:03:57:7843] NOTICE: 0090: 65 6E 74 2D 74 79 70 65 3A 20 74 65 78 74 2F 68 ent-type: text/h\n+[2018/03/23 09:03:57:7843] NOTICE: 00A0: 74 6D 6C 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E tml..content-len\n+[2018/03/23 09:03:57:7843] NOTICE: 00B0: 67 74 68 3A 20 30 0D 0A 0D 0A gth: 0.... \n+[2018/03/23 09:03:57:7843] NOTICE: \n+[2018/03/23 09:04:03:3627] USER: LWS_CALLBACK_RAW_CLOSE\n+\n+```\n+\n+Note the example does everything itself, after 5s idle the remote server closes the connection\n+after which the example continues until you ^C it.\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/minimal-raw-adopt-tcp.c b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/minimal-raw-adopt-tcp.c\nnew file mode 100644\nindex 0000000..a3ff2be\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/minimal-raw-adopt-tcp.c\n@@ -0,0 +1,190 @@\n+/*\n+ * lws-minimal-raw-adopt-tcp\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates integrating somebody else's connected tcp\n+ * socket into the lws event loop as a RAW wsi. It's interesting in\n+ * the kind of situation where you already have a connected socket\n+ * in your application, and you need to hand it over to lws to deal with.\n+ *\n+ * Lws supports \u0022adopting\u0022 these foreign sockets.\n+ *\n+ * If you simply want a connected client raw socket using lws alone, you\n+ * can just use lws_client_connect_via_info() with info.method \u003d \u0022RAW\u0022.\n+ *\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if !defined(WIN32)\n+#include \u003csys/socket.h\u003e\n+#include \u003cnetinet/in.h\u003e\n+#include \u003cnetdb.h\u003e\n+#include \u003carpa/inet.h\u003e\n+#endif\n+#include \u003csys/types.h\u003e\n+#include \u003cstdio.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdlib.h\u003e\n+#if !defined(WIN32)\n+#include \u003cunistd.h\u003e\n+#endif\n+#include \u003cerrno.h\u003e\n+\n+static int\n+callback_raw_test(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\n+\tswitch (reason) {\n+\n+\t/* callbacks related to raw socket descriptor */\n+\n+ case LWS_CALLBACK_RAW_ADOPT:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_ADOPT\u005cn\u0022);\n+\t\tlws_callback_on_writable(wsi);\n+ break;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_CLOSE\u005cn\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_RX (%d)\u005cn\u0022, (int)len);\n+\t\tlwsl_hexdump_level(LLL_NOTICE, in, len);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_WRITEABLE:\n+\t\tif (lws_write(wsi,\n+\t\t\t (uint8_t *)\u0022GET / HTTP/1.1\u005cxd\u005cxa\u005cxd\u005cxa\u0022, 18,\n+\t\t\t LWS_WRITE_RAW) !\u003d 18) {\n+\t\t\tlwsl_notice(\u0022%s: raw write failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022raw-test\u0022, callback_raw_test, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tlws_sock_file_fd_type sock;\n+\tstruct addrinfo h, *r, *rp;\n+\tstruct lws_vhost *vhost;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw adopt tcp\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN_SERVER;\n+\tinfo.protocols \u003d protocols;\n+\n+\tvhost \u003d lws_create_vhost(context, \u0026info);\n+\tif (!vhost) {\n+\t\tlwsl_err(\u0022lws vhost creation failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * Connect our own \u0022foreign\u0022 socket to libwebsockets.org:80\n+\t *\n+\t * Normally you would do this with lws_client_connect_via_info() inside\n+\t * the lws event loop, hiding all this detail. But this example\n+\t * demonstrates how to integrate an externally-connected \u0022foreign\u0022\n+\t * socket, so we create one by hand.\n+\t */\n+\n+\tmemset(\u0026h, 0, sizeof(h));\n+\th.ai_family \u003d AF_UNSPEC; /* Allow IPv4 or IPv6 */\n+\th.ai_socktype \u003d SOCK_STREAM;\n+\th.ai_protocol \u003d IPPROTO_TCP;\n+\n+\tn \u003d getaddrinfo(\u0022libwebsockets.org\u0022, \u002280\u0022, \u0026h, \u0026r);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: problem resolving libwebsockets.org: %s\u005cn\u0022, __func__, gai_strerror(n));\n+\t\treturn 1;\n+\t}\n+\n+\tfor (rp \u003d r; rp; rp \u003d rp-\u003eai_next) {\n+\t\tsock.sockfd \u003d socket(rp-\u003eai_family, rp-\u003eai_socktype, rp-\u003eai_protocol);\n+\t\tif (sock.sockfd !\u003d LWS_SOCK_INVALID)\n+\t\t\tbreak;\n+\t}\n+\tif (!rp) {\n+\t\tlwsl_err(\u0022%s: unable to create INET socket\u005cn\u0022, __func__);\n+\t\tfreeaddrinfo(r);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tlwsl_user(\u0022Starting connect...\u005cn\u0022);\n+\tif (connect(sock.sockfd, rp-\u003eai_addr, sizeof(*rp-\u003eai_addr)) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: unable to connect to libwebsockets.org:80\u005cn\u0022, __func__);\n+\t\tfreeaddrinfo(r);\n+\t\treturn 1;\n+\t}\n+\n+\tfreeaddrinfo(r);\n+\tsignal(SIGINT, sigint_handler);\n+\tlwsl_user(\u0022Connected...\u005cn\u0022);\n+\n+\t/* our foreign socket is connected... adopt it into lws */\n+\n+\tif (!lws_adopt_descriptor_vhost(vhost, LWS_ADOPT_SOCKET, sock,\n+\t\t\t\t protocols[0].name, NULL)) {\n+\t\tlwsl_err(\u0022%s: foreign socket adoption failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..84f8cd4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-raw-adopt-udp C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-adopt-udp)\n+set(SRCS minimal-raw-adopt-udp.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_UDP 1 requirements)\n+\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/README.md b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/README.md\nnew file mode 100644\nindex 0000000..edaf8d2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/README.md\n@@ -0,0 +1,49 @@\n+# lws minimal ws server raw adopt udp\n+\n+This example demonstrates echoing packets on a UDP socket in lws.\n+\n+A \u0022foreign\u0022 UDP socket is created, bound (so it can \u0022listen\u0022), and\n+adopted into lws event loop. It acts like a tcp RAW mode connection in\n+lws and uses the same callbacks.\n+\n+Writing is a bit different for UDP. By default, the system has no\n+idea about the receiver state and so asking for a callback_on_writable()\n+always believes that the socket is writeable... the callback will\n+happen next time around the event loop if there are no pending partials.\n+\n+With UDP, there is no \u0022connection\u0022. You need to write with sendto() and\n+direct the packets to a specific destination. You can learn the source\n+of the last packet that arrived at the LWS_CALLBACK_RAW_RX callback by\n+getting a `struct lws_udp *` from `lws_get_udp(wsi)`. To be able to\n+send back to that guy, you should take a copy of the `struct lws_udp *` and\n+use the .sa and .salen members in your sendto().\n+\n+However the kernel may not accept to buffer / write everything you wanted to send.\n+So you are responsible to watch the result of sendto() and resend the\n+unsent part next time.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-raw-adopt-udp\n+$ ./lws-minimal-raw-adopt-udp \n+[2018/03/24 08:12:37:8869] USER: LWS minimal raw adopt udp | nc -u 127.0.0.1 7681\n+[2018/03/24 08:12:37:8870] NOTICE: Creating Vhost 'default' (no listener), 1 protocols, IPv6 off\n+[2018/03/24 08:12:37:8878] USER: LWS_CALLBACK_RAW_ADOPT\n+[2018/03/24 08:12:41:5656] USER: LWS_CALLBACK_RAW_RX (6)\n+[2018/03/24 08:12:41:5656] NOTICE: \n+[2018/03/24 08:12:41:5656] NOTICE: 0000: 68 65 6C 6C 6F 0A hello. \n+[2018/03/24 08:12:41:5656] NOTICE: \n+```\n+\n+```\n+ $ nc -u 127.0.0.1 7681\n+hello\n+hello\n+```\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/minimal-raw-adopt-udp.c b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/minimal-raw-adopt-udp.c\nnew file mode 100644\nindex 0000000..a2a7489\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/minimal-raw-adopt-udp.c\n@@ -0,0 +1,198 @@\n+/*\n+ * lws-minimal-raw-adopt-udp\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates integrating a connected udp\n+ * socket into the lws event loop as a RAW wsi. It's interesting in\n+ * the kind of situation where you already have a connected socket\n+ * in your application, and you need to hand it over to lws to deal with.\n+ *\n+ * Lws supports \u0022adopting\u0022 these foreign sockets, and also has a helper API\n+ * to create, bind, and adopt them inside lws.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if !defined(WIN32)\n+#include \u003csys/socket.h\u003e\n+#include \u003cnetinet/in.h\u003e\n+#include \u003cnetdb.h\u003e\n+#include \u003carpa/inet.h\u003e\n+#endif\n+#include \u003csys/types.h\u003e\n+#include \u003cstdio.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdlib.h\u003e\n+#if !defined(WIN32)\n+#include \u003cunistd.h\u003e\n+#endif\n+#include \u003cerrno.h\u003e\n+\n+static uint8_t sendbuf[4096];\n+static size_t sendlen;\n+struct lws_udp udp;\n+\n+static int\n+callback_raw_test(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tssize_t n;\n+\tlws_sockfd_type fd;\n+\n+\tswitch (reason) {\n+\n+\t/* callbacks related to raw socket descriptor */\n+\n+ case LWS_CALLBACK_RAW_ADOPT:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_ADOPT\u005cn\u0022);\n+ break;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_CLOSE\u005cn\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_RX (%d)\u005cn\u0022, (int)len);\n+\t\tlwsl_hexdump_level(LLL_NOTICE, in, len);\n+\t\t/*\n+\t\t * Take a copy of the buffer and the source socket address...\n+\t\t */\n+\t\tudp \u003d *(lws_get_udp(wsi));\n+\t\tsendlen \u003d len;\n+\t\tif (sendlen \u003e sizeof(sendbuf))\n+\t\t\tsendlen \u003d sizeof(sendbuf);\n+\t\tmemcpy(sendbuf, in, sendlen);\n+\t\t/*\n+\t\t * ... and we send it next time around the event loop. This\n+\t\t * can be extended to having a ringbuffer of different send\n+\t\t * buffers and targets queued.\n+\t\t *\n+\t\t * Note that UDP is ALWAYS writable as far as poll() knows\n+\t\t * because there is no mechanism like the tcp window to\n+\t\t * understand that packets are not being acknowledged. But\n+\t\t * this allows the event loop to share out the work.\n+\t\t */\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_WRITEABLE:\n+\n+\t\tif (!sendlen)\n+\t\t\tbreak;\n+\n+\t\tfd \u003d lws_get_socket_fd(wsi);\n+#if defined(WIN32)\n+\t\tif ((int)fd \u003c 0)\n+\t\t\tbreak;\n+#else\n+\t\tif (fd \u003c 0) /* keep Coverity happy: actually it cannot be \u003c 0 */\n+\t\t\tbreak;\n+#endif\n+\n+\t\t/*\n+\t\t * We can write directly on the UDP socket, specifying\n+\t\t * the peer the write is directed to.\n+\t\t *\n+\t\t * However the kernel may only accept parts of large sendto()s,\n+\t\t * leaving you to try to resend the remainder later. However\n+\t\t * depending on how your protocol on top of UDP works, that\n+\t\t * may involve sticking new headers before the remainder.\n+\t\t *\n+\t\t * For clarity partial sends just drop the remainder here.\n+\t\t */\n+\t\tn \u003d sendto(fd,\n+#if defined(WIN32)\n+\t\t\t\t(const char *)\n+#endif\n+\t\t\tsendbuf,\n+#if defined(WIN32)\n+\t\t\t(int)\n+#endif\n+\t\t\tsendlen, 0, sa46_sockaddr(\u0026udp.sa46),\n+\t\t\tsa46_socklen(\u0026udp.sa46));\n+\t\tif (n \u003c (ssize_t)len)\n+\t\t\tlwsl_notice(\u0022%s: send returned %d\u005cn\u0022, __func__, (int)n);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022raw-test\u0022, callback_raw_test, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw adopt udp | nc -u 127.0.0.1 7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN_SERVER;\n+\tinfo.protocols \u003d protocols;\n+\n+\tvhost \u003d lws_create_vhost(context, \u0026info);\n+\tif (!vhost) {\n+\t\tlwsl_err(\u0022lws vhost creation failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * Create our own \u0022foreign\u0022 UDP socket bound to 7681/udp\n+\t */\n+\tif (!lws_create_adopt_udp(vhost, NULL, 7681, LWS_CAUDP_BIND,\n+\t\t\t\t protocols[0].name, NULL, NULL, NULL, NULL,\n+\t\t\t\t \u0022user\u0022)) {\n+\t\tlwsl_err(\u0022%s: foreign socket adoption failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-audio/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-audio/CMakeLists.txt\nnew file mode 100644\nindex 0000000..21361e7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-audio/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-raw-audio C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-audio)\n+set(SRCS audio.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_ALSA 1 requirements)\n+require_lws_config(LWS_WITH_NETWORK 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared asound ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets asound ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-audio/README.md b/minimal-examples-lowlevel/raw/minimal-raw-audio/README.md\nnew file mode 100644\nindex 0000000..8d54b8f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-audio/README.md\n@@ -0,0 +1,37 @@\n+# lws minimal raw audio\n+\n+This demonstrates operating ALSA playback and capture using the lws event loop\n+via raw file descriptors.\n+\n+You need the lws cmake option `-DLWS_WITH_ALSA\u003d1`\n+\n+This example opens the default ALSA playback and capture devices and pipes the\n+capture data into the playback with something over 1s delay via a ringbuffer.\n+\n+ALSA doesn't really lend itself to direct use with event loops... this example\n+uses the capture channel which does create POLLIN normally as the timesource\n+for the playback as well; they're both set to 16000Hz sample rate.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-raw-audio\n+[2019/10/14 18:58:49:3288] U: LWS minimal raw audio\n+[2019/10/14 18:58:50:3438] N: LWS_CALLBACK_RAW_ADOPT_FILE\n+[2019/10/14 18:58:50:3455] N: LWS_CALLBACK_RAW_ADOPT_FILE\n+[2019/10/14 18:58:50:4764] N: LWS_CALLBACK_RAW_RX_FILE: 2062 samples\n+[2019/10/14 18:58:50:6132] N: LWS_CALLBACK_RAW_RX_FILE: 2205 samples\n+[2019/10/14 18:58:50:7592] N: LWS_CALLBACK_RAW_RX_FILE: 2328 samples\n+...\n+^C[2019/10/14 18:58:56:8460] N: LWS_CALLBACK_RAW_CLOSE_FILE\n+[2019/10/14 18:58:56:8461] N: LWS_CALLBACK_RAW_CLOSE_FILE\n+[2019/10/14 18:58:56:8461] N: LWS_CALLBACK_PROTOCOL_DESTROY\n+$\n+\n+```\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-audio/audio.c b/minimal-examples-lowlevel/raw/minimal-raw-audio/audio.c\nnew file mode 100644\nindex 0000000..6b59539\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-audio/audio.c\n@@ -0,0 +1,211 @@\n+/*\n+ * lws-minimal-raw-audio\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates adopting and managing audio device file descriptors in the\n+ * event loop.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003csys/stat.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+#include \u003calsa/asoundlib.h\u003e\n+\n+static unsigned int sample_rate \u003d 16000;\n+\n+struct raw_vhd {\n+\tuint8_t simplebuf[32768 * 2];\n+\tsnd_pcm_t *pcm_capture;\n+\tsnd_pcm_t *pcm_playback;\n+\tsnd_pcm_hw_params_t *params;\n+\tsnd_pcm_uframes_t frames;\n+\tint filefd;\n+\tint rpos;\n+\tint wpos;\n+\tint times;\n+};\n+\n+static int\n+set_hw_params(struct lws_vhost *vh, snd_pcm_t **pcm, int type)\n+{\n+\tunsigned int rate \u003d sample_rate;\n+\tsnd_pcm_hw_params_t *params;\n+\tlws_sock_file_fd_type u;\n+\tstruct pollfd pfd;\n+\tstruct lws *wsi1;\n+\tint n;\n+\n+\tn \u003d snd_pcm_open(pcm, \u0022default\u0022, type, SND_PCM_NONBLOCK);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: Can't open default for playback: %s\u005cn\u0022,\n+\t\t\t __func__, snd_strerror(n));\n+\n+\t\treturn -1;\n+\t}\n+\n+\tif (snd_pcm_poll_descriptors(*pcm, \u0026pfd, 1) !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: failed to get playback desc\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tu.filefd \u003d (lws_filefd_type)(long long)pfd.fd;\n+\twsi1 \u003d lws_adopt_descriptor_vhost(vh, LWS_ADOPT_RAW_FILE_DESC, u,\n+\t\t\t\t\t \u0022lws-audio-test\u0022, NULL);\n+\tif (!wsi1) {\n+\t\tlwsl_err(\u0022%s: Failed to adopt playback desc\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\tif (type \u003d\u003d SND_PCM_STREAM_PLAYBACK)\n+\t\tlws_rx_flow_control(wsi1, 0); /* no POLLIN */\n+\n+\tsnd_pcm_hw_params_malloc(\u0026params);\n+\tsnd_pcm_hw_params_any(*pcm, params);\n+\n+\tn \u003d snd_pcm_hw_params_set_access(*pcm, params,\n+\t\t\t\t\t SND_PCM_ACCESS_RW_INTERLEAVED);\n+\tif (n \u003c 0)\n+\t\tgoto bail1;\n+\n+\tn \u003d snd_pcm_hw_params_set_format(*pcm, params, SND_PCM_FORMAT_S16_LE);\n+\tif (n \u003c 0)\n+\t\tgoto bail1;\n+\n+\tn \u003d snd_pcm_hw_params_set_channels(*pcm, params, 1);\n+\tif (n \u003c 0)\n+\t\tgoto bail1;\n+\n+\tn \u003d snd_pcm_hw_params_set_rate_near(*pcm, params, \u0026rate, 0);\n+\tif (n \u003c 0)\n+\t\tgoto bail1;\n+\n+\tn \u003d snd_pcm_hw_params(*pcm, params);\n+\tsnd_pcm_hw_params_free(params);\n+\tif (n \u003c 0)\n+\t\tgoto bail;\n+\n+\treturn 0;\n+\n+bail1:\n+\tsnd_pcm_hw_params_free(params);\n+bail:\n+\tlwsl_err(\u0022%s: Set hw params failed: %s\u005cn\u0022, __func__, snd_strerror(n));\n+\n+\treturn -1;\n+}\n+\n+static int\n+callback_raw_test(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct raw_vhd *vhd \u003d (struct raw_vhd *)lws_protocol_vh_priv_get(\n+\t\t\t\t lws_get_vhost(wsi), lws_get_protocol(wsi));\n+\tint n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi), sizeof(struct raw_vhd));\n+\n+\t\tif (set_hw_params(lws_get_vhost(wsi), \u0026vhd-\u003epcm_playback,\n+\t\t\t\t SND_PCM_STREAM_PLAYBACK)) {\n+\t\t\tlwsl_err(\u0022%s: Can't open default for playback\u005cn\u0022,\n+\t\t\t\t __func__);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tif (set_hw_params(lws_get_vhost(wsi), \u0026vhd-\u003epcm_capture,\n+\t\t\t\t SND_PCM_STREAM_CAPTURE)) {\n+\t\t\tlwsl_err(\u0022%s: Can't open default for capture\u005cn\u0022,\n+\t\t\t\t __func__);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_PROTOCOL_DESTROY\u005cn\u0022);\n+\t\tif (vhd \u0026\u0026 vhd-\u003epcm_playback) {\n+\t\t\tsnd_pcm_drain(vhd-\u003epcm_playback);\n+\t\t\tsnd_pcm_close(vhd-\u003epcm_playback);\n+\t\t\tvhd-\u003epcm_playback \u003d NULL;\n+\t\t}\n+\t\tif (vhd \u0026\u0026 vhd-\u003epcm_capture) {\n+\t\t\tsnd_pcm_close(vhd-\u003epcm_capture);\n+\t\t\tvhd-\u003epcm_capture \u003d NULL;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX_FILE:\n+\t\tif (vhd-\u003etimes \u003e\u003d 6) { /* delay amount decided by this */\n+\t\t\tn \u003d snd_pcm_writei(vhd-\u003epcm_playback,\n+\t\t\t\t\t \u0026vhd-\u003esimplebuf[vhd-\u003erpos],\n+\t\t\t\t\t ((vhd-\u003ewpos - vhd-\u003erpos) \u0026\n+\t\t\t\t\t (sizeof(vhd-\u003esimplebuf) - 1)) / 2);\n+\t\t\tvhd-\u003erpos \u003d (vhd-\u003erpos + (n * 2)) \u0026\n+\t\t\t\t\t(sizeof(vhd-\u003esimplebuf) - 1);\n+\t\t}\n+\n+\t\tn \u003d snd_pcm_readi(vhd-\u003epcm_capture, \u0026vhd-\u003esimplebuf[vhd-\u003ewpos],\n+\t\t\t\t (sizeof(vhd-\u003esimplebuf) - vhd-\u003ewpos) / 2);\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_RX_FILE: %d samples\u005cn\u0022, n);\n+\t\tvhd-\u003etimes++;\n+\n+\t\tvhd-\u003ewpos \u003d (vhd-\u003ewpos + (n * 2)) \u0026 (sizeof(vhd-\u003esimplebuf) - 1);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022lws-audio-test\u0022, callback_raw_test, 0, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal raw audio\u005cn\u0022);\n+\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN_SERVER;\n+\tinfo.protocols \u003d protocols;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/CMakeLists.txt\nnew file mode 100644\nindex 0000000..c52810a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-raw-fallback-http-server C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-fallback-http-server)\n+set(SRCS minimal-raw-fallback-http-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/README.md b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/README.md\nnew file mode 100644\nindex 0000000..9a827c5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/README.md\n@@ -0,0 +1,41 @@\n+# lws minimal raw fallback http server\n+\n+This is the same as the minimal http server, with one difference...\n+if you connect to localhost:7681 with something that doesn't send\n+recognizable http, then the connection will be switched to a\n+raw-skt role and bind to a protocol that echoes anything sent back\n+to the sender.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-s|Configure the server for tls / https and `LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT`\n+-h|(needs -s) Configure the vhost also for `LWS_SERVER_OPTION_ALLOW_HTTP_ON_HTTPS_LISTENER`, allowing http service on tls port (caution... it's insecure then)\n+-u|(needs -s) Configure the vhost also for `LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS`, so the server issues a redirect to https to clients that attempt to connect to a server configured for tls with http.\n+\n+```\n+ $ ./lws-minimal-raw-fallback-http-server\n+[2018/11/29 14:27:34:3014] USER: LWS minimal raw fallback http server | visit http://localhost:7681\n+[2018/11/29 14:27:34:3243] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+```\n+\n+Visit http://127.0.0.1:7681\n+\n+This allows testing of various combinations of special features for unexpected\n+content on an http(s) listening socket.\n+\n+|cmdline args|http://127.0.0.1:7681|https://127.0.0.1:7681|ssh -p7681 127.0.0.1|flags|\n+|---|---|---|---|---|\n+|none|served|no tls|echos hello|LWS_SERVER_OPTION_FALLBACK_TO_APPLY_LISTEN_ACCEPT_CONFIG\n+|-s|echos http GET|served|echos hello|LWS_SERVER_OPTION_FALLBACK_TO_APPLY_LISTEN_ACCEPT_CONFIG, LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT\n+|-s -h|served|served|echos hello|LWS_SERVER_OPTION_FALLBACK_TO_APPLY_LISTEN_ACCEPT_CONFIG, LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT, LWS_SERVER_OPTION_ALLOW_HTTP_ON_HTTPS_LISTENER\n+|-s -u|redirected to https|served|echos hello|LWS_SERVER_OPTION_FALLBACK_TO_APPLY_LISTEN_ACCEPT_CONFIG, LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT, LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.cert b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.key b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/minimal-raw-fallback-http-server.c b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/minimal-raw-fallback-http-server.c\nnew file mode 100644\nindex 0000000..59f95af\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/minimal-raw-fallback-http-server.c\n@@ -0,0 +1,149 @@\n+/*\n+ * lws-minimal-raw-fallback http-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff from the subdirectory \n+ * \u0022./mount-origin\u0022 of the directory it was started in.\n+ * You can change that by changing mount.origin below.\n+ *\n+ * In addition, if the connection does to seem to be talking http, then it\n+ * falls back to a raw echo protocol.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+struct pss__raw_echo {\n+\tuint8_t buf[2048];\n+\tint len;\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+static int\n+callback_raw_echo(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t\t void *in, size_t len)\n+{\n+\tstruct pss__raw_echo *pss \u003d (struct pss__raw_echo *)user;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_RAW_ADOPT:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_ADOPT\u005cn\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_RX %ld\u005cn\u0022, (long)len);\n+\t\tif (len \u003e sizeof(pss-\u003ebuf))\n+\t\t\tlen \u003d sizeof(pss-\u003ebuf);\n+\t\tmemcpy(pss-\u003ebuf, in, len);\n+\t\tpss-\u003elen \u003d (int)len;\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_CLOSE\u005cn\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_WRITEABLE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_WRITEABLE\u005cn\u0022);\n+\t\tlws_write(wsi, pss-\u003ebuf, (unsigned int)pss-\u003elen, LWS_WRITE_HTTP);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{ \u0022raw-echo\u0022, callback_raw_echo, sizeof(struct pss__raw_echo), 2048, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw fallback http server | \u0022\n+\t\t \u0022visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE |\n+\t\tLWS_SERVER_OPTION_FALLBACK_TO_APPLY_LISTEN_ACCEPT_CONFIG;\n+\tinfo.listen_accept_role \u003d \u0022raw-skt\u0022;\n+\tinfo.listen_accept_protocol \u003d \u0022raw-echo\u0022;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t\t\tLWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-u\u0022))\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS;\n+\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-h\u0022))\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_ALLOW_HTTP_ON_HTTPS_LISTENER;\n+\t}\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/404.html b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/favicon.ico b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/index.html b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/index.html\nnew file mode 100644\nindex 0000000..573e515\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/index.html\n@@ -0,0 +1,15 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal raw fallback http server example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-file/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-file/CMakeLists.txt\nnew file mode 100644\nindex 0000000..986dc06\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-file/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-minimal-raw-file C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-file)\n+set(SRCS minimal-raw-file.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-file/README.md b/minimal-examples-lowlevel/raw/minimal-raw-file/README.md\nnew file mode 100644\nindex 0000000..47fba24\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-file/README.md\n@@ -0,0 +1,48 @@\n+# lws minimal ws server\n+\n+This demonstrates adopting a file descriptor into the lws event\n+loop. The filepath to open and adopt is given as an argument to the example app, eg\n+\n+```\n+ $ ./lws-minimal-raw-file \u003cfile\u003e\n+```\n+\n+On a Linux system, some example files for testing might be\n+\n+ - /proc/self/fd/0 (stdin)\n+ - /dev/ttyUSB0 (a USB \u003c-\u003e serial converter)\n+ - /dev/input/event\u003cn\u003e (needs root... input device events)\n+\n+The example application opens the file in the protocol init\n+handler, and hexdumps data from the file to the lws log\n+as it becomes available.\n+\n+This isn't very useful standalone as shown here for clarity, but you can\n+freely combine raw file descriptor adoption with other lws server\n+and client features.\n+\n+Becuase raw file events have their own callback reasons, the handlers can\n+be integrated in a single protocol that also handles http and ws\n+server and client callbacks without conflict.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-raw-file /proc/self/fd/0\n+[2018/03/22 10:48:53:9709] USER: LWS minimal raw file\n+[2018/03/22 10:48:53:9876] NOTICE: Creating Vhost 'default' port -2, 1 protocols, IPv6 off\n+[2018/03/22 10:48:55:0037] NOTICE: LWS_CALLBACK_RAW_ADOPT_FILE\n+\n+[2018/03/22 10:48:55:9370] NOTICE: LWS_CALLBACK_RAW_RX_FILE\n+[2018/03/22 10:48:55:9377] NOTICE: \n+[2018/03/22 10:48:55:9408] NOTICE: 0000: 0A . \n+\n+```\n+\n+The example logs above show the result of typing the Enter key.\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-file/minimal-raw-file.c b/minimal-examples-lowlevel/raw/minimal-raw-file/minimal-raw-file.c\nnew file mode 100644\nindex 0000000..7f1cb05\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-file/minimal-raw-file.c\n@@ -0,0 +1,160 @@\n+/*\n+ * lws-minimal-raw-file\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates adopting a file descriptor into the lws event\n+ * loop.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003csys/stat.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+struct raw_vhd {\n+//\tlws_sock_file_fd_type u;\n+\tint filefd;\n+};\n+\n+static char filepath[256];\n+\n+static int\n+callback_raw_test(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct raw_vhd *vhd \u003d (struct raw_vhd *)lws_protocol_vh_priv_get(\n+\t\t\t\t lws_get_vhost(wsi), lws_get_protocol(wsi));\n+\tlws_sock_file_fd_type u;\n+\tuint8_t buf[1024];\n+\tint n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi), sizeof(struct raw_vhd));\n+\t\tvhd-\u003efilefd \u003d lws_open(filepath, O_RDWR);\n+\t\tif (vhd-\u003efilefd \u003d\u003d -1) {\n+\t\t\tlwsl_err(\u0022Unable to open %s\u005cn\u0022, filepath);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\t\tu.filefd \u003d (lws_filefd_type)(long long)vhd-\u003efilefd;\n+\t\tif (!lws_adopt_descriptor_vhost(lws_get_vhost(wsi),\n+\t\t\t\t\t\tLWS_ADOPT_RAW_FILE_DESC, u,\n+\t\t\t\t\t\t\u0022raw-test\u0022, NULL)) {\n+\t\t\tlwsl_err(\u0022Failed to adopt fifo descriptor\u005cn\u0022);\n+\t\t\tclose(vhd-\u003efilefd);\n+\t\t\tvhd-\u003efilefd \u003d -1;\n+\n+\t\t\treturn 1;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tif (vhd \u0026\u0026 vhd-\u003efilefd !\u003d -1)\n+\t\t\tclose(vhd-\u003efilefd);\n+\t\tbreak;\n+\n+\t/* callbacks related to raw file descriptor */\n+\n+\tcase LWS_CALLBACK_RAW_ADOPT_FILE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_ADOPT_FILE\u005cn\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX_FILE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_RX_FILE\u005cn\u0022);\n+\t\tn \u003d (int)read(vhd-\u003efilefd, buf, sizeof(buf));\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_err(\u0022Reading from %s failed\u005cn\u0022, filepath);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\t\tlwsl_hexdump_level(LLL_NOTICE, buf, (unsigned int)n);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE_FILE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_CLOSE_FILE\u005cn\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_WRITEABLE_FILE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_WRITEABLE_FILE\u005cn\u0022);\n+\t\t/*\n+\t\t * you can call lws_callback_on_writable() on a raw file wsi as\n+\t\t * usual, and then write directly into the raw filefd here.\n+\t\t */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022raw-test\u0022, callback_raw_test, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw file\u005cn\u0022);\n+\tif (argc \u003c 2) {\n+\t\tlwsl_user(\u0022Usage: %s \u003cfile to monitor\u003e \u0022\n+\t\t\t \u0022 eg, /dev/ttyUSB0 or /dev/input/event0 or \u0022\n+\t\t\t \u0022/proc/self/fd/0\u005cn\u0022, argv[0]);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN_SERVER; /* no listen socket for demo */\n+\tinfo.protocols \u003d protocols;\n+\n+\tlws_strncpy(filepath, argv[1], sizeof(filepath));\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-netcat/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-netcat/CMakeLists.txt\nnew file mode 100644\nindex 0000000..4e4b2ba\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-netcat/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-minimal-raw-netcat C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-netcat)\n+set(SRCS minimal-raw-netcat.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-netcat/README.md b/minimal-examples-lowlevel/raw/minimal-raw-netcat/README.md\nnew file mode 100644\nindex 0000000..b50483c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-netcat/README.md\n@@ -0,0 +1,38 @@\n+# lws minimal raw netcat\n+\n+This example shows to to create a \u0022netcat\u0022 that copies its stdin to\n+a remote socket and prints what is returned in stdout.\n+\n+It has some advantage over the real netcat, it will wait 1s after stdin closes\n+to print results that are in flight.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ echo -e -n \u0022GET / http/1.1\u005cr\u005cn\u005cr\u005cn\u0022| ./lws-minimal-raw-netcat\n+[2018/05/02 08:53:53:2665] USER: LWS minimal raw netcat [--server ip] [--port port]\n+[2018/05/02 08:53:53:2667] NOTICE: Creating Vhost 'default' (no listener), 1 protocols, IPv6 off\n+[2018/05/02 08:53:53:2703] USER: Starting connect...\n+[2018/05/02 08:53:53:5644] USER: Connected to libwebsockets.org:80...\n+[2018/05/02 08:53:53:5645] USER: LWS_CALLBACK_RAW_ADOPT\n+[2018/05/02 08:53:53:5645] USER: LWS_CALLBACK_RAW_ADOPT_FILE\n+[2018/05/02 08:53:53:5646] USER: LWS_CALLBACK_RAW_RX_FILE\n+[2018/05/02 08:53:53:5646] USER: LWS_CALLBACK_RAW_CLOSE_FILE\n+[2018/05/02 08:53:53:8600] USER: LWS_CALLBACK_RAW_RX (186)\n+HTTP/1.1 301 Redirect\n+server: lwsws\n+Strict-Transport-Security: max-age\u003d15768000 ; includeSubDomains\n+location: https://libwebsockets.org\n+content-type: text/html\n+content-length: 0\n+\n+```\n+\n+Note the example does everything itself, after 5s idle the remote server closes the connection\n+after which the example continues until you ^C it.\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-netcat/minimal-raw-netcat.c b/minimal-examples-lowlevel/raw/minimal-raw-netcat/minimal-raw-netcat.c\nnew file mode 100644\nindex 0000000..13c1ead\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-netcat/minimal-raw-netcat.c\n@@ -0,0 +1,257 @@\n+/*\n+ * lws-minimal-raw-netcat\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates sending stdin to a remote socket and printing\n+ * what is returned to stdout.\n+ *\n+ * All the logging is on stderr, so you can tune it out with 2\u003elog\n+ * or whatever.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if !defined(WIN32)\n+#include \u003csys/socket.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003cnetinet/in.h\u003e\n+#include \u003cnetdb.h\u003e\n+#include \u003carpa/inet.h\u003e\n+#endif\n+#include \u003cstdio.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003cstdlib.h\u003e\n+#if !defined(WIN32)\n+#include \u003cunistd.h\u003e\n+#endif\n+#include \u003cerrno.h\u003e\n+\n+static struct lws *raw_wsi, *stdin_wsi;\n+static uint8_t buf[LWS_PRE + 4096];\n+static int waiting, interrupted;\n+static struct lws_context *context;\n+static int us_wait_after_input_close \u003d LWS_USEC_PER_SEC / 10;\n+\n+static int\n+callback_raw_test(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t void *user, void *in, size_t len)\n+{\n+\tconst char *cp \u003d (const char *)in;\n+\n+\tswitch (reason) {\n+\n+\t/* callbacks related to file descriptor */\n+\n+ case LWS_CALLBACK_RAW_ADOPT_FILE:\n+ \tlwsl_user(\u0022LWS_CALLBACK_RAW_ADOPT_FILE\u005cn\u0022);\n+ break;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE_FILE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_CLOSE_FILE\u005cn\u0022);\n+\t\t/* stdin close, wait 1s then close the raw skt */\n+\t\tstdin_wsi \u003d NULL; /* invalid now we close */\n+\t\tif (raw_wsi)\n+\t\t\tlws_set_timer_usecs(raw_wsi, us_wait_after_input_close);\n+\t\telse {\n+\t\t\tinterrupted \u003d 1;\n+\t\t\tlws_cancel_service(context);\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX_FILE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_RX_FILE\u005cn\u0022);\n+\t\twaiting \u003d (int)read(0, buf, sizeof(buf));\n+\t\tlwsl_notice(\u0022raw file read %d\u005cn\u0022, waiting);\n+\t\tif (waiting \u003c 0)\n+\t\t\treturn -1;\n+\n+\t\tif (raw_wsi)\n+\t\t\tlws_callback_on_writable(raw_wsi);\n+\t\tlws_rx_flow_control(wsi, 0);\n+\t\tbreak;\n+\n+\n+\t/* callbacks related to raw socket descriptor */\n+\n+ case LWS_CALLBACK_RAW_ADOPT:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_ADOPT\u005cn\u0022);\n+\t\tlws_callback_on_writable(wsi);\n+ break;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_CLOSE\u005cn\u0022);\n+\t\t/*\n+\t\t * If the socket to the remote server closed, we must close\n+\t\t * and drop any remaining stdin\n+\t\t */\n+\t\tinterrupted \u003d 1;\n+\t\tlws_cancel_service(context);\n+\t\t/* our pointer to this wsi is invalid now we close */\n+\t\traw_wsi \u003d NULL;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_RX (%d)\u005cn\u0022, (int)len);\n+\t\twhile (len--)\n+\t\t\tputchar(*cp++);\n+\t\tfflush(stdout);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_WRITEABLE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_WRITEABLE\u005cn\u0022);\n+\t\t// lwsl_hexdump_info(buf, waiting);\n+\t\tif (stdin_wsi)\n+\t\t\tlws_rx_flow_control(stdin_wsi, 1);\n+\t\tif (lws_write(wsi, buf, (unsigned int)waiting, LWS_WRITE_RAW) !\u003d waiting) {\n+\t\t\tlwsl_notice(\u0022%s: raw skt write failed\u005cn\u0022, __func__);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_TIMER:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_TIMER\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\tlws_cancel_service(context);\n+\t\treturn -1;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022raw-test\u0022, callback_raw_test, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tconst char *server \u003d \u0022libwebsockets.org\u0022, *port \u003d \u002280\u0022;\n+\tstruct lws_context_creation_info info;\n+\tlws_sock_file_fd_type sock;\n+\tstruct addrinfo h, *r, *rp;\n+\tstruct lws_vhost *vhost;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw netcat [--server ip] [--port port] [-w ms]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN_SERVER;\n+\tinfo.protocols \u003d protocols;\n+\n+\tvhost \u003d lws_create_vhost(context, \u0026info);\n+\tif (!vhost) {\n+\t\tlwsl_err(\u0022lws vhost creation failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/*\n+\t * Connect our own \u0022foreign\u0022 socket to libwebsockets.org:80\n+\t *\n+\t * Normally you would do this with lws_client_connect_via_info() inside\n+\t * the lws event loop, hiding all this detail. But this example\n+\t * demonstrates how to integrate an externally-connected \u0022foreign\u0022\n+\t * socket, so we create one by hand.\n+\t */\n+\n+\tmemset(\u0026h, 0, sizeof(h));\n+\th.ai_family \u003d AF_UNSPEC; /* Allow IPv4 or IPv6 */\n+\th.ai_socktype \u003d SOCK_STREAM;\n+\th.ai_protocol \u003d IPPROTO_TCP;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--port\u0022)))\n+\t\tport \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--server\u0022)))\n+\t\tserver \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-w\u0022)))\n+\t\tus_wait_after_input_close \u003d 1000 * atoi(p);\n+\n+\tn \u003d getaddrinfo(server, port, \u0026h, \u0026r);\n+\tif (n) {\n+\t\tlwsl_err(\u0022%s: problem resolving %s: %s\u005cn\u0022, __func__, \n+\t\t\t server, gai_strerror(n));\n+\t\treturn 1;\n+\t}\n+\n+\tfor (rp \u003d r; rp; rp \u003d rp-\u003eai_next) {\n+\t\tsock.sockfd \u003d socket(rp-\u003eai_family, rp-\u003eai_socktype,\n+\t\t\t\t rp-\u003eai_protocol);\n+\t\tif (sock.sockfd !\u003d LWS_SOCK_INVALID)\n+\t\t\tbreak;\n+\t}\n+\tif (!rp) {\n+\t\tlwsl_err(\u0022%s: unable to create INET socket\u005cn\u0022, __func__);\n+\t\tfreeaddrinfo(r);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tlwsl_user(\u0022Starting connect to %s:%s...\u005cn\u0022, server, port);\n+\tif (connect(sock.sockfd, rp-\u003eai_addr, sizeof(*rp-\u003eai_addr)) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: unable to connect\u005cn\u0022, __func__);\n+\t\tfreeaddrinfo(r);\n+\t\treturn 1;\n+\t}\n+\n+\tfreeaddrinfo(r);\n+\tsignal(SIGINT, sigint_handler);\n+\tlwsl_user(\u0022Connected...\u005cn\u0022);\n+\n+\t/* our foreign socket is connected... adopt it into lws */\n+\n+\traw_wsi \u003d lws_adopt_descriptor_vhost(vhost, LWS_ADOPT_SOCKET, sock,\n+\t\t\t\t\t protocols[0].name, NULL);\n+\tif (!raw_wsi) {\n+\t\tlwsl_err(\u0022%s: foreign socket adoption failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\tsock.filefd \u003d 0;\n+\tstdin_wsi \u003d lws_adopt_descriptor_vhost(vhost, LWS_ADOPT_RAW_FILE_DESC,\n+\t\t\t\t\t sock, protocols[0].name, NULL);\n+\tif (!stdin_wsi) {\n+\t\tlwsl_err(\u0022%s: stdin adoption failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\n+\tlwsl_user(\u0022%s: destroying context\u005cn\u0022, __func__);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/CMakeLists.txt\nnew file mode 100644\nindex 0000000..bd08cd4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/CMakeLists.txt\n@@ -0,0 +1,31 @@\n+project(lws-minimal-raw-proxy-fallback C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-proxy-fallback)\n+set(SRCS minimal-raw-proxy-fallback.c)\n+\n+# NOTE... if you are building this standalone, you must point LWS_PLUGINS_DIR\n+# to the lws plugins dir so it can pick up the plugin source. Eg,\n+# cmake . -DLWS_PLUGINS_DIR\u003d~/libwebsockets/plugins\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_RAW_PROXY 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\t\n+\tif (LWS_PLUGINS_DIR)\n+\t\tinclude_directories(${LWS_PLUGINS_DIR})\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/README.md b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/README.md\nnew file mode 100644\nindex 0000000..f673f46\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/README.md\n@@ -0,0 +1,49 @@\n+# lws minimal ws server raw proxy fallback\n+\n+This demonstrates how a vhost doing normal http or http(s) duty can be also be\n+bound to a specific role and protocol as a fallback if the incoming protocol is\n+unexpected for tls or http. The example makes the fallback role + protocol\n+an lws plugin that performs raw packet proxying.\n+\n+By default the fallback in the example will proxy 127.0.0.1:22, which is usually\n+your ssh server listen port, on 127.0.0.1:7681. You should be able to ssh into\n+port 7681 the same as you can port 22. At the same time, you should be able to\n+visit http://127.0.0.1:7681 in a browser (and if you give -s, to\n+https://127.0.0.1:7681 while your ssh client can still connect to the same\n+port.\n+\n+## build\n+\n+To build this standalone, you must tell cmake where the lws source tree\n+./plugins directory can be found, since it relies on including the source\n+of the raw-proxy plugin.\n+\n+```\n+ $ cmake . -DLWS_PLUGINS_DIR\u003d~/libwebsockets/plugins \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-r ipv4:address:port|Configure the remote IP and port that will be proxied, by default ipv4:127.0.0.1:22\n+-s|Configure the server for tls / https and `LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT`\n+-h|(needs -s) Configure the vhost also for `LWS_SERVER_OPTION_ALLOW_HTTP_ON_HTTPS_LISTENER`, allowing http service on tls port (caution... it's insecure then)\n+-u|(needs -s) Configure the vhost also for `LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS`, so the server issues a redirect to https to clients that attempt to connect to a server configured for tls with http.\n+```\n+ $ ./lws-minimal-raw-proxy\n+[2018/11/30 19:22:35:7290] USER: LWS minimal raw proxy-fallback\n+[2018/11/30 19:22:35:7291] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/11/30 19:22:35:7336] NOTICE: callback_raw_proxy: onward ipv4 127.0.0.1:22\n+...\n+```\n+\n+```\n+ $ ssh -p7681 me@127.0.0.1\n+Last login: Fri Nov 30 19:29:23 2018 from 127.0.0.1\n+[me@learn ~]$\n+```\n+\n+At the same time, visiting http(s)://127.0.0.1:7681 in a browser works fine.\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.cert b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.key b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/minimal-raw-proxy-fallback.c b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/minimal-raw-proxy-fallback.c\nnew file mode 100644\nindex 0000000..2d290ec\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/minimal-raw-proxy-fallback.c\n@@ -0,0 +1,136 @@\n+/*\n+ * lws-minimal-raw-proxy-fallback\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a normal http / https server which if it receives something\n+ * it can't make sense of at the start, falls back to becoming a raw tcp proxy\n+ * to a specified address and port.\n+ *\n+ * Incoming connections cause an outgoing connection to be initiated, and if\n+ * successfully established then traffic coming in one side is placed on a\n+ * ringbuffer and sent out the opposite side as soon as possible.\n+ *\n+ * If it receives expected packets for an http(s) connection, it acts like a\n+ * normal h1 / h2 webserver.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022../plugins/raw-proxy/protocol_lws_raw_proxy.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\tLWS_PLUGIN_PROTOCOL_RAW_PROXY,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+static int interrupted;\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static struct lws_protocol_vhost_options pvo1 \u003d {\n+ NULL,\n+ NULL,\n+ \u0022onward\u0022,\t\t/* pvo name */\n+ \u0022ipv4:127.0.0.1:22\u0022\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+ NULL, \t/* \u0022next\u0022 pvo linked-list */\n+ \u0026pvo1,\t\t\t/* \u0022child\u0022 pvo linked-list */\n+ \u0022raw-proxy\u0022,\t\t/* protocol name we belong to on this vhost */\n+ \u0022\u0022 \t/* ignored */\n+};\n+\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tchar outward[256];\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw proxy fallback | visit http://localhost:7681\u005cn\u0022);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-r\u0022))) {\n+\t\tlws_strncpy(outward, p, sizeof(outward));\n+\t\tpvo1.value \u003d outward;\n+\t}\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.error_document_404 \u003d \u0022/404.html\u0022;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE |\n+\t\tLWS_SERVER_OPTION_FALLBACK_TO_APPLY_LISTEN_ACCEPT_CONFIG;\n+\tinfo.listen_accept_role \u003d \u0022raw-proxy\u0022;\n+\tinfo.listen_accept_protocol \u003d \u0022raw-proxy\u0022;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t\t\tLWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-u\u0022))\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS;\n+\n+\t\tif (lws_cmdline_option(argc, argv, \u0022-h\u0022))\n+\t\t\tinfo.options |\u003d LWS_SERVER_OPTION_ALLOW_HTTP_ON_HTTPS_LISTENER;\n+\t}\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/404.html b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/404.html\nnew file mode 100644\nindex 0000000..3e5a14b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/404.html\n@@ -0,0 +1,9 @@\n+\u003cmeta charset\u003d\u0022UTF-8\u0022\u003e \n+\u003chtml\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003ch1\u003e404\u003c/h1\u003e\n+\t\tSorry, that file doesn't exist.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/favicon.ico b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/index.html b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/index.html\nnew file mode 100644\nindex 0000000..573e515\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/index.html\n@@ -0,0 +1,15 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tHello from the \u003cb\u003eminimal raw fallback http server example\u003c/b\u003e.\n+\t\t\u003cbr\u003e\n+\t\tYou can confirm the 404 page handler by going to this\n+\t\tnonexistant \u003ca href\u003d\u0022notextant.html\u0022\u003epage\u003c/a\u003e.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-proxy/CMakeLists.txt\nnew file mode 100644\nindex 0000000..75fb8f9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy/CMakeLists.txt\n@@ -0,0 +1,31 @@\n+project(lws-minimal-raw-proxy C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-proxy)\n+set(SRCS minimal-raw-proxy.c)\n+\n+# NOTE... if you are building this standalone, you must point LWS_PLUGINS_DIR\n+# to the lws plugins dir so it can pick up the plugin source. Eg,\n+# cmake . -DLWS_PLUGINS_DIR\u003d~/libwebsockets/plugins\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_RAW_PROXY 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\t\n+\tif (LWS_PLUGINS_DIR)\n+\t\tinclude_directories(${LWS_PLUGINS_DIR})\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy/README.md b/minimal-examples-lowlevel/raw/minimal-raw-proxy/README.md\nnew file mode 100644\nindex 0000000..53793a8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy/README.md\n@@ -0,0 +1,41 @@\n+# lws minimal ws server raw proxy\n+\n+This demonstrates how a vhost can be bound to a specific role and protocol,\n+with the example using a lws plugin that performs raw packet proxying.\n+\n+By default the example will proxy 127.0.0.1:22, usually your ssh server\n+listen port, on 127.0.0.1:7681. You should be able to ssh into port 7681\n+the same as you can port 22. But your ssh server is only listening on port 22...\n+\n+## build\n+\n+To build this standalone, you must tell cmake where the lws source tree\n+./plugins directory can be found, since it relies on including the source\n+of the raw-proxy plugin.\n+\n+```\n+ $ cmake . -DLWS_PLUGINS_DIR\u003d~/libwebsockets/plugins \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-r ipv4:address:port|Configure the remote IP and port that will be proxied, by default ipv4:127.0.0.1:22\n+\n+```\n+ $ ./lws-minimal-raw-proxy\n+[2018/11/30 19:22:35:7290] USER: LWS minimal raw proxy | nc localhost 7681\n+[2018/11/30 19:22:35:7291] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/11/30 19:22:35:7336] NOTICE: callback_raw_proxy: onward ipv4 127.0.0.1:22\n+...\n+```\n+\n+```\n+ $ ssh -p7681 me@127.0.0.1\n+Last login: Fri Nov 30 19:29:23 2018 from 127.0.0.1\n+[me@learn ~]$\n+```\n+\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-proxy/minimal-raw-proxy.c b/minimal-examples-lowlevel/raw/minimal-raw-proxy/minimal-raw-proxy.c\nnew file mode 100644\nindex 0000000..1634a80\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-proxy/minimal-raw-proxy.c\n@@ -0,0 +1,91 @@\n+/*\n+ * lws-minimal-raw-proxy\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a vhost that acts as a raw tcp proxy. Incoming connections\n+ * cause an outgoing connection to be initiated, and if successfully established\n+ * then traffic coming in one side is placed on a ringbuffer and sent out the\n+ * opposite side as soon as possible.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022../plugins/raw-proxy/protocol_lws_raw_proxy.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\tLWS_PLUGIN_PROTOCOL_RAW_PROXY,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static struct lws_protocol_vhost_options pvo1 \u003d {\n+ NULL,\n+ NULL,\n+ \u0022onward\u0022, /* pvo name */\n+ \u0022ipv4:127.0.0.1:22\u0022 /* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+ NULL, /* \u0022next\u0022 pvo linked-list */\n+ \u0026pvo1, /* \u0022child\u0022 pvo linked-list */\n+ \u0022raw-proxy\u0022, /* protocol name we belong to on this vhost */\n+ \u0022\u0022 /* ignored */\n+};\n+\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tchar outward[256];\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw proxy\u005cn\u0022);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-r\u0022))) {\n+\t\tlws_strncpy(outward, p, sizeof(outward));\n+\t\tpvo1.value \u003d outward;\n+\t}\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+\tinfo.options \u003d LWS_SERVER_OPTION_ADOPT_APPLY_LISTEN_ACCEPT_CONFIG;\n+\tinfo.listen_accept_role \u003d \u0022raw-proxy\u0022;\n+\tinfo.listen_accept_protocol \u003d \u0022raw-proxy\u0022;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-serial/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-serial/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5dfae02\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-serial/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-minimal-raw-serial C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-serial)\n+set(SRCS minimal-raw-file.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements AND UNIX)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-serial/README.md b/minimal-examples-lowlevel/raw/minimal-raw-serial/README.md\nnew file mode 100644\nindex 0000000..128b789\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-serial/README.md\n@@ -0,0 +1,46 @@\n+# lws minimal raw serial example\n+\n+This demonstrates adopting a file descriptor representing a serial device\n+into the event loop, printing a string on it every couple of seconds and\n+showing any serial that is received.\n+\n+The serial terminal is configured for 115200 8N1.\n+\n+\n+```\n+ $ ./lws-minimal-raw-serial \u003ctty, eg, /dev/ttyUSB0\u003e\n+```\n+\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+[2019/12/08 16:30:53:4436] U: LWS minimal raw serial\n+[2019/12/08 16:30:53:5016] E: callback_ntpc: set up system ops for set_clock\n+[2019/12/08 16:30:54:8061] N: callback_ntpc: Unix time: 1575822654\n+[2019/12/08 16:30:54:8253] N: LWS_CALLBACK_RAW_ADOPT_FILE\n+[2019/12/08 16:30:54:8364] N: callback_ntpc: LWS_CALLBACK_RAW_CLOSE\n+[2019/12/08 16:30:54:8456] N: LWS_CALLBACK_RAW_WRITEABLE_FILE\n+[2019/12/08 16:30:56:8455] N: LWS_CALLBACK_RAW_WRITEABLE_FILE\n+[2019/12/08 16:30:58:8460] N: LWS_CALLBACK_RAW_WRITEABLE_FILE\n+[2019/12/08 16:30:59:1570] N: LWS_CALLBACK_RAW_RX_FILE\n+[2019/12/08 16:30:59:1604] N: \n+[2019/12/08 16:30:59:1641] N: 0000: 62 b \n+[2019/12/08 16:30:59:1644] N: \n+[2019/12/08 16:31:00:8463] N: LWS_CALLBACK_RAW_WRITEABLE_FILE\n+[2019/12/08 16:31:01:6392] N: LWS_CALLBACK_RAW_RX_FILE\n+[2019/12/08 16:31:01:6397] N: \n+[2019/12/08 16:31:01:6407] N: 0000: 65 e \n+[2019/12/08 16:31:01:6411] N: \n+[2019/12/08 16:31:02:8463] N: LWS_CALLBACK_RAW_WRITEABLE_FILE\n+... . \n+\n+```\n+\n+The remote serial connection will show the string sent every 2s.\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-serial/minimal-raw-file.c b/minimal-examples-lowlevel/raw/minimal-raw-serial/minimal-raw-file.c\nnew file mode 100644\nindex 0000000..45d50af\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-serial/minimal-raw-file.c\n@@ -0,0 +1,231 @@\n+/*\n+ * lws-minimal-raw-file\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates dealing with a serial port\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003csys/stat.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+#include \u003ctermios.h\u003e\n+#include \u003csys/ioctl.h\u003e\n+\n+#if defined(__linux__)\n+#include \u003casm/ioctls.h\u003e\n+#include \u003clinux/serial.h\u003e\n+#endif\n+\n+struct raw_vhd {\n+\tlws_sorted_usec_list_t sul;\n+\tstruct lws *wsi;\n+\tint filefd;\n+};\n+\n+static char filepath[256];\n+\n+static void\n+sul_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tstruct raw_vhd *v \u003d lws_container_of(sul, struct raw_vhd, sul);\n+\n+\tlws_callback_on_writable(v-\u003ewsi);\n+\n+\tlws_sul_schedule(lws_get_context(v-\u003ewsi), 0, \u0026v-\u003esul, sul_cb,\n+\t\t\t 2 * LWS_USEC_PER_SEC);\n+}\n+\n+static int\n+callback_raw_test(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct raw_vhd *vhd \u003d (struct raw_vhd *)lws_protocol_vh_priv_get(\n+\t\t\t\t lws_get_vhost(wsi), lws_get_protocol(wsi));\n+#if defined(__linux__)\n+\tstruct serial_struct s_s;\n+#endif\n+\tlws_sock_file_fd_type u;\n+\tstruct termios tio;\n+\tuint8_t buf[1024];\n+\tint n;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi), sizeof(struct raw_vhd));\n+\t\tvhd-\u003efilefd \u003d lws_open(filepath, O_RDWR);\n+\t\tif (vhd-\u003efilefd \u003d\u003d -1) {\n+\t\t\tlwsl_err(\u0022Unable to open %s\u005cn\u0022, filepath);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\ttcflush(vhd-\u003efilefd, TCIOFLUSH);\n+\n+#if defined(__linux__)\n+\t\tif (ioctl(vhd-\u003efilefd, TIOCGSERIAL, \u0026s_s) \u003d\u003d 0) {\n+\t\t\ts_s.closing_wait \u003d ASYNC_CLOSING_WAIT_NONE;\n+\t\t\tioctl(vhd-\u003efilefd, TIOCSSERIAL, \u0026s_s);\n+\t\t}\n+#endif\n+\n+\t\t/* enforce suitable tty state */\n+\n+\t\tmemset(\u0026tio, 0, sizeof tio);\n+\t\tif (tcgetattr(vhd-\u003efilefd, \u0026tio)) {\n+\t\t\tclose(vhd-\u003efilefd);\n+\t\t\tvhd-\u003efilefd \u003d -1;\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tcfsetispeed(\u0026tio, B115200);\n+\t\tcfsetospeed(\u0026tio, B115200);\n+\n+\t\ttio.c_lflag \u0026\u003d (tcflag_t)~(ISIG | ICANON | IEXTEN | ECHO |\n+#if defined(__linux__)\n+\t\t\t\tXCASE |\n+#endif\n+\t\t\t\t ECHOE | ECHOK | ECHONL | ECHOCTL | ECHOKE);\n+\t\ttio.c_iflag \u0026\u003d (tcflag_t)~(INLCR | IGNBRK | IGNPAR | IGNCR | ICRNL |\n+\t\t\t\t IMAXBEL | IXON | IXOFF | IXANY\n+#if defined(__linux__)\n+\t\t\t\t | IUCLC\n+#endif\n+\t\t\t\t| 0xff);\n+\t\ttio.c_oflag \u003d 0;\n+\n+\t\ttio.c_cc[VMIN] \u003d 1;\n+\t\ttio.c_cc[VTIME] \u003d 0;\n+\t\ttio.c_cc[VEOF] \u003d 1;\n+\t\ttio.c_cflag \u003d tio.c_cflag \u0026 (unsigned long) ~(\n+#if defined(__linux__)\n+\t\t\t\tCBAUD |\n+#endif\n+\t\t\t\tCSIZE | CSTOPB | PARENB | CRTSCTS);\n+\t\ttio.c_cflag |\u003d 0x1412 | CS8 | CREAD | CLOCAL;\n+\n+\t\ttcsetattr(vhd-\u003efilefd, TCSANOW, \u0026tio);\n+\n+\t\tu.filefd \u003d (lws_filefd_type)(long long)vhd-\u003efilefd;\n+\t\tif (!lws_adopt_descriptor_vhost(lws_get_vhost(wsi),\n+\t\t\t\t\t\tLWS_ADOPT_RAW_FILE_DESC, u,\n+\t\t\t\t\t\t\u0022raw-test\u0022, NULL)) {\n+\t\t\tlwsl_err(\u0022Failed to adopt fifo descriptor\u005cn\u0022);\n+\t\t\tclose(vhd-\u003efilefd);\n+\t\t\tvhd-\u003efilefd \u003d -1;\n+\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tif (vhd \u0026\u0026 vhd-\u003efilefd !\u003d -1)\n+\t\t\tclose(vhd-\u003efilefd);\n+\t\tbreak;\n+\n+\t/* callbacks related to raw file descriptor */\n+\n+\tcase LWS_CALLBACK_RAW_ADOPT_FILE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_ADOPT_FILE\u005cn\u0022);\n+\t\tvhd-\u003ewsi \u003d wsi;\n+\t\tlws_sul_schedule(lws_get_context(wsi), 0, \u0026vhd-\u003esul, sul_cb, 1);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX_FILE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_RX_FILE\u005cn\u0022);\n+\t\tn \u003d (int)read(vhd-\u003efilefd, buf, sizeof(buf));\n+\t\tif (n \u003c 0) {\n+\t\t\tlwsl_err(\u0022Reading from %s failed\u005cn\u0022, filepath);\n+\n+\t\t\treturn 1;\n+\t\t}\n+\t\tlwsl_hexdump_level(LLL_NOTICE, buf, (unsigned int)n);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE_FILE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_CLOSE_FILE\u005cn\u0022);\n+\t\tlws_sul_cancel(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_WRITEABLE_FILE:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_RAW_WRITEABLE_FILE\u005cn\u0022);\n+\t\tif (lws_write(wsi, (uint8_t *)\u0022hello-this-is-written-every-couple-of-seconds\u005cr\u005cn\u0022, 47, LWS_WRITE_RAW) !\u003d 47)\n+\t\t\treturn -1;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022raw-test\u0022, callback_raw_test, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw serial\u005cn\u0022);\n+\tif (argc \u003c 2) {\n+\t\tlwsl_user(\u0022Usage: %s \u003cserial device\u003e \u0022\n+\t\t\t \u0022 eg, /dev/ttyUSB0\u005cn\u0022, argv[0]);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN_SERVER; /* no listen socket for demo */\n+\tinfo.protocols \u003d protocols;\n+\n+\tlws_strncpy(filepath, argv[1], sizeof(filepath));\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-vhost/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-vhost/CMakeLists.txt\nnew file mode 100644\nindex 0000000..4e578df\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-vhost/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-minimal-raw-vhost C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-raw-vhost)\n+set(SRCS minimal-raw-vhost.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-vhost/README.md b/minimal-examples-lowlevel/raw/minimal-raw-vhost/README.md\nnew file mode 100644\nindex 0000000..7992bd3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-vhost/README.md\n@@ -0,0 +1,42 @@\n+# lws minimal ws server raw vhost\n+\n+This demonstrates setting up a vhost to listen and accept raw sockets.\n+Raw sockets are just sockets... lws does not send anything on them or\n+interpret by itself what it receives on them. So you can implement\n+arbitrary tcp protocols using them.\n+\n+This isn't very useful standalone as shown here for clarity, but you can\n+freely combine a raw socket vhost with other lws server\n+and client features and other vhosts handling http or ws.\n+\n+Becuase raw socket events have their own callback reasons, the handlers can\n+be integrated in a single protocol that also handles http and ws\n+server and client callbacks without conflict.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+ -s means listen using tls\n+\n+```\n+ $ ./lws-minimal-raw-vhost\n+[2018/03/22 14:49:47:9516] USER: LWS minimal raw vhost\n+[2018/03/22 14:49:47:9673] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+[2018/03/22 14:49:52:3789] USER: LWS_CALLBACK_RAW_ADOPT\n+[2018/03/22 14:49:57:4271] USER: LWS_CALLBACK_RAW_CLOSE\n+```\n+\n+```\n+ $ nc localhost 7681\n+hello\n+hello\n+```\n+\n+Connect one or more sessions to the server using netcat... lines you type\n+into netcat are sent to the server, which echos them to all connected clients.\n+\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.cert b/minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.key b/minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/raw/minimal-raw-vhost/minimal-raw-vhost.c b/minimal-examples-lowlevel/raw/minimal-raw-vhost/minimal-raw-vhost.c\nnew file mode 100644\nindex 0000000..48267ba\n--- /dev/null\n+++ b/minimal-examples-lowlevel/raw/minimal-raw-vhost/minimal-raw-vhost.c\n@@ -0,0 +1,160 @@\n+/*\n+ * lws-minimal-raw-vhost\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates integrating a raw tcp listener into the lws event loop.\n+ *\n+ * This demo doesn't have any http or ws support. You can connect to it\n+ * using netcat. If you make multiple connections to it, things typed in one\n+ * netcat session are broadcast to all netcat connections.\n+ *\n+ * $ nc localhost 7681\n+ *\n+ * You can add more vhosts with things like http or ws support, it's as it is\n+ * for clarity.\n+ *\n+ * The main point is the apis and ways of managing raw sockets are almost\n+ * identical to http or ws mode sockets in lws. The callback names for raw\n+ * wsi are changed to be specific to RAW mode is all.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003csys/stat.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+struct raw_pss {\n+\tstruct raw_pss *pss_list;\n+\tstruct lws *wsi;\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct raw_vhd {\n+\tstruct raw_pss *pss_list; /* linked-list of live pss*/\n+\n+\tint len;\n+\tuint8_t buf[4096];\n+};\n+\n+static int\n+callback_raw_test(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct raw_pss *pss \u003d (struct raw_pss *)user;\n+\tstruct raw_vhd *vhd \u003d (struct raw_vhd *)lws_protocol_vh_priv_get(\n+\t\t\t\t lws_get_vhost(wsi), lws_get_protocol(wsi));\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tlws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi), sizeof(struct raw_vhd));\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tbreak;\n+\n+\t/* callbacks related to raw socket descriptor */\n+\n+ case LWS_CALLBACK_RAW_ADOPT:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_ADOPT\u005cn\u0022);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+ break;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_CLOSE\u005cn\u0022);\n+\t\tlws_ll_fwd_remove(struct raw_pss, pss_list, pss, vhd-\u003epss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_RX: %d\u005cn\u0022, (int)len);\n+\t\tvhd-\u003elen \u003d (int)len;\n+\t\tif (vhd-\u003elen \u003e (int)sizeof(vhd-\u003ebuf))\n+\t\t\tvhd-\u003elen \u003d sizeof(vhd-\u003ebuf);\n+\t\tmemcpy(vhd-\u003ebuf, in, (unsigned int)vhd-\u003elen);\n+\t\tlws_start_foreach_llp(struct raw_pss **, ppss, vhd-\u003epss_list) {\n+\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_WRITEABLE:\n+\t\tif (lws_write(wsi, vhd-\u003ebuf, (unsigned int)vhd-\u003elen, LWS_WRITE_RAW) !\u003d\n+\t\t vhd-\u003elen) {\n+\t\t\tlwsl_notice(\u0022%s: raw write failed\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022raw-test\u0022, callback_raw_test, sizeof(struct raw_pss), 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal raw vhost | nc localhost 7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.options \u003d LWS_SERVER_OPTION_ONLY_RAW; /* vhost accepts RAW */\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/README.md b/minimal-examples-lowlevel/secure-streams/README.md\nnew file mode 100644\nindex 0000000..5815630\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/README.md\n@@ -0,0 +1,14 @@\n+# Secure Streams\n+\n+Secure Streams is a client API that strictly decouples the policy for connections\n+from the payloads. The user code only deals with the stream type name and payloads,\n+a policy database set at `lws_context` creation time decides all policy about the\n+connection, including the endpoint, tls CA, and even the wire protocol.\n+\n+|name|demonstrates|\n+---|---\n+minimal-secure-streams|Minimal secure streams client / proxy example\n+minimal-secure-streams-tx|Proxy used for client-tx test below\n+minimal-secure-streams-client-tx|Secure streams client showing tx and rx\n+\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5400c24\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/CMakeLists.txt\n@@ -0,0 +1,43 @@\n+project(lws-minimal-secure-streams-alexa C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-alexa)\n+set(SRCS main.c alexa.c audio.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_ALSA 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared asound pv_porcupine mpg123 ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets asound pv_porcupine mpg123 ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client ${SRCS})\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared asound pv_porcupine mpg123 ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets asound pv_porcupine mpg123 ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\t\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/README.md\nnew file mode 100644\nindex 0000000..66fed37\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/README.md\n@@ -0,0 +1,77 @@\n+# lws secure streams alexa\n+\n+This demonstrates AVS Alexa usage using secure streams. It connects to AVS,\n+uses your linux computer's microphone to wait for the 'alexa' wakeword, sends\n+the utterance to AVS and plays back the result.\n+\n+## build\n+\n+There are some special build considerations:\n+\n+1) Build lws with cmake options `-DLWS_WITH_ALSA\u003d1 -DLWS_WITH_SECURE_STREAMS\u003d1`\n+\n+2) Install distro build dependency packages:\n+\n+ |Dependency|Ubuntu package|Fedora Package|\n+ |---|---|---|\n+ |libasound|libasound2-dev|alsa-lib-devel|\n+ |mpg123|libmpg123-dev|mpg123-devel|\n+\n+3) Clone Picovoice Porcupine Apache-licensed demo version from here\n+\n+ https://github.com/Picovoice/porcupine\n+\n+ It provides binary libs for wakeword detection on various platforms. Copy\n+ the headers and binary lib to your build context, eg, for native x86_64\n+\n+```\n+ $ sudo cp ./include/* /usr/include\n+ $ sudo cp ./lib/linux/x86_64/libpv_porcupine.* /usr/lib\n+ $ sudo ldconfig\n+```\n+\n+ Enter the minimal example dir for secure-streams-alexa and make the sample\n+\n+```\n+ $ cd ./minimal-examples/secure-streams/minimal-secure-streams-alexa\n+ $ cmake .\n+ $ make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-secure-streams-alexa\n+[2019/10/16 16:22:01:1097] U: LWS secure streams - Alex voice test [-d\u003cverb\u003e]\n+[2019/10/16 16:22:01:1115] N: lws_create_context: creating Secure Streams policy\n+[2019/10/16 16:22:01:1115] N: lwsac_use: alloc 1532 for 1\n+[2019/10/16 16:22:01:1119] N: lwsac_use: alloc 288 for 168\n+[2019/10/16 16:22:01:1119] N: lws_ss_policy_set: policy lwsac size: 1.796KiB, pad 11%\n+[2019/10/16 16:22:02:4114] N: lws_ss_client_connect: connecting 0 api.amazon.com /auth/o2/token\n+[2019/10/16 16:22:02:8686] N: auth_api_amazon_com_parser_cb: expires in 3600\n+[2019/10/16 16:22:02:8686] N: ss_api_amazon_auth_rx: acquired 656-byte api.amazon.com auth token\n+[2019/10/16 16:22:02:8754] N: lws_ss_client_connect: connecting 1 alexa.na.gateway.devices.a2z.com /v20160207/directives\n+[2019/10/16 16:22:02:3182] N: secstream_h2: h2 client entering LONG_POLL\n+[2019/10/16 16:22:02:3183] U: Connected to Alexa... speak \u0022Alexa, ...\u0022\n+[2019/10/16 16:22:06:9380] W: ************* Wakeword\n+[2019/10/16 16:22:06:9380] N: avs_query_start:\n+[2019/10/16 16:22:06:9381] N: lws_ss_client_connect: connecting 1 alexa.na.gateway.devices.a2z.com /v20160207/events\n+[2019/10/16 16:22:06:9381] N: lws_vhost_active_conns: just join h2 directly\n+[2019/10/16 16:22:06:9384] N: metadata done\n+[2019/10/16 16:22:06:1524] N: est: 42 1\n+[2019/10/16 16:22:06:3723] N: est: 108 1\n+[2019/10/16 16:22:07:5914] N: est: 352 1\n+[2019/10/16 16:22:07:8112] N: est: 4284 1\n+[2019/10/16 16:22:07:0300] N: est: 3369 1\n+[2019/10/16 16:22:07:2325] N: est: 577 1\n+[2019/10/16 16:22:08:4519] N: est: 9 1\n+[2019/10/16 16:22:08:6716] N: est: 3 1\n+[2019/10/16 16:22:08:6718] N: est: 11 1\n+[2019/10/16 16:22:08:8915] N: est: 10 1\n+[2019/10/16 16:22:08:8915] W: callback_audio: ended capture\n+[2019/10/16 16:22:09:0993] N: identified reply...\n+^C[2019/10/16 16:22:14:3067] U: Disconnected from Alexa\n+[2019/10/16 16:22:14:3123] U: Completed\n+$\n+\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa.c\nnew file mode 100644\nindex 0000000..41a46cf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa.c\n@@ -0,0 +1,675 @@\n+/*\n+ * lws-minimal-secure-streams-alexa\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003csys/stat.h\u003e\n+#include \u003cunistd.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+#include \u003cmpg123.h\u003e\n+\n+#include \u0022private.h\u0022\n+\n+struct lws_ss_handle *hss_avs_event, *hss_avs_sync;\n+\n+/* this is the type for the long poll event channel */\n+\n+typedef struct ss_avs_event {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\n+\tstruct lejp_ctx\t\tjctx;\n+} ss_avs_event_t;\n+\n+enum {\n+\tLAMP3STATE_IDLE,\n+\tLAMP3STATE_SPOOLING,\n+\tLAMP3STATE_DRAINING,\n+};\n+\n+/* this is the type for the utterance metadata (and audio rideshares) */\n+\n+typedef struct ss_avs_metadata {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\n+\tstruct lws_buflist\t*dribble; /* next mp3 data while draining last */\n+\n+\tstruct lejp_ctx\t\tjctx;\n+\tsize_t\t\t\tpos;\n+\tsize_t\t\t\tmp3_in;\n+\tmpg123_handle\t\t*mh;\n+\n+\tlws_sorted_usec_list_t\tsul;\n+\n+\tuint8_t\t\t\tstash_eom[16];\n+\n+\tuint8_t\t\t\tse_head;\n+\tuint8_t\t\t\tse_tail;\n+\n+\tchar\t\t\tmp3_state;\n+\tchar\t\t\tfirst_mp3;\n+\tuint8_t\t\t\tmp3_mime_match;\n+\tuint8_t\t\t\tseen;\n+\tuint8_t\t\t\tinside_mp3;\n+\n+} ss_avs_metadata_t;\n+\n+/*\n+ * The remote server only seems to give us a budget of 10s to consume the\n+ * results, after that it doesn't drop the stream, but doesn't send us anything\n+ * further on it.\n+ *\n+ * This makes it impossible to optimize buffering for incoming mp3 since we\n+ * have to go ahead and take it before the 10s is up.\n+ */\n+\n+#define MAX_MP3_IN_BUFFERING_BYTES 32768\n+\n+/*\n+ * Structure of JSON metadata for utterance handling\n+ */\n+\n+static const char *metadata \u003d \u0022{\u0022\n+\t\u0022\u005c\u0022event\u005c\u0022: {\u0022\n+\t\t\u0022\u005c\u0022header\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022namespace\u005c\u0022: \u005c\u0022SpeechRecognizer\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022Recognize\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022messageId\u005c\u0022: \u005c\u0022message-123\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022dialogRequestId\u005c\u0022: \u005c\u0022dialog-request-321\u005c\u0022\u0022\n+\t\t\u0022},\u0022\n+\t\t\u0022\u005c\u0022payload\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022profile\u005c\u0022:\u0022\t\u0022\u005c\u0022CLOSE_TALK\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022format\u005c\u0022:\u0022\t\u0022\u005c\u0022AUDIO_L16_RATE_16000_CHANNELS_1\u005c\u0022\u0022\n+\t\t\u0022}\u0022\n+\t\u0022}\u0022\n+\u0022}\u0022;\n+\n+/*\n+ * avs metadata\n+ */\n+\n+static void\n+use_buffer_250ms(lws_sorted_usec_list_t *sul)\n+{\n+\tss_avs_metadata_t *m \u003d lws_container_of(sul, ss_avs_metadata_t, sul);\n+\tstruct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\tint est \u003d lws_ss_get_est_peer_tx_credit(m-\u003ess);\n+\n+\tlwsl_notice(\u0022%s: est txcr %d\u005cn\u0022, __func__, est);\n+\n+\tif (est \u003c MAX_MP3_IN_BUFFERING_BYTES - (MAX_MP3_IN_BUFFERING_BYTES / 4)) {\n+\t\tlwsl_notice(\u0022 adding %d\u005cn\u0022, MAX_MP3_IN_BUFFERING_BYTES / 4);\n+\t\tlws_ss_add_peer_tx_credit(m-\u003ess, MAX_MP3_IN_BUFFERING_BYTES / 4);\n+\t}\n+\n+\tlws_sul_schedule(context, 0, \u0026m-\u003esul, use_buffer_250ms,\n+\t\t\t 250 * LWS_US_PER_MS);\n+}\n+\n+static const char *mp3_mimetype \u003d \u0022application/octet-stream\u0022,\n+\t\t *match2 \u003d \u0022\u005cx0d\u005cx0a\u005cx0d\u005cx0a\u0022;\n+\n+static int\n+ss_avs_mp3_open(ss_avs_metadata_t *m)\n+{\n+\tint r;\n+\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\n+\tm-\u003efirst_mp3 \u003d 1;\n+\tm-\u003emh \u003d mpg123_new(NULL, NULL);\n+\tif (!m-\u003emh) {\n+\t\tlwsl_err(\u0022%s: unable to make new mp3\u005cn\u0022,\n+\t\t\t\t__func__);\n+\t\tgoto bail;\n+\t}\n+\tmpg123_format_none(m-\u003emh);\n+\tr \u003d mpg123_format(m-\u003emh, 16000, MPG123_M_MONO,\n+\t\t\t MPG123_ENC_SIGNED_16);\n+\tif (r) {\n+\t\tlwsl_err(\u0022%s: mpg123 format failed %d\u005cn\u0022,\n+\t\t\t\t__func__, r);\n+\t\tgoto bail1;\n+\t}\n+\tr \u003d mpg123_open_feed(m-\u003emh);\n+\tif (r) {\n+\t\tlwsl_err(\u0022%s: mpg123 open feed failed %d\u005cn\u0022,\n+\t\t\t\t__func__, r);\n+\t\tgoto bail1;\n+\t}\n+\n+\treturn 0;\n+\n+bail1:\n+\tmpg123_delete(m-\u003emh);\n+\tm-\u003emh \u003d NULL;\n+\n+bail:\n+\treturn 1;\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_metadata_rx(void *userobj, const uint8_t *buf, size_t len, int flags);\n+\n+/*\n+ * This is called when the mp3 has drained it's input buffer and destroyed\n+ * itself.\n+ */\n+\n+static int\n+drain_end_cb(void *v)\n+{\n+\tss_avs_metadata_t *m \u003d (ss_avs_metadata_t *)v;\n+\tstruct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\tint tot \u003d 0;\n+\n+\tlwsl_err(\u0022%s\u005cn\u0022, __func__);\n+\n+\t/*\n+\t * We have drained and destroyed the existing mp3 session. Is there\n+\t * a new one pending?\n+\t */\n+\n+\tm-\u003efirst_mp3 \u003d 1;\n+\tm-\u003emp3_state \u003d LAMP3STATE_IDLE;\n+\n+\tif (lws_buflist_total_len(\u0026m-\u003edribble)) {\n+\t\t/* we started another one */\n+\n+\t\t/* resume tx credit top up */\n+\t\tlws_sul_schedule(context, 0, \u0026m-\u003esul, use_buffer_250ms, 1);\n+\n+\t\tif (ss_avs_mp3_open(m))\n+\t\t\treturn 1;\n+\n+\t\tm-\u003emp3_state \u003d LAMP3STATE_SPOOLING;\n+\n+\t\t/*\n+\t\t * Dump what we stashed from draining into the new mp3\n+\t\t */\n+\n+\t\twhile (lws_buflist_total_len(\u0026m-\u003edribble)) {\n+\t\t\tsize_t s;\n+\t\t\tuint8_t *u, t;\n+\n+\t\t\ts \u003d lws_buflist_next_segment_len(\u0026m-\u003edribble, \u0026u);\n+\t\t\tt \u003d m-\u003estash_eom[m-\u003ese_tail];\n+\t\t\tlwsl_notice(\u0022%s: preload %d: %d\u005cn\u0022, __func__, (int)s, t);\n+\n+\t\t\tmpg123_feed(m-\u003emh, u, s);\n+\t\t\tlws_buflist_use_segment(\u0026m-\u003edribble, s);\n+\t\t\tif (m-\u003efirst_mp3) {\n+\t\t\t\tplay_mp3(m-\u003emh, NULL, NULL);\n+\t\t\t\tm-\u003efirst_mp3 \u003d 0;\n+\t\t\t}\n+\n+\t\t\ttot +\u003d s;\n+\n+\t\t\tm-\u003ese_tail \u003d (m-\u003ese_tail + 1) % sizeof(m-\u003estash_eom);\n+\t\t\tif (t) {\n+\t\t\t\tlwsl_notice(\u0022%s: preloaded EOM\u005cn\u0022, __func__);\n+\n+\t\t\t\t/*\n+\t\t\t\t * We stashed the whole of the message, we need\n+\t\t\t\t * to also do the EOM processing. We will come\n+\t\t\t\t * back here if there's another message in the\n+\t\t\t\t * stash.\n+\t\t\t\t */\n+\n+\t\t\t\tm-\u003emp3_state \u003d LAMP3STATE_DRAINING;\n+\t\t\t\tif (m-\u003emh)\n+\t\t\t\t\tplay_mp3(NULL, drain_end_cb, m);\n+\n+\t\t\t\tlws_ss_add_peer_tx_credit(m-\u003ess, tot);\n+#if 0\n+\t\t\t\t/*\n+\t\t\t\t * Put a hold on bringing in any more data\n+\t\t\t\t */\n+\t\t\t\tlws_sul_cancel(\u0026m-\u003esul);\n+#endif\n+\t\t\t\t/* destroy our copy of the handle */\n+\t\t\t\tm-\u003emh \u003d NULL;\n+\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\n+\t\tlws_ss_add_peer_tx_credit(m-\u003ess, tot);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_metadata_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tss_avs_metadata_t *m \u003d (ss_avs_metadata_t *)userobj;\n+\tstruct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\tint n \u003d 0, hit \u003d 0;\n+\n+\tlwsl_notice(\u0022%s: len %d, flags %d (est peer txcr %d)\u005cn\u0022, __func__,\n+\t\t (int)len, flags, lws_ss_get_est_peer_tx_credit(m-\u003ess));\n+\n+\t// lwsl_hexdump_warn(buf, len);\n+\n+\tif ((flags \u0026 LWSSS_FLAG_SOM) \u0026\u0026 !m-\u003emh \u0026\u0026 !m-\u003eseen) {\n+\t\tm-\u003emp3_mime_match \u003d 0;\n+\t\tm-\u003eseen \u003d 0;\n+\t\tm-\u003einside_mp3 \u003d 0;\n+\t}\n+\n+\tif (!m-\u003einside_mp3) {\n+\t\t/*\n+\t\t * Identify the part with the mp3 in, if any\n+\t\t */\n+\n+\t\twhile (n \u003c (int)len - 24) {\n+\t\t\tif (!m-\u003eseen) {\n+\t\t\t\tif (buf[n] \u003d\u003d mp3_mimetype[m-\u003emp3_mime_match]) {\n+\t\t\t\t\tm-\u003emp3_mime_match++;\n+\t\t\t\t\tif (m-\u003emp3_mime_match \u003d\u003d 24) {\n+\t\t\t\t\t\tm-\u003emp3_mime_match \u003d 0;\n+\t\t\t\t\t\tm-\u003eseen \u003d 1;\n+\t\t\t\t\t\tn++;\n+\t\t\t\t\t\tcontinue;\n+\t\t\t\t\t}\n+\t\t\t\t} else\n+\t\t\t\t\tm-\u003emp3_mime_match \u003d 0;\n+\t\t\t} else {\n+\t\t\t\tif (buf[n] \u003d\u003d match2[m-\u003emp3_mime_match]) {\n+\t\t\t\t\tm-\u003emp3_mime_match++;\n+\t\t\t\t\tif (m-\u003emp3_mime_match \u003d\u003d 4) {\n+\t\t\t\t\t\tm-\u003eseen \u003d 0;\n+\t\t\t\t\t\tm-\u003emp3_mime_match \u003d 0;\n+\t\t\t\t\t\thit \u003d 1;\n+\t\t\t\t\t\tn++;\n+\t\t\t\t\t\tbuf +\u003d n;\n+\t\t\t\t\t\tlen -\u003d n;\n+\t\t\t\t\t\tlwsl_notice(\u0022identified reply...\u005cn\u0022);\n+\t\t\t\t\t\tm-\u003einside_mp3 \u003d 1;\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\t}\n+\t\t\t\t} else\n+\t\t\t\t\tm-\u003emp3_mime_match \u003d 0;\n+\t\t\t}\n+\n+\t\t\tn++;\n+\t\t}\n+\n+\t\tif (!hit) {\n+\t\t\tlws_ss_add_peer_tx_credit(m-\u003ess, len);\n+\t\t\treturn 0;\n+\t\t}\n+\t}\n+\n+\t// lwsl_notice(\u0022%s: state %d\u005cn\u0022, __func__, m-\u003emp3_state);\n+\n+\tswitch (m-\u003emp3_state) {\n+\tcase LAMP3STATE_IDLE:\n+\n+\t\tif (hit) {\n+\n+\t\t\tlws_ss_add_peer_tx_credit(m-\u003ess, n);\n+\n+\t\t\tif (ss_avs_mp3_open(m))\n+\t\t\t\tgoto bail;\n+\n+\t\t\tlws_sul_schedule(context, 0, \u0026m-\u003esul, use_buffer_250ms, 1);\n+\t\t\tm-\u003emp3_state \u003d LAMP3STATE_SPOOLING;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tlws_ss_add_peer_tx_credit(m-\u003ess, len);\n+\n+\t\tif (!m-\u003einside_mp3)\n+\t\t\tbreak;\n+\n+\t\t/* fallthru */\n+\n+\tcase LAMP3STATE_SPOOLING:\n+\n+\t\tif (m-\u003edribble)\n+\t\t\tgoto draining;\n+\n+\t\tif (len) {\n+\t\t\t/*\n+\t\t\t * We are shoving encoded mp3 into mpg123-allocated heap\n+\t\t\t * buffers... unfortunately mpg123 doesn't seem to\n+\t\t\t * expose where it is in its allocated input so we can\n+\t\t\t * track how much is stashed. Instead while in playback\n+\t\t\t * mode, we assume 64kbps mp3 encoding, ie, 8KB/s, and\n+\t\t\t * run a sul that allows an additional 2KB tx credit\n+\t\t\t * every 250ms, with 4KB initial credit.\n+\t\t\t */\n+\t\t\tlwsl_notice(\u0022%s: SPOOL %d\u005cn\u0022, __func__, (int)len);\n+\t\t\tmpg123_feed(m-\u003emh, buf, len);\n+\n+\t\t\tif (m-\u003efirst_mp3) {\n+\t\t\t\tlws_sul_schedule(context, 0, \u0026m-\u003esul,\n+\t\t\t\t\t\t use_buffer_250ms, 1);\n+\t\t//\t\tlws_ss_add_peer_tx_credit(m-\u003ess,\n+\t\t//\t\t\tlen + (MAX_MP3_IN_BUFFERING_BYTES / 2));\n+\t\t\t\tplay_mp3(m-\u003emh, NULL, NULL);\n+\t\t\t} //else\n+\t\t//\t\tlws_ss_add_peer_tx_credit(m-\u003ess, len);\n+\t\t\tm-\u003efirst_mp3 \u003d 0;\n+\t\t}\n+\n+\t\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\t\t/*\n+\t\t\t * This means one \u0022message\u0022 / mime part with mp3 data\n+\t\t\t * has finished coming in. But there may be whole other\n+\t\t\t * parts with other mp3s following, with potentially\n+\t\t\t * different mp3 parameters. So we want to tell this\n+\t\t\t * one to drain and finish and destroy the current mp3\n+\t\t\t * object before we go on.\n+\t\t\t *\n+\t\t\t * But not knowing the length of the current one, there\n+\t\t\t * will already be outstanding tx credit at the server,\n+\t\t\t * so it's going to spam us with the next part before we\n+\t\t\t * have the new mp3 sink for it.\n+\t\t\t */\n+\t\t\tlwsl_notice(\u0022%s: EOM\u005cn\u0022, __func__);\n+\t\t\tm-\u003emp3_mime_match \u003d 0;\n+\t\t\tm-\u003eseen \u003d 0;\n+\t\t\tm-\u003emp3_state \u003d LAMP3STATE_DRAINING;\n+\t\t\t/* from input POV, we're no longer inside an mp3 */\n+\t\t\tm-\u003einside_mp3 \u003d 0;\n+\t\t\tif (m-\u003emh)\n+\t\t\t\tplay_mp3(NULL, drain_end_cb, m);\n+#if 0\n+\t\t\t/*\n+\t\t\t * Put a hold on bringing in any more data\n+\t\t\t */\n+\t\t\tlws_sul_cancel(\u0026m-\u003esul);\n+#endif\n+\t\t\t/* destroy our copy of the handle */\n+\t\t\tm-\u003emh \u003d NULL;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LAMP3STATE_DRAINING:\n+\n+draining:\n+\t\tif (buf \u0026\u0026 len \u0026\u0026 m-\u003einside_mp3) {\n+\t\t\tlwsl_notice(\u0022%s: DRAINING: stashing %d: %d %d %d\u005cn\u0022,\n+\t\t\t\t __func__, (int)len, !!(flags \u0026 LWSSS_FLAG_EOM),\n+\t\t\t\t m-\u003ese_head, m-\u003ese_tail);\n+\t\t\tlwsl_hexdump_notice(buf, len);\n+\t\t\tif (lws_buflist_append_segment(\u0026m-\u003edribble, buf, len) \u003c 0)\n+\t\t\t\tgoto bail;\n+\n+\t\t\tm-\u003estash_eom[m-\u003ese_head] \u003d !!(flags \u0026 LWSSS_FLAG_EOM);\n+\t\t\tm-\u003ese_head \u003d (m-\u003ese_head + 1) % sizeof(m-\u003estash_eom);\n+\t\t\tlwsl_notice(\u0022%s: next head %d\u005cn\u0022, __func__, m-\u003ese_head);\n+\n+\t\t\tlws_ss_add_peer_tx_credit(m-\u003ess, len);\n+\t\t}\n+\n+\t\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\t\tif (!len \u0026\u0026 m-\u003ese_head !\u003d m-\u003ese_tail) {\n+\t\t\t\t/* 0-len EOM... retrospectively mark last stash */\n+\t\t\t\tlwsl_notice(\u0022%s: retro EOM\u005cn\u0022, __func__);\n+\t\t\t\tm-\u003estash_eom[(m-\u003ese_head - 1) % sizeof(m-\u003estash_eom)] \u003d 1;\n+\t\t\t}\n+\n+\t\t\tlwsl_notice(\u0022%s: Draining EOM\u005cn\u0022, __func__);\n+\t\t\tm-\u003einside_mp3 \u003d 0;\n+\t\t}\n+\t\t/*\n+\t\t * Don't provide any additional tx credit... we're just\n+\t\t * mopping up the overspill from the previous mp3 credit\n+\t\t */\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\treturn -1;\n+}\n+\n+/*\n+ * Because this is multipart mime in h2 currently, use a \u0022rideshare\u0022 to handle\n+ * first the native metadata on this secure stream, then the \u0022rideshare\u0022 audio\n+ * stream mentioned in the policy.\n+ *\n+ * Lws takes care of interleaving the multipart mime pieces since the policy\n+ * calls for it.\n+ */\n+\n+static lws_ss_state_return_t\n+ss_avs_metadata_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf,\n+\t\t size_t *len, int *flags)\n+{\n+\tss_avs_metadata_t *m \u003d (ss_avs_metadata_t *)userobj;\n+\tsize_t tot;\n+\tint n;\n+\n+\t// lwsl_notice(\u0022%s %d\u005cn\u0022, __func__, (int)m-\u003epos);\n+\n+\tif ((long)m-\u003epos \u003c 0) {\n+\t\t*len \u003d 0;\n+\t\tlwsl_info(\u0022%s: skip\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tif (!strcmp(lws_ss_rideshare(m-\u003ess), \u0022avs_audio\u0022)) {\n+\n+\t\t/* audio rideshare part */\n+\n+\t\tif (!m-\u003epos)\n+\t\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\t\tn \u003d spool_capture(buf, *len);\n+\t\tif (n \u003e 0)\n+\t\t\t*len \u003d n;\n+\t\telse\n+\t\t\t*len \u003d 0;\n+\t\tif (!n) {\n+\t\t\tlwsl_info(\u0022%s: trying to skip tx\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tm-\u003epos +\u003d *len;\n+\n+\t\tif (n \u003c 0) {\n+\t\t\t*flags |\u003d LWSSS_FLAG_EOM;\n+\t\t\tm-\u003epos \u003d (long)-1l; /* ban subsequent until new stream */\n+\t\t}\n+\n+\t\tlwsl_notice(\u0022%s: tx audio %d\u005cn\u0022, __func__, (int)*len);\n+\n+#if 0\n+\t\t{\n+\t\t\tint ff \u003d open(\u0022/tmp/z1\u0022, O_RDWR | O_CREAT | O_APPEND, 0666);\n+\t\t\tif (ff \u003d\u003d -1)\n+\t\t\t\tlwsl_err(\u0022%s: errno %d\u005cn\u0022, __func__, errno);\n+\t\t\twrite(ff, buf, *len);\n+\t\t\tclose(ff);\n+\t\t}\n+#endif\n+\n+\t\treturn 0;\n+\t}\n+\n+\t/* metadata part */\n+\n+\ttot \u003d strlen(metadata);\n+\n+\tif (!m-\u003epos)\n+\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\tif (*len \u003e tot - m-\u003epos)\n+\t\t*len \u003d tot - m-\u003epos;\n+\n+\tmemcpy(buf, metadata + m-\u003epos, *len);\n+\n+\tm-\u003epos +\u003d *len;\n+\n+\tif (m-\u003epos \u003d\u003d tot) {\n+\t\tlwsl_notice(\u0022metadata done\u005cn\u0022);\n+\t\t*flags |\u003d LWSSS_FLAG_EOM;\n+\t\tm-\u003epos \u003d 0; /* for next time */\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_metadata_state(void *userobj, void *sh,\n+\t\t lws_ss_constate_t state, lws_ss_tx_ordinal_t ack)\n+{\n+\tss_avs_metadata_t *m \u003d (ss_avs_metadata_t *)userobj;\n+\tstruct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\n+\tlwsl_notice(\u0022%s: %p: %s, ord 0x%x\u005cn\u0022, __func__, m-\u003ess,\n+\t\t lws_ss_state_name(state), (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_CONNECTING:\n+\t\tm-\u003epos \u003d 0;\n+\t\tbreak;\n+\tcase LWSSSCS_CONNECTED:\n+\t\tlwsl_info(\u0022%s: CONNECTED\u005cn\u0022, __func__);\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tlws_sul_cancel(\u0026m-\u003esul);\n+\t\t//if (m-\u003emh) {\n+\t\t\tplay_mp3(NULL, NULL, NULL);\n+\t\t\tm-\u003emh \u003d NULL;\n+\t\t//}\n+\t\t/*\n+\t\t * For this stream encapsulating an alexa exchange, dropping\n+\t\t * is the end of its life\n+\t\t */\n+\t\treturn 1;\n+\n+\tcase LWSSSCS_DESTROYING:\n+\t\tlws_buflist_destroy_all_segments(\u0026m-\u003edribble);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * avs event\n+ */\n+\n+static lws_ss_state_return_t\n+ss_avs_event_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_event_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf,\n+\t\t size_t *len, int *flags)\n+{\n+\treturn 1; /* don't transmit anything */\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_event_state(void *userobj, void *sh,\n+\t\t lws_ss_constate_t state, lws_ss_tx_ordinal_t ack)\n+{\n+\tlwsl_info(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name(state),\n+\t\t (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tmpg123_init();\n+\t\tbreak;\n+\tcase LWSSSCS_CONNECTING:\n+\t\tbreak;\n+\tcase LWSSSCS_CONNECTED:\n+\t\tlwsl_user(\u0022Connected to Alexa... speak \u005c\u0022Alexa, ...\u005c\u0022\u005cn\u0022);\n+\t\tbreak;\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tlwsl_user(\u0022Disconnected from Alexa\u005cn\u0022);\n+\t\tbreak;\n+\tcase LWSSSCS_DESTROYING:\n+\t\tmpg123_exit();\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n+avs_query_start(struct lws_context *context)\n+{\n+\tlws_ss_info_t ssi;\n+\n+\tlwsl_notice(\u0022%s:\u005cn\u0022, __func__);\n+\n+\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\tssi.handle_offset\t \u003d offsetof(ss_avs_metadata_t, ss);\n+\tssi.opaque_user_data_offset \u003d offsetof(ss_avs_metadata_t, opaque_data);\n+\tssi.rx\t\t\t \u003d ss_avs_metadata_rx;\n+\tssi.tx\t\t\t \u003d ss_avs_metadata_tx;\n+\tssi.state\t\t \u003d ss_avs_metadata_state;\n+\tssi.user_alloc\t\t \u003d sizeof(ss_avs_metadata_t);\n+\tssi.streamtype\t\t \u003d \u0022avs_metadata\u0022;\n+\n+\tssi.manual_initial_tx_credit \u003d 8192;\n+\n+\tif (lws_ss_create(context, 0, \u0026ssi, context, \u0026hss_avs_sync, NULL, NULL)) {\n+\t\tlwsl_err(\u0022%s: failed to create avs metadata secstream\u005cn\u0022,\n+\t\t\t __func__);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tlwsl_user(\u0022%s: created query stream %p\u005cn\u0022, __func__, hss_avs_sync);\n+\n+\treturn 0;\n+}\n+\n+int\n+avs_example_start(struct lws_context *context)\n+{\n+\tlws_ss_info_t ssi;\n+\n+\tif (hss_avs_event)\n+\t\treturn 0;\n+\n+\tlwsl_info(\u0022%s: Starting AVS stream\u005cn\u0022, __func__);\n+\n+\t/* AVS wants us to establish the long poll event stream first */\n+\n+\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\tssi.handle_offset\t \u003d offsetof(ss_avs_event_t, ss);\n+\tssi.opaque_user_data_offset \u003d offsetof(ss_avs_event_t, opaque_data);\n+\tssi.rx\t\t\t \u003d ss_avs_event_rx;\n+\tssi.tx\t\t\t \u003d ss_avs_event_tx;\n+\tssi.state\t\t \u003d ss_avs_event_state;\n+\tssi.user_alloc\t\t \u003d sizeof(ss_avs_event_t);\n+\tssi.streamtype\t\t \u003d \u0022avs_event\u0022;\n+\n+\tif (lws_ss_create(context, 0, \u0026ssi, context, \u0026hss_avs_event, NULL, NULL)) {\n+\t\tlwsl_err(\u0022%s: failed to create avs event secure stream\u005cn\u0022,\n+\t\t\t __func__);\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa_linux.ppn b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa_linux.ppn\nnew file mode 100644\nindex 0000000..839156d\nBinary files /dev/null and b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa_linux.ppn differ\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/audio.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/audio.c\nnew file mode 100644\nindex 0000000..6233db4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/audio.c\n@@ -0,0 +1,469 @@\n+/*\n+ * alsa audio handling\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003csys/stat.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+#include \u003calsa/asoundlib.h\u003e\n+#include \u003cpv_porcupine.h\u003e\n+\n+#include \u003cmpg123.h\u003e\n+\n+#include \u0022private.h\u0022\n+\n+extern struct lws_ss_handle *hss_avs_event, *hss_avs_sync;\n+\n+int\n+avs_query_start(struct lws_context *context);\n+\n+enum {\n+\tMODE_IDLE,\n+\tMODE_CAPTURING,\n+\tMODE_PLAYING\n+};\n+\n+struct raw_vhd {\n+\tint16_t\t\t\tp[8 * 1024]; /* 500ms at 16kHz 16-bit PCM */\n+\tpv_porcupine_object_t\t*porc;\n+\tsnd_pcm_t\t\t*pcm_capture;\n+\tsnd_pcm_t\t\t*pcm_playback;\n+\tsnd_pcm_hw_params_t\t*params;\n+\tsnd_pcm_uframes_t\tframes;\n+\tint16_t\t\t\t*porcbuf;\n+\n+\tmpg123_handle\t\t*mh;\n+\n+\tmp3_done_cb\t\tdone_cb;\n+\tvoid\t\t\t*opaque;\n+\n+\tint\t\t\tmode;\n+\tint\t\t\trate;\n+\n+\tint\t\t\tporc_spf;\n+\tint\t\t\tfilefd;\n+\tint\t\t\trpos;\n+\tint\t\t\twpos;\n+\tint\t\t\tporcpos;\n+\tint\t\t\tnpos;\n+\tint\t\t\ttimes;\n+\tint\t\t\tquietcount;\n+\tint\t\t\tanycount;\n+\n+\tint\t\t\twplay;\n+\tint\t\t\trplay;\n+\n+\tchar\t\t\tlast_wake_detect;\n+\tchar\t\t\tdestroy_mh_on_drain;\n+};\n+\n+static struct raw_vhd *avhd;\n+\n+/*\n+ * called from alexa.c to grab the next chunk of audio capture buffer\n+ * for upload\n+ */\n+\n+int\n+spool_capture(uint8_t *buf, size_t len)\n+{\n+\tint16_t *sam \u003d (int16_t *)buf;\n+\tsize_t s, os;\n+\n+\tif (avhd-\u003emode !\u003d MODE_CAPTURING)\n+\t\treturn -1;\n+\n+\tos \u003d s \u003d len / 2;\n+\n+\twhile (s \u0026\u0026 avhd-\u003ewpos !\u003d avhd-\u003enpos) {\n+\t\t*sam++ \u003d avhd-\u003ep[avhd-\u003enpos];\n+\t\tavhd-\u003enpos \u003d (avhd-\u003enpos + 1) % LWS_ARRAY_SIZE(avhd-\u003ep);\n+\t\ts--;\n+\t}\n+\n+\tlwsl_info(\u0022Copied %d samples (%d %d)\u005cn\u0022, (int)(os - s),\n+\t\t\tavhd-\u003ewpos, avhd-\u003enpos);\n+\n+\treturn (os - s) * 2;\n+}\n+\n+/*\n+ * Called from alexa.c to control when the mp3 playback should begin and end\n+ */\n+\n+int\n+play_mp3(mpg123_handle *mh, mp3_done_cb cb, void *opaque)\n+{\n+\tif (mh) {\n+\t\tavhd-\u003emh \u003d mh;\n+\t\tavhd-\u003emode \u003d MODE_PLAYING;\n+\t\tsnd_pcm_prepare(avhd-\u003epcm_playback);\n+\n+\t\treturn 0;\n+\t}\n+\n+\tavhd-\u003edestroy_mh_on_drain \u003d 1;\n+\tavhd-\u003edone_cb \u003d cb;\n+\tavhd-\u003eopaque \u003d opaque;\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * Helper used to set alsa hwparams on both capture and playback channels\n+ */\n+\n+static int\n+set_hw_params(struct lws_vhost *vh, snd_pcm_t **pcm, int type)\n+{\n+\tunsigned int rate \u003d pv_sample_rate(); /* it's 16kHz */\n+\tsnd_pcm_hw_params_t *params;\n+\tlws_sock_file_fd_type u;\n+\tstruct pollfd pfd;\n+\tstruct lws *wsi1;\n+\tint n;\n+\n+\tn \u003d snd_pcm_open(pcm, \u0022default\u0022, type, SND_PCM_NONBLOCK);\n+\tif (n \u003c 0) {\n+\t\tlwsl_err(\u0022%s: Can't open default for playback: %s\u005cn\u0022,\n+\t\t\t __func__, snd_strerror(n));\n+\n+\t\treturn -1;\n+\t}\n+\n+\tif (snd_pcm_poll_descriptors(*pcm, \u0026pfd, 1) !\u003d 1) {\n+\t\tlwsl_err(\u0022%s: failed to get playback desc\u005cn\u0022, __func__);\n+\t\treturn -1;\n+\t}\n+\n+\tu.filefd \u003d (lws_filefd_type)(long long)pfd.fd;\n+\twsi1 \u003d lws_adopt_descriptor_vhost(vh, LWS_ADOPT_RAW_FILE_DESC, u,\n+\t\t\t\t\t \u0022lws-audio-test\u0022, NULL);\n+\tif (!wsi1) {\n+\t\tlwsl_err(\u0022%s: Failed to adopt playback desc\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\tif (type \u003d\u003d SND_PCM_STREAM_PLAYBACK)\n+\t\tlws_rx_flow_control(wsi1, 0); /* no POLLIN */\n+\n+\tsnd_pcm_hw_params_malloc(\u0026params);\n+\tsnd_pcm_hw_params_any(*pcm, params);\n+\n+\tn \u003d snd_pcm_hw_params_set_access(*pcm, params,\n+\t\t\t\t\t SND_PCM_ACCESS_RW_INTERLEAVED);\n+\tif (n \u003c 0)\n+\t\tgoto bail1;\n+\n+\tn \u003d snd_pcm_hw_params_set_format(*pcm, params, SND_PCM_FORMAT_S16_LE);\n+\tif (n \u003c 0)\n+\t\tgoto bail1;\n+\n+\tn \u003d snd_pcm_hw_params_set_channels(*pcm, params, 1);\n+\tif (n \u003c 0)\n+\t\tgoto bail1;\n+\n+\tn \u003d snd_pcm_hw_params_set_rate_near(*pcm, params, \u0026rate, 0);\n+\tif (n \u003c 0)\n+\t\tgoto bail1;\n+\n+\tlwsl_notice(\u0022%s: %s rate %d\u005cn\u0022, __func__,\n+\t\ttype \u003d\u003d SND_PCM_STREAM_PLAYBACK ? \u0022Playback\u0022 : \u0022Capture\u0022, rate);\n+\n+\tn \u003d snd_pcm_hw_params(*pcm, params);\n+\tsnd_pcm_hw_params_free(params);\n+\tif (n \u003c 0)\n+\t\tgoto bail;\n+\n+\treturn 0;\n+\n+bail1:\n+\tsnd_pcm_hw_params_free(params);\n+bail:\n+\tlwsl_err(\u0022%s: Set hw params failed: %s\u005cn\u0022, __func__, snd_strerror(n));\n+\n+\treturn -1;\n+}\n+\n+/*\n+ * The lws RAW file protocol handler that wraps ALSA.\n+ *\n+ * The timing is coming from ALSA capture channel... since they are both set to\n+ * 16kHz, it's enough just to have the one.\n+ */\n+\n+static int\n+callback_audio(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n+\t void *in, size_t len)\n+{\n+\tstruct raw_vhd *vhd \u003d (struct raw_vhd *)lws_protocol_vh_priv_get(\n+\t\t\t\t lws_get_vhost(wsi), lws_get_protocol(wsi));\n+\tuint16_t rands[50];\n+\tint16_t temp[256];\n+\tbool det;\n+\tlong avg;\n+\tint n, s;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\n+\t\tif (avhd) /* just on one vhost */\n+\t\t\treturn 0;\n+\n+\t\tavhd \u003d vhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi), sizeof(struct raw_vhd));\n+\n+\t\t/*\n+\t\t * Set up the wakeword library\n+\t\t */\n+\n+\t\tn \u003d pv_porcupine_init(\u0022porcupine_params.pv\u0022, \u0022alexa_linux.ppn\u0022,\n+\t\t\t\t\t1.0, \u0026vhd-\u003eporc);\n+\t\tif (n) {\n+\t\t\tlwsl_err(\u0022%s: porcupine init fail %d\u005cn\u0022, __func__, n);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\t\tvhd-\u003eporc_spf \u003d pv_porcupine_frame_length();\n+\t\tvhd-\u003eporcbuf \u003d malloc(vhd-\u003eporc_spf * 2);\n+\t\tlwsl_info(\u0022%s: %s porc frame length is %d samples\u005cn\u0022, __func__,\n+\t\t\t\tlws_get_vhost_name(lws_get_vhost(wsi)),\n+\t\t\t\tvhd-\u003eporc_spf);\n+\n+\t\tvhd-\u003erate \u003d pv_sample_rate(); /* 16kHz */\n+\n+\t\t/* set up alsa */\n+\n+\t\tif (set_hw_params(lws_get_vhost(wsi), \u0026vhd-\u003epcm_playback,\n+\t\t\t\t SND_PCM_STREAM_PLAYBACK)) {\n+\t\t\tlwsl_err(\u0022%s: Can't open default for playback\u005cn\u0022,\n+\t\t\t\t __func__);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tif (set_hw_params(lws_get_vhost(wsi), \u0026vhd-\u003epcm_capture,\n+\t\t\t\t SND_PCM_STREAM_CAPTURE)) {\n+\t\t\tlwsl_err(\u0022%s: Can't open default for capture\u005cn\u0022,\n+\t\t\t\t __func__);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tsnd_config_update_free_global();\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tlwsl_info(\u0022%s: LWS_CALLBACK_PROTOCOL_DESTROY\u005cn\u0022, __func__);\n+\t\tif (!vhd)\n+\t\t\tbreak;\n+\n+\t\tif (vhd-\u003eporcbuf) {\n+\t\t\tfree(vhd-\u003eporcbuf);\n+\t\t\tvhd-\u003eporcbuf \u003d NULL;\n+\t\t}\n+\t\tif (vhd-\u003epcm_playback) {\n+\t\t\tsnd_pcm_drop(vhd-\u003epcm_playback);\n+\t\t\tsnd_pcm_close(vhd-\u003epcm_playback);\n+\t\t\tvhd-\u003epcm_playback \u003d NULL;\n+\t\t}\n+\t\tif (vhd-\u003epcm_capture) {\n+\t\t\tsnd_pcm_drop(vhd-\u003epcm_capture);\n+\t\t\tsnd_pcm_close(vhd-\u003epcm_capture);\n+\t\t\tvhd-\u003epcm_capture \u003d NULL;\n+\t\t}\n+\t\tif (vhd-\u003eporc) {\n+\t\t\tpv_porcupine_delete(vhd-\u003eporc);\n+\t\t\tvhd-\u003eporc \u003d NULL;\n+\t\t}\n+\n+\t\t/* avoid most of the valgrind mess from alsa */\n+\t\tsnd_config_update_free_global();\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE_FILE:\n+\t\tlwsl_info(\u0022%s: closed\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX_FILE:\n+\t\t/* we come here about every 250ms */\n+\n+\t\t/*\n+\t\t * Playing back the mp3?\n+\t\t */\n+\t\tif (vhd-\u003emode \u003d\u003d MODE_PLAYING \u0026\u0026 vhd-\u003emh) {\n+\t\t\tsize_t amt, try;\n+\n+\t\t\tdo {\n+\t\t\t\ttry \u003d snd_pcm_avail(vhd-\u003epcm_playback);\n+\t\t\t\tif (try \u003e LWS_ARRAY_SIZE(vhd-\u003ep))\n+\t\t\t\t\ttry \u003d LWS_ARRAY_SIZE(vhd-\u003ep);\n+\n+\t\t\t\tn \u003d mpg123_read(vhd-\u003emh, (uint8_t *)vhd-\u003ep,\n+\t\t\t\t\t\ttry * 2, \u0026amt);\n+\t\t\t\tlwsl_info(\u0022%s: PLAYING: mpg123 read %d, n %d\u005cn\u0022,\n+\t\t\t\t\t\t__func__, (int)amt, n);\n+\t\t\t\tif (n \u003d\u003d MPG123_NEW_FORMAT) {\n+\t\t\t\t\tsnd_pcm_start(vhd-\u003epcm_playback);\n+\t\t\t\t\tmemset(vhd-\u003ep, 0, try);\n+\t\t\t\t\tsnd_pcm_writei(vhd-\u003epcm_playback,\n+\t\t\t\t\t\t vhd-\u003ep, try / 2);\n+\t\t\t\t\tsnd_pcm_prepare(vhd-\u003epcm_playback);\n+\t\t\t\t}\n+\t\t\t} while (n \u003d\u003d MPG123_NEW_FORMAT);\n+\n+\t\t\tif (amt) {\n+\t\t\t\tn \u003d snd_pcm_writei(vhd-\u003epcm_playback,\n+\t\t\t\t\t\t vhd-\u003ep, amt / 2);\n+\t\t\t\tif (n \u003c 0)\n+\t\t\t\t\tlwsl_notice(\u0022%s: snd_pcm_writei: %d %s\u005cn\u0022,\n+\t\t\t\t\t\t __func__, n, snd_strerror(n));\n+\t\t\t\tif (n \u003d\u003d -EPIPE) {\n+\t\t\t\t\tlwsl_err(\u0022%s: did EPIPE prep\u005cn\u0022, __func__);\n+\t\t\t\t\tsnd_pcm_prepare(vhd-\u003epcm_playback);\n+\t\t\t\t}\n+\t\t\t} else\n+\t\t\t\tif (vhd-\u003edestroy_mh_on_drain \u0026\u0026\n+\t\t\t\t n !\u003d MPG123_NEW_FORMAT) {\n+\t\t\t\t\tsnd_pcm_drain(vhd-\u003epcm_playback);\n+\t\t\t\t\tvhd-\u003edestroy_mh_on_drain \u003d 0;\n+\t\t\t\t\tlwsl_notice(\u0022%s: mp3 destroyed\u005cn\u0022,\n+\t\t\t\t\t\t\t__func__);\n+\t\t\t\t\tmpg123_close(vhd-\u003emh);\n+\t\t\t\t\tmpg123_delete(vhd-\u003emh);\n+\t\t\t\t\tvhd-\u003emh \u003d NULL;\n+\t\t\t\t\tvhd-\u003emode \u003d MODE_IDLE;\n+\n+\t\t\t\t\tif (vhd-\u003edone_cb)\n+\t\t\t\t\t\tvhd-\u003edone_cb(vhd-\u003eopaque);\n+\t\t\t\t}\n+\t\t}\n+\n+\t\t/*\n+\t\t * Get the capture data\n+\t\t */\n+\n+\t\tn \u003d snd_pcm_readi(vhd-\u003epcm_capture, temp, LWS_ARRAY_SIZE(temp));\n+\t\ts \u003d 0;\n+\t\twhile (s \u003c n) {\n+\t\t\tvhd-\u003ep[(vhd-\u003ewpos + s) % LWS_ARRAY_SIZE(vhd-\u003ep)] \u003d temp[s];\n+\t\t\ts++;\n+\t\t}\n+\n+\t\tif (vhd-\u003emode \u003d\u003d MODE_CAPTURING) {\n+\n+\t\t\t/*\n+\t\t\t * We are recording an utterance.\n+\t\t\t *\n+\t\t\t * Estimate the sound density in the frame by picking 50\n+\t\t\t * samples at random and averaging the sampled\n+\t\t\t * [abs()^2] / 10000 to create a Figure of Merit.\n+\t\t\t *\n+\t\t\t * Speaking on my laptop gets us 1000 - 5000, silence\n+\t\t\t * is typ under 30. The wakeword tells us there was\n+\t\t\t * speech at the start, end the capture when there's\n+\t\t\t * ~750ms (12000 samples) under 125 FOM.\n+\t\t\t */\n+\n+#define SILENCE_THRESH 125\n+\n+\t\t\tavg \u003d 0;\n+\t\t\tlws_get_random(lws_get_context(wsi), rands, sizeof(rands));\n+\t\t\tfor (s \u003d 0; s \u003c (int)LWS_ARRAY_SIZE(rands); s++) {\n+\t\t\t\tlong q;\n+\n+\t\t\t\tq \u003d temp[rands[s] % n];\n+\n+\t\t\t\tavg +\u003d (q * q);\n+\t\t\t}\n+\t\t\tavg \u003d (avg / (int)LWS_ARRAY_SIZE(rands)) / 10000;\n+\n+\t\t\tlwsl_notice(\u0022est audio energy: %ld %d\u005cn\u0022, avg, vhd-\u003emode);\n+\n+\t\t\t/*\n+\t\t\t * Only start looking for \u0022silence\u0022 after 1.5s, in case\n+\t\t\t * he does a long pause after the wakeword\n+\t\t\t */\n+\n+\t\t\tif (vhd-\u003eanycount \u003c (3 *vhd-\u003erate) / 2 \u0026\u0026\n+\t\t\t avg \u003c SILENCE_THRESH) {\n+\t\t\t\tvhd-\u003equietcount +\u003d n;\n+\t\t\t\t/* then 500ms of \u0022silence\u0022 does it for us */\n+\t\t\t\tif (vhd-\u003equietcount \u003e\u003d ((vhd-\u003erate * 3) / 4)) {\n+\t\t\t\t\tlwsl_warn(\u0022%s: ended capture\u005cn\u0022, __func__);\n+\t\t\t\t\tvhd-\u003emode \u003d MODE_IDLE;\n+\t\t\t\t\tvhd-\u003equietcount \u003d 0;\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\t/* if we're not \u0022silent\u0022, reset the count */\n+\t\t\tif (avg \u003e SILENCE_THRESH * 2)\n+\t\t\t\tvhd-\u003equietcount \u003d 0;\n+\n+\t\t\t/*\n+\t\t\t * Since we are in capturing mode, we have something\n+\t\t\t * new to send now.\n+\t\t\t *\n+\t\t\t * We must send an extra one at the end so we can finish\n+\t\t\t * the tx.\n+\t\t\t */\n+\t\t\tlws_ss_request_tx(hss_avs_sync);\n+\t\t}\n+\n+\t\t/*\n+\t\t * Just waiting for a wakeword\n+\t\t */\n+\n+\t\twhile (vhd-\u003emode \u003d\u003d MODE_IDLE) {\n+\t\t\tint m \u003d 0, ppold \u003d vhd-\u003eporcpos;\n+\n+\t\t\ts \u003d (vhd-\u003ewpos - vhd-\u003eporcpos) % LWS_ARRAY_SIZE(vhd-\u003ep);\n+\t\t\tif (s \u003c vhd-\u003eporc_spf)\n+\t\t\t\tgoto eol;\n+\n+\t\t\twhile (m \u003c vhd-\u003eporc_spf) {\n+\t\t\t\tvhd-\u003eporcbuf[m++] \u003d avhd-\u003ep[vhd-\u003eporcpos];\n+\t\t\t\tvhd-\u003eporcpos \u003d (vhd-\u003eporcpos + 1) %\n+\t\t\t\t\t\t\tLWS_ARRAY_SIZE(vhd-\u003ep);\n+\t\t\t}\n+\n+\t\t\tif (pv_porcupine_process(vhd-\u003eporc, vhd-\u003eporcbuf, \u0026det))\n+\t\t\t\tlwsl_err(\u0022%s: porc_process failed\u005cn\u0022, __func__);\n+\n+\t\t\tif (!det \u0026\u0026 vhd-\u003elast_wake_detect \u0026\u0026\n+\t\t\t vhd-\u003emode \u003d\u003d MODE_IDLE) {\n+\t\t\t\tlwsl_warn(\u0022************* Wakeword\u005cn\u0022);\n+\t\t\t\tif (!avs_query_start(lws_get_context(wsi))) {\n+\t\t\t\t\tvhd-\u003emode \u003d MODE_CAPTURING;\n+\t\t\t\t\tvhd-\u003equietcount \u003d 0;\n+\t\t\t\t\tvhd-\u003elast_wake_detect \u003d det;\n+\t\t\t\t\tvhd-\u003enpos \u003d ppold;\n+\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tvhd-\u003elast_wake_detect \u003d det;\n+\t\t}\n+\n+eol:\n+\t\tvhd-\u003ewpos \u003d (vhd-\u003ewpos + n) % LWS_ARRAY_SIZE(vhd-\u003ep);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+struct lws_protocols protocol_audio_test \u003d\n+\t{ \u0022lws-audio-test\u0022, callback_audio, 0, 0 };\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/main.c\nnew file mode 100644\nindex 0000000..f6a24d7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/main.c\n@@ -0,0 +1,421 @@\n+/*\n+ * lws-minimal-secure-streams-alexa\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+extern int\n+avs_example_start(struct lws_context *context);\n+\n+static int interrupted;\n+static lws_state_notify_link_t nl;\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+/*\n+ * If not using the proxy, we need to bring our own policy\n+ */\n+\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002260,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002264\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t\u0022{\u005c\u0022digicert_global_root_g2\u005c\u0022: \u005c\u0022\u0022 /* api.amazon.com 2038-01 */\n+\t\u0022MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\u0022\n+\t\u0022MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\u0022\n+\t\u0022d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\u0022\n+\t\u0022MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\u0022\n+\t\u0022MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\u0022\n+\t\u0022b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\u0022\n+\t\u00229w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\u0022\n+\t\u00222/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\u0022\n+\t\u00221x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\u0022\n+\t\u0022q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\u0022\n+\t\u0022tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\u0022\n+\t\u0022vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\u0022\n+\t\u0022BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\u0022\n+\t\u00225uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\u0022\n+\t\u00221Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\u0022\n+\t\u0022NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\u0022\n+\t\u0022Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\u0022\n+\t\u00228rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\u0022\n+\t\u0022pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\u0022\n+\t\u0022MrY\u003d\u0022\n+\t\t\u0022\u005c\u0022},\u0022\n+\t\t\u0022{\u005c\u0022digicert_global_ca_g2\u005c\u0022: \u005c\u0022\u0022 /* api.amazon.com 2028-08 */\n+\t\u0022MIIEizCCA3OgAwIBAgIQDI7gyQ1qiRWIBAYe4kH5rzANBgkqhkiG9w0BAQsFADBh\u0022\n+\t\u0022MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\u0022\n+\t\u0022d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\u0022\n+\t\u0022MjAeFw0xMzA4MDExMjAwMDBaFw0yODA4MDExMjAwMDBaMEQxCzAJBgNVBAYTAlVT\u0022\n+\t\u0022MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxHjAcBgNVBAMTFURpZ2lDZXJ0IEdsb2Jh\u0022\n+\t\u0022bCBDQSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNIfL7zBYZd\u0022\n+\t\u0022W9UvhU5L4IatFaxhz1uvPmoKR/uadpFgC4przc/cV35gmAvkVNlW7SHMArZagV+X\u0022\n+\t\u0022au4CLyMnuG3UsOcGAngLH1ypmTb+u6wbBfpXzYEQQGfWMItYNdSWYb7QjHqXnxr5\u0022\n+\t\u0022IuYUL6nG6AEfq/gmD6yOTSwyOR2Bm40cZbIc22GoiS9g5+vCShjEbyrpEJIJ7RfR\u0022\n+\t\u0022ACvmfe8EiRROM6GyD5eHn7OgzS+8LOy4g2gxPR/VSpAQGQuBldYpdlH5NnbQtwl6\u0022\n+\t\u0022OErXb4y/E3w57bqukPyV93t4CTZedJMeJfD/1K2uaGvG/w/VNfFVbkhJ+Pi474j4\u0022\n+\t\u00228V4Rd6rfArMCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0P\u0022\n+\t\u0022AQH/BAQDAgGGMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29j\u0022\n+\t\u0022c3AuZGlnaWNlcnQuY29tMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9jcmw0LmRp\u0022\n+\t\u0022Z2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOGMWh0dHA6\u0022\n+\t\u0022Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwPQYD\u0022\n+\t\u0022VR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2lj\u0022\n+\t\u0022ZXJ0LmNvbS9DUFMwHQYDVR0OBBYEFCRuKy3QapJRUSVpAaqaR6aJ50AgMB8GA1Ud\u0022\n+\t\u0022IwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA0GCSqGSIb3DQEBCwUAA4IBAQAL\u0022\n+\t\u0022OYSR+ZfrqoGvhOlaOJL84mxZvzbIRacxAxHhBsCsMsdaVSnaT0AC9aHesO3ewPj2\u0022\n+\t\u0022dZ12uYf+QYB6z13jAMZbAuabeGLJ3LhimnftiQjXS8X9Q9ViIyfEBFltcT8jW+rZ\u0022\n+\t\u00228uckJ2/0lYDblizkVIvP6hnZf1WZUXoOLRg9eFhSvGNoVwvdRLNXSmDmyHBwW4co\u0022\n+\t\u0022atc7TlJFGa8kBpJIERqLrqwYElesA8u49L3KJg6nwd3jM+/AVTANlVlOnAM2BvjA\u0022\n+\t\u0022jxSZnE0qnsHhfTuvcqdFuhOWKU4Z0BqYBvQ3lBetoxi6PrABDJXWKTUgNX31EGDk\u0022\n+\t\u002292hiHuwZ4STyhxGs6QiA\u0022\n+\t\t\u0022\u005c\u0022},\u0022\n+\t\t\u0022{\u005c\u0022amazon_root_ca_1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\u0022\n+\t\u0022ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\u0022\n+\t\u0022b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\u0022\n+\t\u0022MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\u0022\n+\t\u0022b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\u0022\n+\t\u0022ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\u0022\n+\t\u00229O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\u0022\n+\t\u0022IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\u0022\n+\t\u0022VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\u0022\n+\t\u002293FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\u0022\n+\t\u0022jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\u0022\n+\t\u0022AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\u0022\n+\t\u0022A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\u0022\n+\t\u0022U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\u0022\n+\t\u0022N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\u0022\n+\t\u0022o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\u0022\n+\t\u00225MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\u0022\n+\t\u0022rqXRfboQnoZsG4q5WTP468SQvvG5\u0022\n+\t\t\u0022\u005c\u0022},\u0022\n+\t\t\u0022{\u005c\u0022starfield_services_root_ca\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\u0022\n+\t\u0022EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\u0022\n+\t\u0022HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\u0022\n+\t\u0022ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\u0022\n+\t\u0022MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\u0022\n+\t\u0022VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\u0022\n+\t\u0022ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\u0022\n+\t\u0022dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\u0022\n+\t\u0022hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\u0022\n+\t\u0022OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\u0022\n+\t\u00228xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\u0022\n+\t\u0022Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\u0022\n+\t\u0022hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\u0022\n+\t\u00226mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\u0022\n+\t\u0022DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\u0022\n+\t\u0022AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\u0022\n+\t\u0022bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\u0022\n+\t\u0022ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\u0022\n+\t\u0022qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\u0022\n+\t\u0022iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\u0022\n+\t\u00220q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\u0022\n+\t\u0022sSi6\u0022\n+\t\t\u0022\u005c\u0022},\u0022\n+\t\t\u0022{\u005c\u0022starfield_class_2_ca\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\u0022\n+\t\u0022MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\u0022\n+\t\u0022U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\u0022\n+\t\u0022NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\u0022\n+\t\u0022ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\u0022\n+\t\u0022ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\u0022\n+\t\u0022DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\u0022\n+\t\u00228MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\u0022\n+\t\u0022+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\u0022\n+\t\u0022X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\u0022\n+\t\u0022K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\u0022\n+\t\u00221W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\u0022\n+\t\u0022A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\u0022\n+\t\u0022zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\u0022\n+\t\u0022YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\u0022\n+\t\u0022bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\u0022\n+\t\u0022DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\u0022\n+\t\u0022L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\u0022\n+\t\u0022eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\u0022\n+\t\u0022xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\u0022\n+\t\u0022VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\u0022\n+\t\u0022WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q\u003d\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022 /* chain for alexa.na.gateway.devices.a2z.com */\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022avs_via_starfield\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022starfield_class_2_ca\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022starfield_services_root_ca\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022},\u0022\n+\t\t\u0022{\u0022 /* chain for api.amazon.com */\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022api_amazon_com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022digicert_global_ca_g2\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022digicert_global_root_g2\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022auth\u005c\u0022: [\u0022 /* available auth type bindings */\n+\t\t\u0022{\u0022\n+\t\t \u0022\u005c\u0022name\u005c\u0022:\u0022\t\t\u0022\u005c\u0022lwa\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022streamtype\u005c\u0022:\u0022\t\u0022\u005c\u0022api_amazon_com_lwa\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022blob\u005c\u0022:\u0022\t\t\u00220\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022 /* the supported stream types */\n+\t\t\u0022{\u005c\u0022api_amazon_com_lwa\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022api.amazon.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022auth/o2/token\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_www_form_urlencoded\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_no_content_length\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022api_amazon_com\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t/*\n+\t\t * long poll event listener\n+\t\t */\n+\t\t\u0022{\u005c\u0022avs_event\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022alexa.na.gateway.devices.a2z.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022v20160207/directives\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022use_auth\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022lwa\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_header\u005c\u0022:\u0022\t\t\u0022\u005c\u0022authorization:\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_preamble\u005c\u0022:\u0022\t\u0022\u005c\u0022Bearer \u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_multipart_ss_in\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022nailed_up\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022long_poll\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022avs_via_starfield\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t/*\n+\t\t * Utterance metadata and audio send and reply processing.\n+\t\t *\n+\t\t * \u0022Rideshare\u0022 and http_multipart_mime means these both go out\n+\t\t * in one multipart http transaction.\n+\t\t */\n+\t\t\u0022{\u005c\u0022avs_metadata\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022alexa.na.gateway.devices.a2z.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022v20160207/events\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022use_auth\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022lwa\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_header\u005c\u0022:\u0022\t\t\u0022\u005c\u0022authorization:\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_preamble\u005c\u0022:\u0022\t\u0022\u005c\u0022Bearer \u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_multipart_name\u005c\u0022:\u0022\t\u0022\u005c\u0022metadata\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_mime_content_type\u005c\u0022:\u0022\t\u0022\u005c\u0022application/json; charset\u003dUTF-8\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_no_content_length\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_multipart_ss_in\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022rideshare\u005c\u0022:\u0022\t\t\u0022\u005c\u0022avs_audio\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022avs_via_starfield\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t\u0022{\u005c\u0022avs_audio\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022alexa.na.gateway.devices.a2z.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022v20160207/events\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022use_auth\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022lwa\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_header\u005c\u0022:\u0022\t\t\u0022\u005c\u0022authorization:\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_preamble\u005c\u0022:\u0022\t\u0022\u005c\u0022Bearer \u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_multipart_ss_in\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_multipart_name\u005c\u0022:\u0022\t\u0022\u005c\u0022audio\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_mime_content_type\u005c\u0022:\u0022\t\u0022\u005c\u0022application/octet-stream\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_no_content_length\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022avs_via_starfield\u005c\u0022\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022]\u0022\n+\t\u0022}\u0022\n+;\n+\n+#endif\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+/*\n+ * Register the root token, and make the sticky AVS connection at the\n+ * appropriate times during system startup\n+ */\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d target)\n+\t\t\tavs_example_start(context);\n+\t\tbreak;\n+\tcase LWS_SYSTATE_POLICY_INVALID:\n+\t\t/*\n+\t\t * This is a NOP since we used direct set... but in a real\n+\t\t * system this could easily change to be done on the heap, then\n+\t\t * this would be important\n+\t\t */\n+\t\tlws_system_blob_destroy(lws_system_get_blob(context,\n+\t\t\t\t\tLWS_SYSBLOB_TYPE_AUTH,\n+\t\t\t\t\t1 /* AUTH_IDX_ROOT */));\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+extern struct lws_protocols protocol_audio_test;\n+static const struct lws_protocols *protocols[] \u003d {\n+\t\u0026protocol_audio_test,\n+#if defined(LWS_SS_USE_SSPC)\n+\tlws_sspc_protocols,\n+#endif\n+\tNULL\n+};\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams - Alexa voice test [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+#if !defined(LWS_SS_USE_SSPC)\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+#else\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#endif\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.pprotocols \u003d protocols;\n+\n+\t/* integrate us with lws system state management when context created */\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* create an explicit vhost so the sound protocol is initialized */\n+\n+\tinfo.vhost_name \u003d \u0022asound\u0022;\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed\u005cn\u0022);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/porcupine_params.pv b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/porcupine_params.pv\nnew file mode 100644\nindex 0000000..4d88bb5\nBinary files /dev/null and b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/porcupine_params.pv differ\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/private.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/private.h\nnew file mode 100644\nindex 0000000..a4920b1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/private.h\n@@ -0,0 +1,8 @@\n+typedef int (*mp3_done_cb)(void *opaque);\n+\n+int\n+play_mp3(mpg123_handle *mh, mp3_done_cb cb, void *opaque);\n+\n+\n+int\n+spool_capture(uint8_t *buf, size_t len);\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/CMakeLists.txt\nnew file mode 100644\nindex 0000000..1ec1318\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/CMakeLists.txt\n@@ -0,0 +1,41 @@\n+project(lws-minimal-secure-streams-avs C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-avs)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} main.c avs.c)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client main-client.c avs.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/avs.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/avs.c\nnew file mode 100644\nindex 0000000..bb453bf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/avs.c\n@@ -0,0 +1,432 @@\n+/*\n+ * lws-minimal-secure-streams-avs\n+ *\n+ * Written in 2019-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This sends a canned WAV and received (and discards) the mp3 response.\n+ * However it rate-limits the response reception to manage a small ringbuffer\n+ * using ss / h2 flow control apis, reflecting consumption at 64kbps and only\n+ * and 8KB buffer, indtended to model optimizing rx buffering on mp3 playback\n+ * on a constrained device.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003csys/stat.h\u003e\n+#if !defined(WIN32)\n+#include \u003cunistd.h\u003e\n+#endif\n+#include \u003cassert.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+extern int interrupted, bad;\n+static struct lws_ss_handle *hss_avs_event, *hss_avs_sync;\n+static uint8_t *wav;\n+static size_t wav_len;\n+\n+typedef struct ss_avs_event {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tstruct lejp_ctx\t\tjctx;\n+} ss_avs_event_t;\n+\n+typedef struct ss_avs_metadata {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tstruct lejp_ctx\t\tjctx;\n+\tsize_t\t\t\tpos;\n+\n+\t/*\n+\t * We simulate a ringbuffer that is used up by a sul at 64Kbit/sec\n+\t * rate, and managed at the same rate using tx credit\n+\t */\n+\n+\tlws_sorted_usec_list_t\tsul;\n+\tuint8_t\t\t\tbuf[256 * 1024]; /* to test rate-limiting, set to 8 * 1024 */\n+\tint\t\t\thead;\n+\tint\t\t\ttail;\n+\n+\tchar\t\t\tfilled;\n+\n+} ss_avs_metadata_t;\n+\n+static const char *metadata \u003d \u0022{\u0022\n+\t\u0022\u005c\u0022event\u005c\u0022: {\u0022\n+\t\t\u0022\u005c\u0022header\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022namespace\u005c\u0022: \u005c\u0022SpeechRecognizer\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022Recognize\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022messageId\u005c\u0022: \u005c\u0022message-123\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022dialogRequestId\u005c\u0022: \u005c\u0022dialog-request-321\u005c\u0022\u0022\n+\t\t\u0022},\u0022\n+\t\t\u0022\u005c\u0022payload\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022profile\u005c\u0022:\u0022\t\u0022\u005c\u0022CLOSE_TALK\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022format\u005c\u0022:\u0022\t\u0022\u005c\u0022AUDIO_L16_RATE_16000_CHANNELS_1\u005c\u0022\u0022\n+\t\t\u0022}\u0022\n+\t\u0022}\u0022\n+\u0022}\u0022;\n+\n+/*\n+ * avs metadata\n+ */\n+\n+static void\n+use_buffer_50ms(lws_sorted_usec_list_t *sul)\n+{\n+\tss_avs_metadata_t *m \u003d lws_container_of(sul, ss_avs_metadata_t, sul);\n+\tstruct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\tsize_t n;\n+\tint e;\n+\n+\t/*\n+\t * Use up 50ms-worth (8KB / 20) \u003d\u003d 401 bytes of buffered data\n+\t */\n+\n+\t/* remaining data in buffer */\n+\tn \u003d ((size_t)(m-\u003ehead - m-\u003etail) % sizeof(m-\u003ebuf));\n+\tlwsl_info(\u0022%s: avail %d\u005cn\u0022, __func__, (int)n);\n+\n+\tif (n \u003c 401)\n+\t\tlwsl_err(\u0022%s: underrun\u005cn\u0022, __func__);\n+\n+\tm-\u003etail \u003d ((size_t)m-\u003etail + 401) % sizeof(m-\u003ebuf);\n+\tn \u003d ((size_t)(m-\u003ehead - m-\u003etail) % sizeof(m-\u003ebuf));\n+\n+\te \u003d lws_ss_get_est_peer_tx_credit(m-\u003ess);\n+\n+\tlwsl_info(\u0022%s: avail after: %d, curr est %d\u005cn\u0022, __func__, (int)n, e);\n+\n+\tif (n \u003c (sizeof(m-\u003ebuf) * 2) / 3 \u0026\u0026 e \u003c (int)(sizeof(m-\u003ebuf) - 1 - n)) {\n+\t\tlwsl_info(\u0022%s: requesting additional %d\u005cn\u0022, __func__,\n+\t\t\t\t(int)sizeof(m-\u003ebuf) - 1 - e - (int)n);\n+\t\tlws_ss_add_peer_tx_credit(m-\u003ess, (int32_t)((int)sizeof(m-\u003ebuf) - 1 - e - (int)n));\n+\t}\n+\n+\tlws_sul_schedule(context, 0, \u0026m-\u003esul, use_buffer_50ms,\n+\t\t\t 50 * LWS_US_PER_MS);\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_metadata_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tss_avs_metadata_t *m \u003d (ss_avs_metadata_t *)userobj;\n+\tstruct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\tsize_t n, n1;\n+\n+\tlwsl_notice(\u0022%s: rideshare %s, len %d, flags 0x%x\u005cn\u0022, __func__,\n+\t\t\tlws_ss_rideshare(m-\u003ess), (int)len, flags);\n+#if 0\n+\tlwsl_hexdump_warn(buf, len);\n+#endif\n+\n+\tn \u003d sizeof(m-\u003ebuf) - ((size_t)(m-\u003ehead - m-\u003etail) % sizeof(m-\u003ebuf));\n+\tlwsl_info(\u0022%s: len %d, buf h %d, t %d, space %d\u005cn\u0022, __func__,\n+\t\t (int)len, (int)m-\u003ehead, (int)m-\u003etail, (int)n);\n+\tlws_ss_get_est_peer_tx_credit(m-\u003ess);\n+\tif (len \u003e n) {\n+\t\tlwsl_err(\u0022%s: bad len: len %d, n %d\u005cn\u0022, __func__, (int)len, (int)n);\n+\t\tassert(0);\n+\n+\t\treturn 1;\n+\t}\n+\n+\tif (m-\u003ehead \u003c m-\u003etail)\t\t\t\t/* |****h-------t**| */\n+\t\tmemcpy(\u0026m-\u003ebuf[m-\u003ehead], buf, len);\n+\telse {\t\t\t\t\t\t/* |---t*****h-----| */\n+\t\tn1 \u003d sizeof(m-\u003ebuf) - (size_t)m-\u003ehead;\n+\t\tif (len \u003c n1)\n+\t\t\tn1 \u003d len;\n+\t\tmemcpy(\u0026m-\u003ebuf[m-\u003ehead], buf, n1);\n+\t\tif (n1 !\u003d len)\n+\t\t\tmemcpy(m-\u003ebuf, buf, len - n1);\n+\t}\n+\n+\tm-\u003ehead \u003d (((size_t)m-\u003ehead) + len) % sizeof(m-\u003ebuf);\n+\n+\tlws_sul_schedule(context, 0, \u0026m-\u003esul, use_buffer_50ms,\n+\t\t\t 50 * LWS_US_PER_MS);\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_metadata_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf,\n+\t\t size_t *len, int *flags)\n+{\n+\tss_avs_metadata_t *m \u003d (ss_avs_metadata_t *)userobj;\n+\t//struct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\tsize_t tot;\n+\n+\tif ((long)m-\u003epos \u003c 0) {\n+\t\t*len \u003d 0;\n+\t\tlwsl_debug(\u0022%s: skip tx\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+//\tlwsl_notice(\u0022%s: rideshare '%s'\u005cn\u0022, __func__, lws_ss_rideshare(m-\u003ess));\n+\n+\tif (!strcmp(lws_ss_rideshare(m-\u003ess), \u0022avs_audio\u0022)) {\n+\t\t/* audio rideshare */\n+\n+\t\tif (!m-\u003epos)\n+\t\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\t\tif (*len \u003e wav_len - m-\u003epos)\n+\t\t\t*len \u003d wav_len - m-\u003epos;\n+\n+\t\tmemcpy(buf, wav + m-\u003epos, *len);\n+\t\tm-\u003epos +\u003d *len;\n+\n+\t\tif (m-\u003epos \u003d\u003d wav_len) {\n+\t\t\t*flags |\u003d LWSSS_FLAG_EOM;\n+\t\t\tlwsl_info(\u0022%s: tx done\u005cn\u0022, __func__);\n+\t\t\tm-\u003epos \u003d (size_t)-1l; /* ban subsequent until new stream */\n+\t\t} else\n+\t\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\t\tlwsl_hexdump_info(buf, *len);\n+\n+\t\treturn 0;\n+\t}\n+\n+\t/* metadata part */\n+\n+\ttot \u003d strlen(metadata);\n+\n+\tif (!m-\u003epos)\n+\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\tif (*len \u003e tot - m-\u003epos)\n+\t\t*len \u003d tot - m-\u003epos;\n+\n+\tmemcpy(buf, metadata + m-\u003epos, *len);\n+\n+\tm-\u003epos +\u003d *len;\n+\n+\tif (m-\u003epos \u003d\u003d tot) {\n+\t\t*flags |\u003d LWSSS_FLAG_EOM;\n+\t\tm-\u003epos \u003d 0; /* for next time */\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\t}\n+\n+\tlwsl_hexdump_info(buf, *len);\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_metadata_state(void *userobj, void *sh,\n+\t\t lws_ss_constate_t state, lws_ss_tx_ordinal_t ack)\n+{\n+\n+\tss_avs_metadata_t *m \u003d (ss_avs_metadata_t *)userobj;\n+\t// struct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\n+\tlwsl_user(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name((int)state),\n+\t\t (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tlwsl_user(\u0022%s: CREATING\u005cn\u0022, __func__);\n+\t\tm-\u003epos \u003d 0;\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_CONNECTING:\n+\t\tbreak;\n+\tcase LWSSSCS_CONNECTED:\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* for this demo app, we want to exit on fail to connect */\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\t/* for this demo app, we want to exit after complete flow */\n+\t\tlws_sul_cancel(\u0026m-\u003esul);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_DESTROYING:\n+\t\tlws_sul_cancel(\u0026m-\u003esul);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * avs event\n+ */\n+\n+static lws_ss_state_return_t\n+ss_avs_event_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+#if !defined(LWS_WITH_NO_LOGS)\n+\tss_avs_event_t *m \u003d (ss_avs_event_t *)userobj;\n+\t// struct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\n+\tlwsl_notice(\u0022%s: rideshare %s, len %d, flags 0x%x\u005cn\u0022, __func__,\n+\t\t\tlws_ss_rideshare(m-\u003ess), (int)len, flags);\n+#endif\n+//\tlwsl_hexdump_warn(buf, len);\n+\n+\tbad \u003d 0; /* for this demo, receiving something here \u003d\u003d success */\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_event_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf,\n+\t\t size_t *len, int *flags)\n+{\n+#if !defined(LWS_WITH_NO_LOGS)\n+\tss_avs_event_t *m \u003d (ss_avs_event_t *)userobj;\n+\tlwsl_notice(\u0022%s: rideshare %s\u005cn\u0022, __func__, lws_ss_rideshare(m-\u003ess));\n+#endif\n+\treturn 1; /* don't transmit anything */\n+}\n+\n+static lws_ss_state_return_t\n+ss_avs_event_state(void *userobj, void *sh,\n+\t\t lws_ss_constate_t state, lws_ss_tx_ordinal_t ack)\n+{\n+\tss_avs_event_t *m \u003d (ss_avs_event_t *)userobj;\n+\tstruct lws_context *context \u003d (struct lws_context *)m-\u003eopaque_data;\n+\tlws_ss_info_t ssi;\n+\n+\tlwsl_user(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name((int)state),\n+\t\t (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\tcase LWSSSCS_CONNECTING:\n+\t\tbreak;\n+\tcase LWSSSCS_CONNECTED:\n+\t\tif (hss_avs_sync)\n+\t\t\tbreak;\n+\n+\t\tlwsl_notice(\u0022%s: starting the second avs stream\u005cn\u0022, __func__);\n+\n+\t\t/*\n+\t\t * When we have established the event stream, we must POST\n+\t\t * on another stream within 10s\n+\t\t */\n+\n+\t\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\t\tssi.handle_offset\t \u003d offsetof(ss_avs_metadata_t, ss);\n+\t\tssi.opaque_user_data_offset \u003d offsetof(ss_avs_metadata_t,\n+\t\t\t\t\t\t opaque_data);\n+\t\tssi.rx\t\t\t \u003d ss_avs_metadata_rx;\n+\t\tssi.tx\t\t\t \u003d ss_avs_metadata_tx;\n+\t\tssi.state\t\t \u003d ss_avs_metadata_state;\n+\t\tssi.user_alloc\t\t \u003d sizeof(ss_avs_metadata_t);\n+\t\tssi.streamtype\t\t \u003d \u0022avs_metadata\u0022;\n+\n+\t\t/*\n+\t\t * We want to allow the other side to fill our buffer, but no\n+\t\t * more. But it's a bit tricky when the payload is inside\n+\t\t * framing like multipart MIME and contains other parts\n+\t\t */\n+\n+\t\t/* uncomment to test rate-limiting, doesn't work with AVS servers */\n+//\t\tssi.manual_initial_tx_credit \u003d\n+//\t\t\t\tsizeof(((ss_avs_metadata_t *)0)-\u003ebuf) / 2;\n+\n+\t\tif (lws_ss_create(context, 0, \u0026ssi, context, \u0026hss_avs_sync,\n+\t\t\t\t NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create avs metadata secstream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\t}\n+\t\tbreak;\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* for this demo app, we want to exit on fail to connect */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tbreak;\n+\tcase LWSSSCS_DESTROYING:\n+\t\tlwsl_notice(\u0022%s: DESTROYING\u005cn\u0022, __func__);\n+\t\tif (wav) {\n+\t\t\tfree(wav);\n+\t\t\twav \u003d NULL;\n+\t\t}\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n+avs_example_start(struct lws_context *context)\n+{\n+\tlws_ss_info_t ssi;\n+\tstruct stat stat;\n+\tint fd;\n+\n+\tif (hss_avs_event)\n+\t\treturn 0;\n+\n+\tfd \u003d open(\u0022./year.wav\u0022, O_RDONLY);\n+\tif (fd \u003c 0) {\n+\t\tlwsl_err(\u0022%s: failed to open wav file\u005cn\u0022, __func__);\n+\n+\t\treturn 1;\n+\t}\n+\tif (fstat(fd, \u0026stat) \u003c 0) {\n+\t\tlwsl_err(\u0022%s: failed to stat wav file\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\n+\twav_len \u003d (size_t)stat.st_size;\n+\twav \u003d malloc(wav_len);\n+\tif (!wav) {\n+\t\tlwsl_err(\u0022%s: failed to alloc wav buffer\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tif (read(fd, wav,\n+#if defined(WIN32)\n+\t\t(unsigned int)\n+#endif\n+\t\t\twav_len) !\u003d (int)wav_len) {\n+\t\tlwsl_err(\u0022%s: failed to read wav\u005cn\u0022, __func__);\n+\n+\t\tgoto bail;\n+\t}\n+\tclose(fd);\n+\n+\tlwsl_user(\u0022%s: Starting AVS stream\u005cn\u0022, __func__);\n+\n+\t/* AVS wants us to establish the long poll event stream first */\n+\n+\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\tssi.handle_offset\t \u003d offsetof(ss_avs_event_t, ss);\n+\tssi.opaque_user_data_offset \u003d offsetof(ss_avs_event_t, opaque_data);\n+\tssi.rx\t\t\t \u003d ss_avs_event_rx;\n+\tssi.tx\t\t\t \u003d ss_avs_event_tx;\n+\tssi.state\t\t \u003d ss_avs_event_state;\n+\tssi.user_alloc\t\t \u003d sizeof(ss_avs_event_t);\n+\tssi.streamtype\t\t \u003d \u0022avs_event\u0022;\n+\n+\tif (lws_ss_create(context, 0, \u0026ssi, context, \u0026hss_avs_event, NULL, NULL)) {\n+\t\tlwsl_err(\u0022%s: failed to create avs event secure stream\u005cn\u0022,\n+\t\t\t __func__);\n+\t\tfree(wav);\n+\t\twav \u003d NULL;\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+\n+bail:\n+\tclose(fd);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main-client.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main-client.c\nnew file mode 100644\nindex 0000000..0f62d43\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main-client.c\n@@ -0,0 +1,123 @@\n+/*\n+ * lws-minimal-secure-streams-avs\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+extern int\n+avs_example_start(struct lws_context *context);\n+\n+int interrupted, bad \u003d 1;\n+static lws_state_notify_link_t nl;\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\t\tavs_example_start(context);\n+\t\tbreak;\n+\tcase LWS_SYSTATE_POLICY_INVALID:\n+\t\t/*\n+\t\t * This is a NOP since we used direct set... but in a real\n+\t\t * system this could easily change to be done on the heap, then\n+\t\t * this would be important\n+\t\t */\n+\t\tlws_system_blob_destroy(lws_system_get_blob(context,\n+\t\t\t\t\tLWS_SYSBLOB_TYPE_AUTH,\n+\t\t\t\t\t1 /* AUTH_IDX_ROOT */));\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams - AVS test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\n+\t/* integrate us with lws system state management when context created */\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main.c\nnew file mode 100644\nindex 0000000..56ca531\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main.c\n@@ -0,0 +1,366 @@\n+/*\n+ * lws-minimal-secure-streams-avs\n+ *\n+ * Written in 2019-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+extern int\n+avs_example_start(struct lws_context *context);\n+\n+int interrupted, bad \u003d 1;\n+static lws_state_notify_link_t nl;\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+//\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002260,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002264\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t\u0022{\u005c\u0022digicert_global_root_g2\u005c\u0022: \u005c\u0022\u0022 /* api.amazon.com 2038-01 */\n+\t\u0022MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\u0022\n+\t\u0022MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\u0022\n+\t\u0022d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\u0022\n+\t\u0022MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\u0022\n+\t\u0022MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\u0022\n+\t\u0022b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\u0022\n+\t\u00229w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\u0022\n+\t\u00222/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\u0022\n+\t\u00221x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\u0022\n+\t\u0022q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\u0022\n+\t\u0022tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\u0022\n+\t\u0022vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\u0022\n+\t\u0022BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\u0022\n+\t\u00225uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\u0022\n+\t\u00221Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\u0022\n+\t\u0022NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\u0022\n+\t\u0022Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\u0022\n+\t\u00228rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\u0022\n+\t\u0022pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\u0022\n+\t\u0022MrY\u003d\u0022\n+\t\t\u0022\u005c\u0022},\u0022\n+\t\t\u0022{\u005c\u0022digicert_global_ca_g2\u005c\u0022: \u005c\u0022\u0022 /* api.amazon.com 2028-08 */\n+\t\u0022MIIEizCCA3OgAwIBAgIQDI7gyQ1qiRWIBAYe4kH5rzANBgkqhkiG9w0BAQsFADBh\u0022\n+\t\u0022MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\u0022\n+\t\u0022d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\u0022\n+\t\u0022MjAeFw0xMzA4MDExMjAwMDBaFw0yODA4MDExMjAwMDBaMEQxCzAJBgNVBAYTAlVT\u0022\n+\t\u0022MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxHjAcBgNVBAMTFURpZ2lDZXJ0IEdsb2Jh\u0022\n+\t\u0022bCBDQSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNIfL7zBYZd\u0022\n+\t\u0022W9UvhU5L4IatFaxhz1uvPmoKR/uadpFgC4przc/cV35gmAvkVNlW7SHMArZagV+X\u0022\n+\t\u0022au4CLyMnuG3UsOcGAngLH1ypmTb+u6wbBfpXzYEQQGfWMItYNdSWYb7QjHqXnxr5\u0022\n+\t\u0022IuYUL6nG6AEfq/gmD6yOTSwyOR2Bm40cZbIc22GoiS9g5+vCShjEbyrpEJIJ7RfR\u0022\n+\t\u0022ACvmfe8EiRROM6GyD5eHn7OgzS+8LOy4g2gxPR/VSpAQGQuBldYpdlH5NnbQtwl6\u0022\n+\t\u0022OErXb4y/E3w57bqukPyV93t4CTZedJMeJfD/1K2uaGvG/w/VNfFVbkhJ+Pi474j4\u0022\n+\t\u00228V4Rd6rfArMCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0P\u0022\n+\t\u0022AQH/BAQDAgGGMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29j\u0022\n+\t\u0022c3AuZGlnaWNlcnQuY29tMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9jcmw0LmRp\u0022\n+\t\u0022Z2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOGMWh0dHA6\u0022\n+\t\u0022Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwPQYD\u0022\n+\t\u0022VR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2lj\u0022\n+\t\u0022ZXJ0LmNvbS9DUFMwHQYDVR0OBBYEFCRuKy3QapJRUSVpAaqaR6aJ50AgMB8GA1Ud\u0022\n+\t\u0022IwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA0GCSqGSIb3DQEBCwUAA4IBAQAL\u0022\n+\t\u0022OYSR+ZfrqoGvhOlaOJL84mxZvzbIRacxAxHhBsCsMsdaVSnaT0AC9aHesO3ewPj2\u0022\n+\t\u0022dZ12uYf+QYB6z13jAMZbAuabeGLJ3LhimnftiQjXS8X9Q9ViIyfEBFltcT8jW+rZ\u0022\n+\t\u00228uckJ2/0lYDblizkVIvP6hnZf1WZUXoOLRg9eFhSvGNoVwvdRLNXSmDmyHBwW4co\u0022\n+\t\u0022atc7TlJFGa8kBpJIERqLrqwYElesA8u49L3KJg6nwd3jM+/AVTANlVlOnAM2BvjA\u0022\n+\t\u0022jxSZnE0qnsHhfTuvcqdFuhOWKU4Z0BqYBvQ3lBetoxi6PrABDJXWKTUgNX31EGDk\u0022\n+\t\u002292hiHuwZ4STyhxGs6QiA\u0022\n+\t\t\u0022\u005c\u0022},\u0022\n+\t\t\u0022{\u005c\u0022starfield_services_root_ca\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\u0022\n+\t\u0022EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\u0022\n+\t\u0022HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\u0022\n+\t\u0022ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\u0022\n+\t\u0022MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\u0022\n+\t\u0022VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\u0022\n+\t\u0022ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\u0022\n+\t\u0022dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\u0022\n+\t\u0022hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\u0022\n+\t\u0022OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\u0022\n+\t\u00228xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\u0022\n+\t\u0022Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\u0022\n+\t\u0022hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\u0022\n+\t\u00226mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\u0022\n+\t\u0022DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\u0022\n+\t\u0022AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\u0022\n+\t\u0022bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\u0022\n+\t\u0022ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\u0022\n+\t\u0022qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\u0022\n+\t\u0022iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\u0022\n+\t\u00220q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\u0022\n+\t\u0022sSi6\u0022\n+\t\t\u0022\u005c\u0022},\u0022\n+\t\t\u0022{\u005c\u0022starfield_class_2_ca\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\u0022\n+\t\u0022MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\u0022\n+\t\u0022U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\u0022\n+\t\u0022NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\u0022\n+\t\u0022ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\u0022\n+\t\u0022ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\u0022\n+\t\u0022DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\u0022\n+\t\u00228MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\u0022\n+\t\u0022+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\u0022\n+\t\u0022X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\u0022\n+\t\u0022K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\u0022\n+\t\u00221W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\u0022\n+\t\u0022A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\u0022\n+\t\u0022zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\u0022\n+\t\u0022YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\u0022\n+\t\u0022bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\u0022\n+\t\u0022DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\u0022\n+\t\u0022L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\u0022\n+\t\u0022eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\u0022\n+\t\u0022xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\u0022\n+\t\u0022VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\u0022\n+\t\u0022WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q\u003d\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022 /* chain for alexa.na.gateway.devices.a2z.com */\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022avs_via_starfield\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022starfield_class_2_ca\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022starfield_services_root_ca\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022},\u0022\n+\t\t\u0022{\u0022 /* chain for api.amazon.com */\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022api_amazon_com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022digicert_global_ca_g2\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022digicert_global_root_g2\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022auth\u005c\u0022: [\u0022 /* available auth type bindings */\n+\t\t\u0022{\u0022\n+\t\t \u0022\u005c\u0022name\u005c\u0022:\u0022\t\t\u0022\u005c\u0022lwa\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022streamtype\u005c\u0022:\u0022\t\u0022\u005c\u0022api_amazon_com_lwa\u005c\u0022,\u0022\n+\t\t \u0022\u005c\u0022blob\u005c\u0022:\u0022\t\t\u00220\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022 /* the supported stream types */\n+\t\t\u0022{\u005c\u0022api_amazon_com_lwa\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022api.amazon.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022auth/o2/token\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_www_form_urlencoded\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_no_content_length\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022api_amazon_com\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t\u0022{\u005c\u0022avs_event\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022alexa.na.gateway.devices.a2z.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022v20160207/directives\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_header\u005c\u0022:\u0022\t\t\u0022\u005c\u0022authorization:\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_preamble\u005c\u0022:\u0022\t\u0022\u005c\u0022Bearer \u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022use_auth\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022lwa\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022nailed_up\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022long_poll\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022avs_via_starfield\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t\u0022{\u005c\u0022avs_metadata\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022alexa.na.gateway.devices.a2z.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022v20160207/events\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_no_content_length\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022use_auth\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022lwa\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_header\u005c\u0022:\u0022\t\t\u0022\u005c\u0022authorization:\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_preamble\u005c\u0022:\u0022\t\u0022\u005c\u0022Bearer \u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_multipart_name\u005c\u0022:\u0022\t\u0022\u005c\u0022metadata\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_mime_content_type\u005c\u0022:\u0022\t\u0022\u005c\u0022application/json; charset\u003dUTF-8\u005c\u0022,\u0022\n+#if 1\n+\t\t\t\u0022\u005c\u0022http_multipart_ss_in\u005c\u0022:\u0022\t\u0022true,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022rideshare\u005c\u0022:\u0022\t\t\u0022\u005c\u0022avs_audio\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022avs_via_starfield\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t\u0022{\u005c\u0022avs_audio\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022alexa.na.gateway.devices.a2z.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022v20160207/events\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_no_content_length\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+#if 1\n+\t\t\t\u0022\u005c\u0022http_multipart_ss_in\u005c\u0022:\u0022\t\u0022true,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022use_auth\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022lwa\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_header\u005c\u0022:\u0022\t\t\u0022\u005c\u0022authorization:\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_auth_preamble\u005c\u0022:\u0022\t\u0022\u005c\u0022Bearer \u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_multipart_name\u005c\u0022:\u0022\t\u0022\u005c\u0022audio\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_mime_content_type\u005c\u0022:\u0022\t\u0022\u005c\u0022application/octet-stream\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022avs_via_starfield\u005c\u0022\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022]\u0022\n+\t\u0022}\u0022\n+;\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\t\tavs_example_start(context);\n+\t\tbreak;\n+\tcase LWS_SYSTATE_POLICY_INVALID:\n+\t\t/*\n+\t\t * This is a NOP since we used direct set... but in a real\n+\t\t * system this could easily change to be done on the heap, then\n+\t\t * this would be important\n+\t\t */\n+\t\tlws_system_blob_destroy(lws_system_get_blob(context,\n+\t\t\t\t\tLWS_SYSBLOB_TYPE_AUTH,\n+\t\t\t\t\t1 /* AUTH_IDX_ROOT */));\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams - AVS test [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\n+#if defined(LWS_SS_USE_SSPC)\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\tputs(default_ss_policy);\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/year.wav b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/year.wav\nnew file mode 100644\nindex 0000000..333b057\nBinary files /dev/null and b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/year.wav differ\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5348bdb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/CMakeLists.txt\n@@ -0,0 +1,42 @@\n+project(lws-minimal-secure-streams-binance C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-binance)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\t\tadd_executable(${SAMP}-client ${SRCS})\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/README.md\nnew file mode 100644\nindex 0000000..5155ddd\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/README.md\n@@ -0,0 +1,56 @@\n+# lws minimal secure streams binance\n+\n+This is a Secure Streams version of minimal-ws-client-binance.\n+\n+\u0022policy.json\u0022 contains all the information about endpoints, protocols and\n+connection validation, tagged by streamtype name.\n+\n+The example tries to load it from the cwd, it lives in\n+./minimal-examples/secure-streams/minimal-secure-streams-binance dir, so\n+either run it from there, or copy the policy.json to your cwd. It's also\n+possible to put the policy json in the code as a string and pass that at\n+context creation time.\n+\n+The secure stream object represents a nailed-up connection that outlives any\n+single socket connection, and can manage reconnections / retries according to\n+the policy to keep the connection nailed up automatically.\n+\n+Secure Streams provides the same simplified communication api without any\n+protocol dependencies.\n+\n+## build\n+\n+Lws must have been built with `LWS_ROLE_WS\u003d1`, `LWS_WITH_SECURE_STREAMS\u003d1`, and\n+`LWS_WITHOUT_EXTENSIONS\u003d0`\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+\n+## usage\n+\n+```\n+$ ./bin/lws-minimal-ws-client-binance \n+[2021/08/15 06:42:40:8409] U: LWS minimal Secure Streams binance client\n+[2021/08/15 06:42:40:8410] N: LWS: 4.2.99-v4.2.0-156-g8f352f65e8, NET CLI SRV H1 H2 WS SS-JSON-POL SSPROX ConMon FLTINJ IPV6-on\n+[2021/08/15 06:42:40:8410] N: ++ [495958|wsi|0|pipe] (1)\n+[2021/08/15 06:42:40:8411] N: ++ [495958|vh|0|netlink] (1)\n+[2021/08/15 06:42:40:8433] N: ++ [495958|vh|1|digicert||-1] (2)\n+[2021/08/15 06:42:40:8471] N: ++ [495958|wsiSScli|0|binance] (1)\n+[2021/08/15 06:42:40:8471] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: (unset) -\u003e LWSSSCS_CREATING\n+[2021/08/15 06:42:40:8472] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: LWSSSCS_CREATING -\u003e LWSSSCS_CONNECTING\n+[2021/08/15 06:42:40:8472] N: ++ [495958|wsicli|0|WS/h1/fstream.binance.com/([495958|wsiSScli|0|binance])] (1)\n+[2021/08/15 06:42:41:8802] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTING -\u003e LWSSSCS_CONNECTED\n+[2021/08/15 06:42:42:8803] N: sul_hz_cb: price: min: 4669185¢, max: 4672159¢, avg: 4670061¢, (53 prices/s)\n+[2021/08/15 06:42:42:8803] N: sul_hz_cb: elatency: min: 131ms, max: 292ms, avg: 154ms, (53 msg/s)\n+[2021/08/15 06:42:43:8803] N: sul_hz_cb: price: min: 4669646¢, max: 4672159¢, avg: 4669953¢, (34 prices/s)\n+[2021/08/15 06:42:43:8803] N: sul_hz_cb: elatency: min: 130ms, max: 149ms, avg: 133ms, (34 msg/s)\n+[2021/08/15 06:42:44:8804] N: sul_hz_cb: price: min: 4669455¢, max: 4672159¢, avg: 4669904¢, (26 prices/s)\n+...\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/main.c\nnew file mode 100644\nindex 0000000..150a201\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/main.c\n@@ -0,0 +1,270 @@\n+/*\n+ * lws-minimal-secure-streams-binance\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ * Kutoga \u003ckutoga@user.github.invalid\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a Secure Streams implementation of a client that connects\n+ * to binance ws server efficiently.\n+ *\n+ * Build lws with -DLWS_WITH_SECURE_STREAMS\u003d1 -DLWS_WITHOUT_EXTENSIONS\u003d0\n+ *\n+ * \u0022policy.json\u0022 contains all the information about endpoints, protocols and\n+ * connection validation, tagged by streamtype name.\n+ *\n+ * The example tries to load it from the cwd, it lives\n+ * in ./minimal-examples/secure-streams/minimal-secure-streams-binance dir, so\n+ * either run it from there, or copy the policy.json to your cwd. It's also\n+ * possible to put the policy json in the code as a string and pass that at\n+ * context creation time.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cctype.h\u003e\n+\n+static int interrupted;\n+extern const struct lws_protocols lws_sspc_protocols[2];\n+\n+typedef struct range {\n+\tuint64_t\t\tsum;\n+\tuint64_t\t\tlowest;\n+\tuint64_t\t\thighest;\n+\n+\tunsigned int\t\tsamples;\n+} range_t;\n+\n+typedef struct binance {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\n+\tlws_sorted_usec_list_t\tsul_hz;\t /* 1hz summary dump */\n+\n+\trange_t\t\t\te_lat_range;\n+\trange_t\t\t\tprice_range;\n+} binance_t;\n+\n+/****** Part 1 / 3: application data processing */\n+\n+static void\n+range_reset(range_t *r)\n+{\n+\tr-\u003esum \u003d r-\u003ehighest \u003d 0;\n+\tr-\u003elowest \u003d 999999999999ull;\n+\tr-\u003esamples \u003d 0;\n+}\n+\n+static uint64_t\n+get_us_timeofday(void)\n+{\n+\tstruct timeval tv;\n+\n+\tgettimeofday(\u0026tv, NULL);\n+\n+\treturn (uint64_t)((lws_usec_t)tv.tv_sec * LWS_US_PER_SEC) +\n+\t\t\t (uint64_t)tv.tv_usec;\n+}\n+\n+static uint64_t\n+pennies(const char *s)\n+{\n+\tuint64_t price \u003d (uint64_t)atoll(s) * 100;\n+\n+\ts \u003d strchr(s, '.');\n+\n+\tif (s \u0026\u0026 isdigit(s[1]) \u0026\u0026 isdigit(s[2]))\n+\t\tprice \u003d price + (uint64_t)((10 * (s[1] - '0')) + (s[2] - '0'));\n+\n+\treturn price;\n+}\n+\n+static void\n+sul_hz_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tbinance_t *bin \u003d lws_container_of(sul, binance_t, sul_hz);\n+\n+\t/*\n+\t * We are called once a second to dump statistics on the connection\n+\t */\n+\n+\tlws_sul_schedule(lws_ss_get_context(bin-\u003ess), 0, \u0026bin-\u003esul_hz,\n+\t\t\t sul_hz_cb, LWS_US_PER_SEC);\n+\n+\tif (bin-\u003eprice_range.samples)\n+\t\tlwsl_notice(\u0022%s: price: min: %llu¢, max: %llu¢, avg: %llu¢, \u0022\n+\t\t\t \u0022(%d prices/s)\u005cn\u0022, __func__,\n+\t\t\t (unsigned long long)bin-\u003eprice_range.lowest,\n+\t\t\t (unsigned long long)bin-\u003eprice_range.highest,\n+\t\t\t (unsigned long long)(bin-\u003eprice_range.sum /\n+\t\t\t\t\t\t bin-\u003eprice_range.samples),\n+\t\t\t bin-\u003eprice_range.samples);\n+\tif (bin-\u003ee_lat_range.samples)\n+\t\tlwsl_notice(\u0022%s: elatency: min: %llums, max: %llums, \u0022\n+\t\t\t \u0022avg: %llums, (%d msg/s)\u005cn\u0022, __func__,\n+\t\t\t (unsigned long long)bin-\u003ee_lat_range.lowest / 1000,\n+\t\t\t (unsigned long long)bin-\u003ee_lat_range.highest / 1000,\n+\t\t\t (unsigned long long)(bin-\u003ee_lat_range.sum /\n+\t\t\t\t\t bin-\u003ee_lat_range.samples) / 1000,\n+\t\t\t bin-\u003ee_lat_range.samples);\n+\n+\trange_reset(\u0026bin-\u003ee_lat_range);\n+\trange_reset(\u0026bin-\u003eprice_range);\n+}\n+\n+/****** Part 2 / 3: communication */\n+\n+static lws_ss_state_return_t\n+binance_rx(void *userobj, const uint8_t *in, size_t len, int flags)\n+{\n+\tbinance_t *bin \u003d (binance_t *)userobj;\n+\tuint64_t latency_us, now_us;\n+\tchar numbuf[16];\n+\tuint64_t price;\n+\tconst char *p;\n+\tsize_t alen;\n+\n+\tnow_us \u003d (uint64_t)get_us_timeofday();\n+\n+\tp \u003d lws_json_simple_find((const char *)in, len, \u0022\u005c\u0022depthUpdate\u005c\u0022\u0022,\n+\t\t\t\t \u0026alen);\n+\tif (!p)\n+\t\treturn LWSSSSRET_OK;\n+\n+\tp \u003d lws_json_simple_find((const char *)in, len, \u0022\u005c\u0022E\u005c\u0022:\u0022, \u0026alen);\n+\tif (!p) {\n+\t\tlwsl_err(\u0022%s: no E JSON\u005cn\u0022, __func__);\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\tlws_strnncpy(numbuf, p, alen, sizeof(numbuf));\n+\tlatency_us \u003d now_us - ((uint64_t)atoll(numbuf) * LWS_US_PER_MS);\n+\n+\tif (latency_us \u003c bin-\u003ee_lat_range.lowest)\n+\t\tbin-\u003ee_lat_range.lowest \u003d latency_us;\n+\tif (latency_us \u003e bin-\u003ee_lat_range.highest)\n+\t\tbin-\u003ee_lat_range.highest \u003d latency_us;\n+\n+\tbin-\u003ee_lat_range.sum +\u003d latency_us;\n+\tbin-\u003ee_lat_range.samples++;\n+\n+\tp \u003d lws_json_simple_find((const char *)in, len, \u0022\u005c\u0022a\u005c\u0022:[[\u005c\u0022\u0022, \u0026alen);\n+\tif (!p)\n+\t\treturn LWSSSSRET_OK;\n+\n+\tlws_strnncpy(numbuf, p, alen, sizeof(numbuf));\n+\tprice \u003d pennies(numbuf);\n+\n+\tif (price \u003c bin-\u003eprice_range.lowest)\n+\t\tbin-\u003eprice_range.lowest \u003d price;\n+\tif (price \u003e bin-\u003eprice_range.highest)\n+\t\tbin-\u003eprice_range.highest \u003d price;\n+\n+\tbin-\u003eprice_range.sum +\u003d price;\n+\tbin-\u003eprice_range.samples++;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+binance_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tbinance_t *bin \u003d (binance_t *)userobj;\n+\n+\tlwsl_ss_info(bin-\u003ess, \u0022%s (%d), ord 0x%x\u0022,\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\tlws_sul_schedule(lws_ss_get_context(bin-\u003ess), 0, \u0026bin-\u003esul_hz,\n+\t\t\t\t sul_hz_cb, LWS_US_PER_SEC);\n+\t\trange_reset(\u0026bin-\u003ee_lat_range);\n+\t\trange_reset(\u0026bin-\u003eprice_range);\n+\n+\t\treturn LWSSSSRET_OK;\n+\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tlws_sul_cancel(\u0026bin-\u003esul_hz);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static const lws_ss_info_t ssi_binance \u003d {\n+\t.handle_offset\t\t \u003d offsetof(binance_t, ss),\n+\t.opaque_user_data_offset \u003d offsetof(binance_t, opaque_data),\n+\t.rx\t\t\t \u003d binance_rx,\n+\t.state\t\t\t \u003d binance_state,\n+\t.user_alloc\t\t \u003d sizeof(binance_t),\n+\t.streamtype\t\t \u003d \u0022binance\u0022, /* bind to corresponding policy */\n+};\n+\n+/****** Part 3 / 3: init and event loop */\n+\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022, lws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022 \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *cx;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal Secure Streams binance client\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\tinfo.extensions \u003d extensions;\n+\tinfo.pss_policies_json \u003d \u0022policy.json\u0022; /* literal JSON, or path */\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+#endif\n+\n+\tcx \u003d lws_create_context(\u0026info);\n+\tif (!cx) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_ss_create(cx, 0, \u0026ssi_binance, NULL, NULL, NULL, NULL)) {\n+\t\tlwsl_cx_err(cx, \u0022failed to create secure stream\u0022);\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(cx, 0);\n+\n+\tlws_context_destroy(cx);\n+\n+\tlwsl_user(\u0022Completed\u005cn\u0022);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/policy.json\nnew file mode 100644\nindex 0000000..1ff4e04\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/policy.json\n@@ -0,0 +1,38 @@\n+{\n+\t\u0022release\u0022: \u002201234567\u0022,\n+\t\u0022product\u0022: \u0022myproduct\u0022,\n+\t\u0022schema-version\u0022: 1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022: [1000, 2000, 3000, 4000, 5000],\n+\t\t\t\u0022conceal\u0022: 65535,\n+\t\t\t\u0022jitterpc\u0022: 20,\n+\t\t\t\u0022svalidping\u0022: 30,\n+\t\t\t\u0022svalidhup\u0022: 35\n+\t\t}\n+\t}],\n+\t\u0022certs\u0022: [{\n+\t\t\u0022digicert_global_root\u0022: \u0022MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQkCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4\u003d\u0022\n+ }\n+\t],\n+\t\t\u0022trust_stores\u0022: [{\n+\t\t\t\u0022name\u0022: \u0022digicert\u0022,\n+\t\t\t\u0022stack\u0022: [\u0022digicert_global_root\u0022]\n+\t\t}\n+\t],\n+\t\u0022s\u0022: [\n+\t\t{ \u0022binance\u0022: {\n+\t\t\t\u0022endpoint\u0022:\t\t\u0022fstream.binance.com\u0022,\n+\t\t\t\u0022port\u0022:\t\t\t443,\n+\t\t\t\u0022protocol\u0022:\t\t\u0022ws\u0022,\n+\t\t\t\u0022http_url\u0022:\t\t\u0022/stream?streams\u003dbtcusdt@depth@0ms/btcusdt@bookTicker/btcusdt@aggTrade\u0022,\n+\t\t\t\u0022nailed_up\u0022: \ttrue,\n+\t\t\t\u0022ws_prioritize_reads\u0022:\ttrue,\n+\t\t\t\u0022tls\u0022:\t\t\ttrue,\n+\t\t\t\u0022tls_trust_store\u0022:\t\u0022digicert\u0022,\n+\t\t\t\u0022retry\u0022:\t\t\u0022default\u0022\n+\t\t\t}\n+\t\t}\n+\t]\n+}\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/CMakeLists.txt\nnew file mode 100644\nindex 0000000..27d0b53\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/CMakeLists.txt\n@@ -0,0 +1,134 @@\n+project(lws-minimal-secure-streams-blob C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-blob)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+require_lws_config(LWS_WITH_GENCRYPTO 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams.c)\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\n+\t\t#\n+\t\t# When running in CI, wait for a lease on the resources\n+\t\t# before starting this test, so the server does not get\n+\t\t# thousands of simultaneous tls connection attempts\n+\t\t#\n+\t\t# sai-resource holds the lease on the resources until\n+\t\t# the time given in seconds or the sai-resource instance\n+\t\t# exits, whichever happens first\n+\t\t#\n+\t\t# If running under Sai, creates a lock test called \u0022res_sspcmin\u0022 \n+\t\t#\n+\t\t\n+\t\tsai_resource(warmcat_conns 1 40 sspcminblob)\n+\t\t\n+\t\t#\n+\t\t# simple test not via proxy\n+\t\t#\n+\t\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME ssblob-warmcat COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME ssblob-warmcat COMMAND lws-minimal-secure-streams)\n+\t\tendif()\n+\n+\t\tset_tests_properties(ssblob-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams\n+\t\t\t\t TIMEOUT 40)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(ssblob-warmcat PROPERTIES FIXTURES_REQUIRED \u0022res_sspcmin\u0022)\t\t \n+\t\tendif()\n+\n+\t\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-ssblobproxy-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-ssblobproxy-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_ssblobproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tssblobproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_ssblobproxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssblobproxy TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_ssblobproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tssblobproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_ssblobproxy PROPERTIES FIXTURES_CLEANUP ssblobproxy)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\t\tadd_test(NAME sspcblob-minimal COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-blob-client\u003e -i +${CTEST_SOCKET_PATH} --timeout_ms 65000)\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME sspcblob-minimal COMMAND lws-minimal-secure-streams-blob-client -i +${CTEST_SOCKET_PATH} --timeout_ms 65000)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset(fixlist \u0022ssblobproxy\u0022)\n+\t\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\t\tlist(APPEND fixlist \u0022res_ssblobproxy\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset_tests_properties(sspcblob-minimal PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob\n+\t\t\t\tFIXTURES_REQUIRED \u0022${fixlist}\u0022\n+\t\t\t\tTIMEOUT 70)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client minimal-secure-streams.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/README.md\nnew file mode 100644\nindex 0000000..78f0a1b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/README.md\n@@ -0,0 +1,67 @@\n+# lws minimal secure streams\n+\n+The application goes to https://warmcat.com and reads index.html there.\n+\n+It does it using Secure Streams... the main code in minimal-secure-streams.c\n+just sets up the context and opens a secure stream of type \u0022mintest\u0022.\n+\n+The handler for state changes and payloads for \u0022mintest\u0022 is in ss-myss.c\n+\n+The information about how a \u0022mintest\u0022 stream should connect and the\n+protocol it uses is kept separated in policy-database.c\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-f| Force connecting to the wrong endpoint to check backoff retry flow\n+-p| Run as proxy server for clients to connect to over unix domain socket\n+--force-portal|Force the SS Captive Portal Detection to feel it's behind a portal\n+--force-no-internet|Force the SS Captive Portal Detection to feel it can't reach the internet\n+--blob|Download a 50MiB blob from warmact.com, using flow control at the proxy\n+\n+```\n+[2019/08/12 07:16:11:0045] USR: LWS minimal secure streams [-d\u003cverbosity\u003e] [-f]\n+[2019/08/12 07:16:12:6102] USR: myss_state: LWSSSCS_CREATING, ord 0x0\n+[2019/08/12 07:16:12:6107] USR: myss_state: LWSSSCS_POLL, ord 0x0\n+[2019/08/12 07:16:12:6117] N: lws_ss_client_connect: connecting h1get warmcat.com /\n+[2019/08/12 07:16:12:6118] USR: myss_state: LWSSSCS_CONNECTING, ord 0x0\n+[2019/08/12 07:16:13:4171] USR: myss_state: LWSSSCS_CONNECTED, ord 0x0\n+[2019/08/12 07:16:13:4222] USR: myss_rx: len 1024, flags: 1\n+[2019/08/12 07:16:13:4243] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4244] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4244] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4245] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4246] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4247] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4252] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4264] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4265] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4266] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4267] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4268] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4268] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4269] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4270] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4278] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4279] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4280] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4281] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4282] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4283] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4283] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4284] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4287] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4288] USR: myss_rx: len 947, flags: 0\n+[2019/08/12 07:16:13:4293] USR: myss_rx: len 0, flags: 2\n+[2019/08/12 07:16:13:4399] USR: myss_state: LWSSSCS_DISCONNECTED, ord 0x0\n+[2019/08/12 07:16:13:4761] USR: myss_state: LWSSSCS_DESTROYING, ord 0x0\n+[2019/08/12 07:16:13:4781] USR: Completed: OK\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..8574e2e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/minimal-secure-streams.c\n@@ -0,0 +1,643 @@\n+/*\n+ * lws-minimal-secure-streams\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams api.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there.\n+ *\n+ * This example is built two different ways from the same source... one includes\n+ * the policy everything needed to fulfil the stream directly. The other -client\n+ * variant has no policy itself and some other minor init changes, and connects\n+ * to the -proxy example to actually get the connection done.\n+ *\n+ * In the -client build case, the example does not even init the tls libraries\n+ * since the proxy part will take care of all that.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+// #define FORCE_OS_TRUST_STORE\n+\n+/*\n+ * uncomment to force network traffic through 127.0.0.1:1080\n+ *\n+ * On your local machine, you can run a SOCKS5 proxy like this\n+ *\n+ * $ ssh -N -D 0.0.0.0:1080 localhost -v\n+ *\n+ * If enabled, this also fetches a remote policy that also\n+ * specifies that all traffic should go through the remote\n+ * proxy.\n+ */\n+// #define VIA_LOCALHOST_SOCKS\n+\n+static int interrupted, bad \u003d 1, force_cpd_fail_portal,\n+\t force_cpd_fail_no_internet, test_respmap, test_blob, test_ots;\n+static unsigned int timeout_ms \u003d 3000;\n+static lws_state_notify_link_t nl;\n+\n+/*\n+ * If the -proxy app is fulfilling our connection, then we don't need to have\n+ * the policy in the client.\n+ *\n+ * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over\n+ * a Unix Domain Socket. To test that, you need to separately run the\n+ * ./lws-minimal-secure-streams-proxy test app on the same machine.\n+ */\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t \u0022\u005c\u0022}\u0022\n+#endif\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+#endif\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t \t/*\n+\t\t * \u0022fetch_policy\u0022 decides from where the real policy\n+\t\t * will be fetched, if present. Otherwise the initial\n+\t\t * policy is treated as the whole, hardcoded, policy.\n+\t\t */\n+\t\t\u0022{\u005c\u0022fetch_policy\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-socks.json\u005c\u0022,\u0022\n+#else\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-v4.2-v2.json\u005c\u0022,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t\t/*\n+\t\t\t * \u0022captive_portal_detect\u0022 describes\n+\t\t\t * what to do in order to check if the path to\n+\t\t\t * the Internet is being interrupted by a\n+\t\t\t * captive portal. If there's a larger policy\n+\t\t\t * fetched from elsewhere, it should also include\n+\t\t\t * this since it needs to be done at least after\n+\t\t\t * every DHCP acquisition\n+\t\t\t */\n+\t\t \u0022\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+ \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+ \u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+ \u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+ \u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+ \u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+ \u0022}}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tsize_t\t\t\t\tamt;\n+\n+\tstruct lws_genhash_ctx\t\thash_ctx;\n+} myss_t;\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+#endif\n+\n+/* secure streams payload interface */\n+\n+static const uint8_t expected_blob_hash[] \u003d {\n+\t0xed, 0x57, 0x20, 0xc1, 0x68, 0x30, 0x81, 0x0e,\n+\t0x58, 0x29, 0xdf, 0xb9, 0xb6, 0x6c, 0x96, 0xb2,\n+\t0xe2, 0x4e, 0xfc, 0x4f, 0x93, 0xaa, 0x5e, 0x38,\n+\t0xc7, 0xff, 0x41, 0x50, 0xd3, 0x1c, 0xfb, 0xbf\n+};\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tconst char *md_srv \u003d \u0022not set\u0022, *md_test \u003d \u0022not set\u0022;\n+\tsize_t md_srv_len \u003d 7, md_test_len \u003d 7;\n+\n+\tif (flags \u0026 LWSSS_FLAG_PERF_JSON)\n+\t\treturn LWSSSSRET_OK;\n+\n+\tif (test_blob) {\n+\n+\t\tif (flags \u0026 LWSSS_FLAG_SOM) {\n+\t\t\tif (lws_genhash_init(\u0026m-\u003ehash_ctx, LWS_GENHASH_TYPE_SHA256))\n+\t\t\t\tlwsl_err(\u0022%s: hash init failed\u005cn\u0022, __func__);\n+\t\t\tm-\u003eamt \u003d 0;\n+\t\t}\n+\n+\t\tif (lws_genhash_update(\u0026m-\u003ehash_ctx, buf, len))\n+\t\t\tlwsl_err(\u0022%s: hash failed\u005cn\u0022, __func__);\n+\n+\t\tif ((m-\u003eamt + len) / 102400 !\u003d (m-\u003eamt / 102400)) {\n+\n+\t\t\tlwsl_user(\u0022%s: blob test: rx %uKiB\u005cn\u0022, __func__,\n+\t\t\t\t\t(unsigned int)((m-\u003eamt + len) / 1024));\n+\t\t\t/*\n+\t\t\t * Let's make it hard for client to keep up with onward\n+\t\t\t * server, delay 50ms after every 100K received, so we\n+\t\t\t * are forcing the flow control action at the proxy\n+\t\t\t */\n+\t\t\tusleep(50000);\n+\t\t}\n+\n+\t\tm-\u003eamt +\u003d len;\n+\n+\t\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\t\tuint8_t digest[32];\n+\t\t\tlws_genhash_destroy(\u0026m-\u003ehash_ctx, digest);\n+\n+\t\t\tif (!memcmp(expected_blob_hash, digest, 32)) {\n+\t\t\t\tlwsl_user(\u0022%s: SHA256 match\u005cn\u0022, __func__);\n+\t\t\t\tbad \u003d 0;\n+\t\t\t}\n+\n+\t\t\tinterrupted \u003d 1;\n+\t\t}\n+\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\tlws_ss_get_metadata(m-\u003ess, \u0022srv\u0022, (const void **)\u0026md_srv, \u0026md_srv_len);\n+\tlws_ss_get_metadata(m-\u003ess, \u0022test\u0022, (const void **)\u0026md_test, \u0026md_test_len);\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d, srv: %.*s, test: %.*s\u005cn\u0022, __func__,\n+\t\t (int)len, flags, (int)md_srv_len, md_srv,\n+\t\t (int)md_test_len, md_test);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t//myss_t *m \u003d (myss_t *)userobj;\n+\n+\t/* in this example, we don't send stuff */\n+\n+\treturn LWSSSSRET_TX_DONT_SEND;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %s (%d), ord 0x%x\u005cn\u0022, __func__,\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_CONNECTING:\n+\t\tlws_ss_start_timeout(m-\u003ess, timeout_ms);\n+\n+\t\tif (!test_blob) {\n+\t\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022uptag\u0022, \u0022myuptag123\u0022, 10))\n+\t\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\n+\t\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022, \u0022myctype\u0022, 7))\n+\t\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 2;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_QOS_ACK_REMOTE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_TIMEOUT:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_TIMEOUT\u005cn\u0022, __func__);\n+\t\t/* if we're out of time */\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 3;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_USER_BASE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_USER_BASE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+#endif\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\t/*\n+\t * The proxy takes responsibility for this stuff if we get things\n+\t * done through that\n+\t */\n+\n+\tcase LWS_SYSTATE_INITIALIZED: /* overlay on the hardcoded policy */\n+\tcase LWS_SYSTATE_POLICY_VALID: /* overlay on the loaded policy */\n+\n+\t\tif (target !\u003d current)\n+\t\t\tbreak;\n+\n+\t\tif (force_cpd_fail_portal)\n+\n+\t\t\t/* this makes it look like we're behind a captive portal\n+\t\t\t * because the overriden address does a redirect */\n+\n+\t\t\tlws_ss_policy_overlay(context,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022: [{\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022google.com\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022port\u005c\u0022: 80\u0022\n+\t\t\t\t \u0022}}]}\u0022);\n+\n+\t\tif (force_cpd_fail_no_internet)\n+\n+\t\t\t/* this looks like no internet, because the overridden\n+\t\t\t * port doesn't have anything that will connect to us */\n+\n+\t\t\tlws_ss_policy_overlay(context,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022: [{\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t\t \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022port\u005c\u0022: 999\u0022\n+\t\t\t\t \u0022}}]}\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\n+#endif\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\t\t\tlws_ss_info_t ssi;\n+\n+\t\t\t/* We're making an outgoing secure stream ourselves */\n+\n+\t\t\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\t\t\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\t\t\tssi.opaque_user_data_offset \u003d offsetof(myss_t,\n+\t\t\t\t\t\t\t opaque_data);\n+\t\t\tssi.rx \u003d myss_rx;\n+\t\t\tssi.tx \u003d myss_tx;\n+\t\t\tssi.state \u003d myss_state;\n+\t\t\tssi.user_alloc \u003d sizeof(myss_t);\n+\t\t\tssi.streamtype \u003d test_ots ? \u0022mintest-ots\u0022 :\n+\t\t\t\t\t(test_blob ? \u0022bulkproxflow\u0022 :\n+\t\t\t\t\t (test_respmap ? \u0022respmap\u0022 : \u0022mintest\u0022));\n+\n+\t\t\tif (lws_ss_create(context, 0, \u0026ssi, NULL, NULL,\n+\t\t\t\t\t NULL, NULL)) {\n+\t\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\n+static int\n+my_metric_report(lws_metric_pub_t *mp)\n+{\n+\tlws_metric_bucket_t *sub \u003d mp-\u003eu.hist.head;\n+\tchar buf[192];\n+\n+\tdo {\n+\t\tif (lws_metrics_format(mp, \u0026sub, buf, sizeof(buf)))\n+\t\t\tlwsl_user(\u0022%s: %s\u005cn\u0022, __func__, buf);\n+\t} while ((mp-\u003eflags \u0026 LWSMTFL_REPORT_HIST) \u0026\u0026 sub);\n+\n+\t/* 0 \u003d leave metric to accumulate, 1 \u003d reset the metric */\n+\n+\treturn 1;\n+}\n+\n+static const lws_system_ops_t system_ops \u003d {\n+\t.metric_report \u003d my_metric_report,\n+};\n+\n+#endif\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0, expected \u003d 0;\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\t/* these options are mutually exclusive if given */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-portal\u0022))\n+\t\tforce_cpd_fail_portal \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-no-internet\u0022))\n+\t\tforce_cpd_fail_no_internet \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--respmap\u0022))\n+\t\ttest_respmap \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--ots\u0022))\n+\t\t/*\n+\t\t * Use a streamtype that relies on the OS trust store for\n+\t\t * validation\n+\t\t */\n+\t\ttest_ots \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--timeout_ms\u0022)))\n+\t\ttimeout_ms \u003d (unsigned int)atoi(p);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--blob\u0022)) {\n+\t\ttest_blob \u003d 1;\n+\t\tif (timeout_ms \u003d\u003d 3000)\n+\t\t\t/*\n+\t\t\t * Don't use default 3s, we're going to be a lot\n+\t\t\t * slower\n+\t\t\t */\n+\t\t\ttimeout_ms \u003d 60000;\n+\t}\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+#if defined(LWS_WITH_MBEDTLS)\n+\n+\t/* uncomment to force mbedtls to load a system trust store like\n+\t * openssl does\n+\t *\n+\t * info.mbedtls_client_preload_filepath \u003d\n+\t *\t\t\u0022/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem\u0022;\n+\t */\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\tinfo.system_ops \u003d \u0026system_ops;\n+\tinfo.metrics_prefix \u003d \u0022ssmex\u0022;\n+#endif\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\t/*\n+\t * If we're being a proxied client, the proxy does all this\n+\t */\n+\n+\t/*\n+\t * Set the related lws_system blobs\n+\t *\n+\t * ...direct_set() sets a pointer, so the thing pointed to has to have\n+\t * a suitable lifetime, eg, something that already exists on the heap or\n+\t * a const string in .rodata like this\n+\t */\n+\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_SERIAL, 0),\n+\t\t\t\t (const uint8_t *)\u0022SN12345678\u0022, 10);\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_FW_VERSION, 0),\n+\t\t\t\t (const uint8_t *)\u0022v0.01\u0022, 5);\n+\n+\t/*\n+\t * ..._heap_append() appends to a buflist kind of arrangement on heap,\n+\t * just one block is fine, otherwise it will concatenate the fragments\n+\t * in the order they were appended (and take care of freeing them at\n+\t * context destroy time). ..._heap_empty() is also available to remove\n+\t * everything that was already allocated.\n+\t *\n+\t * Here we use _heap_append() just so it's tested as well as direct set.\n+\t */\n+\n+\tlws_system_blob_heap_append(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_TYPE, 0),\n+\t\t\t\t (const uint8_t *)\u0022spacerocket\u0022, 11);\n+#endif\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+bail:\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n+\t\texpected \u003d atoi(p);\n+\n+\tif (bad \u003d\u003d expected) {\n+\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, expected);\n+\t\treturn 0;\n+\t} else\n+\t\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, bad, expected);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt\nnew file mode 100644\nindex 0000000..b57e6fe\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt\n@@ -0,0 +1,76 @@\n+project(lws-minimal-secure-streams-client-tx C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-client-tx)\n+set(SRCS minimal-secure-streams-client-tx.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\t\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\n+\t\t#\n+\t\t# Define test dep to bring up and take down the test\n+\t\t# proxy\n+\t\t#\n+\n+\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t# uds abstract namespace for linux\n+\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-sspctx-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\telse()\n+\t\t\t# filesystem socket for others\n+\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-sspctx-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\tendif()\n+\t\tadd_test(NAME st_ssproxyctx COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\tssproxyctx $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\tset_tests_properties(st_ssproxyctx PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssproxyctx TIMEOUT 800)\n+\n+\t\tadd_test(NAME ki_ssproxyctx COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\tssproxyctx $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\tset_tests_properties(ki_ssproxyctx PROPERTIES FIXTURES_CLEANUP ssproxyctx)\n+\n+\t\t#\n+\t\t# the client part that will connect to the proxy\n+\t\t#\n+\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME sspc-minimaltx COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-client-tx\u003e -i +${CTEST_SOCKET_PATH})\n+\t\telse()\n+\t\t\tadd_test(NAME sspc-minimaltx COMMAND lws-minimal-secure-streams-client-tx -i +${CTEST_SOCKET_PATH})\n+\t\tendif()\n+\t\tset_tests_properties(sspc-minimaltx PROPERTIES\n+\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx\n+\t\t\tFIXTURES_REQUIRED \u0022ssproxyctx\u0022\n+\t\t\tTIMEOUT 40)\n+\n+\tendif()\n+\t\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/README.md\nnew file mode 100644\nindex 0000000..19b74c6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/README.md\n@@ -0,0 +1,40 @@\n+# lws minimal secure streams client tx\n+\n+The application connects to the secure stream proxy, and opens a streamtype\n+\u0022spam\u0022... this is a websocket connection to libwebsockets.org.\n+\n+It then issues 100 x ws messages at 20Hz and exits.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-f| Force connecting to the wrong endpoint to check backoff retry flow\n+-p| Run as proxy server for clients to connect to over unix domain socket\n+\n+```\n+[2021/02/19 11:25:20:1396] U: LWS secure streams client TX [-d\u003cverb\u003e]\n+[2021/02/19 11:25:20:1756] N: LWS: 4.1.99-v4.1.0-280-ga329c51485, loglevel 1031\n+[2021/02/19 11:25:20:1761] N: NET CLI SRV H1 H2 WS SS-JSON-POL SSPROX IPV6-on\n+[2021/02/19 11:25:20:2055] N: ++ [1100944|wsi|0|pipe] (1)\n+[2021/02/19 11:25:20:2133] N: ++ [1100944|vh|0|netlink] (1)\n+[2021/02/19 11:25:20:3647] N: ++ [1100944|vh|1|default] (2)\n+[2021/02/19 11:25:20:8590] N: ++ [1100944|SSPcli|0|spam] (1)\n+[2021/02/19 11:25:20:8810] N: ++ [1100944|wsiSSPcli|0|RAW/raw-skt/+@proxy.ss.lws/([1100944|SSPcli|0|spam])] (1)\n+[2021/02/19 11:25:20:9103] N: lws_sspc_sul_retry_cb: [1100944|wsiSSPcli|0|RAW/raw-skt/+@proxy.ss.lws/([1100944|SSPcli|0|spam|default])]\n+[2021/02/19 11:25:20:9795] U: myss_state: LWSSSCS_CREATING, ord 0x0\n+[2021/02/19 11:25:20:9869] U: myss_state: LWSSSCS_CONNECTING, ord 0x0\n+[2021/02/19 11:25:21:0791] U: myss_state: LWSSSCS_CONNECTED, ord 0x0\n+[2021/02/19 11:25:21:1444] U: myss_tx: sending pkt 1\n+[2021/02/19 11:25:21:1945] U: myss_tx: sending pkt 2\n+[2021/02/19 11:25:21:2459] U: myss_tx: sending pkt 3\n+[2021/02/19 11:25:21:2971] U: myss_tx: sending pkt 4\n+...\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/minimal-secure-streams-client-tx.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/minimal-secure-streams-client-tx.c\nnew file mode 100644\nindex 0000000..0899010\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/minimal-secure-streams-client-tx.c\n@@ -0,0 +1,207 @@\n+/*\n+ * lws-minimal-secure-streams-tx\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates proxied mass tx from secure streams, this example is a\n+ * client that has no policy of its own, but gets stuff done via the ss proxy.\n+ *\n+ * It opens a websocket stream and fires 100 x small 80-byte payloads on it\n+ * at 20Hz (50ms)\n+ */\n+\n+#define LWS_SS_USE_SSPC\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define PKT_SIZE 80\n+#define RATE_US 50000\n+\n+static int interrupted, bad \u003d 1, reads \u003d 100;\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\tsul;\n+\n+\tint\t\t\tcount;\n+\tchar\t\t\tdue;\n+} myss_t;\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\t/* this example isn't interested in rx */\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static void\n+txcb(struct lws_sorted_usec_list *sul)\n+{\n+\tmyss_t *m \u003d lws_container_of(sul, myss_t, sul);\n+\n+\t/*\n+\t * We want to do 100 of these ws messages, and then exit, so we can run\n+\t * this as a pass / fail test.\n+\t */\n+\n+\tif (m-\u003ecount \u003d\u003d reads) {\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 0;\n+\t} else {\n+\t\tm-\u003edue \u003d 1;\n+\t\tlws_ss_request_tx(m-\u003ess);\n+\t}\n+\n+\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul, txcb, RATE_US);\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tif (!m-\u003edue)\n+\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+\tm-\u003edue \u003d 0;\n+\n+\tif (lws_get_random(lws_ss_get_context(m-\u003ess), buf, PKT_SIZE) !\u003d PKT_SIZE)\n+\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+\t*len \u003d PKT_SIZE;\n+\t*flags \u003d LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;\n+\n+\tm-\u003ecount++;\n+\n+\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul, txcb, RATE_US);\n+\n+\tlwsl_user(\u0022%s: sending pkt %d\u005cn\u0022, __func__, m-\u003ecount);\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t\tlws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tstruct lws_context *context \u003d lws_ss_get_context(m-\u003ess);\n+\n+\tlwsl_user(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name((int)state),\n+\t\t (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\tlws_sul_schedule(context, 0, \u0026m-\u003esul, txcb, RATE_US);\n+\t\tbreak;\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tlws_sul_cancel(\u0026m-\u003esul);\n+\t\tbreak;\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static const lws_ss_info_t ssi \u003d {\n+\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n+\t.rx\t\t\t\t\u003d myss_rx,\n+\t.tx\t\t\t\t\u003d myss_tx,\n+\t.state\t\t\t\t\u003d myss_state,\n+\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n+\t.streamtype\t\t\t\u003d \u0022spam\u0022\n+};\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022)))\n+\t\treads \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS secure streams client TX [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tgoto bail1;\n+\t}\n+\n+\tif (lws_ss_create(context, 0, \u0026ssi, NULL, NULL, NULL, NULL)) {\n+\t\tlwsl_err(\u0022%s: create secure stream failed\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+bail1:\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..f86e75d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt\n@@ -0,0 +1,50 @@\n+project(lws-minimal-secure-streams-cpp CXX)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-cpp)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_MBEDTLS 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_CPP 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} main.cxx)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE)\n+\t\tadd_test(NAME sscpp-warmcat COMMAND lws-minimal-secure-streams-cpp)\n+\t\tset_tests_properties(sscpp-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp\n+\t\t\t\t TIMEOUT 20)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client main.cxx)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/main.cxx b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/main.cxx\nnew file mode 100644\nindex 0000000..e6f051f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/main.cxx\n@@ -0,0 +1,107 @@\n+/*\n+ * lws-minimal-secure-streams-cpp\n+ *\n+ * Written in 2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal http client using secure streams C++ api to\n+ * fetch files over https to the local filesystem\n+ */\n+\n+#include \u003clibwebsockets.hxx\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, concurrent \u003d 1, completed;\n+\n+static int\n+lss_completion(lss *lss, lws_ss_constate_t state, void *arg)\n+{\n+\tlssFile *lf \u003d (lssFile *)lss;\n+\n+\tif (state \u003d\u003d LWSSSCS_QOS_ACK_REMOTE) {\n+\t\tlwsl_notice(\u0022%s: %s: len %llu, done OK %dms\u005cn\u0022, __func__,\n+\t\t\t lf-\u003epath.c_str(), (unsigned long long)lf-\u003erxlen,\n+\t\t\t (int)((lws_now_usecs() - lf-\u003eus_start) / 1000));\n+\t} else\n+\t\tlwsl_notice(\u0022%s: %s: failed\u005cn\u0022, __func__, lf-\u003epath.c_str());\n+\n+\tif (++completed \u003d\u003d concurrent) {\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 0;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022)))\n+\t\tconcurrent \u003d atoi(p);\n+\n+\tif (concurrent \u003e 12)\n+\t\tconcurrent \u003d 12;\n+\n+\tlwsl_user(\u0022LWS secure streams cpp test client \u0022\n+\t\t\t\u0022[-d\u003cverb\u003e] [-c\u003cconcurrent\u003e]\u005cn\u0022);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 12 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\ttry {\n+\n+\t\tfor (int n \u003d 0; n \u003c concurrent; n++) {\n+\t\t\tstd::string url, filepath;\n+\n+\t\t\turl \u003d \u0022https://warmcat.com/test-\u0022;\n+\t\t\turl +\u003d ('a' + n);\n+\t\t\turl +\u003d \u0022.bin\u0022;\n+\n+\t\t\tfilepath \u003d \u0022/tmp/test-\u0022;\n+\t\t\tfilepath +\u003d ('a' + n);\n+\t\t\tfilepath +\u003d \u0022.bin\u0022;\n+\n+\t\t\tnew lssFile(context, url, filepath, lss_completion, 0);\n+\t\t}\n+\t} catch (std::exception \u0026e) {\n+\t\tlwsl_err(\u0022%s: failed to create ss: %s\u005cn\u0022, __func__, e.what());\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (!interrupted \u0026\u0026 lws_service(context, 0) \u003e\u003d 0)\n+\t\t;\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/CMakeLists.txt\nnew file mode 100644\nindex 0000000..723908c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/CMakeLists.txt\n@@ -0,0 +1,23 @@\n+project(lws-minimal-secure-streams-custom-client-transport C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-custom-client-transport)\n+set(SRCS main.c binance-ss.c transport-serial.c app-event-loop.c system.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 requirements)\n+require_lws_config(LWS_ONLY_SSPC 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/README.md\nnew file mode 100644\nindex 0000000..5155ddd\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/README.md\n@@ -0,0 +1,56 @@\n+# lws minimal secure streams binance\n+\n+This is a Secure Streams version of minimal-ws-client-binance.\n+\n+\u0022policy.json\u0022 contains all the information about endpoints, protocols and\n+connection validation, tagged by streamtype name.\n+\n+The example tries to load it from the cwd, it lives in\n+./minimal-examples/secure-streams/minimal-secure-streams-binance dir, so\n+either run it from there, or copy the policy.json to your cwd. It's also\n+possible to put the policy json in the code as a string and pass that at\n+context creation time.\n+\n+The secure stream object represents a nailed-up connection that outlives any\n+single socket connection, and can manage reconnections / retries according to\n+the policy to keep the connection nailed up automatically.\n+\n+Secure Streams provides the same simplified communication api without any\n+protocol dependencies.\n+\n+## build\n+\n+Lws must have been built with `LWS_ROLE_WS\u003d1`, `LWS_WITH_SECURE_STREAMS\u003d1`, and\n+`LWS_WITHOUT_EXTENSIONS\u003d0`\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+\n+## usage\n+\n+```\n+$ ./bin/lws-minimal-ws-client-binance \n+[2021/08/15 06:42:40:8409] U: LWS minimal Secure Streams binance client\n+[2021/08/15 06:42:40:8410] N: LWS: 4.2.99-v4.2.0-156-g8f352f65e8, NET CLI SRV H1 H2 WS SS-JSON-POL SSPROX ConMon FLTINJ IPV6-on\n+[2021/08/15 06:42:40:8410] N: ++ [495958|wsi|0|pipe] (1)\n+[2021/08/15 06:42:40:8411] N: ++ [495958|vh|0|netlink] (1)\n+[2021/08/15 06:42:40:8433] N: ++ [495958|vh|1|digicert||-1] (2)\n+[2021/08/15 06:42:40:8471] N: ++ [495958|wsiSScli|0|binance] (1)\n+[2021/08/15 06:42:40:8471] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: (unset) -\u003e LWSSSCS_CREATING\n+[2021/08/15 06:42:40:8472] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: LWSSSCS_CREATING -\u003e LWSSSCS_CONNECTING\n+[2021/08/15 06:42:40:8472] N: ++ [495958|wsicli|0|WS/h1/fstream.binance.com/([495958|wsiSScli|0|binance])] (1)\n+[2021/08/15 06:42:41:8802] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTING -\u003e LWSSSCS_CONNECTED\n+[2021/08/15 06:42:42:8803] N: sul_hz_cb: price: min: 4669185¢, max: 4672159¢, avg: 4670061¢, (53 prices/s)\n+[2021/08/15 06:42:42:8803] N: sul_hz_cb: elatency: min: 131ms, max: 292ms, avg: 154ms, (53 msg/s)\n+[2021/08/15 06:42:43:8803] N: sul_hz_cb: price: min: 4669646¢, max: 4672159¢, avg: 4669953¢, (34 prices/s)\n+[2021/08/15 06:42:43:8803] N: sul_hz_cb: elatency: min: 130ms, max: 149ms, avg: 133ms, (34 msg/s)\n+[2021/08/15 06:42:44:8804] N: sul_hz_cb: price: min: 4669455¢, max: 4672159¢, avg: 4669904¢, (26 prices/s)\n+...\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/app-event-loop.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/app-event-loop.c\nnew file mode 100644\nindex 0000000..b3e6712\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/app-event-loop.c\n@@ -0,0 +1,162 @@\n+/*\n+ * lws-minimal-secure-streams-custom-proxy-transport\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ * Kutoga \u003ckutoga@user.github.invalid\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This represents some existing application event loop that liblws-sspc must\n+ * cooperate with.\n+ */\n+\n+#include \u0022private.h\u0022\n+\n+custom_poll_ctx_t a_cpcx;\n+\n+static struct pollfd *\n+custom_poll_find_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd)\n+{\n+\tint n;\n+\n+\tfor (n \u003d 0; n \u003c cpcx-\u003ecount_pollfds; n++)\n+\t\tif (cpcx-\u003epollfds[n].fd \u003d\u003d fd)\n+\t\t\treturn \u0026cpcx-\u003epollfds[n];\n+\n+\treturn NULL;\n+}\n+\n+int\n+custom_poll_add_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd, int events,\n+\t\t void *priv)\n+{\n+\tstruct pollfd *pfd;\n+\n+\tlwsl_info(\u0022%s: ADD fd %d, ev %d\u005cn\u0022, __func__, fd, events);\n+\n+\tpfd \u003d custom_poll_find_fd(cpcx, fd);\n+\tif (pfd) {\n+\t\tlwsl_err(\u0022%s: ADD fd %d already in ext table\u005cn\u0022, __func__, fd);\n+\t\treturn 1;\n+\t}\n+\n+\tif (cpcx-\u003ecount_pollfds \u003d\u003d LWS_ARRAY_SIZE(cpcx-\u003epollfds)) {\n+\t\tlwsl_err(\u0022%s: no room left\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tcpcx-\u003epriv[cpcx-\u003ecount_pollfds] \u003d priv;\n+\tpfd \u003d \u0026cpcx-\u003epollfds[cpcx-\u003ecount_pollfds++];\n+\tpfd-\u003efd \u003d fd;\n+\tpfd-\u003eevents \u003d (short)events;\n+\tpfd-\u003erevents \u003d 0;\n+\n+\treturn 0;\n+}\n+\n+int\n+custom_poll_del_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd)\n+{\n+\tstruct pollfd *pfd;\n+\n+\tlwsl_info(\u0022%s: DEL fd %d\u005cn\u0022, __func__, fd);\n+\n+\tpfd \u003d custom_poll_find_fd(cpcx, fd);\n+\tif (!pfd) {\n+\t\tlwsl_err(\u0022%s: DEL fd %d missing in ext table\u005cn\u0022, __func__, fd);\n+\t\treturn 1;\n+\t}\n+\n+\tif (cpcx-\u003ecount_pollfds \u003e 1)\n+\t\t*pfd \u003d cpcx-\u003epollfds[cpcx-\u003ecount_pollfds - 1];\n+\n+\tcpcx-\u003ecount_pollfds--;\n+\n+\treturn 0;\n+}\n+\n+int\n+custom_poll_change_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd,\n+\t\t int events_add, int events_remove)\n+{\n+\tstruct pollfd *pfd;\n+\n+\tlwsl_info(\u0022%s: CHG fd %d, ev_add %d, ev_rem %d\u005cn\u0022, __func__, fd,\n+\t\t\tevents_add, events_remove);\n+\n+\tpfd \u003d custom_poll_find_fd(cpcx, fd);\n+\tif (!pfd)\n+\t\treturn 1;\n+\n+\tpfd-\u003eevents \u003d (short)((pfd-\u003eevents \u0026 (~events_remove)) | events_add);\n+\n+\treturn 0;\n+}\n+\n+int\n+custom_poll_run(custom_poll_ctx_t *cpcx)\n+{\n+\tint n;\n+\n+\twhile (!interrupted) {\n+\n+\t\tlws_usec_t timeout_us \u003d 2000000000, now \u003d lws_now_usecs();\n+\n+\t\tif (cpcx-\u003escheduler.count) {\n+\t\t\tlws_sorted_usec_list_t *sul \u003d (lws_sorted_usec_list_t *)\n+\t\t\t\t\tlws_dll2_get_head(\u0026cpcx-\u003escheduler);\n+\t\t\tif (sul-\u003eus \u003c now)\n+\t\t\t\ttimeout_us \u003d 0;\n+\t\t\telse\n+\t\t\t\ttimeout_us \u003d sul-\u003eus - now;\n+\t\t}\n+\n+//\t\tlwsl_notice(\u0022%s: entering poll wait %dms\u005cn\u0022, __func__, (int)(timeout_us / 1000));\n+\n+\t\tn \u003d poll(cpcx-\u003epollfds, (nfds_t)cpcx-\u003ecount_pollfds, (int)(timeout_us / 1000));\n+\n+//\t\tlwsl_notice(\u0022%s: exiting poll after %lluus\u005cn\u0022, __func__,\n+//\t\t\t\t(unsigned long long)(lws_now_usecs() - now));\n+\n+\t\tdo {\n+\t\t\tlws_sorted_usec_list_t *sul \u003d (lws_sorted_usec_list_t *)\n+\t\t\t\tlws_dll2_get_head(\u0026cpcx-\u003escheduler);\n+\n+\t\t\tif (!sul)\n+\t\t\t\tbreak;\n+\n+\t\t\tif (sul-\u003eus \u003e now)\n+\t\t\t\tbreak;\n+\n+\t\t\tlws_dll2_remove(\u0026sul-\u003elist);\n+\t\t\tsul-\u003ecb(sul);\n+\t\t} while (1);\n+\n+\t\tif (n \u003c\u003d 0)\n+\t\t\tcontinue;\n+\n+\t\t/* service anything that has active revents */\n+\n+\t\tfor (n \u003d 0; n \u003c cpcx-\u003ecount_pollfds; n++) {\n+\t\t\tint m;\n+\n+\t\t\tif (!cpcx-\u003epollfds[n].revents)\n+\t\t\t\tcontinue;\n+\n+\t\t\t/*\n+\t\t\t * the only fd we registered in this example is the\n+\t\t\t * transport fd, so we miss out the code to match the\n+\t\t\t * fd to the right callback\n+\t\t\t */\n+\n+\t\t\tm \u003d custom_transport_event(\u0026cpcx-\u003epollfds[n], cpcx-\u003epriv[n]);\n+\t\t\tif (m \u003c 0) {\n+\t\t\t\tcustom_poll_del_fd(cpcx, cpcx-\u003epollfds[n].fd);\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/binance-ss.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/binance-ss.c\nnew file mode 100644\nindex 0000000..3c458f5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/binance-ss.c\n@@ -0,0 +1,312 @@\n+/*\n+ * lws-minimal-secure-streams-custom-proxy-transport\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ * Kutoga \u003ckutoga@user.github.invalid\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This is a version of minimal-secure-streams-binance that uses a custom\n+ * SS Serialization transport.\n+ *\n+ * Because this links against the cut-down liblws-sspc instead of libwebsockets,\n+ */\n+\n+#define LWS_SS_USE_SSPC\n+\n+/* We use the lws headers, but we link against liblws-sspc, not libwebsockets */\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cctype.h\u003e\n+\n+typedef struct range {\n+\tuint64_t\t\tsum;\n+\tuint64_t\t\tlowest;\n+\tuint64_t\t\thighest;\n+\n+\tunsigned int\t\tsamples;\n+} range_t;\n+\n+typedef struct binance {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\n+\tlws_sorted_usec_list_t\tsul_hz;\t /* 1hz summary dump */\n+\tchar\t\t\tmsgbuf[10240];\n+\tsize_t\t\t\tmsg_len;\n+\n+\trange_t\t\t\te_lat_range;\n+\trange_t\t\t\tprice_range;\n+} binance_t;\n+\n+/*\n+ * Since we don't link to libwebsockets library, we need to bring in our own\n+ * copies of any lws apis we use in the user Binance SS code\n+ */\n+\n+const char *\n+lws_nstrstr(const char *buf, size_t len, const char *name, size_t nl)\n+{\n+\tconst char *end \u003d buf + len - nl + 1;\n+\tsize_t n;\n+\n+\tif (nl \u003e len)\n+\t\t/* it cannot be found if the needle is longer than the haystack */\n+\t\treturn NULL;\n+\n+\twhile (buf \u003c end) {\n+\t\tif (*buf !\u003d name[0]) {\n+\t\t\tbuf++;\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tif (nl \u003d\u003d 1)\n+\t\t\t/* single char match, we are done */\n+\t\t\treturn buf;\n+\n+\t\tif (buf[nl - 1] \u003d\u003d name[nl - 1]) {\n+\t\t\t/*\n+\t\t\t * This is looking interesting then... the first\n+\t\t\t * and last chars match, let's check the insides\n+\t\t\t */\n+\t\t\tn \u003d 1;\n+\t\t\twhile (n \u003c nl \u0026\u0026 buf[n] \u003d\u003d name[n])\n+\t\t\t\tn++;\n+\n+\t\t\tif (n \u003d\u003d nl)\n+\t\t\t\t/* it's a hit */\n+\t\t\t\treturn buf;\n+\t\t}\n+\n+\t\tbuf++;\n+\t}\n+\n+\treturn NULL;\n+}\n+\n+\n+const char *\n+lws_json_simple_find(const char *buf, size_t len, const char *name, size_t *alen)\n+{\n+\tsize_t nl \u003d strlen(name);\n+\tconst char *np \u003d lws_nstrstr(buf, len, name, nl),\n+\t\t *end \u003d buf + len, *as;\n+\tint qu \u003d 0;\n+\n+\tif (!np)\n+\t\treturn NULL;\n+\n+\tnp +\u003d nl;\n+\n+\twhile (np \u003c end \u0026\u0026 (*np \u003d\u003d ' ' || *np \u003d\u003d '\u005ct'))\n+\t\tnp++;\n+\n+\tif (np \u003e\u003d end)\n+\t\treturn NULL;\n+\n+\t/*\n+\t * The arg could be lots of things after \u0022name\u0022: with JSON, commonly a\n+\t * string like \u0022mystring\u0022, true, false, null, [...] or {...} ... we want\n+\t * to handle common, simple cases cheaply with this; the user can choose\n+\t * a full JSON parser like lejp if it's complicated. So if no opening\n+\t * quote, return until a terminator like , ] }. If there's an opening\n+\t * quote, return until closing quote, handling escaped quotes.\n+\t */\n+\n+\tif (*np \u003d\u003d '\u005c\u0022') {\n+\t\tqu \u003d 1;\n+\t\tnp++;\n+\t}\n+\n+\tas \u003d np;\n+\twhile (np \u003c end \u0026\u0026\n+\t (!qu || *np !\u003d '\u005c\u0022') \u0026\u0026 /* end quote is EOT if quoted */\n+\t (qu || (*np !\u003d '}' \u0026\u0026 *np !\u003d ']' \u0026\u0026 *np !\u003d ',')) /* delimiters */\n+\t) {\n+\t\tif (qu \u0026\u0026 *np \u003d\u003d '\u005c\u005c') /* skip next char if quoted escape */\n+\t\t\tnp++;\n+\t\tnp++;\n+\t}\n+\n+\t*alen \u003d (unsigned int)lws_ptr_diff(np, as);\n+\n+\treturn as;\n+}\n+\n+/*\n+ * Rest of the file is Binance application SS processing (UNCHANGED from\n+ * minimal-secure-streams-binance)\n+ */\n+\n+static void\n+range_reset(range_t *r)\n+{\n+\tr-\u003esum \u003d r-\u003ehighest \u003d 0;\n+\tr-\u003elowest \u003d 999999999999ull;\n+\tr-\u003esamples \u003d 0;\n+}\n+\n+static uint64_t\n+get_us_timeofday(void)\n+{\n+\tstruct timeval tv;\n+\n+\tgettimeofday(\u0026tv, NULL);\n+\n+\treturn (uint64_t)((lws_usec_t)tv.tv_sec * LWS_US_PER_SEC) +\n+\t\t\t (uint64_t)tv.tv_usec;\n+}\n+\n+static uint64_t\n+pennies(const char *s)\n+{\n+\tuint64_t price \u003d (uint64_t)atoll(s) * 100;\n+\n+\ts \u003d strchr(s, '.');\n+\n+\tif (s \u0026\u0026 isdigit(s[1]) \u0026\u0026 isdigit(s[2]))\n+\t\tprice \u003d price + (uint64_t)((10 * (s[1] - '0')) + (s[2] - '0'));\n+\n+\treturn price;\n+}\n+\n+static void\n+sul_hz_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tbinance_t *bin \u003d lws_container_of(sul, binance_t, sul_hz);\n+\n+\t/*\n+\t * We are called once a second to dump statistics on the connection\n+\t */\n+\n+\tlws_sul_schedule(lws_ss_get_context(bin-\u003ess), 0, \u0026bin-\u003esul_hz,\n+\t\t\t sul_hz_cb, LWS_US_PER_SEC);\n+\n+\tif (bin-\u003eprice_range.samples)\n+\t\tlwsl_user(\u0022%s: price: min: %llu¢, max: %llu¢, avg: %llu¢, \u0022\n+\t\t\t \u0022(%d prices/s)\u005cn\u0022, __func__,\n+\t\t\t (unsigned long long)bin-\u003eprice_range.lowest,\n+\t\t\t (unsigned long long)bin-\u003eprice_range.highest,\n+\t\t\t (unsigned long long)(bin-\u003eprice_range.sum /\n+\t\t\t\t\t\t bin-\u003eprice_range.samples),\n+\t\t\t bin-\u003eprice_range.samples);\n+\tif (bin-\u003ee_lat_range.samples)\n+\t\tlwsl_user(\u0022%s: elatency: min: %llums, max: %llums, \u0022\n+\t\t\t \u0022avg: %llums, (%d msg/s)\u005cn\u0022, __func__,\n+\t\t\t (unsigned long long)bin-\u003ee_lat_range.lowest / 1000,\n+\t\t\t (unsigned long long)bin-\u003ee_lat_range.highest / 1000,\n+\t\t\t (unsigned long long)(bin-\u003ee_lat_range.sum /\n+\t\t\t\t\t bin-\u003ee_lat_range.samples) / 1000,\n+\t\t\t bin-\u003ee_lat_range.samples);\n+\n+\trange_reset(\u0026bin-\u003ee_lat_range);\n+\trange_reset(\u0026bin-\u003eprice_range);\n+}\n+\n+static lws_ss_state_return_t\n+binance_rx(void *userobj, const uint8_t *in, size_t len, int flags)\n+{\n+\tbinance_t *bin \u003d (binance_t *)userobj;\n+\tuint64_t latency_us, now_us;\n+\tchar numbuf[16];\n+\tuint64_t price;\n+\tconst char *p;\n+\tsize_t alen;\n+\n+\tif (flags \u0026 LWSSS_FLAG_SOM)\n+\t\tbin-\u003emsg_len \u003d 0;\n+\n+\tif (bin-\u003emsg_len + len \u003c sizeof(bin-\u003emsgbuf)) {\n+\t\tmemcpy(bin-\u003emsgbuf + bin-\u003emsg_len, in, len);\n+\t\tbin-\u003emsg_len +\u003d len;\n+\t}\n+\n+\t/* assemble a full message */\n+\tif (!(flags \u0026 LWSSS_FLAG_EOM))\n+\t\treturn LWSSSSRET_OK;\n+\n+\t//lwsl_notice(\u0022%s: chunk len %d\u005cn\u0022, __func__, (int)len);\n+\n+\tnow_us \u003d (uint64_t)get_us_timeofday();\n+\n+\tp \u003d lws_json_simple_find(bin-\u003emsgbuf, bin-\u003emsg_len, \u0022\u005c\u0022depthUpdate\u005c\u0022\u0022,\n+\t\t\t\t \u0026alen);\n+\tif (!p)\n+\t\treturn LWSSSSRET_OK;\n+\n+\tp \u003d lws_json_simple_find(bin-\u003emsgbuf, bin-\u003emsg_len, \u0022\u005c\u0022E\u005c\u0022:\u0022, \u0026alen);\n+\tif (!p) {\n+\t\tlwsl_err(\u0022%s: no E JSON\u005cn\u0022, __func__);\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\tlws_strnncpy(numbuf, p, alen, sizeof(numbuf));\n+\tlatency_us \u003d now_us - ((uint64_t)atoll(numbuf) * LWS_US_PER_MS);\n+\n+\tif (latency_us \u003c bin-\u003ee_lat_range.lowest)\n+\t\tbin-\u003ee_lat_range.lowest \u003d latency_us;\n+\tif (latency_us \u003e bin-\u003ee_lat_range.highest)\n+\t\tbin-\u003ee_lat_range.highest \u003d latency_us;\n+\n+\tbin-\u003ee_lat_range.sum +\u003d latency_us;\n+\tbin-\u003ee_lat_range.samples++;\n+\n+\tp \u003d lws_json_simple_find(bin-\u003emsgbuf, bin-\u003emsg_len, \u0022\u005c\u0022a\u005c\u0022:[[\u005c\u0022\u0022, \u0026alen);\n+\tif (!p)\n+\t\treturn LWSSSSRET_OK;\n+\n+\tlws_strnncpy(numbuf, p, alen, sizeof(numbuf));\n+\tprice \u003d pennies(numbuf);\n+\n+\tif (price \u003c bin-\u003eprice_range.lowest)\n+\t\tbin-\u003eprice_range.lowest \u003d price;\n+\tif (price \u003e bin-\u003eprice_range.highest)\n+\t\tbin-\u003eprice_range.highest \u003d price;\n+\n+\tbin-\u003eprice_range.sum +\u003d price;\n+\tbin-\u003eprice_range.samples++;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+binance_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tbinance_t *bin \u003d (binance_t *)userobj;\n+\n+\tlwsl_ss_info(bin-\u003ess, \u0022%s (%d), ord 0x%x\u0022,\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\tlws_sul_schedule(lws_ss_get_context(bin-\u003ess), 0, \u0026bin-\u003esul_hz,\n+\t\t\t\t sul_hz_cb, LWS_US_PER_SEC);\n+\t\trange_reset(\u0026bin-\u003ee_lat_range);\n+\t\trange_reset(\u0026bin-\u003eprice_range);\n+\n+\t\treturn LWSSSSRET_OK;\n+\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tlws_sul_cancel(\u0026bin-\u003esul_hz);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+const lws_ss_info_t ssi_binance \u003d {\n+\t.handle_offset\t\t \u003d offsetof(binance_t, ss),\n+\t.opaque_user_data_offset \u003d offsetof(binance_t, opaque_data),\n+\t.rx\t\t\t \u003d binance_rx,\n+\t.state\t\t\t \u003d binance_state,\n+\t.user_alloc\t\t \u003d sizeof(binance_t),\n+\t.streamtype\t\t \u003d \u0022binance\u0022, /* bind to corresponding policy */\n+};\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/main.c\nnew file mode 100644\nindex 0000000..772075e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/main.c\n@@ -0,0 +1,114 @@\n+/*\n+ * lws-minimal-secure-streams-custom-client-transport\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ * Kutoga \u003ckutoga@user.github.invalid\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This is a version of minimal-secure-streams-binance that uses a custom\n+ * SS Serialization transport.\n+ *\n+ * Lws provides a wsi-based SS serialization transport, so you can connect to\n+ * SS proxy over tcp or Unix Domain Sockets. This example shows how to create\n+ * SS proxy clients with no dependency on libwebsockets library.\n+ *\n+ * libwebsockets header is used, but the application does not have an\n+ * lws_context and does not link against libwebsockets, instead using a much\n+ * smaller SSPC-only library liblws-sspc (built during lws build).\n+ */\n+\n+#include \u0022private.h\u0022\n+\n+int interrupted;\n+int transport_fd;\n+\n+/*\n+ * Apps that bind to liblws-sspc have a fake lws_context with a couple of\n+ * members in it, there is no lws_create_context, it's so trivial you can\n+ * make your own like below.\n+ *\n+ * The is to retain the same SS apis that expect an lws_context, and also the\n+ * place where we bind to the transport to be used\n+ */\n+\n+static struct lws_context_standalone cx \u003d {\n+\t.txp_cpath.ops_onw\t\t\u003d \u0026lws_transport_mux_client_ops,\n+};\n+\n+\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+lws_transport_info_t info_serial \u003d {\n+\t.ping_interval_us\t\t\u003d LWS_US_PER_SEC * 10,\n+\t.pong_grace_us\t\t\t\u003d LWS_US_PER_SEC * 2,\n+\t.flags\t\t\t\t\u003d 0,\n+}, info_mux \u003d { /* onward transport for mux is serial */\n+\t.ping_interval_us\t\t\u003d LWS_US_PER_SEC * 10,\n+\t.pong_grace_us\t\t\t\u003d LWS_US_PER_SEC * 2,\n+\t.txp_cpath \u003d {\n+\t\t.ops_onw\t\t\u003d \u0026lws_sss_ops_client_serial,\n+\t\t.ops_in\t\t\t\u003d \u0026lws_transport_mux_client_ops,\n+\t},\n+\t.onward_txp_info\t\t\u003d \u0026info_serial,\n+\t.flags\t\t\t\t\u003d 0,\n+};\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tstruct lws_ss_handle *h \u003d NULL;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tlwsl_user(\u0022LWS minimal Secure Streams binance client / custom SS proxy transport\u005cn\u0022);\n+\n+\t/* open the transport itself... only one of these */\n+\n+\ttransport_fd \u003d open_transport_file(\u0026a_cpcx, \u0022/dev/ttyUSB1\u0022, NULL);\n+\tif (transport_fd \u003c 0) {\n+\t\tlwsl_err(\u0022%s: failed to open custom transport tty\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\t/* create the mux object itself... only one of these */\n+\n+\ta_cpcx.tm \u003d lws_transport_mux_create(\u0026cx, \u0026info_mux, NULL);\n+\tif (!a_cpcx.tm) {\n+\t\tlwsl_err(\u0022%s: unable to create client mux\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\ta_cpcx.tm-\u003einfo.txp_cpath.priv_in \u003d a_cpcx.tm;\n+\tcx.txp_cpath.mux \u003d a_cpcx.tm;\n+\n+\t/*\n+\t * Now that's done, create the SS and it will try to connect over the\n+\t * mux -\u003e transport -\u003e proxy\n+\t */\n+\n+\tif (lws_ss_create(\u0026cx, 0, \u0026ssi_binance, NULL, \u0026h, NULL, NULL)) {\n+\t\tprintf(\u0022failed to create secure stream\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\n+\tcustom_poll_run(\u0026a_cpcx);\n+\n+\tif (h)\n+\t\tlws_ss_destroy(\u0026h);\n+\n+\tlws_transport_mux_destroy(\u0026a_cpcx.tm);\n+\n+\tprintf(\u0022Completed\u005cn\u0022);\n+\n+\tclose(transport_fd);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/policy.json\nnew file mode 100644\nindex 0000000..1ff4e04\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/policy.json\n@@ -0,0 +1,38 @@\n+{\n+\t\u0022release\u0022: \u002201234567\u0022,\n+\t\u0022product\u0022: \u0022myproduct\u0022,\n+\t\u0022schema-version\u0022: 1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022: [1000, 2000, 3000, 4000, 5000],\n+\t\t\t\u0022conceal\u0022: 65535,\n+\t\t\t\u0022jitterpc\u0022: 20,\n+\t\t\t\u0022svalidping\u0022: 30,\n+\t\t\t\u0022svalidhup\u0022: 35\n+\t\t}\n+\t}],\n+\t\u0022certs\u0022: [{\n+\t\t\u0022digicert_global_root\u0022: \u0022MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQkCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4\u003d\u0022\n+ }\n+\t],\n+\t\t\u0022trust_stores\u0022: [{\n+\t\t\t\u0022name\u0022: \u0022digicert\u0022,\n+\t\t\t\u0022stack\u0022: [\u0022digicert_global_root\u0022]\n+\t\t}\n+\t],\n+\t\u0022s\u0022: [\n+\t\t{ \u0022binance\u0022: {\n+\t\t\t\u0022endpoint\u0022:\t\t\u0022fstream.binance.com\u0022,\n+\t\t\t\u0022port\u0022:\t\t\t443,\n+\t\t\t\u0022protocol\u0022:\t\t\u0022ws\u0022,\n+\t\t\t\u0022http_url\u0022:\t\t\u0022/stream?streams\u003dbtcusdt@depth@0ms/btcusdt@bookTicker/btcusdt@aggTrade\u0022,\n+\t\t\t\u0022nailed_up\u0022: \ttrue,\n+\t\t\t\u0022ws_prioritize_reads\u0022:\ttrue,\n+\t\t\t\u0022tls\u0022:\t\t\ttrue,\n+\t\t\t\u0022tls_trust_store\u0022:\t\u0022digicert\u0022,\n+\t\t\t\u0022retry\u0022:\t\t\u0022default\u0022\n+\t\t\t}\n+\t\t}\n+\t]\n+}\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/private.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/private.h\nnew file mode 100644\nindex 0000000..5b23f24\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/private.h\n@@ -0,0 +1,38 @@\n+/*\n+ * lws-minimal-secure-streams-custom-proxy-transport\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ * Kutoga \u003ckutoga@user.github.invalid\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#define LWS_SS_USE_SSPC\n+#include \u003clibwebsockets.h\u003e\n+\n+#define MAX_CUSTOM_POLLFDS 10\n+\n+typedef struct custom_poll_ctx {\n+\tstruct pollfd\t\tpollfds[MAX_CUSTOM_POLLFDS];\n+\tvoid\t\t\t*priv[MAX_CUSTOM_POLLFDS];\n+\tint\t\t\tcount_pollfds;\n+\tstruct lws_dll2_owner\tscheduler;\n+\tlws_transport_mux_t\t*tm;\n+} custom_poll_ctx_t;\n+\n+extern custom_poll_ctx_t a_cpcx;\n+extern int interrupted, transport_fd, log_level;\n+\n+extern const lws_transport_client_ops_t lws_sss_ops_client_serial;\n+extern const lws_ss_info_t ssi_binance;\n+extern int open_transport_file(custom_poll_ctx_t *cpcx, const char *filepath, void *priv);\n+\n+extern int custom_poll_add_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd,\n+\t\t\t\tint events, void *priv);\n+extern int custom_poll_del_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd);\n+\n+extern int custom_poll_change_fd(custom_poll_ctx_t *cpcx, lws_sockfd_type fd,\n+\t\t\t\t int events_add, int events_remove);\n+extern int custom_poll_run(custom_poll_ctx_t *cpcx);\n+extern int custom_transport_event(struct pollfd *pfd, void *priv);\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/system.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/system.c\nnew file mode 100644\nindex 0000000..6b60f78\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/system.c\n@@ -0,0 +1,113 @@\n+/*\n+ * lws-minimal-secure-streams-custom-client-transport\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * These are apis used inside liblws-sspc that must be wired up to the client\n+ * host platform.\n+ *\n+ * lws_sul_schedule() - use system event loop to schedule event in the future\n+ * lws_sul_cancel() - rescind a scheduled event\n+ * lws_now_usecs() - unix time in microseconds\n+ * __lws_logv() - core logging function used by liblws-sspc\n+ */\n+\n+#include \u0022private.h\u0022\n+\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003cerrno.h\u003e\n+\n+int log_level \u003d LLL_USER | LLL_ERR;// | LLL_WARN | LLL_NOTICE;\n+\n+static int\n+sul_compare(const lws_dll2_t *d, const lws_dll2_t *i)\n+{\n+\tlws_usec_t a \u003d ((lws_sorted_usec_list_t *)d)-\u003eus;\n+\tlws_usec_t b \u003d ((lws_sorted_usec_list_t *)i)-\u003eus;\n+\n+\t/*\n+\t * Simply returning (a - b) in an int\n+\t * may lead to an integer overflow bug\n+\t */\n+\n+\tif (a \u003e b)\n+\t\treturn 1;\n+\tif (a \u003c b)\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n+void\n+lws_sul_schedule(struct lws_context_standalone *ctx, int tsi,\n+\t\t lws_sorted_usec_list_t *sul, sul_cb_t _cb, lws_usec_t _us)\n+{\n+\tif (_us \u003d\u003d (lws_usec_t)LWS_SET_TIMER_USEC_CANCEL) {\n+\t\tlws_sul_cancel(sul);\n+\t\treturn;\n+\t}\n+\n+\tlws_dll2_remove(\u0026sul-\u003elist);\n+\n+\tsul-\u003ecb \u003d _cb;\n+\tsul-\u003eus \u003d lws_now_usecs() + _us;\n+\n+\tlws_dll2_add_sorted(\u0026sul-\u003elist, \u0026a_cpcx.scheduler, sul_compare);\n+}\n+\n+void\n+lws_sul_cancel(lws_sorted_usec_list_t *sul)\n+{\n+\tlws_dll2_remove(\u0026sul-\u003elist);\n+\tsul-\u003eus \u003d 0;\n+}\n+\n+lws_usec_t\n+lws_now_usecs(void)\n+{\n+#if defined(LWS_HAVE_CLOCK_GETTIME)\n+\tstruct timespec ts;\n+\n+\tif (clock_gettime(CLOCK_MONOTONIC, \u0026ts))\n+\t\treturn 0;\n+\n+\treturn (((lws_usec_t)ts.tv_sec) * LWS_US_PER_SEC) +\n+\t\t\t((lws_usec_t)ts.tv_nsec / LWS_NS_PER_US);\n+#else\n+\tstruct timeval now;\n+\n+\tgettimeofday(\u0026now, NULL);\n+\treturn (((lws_usec_t)now.tv_sec) * LWS_US_PER_SEC) +\n+\t\t\t(lws_usec_t)now.tv_usec;\n+#endif\n+}\n+\n+/*\n+ * wire up lws-sspc logs to native application logs, we just wire it up to\n+ * stderr\n+ */\n+\n+void\n+__lws_logv(lws_log_cx_t *cx, lws_log_prepend_cx_t prep, void *obj,\n+\t int filter, const char *_fun, const char *format, va_list ap)\n+{\n+\tchar logbuf[200];\n+\tint n;\n+\n+\tif (!(filter \u0026 log_level))\n+\t\treturn;\n+\n+\tn \u003d vsnprintf(logbuf, sizeof(logbuf) - 2, format, ap);\n+\tif (n \u003e 0 \u0026\u0026 logbuf[n - 1] !\u003d '\u005cn') {\n+\t\tlogbuf[n++] \u003d '\u005cn';\n+\t\tlogbuf[n] \u003d '\u005c0';\n+\t}\n+\tfprintf(stderr, \u0022%llu: %s\u0022, (unsigned long long)lws_now_usecs(), logbuf);\n+}\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/transport-serial.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/transport-serial.c\nnew file mode 100644\nindex 0000000..07e39bd\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/transport-serial.c\n@@ -0,0 +1,350 @@\n+/*\n+ * lws-minimal-secure-streams-custom-client-transport\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * The serial port based custom transport\n+ */\n+\n+#include \u0022private.h\u0022\n+\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003csys/types.h\u003e\n+#include \u003csys/stat.h\u003e\n+#include \u003cfcntl.h\u003e\n+\n+#include \u003ctermios.h\u003e\n+#include \u003csys/ioctl.h\u003e\n+\n+#if defined(__linux__)\n+#include \u003casm/ioctls.h\u003e\n+#include \u003clinux/serial.h\u003e\n+#endif\n+\n+#include \u003cerrno.h\u003e\n+\n+/* debug helper */\n+\n+void\n+lwsl_hexdump_level(int hexdump_level, const void *vbuf, size_t len)\n+{\n+\tunsigned char *buf \u003d (unsigned char *)vbuf;\n+\tunsigned int n;\n+\n+\tfor (n \u003d 0; n \u003c len;) {\n+\t\tunsigned int start \u003d n, m;\n+\t\tchar line[80], *p \u003d line;\n+\n+\t\tp +\u003d snprintf(p, 10, \u0022%04X: \u0022, start);\n+\n+\t\tfor (m \u003d 0; m \u003c 16 \u0026\u0026 n \u003c len; m++)\n+\t\t\tp +\u003d snprintf(p, 5, \u0022%02X \u0022, buf[n++]);\n+\t\twhile (m++ \u003c 16)\n+\t\t\tp +\u003d snprintf(p, 5, \u0022 \u0022);\n+\n+\t\tp +\u003d snprintf(p, 6, \u0022 \u0022);\n+\n+\t\tfor (m \u003d 0; m \u003c 16 \u0026\u0026 (start + m) \u003c len; m++) {\n+\t\t\tif (buf[start + m] \u003e\u003d ' ' \u0026\u0026 buf[start + m] \u003c 127)\n+\t\t\t\t*p++ \u003d (char)buf[start + m];\n+\t\t\telse\n+\t\t\t\t*p++ \u003d '.';\n+\t\t}\n+\t\twhile (m++ \u003c 16)\n+\t\t\t*p++ \u003d ' ';\n+\n+\t\t*p++ \u003d '\u005cn';\n+\t\t*p \u003d '\u005c0';\n+\t\t_lws_log(hexdump_level, \u0022%s\u0022, line);\n+\t\t(void)line;\n+\t}\n+\n+\t_lws_log(hexdump_level, \u0022\u005cn\u0022);\n+}\n+\n+/*\n+ * Open and configure the serial transport fd\n+ */\n+\n+int\n+open_serial_port(const char *filepath)\n+{\n+#if defined(__linux__)\n+\tstruct serial_struct s_s;\n+#endif\n+\tstruct termios tio;\n+\tint fd \u003d open(filepath, O_RDWR);\n+\n+\tif (fd \u003d\u003d -1) {\n+\t\tlwsl_err(\u0022Unable to open %s\u005cn\u0022, filepath);\n+\n+\t\treturn -1;\n+\t}\n+\n+\tfcntl(fd, F_SETFL, O_NONBLOCK);\n+\ttcflush(fd, TCIOFLUSH);\n+\n+#if defined(__linux__)\n+\tif (ioctl(fd, TIOCGSERIAL, \u0026s_s) \u003d\u003d 0) {\n+\t\ts_s.closing_wait \u003d ASYNC_CLOSING_WAIT_NONE;\n+\t\tioctl(fd, TIOCSSERIAL, \u0026s_s);\n+\t}\n+#endif\n+\n+\t/* enforce suitable tty state */\n+\n+\tmemset(\u0026tio, 0, sizeof tio);\n+\tif (tcgetattr(fd, \u0026tio)) {\n+\t\tclose(fd);\n+\t\tfd \u003d -1;\n+\t\treturn -1;\n+\t}\n+\n+\tcfsetispeed(\u0026tio, B2000000);\n+\tcfsetospeed(\u0026tio, B2000000);\n+\n+\ttio.c_lflag \u0026\u003d (tcflag_t)~(ISIG | ICANON | IEXTEN | ECHO |\n+#if defined(__linux__)\n+\t\t\tXCASE |\n+#endif\n+\t\t\t ECHOE | ECHOK | ECHONL | ECHOCTL | ECHOKE);\n+\ttio.c_iflag \u0026\u003d (tcflag_t)~(INLCR | IGNBRK | IGNPAR | IGNCR | ICRNL |\n+\t\t\t IMAXBEL | IXON | IXOFF | IXANY\n+#if defined(__linux__)\n+\t\t\t | IUCLC\n+#endif\n+\t\t\t| 0xff);\n+\ttio.c_oflag \u003d 0;\n+\n+\ttio.c_cc[VMIN] \u003d 1;\n+\ttio.c_cc[VTIME] \u003d 0;\n+\ttio.c_cc[VEOF] \u003d 1;\n+#if 0\n+\ttio.c_cflag \u003d tio.c_cflag \u0026 (unsigned long) ~(\n+#if defined(__linux__)\n+\t\t\tCBAUD |\n+#endif\n+\t\t\tCSIZE | CSTOPB | PARENB | CRTSCTS);\n+#endif\n+\ttio.c_cflag \u003d B2000000 | /*0x1412 | */ CS8 | CREAD | CLOCAL;\n+\n+\ttcsetattr(fd, TCSANOW, \u0026tio);\n+\n+\treturn fd;\n+}\n+\n+int\n+open_transport_file(custom_poll_ctx_t *cpcx, const char *filepath, void *priv)\n+{\n+\tint fd \u003d open_serial_port(filepath);\n+\n+\tif (fd \u003c 0)\n+\t\treturn -1;\n+\n+\ttransport_fd \u003d fd;\n+\n+\t/* let's add it to the event loop, and set POLLIN */\n+\n+\tif (custom_poll_add_fd(cpcx, fd, POLLIN, priv)) {\n+\t\tclose(fd);\n+\t\treturn -1;\n+\t}\n+\n+\treturn fd;\n+}\n+\n+/****** custom transport to proxy\n+ *\n+ *\n+ **/\n+\n+/* incoming parsed channel cbs */\n+\n+static int\n+ltm_ch_payload(lws_transport_mux_ch_t *tmc, const uint8_t *buf, size_t len)\n+{\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\treturn 0;\n+}\n+\n+static int\n+ltm_ch_opens_serial(lws_transport_mux_ch_t *tmc, int determination)\n+{\n+\tlws_transport_mux_t *tm \u003d lws_container_of(tmc-\u003elist.owner,\n+\t\t\t\t\t\t lws_transport_mux_t, owner);\n+\tstruct lws_sspc_handle *h \u003d (struct lws_sspc_handle *)tmc-\u003epriv;\n+\n+\tassert_is_tm(tm);\n+\n+\tlwsl_sspc_err(h, \u0022%d\u0022, determination);\n+\n+ \tif (tm-\u003einfo.txp_cpath.ops_in-\u003eevent_connect_disposition(h, determination))\n+ \t\treturn -1;\n+\n+\treturn 0;\n+}\n+static int\n+ltm_ch_closes(lws_transport_mux_ch_t *tmc)\n+{\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\treturn 0;\n+}\n+\n+static void\n+ltm_txp_req_write(lws_transport_mux_t *tm)\n+{\n+\ta_cpcx.tm-\u003einfo.txp_cpath.ops_onw-\u003ereq_write(\n+\t\t\t\t\t\ta_cpcx.tm-\u003einfo.txp_cpath.priv_onw);\n+}\n+\n+static int\n+ltm_txp_can_write(lws_transport_mux_ch_t *tmc)\n+{\n+\tassert_is_tmch(tmc);\n+\treturn lws_txp_inside_sspc.event_can_write((struct lws_sspc_handle *)tmc-\u003epriv, 2048);\n+}\n+\n+static const lws_txp_mux_parse_cbs_t cbs \u003d {\n+\t.payload\t\t\u003d ltm_ch_payload,\n+\t.ch_opens\t\t\u003d ltm_ch_opens_serial,\n+\t.ch_closes\t\t\u003d ltm_ch_closes,\n+\t.txp_req_write\t\t\u003d ltm_txp_req_write,\n+\t.txp_can_write\t\t\u003d ltm_txp_can_write,\n+};\n+\n+int\n+custom_transport_event(struct pollfd *pfd, void *priv)\n+{\n+\tuint8_t buf[2048];\n+\tssize_t r \u003d sizeof(buf);\n+\n+\tlwsl_notice(\u0022%s: fd %d, revents %d\u005cn\u0022, __func__, pfd-\u003efd, pfd-\u003erevents);\n+\n+\tif (pfd-\u003erevents \u0026 POLLOUT) {\n+\t\tcustom_poll_change_fd(\u0026a_cpcx, pfd-\u003efd, 0, POLLOUT);\n+\t\t/*\n+\t\t * We can write something on the transport... if the transport\n+\t\t * mux layer has something, let that use the write preferentally\n+\t\t * and request another write for whatever this was\n+\t\t */\n+\n+\t\tlwsl_notice(\u0022%s: doing POLLOUT\u005cn\u0022, __func__);\n+\n+\t\tif (lws_transport_mux_pending(a_cpcx.tm, buf, (size_t *)\u0026r, \u0026cbs)) {\n+\n+\t\t\tlws_transport_path_client_dump(\u0026a_cpcx.tm-\u003einfo.txp_cpath, \u0022cpath\u0022);\n+\n+\t\t\ta_cpcx.tm-\u003einfo.txp_cpath.ops_onw-\u003e_write(\n+\t\t\t\ta_cpcx.tm-\u003einfo.txp_cpath.priv_onw,\n+\t\t\t\tbuf, (size_t)r);\n+\n+\t\t\treturn 0;\n+\t\t}\n+\t}\n+\n+\tif (pfd-\u003erevents \u0026 POLLIN) {\n+\n+\t\tr \u003d read(pfd-\u003efd, buf, sizeof(buf));\n+\t\tif (r \u003c 0) {\n+\t\t\tint eno \u003d errno;\n+\n+\t\t\tlwsl_warn(\u0022%s: read says %d, errno %d\u005cn\u0022, __func__,\n+\t\t\t\t\t(int)r, eno);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\t//lwsl_hexdump_notice(buf, (size_t)r);\n+\n+\t\tif (a_cpcx.tm \u0026\u0026 a_cpcx.tm-\u003einfo.txp_cpath.ops_in) {\n+\n+#if 0\n+\t\t\tlwsl_user(\u0022%s: passing read to %s, priv_in %p\u005cn\u0022,\n+\t\t\t\t\t__func__,\n+\t\t\t\t\ta_cpcx.tm-\u003einfo.txp_cpath.ops_in-\u003ename,\n+\t\t\t\t\ta_cpcx.tm-\u003einfo.txp_cpath.priv_in);\n+#endif\n+\n+\t\t\ta_cpcx.tm-\u003einfo.txp_cpath.ops_in-\u003eevent_read(\n+\t\t\t\t\ta_cpcx.tm-\u003einfo.txp_cpath.priv_in,\n+\t\t\t\t\tbuf, (size_t)r);\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * We get called while an individual SS is trying to connect to the proxy to\n+ * be recognized as operational. It's the equivalent of trying to bring up the\n+ * Unix Domain socket\n+ */\n+\n+static int\n+txp_serial_retry_connect(lws_txp_path_client_t *path,\n+\t\t\t\t struct lws_sspc_handle *h)\n+{\n+\tlwsl_user(\u0022%s\u005cn\u0022, __func__);\n+\n+\tif (path-\u003eops_onw-\u003eevent_connect_disposition(h,\n+\t\t\t\ta_cpcx.tm-\u003elink_state !\u003d LWSTM_OPERATIONAL))\n+\t return -1;\n+\n+\treturn 0;\n+}\n+\n+static void\n+txp_serial_req_write(lws_transport_priv_t priv)\n+{\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\tcustom_poll_change_fd(\u0026a_cpcx, transport_fd, POLLOUT, 0);\n+}\n+\n+static int\n+txp_serial_write(lws_transport_priv_t priv, uint8_t *buf, size_t len)\n+{\n+\tlwsl_notice(\u0022%s: writing %u\u005cn\u0022, __func__, (unsigned int)len);\n+\t// lwsl_hexdump_notice(buf, len);\n+\tif (write(transport_fd, buf, len) !\u003d (ssize_t)len) {\n+\t\tlwsl_warn(\u0022%s: write %u failed\u005cn\u0022, __func__, (unsigned int)len);\n+\n+\t\treturn 1;\n+\t}\n+\treturn 0;\n+}\n+\n+static void\n+txp_serial_close(lws_transport_priv_t priv)\n+{\n+#if 0\n+\tstruct lws *wsi \u003d (struct lws *)priv;\n+\n+\tif (!wsi)\n+\t\treturn;\n+\n+\tlws_set_opaque_user_data(wsi, NULL);\n+\tlws_wsi_close(wsi, LWS_TO_KILL_ASYNC);\n+\t*priv \u003d NULL;\n+#endif\n+}\n+\n+static void\n+txp_serial_stream_up(lws_transport_priv_t priv)\n+{\n+//\tstruct lws *wsi \u003d (struct lws *)priv;\n+\n+//\tlws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0);\n+}\n+\n+const lws_transport_client_ops_t lws_sss_ops_client_serial \u003d {\n+\t.name\t\t\t\u003d \u0022txpserial\u0022,\n+\t.event_retry_connect\t\u003d txp_serial_retry_connect,\n+\t.req_write\t\t\u003d txp_serial_req_write,\n+\t._write\t\t\t\u003d txp_serial_write,\n+\t._close\t\t\t\u003d txp_serial_close,\n+\t.event_stream_up\t\u003d txp_serial_stream_up,\n+};\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt\nnew file mode 100644\nindex 0000000..ff6cc6a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt\n@@ -0,0 +1,133 @@\n+project(lws-minimal-secure-streams-hugeurl C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-hugeurl)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams.c)\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\n+\t\t#\n+\t\t# When running in CI, wait for a lease on the resources\n+\t\t# before starting this test, so the server does not get\n+\t\t# thousands of simultaneous tls connection attempts\n+\t\t#\n+\t\t# sai-resource holds the lease on the resources until\n+\t\t# the time given in seconds or the sai-resource instance\n+\t\t# exits, whichever happens first\n+\t\t#\n+\t\t# If running under Sai, creates a lock test called \u0022res_sspcmin_hurl\u0022 \n+\t\t#\n+\t\t\n+\t\tsai_resource(warmcat_conns 1 40 sspcmin_hurl)\n+\t\t\n+\t\t#\n+\t\t# simple test not via proxy\n+\t\t#\n+\t\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME ss-warmcat-hurl COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-hugeurl\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME ss-warmcat-hurl COMMAND lws-minimal-secure-streams-hugeurl)\n+\t\tendif()\n+\n+\t\tset_tests_properties(ss-warmcat-hurl\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams\n+\t\t\t\t TIMEOUT 20)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(ss-warmcat-hurl PROPERTIES FIXTURES_REQUIRED \u0022res_sspcmin_hurl\u0022)\t\t \n+\t\tendif()\n+\n+\t\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-ssp-hurl-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-ssp-hurl-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_ssproxy-hurl COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tssproxy-hurl $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_ssproxy-hurl PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssproxy-hurl TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_ssproxy-hurl COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tssproxy-hurl $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_ssproxy-hurl PROPERTIES FIXTURES_CLEANUP ssproxy-hurl)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\t\tadd_test(NAME sspc-minimal-hurl COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-client\u003e -i +${CTEST_SOCKET_PATH})\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME sspc-minimal-hurl COMMAND lws-minimal-secure-streams-client -i +${CTEST_SOCKET_PATH})\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset(fixlist \u0022ssproxy-hurl\u0022)\n+\t\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\t\tlist(APPEND fixlist \u0022res_ssproxy-hurl\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset_tests_properties(sspc-minimal-hurl PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams\n+\t\t\t\tFIXTURES_REQUIRED \u0022${fixlist}\u0022\n+\t\t\t\tTIMEOUT 40)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client minimal-secure-streams.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/README.md\nnew file mode 100644\nindex 0000000..41c99b2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/README.md\n@@ -0,0 +1,72 @@\n+# lws minimal secure streams hugeurl\n+\n+This application sends a huge url to httpbin.org, by default 4000 bytes in\n+a urlarg ?x\u003dxxxxxx..., where the argument is a random string in hex.\n+\n+Notice that httpbin.org has its own limit for urlsize, of 4094 bytes for\n+the entire URL.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-h \u003chugeurl size\u003e|Default 4000\n+--h1|Force http/1.1 instead of default h2\n+\n+```\n+[2021/03/02 16:38:00:2662] U: LWS secure streams hugeurl test client [-d\u003cverb\u003e][-h \u003curlarg len\u003e]\n+[2021/03/02 16:38:00:2662] U: main: huge argument size: 4000 bytes\n+[2021/03/02 16:38:00:2662] N: LWS: 4.1.99-v4.1.0-294-g85c1fe07a7, loglevel 1031\n+[2021/03/02 16:38:00:2662] N: NET CLI SRV H1 H2 WS SS-JSON-POL SSPROX IPV6-on\n+[2021/03/02 16:38:00:2663] N: ++ [1903157|wsi|0|pipe] (1)\n+[2021/03/02 16:38:00:2663] N: ++ [1903157|vh|0|netlink] (1)\n+[2021/03/02 16:38:00:2677] N: ++ [1903157|vh|1|_ss_default||-1] (2)\n+[2021/03/02 16:38:00:2736] N: ++ [1903157|vh|2|arca1||-1] (3)\n+[2021/03/02 16:38:00:2798] N: ++ [1903157|wsiSScli|0|captive_portal_detect] (1)\n+[2021/03/02 16:38:00:2798] N: lws_ss_check_next_state: [1903157|wsiSScli|0|captive_portal_detect]: (unset) -\u003e LWSSSCS_CREATING\n+[2021/03/02 16:38:00:2798] N: lws_ss_check_next_state: [1903157|wsiSScli|0|captive_portal_detect]: LWSSSCS_CREATING -\u003e LWSSSCS_POLL\n+[2021/03/02 16:38:00:2800] N: lws_ss_check_next_state: [1903157|wsiSScli|0|captive_portal_detect]: LWSSSCS_POLL -\u003e LWSSSCS_CONNECTING\n+[2021/03/02 16:38:00:2801] N: ++ [1903157|wsicli|0|GET/h1/connectivitycheck.android.com/([1903157|wsiSScli|0|captive_portal_det] (1)\n+[2021/03/02 16:38:00:3227] W: lws_metrics_hist_bump_priv_tagged: 'ss\u003d\u0022captive_portal_detect\u0022,http_resp\u003d\u0022204\u0022'\n+[2021/03/02 16:38:00:3227] N: lws_ss_check_next_state: [1903157|wsiSScli|0|captive_portal_detect|204]: LWSSSCS_CONNECTING -\u003e LWSSSCS_CONNECTED\n+[2021/03/02 16:38:00:3227] N: lws_ss_check_next_state: [1903157|wsiSScli|0|captive_portal_detect|204]: LWSSSCS_CONNECTED -\u003e LWSSSCS_QOS_ACK_REMOTE\n+[2021/03/02 16:38:00:3227] N: lws_system_cpd_set: setting CPD result OK\n+[2021/03/02 16:38:00:3227] N: lws_ss_check_next_state: [1903157|wsiSScli|0|captive_portal_detect|204]: LWSSSCS_QOS_ACK_REMOTE -\u003e LWSSSCS_DISCONNECTED\n+[2021/03/02 16:38:00:3228] N: lws_ss_check_next_state: [1903157|wsiSScli|0|captive_portal_detect|204]: LWSSSCS_DISCONNECTED -\u003e LWSSSCS_DESTROYING\n+[2021/03/02 16:38:00:3228] N: -- [1903157|wsiSScli|0|captive_portal_detect|204] (0) 42.928ms\n+[2021/03/02 16:38:00:3231] N: -- [1903157|wsicli|0|GET/h1/connectivitycheck.android.com/([1903157|wsiSScli|0|captive_portal_det] (0) 42.994ms\n+[2021/03/02 16:38:00:3853] N: ++ [1903157|wsiSScli|1|httpbin_anything] (1)\n+[2021/03/02 16:38:00:3854] N: lws_ss_check_next_state: [1903157|wsiSScli|1|httpbin_anything]: (unset) -\u003e LWSSSCS_CREATING\n+[2021/03/02 16:38:00:3854] U: myss_state: LWSSSCS_CREATING (1), ord 0x0\n+[2021/03/02 16:38:00:3855] N: lws_ss_check_next_state: [1903157|wsiSScli|1|httpbin_anything]: LWSSSCS_CREATING -\u003e LWSSSCS_CONNECTING\n+[2021/03/02 16:38:00:3855] U: myss_state: LWSSSCS_CONNECTING (6), ord 0x0\n+[2021/03/02 16:38:00:3855] N: ++ [1903157|wsicli|1|GET/h1/httpbin.org/([1903157|wsiSScli|1|httpbin_anything])] (1)\n+[2021/03/02 16:38:00:6855] N: ++ [1903157|mux|0|h2_sid1_(1903157|wsicli|1)] (1)\n+[2021/03/02 16:38:00:6857] N: secstream_h1: [1903157|wsiSScli|1|httpbin_anything] no handle / tx\n+[2021/03/02 16:38:00:7904] W: lws_metrics_hist_bump_priv_tagged: 'ss\u003d\u0022httpbin_anything\u0022,http_resp\u003d\u0022200\u0022'\n+[2021/03/02 16:38:00:7904] N: lws_ss_check_next_state: [1903157|wsiSScli|1|httpbin_anything|200]: LWSSSCS_CONNECTING -\u003e LWSSSCS_CONNECTED\n+[2021/03/02 16:38:00:7904] U: myss_state: LWSSSCS_CONNECTED (5), ord 0x0\n+[2021/03/02 16:38:00:7907] U: myss_rx: return hugeurl len 4000 matches OK\n+[2021/03/02 16:38:00:7907] N: lws_ss_check_next_state: [1903157|wsiSScli|1|httpbin_anything|200]: LWSSSCS_CONNECTED -\u003e LWSSSCS_QOS_ACK_REMOTE\n+[2021/03/02 16:38:00:7907] U: myss_state: LWSSSCS_QOS_ACK_REMOTE (10), ord 0x0\n+[2021/03/02 16:38:00:7908] N: myss_state: LWSSSCS_QOS_ACK_REMOTE\n+[2021/03/02 16:38:00:7908] N: -- [1903157|wsi|0|pipe] (0) 524.500ms\n+[2021/03/02 16:38:00:7908] N: -- [1903157|mux|0|h2_sid1_(1903157|wsicli|1)] (0) 105.284ms\n+[2021/03/02 16:38:00:7912] N: -- [1903157|vh|2|arca1||-1] (2) 517.621ms\n+[2021/03/02 16:38:00:7912] N: -- [1903157|wsicli|1|GET/h1/httpbin.org/([1903157|wsiSScli|1|httpbin_anything|arca1|h2|h2])] (0) 405.690ms\n+[2021/03/02 16:38:00:7912] N: -- [1903157|vh|0|netlink] (1) 524.918ms\n+[2021/03/02 16:38:00:7913] N: lws_ss_check_next_state: [1903157|wsiSScli|1|httpbin_anything|200]: LWSSSCS_QOS_ACK_REMOTE -\u003e LWSSSCS_DISCONNECTED\n+[2021/03/02 16:38:00:7913] U: myss_state: LWSSSCS_DISCONNECTED (2), ord 0x0\n+[2021/03/02 16:38:00:7913] N: lws_ss_check_next_state: [1903157|wsiSScli|1|httpbin_anything|200]: LWSSSCS_DISCONNECTED -\u003e LWSSSCS_DESTROYING\n+[2021/03/02 16:38:00:7913] U: myss_state: LWSSSCS_DESTROYING (7), ord 0x0\n+[2021/03/02 16:38:00:7913] N: -- [1903157|wsiSScli|1|httpbin_anything|200] (0) 405.986ms\n+[2021/03/02 16:38:00:7925] N: -- [1903157|vh|1|_ss_default||-1] (0) 524.844ms\n+[2021/03/02 16:38:00:7926] U: Completed: OK\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..67e4f91\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/minimal-secure-streams.c\n@@ -0,0 +1,445 @@\n+/*\n+ * lws-minimal-secure-streams-hugeurl\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This checks huge url operations via httpbin.org\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static unsigned int timeout_ms \u003d 3000;\n+static int interrupted, bad \u003d 1, h1;\n+static lws_state_notify_link_t nl;\n+static size_t hugeurl_size \u003d 4000;\n+static char *hugeurl, *check;\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+\t\t\u0022{\u005c\u0022amazon_root_ca_1\u005c\u0022: \u005c\u0022\u0022\n+\t\t \u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0\u0022\n+\t\t \u0022BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQ\u0022\n+\t\t \u0022QDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExN\u0022\n+\t\t \u0022zAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcG\u0022\n+\t\t \u0022A1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggE\u0022\n+\t\t \u0022PADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrA\u0022\n+\t\t \u0022IthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdY\u0022\n+\t\t \u0022Z6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH\u0022\n+\t\t \u00223KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0\u0022\n+\t\t \u0022tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyz\u0022\n+\t\t \u0022iKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIq\u0022\n+\t\t \u0022g0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw\u0022\n+\t\t \u0022HQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwU\u0022\n+\t\t \u0022AA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9r\u0022\n+\t\t \u0022bxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/m\u0022\n+\t\t \u0022sv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96L\u0022\n+\t\t \u0022XFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bld\u0022\n+\t\t \u0022ZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8o\u0022\n+\t\t \u0022b2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022arca1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022amazon_root_ca_1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [{\u0022\n+\n+\t\t\u0022\u005c\u0022httpbin_anything_h1\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022anything?x\u003d${hugearg}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022nghttp2_quirk_end_stream\u005c\u0022:\u0022 \u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [{\u0022\n+\t\t\t\t\u0022\u005c\u0022hugearg\u005c\u0022:\u0022\t\t\u0022\u005c\u0022\u005c\u0022\u0022\n+\t\t\t\u0022}],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t\t\u0022\u005c\u0022httpbin_anything_h2\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022anything?x\u003d${hugearg}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022nghttp2_quirk_end_stream\u005c\u0022:\u0022 \u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [{\u0022\n+\t\t\t\t\u0022\u005c\u0022hugearg\u005c\u0022:\u0022\t\t\u0022\u005c\u0022\u005c\u0022\u0022\n+\t\t\t\u0022}],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\t\u0022\u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t\t/*\n+\t\t\t * \u0022captive_portal_detect\u0022 describes\n+\t\t\t * what to do in order to check if the path to\n+\t\t\t * the Internet is being interrupted by a\n+\t\t\t * captive portal. If there's a larger policy\n+\t\t\t * fetched from elsewhere, it should also include\n+\t\t\t * this since it needs to be done at least after\n+\t\t\t * every DHCP acquisition\n+\t\t\t */\n+\t\t \u0022\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+ \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+ \u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+ \u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+ \u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+ \u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+ \u0022}}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tstruct lejp_ctx\t\t\tctx;\n+\tsize_t\t\t\t\tcomp;\n+\n+\tchar\t\t\t\tstarted;\n+} myss_t;\n+\n+\n+static const char * const lejp_tokens[] \u003d {\n+\t\u0022url\u0022\n+};\n+\n+/*\n+ * Parse the \u0022url\u0022 member of the JSON, and collect the part after the first '\u003d'\n+ * into the prepared buffer \u0022check\u0022.\n+ */\n+\n+static signed char\n+lws_httpbin_json_cb(struct lejp_ctx *ctx, char reason)\n+{\n+\tmyss_t *m \u003d (myss_t *)ctx-\u003euser;\n+\tconst char *p \u003d ctx-\u003ebuf;\n+\tsize_t l \u003d ctx-\u003enpos;\n+\n+\tif (!(reason \u0026 LEJP_FLAG_CB_IS_VALUE))\n+\t\treturn 0;\n+\n+\tif (ctx-\u003epath_match - 1)\n+\t\treturn 0;\n+\n+\tif (!m-\u003estarted)\n+\t\twhile (l--)\n+\t\t\tif (*p++ \u003d\u003d '\u003d') {\n+\t\t\t\tm-\u003estarted \u003d 1;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\tif (!m-\u003estarted)\n+\t\treturn 0;\n+\n+\tif (m-\u003ecomp + l \u003e hugeurl_size) {\n+\t\tlwsl_err(\u0022%s: returned url string too large %u, %u\u005cn\u0022,\n+\t\t\t __func__, (unsigned int)m-\u003ecomp, (unsigned int)l);\n+\n+\t\treturn -1;\n+\t}\n+\n+\tmemcpy(check + m-\u003ecomp, p, l);\n+\tm-\u003ecomp +\u003d l;\n+\n+\treturn 0;\n+}\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tif (flags \u0026 LWSSS_FLAG_SOM)\n+\t\tlejp_construct(\u0026m-\u003ectx, lws_httpbin_json_cb, m,\n+\t\t\t\tlejp_tokens, LWS_ARRAY_SIZE(lejp_tokens));\n+\n+\tif (len) {\n+\t\tint pr \u003d lejp_parse(\u0026m-\u003ectx, buf, (int)len);\n+\n+\t\tif (pr !\u003d LEJP_CONTINUE \u0026\u0026 pr \u003c 0) {\n+\t\t\tlwsl_err(\u0022%s: parse failed line %u: %d: %s\u005cn\u0022, __func__,\n+\t\t\t\t (unsigned int)m-\u003ectx.line, pr,\n+\t\t\t\t lejp_error_to_string(pr));\n+\n+\t\t\treturn LWSSSSRET_DESTROY_ME;\n+\t\t}\n+\t}\n+\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\n+\t\tinterrupted \u003d 1;\n+\n+\t\t/* confirm that what we collected is the expected size */\n+\n+\t\tif (m-\u003ecomp !\u003d hugeurl_size) {\n+\t\t\tlwsl_err(\u0022%s: wrong urlarg size recovered %d %d\u005cn\u0022,\n+\t\t\t\t __func__, (int)m-\u003ecomp, (int)hugeurl_size);\n+\t\t\treturn LWSSSSRET_OK;\n+\t\t}\n+\n+\t\t/* confirm what we sent is the same as what we collected */\n+\n+\t\tif (memcmp(hugeurl, check, hugeurl_size)) {\n+\t\t\tlwsl_err(\u0022%s: huge url content mismatch\u005cn\u0022, __func__);\n+\n+\t\t\treturn LWSSSSRET_OK;\n+\t\t}\n+\n+\t\tlwsl_user(\u0022%s: return hugeurl len %u matches OK\u005cn\u0022, __func__,\n+\t\t\t\t(unsigned int)hugeurl_size);\n+\n+\t\tbad \u003d 0;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %s (%d), ord 0x%x\u005cn\u0022, __func__,\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tlws_ss_start_timeout(m-\u003ess, timeout_ms);\n+\n+\t\t/* let's make the hugeurl part */\n+\n+\t\thugeurl \u003d malloc(hugeurl_size + 1);\n+\t\tif (!hugeurl) {\n+\t\t\tlwsl_err(\u0022OOM\u005cn\u0022);\n+\t\t\treturn LWSSSSRET_DESTROY_ME;\n+\t\t}\n+\n+\t\tcheck \u003d malloc(hugeurl_size + 1);\n+\t\tif (!check) {\n+\t\t\tlwsl_err(\u0022OOM\u005cn\u0022);\n+\t\t\tfree(hugeurl);\n+\t\t\thugeurl \u003d NULL;\n+\t\t\treturn LWSSSSRET_DESTROY_ME;\n+\t\t}\n+\n+\t\t/* Create the big, random, urlarg */\n+\n+\t\tlws_hex_random(lws_ss_get_context(m-\u003ess), hugeurl,\n+\t\t\t hugeurl_size + 1);\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022hugearg\u0022, hugeurl, hugeurl_size))\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_QOS_ACK_REMOTE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_TIMEOUT:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_TIMEOUT\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_USER_BASE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_USER_BASE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_info_t ssi \u003d {\n+\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n+\t.rx\t\t\t\t\u003d myss_rx,\n+\t.state\t\t\t\t\u003d myss_state,\n+\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n+\t.streamtype\t\t\t\u003d \u0022httpbin_anything_h2\u0022\n+};\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tif (target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\tif (h1)\n+\t\tssi.streamtype \u003d \u0022httpbin_anything_h1\u0022;\n+\n+\tif (!lws_ss_create(context, 0, \u0026ssi, NULL, NULL, NULL, NULL))\n+\t\treturn 0;\n+\n+\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022, __func__);\n+\n+\treturn -1;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams hugeurl test client [-d\u003cverb\u003e][-h \u003curlarg len\u003e]\u005cn\u0022);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\n+\t/* connect to ssproxy via UDS by default, else via\n+\t * tcp connection to this port */\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t * path; when -p given this can specify the network interface\n+\t * to bind to */\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t/* if -p given, -a specifies the proxy address to connect to */\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\tinfo.ss_proxy_address \u003d p;\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--h1\u0022))\n+\t\th1 \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-h\u0022)))\n+\t\thugeurl_size \u003d (size_t)atol(p);\n+\n+\tif (hugeurl_size \u003c 1 || hugeurl_size \u003e 16384) {\n+\t\tlwsl_err(\u0022%s: -h should be between 1 and 16384\u005cn\u0022, __func__);\n+\t\treturn 1;\n+\t}\n+\n+\tlwsl_user(\u0022%s: huge argument size: %u bytes\u005cn\u0022, __func__,\n+\t\t\t(unsigned int)hugeurl_size);\n+\n+\tinfo.pt_serv_buf_size \u003d (unsigned int)((hugeurl_size * 2) + 2048);\n+\tinfo.max_http_header_data \u003d (unsigned short)(hugeurl_size + 2048);\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tif (hugeurl)\n+\t\tfree(hugeurl);\n+\tif (check)\n+\t\tfree(check);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/CMakeLists.txt\nnew file mode 100644\nindex 0000000..67c946a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/CMakeLists.txt\n@@ -0,0 +1,41 @@\n+project(lws-minimal-secure-streams-metadata C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-metadata)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams.c)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client minimal-secure-streams.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/README.md\nnew file mode 100644\nindex 0000000..cb9b3b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/README.md\n@@ -0,0 +1,66 @@\n+# lws minimal secure streams\n+\n+The application goes to https://warmcat.com and reads index.html there.\n+\n+It does it using Secure Streams... the main code in minimal-secure-streams.c\n+just sets up the context and opens a secure stream of type \u0022mintest\u0022.\n+\n+The handler for state changes and payloads for \u0022mintest\u0022 is in ss-myss.c\n+\n+The information about how a \u0022mintest\u0022 stream should connect and the\n+protocol it uses is kept separated in policy-database.c\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-f| Force connecting to the wrong endpoint to check backoff retry flow\n+-p| Run as proxy server for clients to connect to over unix domain socket\n+--force-portal|Force the SS Captive Portal Detection to feel it's behind a portal\n+--force-no-internet|Force the SS Captive Portal Detection to feel it can't reach the internet\n+\n+```\n+[2019/08/12 07:16:11:0045] USR: LWS minimal secure streams [-d\u003cverbosity\u003e] [-f]\n+[2019/08/12 07:16:12:6102] USR: myss_state: LWSSSCS_CREATING, ord 0x0\n+[2019/08/12 07:16:12:6107] USR: myss_state: LWSSSCS_POLL, ord 0x0\n+[2019/08/12 07:16:12:6117] N: lws_ss_client_connect: connecting h1get warmcat.com /\n+[2019/08/12 07:16:12:6118] USR: myss_state: LWSSSCS_CONNECTING, ord 0x0\n+[2019/08/12 07:16:13:4171] USR: myss_state: LWSSSCS_CONNECTED, ord 0x0\n+[2019/08/12 07:16:13:4222] USR: myss_rx: len 1024, flags: 1\n+[2019/08/12 07:16:13:4243] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4244] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4244] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4245] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4246] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4247] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4252] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4264] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4265] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4266] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4267] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4268] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4268] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4269] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4270] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4278] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4279] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4280] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4281] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4282] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4283] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4283] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4284] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4287] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4288] USR: myss_rx: len 947, flags: 0\n+[2019/08/12 07:16:13:4293] USR: myss_rx: len 0, flags: 2\n+[2019/08/12 07:16:13:4399] USR: myss_state: LWSSSCS_DISCONNECTED, ord 0x0\n+[2019/08/12 07:16:13:4761] USR: myss_state: LWSSSCS_DESTROYING, ord 0x0\n+[2019/08/12 07:16:13:4781] USR: Completed: OK\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..46fbd90\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/minimal-secure-streams.c\n@@ -0,0 +1,343 @@\n+/*\n+ * lws-minimal-secure-streams-metadata\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams api.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there.\n+ *\n+ * This example is built two different ways from the same source... one includes\n+ * the policy everything needed to fulfil the stream directly. The other -client\n+ * variant has no policy itself and some other minor init changes, and connects\n+ * to the -proxy example to actually get the connection done.\n+ *\n+ * In the -client build case, the example does not even init the tls libraries\n+ * since the proxy part will take care of all that.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/*\n+ * uncomment to force network traffic through 127.0.0.1:1080\n+ *\n+ * On your local machine, you can run a SOCKS5 proxy like this\n+ *\n+ * $ ssh -N -D 0.0.0.0:1080 localhost -v\n+ *\n+ * If enabled, this also fetches a remote policy that also\n+ * specifies that all traffic should go through the remote\n+ * proxy.\n+ */\n+// #define VIA_LOCALHOST_SOCKS\n+\n+static int interrupted, bad \u003d 1, force_cpd_fail_portal,\n+\t force_cpd_fail_no_internet;\n+static lws_state_notify_link_t nl;\n+static const char *server_name_or_url \u003d \u0022warmcat.com\u0022;\n+\n+/*\n+ * If the -proxy app is fulfilling our connection, then we don't need to have\n+ * the policy in the client.\n+ *\n+ * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over\n+ * a Unix Domain Socket. To test that, you need to separately run the\n+ * ./lws-minimal-secure-streams-proxy test app on the same machine.\n+ */\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+\t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t \u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t\t\u0022{\u005c\u0022mintest\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022${servername}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [\u0022\n+\t\t\t\t\u0022{\u005c\u0022servername\u005c\u0022: \u005c\u0022\u005c\u0022}\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+} myss_t;\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+//\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t//myss_t *m \u003d (myss_t *)userobj;\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name((int)state),\n+\t\t (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tlwsl_notice(\u0022%s: CREATING: setting servername metadata to %s\u005cn\u0022,\n+\t\t\t\t__func__, server_name_or_url);\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022servername\u0022, server_name_or_url,\n+\t\t\t\t\tstrlen(server_name_or_url)))\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_QOS_ACK_REMOTE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\t\t\tlws_ss_info_t ssi;\n+\n+\t\t\t/* We're making an outgoing secure stream ourselves */\n+\n+\t\t\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\t\t\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\t\t\tssi.opaque_user_data_offset \u003d offsetof(myss_t,\n+\t\t\t\t\t\t\t opaque_data);\n+\t\t\tssi.rx \u003d myss_rx;\n+\t\t\tssi.tx \u003d myss_tx;\n+\t\t\tssi.state \u003d myss_state;\n+\t\t\tssi.user_alloc \u003d sizeof(myss_t);\n+\t\t\tssi.streamtype \u003d \u0022mintest\u0022;\n+\n+\t\t\tif (lws_ss_create(context, 0, \u0026ssi, NULL, NULL,\n+\t\t\t\t\t NULL, NULL)) {\n+\t\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\t/* these options are mutually exclusive if given */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-portal\u0022))\n+\t\tforce_cpd_fail_portal \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-no-internet\u0022))\n+\t\tforce_cpd_fail_no_internet \u003d 1;\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\n+\t/* connect to ssproxy via UDS by default, else via\n+\t * tcp connection to this port */\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t * path; when -p given this can specify the network interface\n+\t * to bind to */\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t/* if -p given, -a specifies the proxy address to connect to */\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\tinfo.ss_proxy_address \u003d p;\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-u\u0022)))\n+\t\tserver_name_or_url \u003d p;\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metrics-proxy/metrics-proxy-policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metrics-proxy/metrics-proxy-policy.json\nnew file mode 100644\nindex 0000000..d742014\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metrics-proxy/metrics-proxy-policy.json\n@@ -0,0 +1,60 @@\n+{\n+\t\u0022release\u0022:\u002201234567\u0022,\n+\t\u0022product\u0022:\u0022myproduct\u0022,\n+\t\u0022schema-version\u0022:1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022: [1000,2000,3000,5000,10000],\n+\t\t\t\u0022conceal\u0022:5,\n+\t\t\t\u0022jitterpc\u0022:20,\n+\t\t\t\u0022svalidping\u0022:300,\n+\t\t\t\u0022svalidhup\u0022:310\n+\t\t}}],\n+\t\u0022certs\u0022: [{\n+\t\t\u0022isrg_root_x1\u0022: \u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZLubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022},\n+\t\t{\u0022self_localhost\u0022: \u0022MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuWaICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXarjr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrowYNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuAxbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9PwtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjvxQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKkujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYAAOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6GgmnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIXe2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\u0022},{\u0022self_localhost_key\u0022: \u0022MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8fqokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5AKqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMTG+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXglxBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvsesnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqwzFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVzmgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCwau9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN7740QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFHPgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXjW7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuRnaVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr62ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDCR1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMpY+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaChBVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCEfXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQx1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHIUlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RMOMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/AaJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6Sme/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+IG4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iKTncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMrZiw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3ENqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrsfBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\u0022\n+\t}],\n+\t\u0022trust_stores\u0022: [\n+\t\t{\u0022name\u0022: \u0022le_via_isrg\u0022,\n+\t\t \u0022stack\u0022: [\u0022isrg_root_x1\u0022]\n+\t\t}\n+\t], \u0022s\u0022: [\n+\t\t{\n+\t\t\t\u0022mintest\u0022: {\n+\t\t\t\t\u0022endpoint\u0022:\u0022warmcat.com\u0022,\n+\t\t\t\t\u0022port\u0022:443,\n+\t\t\t\t\u0022protocol\u0022:\u0022h2\u0022,\n+\t\t\t\t\u0022http_method\u0022:\u0022GET\u0022,\n+\t\t\t\t\u0022http_url\u0022:\u0022index.html\u0022,\n+\t\t\t\t\u0022tls\u0022:true,\n+\t\t\t\t\u0022retry\u0022:\u0022default\u0022,\n+\t\t\t\t\u0022tls_trust_store\u0022:\u0022le_via_isrg\u0022\n+\t\t}},{\n+\t\t\t\u0022forscraper\u0022: {\n+\t\t\t\t\u0022server\u0022:true,\n+\t\t\t\t\u0022port\u0022:19090,\n+\t\t\t\t\u0022protocol\u0022:\u0022h1\u0022,\n+\t\t\t\t\u0022metadata\u0022: [{\n+\t\t\t\t\t\u0022mime\u0022: \u0022Content-Type:\u0022,\n+\t\t\t\t\t\u0022method\u0022: \u0022\u0022,\n+\t\t\t\t\t\u0022path\u0022: \u0022\u0022\n+\t\t\t\t}\n+\t\t\t]\n+\t\t}},{\n+\t\t\t\u0022forclients\u0022: {\n+\t\t\t\t\u0022server\u0022:true,\n+\t\t\t\t\u0022port\u0022:19091,\n+\t\t\t\t\u0022protocol\u0022:\u0022h1\u0022,\n+\t\t\t\t\u0022metadata\u0022: [{\n+\t\t\t\t\t\u0022mime\u0022: \u0022Content-Type:\u0022,\n+\t\t\t\t\t\u0022method\u0022: \u0022\u0022,\n+\t\t\t\t\t\u0022path\u0022: \u0022\u0022\n+\t\t\t\t}],\n+\t\t\t\t\u0022tls\u0022:true,\n+\t\t\t\t\u0022ws_subprotocol\u0022:\u0022lws-metrics-proxy\u0022,\n+\t\t\t\t\u0022server_cert\u0022:\u0022self_localhost\u0022,\n+\t\t\t\t\u0022server_key\u0022:\u0022self_localhost_key\u0022\n+\t\t}}\n+\t]\n+}\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/CMakeLists.txt\nnew file mode 100644\nindex 0000000..3cb8cb0\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/CMakeLists.txt\n@@ -0,0 +1,133 @@\n+project(lws-minimal-secure-streams-perf C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-perf)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams.c)\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\n+\t\t#\n+\t\t# When running in CI, wait for a lease on the resources\n+\t\t# before starting this test, so the server does not get\n+\t\t# thousands of simultaneous tls connection attempts\n+\t\t#\n+\t\t# sai-resource holds the lease on the resources until\n+\t\t# the time given in seconds or the sai-resource instance\n+\t\t# exits, whichever happens first\n+\t\t#\n+\t\t# If running under Sai, creates a lock test called \u0022res_sspcmin\u0022 \n+\t\t#\n+\t\t\n+\t\tsai_resource(warmcat_conns 1 40 ssperfpcmin)\n+\t\t\n+\t\t#\n+\t\t# simple test not via proxy\n+\t\t#\n+\t\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME ssperf-warmcat COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-perf\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME ssperf-warmcat COMMAND lws-minimal-secure-streams-perf)\n+\t\tendif()\n+\n+\t\tset_tests_properties(ssperf-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams\n+\t\t\t\t TIMEOUT 40)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(ssperf-warmcat PROPERTIES FIXTURES_REQUIRED \u0022res_ssperfpcmin\u0022)\n+\t\tendif()\n+\n+\t\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-ssperfp-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-ssperfp-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_ssperfproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tssperfproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_ssperfproxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssperfproxy TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_ssperfproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tssperfproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_ssperfproxy PROPERTIES FIXTURES_CLEANUP ssperfproxy)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\t\tadd_test(NAME ssperfpc-minimal COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-perf-client\u003e -i +${CTEST_SOCKET_PATH})\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME ssperfpc-minimal COMMAND lws-minimal-secure-streams-perf-client -i +${CTEST_SOCKET_PATH})\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset(fixlist \u0022ssperfproxy\u0022)\n+\t\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\t\tlist(APPEND fixlist \u0022res_ssperfproxy\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset_tests_properties(ssperfpc-minimal PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf\n+\t\t\t\tFIXTURES_REQUIRED \u0022${fixlist}\u0022\n+\t\t\t\tTIMEOUT 40)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client minimal-secure-streams.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/README.md\nnew file mode 100644\nindex 0000000..bddaacd\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/README.md\n@@ -0,0 +1,104 @@\n+# lws minimal secure streams perf\n+\n+The application goes to https://warmcat.com and reads index.html there.\n+\n+The streamtype used is marked with a \u0022perf\u0022: true policy, it returns additional\n+rx payload marked with the `LWSSS_FLAG_PERF_JSON` flag containing a JSON rundown\n+of the connection performance.\n+\n+This builds both lws-minimal-secure-streams-perf that connects directly, and\n+lws-minimal-secure-streams-perf-client that connects via the proxy, giving the\n+same results.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+[2021/03/31 15:29:46:5162] U: LWS secure streams test client [-d\u003cverb\u003e]\n+[2021/03/31 15:29:46:5625] N: LWS: 4.1.99-v4.2-rc1-50-g8b5acf835c, loglevel 1031\n+[2021/03/31 15:29:46:5629] N: NET CLI SRV H1 H2 WS SS-JSON-POL SSPROX ConMon IPV6-on\n+[2021/03/31 15:29:46:5829] N: ++ [795209|wsi|0|pipe] (1)\n+[2021/03/31 15:29:46:5892] N: ++ [795209|vh|0|netlink] (1)\n+[2021/03/31 15:29:46:5983] N: ++ [795209|vh|1|default||-1] (2)\n+[2021/03/31 15:29:46:7638] N: ++ [795209|SSPcli|0|mintest] (1)\n+[2021/03/31 15:29:46:7957] N: ++ [795209|wsiSSPcli|0|RAW/raw-skt/+@proxy.ss.lws/([795209|SSPcli|0|mintest])] (1)\n+[2021/03/31 15:29:46:8335] N: -- [795209|wsiSSPcli|0|RAW/raw-skt/+@proxy.ss.lws/([795209|SSPcli|0|mintest])] (0) 35.608ms\n+[2021/03/31 15:29:47:9096] N: ++ [795209|wsiSSPcli|1|RAW/raw-skt/+@proxy.ss.lws/([795209|SSPcli|0|mintest])] (1)\n+[2021/03/31 15:29:47:9103] N: -- [795209|wsiSSPcli|1|RAW/raw-skt/+@proxy.ss.lws/([795209|SSPcli|0|mintest])] (0) 215μs\n+[2021/03/31 15:29:48:9117] N: ++ [795209|wsiSSPcli|2|RAW/raw-skt/+@proxy.ss.lws/([795209|SSPcli|0|mintest])] (1)\n+[2021/03/31 15:29:48:9339] N: lws_sspc_sul_retry_cb: [795209|wsiSSPcli|2|RAW/raw-skt/+@proxy.ss.lws/([795209|SSPcli|0|mintest])]\n+[2021/03/31 15:29:48:9625] N: lws_ss_check_next_state: [795209|SSPcli|0|mintest]: (unset) -\u003e LWSSSCS_CREATING\n+[2021/03/31 15:29:48:9633] U: myss_state: LWSSSCS_CREATING (1), ord 0x0\n+[2021/03/31 15:29:48:9728] N: lws_ss_check_next_state: [795209|SSPcli|0|mintest]: LWSSSCS_CREATING -\u003e LWSSSCS_CONNECTING\n+[2021/03/31 15:29:48:9731] U: myss_state: LWSSSCS_CONNECTING (6), ord 0x0\n+[2021/03/31 15:29:49:0670] N: lws_ss_deserialize_parse: RX METADATA test\n+[2021/03/31 15:29:49:0696] N: lws_ss_check_next_state: [795209|SSPcli|0|mintest]: LWSSSCS_CONNECTING -\u003e LWSSSCS_CONNECTED\n+[2021/03/31 15:29:49:0698] U: myss_state: LWSSSCS_CONNECTED (5), ord 0x0\n+[2021/03/31 15:29:49:0716] N: lws_ss_deserialize_parse: RX METADATA srv\n+[2021/03/31 15:29:49:0882] U: myss_rx: len 1380, flags: 1, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0907] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0926] U: {\u0022peer\u0022:\u002246.105.127.147\u0022,\u0022dns_us\u0022:536,\u0022sockconn_us\u0022:30183,\u0022tls_us\u0022:29343,\u0022txn_resp_us\u0022:25990,\u0022dns\u0022:[\u00222001:41d0:2:ee93::1\u0022,\u002246.105.127.147\u0022]}\n+[2021/03/31 15:29:49:0937] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0938] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0940] U: myss_rx: len 829, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0942] U: myss_rx: len 691, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0943] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0944] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0945] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0947] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0948] U: myss_rx: len 292, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0950] U: myss_rx: len 291, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0951] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0952] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0953] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0955] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0956] U: myss_rx: len 692, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0957] U: myss_rx: len 828, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0958] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0960] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0961] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0962] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0963] U: myss_rx: len 155, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0965] U: myss_rx: len 428, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0966] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0967] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0968] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0969] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0970] U: myss_rx: len 555, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0972] U: myss_rx: len 965, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0973] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0975] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0976] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0977] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0978] U: myss_rx: len 18, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0979] U: myss_rx: len 565, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0980] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0981] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0982] U: myss_rx: len 1380, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0983] U: myss_rx: len 140, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0984] U: myss_rx: len 418, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0985] U: myss_rx: len 44, flags: 0, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0989] U: myss_rx: len 0, flags: 2, srv: lwsws, test: hello\n+[2021/03/31 15:29:49:0994] N: lws_ss_check_next_state: [795209|SSPcli|0|mintest]: LWSSSCS_CONNECTED -\u003e LWSSSCS_QOS_ACK_REMOTE\n+[2021/03/31 15:29:49:0995] U: myss_state: LWSSSCS_QOS_ACK_REMOTE (10), ord 0x0\n+[2021/03/31 15:29:49:0998] N: myss_state: LWSSSCS_QOS_ACK_REMOTE\n+[2021/03/31 15:29:49:1008] N: lws_ss_check_next_state: [795209|SSPcli|0|mintest]: LWSSSCS_QOS_ACK_REMOTE -\u003e LWSSSCS_DISCONNECTED\n+[2021/03/31 15:29:49:1010] U: myss_state: LWSSSCS_DISCONNECTED (2), ord 0x0\n+[2021/03/31 15:29:49:1106] N: -- [795209|wsi|0|pipe] (0) 2.527s\n+[2021/03/31 15:29:49:1169] N: -- [795209|vh|1|default||-1] (1) 2.518s\n+[2021/03/31 15:29:49:1172] N: -- [795209|wsiSSPcli|2|RAW/raw-skt/+@proxy.ss.lws/([795209|SSPcli|0|mintest])] (0) 205.495ms\n+[2021/03/31 15:29:49:1174] N: -- [795209|vh|0|netlink] (0) 2.528s\n+[2021/03/31 15:29:49:1203] N: lws_ss_check_next_state: [795209|SSPcli|0|mintest]: LWSSSCS_DISCONNECTED -\u003e LWSSSCS_DESTROYING\n+[2021/03/31 15:29:49:1206] U: myss_state: LWSSSCS_DESTROYING (7), ord 0x0\n+[2021/03/31 15:29:49:1210] N: -- [795209|SSPcli|0|mintest] (0) 2.357s\n+[2021/03/31 15:29:49:1292] U: Completed: OK (seen expected 0)\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..f3b9b9b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/minimal-secure-streams.c\n@@ -0,0 +1,566 @@\n+/*\n+ * lws-minimal-secure-streams\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams api.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there.\n+ *\n+ * This example is built two different ways from the same source... one includes\n+ * the policy everything needed to fulfil the stream directly. The other -client\n+ * variant has no policy itself and some other minor init changes, and connects\n+ * to the -proxy example to actually get the connection done.\n+ *\n+ * In the -client build case, the example does not even init the tls libraries\n+ * since the proxy part will take care of all that.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/*\n+ * uncomment to force network traffic through 127.0.0.1:1080\n+ *\n+ * On your local machine, you can run a SOCKS5 proxy like this\n+ *\n+ * $ ssh -N -D 0.0.0.0:1080 localhost -v\n+ *\n+ * If enabled, this also fetches a remote policy that also\n+ * specifies that all traffic should go through the remote\n+ * proxy.\n+ */\n+// #define VIA_LOCALHOST_SOCKS\n+\n+static int interrupted, bad \u003d 1, force_cpd_fail_portal,\n+\t force_cpd_fail_no_internet, test_respmap;\n+static const char *streamtype \u003d \u0022mintest\u0022;\n+static unsigned int timeout_ms \u003d 3000;\n+static lws_state_notify_link_t nl;\n+\n+/*\n+ * If the -proxy app is fulfilling our connection, then we don't need to have\n+ * the policy in the client.\n+ *\n+ * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over\n+ * a Unix Domain Socket. To test that, you need to separately run the\n+ * ./lws-minimal-secure-streams-proxy test app on the same machine.\n+ */\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+\t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\t\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\t\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\t\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\t\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\t\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\t\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\t\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\t\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\t\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\t\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\t\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\t\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\t\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\t\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\t\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\t\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\t\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\t\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\t\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\t\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\t\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\t\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\t\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\t\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\t\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\t\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\t\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\t\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t \u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t \t/*\n+\t\t * \u0022fetch_policy\u0022 decides from where the real policy\n+\t\t * will be fetched, if present. Otherwise the initial\n+\t\t * policy is treated as the whole, hardcoded, policy.\n+\t\t */\n+\t\t\u0022{\u005c\u0022fetch_policy\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-socks.json\u005c\u0022,\u0022\n+#else\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-v4.2-v2.json\u005c\u0022,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t\t/*\n+\t\t\t * \u0022captive_portal_detect\u0022 describes\n+\t\t\t * what to do in order to check if the path to\n+\t\t\t * the Internet is being interrupted by a\n+\t\t\t * captive portal. If there's a larger policy\n+\t\t\t * fetched from elsewhere, it should also include\n+\t\t\t * this since it needs to be done at least after\n+\t\t\t * every DHCP acquisition\n+\t\t\t */\n+\t\t \u0022\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+ \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+ \u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+ \u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+ \u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+ \u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+ \u0022}}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+} myss_t;\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+#endif\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tconst char *md_srv \u003d \u0022not set\u0022, *md_test \u003d \u0022not set\u0022;\n+\tsize_t md_srv_len \u003d 7, md_test_len \u003d 7;\n+\n+\tif (flags \u0026 LWSSS_FLAG_PERF_JSON) {\n+\t\tlwsl_user(\u0022%.*s\u005cn\u0022, (int)len, (const char *)buf);\n+\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\tlws_ss_get_metadata(m-\u003ess, \u0022srv\u0022, (const void **)\u0026md_srv, \u0026md_srv_len);\n+\tlws_ss_get_metadata(m-\u003ess, \u0022test\u0022, (const void **)\u0026md_test, \u0026md_test_len);\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d, srv: %.*s, test: %.*s\u005cn\u0022, __func__,\n+\t\t (int)len, flags, (int)md_srv_len, md_srv,\n+\t\t (int)md_test_len, md_test);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t//myss_t *m \u003d (myss_t *)userobj;\n+\n+\t/* in this example, we don't send stuff */\n+\n+\treturn LWSSSSRET_TX_DONT_SEND;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %s (%d), ord 0x%x\u005cn\u0022, __func__,\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_CONNECTING:\n+\t\tlws_ss_start_timeout(m-\u003ess, timeout_ms);\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022uptag\u0022, \u0022myuptag123\u0022, 10))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022, \u0022myctype\u0022, 7))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 2;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_QOS_ACK_REMOTE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_TIMEOUT:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_TIMEOUT\u005cn\u0022, __func__);\n+\t\t/* if we're out of time */\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 3;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_USER_BASE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_USER_BASE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+#endif\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\t/*\n+\t * The proxy takes responsibility for this stuff if we get things\n+\t * done through that\n+\t */\n+\n+\tcase LWS_SYSTATE_INITIALIZED: /* overlay on the hardcoded policy */\n+\tcase LWS_SYSTATE_POLICY_VALID: /* overlay on the loaded policy */\n+\n+\t\tif (target !\u003d current)\n+\t\t\tbreak;\n+\n+\t\tif (force_cpd_fail_portal)\n+\n+\t\t\t/* this makes it look like we're behind a captive portal\n+\t\t\t * because the overriden address does a redirect */\n+\n+\t\t\tlws_ss_policy_overlay(context,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022: [{\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022google.com\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022port\u005c\u0022: 80\u0022\n+\t\t\t\t \u0022}}]}\u0022);\n+\n+\t\tif (force_cpd_fail_no_internet)\n+\n+\t\t\t/* this looks like no internet, because the overridden\n+\t\t\t * port doesn't have anything that will connect to us */\n+\n+\t\t\tlws_ss_policy_overlay(context,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022: [{\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t\t \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022port\u005c\u0022: 999\u0022\n+\t\t\t\t \u0022}}]}\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\n+#endif\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\t\t\tlws_ss_info_t ssi;\n+\n+\t\t\t/* We're making an outgoing secure stream ourselves */\n+\n+\t\t\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\t\t\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\t\t\tssi.opaque_user_data_offset \u003d offsetof(myss_t,\n+\t\t\t\t\t\t\t opaque_data);\n+\t\t\tssi.rx \u003d myss_rx;\n+\t\t\tssi.tx \u003d myss_tx;\n+\t\t\tssi.state \u003d myss_state;\n+\t\t\tssi.user_alloc \u003d sizeof(myss_t);\n+\t\t\tssi.streamtype \u003d test_respmap ? \u0022respmap\u0022 : streamtype;\n+\n+\t\t\tif (lws_ss_create(context, 0, \u0026ssi, NULL, NULL,\n+\t\t\t\t\t NULL, NULL)) {\n+\t\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\n+static int\n+my_metric_report(lws_metric_pub_t *mp)\n+{\n+\tlws_metric_bucket_t *sub \u003d mp-\u003eu.hist.head;\n+\tchar buf[192];\n+\n+\tdo {\n+\t\tif (lws_metrics_format(mp, \u0026sub, buf, sizeof(buf)))\n+\t\t\tlwsl_user(\u0022%s: %s\u005cn\u0022, __func__, buf);\n+\t} while ((mp-\u003eflags \u0026 LWSMTFL_REPORT_HIST) \u0026\u0026 sub);\n+\n+\t/* 0 \u003d leave metric to accumulate, 1 \u003d reset the metric */\n+\n+\treturn 1;\n+}\n+\n+static const lws_system_ops_t system_ops \u003d {\n+\t.metric_report \u003d my_metric_report,\n+};\n+\n+#endif\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0, expected \u003d 0;\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams test client PERF [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\t/* these options are mutually exclusive if given */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-portal\u0022))\n+\t\tforce_cpd_fail_portal \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-no-internet\u0022))\n+\t\tforce_cpd_fail_no_internet \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--respmap\u0022))\n+\t\ttest_respmap \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--test404\u0022))\n+\t\tstreamtype \u003d \u0022mintest404\u0022;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--test404red\u0022))\n+\t\tstreamtype \u003d \u0022mintest404red\u0022;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--test404redref\u0022))\n+\t\tstreamtype \u003d \u0022mintest404redref\u0022;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--timeout_ms\u0022)))\n+\t\ttimeout_ms \u003d (unsigned int)atoi(p);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\tinfo.system_ops \u003d \u0026system_ops;\n+\tinfo.metrics_prefix \u003d \u0022ssmex\u0022;\n+#endif\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\t/*\n+\t * If we're being a proxied client, the proxy does all this\n+\t */\n+\n+\t/*\n+\t * Set the related lws_system blobs\n+\t *\n+\t * ...direct_set() sets a pointer, so the thing pointed to has to have\n+\t * a suitable lifetime, eg, something that already exists on the heap or\n+\t * a const string in .rodata like this\n+\t */\n+\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_SERIAL, 0),\n+\t\t\t\t (const uint8_t *)\u0022SN12345678\u0022, 10);\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_FW_VERSION, 0),\n+\t\t\t\t (const uint8_t *)\u0022v0.01\u0022, 5);\n+\n+\t/*\n+\t * ..._heap_append() appends to a buflist kind of arrangement on heap,\n+\t * just one block is fine, otherwise it will concatenate the fragments\n+\t * in the order they were appended (and take care of freeing them at\n+\t * context destroy time). ..._heap_empty() is also available to remove\n+\t * everything that was already allocated.\n+\t *\n+\t * Here we use _heap_append() just so it's tested as well as direct set.\n+\t */\n+\n+\tlws_system_blob_heap_append(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_TYPE, 0),\n+\t\t\t\t (const uint8_t *)\u0022spacerocket\u0022, 11);\n+#endif\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+bail:\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n+\t\texpected \u003d atoi(p);\n+\n+\tif (bad \u003d\u003d expected) {\n+\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, expected);\n+\t\treturn 0;\n+\t} else\n+\t\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, bad, expected);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/CMakeLists.txt\nnew file mode 100644\nindex 0000000..f8272f3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/CMakeLists.txt\n@@ -0,0 +1,28 @@\n+project(lws-minimal-secure-streams-policy2c C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-policy2c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_ROLE_H2 1 requirements)\n+require_lws_config(LWS_ROLE_MQTT 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams.c)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/README.md\nnew file mode 100644\nindex 0000000..8e093ea\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/README.md\n@@ -0,0 +1,49 @@\n+# lws minimal secure streams policy2c\n+\n+This application parses a JSON policy passed on stdin and emits the\n+equivalent of it in C structs ready for compilation.\n+\n+This is useful in the case your platform doesn't use a dynamic JSON\n+policy and is space-constrained, you can still form and maintain the\n+policy in JSON, but with this utility convert it into compileable C.\n+\n+**Notice** this depends on LWS_ROLE_H1, LWS_ROLE_H2, LWS_ROLE_WS and\n+LWS_ROLE_MQTT build of lws, since it has to be able to work with any kind\n+of policy content.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+$ cat mypolicy.json | lws-minimal-secure-streams-policy2c\n+\n+(on stdout) \n+\n+static const uint32_t _rbo_bo_0[] \u003d {\n+ 1000, 2000, 3000, 5000, 10000, \n+};\n+static const lws_retry_bo_t _rbo_0 \u003d {\n+\t.retry_ms_table \u003d _rbo_bo_0,\n+\t.retry_ms_table_count \u003d 5,\n+\t.conceal_count \u003d 5,\n+\t.secs_since_valid_ping \u003d 30,\n+\t.secs_since_valid_hangup \u003d 35,\n+\t.jitter_percent \u003d 20,\n+};\n+static const uint8_t _ss_der_amazon_root_ca_1[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x03, 0x41, 0x30, 0x82, 0x02, 0x29, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x13, 0x06, \n+\t/* 0x 10 */ 0x6C, 0x9F, 0xCF, 0x99, 0xBF, 0x8C, 0x0A, 0x39, \n+\t/* 0x 18 */ 0xE2, 0xF0, 0x78, 0x8A, 0x43, 0xE6, 0x96, 0x36, \n+\t/* 0x 20 */ 0x5B, 0xCA, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, \n+...\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..e4a4021\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/minimal-secure-streams.c\n@@ -0,0 +1,680 @@\n+/*\n+ * lws-minimal-secure-streams-policy2c\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This reads policy JSON on stdin and emits it as compileable\n+ * C structs.\n+ *\n+ * It's useful if your platform is too space-constrained for a\n+ * JSON policy and needs to build a static policy in C via\n+ * LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY... this way you can\n+ * still create and maintain the JSON policy but implement it directly\n+ * as C structs in your code.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cstdio.h\u003e\n+#include \u003cassert.h\u003e\n+\n+static int interrupted, bad \u003d 1;\n+\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+struct aggstr {\n+\tstruct aggstr *next;\n+\n+\tconst char *orig;\n+\tsize_t offset;\n+};\n+\n+static struct aggstr *rbomap,\t/* retry / backoff object map */\n+\t\t *trustmap, /* trust store map */\n+\t\t *certmap;\t/* x.509 cert map */\n+static size_t last_offset;\n+\n+\n+\n+static const char *\n+purify_csymbol(const char *in, char *temp, size_t templen)\n+{\n+\tconst char *otemp \u003d temp;\n+\n+\tassert (strlen(in) \u003c templen);\n+\n+\twhile (*in) {\n+\t\tif ((*in \u003e\u003d 'a' \u0026\u0026 *in \u003c\u003d 'z') || (*in \u003e\u003d 'A' \u0026\u0026 *in \u003c\u003d 'Z') ||\n+\t\t (*in \u003e\u003d '0' \u0026\u0026 *in \u003c\u003d '9'))\n+\t\t\t*temp++ \u003d *in;\n+\t\telse\n+\t\t\t*temp++ \u003d '_';\n+\n+\t\tin++;\n+\t}\n+\n+\t*temp \u003d '\u005c0';\n+\n+\treturn otemp;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tconst lws_ss_policy_t *pol, *lastpol \u003d NULL;\n+\tstruct lws_context_creation_info info;\n+\tsize_t json_size \u003d 0, est \u003d 0;\n+\tstruct lws_context *context;\n+\tconst lws_ss_auth_t *auth;\n+\tchar prev[128], curr[128];\n+\tint unique_rbo \u003d 0, m, n;\n+\tchar buf[64], buf1[64];\n+\tlws_ss_metadata_t *md;\n+\tstruct aggstr *a, *a1;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams policy2c [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_ss_policy_parse_begin(context, 0);\n+\n+\tprintf(\u0022/*\u005cn * Autogenerated from the following JSON policy\u005cn */\u005cn\u005cn#if 0\u005cn\u0022);\n+\n+\tdo {\n+\t\tint m, n \u003d (int)read(0, buf, sizeof(buf));\n+\n+\t\tif (n \u003c 1)\n+\t\t\tbreak;\n+\n+\t\tm \u003d lws_ss_policy_parse(context, (uint8_t *)buf, (size_t)n);\n+\n+\t\t// printf(\u0022%.*s\u0022, n, buf);\n+\t\tjson_size +\u003d (unsigned int)n;\n+\n+\t\tif (m \u003c 0 \u0026\u0026 m !\u003d LEJP_CONTINUE) {\n+\t\t\tlwsl_err(\u0022%s: policy parse failed... lws has WITH_ROLEs\u0022\n+\t\t\t\t \u0022for what's in the JSON?\u005cn\u0022, __func__);\n+\t\t\tgoto bail;\n+\t\t}\n+\t} while (1);\n+\n+\tprintf(\u0022\u005cn\u005cn Original JSON size: %zu\u005cn#endif\u005cn\u005cn\u0022, json_size);\n+\n+\tlwsl_notice(\u0022%s: parsed JSON\u005cn\u0022, __func__);\n+\n+\t/*\n+\t * Well, this is fun, isn't it... we have parsed the JSON into in-memory\n+\t * policy objects, and it has set the context policy pointer to the head\n+\t * of those but has not set the new policy (which would free the x.509).\n+\t *\n+\t * We want to walk the streamtype list first discovering unique objects\n+\t * and strings referenced there and emitting them compactly as C data,\n+\t * and then second to emit the streamtype linked-list referring to those\n+\t * objects.\n+\t *\n+\t * For const strings, we aggregate them and avoid generating extra\n+\t * pointers by encoding the reference as \u0026_lws_ss_staticpol_str[xxx]\n+\t * where xxx is the fixed offset in the aggregated monster-string. When\n+\t * doing that, we keep a map of original pointers to offsets.\n+\t *\n+\t * Although we want to minimize memory used by the emitted C, we don't\n+\t * have to sweat memory during this conversion since it's happening on a\n+\t * PC\n+\t */\n+\n+\tpol \u003d lws_ss_policy_get(context);\n+\n+\twhile (pol) {\n+\n+\t\t/*\n+\t\t * Walk the metadata list gathering strings and issuing the\n+\t\t * C struct\n+\t\t */\n+\n+\t\tmd \u003d pol-\u003emetadata;\n+\n+\t\tif (md) {\n+\t\t\tint idx \u003d 0;\n+\n+\t\t\tprintf(\u0022\u005cnstatic const lws_ss_metadata_t \u0022);\n+\n+\t\t\tprev[0] \u003d '\u005c0';\n+\t\t\tmd \u003d pol-\u003emetadata;\n+\t\t\twhile (md) {\n+\n+\t\t\t\test +\u003d sizeof(lws_ss_metadata_t);\n+\n+\t\t\t\tlws_snprintf(curr, sizeof(curr), \u0022_md_%s_%s\u0022,\n+\t\t\t\t\tpurify_csymbol(pol-\u003estreamtype, buf,\n+\t\t\t\t\t\t sizeof(buf)),\n+\t\t\t\t\tpurify_csymbol(md-\u003ename, buf1,\n+\t\t\t\t\t\t sizeof(buf1)));\n+\n+\t\t\t\tprintf(\u0022%s \u003d {\u005cn\u0022, curr);\n+\t\t\t\tif (prev[0])\n+\t\t\t\t\tprintf(\u0022\u005ct.next \u003d (void *)\u0026%s, \u005cn\u0022, prev);\n+\n+\t\t\t\tprintf(\u0022\u005ct.name \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, (const char *)md-\u003ename);\n+\t\t\t\tif (md-\u003evalue__may_own_heap) {\n+\t\t\t\t\tprintf(\u0022\u005ct.value__may_own_heap \u003d (void *)\u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\t\t\t(const char *)md-\u003evalue__may_own_heap);\n+\t\t\t\t\tprintf(\u0022\u005ct.value_length \u003d 0x%x,\u005cn\u0022,\n+\t\t\t\t\t\t(unsigned int)strlen(\n+\t\t\t\t\t\t\t(const char *)md-\u003evalue__may_own_heap));\n+\t\t\t\t}\n+\n+\t\t\t\tprintf(\u0022\u005ct.length \u003d %d,\u005cn\u0022, idx++); // md-\u003elength);\n+\t\t\t\tprintf(\u0022\u005ct.value_is_http_token \u003d 0x%x,\u005cn\u0022,\n+\t\t\t\t\t(unsigned int)md-\u003evalue_is_http_token);\n+\t\t\t\tprintf(\u0022}\u0022);\n+\t\t\t\tif (md-\u003enext)\n+\t\t\t\t\tprintf(\u0022,\u005cn\u0022);\n+\n+\t\t\t\tlws_strncpy(prev, curr, sizeof(prev));\n+\n+\t\t\t\tmd \u003d md-\u003enext;\n+\t\t\t}\n+\n+\t\t\tprintf(\u0022;\u005cn\u005cn\u0022);\n+\t\t}\n+\n+\t\t/*\n+\t\t * Create unique retry policies... have we seen this guy?\n+\t\t */\n+\n+\t\tif (pol-\u003eretry_bo) {\n+\t\t\ta \u003d rbomap;\n+\t\t\twhile (a) {\n+\t\t\t\tif (a-\u003eorig \u003d\u003d (const char *)pol-\u003eretry_bo)\n+\t\t\t\t\tbreak;\n+\n+\t\t\t\ta \u003d a-\u003enext;\n+\t\t\t}\n+\n+\t\t\tif (!a) {\n+\n+\t\t\t\t/* We haven't seen it before and need to create it */\n+\n+\t\t\t\ta \u003d malloc(sizeof(*a));\n+\t\t\t\tif (!a)\n+\t\t\t\t\tgoto bail;\n+\t\t\t\ta-\u003enext \u003d rbomap;\n+\t\t\t\ta-\u003eoffset \u003d (unsigned int)unique_rbo++;\n+\t\t\t\ta-\u003eorig \u003d (const char *)pol-\u003eretry_bo;\n+\t\t\t\trbomap \u003d a;\n+\n+\t\t\t\tprintf(\u0022static const uint32_t _rbo_bo_%zu[] \u003d {\u005cn\u0022,\n+\t\t\t\t\ta-\u003eoffset);\n+\t\t\t\tfor (n \u003d 0; n \u003c pol-\u003eretry_bo-\u003eretry_ms_table_count; n++)\n+\t\t\t\t\tprintf(\u0022 %u, \u0022, (unsigned int)\n+\t\t\t\t\t pol-\u003eretry_bo-\u003eretry_ms_table[n]);\n+\n+\t\t\t\test +\u003d sizeof(uint32_t) *\n+\t\t\t\t\tpol-\u003eretry_bo-\u003eretry_ms_table_count;\n+\n+\t\t\t\tprintf(\u0022\u005cn};\u005cnstatic const \u0022\n+\t\t\t\t \u0022lws_retry_bo_t _rbo_%zu \u003d {\u005cn\u0022, a-\u003eoffset);\n+\n+\t\t\t\tprintf(\u0022\u005ct.retry_ms_table \u003d _rbo_bo_%zu,\u005cn\u0022,\n+\t\t\t\t\ta-\u003eoffset);\n+\t\t\t\tprintf(\u0022\u005ct.retry_ms_table_count \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eretry_bo-\u003eretry_ms_table_count);\n+\t\t\t\tprintf(\u0022\u005ct.conceal_count \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eretry_bo-\u003econceal_count);\n+\t\t\t\tprintf(\u0022\u005ct.secs_since_valid_ping \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eretry_bo-\u003esecs_since_valid_ping);\n+\t\t\t\tprintf(\u0022\u005ct.secs_since_valid_hangup \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eretry_bo-\u003esecs_since_valid_hangup);\n+\t\t\t\tprintf(\u0022\u005ct.jitter_percent \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eretry_bo-\u003ejitter_percent);\n+\t\t\t\tprintf(\u0022};\u005cn\u0022);\n+\n+\t\t\t\test +\u003d sizeof(lws_retry_bo_t);\n+\t\t\t}\n+\t\t}\n+\n+\t\t/*\n+\t\t * How about his trust store, it's new to us?\n+\t\t */\n+\n+\t\tif (pol-\u003etrust.store) {\n+\t\t\ta \u003d trustmap;\n+\t\t\twhile (a) {\n+\t\t\t\tif (a-\u003eorig \u003d\u003d (const char *)pol-\u003etrust.store)\n+\t\t\t\t\tbreak;\n+\n+\t\t\t\ta \u003d a-\u003enext;\n+\t\t\t}\n+\n+\t\t\tif (!a) {\n+\n+\t\t\t\t/* it's new to us... */\n+\n+\t\t\t\ta \u003d malloc(sizeof(*a));\n+\t\t\t\tif (!a)\n+\t\t\t\t\tgoto bail;\n+\t\t\t\ta-\u003enext \u003d trustmap;\n+\t\t\t\ta-\u003eoffset \u003d 0; /* don't care, just track seen */\n+\t\t\t\ta-\u003eorig \u003d (const char *)pol-\u003etrust.store;\n+\t\t\t\ttrustmap \u003d a;\n+\n+\t\t\t\t/*\n+\t\t\t\t * Have a look through his x.509 stack...\n+\t\t\t\t * any that're new to us?\n+\t\t\t\t */\n+\n+\t\t\t\tfor (n \u003d 0; n \u003c pol-\u003etrust.store-\u003ecount; n++) {\n+\t\t\t\t\tif (!pol-\u003etrust.store-\u003essx509[n])\n+\t\t\t\t\t\tcontinue;\n+\t\t\t\t\ta1 \u003d certmap;\n+\t\t\t\t\twhile (a1) {\n+\t\t\t\t\t\tif (a1-\u003eorig \u003d\u003d (const char *)pol-\u003etrust.store-\u003essx509[n])\n+\t\t\t\t\t\t\tbreak;\n+\t\t\t\t\t\ta1 \u003d a1-\u003enext;\n+\t\t\t\t\t}\n+\n+\t\t\t\t\tif (!a1) {\n+\t\t\t\t\t\t/*\n+\t\t\t\t\t\t * This x.509 cert is new to us...\n+\t\t\t\t\t\t * let's capture the DER\n+\t\t\t\t\t\t */\n+\n+\t\t\t\t\t\ta1 \u003d malloc(sizeof(*a1));\n+\t\t\t\t\t\tif (!a1)\n+\t\t\t\t\t\t\tgoto bail;\n+\t\t\t\t\t\ta1-\u003enext \u003d certmap;\n+\t\t\t\t\t\ta1-\u003eoffset \u003d 0; /* don't care, just track seen */\n+\t\t\t\t\t\ta1-\u003eorig \u003d (const char *)pol-\u003etrust.store-\u003essx509[n];\n+\t\t\t\t\t\tcertmap \u003d a1;\n+\n+\t\t\t\t\t\tprintf(\u0022static const uint8_t _ss_der_%s[] \u003d {\u005cn\u0022,\n+\t\t\t\t\t\t\tpurify_csymbol(pol-\u003etrust.store-\u003essx509[n]-\u003evhost_name,\n+\t\t\t\t\t\t\t\t\tbuf, sizeof(buf)));\n+\n+\t\t\t\t\t\tfor (m \u003d 0; m \u003c (int)pol-\u003etrust.store-\u003essx509[n]-\u003eca_der_len; m++) {\n+\t\t\t\t\t\t\tif ((m \u0026 7) \u003d\u003d 0)\n+\t\t\t\t\t\t\t\tprintf(\u0022\u005ct/* 0x%3x */ \u0022, m);\n+\n+\t\t\t\t\t\t\tprintf(\u00220x%02X, \u0022, pol-\u003etrust.store-\u003essx509[n]-\u003eca_der[m]);\n+\t\t\t\t\t\t\tif ((m \u0026 7) \u003d\u003d 7)\n+\t\t\t\t\t\t\t\tprintf(\u0022\u005cn\u0022);\n+\t\t\t\t\t\t}\n+\n+\t\t\t\t\t\tprintf(\u0022\u005cn};\u005cnstatic const lws_ss_x509_t _ss_x509_%s \u003d {\u005cn\u0022,\n+\t\t\t\t\t\t\t\tpurify_csymbol(pol-\u003etrust.store-\u003essx509[n]-\u003evhost_name,\n+\t\t\t\t\t\t\t\tbuf, sizeof(buf)));\n+\t\t\t\t\t\tprintf(\u0022\u005ct.vhost_name \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, pol-\u003etrust.store-\u003essx509[n]-\u003evhost_name);\n+\t\t\t\t\t\tprintf(\u0022\u005ct.ca_der \u003d _ss_der_%s,\u005cn\u0022,\n+\t\t\t\t\t\t\tpurify_csymbol(pol-\u003etrust.store-\u003essx509[n]-\u003evhost_name,\n+\t\t\t\t\t\t\t\tbuf, sizeof(buf)));\n+\t\t\t\t\t\tprintf(\u0022\u005ct.ca_der_len \u003d %zu,\u005cn\u0022, pol-\u003etrust.store-\u003essx509[n]-\u003eca_der_len);\n+\t\t\t\t\t\tprintf(\u0022};\u005cn\u0022);\n+\n+\t\t\t\t\t\test +\u003d sizeof(lws_ss_x509_t) + pol-\u003etrust.store-\u003essx509[n]-\u003eca_der_len;\n+\t\t\t\t\t}\n+\n+\t\t\t\t}\n+\n+\n+\t\t\t\tprintf(\u0022static const lws_ss_trust_store_t _ss_ts_%s \u003d {\u005cn\u0022,\n+\t\t\t\t\tpurify_csymbol(pol-\u003etrust.store-\u003ename,\n+\t\t\t\t\t\t\tbuf, sizeof(buf)));\n+\n+\t\t\t\tprintf(\u0022\u005ct.name \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, pol-\u003etrust.store-\u003ename);\n+\t\t\t\tprintf(\u0022\u005ct.count \u003d %d,\u005cn\u0022, pol-\u003etrust.store-\u003ecount);\n+\t\t\t\tprintf(\u0022\u005ct.ssx509 \u003d {\u005cn\u0022);\n+\n+\t\t\t\tfor (n \u003d pol-\u003etrust.store-\u003ecount - 1; n \u003e\u003d 0 ; n--)\n+\t\t\t\t\tprintf(\u0022\u005ct\u005ct\u0026_ss_x509_%s,\u005cn\u0022,\n+\t\t\t\t\t\tpol-\u003etrust.store-\u003essx509[n]-\u003evhost_name);\n+\n+\t\t\t\tprintf(\u0022\u005ct}\u005cn};\u005cn\u0022);\n+\n+\t\t\t\test +\u003d sizeof(lws_ss_trust_store_t);\n+\n+\t\t\t}\n+\t\t}\n+\n+\t\tpol \u003d pol-\u003enext;\n+\t}\n+\n+\n+\t/* dump any streamtype's http resp map */\n+\n+\tpol \u003d lws_ss_policy_get(context);\n+\tm \u003d 0;\n+\n+\twhile (pol) {\n+\n+\t\tlws_snprintf(curr, sizeof(curr), \u0022_ssp_%s\u0022,\n+\t\t\tpurify_csymbol(pol-\u003estreamtype, buf, sizeof(buf)));\n+\n+\t\t/* if relevant, dump http resp map */\n+\n+\t\tswitch (pol-\u003eprotocol) {\n+\t\tcase LWSSSP_H1:\n+\t\tcase LWSSSP_H2:\n+\t\tcase LWSSSP_WS:\n+\n+\t\t\tif (!pol-\u003eu.http.count_respmap)\n+\t\t\t\tbreak;\n+\n+\t\t\tif (!m)\n+\t\t\t\tprintf(\u0022\u005cnstatic const lws_ss_http_respmap_t \u0022);\n+\t\t\telse\n+\t\t\t\tprintf(\u0022,\u005cn\u0022);\n+\t\t\tm++;\n+\n+\t\t\tprintf(\u0022%s_http_respmap[] \u003d {\u005cn\u0022, curr);\n+\t\t\tfor (n \u003d 0; n \u003c pol-\u003eu.http.count_respmap; n++) {\n+\t\t\t\tprintf(\u0022\u005ct{ %d, 0x%x },\u005cn\u0022,\n+\t\t\t\t\t\tpol-\u003eu.http.respmap[n].resp,\n+\t\t\t\t\t\tpol-\u003eu.http.respmap[n].state);\n+\n+\t\t\t\test +\u003d sizeof(lws_ss_http_respmap_t);\n+\t\t\t}\n+\t\t\tprintf(\u0022}\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tpol \u003d pol-\u003enext;\n+\t}\n+\n+\tif (m)\n+\t\tprintf(\u0022;\u005cn\u0022);\n+\n+\t/*\n+\t * The auth map\n+\t */\n+\n+\tauth \u003d lws_ss_auth_get(context);\n+\tif (auth)\n+\t\tprintf(\u0022\u005cnstatic const lws_ss_auth_t \u0022);\n+\tprev[0] \u003d '\u005c0';\n+\n+\twhile (auth) {\n+\t\tlws_snprintf(curr, sizeof(curr), \u0022_ssau_%s\u0022,\n+\t\t\tpurify_csymbol(auth-\u003ename, buf, sizeof(buf)));\n+\n+\t\tprintf(\u0022%s \u003d {\u005cn\u0022, curr);\n+\t\tif (prev[0])\n+\t\t\tprintf(\u0022\u005ct.next \u003d (void *)\u0026%s,\u005cn\u0022, prev);\n+\n+\t\tprintf(\u0022\u005ct.name \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, auth-\u003ename);\n+\t\tprintf(\u0022\u005ct.type\u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, auth-\u003etype);\n+\t\tprintf(\u0022\u005ct.streamtype \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, auth-\u003estreamtype);\n+\t\tprintf(\u0022\u005ct.blob_index \u003d %d,\u005cn\u0022, auth-\u003eblob_index);\n+\t\tprintf(\u0022}\u0022);\n+\t\tif (auth-\u003enext)\n+\t\t\tprintf(\u0022,\u0022);\n+\t\telse\n+\t\t\tprintf(\u0022;\u0022);\n+\t\tprintf(\u0022\u005cn\u0022);\n+\n+\t\tlws_strncpy(prev, curr, sizeof(prev));\n+\n+\t\tauth \u003d auth-\u003enext;\n+\t}\n+\n+\tif (lws_ss_auth_get(context))\n+\t\tprintf(\u0022\u005cn\u0022);\n+\n+\t/*\n+\t * The streamtypes\n+\t */\n+\n+\tpol \u003d lws_ss_policy_get(context);\n+\n+\tprintf(\u0022\u005cnstatic const lws_ss_policy_t \u0022);\n+\tprev[0] \u003d '\u005c0';\n+\n+\twhile (pol) {\n+\n+\t\test +\u003d sizeof(*pol);\n+\n+\t\tlws_snprintf(curr, sizeof(curr), \u0022_ssp_%s\u0022,\n+\t\t\tpurify_csymbol(pol-\u003estreamtype, buf, sizeof(buf)));\n+\n+\t\tprintf(\u0022%s \u003d {\u005cn\u0022, curr);\n+\n+\t\tif (prev[0])\n+\t\t\tprintf(\u0022\u005ct.next \u003d (void *)\u0026%s,\u005cn\u0022, prev);\n+\n+\t\tprintf(\u0022\u005ct.streamtype \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, pol-\u003estreamtype);\n+\t\tif (pol-\u003eendpoint)\n+\t\t\tprintf(\u0022\u005ct.endpoint \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, pol-\u003eendpoint);\n+\t\tif (pol-\u003erideshare_streamtype)\n+\t\t\tprintf(\u0022\u005ct.rideshare_streamtype \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\tpol-\u003erideshare_streamtype);\n+\t\tif (pol-\u003epayload_fmt)\n+\t\t\tprintf(\u0022\u005ct.payload_fmt \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\tpol-\u003epayload_fmt);\n+\t\tif (pol-\u003esocks5_proxy)\n+\t\t\tprintf(\u0022\u005ct.socks5_proxy \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\tpol-\u003esocks5_proxy);\n+\n+\t\tif (pol-\u003eauth)\n+\t\t\tprintf(\u0022\u005ct.auth \u003d \u0026_ssau_%s,\u005cn\u0022,\n+\t\t\t purify_csymbol(pol-\u003eauth-\u003ename, buf, sizeof(buf)));\n+\n+\t\t{\n+\t\t\tlws_ss_metadata_t *nv \u003d pol-\u003emetadata, *last \u003d NULL;\n+\n+\t\t\twhile (nv) {\n+\t\t\t\tlast \u003d nv;\n+\t\t\t\tnv \u003d nv-\u003enext;\n+\t\t\t}\n+\t\t\tif (pol-\u003emetadata)\n+\t\t\t\tprintf(\u0022\u005ct.metadata \u003d (void *)\u0026_md_%s_%s,\u005cn\u0022,\n+\t\t\t\t\tpurify_csymbol(pol-\u003estreamtype, buf, sizeof(buf)),\n+\t\t\t\t\tpurify_csymbol(last-\u003ename, buf1, sizeof(buf1)));\n+\t\t}\n+\n+\n+\t\tswitch (pol-\u003eprotocol) {\n+\t\tcase LWSSSP_H1:\n+\t\tcase LWSSSP_H2:\n+\t\tcase LWSSSP_WS:\n+\n+\t\t\tprintf(\u0022\u005ct.u \u003d {\u005cn\u005ct\u005ct.http \u003d {\u005cn\u0022);\n+\n+\t\t\tif (pol-\u003eu.http.method)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.method \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.http.method);\n+\t\t\tif (pol-\u003eu.http.url)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.url \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.http.url);\n+\t\t\tif (pol-\u003eu.http.multipart_name)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.multipart_name \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.http.multipart_name);\n+\t\t\tif (pol-\u003eu.http.multipart_filename)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.multipart_filename \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.http.multipart_filename);\n+\t\t\tif (pol-\u003eu.http.multipart_content_type)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.multipart_content_type \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.http.multipart_content_type);\n+\t\t\tif (pol-\u003eu.http.auth_preamble)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.auth_preamble \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.http.auth_preamble);\n+\n+\t\t\tif (pol-\u003eu.http.respmap) {\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.respmap \u003d (void *)\u0026%s_http_respmap,\u005cn\u0022,\n+\t\t\t\t\t\tcurr);\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.count_respmap \u003d %d,\u005cn\u0022,\n+\t\t\t\t\t\tpol-\u003eu.http.count_respmap);\n+\t\t\t}\n+\n+\t\t\tif (pol-\u003eu.http.blob_header[0]) {\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.blob_header \u003d {\u005cn\u0022);\n+\t\t\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(pol-\u003eu.http.blob_header); n++)\n+\t\t\t\t\tif (pol-\u003eu.http.blob_header[n])\n+\t\t\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct\u005ct\u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\t\t\tpol-\u003eu.http.blob_header[n]);\n+\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct},\u005cn\u0022);\n+\t\t\t}\n+\n+\t\t\tif (pol-\u003eprotocol \u003d\u003d LWSSSP_WS) {\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.u \u003d {\u005cn\u005ct\u005ct\u005ct\u005ct.ws \u003d {\u005cn\u0022);\n+\t\t\t\tif (pol-\u003eu.http.u.ws.subprotocol)\n+\t\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct\u005ct\u005ct.subprotocol \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\t\tpol-\u003eu.http.u.ws.subprotocol);\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct\u005ct\u005ct.binary \u003d %u\u005cn\u0022, pol-\u003eu.http.u.ws.binary);\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct\u005ct}\u005cn\u005ct\u005ct\u005ct},\u005cn\u0022);\n+\t\t\t}\n+\n+\t\t\tif (pol-\u003eu.http.resp_expect)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.resp_expect \u003d %u,\u005cn\u0022, pol-\u003eu.http.resp_expect);\n+\t\t\tif (pol-\u003eu.http.fail_redirect)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.fail_redirect \u003d %u,\u005cn\u0022, pol-\u003eu.http.fail_redirect);\n+\n+\t\t\tprintf(\u0022\u005ct\u005ct}\u005cn\u005ct},\u005cn\u0022);\n+\n+\t\t\tbreak;\n+\t\tcase LWSSSP_MQTT:\n+\n+\t\t\tprintf(\u0022\u005ct.u \u003d {\u005cn\u005ct\u005ct.mqtt \u003d {\u005cn\u0022);\n+\n+\t\t\tif (pol-\u003eu.mqtt.topic)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.topic \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.topic);\n+\t\t\tif (pol-\u003eu.mqtt.subscribe)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.subscribe \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.subscribe);\n+\t\t\tif (pol-\u003eu.mqtt.will_topic)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.will_topic \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.will_topic);\n+\t\t\tif (pol-\u003eu.mqtt.will_message)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.will_message \u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.will_message);\n+\n+\t\t\tif (pol-\u003eu.mqtt.keep_alive)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.keep_alive \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.keep_alive);\n+\t\t\tif (pol-\u003eu.mqtt.qos)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.qos \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.qos);\n+\t\t\tif (pol-\u003eu.mqtt.clean_start)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.clean_start \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.clean_start);\n+\t\t\tif (pol-\u003eu.mqtt.will_qos)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.will_qos \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.will_qos);\n+\t\t\tif (pol-\u003eu.mqtt.will_retain)\n+\t\t\t\tprintf(\u0022\u005ct\u005ct\u005ct.will_retain \u003d %u,\u005cn\u0022,\n+\t\t\t\t\tpol-\u003eu.mqtt.will_retain);\n+\n+\t\t\tprintf(\u0022\u005ct\u005ct}\u005cn\u005ct},\u005cn\u0022);\n+\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tlwsl_err(\u0022%s: unknown ss protocol index %d\u005cn\u0022, __func__,\n+\t\t\t\t\tpol-\u003eprotocol);\n+\t\t\tgoto bail;\n+\t\t}\n+\n+#if 0\n+\t\tconst lws_ss_trust_store_t *trust_store; /**\u003c CA certs needed for conn\n+\t\t validation, only set between policy parsing and vhost creation */\n+#endif\n+\n+\t\tif (pol-\u003eretry_bo) {\n+\t\t\ta \u003d rbomap;\n+\t\t\twhile (a) {\n+\t\t\t\tif (a-\u003eorig \u003d\u003d (const char *)pol-\u003eretry_bo)\n+\t\t\t\t\tbreak;\n+\n+\t\t\t\ta \u003d a-\u003enext;\n+\t\t\t}\n+\t\t\tif (!a)\n+\t\t\t\tgoto bail;\n+\n+\t\t\tprintf(\u0022\u005ct.retry_bo \u003d \u0026_rbo_%zu,\u005cn\u0022, a-\u003eoffset);\n+\t\t}\n+\n+\t\tif (pol-\u003etimeout_ms)\n+\t\t\tprintf(\u0022\u005ct.timeout_ms \u003d %u,\u005cn\u0022, pol-\u003etimeout_ms);\n+\t\tif (pol-\u003eflags)\n+\t\t\tprintf(\u0022\u005ct.flags \u003d 0x%x,\u005cn\u0022, pol-\u003eflags);\n+\t\tif (pol-\u003eflags)\n+\t\t\tprintf(\u0022\u005ct.priority \u003d 0x%x,\u005cn\u0022, (unsigned int)pol-\u003epriority);\n+\t\tif (pol-\u003eport)\n+\t\t\tprintf(\u0022\u005ct.port \u003d %u,\u005cn\u0022, pol-\u003eport);\n+\t\tif (pol-\u003emetadata_count)\n+\t\t\tprintf(\u0022\u005ct.metadata_count \u003d %u,\u005cn\u0022, pol-\u003emetadata_count);\n+\t\tprintf(\u0022\u005ct.protocol \u003d %u,\u005cn\u0022, pol-\u003eprotocol);\n+\t\tif (pol-\u003eclient_cert)\n+\t\t\tprintf(\u0022\u005ct.client_cert \u003d %u,\u005cn\u0022, pol-\u003eclient_cert);\n+\n+\t\tif (pol-\u003etrust.store)\n+\t\t\tprintf(\u0022\u005ct.trust \u003d {.store \u003d \u0026_ss_ts_%s},\u005cn\u0022,\n+\t\t\t\tpurify_csymbol(pol-\u003etrust.store-\u003ename,\n+\t\t\t\t\t\t\tbuf, sizeof(buf)));\n+#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)\n+\t\tif (pol-\u003eaws_region)\n+\t\t\tprintf(\u0022\u005ct.aws_region\u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, pol-\u003eaws_region);\n+\t\tif (pol-\u003eaws_service)\n+\t\t\tprintf(\u0022\u005ct.aws_service\u003d \u005c\u0022%s\u005c\u0022,\u005cn\u0022, pol-\u003eaws_service);\n+\n+#endif\n+\n+\n+\t\tprintf(\u0022}\u0022);\n+\t\tif (pol-\u003enext)\n+\t\t\tprintf(\u0022,\u005cn\u0022);\n+\n+\t\tlws_strncpy(prev, curr, sizeof(prev));\n+\n+\t\tlastpol \u003d pol;\n+\n+\t\tpol \u003d pol-\u003enext;\n+\t}\n+\n+\tprintf(\u0022;\u005cn\u0022);\n+\tif (lastpol)\n+\t\tprintf(\u0022#define _ss_static_policy_entry _ssp_%s\u005cn\u0022,\n+\t\t\tpurify_csymbol(lastpol-\u003estreamtype, buf, sizeof(buf)));\n+\n+\test +\u003d last_offset;\n+\n+\tprintf(\u0022/* estimated footprint %zu (when sizeof void * \u003d %zu) */\u005cn\u0022,\n+\t\t\test, sizeof(void *));\n+\n+\tlws_ss_policy_parse_abandon(context);\n+\tbad \u003d 0;\n+\n+bail:\n+\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/CMakeLists.txt\nnew file mode 100644\nindex 0000000..e8c9439\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/CMakeLists.txt\n@@ -0,0 +1,61 @@\n+project(lws-minimal-secure-streams-post C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-post)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams-post.c)\n+\t\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE)\n+\t\tif (VALGRIND)\n+\t\t\tadd_test(NAME sspost-warmcat COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tpost_hcm_srv\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-post\u003e\n+\t\t\t)\n+\t\telse()\n+\t\t\tadd_test(NAME sspost-warmcat\n+\t\t\t\tCOMMAND lws-minimal-secure-streams-post)\n+\t\tendif()\n+\t\tset_tests_properties(sspost-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post\n+\t\t\t\t TIMEOUT 20)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client minimal-secure-streams-post.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/README.md\nnew file mode 100644\nindex 0000000..cb9b3b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/README.md\n@@ -0,0 +1,66 @@\n+# lws minimal secure streams\n+\n+The application goes to https://warmcat.com and reads index.html there.\n+\n+It does it using Secure Streams... the main code in minimal-secure-streams.c\n+just sets up the context and opens a secure stream of type \u0022mintest\u0022.\n+\n+The handler for state changes and payloads for \u0022mintest\u0022 is in ss-myss.c\n+\n+The information about how a \u0022mintest\u0022 stream should connect and the\n+protocol it uses is kept separated in policy-database.c\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-f| Force connecting to the wrong endpoint to check backoff retry flow\n+-p| Run as proxy server for clients to connect to over unix domain socket\n+--force-portal|Force the SS Captive Portal Detection to feel it's behind a portal\n+--force-no-internet|Force the SS Captive Portal Detection to feel it can't reach the internet\n+\n+```\n+[2019/08/12 07:16:11:0045] USR: LWS minimal secure streams [-d\u003cverbosity\u003e] [-f]\n+[2019/08/12 07:16:12:6102] USR: myss_state: LWSSSCS_CREATING, ord 0x0\n+[2019/08/12 07:16:12:6107] USR: myss_state: LWSSSCS_POLL, ord 0x0\n+[2019/08/12 07:16:12:6117] N: lws_ss_client_connect: connecting h1get warmcat.com /\n+[2019/08/12 07:16:12:6118] USR: myss_state: LWSSSCS_CONNECTING, ord 0x0\n+[2019/08/12 07:16:13:4171] USR: myss_state: LWSSSCS_CONNECTED, ord 0x0\n+[2019/08/12 07:16:13:4222] USR: myss_rx: len 1024, flags: 1\n+[2019/08/12 07:16:13:4243] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4244] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4244] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4245] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4246] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4247] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4252] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4264] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4265] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4266] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4267] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4268] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4268] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4269] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4270] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4278] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4279] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4280] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4281] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4282] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4283] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4283] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4284] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4287] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4288] USR: myss_rx: len 947, flags: 0\n+[2019/08/12 07:16:13:4293] USR: myss_rx: len 0, flags: 2\n+[2019/08/12 07:16:13:4399] USR: myss_state: LWSSSCS_DISCONNECTED, ord 0x0\n+[2019/08/12 07:16:13:4761] USR: myss_state: LWSSSCS_DESTROYING, ord 0x0\n+[2019/08/12 07:16:13:4781] USR: Completed: OK\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c\nnew file mode 100644\nindex 0000000..b5a5f34\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c\n@@ -0,0 +1,578 @@\n+/*\n+ * lws-minimal-secure-streams-post\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams api.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there.\n+ *\n+ * This example is built two different ways from the same source... one includes\n+ * the policy everything needed to fulfil the stream directly. The other -client\n+ * variant has no policy itself and some other minor init changes, and connects\n+ * to the -proxy example to actually get the connection done.\n+ *\n+ * In the -client build case, the example does not even init the tls libraries\n+ * since the proxy part will take care of all that.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cassert.h\u003e\n+\n+/*\n+ * uncomment to force network traffic through 127.0.0.1:1080\n+ *\n+ * On your local machine, you can run a SOCKS5 proxy like this\n+ *\n+ * $ ssh -N -D 0.0.0.0:1080 localhost -v\n+ *\n+ * If enabled, this also fetches a remote policy that also\n+ * specifies that all traffic should go through the remote\n+ * proxy.\n+ */\n+// #define VIA_LOCALHOST_SOCKS\n+\n+static int interrupted, bad \u003d 1, force_cpd_fail_portal,\n+\t force_cpd_fail_no_internet;\n+static unsigned int timeout_ms \u003d 3000;\n+static lws_state_notify_link_t nl;\n+\n+static const char * const postbody \u003d\n+\t\u0022--boundary\u005cr\u005cn\u0022\n+\t\u0022Content-Disposition: form-data; name\u003d\u005c\u0022text\u005c\u0022\u005cr\u005cn\u0022\n+\t\u0022\u005cr\u005cn\u0022\n+\t\u0022value1\u005cr\u005cn\u0022\n+\t\u0022--boundary\u005cr\u005cn\u0022\n+\t\u0022Content-Disposition: form-data; \u0022\n+\t\t\u0022name\u003d\u005c\u0022field2\u005c\u0022; filename\u003d\u005c\u0022example.txt\u005c\u0022\u005cr\u005cn\u0022\n+\t\u0022\u005cr\u005cn\u0022\n+\t\u0022value2\u005cr\u005cn\u0022\n+\t\u002200-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002201-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002202-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002203-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002204-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002205-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002206-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002207-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002208-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002209-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002210-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002211-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002212-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002213-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002214-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002215-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002216-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002217-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002218-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002219-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002220-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002221-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002222-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002223-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002224-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002225-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002226-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002227-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002228-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002229-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002230-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002231-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002232-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002233-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002234-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002235-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002236-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002237-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002238-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002239-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002240-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002241-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002242-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002243-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002244-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002245-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002246-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002247-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002248-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002249-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u0022--boundary--\u005cr\u005cn\u0022;\n+\n+/*\n+ * If the -proxy app is fulfilling our connection, then we don't need to have\n+ * the policy in the client.\n+ *\n+ * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over\n+ * a Unix Domain Socket. To test that, you need to separately run the\n+ * ./lws-minimal-secure-streams-proxy test app on the same machine.\n+ */\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+\t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\t\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\t\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\t\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\t\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\t\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\t\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\t\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\t\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\t\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\t\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\t\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\t\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\t\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\t\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\t\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\t\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\t\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\t\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\t\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\t\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\t\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\t\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\t\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\t\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\t\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\t\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\t\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\t\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t \t \u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t \t/*\n+\t\t * \u0022fetch_policy\u0022 decides from where the real policy\n+\t\t * will be fetched, if present. Otherwise the initial\n+\t\t * policy is treated as the whole, hardcoded, policy.\n+\t\t */\n+\t\t\u0022{\u005c\u0022fetch_policy\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-socks.json\u005c\u0022,\u0022\n+#else\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy.json\u005c\u0022,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t\t/*\n+\t\t\t * \u0022captive_portal_detect\u0022 describes\n+\t\t\t * what to do in order to check if the path to\n+\t\t\t * the Internet is being interrupted by a\n+\t\t\t * captive portal. If there's a larger policy\n+\t\t\t * fetched from elsewhere, it should also include\n+\t\t\t * this since it needs to be done at least after\n+\t\t\t * every DHCP acquisition\n+\t\t\t */\n+\t\t \u0022\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+ \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+ \u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+ \u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+ \u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+ \u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+ \u0022}}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+\n+\tsize_t pos;\n+\tsize_t len;\n+} myss_t;\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+#endif\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+//\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tif (m-\u003epos \u003d\u003d m-\u003elen)\n+\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+\tif (m-\u003elen - m-\u003epos \u003c *len)\n+\t\t*len \u003d m-\u003elen - m-\u003epos;\n+\n+\t*flags \u003d 0;\n+\tif (!m-\u003epos)\n+\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\tmemcpy(buf, postbody + m-\u003epos, *len);\n+\n+\tm-\u003epos +\u003d *len;\n+\n+\tif (m-\u003epos \u003d\u003d m-\u003elen)\n+\t\t*flags |\u003d LWSSS_FLAG_EOM;\n+\n+\tlwsl_notice(\u0022%s: write %d flags %d\u005cn\u0022, __func__, (int)*len, (int)*flags);\n+\n+\tif (m-\u003epos !\u003d m-\u003elen)\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: h %p, %s, ord 0x%x\u005cn\u0022, __func__, m-\u003ess,\n+\t\t\tlws_ss_state_name((int)state), (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\n+\t\t/*\n+\t\t * CREATING is only coming after we have asked the upstream\n+\t\t * proxy to create the stream and it has been allowed.\n+\t\t */\n+\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022,\n+\t\t\t\t \u0022multipart/form-data;boundary\u003d\u005c\u0022boundary\u005c\u0022\u0022,\n+\t\t\t\t 39))\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\n+\t\t/* provide a hint about the payload size */\n+\t\tm-\u003epos \u003d 0;\n+\t\tm-\u003elen \u003d strlen(postbody);\n+\n+\t\treturn lws_ss_request_tx_len(m-\u003ess, (unsigned long)strlen(postbody));\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_QOS_ACK_REMOTE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_TIMEOUT:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_TIMEOUT\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+#endif\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\n+#endif\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\t\t\tlws_ss_info_t ssi;\n+\n+\t\t\t/* We're making an outgoing secure stream ourselves */\n+\n+\t\t\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\t\t\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\t\t\tssi.opaque_user_data_offset \u003d offsetof(myss_t,\n+\t\t\t\t\t\t\t opaque_data);\n+\t\t\tssi.rx \u003d myss_rx;\n+\t\t\tssi.tx \u003d myss_tx;\n+\t\t\tssi.state \u003d myss_state;\n+\t\t\tssi.user_alloc \u003d sizeof(myss_t);\n+\t\t\tssi.streamtype \u003d \u0022minpost\u0022;\n+\n+\t\t\tif (lws_ss_create(context, 0, \u0026ssi, NULL, NULL,\n+\t\t\t\t\t NULL, NULL)) {\n+\t\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\t/* these options are mutually exclusive if given */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-portal\u0022))\n+\t\tforce_cpd_fail_portal \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-no-internet\u0022))\n+\t\tforce_cpd_fail_no_internet \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--timeout_ms\u0022)))\n+\t\ttimeout_ms \u003d (unsigned int)atoi(p);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\t/*\n+\t * If we're being a proxied client, the proxy does all this\n+\t */\n+\n+\t/*\n+\t * Set the related lws_system blobs\n+\t *\n+\t * ...direct_set() sets a pointer, so the thing pointed to has to have\n+\t * a suitable lifetime, eg, something that already exists on the heap or\n+\t * a const string in .rodata like this\n+\t */\n+\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_SERIAL, 0),\n+\t\t\t\t (const uint8_t *)\u0022SN12345678\u0022, 10);\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_FW_VERSION, 0),\n+\t\t\t\t (const uint8_t *)\u0022v0.01\u0022, 5);\n+\n+\t/*\n+\t * ..._heap_append() appends to a buflist kind of arrangement on heap,\n+\t * just one block is fine, otherwise it will concatenate the fragments\n+\t * in the order they were appended (and take care of freeing them at\n+\t * context destroy time). ..._heap_empty() is also available to remove\n+\t * everything that was already allocated.\n+\t *\n+\t * Here we use _heap_append() just so it's tested as well as direct set.\n+\t */\n+\n+\tlws_system_blob_heap_append(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_TYPE, 0),\n+\t\t\t\t (const uint8_t *)\u0022spacerocket\u0022, 11);\n+#endif\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/CMakeLists.txt\nnew file mode 100644\nindex 0000000..0d0f548\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/CMakeLists.txt\n@@ -0,0 +1,28 @@\n+project(lws-minimal-secure-streams-proxy C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-proxy)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/README.md\nnew file mode 100644\nindex 0000000..ab5cbcb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/README.md\n@@ -0,0 +1,33 @@\n+# lws minimal secure streams proxy\n+\n+Operates as a secure streams proxy, by default on a listening unix domain socket\n+\u0022proxy.ss.lws\u0022 in the Linux abstract namespace.\n+\n+Give -p \u003cport\u003e to have it listen on a specific tcp port instead.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-f| Force connecting to the wrong endpoint to check backoff retry flow\n+-p \u003cport\u003e|If not given, proxy listens on a Unix Domain Socket, if given listen on specified tcp port\n+-i \u003ciface\u003e|Optionally specify the UDS path (no -p) or network interface to bind to (if -p also given)\n+\n+```\n+[2020/02/26 15:41:27:5768] U: LWS secure streams Proxy [-d\u003cverb\u003e]\n+[2020/02/26 15:41:27:5770] N: lws_ss_policy_set: 2.064KiB, pad 70%: hardcoded\n+[2020/02/26 15:41:27:5771] N: lws_tls_client_create_vhost_context: using mem client CA cert 1391\n+[2020/02/26 15:41:27:8681] N: lws_ss_policy_set: 4.512KiB, pad 15%: updated\n+[2020/02/26 15:41:27:8682] N: lws_tls_client_create_vhost_context: using mem client CA cert 837\n+[2020/02/26 15:41:27:8683] N: lws_tls_client_create_vhost_context: using mem client CA cert 1043\n+[2020/02/26 15:41:27:8684] N: lws_tls_client_create_vhost_context: using mem client CA cert 1167\n+[2020/02/26 15:41:27:8684] N: lws_tls_client_create_vhost_context: using mem client CA cert 1391\n+[2020/02/26 15:41:28:4226] N: ss_api_amazon_auth_rx: acquired 567-byte api.amazon.com auth token, exp 3600s\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/main.c\nnew file mode 100644\nindex 0000000..0e1fbb5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/main.c\n@@ -0,0 +1,320 @@\n+/*\n+ * lws-minimal-secure-streams-proxy\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This is the proxy part for examples built to use it to connect to... it has\n+ * the policy and the core SS function, but it doesn't contain any of the user\n+ * code \u0022business logic\u0022... that's in the clients.\n+ *\n+ * The proxy side has the policy and performs the onward connection proxying\n+ * fulfilment. The clients state the streamtype name they want and ask for the\n+ * client to do the connection part.\n+ *\n+ * Rideshare information is being parsed out at the proxy side; the SSS RX part\n+ * also brings with it rideshare names.\n+ *\n+ * Metadata is passed back over SSS from the client in the TX messages for the\n+ * proxy to use per the policy.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#if defined(__APPLE__) || defined(__linux__)\n+#include \u003cexecinfo.h\u003e\n+#include \u003cassert.h\u003e\n+#endif\n+\n+static int interrupted, bad \u003d 1, port \u003d 0 /* unix domain socket */;\n+static const char *ibind \u003d NULL; /* default to unix domain skt \u0022proxy.ss.lws\u0022 */\n+static lws_state_notify_link_t nl;\n+static struct lws_context *context;\n+\n+/*\n+ * We just define enough policy so it can fetch the latest one securely\n+ */\n+\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+\t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\t\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\t\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\t\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\t\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\t\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\t\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\t\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\t\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\t\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\t\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\t\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\t\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\t\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\t\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\t\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\t\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\t\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\t\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\t\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\t\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\t\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\t\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\t\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\t\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\t\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\t\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\t\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\t\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [{\u0022\n+\t\t\u0022\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+\t\t\u0022},\u0022\n+\t\t\u0022\u005c\u0022fetch_policy\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-v4.2-v2.json\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}}\u0022\n+\t\u0022}\u0022\n+;\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)\n+static char *aws_keyid \u003d NULL,\n+\t *aws_key \u003d NULL;\n+#endif\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)\n+\n+\t\t\tif (lws_aws_filesystem_credentials_helper(\n+\t\t\t\t\t\t \u0022~/.aws/credentials\u0022,\n+\t\t\t\t\t\t \u0022aws_access_key_id\u0022,\n+\t\t\t\t\t\t \u0022aws_secret_access_key\u0022,\n+\t\t\t\t\t\t \u0026aws_keyid, \u0026aws_key))\n+\t\t\t\treturn -1;\n+\n+\t\t\tlws_ss_sigv4_set_aws_key(context, 0, aws_keyid, aws_key);\n+#endif\n+\t\t\t/*\n+\t\t\t * At this point we have DHCP, ntp, system auth token\n+\t\t\t * and we can reasonably create the proxy\n+\t\t\t */\n+\t\t\tif (lws_ss_proxy_create(context, ibind, port)) {\n+\t\t\t\tlwsl_err(\u0022%s: failed to create ss proxy\u005cn\u0022,\n+\t\t\t\t\t\t__func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t\tbreak;\n+\tcase LWS_SYSTATE_POLICY_INVALID:\n+\t\t/*\n+\t\t * This is a NOP since we used direct set... but in a real\n+\t\t * system this could easily change to be done on the heap, then\n+\t\t * this would be important\n+\t\t */\n+\t\tlws_system_blob_destroy(lws_system_get_blob(context,\n+\t\t\t\t\tLWS_SYSBLOB_TYPE_AUTH,\n+\t\t\t\t\t1 /* AUTH_IDX_ROOT */));\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\n+static int\n+my_metric_report(lws_metric_pub_t *mp)\n+{\n+\tlws_metric_bucket_t *sub \u003d mp-\u003eu.hist.head;\n+\tchar buf[192];\n+\n+\tdo {\n+\t\tif (lws_metrics_format(mp, \u0026sub, buf, sizeof(buf)))\n+\t\t\tlwsl_user(\u0022%s: %s\u005cn\u0022, __func__, buf);\n+\t} while ((mp-\u003eflags \u0026 LWSMTFL_REPORT_HIST) \u0026\u0026 sub);\n+\n+\t/* 0 \u003d leave metric to accumulate, 1 \u003d reset the metric */\n+\n+\treturn 1;\n+}\n+\n+static const lws_system_ops_t system_ops \u003d {\n+\t.metric_report \u003d my_metric_report,\n+};\n+\n+#endif\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\tinterrupted \u003d 1;\n+\tlws_cancel_service(context);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\t/* connect to ssproxy via UDS by default, else via tcp with this port */\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\tport \u003d atoi(p);\n+\n+\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket path;\n+\t * when -p given this can specify the network interface to bind to */\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\tibind \u003d p;\n+\n+\tlwsl_user(\u0022LWS secure streams Proxy [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.fd_limit_per_thread \u003d 1 + 26 + 1;\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\n+\t/* integrate us with lws system state management when context created */\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\tinfo.pt_serv_buf_size \u003d (unsigned int)((6144 * 2) + 2048);\n+\tinfo.max_http_header_data \u003d (unsigned short)(6144 + 2048);\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\tinfo.system_ops \u003d \u0026system_ops;\n+\tinfo.metrics_prefix \u003d \u0022ssproxy\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\tdo {\n+\t\tn \u003d lws_service(context, 0);\n+\t} while (n \u003e\u003d 0 \u0026\u0026 !interrupted);\n+\n+\tbad \u003d 0;\n+\n+#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)\n+\tif (aws_keyid)\n+\t\tfree(aws_keyid);\n+\tif (aws_key)\n+\t\tfree(aws_key);\n+#endif\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/CMakeLists.txt\nnew file mode 100644\nindex 0000000..47317ba\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/CMakeLists.txt\n@@ -0,0 +1,27 @@\n+project(lws-minimal-secure-streams-seq C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-seq)\n+set(SRCS minimal-secure-streams.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SEQUENCER 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/README.md\nnew file mode 100644\nindex 0000000..6af2e25\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/README.md\n@@ -0,0 +1,65 @@\n+# lws minimal sequre streams seq\n+\n+The application goes to https://warmcat.com and reads index.html there.\n+\n+It does it using Secure Streams... the main code in minimal-secure-streams.c\n+just sets up the context and opens a secure stream of type \u0022mintest\u0022.\n+\n+The handler for state changes and payloads for \u0022mintest\u0022 is in ss-myss.c\n+\n+The information about how a \u0022mintest\u0022 stream should connect and the\n+protocol it uses is kept separated in policy-database.c\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-f| Force connecting to the wrong endpoint to check backoff retry flow\n+\n+```\n+ $ ./lws-minimal-secure-streams-seq\n+[2018/03/04 14:43:20:8562] USER: LWS minimal http client\n+[2018/03/04 14:43:20:8571] NOTICE: Creating Vhost 'default' port -1, 1 protocols, IPv6 on\n+[2018/03/04 14:43:20:8616] NOTICE: created client ssl context for default\n+[2018/03/04 14:43:20:8617] NOTICE: lws_client_connect_2: 0x1814dc0: address warmcat.com\n+[2018/03/04 14:43:21:1496] NOTICE: lws_client_connect_2: 0x1814dc0: address warmcat.com\n+[2018/03/04 14:43:22:0154] NOTICE: lws_client_interpret_server_handshake: incoming content length 26520\n+[2018/03/04 14:43:22:0154] NOTICE: lws_client_interpret_server_handshake: client connection up\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n+[2018/03/04 14:43:22:3022] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+[2018/03/04 14:43:22:3022] USER: RECEIVE_CLIENT_HTTP_READ: read 974\n+[2018/03/04 14:43:22:3022] NOTICE: lws_http_client_read: transaction completed says -1\n+[2018/03/04 14:43:23:3042] USER: Completed\n+```\n+\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..0e21efb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c\n@@ -0,0 +1,410 @@\n+/*\n+ * lws-minimal-secure-streams-seq\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates the a minimal http client using secure streams api.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there.\n+ *\n+ * This is the \u0022secure streams\u0022 api equivalent of minimal-http-client...\n+ * it shows how to use a sequencer to make it easy to build more complex\n+ * schemes on top of this example.\n+ *\n+ * The layering looks like this\n+ *\n+ * lifetime\n+ *\n+ * ------ app ------ process\n+ * ---- sequencer ---- process\n+ * --- secure stream --- process\n+ * ------- wsi ------- connection\n+ *\n+ * see minimal-secure-streams for a similar example without the sequencer.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, flag_conn_fail, flag_h1post;\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u0022300,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u0022310\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Need to be in order from root cert... notice sometimes as\n+\t\t * with Let's Encrypt there are multiple possible validation\n+\t\t * paths, all the pieces for one validation path must be\n+\t\t * given, excluding the server cert itself. Let's Encrypt\n+\t\t * intermediate is signed by their ISRG Root CA but also is\n+\t\t * cross-signed by an IdenTrust intermediate that's widely\n+\t\t * deployed in browsers. We use the ISRG path because that\n+\t\t * way we can skip the extra IdenTrust root cert.\n+\t\t */\n+\t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\t\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\t\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\t\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\t\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\t\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\t\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\t\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\t\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\t\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\t\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\t\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\t\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\t\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\t\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\t\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\t\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\t\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\t\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\t\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\t\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\t\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\t\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\t\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\t\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\t\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\t\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\t\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\t\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t\t \u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022 /* the supported stream types */\n+\t\t\u0022{\u005c\u0022mintest\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022index.html\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022plugins\u005c\u0022:\u0022\t\t\u0022[],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t\u0022{\u005c\u0022mintest-fail\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u002222,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022index.html\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022plugins\u005c\u0022:\u0022\t\t\u0022[],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\t\u0022{\u005c\u0022minpost\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022testserver/formtest\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022plugins\u005c\u0022:\u0022\t\t\u0022[],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022]\u0022\n+\t\u0022}\u0022\n+;\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+} myss_t;\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+//\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, we let the sequencer know it\n+\t * was a success\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t// myss_t *m \u003d (myss_t *)userobj;\n+\n+\t/* in this example, we don't send any payload */\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t\tlws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name(state),\n+\t\t (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+typedef enum {\n+\tSEQ_IDLE,\n+\tSEQ_TRY_CONNECT,\n+\tSEQ_RECONNECT_WAIT,\n+\tSEQ_CONNECTED,\n+} myseq_state_t;\n+\n+typedef struct myseq {\n+\tstruct lws_ss_handle\t*ss;\n+\n+\tmyseq_state_t\t\tstate;\n+\tint\t\t\thttp_resp;\n+\n+\tuint16_t\t\ttry;\n+} myseq_t;\n+\n+/*\n+ * This defines the sequence of things the test app does.\n+ */\n+\n+static lws_seq_cb_return_t\n+min_sec_str_sequencer_cb(struct lws_sequencer *seq, void *user, int event,\n+\t\t\t void *v, void *a)\n+{\n+\tstruct myseq *s \u003d (struct myseq *)user;\n+\tlws_ss_info_t ssi;\n+\n+\tswitch ((int)event) {\n+\n+\t/* these messages are created just by virtue of being a sequencer */\n+\n+\tcase LWSSEQ_CREATED: /* our sequencer just got started */\n+\t\ts-\u003estate \u003d SEQ_IDLE;\n+\t\tlwsl_notice(\u0022%s: LWSSEQ_CREATED\u005cn\u0022, __func__);\n+\n+\t\t/* We're making an outgoing secure stream ourselves */\n+\n+\t\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\t\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\t\tssi.opaque_user_data_offset \u003d offsetof(myss_t, opaque_data);\n+\t\tssi.rx \u003d myss_rx;\n+\t\tssi.tx \u003d myss_tx;\n+\t\tssi.state \u003d myss_state;\n+\t\tssi.user_alloc \u003d sizeof(myss_t);\n+\n+\t\t/* requested to fail (to check backoff)? */\n+\t\tif (flag_conn_fail)\n+\t\t\tssi.streamtype \u003d \u0022mintest-fail\u0022;\n+\t\telse\n+\t\t\t/* request to check h1 POST */\n+\t\t\tif (flag_h1post)\n+\t\t\t\tssi.streamtype \u003d \u0022minpost\u0022;\n+\t\t\telse\n+\t\t\t\t/* default to h1 GET */\n+\t\t\t\tssi.streamtype \u003d \u0022mintest\u0022;\n+\n+\t\tif (lws_ss_create(lws_seq_get_context(seq), 0, \u0026ssi, NULL,\n+\t\t\t\t \u0026s-\u003ess, seq, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\n+\t\t\treturn LWSSEQ_RET_DESTROY;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWSSEQ_DESTROYED:\n+\t\tlwsl_notice(\u0022%s: LWSSEQ_DESTROYED\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWSSEQ_TIMED_OUT: /* current step timed out */\n+\t\tif (s-\u003estate \u003d\u003d SEQ_RECONNECT_WAIT)\n+\t\t\treturn lws_ss_request_tx(s-\u003ess);\n+\t\tbreak;\n+\n+\t/*\n+\t * These messages are created because we have a secure stream that was\n+\t * bound to this sequencer at creation time. It copies its state\n+\t * events to us as its sequencer parent. v is the lws_ss_handle_t *\n+\t */\n+\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_CREATING:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_CREATING\u005cn\u0022, __func__);\n+\t\treturn lws_ss_request_tx(s-\u003ess);\n+\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_DISCONNECTED:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_DISCONNECTED\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_UNREACHABLE:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_UNREACHABLE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_AUTH_FAILED:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_AUTH_FAILED\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_CONNECTED:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_CONNECTED\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_CONNECTING:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_CONNECTING\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_DESTROYING:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_DESTROYING\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_POLL:\n+\t\t/* somebody called lws_ss_poll() on the stream */\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_POLL\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_ALL_RETRIES_FAILED:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_ALL_RETRIES_FAILED\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_QOS_ACK_REMOTE:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_QOS_ACK_REMOTE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tcase LWSSEQ_SS_STATE_BASE + LWSSSCS_QOS_ACK_LOCAL:\n+\t\tlwsl_info(\u0022%s: seq LWSSSCS_QOS_ACK_LOCAL\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\t/*\n+\t * This is the message we send from the ss handler to inform the\n+\t * sequencer we had the payload properly\n+\t */\n+\n+\tcase LWSSEQ_USER_BASE:\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSEQ_RET_CONTINUE;\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tlws_seq_info_t i;\n+\tconst char *p;\n+\tmyseq_t *ms;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal secure streams [-d\u003cverbosity\u003e][-f][--h1post]\u005cn\u0022);\n+\n+\tflag_conn_fail \u003d !!lws_cmdline_option(argc, argv, \u0022-f\u0022);\n+\tflag_h1post \u003d !!lws_cmdline_option(argc, argv, \u0022--h1post\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/*\n+\t * Create the sequencer that performs the steps of the test action\n+\t * from inside the event loop.\n+\t */\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\ti.context\t\u003d context;\n+\ti.user_size\t\u003d sizeof(myseq_t);\n+\ti.puser\t\t\u003d (void **)\u0026ms;\n+\ti.cb\t\t\u003d min_sec_str_sequencer_cb;\n+\ti.name\t\t\u003d \u0022min-sec-stream-seq\u0022;\n+\n+\tif (!lws_seq_create(\u0026i)) {\n+\t\tlwsl_err(\u0022%s: failed to create sequencer\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+bail:\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/CMakeLists.txt\nnew file mode 100644\nindex 0000000..205f502\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/CMakeLists.txt\n@@ -0,0 +1,27 @@\n+project(lws-minimal-secure-streams-server-raw C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-server-raw)\n+set(SRCS main.c ss-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_SYS_SMD 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/README.md\nnew file mode 100644\nindex 0000000..9580c4e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/README.md\n@@ -0,0 +1,54 @@\n+# lws minimal secure streams server raw\n+\n+The application sets up a raw tcp server on localhost:7681\n+\n+It does it using Secure Streams... information about how the server should\n+operate is held in JSON policy in main.c\n+\n+Connecting to the server using `echo \u0022hello\u0022 | nc --no-shutdown 127.0.0.1 7681`\n+will send \u0022hello\u0022 which is hexdumped to console by the rx function, then\n+will receive an incrementing message at 100ms intervals.\n+\n+Note there are two incomaptible versions of netcat around, this is from Fedora's\n+nmap-ncat, the --no-shutdown is needed to stop it hanging up itself after it\n+has sent its stdin.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+[2020/07/28 10:25:54:6747] U: LWS Secure Streams Server Raw\n+[2020/07/28 10:25:54:7194] N: LWS: 4.0.99-v4.0.0-247-g58be599aa, loglevel 1031\n+[2020/07/28 10:25:54:7198] N: NET CLI SRV H1 H2 WS MQTT SS-JSON-POL SSPROX ASYNC_DNS IPv6-absent\n+[2020/07/28 10:25:54:9376] N: lws_adopt_descriptor_vhost2: wsi 0x5317d30, vhost system ss_handle (nil)\n+[2020/07/28 10:25:54:9442] N: lws_adopt_descriptor_vhost2: wsi 0x53182c0, vhost system ss_handle (nil)\n+[2020/07/28 10:25:54:9920] N: smd_cb: creating server stream\n+[2020/07/28 10:25:54:9963] N: lws_ss_create: created server myrawserver\n+[2020/07/28 10:26:00:1065] N: secstream_raw: RAW_ADOPT\n+[2020/07/28 10:26:00:1068] N: lws_adopt_descriptor_vhost2: wsi 0x531a6b0, vhost myrawserver ss_handle 0x5319ac0\n+[2020/07/28 10:26:00:1088] U: myss_raw_state: 0x531aad0 LWSSSCS_CREATING, ord 0x0\n+[2020/07/28 10:26:00:1094] U: myss_raw_state: 0x531aad0 LWSSSCS_CONNECTING, ord 0x0\n+[2020/07/28 10:26:00:1096] U: myss_raw_state: 0x531aad0 LWSSSCS_CONNECTED, ord 0x0\n+[2020/07/28 10:26:00:1172] U: myss_raw_rx: len 6, flags: 0\n+[2020/07/28 10:26:02:8516] U: myss_raw_state: 0x531aad0 LWSSSCS_DISCONNECTED, ord 0x0\n+[2020/07/28 10:26:02:8545] U: myss_raw_state: 0x531aad0 LWSSSCS_DESTROYING, ord 0x0\n+^C[2020/07/28 10:26:04:9608] U: myss_raw_state: 0x5319ac0 LWSSSCS_DESTROYING, ord 0x0\n+[2020/07/28 10:26:04:9723] U: Completed: OK\n+```\n+\n+```\n+$ echo \u0022hello\u0022 | nc --no-shutdown 127.0.0.1 7681\n+hello from raw 0\n+hello from raw 1\n+hello from raw 2\n+...\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/main.c\nnew file mode 100644\nindex 0000000..95c49f4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/main.c\n@@ -0,0 +1,104 @@\n+/*\n+ * lws-minimal-secure-streams-server\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+extern const lws_ss_info_t ssi_client, ssi_server;\n+\n+static struct lws_context *context;\n+int interrupted, bad \u003d 1;\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\n+\t\t/*\n+\t\t * This streamtype represents a raw server listening on :7681,\n+\t\t * without tls\n+\t\t */\n+\n+\t\t\u0022{\u005c\u0022myrawserver\u005c\u0022: {\u0022\n+\t\t\t/* if given, \u0022endpoint\u0022 is network if to bind to */\n+\t\t\t\u0022\u005c\u0022server\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u00227681,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022raw\u005c\u0022\u0022\n+\t\t\u0022}}\u0022\n+\n+\t \u0022]\u0022\n+\t\u0022}\u0022\n+;\n+\n+static int\n+smd_cb(void *opaque, lws_smd_class_t c, lws_usec_t ts, void *buf, size_t len)\n+{\n+\tif ((c \u0026 LWSSMDCL_SYSTEM_STATE) \u0026\u0026\n+\t !lws_json_simple_strcmp(buf, len, \u0022\u005c\u0022state\u005c\u0022:\u0022, \u0022OPERATIONAL\u0022)) {\n+\n+\t\t/* create the secure streams */\n+\n+\t\tlwsl_notice(\u0022%s: creating server stream\u005cn\u0022, __func__);\n+\n+\t\tif (lws_ss_create(context, 0, \u0026ssi_server, NULL, NULL,\n+\t\t\t\t NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tlwsl_user(\u0022LWS Secure Streams Server Raw\u005cn\u0022);\n+\n+\tinfo.options\t\t\t\u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t\t\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.fd_limit_per_thread\t\u003d 1 + 6 + 1;\n+\tinfo.pss_policies_json\t\t\u003d default_ss_policy;\n+\tinfo.port\t\t\t\u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.early_smd_cb\t\t\u003d smd_cb;\n+\tinfo.early_smd_class_filter\t\u003d LWSSMDCL_SYSTEM_STATE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tbad \u003d 0;\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/ss-server.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/ss-server.c\nnew file mode 100644\nindex 0000000..4d395d4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/ss-server.c\n@@ -0,0 +1,109 @@\n+/*\n+ * lws-minimal-secure-streams-server\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cassert.h\u003e\n+\n+extern int interrupted, bad;\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tint\t\t\t\tcount;\n+\tchar\t\t\t\tupgraded;\n+\n+} myss_srv_t;\n+\n+/*\n+ * This is the Secure Streams Server RX and TX\n+ */\n+\n+static lws_ss_state_return_t\n+myss_raw_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+//\tmyss_srv_t *m \u003d (myss_srv_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/* this is the callback that mediates sending the incrementing number */\n+\n+static void\n+spam_sul_cb(struct lws_sorted_usec_list *sul)\n+{\n+\tmyss_srv_t *m \u003d lws_container_of(sul, myss_srv_t, sul);\n+\n+\tif (!lws_ss_request_tx(m-\u003ess))\n+\t\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul, spam_sul_cb,\n+\t\t\t 100 * LWS_US_PER_MS);\n+}\n+\n+static lws_ss_state_return_t\n+myss_raw_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\tmyss_srv_t *m \u003d (myss_srv_t *)userobj;\n+\n+\t*flags \u003d LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;\n+\n+\t*len \u003d (unsigned int)lws_snprintf((char *)buf, *len, \u0022hello from raw %d\u005cn\u0022, m-\u003ecount++);\n+\n+\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul, spam_sul_cb,\n+\t\t\t 100 * LWS_US_PER_MS);\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_raw_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_srv_t *m \u003d (myss_srv_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %p %s, ord 0x%x\u005cn\u0022, __func__, m-\u003ess,\n+\t\t lws_ss_state_name((int)state), (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tlws_sul_cancel(\u0026m-\u003esul);\n+\t\tbreak;\n+\tcase LWSSSCS_CONNECTED:\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+const lws_ss_info_t ssi_server \u003d {\n+\t.handle_offset\t\t\t\u003d offsetof(myss_srv_t, ss),\n+\t.opaque_user_data_offset\t\u003d offsetof(myss_srv_t, opaque_data),\n+\t.streamtype\t\t\t\u003d \u0022myrawserver\u0022,\n+\t.rx\t\t\t\t\u003d myss_raw_rx,\n+\t.tx\t\t\t\t\u003d myss_raw_tx,\n+\t.state\t\t\t\t\u003d myss_raw_state,\n+\t.user_alloc\t\t\t\u003d sizeof(myss_srv_t),\n+};\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/CMakeLists.txt\nnew file mode 100644\nindex 0000000..19dff5a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/CMakeLists.txt\n@@ -0,0 +1,28 @@\n+project(lws-minimal-secure-streams-server C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-server)\n+set(SRCS main.c ss-client.c ss-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_SYS_SMD 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/README.md\nnew file mode 100644\nindex 0000000..6e98f11\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/README.md\n@@ -0,0 +1,72 @@\n+# lws minimal secure streams server\n+\n+The application sets up a tls + ws server on https://localhost:7681\n+\n+It does it using Secure Streams... information about how the server should\n+operate is held in JSON policy in main.c\n+\n+Visiting the server in a modern browser will fetch some html + JS, the JS will\n+create a ws link back to the server and the server will spam an incrementing\n+number that is displayed in the browser every 100ms.\n+\n+The app also has a SS client that works, but it's disabled by default since\n+we're interested in server.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+[2020/07/27 10:51:04:8994] U: LWS Secure Streams Server\n+[2020/07/27 10:51:04:9440] N: LWS: 4.0.99-v4.0.0-245-ge6eb4417a, loglevel 1031\n+[2020/07/27 10:51:04:9444] N: NET CLI SRV H1 H2 WS MQTT SS-JSON-POL SSPROX ASYNC_DNS IPv6-absent\n+[2020/07/27 10:51:05:1685] N: lws_adopt_descriptor_vhost2: wsi 0x5317d30, vhost system ss_handle (nil)\n+[2020/07/27 10:51:05:1753] N: lws_adopt_descriptor_vhost2: wsi 0x53182c0, vhost system ss_handle (nil)\n+[2020/07/27 10:51:05:2129] N: lws_ss_policy_parser_cb: server 'self_localhost' keep 52 0x5318cc0\n+[2020/07/27 10:51:05:2134] N: lws_ss_policy_parser_cb: server 'self_localhost_key' keep 53 0x5318cf8\n+[2020/07/27 10:51:05:2192] N: lws_ss_policy_ref_trust_store: le_via_isrg trust store initial 'isrg_root_x1'\n+[2020/07/27 10:51:05:7804] N: smd_cb: creating server stream\n+[2020/07/27 10:51:05:7851] N: Vhost 'myserver' using TLS mode\n+[2020/07/27 10:51:05:8660] N: SSL ECDH curve 'prime256v1'\n+[2020/07/27 10:51:06:1035] N: vhost myserver: cert expiry: 729599d\n+[2020/07/27 10:51:06:1039] N: lws_ss_create: created server myserver\n+[2020/07/27 10:51:11:8650] N: lws_adopt_descriptor_vhost2: wsi 0x5b046e0, vhost myserver ss_handle 0x56e2be0\n+[2020/07/27 10:51:11:8672] U: myss_srv_state: 0x5b52f60 LWSSSCS_CREATING, ord 0x0\n+[2020/07/27 10:51:11:8693] U: myss_srv_state: 0x5b52f60 LWSSSCS_CONNECTING, ord 0x0\n+[2020/07/27 10:51:11:8696] U: myss_srv_state: 0x5b52f60 LWSSSCS_CONNECTED, ord 0x0\n+[2020/07/27 10:51:11:9743] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_CREATING, ord 0x0\n+[2020/07/27 10:51:11:9747] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_CONNECTING, ord 0x0\n+[2020/07/27 10:51:11:9747] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_CONNECTED, ord 0x0\n+[2020/07/27 10:51:12:0192] U: myss_srv_state: 0x5bad0a0 LWSSSCS_CREATING, ord 0x0\n+[2020/07/27 10:51:12:0193] U: myss_srv_state: 0x5bad0a0 LWSSSCS_CONNECTING, ord 0x0\n+[2020/07/27 10:51:12:0194] U: myss_srv_state: 0x5bad0a0 LWSSSCS_CONNECTED, ord 0x0\n+[2020/07/27 10:51:12:0306] N: secstream_h1: LWS_CALLBACK_HTTP\n+[2020/07/27 10:51:12:0329] U: myss_srv_state: 0x5bad0a0 LWSSSCS_SERVER_TXN, ord 0x0\n+[2020/07/27 10:51:12:0481] N: lws_h2_ws_handshake: Server SS 0x5ba2bd0 .wsi 0x5ba27b0 switching to ws protocol\n+[2020/07/27 10:51:12:0484] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_SERVER_UPGRADE, ord 0x0\n+[2020/07/27 10:51:12:0541] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_CONNECTED, ord 0x0\n+[2020/07/27 10:51:12:1222] U: myss_srv_state: 0x5bd1100 LWSSSCS_CREATING, ord 0x0\n+[2020/07/27 10:51:12:1222] U: myss_srv_state: 0x5bd1100 LWSSSCS_CONNECTING, ord 0x0\n+[2020/07/27 10:51:12:1223] U: myss_srv_state: 0x5bd1100 LWSSSCS_CONNECTED, ord 0x0\n+[2020/07/27 10:51:12:1242] N: lws_h2_ws_handshake: Server SS 0x5bd1100 .wsi 0x5bd0ce0 switching to ws protocol\n+[2020/07/27 10:51:12:1243] U: myss_srv_state: 0x5bd1100 LWSSSCS_SERVER_UPGRADE, ord 0x0\n+[2020/07/27 10:51:12:1246] U: myss_srv_state: 0x5bd1100 LWSSSCS_CONNECTED, ord 0x0\n+^C[2020/07/27 10:51:15:2809] U: myss_srv_state: 0x5bad0a0 LWSSSCS_DISCONNECTED, ord 0x0\n+[2020/07/27 10:51:15:2838] U: myss_srv_state: 0x5bad0a0 LWSSSCS_DESTROYING, ord 0x0\n+[2020/07/27 10:51:15:2938] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_DISCONNECTED, ord 0x0\n+[2020/07/27 10:51:15:2946] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_DESTROYING, ord 0x0\n+[2020/07/27 10:51:15:2952] U: myss_srv_state: 0x5bd1100 LWSSSCS_DISCONNECTED, ord 0x0\n+[2020/07/27 10:51:15:2953] U: myss_srv_state: 0x5bd1100 LWSSSCS_DESTROYING, ord 0x0\n+[2020/07/27 10:51:15:2960] U: myss_srv_state: 0x5b52f60 LWSSSCS_DISCONNECTED, ord 0x0\n+[2020/07/27 10:51:15:2961] U: myss_srv_state: 0x5b52f60 LWSSSCS_DESTROYING, ord 0x0\n+[2020/07/27 10:51:15:3042] U: myss_srv_state: 0x56e2be0 LWSSSCS_DESTROYING, ord 0x0\n+[2020/07/27 10:51:15:3378] U: Completed: OK\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/main.c\nnew file mode 100644\nindex 0000000..167b0a2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/main.c\n@@ -0,0 +1,306 @@\n+/*\n+ * lws-minimal-secure-streams-server\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+extern const lws_ss_info_t ssi_client, ssi_server;\n+\n+static struct lws_context *context;\n+int interrupted, bad \u003d 1, multipart;\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u0022300,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u0022310\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Need to be in order from root cert... notice sometimes as\n+\t\t * with Let's Encrypt there are multiple possible validation\n+\t\t * paths, all the pieces for one validation path must be\n+\t\t * given, excluding the server cert itself. Let's Encrypt\n+\t\t * intermediate is signed by their ISRG Root CA but also is\n+\t\t * cross-signed by an IdenTrust intermediate that's widely\n+\t\t * deployed in browsers. We use the ISRG path because that\n+\t\t * way we can skip the extra IdenTrust root cert.\n+\t\t */\n+\t\t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\t\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\t\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\t\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\t\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\t\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\t\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\t\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\t\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\t\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\t\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\t\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\t\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\t\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\t\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\t\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\t\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\t\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\t\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\t\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\t\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\t\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\t\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\t\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\t\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\t\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\t\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\t\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\t\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t \u0022\u005c\u0022},\u0022\n+\t\t/*\n+\t\t * a selfsigned cert for localhost for 100 years\n+\t\t */\n+\t\t\u0022{\u005c\u0022self_localhost\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\u0022\n+\t\u0022VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\u0022\n+\t\u0022MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\u0022\n+\t\u0022HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\u0022\n+\t\u0022WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\u0022\n+\t\u0022d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\u0022\n+\t\u0022cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\u0022\n+\t\u0022aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\u0022\n+\t\u0022aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\u0022\n+\t\u0022Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\u0022\n+\t\u0022LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\u0022\n+\t\u0022KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\u0022\n+\t\u0022jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\u0022\n+\t\u0022Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\u0022\n+\t\u0022TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\u0022\n+\t\u0022Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\u0022\n+\t\u0022nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\u0022\n+\t\u0022GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\u0022\n+\t\u0022sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\u0022\n+\t\u00229mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\u0022\n+\t\u0022jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\u0022\n+\t\u0022YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\u0022\n+\t\u0022xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\u0022\n+\t\u0022wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\u0022\n+\t\u0022H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\u0022\n+\t\u0022xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\u0022\n+\t\u0022ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\u0022\n+\t\u00221WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\u0022\n+\t\u0022AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\u0022\n+\t\u0022mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\u0022\n+\t\u00228sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\u0022\n+\t\u0022e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\u0022\n+\t\t\u0022\u005c\u0022},\u0022\n+\t\t/*\n+\t\t * the private key for above\n+\t\t */\n+\t\t\u0022{\u005c\u0022self_localhost_key\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\u0022\n+\t\u0022PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\u0022\n+\t\u0022nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\u0022\n+\t\u0022toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\u0022\n+\t\u00220xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\u0022\n+\t\u0022J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\u0022\n+\t\u0022Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\u0022\n+\t\u0022uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\u0022\n+\t\u0022fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\u0022\n+\t\u0022zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\u0022\n+\t\u0022ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\u0022\n+\t\u0022QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\u0022\n+\t\u0022qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\u0022\n+\t\u0022vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\u0022\n+\t\u0022fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\u0022\n+\t\u0022Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\u0022\n+\t\u0022G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\u0022\n+\t\u0022HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\u0022\n+\t\u0022YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\u0022\n+\t\u0022xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\u0022\n+\t\u0022esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\u0022\n+\t\u0022zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\u0022\n+\t\u0022mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\u0022\n+\t\u0022au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\u0022\n+\t\u002240QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\u0022\n+\t\u0022YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\u0022\n+\t\u0022PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\u0022\n+\t\u0022W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\u0022\n+\t\u0022naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\u0022\n+\t\u00222ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\u0022\n+\t\u002239I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\u0022\n+\t\u0022J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\u0022\n+\t\u0022R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\u0022\n+\t\u0022Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\u0022\n+\t\u0022BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\u0022\n+\t\u0022fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\u0022\n+\t\u0022x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\u0022\n+\t\u0022UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\u0022\n+\t\u0022OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\u0022\n+\t\u002265uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\u0022\n+\t\u0022aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\u0022\n+\t\u0022SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\u0022\n+\t\u0022me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\u0022\n+\t\u0022G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\u0022\n+\t\u0022TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\u0022\n+\t\u002256s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\u0022\n+\t\u0022gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\u0022\n+\t\u0022Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\u0022\n+\t\u0022NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\u0022\n+\t\u0022fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t\t/*\n+\t\t * Client streamtypes\n+\t\t */\n+\n+\t\t\u0022{\u005c\u0022mintest\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022index.html\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\n+\t\t/*\n+\t\t * This streamtype represents an h2 server listening on :7681,\n+\t\t * using a 100-y self-signed tls cert\n+\t\t */\n+\n+\t\t\u0022{\u005c\u0022myserver\u005c\u0022: {\u0022\n+\t\t\t/* if given, \u0022endpoint\u0022 is network if to bind to */\n+\t\t\t\u0022\u005c\u0022server\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u00227681,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [{\u0022\n+\t\t\t\t\u0022\u005c\u0022mime\u005c\u0022: \u005c\u0022Content-Type:\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022method\u005c\u0022: \u005c\u0022\u005c\u0022,\u0022\n+\t\t\t\t\u0022\u005c\u0022path\u005c\u0022: \u005c\u0022\u005c\u0022\u0022\n+\t\t\t\u0022}],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t/*\n+\t\t\t * A ws server is an http server, if you give a\n+\t\t\t * ws_subprotocol here it's understood we also serve\n+\t\t\t * that ove ws or wss according to tls\n+\t\t\t */\n+\t\t\t\u0022\u005c\u0022ws_subprotocol\u005c\u0022:\u0022\t\u0022\u005c\u0022mywsprotocol\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022server_cert\u005c\u0022:\u0022\t\u0022\u005c\u0022self_localhost\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022server_key\u005c\u0022:\u0022\t\u0022\u005c\u0022self_localhost_key\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\n+\t \u0022]\u0022\n+\t\u0022}\u0022\n+;\n+\n+static int\n+smd_cb(void *opaque, lws_smd_class_t c, lws_usec_t ts, void *buf, size_t len)\n+{\n+\tif ((c \u0026 LWSSMDCL_SYSTEM_STATE) \u0026\u0026\n+\t !lws_json_simple_strcmp(buf, len, \u0022\u005c\u0022state\u005c\u0022:\u0022, \u0022OPERATIONAL\u0022)) {\n+\n+\t\t/* create the secure streams */\n+\n+\t\tlwsl_notice(\u0022%s: creating server stream\u005cn\u0022, __func__);\n+\n+\t\tif (lws_ss_create(context, 0, \u0026ssi_server, NULL, NULL,\n+\t\t\t\t NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\t\tbad \u003d 1;\n+\t\t\tinterrupted \u003d 1;\n+\t\t\tlws_cancel_service(context);\n+\t\t\treturn -1;\n+\t\t}\n+#if 0\n+\t\tlwsl_notice(\u0022%s: creating client stream\u005cn\u0022, __func__);\n+\n+\t\tif (lws_ss_create(context, 0, \u0026ssi_client, NULL, NULL,\n+\t\t\t\t NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\t\treturn -1;\n+\t\t}\n+#endif\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-m\u0022))\n+\t\tmultipart \u003d 1;\n+\n+\tlwsl_user(\u0022LWS Secure Streams Server\u005cn\u0022);\n+\n+\tinfo.options\t\t\t\u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t\t\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.fd_limit_per_thread\t\u003d 1 + 6 + 1;\n+\tinfo.pss_policies_json\t\t\u003d default_ss_policy;\n+\tinfo.port\t\t\t\u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.early_smd_cb\t\t\u003d smd_cb;\n+\tinfo.early_smd_class_filter\t\u003d LWSSMDCL_SYSTEM_STATE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tbad \u003d 0;\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-client.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-client.c\nnew file mode 100644\nindex 0000000..58c0fd9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-client.c\n@@ -0,0 +1,86 @@\n+/*\n+ * lws-minimal-secure-streams-server\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+\n+extern int interrupted, bad;\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\tsul;\n+\n+\tint\t\t\tcount;\n+} myss_t;\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+//\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t//myss_t *m \u003d (myss_t *)userobj;\n+\n+\treturn LWSSSSRET_TX_DONT_SEND; /* don't want to write */\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %p %s, ord 0x%x\u005cn\u0022, __func__, m-\u003ess,\n+\t\t lws_ss_state_name((int)state), (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\t\tbreak;\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+const lws_ss_info_t ssi_client \u003d {\n+\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n+\t.streamtype\t\t\t\u003d \u0022mintest\u0022,\n+\t.rx\t\t\t\t\u003d myss_rx,\n+\t.tx\t\t\t\t\u003d myss_tx,\n+\t.state\t\t\t\t\u003d myss_state,\n+\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n+};\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-server.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-server.c\nnew file mode 100644\nindex 0000000..1b04545\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-server.c\n@@ -0,0 +1,235 @@\n+/*\n+ * lws-minimal-secure-streams-server\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cassert.h\u003e\n+\n+extern int interrupted, bad, multipart;\n+\n+static const char *html \u003d\n+\t\t/* normally we serve this... */\n+\t\u0022\u003chead\u003e\u003cmeta content\u003d\u005c\u0022text/html;charset\u003dutf-8\u005c\u0022 \u0022\n+\t\t\t\u0022http-equiv\u003d\u005c\u0022Content-Type\u005c\u0022\u003e\u003cscript\u003e\u0022\n+\t\u0022 var ws \u003d new WebSocket(\u005c\u0022wss://localhost:7681\u005c\u0022, \u005c\u0022mywsprotocol\u005c\u0022);\u0022\n+\t\u0022try { ws.onopen \u003d function() { console.log(\u005c\u0022open\u005c\u0022); }; \u0022\n+\t\t\u0022ws.onmessage \u003d function got_packet(msg) { \u0022\n+\t\t \u0022var s\u003d\u005c\u0022\u005c\u0022; s +\u003d msg.data; \u0022\n+\t\t \u0022document.getElementById(\u005c\u0022wsd\u005c\u0022).innerHTML \u003d s; };\u0022\n+\t\t\u0022} catch(exception) {\u0022\n+\t\t\u0022alert(\u005c\u0022\u003cp\u003eError\u005c\u0022 + exception); }\u0022\n+\t\u0022\u003c/script\u003e\u003c/head\u003e\u003chtml\u003e\u003cbody\u003e\u0022\n+\t \u0022Hello from the web server\u003cbr\u003e\u0022\n+\t \u0022\u003cdiv id\u003d\u005c\u0022wsd\u005c\u0022\u003e\u003c/div\u003e\u0022\n+\t\u0022\u003c/body\u003e\u003c/html\u003e\u0022,\n+\n+*multipart_html \u003d\n+\t/*\n+\t * If you use -m commandline switch we send this instead, as\n+\t * multipart/form-data\n+\t */\n+\t\u0022--aBoundaryString\u005cr\u005cn\u0022\n+\t\u0022Content-Disposition: form-data; name\u003d\u005c\u0022myFile\u005c\u0022; filename\u003d\u005c\u0022xxx.txt\u005c\u0022\u005cr\u005cn\u0022\n+\t\u0022Content-Type: text/plain\u005cr\u005cn\u0022\n+\t\u0022\u005cr\u005cn\u0022\n+\t\u0022The file contents\u005cr\u005cn\u0022\n+\t\u0022--aBoundaryString\u005cr\u005cn\u0022\n+\t\u0022Content-Disposition: form-data; name\u003d\u005c\u0022myField\u005c\u0022\u005cr\u005cn\u0022\n+\t\u0022\u005cr\u005cn\u0022\n+\t\u0022(data)\u005cr\u005cn\u0022\n+\t\u0022--aBoundaryString--\u005cr\u005cn\u0022;\n+\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tint\t\t\t\tcount;\n+\tchar\t\t\t\tupgraded;\n+\n+} myss_srv_t;\n+\n+/*\n+ * This is the Secure Streams Server RX and TX for HTTP(S)\n+ */\n+\n+static lws_ss_state_return_t\n+myss_srv_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+//\tmyss_srv_t *m \u003d (myss_srv_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_srv_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\tmyss_srv_t *m \u003d (myss_srv_t *)userobj;\n+\tconst char *send \u003d html;\n+\n+\tif (m-\u003eupgraded)\n+\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+\tif (multipart)\n+\t\tsend \u003d multipart_html;\n+\n+\t*flags \u003d LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;\n+\n+\tlws_strncpy((char *)buf, send, *len);\n+\t*len \u003d strlen(send);\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * This is the Secure Streams Server RX and TX for WS(S)... when we get a\n+ * state that the underlying connection upgraded protocol, we switch the stream\n+ * rx and tx handlers to here.\n+ */\n+\n+static lws_ss_state_return_t\n+myss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+//\tmyss_srv_t *m \u003d (myss_srv_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/* this is the callback that mediates sending the incrementing number */\n+\n+static void\n+spam_sul_cb(struct lws_sorted_usec_list *sul)\n+{\n+\tmyss_srv_t *m \u003d lws_container_of(sul, myss_srv_t, sul);\n+\n+\tif (!lws_ss_request_tx(m-\u003ess))\n+\t\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul, spam_sul_cb,\n+\t\t\t 100 * LWS_US_PER_MS);\n+}\n+\n+static lws_ss_state_return_t\n+myss_ws_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\tmyss_srv_t *m \u003d (myss_srv_t *)userobj;\n+\n+\t*flags \u003d LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;\n+\n+\t*len \u003d (unsigned int)lws_snprintf((char *)buf, *len, \u0022hello from ws %d\u0022, m-\u003ecount++);\n+\n+\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul, spam_sul_cb,\n+\t\t\t 100 * LWS_US_PER_MS);\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_srv_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_srv_t *m \u003d (myss_srv_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %p %s, ord 0x%x\u005cn\u0022, __func__, m-\u003ess,\n+\t\t lws_ss_state_name((int)state), (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tlws_sul_cancel(\u0026m-\u003esul);\n+\t\tbreak;\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_SERVER_TXN:\n+\t\t/*\n+\t\t * The underlying protocol started a transaction, let's\n+\t\t * describe how we want to complete it. We can defer this until\n+\t\t * later, eg, after we have consumed any rx that's coming with\n+\t\t * the client's transaction initiation phase, but in this\n+\t\t * example we know what we want to do already.\n+\t\t *\n+\t\t * We do want to ack the transaction...\n+\t\t */\n+\t\tlws_ss_server_ack(m-\u003ess, 0);\n+\t\t/*\n+\t\t * ... it's going to be either text/html or multipart ...\n+\t\t */\n+\t\tif (multipart) {\n+\t\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022mime\u0022,\n+\t\t\t \u0022multipart/form-data; boundary\u003daBoundaryString\u0022, 45))\n+\t\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\t} else\n+\t\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022mime\u0022, \u0022text/html\u0022, 9))\n+\t\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\t/*\n+\t\t * ...it's going to be whatever size it is (and request tx)\n+\t\t */\n+\t\treturn lws_ss_request_tx_len(m-\u003ess, (unsigned long)\n+\t\t\t\t(multipart ? strlen(multipart_html) :\n+\t\t\t\t\t\t\t strlen(html)));\n+\n+\tcase LWSSSCS_SERVER_UPGRADE:\n+\n+\t\t/*\n+\t\t * This is sent when the underlying protocol has experienced\n+\t\t * an upgrade, eg, http-\u003ews... it's a one-way upgrade on this\n+\t\t * stream, change the handlers to deal with the kind of\n+\t\t * messages we send on ws\n+\t\t */\n+\n+\t\tm-\u003eupgraded \u003d 1;\n+\t\tlws_ss_change_handlers(m-\u003ess, myss_ws_rx, myss_ws_tx, NULL);\n+\t\treturn lws_ss_request_tx(m-\u003ess); /* we want to start sending numbers */\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+const lws_ss_info_t ssi_server \u003d {\n+\t.handle_offset\t\t\t\u003d offsetof(myss_srv_t, ss),\n+\t.opaque_user_data_offset\t\u003d offsetof(myss_srv_t, opaque_data),\n+\t.streamtype\t\t\t\u003d \u0022myserver\u0022,\n+\t.rx\t\t\t\t\u003d myss_srv_rx,\n+\t.tx\t\t\t\t\u003d myss_srv_tx,\n+\t.state\t\t\t\t\u003d myss_srv_state,\n+\t.user_alloc\t\t\t\u003d sizeof(myss_srv_t),\n+};\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt\nnew file mode 100644\nindex 0000000..7a76fe8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt\n@@ -0,0 +1,102 @@\n+project(lws-minimal-secure-streams-sigv4 C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-sigv4)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ss-s3-main.c ss-s3-ss.c)\n+\t\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32 AND 0)\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME ss-sigv4 COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-sigv4\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME ss-sigv4 COMMAND lws-minimal-secure-streams-sigv4)\n+\t\tendif()\n+\n+\t\tset_tests_properties(ss-sigv4\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4\n+\t\t\t\t TIMEOUT 20)\n+\n+\t\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-sspsigv4-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-sspsigv4-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_ssproxysigv4 COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tssproxysigv4 $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_ssproxysigv4 PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssproxysigv4 TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_ssproxysigv4 COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tssproxysigv4 $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_ssproxysigv4 PROPERTIES FIXTURES_CLEANUP ssproxysigv4)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\t\tadd_test(NAME sspc-sigv4 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-sigv4-client\u003e -i +${CTEST_SOCKET_PATH})\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME sspc-sigv4 COMMAND lws-minimal-secure-streams-sigv4-client -i +${CTEST_SOCKET_PATH})\n+\t\t\tendif()\n+\t\t\tset_tests_properties(sspc-sigv4 PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4\n+\t\t\t\tFIXTURES_REQUIRED \u0022ssproxysigv4\u0022\n+\t\t\t\tTIMEOUT 40)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared)\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets)\n+\tendif()\n+\n+\tif (LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client ss-s3-main.c ss-s3-ss.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared)\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets)\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/README.md\nnew file mode 100644\nindex 0000000..15b1051\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/README.md\n@@ -0,0 +1,46 @@\n+# lws minimal secure streams sigv4\n+\n+The application put a test file to AWS S3, using sigv4 auth.\n+\n+It does it using Secure Streams... the streamtype is \u0022s3PutObj\u0022, along with main\n+are in ss-s3-main.c\n+\n+The handler for state changes and payloads for \u0022s3PutObj\u0022 is in ss-s3-ss.c\n+\n+\n+## metadata\n+ \u0022aws_region\u0022 and \u0022aws_service\u0022 are configured through metadata. Also, at least\n+ \u0022x-amz-content-sha256:\u0022 and \u0022\u0022x-amz-date:\u0022 headers need to be in metadata.\n+\n+\n+## credentials\n+credentials are read from ~/.aws/credentials, make sure you have valid keyid and\n+key. One need to call lws_ss_sigv4_set_aws_key() to plug in aws credentials into\n+Secure Streams and the index need to be match of the \u0022blob_index\u0022 in entry of \u0022auth\u0022\n+the policy. In addition, you need to change the S3 bucket name to your own, as\n+bucket name is unique globally in S3.\n+\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+\n+```\n+[2020/12/19 15:25:06:9763] U: LWS minimal secure streams sigv4\n+[2020/12/19 15:25:07:0768] U: ss_s3_state: LWSSSCS_CREATING, ord 0x0\n+[2020/12/19 15:25:07:0769] U: ss_s3_state: LWSSSCS_POLL, ord 0x0\n+[2020/12/19 15:25:07:0770] U: ss_s3_state: LWSSSCS_CONNECTING, ord 0x0\n+[2020/12/19 15:25:07:2317] U: SS / TX Payload\n+[2020/12/19 15:25:07:2317] U: SS / TX Payload Total \u003d 1024, Pos \u003d 0\n+[2020/12/19 15:25:07:3267] U: ss_s3_state: LWSSSCS_CONNECTED, ord 0x0\n+[2020/12/19 15:25:07:3267] U: ss_s3_state: LWSSSCS_QOS_ACK_REMOTE, ord 0x0\n+[2020/12/19 15:25:07:3267] U: ss_s3_state: LWSSSCS_DISCONNECTED, ord 0x0\n+[2020/12/19 15:25:07:3268] U: ss_s3_state: LWSSSCS_DESTROYING, ord 0x0\n+[2020/12/19 15:25:07:3269] U: Completed: OK\n+\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/policy.json\nnew file mode 100644\nindex 0000000..6e44685\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/policy.json\n@@ -0,0 +1 @@\n+{\u0022release\u0022:\u002201234567\u0022,\u0022product\u0022:\u0022myproduct\u0022,\u0022schema-version\u0022:1,\u0022retry\u0022: [{\u0022default\u0022: {\u0022backoff\u0022: [100,200,300,500,1000],\u0022conceal\u0022:5,\u0022jitterpc\u0022:20,\u0022svalidping\u0022:30,\u0022svalidhup\u0022:35}}],\u0022certs\u0022: [{\u0022amazon_root_ca_1\u0022: \u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\u0022},{\u0022starfield_services_root_ca\u0022: \u0022MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkdiEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\u0022},{\u0022baltimore_cybertrust_root\u0022: \u0022MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\u0022}],\u0022trust_stores\u0022: [{\u0022name\u0022: \u0022s3-root-cert\u0022,\u0022stack\u0022: [\u0022baltimore_cybertrust_root\u0022,\u0022amazon_root_ca_1\u0022,\u0022starfield_services_root_ca\u0022]}],\u0022auth\u0022: [{\u0022name\u0022: \u0022sigv4_br\u0022,\u0022type\u0022: \u0022sigv4\u0022,\u0022blob\u0022: 0}],\u0022s\u0022: [{\u0022s3PutObj\u0022: {\u0022endpoint\u0022:\u0022${s3bucket}.s3.amazonaws.com\u0022,\u0022port\u0022:443,\u0022protocol\u0022:\u0022h1\u0022,\u0022http_method\u0022:\u0022PUT\u0022,\u0022http_url\u0022:\u0022${s3Obj}\u0022,\u0022http_no_content_length\u0022: false,\u0022tls\u0022:true,\u0022tls_trust_store\u0022:\u0022s3-root-cert\u0022,\u0022opportunistic\u0022:true,\u0022retry\u0022:\u0022default\u0022,\u0022use_auth\u0022:\u0022sigv4_br\u0022,\u0022aws_region\u0022:\u0022region\u0022,\u0022aws_service\u0022:\u0022service\u0022,\u0022metadata\u0022: [{\u0022region\u0022: \u0022\u0022},{\u0022service\u0022: \u0022\u0022},{\u0022s3bucket\u0022: \u0022\u0022},{\u0022s3Obj\u0022: \u0022\u0022},{\u0022ctype\u0022: \u0022content-type:\u0022},{\u0022xcsha256\u0022: \u0022x-amz-content-sha256:\u0022},{\u0022xdate\u0022: \u0022x-amz-date:\u0022},{\u0022xacl\u0022: \u0022x-amz-acl:\u0022}]}}]}\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-main.c\nnew file mode 100644\nindex 0000000..9ab9952\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-main.c\n@@ -0,0 +1,300 @@\n+/*\n+ * S3 Put Object via Secure Streams minimal sigv4 example\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\t\t\t Amit Pachore \u003capachor@amazon.com\u003e\n+ * securestreams-dev@amazon.com\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstdio.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u0022ss-s3-put.h\u0022\n+#if defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY)\n+#include \u0022static_policy.h\u0022\n+#endif\n+\n+int interrupted, bad \u003d 1;\n+static lws_state_notify_link_t nl;\n+extern const lws_ss_info_t s3_ssi;\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+#if !defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u0022100,\u0022\n+\t\t\t\t\t\t \u0022200,\u0022\n+\t\t\t\t\t\t \u0022300,\u0022\n+\t\t\t\t\t\t \u0022500,\u0022\n+\t\t\t\t\t\t\u00221000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t \u0022{\u005c\u0022amazon_root_ca_1\u005c\u0022: \u005c\u0022\u0022\n+ \u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFA\u0022\n+ \u0022DA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b2\u0022\n+ \u00224gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAk\u0022\n+ \u0022GA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\u0022\n+ \u0022Q0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9Hg\u0022\n+ \u0022FB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8\u0022\n+ \u0022c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHr\u0022\n+ \u0022QgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5\u0022\n+ \u0022SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6\u0022\n+ \u0022pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg\u0022\n+ \u00220CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0\u0022\n+ \u0022OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jda\u0022\n+ \u0022QZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI\u0022\n+ \u00226T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbv\u0022\n+ \u0022Xy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtP\u0022\n+ \u0022HRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJi\u0022\n+ \u0022oaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5W\u0022\n+ \u0022TP468SQvvG5\u0022\n+ \u0022\u005c\u0022},\u0022\n+\t\t \u0022{\u005c\u0022starfield_services_root_ca\u005c\u0022: \u005c\u0022\u0022\n+ \u0022MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\u0022\n+ \u0022EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\u0022\n+ \u0022HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\u0022\n+ \u0022ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\u0022\n+ \u0022MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\u0022\n+ \u0022VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\u0022\n+ \u0022ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\u0022\n+ \u0022dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\u0022\n+ \u0022hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\u0022\n+ \u0022OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\u0022\n+ \u00228xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\u0022\n+ \u0022Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\u0022\n+ \u0022hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\u0022\n+ \u00226mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\u0022\n+ \u0022DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\u0022\n+ \u0022AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\u0022\n+ \u0022bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\u0022\n+ \u0022ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\u0022\n+ \u0022qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\u0022\n+ \u0022iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\u0022\n+ \u00220q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\u0022\n+ \u0022sSi6\u0022\n+ \u0022\u005c\u0022},\u0022\n+\t\t\u0022{\u005c\u0022baltimore_cybertrust_root\u005c\u0022: \u005c\u0022\u0022 /* LE X3 signed by ISRG X1 root */\n+\t\t\t\u0022MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\u0022\n+\t\t\t\u0022RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\u0022\n+\t\t\t\u0022VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\u0022\n+\t\t\t\u0022DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\u0022\n+\t\t\t\u0022ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\u0022\n+\t\t\t\u0022VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\u0022\n+\t\t\t\u0022mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\u0022\n+\t\t\t\u0022IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\u0022\n+\t\t\t\u0022mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\u0022\n+\t\t\t\u0022XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\u0022\n+\t\t\t\u0022dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\u0022\n+\t\t\t\u0022jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\u0022\n+\t\t\t\u0022BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\u0022\n+\t\t\t\u0022DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\u0022\n+\t\t\t\u00229hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\u0022\n+\t\t\t\u0022jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\u0022\n+\t\t\t\u0022Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\u0022\n+\t\t\t\u0022ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\u0022\n+\t\t\t\u0022R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022s3-root-cert\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\t\t\u0022\u005c\u0022baltimore_cybertrust_root\u005c\u0022,\u0022\n+\t\t\t\t\t\t\u0022\u005c\u0022amazon_root_ca_1\u005c\u0022,\u0022\n+\t\t\t\t\t\t\u0022\u005c\u0022starfield_services_root_ca\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022auth\u005c\u0022: [\u0022 /* named cert chains */\n+\t \u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022sigv4_br\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022type\u005c\u0022: \u005c\u0022sigv4\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022blob\u005c\u0022: 0\u0022\n+\t\t\u0022}\u0022\n+\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t\t\u0022{\u005c\u0022s3PutObj\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\u0022\u005c\u0022${s3bucket}.s3.amazonaws.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022 \u0022\u005c\u0022PUT\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022 \u0022\u005c\u0022${s3Obj}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_no_content_length\u005c\u0022: false,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022 \u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022s3-root-cert\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022 \u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022 \u0022\u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022use_auth\u005c\u0022:\u0022 \u0022\u005c\u0022sigv4_br\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022aws_region\u005c\u0022:\u0022 \u0022\u005c\u0022region\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022aws_service\u005c\u0022:\u0022 \u0022\u005c\u0022service\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [\u0022\n+\t\t\t\t\u0022{\u005c\u0022region\u005c\u0022: \u005c\u0022\u005c\u0022},\u0022\n+\t\t\t\t\u0022{\u005c\u0022service\u005c\u0022: \u005c\u0022\u005c\u0022},\u0022\n+\t\t\t\t\u0022{\u005c\u0022s3bucket\u005c\u0022: \u005c\u0022\u005c\u0022},\u0022\n+\t\t\t\t\u0022{\u005c\u0022s3Obj\u005c\u0022: \u005c\u0022\u005c\u0022},\u0022\n+\t\t\t\t\u0022{\u005c\u0022ctype\u005c\u0022: \u005c\u0022content-type:\u005c\u0022},\u0022\n+ \u0022{\u005c\u0022xcsha256\u005c\u0022: \u005c\u0022x-amz-content-sha256:\u005c\u0022},\u0022\n+ \u0022{\u005c\u0022xdate\u005c\u0022: \u005c\u0022x-amz-date:\u005c\u0022},\u0022\n+\t\t\t\t\u0022{\u005c\u0022xacl\u005c\u0022: \u005c\u0022x-amz-acl:\u005c\u0022}\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022]\u0022\n+\t\u0022}\u0022\n+;\n+#endif\n+\n+static char *aws_keyid, *aws_key;\n+#endif\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\tstruct lws_ss_handle *h;\n+\n+\tswitch (target) {\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tbreak;\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\t\tbreak;\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\t\tif (lws_aws_filesystem_credentials_helper(\n+\t\t\t\t\t \u0022~/.aws/credentials\u0022,\n+\t\t\t\t\t \u0022aws_access_key_id\u0022,\n+\t\t\t\t\t \u0022aws_secret_access_key\u0022,\n+\t\t\t\t\t \u0026aws_keyid, \u0026aws_key))\n+\t\t\treturn -1;\n+\t\tlws_ss_sigv4_set_aws_key(context, 0, aws_keyid, aws_key);\n+#endif\n+\n+\t\tif (lws_ss_create(context, 0, \u0026s3_ssi, NULL, \u0026h,\n+\t\t\t\t NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN /* | LLL_NOTICE */ ;\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tlws_set_log_level(logs, NULL);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal secure streams sigv4 \u005cn\u0022);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#else\n+#if defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY)\n+\tinfo.pss_policies \u003d \u0026_ss_static_policy_entry;\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+#endif\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_system_blob_heap_append(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_TYPE, 0),\n+\t\t\t\t (const uint8_t *)\u0022beerfountain\u0022, 12);\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\tif (aws_key)\n+\t\tfree(aws_key);\n+\tif (aws_keyid)\n+\t\tfree(aws_keyid);\n+#endif\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-put.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-put.h\nnew file mode 100644\nindex 0000000..ee2e99b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-put.h\n@@ -0,0 +1,21 @@\n+/*\n+ * S3 Put Object via Secure Streams minimal sigv4 example\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\t\t\t Amit Pachore \u003capachor@amazon.com\u003e\n+ *\t\t\t securestreams-dev@amazon.com\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+typedef struct ss_s3_put {\n+\tstruct lws_ss_handle\t*ss;\n+\tvoid\t\t\t*opaque_data;\n+\n+\t/* ... application specific state ... */\n+\n+\tsize_t\t\t\ttotal;\n+\tsize_t\t\t\tpos;\n+\tuint8_t\t\t\t*buf;\n+} ss_s3_put_t;\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c\nnew file mode 100644\nindex 0000000..1acd431\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c\n@@ -0,0 +1,216 @@\n+/*\n+ * S3 Put Object via Secure Streams minimal siv4 example\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\t\t\t Amit Pachore \u003capachor@amazon.com\u003e\n+ * securestreams-dev@amazon.com\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cassert.h\u003e\n+#include \u0022ss-s3-put.h\u0022\n+\n+extern int interrupted, bad;\n+\n+static lws_ss_state_return_t\n+ss_s3_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\t// ss_s3_put_t *m \u003d (ss_s3_put_t *)userobj;\n+\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1; /* this example wants to exit after rx */\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\t}\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_err(buf, len);\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+ss_s3_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\t int *flags)\n+{\n+\tss_s3_put_t *m \u003d (ss_s3_put_t *)userobj;\n+\n+\tif (!m-\u003epos)\n+\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\tlwsl_user(\u0022%s: Send... total: %ld, pos: %ld\u005cn\u0022, __func__,\n+\t\t (long)m-\u003etotal, (long)m-\u003epos);\n+\n+\tif (*len \u003e m-\u003etotal - m-\u003epos)\n+\t\t*len \u003d m-\u003etotal - m-\u003epos;\n+\n+\tif (!*len)\n+\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+\tmemcpy(buf, m-\u003ebuf + m-\u003epos, *len);\n+\tm-\u003epos +\u003d *len;\n+\n+\tif (m-\u003epos \u003d\u003d m-\u003etotal) {\n+\t\t*flags |\u003d LWSSS_FLAG_EOM;\n+\t\t// m-\u003epos \u003d 0; /* we only want to send once */\n+\t} else\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static const char *awsService\t\u003d \u0022s3\u0022,\n+\t\t *awsRegion\t\u003d \u0022us-west-2\u0022,\n+\t\t *s3bucketName \u003d \u0022sstest2020\u0022,\n+#if 1\n+\t\t *s3ObjName \u003d \u0022SSs3upload2.txt\u0022;\n+#else\n+\t\t /* test huge string sigv4 hashing works */\n+\t\t *s3ObjName\t\u003d \u0022SSs3uploadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2.txt\u0022;\n+#endif\n+static char timestamp[32], payload_hash[65];\n+static uint8_t jpl[1 * 1024];\n+\n+\n+static void\n+create_payload(uint8_t *buf, size_t s)\n+{\n+\tint i;\n+\n+\tfor (i \u003d 0; i \u003c (int)s; i++)\n+\t\tbuf[i] \u003d (uint8_t)('a' + i % 16);\n+}\n+\n+static void set_time(char *t)\n+{\n+\t/*20150830T123600Z*/\n+\ttime_t ti \u003d time(NULL);\n+#if defined(LWS_HAVE_GMTIME_R)\n+\tstruct tm tmp;\n+\tstruct tm *tm \u003d gmtime_r(\u0026ti, \u0026tmp);\n+#else\n+\tstruct tm *tm \u003d gmtime(\u0026ti);\n+#endif\n+\tassert(tm);\n+\tstrftime(t, 20, \u0022%Y%m%dT%H%M%SZ\u0022, tm);\n+}\n+\n+static void bin2hex(uint8_t *in, size_t len, char *out)\n+{\n+\tstatic const char *hex \u003d \u00220123456789abcdef\u0022;\n+\tsize_t n;\n+\n+\tfor (n \u003d 0; n \u003c len; n++) {\n+\t\t*out++ \u003d hex[(in[n] \u003e\u003e 4) \u0026 0xf];\n+\t\t*out++ \u003d hex[in[n] \u0026 15];\n+\t}\n+\t*out \u003d '\u005c0';\n+}\n+\n+static void sigv4_sha256hash_payload(uint8_t *payload, size_t len, char *hash)\n+{\n+\tstruct lws_genhash_ctx hash_ctx;\n+\tuint8_t hash_bin[32];\n+\n+\tif (lws_genhash_init(\u0026hash_ctx, LWS_GENHASH_TYPE_SHA256) ||\n+\t\t/*\n+\t\t * If there is no payload, you must provide the hash of an\n+\t\t * empty string...\n+\t\t */\n+\t lws_genhash_update(\u0026hash_ctx,\n+\t\t\t payload ? (void *)payload : (void *)\u0022\u0022,\n+\t\t\t payload ? len : 0u) ||\n+\t lws_genhash_destroy(\u0026hash_ctx, hash_bin))\n+\t{\n+\n+\t\tlws_genhash_destroy(\u0026hash_ctx, NULL);\n+\t\tlwsl_err(\u0022%s lws_genhash failed\u005cn\u0022, __func__);\n+\n+\t\treturn;\n+\t}\n+\n+\tbin2hex(hash_bin, 32, hash);\n+}\n+\n+static lws_ss_state_return_t\n+ss_s3_state(void *userobj, void *sh, lws_ss_constate_t state,\n+ lws_ss_tx_ordinal_t ack)\n+{\n+\tss_s3_put_t *m \u003d (ss_s3_put_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %s %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_tag(m-\u003ess),\n+\t\t lws_ss_state_name((int)state), (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tcreate_payload(jpl, sizeof(jpl));\n+\t\tm-\u003ebuf \u003d (uint8_t *)jpl;\n+\t\tm-\u003etotal \u003d sizeof(jpl);\n+\n+\t\tsigv4_sha256hash_payload(m-\u003ebuf, m-\u003etotal, payload_hash);\n+\t\tmemset(timestamp, 0, sizeof(timestamp));\n+\t\tset_time(timestamp);\n+\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022s3bucket\u0022,\n+\t\t\t\t s3bucketName, strlen(s3bucketName)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022s3Obj\u0022,\n+\t\t\t\t s3ObjName, strlen(s3ObjName)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022,\n+\t\t\t\t \u0022text/plain\u0022, strlen(\u0022text/plain\u0022)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022region\u0022,\n+\t\t\t\t awsRegion, strlen(awsRegion)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022service\u0022,\n+\t\t\t\t awsService, strlen(awsService)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022xacl\u0022,\n+\t\t\t\t \u0022bucket-owner-full-control\u0022,\n+\t\t\t\t strlen(\u0022bucket-owner-full-control\u0022)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022xcsha256\u0022,\n+\t\t\t\t payload_hash, strlen(payload_hash)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022xdate\u0022,\n+\t\t\t\t timestamp, strlen(timestamp)))\n+\t\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\t\treturn lws_ss_request_tx_len(m-\u003ess, m-\u003etotal);\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\treturn lws_ss_request_tx(m-\u003ess);\n+\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tbad \u003d 1;\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\tbad \u003d 0;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_QOS_NACK_REMOTE:\n+\t\tbad \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_DESTROYING:\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+const lws_ss_info_t s3_ssi \u003d {\n+\t.handle_offset\t\t \u003d offsetof(ss_s3_put_t, ss),\n+\t.opaque_user_data_offset \u003d offsetof(ss_s3_put_t, opaque_data),\n+\t.rx\t\t\t \u003d ss_s3_rx,\n+\t.tx\t\t\t \u003d ss_s3_tx,\n+\t.state\t\t\t \u003d ss_s3_state,\n+\t.user_alloc\t\t \u003d sizeof(ss_s3_put_t),\n+\t.streamtype\t\t \u003d \u0022s3PutObj\u0022\n+};\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/static_policy.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/static_policy.h\nnew file mode 100644\nindex 0000000..0f94c5d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/static_policy.h\n@@ -0,0 +1,492 @@\n+/*\n+ * Autogenerated from the following JSON policy\n+ */\n+\n+#if 0\n+{\u0022release\u0022:\u002201234567\u0022,\u0022product\u0022:\u0022myproduct\u0022,\u0022schema-version\u0022:1,\u0022retry\u0022: [{\u0022default\u0022: {\u0022backoff\u0022: [100,200,300,500,1000],\u0022conceal\u0022:5,\u0022jitterpc\u0022:20,\u0022svalidping\u0022:30,\u0022svalidhup\u0022:35}}],\u0022certs\u0022: [{\u0022amazon_root_ca_1\u0022: \u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\u0022},{\u0022starfield_services_root_ca\u0022: \u0022MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkdiEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\u0022},{\u0022baltimore_cybertrust_root\u0022: \u0022MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\u0022}],\u0022trust_stores\u0022: [{\u0022name\u0022: \u0022s3-root-cert\u0022,\u0022stack\u0022: [\u0022baltimore_cybertrust_root\u0022,\u0022amazon_root_ca_1\u0022,\u0022starfield_services_root_ca\u0022]}],\u0022auth\u0022: [{\u0022name\u0022: \u0022sigv4_br\u0022,\u0022type\u0022: \u0022sigv4\u0022,\u0022blob\u0022: 0}],\u0022s\u0022: [{\u0022s3PutObj\u0022: {\u0022endpoint\u0022:\u0022${s3bucket}.s3.amazonaws.com\u0022,\u0022port\u0022:443,\u0022protocol\u0022:\u0022h1\u0022,\u0022http_method\u0022:\u0022PUT\u0022,\u0022http_url\u0022:\u0022${s3Obj}\u0022,\u0022http_no_content_length\u0022: false,\u0022tls\u0022:true,\u0022tls_trust_store\u0022:\u0022s3-root-cert\u0022,\u0022opportunistic\u0022:true,\u0022retry\u0022:\u0022default\u0022,\u0022use_auth\u0022:\u0022sigv4_br\u0022,\u0022aws_region\u0022:\u0022region\u0022,\u0022aws_service\u0022:\u0022service\u0022,\u0022metadata\u0022: [{\u0022region\u0022: \u0022\u0022},{\u0022service\u0022: \u0022\u0022},{\u0022s3bucket\u0022: \u0022\u0022},{\u0022s3Obj\u0022: \u0022\u0022},{\u0022ctype\u0022: \u0022content-type:\u0022},{\u0022xcsha256\u0022: \u0022x-amz-content-sha256:\u0022},{\u0022xdate\u0022: \u0022x-amz-date:\u0022},{\u0022xacl\u0022: \u0022x-amz-acl:\u0022}]}}]}\n+\n+ Original JSON size: 4630\n+#endif\n+\n+\n+static const lws_ss_metadata_t _md_s3PutObj_xacl \u003d {\n+\t.name \u003d \u0022xacl\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022x-amz-acl:\u0022,\n+\t.value_length \u003d 0xa,\n+\t.length \u003d 0,\n+\t.value_is_http_token \u003d 0xff,\n+},\n+_md_s3PutObj_xdate \u003d {\n+\t.next \u003d (void *)\u0026_md_s3PutObj_xacl, \n+\t.name \u003d \u0022xdate\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022x-amz-date:\u0022,\n+\t.value_length \u003d 0xb,\n+\t.length \u003d 1,\n+\t.value_is_http_token \u003d 0xff,\n+},\n+_md_s3PutObj_xcsha256 \u003d {\n+\t.next \u003d (void *)\u0026_md_s3PutObj_xdate, \n+\t.name \u003d \u0022xcsha256\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022x-amz-content-sha256:\u0022,\n+\t.value_length \u003d 0x15,\n+\t.length \u003d 2,\n+\t.value_is_http_token \u003d 0xff,\n+},\n+_md_s3PutObj_ctype \u003d {\n+\t.next \u003d (void *)\u0026_md_s3PutObj_xcsha256, \n+\t.name \u003d \u0022ctype\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022content-type:\u0022,\n+\t.value_length \u003d 0xd,\n+\t.length \u003d 3,\n+\t.value_is_http_token \u003d 0x1c,\n+},\n+_md_s3PutObj_s3Obj \u003d {\n+\t.next \u003d (void *)\u0026_md_s3PutObj_ctype, \n+\t.name \u003d \u0022s3Obj\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022\u0022,\n+\t.value_length \u003d 0x0,\n+\t.length \u003d 4,\n+\t.value_is_http_token \u003d 0x0,\n+},\n+_md_s3PutObj_s3bucket \u003d {\n+\t.next \u003d (void *)\u0026_md_s3PutObj_s3Obj, \n+\t.name \u003d \u0022s3bucket\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022\u0022,\n+\t.value_length \u003d 0x0,\n+\t.length \u003d 5,\n+\t.value_is_http_token \u003d 0x0,\n+},\n+_md_s3PutObj_service \u003d {\n+\t.next \u003d (void *)\u0026_md_s3PutObj_s3bucket, \n+\t.name \u003d \u0022service\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022\u0022,\n+\t.value_length \u003d 0x0,\n+\t.length \u003d 6,\n+\t.value_is_http_token \u003d 0x0,\n+},\n+_md_s3PutObj_region \u003d {\n+\t.next \u003d (void *)\u0026_md_s3PutObj_service, \n+\t.name \u003d \u0022region\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022\u0022,\n+\t.value_length \u003d 0x0,\n+\t.length \u003d 7,\n+\t.value_is_http_token \u003d 0x0,\n+};\n+\n+static const uint32_t _rbo_bo_0[] \u003d {\n+ 100, 200, 300, 500, 1000, \n+};\n+static const lws_retry_bo_t _rbo_0 \u003d {\n+\t.retry_ms_table \u003d _rbo_bo_0,\n+\t.retry_ms_table_count \u003d 5,\n+\t.conceal_count \u003d 5,\n+\t.secs_since_valid_ping \u003d 30,\n+\t.secs_since_valid_hangup \u003d 35,\n+\t.jitter_percent \u003d 20,\n+};\n+static const uint8_t _ss_der_baltimore_cybertrust_root[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x03, 0x77, 0x30, 0x82, 0x02, 0x5F, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, \n+\t/* 0x 10 */ 0x00, 0x00, 0xB9, 0x30, 0x0D, 0x06, 0x09, 0x2A, \n+\t/* 0x 18 */ 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, \n+\t/* 0x 20 */ 0x05, 0x00, 0x30, 0x5A, 0x31, 0x0B, 0x30, 0x09, \n+\t/* 0x 28 */ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, \n+\t/* 0x 30 */ 0x45, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, \n+\t/* 0x 38 */ 0x04, 0x0A, 0x13, 0x09, 0x42, 0x61, 0x6C, 0x74, \n+\t/* 0x 40 */ 0x69, 0x6D, 0x6F, 0x72, 0x65, 0x31, 0x13, 0x30, \n+\t/* 0x 48 */ 0x11, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x0A, \n+\t/* 0x 50 */ 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, \n+\t/* 0x 58 */ 0x73, 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, \n+\t/* 0x 60 */ 0x55, 0x04, 0x03, 0x13, 0x19, 0x42, 0x61, 0x6C, \n+\t/* 0x 68 */ 0x74, 0x69, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x43, \n+\t/* 0x 70 */ 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, \n+\t/* 0x 78 */ 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x30, 0x1E, \n+\t/* 0x 80 */ 0x17, 0x0D, 0x30, 0x30, 0x30, 0x35, 0x31, 0x32, \n+\t/* 0x 88 */ 0x31, 0x38, 0x34, 0x36, 0x30, 0x30, 0x5A, 0x17, \n+\t/* 0x 90 */ 0x0D, 0x32, 0x35, 0x30, 0x35, 0x31, 0x32, 0x32, \n+\t/* 0x 98 */ 0x33, 0x35, 0x39, 0x30, 0x30, 0x5A, 0x30, 0x5A, \n+\t/* 0x a0 */ 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x a8 */ 0x06, 0x13, 0x02, 0x49, 0x45, 0x31, 0x12, 0x30, \n+\t/* 0x b0 */ 0x10, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x09, \n+\t/* 0x b8 */ 0x42, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x6F, 0x72, \n+\t/* 0x c0 */ 0x65, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, \n+\t/* 0x c8 */ 0x04, 0x0B, 0x13, 0x0A, 0x43, 0x79, 0x62, 0x65, \n+\t/* 0x d0 */ 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x22, \n+\t/* 0x d8 */ 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, \n+\t/* 0x e0 */ 0x19, 0x42, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x6F, \n+\t/* 0x e8 */ 0x72, 0x65, 0x20, 0x43, 0x79, 0x62, 0x65, 0x72, \n+\t/* 0x f0 */ 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6F, \n+\t/* 0x f8 */ 0x6F, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, \n+\t/* 0x100 */ 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, \n+\t/* 0x108 */ 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, \n+\t/* 0x110 */ 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, \n+\t/* 0x118 */ 0x01, 0x01, 0x00, 0xA3, 0x04, 0xBB, 0x22, 0xAB, \n+\t/* 0x120 */ 0x98, 0x3D, 0x57, 0xE8, 0x26, 0x72, 0x9A, 0xB5, \n+\t/* 0x128 */ 0x79, 0xD4, 0x29, 0xE2, 0xE1, 0xE8, 0x95, 0x80, \n+\t/* 0x130 */ 0xB1, 0xB0, 0xE3, 0x5B, 0x8E, 0x2B, 0x29, 0x9A, \n+\t/* 0x138 */ 0x64, 0xDF, 0xA1, 0x5D, 0xED, 0xB0, 0x09, 0x05, \n+\t/* 0x140 */ 0x6D, 0xDB, 0x28, 0x2E, 0xCE, 0x62, 0xA2, 0x62, \n+\t/* 0x148 */ 0xFE, 0xB4, 0x88, 0xDA, 0x12, 0xEB, 0x38, 0xEB, \n+\t/* 0x150 */ 0x21, 0x9D, 0xC0, 0x41, 0x2B, 0x01, 0x52, 0x7B, \n+\t/* 0x158 */ 0x88, 0x77, 0xD3, 0x1C, 0x8F, 0xC7, 0xBA, 0xB9, \n+\t/* 0x160 */ 0x88, 0xB5, 0x6A, 0x09, 0xE7, 0x73, 0xE8, 0x11, \n+\t/* 0x168 */ 0x40, 0xA7, 0xD1, 0xCC, 0xCA, 0x62, 0x8D, 0x2D, \n+\t/* 0x170 */ 0xE5, 0x8F, 0x0B, 0xA6, 0x50, 0xD2, 0xA8, 0x50, \n+\t/* 0x178 */ 0xC3, 0x28, 0xEA, 0xF5, 0xAB, 0x25, 0x87, 0x8A, \n+\t/* 0x180 */ 0x9A, 0x96, 0x1C, 0xA9, 0x67, 0xB8, 0x3F, 0x0C, \n+\t/* 0x188 */ 0xD5, 0xF7, 0xF9, 0x52, 0x13, 0x2F, 0xC2, 0x1B, \n+\t/* 0x190 */ 0xD5, 0x70, 0x70, 0xF0, 0x8F, 0xC0, 0x12, 0xCA, \n+\t/* 0x198 */ 0x06, 0xCB, 0x9A, 0xE1, 0xD9, 0xCA, 0x33, 0x7A, \n+\t/* 0x1a0 */ 0x77, 0xD6, 0xF8, 0xEC, 0xB9, 0xF1, 0x68, 0x44, \n+\t/* 0x1a8 */ 0x42, 0x48, 0x13, 0xD2, 0xC0, 0xC2, 0xA4, 0xAE, \n+\t/* 0x1b0 */ 0x5E, 0x60, 0xFE, 0xB6, 0xA6, 0x05, 0xFC, 0xB4, \n+\t/* 0x1b8 */ 0xDD, 0x07, 0x59, 0x02, 0xD4, 0x59, 0x18, 0x98, \n+\t/* 0x1c0 */ 0x63, 0xF5, 0xA5, 0x63, 0xE0, 0x90, 0x0C, 0x7D, \n+\t/* 0x1c8 */ 0x5D, 0xB2, 0x06, 0x7A, 0xF3, 0x85, 0xEA, 0xEB, \n+\t/* 0x1d0 */ 0xD4, 0x03, 0xAE, 0x5E, 0x84, 0x3E, 0x5F, 0xFF, \n+\t/* 0x1d8 */ 0x15, 0xED, 0x69, 0xBC, 0xF9, 0x39, 0x36, 0x72, \n+\t/* 0x1e0 */ 0x75, 0xCF, 0x77, 0x52, 0x4D, 0xF3, 0xC9, 0x90, \n+\t/* 0x1e8 */ 0x2C, 0xB9, 0x3D, 0xE5, 0xC9, 0x23, 0x53, 0x3F, \n+\t/* 0x1f0 */ 0x1F, 0x24, 0x98, 0x21, 0x5C, 0x07, 0x99, 0x29, \n+\t/* 0x1f8 */ 0xBD, 0xC6, 0x3A, 0xEC, 0xE7, 0x6E, 0x86, 0x3A, \n+\t/* 0x200 */ 0x6B, 0x97, 0x74, 0x63, 0x33, 0xBD, 0x68, 0x18, \n+\t/* 0x208 */ 0x31, 0xF0, 0x78, 0x8D, 0x76, 0xBF, 0xFC, 0x9E, \n+\t/* 0x210 */ 0x8E, 0x5D, 0x2A, 0x86, 0xA7, 0x4D, 0x90, 0xDC, \n+\t/* 0x218 */ 0x27, 0x1A, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01, \n+\t/* 0x220 */ 0xA3, 0x45, 0x30, 0x43, 0x30, 0x1D, 0x06, 0x03, \n+\t/* 0x228 */ 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xE5, \n+\t/* 0x230 */ 0x9D, 0x59, 0x30, 0x82, 0x47, 0x58, 0xCC, 0xAC, \n+\t/* 0x238 */ 0xFA, 0x08, 0x54, 0x36, 0x86, 0x7B, 0x3A, 0xB5, \n+\t/* 0x240 */ 0x04, 0x4D, 0xF0, 0x30, 0x12, 0x06, 0x03, 0x55, \n+\t/* 0x248 */ 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x08, 0x30, \n+\t/* 0x250 */ 0x06, 0x01, 0x01, 0xFF, 0x02, 0x01, 0x03, 0x30, \n+\t/* 0x258 */ 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, \n+\t/* 0x260 */ 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, \n+\t/* 0x268 */ 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, \n+\t/* 0x270 */ 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, \n+\t/* 0x278 */ 0x01, 0x01, 0x00, 0x85, 0x0C, 0x5D, 0x8E, 0xE4, \n+\t/* 0x280 */ 0x6F, 0x51, 0x68, 0x42, 0x05, 0xA0, 0xDD, 0xBB, \n+\t/* 0x288 */ 0x4F, 0x27, 0x25, 0x84, 0x03, 0xBD, 0xF7, 0x64, \n+\t/* 0x290 */ 0xFD, 0x2D, 0xD7, 0x30, 0xE3, 0xA4, 0x10, 0x17, \n+\t/* 0x298 */ 0xEB, 0xDA, 0x29, 0x29, 0xB6, 0x79, 0x3F, 0x76, \n+\t/* 0x2a0 */ 0xF6, 0x19, 0x13, 0x23, 0xB8, 0x10, 0x0A, 0xF9, \n+\t/* 0x2a8 */ 0x58, 0xA4, 0xD4, 0x61, 0x70, 0xBD, 0x04, 0x61, \n+\t/* 0x2b0 */ 0x6A, 0x12, 0x8A, 0x17, 0xD5, 0x0A, 0xBD, 0xC5, \n+\t/* 0x2b8 */ 0xBC, 0x30, 0x7C, 0xD6, 0xE9, 0x0C, 0x25, 0x8D, \n+\t/* 0x2c0 */ 0x86, 0x40, 0x4F, 0xEC, 0xCC, 0xA3, 0x7E, 0x38, \n+\t/* 0x2c8 */ 0xC6, 0x37, 0x11, 0x4F, 0xED, 0xDD, 0x68, 0x31, \n+\t/* 0x2d0 */ 0x8E, 0x4C, 0xD2, 0xB3, 0x01, 0x74, 0xEE, 0xBE, \n+\t/* 0x2d8 */ 0x75, 0x5E, 0x07, 0x48, 0x1A, 0x7F, 0x70, 0xFF, \n+\t/* 0x2e0 */ 0x16, 0x5C, 0x84, 0xC0, 0x79, 0x85, 0xB8, 0x05, \n+\t/* 0x2e8 */ 0xFD, 0x7F, 0xBE, 0x65, 0x11, 0xA3, 0x0F, 0xC0, \n+\t/* 0x2f0 */ 0x02, 0xB4, 0xF8, 0x52, 0x37, 0x39, 0x04, 0xD5, \n+\t/* 0x2f8 */ 0xA9, 0x31, 0x7A, 0x18, 0xBF, 0xA0, 0x2A, 0xF4, \n+\t/* 0x300 */ 0x12, 0x99, 0xF7, 0xA3, 0x45, 0x82, 0xE3, 0x3C, \n+\t/* 0x308 */ 0x5E, 0xF5, 0x9D, 0x9E, 0xB5, 0xC8, 0x9E, 0x7C, \n+\t/* 0x310 */ 0x2E, 0xC8, 0xA4, 0x9E, 0x4E, 0x08, 0x14, 0x4B, \n+\t/* 0x318 */ 0x6D, 0xFD, 0x70, 0x6D, 0x6B, 0x1A, 0x63, 0xBD, \n+\t/* 0x320 */ 0x64, 0xE6, 0x1F, 0xB7, 0xCE, 0xF0, 0xF2, 0x9F, \n+\t/* 0x328 */ 0x2E, 0xBB, 0x1B, 0xB7, 0xF2, 0x50, 0x88, 0x73, \n+\t/* 0x330 */ 0x92, 0xC2, 0xE2, 0xE3, 0x16, 0x8D, 0x9A, 0x32, \n+\t/* 0x338 */ 0x02, 0xAB, 0x8E, 0x18, 0xDD, 0xE9, 0x10, 0x11, \n+\t/* 0x340 */ 0xEE, 0x7E, 0x35, 0xAB, 0x90, 0xAF, 0x3E, 0x30, \n+\t/* 0x348 */ 0x94, 0x7A, 0xD0, 0x33, 0x3D, 0xA7, 0x65, 0x0F, \n+\t/* 0x350 */ 0xF5, 0xFC, 0x8E, 0x9E, 0x62, 0xCF, 0x47, 0x44, \n+\t/* 0x358 */ 0x2C, 0x01, 0x5D, 0xBB, 0x1D, 0xB5, 0x32, 0xD2, \n+\t/* 0x360 */ 0x47, 0xD2, 0x38, 0x2E, 0xD0, 0xFE, 0x81, 0xDC, \n+\t/* 0x368 */ 0x32, 0x6A, 0x1E, 0xB5, 0xEE, 0x3C, 0xD5, 0xFC, \n+\t/* 0x370 */ 0xE7, 0x81, 0x1D, 0x19, 0xC3, 0x24, 0x42, 0xEA, \n+\t/* 0x378 */ 0x63, 0x39, 0xA9, \n+};\n+static const lws_ss_x509_t _ss_x509_baltimore_cybertrust_root \u003d {\n+\t.vhost_name \u003d \u0022baltimore_cybertrust_root\u0022,\n+\t.ca_der \u003d _ss_der_baltimore_cybertrust_root,\n+\t.ca_der_len \u003d 891,\n+};\n+static const uint8_t _ss_der_amazon_root_ca_1[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x03, 0x41, 0x30, 0x82, 0x02, 0x29, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x13, 0x06, \n+\t/* 0x 10 */ 0x6C, 0x9F, 0xCF, 0x99, 0xBF, 0x8C, 0x0A, 0x39, \n+\t/* 0x 18 */ 0xE2, 0xF0, 0x78, 0x8A, 0x43, 0xE6, 0x96, 0x36, \n+\t/* 0x 20 */ 0x5B, 0xCA, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, \n+\t/* 0x 28 */ 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, \n+\t/* 0x 30 */ 0x00, 0x30, 0x39, 0x31, 0x0B, 0x30, 0x09, 0x06, \n+\t/* 0x 38 */ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, \n+\t/* 0x 40 */ 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x 48 */ 0x0A, 0x13, 0x06, 0x41, 0x6D, 0x61, 0x7A, 0x6F, \n+\t/* 0x 50 */ 0x6E, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \n+\t/* 0x 58 */ 0x04, 0x03, 0x13, 0x10, 0x41, 0x6D, 0x61, 0x7A, \n+\t/* 0x 60 */ 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, \n+\t/* 0x 68 */ 0x43, 0x41, 0x20, 0x31, 0x30, 0x1E, 0x17, 0x0D, \n+\t/* 0x 70 */ 0x31, 0x35, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30, \n+\t/* 0x 78 */ 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33, \n+\t/* 0x 80 */ 0x38, 0x30, 0x31, 0x31, 0x37, 0x30, 0x30, 0x30, \n+\t/* 0x 88 */ 0x30, 0x30, 0x30, 0x5A, 0x30, 0x39, 0x31, 0x0B, \n+\t/* 0x 90 */ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, \n+\t/* 0x 98 */ 0x02, 0x55, 0x53, 0x31, 0x0F, 0x30, 0x0D, 0x06, \n+\t/* 0x a0 */ 0x03, 0x55, 0x04, 0x0A, 0x13, 0x06, 0x41, 0x6D, \n+\t/* 0x a8 */ 0x61, 0x7A, 0x6F, 0x6E, 0x31, 0x19, 0x30, 0x17, \n+\t/* 0x b0 */ 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, \n+\t/* 0x b8 */ 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, 0x52, 0x6F, \n+\t/* 0x c0 */ 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, \n+\t/* 0x c8 */ 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, \n+\t/* 0x d0 */ 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, \n+\t/* 0x d8 */ 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, \n+\t/* 0x e0 */ 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, \n+\t/* 0x e8 */ 0xB2, 0x78, 0x80, 0x71, 0xCA, 0x78, 0xD5, 0xE3, \n+\t/* 0x f0 */ 0x71, 0xAF, 0x47, 0x80, 0x50, 0x74, 0x7D, 0x6E, \n+\t/* 0x f8 */ 0xD8, 0xD7, 0x88, 0x76, 0xF4, 0x99, 0x68, 0xF7, \n+\t/* 0x100 */ 0x58, 0x21, 0x60, 0xF9, 0x74, 0x84, 0x01, 0x2F, \n+\t/* 0x108 */ 0xAC, 0x02, 0x2D, 0x86, 0xD3, 0xA0, 0x43, 0x7A, \n+\t/* 0x110 */ 0x4E, 0xB2, 0xA4, 0xD0, 0x36, 0xBA, 0x01, 0xBE, \n+\t/* 0x118 */ 0x8D, 0xDB, 0x48, 0xC8, 0x07, 0x17, 0x36, 0x4C, \n+\t/* 0x120 */ 0xF4, 0xEE, 0x88, 0x23, 0xC7, 0x3E, 0xEB, 0x37, \n+\t/* 0x128 */ 0xF5, 0xB5, 0x19, 0xF8, 0x49, 0x68, 0xB0, 0xDE, \n+\t/* 0x130 */ 0xD7, 0xB9, 0x76, 0x38, 0x1D, 0x61, 0x9E, 0xA4, \n+\t/* 0x138 */ 0xFE, 0x82, 0x36, 0xA5, 0xE5, 0x4A, 0x56, 0xE4, \n+\t/* 0x140 */ 0x45, 0xE1, 0xF9, 0xFD, 0xB4, 0x16, 0xFA, 0x74, \n+\t/* 0x148 */ 0xDA, 0x9C, 0x9B, 0x35, 0x39, 0x2F, 0xFA, 0xB0, \n+\t/* 0x150 */ 0x20, 0x50, 0x06, 0x6C, 0x7A, 0xD0, 0x80, 0xB2, \n+\t/* 0x158 */ 0xA6, 0xF9, 0xAF, 0xEC, 0x47, 0x19, 0x8F, 0x50, \n+\t/* 0x160 */ 0x38, 0x07, 0xDC, 0xA2, 0x87, 0x39, 0x58, 0xF8, \n+\t/* 0x168 */ 0xBA, 0xD5, 0xA9, 0xF9, 0x48, 0x67, 0x30, 0x96, \n+\t/* 0x170 */ 0xEE, 0x94, 0x78, 0x5E, 0x6F, 0x89, 0xA3, 0x51, \n+\t/* 0x178 */ 0xC0, 0x30, 0x86, 0x66, 0xA1, 0x45, 0x66, 0xBA, \n+\t/* 0x180 */ 0x54, 0xEB, 0xA3, 0xC3, 0x91, 0xF9, 0x48, 0xDC, \n+\t/* 0x188 */ 0xFF, 0xD1, 0xE8, 0x30, 0x2D, 0x7D, 0x2D, 0x74, \n+\t/* 0x190 */ 0x70, 0x35, 0xD7, 0x88, 0x24, 0xF7, 0x9E, 0xC4, \n+\t/* 0x198 */ 0x59, 0x6E, 0xBB, 0x73, 0x87, 0x17, 0xF2, 0x32, \n+\t/* 0x1a0 */ 0x46, 0x28, 0xB8, 0x43, 0xFA, 0xB7, 0x1D, 0xAA, \n+\t/* 0x1a8 */ 0xCA, 0xB4, 0xF2, 0x9F, 0x24, 0x0E, 0x2D, 0x4B, \n+\t/* 0x1b0 */ 0xF7, 0x71, 0x5C, 0x5E, 0x69, 0xFF, 0xEA, 0x95, \n+\t/* 0x1b8 */ 0x02, 0xCB, 0x38, 0x8A, 0xAE, 0x50, 0x38, 0x6F, \n+\t/* 0x1c0 */ 0xDB, 0xFB, 0x2D, 0x62, 0x1B, 0xC5, 0xC7, 0x1E, \n+\t/* 0x1c8 */ 0x54, 0xE1, 0x77, 0xE0, 0x67, 0xC8, 0x0F, 0x9C, \n+\t/* 0x1d0 */ 0x87, 0x23, 0xD6, 0x3F, 0x40, 0x20, 0x7F, 0x20, \n+\t/* 0x1d8 */ 0x80, 0xC4, 0x80, 0x4C, 0x3E, 0x3B, 0x24, 0x26, \n+\t/* 0x1e0 */ 0x8E, 0x04, 0xAE, 0x6C, 0x9A, 0xC8, 0xAA, 0x0D, \n+\t/* 0x1e8 */ 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x42, 0x30, \n+\t/* 0x1f0 */ 0x40, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, \n+\t/* 0x1f8 */ 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, \n+\t/* 0x200 */ 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, \n+\t/* 0x208 */ 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, \n+\t/* 0x210 */ 0x01, 0x86, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, \n+\t/* 0x218 */ 0x0E, 0x04, 0x16, 0x04, 0x14, 0x84, 0x18, 0xCC, \n+\t/* 0x220 */ 0x85, 0x34, 0xEC, 0xBC, 0x0C, 0x94, 0x94, 0x2E, \n+\t/* 0x228 */ 0x08, 0x59, 0x9C, 0xC7, 0xB2, 0x10, 0x4E, 0x0A, \n+\t/* 0x230 */ 0x08, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, \n+\t/* 0x238 */ 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, \n+\t/* 0x240 */ 0x03, 0x82, 0x01, 0x01, 0x00, 0x98, 0xF2, 0x37, \n+\t/* 0x248 */ 0x5A, 0x41, 0x90, 0xA1, 0x1A, 0xC5, 0x76, 0x51, \n+\t/* 0x250 */ 0x28, 0x20, 0x36, 0x23, 0x0E, 0xAE, 0xE6, 0x28, \n+\t/* 0x258 */ 0xBB, 0xAA, 0xF8, 0x94, 0xAE, 0x48, 0xA4, 0x30, \n+\t/* 0x260 */ 0x7F, 0x1B, 0xFC, 0x24, 0x8D, 0x4B, 0xB4, 0xC8, \n+\t/* 0x268 */ 0xA1, 0x97, 0xF6, 0xB6, 0xF1, 0x7A, 0x70, 0xC8, \n+\t/* 0x270 */ 0x53, 0x93, 0xCC, 0x08, 0x28, 0xE3, 0x98, 0x25, \n+\t/* 0x278 */ 0xCF, 0x23, 0xA4, 0xF9, 0xDE, 0x21, 0xD3, 0x7C, \n+\t/* 0x280 */ 0x85, 0x09, 0xAD, 0x4E, 0x9A, 0x75, 0x3A, 0xC2, \n+\t/* 0x288 */ 0x0B, 0x6A, 0x89, 0x78, 0x76, 0x44, 0x47, 0x18, \n+\t/* 0x290 */ 0x65, 0x6C, 0x8D, 0x41, 0x8E, 0x3B, 0x7F, 0x9A, \n+\t/* 0x298 */ 0xCB, 0xF4, 0xB5, 0xA7, 0x50, 0xD7, 0x05, 0x2C, \n+\t/* 0x2a0 */ 0x37, 0xE8, 0x03, 0x4B, 0xAD, 0xE9, 0x61, 0xA0, \n+\t/* 0x2a8 */ 0x02, 0x6E, 0xF5, 0xF2, 0xF0, 0xC5, 0xB2, 0xED, \n+\t/* 0x2b0 */ 0x5B, 0xB7, 0xDC, 0xFA, 0x94, 0x5C, 0x77, 0x9E, \n+\t/* 0x2b8 */ 0x13, 0xA5, 0x7F, 0x52, 0xAD, 0x95, 0xF2, 0xF8, \n+\t/* 0x2c0 */ 0x93, 0x3B, 0xDE, 0x8B, 0x5C, 0x5B, 0xCA, 0x5A, \n+\t/* 0x2c8 */ 0x52, 0x5B, 0x60, 0xAF, 0x14, 0xF7, 0x4B, 0xEF, \n+\t/* 0x2d0 */ 0xA3, 0xFB, 0x9F, 0x40, 0x95, 0x6D, 0x31, 0x54, \n+\t/* 0x2d8 */ 0xFC, 0x42, 0xD3, 0xC7, 0x46, 0x1F, 0x23, 0xAD, \n+\t/* 0x2e0 */ 0xD9, 0x0F, 0x48, 0x70, 0x9A, 0xD9, 0x75, 0x78, \n+\t/* 0x2e8 */ 0x71, 0xD1, 0x72, 0x43, 0x34, 0x75, 0x6E, 0x57, \n+\t/* 0x2f0 */ 0x59, 0xC2, 0x02, 0x5C, 0x26, 0x60, 0x29, 0xCF, \n+\t/* 0x2f8 */ 0x23, 0x19, 0x16, 0x8E, 0x88, 0x43, 0xA5, 0xD4, \n+\t/* 0x300 */ 0xE4, 0xCB, 0x08, 0xFB, 0x23, 0x11, 0x43, 0xE8, \n+\t/* 0x308 */ 0x43, 0x29, 0x72, 0x62, 0xA1, 0xA9, 0x5D, 0x5E, \n+\t/* 0x310 */ 0x08, 0xD4, 0x90, 0xAE, 0xB8, 0xD8, 0xCE, 0x14, \n+\t/* 0x318 */ 0xC2, 0xD0, 0x55, 0xF2, 0x86, 0xF6, 0xC4, 0x93, \n+\t/* 0x320 */ 0x43, 0x77, 0x66, 0x61, 0xC0, 0xB9, 0xE8, 0x41, \n+\t/* 0x328 */ 0xD7, 0x97, 0x78, 0x60, 0x03, 0x6E, 0x4A, 0x72, \n+\t/* 0x330 */ 0xAE, 0xA5, 0xD1, 0x7D, 0xBA, 0x10, 0x9E, 0x86, \n+\t/* 0x338 */ 0x6C, 0x1B, 0x8A, 0xB9, 0x59, 0x33, 0xF8, 0xEB, \n+\t/* 0x340 */ 0xC4, 0x90, 0xBE, 0xF1, 0xB9, \n+};\n+static const lws_ss_x509_t _ss_x509_amazon_root_ca_1 \u003d {\n+\t.vhost_name \u003d \u0022amazon_root_ca_1\u0022,\n+\t.ca_der \u003d _ss_der_amazon_root_ca_1,\n+\t.ca_der_len \u003d 837,\n+};\n+static const uint8_t _ss_der_starfield_services_root_ca[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x03, 0xEF, 0x30, 0x82, 0x02, 0xD7, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, \n+\t/* 0x 10 */ 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, \n+\t/* 0x 18 */ 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, \n+\t/* 0x 20 */ 0x81, 0x98, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, \n+\t/* 0x 28 */ 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, \n+\t/* 0x 30 */ 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, \n+\t/* 0x 38 */ 0x13, 0x07, 0x41, 0x72, 0x69, 0x7A, 0x6F, 0x6E, \n+\t/* 0x 40 */ 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, \n+\t/* 0x 48 */ 0x04, 0x07, 0x13, 0x0A, 0x53, 0x63, 0x6F, 0x74, \n+\t/* 0x 50 */ 0x74, 0x73, 0x64, 0x61, 0x6C, 0x65, 0x31, 0x25, \n+\t/* 0x 58 */ 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, \n+\t/* 0x 60 */ 0x1C, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, \n+\t/* 0x 68 */ 0x6C, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, \n+\t/* 0x 70 */ 0x6F, 0x6C, 0x6F, 0x67, 0x69, 0x65, 0x73, 0x2C, \n+\t/* 0x 78 */ 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x3B, 0x30, \n+\t/* 0x 80 */ 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, \n+\t/* 0x 88 */ 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6C, \n+\t/* 0x 90 */ 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, \n+\t/* 0x 98 */ 0x65, 0x73, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, \n+\t/* 0x a0 */ 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, \n+\t/* 0x a8 */ 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, \n+\t/* 0x b0 */ 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, \n+\t/* 0x b8 */ 0x47, 0x32, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x39, \n+\t/* 0x c0 */ 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, \n+\t/* 0x c8 */ 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33, 0x37, 0x31, \n+\t/* 0x d0 */ 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, \n+\t/* 0x d8 */ 0x39, 0x5A, 0x30, 0x81, 0x98, 0x31, 0x0B, 0x30, \n+\t/* 0x e0 */ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, \n+\t/* 0x e8 */ 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, \n+\t/* 0x f0 */ 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, \n+\t/* 0x f8 */ 0x7A, 0x6F, 0x6E, 0x61, 0x31, 0x13, 0x30, 0x11, \n+\t/* 0x100 */ 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0A, 0x53, \n+\t/* 0x108 */ 0x63, 0x6F, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6C, \n+\t/* 0x110 */ 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, \n+\t/* 0x118 */ 0x04, 0x0A, 0x13, 0x1C, 0x53, 0x74, 0x61, 0x72, \n+\t/* 0x120 */ 0x66, 0x69, 0x65, 0x6C, 0x64, 0x20, 0x54, 0x65, \n+\t/* 0x128 */ 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, 0x69, \n+\t/* 0x130 */ 0x65, 0x73, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, \n+\t/* 0x138 */ 0x31, 0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x140 */ 0x03, 0x13, 0x32, 0x53, 0x74, 0x61, 0x72, 0x66, \n+\t/* 0x148 */ 0x69, 0x65, 0x6C, 0x64, 0x20, 0x53, 0x65, 0x72, \n+\t/* 0x150 */ 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6F, \n+\t/* 0x158 */ 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, \n+\t/* 0x160 */ 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, \n+\t/* 0x168 */ 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, \n+\t/* 0x170 */ 0x20, 0x2D, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, \n+\t/* 0x178 */ 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, \n+\t/* 0x180 */ 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, \n+\t/* 0x188 */ 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, \n+\t/* 0x190 */ 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xD5, 0x0C, \n+\t/* 0x198 */ 0x3A, 0xC4, 0x2A, 0xF9, 0x4E, 0xE2, 0xF5, 0xBE, \n+\t/* 0x1a0 */ 0x19, 0x97, 0x5F, 0x8E, 0x88, 0x53, 0xB1, 0x1F, \n+\t/* 0x1a8 */ 0x3F, 0xCB, 0xCF, 0x9F, 0x20, 0x13, 0x6D, 0x29, \n+\t/* 0x1b0 */ 0x3A, 0xC8, 0x0F, 0x7D, 0x3C, 0xF7, 0x6B, 0x76, \n+\t/* 0x1b8 */ 0x38, 0x63, 0xD9, 0x36, 0x60, 0xA8, 0x9B, 0x5E, \n+\t/* 0x1c0 */ 0x5C, 0x00, 0x80, 0xB2, 0x2F, 0x59, 0x7F, 0xF6, \n+\t/* 0x1c8 */ 0x87, 0xF9, 0x25, 0x43, 0x86, 0xE7, 0x69, 0x1B, \n+\t/* 0x1d0 */ 0x52, 0x9A, 0x90, 0xE1, 0x71, 0xE3, 0xD8, 0x2D, \n+\t/* 0x1d8 */ 0x0D, 0x4E, 0x6F, 0xF6, 0xC8, 0x49, 0xD9, 0xB6, \n+\t/* 0x1e0 */ 0xF3, 0x1A, 0x56, 0xAE, 0x2B, 0xB6, 0x74, 0x14, \n+\t/* 0x1e8 */ 0xEB, 0xCF, 0xFB, 0x26, 0xE3, 0x1A, 0xBA, 0x1D, \n+\t/* 0x1f0 */ 0x96, 0x2E, 0x6A, 0x3B, 0x58, 0x94, 0x89, 0x47, \n+\t/* 0x1f8 */ 0x56, 0xFF, 0x25, 0xA0, 0x93, 0x70, 0x53, 0x83, \n+\t/* 0x200 */ 0xDA, 0x84, 0x74, 0x14, 0xC3, 0x67, 0x9E, 0x04, \n+\t/* 0x208 */ 0x68, 0x3A, 0xDF, 0x8E, 0x40, 0x5A, 0x1D, 0x4A, \n+\t/* 0x210 */ 0x4E, 0xCF, 0x43, 0x91, 0x3B, 0xE7, 0x56, 0xD6, \n+\t/* 0x218 */ 0x00, 0x70, 0xCB, 0x52, 0xEE, 0x7B, 0x7D, 0xAE, \n+\t/* 0x220 */ 0x3A, 0xE7, 0xBC, 0x31, 0xF9, 0x45, 0xF6, 0xC2, \n+\t/* 0x228 */ 0x60, 0xCF, 0x13, 0x59, 0x02, 0x2B, 0x80, 0xCC, \n+\t/* 0x230 */ 0x34, 0x47, 0xDF, 0xB9, 0xDE, 0x90, 0x65, 0x6D, \n+\t/* 0x238 */ 0x02, 0xCF, 0x2C, 0x91, 0xA6, 0xA6, 0xE7, 0xDE, \n+\t/* 0x240 */ 0x85, 0x18, 0x49, 0x7C, 0x66, 0x4E, 0xA3, 0x3A, \n+\t/* 0x248 */ 0x6D, 0xA9, 0xB5, 0xEE, 0x34, 0x2E, 0xBA, 0x0D, \n+\t/* 0x250 */ 0x03, 0xB8, 0x33, 0xDF, 0x47, 0xEB, 0xB1, 0x6B, \n+\t/* 0x258 */ 0x8D, 0x25, 0xD9, 0x9B, 0xCE, 0x81, 0xD1, 0x45, \n+\t/* 0x260 */ 0x46, 0x32, 0x96, 0x70, 0x87, 0xDE, 0x02, 0x0E, \n+\t/* 0x268 */ 0x49, 0x43, 0x85, 0xB6, 0x6C, 0x73, 0xBB, 0x64, \n+\t/* 0x270 */ 0xEA, 0x61, 0x41, 0xAC, 0xC9, 0xD4, 0x54, 0xDF, \n+\t/* 0x278 */ 0x87, 0x2F, 0xC7, 0x22, 0xB2, 0x26, 0xCC, 0x9F, \n+\t/* 0x280 */ 0x59, 0x54, 0x68, 0x9F, 0xFC, 0xBE, 0x2A, 0x2F, \n+\t/* 0x288 */ 0xC4, 0x55, 0x1C, 0x75, 0x40, 0x60, 0x17, 0x85, \n+\t/* 0x290 */ 0x02, 0x55, 0x39, 0x8B, 0x7F, 0x05, 0x02, 0x03, \n+\t/* 0x298 */ 0x01, 0x00, 0x01, 0xA3, 0x42, 0x30, 0x40, 0x30, \n+\t/* 0x2a0 */ 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, \n+\t/* 0x2a8 */ 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, \n+\t/* 0x2b0 */ 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, \n+\t/* 0x2b8 */ 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, \n+\t/* 0x2c0 */ 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, \n+\t/* 0x2c8 */ 0x16, 0x04, 0x14, 0x9C, 0x5F, 0x00, 0xDF, 0xAA, \n+\t/* 0x2d0 */ 0x01, 0xD7, 0x30, 0x2B, 0x38, 0x88, 0xA2, 0xB8, \n+\t/* 0x2d8 */ 0x6D, 0x4A, 0x9C, 0xF2, 0x11, 0x91, 0x83, 0x30, \n+\t/* 0x2e0 */ 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, \n+\t/* 0x2e8 */ 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, \n+\t/* 0x2f0 */ 0x01, 0x01, 0x00, 0x4B, 0x36, 0xA6, 0x84, 0x77, \n+\t/* 0x2f8 */ 0x69, 0xDD, 0x3B, 0x19, 0x9F, 0x67, 0x23, 0x08, \n+\t/* 0x300 */ 0x6F, 0x0E, 0x61, 0xC9, 0xFD, 0x84, 0xDC, 0x5F, \n+\t/* 0x308 */ 0xD8, 0x36, 0x81, 0xCD, 0xD8, 0x1B, 0x41, 0x2D, \n+\t/* 0x310 */ 0x9F, 0x60, 0xDD, 0xC7, 0x1A, 0x68, 0xD9, 0xD1, \n+\t/* 0x318 */ 0x6E, 0x86, 0xE1, 0x88, 0x23, 0xCF, 0x13, 0xDE, \n+\t/* 0x320 */ 0x43, 0xCF, 0xE2, 0x34, 0xB3, 0x04, 0x9D, 0x1F, \n+\t/* 0x328 */ 0x29, 0xD5, 0xBF, 0xF8, 0x5E, 0xC8, 0xD5, 0xC1, \n+\t/* 0x330 */ 0xBD, 0xEE, 0x92, 0x6F, 0x32, 0x74, 0xF2, 0x91, \n+\t/* 0x338 */ 0x82, 0x2F, 0xBD, 0x82, 0x42, 0x7A, 0xAD, 0x2A, \n+\t/* 0x340 */ 0xB7, 0x20, 0x7D, 0x4D, 0xBC, 0x7A, 0x55, 0x12, \n+\t/* 0x348 */ 0xC2, 0x15, 0xEA, 0xBD, 0xF7, 0x6A, 0x95, 0x2E, \n+\t/* 0x350 */ 0x6C, 0x74, 0x9F, 0xCF, 0x1C, 0xB4, 0xF2, 0xC5, \n+\t/* 0x358 */ 0x01, 0xA3, 0x85, 0xD0, 0x72, 0x3E, 0xAD, 0x73, \n+\t/* 0x360 */ 0xAB, 0x0B, 0x9B, 0x75, 0x0C, 0x6D, 0x45, 0xB7, \n+\t/* 0x368 */ 0x8E, 0x94, 0xAC, 0x96, 0x37, 0xB5, 0xA0, 0xD0, \n+\t/* 0x370 */ 0x8F, 0x15, 0x47, 0x0E, 0xE3, 0xE8, 0x83, 0xDD, \n+\t/* 0x378 */ 0x8F, 0xFD, 0xEF, 0x41, 0x01, 0x77, 0xCC, 0x27, \n+\t/* 0x380 */ 0xA9, 0x62, 0x85, 0x33, 0xF2, 0x37, 0x08, 0xEF, \n+\t/* 0x388 */ 0x71, 0xCF, 0x77, 0x06, 0xDE, 0xC8, 0x19, 0x1D, \n+\t/* 0x390 */ 0x88, 0x40, 0xCF, 0x7D, 0x46, 0x1D, 0xFF, 0x1E, \n+\t/* 0x398 */ 0xC7, 0xE1, 0xCE, 0xFF, 0x23, 0xDB, 0xC6, 0xFA, \n+\t/* 0x3a0 */ 0x8D, 0x55, 0x4E, 0xA9, 0x02, 0xE7, 0x47, 0x11, \n+\t/* 0x3a8 */ 0x46, 0x3E, 0xF4, 0xFD, 0xBD, 0x7B, 0x29, 0x26, \n+\t/* 0x3b0 */ 0xBB, 0xA9, 0x61, 0x62, 0x37, 0x28, 0xB6, 0x2D, \n+\t/* 0x3b8 */ 0x2A, 0xF6, 0x10, 0x86, 0x64, 0xC9, 0x70, 0xA7, \n+\t/* 0x3c0 */ 0xD2, 0xAD, 0xB7, 0x29, 0x70, 0x79, 0xEA, 0x3C, \n+\t/* 0x3c8 */ 0xDA, 0x63, 0x25, 0x9F, 0xFD, 0x68, 0xB7, 0x30, \n+\t/* 0x3d0 */ 0xEC, 0x70, 0xFB, 0x75, 0x8A, 0xB7, 0x6D, 0x60, \n+\t/* 0x3d8 */ 0x67, 0xB2, 0x1E, 0xC8, 0xB9, 0xE9, 0xD8, 0xA8, \n+\t/* 0x3e0 */ 0x6F, 0x02, 0x8B, 0x67, 0x0D, 0x4D, 0x26, 0x57, \n+\t/* 0x3e8 */ 0x71, 0xDA, 0x20, 0xFC, 0xC1, 0x4A, 0x50, 0x8D, \n+\t/* 0x3f0 */ 0xB1, 0x28, 0xBA, \n+};\n+static const lws_ss_x509_t _ss_x509_starfield_services_root_ca \u003d {\n+\t.vhost_name \u003d \u0022starfield_services_root_ca\u0022,\n+\t.ca_der \u003d _ss_der_starfield_services_root_ca,\n+\t.ca_der_len \u003d 1011,\n+};\n+static const lws_ss_trust_store_t _ss_ts_s3_root_cert \u003d {\n+\t.name \u003d \u0022s3-root-cert\u0022,\n+\t.count \u003d 3,\n+\t.ssx509 \u003d {\n+\t\t\u0026_ss_x509_starfield_services_root_ca,\n+\t\t\u0026_ss_x509_amazon_root_ca_1,\n+\t\t\u0026_ss_x509_baltimore_cybertrust_root,\n+\t}\n+};\n+\n+static const lws_ss_auth_t _ssau_sigv4_br \u003d {\n+\t.name \u003d \u0022sigv4_br\u0022,\n+\t.type\u003d \u0022sigv4\u0022,\n+\t.streamtype \u003d \u0022(null)\u0022,\n+\t.blob_index \u003d 0,\n+};\n+\n+\n+static const lws_ss_policy_t _ssp_s3PutObj \u003d {\n+\t.streamtype \u003d \u0022s3PutObj\u0022,\n+\t.endpoint \u003d \u0022${s3bucket}.s3.amazonaws.com\u0022,\n+\t.auth \u003d \u0026_ssau_sigv4_br,\n+\t.metadata \u003d (void *)\u0026_md_s3PutObj_region,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022PUT\u0022,\n+\t\t\t.url \u003d \u0022${s3Obj}\u0022,\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x11,\n+\t.priority \u003d 0x0,\n+\t.port \u003d 443,\n+\t.metadata_count \u003d 8,\n+\t.protocol \u003d 0,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_s3_root_cert},\n+\t.aws_region\u003d \u0022region\u0022,\n+\t.aws_service\u003d \u0022service\u0022,\n+};\n+#define _ss_static_policy_entry _ssp_s3PutObj\n+/* estimated footprint 3559 (when sizeof void * \u003d 8) */\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/CMakeLists.txt\nnew file mode 100644\nindex 0000000..d5488de\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/CMakeLists.txt\n@@ -0,0 +1,187 @@\n+project(lws-minimal-secure-streams-smd C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SYS_SMD 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection)\n+\n+if (requirements)\n+\tadd_executable(${PROJECT_NAME} minimal-secure-streams-smd.c)\n+\t\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\n+\t\tif (VALGRIND)\n+\t\t\tadd_test(NAME ss-smd COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-smd\u003e)\n+\t\telse()\n+\t\n+\t\t\tadd_test(NAME ss-smd COMMAND lws-minimal-secure-streams-smd)\n+\t\tendif()\n+\t\tset_tests_properties(ss-smd\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd\n+\t\t\t\t TIMEOUT 10)\n+\n+ if (has_fault_injection)\n+ if (VALGRIND)\n+ add_test(NAME ss-smd-fi1 COMMAND\n+ ${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+ $\u003cTARGET_FILE:lws-minimal-secure-streams-smd\u003e\n+ --fault-injection \u0022ss/ss_create_smd\u0022\n+ --expected-exit 1)\n+ add_test(NAME ss-smd-fi2 COMMAND\n+ ${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+ $\u003cTARGET_FILE:lws-minimal-secure-streams-smd\u003e\n+ --fault-injection \u0022ss/ss_create_smd_1\u0022\n+ --expected-exit 1)\n+ add_test(NAME ss-smd-fi3 COMMAND\n+ ${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+ $\u003cTARGET_FILE:lws-minimal-secure-streams-smd\u003e\n+ --fault-injection \u0022ss/ss_create_smd_2\u0022\n+ --expected-exit 1)\n+\t\t else()\n+ add_test(NAME ss-smd-fi1 COMMAND lws-minimal-secure-streams-smd\n+ --fault-injection \u0022ss/ss_create_smd\u0022\n+ --expected-exit 1)\n+ add_test(NAME ss-smd-fi2 COMMAND lws-minimal-secure-streams-smd\n+ --fault-injection \u0022ss/ss_create_smd_1\u0022\n+ --expected-exit 1)\n+ add_test(NAME ss-smd-fi3 COMMAND lws-minimal-secure-streams-smd\n+ --fault-injection \u0022ss/ss_create_smd_2\u0022\n+ --expected-exit 1) \n+ \t\t\tendif()\n+\n+ set_tests_properties(ss-smd-fi1\n+\t\t\t \t\t ss-smd-fi2\n+\t\t\t\t\t ss-smd-fi3\n+ PROPERTIES\n+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd\n+ TIMEOUT 5)\n+ endif()\n+ \n+\t\n+\t\n+ endif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${PROJECT_NAME}-client minimal-secure-streams-smd.c multi.c)\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${PROJECT_NAME}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\t\t\n+\t\t#\n+\t\t# Define test dep to bring up and take down the test\n+\t\t# proxy\n+\t\t#\n+\n+\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t# uds abstract namespace for linux\n+\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-sspsmd_sspc-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\telse()\n+\t\t\t# filesystem socket for others\n+\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-sspsmd_sspc-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\tendif()\n+\n+\t\tadd_test(NAME st_ssprxsmd_sspc COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\tssproxysmd_sspc $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\tset_tests_properties(st_ssprxsmd_sspc PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssproxysmd_sspc TIMEOUT 800)\n+\n+\t\tadd_test(NAME ki_ssprxsmd_sspc COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\tssproxysmd_sspc $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\tset_tests_properties(ki_ssprxsmd_sspc PROPERTIES FIXTURES_CLEANUP ssproxysmd_sspc)\n+\n+\t\t#\n+\t\t# the client part that will connect to the proxy\n+\t\t#\n+\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME sspcsmd_sspc COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-smd-client\u003e -i +${CTEST_SOCKET_PATH})\n+\t\telse()\n+\t\t\tadd_test(NAME sspcsmd_sspc COMMAND lws-minimal-secure-streams-smd-client -i +${CTEST_SOCKET_PATH})\n+\t\tendif()\n+\t\tset_tests_properties(sspcsmd_sspc PROPERTIES\n+\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd\n+\t\t\tFIXTURES_REQUIRED \u0022ssproxysmd_sspc\u0022\n+\t\t\tTIMEOUT 80)\n+\t\t\t\n+\t\t\n+\t\t#\n+\t\t# Define test dep to bring up and take down the test\n+\t\t# proxy\n+\t\t#\n+\n+\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t# uds abstract namespace for linux\n+\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-mul-sspsmd_sspc-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\telse()\n+\t\t\t# filesystem socket for others\n+\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-mul-sspsmd_sspc-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\tendif()\n+\n+\t\tadd_test(NAME st_mulssprxsmd_sspc COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\tmulssproxysmd_sspc $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\tset_tests_properties(st_mulssprxsmd_sspc PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP mulssproxysmd_sspc TIMEOUT 800)\n+\n+\t\tadd_test(NAME ki_mulssprxsmd_sspc COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\tmulssproxysmd_sspc $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\tset_tests_properties(ki_mulssprxsmd_sspc PROPERTIES FIXTURES_CLEANUP mulssproxysmd_sspc)\n+\n+\t\t#\n+\t\t# multi tests for the client part that will connect to the proxy\n+\t\t#\n+\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME mulsspcsmd_sspc COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-smd-client\u003e -i +${CTEST_SOCKET_PATH} --multi -d1039)\n+\t\telse()\n+\t\t\tadd_test(NAME mulsspcsmd_sspc COMMAND lws-minimal-secure-streams-smd-client -i +${CTEST_SOCKET_PATH} --multi -d1039)\n+\t\tendif()\n+\t\tset_tests_properties(mulsspcsmd_sspc PROPERTIES\n+\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd\n+\t\t\tFIXTURES_REQUIRED \u0022mulssproxysmd_sspc\u0022\n+\t\t\tTIMEOUT 80)\n+\t\t\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/README.md\nnew file mode 100644\nindex 0000000..41e9c7e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/README.md\n@@ -0,0 +1,132 @@\n+# lws minimal secure streams SMD\n+\n+This application creates a Secure Stream link to LWS SMD, System\n+Message Distribution.\n+\n+The SS is able to receive system messages matching a specified\n+class filter, and issue system messages also using SS payload\n+semantics.\n+\n+Both a direct api lws_smd participant and an SS based one are instantiated.\n+They both filter on system messages.\n+\n+When the Secure Stream is created, it asks to send using normal the SS api.\n+In the SS tx callback, it prepares a header and then send a NETWORK class\n+message.\n+\n+Numbers of messages received each way and sent is compared after 2s and the\n+test exits with a success or a fail.\n+\n+### Building and testing\n+\n+Build with\n+\n+ -DLWS_WITH_SECURE_STREAMS\u003d1\n+ -DLWS_WITH_SECURE_STREAMS_PROXY_API\u003d1\n+ -DLWS_WITH_MINIMAL_EXAMPLES\u003d1\n+\n+The run ./bin/lws-minimal-secure-streams-smd alone (local SS and direct SMD tests)\n+and after run ./bin/lws-minimal-secure-streams-proxy in one console and\n+./bin-lws-minimal-secure-streams-smd-client in the other (SS proxy tests)\n+\n+### What's going on in the -client test\n+\n+The -client build version contains the test logic as usual, but outsources the\n+policy and smd_ server part to the Secure Streams Proxy.\n+\n+ - start lws-minimal-secure-streams-proxy first\n+ \n+ - start lws-minimal-secure-streams-smd-client\n+ \n+1) When the client starts, we waits to hear the client state is OPERATIONAL in\n+a direct smd participant callback. When it is, he creates a Secure Stream of\n+streamtype \u0022_lws_smd\u0022, creating a local SS handle.\n+\n+2) The SS creation request is proxied to the SS proxy process over Unix Domain\n+Sockets. There it creates a Secure Stream object proxyside, and registers as\n+an SMD participant... this smd-related behaviour is tied to the special\n+streamtype name \u0022_lws_smd\u0022. The SMD registration uses a class mask passed to\n+the proxy in the tx credit field of the serialization.\n+\n+3) SMD messages that pass the class mask filter are proxied back to the client\n+over the connection.\n+\n+4) SMD messages created at the client are passed to the proxy and added to the\n+proxy's SMD queue, if the same connection's class mask accepts the message then\n+it will be proxied back to the client same as other messages.\n+\n+The minimal example produces a variety of messages on the SS link, including\n+CPD detect trigger. The SS link is set up to only accept messages of classes\n+LWSSMDCL_SYSTEM_STATE and LWSSMDCL_NETWORK, INTERACTION type messages are\n+not accepted.\n+\n+### multi via proxy\n+\n+If the -client version is run with `--multi`, it spawns four worker processes\n+which send and confirm SMD messages between each other via the SS proxy.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+--multi|Fork four worker processes that send and check messages to each other over sspc proxy\n+\n+```\n+$ ./bin/lws-minimal-secure-streams-smd -d 1151\n+[2020/06/18 21:44:54:5148] U: LWS Secure Streams SMD test client [-d\u003cverb\u003e]\n+[2020/06/18 21:44:54:5601] I: Initial logging level 1151\n+[2020/06/18 21:44:54:5605] I: Libwebsockets version: 4.0.99-v4.0.0-174-ga8a2eb954 v4.0.0-174-ga8a2eb954\n+[2020/06/18 21:44:54:5607] I: IPV6 not compiled in\n+...\n+[2020/06/18 21:44:54:7906] D: _lws_state_transition: system: changed 11 'AUTH2' -\u003e 12 'OPERATIONAL'\n+[2020/06/18 21:44:54:7906] D: _realloc: size 81: lws_smd_msg_alloc\n+[2020/06/18 21:44:54:7907] I: lws_cancel_service\n+[2020/06/18 21:44:54:7912] I: lws_state_transition_steps: CONTEXT_CREATED -\u003e OPERATIONAL\n+[2020/06/18 21:44:54:7919] N: myss_tx: sending SS smd\n+[2020/06/18 21:44:54:7940] D: _realloc: size 84: lws_smd_msg_alloc\n+[2020/06/18 21:44:54:7944] I: lws_cancel_service\n+[2020/06/18 21:44:54:7966] D: direct_smd_cb: class: 0x2, ts: 3139600721554\n+[2020/06/18 21:44:54:7972] D: \n+[2020/06/18 21:44:54:7990] D: 0000: 7B 22 73 74 61 74 65 22 3A 22 49 4E 49 54 49 41 {\u0022state\u0022:\u0022INITIA\n+[2020/06/18 21:44:54:7998] D: 0010: 4C 49 5A 45 44 22 7D LIZED\u0022} \n+[2020/06/18 21:44:54:8001] D: \n+[2020/06/18 21:44:54:8016] I: myss_rx: len 39, flags: 3\n+[2020/06/18 21:44:54:8018] I: \n+[2020/06/18 21:44:54:8021] I: 0000: 00 00 00 00 00 00 00 02 00 00 02 DA FE C9 26 92 ..............\u0026.\n+[2020/06/18 21:44:54:8022] I: 0010: 7B 22 73 74 61 74 65 22 3A 22 49 4E 49 54 49 41 {\u0022state\u0022:\u0022INITIA\n+[2020/06/18 21:44:54:8023] I: 0020: 4C 49 5A 45 44 22 7D LIZED\u0022} \n+[2020/06/18 21:44:54:8023] I: \n+[2020/06/18 21:44:54:8029] D: direct_smd_cb: class: 0x2, ts: 3139600724243\n+[2020/06/18 21:44:54:8029] D: \n+[2020/06/18 21:44:54:8030] D: 0000: 7B 22 73 74 61 74 65 22 3A 22 49 46 41 43 45 5F {\u0022state\u0022:\u0022IFACE_\n+[2020/06/18 21:44:54:8031] D: 0010: 43 4F 4C 44 50 4C 55 47 22 7D COLDPLUG\u0022} \n+[2020/06/18 21:44:54:8032] D: \n+...\n+[2020/06/18 21:44:54:8112] D: direct_smd_cb: class: 0x4, ts: 3139600732952\n+[2020/06/18 21:44:54:8112] D: \n+[2020/06/18 21:44:54:8114] D: 0000: 7B 22 73 6F 6D 74 68 69 6E 67 22 3A 22 6E 6F 74 {\u0022somthing\u0022:\u0022not\n+[2020/06/18 21:44:54:8115] D: 0010: 73 65 65 6E 62 79 73 73 72 78 22 7D seenbyssrx\u0022} \n+[2020/06/18 21:44:54:8115] D: \n+[2020/06/18 21:44:57:5823] I: 11 12 1\n+[2020/06/18 21:44:57:5838] I: lws_context_destroy: ctx 0x4f61db0\n+[2020/06/18 21:44:57:5849] D: _lws_state_transition: system: changed 12 'OPERATIONAL' -\u003e 13 'POLICY_INVALID'\n+[2020/06/18 21:44:57:5851] D: _realloc: size 84: lws_smd_msg_alloc\n+[2020/06/18 21:44:57:5853] I: lws_cancel_service\n+[2020/06/18 21:44:57:5871] I: lws_destroy_event_pipe\n+[2020/06/18 21:44:57:5906] I: lws_pt_destroy: pt destroyed\n+[2020/06/18 21:44:57:5913] I: lws_context_destroy2: ctx 0x4f61db0\n+[2020/06/18 21:44:57:5936] D: lwsac_free: head (nil)\n+[2020/06/18 21:44:57:5947] D: 0x455970: post vh listl\n+[2020/06/18 21:44:57:5950] D: 0x455970: post pdl\n+[2020/06/18 21:44:57:5961] D: 0x455970: baggage\n+[2020/06/18 21:44:57:5968] D: 0x455970: post dc2\n+[2020/06/18 21:44:57:6010] D: lws_context_destroy3: ctx 0x4f61db0 freed\n+[2020/06/18 21:44:57:6014] U: Completed: OK\n+```\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c\nnew file mode 100644\nindex 0000000..1abb074\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c\n@@ -0,0 +1,374 @@\n+/*\n+ * lws-minimal-secure-streams-smd\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams to access the\n+ * SMD api.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, count_p1, count_p2, count_tx, expected \u003d 0;\n+static unsigned int how_many_msg \u003d 100, usec_interval \u003d 1000;\n+static lws_sorted_usec_list_t sul_timeout;\n+\n+/*\n+ * If the -proxy app is fulfilling our connection, then we don't need to have\n+ * the policy in the client.\n+ *\n+ * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over\n+ * a Unix Domain Socket. To test that, you need to separately run the\n+ * ./lws-minimal-secure-streams-proxy test app on the same machine.\n+ */\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t\t\u0022\u005c\u0022schema-version\u005c\u0022:1,\u0022\n+\t\t\u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t/*\n+\t\t\t\t * \u0022captive_portal_detect\u0022 describes\n+\t\t\t\t * what to do in order to check if the path to\n+\t\t\t\t * the Internet is being interrupted by a\n+\t\t\t\t * captive portal. If there's a larger policy\n+\t\t\t\t * fetched from elsewhere, it should also include\n+\t\t\t\t * this since it needs to be done at least after\n+\t\t\t\t * every DHCP acquisition\n+\t\t\t\t */\n+\t\t\t\t\u0022\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+\t\t\t\t\u0022}\u0022\n+\t\t\t\u0022}\u0022\n+\t\t\u0022]\u0022\n+\t\u0022}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tchar\t\t\t\talternate;\n+} myss_t;\n+\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\t/*\n+\t * Call the helper to translate into a real smd message and forward to\n+\t * this context / process smd participants... except us, since we\n+\t * definitely already received it\n+\t */\n+\n+\tif (lws_smd_ss_rx_forward(userobj, buf, len))\n+\t\tlwsl_warn(\u0022%s: forward failed\u005cn\u0022, __func__);\n+\n+\tcount_p1++;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static void\n+sul_tx_periodic_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tmyss_t *m \u003d lws_container_of(sul, myss_t, sul);\n+\n+\tlwsl_info(\u0022%s: requesting TX\u005cn\u0022, __func__);\n+\tif (lws_ss_request_tx(m-\u003ess))\n+\t\tlwsl_info(\u0022%s: req failed\u005cn\u0022, __func__);\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_info(\u0022%s: sending SS smd\u005cn\u0022, __func__);\n+\n+\t/*\n+\t * The SS RX isn't going to see INTERACTION messages, because its class\n+\t * filter doesn't accept INTERACTION class messages. The direct\n+\t * participant we also set up for the test will see them though.\n+\t *\n+\t * Let's alternate between sending NETWORK class smd messages and\n+\t * INTERACTION so we can test both rx paths\n+\t */\n+\n+\tm-\u003ealternate++;\n+\n+\tif (m-\u003ealternate \u003d\u003d 4) {\n+\t\t/*\n+\t\t * after a few, let's request a CPD check\n+\t\t */\n+\n+\t\tif (lws_smd_ss_msg_printf(lws_ss_tag(m-\u003ess), buf, len, LWSSMDCL_NETWORK,\n+\t\t\t\t\t \u0022{\u005c\u0022trigger\u005c\u0022: \u005c\u0022cpdcheck\u005c\u0022, \u0022\n+\t\t\t\t\t \u0022\u005c\u0022src\u005c\u0022:\u005c\u0022SS-test\u005c\u0022}\u0022))\n+\t\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\t} else\n+\t\tif (lws_smd_ss_msg_printf(lws_ss_tag(m-\u003ess), buf, len,\n+\t\t\t\t\t (m-\u003ealternate \u0026 1) ? LWSSMDCL_NETWORK :\n+\t\t\t\t\t\t\t LWSSMDCL_INTERACTION,\n+\t\t\t\t\t (m-\u003ealternate \u0026 1) ?\n+\t\t\t\t\t \u0022{\u005c\u0022class\u005c\u0022:\u005c\u0022NETWORK\u005c\u0022,\u005c\u0022x\u005c\u0022:%d}\u0022 :\n+\t\t\t\t\t \u0022{\u005c\u0022class\u005c\u0022:\u005c\u0022INTERACTION\u005c\u0022,\u005c\u0022x\u005c\u0022:%d}\u0022,\n+\t\t\t\t\t count_tx))\n+\t\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+\t*flags \u003d LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;\n+\n+\tcount_tx++;\n+\n+\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul,\n+\t\t\t sul_tx_periodic_cb, usec_interval);\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_notice(\u0022%s: %s: %s (%d), ord 0x%x\u005cn\u0022, __func__, lws_ss_tag(m-\u003ess),\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tif (state \u003d\u003d LWSSSCS_DESTROYING) {\n+\t\tlws_sul_cancel(\u0026m-\u003esul);\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\tif (state \u003d\u003d LWSSSCS_CONNECTED) {\n+\t\tlwsl_notice(\u0022%s: CONNECTED\u005cn\u0022, __func__);\n+\t\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul,\n+\t\t\t\t sul_tx_periodic_cb, 1);\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static const lws_ss_info_t ssi_lws_smd \u003d {\n+\t.handle_offset\t\t \u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset \u003d offsetof(myss_t, opaque_data),\n+\t.rx\t\t\t \u003d myss_rx,\n+\t.tx\t\t\t \u003d myss_tx,\n+\t.state\t\t\t \u003d myss_state,\n+\t.user_alloc\t\t \u003d sizeof(myss_t),\n+\t.streamtype\t\t \u003d LWS_SMD_STREAMTYPENAME,\n+\t.manual_initial_tx_credit \u003d LWSSMDCL_SYSTEM_STATE |\n+\t\t\t\t LWSSMDCL_METRICS |\n+\t\t\t\t LWSSMDCL_NETWORK,\n+};\n+\n+/* for comparison, this is a non-SS lws_smd participant */\n+\n+static int\n+direct_smd_cb(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,\n+\t void *buf, size_t len)\n+{\n+\tstruct lws_context **pctx \u003d (struct lws_context **)opaque;\n+\n+//\tlwsl_notice(\u0022%s: class: 0x%x, ts: %llu\u005cn\u0022, __func__, _class,\n+//\t\t (unsigned long long)timestamp);\n+//\tlwsl_hexdump_notice(buf, len);\n+\n+\tcount_p2++;\n+\n+\tif (_class !\u003d LWSSMDCL_SYSTEM_STATE)\n+\t\treturn 0;\n+\n+\tif (!lws_json_simple_strcmp(buf, len, \u0022\u005c\u0022state\u005c\u0022:\u0022, \u0022OPERATIONAL\u0022)) {\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\t\t/*\n+\t\t * Let's trigger a CPD check, just as a test. SS can't see it\n+\t\t * anyway since it doesn't listen for NETWORK but the direct /\n+\t\t * local participant will see it and the result\n+\t\t *\n+\t\t * This process doesn't run the smd / captive portal action\n+\t\t * when it's a client of the SS proxy. SMD has to be passed\n+\t\t * via the SS _lws_smd proxied connection in that case.\n+\t\t */\n+\t\t(void)lws_smd_msg_printf(*pctx, LWSSMDCL_NETWORK,\n+\t\t\t\t \u0022{\u005c\u0022trigger\u005c\u0022: \u005c\u0022cpdcheck\u005c\u0022, \u005c\u0022src\u005c\u0022:\u005c\u0022direct-test\u005c\u0022}\u0022);\n+#endif\n+\n+\t\t/*\n+\t\t * Create the SS link to lws_smd... notice in ssi_lws_smd\n+\t\t * above, we tell this link to use a class filter that excludes\n+\t\t * NETWORK messages.\n+\t\t */\n+\n+\t\tif (lws_ss_create(*pctx, 0, \u0026ssi_lws_smd, NULL, NULL, NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\t\tinterrupted \u003d 1;\n+\t\t\tlws_cancel_service(*pctx);\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+\n+static void\n+sul_timeout_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tlwsl_notice(\u0022%s: test finishing\u005cn\u0022, __func__);\n+\tinterrupted \u003d 1;\n+}\n+\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+extern int smd_ss_multi_test(int argc, const char **argv);\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\n+#if defined(LWS_SS_USE_SSPC)\n+\tif (lws_cmdline_option(argc, argv, \u0022--multi\u0022))\n+\t\treturn smd_ss_multi_test(argc, argv);\n+#endif\n+\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--count\u0022)))\n+\t\thow_many_msg \u003d (unsigned int)atol(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--interval\u0022)))\n+\t\tusec_interval \u003d (unsigned int)atol(p);\n+\n+\tlwsl_user(\u0022LWS Secure Streams SMD test client [-d\u003cverb\u003e]: \u0022\n+\t\t \u0022%u msgs at %uus interval\u005cn\u0022, how_many_msg, usec_interval);\n+\n+\tinfo.fd_limit_per_thread\t\u003d 1 + 6 + 1;\n+\tinfo.port\t\t\t\u003d CONTEXT_PORT_NO_LISTEN;\n+#if !defined(LWS_SS_USE_SSPC)\n+\tinfo.pss_policies_json\t\t\u003d default_ss_policy;\n+#else\n+\tinfo.protocols\t\t\t\u003d lws_sspc_protocols;\n+\t{\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#endif\n+\tinfo.options\t\t\t\u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t\t\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\tinfo.early_smd_cb\t\t\u003d direct_smd_cb;\n+\tinfo.early_smd_class_filter\t\u003d 0xffffffff;\n+\tinfo.early_smd_opaque\t\t\u003d \u0026context;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+#if defined(LWS_SS_USE_SSPC)\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022%s: failed to create default vhost\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+#endif\n+\n+\t/* set up the test timeout */\n+\n+\tlws_sul_schedule(context, 0, \u0026sul_timeout, sul_timeout_cb,\n+\t\t\t (how_many_msg * (usec_interval + 50000)) + LWS_US_PER_SEC);\n+\n+\t/* the event loop */\n+\n+\twhile (lws_service(context, 0) \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\t;\n+\n+\t/* compare what happened with what we expect */\n+\n+#if defined(LWS_SS_USE_SSPC)\n+\t/* if SSPC\n+\t *\n+\t * - the SS _lws_smd link does not enable INTERACTION class, so doesn't\n+\t * see these messages (count_p1 is half count_tx)\n+\t *\n+\t * - the direct smd participant sees local state, but it doesn't send\n+\t * any local CPD request, since as a client it doesn't do CPD\n+\t * directly (count_p2 -\u003d 1 compared to non-SSPC)\n+\t *\n+\t * - one CPD trigger is sent on the proxied SS link (countp1 +\u003d 1)\n+\t */\n+\tif (count_p1 \u003e\u003d 6 \u0026\u0026 count_p2 \u003e\u003d 11 \u0026\u0026 count_tx \u003e\u003d 12)\n+#else\n+\t/* if not SSPC, then we can see direct smd activity */\n+\tif (count_p1 \u003e\u003d 2 \u0026\u0026 count_p2 \u003e\u003d 15 \u0026\u0026 count_tx \u003e\u003d 5)\n+#endif\n+\t\tbad \u003d 0;\n+\n+\tlwsl_notice(\u0022%d %d %d\u005cn\u0022, count_p1, count_p2, count_tx);\n+\n+#if defined(LWS_SS_USE_SSPC)\n+bail:\n+#endif\n+\tlws_context_destroy(context);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n+\t\texpected \u003d atoi(p);\n+\n+\tif (bad \u003d\u003d expected) {\n+\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, expected);\n+\t\treturn 0;\n+\t}\n+\n+\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, bad, expected);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/multi.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/multi.c\nnew file mode 100644\nindex 0000000..fcf851d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/multi.c\n@@ -0,0 +1,419 @@\n+/*\n+ * lws-minimal-secure-streams-smd\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams to access the\n+ * SMD api. This file is only built when LWS_SS_USE_SSPC defined.\n+ *\n+ * This is an alternative test implementation selected by --multi at runtime,\n+ * it's in its own file to stop muddying up the main test sources. It's only\n+ * available when built with SSPC / produces -client executable.\n+ *\n+ * We will fork several times, the original thread and the forks hook up to\n+ * the proxy with smd SS, each fork waits a second for everyone to have joined,\n+ * and then each fork (NOT the original process) sends a bunch of user messages\n+ * that all the forks should receive, having been distributed by SMD and the\n+ * ss proxy.\n+ *\n+ * The participants check they received all the messages expected from everyone\n+ * and then send a final message indicating success and exits. The original\n+ * fork is watching for these to arrive before the timeout, if so it's a PASS.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int bad \u003d 1, interrupted;\n+\n+/* number of forks */\n+#define FORKS 4\n+/* number of messages each will send, eg, 4 forks 64 message \u003d\u003d 256 messages */\n+#define MSGCOUNT 64\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tuint64_t\t\t\tseen_mask[FORKS];\n+\tint\t\t\t\tseen_msgs[FORKS];\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tint\t\t\t\tcount;\n+\tchar\t\t\t\tseen_all;\n+\tchar\t\t\t\tsend_seen_all;\n+\tchar\t\t\t\tstarting;\n+} myss_t;\n+\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+multi_myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tconst char *p;\n+\tint fk, t, n;\n+\tsize_t al;\n+\n+\t/* ignore our and other forks announcing their result */\n+\n+\tif (lws_json_simple_find((const char *)buf, len, \u0022\u005c\u0022seen_all\u005c\u0022:\u0022, \u0026al))\n+\t\treturn LWSSSSRET_OK;\n+\n+\t/*\n+\t * otherwise once we saw the expected messages, any other messages\n+\t * coming in this class are wrong\n+\t */\n+\n+\tif (m-\u003eseen_all) {\n+\t\tlwsl_err(\u0022%s: unexpected extra messages\u005cn\u0022, __func__);\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\t}\n+\n+\tp \u003d lws_json_simple_find((const char *)buf, len, \u0022\u005c\u0022fork\u005c\u0022:\u0022, \u0026al);\n+\tif (!p)\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\tfk \u003d atoi(p);\n+\tif (fk \u003c 1 || fk \u003e FORKS)\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\tp \u003d lws_json_simple_find((const char *)buf, len, \u0022\u005c\u0022test\u005c\u0022:\u0022, \u0026al);\n+\tif (!p)\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\tt \u003d atoi(p);\n+\n+\tif (t \u003c 0 || t \u003e\u003d MSGCOUNT)\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\tm-\u003eseen_mask[fk - 1] |\u003d 1ull \u003c\u003c t;\n+\tm-\u003eseen_msgs[fk - 1]++; /* keep an eye on dupes */\n+\n+\t/* Have we seen a full set of messages from everyone? */\n+\n+\tfor (n \u003d 0; n \u003c FORKS; n++) {\n+\t\tif (m-\u003eseen_msgs[n] !\u003d (int)MSGCOUNT)\n+\t\t\treturn LWSSSSRET_OK;\n+\t\tif (m-\u003eseen_mask[n] !\u003d 0xffffffffffffffffull)\n+\t\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\t/*\n+\t * Oh... so we have finished collecting messages\n+\t */\n+\n+\tlwsl_user(\u0022%s: test thread %d: %s received all messages\u005cn\u0022, __func__,\n+\t\t\t(int)(intptr_t)lws_context_user(lws_ss_get_context(m-\u003ess)),\n+\t\t\tlws_ss_tag(m-\u003ess));\n+\tm-\u003eseen_all \u003d m-\u003esend_seen_all \u003d 1;\n+\n+\t/*\n+\t * Prepare to inform the original process we saw everything\n+\t * from everyone OK\n+\t */\n+\n+\tlws_ss_request_tx(m-\u003ess);\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static void\n+sul_multi_tx_periodic_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tmyss_t *m \u003d lws_container_of(sul, myss_t, sul);\n+\n+\tif (!m-\u003esend_seen_all \u0026\u0026 m-\u003eseen_all) {\n+\t\tlws_ss_destroy(\u0026m-\u003ess);\n+\t\treturn;\n+\t}\n+\n+\tm-\u003estarting \u003d 1;\n+\tif (m-\u003ecount \u003c MSGCOUNT || m-\u003esend_seen_all)\n+\t\tlws_ss_request_tx(m-\u003ess);\n+}\n+\n+static lws_ss_state_return_t\n+multi_myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\t/*\n+\t * We want to send exactly MSGCOUNT user class smd messages\n+\t */\n+\n+\tif (!m-\u003estarting || (m-\u003ecount \u003d\u003d MSGCOUNT \u0026\u0026 !m-\u003esend_seen_all))\n+\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+//\tlwsl_notice(\u0022%s: sending SS smd\u005cn\u0022, __func__);\n+\n+\tlws_ser_wu64be(buf, 1 \u003c\u003c LWSSMDCL_USER_BASE_BITNUM);\n+\tlws_ser_wu64be(buf + 8, 0); /* valgrind notices uninitialized if left */\n+\n+\tif (m-\u003esend_seen_all) {\n+\t\t*len \u003d LWS_SMD_SS_RX_HEADER_LEN + (unsigned int)\n+\t\t\tlws_snprintf((char *)buf + LWS_SMD_SS_RX_HEADER_LEN, *len,\n+\t\t\t \u0022{\u005c\u0022class\u005c\u0022:\u005c\u0022user\u005c\u0022,\u005c\u0022fork\u005c\u0022: %d,\u005c\u0022seen_all\u005c\u0022:true}\u0022,\n+\t\t\t (int)(intptr_t)lws_context_user(lws_ss_get_context(m-\u003ess)));\n+\n+\t\tm-\u003esend_seen_all \u003d 0;\n+\t\tlwsl_info(\u0022%s: test thread %d: sent summary message\u005cn\u0022, __func__,\n+\t\t\t\t(int)(intptr_t)lws_context_user(lws_ss_get_context(m-\u003ess)));\n+\t} else\n+\t\t*len \u003d LWS_SMD_SS_RX_HEADER_LEN + (unsigned int)\n+\t\t\tlws_snprintf((char *)buf + LWS_SMD_SS_RX_HEADER_LEN, *len,\n+\t\t\t \u0022{\u005c\u0022class\u005c\u0022:\u005c\u0022user\u005c\u0022,\u005c\u0022fork\u005c\u0022: %d,\u005c\u0022test\u005c\u0022:%u}\u0022,\n+\t\t\t (int)(intptr_t)lws_context_user(lws_ss_get_context(m-\u003ess)),\n+\t\t\t m-\u003ecount++);\n+\n+\t*flags \u003d LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;\n+\n+\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul,\n+\t\t\tsul_multi_tx_periodic_cb, 25 * LWS_US_PER_MS);\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+multi_myss_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tint n;\n+\n+\tlwsl_notice(\u0022%s: %s: %s (%d), ord 0x%x\u005cn\u0022, __func__, lws_ss_tag(m-\u003ess),\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_DESTROYING:\n+\t\tlws_sul_cancel(\u0026m-\u003esul);\n+\t\tinterrupted \u003d 1;\n+\t\treturn 0;\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\tlwsl_notice(\u0022%s: CONNECTED: test fork %d\u005cn\u0022, __func__,\n+\t\t\t\t(int)(intptr_t)lws_context_user(lws_ss_get_context(m-\u003ess)));\n+\t\t/*\n+\t\t * Because in this test everybody is watching and counting\n+\t\t * everybody else's messages from different forks, we have to\n+\t\t * hold off starting sending for 2s so all forks can join the\n+\t\t * proxy first and not miss anything\n+\t\t */\n+\t\tlws_sul_schedule(lws_ss_get_context(m-\u003ess), 0, \u0026m-\u003esul,\n+\t\t\t\tsul_multi_tx_periodic_cb, 2 * LWS_US_PER_SEC);\n+\t\tm-\u003estarting \u003d 0;\n+\t\treturn 0;\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tfor (n \u003d 0; n \u003c FORKS; n++)\n+\t\t\tlwsl_notice(\u0022%s: testfork %d: peer %d: seen_msg \u003d %d, \u0022\n+\t\t\t\t \u0022seen make \u003d 0x%llx\u005cn\u0022, __func__,\n+\t\t\t\t (int)(intptr_t)lws_context_user(lws_ss_get_context(m-\u003ess)),\n+\t\t\t\t n, m-\u003eseen_msgs[n],\n+\t\t\t\t (unsigned long long)m-\u003eseen_mask[n]);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static const lws_ss_info_t ssi_multi_lws_smd \u003d {\n+\t.handle_offset\t\t \u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset \u003d offsetof(myss_t, opaque_data),\n+\t.rx\t\t\t \u003d multi_myss_rx,\n+\t.tx\t\t\t \u003d multi_myss_tx,\n+\t.state\t\t\t \u003d multi_myss_state,\n+\t.user_alloc\t\t \u003d sizeof(myss_t),\n+\t.streamtype\t\t \u003d LWS_SMD_STREAMTYPENAME,\n+\t.manual_initial_tx_credit \u003d 1 \u003c\u003c LWSSMDCL_USER_BASE_BITNUM,\n+};\n+\n+static lws_ss_state_return_t\n+multi_myss_rx_monitor(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tconst char *p;\n+\tsize_t al;\n+\tint fk, n;\n+\n+\t/* ignore our and other forks announcing their result */\n+\n+\tif (!lws_json_simple_find((const char *)buf, len, \u0022\u005c\u0022seen_all\u005c\u0022:\u0022, \u0026al))\n+\t\treturn LWSSSSRET_OK;\n+\n+\tp \u003d lws_json_simple_find((const char *)buf, len, \u0022\u005c\u0022fork\u005c\u0022:\u0022, \u0026al);\n+\tif (!p)\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\tfk \u003d atoi(p);\n+\tif (fk \u003c 1 || fk \u003e FORKS)\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\tif (m-\u003eseen_msgs[fk - 1])\n+\t\t/* expected only once ... dupe */\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\tm-\u003eseen_msgs[fk - 1] \u003d 1;\n+\n+\tfor (n \u003d 0; n \u003c FORKS; n++)\n+\t\tif (!m-\u003eseen_msgs[n])\n+\t\t\treturn LWSSSSRET_OK;\n+\n+\t/* the test has succeeded */\n+\n+\tbad \u003d 0;\n+\tinterrupted \u003d 1;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static const lws_ss_info_t ssi_multi_lws_smd_monitor \u003d {\n+\t.handle_offset\t\t \u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset \u003d offsetof(myss_t, opaque_data),\n+\t.rx\t\t\t \u003d multi_myss_rx_monitor,\n+//\t.state\t\t\t \u003d multi_myss_state_monitor,\n+\t.user_alloc\t\t \u003d sizeof(myss_t),\n+\t.streamtype\t\t \u003d LWS_SMD_STREAMTYPENAME,\n+\t.manual_initial_tx_credit \u003d 1 \u003c\u003c LWSSMDCL_USER_BASE_BITNUM,\n+};\n+\n+/* for comparison, this is a non-SS lws_smd participant */\n+\n+static int\n+direct_smd_cb(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,\n+\t void *buf, size_t len)\n+{\n+\tstruct lws_context **pctx \u003d (struct lws_context **)opaque;\n+\n+\tif (_class !\u003d LWSSMDCL_SYSTEM_STATE)\n+\t\treturn 0;\n+\n+\tif (!lws_json_simple_strcmp(buf, len, \u0022\u005c\u0022state\u005c\u0022:\u0022, \u0022OPERATIONAL\u0022)) {\n+\n+\t\t/*\n+\t\t * Create the SSPC link to lws_smd... notice in ssi_lws_smd\n+\t\t * above, we tell this link to use the user class filter.\n+\t\t *\n+\t\t * If context-\u003euser is zero, we are the original process\n+\t\t * monitoring the progress of the others, otherwise we are\n+\t\t * 1 .. FORKS and producing / checking the smd messages\n+\t\t */\n+\n+\t\tlwsl_info(\u0022%s: starting ss for test fork %d\u005cn\u0022, __func__,\n+\t\t\t\t(int)(intptr_t)lws_context_user(*pctx));\n+\n+\t\tif (lws_ss_create(*pctx, 0, lws_context_user(*pctx) ?\n+\t\t\t\t\u0026ssi_multi_lws_smd /* forked process send / check */:\n+\t\t\t\t\u0026ssi_multi_lws_smd_monitor /* original monitors */,\n+\t\t\t\tNULL, NULL, NULL, NULL)) {\n+\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t __func__);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+\n+static void\n+sul_timeout_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int\n+smd_ss_multi_test(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tlws_sorted_usec_list_t sul_timeout;\n+\tstruct lws_context *context;\n+\tpid_t pid;\n+\tint n;\n+\n+\tlwsl_user(\u0022LWS Secure Streams SMD MULTI test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tfor (n \u003d 0; n \u003c FORKS; n++) {\n+\t\tpid \u003d fork();\n+\t\tif (!pid) /* forked child */ {\n+\t\t\tbreak;\n+\t\t}\n+\t\tlwsl_notice(\u0022%s: forked test process %u\u005cn\u0022, __func__, pid);\n+\t}\n+\n+\tif (n \u003d\u003d FORKS)\n+\t\t/* the original process */\n+\t\tn \u003d -1; /* so original ends up with context.user as 0 below */\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tmemset(\u0026sul_timeout, 0, sizeof sul_timeout);\n+\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+\n+\tinfo.fd_limit_per_thread\t\u003d 1 + 6 + 1;\n+\tinfo.port\t\t\t\u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.protocols\t\t\t\u003d lws_sspc_protocols;\n+\tinfo.options\t\t\t\u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t\t\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\n+\tinfo.early_smd_cb\t\t\u003d direct_smd_cb;\n+\tinfo.early_smd_class_filter\t\u003d 0xffffffff;\n+\tinfo.early_smd_opaque\t\t\u003d \u0026context;\n+\n+\tinfo.user\t\t\t\u003d (void *)(intptr_t)(n + 1);\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022%s: failed to create default vhost\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* set up the test timeout */\n+\n+\tlws_sul_schedule(context, 0, \u0026sul_timeout, sul_timeout_cb,\n+\t\t\t 10 * LWS_US_PER_SEC);\n+\n+\t/* the event loop */\n+\n+\twhile (lws_service(context, 0) \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\t;\n+\n+bail:\n+\tlws_context_destroy(context);\n+\n+\tif (n \u003d\u003d -1)\n+\t\tlwsl_user(\u0022%s: finished %s\u005cn\u0022, __func__, bad ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/CMakeLists.txt\nnew file mode 100644\nindex 0000000..da53721\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-secure-streams-staticpolicy C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-staticpolicy)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams.c)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/README.md\nnew file mode 100644\nindex 0000000..64002b2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/README.md\n@@ -0,0 +1,61 @@\n+# lws minimal secure streams static policy\n+\n+The application goes to https://warmcat.com and reads index.html there.\n+\n+It does it using a static Secure Streams policy generated from JSON by\n+policy2c example. \n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\n+```\n+$ ./lws-minimal-secure-streams-staticpolicy\n+[2020/03/26 15:49:12:6640] U: LWS secure streams static policy test client [-d\u003cverb\u003e]\n+[2020/03/26 15:49:12:7067] N: lws_create_context: using ss proxy bind '(null)', port 0, ads '(null)'\n+[2020/03/26 15:49:12:7567] N: lws_tls_client_create_vhost_context: using mem client CA cert 914\n+[2020/03/26 15:49:12:7597] N: lws_tls_client_create_vhost_context: using mem client CA cert 1011\n+[2020/03/26 15:49:12:7603] N: lws_tls_client_create_vhost_context: using mem client CA cert 1425\n+[2020/03/26 15:49:12:7605] N: lws_tls_client_create_vhost_context: using mem client CA cert 1011\n+[2020/03/26 15:49:12:9713] N: lws_system_cpd_set: setting CPD result OK\n+[2020/03/26 15:49:13:9625] N: ss_api_amazon_auth_rx: acquired 588-byte api.amazon.com auth token, exp 3600s\n+[2020/03/26 15:49:13:9747] U: myss_state: LWSSSCS_CREATING, ord 0x0\n+[2020/03/26 15:49:13:9774] U: myss_state: LWSSSCS_CONNECTING, ord 0x0\n+[2020/03/26 15:49:14:1897] U: myss_state: LWSSSCS_CONNECTED, ord 0x0\n+[2020/03/26 15:49:14:1926] U: myss_rx: len 1520, flags: 1\n+[2020/03/26 15:49:14:1945] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:1946] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:1947] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:1948] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:1949] U: myss_rx: len 583, flags: 0\n+[2020/03/26 15:49:14:2087] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2089] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2090] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2091] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2092] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2093] U: myss_rx: len 583, flags: 0\n+[2020/03/26 15:49:14:2109] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2110] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2111] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2112] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2113] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2114] U: myss_rx: len 583, flags: 0\n+[2020/03/26 15:49:14:2135] U: myss_rx: len 1520, flags: 0\n+[2020/03/26 15:49:14:2136] U: myss_rx: len 1358, flags: 0\n+[2020/03/26 15:49:14:2136] U: myss_rx: len 0, flags: 2\n+[2020/03/26 15:49:14:2138] U: myss_state: LWSSSCS_QOS_ACK_REMOTE, ord 0x0\n+[2020/03/26 15:49:14:2139] N: myss_state: LWSSSCS_QOS_ACK_REMOTE\n+[2020/03/26 15:49:14:2170] U: myss_state: LWSSSCS_DISCONNECTED, ord 0x0\n+[2020/03/26 15:49:14:2192] U: myss_state: LWSSSCS_DESTROYING, ord 0x0\n+[2020/03/26 15:49:14:2265] E: lws_context_destroy3\n+[2020/03/26 15:49:14:2282] U: Completed: OK\n+\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..1d7b869\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/minimal-secure-streams.c\n@@ -0,0 +1,289 @@\n+/*\n+ * lws-minimal-secure-streams-staticpolicy\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams api.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there.\n+ *\n+ * This example is built two different ways from the same source... one includes\n+ * the policy everything needed to fulfil the stream directly. The other -client\n+ * variant has no policy itself and some other minor init changes, and connects\n+ * to the -proxy example to actually get the connection done.\n+ *\n+ * In the -client build case, the example does not even init the tls libraries\n+ * since the proxy part will take care of all that.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, force_cpd_fail_portal,\n+\t force_cpd_fail_no_internet;\n+static lws_state_notify_link_t nl;\n+\n+/*\n+ * This is example builds with a static policy autogenerated from a JSON\n+ * policy...\n+ */\n+#include \u0022static-policy.h\u0022\n+\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle\t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+} myss_t;\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+/* secure streams payload interface */\n+\n+static int\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+//\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: len %d, flags: %d\u005cn\u0022, __func__, (int)len, flags);\n+\tlwsl_hexdump_info(buf, len);\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t//myss_t *m \u003d (myss_t *)userobj;\n+\n+\treturn 0;\n+}\n+\n+static int\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tlwsl_user(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name(state),\n+\t\t (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022uptag\u0022, \u0022myuptag123\u0022, 10))\n+\t\t\tlwsl_err(\u0022%s set metadata uptag failed\u005cn\u0022, __func__);\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022, \u0022myctype\u0022, 7))\n+\t\t\tlwsl_err(\u0022%s set metadata ctype failed\u005cn\u0022, __func__);\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_QOS_ACK_REMOTE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\t\t\tlws_ss_info_t ssi;\n+\n+\t\t\t/* We're making an outgoing secure stream ourselves */\n+\n+\t\t\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\t\t\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\t\t\tssi.opaque_user_data_offset \u003d offsetof(myss_t,\n+\t\t\t\t\t\t\t opaque_data);\n+\t\t\tssi.rx \u003d myss_rx;\n+\t\t\tssi.tx \u003d myss_tx;\n+\t\t\tssi.state \u003d myss_state;\n+\t\t\tssi.user_alloc \u003d sizeof(myss_t);\n+\t\t\tssi.streamtype \u003d \u0022mintest\u0022;\n+\n+\t\t\tif (lws_ss_create(context, 0, \u0026ssi, NULL, NULL,\n+\t\t\t\t\t NULL, NULL)) {\n+\t\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS secure streams static policy test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\t/* these options are mutually exclusive if given */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-portal\u0022))\n+\t\tforce_cpd_fail_portal \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-no-internet\u0022))\n+\t\tforce_cpd_fail_no_internet \u003d 1;\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#else\n+\tinfo.pss_policies \u003d \u0026_ss_static_policy_entry;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/*\n+\t * Set the related lws_system blobs\n+\t *\n+\t * ...direct_set() sets a pointer, so the thing pointed to has to have\n+\t * a suitable lifetime, eg, something that already exists on the heap or\n+\t * a const string in .rodata like this\n+\t */\n+\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_SERIAL, 0),\n+\t\t\t\t (const uint8_t *)\u0022SN12345678\u0022, 10);\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_FW_VERSION, 0),\n+\t\t\t\t (const uint8_t *)\u0022v0.01\u0022, 5);\n+\n+\t/*\n+\t * ..._heap_append() appends to a buflist kind of arrangement on heap,\n+\t * just one block is fine, otherwise it will concatenate the fragments\n+\t * in the order they were appended (and take care of freeing them at\n+\t * context destroy time). ..._heap_empty() is also available to remove\n+\t * everything that was already allocated.\n+\t *\n+\t * Here we use _heap_append() just so it's tested as well as direct set.\n+\t */\n+\n+\tlws_system_blob_heap_append(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_TYPE, 0),\n+\t\t\t\t (const uint8_t *)\u0022spacerocket\u0022, 11);\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.h\nnew file mode 100644\nindex 0000000..b772a6a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.h\n@@ -0,0 +1,1513 @@\n+/*\n+ * Autogenerated from the following JSON policy\n+ */\n+\n+#if 0\n+{\n+\t\u0022release\u0022: \u002201234567\u0022,\n+\t\u0022product\u0022: \u0022myproduct\u0022,\n+\t\u0022schema-version\u0022: 1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022: [1000, 2000, 3000, 5000, 10000],\n+\t\t\t\u0022conceal\u0022: 5,\n+\t\t\t\u0022jitterpc\u0022: 20,\n+\t\t\t\u0022svalidping\u0022: 30,\n+\t\t\t\u0022svalidhup\u0022: 35\n+\t\t}\n+\t}],\n+\t\u0022certs\u0022: [{\n+\t\t\u0022isrg_root_x1\u0022: \u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZLubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t}, {\n+\t\t\u0022LEX3_isrg_root_x1\u0022: \u0022MIIFjTCCA3WgAwIBAgIRANOxciY0IzLc9AUoUSrsnGowDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTYxMDA2MTU0MzU1WhcNMjExMDA2MTU0MzU1WjBKMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3MgRW5jcnlwdDEjMCEGA1UEAxMaTGV0J3MgRW5jcnlwdCBBdXRob3JpdHkgWDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCc0wzwWuUuR7dyXTeDs2hjMOrXNSYZJeG9vjXxcJIvt7hLQQWrqZ41CFjssSrEaIcLo+N15Obzp2JxunmBYB/XkZqf89B4Z3HIaQ6Vkc/+5pnpYDxIzH7KTXcSJJ1HG1rrueweNwAcnKx7pwXqzkrrvUHlNpi5y/1tPJZo3yMqQpAMhnRnyH+lmrhSYRQTP2XpgofL2/oOVvaGifOFP5eGr7DcGu9rDZUWfcQroGWymQQ2dYBrrErzG5BJeC+ilk8qICUpBMZ0wNAxzY8xOJUWuqgzuEPxsR/DMH+ieTETPS02+OP88jNquTkxxa/EjQ0dZBYzqvqEKbbUC8DYfcOTAgMBAAGjggFnMIIBYzAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEBATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQub3JnMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3JsLnJvb3QteDEubGV0c2VuY3J5cHQub3JnMHIGCCsGAQUFBwEBBGYwZDAwBggrBgEFBQcwAYYkaHR0cDovL29jc3Aucm9vdC14MS5sZXRzZW5jcnlwdC5vcmcvMDAGCCsGAQUFBzAChiRodHRwOi8vY2VydC5yb290LXgxLmxldHNlbmNyeXB0Lm9yZy8wHwYDVR0jBBgwFoAUebRZ5nu25eQBc4AIiMgaWPbpm24wDQYJKoZIhvcNAQELBQADggIBABnPdSA0LTqmRf/Q1eaM2jLonG4bQdEnqOJQ8nCqxOeTRrToEKtwT++36gTSlBGxA/5dut82jJQ2jxN8RI8L9QFXrWi4xXnA2EqA10yjHiR6H9cj6MFiOnb5In1eWsRMUM2v3e9tNsCAgBukPHAg1lQh07rvFKm/Bz9BCjaxorALINUfZ9DD64j2igLIxle2DPxW8dI/F2loHMjXZjqG8RkqZUdoxtID5+90FgsGIfkMpqgRS05f4zPbCEHqCXl1eO5HyELTgcVlLXXQDgAWnRzut1hFJeczY1tjQQno6f6s+nMydLN26WuU4s3UYvOuOsUxRlJu7TSRHqDC3lSE5XggVkzdaPkuKGQbGpny+01/47hfXXNB7HntWNZ6N2Vwp7G6OfY+YQrZwIaQmhrIqJZuigsrbe3W+gdn5ykE9+Ky0VgVUsfxo52mwFYs1JKY2PGDuWx8M6DlS6qQkvHaRUo0FMd8TsSlbF0/v965qGFKhSDeQoMpYnwcmQilRh/0ayLThlHLN81gSkJjVrPI0Y8xCVPB4twb1PFUd2fPM3sA1tJ83sZ5v8vgFv2yofKRPB0t6JzUA81mSqM3kxl5e+IZwhYAyO0OTg3/fs8HqGTNKd9BqoUwSRBzp06JMg5brUCGwbCUDI0mxadJ3Bz4WxR6fyNpBK2yAinWEsikxqEt\u0022\n+\t}, {\n+\t\u0022amazon_root_ca_1\u0022: \u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\u0022\n+\t}, {\n+\t\t\u0022digicert_global_root_g2\u0022: \u0022MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTflMrY\u003d\u0022\n+\t}, {\n+\t\t\u0022digicert_global_ca_g2\u0022: \u0022MIIEizCCA3OgAwIBAgIQDI7gyQ1qiRWIBAYe4kH5rzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0yODA4MDExMjAwMDBaMEQxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxHjAcBgNVBAMTFURpZ2lDZXJ0IEdsb2JhbCBDQSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNIfL7zBYZdW9UvhU5L4IatFaxhz1uvPmoKR/uadpFgC4przc/cV35gmAvkVNlW7SHMArZagV+Xau4CLyMnuG3UsOcGAngLH1ypmTb+u6wbBfpXzYEQQGfWMItYNdSWYb7QjHqXnxr5IuYUL6nG6AEfq/gmD6yOTSwyOR2Bm40cZbIc22GoiS9g5+vCShjEbyrpEJIJ7RfRACvmfe8EiRROM6GyD5eHn7OgzS+8LOy4g2gxPR/VSpAQGQuBldYpdlH5NnbQtwl6OErXb4y/E3w57bqukPyV93t4CTZedJMeJfD/1K2uaGvG/w/VNfFVbkhJ+Pi474j48V4Rd6rfArMCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwHQYDVR0OBBYEFCRuKy3QapJRUSVpAaqaR6aJ50AgMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA0GCSqGSIb3DQEBCwUAA4IBAQALOYSR+ZfrqoGvhOlaOJL84mxZvzbIRacxAxHhBsCsMsdaVSnaT0AC9aHesO3ewPj2dZ12uYf+QYB6z13jAMZbAuabeGLJ3LhimnftiQjXS8X9Q9ViIyfEBFltcT8jW+rZ8uckJ2/0lYDblizkVIvP6hnZf1WZUXoOLRg9eFhSvGNoVwvdRLNXSmDmyHBwW4coatc7TlJFGa8kBpJIERqLrqwYElesA8u49L3KJg6nwd3jM+/AVTANlVlOnAM2BvjAjxSZnE0qnsHhfTuvcqdFuhOWKU4Z0BqYBvQ3lBetoxi6PrABDJXWKTUgNX31EGDk92hiHuwZ4STyhxGs6QiA\u0022\n+\t}, {\n+\t\t\u0022starfield_services_root_ca\u0022: \u0022MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkdiEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\u0022\n+\t}, {\n+\t\t\u0022starfield_class_2_ca\u0022: \u0022MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJlxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q\u003d\u0022\n+\t}],\n+\t\u0022trust_stores\u0022: [{\n+\t\t\u0022name\u0022: \u0022le_via_isrg\u0022,\n+\t\t\u0022stack\u0022: [\u0022isrg_root_x1\u0022, \u0022LEX3_isrg_root_x1\u0022]\n+\t}, {\n+\t\t\u0022name\u0022: \u0022api_amazon_com\u0022,\n+\t\t\u0022stack\u0022: [\u0022digicert_global_ca_g2\u0022, \u0022digicert_global_root_g2\u0022]\n+\t}, {\n+\t\t\u0022name\u0022: \u0022avs_via_starfield\u0022,\n+\t\t\u0022stack\u0022: [\u0022starfield_class_2_ca\u0022, \u0022starfield_services_root_ca\u0022]\n+\t}, {\n+\t\t\u0022name\u0022: \u0022mqtt_amz_iot\u0022,\n+\t\t\u0022stack\u0022: [\u0022amazon_root_ca_1\u0022, \u0022starfield_class_2_ca\u0022, \u0022starfield_services_root_ca\u0022]\n+\t}],\n+\t\u0022s\u0022: [{\n+\t\t\u0022api_amazon_com_auth\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022api.amazon.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022POST\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022auth/o2/token\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022h2q_oflow_txcr\u0022: true,\n+\t\t\t\u0022http_www_form_urlencoded\u0022: true,\n+\t\t\t\u0022http_no_content_length\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022api_amazon_com\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022avs_event\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022v20160207/directives\u0022,\n+\t\t\t\u0022h2q_oflow_txcr\u0022: true,\n+\t\t\t\u0022http_auth_header\u0022: \u0022authorization:\u0022,\n+\t\t\t\u0022http_auth_preamble\u0022: \u0022Bearer \u0022,\n+\t\t\t\u0022http_no_content_length\u0022: true,\n+\t\t\t\u0022nailed_up\u0022: true,\n+\t\t\t\u0022long_poll\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022avs_via_starfield\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022avs_metadata\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022POST\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022v20160207/events\u0022,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022h2q_oflow_txcr\u0022: true,\n+\t\t\t\u0022http_auth_header\u0022: \u0022authorization:\u0022,\n+\t\t\t\u0022http_auth_preamble\u0022: \u0022Bearer \u0022,\n+\t\t\t\u0022http_multipart_name\u0022: \u0022metadata\u0022,\n+\t\t\t\u0022http_mime_content_type\u0022: \u0022application/json; charset\u003dUTF-8\u0022,\n+\t\t\t\u0022http_no_content_length\u0022: true,\n+\t\t\t\u0022rideshare\u0022: \u0022avs_audio\u0022,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022avs_via_starfield\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022avs_audio\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022POST\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022v20160207/events\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022h2q_oflow_txcr\u0022: true,\n+\t\t\t\u0022http_auth_header\u0022: \u0022authorization:\u0022,\n+\t\t\t\u0022http_auth_preamble\u0022: \u0022Bearer \u0022,\n+\t\t\t\u0022http_multipart_name\u0022: \u0022audio\u0022,\n+\t\t\t\u0022http_mime_content_type\u0022: \u0022application/octet-stream\u0022,\n+\t\t\t\u0022http_no_content_length\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022avs_via_starfield\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022mintest\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022index.html?uptag\u003d${uptag}\u0022,\n+\t\t\t\u0022http_dsn_header\u0022: \u0022x-dsn:\u0022,\n+\t\t\t\u0022http_fwv_header\u0022: \u0022x-fw-version:\u0022,\n+\t\t\t\u0022http_devtype_header\u0022: \u0022x-devtype:\u0022,\n+\t\t\t\u0022metadata\u0022: [{\n+\t\t\t\t\u0022uptag\u0022: \u0022X-Upload-Tag:\u0022\n+\t\t\t}, {\n+\t\t\t\t\u0022ctype\u0022: \u0022Content-Type:\u0022\n+\t\t\t}, {\n+\t\t\t\t\u0022xctype\u0022: \u0022X-Content-Type:\u0022\n+\t\t\t}],\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_isrg\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022h2longpolltest\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022index.html\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022nailed_up\u0022: true,\n+\t\t\t\u0022long_poll\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_isrg\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022mintest-fail\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\u0022port\u0022: 22,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022index.html\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_isrg\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022minpost\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022POST\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022testserver/formtest\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_isrg\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022mqtt_test\u0022: {\n+\t\t\t\u0022endpoint\u0022:\t\t\u0022a1ygonr3im5cv2-ats.iot.us-west-2.amazonaws.com\u0022,\n+\t\t\t\u0022port\u0022:\t\t\t443,\n+\t\t\t\u0022tls\u0022:\t\t\ttrue,\n+\t\t\t\u0022client_cert\u0022:\t\t0,\n+\t\t\t\u0022tls_trust_store\u0022:\t\u0022mqtt_amz_iot\u0022,\n+\t\t\t\u0022protocol\u0022:\t\t\u0022mqtt\u0022,\n+\t\t\t\u0022mqtt_topic\u0022:\t\t\u0022test/topic0\u0022,\n+\t\t\t\u0022mqtt_subscribe\u0022:\t\u0022test/topic0\u0022,\n+\t\t\t\u0022mqtt_qos\u0022:\t\t0,\n+\t\t\t\u0022retry\u0022:\t\t\u0022default\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022mqtt_test1\u0022: {\n+\t\t\t\u0022endpoint\u0022:\t\t\u0022a1ygonr3im5cv2-ats.iot.us-west-2.amazonaws.com\u0022,\n+\t\t\t\u0022port\u0022:\t\t\t443,\n+\t\t\t\u0022tls\u0022:\t\t\ttrue,\n+\t\t\t\u0022client_cert\u0022:\t\t0,\n+\t\t\t\u0022tls_trust_store\u0022:\t\u0022mqtt_amz_iot\u0022,\n+\t\t\t\u0022protocol\u0022:\t\t\u0022mqtt\u0022,\n+\t\t\t\u0022mqtt_topic\u0022:\t\t\u0022test/topic1\u0022,\n+\t\t\t\u0022mqtt_subscribe\u0022:\t\u0022test/topic1\u0022,\n+\t\t\t\u0022mqtt_qos\u0022:\t\t1,\n+\t\t\t\u0022retry\u0022:\t\t\u0022default\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022captive_portal_detect\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022connectivitycheck.android.com\u0022,\n+\t\t\t\u0022port\u0022: 80,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022generate_204\u0022,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022http_expect\u0022: 204,\n+\t\t\t\u0022http_fail_redirect\u0022: true\n+\t\t}\n+\t}\n+\t]\n+}\n+\n+\n+\n+\n+ Original JSON size: 15493\n+#endif\n+\n+static const uint32_t _rbo_bo_0[] \u003d {\n+ 1000, 2000, 3000, 5000, 10000, \n+};\n+static const lws_retry_bo_t _rbo_0 \u003d {\n+\t.retry_ms_table \u003d _rbo_bo_0,\n+\t.retry_ms_table_count \u003d 5,\n+\t.conceal_count \u003d 5,\n+\t.secs_since_valid_ping \u003d 30,\n+\t.secs_since_valid_hangup \u003d 35,\n+\t.jitter_percent \u003d 20,\n+};\n+static const uint8_t _ss_der_amazon_root_ca_1[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x03, 0x41, 0x30, 0x82, 0x02, 0x29, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x13, 0x06, \n+\t/* 0x 10 */ 0x6C, 0x9F, 0xCF, 0x99, 0xBF, 0x8C, 0x0A, 0x39, \n+\t/* 0x 18 */ 0xE2, 0xF0, 0x78, 0x8A, 0x43, 0xE6, 0x96, 0x36, \n+\t/* 0x 20 */ 0x5B, 0xCA, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, \n+\t/* 0x 28 */ 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, \n+\t/* 0x 30 */ 0x00, 0x30, 0x39, 0x31, 0x0B, 0x30, 0x09, 0x06, \n+\t/* 0x 38 */ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, \n+\t/* 0x 40 */ 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x 48 */ 0x0A, 0x13, 0x06, 0x41, 0x6D, 0x61, 0x7A, 0x6F, \n+\t/* 0x 50 */ 0x6E, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \n+\t/* 0x 58 */ 0x04, 0x03, 0x13, 0x10, 0x41, 0x6D, 0x61, 0x7A, \n+\t/* 0x 60 */ 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, \n+\t/* 0x 68 */ 0x43, 0x41, 0x20, 0x31, 0x30, 0x1E, 0x17, 0x0D, \n+\t/* 0x 70 */ 0x31, 0x35, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30, \n+\t/* 0x 78 */ 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33, \n+\t/* 0x 80 */ 0x38, 0x30, 0x31, 0x31, 0x37, 0x30, 0x30, 0x30, \n+\t/* 0x 88 */ 0x30, 0x30, 0x30, 0x5A, 0x30, 0x39, 0x31, 0x0B, \n+\t/* 0x 90 */ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, \n+\t/* 0x 98 */ 0x02, 0x55, 0x53, 0x31, 0x0F, 0x30, 0x0D, 0x06, \n+\t/* 0x a0 */ 0x03, 0x55, 0x04, 0x0A, 0x13, 0x06, 0x41, 0x6D, \n+\t/* 0x a8 */ 0x61, 0x7A, 0x6F, 0x6E, 0x31, 0x19, 0x30, 0x17, \n+\t/* 0x b0 */ 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, \n+\t/* 0x b8 */ 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, 0x52, 0x6F, \n+\t/* 0x c0 */ 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, \n+\t/* 0x c8 */ 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, \n+\t/* 0x d0 */ 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, \n+\t/* 0x d8 */ 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, \n+\t/* 0x e0 */ 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, \n+\t/* 0x e8 */ 0xB2, 0x78, 0x80, 0x71, 0xCA, 0x78, 0xD5, 0xE3, \n+\t/* 0x f0 */ 0x71, 0xAF, 0x47, 0x80, 0x50, 0x74, 0x7D, 0x6E, \n+\t/* 0x f8 */ 0xD8, 0xD7, 0x88, 0x76, 0xF4, 0x99, 0x68, 0xF7, \n+\t/* 0x100 */ 0x58, 0x21, 0x60, 0xF9, 0x74, 0x84, 0x01, 0x2F, \n+\t/* 0x108 */ 0xAC, 0x02, 0x2D, 0x86, 0xD3, 0xA0, 0x43, 0x7A, \n+\t/* 0x110 */ 0x4E, 0xB2, 0xA4, 0xD0, 0x36, 0xBA, 0x01, 0xBE, \n+\t/* 0x118 */ 0x8D, 0xDB, 0x48, 0xC8, 0x07, 0x17, 0x36, 0x4C, \n+\t/* 0x120 */ 0xF4, 0xEE, 0x88, 0x23, 0xC7, 0x3E, 0xEB, 0x37, \n+\t/* 0x128 */ 0xF5, 0xB5, 0x19, 0xF8, 0x49, 0x68, 0xB0, 0xDE, \n+\t/* 0x130 */ 0xD7, 0xB9, 0x76, 0x38, 0x1D, 0x61, 0x9E, 0xA4, \n+\t/* 0x138 */ 0xFE, 0x82, 0x36, 0xA5, 0xE5, 0x4A, 0x56, 0xE4, \n+\t/* 0x140 */ 0x45, 0xE1, 0xF9, 0xFD, 0xB4, 0x16, 0xFA, 0x74, \n+\t/* 0x148 */ 0xDA, 0x9C, 0x9B, 0x35, 0x39, 0x2F, 0xFA, 0xB0, \n+\t/* 0x150 */ 0x20, 0x50, 0x06, 0x6C, 0x7A, 0xD0, 0x80, 0xB2, \n+\t/* 0x158 */ 0xA6, 0xF9, 0xAF, 0xEC, 0x47, 0x19, 0x8F, 0x50, \n+\t/* 0x160 */ 0x38, 0x07, 0xDC, 0xA2, 0x87, 0x39, 0x58, 0xF8, \n+\t/* 0x168 */ 0xBA, 0xD5, 0xA9, 0xF9, 0x48, 0x67, 0x30, 0x96, \n+\t/* 0x170 */ 0xEE, 0x94, 0x78, 0x5E, 0x6F, 0x89, 0xA3, 0x51, \n+\t/* 0x178 */ 0xC0, 0x30, 0x86, 0x66, 0xA1, 0x45, 0x66, 0xBA, \n+\t/* 0x180 */ 0x54, 0xEB, 0xA3, 0xC3, 0x91, 0xF9, 0x48, 0xDC, \n+\t/* 0x188 */ 0xFF, 0xD1, 0xE8, 0x30, 0x2D, 0x7D, 0x2D, 0x74, \n+\t/* 0x190 */ 0x70, 0x35, 0xD7, 0x88, 0x24, 0xF7, 0x9E, 0xC4, \n+\t/* 0x198 */ 0x59, 0x6E, 0xBB, 0x73, 0x87, 0x17, 0xF2, 0x32, \n+\t/* 0x1a0 */ 0x46, 0x28, 0xB8, 0x43, 0xFA, 0xB7, 0x1D, 0xAA, \n+\t/* 0x1a8 */ 0xCA, 0xB4, 0xF2, 0x9F, 0x24, 0x0E, 0x2D, 0x4B, \n+\t/* 0x1b0 */ 0xF7, 0x71, 0x5C, 0x5E, 0x69, 0xFF, 0xEA, 0x95, \n+\t/* 0x1b8 */ 0x02, 0xCB, 0x38, 0x8A, 0xAE, 0x50, 0x38, 0x6F, \n+\t/* 0x1c0 */ 0xDB, 0xFB, 0x2D, 0x62, 0x1B, 0xC5, 0xC7, 0x1E, \n+\t/* 0x1c8 */ 0x54, 0xE1, 0x77, 0xE0, 0x67, 0xC8, 0x0F, 0x9C, \n+\t/* 0x1d0 */ 0x87, 0x23, 0xD6, 0x3F, 0x40, 0x20, 0x7F, 0x20, \n+\t/* 0x1d8 */ 0x80, 0xC4, 0x80, 0x4C, 0x3E, 0x3B, 0x24, 0x26, \n+\t/* 0x1e0 */ 0x8E, 0x04, 0xAE, 0x6C, 0x9A, 0xC8, 0xAA, 0x0D, \n+\t/* 0x1e8 */ 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x42, 0x30, \n+\t/* 0x1f0 */ 0x40, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, \n+\t/* 0x1f8 */ 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, \n+\t/* 0x200 */ 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, \n+\t/* 0x208 */ 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, \n+\t/* 0x210 */ 0x01, 0x86, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, \n+\t/* 0x218 */ 0x0E, 0x04, 0x16, 0x04, 0x14, 0x84, 0x18, 0xCC, \n+\t/* 0x220 */ 0x85, 0x34, 0xEC, 0xBC, 0x0C, 0x94, 0x94, 0x2E, \n+\t/* 0x228 */ 0x08, 0x59, 0x9C, 0xC7, 0xB2, 0x10, 0x4E, 0x0A, \n+\t/* 0x230 */ 0x08, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, \n+\t/* 0x238 */ 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, \n+\t/* 0x240 */ 0x03, 0x82, 0x01, 0x01, 0x00, 0x98, 0xF2, 0x37, \n+\t/* 0x248 */ 0x5A, 0x41, 0x90, 0xA1, 0x1A, 0xC5, 0x76, 0x51, \n+\t/* 0x250 */ 0x28, 0x20, 0x36, 0x23, 0x0E, 0xAE, 0xE6, 0x28, \n+\t/* 0x258 */ 0xBB, 0xAA, 0xF8, 0x94, 0xAE, 0x48, 0xA4, 0x30, \n+\t/* 0x260 */ 0x7F, 0x1B, 0xFC, 0x24, 0x8D, 0x4B, 0xB4, 0xC8, \n+\t/* 0x268 */ 0xA1, 0x97, 0xF6, 0xB6, 0xF1, 0x7A, 0x70, 0xC8, \n+\t/* 0x270 */ 0x53, 0x93, 0xCC, 0x08, 0x28, 0xE3, 0x98, 0x25, \n+\t/* 0x278 */ 0xCF, 0x23, 0xA4, 0xF9, 0xDE, 0x21, 0xD3, 0x7C, \n+\t/* 0x280 */ 0x85, 0x09, 0xAD, 0x4E, 0x9A, 0x75, 0x3A, 0xC2, \n+\t/* 0x288 */ 0x0B, 0x6A, 0x89, 0x78, 0x76, 0x44, 0x47, 0x18, \n+\t/* 0x290 */ 0x65, 0x6C, 0x8D, 0x41, 0x8E, 0x3B, 0x7F, 0x9A, \n+\t/* 0x298 */ 0xCB, 0xF4, 0xB5, 0xA7, 0x50, 0xD7, 0x05, 0x2C, \n+\t/* 0x2a0 */ 0x37, 0xE8, 0x03, 0x4B, 0xAD, 0xE9, 0x61, 0xA0, \n+\t/* 0x2a8 */ 0x02, 0x6E, 0xF5, 0xF2, 0xF0, 0xC5, 0xB2, 0xED, \n+\t/* 0x2b0 */ 0x5B, 0xB7, 0xDC, 0xFA, 0x94, 0x5C, 0x77, 0x9E, \n+\t/* 0x2b8 */ 0x13, 0xA5, 0x7F, 0x52, 0xAD, 0x95, 0xF2, 0xF8, \n+\t/* 0x2c0 */ 0x93, 0x3B, 0xDE, 0x8B, 0x5C, 0x5B, 0xCA, 0x5A, \n+\t/* 0x2c8 */ 0x52, 0x5B, 0x60, 0xAF, 0x14, 0xF7, 0x4B, 0xEF, \n+\t/* 0x2d0 */ 0xA3, 0xFB, 0x9F, 0x40, 0x95, 0x6D, 0x31, 0x54, \n+\t/* 0x2d8 */ 0xFC, 0x42, 0xD3, 0xC7, 0x46, 0x1F, 0x23, 0xAD, \n+\t/* 0x2e0 */ 0xD9, 0x0F, 0x48, 0x70, 0x9A, 0xD9, 0x75, 0x78, \n+\t/* 0x2e8 */ 0x71, 0xD1, 0x72, 0x43, 0x34, 0x75, 0x6E, 0x57, \n+\t/* 0x2f0 */ 0x59, 0xC2, 0x02, 0x5C, 0x26, 0x60, 0x29, 0xCF, \n+\t/* 0x2f8 */ 0x23, 0x19, 0x16, 0x8E, 0x88, 0x43, 0xA5, 0xD4, \n+\t/* 0x300 */ 0xE4, 0xCB, 0x08, 0xFB, 0x23, 0x11, 0x43, 0xE8, \n+\t/* 0x308 */ 0x43, 0x29, 0x72, 0x62, 0xA1, 0xA9, 0x5D, 0x5E, \n+\t/* 0x310 */ 0x08, 0xD4, 0x90, 0xAE, 0xB8, 0xD8, 0xCE, 0x14, \n+\t/* 0x318 */ 0xC2, 0xD0, 0x55, 0xF2, 0x86, 0xF6, 0xC4, 0x93, \n+\t/* 0x320 */ 0x43, 0x77, 0x66, 0x61, 0xC0, 0xB9, 0xE8, 0x41, \n+\t/* 0x328 */ 0xD7, 0x97, 0x78, 0x60, 0x03, 0x6E, 0x4A, 0x72, \n+\t/* 0x330 */ 0xAE, 0xA5, 0xD1, 0x7D, 0xBA, 0x10, 0x9E, 0x86, \n+\t/* 0x338 */ 0x6C, 0x1B, 0x8A, 0xB9, 0x59, 0x33, 0xF8, 0xEB, \n+\t/* 0x340 */ 0xC4, 0x90, 0xBE, 0xF1, 0xB9, \n+};\n+static const lws_ss_x509_t _ss_x509_amazon_root_ca_1 \u003d {\n+\t.vhost_name \u003d \u0022amazon_root_ca_1\u0022,\n+\t.ca_der \u003d _ss_der_amazon_root_ca_1,\n+\t.ca_der_len \u003d 837,\n+};\n+static const uint8_t _ss_der_starfield_class_2_ca[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x04, 0x0F, 0x30, 0x82, 0x02, 0xF7, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, \n+\t/* 0x 10 */ 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, \n+\t/* 0x 18 */ 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, \n+\t/* 0x 20 */ 0x68, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, \n+\t/* 0x 28 */ 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x25, \n+\t/* 0x 30 */ 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, \n+\t/* 0x 38 */ 0x1C, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, \n+\t/* 0x 40 */ 0x6C, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, \n+\t/* 0x 48 */ 0x6F, 0x6C, 0x6F, 0x67, 0x69, 0x65, 0x73, 0x2C, \n+\t/* 0x 50 */ 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x32, 0x30, \n+\t/* 0x 58 */ 0x30, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x29, \n+\t/* 0x 60 */ 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6C, \n+\t/* 0x 68 */ 0x64, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, \n+\t/* 0x 70 */ 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, \n+\t/* 0x 78 */ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, \n+\t/* 0x 80 */ 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, \n+\t/* 0x 88 */ 0x79, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x34, 0x30, \n+\t/* 0x 90 */ 0x36, 0x32, 0x39, 0x31, 0x37, 0x33, 0x39, 0x31, \n+\t/* 0x 98 */ 0x36, 0x5A, 0x17, 0x0D, 0x33, 0x34, 0x30, 0x36, \n+\t/* 0x a0 */ 0x32, 0x39, 0x31, 0x37, 0x33, 0x39, 0x31, 0x36, \n+\t/* 0x a8 */ 0x5A, 0x30, 0x68, 0x31, 0x0B, 0x30, 0x09, 0x06, \n+\t/* 0x b0 */ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, \n+\t/* 0x b8 */ 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x c0 */ 0x0A, 0x13, 0x1C, 0x53, 0x74, 0x61, 0x72, 0x66, \n+\t/* 0x c8 */ 0x69, 0x65, 0x6C, 0x64, 0x20, 0x54, 0x65, 0x63, \n+\t/* 0x d0 */ 0x68, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, 0x69, 0x65, \n+\t/* 0x d8 */ 0x73, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, \n+\t/* 0x e0 */ 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0B, \n+\t/* 0x e8 */ 0x13, 0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, \n+\t/* 0x f0 */ 0x65, 0x6C, 0x64, 0x20, 0x43, 0x6C, 0x61, 0x73, \n+\t/* 0x f8 */ 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, \n+\t/* 0x100 */ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, \n+\t/* 0x108 */ 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, \n+\t/* 0x110 */ 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, \n+\t/* 0x118 */ 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, \n+\t/* 0x120 */ 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, \n+\t/* 0x128 */ 0x01, 0x0D, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, \n+\t/* 0x130 */ 0x82, 0x01, 0x01, 0x00, 0xB7, 0x32, 0xC8, 0xFE, \n+\t/* 0x138 */ 0xE9, 0x71, 0xA6, 0x04, 0x85, 0xAD, 0x0C, 0x11, \n+\t/* 0x140 */ 0x64, 0xDF, 0xCE, 0x4D, 0xEF, 0xC8, 0x03, 0x18, \n+\t/* 0x148 */ 0x87, 0x3F, 0xA1, 0xAB, 0xFB, 0x3C, 0xA6, 0x9F, \n+\t/* 0x150 */ 0xF0, 0xC3, 0xA1, 0xDA, 0xD4, 0xD8, 0x6E, 0x2B, \n+\t/* 0x158 */ 0x53, 0x90, 0xFB, 0x24, 0xA4, 0x3E, 0x84, 0xF0, \n+\t/* 0x160 */ 0x9E, 0xE8, 0x5F, 0xEC, 0xE5, 0x27, 0x44, 0xF5, \n+\t/* 0x168 */ 0x28, 0xA6, 0x3F, 0x7B, 0xDE, 0xE0, 0x2A, 0xF0, \n+\t/* 0x170 */ 0xC8, 0xAF, 0x53, 0x2F, 0x9E, 0xCA, 0x05, 0x01, \n+\t/* 0x178 */ 0x93, 0x1E, 0x8F, 0x66, 0x1C, 0x39, 0xA7, 0x4D, \n+\t/* 0x180 */ 0xFA, 0x5A, 0xB6, 0x73, 0x04, 0x25, 0x66, 0xEB, \n+\t/* 0x188 */ 0x77, 0x7F, 0xE7, 0x59, 0xC6, 0x4A, 0x99, 0x25, \n+\t/* 0x190 */ 0x14, 0x54, 0xEB, 0x26, 0xC7, 0xF3, 0x7F, 0x19, \n+\t/* 0x198 */ 0xD5, 0x30, 0x70, 0x8F, 0xAF, 0xB0, 0x46, 0x2A, \n+\t/* 0x1a0 */ 0xFF, 0xAD, 0xEB, 0x29, 0xED, 0xD7, 0x9F, 0xAA, \n+\t/* 0x1a8 */ 0x04, 0x87, 0xA3, 0xD4, 0xF9, 0x89, 0xA5, 0x34, \n+\t/* 0x1b0 */ 0x5F, 0xDB, 0x43, 0x91, 0x82, 0x36, 0xD9, 0x66, \n+\t/* 0x1b8 */ 0x3C, 0xB1, 0xB8, 0xB9, 0x82, 0xFD, 0x9C, 0x3A, \n+\t/* 0x1c0 */ 0x3E, 0x10, 0xC8, 0x3B, 0xEF, 0x06, 0x65, 0x66, \n+\t/* 0x1c8 */ 0x7A, 0x9B, 0x19, 0x18, 0x3D, 0xFF, 0x71, 0x51, \n+\t/* 0x1d0 */ 0x3C, 0x30, 0x2E, 0x5F, 0xBE, 0x3D, 0x77, 0x73, \n+\t/* 0x1d8 */ 0xB2, 0x5D, 0x06, 0x6C, 0xC3, 0x23, 0x56, 0x9A, \n+\t/* 0x1e0 */ 0x2B, 0x85, 0x26, 0x92, 0x1C, 0xA7, 0x02, 0xB3, \n+\t/* 0x1e8 */ 0xE4, 0x3F, 0x0D, 0xAF, 0x08, 0x79, 0x82, 0xB8, \n+\t/* 0x1f0 */ 0x36, 0x3D, 0xEA, 0x9C, 0xD3, 0x35, 0xB3, 0xBC, \n+\t/* 0x1f8 */ 0x69, 0xCA, 0xF5, 0xCC, 0x9D, 0xE8, 0xFD, 0x64, \n+\t/* 0x200 */ 0x8D, 0x17, 0x80, 0x33, 0x6E, 0x5E, 0x4A, 0x5D, \n+\t/* 0x208 */ 0x99, 0xC9, 0x1E, 0x87, 0xB4, 0x9D, 0x1A, 0xC0, \n+\t/* 0x210 */ 0xD5, 0x6E, 0x13, 0x35, 0x23, 0x5E, 0xDF, 0x9B, \n+\t/* 0x218 */ 0x5F, 0x3D, 0xEF, 0xD6, 0xF7, 0x76, 0xC2, 0xEA, \n+\t/* 0x220 */ 0x3E, 0xBB, 0x78, 0x0D, 0x1C, 0x42, 0x67, 0x6B, \n+\t/* 0x228 */ 0x04, 0xD8, 0xF8, 0xD6, 0xDA, 0x6F, 0x8B, 0xF2, \n+\t/* 0x230 */ 0x44, 0xA0, 0x01, 0xAB, 0x02, 0x01, 0x03, 0xA3, \n+\t/* 0x238 */ 0x81, 0xC5, 0x30, 0x81, 0xC2, 0x30, 0x1D, 0x06, \n+\t/* 0x240 */ 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, \n+\t/* 0x248 */ 0xBF, 0x5F, 0xB7, 0xD1, 0xCE, 0xDD, 0x1F, 0x86, \n+\t/* 0x250 */ 0xF4, 0x5B, 0x55, 0xAC, 0xDC, 0xD7, 0x10, 0xC2, \n+\t/* 0x258 */ 0x0E, 0xA9, 0x88, 0xE7, 0x30, 0x81, 0x92, 0x06, \n+\t/* 0x260 */ 0x03, 0x55, 0x1D, 0x23, 0x04, 0x81, 0x8A, 0x30, \n+\t/* 0x268 */ 0x81, 0x87, 0x80, 0x14, 0xBF, 0x5F, 0xB7, 0xD1, \n+\t/* 0x270 */ 0xCE, 0xDD, 0x1F, 0x86, 0xF4, 0x5B, 0x55, 0xAC, \n+\t/* 0x278 */ 0xDC, 0xD7, 0x10, 0xC2, 0x0E, 0xA9, 0x88, 0xE7, \n+\t/* 0x280 */ 0xA1, 0x6C, 0xA4, 0x6A, 0x30, 0x68, 0x31, 0x0B, \n+\t/* 0x288 */ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, \n+\t/* 0x290 */ 0x02, 0x55, 0x53, 0x31, 0x25, 0x30, 0x23, 0x06, \n+\t/* 0x298 */ 0x03, 0x55, 0x04, 0x0A, 0x13, 0x1C, 0x53, 0x74, \n+\t/* 0x2a0 */ 0x61, 0x72, 0x66, 0x69, 0x65, 0x6C, 0x64, 0x20, \n+\t/* 0x2a8 */ 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F, \n+\t/* 0x2b0 */ 0x67, 0x69, 0x65, 0x73, 0x2C, 0x20, 0x49, 0x6E, \n+\t/* 0x2b8 */ 0x63, 0x2E, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, \n+\t/* 0x2c0 */ 0x55, 0x04, 0x0B, 0x13, 0x29, 0x53, 0x74, 0x61, \n+\t/* 0x2c8 */ 0x72, 0x66, 0x69, 0x65, 0x6C, 0x64, 0x20, 0x43, \n+\t/* 0x2d0 */ 0x6C, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, \n+\t/* 0x2d8 */ 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, \n+\t/* 0x2e0 */ 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, \n+\t/* 0x2e8 */ 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x82, 0x01, \n+\t/* 0x2f0 */ 0x00, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, \n+\t/* 0x2f8 */ 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, \n+\t/* 0x300 */ 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, \n+\t/* 0x308 */ 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, \n+\t/* 0x310 */ 0x01, 0x01, 0x00, 0x05, 0x9D, 0x3F, 0x88, 0x9D, \n+\t/* 0x318 */ 0xD1, 0xC9, 0x1A, 0x55, 0xA1, 0xAC, 0x69, 0xF3, \n+\t/* 0x320 */ 0xF3, 0x59, 0xDA, 0x9B, 0x01, 0x87, 0x1A, 0x4F, \n+\t/* 0x328 */ 0x57, 0xA9, 0xA1, 0x79, 0x09, 0x2A, 0xDB, 0xF7, \n+\t/* 0x330 */ 0x2F, 0xB2, 0x1E, 0xCC, 0xC7, 0x5E, 0x6A, 0xD8, \n+\t/* 0x338 */ 0x83, 0x87, 0xA1, 0x97, 0xEF, 0x49, 0x35, 0x3E, \n+\t/* 0x340 */ 0x77, 0x06, 0x41, 0x58, 0x62, 0xBF, 0x8E, 0x58, \n+\t/* 0x348 */ 0xB8, 0x0A, 0x67, 0x3F, 0xEC, 0xB3, 0xDD, 0x21, \n+\t/* 0x350 */ 0x66, 0x1F, 0xC9, 0x54, 0xFA, 0x72, 0xCC, 0x3D, \n+\t/* 0x358 */ 0x4C, 0x40, 0xD8, 0x81, 0xAF, 0x77, 0x9E, 0x83, \n+\t/* 0x360 */ 0x7A, 0xBB, 0xA2, 0xC7, 0xF5, 0x34, 0x17, 0x8E, \n+\t/* 0x368 */ 0xD9, 0x11, 0x40, 0xF4, 0xFC, 0x2C, 0x2A, 0x4D, \n+\t/* 0x370 */ 0x15, 0x7F, 0xA7, 0x62, 0x5D, 0x2E, 0x25, 0xD3, \n+\t/* 0x378 */ 0x00, 0x0B, 0x20, 0x1A, 0x1D, 0x68, 0xF9, 0x17, \n+\t/* 0x380 */ 0xB8, 0xF4, 0xBD, 0x8B, 0xED, 0x28, 0x59, 0xDD, \n+\t/* 0x388 */ 0x4D, 0x16, 0x8B, 0x17, 0x83, 0xC8, 0xB2, 0x65, \n+\t/* 0x390 */ 0xC7, 0x2D, 0x7A, 0xA5, 0xAA, 0xBC, 0x53, 0x86, \n+\t/* 0x398 */ 0x6D, 0xDD, 0x57, 0xA4, 0xCA, 0xF8, 0x20, 0x41, \n+\t/* 0x3a0 */ 0x0B, 0x68, 0xF0, 0xF4, 0xFB, 0x74, 0xBE, 0x56, \n+\t/* 0x3a8 */ 0x5D, 0x7A, 0x79, 0xF5, 0xF9, 0x1D, 0x85, 0xE3, \n+\t/* 0x3b0 */ 0x2D, 0x95, 0xBE, 0xF5, 0x71, 0x90, 0x43, 0xCC, \n+\t/* 0x3b8 */ 0x8D, 0x1F, 0x9A, 0x00, 0x0A, 0x87, 0x29, 0xE9, \n+\t/* 0x3c0 */ 0x55, 0x22, 0x58, 0x00, 0x23, 0xEA, 0xE3, 0x12, \n+\t/* 0x3c8 */ 0x43, 0x29, 0x5B, 0x47, 0x08, 0xDD, 0x8C, 0x41, \n+\t/* 0x3d0 */ 0x6A, 0x65, 0x06, 0xA8, 0xE5, 0x21, 0xAA, 0x41, \n+\t/* 0x3d8 */ 0xB4, 0x95, 0x21, 0x95, 0xB9, 0x7D, 0xD1, 0x34, \n+\t/* 0x3e0 */ 0xAB, 0x13, 0xD6, 0xAD, 0xBC, 0xDC, 0xE2, 0x3D, \n+\t/* 0x3e8 */ 0x39, 0xCD, 0xBD, 0x3E, 0x75, 0x70, 0xA1, 0x18, \n+\t/* 0x3f0 */ 0x59, 0x03, 0xC9, 0x22, 0xB4, 0x8F, 0x9C, 0xD5, \n+\t/* 0x3f8 */ 0x5E, 0x2A, 0xD7, 0xA5, 0xB6, 0xD4, 0x0A, 0x6D, \n+\t/* 0x400 */ 0xF8, 0xB7, 0x40, 0x11, 0x46, 0x9A, 0x1F, 0x79, \n+\t/* 0x408 */ 0x0E, 0x62, 0xBF, 0x0F, 0x97, 0xEC, 0xE0, 0x2F, \n+\t/* 0x410 */ 0x1F, 0x17, 0x94, \n+};\n+static const lws_ss_x509_t _ss_x509_starfield_class_2_ca \u003d {\n+\t.vhost_name \u003d \u0022starfield_class_2_ca\u0022,\n+\t.ca_der \u003d _ss_der_starfield_class_2_ca,\n+\t.ca_der_len \u003d 1043,\n+};\n+static const uint8_t _ss_der_starfield_services_root_ca[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x03, 0xEF, 0x30, 0x82, 0x02, 0xD7, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, \n+\t/* 0x 10 */ 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, \n+\t/* 0x 18 */ 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, \n+\t/* 0x 20 */ 0x81, 0x98, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, \n+\t/* 0x 28 */ 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, \n+\t/* 0x 30 */ 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, \n+\t/* 0x 38 */ 0x13, 0x07, 0x41, 0x72, 0x69, 0x7A, 0x6F, 0x6E, \n+\t/* 0x 40 */ 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, \n+\t/* 0x 48 */ 0x04, 0x07, 0x13, 0x0A, 0x53, 0x63, 0x6F, 0x74, \n+\t/* 0x 50 */ 0x74, 0x73, 0x64, 0x61, 0x6C, 0x65, 0x31, 0x25, \n+\t/* 0x 58 */ 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, \n+\t/* 0x 60 */ 0x1C, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, \n+\t/* 0x 68 */ 0x6C, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, \n+\t/* 0x 70 */ 0x6F, 0x6C, 0x6F, 0x67, 0x69, 0x65, 0x73, 0x2C, \n+\t/* 0x 78 */ 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x3B, 0x30, \n+\t/* 0x 80 */ 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, \n+\t/* 0x 88 */ 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6C, \n+\t/* 0x 90 */ 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, \n+\t/* 0x 98 */ 0x65, 0x73, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, \n+\t/* 0x a0 */ 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, \n+\t/* 0x a8 */ 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, \n+\t/* 0x b0 */ 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, \n+\t/* 0x b8 */ 0x47, 0x32, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x39, \n+\t/* 0x c0 */ 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, \n+\t/* 0x c8 */ 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33, 0x37, 0x31, \n+\t/* 0x d0 */ 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, \n+\t/* 0x d8 */ 0x39, 0x5A, 0x30, 0x81, 0x98, 0x31, 0x0B, 0x30, \n+\t/* 0x e0 */ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, \n+\t/* 0x e8 */ 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, \n+\t/* 0x f0 */ 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, \n+\t/* 0x f8 */ 0x7A, 0x6F, 0x6E, 0x61, 0x31, 0x13, 0x30, 0x11, \n+\t/* 0x100 */ 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0A, 0x53, \n+\t/* 0x108 */ 0x63, 0x6F, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6C, \n+\t/* 0x110 */ 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, \n+\t/* 0x118 */ 0x04, 0x0A, 0x13, 0x1C, 0x53, 0x74, 0x61, 0x72, \n+\t/* 0x120 */ 0x66, 0x69, 0x65, 0x6C, 0x64, 0x20, 0x54, 0x65, \n+\t/* 0x128 */ 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, 0x69, \n+\t/* 0x130 */ 0x65, 0x73, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, \n+\t/* 0x138 */ 0x31, 0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x140 */ 0x03, 0x13, 0x32, 0x53, 0x74, 0x61, 0x72, 0x66, \n+\t/* 0x148 */ 0x69, 0x65, 0x6C, 0x64, 0x20, 0x53, 0x65, 0x72, \n+\t/* 0x150 */ 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6F, \n+\t/* 0x158 */ 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, \n+\t/* 0x160 */ 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, \n+\t/* 0x168 */ 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, \n+\t/* 0x170 */ 0x20, 0x2D, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, \n+\t/* 0x178 */ 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, \n+\t/* 0x180 */ 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, \n+\t/* 0x188 */ 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, \n+\t/* 0x190 */ 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xD5, 0x0C, \n+\t/* 0x198 */ 0x3A, 0xC4, 0x2A, 0xF9, 0x4E, 0xE2, 0xF5, 0xBE, \n+\t/* 0x1a0 */ 0x19, 0x97, 0x5F, 0x8E, 0x88, 0x53, 0xB1, 0x1F, \n+\t/* 0x1a8 */ 0x3F, 0xCB, 0xCF, 0x9F, 0x20, 0x13, 0x6D, 0x29, \n+\t/* 0x1b0 */ 0x3A, 0xC8, 0x0F, 0x7D, 0x3C, 0xF7, 0x6B, 0x76, \n+\t/* 0x1b8 */ 0x38, 0x63, 0xD9, 0x36, 0x60, 0xA8, 0x9B, 0x5E, \n+\t/* 0x1c0 */ 0x5C, 0x00, 0x80, 0xB2, 0x2F, 0x59, 0x7F, 0xF6, \n+\t/* 0x1c8 */ 0x87, 0xF9, 0x25, 0x43, 0x86, 0xE7, 0x69, 0x1B, \n+\t/* 0x1d0 */ 0x52, 0x9A, 0x90, 0xE1, 0x71, 0xE3, 0xD8, 0x2D, \n+\t/* 0x1d8 */ 0x0D, 0x4E, 0x6F, 0xF6, 0xC8, 0x49, 0xD9, 0xB6, \n+\t/* 0x1e0 */ 0xF3, 0x1A, 0x56, 0xAE, 0x2B, 0xB6, 0x74, 0x14, \n+\t/* 0x1e8 */ 0xEB, 0xCF, 0xFB, 0x26, 0xE3, 0x1A, 0xBA, 0x1D, \n+\t/* 0x1f0 */ 0x96, 0x2E, 0x6A, 0x3B, 0x58, 0x94, 0x89, 0x47, \n+\t/* 0x1f8 */ 0x56, 0xFF, 0x25, 0xA0, 0x93, 0x70, 0x53, 0x83, \n+\t/* 0x200 */ 0xDA, 0x84, 0x74, 0x14, 0xC3, 0x67, 0x9E, 0x04, \n+\t/* 0x208 */ 0x68, 0x3A, 0xDF, 0x8E, 0x40, 0x5A, 0x1D, 0x4A, \n+\t/* 0x210 */ 0x4E, 0xCF, 0x43, 0x91, 0x3B, 0xE7, 0x56, 0xD6, \n+\t/* 0x218 */ 0x00, 0x70, 0xCB, 0x52, 0xEE, 0x7B, 0x7D, 0xAE, \n+\t/* 0x220 */ 0x3A, 0xE7, 0xBC, 0x31, 0xF9, 0x45, 0xF6, 0xC2, \n+\t/* 0x228 */ 0x60, 0xCF, 0x13, 0x59, 0x02, 0x2B, 0x80, 0xCC, \n+\t/* 0x230 */ 0x34, 0x47, 0xDF, 0xB9, 0xDE, 0x90, 0x65, 0x6D, \n+\t/* 0x238 */ 0x02, 0xCF, 0x2C, 0x91, 0xA6, 0xA6, 0xE7, 0xDE, \n+\t/* 0x240 */ 0x85, 0x18, 0x49, 0x7C, 0x66, 0x4E, 0xA3, 0x3A, \n+\t/* 0x248 */ 0x6D, 0xA9, 0xB5, 0xEE, 0x34, 0x2E, 0xBA, 0x0D, \n+\t/* 0x250 */ 0x03, 0xB8, 0x33, 0xDF, 0x47, 0xEB, 0xB1, 0x6B, \n+\t/* 0x258 */ 0x8D, 0x25, 0xD9, 0x9B, 0xCE, 0x81, 0xD1, 0x45, \n+\t/* 0x260 */ 0x46, 0x32, 0x96, 0x70, 0x87, 0xDE, 0x02, 0x0E, \n+\t/* 0x268 */ 0x49, 0x43, 0x85, 0xB6, 0x6C, 0x73, 0xBB, 0x64, \n+\t/* 0x270 */ 0xEA, 0x61, 0x41, 0xAC, 0xC9, 0xD4, 0x54, 0xDF, \n+\t/* 0x278 */ 0x87, 0x2F, 0xC7, 0x22, 0xB2, 0x26, 0xCC, 0x9F, \n+\t/* 0x280 */ 0x59, 0x54, 0x68, 0x9F, 0xFC, 0xBE, 0x2A, 0x2F, \n+\t/* 0x288 */ 0xC4, 0x55, 0x1C, 0x75, 0x40, 0x60, 0x17, 0x85, \n+\t/* 0x290 */ 0x02, 0x55, 0x39, 0x8B, 0x7F, 0x05, 0x02, 0x03, \n+\t/* 0x298 */ 0x01, 0x00, 0x01, 0xA3, 0x42, 0x30, 0x40, 0x30, \n+\t/* 0x2a0 */ 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, \n+\t/* 0x2a8 */ 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, \n+\t/* 0x2b0 */ 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, \n+\t/* 0x2b8 */ 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, \n+\t/* 0x2c0 */ 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, \n+\t/* 0x2c8 */ 0x16, 0x04, 0x14, 0x9C, 0x5F, 0x00, 0xDF, 0xAA, \n+\t/* 0x2d0 */ 0x01, 0xD7, 0x30, 0x2B, 0x38, 0x88, 0xA2, 0xB8, \n+\t/* 0x2d8 */ 0x6D, 0x4A, 0x9C, 0xF2, 0x11, 0x91, 0x83, 0x30, \n+\t/* 0x2e0 */ 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, \n+\t/* 0x2e8 */ 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, \n+\t/* 0x2f0 */ 0x01, 0x01, 0x00, 0x4B, 0x36, 0xA6, 0x84, 0x77, \n+\t/* 0x2f8 */ 0x69, 0xDD, 0x3B, 0x19, 0x9F, 0x67, 0x23, 0x08, \n+\t/* 0x300 */ 0x6F, 0x0E, 0x61, 0xC9, 0xFD, 0x84, 0xDC, 0x5F, \n+\t/* 0x308 */ 0xD8, 0x36, 0x81, 0xCD, 0xD8, 0x1B, 0x41, 0x2D, \n+\t/* 0x310 */ 0x9F, 0x60, 0xDD, 0xC7, 0x1A, 0x68, 0xD9, 0xD1, \n+\t/* 0x318 */ 0x6E, 0x86, 0xE1, 0x88, 0x23, 0xCF, 0x13, 0xDE, \n+\t/* 0x320 */ 0x43, 0xCF, 0xE2, 0x34, 0xB3, 0x04, 0x9D, 0x1F, \n+\t/* 0x328 */ 0x29, 0xD5, 0xBF, 0xF8, 0x5E, 0xC8, 0xD5, 0xC1, \n+\t/* 0x330 */ 0xBD, 0xEE, 0x92, 0x6F, 0x32, 0x74, 0xF2, 0x91, \n+\t/* 0x338 */ 0x82, 0x2F, 0xBD, 0x82, 0x42, 0x7A, 0xAD, 0x2A, \n+\t/* 0x340 */ 0xB7, 0x20, 0x7D, 0x4D, 0xBC, 0x7A, 0x55, 0x12, \n+\t/* 0x348 */ 0xC2, 0x15, 0xEA, 0xBD, 0xF7, 0x6A, 0x95, 0x2E, \n+\t/* 0x350 */ 0x6C, 0x74, 0x9F, 0xCF, 0x1C, 0xB4, 0xF2, 0xC5, \n+\t/* 0x358 */ 0x01, 0xA3, 0x85, 0xD0, 0x72, 0x3E, 0xAD, 0x73, \n+\t/* 0x360 */ 0xAB, 0x0B, 0x9B, 0x75, 0x0C, 0x6D, 0x45, 0xB7, \n+\t/* 0x368 */ 0x8E, 0x94, 0xAC, 0x96, 0x37, 0xB5, 0xA0, 0xD0, \n+\t/* 0x370 */ 0x8F, 0x15, 0x47, 0x0E, 0xE3, 0xE8, 0x83, 0xDD, \n+\t/* 0x378 */ 0x8F, 0xFD, 0xEF, 0x41, 0x01, 0x77, 0xCC, 0x27, \n+\t/* 0x380 */ 0xA9, 0x62, 0x85, 0x33, 0xF2, 0x37, 0x08, 0xEF, \n+\t/* 0x388 */ 0x71, 0xCF, 0x77, 0x06, 0xDE, 0xC8, 0x19, 0x1D, \n+\t/* 0x390 */ 0x88, 0x40, 0xCF, 0x7D, 0x46, 0x1D, 0xFF, 0x1E, \n+\t/* 0x398 */ 0xC7, 0xE1, 0xCE, 0xFF, 0x23, 0xDB, 0xC6, 0xFA, \n+\t/* 0x3a0 */ 0x8D, 0x55, 0x4E, 0xA9, 0x02, 0xE7, 0x47, 0x11, \n+\t/* 0x3a8 */ 0x46, 0x3E, 0xF4, 0xFD, 0xBD, 0x7B, 0x29, 0x26, \n+\t/* 0x3b0 */ 0xBB, 0xA9, 0x61, 0x62, 0x37, 0x28, 0xB6, 0x2D, \n+\t/* 0x3b8 */ 0x2A, 0xF6, 0x10, 0x86, 0x64, 0xC9, 0x70, 0xA7, \n+\t/* 0x3c0 */ 0xD2, 0xAD, 0xB7, 0x29, 0x70, 0x79, 0xEA, 0x3C, \n+\t/* 0x3c8 */ 0xDA, 0x63, 0x25, 0x9F, 0xFD, 0x68, 0xB7, 0x30, \n+\t/* 0x3d0 */ 0xEC, 0x70, 0xFB, 0x75, 0x8A, 0xB7, 0x6D, 0x60, \n+\t/* 0x3d8 */ 0x67, 0xB2, 0x1E, 0xC8, 0xB9, 0xE9, 0xD8, 0xA8, \n+\t/* 0x3e0 */ 0x6F, 0x02, 0x8B, 0x67, 0x0D, 0x4D, 0x26, 0x57, \n+\t/* 0x3e8 */ 0x71, 0xDA, 0x20, 0xFC, 0xC1, 0x4A, 0x50, 0x8D, \n+\t/* 0x3f0 */ 0xB1, 0x28, 0xBA, \n+};\n+static const lws_ss_x509_t _ss_x509_starfield_services_root_ca \u003d {\n+\t.vhost_name \u003d \u0022starfield_services_root_ca\u0022,\n+\t.ca_der \u003d _ss_der_starfield_services_root_ca,\n+\t.ca_der_len \u003d 1011,\n+};\n+static const lws_ss_trust_store_t _ss_ts_mqtt_amz_iot \u003d {\n+\t.name \u003d \u0022mqtt_amz_iot\u0022,\n+\t.ssx509 \u003d {\n+\t\t\u0026_ss_x509_starfield_services_root_ca,\n+\t\t\u0026_ss_x509_starfield_class_2_ca,\n+\t\t\u0026_ss_x509_amazon_root_ca_1,\n+\t}\n+};\n+static const uint8_t _ss_der_isrg_root_x1[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x05, 0x6B, 0x30, 0x82, 0x03, 0x53, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, \n+\t/* 0x 10 */ 0x82, 0x10, 0xCF, 0xB0, 0xD2, 0x40, 0xE3, 0x59, \n+\t/* 0x 18 */ 0x44, 0x63, 0xE0, 0xBB, 0x63, 0x82, 0x8B, 0x00, \n+\t/* 0x 20 */ 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, \n+\t/* 0x 28 */ 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, \n+\t/* 0x 30 */ 0x4F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, \n+\t/* 0x 38 */ 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x29, \n+\t/* 0x 40 */ 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, \n+\t/* 0x 48 */ 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x65, \n+\t/* 0x 50 */ 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, \n+\t/* 0x 58 */ 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, \n+\t/* 0x 60 */ 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6F, 0x75, \n+\t/* 0x 68 */ 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, \n+\t/* 0x 70 */ 0x04, 0x03, 0x13, 0x0C, 0x49, 0x53, 0x52, 0x47, \n+\t/* 0x 78 */ 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x58, 0x31, \n+\t/* 0x 80 */ 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x35, 0x30, 0x36, \n+\t/* 0x 88 */ 0x30, 0x34, 0x31, 0x31, 0x30, 0x34, 0x33, 0x38, \n+\t/* 0x 90 */ 0x5A, 0x17, 0x0D, 0x33, 0x35, 0x30, 0x36, 0x30, \n+\t/* 0x 98 */ 0x34, 0x31, 0x31, 0x30, 0x34, 0x33, 0x38, 0x5A, \n+\t/* 0x a0 */ 0x30, 0x4F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, \n+\t/* 0x a8 */ 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, \n+\t/* 0x b0 */ 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0A, \n+\t/* 0x b8 */ 0x13, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, \n+\t/* 0x c0 */ 0x65, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, \n+\t/* 0x c8 */ 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, \n+\t/* 0x d0 */ 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6F, \n+\t/* 0x d8 */ 0x75, 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, \n+\t/* 0x e0 */ 0x55, 0x04, 0x03, 0x13, 0x0C, 0x49, 0x53, 0x52, \n+\t/* 0x e8 */ 0x47, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x58, \n+\t/* 0x f0 */ 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0D, 0x06, \n+\t/* 0x f8 */ 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, \n+\t/* 0x100 */ 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0F, \n+\t/* 0x108 */ 0x00, 0x30, 0x82, 0x02, 0x0A, 0x02, 0x82, 0x02, \n+\t/* 0x110 */ 0x01, 0x00, 0xAD, 0xE8, 0x24, 0x73, 0xF4, 0x14, \n+\t/* 0x118 */ 0x37, 0xF3, 0x9B, 0x9E, 0x2B, 0x57, 0x28, 0x1C, \n+\t/* 0x120 */ 0x87, 0xBE, 0xDC, 0xB7, 0xDF, 0x38, 0x90, 0x8C, \n+\t/* 0x128 */ 0x6E, 0x3C, 0xE6, 0x57, 0xA0, 0x78, 0xF7, 0x75, \n+\t/* 0x130 */ 0xC2, 0xA2, 0xFE, 0xF5, 0x6A, 0x6E, 0xF6, 0x00, \n+\t/* 0x138 */ 0x4F, 0x28, 0xDB, 0xDE, 0x68, 0x86, 0x6C, 0x44, \n+\t/* 0x140 */ 0x93, 0xB6, 0xB1, 0x63, 0xFD, 0x14, 0x12, 0x6B, \n+\t/* 0x148 */ 0xBF, 0x1F, 0xD2, 0xEA, 0x31, 0x9B, 0x21, 0x7E, \n+\t/* 0x150 */ 0xD1, 0x33, 0x3C, 0xBA, 0x48, 0xF5, 0xDD, 0x79, \n+\t/* 0x158 */ 0xDF, 0xB3, 0xB8, 0xFF, 0x12, 0xF1, 0x21, 0x9A, \n+\t/* 0x160 */ 0x4B, 0xC1, 0x8A, 0x86, 0x71, 0x69, 0x4A, 0x66, \n+\t/* 0x168 */ 0x66, 0x6C, 0x8F, 0x7E, 0x3C, 0x70, 0xBF, 0xAD, \n+\t/* 0x170 */ 0x29, 0x22, 0x06, 0xF3, 0xE4, 0xC0, 0xE6, 0x80, \n+\t/* 0x178 */ 0xAE, 0xE2, 0x4B, 0x8F, 0xB7, 0x99, 0x7E, 0x94, \n+\t/* 0x180 */ 0x03, 0x9F, 0xD3, 0x47, 0x97, 0x7C, 0x99, 0x48, \n+\t/* 0x188 */ 0x23, 0x53, 0xE8, 0x38, 0xAE, 0x4F, 0x0A, 0x6F, \n+\t/* 0x190 */ 0x83, 0x2E, 0xD1, 0x49, 0x57, 0x8C, 0x80, 0x74, \n+\t/* 0x198 */ 0xB6, 0xDA, 0x2F, 0xD0, 0x38, 0x8D, 0x7B, 0x03, \n+\t/* 0x1a0 */ 0x70, 0x21, 0x1B, 0x75, 0xF2, 0x30, 0x3C, 0xFA, \n+\t/* 0x1a8 */ 0x8F, 0xAE, 0xDD, 0xDA, 0x63, 0xAB, 0xEB, 0x16, \n+\t/* 0x1b0 */ 0x4F, 0xC2, 0x8E, 0x11, 0x4B, 0x7E, 0xCF, 0x0B, \n+\t/* 0x1b8 */ 0xE8, 0xFF, 0xB5, 0x77, 0x2E, 0xF4, 0xB2, 0x7B, \n+\t/* 0x1c0 */ 0x4A, 0xE0, 0x4C, 0x12, 0x25, 0x0C, 0x70, 0x8D, \n+\t/* 0x1c8 */ 0x03, 0x29, 0xA0, 0xE1, 0x53, 0x24, 0xEC, 0x13, \n+\t/* 0x1d0 */ 0xD9, 0xEE, 0x19, 0xBF, 0x10, 0xB3, 0x4A, 0x8C, \n+\t/* 0x1d8 */ 0x3F, 0x89, 0xA3, 0x61, 0x51, 0xDE, 0xAC, 0x87, \n+\t/* 0x1e0 */ 0x07, 0x94, 0xF4, 0x63, 0x71, 0xEC, 0x2E, 0xE2, \n+\t/* 0x1e8 */ 0x6F, 0x5B, 0x98, 0x81, 0xE1, 0x89, 0x5C, 0x34, \n+\t/* 0x1f0 */ 0x79, 0x6C, 0x76, 0xEF, 0x3B, 0x90, 0x62, 0x79, \n+\t/* 0x1f8 */ 0xE6, 0xDB, 0xA4, 0x9A, 0x2F, 0x26, 0xC5, 0xD0, \n+\t/* 0x200 */ 0x10, 0xE1, 0x0E, 0xDE, 0xD9, 0x10, 0x8E, 0x16, \n+\t/* 0x208 */ 0xFB, 0xB7, 0xF7, 0xA8, 0xF7, 0xC7, 0xE5, 0x02, \n+\t/* 0x210 */ 0x07, 0x98, 0x8F, 0x36, 0x08, 0x95, 0xE7, 0xE2, \n+\t/* 0x218 */ 0x37, 0x96, 0x0D, 0x36, 0x75, 0x9E, 0xFB, 0x0E, \n+\t/* 0x220 */ 0x72, 0xB1, 0x1D, 0x9B, 0xBC, 0x03, 0xF9, 0x49, \n+\t/* 0x228 */ 0x05, 0xD8, 0x81, 0xDD, 0x05, 0xB4, 0x2A, 0xD6, \n+\t/* 0x230 */ 0x41, 0xE9, 0xAC, 0x01, 0x76, 0x95, 0x0A, 0x0F, \n+\t/* 0x238 */ 0xD8, 0xDF, 0xD5, 0xBD, 0x12, 0x1F, 0x35, 0x2F, \n+\t/* 0x240 */ 0x28, 0x17, 0x6C, 0xD2, 0x98, 0xC1, 0xA8, 0x09, \n+\t/* 0x248 */ 0x64, 0x77, 0x6E, 0x47, 0x37, 0xBA, 0xCE, 0xAC, \n+\t/* 0x250 */ 0x59, 0x5E, 0x68, 0x9D, 0x7F, 0x72, 0xD6, 0x89, \n+\t/* 0x258 */ 0xC5, 0x06, 0x41, 0x29, 0x3E, 0x59, 0x3E, 0xDD, \n+\t/* 0x260 */ 0x26, 0xF5, 0x24, 0xC9, 0x11, 0xA7, 0x5A, 0xA3, \n+\t/* 0x268 */ 0x4C, 0x40, 0x1F, 0x46, 0xA1, 0x99, 0xB5, 0xA7, \n+\t/* 0x270 */ 0x3A, 0x51, 0x6E, 0x86, 0x3B, 0x9E, 0x7D, 0x72, \n+\t/* 0x278 */ 0xA7, 0x12, 0x05, 0x78, 0x59, 0xED, 0x3E, 0x51, \n+\t/* 0x280 */ 0x78, 0x15, 0x0B, 0x03, 0x8F, 0x8D, 0xD0, 0x2F, \n+\t/* 0x288 */ 0x05, 0xB2, 0x3E, 0x7B, 0x4A, 0x1C, 0x4B, 0x73, \n+\t/* 0x290 */ 0x05, 0x12, 0xFC, 0xC6, 0xEA, 0xE0, 0x50, 0x13, \n+\t/* 0x298 */ 0x7C, 0x43, 0x93, 0x74, 0xB3, 0xCA, 0x74, 0xE7, \n+\t/* 0x2a0 */ 0x8E, 0x1F, 0x01, 0x08, 0xD0, 0x30, 0xD4, 0x5B, \n+\t/* 0x2a8 */ 0x71, 0x36, 0xB4, 0x07, 0xBA, 0xC1, 0x30, 0x30, \n+\t/* 0x2b0 */ 0x5C, 0x48, 0xB7, 0x82, 0x3B, 0x98, 0xA6, 0x7D, \n+\t/* 0x2b8 */ 0x60, 0x8A, 0xA2, 0xA3, 0x29, 0x82, 0xCC, 0xBA, \n+\t/* 0x2c0 */ 0xBD, 0x83, 0x04, 0x1B, 0xA2, 0x83, 0x03, 0x41, \n+\t/* 0x2c8 */ 0xA1, 0xD6, 0x05, 0xF1, 0x1B, 0xC2, 0xB6, 0xF0, \n+\t/* 0x2d0 */ 0xA8, 0x7C, 0x86, 0x3B, 0x46, 0xA8, 0x48, 0x2A, \n+\t/* 0x2d8 */ 0x88, 0xDC, 0x76, 0x9A, 0x76, 0xBF, 0x1F, 0x6A, \n+\t/* 0x2e0 */ 0xA5, 0x3D, 0x19, 0x8F, 0xEB, 0x38, 0xF3, 0x64, \n+\t/* 0x2e8 */ 0xDE, 0xC8, 0x2B, 0x0D, 0x0A, 0x28, 0xFF, 0xF7, \n+\t/* 0x2f0 */ 0xDB, 0xE2, 0x15, 0x42, 0xD4, 0x22, 0xD0, 0x27, \n+\t/* 0x2f8 */ 0x5D, 0xE1, 0x79, 0xFE, 0x18, 0xE7, 0x70, 0x88, \n+\t/* 0x300 */ 0xAD, 0x4E, 0xE6, 0xD9, 0x8B, 0x3A, 0xC6, 0xDD, \n+\t/* 0x308 */ 0x27, 0x51, 0x6E, 0xFF, 0xBC, 0x64, 0xF5, 0x33, \n+\t/* 0x310 */ 0x43, 0x4F, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, \n+\t/* 0x318 */ 0x42, 0x30, 0x40, 0x30, 0x0E, 0x06, 0x03, 0x55, \n+\t/* 0x320 */ 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, \n+\t/* 0x328 */ 0x02, 0x01, 0x06, 0x30, 0x0F, 0x06, 0x03, 0x55, \n+\t/* 0x330 */ 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, \n+\t/* 0x338 */ 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1D, 0x06, 0x03, \n+\t/* 0x340 */ 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x79, \n+\t/* 0x348 */ 0xB4, 0x59, 0xE6, 0x7B, 0xB6, 0xE5, 0xE4, 0x01, \n+\t/* 0x350 */ 0x73, 0x80, 0x08, 0x88, 0xC8, 0x1A, 0x58, 0xF6, \n+\t/* 0x358 */ 0xE9, 0x9B, 0x6E, 0x30, 0x0D, 0x06, 0x09, 0x2A, \n+\t/* 0x360 */ 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, \n+\t/* 0x368 */ 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x55, \n+\t/* 0x370 */ 0x1F, 0x58, 0xA9, 0xBC, 0xB2, 0xA8, 0x50, 0xD0, \n+\t/* 0x378 */ 0x0C, 0xB1, 0xD8, 0x1A, 0x69, 0x20, 0x27, 0x29, \n+\t/* 0x380 */ 0x08, 0xAC, 0x61, 0x75, 0x5C, 0x8A, 0x6E, 0xF8, \n+\t/* 0x388 */ 0x82, 0xE5, 0x69, 0x2F, 0xD5, 0xF6, 0x56, 0x4B, \n+\t/* 0x390 */ 0xB9, 0xB8, 0x73, 0x10, 0x59, 0xD3, 0x21, 0x97, \n+\t/* 0x398 */ 0x7E, 0xE7, 0x4C, 0x71, 0xFB, 0xB2, 0xD2, 0x60, \n+\t/* 0x3a0 */ 0xAD, 0x39, 0xA8, 0x0B, 0xEA, 0x17, 0x21, 0x56, \n+\t/* 0x3a8 */ 0x85, 0xF1, 0x50, 0x0E, 0x59, 0xEB, 0xCE, 0xE0, \n+\t/* 0x3b0 */ 0x59, 0xE9, 0xBA, 0xC9, 0x15, 0xEF, 0x86, 0x9D, \n+\t/* 0x3b8 */ 0x8F, 0x84, 0x80, 0xF6, 0xE4, 0xE9, 0x91, 0x90, \n+\t/* 0x3c0 */ 0xDC, 0x17, 0x9B, 0x62, 0x1B, 0x45, 0xF0, 0x66, \n+\t/* 0x3c8 */ 0x95, 0xD2, 0x7C, 0x6F, 0xC2, 0xEA, 0x3B, 0xEF, \n+\t/* 0x3d0 */ 0x1F, 0xCF, 0xCB, 0xD6, 0xAE, 0x27, 0xF1, 0xA9, \n+\t/* 0x3d8 */ 0xB0, 0xC8, 0xAE, 0xFD, 0x7D, 0x7E, 0x9A, 0xFA, \n+\t/* 0x3e0 */ 0x22, 0x04, 0xEB, 0xFF, 0xD9, 0x7F, 0xEA, 0x91, \n+\t/* 0x3e8 */ 0x2B, 0x22, 0xB1, 0x17, 0x0E, 0x8F, 0xF2, 0x8A, \n+\t/* 0x3f0 */ 0x34, 0x5B, 0x58, 0xD8, 0xFC, 0x01, 0xC9, 0x54, \n+\t/* 0x3f8 */ 0xB9, 0xB8, 0x26, 0xCC, 0x8A, 0x88, 0x33, 0x89, \n+\t/* 0x400 */ 0x4C, 0x2D, 0x84, 0x3C, 0x82, 0xDF, 0xEE, 0x96, \n+\t/* 0x408 */ 0x57, 0x05, 0xBA, 0x2C, 0xBB, 0xF7, 0xC4, 0xB7, \n+\t/* 0x410 */ 0xC7, 0x4E, 0x3B, 0x82, 0xBE, 0x31, 0xC8, 0x22, \n+\t/* 0x418 */ 0x73, 0x73, 0x92, 0xD1, 0xC2, 0x80, 0xA4, 0x39, \n+\t/* 0x420 */ 0x39, 0x10, 0x33, 0x23, 0x82, 0x4C, 0x3C, 0x9F, \n+\t/* 0x428 */ 0x86, 0xB2, 0x55, 0x98, 0x1D, 0xBE, 0x29, 0x86, \n+\t/* 0x430 */ 0x8C, 0x22, 0x9B, 0x9E, 0xE2, 0x6B, 0x3B, 0x57, \n+\t/* 0x438 */ 0x3A, 0x82, 0x70, 0x4D, 0xDC, 0x09, 0xC7, 0x89, \n+\t/* 0x440 */ 0xCB, 0x0A, 0x07, 0x4D, 0x6C, 0xE8, 0x5D, 0x8E, \n+\t/* 0x448 */ 0xC9, 0xEF, 0xCE, 0xAB, 0xC7, 0xBB, 0xB5, 0x2B, \n+\t/* 0x450 */ 0x4E, 0x45, 0xD6, 0x4A, 0xD0, 0x26, 0xCC, 0xE5, \n+\t/* 0x458 */ 0x72, 0xCA, 0x08, 0x6A, 0xA5, 0x95, 0xE3, 0x15, \n+\t/* 0x460 */ 0xA1, 0xF7, 0xA4, 0xED, 0xC9, 0x2C, 0x5F, 0xA5, \n+\t/* 0x468 */ 0xFB, 0xFF, 0xAC, 0x28, 0x02, 0x2E, 0xBE, 0xD7, \n+\t/* 0x470 */ 0x7B, 0xBB, 0xE3, 0x71, 0x7B, 0x90, 0x16, 0xD3, \n+\t/* 0x478 */ 0x07, 0x5E, 0x46, 0x53, 0x7C, 0x37, 0x07, 0x42, \n+\t/* 0x480 */ 0x8C, 0xD3, 0xC4, 0x96, 0x9C, 0xD5, 0x99, 0xB5, \n+\t/* 0x488 */ 0x2A, 0xE0, 0x95, 0x1A, 0x80, 0x48, 0xAE, 0x4C, \n+\t/* 0x490 */ 0x39, 0x07, 0xCE, 0xCC, 0x47, 0xA4, 0x52, 0x95, \n+\t/* 0x498 */ 0x2B, 0xBA, 0xB8, 0xFB, 0xAD, 0xD2, 0x33, 0x53, \n+\t/* 0x4a0 */ 0x7D, 0xE5, 0x1D, 0x4D, 0x6D, 0xD5, 0xA1, 0xB1, \n+\t/* 0x4a8 */ 0xC7, 0x42, 0x6F, 0xE6, 0x40, 0x27, 0x35, 0x5C, \n+\t/* 0x4b0 */ 0xA3, 0x28, 0xB7, 0x07, 0x8D, 0xE7, 0x8D, 0x33, \n+\t/* 0x4b8 */ 0x90, 0xE7, 0x23, 0x9F, 0xFB, 0x50, 0x9C, 0x79, \n+\t/* 0x4c0 */ 0x6C, 0x46, 0xD5, 0xB4, 0x15, 0xB3, 0x96, 0x6E, \n+\t/* 0x4c8 */ 0x7E, 0x9B, 0x0C, 0x96, 0x3A, 0xB8, 0x52, 0x2D, \n+\t/* 0x4d0 */ 0x3F, 0xD6, 0x5B, 0xE1, 0xFB, 0x08, 0xC2, 0x84, \n+\t/* 0x4d8 */ 0xFE, 0x24, 0xA8, 0xA3, 0x89, 0xDA, 0xAC, 0x6A, \n+\t/* 0x4e0 */ 0xE1, 0x18, 0x2A, 0xB1, 0xA8, 0x43, 0x61, 0x5B, \n+\t/* 0x4e8 */ 0xD3, 0x1F, 0xDC, 0x3B, 0x8D, 0x76, 0xF2, 0x2D, \n+\t/* 0x4f0 */ 0xE8, 0x8D, 0x75, 0xDF, 0x17, 0x33, 0x6C, 0x3D, \n+\t/* 0x4f8 */ 0x53, 0xFB, 0x7B, 0xCB, 0x41, 0x5F, 0xFF, 0xDC, \n+\t/* 0x500 */ 0xA2, 0xD0, 0x61, 0x38, 0xE1, 0x96, 0xB8, 0xAC, \n+\t/* 0x508 */ 0x5D, 0x8B, 0x37, 0xD7, 0x75, 0xD5, 0x33, 0xC0, \n+\t/* 0x510 */ 0x99, 0x11, 0xAE, 0x9D, 0x41, 0xC1, 0x72, 0x75, \n+\t/* 0x518 */ 0x84, 0xBE, 0x02, 0x41, 0x42, 0x5F, 0x67, 0x24, \n+\t/* 0x520 */ 0x48, 0x94, 0xD1, 0x9B, 0x27, 0xBE, 0x07, 0x3F, \n+\t/* 0x528 */ 0xB9, 0xB8, 0x4F, 0x81, 0x74, 0x51, 0xE1, 0x7A, \n+\t/* 0x530 */ 0xB7, 0xED, 0x9D, 0x23, 0xE2, 0xBE, 0xE0, 0xD5, \n+\t/* 0x538 */ 0x28, 0x04, 0x13, 0x3C, 0x31, 0x03, 0x9E, 0xDD, \n+\t/* 0x540 */ 0x7A, 0x6C, 0x8F, 0xC6, 0x07, 0x18, 0xC6, 0x7F, \n+\t/* 0x548 */ 0xDE, 0x47, 0x8E, 0x3F, 0x28, 0x9E, 0x04, 0x06, \n+\t/* 0x550 */ 0xCF, 0xA5, 0x54, 0x34, 0x77, 0xBD, 0xEC, 0x89, \n+\t/* 0x558 */ 0x9B, 0xE9, 0x17, 0x43, 0xDF, 0x5B, 0xDB, 0x5F, \n+\t/* 0x560 */ 0xFE, 0x8E, 0x1E, 0x57, 0xA2, 0xCD, 0x40, 0x9D, \n+\t/* 0x568 */ 0x7E, 0x62, 0x22, 0xDA, 0xDE, 0x18, 0x27, \n+};\n+static const lws_ss_x509_t _ss_x509_isrg_root_x1 \u003d {\n+\t.vhost_name \u003d \u0022isrg_root_x1\u0022,\n+\t.ca_der \u003d _ss_der_isrg_root_x1,\n+\t.ca_der_len \u003d 1391,\n+};\n+static const uint8_t _ss_der_LEX3_isrg_root_x1[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x05, 0x8D, 0x30, 0x82, 0x03, 0x75, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, \n+\t/* 0x 10 */ 0xD3, 0xB1, 0x72, 0x26, 0x34, 0x23, 0x32, 0xDC, \n+\t/* 0x 18 */ 0xF4, 0x05, 0x28, 0x51, 0x2A, 0xEC, 0x9C, 0x6A, \n+\t/* 0x 20 */ 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, \n+\t/* 0x 28 */ 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, \n+\t/* 0x 30 */ 0x4F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, \n+\t/* 0x 38 */ 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x29, \n+\t/* 0x 40 */ 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, \n+\t/* 0x 48 */ 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x65, \n+\t/* 0x 50 */ 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, \n+\t/* 0x 58 */ 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, \n+\t/* 0x 60 */ 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6F, 0x75, \n+\t/* 0x 68 */ 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, \n+\t/* 0x 70 */ 0x04, 0x03, 0x13, 0x0C, 0x49, 0x53, 0x52, 0x47, \n+\t/* 0x 78 */ 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x58, 0x31, \n+\t/* 0x 80 */ 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x36, 0x31, 0x30, \n+\t/* 0x 88 */ 0x30, 0x36, 0x31, 0x35, 0x34, 0x33, 0x35, 0x35, \n+\t/* 0x 90 */ 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x31, 0x30, 0x30, \n+\t/* 0x 98 */ 0x36, 0x31, 0x35, 0x34, 0x33, 0x35, 0x35, 0x5A, \n+\t/* 0x a0 */ 0x30, 0x4A, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, \n+\t/* 0x a8 */ 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, \n+\t/* 0x b0 */ 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0A, \n+\t/* 0x b8 */ 0x13, 0x0D, 0x4C, 0x65, 0x74, 0x27, 0x73, 0x20, \n+\t/* 0x c0 */ 0x45, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x31, \n+\t/* 0x c8 */ 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, \n+\t/* 0x d0 */ 0x13, 0x1A, 0x4C, 0x65, 0x74, 0x27, 0x73, 0x20, \n+\t/* 0x d8 */ 0x45, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x20, \n+\t/* 0x e0 */ 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, \n+\t/* 0x e8 */ 0x79, 0x20, 0x58, 0x33, 0x30, 0x82, 0x01, 0x22, \n+\t/* 0x f0 */ 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, \n+\t/* 0x f8 */ 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, \n+\t/* 0x100 */ 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, \n+\t/* 0x108 */ 0x02, 0x82, 0x01, 0x01, 0x00, 0x9C, 0xD3, 0x0C, \n+\t/* 0x110 */ 0xF0, 0x5A, 0xE5, 0x2E, 0x47, 0xB7, 0x72, 0x5D, \n+\t/* 0x118 */ 0x37, 0x83, 0xB3, 0x68, 0x63, 0x30, 0xEA, 0xD7, \n+\t/* 0x120 */ 0x35, 0x26, 0x19, 0x25, 0xE1, 0xBD, 0xBE, 0x35, \n+\t/* 0x128 */ 0xF1, 0x70, 0x92, 0x2F, 0xB7, 0xB8, 0x4B, 0x41, \n+\t/* 0x130 */ 0x05, 0xAB, 0xA9, 0x9E, 0x35, 0x08, 0x58, 0xEC, \n+\t/* 0x138 */ 0xB1, 0x2A, 0xC4, 0x68, 0x87, 0x0B, 0xA3, 0xE3, \n+\t/* 0x140 */ 0x75, 0xE4, 0xE6, 0xF3, 0xA7, 0x62, 0x71, 0xBA, \n+\t/* 0x148 */ 0x79, 0x81, 0x60, 0x1F, 0xD7, 0x91, 0x9A, 0x9F, \n+\t/* 0x150 */ 0xF3, 0xD0, 0x78, 0x67, 0x71, 0xC8, 0x69, 0x0E, \n+\t/* 0x158 */ 0x95, 0x91, 0xCF, 0xFE, 0xE6, 0x99, 0xE9, 0x60, \n+\t/* 0x160 */ 0x3C, 0x48, 0xCC, 0x7E, 0xCA, 0x4D, 0x77, 0x12, \n+\t/* 0x168 */ 0x24, 0x9D, 0x47, 0x1B, 0x5A, 0xEB, 0xB9, 0xEC, \n+\t/* 0x170 */ 0x1E, 0x37, 0x00, 0x1C, 0x9C, 0xAC, 0x7B, 0xA7, \n+\t/* 0x178 */ 0x05, 0xEA, 0xCE, 0x4A, 0xEB, 0xBD, 0x41, 0xE5, \n+\t/* 0x180 */ 0x36, 0x98, 0xB9, 0xCB, 0xFD, 0x6D, 0x3C, 0x96, \n+\t/* 0x188 */ 0x68, 0xDF, 0x23, 0x2A, 0x42, 0x90, 0x0C, 0x86, \n+\t/* 0x190 */ 0x74, 0x67, 0xC8, 0x7F, 0xA5, 0x9A, 0xB8, 0x52, \n+\t/* 0x198 */ 0x61, 0x14, 0x13, 0x3F, 0x65, 0xE9, 0x82, 0x87, \n+\t/* 0x1a0 */ 0xCB, 0xDB, 0xFA, 0x0E, 0x56, 0xF6, 0x86, 0x89, \n+\t/* 0x1a8 */ 0xF3, 0x85, 0x3F, 0x97, 0x86, 0xAF, 0xB0, 0xDC, \n+\t/* 0x1b0 */ 0x1A, 0xEF, 0x6B, 0x0D, 0x95, 0x16, 0x7D, 0xC4, \n+\t/* 0x1b8 */ 0x2B, 0xA0, 0x65, 0xB2, 0x99, 0x04, 0x36, 0x75, \n+\t/* 0x1c0 */ 0x80, 0x6B, 0xAC, 0x4A, 0xF3, 0x1B, 0x90, 0x49, \n+\t/* 0x1c8 */ 0x78, 0x2F, 0xA2, 0x96, 0x4F, 0x2A, 0x20, 0x25, \n+\t/* 0x1d0 */ 0x29, 0x04, 0xC6, 0x74, 0xC0, 0xD0, 0x31, 0xCD, \n+\t/* 0x1d8 */ 0x8F, 0x31, 0x38, 0x95, 0x16, 0xBA, 0xA8, 0x33, \n+\t/* 0x1e0 */ 0xB8, 0x43, 0xF1, 0xB1, 0x1F, 0xC3, 0x30, 0x7F, \n+\t/* 0x1e8 */ 0xA2, 0x79, 0x31, 0x13, 0x3D, 0x2D, 0x36, 0xF8, \n+\t/* 0x1f0 */ 0xE3, 0xFC, 0xF2, 0x33, 0x6A, 0xB9, 0x39, 0x31, \n+\t/* 0x1f8 */ 0xC5, 0xAF, 0xC4, 0x8D, 0x0D, 0x1D, 0x64, 0x16, \n+\t/* 0x200 */ 0x33, 0xAA, 0xFA, 0x84, 0x29, 0xB6, 0xD4, 0x0B, \n+\t/* 0x208 */ 0xC0, 0xD8, 0x7D, 0xC3, 0x93, 0x02, 0x03, 0x01, \n+\t/* 0x210 */ 0x00, 0x01, 0xA3, 0x82, 0x01, 0x67, 0x30, 0x82, \n+\t/* 0x218 */ 0x01, 0x63, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, \n+\t/* 0x220 */ 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, \n+\t/* 0x228 */ 0x01, 0x86, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1D, \n+\t/* 0x230 */ 0x13, 0x01, 0x01, 0xFF, 0x04, 0x08, 0x30, 0x06, \n+\t/* 0x238 */ 0x01, 0x01, 0xFF, 0x02, 0x01, 0x00, 0x30, 0x54, \n+\t/* 0x240 */ 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x4D, 0x30, \n+\t/* 0x248 */ 0x4B, 0x30, 0x08, 0x06, 0x06, 0x67, 0x81, 0x0C, \n+\t/* 0x250 */ 0x01, 0x02, 0x01, 0x30, 0x3F, 0x06, 0x0B, 0x2B, \n+\t/* 0x258 */ 0x06, 0x01, 0x04, 0x01, 0x82, 0xDF, 0x13, 0x01, \n+\t/* 0x260 */ 0x01, 0x01, 0x30, 0x30, 0x30, 0x2E, 0x06, 0x08, \n+\t/* 0x268 */ 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, \n+\t/* 0x270 */ 0x16, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, \n+\t/* 0x278 */ 0x2F, 0x63, 0x70, 0x73, 0x2E, 0x72, 0x6F, 0x6F, \n+\t/* 0x280 */ 0x74, 0x2D, 0x78, 0x31, 0x2E, 0x6C, 0x65, 0x74, \n+\t/* 0x288 */ 0x73, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, \n+\t/* 0x290 */ 0x2E, 0x6F, 0x72, 0x67, 0x30, 0x1D, 0x06, 0x03, \n+\t/* 0x298 */ 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xA8, \n+\t/* 0x2a0 */ 0x4A, 0x6A, 0x63, 0x04, 0x7D, 0xDD, 0xBA, 0xE6, \n+\t/* 0x2a8 */ 0xD1, 0x39, 0xB7, 0xA6, 0x45, 0x65, 0xEF, 0xF3, \n+\t/* 0x2b0 */ 0xA8, 0xEC, 0xA1, 0x30, 0x33, 0x06, 0x03, 0x55, \n+\t/* 0x2b8 */ 0x1D, 0x1F, 0x04, 0x2C, 0x30, 0x2A, 0x30, 0x28, \n+\t/* 0x2c0 */ 0xA0, 0x26, 0xA0, 0x24, 0x86, 0x22, 0x68, 0x74, \n+\t/* 0x2c8 */ 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, \n+\t/* 0x2d0 */ 0x2E, 0x72, 0x6F, 0x6F, 0x74, 0x2D, 0x78, 0x31, \n+\t/* 0x2d8 */ 0x2E, 0x6C, 0x65, 0x74, 0x73, 0x65, 0x6E, 0x63, \n+\t/* 0x2e0 */ 0x72, 0x79, 0x70, 0x74, 0x2E, 0x6F, 0x72, 0x67, \n+\t/* 0x2e8 */ 0x30, 0x72, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, \n+\t/* 0x2f0 */ 0x05, 0x07, 0x01, 0x01, 0x04, 0x66, 0x30, 0x64, \n+\t/* 0x2f8 */ 0x30, 0x30, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, \n+\t/* 0x300 */ 0x05, 0x07, 0x30, 0x01, 0x86, 0x24, 0x68, 0x74, \n+\t/* 0x308 */ 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, \n+\t/* 0x310 */ 0x70, 0x2E, 0x72, 0x6F, 0x6F, 0x74, 0x2D, 0x78, \n+\t/* 0x318 */ 0x31, 0x2E, 0x6C, 0x65, 0x74, 0x73, 0x65, 0x6E, \n+\t/* 0x320 */ 0x63, 0x72, 0x79, 0x70, 0x74, 0x2E, 0x6F, 0x72, \n+\t/* 0x328 */ 0x67, 0x2F, 0x30, 0x30, 0x06, 0x08, 0x2B, 0x06, \n+\t/* 0x330 */ 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x24, \n+\t/* 0x338 */ 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, \n+\t/* 0x340 */ 0x65, 0x72, 0x74, 0x2E, 0x72, 0x6F, 0x6F, 0x74, \n+\t/* 0x348 */ 0x2D, 0x78, 0x31, 0x2E, 0x6C, 0x65, 0x74, 0x73, \n+\t/* 0x350 */ 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2E, \n+\t/* 0x358 */ 0x6F, 0x72, 0x67, 0x2F, 0x30, 0x1F, 0x06, 0x03, \n+\t/* 0x360 */ 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, \n+\t/* 0x368 */ 0x14, 0x79, 0xB4, 0x59, 0xE6, 0x7B, 0xB6, 0xE5, \n+\t/* 0x370 */ 0xE4, 0x01, 0x73, 0x80, 0x08, 0x88, 0xC8, 0x1A, \n+\t/* 0x378 */ 0x58, 0xF6, 0xE9, 0x9B, 0x6E, 0x30, 0x0D, 0x06, \n+\t/* 0x380 */ 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, \n+\t/* 0x388 */ 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, \n+\t/* 0x390 */ 0x00, 0x19, 0xCF, 0x75, 0x20, 0x34, 0x2D, 0x3A, \n+\t/* 0x398 */ 0xA6, 0x45, 0xFF, 0xD0, 0xD5, 0xE6, 0x8C, 0xDA, \n+\t/* 0x3a0 */ 0x32, 0xE8, 0x9C, 0x6E, 0x1B, 0x41, 0xD1, 0x27, \n+\t/* 0x3a8 */ 0xA8, 0xE2, 0x50, 0xF2, 0x70, 0xAA, 0xC4, 0xE7, \n+\t/* 0x3b0 */ 0x93, 0x46, 0xB4, 0xE8, 0x10, 0xAB, 0x70, 0x4F, \n+\t/* 0x3b8 */ 0xEF, 0xB7, 0xEA, 0x04, 0xD2, 0x94, 0x11, 0xB1, \n+\t/* 0x3c0 */ 0x03, 0xFE, 0x5D, 0xBA, 0xDF, 0x36, 0x8C, 0x94, \n+\t/* 0x3c8 */ 0x36, 0x8F, 0x13, 0x7C, 0x44, 0x8F, 0x0B, 0xF5, \n+\t/* 0x3d0 */ 0x01, 0x57, 0xAD, 0x68, 0xB8, 0xC5, 0x79, 0xC0, \n+\t/* 0x3d8 */ 0xD8, 0x4A, 0x80, 0xD7, 0x4C, 0xA3, 0x1E, 0x24, \n+\t/* 0x3e0 */ 0x7A, 0x1F, 0xD7, 0x23, 0xE8, 0xC1, 0x62, 0x3A, \n+\t/* 0x3e8 */ 0x76, 0xF9, 0x22, 0x7D, 0x5E, 0x5A, 0xC4, 0x4C, \n+\t/* 0x3f0 */ 0x50, 0xCD, 0xAF, 0xDD, 0xEF, 0x6D, 0x36, 0xC0, \n+\t/* 0x3f8 */ 0x80, 0x80, 0x1B, 0xA4, 0x3C, 0x70, 0x20, 0xD6, \n+\t/* 0x400 */ 0x54, 0x21, 0xD3, 0xBA, 0xEF, 0x14, 0xA9, 0xBF, \n+\t/* 0x408 */ 0x07, 0x3F, 0x41, 0x0A, 0x36, 0xB1, 0xA2, 0xB0, \n+\t/* 0x410 */ 0x0B, 0x20, 0xD5, 0x1F, 0x67, 0xD0, 0xC3, 0xEB, \n+\t/* 0x418 */ 0x88, 0xF6, 0x8A, 0x02, 0xC8, 0xC6, 0x57, 0xB6, \n+\t/* 0x420 */ 0x0C, 0xFC, 0x56, 0xF1, 0xD2, 0x3F, 0x17, 0x69, \n+\t/* 0x428 */ 0x68, 0x1C, 0xC8, 0xD7, 0x66, 0x3A, 0x86, 0xF1, \n+\t/* 0x430 */ 0x19, 0x2A, 0x65, 0x47, 0x68, 0xC6, 0xD2, 0x03, \n+\t/* 0x438 */ 0xE7, 0xEF, 0x74, 0x16, 0x0B, 0x06, 0x21, 0xF9, \n+\t/* 0x440 */ 0x0C, 0xA6, 0xA8, 0x11, 0x4B, 0x4E, 0x5F, 0xE3, \n+\t/* 0x448 */ 0x33, 0xDB, 0x08, 0x41, 0xEA, 0x09, 0x79, 0x75, \n+\t/* 0x450 */ 0x78, 0xEE, 0x47, 0xC8, 0x42, 0xD3, 0x81, 0xC5, \n+\t/* 0x458 */ 0x65, 0x2D, 0x75, 0xD0, 0x0E, 0x00, 0x16, 0x9D, \n+\t/* 0x460 */ 0x1C, 0xEE, 0xB7, 0x58, 0x45, 0x25, 0xE7, 0x33, \n+\t/* 0x468 */ 0x63, 0x5B, 0x63, 0x41, 0x09, 0xE8, 0xE9, 0xFE, \n+\t/* 0x470 */ 0xAC, 0xFA, 0x73, 0x32, 0x74, 0xB3, 0x76, 0xE9, \n+\t/* 0x478 */ 0x6B, 0x94, 0xE2, 0xCD, 0xD4, 0x62, 0xF3, 0xAE, \n+\t/* 0x480 */ 0x3A, 0xC5, 0x31, 0x46, 0x52, 0x6E, 0xED, 0x34, \n+\t/* 0x488 */ 0x91, 0x1E, 0xA0, 0xC2, 0xDE, 0x54, 0x84, 0xE5, \n+\t/* 0x490 */ 0x78, 0x20, 0x56, 0x4C, 0xDD, 0x68, 0xF9, 0x2E, \n+\t/* 0x498 */ 0x28, 0x64, 0x1B, 0x1A, 0x99, 0xF2, 0xFB, 0x4D, \n+\t/* 0x4a0 */ 0x7F, 0xE3, 0xB8, 0x5F, 0x5D, 0x73, 0x41, 0xEC, \n+\t/* 0x4a8 */ 0x79, 0xED, 0x58, 0xD6, 0x7A, 0x37, 0x65, 0x70, \n+\t/* 0x4b0 */ 0xA7, 0xB1, 0xBA, 0x39, 0xF6, 0x3E, 0x61, 0x0A, \n+\t/* 0x4b8 */ 0xD9, 0xC0, 0x86, 0x90, 0x9A, 0x1A, 0xC8, 0xA8, \n+\t/* 0x4c0 */ 0x96, 0x6E, 0x8A, 0x0B, 0x2B, 0x6D, 0xED, 0xD6, \n+\t/* 0x4c8 */ 0xFA, 0x07, 0x67, 0xE7, 0x29, 0x04, 0xF7, 0xE2, \n+\t/* 0x4d0 */ 0xB2, 0xD1, 0x58, 0x15, 0x52, 0xC7, 0xF1, 0xA3, \n+\t/* 0x4d8 */ 0x9D, 0xA6, 0xC0, 0x56, 0x2C, 0xD4, 0x92, 0x98, \n+\t/* 0x4e0 */ 0xD8, 0xF1, 0x83, 0xB9, 0x6C, 0x7C, 0x33, 0xA0, \n+\t/* 0x4e8 */ 0xE5, 0x4B, 0xAA, 0x90, 0x92, 0xF1, 0xDA, 0x45, \n+\t/* 0x4f0 */ 0x4A, 0x34, 0x14, 0xC7, 0x7C, 0x4E, 0xC4, 0xA5, \n+\t/* 0x4f8 */ 0x6C, 0x5D, 0x3F, 0xBF, 0xDE, 0xB9, 0xA8, 0x61, \n+\t/* 0x500 */ 0x4A, 0x85, 0x20, 0xDE, 0x42, 0x83, 0x29, 0x62, \n+\t/* 0x508 */ 0x7C, 0x1C, 0x99, 0x08, 0xA5, 0x46, 0x1F, 0xF4, \n+\t/* 0x510 */ 0x6B, 0x22, 0xD3, 0x86, 0x51, 0xCB, 0x37, 0xCD, \n+\t/* 0x518 */ 0x60, 0x4A, 0x42, 0x63, 0x56, 0xB3, 0xC8, 0xD1, \n+\t/* 0x520 */ 0x8F, 0x31, 0x09, 0x53, 0xC1, 0xE2, 0xDC, 0x1B, \n+\t/* 0x528 */ 0xD4, 0xF1, 0x54, 0x77, 0x67, 0xCF, 0x33, 0x7B, \n+\t/* 0x530 */ 0x00, 0xD6, 0xD2, 0x7C, 0xDE, 0xC6, 0x79, 0xBF, \n+\t/* 0x538 */ 0xCB, 0xE0, 0x16, 0xFD, 0xB2, 0xA1, 0xF2, 0x91, \n+\t/* 0x540 */ 0x3C, 0x1D, 0x2D, 0xE8, 0x9C, 0xD4, 0x03, 0xCD, \n+\t/* 0x548 */ 0x66, 0x4A, 0xA3, 0x37, 0x93, 0x19, 0x79, 0x7B, \n+\t/* 0x550 */ 0xE2, 0x19, 0xC2, 0x16, 0x00, 0xC8, 0xED, 0x0E, \n+\t/* 0x558 */ 0x4E, 0x0D, 0xFF, 0x7E, 0xCF, 0x07, 0xA8, 0x64, \n+\t/* 0x560 */ 0xCD, 0x29, 0xDF, 0x41, 0xAA, 0x85, 0x30, 0x49, \n+\t/* 0x568 */ 0x10, 0x73, 0xA7, 0x4E, 0x89, 0x32, 0x0E, 0x5B, \n+\t/* 0x570 */ 0xAD, 0x40, 0x86, 0xC1, 0xB0, 0x94, 0x0C, 0x8D, \n+\t/* 0x578 */ 0x26, 0xC5, 0xA7, 0x49, 0xDC, 0x1C, 0xF8, 0x5B, \n+\t/* 0x580 */ 0x14, 0x7A, 0x7F, 0x23, 0x69, 0x04, 0xAD, 0xB2, \n+\t/* 0x588 */ 0x02, 0x29, 0xD6, 0x12, 0xC8, 0xA4, 0xC6, 0xA1, \n+\t/* 0x590 */ 0x2D, \n+};\n+static const lws_ss_x509_t _ss_x509_LEX3_isrg_root_x1 \u003d {\n+\t.vhost_name \u003d \u0022LEX3_isrg_root_x1\u0022,\n+\t.ca_der \u003d _ss_der_LEX3_isrg_root_x1,\n+\t.ca_der_len \u003d 1425,\n+};\n+static const lws_ss_trust_store_t _ss_ts_le_via_isrg \u003d {\n+\t.name \u003d \u0022le_via_isrg\u0022,\n+\t.ssx509 \u003d {\n+\t\t\u0026_ss_x509_LEX3_isrg_root_x1,\n+\t\t\u0026_ss_x509_isrg_root_x1,\n+\t}\n+};\n+\n+static const lws_ss_metadata_t _md_mintest_xctype \u003d {\n+\t.name \u003d \u0022xctype\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022X-Content-Type:\u0022,\n+\t.length \u003d 0,\n+},\n+_md_mintest_ctype \u003d {\n+\t.next \u003d (void *)\u0026_md_mintest_xctype, \n+\t.name \u003d \u0022ctype\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022Content-Type:\u0022,\n+\t.length \u003d 1,\n+},\n+_md_mintest_uptag \u003d {\n+\t.next \u003d (void *)\u0026_md_mintest_ctype, \n+\t.name \u003d \u0022uptag\u0022,\n+\t.value__may_own_heap \u003d (void *)\u0022X-Upload-Tag:\u0022,\n+\t.length \u003d 2,\n+};\n+\n+static const lws_ss_trust_store_t _ss_ts_avs_via_starfield \u003d {\n+\t.name \u003d \u0022avs_via_starfield\u0022,\n+\t.ssx509 \u003d {\n+\t\t\u0026_ss_x509_starfield_services_root_ca,\n+\t\t\u0026_ss_x509_starfield_class_2_ca,\n+\t}\n+};\n+static const uint8_t _ss_der_digicert_global_ca_g2[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x04, 0x8B, 0x30, 0x82, 0x03, 0x73, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0C, \n+\t/* 0x 10 */ 0x8E, 0xE0, 0xC9, 0x0D, 0x6A, 0x89, 0x15, 0x88, \n+\t/* 0x 18 */ 0x04, 0x06, 0x1E, 0xE2, 0x41, 0xF9, 0xAF, 0x30, \n+\t/* 0x 20 */ 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, \n+\t/* 0x 28 */ 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x61, \n+\t/* 0x 30 */ 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x 38 */ 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, \n+\t/* 0x 40 */ 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, \n+\t/* 0x 48 */ 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, \n+\t/* 0x 50 */ 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, \n+\t/* 0x 58 */ 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, \n+\t/* 0x 60 */ 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, \n+\t/* 0x 68 */ 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, \n+\t/* 0x 70 */ 0x20, 0x30, 0x1E, 0x06, 0x03, 0x55, 0x04, 0x03, \n+\t/* 0x 78 */ 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, \n+\t/* 0x 80 */ 0x72, 0x74, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, \n+\t/* 0x 88 */ 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, \n+\t/* 0x 90 */ 0x32, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x33, 0x30, \n+\t/* 0x 98 */ 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, \n+\t/* 0x a0 */ 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x38, 0x30, 0x38, \n+\t/* 0x a8 */ 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, \n+\t/* 0x b0 */ 0x5A, 0x30, 0x44, 0x31, 0x0B, 0x30, 0x09, 0x06, \n+\t/* 0x b8 */ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, \n+\t/* 0x c0 */ 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x c8 */ 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, \n+\t/* 0x d0 */ 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, \n+\t/* 0x d8 */ 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x03, \n+\t/* 0x e0 */ 0x13, 0x15, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, \n+\t/* 0x e8 */ 0x72, 0x74, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, \n+\t/* 0x f0 */ 0x6C, 0x20, 0x43, 0x41, 0x20, 0x47, 0x32, 0x30, \n+\t/* 0x f8 */ 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, \n+\t/* 0x100 */ 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, \n+\t/* 0x108 */ 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, \n+\t/* 0x110 */ 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, \n+\t/* 0x118 */ 0xD3, 0x48, 0x7C, 0xBE, 0xF3, 0x05, 0x86, 0x5D, \n+\t/* 0x120 */ 0x5B, 0xD5, 0x2F, 0x85, 0x4E, 0x4B, 0xE0, 0x86, \n+\t/* 0x128 */ 0xAD, 0x15, 0xAC, 0x61, 0xCF, 0x5B, 0xAF, 0x3E, \n+\t/* 0x130 */ 0x6A, 0x0A, 0x47, 0xFB, 0x9A, 0x76, 0x91, 0x60, \n+\t/* 0x138 */ 0x0B, 0x8A, 0x6B, 0xCD, 0xCF, 0xDC, 0x57, 0x7E, \n+\t/* 0x140 */ 0x60, 0x98, 0x0B, 0xE4, 0x54, 0xD9, 0x56, 0xED, \n+\t/* 0x148 */ 0x21, 0xCC, 0x02, 0xB6, 0x5A, 0x81, 0x5F, 0x97, \n+\t/* 0x150 */ 0x6A, 0xEE, 0x02, 0x2F, 0x23, 0x27, 0xB8, 0x6D, \n+\t/* 0x158 */ 0xD4, 0xB0, 0xE7, 0x06, 0x02, 0x78, 0x0B, 0x1F, \n+\t/* 0x160 */ 0x5C, 0xA9, 0x99, 0x36, 0xFE, 0xBB, 0xAC, 0x1B, \n+\t/* 0x168 */ 0x05, 0xFA, 0x57, 0xCD, 0x81, 0x10, 0x40, 0x67, \n+\t/* 0x170 */ 0xD6, 0x30, 0x8B, 0x58, 0x35, 0xD4, 0x96, 0x61, \n+\t/* 0x178 */ 0xBE, 0xD0, 0x8C, 0x7A, 0x97, 0x9F, 0x1A, 0xF9, \n+\t/* 0x180 */ 0x22, 0xE6, 0x14, 0x2F, 0xA9, 0xC6, 0xE8, 0x01, \n+\t/* 0x188 */ 0x1F, 0xAB, 0xF8, 0x26, 0x0F, 0xAC, 0x8E, 0x4D, \n+\t/* 0x190 */ 0x2C, 0x32, 0x39, 0x1D, 0x81, 0x9B, 0x8D, 0x1C, \n+\t/* 0x198 */ 0x65, 0xB2, 0x1C, 0xDB, 0x61, 0xA8, 0x89, 0x2F, \n+\t/* 0x1a0 */ 0x60, 0xE7, 0xEB, 0xC2, 0x4A, 0x18, 0xC4, 0x6F, \n+\t/* 0x1a8 */ 0x2A, 0xE9, 0x10, 0x92, 0x09, 0xED, 0x17, 0xD1, \n+\t/* 0x1b0 */ 0x00, 0x2B, 0xE6, 0x7D, 0xEF, 0x04, 0x89, 0x14, \n+\t/* 0x1b8 */ 0x4E, 0x33, 0xA1, 0xB2, 0x0F, 0x97, 0x87, 0x9F, \n+\t/* 0x1c0 */ 0xB3, 0xA0, 0xCD, 0x2F, 0xBC, 0x2C, 0xEC, 0xB8, \n+\t/* 0x1c8 */ 0x83, 0x68, 0x31, 0x3D, 0x1F, 0xD5, 0x4A, 0x90, \n+\t/* 0x1d0 */ 0x10, 0x19, 0x0B, 0x81, 0x95, 0xD6, 0x29, 0x76, \n+\t/* 0x1d8 */ 0x51, 0xF9, 0x36, 0x76, 0xD0, 0xB7, 0x09, 0x7A, \n+\t/* 0x1e0 */ 0x38, 0x4A, 0xD7, 0x6F, 0x8C, 0xBF, 0x13, 0x7C, \n+\t/* 0x1e8 */ 0x39, 0xED, 0xBA, 0xAE, 0x90, 0xFC, 0x95, 0xF7, \n+\t/* 0x1f0 */ 0x7B, 0x78, 0x09, 0x36, 0x5E, 0x74, 0x93, 0x1E, \n+\t/* 0x1f8 */ 0x25, 0xF0, 0xFF, 0xD4, 0xAD, 0xAE, 0x68, 0x6B, \n+\t/* 0x200 */ 0xC6, 0xFF, 0x0F, 0xD5, 0x35, 0xF1, 0x55, 0x6E, \n+\t/* 0x208 */ 0x48, 0x49, 0xF8, 0xF8, 0xB8, 0xEF, 0x88, 0xF8, \n+\t/* 0x210 */ 0xF1, 0x5E, 0x11, 0x77, 0xAA, 0xDF, 0x02, 0xB3, \n+\t/* 0x218 */ 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, \n+\t/* 0x220 */ 0x5A, 0x30, 0x82, 0x01, 0x56, 0x30, 0x12, 0x06, \n+\t/* 0x228 */ 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, \n+\t/* 0x230 */ 0x08, 0x30, 0x06, 0x01, 0x01, 0xFF, 0x02, 0x01, \n+\t/* 0x238 */ 0x00, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, \n+\t/* 0x240 */ 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, \n+\t/* 0x248 */ 0x86, 0x30, 0x34, 0x06, 0x08, 0x2B, 0x06, 0x01, \n+\t/* 0x250 */ 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x28, 0x30, \n+\t/* 0x258 */ 0x26, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, \n+\t/* 0x260 */ 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, \n+\t/* 0x268 */ 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, \n+\t/* 0x270 */ 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, \n+\t/* 0x278 */ 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, \n+\t/* 0x280 */ 0x7B, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x74, \n+\t/* 0x288 */ 0x30, 0x72, 0x30, 0x37, 0xA0, 0x35, 0xA0, 0x33, \n+\t/* 0x290 */ 0x86, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, \n+\t/* 0x298 */ 0x2F, 0x63, 0x72, 0x6C, 0x34, 0x2E, 0x64, 0x69, \n+\t/* 0x2a0 */ 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, \n+\t/* 0x2a8 */ 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, \n+\t/* 0x2b0 */ 0x65, 0x72, 0x74, 0x47, 0x6C, 0x6F, 0x62, 0x61, \n+\t/* 0x2b8 */ 0x6C, 0x52, 0x6F, 0x6F, 0x74, 0x47, 0x32, 0x2E, \n+\t/* 0x2c0 */ 0x63, 0x72, 0x6C, 0x30, 0x37, 0xA0, 0x35, 0xA0, \n+\t/* 0x2c8 */ 0x33, 0x86, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3A, \n+\t/* 0x2d0 */ 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64, \n+\t/* 0x2d8 */ 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, \n+\t/* 0x2e0 */ 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, \n+\t/* 0x2e8 */ 0x43, 0x65, 0x72, 0x74, 0x47, 0x6C, 0x6F, 0x62, \n+\t/* 0x2f0 */ 0x61, 0x6C, 0x52, 0x6F, 0x6F, 0x74, 0x47, 0x32, \n+\t/* 0x2f8 */ 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x3D, 0x06, 0x03, \n+\t/* 0x300 */ 0x55, 0x1D, 0x20, 0x04, 0x36, 0x30, 0x34, 0x30, \n+\t/* 0x308 */ 0x32, 0x06, 0x04, 0x55, 0x1D, 0x20, 0x00, 0x30, \n+\t/* 0x310 */ 0x2A, 0x30, 0x28, 0x06, 0x08, 0x2B, 0x06, 0x01, \n+\t/* 0x318 */ 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, \n+\t/* 0x320 */ 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, \n+\t/* 0x328 */ 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, \n+\t/* 0x330 */ 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, \n+\t/* 0x338 */ 0x43, 0x50, 0x53, 0x30, 0x1D, 0x06, 0x03, 0x55, \n+\t/* 0x340 */ 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x24, 0x6E, \n+\t/* 0x348 */ 0x2B, 0x2D, 0xD0, 0x6A, 0x92, 0x51, 0x51, 0x25, \n+\t/* 0x350 */ 0x69, 0x01, 0xAA, 0x9A, 0x47, 0xA6, 0x89, 0xE7, \n+\t/* 0x358 */ 0x40, 0x20, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, \n+\t/* 0x360 */ 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x4E, \n+\t/* 0x368 */ 0x22, 0x54, 0x20, 0x18, 0x95, 0xE6, 0xE3, 0x6E, \n+\t/* 0x370 */ 0xE6, 0x0F, 0xFA, 0xFA, 0xB9, 0x12, 0xED, 0x06, \n+\t/* 0x378 */ 0x17, 0x8F, 0x39, 0x30, 0x0D, 0x06, 0x09, 0x2A, \n+\t/* 0x380 */ 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, \n+\t/* 0x388 */ 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x0B, \n+\t/* 0x390 */ 0x39, 0x84, 0x91, 0xF9, 0x97, 0xEB, 0xAA, 0x81, \n+\t/* 0x398 */ 0xAF, 0x84, 0xE9, 0x5A, 0x38, 0x92, 0xFC, 0xE2, \n+\t/* 0x3a0 */ 0x6C, 0x59, 0xBF, 0x36, 0xC8, 0x45, 0xA7, 0x31, \n+\t/* 0x3a8 */ 0x03, 0x11, 0xE1, 0x06, 0xC0, 0xAC, 0x32, 0xC7, \n+\t/* 0x3b0 */ 0x5A, 0x55, 0x29, 0xDA, 0x4F, 0x40, 0x02, 0xF5, \n+\t/* 0x3b8 */ 0xA1, 0xDE, 0xB0, 0xED, 0xDE, 0xC0, 0xF8, 0xF6, \n+\t/* 0x3c0 */ 0x75, 0x9D, 0x76, 0xB9, 0x87, 0xFE, 0x41, 0x80, \n+\t/* 0x3c8 */ 0x7A, 0xCF, 0x5D, 0xE3, 0x00, 0xC6, 0x5B, 0x02, \n+\t/* 0x3d0 */ 0xE6, 0x9B, 0x78, 0x62, 0xC9, 0xDC, 0xB8, 0x62, \n+\t/* 0x3d8 */ 0x9A, 0x77, 0xED, 0x89, 0x08, 0xD7, 0x4B, 0xC5, \n+\t/* 0x3e0 */ 0xFD, 0x43, 0xD5, 0x62, 0x23, 0x27, 0xC4, 0x04, \n+\t/* 0x3e8 */ 0x59, 0x6D, 0x71, 0x3F, 0x23, 0x5B, 0xEA, 0xD9, \n+\t/* 0x3f0 */ 0xF2, 0xE7, 0x24, 0x27, 0x6F, 0xF4, 0x95, 0x80, \n+\t/* 0x3f8 */ 0xDB, 0x96, 0x2C, 0xE4, 0x54, 0x8B, 0xCF, 0xEA, \n+\t/* 0x400 */ 0x19, 0xD9, 0x7F, 0x55, 0x99, 0x51, 0x7A, 0x0E, \n+\t/* 0x408 */ 0x2D, 0x18, 0x3D, 0x78, 0x58, 0x52, 0xBC, 0x63, \n+\t/* 0x410 */ 0x68, 0x57, 0x0B, 0xDD, 0x44, 0xB3, 0x57, 0x4A, \n+\t/* 0x418 */ 0x60, 0xE6, 0xC8, 0x70, 0x70, 0x5B, 0x87, 0x28, \n+\t/* 0x420 */ 0x6A, 0xD7, 0x3B, 0x4E, 0x52, 0x45, 0x19, 0xAF, \n+\t/* 0x428 */ 0x24, 0x06, 0x92, 0x48, 0x11, 0x1A, 0x8B, 0xAE, \n+\t/* 0x430 */ 0xAC, 0x18, 0x12, 0x57, 0xAC, 0x03, 0xCB, 0xB8, \n+\t/* 0x438 */ 0xF4, 0xBD, 0xCA, 0x26, 0x0E, 0xA7, 0xC1, 0xDD, \n+\t/* 0x440 */ 0xE3, 0x33, 0xEF, 0xC0, 0x55, 0x30, 0x0D, 0x95, \n+\t/* 0x448 */ 0x59, 0x4E, 0x9C, 0x03, 0x36, 0x06, 0xF8, 0xC0, \n+\t/* 0x450 */ 0x8F, 0x14, 0x99, 0x9C, 0x4D, 0x2A, 0x9E, 0xC1, \n+\t/* 0x458 */ 0xE1, 0x7D, 0x3B, 0xAF, 0x72, 0xA7, 0x45, 0xBA, \n+\t/* 0x460 */ 0x13, 0x96, 0x29, 0x4E, 0x19, 0xD0, 0x1A, 0x98, \n+\t/* 0x468 */ 0x06, 0xF4, 0x37, 0x94, 0x17, 0xAD, 0xA3, 0x18, \n+\t/* 0x470 */ 0xBA, 0x3E, 0xB0, 0x01, 0x0C, 0x95, 0xD6, 0x29, \n+\t/* 0x478 */ 0x35, 0x20, 0x35, 0x7D, 0xF5, 0x10, 0x60, 0xE4, \n+\t/* 0x480 */ 0xF7, 0x68, 0x62, 0x1E, 0xEC, 0x19, 0xE1, 0x24, \n+\t/* 0x488 */ 0xF2, 0x87, 0x11, 0xAC, 0xE9, 0x08, 0x80, \n+};\n+static const lws_ss_x509_t _ss_x509_digicert_global_ca_g2 \u003d {\n+\t.vhost_name \u003d \u0022digicert_global_ca_g2\u0022,\n+\t.ca_der \u003d _ss_der_digicert_global_ca_g2,\n+\t.ca_der_len \u003d 1167,\n+};\n+static const uint8_t _ss_der_digicert_global_root_g2[] \u003d {\n+\t/* 0x 0 */ 0x30, 0x82, 0x03, 0x8E, 0x30, 0x82, 0x02, 0x76, \n+\t/* 0x 8 */ 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x03, \n+\t/* 0x 10 */ 0x3A, 0xF1, 0xE6, 0xA7, 0x11, 0xA9, 0xA0, 0xBB, \n+\t/* 0x 18 */ 0x28, 0x64, 0xB1, 0x1D, 0x09, 0xFA, 0xE5, 0x30, \n+\t/* 0x 20 */ 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, \n+\t/* 0x 28 */ 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x61, \n+\t/* 0x 30 */ 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x 38 */ 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, \n+\t/* 0x 40 */ 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, \n+\t/* 0x 48 */ 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, \n+\t/* 0x 50 */ 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, \n+\t/* 0x 58 */ 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, \n+\t/* 0x 60 */ 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, \n+\t/* 0x 68 */ 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, \n+\t/* 0x 70 */ 0x20, 0x30, 0x1E, 0x06, 0x03, 0x55, 0x04, 0x03, \n+\t/* 0x 78 */ 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, \n+\t/* 0x 80 */ 0x72, 0x74, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, \n+\t/* 0x 88 */ 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, \n+\t/* 0x 90 */ 0x32, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x33, 0x30, \n+\t/* 0x 98 */ 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, \n+\t/* 0x a0 */ 0x30, 0x5A, 0x17, 0x0D, 0x33, 0x38, 0x30, 0x31, \n+\t/* 0x a8 */ 0x31, 0x35, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, \n+\t/* 0x b0 */ 0x5A, 0x30, 0x61, 0x31, 0x0B, 0x30, 0x09, 0x06, \n+\t/* 0x b8 */ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, \n+\t/* 0x c0 */ 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, \n+\t/* 0x c8 */ 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, \n+\t/* 0x d0 */ 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, \n+\t/* 0x d8 */ 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, \n+\t/* 0x e0 */ 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, \n+\t/* 0x e8 */ 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, \n+\t/* 0x f0 */ 0x6F, 0x6D, 0x31, 0x20, 0x30, 0x1E, 0x06, 0x03, \n+\t/* 0x f8 */ 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, \n+\t/* 0x100 */ 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6C, \n+\t/* 0x108 */ 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, \n+\t/* 0x110 */ 0x74, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, \n+\t/* 0x118 */ 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, \n+\t/* 0x120 */ 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, \n+\t/* 0x128 */ 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, \n+\t/* 0x130 */ 0x02, 0x82, 0x01, 0x01, 0x00, 0xBB, 0x37, 0xCD, \n+\t/* 0x138 */ 0x34, 0xDC, 0x7B, 0x6B, 0xC9, 0xB2, 0x68, 0x90, \n+\t/* 0x140 */ 0xAD, 0x4A, 0x75, 0xFF, 0x46, 0xBA, 0x21, 0x0A, \n+\t/* 0x148 */ 0x08, 0x8D, 0xF5, 0x19, 0x54, 0xC9, 0xFB, 0x88, \n+\t/* 0x150 */ 0xDB, 0xF3, 0xAE, 0xF2, 0x3A, 0x89, 0x91, 0x3C, \n+\t/* 0x158 */ 0x7A, 0xE6, 0xAB, 0x06, 0x1A, 0x6B, 0xCF, 0xAC, \n+\t/* 0x160 */ 0x2D, 0xE8, 0x5E, 0x09, 0x24, 0x44, 0xBA, 0x62, \n+\t/* 0x168 */ 0x9A, 0x7E, 0xD6, 0xA3, 0xA8, 0x7E, 0xE0, 0x54, \n+\t/* 0x170 */ 0x75, 0x20, 0x05, 0xAC, 0x50, 0xB7, 0x9C, 0x63, \n+\t/* 0x178 */ 0x1A, 0x6C, 0x30, 0xDC, 0xDA, 0x1F, 0x19, 0xB1, \n+\t/* 0x180 */ 0xD7, 0x1E, 0xDE, 0xFD, 0xD7, 0xE0, 0xCB, 0x94, \n+\t/* 0x188 */ 0x83, 0x37, 0xAE, 0xEC, 0x1F, 0x43, 0x4E, 0xDD, \n+\t/* 0x190 */ 0x7B, 0x2C, 0xD2, 0xBD, 0x2E, 0xA5, 0x2F, 0xE4, \n+\t/* 0x198 */ 0xA9, 0xB8, 0xAD, 0x3A, 0xD4, 0x99, 0xA4, 0xB6, \n+\t/* 0x1a0 */ 0x25, 0xE9, 0x9B, 0x6B, 0x00, 0x60, 0x92, 0x60, \n+\t/* 0x1a8 */ 0xFF, 0x4F, 0x21, 0x49, 0x18, 0xF7, 0x67, 0x90, \n+\t/* 0x1b0 */ 0xAB, 0x61, 0x06, 0x9C, 0x8F, 0xF2, 0xBA, 0xE9, \n+\t/* 0x1b8 */ 0xB4, 0xE9, 0x92, 0x32, 0x6B, 0xB5, 0xF3, 0x57, \n+\t/* 0x1c0 */ 0xE8, 0x5D, 0x1B, 0xCD, 0x8C, 0x1D, 0xAB, 0x95, \n+\t/* 0x1c8 */ 0x04, 0x95, 0x49, 0xF3, 0x35, 0x2D, 0x96, 0xE3, \n+\t/* 0x1d0 */ 0x49, 0x6D, 0xDD, 0x77, 0xE3, 0xFB, 0x49, 0x4B, \n+\t/* 0x1d8 */ 0xB4, 0xAC, 0x55, 0x07, 0xA9, 0x8F, 0x95, 0xB3, \n+\t/* 0x1e0 */ 0xB4, 0x23, 0xBB, 0x4C, 0x6D, 0x45, 0xF0, 0xF6, \n+\t/* 0x1e8 */ 0xA9, 0xB2, 0x95, 0x30, 0xB4, 0xFD, 0x4C, 0x55, \n+\t/* 0x1f0 */ 0x8C, 0x27, 0x4A, 0x57, 0x14, 0x7C, 0x82, 0x9D, \n+\t/* 0x1f8 */ 0xCD, 0x73, 0x92, 0xD3, 0x16, 0x4A, 0x06, 0x0C, \n+\t/* 0x200 */ 0x8C, 0x50, 0xD1, 0x8F, 0x1E, 0x09, 0xBE, 0x17, \n+\t/* 0x208 */ 0xA1, 0xE6, 0x21, 0xCA, 0xFD, 0x83, 0xE5, 0x10, \n+\t/* 0x210 */ 0xBC, 0x83, 0xA5, 0x0A, 0xC4, 0x67, 0x28, 0xF6, \n+\t/* 0x218 */ 0x73, 0x14, 0x14, 0x3D, 0x46, 0x76, 0xC3, 0x87, \n+\t/* 0x220 */ 0x14, 0x89, 0x21, 0x34, 0x4D, 0xAF, 0x0F, 0x45, \n+\t/* 0x228 */ 0x0C, 0xA6, 0x49, 0xA1, 0xBA, 0xBB, 0x9C, 0xC5, \n+\t/* 0x230 */ 0xB1, 0x33, 0x83, 0x29, 0x85, 0x02, 0x03, 0x01, \n+\t/* 0x238 */ 0x00, 0x01, 0xA3, 0x42, 0x30, 0x40, 0x30, 0x0F, \n+\t/* 0x240 */ 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, \n+\t/* 0x248 */ 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, \n+\t/* 0x250 */ 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, \n+\t/* 0x258 */ 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, \n+\t/* 0x260 */ 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, \n+\t/* 0x268 */ 0x04, 0x14, 0x4E, 0x22, 0x54, 0x20, 0x18, 0x95, \n+\t/* 0x270 */ 0xE6, 0xE3, 0x6E, 0xE6, 0x0F, 0xFA, 0xFA, 0xB9, \n+\t/* 0x278 */ 0x12, 0xED, 0x06, 0x17, 0x8F, 0x39, 0x30, 0x0D, \n+\t/* 0x280 */ 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, \n+\t/* 0x288 */ 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, \n+\t/* 0x290 */ 0x01, 0x00, 0x60, 0x67, 0x28, 0x94, 0x6F, 0x0E, \n+\t/* 0x298 */ 0x48, 0x63, 0xEB, 0x31, 0xDD, 0xEA, 0x67, 0x18, \n+\t/* 0x2a0 */ 0xD5, 0x89, 0x7D, 0x3C, 0xC5, 0x8B, 0x4A, 0x7F, \n+\t/* 0x2a8 */ 0xE9, 0xBE, 0xDB, 0x2B, 0x17, 0xDF, 0xB0, 0x5F, \n+\t/* 0x2b0 */ 0x73, 0x77, 0x2A, 0x32, 0x13, 0x39, 0x81, 0x67, \n+\t/* 0x2b8 */ 0x42, 0x84, 0x23, 0xF2, 0x45, 0x67, 0x35, 0xEC, \n+\t/* 0x2c0 */ 0x88, 0xBF, 0xF8, 0x8F, 0xB0, 0x61, 0x0C, 0x34, \n+\t/* 0x2c8 */ 0xA4, 0xAE, 0x20, 0x4C, 0x84, 0xC6, 0xDB, 0xF8, \n+\t/* 0x2d0 */ 0x35, 0xE1, 0x76, 0xD9, 0xDF, 0xA6, 0x42, 0xBB, \n+\t/* 0x2d8 */ 0xC7, 0x44, 0x08, 0x86, 0x7F, 0x36, 0x74, 0x24, \n+\t/* 0x2e0 */ 0x5A, 0xDA, 0x6C, 0x0D, 0x14, 0x59, 0x35, 0xBD, \n+\t/* 0x2e8 */ 0xF2, 0x49, 0xDD, 0xB6, 0x1F, 0xC9, 0xB3, 0x0D, \n+\t/* 0x2f0 */ 0x47, 0x2A, 0x3D, 0x99, 0x2F, 0xBB, 0x5C, 0xBB, \n+\t/* 0x2f8 */ 0xB5, 0xD4, 0x20, 0xE1, 0x99, 0x5F, 0x53, 0x46, \n+\t/* 0x300 */ 0x15, 0xDB, 0x68, 0x9B, 0xF0, 0xF3, 0x30, 0xD5, \n+\t/* 0x308 */ 0x3E, 0x31, 0xE2, 0x8D, 0x84, 0x9E, 0xE3, 0x8A, \n+\t/* 0x310 */ 0xDA, 0xDA, 0x96, 0x3E, 0x35, 0x13, 0xA5, 0x5F, \n+\t/* 0x318 */ 0xF0, 0xF9, 0x70, 0x50, 0x70, 0x47, 0x41, 0x11, \n+\t/* 0x320 */ 0x57, 0x19, 0x4E, 0xC0, 0x8F, 0xAE, 0x06, 0xC4, \n+\t/* 0x328 */ 0x95, 0x13, 0x17, 0x2F, 0x1B, 0x25, 0x9F, 0x75, \n+\t/* 0x330 */ 0xF2, 0xB1, 0x8E, 0x99, 0xA1, 0x6F, 0x13, 0xB1, \n+\t/* 0x338 */ 0x41, 0x71, 0xFE, 0x88, 0x2A, 0xC8, 0x4F, 0x10, \n+\t/* 0x340 */ 0x20, 0x55, 0xD7, 0xF3, 0x14, 0x45, 0xE5, 0xE0, \n+\t/* 0x348 */ 0x44, 0xF4, 0xEA, 0x87, 0x95, 0x32, 0x93, 0x0E, \n+\t/* 0x350 */ 0xFE, 0x53, 0x46, 0xFA, 0x2C, 0x9D, 0xFF, 0x8B, \n+\t/* 0x358 */ 0x22, 0xB9, 0x4B, 0xD9, 0x09, 0x45, 0xA4, 0xDE, \n+\t/* 0x360 */ 0xA4, 0xB8, 0x9A, 0x58, 0xDD, 0x1B, 0x7D, 0x52, \n+\t/* 0x368 */ 0x9F, 0x8E, 0x59, 0x43, 0x88, 0x81, 0xA4, 0x9E, \n+\t/* 0x370 */ 0x26, 0xD5, 0x6F, 0xAD, 0xDD, 0x0D, 0xC6, 0x37, \n+\t/* 0x378 */ 0x7D, 0xED, 0x03, 0x92, 0x1B, 0xE5, 0x77, 0x5F, \n+\t/* 0x380 */ 0x76, 0xEE, 0x3C, 0x8D, 0xC4, 0x5D, 0x56, 0x5B, \n+\t/* 0x388 */ 0xA2, 0xD9, 0x66, 0x6E, 0xB3, 0x35, 0x37, 0xE5, \n+\t/* 0x390 */ 0x32, 0xB6, \n+};\n+static const lws_ss_x509_t _ss_x509_digicert_global_root_g2 \u003d {\n+\t.vhost_name \u003d \u0022digicert_global_root_g2\u0022,\n+\t.ca_der \u003d _ss_der_digicert_global_root_g2,\n+\t.ca_der_len \u003d 914,\n+};\n+static const lws_ss_trust_store_t _ss_ts_api_amazon_com \u003d {\n+\t.name \u003d \u0022api_amazon_com\u0022,\n+\t.ssx509 \u003d {\n+\t\t\u0026_ss_x509_digicert_global_root_g2,\n+\t\t\u0026_ss_x509_digicert_global_ca_g2,\n+\t}\n+};\n+\n+static const lws_ss_policy_t _ssp_captive_portal_detect \u003d {\n+\t.streamtype \u003d \u0022captive_portal_detect\u0022,\n+\t.endpoint \u003d \u0022connectivitycheck.android.com\u0022,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022GET\u0022,\n+\t\t\t.url \u003d \u0022generate_204\u0022,\n+\t\t\t.resp_expect \u003d 204,\n+\t\t\t.fail_redirect \u003d 1,\n+\t\t}\n+\t},\n+\t.flags \u003d 0x1,\n+\t.port \u003d 80,\n+\t.protocol \u003d 0,\n+},\n+_ssp_mqtt_test1 \u003d {\n+\t.next \u003d (void *)\u0026_ssp_captive_portal_detect,\n+\t.streamtype \u003d \u0022mqtt_test1\u0022,\n+\t.endpoint \u003d \u0022a1ygonr3im5cv2-ats.iot.us-west-2.amazonaws.com\u0022,\n+\t.u \u003d {\n+\t\t.mqtt \u003d {\n+\t\t\t.topic \u003d \u0022test/topic1\u0022,\n+\t\t\t.subscribe \u003d \u0022test/topic1\u0022,\n+\t\t\t.qos \u003d 1,\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x10,\n+\t.port \u003d 443,\n+\t.protocol \u003d 3,\n+\t.client_cert \u003d 1,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_mqtt_amz_iot},\n+},\n+_ssp_mqtt_test \u003d {\n+\t.next \u003d (void *)\u0026_ssp_mqtt_test1,\n+\t.streamtype \u003d \u0022mqtt_test\u0022,\n+\t.endpoint \u003d \u0022a1ygonr3im5cv2-ats.iot.us-west-2.amazonaws.com\u0022,\n+\t.u \u003d {\n+\t\t.mqtt \u003d {\n+\t\t\t.topic \u003d \u0022test/topic0\u0022,\n+\t\t\t.subscribe \u003d \u0022test/topic0\u0022,\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x10,\n+\t.port \u003d 443,\n+\t.protocol \u003d 3,\n+\t.client_cert \u003d 1,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_mqtt_amz_iot},\n+},\n+_ssp_minpost \u003d {\n+\t.next \u003d (void *)\u0026_ssp_mqtt_test,\n+\t.streamtype \u003d \u0022minpost\u0022,\n+\t.endpoint \u003d \u0022warmcat.com\u0022,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022POST\u0022,\n+\t\t\t.url \u003d \u0022testserver/formtest\u0022,\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x11,\n+\t.port \u003d 443,\n+\t.protocol \u003d 0,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_le_via_isrg},\n+},\n+_ssp_mintest_fail \u003d {\n+\t.next \u003d (void *)\u0026_ssp_minpost,\n+\t.streamtype \u003d \u0022mintest-fail\u0022,\n+\t.endpoint \u003d \u0022warmcat.com\u0022,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022GET\u0022,\n+\t\t\t.url \u003d \u0022index.html\u0022,\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x11,\n+\t.port \u003d 22,\n+\t.protocol \u003d 0,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_le_via_isrg},\n+},\n+_ssp_h2longpolltest \u003d {\n+\t.next \u003d (void *)\u0026_ssp_mintest_fail,\n+\t.streamtype \u003d \u0022h2longpolltest\u0022,\n+\t.endpoint \u003d \u0022warmcat.com\u0022,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022GET\u0022,\n+\t\t\t.url \u003d \u0022index.html\u0022,\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x32,\n+\t.port \u003d 443,\n+\t.protocol \u003d 1,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_le_via_isrg},\n+},\n+_ssp_mintest \u003d {\n+\t.next \u003d (void *)\u0026_ssp_h2longpolltest,\n+\t.streamtype \u003d \u0022mintest\u0022,\n+\t.endpoint \u003d \u0022warmcat.com\u0022,\n+\t.metadata \u003d (void *)\u0026_md_mintest_uptag,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022GET\u0022,\n+\t\t\t.url \u003d \u0022index.html?uptag\u003d${uptag}\u0022,\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x11,\n+\t.port \u003d 443,\n+\t.metadata_count \u003d 3,\n+\t.protocol \u003d 0,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_le_via_isrg},\n+},\n+_ssp_avs_audio \u003d {\n+\t.next \u003d (void *)\u0026_ssp_mintest,\n+\t.streamtype \u003d \u0022avs_audio\u0022,\n+\t.endpoint \u003d \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022POST\u0022,\n+\t\t\t.url \u003d \u0022v20160207/events\u0022,\n+\t\t\t.multipart_name \u003d \u0022audio\u0022,\n+\t\t\t.multipart_content_type \u003d \u0022application/octet-stream\u0022,\n+\t\t\t.auth_preamble \u003d \u0022Bearer \u0022,\n+\t\t\t.blob_header \u003d {\n+\t\t\t\t\u0022authorization:\u0022,\n+\t\t\t},\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0xa90,\n+\t.port \u003d 443,\n+\t.protocol \u003d 1,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_avs_via_starfield},\n+},\n+_ssp_avs_metadata \u003d {\n+\t.next \u003d (void *)\u0026_ssp_avs_audio,\n+\t.streamtype \u003d \u0022avs_metadata\u0022,\n+\t.endpoint \u003d \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t.rideshare_streamtype \u003d \u0022avs_audio\u0022,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022POST\u0022,\n+\t\t\t.url \u003d \u0022v20160207/events\u0022,\n+\t\t\t.multipart_name \u003d \u0022metadata\u0022,\n+\t\t\t.multipart_content_type \u003d \u0022application/json; charset\u003dUTF-8\u0022,\n+\t\t\t.auth_preamble \u003d \u0022Bearer \u0022,\n+\t\t\t.blob_header \u003d {\n+\t\t\t\t\u0022authorization:\u0022,\n+\t\t\t},\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0xa91,\n+\t.port \u003d 443,\n+\t.protocol \u003d 1,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_avs_via_starfield},\n+},\n+_ssp_avs_event \u003d {\n+\t.next \u003d (void *)\u0026_ssp_avs_metadata,\n+\t.streamtype \u003d \u0022avs_event\u0022,\n+\t.endpoint \u003d \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022GET\u0022,\n+\t\t\t.url \u003d \u0022v20160207/directives\u0022,\n+\t\t\t.auth_preamble \u003d \u0022Bearer \u0022,\n+\t\t\t.blob_header \u003d {\n+\t\t\t\t\u0022authorization:\u0022,\n+\t\t\t},\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x2b2,\n+\t.port \u003d 443,\n+\t.protocol \u003d 1,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_avs_via_starfield},\n+},\n+_ssp_api_amazon_com_auth \u003d {\n+\t.next \u003d (void *)\u0026_ssp_avs_event,\n+\t.streamtype \u003d \u0022api_amazon_com_auth\u0022,\n+\t.endpoint \u003d \u0022api.amazon.com\u0022,\n+\t.u \u003d {\n+\t\t.http \u003d {\n+\t\t\t.method \u003d \u0022POST\u0022,\n+\t\t\t.url \u003d \u0022auth/o2/token\u0022,\n+\t\t}\n+\t},\n+\t.retry_bo \u003d \u0026_rbo_0,\n+\t.flags \u003d 0x1291,\n+\t.port \u003d 443,\n+\t.protocol \u003d 0,\n+\t.trust \u003d {.store \u003d \u0026_ss_ts_api_amazon_com},\n+};\n+#define _ss_static_policy_entry _ssp_api_amazon_com_auth\n+/* estimated footprint 10720 (when sizeof void * \u003d 8) */\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.json\nnew file mode 100644\nindex 0000000..6f16fa1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.json\n@@ -0,0 +1,218 @@\n+{\n+\t\u0022release\u0022: \u002201234567\u0022,\n+\t\u0022product\u0022: \u0022myproduct\u0022,\n+\t\u0022schema-version\u0022: 1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022: [1000, 2000, 3000, 5000, 10000],\n+\t\t\t\u0022conceal\u0022: 5,\n+\t\t\t\u0022jitterpc\u0022: 20,\n+\t\t\t\u0022svalidping\u0022: 30,\n+\t\t\t\u0022svalidhup\u0022: 35\n+\t\t}\n+\t}],\n+\t\u0022certs\u0022: [{\n+\t\t\u0022isrg_root_x1\u0022: \u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZLubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t}, {\n+\t\t\u0022LEX3_isrg_root_x1\u0022: \u0022MIIFjTCCA3WgAwIBAgIRANOxciY0IzLc9AUoUSrsnGowDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTYxMDA2MTU0MzU1WhcNMjExMDA2MTU0MzU1WjBKMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3MgRW5jcnlwdDEjMCEGA1UEAxMaTGV0J3MgRW5jcnlwdCBBdXRob3JpdHkgWDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCc0wzwWuUuR7dyXTeDs2hjMOrXNSYZJeG9vjXxcJIvt7hLQQWrqZ41CFjssSrEaIcLo+N15Obzp2JxunmBYB/XkZqf89B4Z3HIaQ6Vkc/+5pnpYDxIzH7KTXcSJJ1HG1rrueweNwAcnKx7pwXqzkrrvUHlNpi5y/1tPJZo3yMqQpAMhnRnyH+lmrhSYRQTP2XpgofL2/oOVvaGifOFP5eGr7DcGu9rDZUWfcQroGWymQQ2dYBrrErzG5BJeC+ilk8qICUpBMZ0wNAxzY8xOJUWuqgzuEPxsR/DMH+ieTETPS02+OP88jNquTkxxa/EjQ0dZBYzqvqEKbbUC8DYfcOTAgMBAAGjggFnMIIBYzAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEBATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQub3JnMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3JsLnJvb3QteDEubGV0c2VuY3J5cHQub3JnMHIGCCsGAQUFBwEBBGYwZDAwBggrBgEFBQcwAYYkaHR0cDovL29jc3Aucm9vdC14MS5sZXRzZW5jcnlwdC5vcmcvMDAGCCsGAQUFBzAChiRodHRwOi8vY2VydC5yb290LXgxLmxldHNlbmNyeXB0Lm9yZy8wHwYDVR0jBBgwFoAUebRZ5nu25eQBc4AIiMgaWPbpm24wDQYJKoZIhvcNAQELBQADggIBABnPdSA0LTqmRf/Q1eaM2jLonG4bQdEnqOJQ8nCqxOeTRrToEKtwT++36gTSlBGxA/5dut82jJQ2jxN8RI8L9QFXrWi4xXnA2EqA10yjHiR6H9cj6MFiOnb5In1eWsRMUM2v3e9tNsCAgBukPHAg1lQh07rvFKm/Bz9BCjaxorALINUfZ9DD64j2igLIxle2DPxW8dI/F2loHMjXZjqG8RkqZUdoxtID5+90FgsGIfkMpqgRS05f4zPbCEHqCXl1eO5HyELTgcVlLXXQDgAWnRzut1hFJeczY1tjQQno6f6s+nMydLN26WuU4s3UYvOuOsUxRlJu7TSRHqDC3lSE5XggVkzdaPkuKGQbGpny+01/47hfXXNB7HntWNZ6N2Vwp7G6OfY+YQrZwIaQmhrIqJZuigsrbe3W+gdn5ykE9+Ky0VgVUsfxo52mwFYs1JKY2PGDuWx8M6DlS6qQkvHaRUo0FMd8TsSlbF0/v965qGFKhSDeQoMpYnwcmQilRh/0ayLThlHLN81gSkJjVrPI0Y8xCVPB4twb1PFUd2fPM3sA1tJ83sZ5v8vgFv2yofKRPB0t6JzUA81mSqM3kxl5e+IZwhYAyO0OTg3/fs8HqGTNKd9BqoUwSRBzp06JMg5brUCGwbCUDI0mxadJ3Bz4WxR6fyNpBK2yAinWEsikxqEt\u0022\n+\t}, {\n+\t\u0022amazon_root_ca_1\u0022: \u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\u0022\n+\t}, {\n+\t\t\u0022digicert_global_root_g2\u0022: \u0022MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTflMrY\u003d\u0022\n+\t}, {\n+\t\t\u0022digicert_global_ca_g2\u0022: \u0022MIIEizCCA3OgAwIBAgIQDI7gyQ1qiRWIBAYe4kH5rzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0yODA4MDExMjAwMDBaMEQxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxHjAcBgNVBAMTFURpZ2lDZXJ0IEdsb2JhbCBDQSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNIfL7zBYZdW9UvhU5L4IatFaxhz1uvPmoKR/uadpFgC4przc/cV35gmAvkVNlW7SHMArZagV+Xau4CLyMnuG3UsOcGAngLH1ypmTb+u6wbBfpXzYEQQGfWMItYNdSWYb7QjHqXnxr5IuYUL6nG6AEfq/gmD6yOTSwyOR2Bm40cZbIc22GoiS9g5+vCShjEbyrpEJIJ7RfRACvmfe8EiRROM6GyD5eHn7OgzS+8LOy4g2gxPR/VSpAQGQuBldYpdlH5NnbQtwl6OErXb4y/E3w57bqukPyV93t4CTZedJMeJfD/1K2uaGvG/w/VNfFVbkhJ+Pi474j48V4Rd6rfArMCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwHQYDVR0OBBYEFCRuKy3QapJRUSVpAaqaR6aJ50AgMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA0GCSqGSIb3DQEBCwUAA4IBAQALOYSR+ZfrqoGvhOlaOJL84mxZvzbIRacxAxHhBsCsMsdaVSnaT0AC9aHesO3ewPj2dZ12uYf+QYB6z13jAMZbAuabeGLJ3LhimnftiQjXS8X9Q9ViIyfEBFltcT8jW+rZ8uckJ2/0lYDblizkVIvP6hnZf1WZUXoOLRg9eFhSvGNoVwvdRLNXSmDmyHBwW4coatc7TlJFGa8kBpJIERqLrqwYElesA8u49L3KJg6nwd3jM+/AVTANlVlOnAM2BvjAjxSZnE0qnsHhfTuvcqdFuhOWKU4Z0BqYBvQ3lBetoxi6PrABDJXWKTUgNX31EGDk92hiHuwZ4STyhxGs6QiA\u0022\n+\t}, {\n+\t\t\u0022starfield_services_root_ca\u0022: \u0022MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkdiEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\u0022\n+\t}, {\n+\t\t\u0022starfield_class_2_ca\u0022: \u0022MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJlxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q\u003d\u0022\n+\t}],\n+\t\u0022trust_stores\u0022: [{\n+\t\t\u0022name\u0022: \u0022le_via_isrg\u0022,\n+\t\t\u0022stack\u0022: [\u0022isrg_root_x1\u0022, \u0022LEX3_isrg_root_x1\u0022]\n+\t}, {\n+\t\t\u0022name\u0022: \u0022api_amazon_com\u0022,\n+\t\t\u0022stack\u0022: [\u0022digicert_global_ca_g2\u0022, \u0022digicert_global_root_g2\u0022]\n+\t}, {\n+\t\t\u0022name\u0022: \u0022avs_via_starfield\u0022,\n+\t\t\u0022stack\u0022: [\u0022starfield_class_2_ca\u0022, \u0022starfield_services_root_ca\u0022]\n+\t}, {\n+\t\t\u0022name\u0022: \u0022mqtt_amz_iot\u0022,\n+\t\t\u0022stack\u0022: [\u0022amazon_root_ca_1\u0022, \u0022starfield_class_2_ca\u0022, \u0022starfield_services_root_ca\u0022]\n+\t}],\n+\t\u0022s\u0022: [{\n+\t\t\u0022api_amazon_com_auth\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022api.amazon.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022POST\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022auth/o2/token\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022h2q_oflow_txcr\u0022: true,\n+\t\t\t\u0022http_www_form_urlencoded\u0022: true,\n+\t\t\t\u0022http_no_content_length\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022api_amazon_com\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022avs_event\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022v20160207/directives\u0022,\n+\t\t\t\u0022h2q_oflow_txcr\u0022: true,\n+\t\t\t\u0022http_auth_header\u0022: \u0022authorization:\u0022,\n+\t\t\t\u0022http_auth_preamble\u0022: \u0022Bearer \u0022,\n+\t\t\t\u0022http_no_content_length\u0022: true,\n+\t\t\t\u0022nailed_up\u0022: true,\n+\t\t\t\u0022long_poll\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022avs_via_starfield\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022avs_metadata\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022POST\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022v20160207/events\u0022,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022h2q_oflow_txcr\u0022: true,\n+\t\t\t\u0022http_auth_header\u0022: \u0022authorization:\u0022,\n+\t\t\t\u0022http_auth_preamble\u0022: \u0022Bearer \u0022,\n+\t\t\t\u0022http_multipart_name\u0022: \u0022metadata\u0022,\n+\t\t\t\u0022http_mime_content_type\u0022: \u0022application/json; charset\u003dUTF-8\u0022,\n+\t\t\t\u0022http_no_content_length\u0022: true,\n+\t\t\t\u0022rideshare\u0022: \u0022avs_audio\u0022,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022avs_via_starfield\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022avs_audio\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022alexa.na.gateway.devices.a2z.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022POST\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022v20160207/events\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022h2q_oflow_txcr\u0022: true,\n+\t\t\t\u0022http_auth_header\u0022: \u0022authorization:\u0022,\n+\t\t\t\u0022http_auth_preamble\u0022: \u0022Bearer \u0022,\n+\t\t\t\u0022http_multipart_name\u0022: \u0022audio\u0022,\n+\t\t\t\u0022http_mime_content_type\u0022: \u0022application/octet-stream\u0022,\n+\t\t\t\u0022http_no_content_length\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022avs_via_starfield\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022mintest\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022index.html?uptag\u003d${uptag}\u0022,\n+\t\t\t\u0022http_dsn_header\u0022: \u0022x-dsn:\u0022,\n+\t\t\t\u0022http_fwv_header\u0022: \u0022x-fw-version:\u0022,\n+\t\t\t\u0022http_devtype_header\u0022: \u0022x-devtype:\u0022,\n+\t\t\t\u0022metadata\u0022: [{\n+\t\t\t\t\u0022uptag\u0022: \u0022X-Upload-Tag:\u0022\n+\t\t\t}, {\n+\t\t\t\t\u0022ctype\u0022: \u0022Content-Type:\u0022\n+\t\t\t}, {\n+\t\t\t\t\u0022xctype\u0022: \u0022X-Content-Type:\u0022\n+\t\t\t}],\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_isrg\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022h2longpolltest\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022index.html\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022nailed_up\u0022: true,\n+\t\t\t\u0022long_poll\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_isrg\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022mintest-fail\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\u0022port\u0022: 22,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022index.html\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_isrg\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022minpost\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\u0022port\u0022: 443,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022POST\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022testserver/formtest\u0022,\n+\t\t\t\u0022plugins\u0022: [],\n+\t\t\t\u0022tls\u0022: true,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_isrg\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022mqtt_test\u0022: {\n+\t\t\t\u0022endpoint\u0022:\t\t\u0022a1ygonr3im5cv2-ats.iot.us-west-2.amazonaws.com\u0022,\n+\t\t\t\u0022port\u0022:\t\t\t443,\n+\t\t\t\u0022tls\u0022:\t\t\ttrue,\n+\t\t\t\u0022client_cert\u0022:\t\t0,\n+\t\t\t\u0022tls_trust_store\u0022:\t\u0022mqtt_amz_iot\u0022,\n+\t\t\t\u0022protocol\u0022:\t\t\u0022mqtt\u0022,\n+\t\t\t\u0022mqtt_topic\u0022:\t\t\u0022test/topic0\u0022,\n+\t\t\t\u0022mqtt_subscribe\u0022:\t\u0022test/topic0\u0022,\n+\t\t\t\u0022mqtt_qos\u0022:\t\t0,\n+\t\t\t\u0022retry\u0022:\t\t\u0022default\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022mqtt_test1\u0022: {\n+\t\t\t\u0022endpoint\u0022:\t\t\u0022a1ygonr3im5cv2-ats.iot.us-west-2.amazonaws.com\u0022,\n+\t\t\t\u0022port\u0022:\t\t\t443,\n+\t\t\t\u0022tls\u0022:\t\t\ttrue,\n+\t\t\t\u0022client_cert\u0022:\t\t0,\n+\t\t\t\u0022tls_trust_store\u0022:\t\u0022mqtt_amz_iot\u0022,\n+\t\t\t\u0022protocol\u0022:\t\t\u0022mqtt\u0022,\n+\t\t\t\u0022mqtt_topic\u0022:\t\t\u0022test/topic1\u0022,\n+\t\t\t\u0022mqtt_subscribe\u0022:\t\u0022test/topic1\u0022,\n+\t\t\t\u0022mqtt_qos\u0022:\t\t1,\n+\t\t\t\u0022retry\u0022:\t\t\u0022default\u0022\n+\t\t}\n+\t}, {\n+\t\t\u0022captive_portal_detect\u0022: {\n+\t\t\t\u0022endpoint\u0022: \u0022connectivitycheck.android.com\u0022,\n+\t\t\t\u0022port\u0022: 80,\n+\t\t\t\u0022protocol\u0022: \u0022h1\u0022,\n+\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\u0022http_url\u0022: \u0022generate_204\u0022,\n+\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\u0022http_expect\u0022: 204,\n+\t\t\t\u0022http_fail_redirect\u0022: true\n+\t\t}\n+\t}\n+\t]\n+}\n+\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/CMakeLists.txt\nnew file mode 100644\nindex 0000000..17e76e3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/CMakeLists.txt\n@@ -0,0 +1,136 @@\n+project(lws-minimal-secure-streams-stress C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-stress)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (NOT WIN32)\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams.c)\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\n+\t\t#\n+\t\t# When running in CI, wait for a lease on the resources\n+\t\t# before starting this test, so the server does not get\n+\t\t# thousands of simultaneous tls connection attempts\n+\t\t#\n+\t\t# sai-resource holds the lease on the resources until\n+\t\t# the time given in seconds or the sai-resource instance\n+\t\t# exits, whichever happens first\n+\t\t#\n+\t\t# If running under Sai, creates a lock test called \u0022res_sspcmin-stress\u0022\n+\t\t#\n+\n+\t\tsai_resource(warmcat_conns 1 40 sspcmin-stress)\n+\n+\t\t#\n+\t\t# simple test not via proxy\n+\t\t#\n+\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME ssstress-warmcat COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-stress\u003e -c 4 --budget 5 --timeout_ms 60000)\n+\t\telse()\n+\t\t\tadd_test(NAME ssstress-warmcat COMMAND lws-minimal-secure-streams-stress -c 4 --budget 5 --timeout_ms 50000)\n+\t\tendif()\n+\n+\t\tset_tests_properties(ssstress-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress\n+\t\t\t\t TIMEOUT 80)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(ssstress-warmcat PROPERTIES FIXTURES_REQUIRED \u0022res_sspcmin\u0022)\n+\t\tendif()\n+\n+\t\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-sspstress-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-sspstress-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_ssstressproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tssstressproxy\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_ssstressproxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssstressproxy TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_ssstressproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tssstressproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_ssstressproxy PROPERTIES FIXTURES_CLEANUP ssstressproxy)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t#\tif (VALGRIND)\n+\t\t#\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t#\t\tadd_test(NAME sspc-minimalstress COMMAND\n+\t\t#\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t#\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-stress-client\u003e -i +${CTEST_SOCKET_PATH} -c 2 --budget 3 --timeout_ms 60000)\n+\t\t#\telse()\n+\t\t\t\tadd_test(NAME sspc-minimalstress COMMAND lws-minimal-secure-streams-stress-client -i +${CTEST_SOCKET_PATH} -c 2 --budget 3 --timeout_ms 50000)\n+\t\t#\tendif()\n+\n+\t\t\tset(fixlist \u0022ssstressproxy\u0022)\n+\t\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\t\tlist(APPEND fixlist \u0022res_sspcmin-stress\u0022)\n+\t\t\tendif()\n+\n+\t\t\tset_tests_properties(sspc-minimalstress PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress\n+\t\t\t\tFIXTURES_REQUIRED \u0022${fixlist}\u0022\n+\t\t\t\tTIMEOUT 100)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client minimal-secure-streams.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/README.md\nnew file mode 100644\nindex 0000000..2b24f0f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/README.md\n@@ -0,0 +1,22 @@\n+# lws minimal secure streams stress\n+\n+This is the same as minimal-secure-streams, except you can have it perform concurrent\n+SS connections and a budget of sequential connections.\n+\n+It basically forks as many times as `-c \u003cconcurrent\u003e` and each fork does `--budget \u003ccount\u003e`\n+SS connections one after the other.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15|\n+-c \u003cconcurrent\u003e|Fork this many times on init|\n+--budget \u003ccount\u003e|Each fork sequentially does this many SS connections (default 1)|\n+--pass-limit \u003ccount\u003e|By default the pass limit is the budget, but if doing fault injection you can set a lower limit here|\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..ad5713a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/minimal-secure-streams.c\n@@ -0,0 +1,756 @@\n+/*\n+ * lws-minimal-secure-streams\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams api.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there.\n+ *\n+ * This example is built two different ways from the same source... one includes\n+ * the policy everything needed to fulfil the stream directly. The other -client\n+ * variant has no policy itself and some other minor init changes, and connects\n+ * to the -proxy example to actually get the connection done.\n+ *\n+ * In the -client build case, the example does not even init the tls libraries\n+ * since the proxy part will take care of all that.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+// #define FORCE_OS_TRUST_STORE\n+\n+/*\n+ * uncomment to force network traffic through 127.0.0.1:1080\n+ *\n+ * On your local machine, you can run a SOCKS5 proxy like this\n+ *\n+ * $ ssh -N -D 0.0.0.0:1080 localhost -v\n+ *\n+ * If enabled, this also fetches a remote policy that also\n+ * specifies that all traffic should go through the remote\n+ * proxy.\n+ */\n+// #define VIA_LOCALHOST_SOCKS\n+\n+static int interrupted, bad \u003d 1, force_cpd_fail_portal,\n+\t force_cpd_fail_no_internet, test_respmap, test_ots,\n+\t budget \u003d 1, predicted_good \u003d 1, good, orig_budget;\n+static unsigned int timeout_ms \u003d 8000;\n+static lws_state_notify_link_t nl;\n+struct lws_context *context;\n+static lws_sorted_usec_list_t sul_timeout; /* for each process to complete */\n+\n+/*\n+ * If the -proxy app is fulfilling our connection, then we don't need to have\n+ * the policy in the client.\n+ *\n+ * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over\n+ * a Unix Domain Socket. To test that, you need to separately run the\n+ * ./lws-minimal-secure-streams-proxy test app on the same machine.\n+ */\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t \t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\t\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\t\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\t\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\t\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\t\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\t\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\t\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\t\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\t\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\t\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\t\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\t\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\t\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\t\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\t\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\t\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\t\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\t\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\t\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\t\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\t\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\t\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\t\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\t\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\t\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\t\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\t\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\t\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+#endif\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+#endif\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+#if !defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\t\t/*\n+\t\t * \u0022fetch_policy\u0022 decides from where the real policy\n+\t\t * will be fetched, if present. Otherwise the initial\n+\t\t * policy is treated as the whole, hardcoded, policy.\n+\t\t */\n+\t\t\u0022{\u005c\u0022fetch_policy\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-socks.json\u005c\u0022,\u0022\n+#else\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-v4.2-v2.json\u005c\u0022,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022\u0022\n+#else\n+\t\u0022{\u005c\u0022mintest\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022index.html?uptag\u003d${uptag}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [{\u0022\n+\t\t\t\u0022\t\u005c\u0022uptag\u005c\u0022: \u005c\u0022X-Upload-Tag:\u005c\u0022\u0022\n+\t\t\t\u0022}, {\u0022\n+\t\t\t\u0022\t\u005c\u0022xctype\u005c\u0022: \u005c\u0022X-Content-Type:\u005c\u0022\u0022\n+\t\t\t\u0022}],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022timeout_ms\u005c\u0022: 2000,\u0022\n+\t\t\t\u0022\u005c\u0022direct_proto_str\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022\u0022\n+#endif\n+\t\t\u0022}},{\u0022\n+\t\t\t/*\n+\t\t\t * \u0022captive_portal_detect\u0022 describes\n+\t\t\t * what to do in order to check if the path to\n+\t\t\t * the Internet is being interrupted by a\n+\t\t\t * captive portal. If there's a larger policy\n+\t\t\t * fetched from elsewhere, it should also include\n+\t\t\t * this since it needs to be done at least after\n+\t\t\t * every DHCP acquisition\n+\t\t\t */\n+\t\t \u0022\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+ \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+ \u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+ \u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+ \u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+ \u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+ \u0022}}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tsize_t\t\t\t\tamt;\n+\n+\tstruct lws_genhash_ctx\t\thash_ctx;\n+} myss_t;\n+\n+static int\n+create_ss(struct lws_context *cx);\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+#endif\n+\n+static void\n+process_timeout(lws_sorted_usec_list_t *sul)\n+{\n+\tlwsl_err(\u0022%s: process timed out\u005cn\u0022, __func__);\n+\n+\texit(1);\n+}\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\n+\tif (flags \u0026 LWSSS_FLAG_PERF_JSON)\n+\t\treturn LWSSSSRET_OK;\n+\n+#if !defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tconst char *md_srv \u003d \u0022not set\u0022, *md_test \u003d \u0022not set\u0022;\n+\tsize_t md_srv_len \u003d 7, md_test_len \u003d 7;\n+\n+\tlws_ss_get_metadata(m-\u003ess, \u0022srv\u0022, (const void **)\u0026md_srv, \u0026md_srv_len);\n+\tlws_ss_get_metadata(m-\u003ess, \u0022test\u0022, (const void **)\u0026md_test, \u0026md_test_len);\n+\tlwsl_ss_user(m-\u003ess, \u0022len %d, flags: %d, srv: %.*s, test: %.*s\u0022,\n+\t\t (int)len, flags, (int)md_srv_len, md_srv,\n+\t\t (int)md_test_len, md_test);\n+\n+\tlwsl_hexdump_ss_info(m-\u003ess, buf, len);\n+#endif\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t//myss_t *m \u003d (myss_t *)userobj;\n+\n+\t/* in this example, we don't send stuff */\n+\n+\treturn LWSSSSRET_TX_DONT_SEND;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+#if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\tconst char *md_test \u003d \u0022not set\u0022;\n+\tsize_t md_test_len \u003d 7;\n+\tint i;\n+\tstatic const char * imd_test_keys[8] \u003d {\n+\t\t\u0022server:\u0022,\n+\t\t\u0022content-security-policy:\u0022,\n+\t\t\u0022strict-transport-security:\u0022,\n+\t\t\u0022test-custom-header:\u0022,\n+\t\t\u0022x-xss-protection:\u0022,\n+\t\t\u0022x-content-type-options:\u0022,\n+\t\t\u0022x-frame-options:\u0022,\n+\t\t\u0022x-non-exist:\u0022,\n+\t\t};\n+#endif\n+\n+\tlwsl_ss_user(m-\u003ess, \u0022%s (%d), ord 0x%x\u0022,\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_CONNECTING:\n+\t\tlws_ss_start_timeout(m-\u003ess, timeout_ms);\n+\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022uptag\u0022, \u0022myuptag123\u0022, 10))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+#if !defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022, \u0022myctype\u0022, 7))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+#else\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022X-Test-Type1:\u0022, \u0022myctype1\u0022, 8))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022X-Test-Type2:\u0022, \u0022myctype2\u0022, 8))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022Content-Type:\u0022, \u0022myctype\u0022, 7))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+#endif\n+\t\tbreak;\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 2;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_CONNECTED:\n+#if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\tlwsl_cx_user(context, \u0022get direct metadata\u0022);\n+\tfor (i \u003d 0; i \u003c 8; i++) {\n+\t\tmd_test \u003d \u0022not set\u0022;\n+\t\tlws_ss_get_metadata(m-\u003ess, imd_test_keys[i],\n+\t\t\t\t (const void **)\u0026md_test, \u0026md_test_len);\n+\t\tlwsl_ss_user(m-\u003ess, \u0022 test key:[%s], got [%s]\u0022,\n+\t\t\t\t imd_test_keys[i], md_test);\n+\t}\n+#endif\n+\t\tbreak;\n+\n+\tcase LWSSSCS_QOS_ACK_REMOTE: /* transaction assertively succeeded */\n+\t\tlwsl_ss_notice(m-\u003ess, \u0022LWSSSCS_QOS_ACK_REMOTE\u0022);\n+\t\tgood++;\n+\t\tbreak; /* disconnected will move us on */\n+\n+\tcase LWSSSCS_QOS_NACK_REMOTE: /* transaction assertively failed */\n+\t\tlwsl_ss_notice(m-\u003ess, \u0022LWSSSCS_QOS_NACK_REMOTE\u0022);\n+\t\tbreak; /* disconnected will move us on */\n+\n+\tcase LWSSSCS_DISCONNECTED: /* attempt is over */\n+\t\tif (budget)\n+\t\t\tcreate_ss(context);\n+\t\telse\n+\t\t\tinterrupted \u003d 1;\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\tcase LWSSSCS_TIMEOUT:\n+\t\tlwsl_ss_notice(m-\u003ess, \u0022LWSSSCS_TIMEOUT\u0022);\n+\t\tbad \u003d 3;\n+\t\tif (budget)\n+\t\t\tcreate_ss(context);\n+\t\telse\n+\t\t\tinterrupted \u003d 1;\n+\t\treturn LWSSSSRET_DESTROY_ME;\n+\n+\tcase LWSSSCS_USER_BASE:\n+\t\tlwsl_ss_notice(m-\u003ess, \u0022LWSSSCS_USER_BASE\u0022);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+#if defined(LWS_WITH_SECURE_STREAMS_BUFFER_DUMP)\n+static void\n+myss_headers_dump(void *userobj, const uint8_t *buf, size_t len, int done)\n+{\n+\tlwsl_cx_user(context, \u0022%lu done: %s\u0022, len, done ? \u0022true\u0022 : \u0022false\u0022);\n+\n+\tlwsl_hexdump_err(buf, len);\n+}\n+#endif\n+\n+static int\n+create_ss(struct lws_context *cx)\n+{\n+\tlws_ss_info_t ssi;\n+\n+\tbudget--;\n+\tlwsl_cx_notice(cx, \u0022starting\u0022);\n+\n+\t/* We're making an outgoing secure stream ourselves */\n+\n+\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\tssi.opaque_user_data_offset \u003d offsetof(myss_t, opaque_data);\n+\tssi.rx \u003d myss_rx;\n+\tssi.tx \u003d myss_tx;\n+\tssi.state \u003d myss_state;\n+#if defined(LWS_WITH_SECURE_STREAMS_BUFFER_DUMP)\n+\tssi.dump \u003d myss_headers_dump;\n+#endif\n+\tssi.user_alloc \u003d sizeof(myss_t);\n+\tssi.streamtype \u003d test_ots ? \u0022mintest-ots\u0022 :\n+\t\t\t (test_respmap ? \u0022respmap\u0022 : \u0022mintest\u0022);\n+\n+\tif (lws_ss_create(cx, 0, \u0026ssi, NULL, NULL, NULL, NULL)) {\n+\t\tlwsl_cx_err(context, \u0022failed to create ss\u0022);\n+\t\treturn -1;\n+\t}\n+\n+\tlwsl_cx_notice(cx, \u0022started\u0022);\n+\n+\treturn 0;\n+}\n+\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *cx \u003d lws_system_context_from_system_mgr(mgr);\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+#endif\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\t/*\n+\t * The proxy takes responsibility for this stuff if we get things\n+\t * done through that\n+\t */\n+\n+\tcase LWS_SYSTATE_INITIALIZED: /* overlay on the hardcoded policy */\n+\tcase LWS_SYSTATE_POLICY_VALID: /* overlay on the loaded policy */\n+\n+\t\tif (target !\u003d current)\n+\t\t\tbreak;\n+\n+\t\tif (force_cpd_fail_portal)\n+\n+\t\t\t/* this makes it look like we're behind a captive portal\n+\t\t\t * because the overriden address does a redirect */\n+\n+\t\t\tlws_ss_policy_overlay(context,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022: [{\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022google.com\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022port\u005c\u0022: 80\u0022\n+\t\t\t\t \u0022}}]}\u0022);\n+\n+\t\tif (force_cpd_fail_no_internet)\n+\n+\t\t\t/* this looks like no internet, because the overridden\n+\t\t\t * port doesn't have anything that will connect to us */\n+\n+\t\t\tlws_ss_policy_overlay(context,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022: [{\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t\t \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022port\u005c\u0022: 999\u0022\n+\t\t\t\t \u0022}}]}\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\n+#endif\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\t\t\tcreate_ss(cx);\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\n+static int\n+my_metric_report(lws_metric_pub_t *mp)\n+{\n+\tlws_metric_bucket_t *sub \u003d mp-\u003eu.hist.head;\n+\tchar buf[192];\n+\n+\tdo {\n+\t\tif (lws_metrics_format(mp, \u0026sub, buf, sizeof(buf)))\n+\t\t\tlwsl_cx_user(context, \u0022%s: %s\u005cn\u0022, __func__, buf);\n+\t} while ((mp-\u003eflags \u0026 LWSMTFL_REPORT_HIST) \u0026\u0026 sub);\n+\n+\t/* 0 \u003d leave metric to accumulate, 1 \u003d reset the metric */\n+\n+\treturn 1;\n+}\n+\n+static const lws_system_ops_t system_ops \u003d {\n+\t.metric_report \u003d my_metric_report,\n+};\n+\n+#endif\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static lws_log_cx_t my_log_cx \u003d {\n+\t.lll_flags\t\u003d LLLF_LOG_CONTEXT_AWARE |\n+\t\t\t LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_USER,\n+\t.refcount_cb\t\u003d lws_log_use_cx_file,\n+\t.u.emit_cx \t\u003d lws_log_emit_cx_file,\n+};\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tint n \u003d 0, expected \u003d 0, concurrent \u003d 1;\n+\tchar cxname[16], logpath[128];\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022)))\n+\t\tconcurrent \u003d atoi(p);\n+\n+\tif (concurrent \u003c 0 || concurrent \u003e 100)\n+\t\treturn 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tmy_log_cx.lll_flags \u003d (uint32_t)(LLLF_LOG_CONTEXT_AWARE | atoi(p));\n+\n+\tlws_strncpy(cxname, \u0022ctx0\u0022, sizeof(cxname));\n+\n+\tfor (n \u003d 0; n \u003c concurrent - 1; n++) {\n+\t\tif (fork()) {\n+#if defined(WIN32)\n+\t\t\tSleep(1);\n+#else\n+\t\t\tusleep(1000);\n+#endif\n+\t\t\tlws_snprintf(cxname, sizeof(cxname), \u0022ctx%d\u0022, n + 1);\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\t/*\n+\t * Arrange that each process's context logs to a different file\n+\t */\n+\n+\tinfo.log_cx \u003d \u0026my_log_cx;\n+\tinfo.vhost_name \u003d cxname;\n+\tlws_snprintf(logpath, sizeof(logpath), \u0022/tmp/%s.log\u0022, cxname);\n+\tmy_log_cx.opaque \u003d (void *)logpath;\n+\n+\tlwsl_user(\u0022LWS secure streams test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\t/* these options are mutually exclusive if given */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-portal\u0022))\n+\t\tforce_cpd_fail_portal \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-no-internet\u0022))\n+\t\tforce_cpd_fail_no_internet \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--respmap\u0022))\n+\t\ttest_respmap \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--ots\u0022))\n+\t\t/*\n+\t\t * Use a streamtype that relies on the OS trust store for\n+\t\t * validation\n+\t\t */\n+\t\ttest_ots \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--timeout_ms\u0022)))\n+\t\ttimeout_ms \u003d (unsigned int)atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--budget\u0022)))\n+\t\tbudget \u003d atoi(p);\n+\n+\tpredicted_good \u003d budget;\n+\torig_budget \u003d budget;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--pass-limit\u0022)))\n+\t\tpredicted_good \u003d atoi(p);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 26 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+#if defined(LWS_WITH_MBEDTLS)\n+\n+\t/* uncomment to force mbedtls to load a system trust store like\n+\t * openssl does\n+\t *\n+\t * info.mbedtls_client_preload_filepath \u003d\n+\t *\t\t\u0022/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem\u0022;\n+\t */\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\tinfo.system_ops \u003d \u0026system_ops;\n+\tinfo.metrics_prefix \u003d \u0022ssmex\u0022;\n+#endif\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+\t/* timeout for each forked process */\n+\n+\tlws_sul_schedule(context, 0, \u0026sul_timeout, process_timeout,\n+\t\t\t (lws_usec_t)((lws_usec_t)budget *\n+\t\t\t\t (lws_usec_t)timeout_ms * LWS_US_PER_MS));\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\t/*\n+\t * If we're being a proxied client, the proxy does all this\n+\t */\n+\n+\t/*\n+\t * Set the related lws_system blobs\n+\t *\n+\t * ...direct_set() sets a pointer, so the thing pointed to has to have\n+\t * a suitable lifetime, eg, something that already exists on the heap or\n+\t * a const string in .rodata like this\n+\t */\n+\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_SERIAL, 0),\n+\t\t\t\t (const uint8_t *)\u0022SN12345678\u0022, 10);\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_FW_VERSION, 0),\n+\t\t\t\t (const uint8_t *)\u0022v0.01\u0022, 5);\n+\n+\t/*\n+\t * ..._heap_append() appends to a buflist kind of arrangement on heap,\n+\t * just one block is fine, otherwise it will concatenate the fragments\n+\t * in the order they were appended (and take care of freeing them at\n+\t * context destroy time). ..._heap_empty() is also available to remove\n+\t * everything that was already allocated.\n+\t *\n+\t * Here we use _heap_append() just so it's tested as well as direct set.\n+\t */\n+\n+\tlws_system_blob_heap_append(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_TYPE, 0),\n+\t\t\t\t (const uint8_t *)\u0022spacerocket\u0022, 11);\n+#endif\n+\n+\t/* the event loop */\n+\n+\tn \u003d 0;\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_sul_cancel(\u0026sul_timeout);\n+\tlws_context_destroy(context);\n+\n+bail:\n+\tlwsl_user(\u0022 good: %d / %d budget, pass limit %d\u005cn\u0022, good, orig_budget,\n+\t\t\tpredicted_good);\n+\tif (good \u003c predicted_good)\n+\t\tbad \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n+\t\texpected \u003d atoi(p);\n+\n+\tif (bad \u003d\u003d expected) {\n+\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, expected);\n+\t\treturn 0;\n+\t} else\n+\t\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, bad, expected);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt\nnew file mode 100644\nindex 0000000..ae2f2c8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt\n@@ -0,0 +1,104 @@\n+project(lws-minimal-secure-streams-testsfail C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams-testsfail)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams-testsfail.c)\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\tif (VALGRIND)\n+\t\t\tadd_test(NAME ss-tf COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-testsfail\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME ss-tf COMMAND lws-minimal-secure-streams-testsfail)\n+\t\tendif()\n+\n+\t\tset_tests_properties(ss-tf\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail\n+\t\t\t\t TIMEOUT 440)\n+\n+\t\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-ssptf-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-ssptf-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_sstfproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tsstfproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\t\tset_tests_properties(st_sstfproxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP sstfproxy TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_sstfproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tsstfproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_sstfproxy PROPERTIES FIXTURES_CLEANUP sstfproxy)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tadd_test(NAME sspc-minimaltf COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-testsfail-client\u003e -i +${CTEST_SOCKET_PATH} -d1039)\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME sspc-minimaltf COMMAND lws-minimal-secure-streams-testsfail-client -i +${CTEST_SOCKET_PATH} -d1039)\n+\t\t\tendif()\n+\t\t\n+\t\t\tset_tests_properties(sspc-minimaltf PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail\n+\t\t\t\tFIXTURES_REQUIRED \u0022sstfproxy\u0022\n+\t\t\t\tTIMEOUT 440)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client minimal-secure-streams-testsfail.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/README.md\nnew file mode 100644\nindex 0000000..70a1b0f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/README.md\n@@ -0,0 +1,17 @@\n+# lws minimal secure streams\n+\n+The application runs some bulk and failure path tests on Secure Streams\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+--amount \u003camount\u003e| Set the amount of bulk data expected, eg, --amount 23456\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/minimal-secure-streams-testsfail.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/minimal-secure-streams-testsfail.c\nnew file mode 100644\nindex 0000000..7a09523\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/minimal-secure-streams-testsfail.c\n@@ -0,0 +1,890 @@\n+/*\n+ * lws-minimal-secure-streams\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates various kinds of successful and failed connection\n+ * situations in order to confirm the correct states are coming.\n+ *\n+ * You can control how much bulk data is requested from the peer using\n+ * --amount xxx, the default without that is 12345 bytes.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, tests, tests_pass, tests_fail;\n+static lws_sorted_usec_list_t sul_next_test;\n+static lws_state_notify_link_t nl;\n+struct lws_context *context;\n+size_t amount \u003d 12345;\n+\n+static void\n+tests_start_next(lws_sorted_usec_list_t *sul);\n+\n+/*\n+ * If the -proxy app is fulfilling our connection, then we don't need to have\n+ * the policy in the client.\n+ *\n+ * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over\n+ * a Unix Domain Socket. To test that, you need to separately run the\n+ * ./lws-minimal-secure-streams-proxy test app on the same machine.\n+ */\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\t 1000, 1000, 1000, 1000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00224,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+\t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\t\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\t\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\t\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\t\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\t\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\t\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\t\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\t\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\t\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\t\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\t\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\t\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\t\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\t\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\t\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\t\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\t\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\t\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\t\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\t\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\t\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\t\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\t\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\t\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\t\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\t\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\t\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\t\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t \u0022\u005c\u0022},{\u0022\n+\t\u0022\u005c\u0022digicert_global_root_g2\u005c\u0022: \u005c\u0022MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7K\u0022\n+\t\u0022GSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMR\u0022\n+\t\u0022GlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDE\u0022\n+\t\u0022xdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxM\u0022\n+\t\u0022TUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxG\u0022\n+\t\u0022TAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb\u0022\n+\t\u00222JhbCBSb290IEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNN\u0022\n+\t\u0022Nx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpim\u0022\n+\t\u0022n7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kq\u0022\n+\t\u0022bitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauVB\u0022\n+\t\u0022JVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdz\u0022\n+\t\u0022XOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FD\u0022\n+\t\u0022KZJobq7nMWxM4MphQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/\u0022\n+\t\u0022wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNA\u0022\n+\t\u0022QELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQ\u0022\n+\t\u0022oQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98\u0022\n+\t\u0022kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8\u0022\n+\t\u0022PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgR\u0022\n+\t\u0022PTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3f\u0022\n+\t\u0022e0Dkhvld1927jyNxF1WW6LZZm6zNTflMrY\u003d\u005c\u0022\u0022\n+\t\u0022}, {\u0022\n+\t\t\u0022\u005c\u0022digicert_global_ca_g2\u005c\u0022: \u005c\u0022MIIEizCCA3OgAwIBAgIQDI7gyQ1\u0022\n+\t\u0022qiRWIBAYe4kH5rzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1U\u0022\n+\t\u0022EChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgY\u0022\n+\t\u0022DVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0\u0022\n+\t\u0022yODA4MDExMjAwMDBaMEQxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCB\u0022\n+\t\u0022JbmMxHjAcBgNVBAMTFURpZ2lDZXJ0IEdsb2JhbCBDQSBHMjCCASIwDQYJKoZIhvc\u0022\n+\t\u0022NAQEBBQADggEPADCCAQoCggEBANNIfL7zBYZdW9UvhU5L4IatFaxhz1uvPmoKR/u\u0022\n+\t\u0022adpFgC4przc/cV35gmAvkVNlW7SHMArZagV+Xau4CLyMnuG3UsOcGAngLH1ypmTb\u0022\n+\t\u0022+u6wbBfpXzYEQQGfWMItYNdSWYb7QjHqXnxr5IuYUL6nG6AEfq/gmD6yOTSwyOR2\u0022\n+\t\u0022Bm40cZbIc22GoiS9g5+vCShjEbyrpEJIJ7RfRACvmfe8EiRROM6GyD5eHn7OgzS+\u0022\n+\t\u00228LOy4g2gxPR/VSpAQGQuBldYpdlH5NnbQtwl6OErXb4y/E3w57bqukPyV93t4CTZ\u0022\n+\t\u0022edJMeJfD/1K2uaGvG/w/VNfFVbkhJ+Pi474j48V4Rd6rfArMCAwEAAaOCAVowggF\u0022\n+\t\u0022WMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMDQGCCsGAQUFBwE\u0022\n+\t\u0022BBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMHsGA1U\u0022\n+\t\u0022dHwR0MHIwN6A1oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEd\u0022\n+\t\u0022sb2JhbFJvb3RHMi5jcmwwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9\u0022\n+\t\u0022EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAY\u0022\n+\t\u0022IKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwHQYDVR0OBBY\u0022\n+\t\u0022EFCRuKy3QapJRUSVpAaqaR6aJ50AgMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq\u0022\n+\t\u00225Eu0GF485MA0GCSqGSIb3DQEBCwUAA4IBAQALOYSR+ZfrqoGvhOlaOJL84mxZvzb\u0022\n+\t\u0022IRacxAxHhBsCsMsdaVSnaT0AC9aHesO3ewPj2dZ12uYf+QYB6z13jAMZbAuabeGL\u0022\n+\t\u0022J3LhimnftiQjXS8X9Q9ViIyfEBFltcT8jW+rZ8uckJ2/0lYDblizkVIvP6hnZf1W\u0022\n+\t\u0022ZUXoOLRg9eFhSvGNoVwvdRLNXSmDmyHBwW4coatc7TlJFGa8kBpJIERqLrqwYEle\u0022\n+\t\u0022sA8u49L3KJg6nwd3jM+/AVTANlVlOnAM2BvjAjxSZnE0qnsHhfTuvcqdFuhOWKU4\u0022\n+\t\u0022Z0BqYBvQ3lBetoxi6PrABDJXWKTUgNX31EGDk92hiHuwZ4STyhxGs6QiA\u005c\u0022\u0022\n+\t\u0022},\u0022\n+\t\u0022{\u005c\u0022amazon_root_ca_1\u005c\u0022: \u005c\u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikP\u0022\n+\t\u0022mljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1\u0022\n+\t\u0022hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFo\u0022\n+\t\u0022XDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjE\u0022\n+\t\u0022ZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggE\u0022\n+\t\u0022PADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtO\u0022\n+\t\u0022gQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peV\u0022\n+\t\u0022KVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+Uh\u0022\n+\t\u0022nMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4c\u0022\n+\t\u0022X8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34Gf\u0022\n+\t\u0022ID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAU\u0022\n+\t\u0022wAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7I\u0022\n+\t\u0022QTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5\u0022\n+\t\u0022IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZ\u0022\n+\t\u0022ERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2\u0022\n+\t\u0022V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR\u0022\n+\t\u00221bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob\u0022\n+\t\u00222xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\u005c\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022api_amazon_com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u005c\u0022digicert_global_ca_g2\u005c\u0022, \u005c\u0022digicert_global_root_g2\u005c\u0022]\u0022\n+\t\t\u0022}, { \u005c\u0022name\u005c\u0022: \u005c\u0022arca1\u005c\u0022, \u005c\u0022stack\u005c\u0022: [\u005c\u0022amazon_root_ca_1\u005c\u0022]},\u0022\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\n+\t\t\u0022{\u005c\u0022api_amazon_com_auth\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022api.amazon.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022POST\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022auth/o2/token\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022plugins\u005c\u0022: [],\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022http_www_form_urlencoded\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022http_no_content_length\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022api_amazon_com\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\n+\t\t/*\n+\t\t * Just get a 200 from httpbin.org\n+\t\t * on h1:80, h1:443 and h2:443\n+\t\t *\n+\t\t * sanity check that we're working at all\n+\t\t */\n+\n+\t\t \u0022\u005c\u0022t_h1\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/status/200\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022t_h1_tls\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/status/200\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022t_h2_tls\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/status/200\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022nghttp2_quirk_end_stream\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\n+\t\t/*\n+\t\t * 10s delayed response from httpbin.org\n+\t\t * on h1:80, h1:443 and h2:443\n+\t\t *\n+\t\t * used to trigger timeout testing\n+\t\t */\n+\n+\t\t \u0022\u005c\u0022d_h1\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/delay/10\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022d_h1_tls\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/delay/10\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022d_h2_tls\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/delay/10\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022nghttp2_quirk_end_stream\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\n+\t\t/*\n+\t\t * get NXDOMAIN for bogus.nope\n+\t\t * on h1:80, h1:443 and h2:443\n+\t\t *\n+\t\t * Triggers unreachable and eventually all_retries_failed\n+\t\t */\n+\n+\t\t \u0022\u005c\u0022nxd_h1\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022bogus.nope\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/status/200\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022nxd_h1_tls\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022bogus.nope\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/status/200\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022nxd_h2_tls\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022bogus.nope\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/status/200\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022nghttp2_quirk_end_stream\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\n+\t\t/*\n+\t\t * bulk payload transfer from httpbin.org\n+\t\t * on h1:80, h1:443 and h2:443\n+\t\t *\n+\t\t * Sanity check larger payload\n+\t\t */\n+\n+\t\t \u0022\u005c\u0022bulk_h1\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022range/${amount}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [{\u0022\n+\t\t\t\t\t\u0022\u005c\u0022amount\u005c\u0022: \u005c\u0022\u005c\u0022\u0022\n+\t\t\t\t\u0022}],\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022bulk_h1_tls\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022range/${amount}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [{\u0022\n+\t\t\t\t\t\u0022\u005c\u0022amount\u005c\u0022: \u005c\u0022\u005c\u0022\u0022\n+\t\t\t\t\u0022}],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022arca1\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022bulk_h2_tls\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022httpbin.org\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h2\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022range/${amount}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [{\u0022\n+\t\t\t\t\t\u0022\u005c\u0022amount\u005c\u0022: \u005c\u0022\u005c\u0022\u0022\n+\t\t\t\t\u0022}],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022nghttp2_quirk_end_stream\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022arca1\u005c\u0022\u0022\n+\n+\t\t\u0022}},{\u0022\n+\n+\t\t/*\n+\t\t * Various kinds of tls failure\n+\t\t *\n+\t\t * hostname.badcert.warmcat.com: serves valid cert but for\n+\t\t *\t\t\t\t warmcat.com\n+\t\t *\n+\t\t * warmcat.com:446: serves valid but expired cert\n+\t\t *\n+\t\t * I don't have an easy way to make the test for \u0022not valid yet\u0022\n+\t\t * cert without root\n+\t\t *\n+\t\t * invalidca.badcert.warmcat.com: selfsigned cert for that\n+\t\t *\t\t\t\t hostname\n+\t\t */\n+\n+\t\t \u0022\u005c\u0022badcert_hostname\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022hostname.badcert.warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022badcert_expired\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 446,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022\u0022\n+\t\t\u0022}},{\u0022\n+\t\t \u0022\u005c\u0022badcert_selfsigned\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022invalidca.badcert.warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022nghttp2_quirk_end_stream\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022h2q_oflow_txcr\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022\u0022\n+ \u0022}}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+#endif\n+\n+/*\n+ * This is the sequence of test streams we are going to create, the ss timeout,\n+ * and a description of what we want to see to understand the test passed, or\n+ * failed. If the test hits destruction without making a explicit pass or fail\n+ * decision before, that's a fail. Or, depending on what state we put in\n+ * .must_see, we can count a state like UNREACHABLE as a pass.\n+ */\n+\n+struct tests_seq {\n+\tconst char\t\t*name;\n+\tconst char\t\t*streamtype;\n+\tuint64_t\t\ttimeout_us;\n+\tlws_ss_constate_t\tmust_see;\n+\tunsigned int\t\tmask_unexpected;\n+\tsize_t\t\t\teom_pass;\n+} tests_seq[] \u003d {\n+\n+\t/*\n+\t * We just get a 200 from httpbin.org as a sanity check first\n+\t */\n+\n+\t{\n+\t\t\u0022h1:80 just get 200\u0022,\n+\t\t\u0022t_h1\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE,\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t\t\t\t (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h1:443 just get 200\u0022,\n+\t\t\u0022t_h1_tls\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE,\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t\t\t\t (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h2:443 just get 200\u0022,\n+\t\t\u0022t_h2_tls\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE,\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t\t\t\t (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\n+\t/*\n+\t * We arranged that the server will delay 10s before sending the\n+\t * response, but set our ss timeout for 5s. So we expect to see\n+\t * our timeout and not an ACK / 200.\n+\t */\n+\n+\t{\n+\t\t\u0022h1:80 timeout after connection\u0022,\n+\t\t\u0022d_h1\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_TIMEOUT,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t\t\t\t (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h1:443 timeout after connection\u0022,\n+\t\t\u0022d_h1_tls\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_TIMEOUT,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t\t\t\t (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h2:443 timeout after connection\u0022,\n+\t\t\u0022d_h2_tls\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_TIMEOUT,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t\t\t\t (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\n+\t/*\n+\t * We are talking to a nonexistant dns address \u0022bogus.nope\u0022. We expect\n+\t * in each case to hear that is unreachable, before any ss timeout.\n+\t */\n+\n+\t{\n+\t\t\u0022h1:80 NXDOMAIN\u0022,\n+\t\t\u0022nxd_h1\u0022, 65 * LWS_US_PER_SEC, LWSSSCS_UNREACHABLE,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h1:443 NXDOMAIN\u0022,\n+\t\t\u0022nxd_h1_tls\u0022, 35 * LWS_US_PER_SEC, LWSSSCS_UNREACHABLE,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h2:443 NXDOMAIN\u0022,\n+\t\t\u0022nxd_h2_tls\u0022, 35 * LWS_US_PER_SEC, LWSSSCS_UNREACHABLE,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t0\n+\t},\n+\n+\t/*\n+\t * We are talking to a nonexistant dns address \u0022bogus.nope\u0022. We expect\n+\t * that if we stick around longer, retries will also end up all failing.\n+\t * We might see the timeout depending on blocking getaddrinfo\n+\t * behaviour.\n+\t */\n+\n+\t{\n+\t\t\u0022h1:80 NXDOMAIN exhaust retries\u0022,\n+\t\t\u0022nxd_h1\u0022, 65 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h1:443 NXDOMAIN exhaust retries\u0022,\n+\t\t\u0022nxd_h1_tls\u0022, 65 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h2:443 NXDOMAIN exhaust retries\u0022,\n+\t\t\u0022nxd_h2_tls\u0022, 65 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_ACK_REMOTE) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE),\n+\t\t0\n+\t},\n+\n+\t/*\n+\t * Let's request some bulk data from httpbin.org\n+\t */\n+\n+\t{\n+\t\t\u0022h1:80 read bulk\u0022,\n+\t\t\u0022bulk_h1\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE,\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t(1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t12345\n+\t},\n+\t{\n+\t\t\u0022h1:443 read bulk\u0022,\n+\t\t\u0022bulk_h1_tls\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE,\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t(1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t12345\n+\t},\n+\t{\n+\t\t\u0022h2:443 read bulk\u0022,\n+\t\t\u0022bulk_h2_tls\u0022, 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE,\n+\t\t(1 \u003c\u003c LWSSSCS_TIMEOUT) | (1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE) |\n+\t\t(1 \u003c\u003c LWSSSCS_ALL_RETRIES_FAILED),\n+\t\t12345\n+\t},\n+\n+\t/*\n+\t * Let's fail at the tls negotiation various ways\n+\t */\n+\n+\t{\n+\t\t\u0022h1:badcert_hostname\u0022,\n+\t\t\u0022badcert_hostname\u0022, 6 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h1:badcert_expired\u0022,\n+\t\t\u0022badcert_expired\u0022, 6 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE),\n+\t\t0\n+\t},\n+\t{\n+\t\t\u0022h1:badcert_selfsigned\u0022,\n+\t\t\u0022badcert_selfsigned\u0022, 6 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED,\n+\t\t(1 \u003c\u003c LWSSSCS_QOS_NACK_REMOTE),\n+\t\t0\n+\t},\n+\n+};\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\n+\tsize_t\t\t\t\trx_seen;\n+\tchar\t\t\t\tresult_reported;\n+} myss_t;\n+\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\n+\tm-\u003erx_seen +\u003d len;\n+\n+\tif (flags \u0026 LWSSS_FLAG_EOM)\n+\t\tlwsl_notice(\u0022%s: %s len %d, fl %d, received %u bytes\u005cn\u0022,\n+\t\t\t\t__func__, lws_ss_tag(m-\u003ess), (int)len, flags,\n+\t\t\t\t(unsigned int)m-\u003erx_seen);\n+\n+\treturn 0;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t//myss_t *m \u003d (myss_t *)userobj;\n+\n+\t/* in this example, we don't send stuff */\n+\n+\treturn LWSSSSRET_TX_DONT_SEND;\n+}\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tstruct tests_seq *curr_test \u003d (\tstruct tests_seq *)m-\u003eopaque_data;\n+\tchar buf[8];\n+\tsize_t sl;\n+\n+\tlwsl_info(\u0022%s: %s: %s (%d), ord 0x%x\u005cn\u0022, __func__, lws_ss_tag(m-\u003ess),\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tif (curr_test-\u003emask_unexpected \u0026 (1u \u003c\u003c state)) {\n+\t\t/*\n+\t\t * We have definitively failed on an unexpected state received\n+\t\t */\n+\n+\t\tlwsl_warn(\u0022%s: failing on unexpected state %s\u005cn\u0022,\n+\t\t\t\t__func__, lws_ss_state_name((int)state));\n+\n+fail:\n+\t\tm-\u003eresult_reported \u003d 1;\n+\t\ttests_fail++;\n+\t\t/* we'll start the next test next time around the event loop */\n+\t\tlws_sul_schedule(context, 0, \u0026sul_next_test, tests_start_next, 1);\n+\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\tif (state \u003d\u003d curr_test-\u003emust_see) {\n+\n+\t\tif (curr_test-\u003eeom_pass !\u003d m-\u003erx_seen) {\n+\t\t\tlwsl_notice(\u0022%s: failing on rx %d, expected %d\u005cn\u0022,\n+\t\t\t\t __func__, (int)m-\u003erx_seen,\n+\t\t\t\t (int)curr_test-\u003eeom_pass);\n+\t\t\tgoto fail;\n+\t\t}\n+\n+\t\tlwsl_warn(\u0022%s: saw expected state %s\u005cn\u0022,\n+\t\t\t\t__func__, lws_ss_state_name((int)state));\n+\t\tm-\u003eresult_reported \u003d 1;\n+\t\ttests_pass++;\n+\t\t/* we'll start the next test next time around the event loop */\n+\t\tlws_sul_schedule(context, 0, \u0026sul_next_test, tests_start_next, 1);\n+\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tlws_ss_start_timeout(m-\u003ess,\n+\t\t\t(unsigned int)(curr_test-\u003etimeout_us / LWS_US_PER_MS));\n+\t\tif (curr_test-\u003eeom_pass) {\n+\t\t\tsl \u003d (size_t)lws_snprintf(buf, sizeof(buf), \u0022%u\u0022,\n+\t\t\t\t\t(unsigned int)curr_test-\u003eeom_pass);\n+\t\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022amount\u0022, buf, sl))\n+\t\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\t}\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_DESTROYING:\n+\t\tif (!m-\u003eresult_reported) {\n+\t\t\tlwsl_user(\u0022%s: failing on unexpected destruction\u005cn\u0022,\n+\t\t\t\t\t__func__);\n+\n+\t\t\ttests_fail++;\n+\t\t\t/* we'll start the next test next time around the event loop */\n+\t\t\tlws_sul_schedule(context, 0, \u0026sul_next_test, tests_start_next, 1);\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static void\n+tests_start_next(lws_sorted_usec_list_t *sul)\n+{\n+\tstruct tests_seq *ts;\n+\tlws_ss_info_t ssi;\n+\tstatic struct lws_ss_handle *h;\n+\n+\t/* destroy the old one */\n+\n+\tif (h) {\n+\t\tlwsl_info(\u0022%s: destroying previous stream\u005cn\u0022, __func__);\n+\t\tlws_ss_destroy(\u0026h);\n+\t}\n+\n+\tif ((unsigned int)tests \u003e\u003d LWS_ARRAY_SIZE(tests_seq)) {\n+\t\tlwsl_notice(\u0022Completed all tests\u005cn\u0022);\n+\t\tinterrupted \u003d 1;\n+\t\treturn;\n+\t}\n+\n+\tts \u003d \u0026tests_seq[tests++];\n+\n+\t/* Create the next test stream */\n+\n+\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\tssi.opaque_user_data_offset \u003d offsetof(myss_t, opaque_data);\n+\tssi.rx \u003d myss_rx;\n+\tssi.tx \u003d myss_tx;\n+\tssi.state \u003d myss_state;\n+\tssi.user_alloc \u003d sizeof(myss_t);\n+\tssi.streamtype \u003d ts-\u003estreamtype;\n+\n+\tlwsl_user(\u0022%s: %d: %s\u005cn\u0022, __func__, tests, ts-\u003ename);\n+\n+\tif (lws_ss_create(context, 0, \u0026ssi, ts, \u0026h, NULL, NULL)) {\n+\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t __func__);\n+\t\ttests_fail++;\n+\t\tinterrupted \u003d 1;\n+\t\treturn;\n+\t}\n+}\n+\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tswitch (target) {\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\t\t/* we'll start the next test next time around the event loop */\n+\t\t\tlws_sul_schedule(context, 0, \u0026sul_next_test, tests_start_next, 1);\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+static int\n+my_metric_report(lws_metric_pub_t *mp)\n+{\n+\tlws_metric_bucket_t *sub \u003d mp-\u003eu.hist.head;\n+\tchar buf[192];\n+\n+\tdo {\n+\t\tif (lws_metrics_format(mp, \u0026sub, buf, sizeof(buf)))\n+\t\t\tlwsl_user(\u0022%s: %s\u005cn\u0022, __func__, buf);\n+\t} while ((mp-\u003eflags \u0026 LWSMTFL_REPORT_HIST) \u0026\u0026 sub);\n+\n+\t/* 0 \u003d leave metric to accumulate, 1 \u003d reset the metric */\n+\n+\treturn 1;\n+}\n+\n+static const lws_system_ops_t system_ops \u003d {\n+\t.metric_report \u003d my_metric_report,\n+};\n+\n+#endif\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *pp;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tif ((pp \u003d lws_cmdline_option(argc, argv, \u0022--amount\u0022)))\n+\t\tamount \u003d (size_t)atoi(pp);\n+\n+\t/* set the expected payload for the bulk-related tests to amount */\n+\n+\ttests_seq[12].eom_pass \u003d tests_seq[13].eom_pass \u003d\n+\t\t\t\t\ttests_seq[14].eom_pass \u003d amount;\n+#if !defined(LWS_SS_USE_SSPC)\n+\t// puts(default_ss_policy);\n+#endif\n+\n+\tlwsl_user(\u0022LWS secure streams error path tests [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 16 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\tinfo.system_ops \u003d \u0026system_ops;\n+#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\tinfo.metrics_prefix \u003d \u0022ssmex\u0022;\n+#endif\n+#endif\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* the event loop */\n+\n+\tdo { } while(lws_service(context, 0) \u003e\u003d 0 \u0026\u0026 !interrupted);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: %s (pass %d, fail %d)\u005cn\u0022,\n+\t\t tests_pass \u003d\u003d tests \u0026\u0026 !tests_fail ? \u0022OK\u0022 : \u0022failed\u0022,\n+\t\t\t\t tests_pass, tests_fail);\n+\n+\treturn !(tests_pass \u003d\u003d tests \u0026\u0026 !tests_fail);\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/CMakeLists.txt\nnew file mode 100644\nindex 0000000..9443dc2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/CMakeLists.txt\n@@ -0,0 +1,130 @@\n+project(lws-minimal-secure-streams-threads C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SYS_SMD 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements AND NOT WIN32)\n+# win32 has problems with pthreads.h and timespec struct redef\n+\tadd_executable(${PROJECT_NAME} minimal-secure-streams-threads.c)\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\n+\t\tif (VALGRIND)\n+\t\t\tadd_test(NAME ss-threads COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-threads\u003e)\n+\t\telse()\n+\n+\t\t\tadd_test(NAME ss-threads COMMAND lws-minimal-secure-streams-threads)\n+\t\tendif()\n+\t\tset_tests_properties(ss-threads\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads\n+\t\t\t\t TIMEOUT 10)\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${PROJECT_NAME}-client minimal-secure-streams-threads.c)\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${PROJECT_NAME}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\n+\t\t#\n+\t\t# Define test dep to bring up and take down the test\n+\t\t# proxy\n+\t\t#\n+\n+\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t# uds abstract namespace for linux\n+\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-sspthreads_sspc-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\telse()\n+\t\t\t# filesystem socket for others\n+\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-sspthreads_sspc-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\tendif()\n+\n+\t\tadd_test(NAME st_ssprxthreads_sspc COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\tssproxythreads_sspc $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\tset_tests_properties(st_ssprxthreads_sspc PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssproxythreads_sspc TIMEOUT 800)\n+\n+\t\tadd_test(NAME ki_ssprxthreads_sspc COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\tssproxythreads_sspc $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\tset_tests_properties(ki_ssprxthreads_sspc PROPERTIES FIXTURES_CLEANUP ssproxythreads_sspc)\n+\n+\t\t#\n+\t\t# the client part that will connect to the proxy\n+\t\t#\n+\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME sspcthreads_sspc COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-threads-client\u003e -i +${CTEST_SOCKET_PATH})\n+\t\telse()\n+\t\t\tadd_test(NAME sspcthreads_sspc COMMAND lws-minimal-secure-streams-threads-client -i +${CTEST_SOCKET_PATH})\n+\t\tendif()\n+\t\tset_tests_properties(sspcthreads_sspc PROPERTIES\n+\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads\n+\t\t\tFIXTURES_REQUIRED \u0022ssproxythreads_sspc\u0022\n+\t\t\tTIMEOUT 80)\n+\n+\n+\t\t#\n+\t\t# Define test dep to bring up and take down the test\n+\t\t# proxy\n+\t\t#\n+\n+\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t# uds abstract namespace for linux\n+\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-mul-sspthreads_sspc-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\telse()\n+\t\t\t# filesystem socket for others\n+\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-mul-sspthreads_sspc-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\tendif()\n+\n+\t\tadd_test(NAME st_mulssprxthreads_sspc COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\tmulssproxythreads_sspc $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\tset_tests_properties(st_mulssprxthreads_sspc PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP mulssproxythreads_sspc TIMEOUT 800)\n+\n+\t\tadd_test(NAME ki_mulssprxthreads_sspc COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\tmulssproxythreads_sspc $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t-i ${CTEST_SOCKET_PATH} -d1039)\n+\t\tset_tests_properties(ki_mulssprxthreads_sspc PROPERTIES FIXTURES_CLEANUP mulssproxythreads_sspc)\n+\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/README.md\nnew file mode 100644\nindex 0000000..3f4cb1d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/README.md\n@@ -0,0 +1,27 @@\n+# lws minimal secure streams threads\n+\n+This application creates a thread and calls `lws_cancel_service()`\n+at 10Hz.\n+\n+It creates a Secure Stream and checks that it is getting the\n+`LWSSSCS_EVENT_WAIT_CANCELLED` state for each `lws_cancel_service()`.\n+\n+It also demonstrates how to protect a shared data area between the\n+thread(s) and the lws event loop thread to put data there that\n+describes what the thread wants the service loop to do.\n+\n+It exits after 3s with a 0 return code if the SS saw the expected\n+amount of messages.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/minimal-secure-streams-threads.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/minimal-secure-streams-threads.c\nnew file mode 100644\nindex 0000000..bc4d42f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/minimal-secure-streams-threads.c\n@@ -0,0 +1,296 @@\n+/*\n+ * lws-minimal-secure-streams-threads\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates how other threads can wake the lws event loop and ask it\n+ * to do things via lws_cancel_service(), notifying Secure Streams using the\n+ * LWSSSCS_EVENT_WAIT_CANCELLED state callback.\n+ *\n+ * Because of what we're testing, we don't actually connect the SS just create\n+ * it and wait for the states we are testing for to come at 10Hz.\n+ *\n+ * We run the test for 3s and check we got an appropriate amount of wakes\n+ * to call it a success.\n+ *\n+ * You can use the same pattern to have any amount of shared data protected by\n+ * the mutex, containing whatever the other threads want the lws event loop\n+ * thread to do for them.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#include \u003cpthread.h\u003e\n+\n+/*\n+ * Define this to cause an ss api access from a foreign thread, it will\n+ * assert. This is for testing lws, don't do this in your code.\n+ */\n+// #define DO_ILLEGAL_API_THREAD\n+\n+static int interrupted, bad \u003d 1, finished;\n+static lws_sorted_usec_list_t sul_timeout;\n+static struct lws_context *context;\n+static pthread_t pthread_spam;\n+static int wakes, started_thread;\n+\n+#if defined(DO_ILLEGAL_API_THREAD)\n+static struct lws_ss_handle *ss; /* only needed for DO_ILLEGAL_API_THREAD */\n+#endif\n+\n+/* the data shared between the spam thread and the lws event loop */\n+\n+static pthread_mutex_t lock_shared;\n+static int shared_counter;\n+\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t\t\u0022\u005c\u0022schema-version\u005c\u0022:1,\u0022\n+\t\t\u0022\u005c\u0022s\u005c\u0022: [\u0022\n+\t\t\t\u0022{\u0022\n+\t\t\t\t\u0022\u005c\u0022mintest\u005c\u0022: {\u0022\n+\t\t\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+\t\t\t\t\u0022}\u0022\n+\t\t\t\u0022}\u0022\n+\t\t\u0022]\u0022\n+\t\u0022}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle \t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+} myss_t;\n+\n+static void *\n+thread_spam(void *d)\n+{\n+\n+\tdo {\n+\t\tpthread_mutex_lock(\u0026lock_shared); /* --------- shared lock { */\n+\n+\t\t/*\n+\t\t * prepare the shared data area to indicate whatever it is that\n+\t\t * we want doing on the main event loop. In this case, we just\n+\t\t * bump a counter, but it can be any amount of data prepared,\n+\t\t * eg, whole info struct for a connection we want.\n+\t\t */\n+\n+\t\tshared_counter++;\n+\n+\t\tlwsl_notice(\u0022%s: cancelling wait from spam thread: %d\u005cn\u0022,\n+\t\t\t\t__func__, shared_counter);\n+\t\tlws_cancel_service(context);\n+\n+#if defined(DO_ILLEGAL_API_THREAD)\n+\t\t/*\n+\t\t * ILLEGAL...\n+\t\t * We cannot call any other lws api from a foreign thread\n+\t\t */\n+\n+\t\tif (ss)\n+\t\t\tlws_ss_request_tx(ss);\n+#endif\n+\n+\t\tpthread_mutex_unlock(\u0026lock_shared); /* } shared lock ------- */\n+\n+\t\tusleep(100000); /* wait 100ms and signal main thread again */\n+\n+\t} while (!finished);\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\t// myss_t *m \u003d (myss_t *)userobj;\n+\tvoid *retval;\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tif (pthread_create(\u0026pthread_spam, NULL, thread_spam, NULL)) {\n+\t\t\tlwsl_err(\u0022thread creation failed\u005cn\u0022);\n+\t\t\treturn LWSSSSRET_DESTROY_ME;\n+\t\t}\n+\t\tstarted_thread \u003d 1;\n+\t\tbreak;\n+\tcase LWSSSCS_DESTROYING:\n+\t\tfinished \u003d 1;\n+\t\tif (started_thread)\n+\t\t\tpthread_join(pthread_spam, \u0026retval);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_EVENT_WAIT_CANCELLED:\n+\t\tpthread_mutex_lock(\u0026lock_shared); /* --------- shared lock { */\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_EVENT_WAIT_CANCELLED: %d, shared: %d\u005cn\u0022,\n+\t\t\t __func__, ++wakes, shared_counter);\n+\t\tpthread_mutex_unlock(\u0026lock_shared); /* } shared lock ------- */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static const lws_ss_info_t ssi_lws_threads \u003d {\n+\t.handle_offset\t\t \u003d offsetof(myss_t, ss),\n+\t.opaque_user_data_offset \u003d offsetof(myss_t, opaque_data),\n+\t/* we don't actually do any rx or tx in this test */\n+\t.state\t\t\t \u003d myss_state,\n+\t.user_alloc\t\t \u003d sizeof(myss_t),\n+\t.streamtype\t\t \u003d \u0022mintest\u0022,\n+\t.manual_initial_tx_credit \u003d 0,\n+};\n+\n+static void\n+sul_timeout_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tlwsl_notice(\u0022%s: test finishing\u005cn\u0022, __func__);\n+\tinterrupted \u003d 1;\n+}\n+\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tif (current !\u003d LWS_SYSTATE_OPERATIONAL || target !\u003d LWS_SYSTATE_OPERATIONAL)\n+\t\treturn 0;\n+\n+\t/* the test SS.. not going to connect it, just see if the cancel_service\n+\t * messages are coming\n+\t */\n+\n+\tif (lws_ss_create(context, 0, \u0026ssi_lws_threads, NULL,\n+#if defined(DO_ILLEGAL_API_THREAD)\n+\t\t\t\u0026ss,\n+#else\n+\t\t\tNULL,\n+#endif\n+\t\t\tNULL, NULL)) {\n+\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t __func__);\n+\n+\t\treturn -1;\n+\t}\n+\n+\t/* set up the test timeout */\n+\n+\tlws_sul_schedule(context, 0, \u0026sul_timeout, sul_timeout_cb,\n+\t\t\t 3 * LWS_US_PER_SEC);\n+\n+\treturn 0;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL},\n+\t\t\t\t\t system_notify_cb, \u0022app\u0022 };\n+\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\tstruct lws_context_creation_info info;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS Secure Streams threads test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tinfo.fd_limit_per_thread\t\u003d 1 + 6 + 1;\n+\tinfo.port\t\t\t\u003d CONTEXT_PORT_NO_LISTEN;\n+#if !defined(LWS_SS_USE_SSPC)\n+\tinfo.pss_policies_json\t\t\u003d default_ss_policy;\n+#else\n+\tinfo.protocols\t\t\t\u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#endif\n+\tinfo.options\t\t\t\u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t\t\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.register_notifier_list \u003d na;\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+#if defined(LWS_SS_USE_SSPC)\n+\tif (!lws_create_vhost(context, \u0026info)) {\n+\t\tlwsl_err(\u0022%s: failed to create default vhost\u005cn\u0022, __func__);\n+\t\tgoto bail;\n+\t}\n+#endif\n+\n+\t/* the event loop */\n+\n+\twhile (lws_service(context, 0) \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\t;\n+\n+\t/* compare what happened with what we expect */\n+\n+\tif (wakes \u003e 10)\n+\t\t/* OSX can do the usleep thread slower than 100ms */\n+\t\tbad \u003d 0;\n+\n+\tlwsl_notice(\u0022wakes %d\u005cn\u0022, wakes);\n+\n+#if defined(LWS_SS_USE_SSPC)\n+bail:\n+#endif\n+\tlws_sul_cancel(\u0026sul_timeout);\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/CMakeLists.txt\nnew file mode 100644\nindex 0000000..bdf8ef6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/CMakeLists.txt\n@@ -0,0 +1,165 @@\n+project(lws-minimal-secure-streams C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-secure-streams)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} minimal-secure-streams.c)\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\n+\t\t#\n+\t\t# When running in CI, wait for a lease on the resources\n+\t\t# before starting this test, so the server does not get\n+\t\t# thousands of simultaneous tls connection attempts\n+\t\t#\n+\t\t# sai-resource holds the lease on the resources until\n+\t\t# the time given in seconds or the sai-resource instance\n+\t\t# exits, whichever happens first\n+\t\t#\n+\t\t# If running under Sai, creates a lock test called \u0022res_sspcmin\u0022 \n+\t\t#\n+\t\t\n+\t\tsai_resource(warmcat_conns 1 40 sspcmin)\n+\t\t\n+\t\t#\n+\t\t# simple test not via proxy\n+\t\t#\n+\t\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME ss-warmcat COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME ss-warmcat COMMAND lws-minimal-secure-streams)\n+\t\tendif()\n+\n+\t\tset_tests_properties(ss-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams\n+\t\t\t\t TIMEOUT 40)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(ss-warmcat PROPERTIES FIXTURES_REQUIRED \u0022res_sspcmin\u0022)\t\t \n+\t\tendif()\n+\n+\t\tif (has_fault_injection)\n+\t\t\tif (VALGRIND)\n+\t\t\t\tadd_test(NAME ss-warmcat-fi1 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams\u003e\n+\t\t\t\t\t--fault-injection \u0022ss/ss_create_destroy_me\u0022\n+\t\t\t\t\t--expected-exit 1)\n+\t\t\t\tadd_test(NAME ss-warmcat-fi2 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams\u003e\n+\t\t\t\t\t--fault-injection \u0022ss/ss_no_streamtype_policy\u0022\n+\t\t\t\t\t--expected-exit 1)\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME ss-warmcat-fi1 COMMAND lws-minimal-secure-streams\n+\t\t\t\t\t --fault-injection \u0022ss/ss_create_destroy_me\u0022\n+\t\t\t\t\t --expected-exit 1)\n+\t\t\t\tadd_test(NAME ss-warmcat-fi2 COMMAND lws-minimal-secure-streams\n+\t\t\t\t\t --fault-injection \u0022ss/ss_no_streamtype_policy\u0022\n+\t\t\t\t\t --expected-exit 1)\n+ \t\t\t endif()\n+\n+\t\t\tset_tests_properties(ss-warmcat-fi1\n+\t\t\t\t\t ss-warmcat-fi2\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams\n+\t\t\t\t TIMEOUT 5)\n+\n+\t\tendif()\n+\n+\n+\t\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-ssp-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-ssp-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_ssproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tssproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_ssproxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP ssproxy TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_ssproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tssproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_ssproxy PROPERTIES FIXTURES_CLEANUP ssproxy)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\t\tadd_test(NAME sspc-minimal COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:lws-minimal-secure-streams-client\u003e -i +${CTEST_SOCKET_PATH})\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME sspc-minimal COMMAND lws-minimal-secure-streams-client -i +${CTEST_SOCKET_PATH})\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset(fixlist \u0022ssproxy\u0022)\n+\t\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\t\tlist(APPEND fixlist \u0022res_ssproxy\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset_tests_properties(sspc-minimal PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams\n+\t\t\t\tFIXTURES_REQUIRED \u0022${fixlist}\u0022\n+\t\t\t\tTIMEOUT 40)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${SAMP}-client minimal-secure-streams.c)\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP}-client websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP}-client websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+endif()\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/README.md\nnew file mode 100644\nindex 0000000..78f0a1b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/README.md\n@@ -0,0 +1,67 @@\n+# lws minimal secure streams\n+\n+The application goes to https://warmcat.com and reads index.html there.\n+\n+It does it using Secure Streams... the main code in minimal-secure-streams.c\n+just sets up the context and opens a secure stream of type \u0022mintest\u0022.\n+\n+The handler for state changes and payloads for \u0022mintest\u0022 is in ss-myss.c\n+\n+The information about how a \u0022mintest\u0022 stream should connect and the\n+protocol it uses is kept separated in policy-database.c\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-f| Force connecting to the wrong endpoint to check backoff retry flow\n+-p| Run as proxy server for clients to connect to over unix domain socket\n+--force-portal|Force the SS Captive Portal Detection to feel it's behind a portal\n+--force-no-internet|Force the SS Captive Portal Detection to feel it can't reach the internet\n+--blob|Download a 50MiB blob from warmact.com, using flow control at the proxy\n+\n+```\n+[2019/08/12 07:16:11:0045] USR: LWS minimal secure streams [-d\u003cverbosity\u003e] [-f]\n+[2019/08/12 07:16:12:6102] USR: myss_state: LWSSSCS_CREATING, ord 0x0\n+[2019/08/12 07:16:12:6107] USR: myss_state: LWSSSCS_POLL, ord 0x0\n+[2019/08/12 07:16:12:6117] N: lws_ss_client_connect: connecting h1get warmcat.com /\n+[2019/08/12 07:16:12:6118] USR: myss_state: LWSSSCS_CONNECTING, ord 0x0\n+[2019/08/12 07:16:13:4171] USR: myss_state: LWSSSCS_CONNECTED, ord 0x0\n+[2019/08/12 07:16:13:4222] USR: myss_rx: len 1024, flags: 1\n+[2019/08/12 07:16:13:4243] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4244] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4244] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4245] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4246] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4247] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4252] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4264] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4265] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4266] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4267] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4268] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4268] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4269] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4270] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4278] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4279] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4280] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4281] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4282] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4283] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4283] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4284] USR: myss_rx: len 1015, flags: 0\n+[2019/08/12 07:16:13:4287] USR: myss_rx: len 1024, flags: 0\n+[2019/08/12 07:16:13:4288] USR: myss_rx: len 947, flags: 0\n+[2019/08/12 07:16:13:4293] USR: myss_rx: len 0, flags: 2\n+[2019/08/12 07:16:13:4399] USR: myss_state: LWSSSCS_DISCONNECTED, ord 0x0\n+[2019/08/12 07:16:13:4761] USR: myss_state: LWSSSCS_DESTROYING, ord 0x0\n+[2019/08/12 07:16:13:4781] USR: Completed: OK\n+```\ndiff --git a/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/minimal-secure-streams.c\nnew file mode 100644\nindex 0000000..260ec50\n--- /dev/null\n+++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/minimal-secure-streams.c\n@@ -0,0 +1,683 @@\n+/*\n+ * lws-minimal-secure-streams\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ *\n+ * This demonstrates a minimal http client using secure streams api.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there.\n+ *\n+ * This example is built two different ways from the same source... one includes\n+ * the policy everything needed to fulfil the stream directly. The other -client\n+ * variant has no policy itself and some other minor init changes, and connects\n+ * to the -proxy example to actually get the connection done.\n+ *\n+ * In the -client build case, the example does not even init the tls libraries\n+ * since the proxy part will take care of all that.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+// #define FORCE_OS_TRUST_STORE\n+\n+/*\n+ * uncomment to force network traffic through 127.0.0.1:1080\n+ *\n+ * On your local machine, you can run a SOCKS5 proxy like this\n+ *\n+ * $ ssh -N -D 0.0.0.0:1080 localhost -v\n+ *\n+ * If enabled, this also fetches a remote policy that also\n+ * specifies that all traffic should go through the remote\n+ * proxy.\n+ */\n+// #define VIA_LOCALHOST_SOCKS\n+\n+static int interrupted, bad \u003d 1, force_cpd_fail_portal,\n+\t force_cpd_fail_no_internet, test_respmap, test_ots, test_local;\n+static unsigned int timeout_ms \u003d 3000;\n+static lws_state_notify_link_t nl;\n+\n+/*\n+ * If the -proxy app is fulfilling our connection, then we don't need to have\n+ * the policy in the client.\n+ *\n+ * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over\n+ * a Unix Domain Socket. To test that, you need to separately run the\n+ * ./lws-minimal-secure-streams-proxy test app on the same machine.\n+ */\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+static const char * const default_ss_policy \u003d\n+\t\u0022{\u0022\n+\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n+\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n+#endif\n+\n+\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n+\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n+\t\t\t\t\t\t \u00222000,\u0022\n+\t\t\t\t\t\t \u00223000,\u0022\n+\t\t\t\t\t\t \u00225000,\u0022\n+\t\t\t\t\t\t\u002210000\u0022\n+\t\t\t\t\u0022],\u0022\n+\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n+\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n+\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n+\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n+\t\t\u0022}}\u0022\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n+\t\t/*\n+\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n+\t\t *\n+\t\t * We fetch the real policy from there using SS and switch to\n+\t\t * using that.\n+\t\t */\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t \t\t\u0022{\u005c\u0022isrg_root_x1\u005c\u0022: \u005c\u0022\u0022\n+\t\u0022MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\u0022\n+\t\u0022TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\u0022\n+\t\u0022cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\u0022\n+\t\u0022WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\u0022\n+\t\u0022ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\u0022\n+\t\u0022MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\u0022\n+\t\u0022h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\u0022\n+\t\u00220TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\u0022\n+\t\u0022A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\u0022\n+\t\u0022T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\u0022\n+\t\u0022B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\u0022\n+\t\u0022B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\u0022\n+\t\u0022KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\u0022\n+\t\u0022OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\u0022\n+\t\u0022jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\u0022\n+\t\u0022qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\u0022\n+\t\u0022rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\u0022\n+\t\u0022HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\u0022\n+\t\u0022hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\u0022\n+\t\u0022ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\u0022\n+\t\u00223BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\u0022\n+\t\u0022NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\u0022\n+\t\u0022ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\u0022\n+\t\u0022TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\u0022\n+\t\u0022jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\u0022\n+\t\u0022oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\u0022\n+\t\u00224RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\u0022\n+\t\u0022mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\u0022\n+\t\u0022emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\u0022\n+\t\t\u0022\u005c\u0022}\u0022\n+#endif\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t\t\u0022{\u0022\n+\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n+\t\t\t\t\u0022\u005c\u0022isrg_root_x1\u005c\u0022\u0022\n+\t\t\t\u0022]\u0022\n+\t\t\u0022}\u0022\n+#endif\n+\t \u0022],\u0022\n+\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n+#if !defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\t\t/*\n+\t\t * \u0022fetch_policy\u0022 decides from where the real policy\n+\t\t * will be fetched, if present. Otherwise the initial\n+\t\t * policy is treated as the whole, hardcoded, policy.\n+\t\t */\n+\t\t\u0022{\u005c\u0022fetch_policy\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n+#if defined(VIA_LOCALHOST_SOCKS)\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-socks.json\u005c\u0022,\u0022\n+#else\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022policy/minimal-proxy-v4.2-v2.json\u005c\u0022,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n+#if !defined(FORCE_OS_TRUST_STORE)\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022le_via_isrg\u005c\u0022,\u0022\n+#endif\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022\u0022\n+#else\n+\t\u0022{\u005c\u0022mintest\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 443,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022index.html?uptag\u003d${uptag}\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022metadata\u005c\u0022: [{\u0022\n+\t\t\t\u0022\t\u005c\u0022uptag\u005c\u0022: \u005c\u0022X-Upload-Tag:\u005c\u0022\u0022\n+\t\t\t\u0022}, {\u0022\n+\t\t\t\u0022\t\u005c\u0022xctype\u005c\u0022: \u005c\u0022X-Content-Type:\u005c\u0022\u0022\n+\t\t\t\u0022}],\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022timeout_ms\u005c\u0022: 2000,\u0022\n+\t\t\t\u0022\u005c\u0022direct_proto_str\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022: \u005c\u0022le_via_dst\u005c\u0022\u0022\n+\t\t\u0022}},\u0022\n+\t\u0022{\u005c\u0022mintest_local\u005c\u0022: {\u0022\n+\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022localhost\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 8000,\u0022\n+\t\t\t\u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022tls\u005c\u0022: false,\u0022\n+\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+\t\t\t\u0022\u005c\u0022retry\u005c\u0022: \u005c\u0022default\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022timeout_ms\u005c\u0022: 2000,\u0022\n+\t\t\t\u0022\u005c\u0022direct_proto_str\u005c\u0022: true\u0022\n+#endif\n+\t\t\u0022}},{\u0022\n+\t\t\t/*\n+\t\t\t * \u0022captive_portal_detect\u0022 describes\n+\t\t\t * what to do in order to check if the path to\n+\t\t\t * the Internet is being interrupted by a\n+\t\t\t * captive portal. If there's a larger policy\n+\t\t\t * fetched from elsewhere, it should also include\n+\t\t\t * this since it needs to be done at least after\n+\t\t\t * every DHCP acquisition\n+\t\t\t */\n+\t\t \u0022\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+ \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022connectivitycheck.android.com\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022generate_204\u005c\u0022,\u0022\n+\t\t\t\u0022\u005c\u0022port\u005c\u0022: 80,\u0022\n+ \u0022\u005c\u0022protocol\u005c\u0022: \u005c\u0022h1\u005c\u0022,\u0022\n+ \u0022\u005c\u0022http_method\u005c\u0022: \u005c\u0022GET\u005c\u0022,\u0022\n+ \u0022\u005c\u0022opportunistic\u005c\u0022: true,\u0022\n+ \u0022\u005c\u0022http_expect\u005c\u0022: 204,\u0022\n+\t\t\t\u0022\u005c\u0022http_fail_redirect\u005c\u0022: true\u0022\n+ \u0022}}\u0022\n+\t\u0022]}\u0022\n+;\n+\n+#endif\n+\n+typedef struct myss {\n+\tstruct lws_ss_handle\t\t*ss;\n+\tvoid\t\t\t\t*opaque_data;\n+\t/* ... application specific state ... */\n+\tlws_sorted_usec_list_t\t\tsul;\n+\tsize_t\t\t\t\tamt;\n+\n+\tstruct lws_genhash_ctx\t\thash_ctx;\n+} myss_t;\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+static const char *canned_root_token_payload \u003d\n+\t\u0022grant_type\u003drefresh_token\u0022\n+\t\u0022\u0026refresh_token\u003dAtzr|IwEBIJedGXjDqsU_vMxykqOMg\u0022\n+\t\u0022SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP\u0022\n+\t\u0022zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y\u0022\n+\t\u00220flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW\u0022\n+\t\u0022k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE\u0022\n+\t\u0022iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S\u0022\n+\t\u0022KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc\u0022\n+\t\u0022AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI\u0022\n+\t\u0022xL_hDCcTho8opCVX-6QhJHl6SQFlTw13\u0022\n+\t\u0022\u0026client_id\u003d\u0022\n+\t\t\u0022amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d\u0022;\n+\n+#endif\n+\n+/* secure streams payload interface */\n+\n+static lws_ss_state_return_t\n+myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n+{\n+\n+\tif (flags \u0026 LWSSS_FLAG_PERF_JSON)\n+\t\treturn LWSSSSRET_OK;\n+\n+#if !defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+\tconst char *md_srv \u003d \u0022not set\u0022, *md_test \u003d \u0022not set\u0022;\n+\tsize_t md_srv_len \u003d 7, md_test_len \u003d 7;\n+\n+\tlws_ss_get_metadata(m-\u003ess, \u0022srv\u0022, (const void **)\u0026md_srv, \u0026md_srv_len);\n+\tlws_ss_get_metadata(m-\u003ess, \u0022test\u0022, (const void **)\u0026md_test, \u0026md_test_len);\n+\tlwsl_user(\u0022%s: len %d, flags: %d, srv: %.*s, test: %.*s\u005cn\u0022, __func__,\n+\t\t (int)len, flags, (int)md_srv_len, md_srv,\n+\t\t (int)md_test_len, md_test);\n+\n+\tlwsl_hexdump_info(buf, len);\n+#endif\n+\n+\t/*\n+\t * If we received the whole message, for our example it means\n+\t * we are done.\n+\t */\n+\tif (flags \u0026 LWSSS_FLAG_EOM) {\n+\t\tbad \u003d 0;\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\tint *flags)\n+{\n+\t//myss_t *m \u003d (myss_t *)userobj;\n+\n+\t/* in this example, we don't send stuff */\n+\n+\treturn LWSSSSRET_TX_DONT_SEND;\n+}\n+\n+#if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+static const char * long_token_str \u003d \u0022{xxx:AWlKJMMISWJBQpAFqU0UqKNsnSY5usx2YtjOZJUQALNtapRxu/9VJqMk5IFVhxrNvMTj+RCGN6B5OlUK80lbbC8fAmQi7SoFB8DHN9UCRHkENriC62FjMNiBVfgkjMWx+60GioZy4bI2kCcyisd2CujQuSVllUmQFXhVq291cJhFfcKR4c3CUCuhouUfK2e1BY5InDMnzUXozOh+vhjJSeBIfp4HRUAgMpV7FXlHy8D5tgbmPbHs9X81MEsHTcERd3pG10B5fu1PzH+dJbr5F2WTK+VFWZI99B89ijEZWsPg447IK3F+0HHGseZfpRjKw2bY94id/TmncTxS0cqchDJlYg+Jt33U4HkUPqLdRiGIfJb6wSATx4S9ZKUumeJAgXpC6ytlUeqPpxzgnD7Tle5CDVb+eVzRk2FJfjiZdjbYxXhWYntPusLP/PGrorkqLw0ZKw+OJ+fhbkwF+0SCUelWEc8WPtfxCDAIdEQ7X5P4vUlBNEfuHprgHbZry680syFetY2q3ZtCmWemLHhqdDGu4lFgcQPCbb9b8eOE8oAbUQPm9AeV84RXSLevBG44JST/W2JuYguOk8SFlsRkfHb3dvxfB15Lg+mtH0tGRoumSMT0CFJL4ClTiKdpJo1LPgEd2/f13GcukEWirjqDRxpepJYWaVAMbxbaPBNfRHw9S8Fn8qU9/9eAxmbEqOopep5I/Zd99CT2PdE0Qyami1p05/BEc5dgvjg3SNDmAc/8kWC0AcvoSfApXI1TaVzbNh68b79h6IaIvXXorY5274u0lVB357JIRiYo29QbJgNn4bDbIr5ScM8GnFHQdKy29/TZoq4zbGMPX2X2t41vXRVeoZteu7vNWsMQD6eIomVq9qFWnoEEaR30woGF+8ZSIEu9JH5LKVZVFx46lipnjE8CDt5qrYCjwiGIswdLLMmIltxRmDt4aefTFpre7lhgUChv7ndJARvsn8rvtg2Hg1qKyfCAHa/LBblM29cRjLFqp7tWLJO7N27SWiqEhai6pmSmSYzqoPL+rnLS69rkdIuUwkA\u003d\u003d}{yyy:jG8akvr66AXK+W1KSUyGIN3Yk4WNRLSIZHWTu8rsvQAuKwv9a/ZxrxIa+R1xW7cwmPSgINcJ4Jo7kGK9n7aDnsSDt3uMSHsu2iNg+UtIaJcO0XO6fPaLmOPLpOIU5AfG9HnbWUjeniNRrUGN8+26JH/9EB1h/X++Ow61CCHm8mKrgR1lXsKuNyqDYIrjoI3KCCVKZkdWygyFAXQ6l0sr+pUyNpv6H5w1xlC8dtI88091b/njuRlHsnoCa1zRtgqH0L4igLNu0zzOkH/ATsVS3Pyn4nsoRiGVFgzJZ0e2jT2McmDTxNeEHcafQSxeN7pztDFHT3ukUU9QFFtFDdzlug\u003d\u003d}{vvv:VGbzgaVrLrJ+92ACJ0TEtQ\u003d\u003d}{eeee:QURQVG9rZW6FbmNyeXB0aW6uS2v5}{sssss:mG+}\u0022;\n+#endif\n+\n+static lws_ss_state_return_t\n+myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tmyss_t *m \u003d (myss_t *)userobj;\n+#if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\tconst char *md_test \u003d \u0022not set\u0022;\n+\tsize_t md_test_len \u003d 7;\n+\tint i;\n+\tstatic const char * imd_test_keys[8] \u003d {\n+\t\t\u0022server:\u0022,\n+\t\t\u0022content-security-policy:\u0022,\n+\t\t\u0022strict-transport-security:\u0022,\n+\t\t\u0022test-custom-header:\u0022,\n+\t\t\u0022x-xss-protection:\u0022,\n+\t\t\u0022x-content-type-options:\u0022,\n+\t\t\u0022x-frame-options:\u0022,\n+\t\t\u0022x-non-exist:\u0022,\n+\t\t};\n+#endif\n+\n+\tlwsl_user(\u0022%s: %s (%d), ord 0x%x\u005cn\u0022, __func__,\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\tcase LWSSSCS_CREATING:\n+\t\treturn lws_ss_client_connect(m-\u003ess);\n+\n+\tcase LWSSSCS_CONNECTING:\n+\t\tlws_ss_start_timeout(m-\u003ess, timeout_ms);\n+\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022uptag\u0022, \u0022myuptag123\u0022, 10))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+#if !defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022, \u0022myctype\u0022, 7))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+#else\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022X-Test-Type1:\u0022, \u0022myctype1\u0022, 8))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022X-Test-Type2:\u0022, \u0022myctype2\u0022, 8))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022Content-Type:\u0022, \u0022myctype\u0022, 7))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022X-ADP-Authentication-Token:\u0022,\n+\t\t\t\t\tlong_token_str, strlen(long_token_str)))\n+\t\t\t/* can fail, eg due to OOM, retry later if so */\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\n+#endif\n+\t\tbreak;\n+\n+\tcase LWSSSCS_ALL_RETRIES_FAILED:\n+\t\t/* if we're out of retries, we want to close the app and FAIL */\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 2;\n+\t\tbreak;\n+\tcase LWSSSCS_CONNECTED:\n+#if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)\n+\tlwsl_user(\u0022%s: get direct metadata\u005cn\u0022, __func__);\n+\tfor (i \u003d 0; i \u003c 8; i++) {\n+\t\tmd_test \u003d \u0022not set\u0022;\n+\t\tlws_ss_get_metadata(m-\u003ess, imd_test_keys[i], (const void **)\u0026md_test, \u0026md_test_len);\n+\t\tlwsl_user(\u0022%s test key:[%s], got [%s]\u005cn\u0022, __func__, imd_test_keys[i], md_test);\n+\t}\n+#endif\n+\t\tbreak;\n+\n+\tcase LWSSSCS_QOS_ACK_REMOTE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_QOS_ACK_REMOTE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_TIMEOUT:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_TIMEOUT\u005cn\u0022, __func__);\n+\t\t/* if we're out of time */\n+\t\tinterrupted \u003d 1;\n+\t\tbad \u003d 3;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_USER_BASE:\n+\t\tlwsl_notice(\u0022%s: LWSSSCS_USER_BASE\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+#if defined(LWS_WITH_SECURE_STREAMS_BUFFER_DUMP)\n+static void\n+myss_headers_dump(void *userobj, const uint8_t *buf, size_t len, int done)\n+{\n+\tlwsl_user(\u0022%s: %lu done: %s\u005cn\u0022, __func__, len, done?\u0022true\u0022:\u0022false\u0022);\n+\n+\tlwsl_hexdump_err(buf, len);\n+}\n+#endif\n+static int\n+app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\tlws_system_blob_t *ab \u003d lws_system_get_blob(context,\n+\t\t\t\tLWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);\n+\tsize_t size;\n+#endif\n+\n+\t/*\n+\t * For the things we care about, let's notice if we are trying to get\n+\t * past them when we haven't solved them yet, and make the system\n+\t * state wait while we trigger the dependent action.\n+\t */\n+\tswitch (target) {\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\n+\t/*\n+\t * The proxy takes responsibility for this stuff if we get things\n+\t * done through that\n+\t */\n+\n+\tcase LWS_SYSTATE_INITIALIZED: /* overlay on the hardcoded policy */\n+\tcase LWS_SYSTATE_POLICY_VALID: /* overlay on the loaded policy */\n+\n+\t\tif (target !\u003d current)\n+\t\t\tbreak;\n+\n+\t\tif (force_cpd_fail_portal)\n+\n+\t\t\t/* this makes it look like we're behind a captive portal\n+\t\t\t * because the overriden address does a redirect */\n+\n+\t\t\tlws_ss_policy_overlay(context,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022: [{\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022google.com\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022port\u005c\u0022: 80\u0022\n+\t\t\t\t \u0022}}]}\u0022);\n+\n+\t\tif (force_cpd_fail_no_internet)\n+\n+\t\t\t/* this looks like no internet, because the overridden\n+\t\t\t * port doesn't have anything that will connect to us */\n+\n+\t\t\tlws_ss_policy_overlay(context,\n+\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022: [{\u005c\u0022captive_portal_detect\u005c\u0022: {\u0022\n+\t\t\t\t\t \u0022\u005c\u0022endpoint\u005c\u0022: \u005c\u0022warmcat.com\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022http_url\u005c\u0022: \u005c\u0022/\u005c\u0022,\u0022\n+\t\t\t\t\t \u0022\u005c\u0022port\u005c\u0022: 999\u0022\n+\t\t\t\t \u0022}}]}\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_SYSTATE_REGISTERED:\n+\t\tsize \u003d lws_system_blob_get_size(ab);\n+\t\tif (size)\n+\t\t\tbreak;\n+\n+\t\t/* let's register our canned root token so auth can use it */\n+\t\tlws_system_blob_direct_set(ab,\n+\t\t\t\t(const uint8_t *)canned_root_token_payload,\n+\t\t\t\tstrlen(canned_root_token_payload));\n+\t\tbreak;\n+\n+#endif\n+\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n+\t\t\tlws_ss_info_t ssi;\n+\n+\t\t\t/* We're making an outgoing secure stream ourselves */\n+\n+\t\t\tmemset(\u0026ssi, 0, sizeof(ssi));\n+\t\t\tssi.handle_offset \u003d offsetof(myss_t, ss);\n+\t\t\tssi.opaque_user_data_offset \u003d offsetof(myss_t,\n+\t\t\t\t\t\t\t opaque_data);\n+\t\t\tssi.rx \u003d myss_rx;\n+\t\t\tssi.tx \u003d myss_tx;\n+\t\t\tssi.state \u003d myss_state;\n+#if defined(LWS_WITH_SECURE_STREAMS_BUFFER_DUMP)\n+\t\t\tssi.dump \u003d myss_headers_dump;\n+#endif\n+\t\t\tssi.user_alloc \u003d sizeof(myss_t);\n+\t\t\tssi.streamtype \u003d test_ots ? \u0022mintest-ots\u0022 :\n+\t\t\t\t\t (test_respmap ? \u0022respmap\u0022 :\n+\t\t\t\t\t (test_local ? \u0022mintest_local\u0022 :\n+\t\t\t\t\t \u0022mintest\u0022));\n+\n+\t\t\tif (lws_ss_create(context, 0, \u0026ssi, NULL, NULL,\n+\t\t\t\t\t NULL, NULL)) {\n+\t\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\t\tinterrupted \u003d 1;\n+\t\t\t\tlws_cancel_service(context);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n+\t\u0026nl, NULL\n+};\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\n+static int\n+my_metric_report(lws_metric_pub_t *mp)\n+{\n+\tlws_metric_bucket_t *sub \u003d mp-\u003eu.hist.head;\n+\tchar buf[192];\n+\n+\tdo {\n+\t\tif (lws_metrics_format(mp, \u0026sub, buf, sizeof(buf)))\n+\t\t\tlwsl_user(\u0022%s: %s\u005cn\u0022, __func__, buf);\n+\t} while ((mp-\u003eflags \u0026 LWSMTFL_REPORT_HIST) \u0026\u0026 sub);\n+\n+\t/* 0 \u003d leave metric to accumulate, 1 \u003d reset the metric */\n+\n+\treturn 1;\n+}\n+\n+static const lws_system_ops_t system_ops \u003d {\n+\t.metric_report \u003d my_metric_report,\n+};\n+\n+#endif\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tint n \u003d 0, expected \u003d 0;\n+\tconst char *p;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\t//lws_set_log_level(LLL_USER | LLL_ERR | LLL_DEBUG | LLL_NOTICE | LLL_INFO, NULL);\n+\n+\tlwsl_user(\u0022LWS secure streams test client [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\t/* these options are mutually exclusive if given */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-portal\u0022))\n+\t\tforce_cpd_fail_portal \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--force-no-internet\u0022))\n+\t\tforce_cpd_fail_no_internet \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--respmap\u0022))\n+\t\ttest_respmap \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--ots\u0022))\n+\t\t/*\n+\t\t * Use a streamtype that relies on the OS trust store for\n+\t\t * validation\n+\t\t */\n+\t\ttest_ots \u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--local\u0022))\n+\t\ttest_local \u003d 1;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--timeout_ms\u0022)))\n+\t\ttimeout_ms \u003d (unsigned int)atoi(p);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+#if defined(LWS_SS_USE_SSPC)\n+\tinfo.protocols \u003d lws_sspc_protocols;\n+\t{\n+\t\tconst char *p;\n+\n+\t\t/* connect to ssproxy via UDS by default, else via\n+\t\t * tcp connection to this port */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\t\tinfo.ss_proxy_port \u003d (uint16_t)atoi(p);\n+\n+\t\t/* UDS \u0022proxy.ss.lws\u0022 in abstract namespace, else this socket\n+\t\t * path; when -p given this can specify the network interface\n+\t\t * to bind to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\t\tinfo.ss_proxy_bind \u003d p;\n+\n+\t\t/* if -p given, -a specifies the proxy address to connect to */\n+\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-a\u0022)))\n+\t\t\tinfo.ss_proxy_address \u003d p;\n+\t}\n+#else\n+\tinfo.pss_policies_json \u003d default_ss_policy;\n+\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n+\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW |\n+\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+#endif\n+\n+#if defined(LWS_WITH_MBEDTLS)\n+\n+\t/* uncomment to force mbedtls to load a system trust store like\n+\t * openssl does\n+\t *\n+\t * info.mbedtls_client_preload_filepath \u003d\n+\t *\t\t\u0022/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem\u0022;\n+\t */\n+#endif\n+\n+\t/* integrate us with lws system state management when context created */\n+\n+\tnl.name \u003d \u0022app\u0022;\n+\tnl.notify_cb \u003d app_system_state_nf;\n+\tinfo.register_notifier_list \u003d app_notifier_list;\n+\n+\n+#if defined(LWS_WITH_SYS_METRICS)\n+\tinfo.system_ops \u003d \u0026system_ops;\n+\tinfo.metrics_prefix \u003d \u0022ssmex\u0022;\n+#endif\n+\n+\t/* create the context */\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\tgoto bail;\n+\t}\n+\n+#if !defined(LWS_SS_USE_SSPC)\n+\t/*\n+\t * If we're being a proxied client, the proxy does all this\n+\t */\n+\n+\t/*\n+\t * Set the related lws_system blobs\n+\t *\n+\t * ...direct_set() sets a pointer, so the thing pointed to has to have\n+\t * a suitable lifetime, eg, something that already exists on the heap or\n+\t * a const string in .rodata like this\n+\t */\n+\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_SERIAL, 0),\n+\t\t\t\t (const uint8_t *)\u0022SN12345678\u0022, 10);\n+\tlws_system_blob_direct_set(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_FW_VERSION, 0),\n+\t\t\t\t (const uint8_t *)\u0022v0.01\u0022, 5);\n+\n+\t/*\n+\t * ..._heap_append() appends to a buflist kind of arrangement on heap,\n+\t * just one block is fine, otherwise it will concatenate the fragments\n+\t * in the order they were appended (and take care of freeing them at\n+\t * context destroy time). ..._heap_empty() is also available to remove\n+\t * everything that was already allocated.\n+\t *\n+\t * Here we use _heap_append() just so it's tested as well as direct set.\n+\t */\n+\n+\tlws_system_blob_heap_append(lws_system_get_blob(context,\n+\t\t\t\t LWS_SYSBLOB_TYPE_DEVICE_TYPE, 0),\n+\t\t\t\t (const uint8_t *)\u0022spacerocket\u0022, 11);\n+#endif\n+\n+\t/* the event loop */\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+bail:\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n+\t\texpected \u003d atoi(p);\n+\n+\tif (bad \u003d\u003d expected) {\n+\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, expected);\n+\t\treturn 0;\n+\t} else\n+\t\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, bad, expected);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-client/README.md b/minimal-examples-lowlevel/ws-client/README.md\nnew file mode 100644\nindex 0000000..9d2ce07\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/README.md\n@@ -0,0 +1,9 @@\n+|name|demonstrates|\n+---|---\n+minimal-ws-client|Simple client that connects to libwebsockets.org dumb increment protocol and demonstrates retry and backoff\n+minimal-ws-client-echo|Simple client that connects to a ws server and echos anything the server sends\n+minimal-ws-client-ping|Ws ping test client\n+minimal-ws-client-pmd-bulk|Client that sends bulk multifragment data to the minimal-ws-server-pmd-bulk example\n+minimal-ws-client-rx|Connects to the dumb-increment-protocol wss server at https://libwebsockets.org and demonstrates receiving ws data\n+minimal-ws-client-spam|Spams ws connections in parallel to a server for stability testing\n+minimal-ws-client-tx|Connects to the minimal-ws-broker example as a publisher, demonstrating sending ws data\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/CMakeLists.txt\nnew file mode 100644\nindex 0000000..d3ccf8c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-ws-client-binance C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client-binance)\n+set(SRCS main.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/README.md\nnew file mode 100644\nindex 0000000..7809a0b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/README.md\n@@ -0,0 +1,67 @@\n+# lws minimal ws client binance\n+\n+This connects to the binance ws server and monitors transactions with\n+an eye on low latency.\n+\n+Latency seems to be associated with server-side coalescing at tls\n+layer, and the coalescing at server side seems somewhat correlated to number\n+of transactions per second, which seems to cause increased packet sizes from the\n+server as a reaction. The relationship is more complex probably according to what\n+actually happens at the server backend, but it seems to be broadly related\n+reliably.\n+\n+Typically when showing low latency at ~70msg/s, the messages on the wire are\n+eg, ~70 byte packets containing small tls records\n+\n+10:14:40.682293 IP ec2-54-249-113-172.ap-northeast-1.compute.amazonaws.com.https \u003e constance.42952: Flags [P.], seq 50846:50927, ack 1, win 11, options [nop,nop,TS val 366445630 ecr 3893437035], length 81\n+\n+under pressure from increased messages per second, the tls records increase above 2KB\n+\n+08:06:02.825160 IP ec2-54-249-113-172.ap-northeast-1.compute.amazonaws.com.https \u003e constance.42688: Flags [.], seq 512319:513643, ack 1, win 11, options [nop,nop,TS val 3990208942 ecr 3885719233], length 1324\n+08:06:02.825290 IP constance.42688 \u003e ec2-54-249-113-172.ap-northeast-1.compute.amazonaws.com.https: Flags [.], ack 513643, win 14248, options [nop,nop,TS val 3885719479 ecr 3990208942], length 0\n+08:06:02.891646 IP ec2-54-249-113-172.ap-northeast-1.compute.amazonaws.com.https \u003e constance.42688: Flags [.], seq 513643:516291, ack 1, win 11, options [nop,nop,TS val 3990209006 ecr 3885719296], length 2648\n+\n+The larger the packets, the longer the first item in the packet had to\n+wait before it was sent, and a tls record cannot be authenticated until\n+all of it has been received.\n+\n+The example circumvents this somewhat by using `permessage_deflate`, which reduces\n+the packet size before tls by applying compression, making even coalesced packets\n+smaller, and a new option for adjusting how lws manages conflicting requirements to\n+clear pending rx and allow interleaved tx, `LCCSCF_PRIORITIZE_READS` that causes the\n+stream to prioritize handling any pending rx, not just pending at ssl layer, in one\n+event loop trip.\n+\n+## build\n+\n+Lws must have been built with `LWS_ROLE_WS\u003d1` and `LWS_WITHOUT_EXTENSIONS\u003d0`\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+\n+## usage\n+\n+```\n+$ ./bin/lws-minimal-ws-client-binance \n+[2020/08/23 10:22:49:3003] U: LWS minimal binance client\n+[2020/08/23 10:22:49:3005] N: LWS: 4.0.99-v4.1.0-rc2-4-g3cf133aef, loglevel 1031\n+[2020/08/23 10:22:49:3005] N: NET CLI SRV H1 H2 WS MQTT SS-JSON-POL SSPROX ASYNC_DNS IPv6-absent\n+[2020/08/23 10:22:50:8243] N: checking client ext permessage-deflate\n+[2020/08/23 10:22:50:8244] N: instantiating client ext permessage-deflate\n+[2020/08/23 10:22:50:8244] U: callback_minimal: established\n+[2020/08/23 10:22:51:8244] N: sul_hz_cb: price: min: 1160284¢, max: 1163794¢, avg: 1160516¢, (150 prices/s)\n+[2020/08/23 10:22:51:8245] N: sul_hz_cb: elatency: min: 112ms, max: 547ms, avg: 259ms, (155 msg/s)\n+[2020/08/23 10:22:52:8244] N: sul_hz_cb: price: min: 1160287¢, max: 1178845¢, avg: 1160897¢, (112 prices/s)\n+[2020/08/23 10:22:52:8245] N: sul_hz_cb: elatency: min: 111ms, max: 226ms, avg: 152ms, (134 msg/s)\n+[2020/08/23 10:22:53:8247] N: sul_hz_cb: price: min: 1160287¢, max: 1168005¢, avg: 1160806¢, (86 prices/s)\n+[2020/08/23 10:22:53:8248] N: sul_hz_cb: elatency: min: 112ms, max: 476ms, avg: 287ms, (101 msg/s)\n+[2020/08/23 10:22:54:8247] N: sul_hz_cb: price: min: 1160284¢, max: 1162780¢, avg: 1160698¢, (71 prices/s)\n+...\n+```\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/main.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/main.c\nnew file mode 100644\nindex 0000000..152d393\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/main.c\n@@ -0,0 +1,382 @@\n+/*\n+ * lws-minimal-ws-client-binance\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ * Kutoga \u003ckutoga@user.github.invalid\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a ws client that connects to binance ws server efficiently\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cctype.h\u003e\n+\n+typedef struct range {\n+\tuint64_t\t\tsum;\n+\tuint64_t\t\tlowest;\n+\tuint64_t\t\thighest;\n+\n+\tunsigned int\t\tsamples;\n+} range_t;\n+\n+/*\n+ * This represents your object that \u0022contains\u0022 the client connection and has\n+ * the client connection bound to it\n+ */\n+\n+static struct my_conn {\n+\tlws_sorted_usec_list_t\tsul;\t /* schedule connection retry */\n+\tlws_sorted_usec_list_t\tsul_hz;\t /* 1hz summary */\n+\n+\trange_t\t\t\te_lat_range;\n+\trange_t\t\t\tprice_range;\n+\n+\tstruct lws\t\t*wsi;\t /* related wsi if any */\n+\tuint16_t\t\tretry_count; /* count of consequetive retries */\n+} mco;\n+\n+static struct lws_context *context;\n+static int interrupted;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+/*\n+ * OpenSSL uses the system trust store. mbedTLS / WolfSSL have to be told which\n+ * CA to trust explicitly.\n+ */\n+static const char * const ca_pem_digicert_global_root \u003d\n+\t\u0022-----BEGIN CERTIFICATE-----\u005cn\u0022\n+\t\u0022MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\u005cn\u0022\n+\t\u0022MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\u005cn\u0022\n+\t\u0022d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\u005cn\u0022\n+\t\u0022QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\u005cn\u0022\n+\t\u0022MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\u005cn\u0022\n+\t\u0022b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\u005cn\u0022\n+\t\u00229w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\u005cn\u0022\n+\t\u0022CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\u005cn\u0022\n+\t\u0022nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\u005cn\u0022\n+\t\u002243C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\u005cn\u0022\n+\t\u0022T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\u005cn\u0022\n+\t\u0022gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\u005cn\u0022\n+\t\u0022BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\u005cn\u0022\n+\t\u0022TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\u005cn\u0022\n+\t\u0022DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\u005cn\u0022\n+\t\u0022hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\u005cn\u0022\n+\t\u002206O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\u005cn\u0022\n+\t\u0022PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\u005cn\u0022\n+\t\u0022YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\u005cn\u0022\n+\t\u0022CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4\u003d\u005cn\u0022\n+\t\u0022-----END CERTIFICATE-----\u005cn\u0022;\n+#endif\n+\n+/*\n+ * The retry and backoff policy we want to use for our client connections\n+ */\n+\n+static const uint32_t backoff_ms[] \u003d { 1000, 2000, 3000, 4000, 5000 };\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.retry_ms_table\t\t\t\u003d backoff_ms,\n+\t.retry_ms_table_count\t\t\u003d LWS_ARRAY_SIZE(backoff_ms),\n+\t.conceal_count\t\t\t\u003d LWS_ARRAY_SIZE(backoff_ms),\n+\n+\t.secs_since_valid_ping\t\t\u003d 400, /* force PINGs after secs idle */\n+\t.secs_since_valid_hangup\t\u003d 400, /* hangup after secs idle */\n+\n+\t.jitter_percent\t\t\t\u003d 0,\n+};\n+\n+/*\n+ * If we don't enable permessage-deflate ws extension, during times when there\n+ * are many ws messages per second the server coalesces them inside a smaller\n+ * number of larger ssl records, for \u003e100 mps typically \u003e2048 records.\n+ *\n+ * This is a problem, because the coalesced record cannot be send nor decrypted\n+ * until the last part of the record is received, meaning additional latency\n+ * for the earlier members of the coalesced record that have just been sitting\n+ * there waiting for the last one to go out and be decrypted.\n+ *\n+ * permessage-deflate reduces the data size before the tls layer, for \u003e100mps\n+ * reducing the colesced records to ~1.2KB.\n+ */\n+\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022,\n+\t\tlws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022\n+\t\t \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+/*\n+ * Scheduled sul callback that starts the connection attempt\n+ */\n+\n+static void\n+connect_client(lws_sorted_usec_list_t *sul)\n+{\n+\tstruct my_conn *mco \u003d lws_container_of(sul, struct my_conn, sul);\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\n+\ti.context \u003d context;\n+\ti.port \u003d 443;\n+\ti.address \u003d \u0022fstream.binance.com\u0022;\n+\ti.path \u003d \u0022/stream?\u0022\n+\t\t \u0022streams\u003dbtcusdt@depth@0ms/btcusdt@bookTicker/btcusdt@aggTrade\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.ssl_connection \u003d LCCSCF_USE_SSL | LCCSCF_PRIORITIZE_READS;\n+\ti.protocol \u003d NULL;\n+\ti.local_protocol_name \u003d \u0022lws-minimal-client\u0022;\n+\ti.pwsi \u003d \u0026mco-\u003ewsi;\n+\ti.retry_and_idle_policy \u003d \u0026retry;\n+\ti.userdata \u003d mco;\n+\n+\tif (!lws_client_connect_via_info(\u0026i))\n+\t\t/*\n+\t\t * Failed... schedule a retry... we can't use the _retry_wsi()\n+\t\t * convenience wrapper api here because no valid wsi at this\n+\t\t * point.\n+\t\t */\n+\t\tif (lws_retry_sul_schedule(context, 0, sul, \u0026retry,\n+\t\t\t\t\t connect_client, \u0026mco-\u003eretry_count)) {\n+\t\t\tlwsl_err(\u0022%s: connection attempts exhausted\u005cn\u0022, __func__);\n+\t\t\tinterrupted \u003d 1;\n+\t\t}\n+}\n+\n+static void\n+range_reset(range_t *r)\n+{\n+\tr-\u003esum \u003d r-\u003ehighest \u003d 0;\n+\tr-\u003elowest \u003d 999999999999ull;\n+\tr-\u003esamples \u003d 0;\n+}\n+\n+static uint64_t\n+get_us_timeofday(void)\n+{\n+\tstruct timeval tv;\n+\n+\tgettimeofday(\u0026tv, NULL);\n+\n+\treturn (uint64_t)((lws_usec_t)tv.tv_sec * LWS_US_PER_SEC) + (uint64_t)tv.tv_usec;\n+}\n+\n+static void\n+sul_hz_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tstruct my_conn *mco \u003d lws_container_of(sul, struct my_conn, sul_hz);\n+\n+\t/*\n+\t * We are called once a second to dump statistics on the connection\n+\t */\n+\n+\tlws_sul_schedule(lws_get_context(mco-\u003ewsi), 0, \u0026mco-\u003esul_hz,\n+\t\t\t sul_hz_cb, LWS_US_PER_SEC);\n+\n+\tif (mco-\u003eprice_range.samples)\n+\t\tlwsl_notice(\u0022%s: price: min: %llu¢, max: %llu¢, avg: %llu¢, \u0022\n+\t\t\t \u0022(%d prices/s)\u005cn\u0022,\n+\t\t\t __func__,\n+\t\t\t (unsigned long long)mco-\u003eprice_range.lowest,\n+\t\t\t (unsigned long long)mco-\u003eprice_range.highest,\n+\t\t\t (unsigned long long)(mco-\u003eprice_range.sum / mco-\u003eprice_range.samples),\n+\t\t\t mco-\u003eprice_range.samples);\n+\tif (mco-\u003ee_lat_range.samples)\n+\t\tlwsl_notice(\u0022%s: elatency: min: %llums, max: %llums, \u0022\n+\t\t\t \u0022avg: %llums, (%d msg/s)\u005cn\u0022, __func__,\n+\t\t\t (unsigned long long)mco-\u003ee_lat_range.lowest / 1000,\n+\t\t\t (unsigned long long)mco-\u003ee_lat_range.highest / 1000,\n+\t\t\t (unsigned long long)(mco-\u003ee_lat_range.sum /\n+\t\t\t\t\t mco-\u003ee_lat_range.samples) / 1000,\n+\t\t\t mco-\u003ee_lat_range.samples);\n+\n+\trange_reset(\u0026mco-\u003ee_lat_range);\n+\trange_reset(\u0026mco-\u003eprice_range);\n+}\n+\n+static uint64_t\n+pennies(const char *s)\n+{\n+\tuint64_t price \u003d (uint64_t)atoll(s) * 100;\n+\n+\ts \u003d strchr(s, '.');\n+\n+\tif (s \u0026\u0026 isdigit(s[1]) \u0026\u0026 isdigit(s[2]))\n+\t\tprice \u003d price + (uint64_t)((10 * (s[1] - '0')) + (s[2] - '0'));\n+\n+\treturn price;\n+}\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t void *user, void *in, size_t len)\n+{\n+\tstruct my_conn *mco \u003d (struct my_conn *)user;\n+\tuint64_t latency_us, now_us;\n+\tuint64_t price;\n+\tchar numbuf[16];\n+\tconst char *p;\n+\tsize_t alen;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tgoto do_retry;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n+\t\t/*\n+\t\t * The messages are a few 100 bytes of JSON each\n+\t\t */\n+\n+\t\t// lwsl_hexdump_notice(in, len);\n+\n+\t\tnow_us \u003d (uint64_t)get_us_timeofday();\n+\n+\t\tp \u003d lws_json_simple_find((const char *)in, len,\n+\t\t\t\t\t \u0022\u005c\u0022depthUpdate\u005c\u0022\u0022, \u0026alen);\n+\t\t/*\n+\t\t * Only the JSON with depthUpdate init has the numbers we care\n+\t\t * about as well\n+\t\t */\n+\t\tif (!p)\n+\t\t\tbreak;\n+\n+\t\tp \u003d lws_json_simple_find((const char *)in, len, \u0022\u005c\u0022E\u005c\u0022:\u0022, \u0026alen);\n+\t\tif (!p) {\n+\t\t\tlwsl_err(\u0022%s: no E JSON\u005cn\u0022, __func__);\n+\t\t\tbreak;\n+\t\t}\n+\t\tlws_strnncpy(numbuf, p, alen, sizeof(numbuf));\n+\t\tlatency_us \u003d now_us -\n+\t\t\t\t((uint64_t)atoll(numbuf) * LWS_US_PER_MS);\n+\n+\t\tif (latency_us \u003c mco-\u003ee_lat_range.lowest)\n+\t\t\tmco-\u003ee_lat_range.lowest \u003d latency_us;\n+\t\tif (latency_us \u003e mco-\u003ee_lat_range.highest)\n+\t\t\tmco-\u003ee_lat_range.highest \u003d latency_us;\n+\n+\t\tmco-\u003ee_lat_range.sum +\u003d latency_us;\n+\t\tmco-\u003ee_lat_range.samples++;\n+\n+\t\tp \u003d lws_json_simple_find((const char *)in, len,\n+\t\t\t\t\t \u0022\u005c\u0022a\u005c\u0022:[[\u005c\u0022\u0022, \u0026alen);\n+\t\tif (p) {\n+\t\t\tlws_strnncpy(numbuf, p, alen, sizeof(numbuf));\n+\t\t\tprice \u003d pennies(numbuf);\n+\n+\t\t\tif (price \u003c mco-\u003eprice_range.lowest)\n+\t\t\t\tmco-\u003eprice_range.lowest \u003d price;\n+\t\t\tif (price \u003e mco-\u003eprice_range.highest)\n+\t\t\t\tmco-\u003eprice_range.highest \u003d price;\n+\n+\t\t\tmco-\u003eprice_range.sum +\u003d price;\n+\t\t\tmco-\u003eprice_range.samples++;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: established\u005cn\u0022, __func__);\n+\t\tlws_sul_schedule(lws_get_context(wsi), 0, \u0026mco-\u003esul_hz,\n+\t\t\t\t sul_hz_cb, LWS_US_PER_SEC);\n+\t\tmco-\u003ewsi \u003d wsi;\n+\t\trange_reset(\u0026mco-\u003ee_lat_range);\n+\t\trange_reset(\u0026mco-\u003eprice_range);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tlws_sul_cancel(\u0026mco-\u003esul_hz);\n+\t\tgoto do_retry;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+\n+do_retry:\n+\t/*\n+\t * retry the connection to keep it nailed up\n+\t *\n+\t * For this example, we try to conceal any problem for one set of\n+\t * backoff retries and then exit the app.\n+\t *\n+\t * If you set retry.conceal_count to be larger than the number of\n+\t * elements in the backoff table, it will never give up and keep\n+\t * retrying at the last backoff delay plus the random jitter amount.\n+\t */\n+\tif (lws_retry_sul_schedule_retry_wsi(wsi, \u0026mco-\u003esul, connect_client,\n+\t\t\t\t\t \u0026mco-\u003eretry_count)) {\n+\t\tlwsl_err(\u0022%s: connection attempts exhausted\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{ \u0022lws-minimal-client\u0022, callback_minimal, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal binance client\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\tinfo.extensions \u003d extensions;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS / WolfSSL have to be\n+\t * told which CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_mem \u003d ca_pem_digicert_global_root;\n+\tinfo.client_ssl_ca_mem_len \u003d (unsigned int)strlen(ca_pem_digicert_global_root);\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* schedule the first client connection attempt to happen immediately */\n+\tlws_sul_schedule(context, 0, \u0026mco.sul, connect_client, 1);\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed\u005cn\u0022);\n+\n+\treturn 0;\n+}\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/CMakeLists.txt\nnew file mode 100644\nindex 0000000..4e88dbc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-client-echo C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client-echo)\n+set(SRCS minimal-ws-client-echo.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/README.md\nnew file mode 100644\nindex 0000000..5153896\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/README.md\n@@ -0,0 +1,37 @@\n+# lws minimal ws client + permessage-deflate echo\n+\n+This example opens a ws client connection to localhost:7681 and\n+echoes back anything that comes from the server.\n+\n+You can use it for testing lws against Autobahn.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-p port|Port to connect to\n+-u url|URL path part to connect to\n+-o|Finish after one connection\n+--ssl|Open client connection with ssl\n+-i \u003ciface\u003e|Bind the client connection to interface iface\n+\n+```\n+ $ ./lws-minimal-ws-client-echo\n+[2018/04/22 20:03:50:2343] USER: LWS minimal ws client echo + permessage-deflate + multifragment bulk message\n+[2018/04/22 20:03:50:2344] USER: lws-minimal-ws-client-echo [-n (no exts)] [-u url] [-o (once)]\n+[2018/04/22 20:03:50:2344] USER: options 0\n+[2018/04/22 20:03:50:2345] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+[2018/04/22 20:03:51:2356] USER: connecting to localhost:9001//runCase?case\u003d362\u0026agent\u003dlibwebsockets\n+[2018/04/22 20:03:51:2385] NOTICE: checking client ext permessage-deflate\n+[2018/04/22 20:03:51:2386] NOTICE: instantiating client ext permessage-deflate\n+[2018/04/22 20:03:51:2386] USER: LWS_CALLBACK_CLIENT_ESTABLISHED\n+...\n+```\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/minimal-ws-client-echo.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/minimal-ws-client-echo.c\nnew file mode 100644\nindex 0000000..285d17f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/minimal-ws-client-echo.c\n@@ -0,0 +1,172 @@\n+/*\n+ * lws-minimal-ws-client-echo\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a ws client that echoes back what it was sent, in a\n+ * way compatible with autobahn -m fuzzingserver\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal_client_echo.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL_CLIENT_ECHO,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static struct lws_context *context;\n+static int interrupted, port \u003d 7681, options \u003d 0;\n+static const char *url \u003d \u0022/\u0022, *ads \u003d \u0022localhost\u0022, *iface \u003d NULL;\n+\n+/* pass pointers to shared vars to the protocol */\n+\n+static const struct lws_protocol_vhost_options pvo_iface \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022iface\u0022,\t\t/* pvo name */\n+\t(void *)\u0026iface\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo_ads \u003d {\n+\t\u0026pvo_iface,\n+\tNULL,\n+\t\u0022ads\u0022,\t\t/* pvo name */\n+\t(void *)\u0026ads\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo_url \u003d {\n+\t\u0026pvo_ads,\n+\tNULL,\n+\t\u0022url\u0022,\t\t/* pvo name */\n+\t(void *)\u0026url\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo_options \u003d {\n+\t\u0026pvo_url,\n+\tNULL,\n+\t\u0022options\u0022,\t\t/* pvo name */\n+\t(void *)\u0026options\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo_port \u003d {\n+\t\u0026pvo_options,\n+\tNULL,\n+\t\u0022port\u0022,\t\t/* pvo name */\n+\t(void *)\u0026port\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo_interrupted \u003d {\n+\t\u0026pvo_port,\n+\tNULL,\n+\t\u0022interrupted\u0022,\t\t/* pvo name */\n+\t(void *)\u0026interrupted\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_interrupted,\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-minimal-client-echo\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t/* ignored */\n+};\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022,\n+\t\tlws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022\n+\t\t \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws client echo + permessage-deflate + multifragment bulk message\u005cn\u0022);\n+\tlwsl_user(\u0022 lws-minimal-ws-client-echo [-n (no exts)] [-u url] [-p port] [-o (once)]\u005cn\u0022);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-u\u0022)))\n+\t\turl \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\tport \u003d atoi(p);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-o\u0022))\n+\t\toptions |\u003d 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--ssl\u0022))\n+\t\toptions |\u003d 2;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022)))\n+\t\tads \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n+\t\tiface \u003d p;\n+\n+\tlwsl_user(\u0022options %d, ads %s\u005cn\u0022, options, ads);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+\tif (!lws_cmdline_option(argc, argv, \u0022-n\u0022))\n+\t\tinfo.extensions \u003d extensions;\n+\tinfo.pt_serv_buf_size \u003d 32 * 1024;\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n+\t\t LWS_SERVER_OPTION_VALIDATE_UTF8;\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--libuv\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_LIBUV;\n+\telse\n+\t\tsignal(SIGINT, sigint_handler);\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (!lws_service(context, 0) \u0026\u0026 !interrupted)\n+\t\t;\n+\n+\tlws_context_destroy(context);\n+\n+\tn \u003d (options \u0026 1) ? interrupted !\u003d 2 : interrupted \u003d\u003d 3;\n+\tlwsl_user(\u0022Completed %d %s\u005cn\u0022, interrupted, !n ? \u0022OK\u0022 : \u0022failed\u0022);\n+\n+\treturn n;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/protocol_lws_minimal_client_echo.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/protocol_lws_minimal_client_echo.c\nnew file mode 100644\nindex 0000000..629ad70\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/protocol_lws_minimal_client_echo.c\n@@ -0,0 +1,283 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal-client-echo\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The protocol shows how to send and receive bulk messages over a ws connection\n+ * that optionally may have the permessage-deflate extension negotiated on it.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+#define RING_DEPTH 1024\n+\n+/* one of these created for each message */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+\tchar binary;\n+\tchar first;\n+\tchar final;\n+};\n+\n+struct per_session_data__minimal_client_echo {\n+\tstruct lws_ring *ring;\n+\tuint32_t tail;\n+\tchar flow_controlled;\n+\tuint8_t completed:1;\n+\tuint8_t write_consume_pending:1;\n+};\n+\n+struct vhd_minimal_client_echo {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tstruct lws *client_wsi;\n+\n+\tlws_sorted_usec_list_t sul;\n+\n+\tint *interrupted;\n+\tint *options;\n+\tconst char **url;\n+\tconst char **ads;\n+\tconst char **iface;\n+\tint *port;\n+};\n+\n+static void\n+sul_connect_attempt(struct lws_sorted_usec_list *sul)\n+{\n+\tstruct vhd_minimal_client_echo *vhd \u003d\n+\t\tlws_container_of(sul, struct vhd_minimal_client_echo, sul);\n+\tstruct lws_client_connect_info i;\n+\tchar host[128];\n+\n+\tlws_snprintf(host, sizeof(host), \u0022%s:%u\u0022, *vhd-\u003eads, *vhd-\u003eport);\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\n+\ti.context \u003d vhd-\u003econtext;\n+\ti.port \u003d *vhd-\u003eport;\n+\ti.address \u003d *vhd-\u003eads;\n+\ti.path \u003d *vhd-\u003eurl;\n+\ti.host \u003d host;\n+\ti.origin \u003d host;\n+\ti.ssl_connection \u003d 0;\n+\tif ((*vhd-\u003eoptions) \u0026 2)\n+\t\ti.ssl_connection |\u003d LCCSCF_USE_SSL;\n+\ti.vhost \u003d vhd-\u003evhost;\n+\ti.iface \u003d *vhd-\u003eiface;\n+\t//i.protocol \u003d ;\n+\ti.pwsi \u003d \u0026vhd-\u003eclient_wsi;\n+\n+\tlwsl_user(\u0022connecting to %s:%d/%s\u005cn\u0022, i.address, i.port, i.path);\n+\n+\tif (!lws_client_connect_via_info(\u0026i))\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, 10 * LWS_US_PER_SEC);\n+}\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+static int\n+callback_minimal_client_echo(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal_client_echo *pss \u003d\n+\t\t\t(struct per_session_data__minimal_client_echo *)user;\n+\tstruct vhd_minimal_client_echo *vhd \u003d (struct vhd_minimal_client_echo *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct msg *pmsg;\n+\tstruct msg amsg;\n+\tint n, m, flags;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct vhd_minimal_client_echo));\n+\t\tif (!vhd)\n+\t\t\treturn -1;\n+\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\t/* get the pointer to \u0022interrupted\u0022 we were passed in pvo */\n+\t\tvhd-\u003einterrupted \u003d (int *)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022interrupted\u0022)-\u003evalue;\n+\t\tvhd-\u003eport \u003d (int *)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022port\u0022)-\u003evalue;\n+\t\tvhd-\u003eoptions \u003d (int *)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022options\u0022)-\u003evalue;\n+\t\tvhd-\u003eads \u003d (const char **)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022ads\u0022)-\u003evalue;\n+\t\tvhd-\u003eurl \u003d (const char **)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022url\u0022)-\u003evalue;\n+\t\tvhd-\u003eiface \u003d (const char **)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022iface\u0022)-\u003evalue;\n+\n+\t\tsul_connect_attempt(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tlws_sul_cancel(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_ESTABLISHED\u005cn\u0022);\n+\t\tpss-\u003ering \u003d lws_ring_create(sizeof(struct msg), RING_DEPTH,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!pss-\u003ering)\n+\t\t\treturn 1;\n+\t\tpss-\u003etail \u003d 0;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_WRITEABLE:\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_WRITEABLE\u005cn\u0022);\n+\n+\t\tif (pss-\u003ewrite_consume_pending) {\n+\t\t\t/* perform the deferred fifo consume */\n+\t\t\tlws_ring_consume_single_tail(pss-\u003ering, \u0026pss-\u003etail, 1);\n+\t\t\tpss-\u003ewrite_consume_pending \u003d 0;\n+\t\t}\n+\t\tpmsg \u003d lws_ring_get_element(pss-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg) {\n+\t\t\tlwsl_user(\u0022 (nothing in ring)\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tflags \u003d lws_write_ws_flags(\n+\t\t\t pmsg-\u003ebinary ? LWS_WRITE_BINARY : LWS_WRITE_TEXT,\n+\t\t\t pmsg-\u003efirst, pmsg-\u003efinal);\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) +\n+\t\t\t LWS_PRE, pmsg-\u003elen, (enum lws_write_protocol)flags);\n+\t\tif (m \u003c (int)pmsg-\u003elen) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlwsl_user(\u0022 wrote %d: flags: 0x%x first: %d final %d\u005cn\u0022,\n+\t\t\t\tm, flags, pmsg-\u003efirst, pmsg-\u003efinal);\n+\n+\t\tif ((*vhd-\u003eoptions \u0026 1) \u0026\u0026 pmsg \u0026\u0026 pmsg-\u003efinal)\n+\t\t\tpss-\u003ecompleted \u003d 1;\n+\n+\t\t/*\n+\t\t * Workaround deferred deflate in pmd extension by only\n+\t\t * consuming the fifo entry when we are certain it has been\n+\t\t * fully deflated at the next WRITABLE callback. You only need\n+\t\t * this if you're using pmd.\n+\t\t */\n+\t\tpss-\u003ewrite_consume_pending \u003d 1;\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\tif (pss-\u003eflow_controlled \u0026\u0026\n+\t\t (int)lws_ring_get_count_free_elements(pss-\u003ering) \u003e RING_DEPTH - 5) {\n+\t\t\tlws_rx_flow_control(wsi, 1);\n+\t\t\tpss-\u003eflow_controlled \u003d 0;\n+\t\t}\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_RECEIVE: %4d (rpp %5d, first %d, last %d, bin %d)\u005cn\u0022,\n+\t\t\t(int)len, (int)lws_remaining_packet_payload(wsi),\n+\t\t\tlws_is_first_fragment(wsi),\n+\t\t\tlws_is_final_fragment(wsi),\n+\t\t\tlws_frame_is_binary(wsi));\n+\n+\t\t// lwsl_hexdump_notice(in, len);\n+\n+\t\tamsg.first \u003d (char)lws_is_first_fragment(wsi);\n+\t\tamsg.final \u003d (char)lws_is_final_fragment(wsi);\n+\t\tamsg.binary \u003d (char)lws_frame_is_binary(wsi);\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(pss-\u003ering);\n+\t\tif (!n) {\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tamsg.len \u003d len;\n+\t\t/* notice we over-allocate by LWS_PRE */\n+\t\tamsg.payload \u003d malloc(LWS_PRE + len);\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmemcpy((char *)amsg.payload + LWS_PRE, in, len);\n+\t\tif (!lws_ring_insert(pss-\u003ering, \u0026amsg, 1)) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\tif (!pss-\u003eflow_controlled \u0026\u0026 n \u003c 3) {\n+\t\t\tpss-\u003eflow_controlled \u003d 1;\n+\t\t\tlws_rx_flow_control(wsi, 0);\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tvhd-\u003eclient_wsi \u003d NULL;\n+\t\tif (!*vhd-\u003einterrupted)\n+\t\t\t*vhd-\u003einterrupted \u003d 3;\n+\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_CLOSED\u005cn\u0022);\n+\t\tlws_ring_destroy(pss-\u003ering);\n+\t\tvhd-\u003eclient_wsi \u003d NULL;\n+\t\tif (!*vhd-\u003einterrupted)\n+\t\t\t*vhd-\u003einterrupted \u003d 1 + pss-\u003ecompleted;\n+\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL_CLIENT_ECHO \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal-client-echo\u0022, \u005c\n+\t\tcallback_minimal_client_echo, \u005c\n+\t\tsizeof(struct per_session_data__minimal_client_echo), \u005c\n+\t\t1024, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/CMakeLists.txt\nnew file mode 100644\nindex 0000000..976f468\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-ws-client-ping C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client-ping)\n+set(SRCS minimal-ws-client-ping.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/README.md\nnew file mode 100644\nindex 0000000..4cfc0ec\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/README.md\n@@ -0,0 +1,117 @@\n+# lws minimal ws client PING\n+\n+This connects to libwebsockets.org using the lws-mirror-protocol.\n+\n+It sets a validity regime of testing validity with PING every 3s and failing\n+if it didn't get the PONG back within 10s.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity (you want 1039 to see the validity ping / pong)\n+--server|Use a specific server instead of libwebsockets.org, eg `--server localhost`. Implies LCCSCF_ALLOW_SELFSIGNED\n+--port|Use a specific port instead of 443, eg `--port 7681`\n+--protocol|Use a specific ws subprotocol rather than lws-mirror-protocol, eg, `--protocol myprotocol`\n+\n+\n+## usage\n+\n+Just run it, wait for the connect and then there will be PINGs sent\n+at 5s intervals.\n+\n+```\n+ $ ./lws-minimal-ws-client-ping -d1039\n+[2020/03/18 13:13:47:1114] U: LWS minimal ws client PING\n+[2020/03/18 13:13:47:1503] I: Initial logging level 1039\n+[2020/03/18 13:13:47:1507] I: Libwebsockets version: 4.0.99 v4.0.0-20-gc6165f868\n+[2020/03/18 13:13:47:1508] I: IPV6 not compiled in\n+[2020/03/18 13:13:47:1512] I: LWS_DEF_HEADER_LEN : 4096\n+[2020/03/18 13:13:47:1514] I: LWS_MAX_SMP : 1\n+[2020/03/18 13:13:47:1519] I: sizeof (*info) : 720\n+[2020/03/18 13:13:47:1520] I: SYSTEM_RANDOM_FILEPATH: '/dev/urandom'\n+[2020/03/18 13:13:47:1522] I: HTTP2 support : available\n+[2020/03/18 13:13:47:1552] N: lws_create_context: using ss proxy bind '(null)', port 0, ads '(null)'\n+[2020/03/18 13:13:47:1557] I: context created\n+[2020/03/18 13:13:47:1575] I: Using event loop: poll\n+[2020/03/18 13:13:47:1583] I: Default ALPN advertisment: h2,http/1.1\n+[2020/03/18 13:13:47:1585] I: default timeout (secs): 20\n+[2020/03/18 13:13:47:1614] I: Threads: 1 each 5 fds\n+[2020/03/18 13:13:47:1623] I: mem: context: 8152 B (4056 ctx + (1 thr x 4096))\n+[2020/03/18 13:13:47:1625] I: mem: http hdr size: (4096 + 976), max count 5\n+[2020/03/18 13:13:47:1629] I: mem: pollfd map: 40 B\n+[2020/03/18 13:13:47:1633] I: mem: platform fd map: 40 B\n+[2020/03/18 13:13:47:1692] I: Compiled with OpenSSL support\n+[2020/03/18 13:13:47:1695] I: Doing SSL library init\n+[2020/03/18 13:13:47:3103] I: canonical_hostname \u003d constance\n+[2020/03/18 13:13:47:3140] I: Creating Vhost 'default' (serving disabled), 4 protocols, IPv6 off\n+[2020/03/18 13:13:47:4072] I: lws_tls_client_create_vhost_context: vh default: created new client ctx 0\n+[2020/03/18 13:13:47:7468] I: created client ssl context for default\n+[2020/03/18 13:13:47:7482] I: Creating Vhost 'default' (serving disabled), 4 protocols, IPv6 off\n+[2020/03/18 13:13:47:7490] I: lws_tls_client_create_vhost_context: vh default: reusing client ctx 0: use 2\n+[2020/03/18 13:13:47:7491] I: created client ssl context for default\n+[2020/03/18 13:13:47:7494] I: mem: per-conn: 792 bytes + protocol rx buf\n+[2020/03/18 13:13:47:7497] I: lws_plat_drop_app_privileges: not changing group\n+[2020/03/18 13:13:47:7499] I: lws_plat_drop_app_privileges: not changing user\n+[2020/03/18 13:13:47:7512] I: lws_cancel_service\n+[2020/03/18 13:13:47:7568] I: lws_state_notify_protocol_init: LWS_SYSTATE_CPD_PRE_TIME\n+[2020/03/18 13:13:47:7577] N: lws_ss_create: unknown stream type captive_portal_detect\n+[2020/03/18 13:13:47:7580] I: lws_ss_sys_cpd: Create stream failed (policy?)\n+[2020/03/18 13:13:47:7582] I: lws_state_notify_protocol_init: LWS_SYSTATE_CPD_PRE_TIME\n+[2020/03/18 13:13:47:7582] N: lws_ss_create: unknown stream type captive_portal_detect\n+[2020/03/18 13:13:47:7583] I: lws_ss_sys_cpd: Create stream failed (policy?)\n+[2020/03/18 13:13:47:7585] I: lws_state_notify_protocol_init: doing protocol init on POLICY_VALID\n+[2020/03/18 13:13:47:7588] I: lws_protocol_init\n+[2020/03/18 13:13:47:7623] I: lws_state_transition_steps: CONTEXT_CREATED -\u003e OPERATIONAL\n+[2020/03/18 13:13:47:7628] N: connect_cb: connecting\n+[2020/03/18 13:13:47:7656] I: lws_client_connect_via_info: role binding to h1\n+[2020/03/18 13:13:47:7662] I: lws_client_connect_via_info: protocol binding to lws-ping-test\n+[2020/03/18 13:13:47:7699] I: lws_client_connect_via_info: wsi 0x5669090: h1 lws-ping-test entry\n+[2020/03/18 13:13:47:7720] I: lws_header_table_attach: wsi 0x5669090: ah (nil) (tsi 0, count \u003d 0) in\n+[2020/03/18 13:13:47:7729] I: _lws_create_ah: created ah 0x5669620 (size 4096): pool length 1\n+[2020/03/18 13:13:47:7735] I: lws_header_table_attach: did attach wsi 0x5669090: ah 0x5669620: count 1 (on exit)\n+[2020/03/18 13:13:47:7780] I: lws_client_connect_2_dnsreq: 0x5669090: lookup libwebsockets.org:443\n+[2020/03/18 13:13:47:8784] I: lws_getaddrinfo46: getaddrinfo 'libwebsockets.org' says 0\n+[2020/03/18 13:13:47:8804] I: lws_client_connect_3_connect: libwebsockets.org ipv4 46.105.127.147\n+[2020/03/18 13:13:47:9176] I: lws_client_connect_3_connect: getsockopt check: conn OK\n+[2020/03/18 13:13:47:9179] I: lws_client_connect_3_connect: Connection started 0x5682cc0\n+[2020/03/18 13:13:47:9197] I: lws_client_connect_4_established: wsi 0x5669090: h1 lws-ping-test client created own conn (raw 0) vh defaultm st 0x202\n+[2020/03/18 13:13:47:9418] I: h1 client conn using alpn list 'http/1.1'\n+[2020/03/18 13:13:48:4523] I: lws_role_call_alpn_negotiated: 'http/1.1'\n+[2020/03/18 13:13:48:4531] I: client connect OK\n+[2020/03/18 13:13:48:4543] I: lws_openssl_describe_cipher: wsi 0x5669090: TLS_AES_256_GCM_SHA384, TLS_AES_256_GCM_SHA384, 256 bits, TLSv1.3\n+[2020/03/18 13:13:48:4717] I: lws_client_socket_service: HANDSHAKE2: 0x5669090: sending headers (wsistate 0x10000204), w sock 5\n+[2020/03/18 13:13:48:4992] I: lws_buflist_aware_read: wsi 0x5669090: lws_client_socket_service: ssl_capable_read -4\n+[2020/03/18 13:13:48:5005] I: lws_buflist_aware_read: wsi 0x5669090: lws_client_socket_service: ssl_capable_read 174\n+[2020/03/18 13:13:48:5166] I: __lws_header_table_detach: wsi 0x5669090: ah 0x5669620 (tsi\u003d0, count \u003d 1)\n+[2020/03/18 13:13:48:5171] I: __lws_header_table_detach: nobody usable waiting\n+[2020/03/18 13:13:48:5175] I: _lws_destroy_ah: freed ah 0x5669620 : pool length 0\n+[2020/03/18 13:13:48:5180] I: __lws_header_table_detach: wsi 0x5669090: ah 0x5669620 (tsi\u003d0, count \u003d 0)\n+[2020/03/18 13:13:48:5197] I: _lws_validity_confirmed_role: wsi 0x5669090: setting validity timer 3s (hup 0)\n+[2020/03/18 13:13:48:5208] U: callback_minimal_broker: established\n+[2020/03/18 13:13:51:5218] I: lws_validity_cb: wsi 0x5669090: scheduling validity check\n+[2020/03/18 13:13:51:5325] I: rops_handle_POLLOUT_ws: issuing ping on wsi 0x5669090: ws lws-ping-test h2: 0\n+[2020/03/18 13:13:51:5504] I: lws_issue_raw: ssl_capable_write (6) says 6\n+[2020/03/18 13:13:51:5809] I: lws_ws_client_rx_sm: client 0x5669090 received pong\n+[2020/03/18 13:13:51:5819] I: _lws_validity_confirmed_role: wsi 0x5669090: setting validity timer 3s (hup 0)\n+[2020/03/18 13:13:51:5831] I: Client doing pong callback\n+[2020/03/18 13:13:54:5821] I: lws_validity_cb: wsi 0x5669090: scheduling validity check\n+[2020/03/18 13:13:54:5825] I: rops_handle_POLLOUT_ws: issuing ping on wsi 0x5669090: ws lws-ping-test h2: 0\n+[2020/03/18 13:13:54:5833] I: lws_issue_raw: ssl_capable_write (6) says 6\n+[2020/03/18 13:13:54:6258] I: lws_ws_client_rx_sm: client 0x5669090 received pong\n+[2020/03/18 13:13:54:6261] I: _lws_validity_confirmed_role: wsi 0x5669090: setting validity timer 3s (hup 0)\n+[2020/03/18 13:13:54:6263] I: Client doing pong callback\n+[2020/03/18 13:13:57:6263] I: lws_validity_cb: wsi 0x5669090: scheduling validity check\n+[2020/03/18 13:13:57:6267] I: rops_handle_POLLOUT_ws: issuing ping on wsi 0x5669090: ws lws-ping-test h2: 0\n+[2020/03/18 13:13:57:6275] I: lws_issue_raw: ssl_capable_write (6) says 6\n+[2020/03/18 13:13:58:0034] I: lws_ws_client_rx_sm: client 0x5669090 received pong\n+\n+...\n+```\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/libwebsockets.org.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/libwebsockets.org.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/minimal-ws-client-ping.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/minimal-ws-client-ping.c\nnew file mode 100644\nindex 0000000..fceee13\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/minimal-ws-client-ping.c\n@@ -0,0 +1,162 @@\n+/*\n+ * lws-minimal-ws-client-ping\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates keeping a ws connection validated by the lws validity\n+ * timer stuff without having to do anything in the code. Use debug logging\n+ * -d1039 to see lws doing the pings / pongs in the background.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+static struct lws_context *context;\n+static struct lws *client_wsi;\n+static int interrupted, port \u003d 443, ssl_connection \u003d LCCSCF_USE_SSL;\n+static const char *server_address \u003d \u0022libwebsockets.org\u0022, *pro \u003d \u0022lws-mirror-protocol\u0022;\n+static lws_sorted_usec_list_t sul;\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping \u003d 3,\n+\t.secs_since_valid_hangup \u003d 10,\n+};\n+\n+static void\n+connect_cb(lws_sorted_usec_list_t *_sul)\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\tlwsl_notice(\u0022%s: connecting\u005cn\u0022, __func__);\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\n+\ti.context \u003d context;\n+\ti.port \u003d port;\n+\ti.address \u003d server_address;\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.ssl_connection \u003d ssl_connection;\n+\ti.protocol \u003d pro;\n+\ti.alpn \u003d \u0022h2;http/1.1\u0022;\n+\ti.local_protocol_name \u003d \u0022lws-ping-test\u0022;\n+\ti.pwsi \u003d \u0026client_wsi;\n+\ti.retry_and_idle_policy \u003d \u0026retry;\n+\n+\tif (!lws_client_connect_via_info(\u0026i))\n+\t\tlws_sul_schedule(context, 0, _sul, connect_cb, 5 * LWS_USEC_PER_SEC);\n+}\n+\n+static int\n+callback_minimal_pingtest(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tlws_sul_schedule(context, 0, \u0026sul, connect_cb, 5 * LWS_USEC_PER_SEC);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: established\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022lws-ping-test\u0022,\n+\t\tcallback_minimal_pingtest,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws client PING\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./libwebsockets.org.cer\u0022;\n+#endif\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--protocol\u0022)))\n+\t\tpro \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--server\u0022))) {\n+\t\tserver_address \u003d p;\n+\t\tpro \u003d \u0022lws-minimal\u0022;\n+\t\tssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--port\u0022)))\n+\t\tport \u003d atoi(p);\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_sul_schedule(context, 0, \u0026sul, connect_cb, 100);\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed\u005cn\u0022);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/CMakeLists.txt\nnew file mode 100644\nindex 0000000..09fb3e1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-client-pmd-bulk C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client-pmd-bulk)\n+set(SRCS minimal-ws-client-pmd-bulk.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+#require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/README.md\nnew file mode 100644\nindex 0000000..f43a458\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/README.md\n@@ -0,0 +1,164 @@\n+# lws minimal ws client + permessage-deflate for bulk traffic\n+\n+This example opens a client connection to localhost:7681 where it\n+expects to find minimal-ws-server-pmd-bulk running.\n+\n+It sends and receives a large, multifragment message, and then exits.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Both the server and client side must use the same options\n+\n+ - `-n` disable permessage-deflate extension\n+ - `-c` send compressible text instead of uncompressible binary data\n+\n+```\n+ $ ./lws-minimal-ws-client-pmd-bulk\n+[2018/04/05 12:08:58:9120] USER: LWS minimal ws client + permessage-deflate + multifragment bulk message\n+[2018/04/05 12:08:58:9120] USER: ./lws-minimal-ws-client-pmd-bulk [-n (no exts)] [-c (compressible)]\n+[2018/04/05 12:08:58:9120] NOTICE: Creating Vhost 'default' (serving disabled), 2 protocols, IPv6 on\n+[2018/04/05 12:08:59:9139] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9139] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9139] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9139] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9139] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9140] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9140] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9140] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9140] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9140] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9140] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9141] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9141] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9141] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9142] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9142] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9142] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9142] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9142] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9142] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9143] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9143] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9143] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9143] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9143] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9143] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9144] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9144] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9144] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9144] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9144] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9144] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9145] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9145] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9145] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9145] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9146] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9146] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9146] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9146] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9146] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9146] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9147] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9147] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9147] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9147] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9147] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9148] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9148] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9148] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9148] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9148] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9148] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9149] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9149] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9149] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9149] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9149] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9149] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9150] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9150] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9150] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9150] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9150] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9150] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9151] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9151] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9151] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9151] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9152] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9152] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9152] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9152] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9152] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9152] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9153] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9153] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9153] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9153] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9153] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9153] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9154] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9154] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9154] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9154] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9154] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9154] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9155] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9155] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9155] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9155] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9155] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9155] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9156] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9156] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9156] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9156] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9157] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9157] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9157] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9157] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9157] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9158] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9158] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9158] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9158] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9158] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9158] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9159] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9159] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9159] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9159] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9159] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9159] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9160] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9160] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9160] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9160] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9160] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9160] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9161] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9161] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9161] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9161] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9161] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9161] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9162] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9162] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9162] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9162] USER: LWS_CALLBACK_CLIENT_RECEIVE: 1024 (rpp 0, last 0)\n+[2018/04/05 12:08:59:9162] USER: LWS_CALLBACK_CLIENT_RECEIVE: 580 (rpp 0, last 1)\n+[2018/04/05 12:08:59:9180] USER: Completed OK\n+```\n+\n+Visit http://localhost:7681 in your browser\n+\n+One or another kind of bulk ws transfer is made to the browser.\n+\n+The ws connection is made via permessage-deflate extension.\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/minimal-ws-client-pmd-bulk.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/minimal-ws-client-pmd-bulk.c\nnew file mode 100644\nindex 0000000..bdc7058\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/minimal-ws-client-pmd-bulk.c\n@@ -0,0 +1,132 @@\n+/*\n+ * lws-minimal-ws-client-pmd-bulk\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a ws client that sends bulk data in multiple\n+ * ws fragments, in a way compatible with per-message deflate.\n+ *\n+ * It shows how to send huge messages without needing a lot of memory.\n+ * \n+ * Build and start the minimal-examples/ws-server/minmal-ws-server-pmd-bulk\n+ * example first. Running this sends a large message to the server and\n+ * exits.\n+ *\n+ * If you give both sides the -n commandline option, it disables permessage-\n+ * deflate compression extension.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal_pmd_bulk.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL_PMD_BULK,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted, options;\n+\n+/* pass pointers to shared vars to the protocol */\n+\n+static const struct lws_protocol_vhost_options pvo_options \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022options\u0022,\t\t/* pvo name */\n+\t(void *)\u0026options\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo_interrupted \u003d {\n+\t\u0026pvo_options,\n+\tNULL,\n+\t\u0022interrupted\u0022,\t\t/* pvo name */\n+\t(void *)\u0026interrupted\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_interrupted,\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-minimal-pmd-bulk\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t/* ignored */\n+};\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022,\n+\t\tlws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022\n+\t\t \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws client + permessage-deflate + multifragment bulk message\u005cn\u0022);\n+\tlwsl_user(\u0022 needs minimal-ws-server-pmd-bulk running to communicate with\u005cn\u0022);\n+\tlwsl_user(\u0022 %s [-n (no exts)] [-c (compressible)]\u005cn\u0022, argv[0]);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+\tif (!lws_cmdline_option(argc, argv, \u0022-n\u0022))\n+\t\tinfo.extensions \u003d extensions;\n+\tinfo.pt_serv_buf_size \u003d 32 * 1024;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-c\u0022))\n+\t\toptions |\u003d 1;\n+\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed %s\u005cn\u0022, interrupted \u003d\u003d 2 ? \u0022OK\u0022 : \u0022failed\u0022);\n+\n+\treturn interrupted !\u003d 2;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/protocol_lws_minimal_pmd_bulk.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/protocol_lws_minimal_pmd_bulk.c\nnew file mode 100644\nindex 0000000..b7f7697\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/protocol_lws_minimal_pmd_bulk.c\n@@ -0,0 +1,282 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal-pmd-bulk\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The protocol shows how to send and receive bulk messages over a ws connection\n+ * that optionally may have the permessage-deflate extension negotiated on it.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/*\n+ * We will produce a large ws message either from this text repeated many times,\n+ * or from 0x40 + a 6-bit pseudorandom number\n+ */\n+\n+static const char * const redundant_string \u003d\n+\t\u0022No one would have believed in the last years of the nineteenth \u0022\n+\t\u0022century that this world was being watched keenly and closely by \u0022\n+\t\u0022intelligences greater than man's and yet as mortal as his own; that as \u0022\n+\t\u0022men busied themselves about their various concerns they were \u0022\n+\t\u0022scrutinised and studied, perhaps almost as narrowly as a man with a \u0022\n+\t\u0022microscope might scrutinise the transient creatures that swarm and \u0022\n+\t\u0022multiply in a drop of water. With infinite complacency men went to \u0022\n+\t\u0022and fro over this globe about their little affairs, serene in their \u0022\n+\t\u0022assurance of their empire over matter. It is possible that the \u0022\n+\t\u0022infusoria under the microscope do the same. No one gave a thought to \u0022\n+\t\u0022the older worlds of space as sources of human danger, or thought of \u0022\n+\t\u0022them only to dismiss the idea of life upon them as impossible or \u0022\n+\t\u0022improbable. It is curious to recall some of the mental habits of \u0022\n+\t\u0022those departed days. At most terrestrial men fancied there might be \u0022\n+\t\u0022other men upon Mars, perhaps inferior to themselves and ready to \u0022\n+\t\u0022welcome a missionary enterprise. Yet across the gulf of space, minds \u0022\n+\t\u0022that are to our minds as ours are to those of the beasts that perish, \u0022\n+\t\u0022intellects vast and cool and unsympathetic, regarded this earth with \u0022\n+\t\u0022envious eyes, and slowly and surely drew their plans against us. And \u0022\n+\t\u0022early in the twentieth century came the great disillusionment. \u0022\n+;\n+\n+/* this reflects the length of the string above */\n+#define REPEAT_STRING_LEN 1337\n+/* this is the total size of the ws message we will send */\n+#define MESSAGE_SIZE (100 * REPEAT_STRING_LEN)\n+/* this is how much we will send each time the connection is writable */\n+#define MESSAGE_CHUNK_SIZE (1 * 1024)\n+\n+/* one of these is created for each client connecting to us */\n+\n+struct per_session_data__minimal_pmd_bulk {\n+\tint position_tx, position_rx;\n+\tuint64_t rng_rx, rng_tx;\n+};\n+\n+struct vhd_minimal_pmd_bulk {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tstruct lws *client_wsi;\n+\n+\tlws_sorted_usec_list_t sul;\n+\n+\tint *interrupted;\n+\tint *options;\n+};\n+\n+static uint64_t rng(uint64_t *r)\n+{\n+ *r ^\u003d *r \u003c\u003c 21;\n+ *r ^\u003d *r \u003e\u003e 35;\n+ *r ^\u003d *r \u003c\u003c 4;\n+\n+ return *r;\n+}\n+\n+static void\n+sul_connect_attempt(struct lws_sorted_usec_list *sul)\n+{\n+\tstruct vhd_minimal_pmd_bulk *vhd \u003d\n+\t\tlws_container_of(sul, struct vhd_minimal_pmd_bulk, sul);\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\n+\ti.context \u003d vhd-\u003econtext;\n+\ti.port \u003d 7681;\n+\ti.address \u003d \u0022localhost\u0022;\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.ssl_connection \u003d 0;\n+\ti.vhost \u003d vhd-\u003evhost;\n+\ti.protocol \u003d \u0022lws-minimal-pmd-bulk\u0022;\n+\ti.pwsi \u003d \u0026vhd-\u003eclient_wsi;\n+\n+\tif (!lws_client_connect_via_info(\u0026i))\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, 10 * LWS_US_PER_SEC);\n+}\n+\n+static int\n+callback_minimal_pmd_bulk(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal_pmd_bulk *pss \u003d\n+\t\t\t(struct per_session_data__minimal_pmd_bulk *)user;\n+\tstruct vhd_minimal_pmd_bulk *vhd \u003d (struct vhd_minimal_pmd_bulk *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi));\n+\tuint8_t buf[LWS_PRE + MESSAGE_CHUNK_SIZE], *start \u003d \u0026buf[LWS_PRE], *p;\n+\tint n, m, flags;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct vhd_minimal_pmd_bulk));\n+\t\tif (!vhd)\n+\t\t\treturn -1;\n+\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\t/* get the pointer to \u0022interrupted\u0022 we were passed in pvo */\n+\t\tvhd-\u003einterrupted \u003d (int *)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022interrupted\u0022)-\u003evalue;\n+\t\tvhd-\u003eoptions \u003d (int *)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022options\u0022)-\u003evalue;\n+\n+\t\tsul_connect_attempt(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tlws_sul_cancel(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tpss-\u003erng_tx \u003d 4;\n+\t\tpss-\u003erng_rx \u003d 4;\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_WRITEABLE:\n+\n+\t\t/*\n+\t\t * when we connect, we will send the server a message\n+\t\t */\n+\n+\t\tif (pss-\u003eposition_tx \u003d\u003d MESSAGE_SIZE)\n+\t\t\tbreak;\n+\n+\t\t/* fill up one chunk's worth of message content */\n+\n+\t\tp \u003d start;\n+\t\tn \u003d MESSAGE_CHUNK_SIZE;\n+\t\tif (n \u003e MESSAGE_SIZE - pss-\u003eposition_tx)\n+\t\t\tn \u003d MESSAGE_SIZE - pss-\u003eposition_tx;\n+\n+\t\tflags \u003d lws_write_ws_flags(LWS_WRITE_BINARY, !pss-\u003eposition_tx,\n+\t\t\t\t\t pss-\u003eposition_tx + n \u003d\u003d MESSAGE_SIZE);\n+\n+\t\t/*\n+\t\t * select between producing compressible repeated text,\n+\t\t * or uncompressible PRNG output\n+\t\t */\n+\n+\t\tif (*vhd-\u003eoptions \u0026 1) {\n+\t\t\twhile (n) {\n+\t\t\t\tsize_t s;\n+\n+\t\t\t\tm \u003d pss-\u003eposition_tx % REPEAT_STRING_LEN;\n+\t\t\t\ts \u003d (unsigned int)(REPEAT_STRING_LEN - m);\n+\t\t\t\tif (s \u003e (size_t)n)\n+\t\t\t\t\ts \u003d (unsigned int)n;\n+\t\t\t\tmemcpy(p, \u0026redundant_string[m], s);\n+\t\t\t\tpss-\u003eposition_tx +\u003d (int)s;\n+\t\t\t\tp +\u003d s;\n+\t\t\t\tn -\u003d (int)s;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tpss-\u003eposition_tx +\u003d n;\n+\t\t\twhile (n--)\n+\t\t\t\t*p++ \u003d (uint8_t)rng(\u0026pss-\u003erng_tx);\n+\t\t}\n+\n+\t\tn \u003d lws_ptr_diff(p, start);\n+\t\tm \u003d lws_write(wsi, start, (unsigned int)n, (enum lws_write_protocol)flags);\n+\t\tif (m \u003c n) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing ws\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tif (pss-\u003eposition_tx !\u003d MESSAGE_SIZE) /* if more to do... */\n+\t\t\tlws_callback_on_writable(wsi);\n+\t\telse\n+\t\t\t/* if we sent and received everything */\n+\t\t\tif (pss-\u003eposition_rx \u003d\u003d MESSAGE_SIZE)\n+\t\t\t\t*vhd-\u003einterrupted \u003d 2;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n+\n+\t\t/*\n+\t\t * When we connect, the server will send us a message too\n+\t\t */\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_RECEIVE: %4d (rpp %5d, last %d)\u005cn\u0022,\n+\t\t\t(int)len, (int)lws_remaining_packet_payload(wsi),\n+\t\t\tlws_is_final_fragment(wsi));\n+\n+\t\tif (*vhd-\u003eoptions \u0026 1) {\n+\t\t\twhile (len) {\n+\t\t\t\tsize_t s;\n+\n+\t\t\t\tm \u003d pss-\u003eposition_rx % REPEAT_STRING_LEN;\n+\t\t\t\ts \u003d (unsigned int)(REPEAT_STRING_LEN - m);\n+\t\t\t\tif (s \u003e len)\n+\t\t\t\t\ts \u003d len;\n+\t\t\t\tif (memcmp(in, \u0026redundant_string[m], s)) {\n+\t\t\t\t\tlwsl_user(\u0022echo'd data doesn't match\u005cn\u0022);\n+\t\t\t\t\treturn -1;\n+\t\t\t\t}\n+\t\t\t\tpss-\u003eposition_rx +\u003d (int)s;\n+\t\t\t\tin \u003d ((unsigned char *)in) + s;\n+\t\t\t\tlen -\u003d s;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tp \u003d (uint8_t *)in;\n+\t\t\tpss-\u003eposition_rx +\u003d (int)len;\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p++ !\u003d (uint8_t)rng(\u0026pss-\u003erng_rx)) {\n+\t\t\t\t\tlwsl_user(\u0022echo'd data doesn't match\u005cn\u0022);\n+\t\t\t\t\treturn -1;\n+\t\t\t\t}\n+\t\t}\n+\n+\t\t/* if we sent and received everything */\n+\n+\t\tif (pss-\u003eposition_rx \u003d\u003d MESSAGE_SIZE \u0026\u0026\n+\t\t pss-\u003eposition_tx \u003d\u003d MESSAGE_SIZE)\n+\t\t\t*vhd-\u003einterrupted \u003d 2;\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tvhd-\u003eclient_wsi \u003d NULL;\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, LWS_US_PER_SEC);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tvhd-\u003eclient_wsi \u003d NULL;\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, LWS_US_PER_SEC);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL_PMD_BULK \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal-pmd-bulk\u0022, \u005c\n+\t\tcallback_minimal_pmd_bulk, \u005c\n+\t\tsizeof(struct per_session_data__minimal_pmd_bulk), \u005c\n+\t\t4096, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/CMakeLists.txt\nnew file mode 100644\nindex 0000000..043f925\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/CMakeLists.txt\n@@ -0,0 +1,32 @@\n+project(lws-minimal-ws-client-rx C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client-rx)\n+set(SRCS minimal-ws-client.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\tif (LWS_CTEST_INTERNET_AVAILABLE)\n+\t\tadd_test(NAME ws-client-rx-warmcat COMMAND lws-minimal-ws-client-rx -t)\n+\t\tset_tests_properties(ws-client-rx-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx\n+\t\t\t\t TIMEOUT 20)\n+\n+\tendif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/README.md\nnew file mode 100644\nindex 0000000..5c267e1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/README.md\n@@ -0,0 +1,39 @@\n+# lws minimal ws client rx\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+The application goes to https://libwebsockets.org and makes a wss connection\n+using the dumb-increment-protocol. It shows the incrementing number it is\n+being sent over ws as it arrives.\n+\n+This example only receives things to keep it simple. See minimal-ws-client-tx\n+for code related to sending things. Of course rx and tx are supported in the\n+same protocol.\n+\n+```\n+./lws-minimal-ws-client-rx\n+[2018/03/14 11:57:24:0689] USER: LWS minimal ws client rx\n+[2018/03/14 11:57:24:0705] NOTICE: Creating Vhost 'default' port -1, 1 protocols, IPv6 off\n+[2018/03/14 11:57:24:0710] NOTICE: created client ssl context for default\n+[2018/03/14 11:57:24:0788] NOTICE: lws_client_connect_2: 0x15b8310: address libwebsockets.org\n+[2018/03/14 11:57:24:7643] NOTICE: lws_client_connect_2: 0x15b8310: address libwebsockets.org\n+[2018/03/14 11:57:26:9191] USER: RX: 0\n+[2018/03/14 11:57:26:9318] USER: RX: 1\n+[2018/03/14 11:57:27:2182] USER: RX: 2\n+[2018/03/14 11:57:27:2336] USER: RX: 3\n+[2018/03/14 11:57:27:2838] USER: RX: 4\n+[2018/03/14 11:57:27:5173] USER: RX: 5\n+[2018/03/14 11:57:27:5352] USER: RX: 6\n+[2018/03/14 11:57:27:5854] USER: RX: 7\n+[2018/03/14 11:57:27:8156] USER: RX: 8\n+[2018/03/14 11:57:27:8359] USER: RX: 9\n+^C[2018/03/14 11:57:27:9884] USER: Completed\n+```\n+\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/libwebsockets.org.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/libwebsockets.org.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/minimal-ws-client.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/minimal-ws-client.c\nnew file mode 100644\nindex 0000000..281a841\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/minimal-ws-client.c\n@@ -0,0 +1,150 @@\n+/*\n+ * lws-minimal-ws-client\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal ws client using lws.\n+ *\n+ * It connects to https://libwebsockets.org/ and makes a\n+ * wss connection to the dumb-increment protocol there. While\n+ * connected, it prints the numbers it is being sent by\n+ * dumb-increment protocol.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, rx_seen, test;\n+static struct lws *client_wsi;\n+\n+static int\n+callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tclient_wsi \u003d NULL;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: established\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n+\t\tlwsl_user(\u0022RX: %s\u005cn\u0022, (const char *)in);\n+\t\trx_seen++;\n+\t\tif (test \u0026\u0026 rx_seen \u003d\u003d 10)\n+\t\t\tinterrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tclient_wsi \u003d NULL;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022dumb-increment-protocol\u0022,\n+\t\tcallback_dumb_increment,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_client_connect_info i;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t/* for LLL_ verbosity above NOTICE to be built into lws, lws\n+\t\t * must have been configured with -DCMAKE_BUILD_TYPE\u003dDEBUG\n+\t\t * instead of \u003dRELEASE */\n+\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\ttest \u003d !!lws_cmdline_option(argc, argv, \u0022-t\u0022);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws client rx [-d \u003clogs\u003e] [--h2] [-t (test)]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.timeout_secs \u003d 10;\n+\tinfo.connect_timeout_secs \u003d 30;\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./libwebsockets.org.cer\u0022;\n+#endif\n+\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\ti.port \u003d 443;\n+\ti.address \u003d \u0022libwebsockets.org\u0022;\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\ti.protocol \u003d protocols[0].name; /* \u0022dumb-increment-protocol\u0022 */\n+\ti.pwsi \u003d \u0026client_wsi;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022--h2\u0022))\n+\t\ti.alpn \u003d \u0022h2\u0022;\n+\n+\tlws_client_connect_via_info(\u0026i);\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 client_wsi \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed %s\u005cn\u0022, rx_seen \u003e 10 ? \u0022OK\u0022 : \u0022Failed\u0022);\n+\n+\treturn rx_seen \u003e 10;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5398798\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-client-spam-tx-rx C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client-spam-tx-rx)\n+set(SRCS minimal-ws-client.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/libwebsockets.org.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/libwebsockets.org.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/minimal-ws-client.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/minimal-ws-client.c\nnew file mode 100644\nindex 0000000..98b08cd\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/minimal-ws-client.c\n@@ -0,0 +1,221 @@\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+\n+static int nclients \u003d 11;\n+unsigned char msg[LWS_PRE+128];\n+static int message_delay \u003d 500000; // microseconds\n+static int connection_delay \u003d 100000; // microseconds\n+static struct lws_context *context;\n+static const char *server_address \u003d \u0022localhost\u0022, *pro \u003d \u0022lws-minimal\u0022;\n+static int interrupted \u003d 0, port \u003d 7681, ssl_connection \u003d 0;\n+\n+static int connect_client()\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\n+\ti.context \u003d context;\n+\ti.port \u003d port;\n+\ti.address \u003d server_address;\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.ssl_connection \u003d ssl_connection;\n+\ti.protocol \u003d pro;\n+\ti.local_protocol_name \u003d pro;\n+\n+\t//usleep(connection_delay);\n+\tlwsl_notice(\u0022%s: connection %s:%d\u005cn\u0022, __func__, i.address, i.port);\n+\tif (!lws_client_connect_via_info(\u0026i)) return 1;\n+\n+\treturn 0;\n+}\n+\n+static int\n+callback(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\tvoid *user, void *in, size_t len)\n+{\n+\tint m\u003d 0, n \u003d 0;\n+\tshort r;\n+#if defined(_DEBUG) \u0026\u0026 !defined(LWS_WITH_NO_LOGS)\n+\tsize_t remain;\n+\tint first \u003d 0, final \u003d 0;\n+#endif\n+\n+\t//lwsl_notice(\u0022callback called with reason %d\u005cn\u0022, reason);\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tfor (n \u003d 0; n \u003c nclients; n++)\n+\t\t\tconnect_client();\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022, in ? (char *)in :\n+\t\t\t\t\u0022(null)\u0022);\n+\t\tif(--nclients \u003d\u003d 0) interrupted \u003d 1;\n+\t\tbreak;\n+\n+\t\t/* --- client callbacks --- */\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlws_callback_on_writable(wsi);\n+\t\tlwsl_user(\u0022%s: established connection, wsi \u003d %p\u005cn\u0022,\n+\t\t\t\t__func__, wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tlwsl_user(\u0022%s: CLOSED\u005cn\u0022, __func__);\n+\t\tif(--nclients \u003d\u003d 0) interrupted \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_WRITEABLE:\n+\n+\t\tm \u003d lws_write(wsi, msg + LWS_PRE, 128, LWS_WRITE_TEXT);\n+\t\tif (m \u003c 128) {\n+\t\t\tlwsl_err(\u0022sending message failed: %d \u003c %d\u005cn\u0022, m, n);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/*\n+\t\t * Schedule the timer after minimum message delay plus the\n+\t\t * random number of centiseconds.\n+\t\t */\n+\t\tif (lws_get_random(lws_get_context(wsi), \u0026r, 2) \u003d\u003d 2) {\n+\t\t\tn \u003d message_delay + 10000*(r % 100);\n+\t\t\tlwsl_debug(\u0022set timer on %d usecs\u005cn\u0022, n);\n+\t\t\tlws_set_timer_usecs(wsi, n);\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_TIMER:\n+\t\t// Let the main loop know we want to send another message to the\n+\t\t// server\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n+#if defined(_DEBUG) \u0026\u0026 !defined(LWS_WITH_NO_LOGS)\n+\t\tfirst \u003d lws_is_first_fragment(wsi);\n+\t\tfinal \u003d lws_is_final_fragment(wsi);\n+\t\tremain \u003d lws_remaining_packet_payload(wsi);\n+\t\tlwsl_debug(\u0022LWS_CALLBACK_RECEIVE: len \u003d %lu, first \u003d %d, \u0022\n+\t\t\t \u0022final \u003d %d, remains \u003d %lu\u005cn\u0022,\n+\t\t\t (unsigned long)len, first, final,\n+\t\t\t (unsigned long)remain);\n+#endif\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_WS_PEER_INITIATED_CLOSE:\n+\t\tlwsl_notice(\u0022server initiated connection close: len \u003d %lu, \u0022\n+\t\t\t \u0022in \u003d %s\u005cn\u0022, (unsigned long)len, (char*)in);\n+\t\treturn 0;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t\t{ \u0022spam-rx-tx\u0022, callback, 4096, 4096, 0, NULL, 0 },\n+\t\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d\n+\t\t\tLLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+#ifndef WIN32\n+\tsrandom((unsigned int)time(0));\n+#endif\n+\n+\tmemset(msg, 'x', sizeof(msg));\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-d\u0022))\n+\t\tlogs |\u003d LLL_INFO | LLL_DEBUG;\n+\n+\tlws_set_log_level(logs, NULL);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./libwebsockets.org.cer\u0022;\n+#endif\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-h\u0022))) {\n+\t\tserver_address \u003d p;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022))) {\n+\t\tssl_connection |\u003d\n+\t\t\t\tLCCSCF_USE_SSL |\n+\t\t\t\tLCCSCF_ALLOW_SELFSIGNED |\n+\t\t\t\tLCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\tport \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-n\u0022))) {\n+\t\tn \u003d atoi(p);\n+\t\tif (n \u003c 1)\n+\t\t\tn \u003d 1;\n+\t\tif (n \u003c nclients)\n+\t\t\tnclients \u003d n;\n+\t\tlwsl_notice(\u0022Start test clients: %d\u005cn\u0022, nclients);\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022))) {\n+\t\tconnection_delay \u003d atoi(p);\n+\t\tlwsl_notice(\u0022Connection delay: %d\u005cn\u0022, connection_delay);\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-m\u0022))) {\n+\t\tmessage_delay \u003d atoi(p);\n+\t\tlwsl_notice(\u0022Message delay: %d\u005cn\u0022, connection_delay);\n+\t}\n+\n+\tinfo.fd_limit_per_thread \u003d (unsigned int)(1 + nclients + 1);\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlwsl_notice(\u0022%s: exiting service loop. n \u003d %d, interrupted \u003d %d\u005cn\u0022,\n+\t\t\t__func__, n, interrupted);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/CMakeLists.txt\nnew file mode 100644\nindex 0000000..fc0402b\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/CMakeLists.txt\n@@ -0,0 +1,86 @@\n+project(lws-minimal-ws-client-spam C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client-spam)\n+set(SRCS minimal-ws-client-spam.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+ #\n+ # instantiate the server per sai builder instance, they are running in the same\n+ # machine context in parallel so they can tread on each other otherwise\n+ #\n+ set(PORT_WCS_SRV \u00227620\u0022)\n+ if (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00220\u0022)\n+\t set(PORT_WCS_SRV 7621)\n+ endif()\n+ if (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00221\u0022)\n+\t set(PORT_WCS_SRV 7622)\n+ endif()\n+ if (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00222\u0022)\n+\t set(PORT_WCS_SRV 7623)\n+ endif()\n+ if (\u0022$ENV{SAI_INSTANCE_IDX}\u0022 STREQUAL \u00223\u0022)\n+\t set(PORT_WCS_SRV 7624)\n+ endif()\n+\n+# hack\n+if (WIN32)\n+else()\n+\n+if (LWS_WITH_SERVER)\n+if (WIN32)\n+\tadd_test(NAME st_wcs_srv COMMAND cmd.exe /c start /b $\u003cTARGET_FILE:test-server\u003e -s --port ${PORT_WCS_SRV})\n+\tadd_test(NAME ki_wcs_srv COMMAND taskkill /F /IM $\u003cTARGET_FILE_NAME:test-server\u003e /T)\n+else()\n+\tif (VALGRIND)\n+\t\tadd_test(NAME st_wcs_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\twcs_srv ${VALGRIND} --tool\u003dmemcheck $\u003cTARGET_FILE:test-server\u003e\n+\t\t\t\t-r ${CMAKE_SOURCE_DIR}/destdir/usr/local/share/libwebsockets-test-server/\n+\t\t\t\t-s --port ${PORT_WCS_SRV} )\n+\t\tadd_test(NAME ki_wcs_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\twcs_srv ${VALGRIND} $\u003cTARGET_FILE_NAME:test-server\u003e --port ${PORT_WCS_SRV})\n+\telse()\n+\t\tadd_test(NAME st_wcs_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\twcs_srv $\u003cTARGET_FILE:test-server\u003e\n+\t\t\t\t-r ${CMAKE_SOURCE_DIR}/destdir/usr/local/share/libwebsockets-test-server/\n+\t\t\t\t-s --port ${PORT_WCS_SRV} )\n+\t\tadd_test(NAME ki_wcs_srv COMMAND\n+\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\twcs_srv $\u003cTARGET_FILE_NAME:test-server\u003e --port ${PORT_WCS_SRV})\n+\tendif()\n+endif()\n+\n+\tset_tests_properties(st_wcs_srv PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP wcs_srv TIMEOUT 800)\n+\tset_tests_properties(ki_wcs_srv PROPERTIES FIXTURES_CLEANUP wcs_srv)\n+\n+\tadd_test(NAME ws-client-spam COMMAND lws-minimal-ws-client-spam --server localhost --port ${PORT_WCS_SRV} -l 32 -c 3)\n+\tset_tests_properties(ws-client-spam PROPERTIES\n+\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam\n+\t\t\t FIXTURES_REQUIRED \u0022wcs_srv\u0022\n+\t\t\t TIMEOUT 40)\n+endif()\n+endif()\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/README.md\nnew file mode 100644\nindex 0000000..db4b7f7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/README.md\n@@ -0,0 +1,53 @@\n+# lws minimal ws client SPAM\n+\n+This connects to libwebsockets.org using the lws-mirror-protocol.\n+\n+By default is has 10 concurrent connections and connects 100 times.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+--server|Use a specific server instead of libwebsockets.org, eg `--server localhost`. Implies LCCSCF_ALLOW_SELFSIGNED\n+--port|Use a specific port instead of 443, eg `--port 7681`\n+-c|Amount of concurrent connections\n+-l|Test limit (total number of connections to make)\n+\n+## usage\n+\n+Just run it, it will repeatedly connect and reconnect to libwebsockets.org\n+until it hits the test limit.\n+\n+You can also direct it to use the lws test server in tls mode by running that\n+with `libwebsockets-test-server -s` and running this using, eg\n+\n+```\n+ $ ./lws-minimal-ws-client-spam -c 20 -l 200 --server localhost --port 7681\n+```\n+\n+```\n+ $ ./lws-minimal-ws-client-spam\n+[2018/11/15 09:53:19:9639] USER: LWS minimal ws client SPAM\n+[2018/11/15 09:53:19:9647] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n+[2018/11/15 09:53:19:9695] NOTICE: created client ssl context for default\n+[2018/11/15 09:53:21:0976] USER: callback_minimal_spam: established (try 10, est 0, closed 0, err 0)\n+[2018/11/15 09:53:21:1041] USER: callback_minimal_spam: established (try 10, est 1, closed 0, err 0)\n+[2018/11/15 09:53:21:1089] USER: callback_minimal_spam: established (try 10, est 2, closed 0, err 0)\n+[2018/11/15 09:53:21:1132] USER: callback_minimal_spam: established (try 10, est 3, closed 0, err 0)\n+[2018/11/15 09:53:21:1166] USER: callback_minimal_spam: established (try 10, est 4, closed 0, err 0)\n+[2018/11/15 09:53:21:1531] USER: callback_minimal_spam: established (try 10, est 5, closed 0, err 0)\n+[2018/11/15 09:53:21:1563] USER: callback_minimal_spam: established (try 10, est 6, closed 0, err 0)\n+[2018/11/15 09:53:21:1589] USER: callback_minimal_spam: established (try 10, est 7, closed 0, err 0)\n+[2018/11/15 09:53:21:1616] USER: callback_minimal_spam: established (try 10, est 8, closed 0, err 0)\n+[2018/11/15 09:53:21:1671] USER: callback_minimal_spam: established (try 10, est 9, closed 0, err 0)\n+[2018/11/15 09:53:21:3778] USER: callback_minimal_spam: reopening (try 11, est 10, closed 1, err 0)\n+...\n+```\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/libwebsockets.org.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/libwebsockets.org.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/minimal-ws-client-spam.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/minimal-ws-client-spam.c\nnew file mode 100644\nindex 0000000..998c5a8\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/minimal-ws-client-spam.c\n@@ -0,0 +1,284 @@\n+/*\n+ * lws-minimal-ws-client-spam\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a ws client that makes continuous mass ws connections\n+ * asynchronously\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+enum {\n+\tCLIENT_IDLE,\n+\tCLIENT_CONNECTING,\n+\tCLIENT_AWAITING_SEND,\n+};\n+\n+struct client {\n+\tstruct lws *wsi;\n+\tint index;\n+\tint state;\n+};\n+\n+static struct lws_context *context;\n+static struct client clients[200];\n+static int interrupted, port \u003d 443, ssl_connection \u003d LCCSCF_USE_SSL;\n+static const char *server_address \u003d \u0022libwebsockets.org\u0022,\n+\t\t *pro \u003d \u0022lws-mirror-protocol\u0022;\n+static int concurrent \u003d 3, conn, tries, est, errors, closed, sent, limit \u003d 15;\n+\n+struct pss {\n+\tint conn;\n+};\n+\n+static int\n+connect_client(int idx)\n+{\n+\tstruct lws_client_connect_info i;\n+\n+\tif (tries \u003d\u003d limit) {\n+\t\tlwsl_user(\u0022Reached limit... finishing\u005cn\u0022);\n+\t\treturn 0;\n+\t}\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\n+\ti.context \u003d context;\n+\ti.port \u003d port;\n+\ti.address \u003d server_address;\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.ssl_connection \u003d ssl_connection;\n+\ti.protocol \u003d pro;\n+\ti.local_protocol_name \u003d pro;\n+\ti.pwsi \u003d \u0026clients[idx].wsi;\n+\n+\tclients[idx].state \u003d CLIENT_CONNECTING;\n+\ttries++;\n+\n+\tlwsl_notice(\u0022%s: connection %s:%d\u005cn\u0022, __func__, i.address, i.port);\n+\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\tclients[idx].wsi \u003d NULL;\n+\t\tclients[idx].state \u003d CLIENT_IDLE;\n+\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+callback_minimal_spam(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct pss *pss \u003d (struct pss *)user;\n+\tuint8_t ping[LWS_PRE + 125];\n+\tint n, m;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\terrors++;\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s (try %d, est %d, closed %d, err %d)\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022, tries, est, closed, errors);\n+\t\tfor (n \u003d 0; n \u003c concurrent; n++) {\n+\t\t\tif (clients[n].wsi \u003d\u003d wsi) {\n+\t\t\t\tclients[n].wsi \u003d NULL;\n+\t\t\t\tclients[n].state \u003d CLIENT_IDLE;\n+\t\t\t\tconnect_client(n);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t\tif (tries \u003d\u003d closed + errors) {\n+\t\t\tinterrupted \u003d 1;\n+\t\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\t}\n+\t\tbreak;\n+\n+\t/* --- client callbacks --- */\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: established (try %d, est %d, closed %d, err %d)\u005cn\u0022,\n+\t\t\t\t__func__, tries, est, closed, errors);\n+\t\test++;\n+\t\tpss-\u003econn \u003d conn++;\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tclosed++;\n+\t\tif (tries \u003d\u003d closed + errors) {\n+\t\t\tinterrupted \u003d 1;\n+\t\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\t}\n+\t\tif (tries \u003d\u003d limit) {\n+\t\t\tlwsl_user(\u0022%s: leaving CLOSED (try %d, est %d, sent %d, closed %d, err %d)\u005cn\u0022,\n+\t\t\t\t\t__func__, tries, est, sent, closed, errors);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tfor (n \u003d 0; n \u003c concurrent; n++) {\n+\t\t\tif (clients[n].wsi \u003d\u003d wsi) {\n+\t\t\t\tconnect_client(n);\n+\t\t\t\tlwsl_user(\u0022%s: reopening (try %d, est %d, closed %d, err %d)\u005cn\u0022,\n+\t\t\t\t\t\t__func__, tries, est, closed, errors);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t\tif (n \u003d\u003d concurrent)\n+\t\t\tlwsl_user(\u0022CLOSED: can't find client wsi\u005cn\u0022);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_WRITEABLE:\n+\t\tn \u003d lws_snprintf((char *)ping + LWS_PRE, sizeof(ping) - LWS_PRE,\n+\t\t\t\t\t \u0022hello %d\u0022, pss-\u003econn);\n+\n+\t\tm \u003d lws_write(wsi, ping + LWS_PRE, (unsigned int)n, LWS_WRITE_TEXT);\n+\t\tif (m \u003c n) {\n+\t\t\tlwsl_err(\u0022sending ping failed: %d\u005cn\u0022, m);\n+\n+\t\t\treturn -1;\n+\t\t}\n+\t\tlws_set_timeout(wsi, PENDING_TIMEOUT_USER_OK, LWS_TO_KILL_ASYNC);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022lws-spam-test\u0022,\n+\t\tcallback_minimal_spam,\n+\t\tsizeof(struct pss),\n+\t\t0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static struct lws_protocol_vhost_options pvo \u003d {\n+ NULL, /* \u0022next\u0022 pvo linked-list */\n+ NULL, /* \u0022child\u0022 pvo linked-list */\n+ \u0022lws-spam-test\u0022, /* protocol name we belong to on this vhost */\n+ \u0022OK\u0022 /* ignored */\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws client SPAM\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./libwebsockets.org.cer\u0022;\n+#endif\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--server\u0022))) {\n+\t\tserver_address \u003d p;\n+\t\tssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t}\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--port\u0022)))\n+\t\tport \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-l\u0022)))\n+\t\tlimit \u003d atoi(p);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022)))\n+\t\tconcurrent \u003d atoi(p);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-n\u0022)) {\n+\t\tssl_connection \u003d 0;\n+\t\tinfo.options \u003d 0;\n+\t}\n+\n+\tif (concurrent \u003c 0 ||\n+\t concurrent \u003e (int)LWS_ARRAY_SIZE(clients)) {\n+\t\tlwsl_err(\u0022%s: -c %d larger than max concurrency %d\u005cn\u0022, __func__,\n+\t\t\t\tconcurrent, (int)LWS_ARRAY_SIZE(clients));\n+\n+\t\treturn 1;\n+\t}\n+\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and n (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d (unsigned int)(1 + concurrent + 1);\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tfor (n \u003d 0; n \u003c concurrent; n++) {\n+\t\tclients[n].index \u003d n;\n+\t\tconnect_client(n);\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlwsl_notice(\u0022%s: exiting service loop\u005cn\u0022, __func__);\n+\n+\tlws_context_destroy(context);\n+\n+\tif (tries \u003d\u003d limit \u0026\u0026 closed \u003d\u003d tries) {\n+\t\tlwsl_user(\u0022Completed\u005cn\u0022);\n+\t\treturn 0;\n+\t}\n+\n+\tlwsl_err(\u0022Failed\u005cn\u0022);\n+\n+\treturn 1;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/CMakeLists.txt\nnew file mode 100644\nindex 0000000..45d75c0\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/CMakeLists.txt\n@@ -0,0 +1,26 @@\n+project(lws-minimal-ws-client-tx C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client-tx)\n+set(SRCS minimal-ws-client.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/README.md\nnew file mode 100644\nindex 0000000..4a606d4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/README.md\n@@ -0,0 +1,33 @@\n+# lws minimal ws client tx\n+\n+This demonstrates a ws \u0022publisher\u0022 to go with the minimal-ws-broker example.\n+\n+Two threads are spawned that produce messages to be sent to the broker,\n+via a local ringbuffer. Locking is provided to make ringbuffer access threadsafe.\n+\n+When a nailed-up client connection to the broker is established, the\n+ringbuffer is sent to the broker, which distributes the events to all\n+connected clients.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+This example connects to ws-server/minimal-ws-broker, so you need to build and run\n+that in another terminal.\n+\n+```\n+ $ ./lws-minimal-ws-client-tx\n+[2018/03/16 16:04:33:5774] USER: LWS minimal ws client tx\n+[2018/03/16 16:04:33:5774] USER: Run minimal-ws-broker and browse to that\n+[2018/03/16 16:04:33:5774] NOTICE: Creating Vhost 'default' port -1, 1 protocols, IPv6 off\n+[2018/03/16 16:04:34:5794] USER: callback_minimal_broker: established\n+```\n+\n+If you open a browser on http://localhost:7681 , you will see the subscribed\n+messages from the threads in this app via the broker app.\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/minimal-ws-client.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/minimal-ws-client.c\nnew file mode 100644\nindex 0000000..dd8757c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/minimal-ws-client.c\n@@ -0,0 +1,345 @@\n+/*\n+ * lws-minimal-ws-client-tx\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a ws \u0022publisher\u0022 to go with the minimal-ws-broker\n+ * example.\n+ *\n+ * Two threads are spawned that produce messages to be sent to the broker,\n+ * via a local ringbuffer. Locking is provided to make ringbuffer access\n+ * threadsafe.\n+ *\n+ * When a nailed-up client connection to the broker is established, the\n+ * ringbuffer is sent to the broker, which distributes the events to all\n+ * connected clients.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+static int interrupted;\n+\n+/* one of these created for each message */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\tpthread_t pthread_spam[2];\n+\n+\tlws_sorted_usec_list_t sul;\n+\n+\tpthread_mutex_t lock_ring; /* serialize access to the ring buffer */\n+\tstruct lws_ring *ring; /* ringbuffer holding unsent messages */\n+\tuint32_t tail;\n+\n+\tstruct lws_client_connect_info i;\n+\tstruct lws *client_wsi;\n+\n+\tint counter;\n+\tchar finished;\n+\tchar established;\n+};\n+\n+#if defined(WIN32)\n+static void usleep(unsigned long l) { Sleep(l / 1000); }\n+#endif\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+static void *\n+thread_spam(void *d)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)d;\n+\tstruct msg amsg;\n+\tint len \u003d 128, index \u003d 1, n, whoami \u003d 0;\n+\n+\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\tif (pthread_equal(pthread_self(), vhd-\u003epthread_spam[n]))\n+\t\t\twhoami \u003d n + 1;\n+\n+\tdo {\n+\t\t/* don't generate output if client not connected */\n+\t\tif (!vhd-\u003eestablished)\n+\t\t\tgoto wait;\n+\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\t/* only create if space in ringbuffer */\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(vhd-\u003ering);\n+\t\tif (!n) {\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\n+\t\tamsg.payload \u003d malloc((unsigned int)(LWS_PRE + len));\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\t\tn \u003d lws_snprintf((char *)amsg.payload + LWS_PRE, (unsigned int)len,\n+\t\t\t \u0022tid: %d, msg: %d\u0022, whoami, index++);\n+\t\tamsg.len \u003d (unsigned int)n;\n+\t\tn \u003d (int)lws_ring_insert(vhd-\u003ering, \u0026amsg, 1);\n+\t\tif (n !\u003d 1) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t} else\n+\t\t\t/*\n+\t\t\t * This will cause a LWS_CALLBACK_EVENT_WAIT_CANCELLED\n+\t\t\t * in the lws service thread context.\n+\t\t\t */\n+\t\t\tlws_cancel_service(vhd-\u003econtext);\n+\n+wait_unlock:\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\n+wait:\n+\t\tusleep(100000);\n+\n+\t} while (!vhd-\u003efinished);\n+\n+\tlwsl_notice(\u0022thread_spam %d exiting\u005cn\u0022, whoami);\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+static void\n+sul_connect_attempt(struct lws_sorted_usec_list *sul)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\tlws_container_of(sul, struct per_vhost_data__minimal, sul);\n+\n+\tvhd-\u003ei.context \u003d vhd-\u003econtext;\n+\tvhd-\u003ei.port \u003d 7681;\n+\tvhd-\u003ei.address \u003d \u0022localhost\u0022;\n+\tvhd-\u003ei.path \u003d \u0022/publisher\u0022;\n+\tvhd-\u003ei.host \u003d vhd-\u003ei.address;\n+\tvhd-\u003ei.origin \u003d vhd-\u003ei.address;\n+\tvhd-\u003ei.ssl_connection \u003d 0;\n+\n+\tvhd-\u003ei.protocol \u003d \u0022lws-minimal-broker\u0022;\n+\tvhd-\u003ei.pwsi \u003d \u0026vhd-\u003eclient_wsi;\n+\n+\tif (!lws_client_connect_via_info(\u0026vhd-\u003ei))\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, 10 * LWS_US_PER_SEC);\n+}\n+\n+static int\n+callback_minimal_broker(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct msg *pmsg;\n+\tvoid *retval;\n+\tint n, m, r \u003d 0;\n+\n+\tswitch (reason) {\n+\n+\t/* --- protocol lifecycle callbacks --- */\n+\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!vhd-\u003ering)\n+\t\t\treturn 1;\n+\n+\t\tpthread_mutex_init(\u0026vhd-\u003elock_ring, NULL);\n+\n+\t\t/* start the content-creating threads */\n+\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tif (pthread_create(\u0026vhd-\u003epthread_spam[n], NULL,\n+\t\t\t\t\t thread_spam, vhd)) {\n+\t\t\t\tlwsl_err(\u0022thread creation failed\u005cn\u0022);\n+\t\t\t\tr \u003d 1;\n+\t\t\t\tgoto init_fail;\n+\t\t\t}\n+\n+\t\tsul_connect_attempt(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+init_fail:\n+\t\tvhd-\u003efinished \u003d 1;\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tpthread_join(vhd-\u003epthread_spam[n], \u0026retval);\n+\n+\t\tif (vhd-\u003ering)\n+\t\t\tlws_ring_destroy(vhd-\u003ering);\n+\n+\t\tlws_sul_cancel(\u0026vhd-\u003esul);\n+\t\tpthread_mutex_destroy(\u0026vhd-\u003elock_ring);\n+\n+\t\treturn r;\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tvhd-\u003eclient_wsi \u003d NULL;\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, LWS_US_PER_SEC);\n+\t\tbreak;\n+\n+\t/* --- client callbacks --- */\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: established\u005cn\u0022, __func__);\n+\t\tvhd-\u003eestablished \u003d 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_WRITEABLE:\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026vhd-\u003etail);\n+\t\tif (!pmsg)\n+\t\t\tgoto skip;\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) + LWS_PRE,\n+\t\t\t pmsg-\u003elen, LWS_WRITE_TEXT);\n+\t\tif (m \u003c (int)pmsg-\u003elen) {\n+\t\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock */\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlws_ring_consume_single_tail(vhd-\u003ering, \u0026vhd-\u003etail, 1);\n+\n+\t\t/* more to do for us? */\n+\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026vhd-\u003etail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(wsi);\n+\n+skip:\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tvhd-\u003eclient_wsi \u003d NULL;\n+\t\tvhd-\u003eestablished \u003d 0;\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_connect_attempt, LWS_US_PER_SEC);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_EVENT_WAIT_CANCELLED:\n+\t\t/*\n+\t\t * When the \u0022spam\u0022 threads add a message to the ringbuffer,\n+\t\t * they create this event in the lws service thread context\n+\t\t * using lws_cancel_service().\n+\t\t *\n+\t\t * We respond by scheduling a writable callback for the\n+\t\t * connected client, if any.\n+\t\t */\n+\t\tif (vhd \u0026\u0026 vhd-\u003eclient_wsi \u0026\u0026 vhd-\u003eestablished)\n+\t\t\tlws_callback_on_writable(vhd-\u003eclient_wsi);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022lws-minimal-broker\u0022,\n+\t\tcallback_minimal_broker,\n+\t\t0, 0, 0, NULL, 0\n+\t},\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws client tx\u005cn\u0022);\n+\tlwsl_user(\u0022 Run minimal-ws-broker and browse to that\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\t/*\n+\t * since we know this lws context is only ever going to be used with\n+\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n+\t * have to use the default allocations for fd tables up to ulimit -n.\n+\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n+\t * will use.\n+\t */\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed\u005cn\u0022);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client/CMakeLists.txt\nnew file mode 100644\nindex 0000000..9638145\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-client-ping C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-client)\n+set(SRCS minimal-ws-client.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client/README.md\nnew file mode 100644\nindex 0000000..bf87ab3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client/README.md\n@@ -0,0 +1,58 @@\n+# lws minimal ws client\n+\n+This connects to libwebsockets.org using the dumb-increment-protocol.\n+\n+It demonstrates how to use the connection retry and backoff stuff in lws.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+-s|Use a specific server instead of libwebsockets.org, eg `--server localhost`. Implies LCCSCF_ALLOW_SELFSIGNED\n+-p|Use a specific port instead of 443, eg `--port 7681`\n+-j|Allow selfsigned tls cert\n+-k|Allow insecure certs\n+-m|Skip server hostname check\n+-e|Allow expired certs\n+--protocol|Use a specific ws subprotocol rather than dumb-increment-protocol, eg, `--protocol myprotocol`\n+\n+\n+## usage\n+\n+Just run it, it will connect to libwebsockets.org and spew incrementing numbers\n+sent by the server at 20Hz\n+\n+```\n+ $ ./lws-minimal-ws-client\n+[2020/01/22 05:38:47:3409] U: LWS minimal ws client\n+[2020/01/22 05:38:47:4456] N: Loading client CA for verification ./libwebsockets.org.cer\n+[2020/01/22 05:38:48:1649] U: callback_minimal: established\n+[2020/01/22 05:38:48:1739] N: \n+[2020/01/22 05:38:48:1763] N: 0000: 30 0 \n+[2020/01/22 05:38:48:1765] N: \n+\n+...\n+```\n+\n+To test against the lws test server instead of libwebsockets.org, run the test\n+server as\n+\n+```\n+$ libwebsockets-test-server -s\n+```\n+\n+and run this test app with\n+\n+```\n+$ ./lws-minimal-ws-client -s localhost -p 7681 -j\n+```\n+\n+You can kill and restart the server to confirm the client connection is re-\n+established if done within the backoff period.\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client/libwebsockets.org.cer\nnew file mode 100644\nindex 0000000..01ad0dc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client/libwebsockets.org.cer\n@@ -0,0 +1,32 @@\n+-----BEGIN CERTIFICATE-----\n+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n+-----END CERTIFICATE-----\n+\ndiff --git a/minimal-examples-lowlevel/ws-client/minimal-ws-client/minimal-ws-client.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client/minimal-ws-client.c\nnew file mode 100644\nindex 0000000..70b2461\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client/minimal-ws-client.c\n@@ -0,0 +1,216 @@\n+/*\n+ * lws-minimal-ws-client\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a ws client that connects by default to libwebsockets.org\n+ * dumb increment ws server.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/*\n+ * This represents your object that \u0022contains\u0022 the client connection and has\n+ * the client connection bound to it\n+ */\n+\n+static struct my_conn {\n+\tlws_sorted_usec_list_t\tsul;\t /* schedule connection retry */\n+\tstruct lws\t\t*wsi;\t /* related wsi if any */\n+\tuint16_t\t\tretry_count; /* count of consequetive retries */\n+} mco;\n+\n+static struct lws_context *context;\n+static int interrupted, port \u003d 443, ssl_connection \u003d LCCSCF_USE_SSL;\n+static const char *server_address \u003d \u0022libwebsockets.org\u0022,\n+\t\t *pro \u003d \u0022dumb-increment-protocol\u0022;\n+\n+/*\n+ * The retry and backoff policy we want to use for our client connections\n+ */\n+\n+static const uint32_t backoff_ms[] \u003d { 1000, 2000, 3000, 4000, 5000 };\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.retry_ms_table\t\t\t\u003d backoff_ms,\n+\t.retry_ms_table_count\t\t\u003d LWS_ARRAY_SIZE(backoff_ms),\n+\t.conceal_count\t\t\t\u003d LWS_ARRAY_SIZE(backoff_ms),\n+\n+\t.secs_since_valid_ping\t\t\u003d 3, /* force PINGs after secs idle */\n+\t.secs_since_valid_hangup\t\u003d 10, /* hangup after secs idle */\n+\n+\t.jitter_percent\t\t\t\u003d 20,\n+};\n+\n+/*\n+ * Scheduled sul callback that starts the connection attempt\n+ */\n+\n+static void\n+connect_client(lws_sorted_usec_list_t *sul)\n+{\n+\tstruct my_conn *mco \u003d lws_container_of(sul, struct my_conn, sul);\n+\tstruct lws_client_connect_info i;\n+\n+\tmemset(\u0026i, 0, sizeof(i));\n+\n+\ti.context \u003d context;\n+\ti.port \u003d port;\n+\ti.address \u003d server_address;\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.ssl_connection \u003d ssl_connection;\n+\ti.protocol \u003d pro;\n+\ti.local_protocol_name \u003d \u0022lws-minimal-client\u0022;\n+\ti.pwsi \u003d \u0026mco-\u003ewsi;\n+\ti.retry_and_idle_policy \u003d \u0026retry;\n+\ti.userdata \u003d mco;\n+\n+\tif (!lws_client_connect_via_info(\u0026i))\n+\t\t/*\n+\t\t * Failed... schedule a retry... we can't use the _retry_wsi()\n+\t\t * convenience wrapper api here because no valid wsi at this\n+\t\t * point.\n+\t\t */\n+\t\tif (lws_retry_sul_schedule(context, 0, sul, \u0026retry,\n+\t\t\t\t\t connect_client, \u0026mco-\u003eretry_count)) {\n+\t\t\tlwsl_err(\u0022%s: connection attempts exhausted\u005cn\u0022, __func__);\n+\t\t\tinterrupted \u003d 1;\n+\t\t}\n+}\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t void *user, void *in, size_t len)\n+{\n+\tstruct my_conn *mco \u003d (struct my_conn *)user;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tgoto do_retry;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n+\t\tlwsl_hexdump_notice(in, len);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n+\t\tlwsl_user(\u0022%s: established\u005cn\u0022, __func__);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_CLOSED:\n+\t\tgoto do_retry;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+\n+do_retry:\n+\t/*\n+\t * retry the connection to keep it nailed up\n+\t *\n+\t * For this example, we try to conceal any problem for one set of\n+\t * backoff retries and then exit the app.\n+\t *\n+\t * If you set retry.conceal_count to be larger than the number of\n+\t * elements in the backoff table, it will never give up and keep\n+\t * retrying at the last backoff delay plus the random jitter amount.\n+\t */\n+\tif (lws_retry_sul_schedule_retry_wsi(wsi, \u0026mco-\u003esul, connect_client,\n+\t\t\t\t\t \u0026mco-\u003eretry_count)) {\n+\t\tlwsl_err(\u0022%s: connection attempts exhausted\u005cn\u0022, __func__);\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{ \u0022lws-minimal-client\u0022, callback_minimal, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\tmemset(\u0026info, 0, sizeof info);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\n+\tlwsl_user(\u0022LWS minimal ws client\u005cn\u0022);\n+\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\n+#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./libwebsockets.org.cer\u0022;\n+#endif\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--protocol\u0022)))\n+\t\tpro \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022)))\n+\t\tserver_address \u003d p;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\tport \u003d atoi(p);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-n\u0022))\n+\t\tssl_connection \u0026\u003d ~LCCSCF_USE_SSL;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-j\u0022))\n+\t\tssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-k\u0022))\n+\t\tssl_connection |\u003d LCCSCF_ALLOW_INSECURE;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-m\u0022))\n+\t\tssl_connection |\u003d LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-e\u0022))\n+\t\tssl_connection |\u003d LCCSCF_ALLOW_EXPIRED;\n+\n+\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* schedule the first client connection attempt to happen immediately */\n+\tlws_sul_schedule(context, 0, \u0026mco.sul, connect_client, 1);\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed\u005cn\u0022);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/README.md b/minimal-examples-lowlevel/ws-server/README.md\nnew file mode 100644\nindex 0000000..b8e7ec2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/README.md\n@@ -0,0 +1,13 @@\n+|Example|Demonstrates|\n+---|---\n+minimal-ws-broker|Simple ws server with a publish / broker / subscribe architecture\n+minimal-ws-server-echo|Simple ws server that listens and echos back anything clients send\n+minimal-ws-server-pmd-bulk|Simple ws server showing how to pass bulk data with permessage-deflate\n+minimal-ws-server-pmd-corner|Corner-case tests for permessage-deflate\n+minimal-ws-server-pmd|Simple ws server with permessage-deflate support\n+minimal-ws-server-ring|Like minimal-ws-server but holds the chat in a multi-tail ringbuffer\n+minimal-ws-server-threadpool|Demonstrates how to use a worker thread pool with lws\n+minimal-ws-server-threads-smp|SMP ws server where data is produced by different threads with multiple lws service threads too\n+minimal-ws-server-threads|Simple ws server where data is produced by different threads\n+minimal-ws-server|Serves an index.html over http that opens a ws shared chat client in a browser\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/CMakeLists.txt\nnew file mode 100644\nindex 0000000..0972dd3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-ws-broker C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-broker)\n+set(SRCS minimal-ws-broker.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/README.md\nnew file mode 100644\nindex 0000000..e6405c2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/README.md\n@@ -0,0 +1,26 @@\n+# lws minimal ws broker\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-broker\n+[2018/03/15 12:23:12:1559] USER: LWS minimal ws broker | visit http://localhost:7681\n+[2018/03/15 12:23:12:1560] NOTICE: Creating Vhost 'default' port 7681, 2 protocols, IPv6 off\n+```\n+\n+Visit http://localhost:7681 on multiple browser windows\n+\n+The page opens a subscribe mode ws connection back to the broker,\n+and a publisher mode ws connection back to the broker.\n+\n+The textarea shows the data from the subscription connection.\n+\n+If you type text is in the text box and press send, the text\n+is passed to the broker on the publisher ws connection and\n+sent to all subscribers.\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/minimal-ws-broker.c b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/minimal-ws-broker.c\nnew file mode 100644\nindex 0000000..cab9af5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/minimal-ws-broker.c\n@@ -0,0 +1,97 @@\n+/*\n+ * lws-minimal-ws-broker\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws,\n+ * with an added publish / broker / subscribe ws server.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws broker | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/example.js\nnew file mode 100644\nindex 0000000..67c8776\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/example.js\n@@ -0,0 +1,80 @@\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar subscriber_ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal-broker\u0022);\n+\ttry {\n+\t\tsubscriber_ws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tsubscriber_ws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value + msg.data + \u0022\u005cn\u0022;\n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tsubscriber_ws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\t\n+\tvar publisher_ws \u003d new_ws(get_appropriate_ws_url(\u0022/publisher\u0022), \u0022lws-minimal-broker\u0022);\n+\ttry {\n+\t\tpublisher_ws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tpublisher_ws.onmessage \u003dfunction got_packet(msg) {\n+\t\t};\n+\t\n+\t\tpublisher_ws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\n+\tfunction sendmsg()\n+\t{\n+\t\tpublisher_ws.send(document.getElementById(\u0022m\u0022).value);\n+\t\tdocument.getElementById(\u0022m\u0022).value \u003d \u0022\u0022;\n+\t}\n+\n+\tdocument.getElementById(\u0022b\u0022).addEventListener(\u0022click\u0022, sendmsg);\n+\n+}, false);\n+\t\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/index.html\nnew file mode 100644\nindex 0000000..c733b95\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/index.html\n@@ -0,0 +1,24 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tLWS chat \u003cb\u003eminimal ws broker example\u003c/b\u003e.\u003cbr\u003e\n+\t\tThis page opens two separate ws connections...\u003cbr\u003e\n+\t\tA subscriber ws connection fills this textarea\u003cbr\u003e\n+\t\twith data it receives from the broker...\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d10\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t... and a publisher ws connection sends the string\u003cbr\u003e\n+\t\tin the box below to the broker when you press Send.\u003cbr\u003e\n+\t\t\u003cinput type\u003d\u0022text\u0022 id\u003dm cols\u003d40 rows\u003d1\u003e\n+\t\t\u003cbutton id\u003db\u003eSend\u003c/button\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-broker/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..0ed24e6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/protocol_lws_minimal.c\n@@ -0,0 +1,217 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal-broker\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This implements a minimal \u0022broker\u0022, for systems that look like this\n+ *\n+ * [ publisher ws client ] \u003c-\u003e [ ws server broker ws server ] \u003c-\u003e [ ws client subscriber ]\n+ *\n+ * The \u0022publisher\u0022 role is to add data to the broker.\n+ *\n+ * The \u0022subscriber\u0022 role is to hear about all data added to the system.\n+ *\n+ * The \u0022broker\u0022 role is to manage incoming data from publishers and pass it out\n+ * to subscribers.\n+ *\n+ * Any number of publishers and subscribers are supported.\n+ *\n+ * This example implements a single ws server, using one ws protocol, that treats ws\n+ * connections as being in publisher or subscriber mode according to the URL the ws\n+ * connection was made to. ws connections to \u0022/publisher\u0022 URL are understood to be\n+ * publishing data and to any other URL, subscribing.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/* one of these created for each message */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/* one of these is created for each client connecting to us */\n+\n+struct per_session_data__minimal {\n+\tstruct per_session_data__minimal *pss_list;\n+\tstruct lws *wsi;\n+\tuint32_t tail;\n+\tchar publishing; /* nonzero: peer is publishing to us */\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n+\n+\tstruct lws_ring *ring; /* ringbuffer holding unsent messages */\n+};\n+\n+/* destroys the message when everyone has had a copy of it */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct msg *pmsg;\n+\tstruct msg amsg;\n+\tchar buf[32];\n+\tint n, m;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!vhd-\u003ering)\n+\t\t\treturn 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tlws_ring_destroy(vhd-\u003ering);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\tpss-\u003etail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tif (lws_hdr_copy(wsi, buf, sizeof(buf), WSI_TOKEN_GET_URI) \u003e 0)\n+\t\t\tpss-\u003epublishing \u003d !strcmp(buf, \u0022/publisher\u0022);\n+\t\tif (!pss-\u003epublishing)\n+\t\t\t/* add subscribers to the list of live pss held in the vhd */\n+\t\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\t/* remove our closing pss from the list of live pss */\n+\t\tlws_ll_fwd_remove(struct per_session_data__minimal, pss_list,\n+\t\t\t\t pss, vhd-\u003epss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\n+\t\tif (pss-\u003epublishing)\n+\t\t\tbreak;\n+\n+\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg)\n+\t\t\tbreak;\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) + LWS_PRE,\n+\t\t\t pmsg-\u003elen, LWS_WRITE_TEXT);\n+\t\tif (m \u003c (int)pmsg-\u003elen) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlws_ring_consume_and_update_oldest_tail(\n+\t\t\tvhd-\u003ering,\t/* lws_ring object */\n+\t\t\tstruct per_session_data__minimal, /* type of objects with tails */\n+\t\t\t\u0026pss-\u003etail,\t/* tail of guy doing the consuming */\n+\t\t\t1,\t\t/* number of payload objects being consumed */\n+\t\t\tvhd-\u003epss_list,\t/* head of list of objects with tails */\n+\t\t\ttail,\t\t/* member name of tail in objects with tails */\n+\t\t\tpss_list\t/* member name of next object in objects with tails */\n+\t\t);\n+\n+\t\t/* more to do? */\n+\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(pss-\u003ewsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\n+\t\tif (!pss-\u003epublishing)\n+\t\t\tbreak;\n+\n+\t\t/*\n+\t\t * For test, our policy is ignore publishing when there are\n+\t\t * no subscribers connected.\n+\t\t */\n+\t\tif (!vhd-\u003epss_list)\n+\t\t\tbreak;\n+\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(vhd-\u003ering);\n+\t\tif (!n) {\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tamsg.len \u003d len;\n+\t\t/* notice we over-allocate by LWS_PRE */\n+\t\tamsg.payload \u003d malloc(LWS_PRE + len);\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmemcpy((char *)amsg.payload + LWS_PRE, in, len);\n+\t\tif (!lws_ring_insert(vhd-\u003ering, \u0026amsg, 1)) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping 2!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/*\n+\t\t * let every subscriber know we want to write something\n+\t\t * on them as soon as they are ready\n+\t\t */\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tif (!(*ppss)-\u003epublishing)\n+\t\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal-broker\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t128, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/CMakeLists.txt\nnew file mode 100644\nindex 0000000..3730212\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-raw-proxy C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-raw-proxy)\n+set(SRCS minimal-ws-raw-proxy.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/README.md\nnew file mode 100644\nindex 0000000..687162e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/README.md\n@@ -0,0 +1,54 @@\n+# lws minimal ws - raw proxy\n+\n+This demonstrates how to use a proxy connection object to bind together two or\n+more connections in a proxy. This particular example has a ws server that\n+creates an onward \u0022raw\u0022 client connection to 127.0.0.1:1234.\n+\n+You can make a suitable \u0022raw server\u0022 with\n+\n+```\n+$ nc -l 127.0.0.1 1234\n+```\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-raw-proxy\n+[2021/03/04 21:14:45:0540] U: LWS minimal ws-raw proxy | visit http://localhost:7681 (-s \u003d use TLS / https)\n+[2021/03/04 21:14:45:0898] N: LWS: 4.1.99-v4.1.0-294-g2776b4ce65, loglevel 1031\n+[2021/03/04 21:14:45:0902] N: NET CLI SRV H1 H2 WS SS-JSON-POL SSPROX IPV6-on\n+[2021/03/04 21:14:45:1146] N: ++ [3224086|wsi|0|pipe] (1)\n+[2021/03/04 21:14:45:1203] N: ++ [3224086|vh|0|netlink] (1)\n+[2021/03/04 21:14:45:1284] N: ++ [3224086|vh|1|localhost||7681] (2)\n+[2021/03/04 21:14:45:1401] N: lws_socket_bind: nowsi: source ads ::\n+[2021/03/04 21:14:45:1425] N: ++ [3224086|wsi|1|listen|localhost||7681] (2)\n+[2021/03/04 21:14:46:1164] N: ++ [3224086|wsisrv|0|adopted] (1)\n+[2021/03/04 21:14:46:2771] N: ++ [3224086|wsisrv|1|adopted] (2)\n+[2021/03/04 21:14:46:3159] N: ++ [3224086|wsicli|0|RAW/raw-skt/127.0.0.1] (1)\n+[2021/03/04 21:14:46:3451] N: ++ [3224086|wsisrv|2|adopted] (3)\n+\n+```\n+\n+Visit http://localhost:7681 in a browser... it loads JS that opens a ws\n+connection to the proxy's ws server side. That causes the proxy to open a\n+raw client connection to 127.0.0.1:1234, and forward anything you type in the\n+browser to the raw server, and anything typed in the raw server (you must\n+press enter on netcat to get it sent) is proxied back to the browser.\n+\n+The proxy can handle many ws connections each with their individual onward\n+raw client connections, so you could open multiple browser windows. But you\n+will need a better \u0022raw server\u0022 than netcat, which is restricted to just the\n+one peer at a time. \n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.cert b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.key b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/minimal-ws-raw-proxy.c b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/minimal-ws-raw-proxy.c\nnew file mode 100644\nindex 0000000..6f66c44\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/minimal-ws-raw-proxy.c\n@@ -0,0 +1,459 @@\n+/*\n+ * lws-minimal-ws-raw-proxy\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a ws (server) -\u003e raw (client) proxy, it's a ws server\n+ * that accepts connections, creates an onward client connection to some other\n+ * no-protocol server, eg, nc -l 127.0.0.1 1234\n+ *\n+ * The idea is to show the general approach for making async proxies using lws\n+ * that are robust and valgrind-clean.\n+ *\n+ * There's no vhd or pss on either side. Instead when the ws server gets an\n+ * incoming connection and negotiates the ws link, he creates an object\n+ * representing the proxied connection, it is not destroyed automatically when\n+ * any particular wsi is closed, instead the last wsi that is part of the\n+ * proxied connection destroys it when he is closed.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cstring.h\u003e\n+\n+/* one of these created for each pending message that is to be forwarded */\n+\n+typedef struct proxy_msg {\n+\tlws_dll2_t\t\tlist;\n+\tsize_t\t\t\tlen;\n+\t/*\n+\t * the packet content is overallocated here, if p is a pointer to\n+\t * this struct, you can get a pointer to the message contents by\n+\t * ((uint8_t)\u0026p[1]) + LWS_PRE.\n+\t *\n+\t * Notice we additionally take care to overallocate LWS_PRE before the\n+\t * actual message data, so we can simplify sending it.\n+\t */\n+} proxy_msg_t;\n+\n+/*\n+ * One of these is created when a inbound ws connection joins, it represents\n+ * the proxy action provoked by that.\n+ */\n+\n+typedef struct proxy_conn {\n+\tstruct lws\t\t*wsi_ws; /* wsi for the inbound ws conn */\n+\tstruct lws\t\t*wsi_raw; /* wsi for the outbound raw conn */\n+\n+\tlws_dll2_owner_t\tpending_msg_to_ws;\n+\tlws_dll2_owner_t\tpending_msg_to_raw;\n+} proxy_conn_t;\n+\n+\n+static int\n+proxy_ws_raw_msg_destroy(struct lws_dll2 *d, void *user)\n+{\n+\tproxy_msg_t *msg \u003d lws_container_of(d, proxy_msg_t, list);\n+\n+\tlws_dll2_remove(d);\n+\tfree(msg);\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * First the ws server side\n+ */\n+\n+static int\n+callback_proxy_ws_server(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\tproxy_conn_t *pc \u003d (proxy_conn_t *)lws_get_opaque_user_data(wsi);\n+\tstruct lws_client_connect_info i;\n+\tproxy_msg_t *msg;\n+\tuint8_t *data;\n+\tint m, a;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* so let's create the proxy connection object */\n+\t\tpc \u003d malloc(sizeof(*pc));\n+\t\tmemset(pc, 0, sizeof(*pc));\n+\n+\t\t/* mark this accepted ws connection with the proxy conn obj */\n+\t\tlws_set_opaque_user_data(wsi, pc);\n+\t\t/* tell the proxy conn object that we are the ws side of it */\n+\t\tpc-\u003ewsi_ws \u003d wsi;\n+\n+\t\t/*\n+\t\t * For this example proxy, our job is to create a new, onward,\n+\t\t * raw client connection to proxy stuff on to\n+\t\t */\n+\n+\t\tmemset(\u0026i, 0, sizeof(i));\n+\n+\t\ti.method \u003d \u0022RAW\u0022;\n+\t\ti.context \u003d lws_get_context(wsi);\n+\t\ti.port \u003d 1234;\n+\t\ti.address \u003d \u0022127.0.0.1\u0022;\n+\t\ti.ssl_connection \u003d 0;\n+\t\ti.local_protocol_name \u003d \u0022lws-ws-raw-raw\u0022;\n+\n+\t\t/* also mark the onward, raw client conn with the proxy_conn */\n+\t\ti.opaque_user_data \u003d pc;\n+\t\t/* if it succeeds, set the wsi into the proxy_conn */\n+\t\ti.pwsi \u003d \u0026pc-\u003ewsi_raw;\n+\n+\t\tif (!lws_client_connect_via_info(\u0026i)) {\n+\t\t\tlwsl_warn(\u0022%s: onward connection failed\u005cn\u0022, __func__);\n+\t\t\treturn -1; /* hang up on the ws client, triggering\n+\t\t\t\t * _CLOSE flow */\n+\t\t}\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\t/*\n+\t\t * Clean up any pending messages to us that are never going\n+\t\t * to get delivered now, we are in the middle of closing\n+\t\t */\n+\t\tlws_dll2_foreach_safe(\u0026pc-\u003epending_msg_to_ws, NULL,\n+\t\t\t\t proxy_ws_raw_msg_destroy);\n+\n+\t\t/*\n+\t\t * Remove our pointer from the proxy_conn... we are about to\n+\t\t * be destroyed.\n+\t\t */\n+\t\tpc-\u003ewsi_ws \u003d NULL;\n+\t\tlws_set_opaque_user_data(wsi, NULL);\n+\n+\t\tif (!pc-\u003ewsi_raw) {\n+\t\t\t/*\n+\t\t\t * The onward raw conn either never got started or is\n+\t\t\t * already closed... then we are the last guy still\n+\t\t\t * holding on to the proxy_conn... and we're going away\n+\t\t\t * so let's destroy it\n+\t\t\t */\n+\n+\t\t\tfree(pc);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/*\n+\t\t * Onward conn still alive...\n+\t\t * does he have stuff left to deliver?\n+\t\t */\n+\t\tif (pc-\u003epending_msg_to_raw.count) {\n+\t\t\t/*\n+\t\t\t * Yes, let him get on with trying to send\n+\t\t\t * the remaining pieces... but put a time limit\n+\t\t\t * on how hard he will try now the ws part is\n+\t\t\t * disappearing... give him 3s\n+\t\t\t */\n+\t\t\tlws_set_timeout(pc-\u003ewsi_raw,\n+\t\t\t\tPENDING_TIMEOUT_KILLED_BY_PROXY_CLIENT_CLOSE, 3);\n+\t\t\tbreak;\n+\t\t}\n+\t\t/*\n+\t\t * Onward raw client conn doesn't have anything left\n+\t\t * to do, let's close him right after this, he will take care to\n+\t\t * destroy the proxy_conn when he goes down after he sees we\n+\t\t * have already been closed\n+\t\t */\n+\n+\t\tlws_wsi_close(pc-\u003ewsi_raw, LWS_TO_KILL_ASYNC);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tif (!pc || !pc-\u003epending_msg_to_ws.count)\n+\t\t\tbreak;\n+\n+\t\tmsg \u003d lws_container_of(pc-\u003epending_msg_to_ws.head,\n+\t\t\t\t proxy_msg_t, list);\n+\t\tdata \u003d (uint8_t *)\u0026msg[1] + LWS_PRE;\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, data, msg-\u003elen, LWS_WRITE_TEXT);\n+\t\ta \u003d (int)msg-\u003elen;\n+\t\tlws_dll2_remove(\u0026msg-\u003elist);\n+\t\tfree(msg);\n+\n+\t\tif (m \u003c a) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/*\n+\t\t * If more to do...\n+\t\t */\n+\t\tif (pc-\u003epending_msg_to_ws.count)\n+\t\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\t\tif (!pc || !pc-\u003ewsi_raw)\n+\t\t\tbreak;\n+\n+\t\t/* notice we over-allocate by LWS_PRE + rx len */\n+\t\tmsg \u003d (proxy_msg_t *)malloc(sizeof(*msg) + LWS_PRE + len);\n+\t\tdata \u003d (uint8_t *)\u0026msg[1] + LWS_PRE;\n+\n+\t\tif (!msg) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmemset(msg, 0, sizeof(*msg));\n+\t\tmsg-\u003elen \u003d len;\n+\t\tmemcpy(data, in, len);\n+\n+\t\t/* add us on to the list of packets to send to the onward conn */\n+\t\tlws_dll2_add_tail(\u0026msg-\u003elist, \u0026pc-\u003epending_msg_to_raw);\n+\n+\t\t/* ask to send on the onward proxy client conn */\n+\t\tlws_callback_on_writable(pc-\u003ewsi_raw);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * Then the onward, raw client side\n+ */\n+\n+static int\n+callback_proxy_raw_client(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\tproxy_conn_t *pc \u003d (proxy_conn_t *)lws_get_opaque_user_data(wsi);\n+\tproxy_msg_t *msg;\n+\tuint8_t *data;\n+\tint m, a;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_warn(\u0022%s: onward raw connection failed\u005cn\u0022, __func__);\n+\t\tpc-\u003ewsi_raw \u003d NULL;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_ADOPT:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_ADOPT\u005cn\u0022);\n+\t\tpc-\u003ewsi_raw \u003d wsi;\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_CLOSE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_CLOSE\u005cn\u0022);\n+\t\t/*\n+\t\t * Clean up any pending messages to us that are never going\n+\t\t * to get delivered now, we are in the middle of closing\n+\t\t */\n+\t\tlws_dll2_foreach_safe(\u0026pc-\u003epending_msg_to_raw, NULL,\n+\t\t\t\t proxy_ws_raw_msg_destroy);\n+\n+\t\t/*\n+\t\t * Remove our pointer from the proxy_conn... we are about to\n+\t\t * be destroyed.\n+\t\t */\n+\t\tpc-\u003ewsi_raw \u003d NULL;\n+\t\tlws_set_opaque_user_data(wsi, NULL);\n+\n+\t\tif (!pc-\u003ewsi_ws) {\n+\t\t\t/*\n+\t\t\t * The original ws conn is already closed... then we are\n+\t\t\t * the last guy still holding on to the proxy_conn...\n+\t\t\t * and we're going away, so let's destroy it\n+\t\t\t */\n+\n+\t\t\tfree(pc);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/*\n+\t\t * Original ws conn still alive...\n+\t\t * does he have stuff left to deliver?\n+\t\t */\n+\t\tif (pc-\u003epending_msg_to_ws.count) {\n+\t\t\t/*\n+\t\t\t * Yes, let him get on with trying to send\n+\t\t\t * the remaining pieces... but put a time limit\n+\t\t\t * on how hard he will try now the raw part is\n+\t\t\t * disappearing... give him 3s\n+\t\t\t */\n+\t\t\tlws_set_timeout(pc-\u003ewsi_ws,\n+\t\t\t\tPENDING_TIMEOUT_KILLED_BY_PROXY_CLIENT_CLOSE, 3);\n+\t\t\tbreak;\n+\t\t}\n+\t\t/*\n+\t\t * Original ws client conn doesn't have anything left\n+\t\t * to do, let's close him right after this, he will take care to\n+\t\t * destroy the proxy_conn when he goes down after he sees we\n+\t\t * have already been closed\n+\t\t */\n+\n+\t\tlws_wsi_close(pc-\u003ewsi_ws, LWS_TO_KILL_ASYNC);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_RX:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_RX (%d)\u005cn\u0022, (int)len);\n+\t\tif (!pc || !pc-\u003ewsi_ws)\n+\t\t\tbreak;\n+\n+\t\t/* notice we over-allocate by LWS_PRE + rx len */\n+\t\tmsg \u003d (proxy_msg_t *)malloc(sizeof(*msg) + LWS_PRE + len);\n+\t\tdata \u003d (uint8_t *)\u0026msg[1] + LWS_PRE;\n+\n+\t\tif (!msg) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmemset(msg, 0, sizeof(*msg));\n+\t\tmsg-\u003elen \u003d len;\n+\t\tmemcpy(data, in, len);\n+\n+\t\t/* add us on to the list of packets to send to the onward conn */\n+\t\tlws_dll2_add_tail(\u0026msg-\u003elist, \u0026pc-\u003epending_msg_to_ws);\n+\n+\t\t/* ask to send on the onward proxy client conn */\n+\t\tlws_callback_on_writable(pc-\u003ewsi_ws);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RAW_WRITEABLE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RAW_WRITEABLE\u005cn\u0022);\n+\t\tif (!pc || !pc-\u003epending_msg_to_raw.count)\n+\t\t\tbreak;\n+\n+\t\tmsg \u003d lws_container_of(pc-\u003epending_msg_to_raw.head,\n+\t\t\t\t proxy_msg_t, list);\n+\t\tdata \u003d (uint8_t *)\u0026msg[1] + LWS_PRE;\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, data, msg-\u003elen, LWS_WRITE_TEXT);\n+\t\ta \u003d (int)msg-\u003elen;\n+\t\tlws_dll2_remove(\u0026msg-\u003elist);\n+\t\tfree(msg);\n+\n+\t\tif (m \u003c a) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to raw\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/*\n+\t\t * If more to do...\n+\t\t */\n+\t\tif (pc-\u003epending_msg_to_raw.count)\n+\t\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\t{ \u0022lws-ws-raw-ws\u0022, callback_proxy_ws_server, 0, 1024, 0, NULL, 0 },\n+\t{ \u0022lws-ws-raw-raw\u0022, callback_proxy_raw_client, 0, 1024, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping \u003d 3,\n+\t.secs_since_valid_hangup \u003d 10,\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws-raw proxy | visit http://localhost:7681 (-s \u003d use TLS / https)\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.vhost_name \u003d \u0022localhost\u0022;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tlwsl_user(\u0022Server using TLS\u005cn\u0022);\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-h\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-v\u0022))\n+\t\tinfo.retry_and_idle_policy \u003d \u0026retry;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/example.js\nnew file mode 100644\nindex 0000000..d350dee\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/example.js\n@@ -0,0 +1,66 @@\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\t\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-ws-raw-ws\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 0;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value + msg.data + \u0022\u005cn\u0022;\n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 1;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\t\n+\tfunction sendmsg()\n+\t{\n+\t\tws.send(document.getElementById(\u0022m\u0022).value);\n+\t\tdocument.getElementById(\u0022m\u0022).value \u003d \u0022\u0022;\n+\t}\n+\t\n+\tdocument.getElementById(\u0022b\u0022).addEventListener(\u0022click\u0022, sendmsg);\n+\t\n+}, false);\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/index.html\nnew file mode 100644\nindex 0000000..9c1dc9a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\t\n+\t\tLWS chat \u003cb\u003eminimal ws server example\u003c/b\u003e.\u003cbr\u003e\n+\t\tChat is sent to all browsers open on this page.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d10\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\t\u003cinput type\u003d\u0022text\u0022 id\u003dm cols\u003d40 rows\u003d1\u003e\n+\t\t\u003cbutton id\u003db\u003eSend\u003c/button\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/CMakeLists.txt\nnew file mode 100644\nindex 0000000..0b8a4e5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-server-echo C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-echo)\n+set(SRCS minimal-ws-server-echo.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/README.md\nnew file mode 100644\nindex 0000000..bf65c6e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/README.md\n@@ -0,0 +1,30 @@\n+# lws minimal ws server + permessage-deflate echo\n+\n+This example serves no-protocl-name ws on localhost:7681\n+and echoes back anything that comes from the client.\n+\n+You can use it for testing lws against Autobahn (use the\n+-p option to tell it to listen on 9001 for that)\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-p port|Port to connect to\n+-u url|URL path part to connect to\n+-o|Finish after one connection\n+\n+```\n+ $ ./lws-minimal-ws-server-echo\n+[2018/04/24 10:29:34:6212] USER: LWS minimal ws server echo + permessage-deflate + multifragment bulk message\n+[2018/04/24 10:29:34:6213] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off\n+...\n+```\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/minimal-ws-server-echo.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/minimal-ws-server-echo.c\nnew file mode 100644\nindex 0000000..7a8e946\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/minimal-ws-server-echo.c\n@@ -0,0 +1,118 @@\n+/*\n+ * lws-minimal-ws-server-echo\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a ws server that echoes back what it was sent, in a way\n+ * compatible with autobahn -m fuzzingclient\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal_server_echo.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL_SERVER_ECHO,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted, port \u003d 7681, options;\n+\n+/* pass pointers to shared vars to the protocol */\n+\n+static const struct lws_protocol_vhost_options pvo_options \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022options\u0022,\t\t/* pvo name */\n+\t(void *)\u0026options\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo_interrupted \u003d {\n+\t\u0026pvo_options,\n+\tNULL,\n+\t\u0022interrupted\u0022,\t\t/* pvo name */\n+\t(void *)\u0026interrupted\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_interrupted,\t\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-minimal-server-echo\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t\t\t/* ignored */\n+};\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022,\n+\t\tlws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022\n+\t\t \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws client echo + permessage-deflate + multifragment bulk message\u005cn\u0022);\n+\tlwsl_user(\u0022 lws-minimal-ws-client-echo [-n (no exts)] [-p port] [-o (once)]\u005cn\u0022);\n+\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022)))\n+\t\tport \u003d atoi(p);\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-o\u0022))\n+\t\toptions |\u003d 1;\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d port;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+\tif (!lws_cmdline_option(argc, argv, \u0022-n\u0022))\n+\t\tinfo.extensions \u003d extensions;\n+\tinfo.pt_serv_buf_size \u003d 32 * 1024;\n+\tinfo.options \u003d LWS_SERVER_OPTION_VALIDATE_UTF8 |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022Completed %s\u005cn\u0022, interrupted \u003d\u003d 2 ? \u0022OK\u0022 : \u0022failed\u0022);\n+\n+\treturn interrupted !\u003d 2;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/protocol_lws_minimal_server_echo.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/protocol_lws_minimal_server_echo.c\nnew file mode 100644\nindex 0000000..84c67f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/protocol_lws_minimal_server_echo.c\n@@ -0,0 +1,232 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal-server-echo\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The protocol shows how to send and receive bulk messages over a ws connection\n+ * that optionally may have the permessage-deflate extension negotiated on it.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+#define RING_DEPTH 4096\n+\n+/* one of these created for each message */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+\tchar binary;\n+\tchar first;\n+\tchar final;\n+};\n+\n+struct per_session_data__minimal_server_echo {\n+\tstruct lws_ring *ring;\n+\tuint32_t msglen;\n+\tuint32_t tail;\n+\tuint8_t completed:1;\n+\tuint8_t flow_controlled:1;\n+\tuint8_t write_consume_pending:1;\n+};\n+\n+struct vhd_minimal_server_echo {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\n+\tint *interrupted;\n+\tint *options;\n+};\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+#include \u003cassert.h\u003e\n+static int\n+callback_minimal_server_echo(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal_server_echo *pss \u003d\n+\t\t\t(struct per_session_data__minimal_server_echo *)user;\n+\tstruct vhd_minimal_server_echo *vhd \u003d (struct vhd_minimal_server_echo *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct msg *pmsg;\n+\tstruct msg amsg;\n+\tint m, n, flags;\n+\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct vhd_minimal_server_echo));\n+\t\tif (!vhd)\n+\t\t\treturn -1;\n+\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\t/* get the pointers we were passed in pvo */\n+\n+\t\tvhd-\u003einterrupted \u003d (int *)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022interrupted\u0022)-\u003evalue;\n+\t\tvhd-\u003eoptions \u003d (int *)lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022options\u0022)-\u003evalue;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* generate a block of output before travis times us out */\n+\t\tlwsl_warn(\u0022LWS_CALLBACK_ESTABLISHED\u005cn\u0022);\n+\t\tpss-\u003ering \u003d lws_ring_create(sizeof(struct msg), RING_DEPTH,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!pss-\u003ering)\n+\t\t\treturn 1;\n+\t\tpss-\u003etail \u003d 0;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_SERVER_WRITEABLE\u005cn\u0022);\n+\n+\t\tif (pss-\u003ewrite_consume_pending) {\n+\t\t\t/* perform the deferred fifo consume */\n+\t\t\tlws_ring_consume_single_tail(pss-\u003ering, \u0026pss-\u003etail, 1);\n+\t\t\tpss-\u003ewrite_consume_pending \u003d 0;\n+\t\t}\n+\n+\t\tpmsg \u003d lws_ring_get_element(pss-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg) {\n+\t\t\tlwsl_user(\u0022 (nothing in ring)\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tflags \u003d lws_write_ws_flags(\n+\t\t\t pmsg-\u003ebinary ? LWS_WRITE_BINARY : LWS_WRITE_TEXT,\n+\t\t\t pmsg-\u003efirst, pmsg-\u003efinal);\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) +\n+\t\t\t LWS_PRE, pmsg-\u003elen, (enum lws_write_protocol)flags);\n+\t\tif (m \u003c (int)pmsg-\u003elen) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlwsl_user(\u0022 wrote %d: flags: 0x%x first: %d final %d\u005cn\u0022,\n+\t\t\t\tm, flags, pmsg-\u003efirst, pmsg-\u003efinal);\n+\t\t/*\n+\t\t * Workaround deferred deflate in pmd extension by only\n+\t\t * consuming the fifo entry when we are certain it has been\n+\t\t * fully deflated at the next WRITABLE callback. You only need\n+\t\t * this if you're using pmd.\n+\t\t */\n+\t\tpss-\u003ewrite_consume_pending \u003d 1;\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\tif (pss-\u003eflow_controlled \u0026\u0026\n+\t\t (int)lws_ring_get_count_free_elements(pss-\u003ering) \u003e RING_DEPTH - 5) {\n+\t\t\tlws_rx_flow_control(wsi, 1);\n+\t\t\tpss-\u003eflow_controlled \u003d 0;\n+\t\t}\n+\n+\t\tif ((*vhd-\u003eoptions \u0026 1) \u0026\u0026 pmsg \u0026\u0026 pmsg-\u003efinal)\n+\t\t\tpss-\u003ecompleted \u003d 1;\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RECEIVE: %4d (rpp %5d, first %d, \u0022\n+\t\t\t \u0022last %d, bin %d, msglen %d (+ %d \u003d %d))\u005cn\u0022,\n+\t\t\t (int)len, (int)lws_remaining_packet_payload(wsi),\n+\t\t\t lws_is_first_fragment(wsi),\n+\t\t\t lws_is_final_fragment(wsi),\n+\t\t\t lws_frame_is_binary(wsi), pss-\u003emsglen, (int)len,\n+\t\t\t (int)pss-\u003emsglen + (int)len);\n+\n+\t\tif (len) {\n+\t\t\t;\n+\t\t\t//puts((const char *)in);\n+\t\t\t//lwsl_hexdump_notice(in, len);\n+\t\t}\n+\n+\t\tamsg.first \u003d (char)lws_is_first_fragment(wsi);\n+\t\tamsg.final \u003d (char)lws_is_final_fragment(wsi);\n+\t\tamsg.binary \u003d (char)lws_frame_is_binary(wsi);\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(pss-\u003ering);\n+\t\tif (!n) {\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tif (amsg.final)\n+\t\t\tpss-\u003emsglen \u003d 0;\n+\t\telse\n+\t\t\tpss-\u003emsglen +\u003d (uint32_t)len;\n+\n+\t\tamsg.len \u003d len;\n+\t\t/* notice we over-allocate by LWS_PRE */\n+\t\tamsg.payload \u003d malloc(LWS_PRE + len);\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmemcpy((char *)amsg.payload + LWS_PRE, in, len);\n+\t\tif (!lws_ring_insert(pss-\u003ering, \u0026amsg, 1)) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\t\tlws_callback_on_writable(wsi);\n+\n+\t\tif (n \u003c 3 \u0026\u0026 !pss-\u003eflow_controlled) {\n+\t\t\tpss-\u003eflow_controlled \u003d 1;\n+\t\t\tlws_rx_flow_control(wsi, 0);\n+\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLOSED\u005cn\u0022);\n+\t\tlws_ring_destroy(pss-\u003ering);\n+\n+\t\tif (*vhd-\u003eoptions \u0026 1) {\n+\t\t\tif (!*vhd-\u003einterrupted)\n+\t\t\t\t*vhd-\u003einterrupted \u003d 1 + pss-\u003ecompleted;\n+\t\t\tlws_cancel_service(lws_get_context(wsi));\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL_SERVER_ECHO \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal-server-echo\u0022, \u005c\n+\t\tcallback_minimal_server_echo, \u005c\n+\t\tsizeof(struct per_session_data__minimal_server_echo), \u005c\n+\t\t1024, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt\nnew file mode 100644\nindex 0000000..5bb69d0\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-server-pmd-bulk C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-pmd-bulk)\n+set(SRCS minimal-ws-server-pmd-bulk.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+#require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/README.md\nnew file mode 100644\nindex 0000000..274dbf9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/README.md\n@@ -0,0 +1,21 @@\n+# lws minimal ws server + permessage-deflate for bulk traffic\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server-pmd-bulk\n+[2018/03/04 09:30:02:7986] USER: LWS minimal ws server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681 in your browser\n+\n+One or another kind of bulk ws transfer is made to the browser.\n+\n+The ws connection is made via permessage-deflate extension.\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/minimal-ws-server-pmd-bulk.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/minimal-ws-server-pmd-bulk.c\nnew file mode 100644\nindex 0000000..fbda461\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/minimal-ws-server-pmd-bulk.c\n@@ -0,0 +1,143 @@\n+/*\n+ * lws-minimal-ws-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal_pmd_bulk.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL_PMD_BULK,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted, options;\n+\n+/* pass pointers to shared vars to the protocol */\n+\n+static const struct lws_protocol_vhost_options pvo_options \u003d {\n+ NULL,\n+ NULL,\n+ \u0022options\u0022, /* pvo name */\n+ (void *)\u0026options /* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo_interrupted \u003d {\n+ \u0026pvo_options,\n+ NULL,\n+ \u0022interrupted\u0022, /* pvo name */\n+ (void *)\u0026interrupted /* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+ NULL, /* \u0022next\u0022 pvo linked-list */\n+ \u0026pvo_interrupted, /* \u0022child\u0022 pvo linked-list */\n+ \u0022lws-minimal-pmd-bulk\u0022, /* protocol name we belong to on this vhost */\n+ \u0022\u0022 /* ignored */\n+};\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022,\n+\t\tlws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022\n+\t\t \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server + permessage-deflate | visit http://localhost:7681\u005cn\u0022);\n+\tlwsl_user(\u0022 %s [-n (no exts)] [-c (compressible)] [-b (blob)]\u005cn\u0022, argv[0]);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tif (!lws_cmdline_option(argc, argv, \u0022-n\u0022))\n+\t\tinfo.extensions \u003d extensions;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-c\u0022))\n+\t\toptions |\u003d 1; /* send compressible text */\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-b\u0022))\n+\t\toptions |\u003d 2; /* send in one giant blob */\n+\n+\tinfo.pt_serv_buf_size \u003d 32 * 1024;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/example.js\nnew file mode 100644\nindex 0000000..33911b4\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/example.js\n@@ -0,0 +1,62 @@\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal-pmd-bulk\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t\tdocument.getElementById(\u0022status\u0022).textContent \u003d \u0022ws open \u0022+ ws.extensions;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003d function got_packet(msg) {\n+\t\t\tconsole.log(\u0022Received ws message len \u0022 + msg.data.size);\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value + \u0022\u005cnReceived: \u0022 + msg.data.size + \u0022 bytes\u005cn\u0022;\n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\n+\t\t\t/* echo it back */\n+\t\t\tws.send(msg.data);\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 1;\n+\t\t\tdocument.getElementById(\u0022status\u0022).textContent \u003d \u0022ws closed\u0022;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\n+}, false);\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/index.html\nnew file mode 100644\nindex 0000000..f54f1cc\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tLWS bulk transfer example\u003c/b\u003e.\u003cbr\u003e\n+\t\tA large ws message is sent to all browsers open on this page.\u003cbr\u003e\n+\t\tThe browser js echoes the large ws message back to the server.\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003cspan id\u003dstatus\u003eWs closed\u003c/span\u003e\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d10\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/protocol_lws_minimal_pmd_bulk.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/protocol_lws_minimal_pmd_bulk.c\nnew file mode 100644\nindex 0000000..22b99a1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/protocol_lws_minimal_pmd_bulk.c\n@@ -0,0 +1,223 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal-pmd-bulk\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The protocol shows how to send and receive bulk messages over a ws connection\n+ * that optionally may have the permessage-deflate extension negotiated on it.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/*\n+ * We will produce a large ws message either from this text repeated many times,\n+ * or from 0x40 + a 6-bit pseudorandom number\n+ */\n+\n+static const char * const redundant_string \u003d\n+\t\u0022No one would have believed in the last years of the nineteenth \u0022\n+\t\u0022century that this world was being watched keenly and closely by \u0022\n+\t\u0022intelligences greater than man's and yet as mortal as his own; that as \u0022\n+\t\u0022men busied themselves about their various concerns they were \u0022\n+\t\u0022scrutinised and studied, perhaps almost as narrowly as a man with a \u0022\n+\t\u0022microscope might scrutinise the transient creatures that swarm and \u0022\n+\t\u0022multiply in a drop of water. With infinite complacency men went to \u0022\n+\t\u0022and fro over this globe about their little affairs, serene in their \u0022\n+\t\u0022assurance of their empire over matter. It is possible that the \u0022\n+\t\u0022infusoria under the microscope do the same. No one gave a thought to \u0022\n+\t\u0022the older worlds of space as sources of human danger, or thought of \u0022\n+\t\u0022them only to dismiss the idea of life upon them as impossible or \u0022\n+\t\u0022improbable. It is curious to recall some of the mental habits of \u0022\n+\t\u0022those departed days. At most terrestrial men fancied there might be \u0022\n+\t\u0022other men upon Mars, perhaps inferior to themselves and ready to \u0022\n+\t\u0022welcome a missionary enterprise. Yet across the gulf of space, minds \u0022\n+\t\u0022that are to our minds as ours are to those of the beasts that perish, \u0022\n+\t\u0022intellects vast and cool and unsympathetic, regarded this earth with \u0022\n+\t\u0022envious eyes, and slowly and surely drew their plans against us. And \u0022\n+\t\u0022early in the twentieth century came the great disillusionment. \u0022\n+;\n+\n+/* this reflects the length of the string above */\n+#define REPEAT_STRING_LEN 1337\n+/* this is the total size of the ws message we will send */\n+#define MESSAGE_SIZE (100 * REPEAT_STRING_LEN)\n+/* this is how much we will send each time the connection is writable */\n+#define MESSAGE_CHUNK_SIZE (1 * 1024)\n+\n+/* one of these is created for each client connecting to us */\n+\n+struct per_session_data__minimal_pmd_bulk {\n+\tint position_tx, position_rx;\n+\tuint64_t rng_rx, rng_tx;\n+};\n+\n+struct vhd_minimal_pmd_bulk {\n+ int *interrupted;\n+ /*\n+ * b0 \u003d 1: test compressible text, \u003d 0: test uncompressible binary\n+ * b1 \u003d 1: send as a single blob, \u003d 0: send as fragments\n+ */\n+\tint *options;\n+};\n+\n+static uint64_t rng(uint64_t *r)\n+{\n+\t*r ^\u003d *r \u003c\u003c 21;\n+\t*r ^\u003d *r \u003e\u003e 35;\n+\t*r ^\u003d *r \u003c\u003c 4;\n+\n+\treturn *r;\n+}\n+\n+static int\n+callback_minimal_pmd_bulk(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal_pmd_bulk *pss \u003d\n+\t\t\t(struct per_session_data__minimal_pmd_bulk *)user;\n+ struct vhd_minimal_pmd_bulk *vhd \u003d (struct vhd_minimal_pmd_bulk *)\n+ lws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+ lws_get_protocol(wsi));\n+\tuint8_t buf[LWS_PRE + MESSAGE_SIZE], *start \u003d \u0026buf[LWS_PRE], *p;\n+\tint n, m, flags, olen, amount;\n+\n+\tswitch (reason) {\n+ case LWS_CALLBACK_PROTOCOL_INIT:\n+ vhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+ lws_get_protocol(wsi),\n+ sizeof(struct vhd_minimal_pmd_bulk));\n+ if (!vhd)\n+ return -1;\n+\n+ /* get the pointer to \u0022interrupted\u0022 we were passed in pvo */\n+ vhd-\u003einterrupted \u003d (int *)lws_pvo_search(\n+ (const struct lws_protocol_vhost_options *)in,\n+ \u0022interrupted\u0022)-\u003evalue;\n+ vhd-\u003eoptions \u003d (int *)lws_pvo_search(\n+ (const struct lws_protocol_vhost_options *)in,\n+ \u0022options\u0022)-\u003evalue;\n+ break;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\tpss-\u003erng_tx \u003d 4;\n+\t\tpss-\u003erng_rx \u003d 4;\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tif (pss-\u003eposition_tx \u003d\u003d MESSAGE_SIZE)\n+\t\t\tbreak;\n+\n+\t\tamount \u003d MESSAGE_CHUNK_SIZE;\n+\t\tif ((*vhd-\u003eoptions) \u0026 2) {\n+\t\t\tamount \u003d MESSAGE_SIZE;\n+\t\t\tlwsl_user(\u0022(writing as one blob of %d)\u005cn\u0022, amount);\n+\t\t}\n+\n+\t\t/* fill up one chunk's worth of message content */\n+\n+\t\tp \u003d start;\n+\t\tn \u003d amount;\n+\t\tif (n \u003e MESSAGE_SIZE - pss-\u003eposition_tx)\n+\t\t\tn \u003d MESSAGE_SIZE - pss-\u003eposition_tx;\n+\n+\t\tflags \u003d lws_write_ws_flags(LWS_WRITE_BINARY, !pss-\u003eposition_tx,\n+\t\t\t\t\t pss-\u003eposition_tx + n \u003d\u003d MESSAGE_SIZE);\n+\n+\t\t/*\n+\t\t * select between producing compressible repeated text,\n+\t\t * or uncompressible PRNG output\n+\t\t */\n+\n+\t\tif (*vhd-\u003eoptions \u0026 1) {\n+\t\t\twhile (n) {\n+\t\t\t\tsize_t s;\n+\n+\t\t\t\tm \u003d pss-\u003eposition_tx % REPEAT_STRING_LEN;\n+\t\t\t\ts \u003d (unsigned int)(REPEAT_STRING_LEN - m);\n+\t\t\t\tif (s \u003e (size_t)n)\n+\t\t\t\t\ts \u003d (unsigned int)n;\n+\t\t\t\tmemcpy(p, \u0026redundant_string[m], s);\n+\t\t\t\tpss-\u003eposition_tx +\u003d (int)s;\n+\t\t\t\tp +\u003d s;\n+\t\t\t\tn -\u003d (int)s;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tpss-\u003eposition_tx +\u003d n;\n+\t\t\twhile (n--)\n+\t\t\t\t*p++ \u003d (uint8_t)rng(\u0026pss-\u003erng_tx);\n+\t\t}\n+\n+\t\tn \u003d lws_ptr_diff(p, start);\n+\t\tm \u003d lws_write(wsi, start, (unsigned int)n, (enum lws_write_protocol)flags);\n+\t\tlwsl_user(\u0022LWS_CALLBACK_SERVER_WRITEABLE: wrote %d\u005cn\u0022, n);\n+\t\tif (m \u003c n) {\n+\t\t\tlwsl_err(\u0022ERROR %d / %d writing ws\u005cn\u0022, m, n);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tif (pss-\u003eposition_tx !\u003d MESSAGE_SIZE) /* if more to do... */\n+\t\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RECEIVE: %4d (pss-\u003epos\u003d%d, rpp %5d, last %d)\u005cn\u0022,\n+\t\t\t\t(int)len, (int)pss-\u003eposition_rx, (int)lws_remaining_packet_payload(wsi),\n+\t\t\t\tlws_is_final_fragment(wsi));\n+\t\tolen \u003d (int)len;\n+\n+\t\tif (*vhd-\u003eoptions \u0026 1) {\n+\t\t\twhile (len) {\n+\t\t\t\tsize_t s;\n+\t\t\t\tm \u003d pss-\u003eposition_rx % REPEAT_STRING_LEN;\n+\t\t\t\ts \u003d (unsigned int)(REPEAT_STRING_LEN - m);\n+\t\t\t\tif (s \u003e len)\n+\t\t\t\t\ts \u003d len;\n+\t\t\t\tif (memcmp(in, \u0026redundant_string[m], s)) {\n+\t\t\t\t\tlwsl_user(\u0022echo'd data doesn't match\u005cn\u0022);\n+\t\t\t\t\treturn -1;\n+\t\t\t\t}\n+\t\t\t\tpss-\u003eposition_rx +\u003d (int)s;\n+\t\t\t\tin \u003d ((char *)in) + s;\n+\t\t\t\tlen -\u003d s;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tp \u003d (uint8_t *)in;\n+\t\t\tpss-\u003eposition_rx +\u003d (int)len;\n+\t\t\twhile (len--) {\n+\t\t\t\tif (*p++ !\u003d (uint8_t)rng(\u0026pss-\u003erng_rx)) {\n+\t\t\t\t\tlwsl_user(\u0022echo'd data doesn't match: 0x%02X 0x%02X (%d)\u005cn\u0022,\n+\t\t\t\t\t\t*(p - 1), (int)(0x40 + (pss-\u003erng_rx \u0026 0x3f)),\n+\t\t\t\t\t\t(int)((pss-\u003eposition_rx - olen) + olen - (int)len));\n+\t\t\t\t\tlwsl_hexdump_notice(in, (unsigned int)olen);\n+\t\t\t\t\treturn -1;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif (pss-\u003eposition_rx \u003d\u003d MESSAGE_SIZE)\n+\t\t\t\tpss-\u003eposition_rx \u003d 0;\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL_PMD_BULK \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal-pmd-bulk\u0022, \u005c\n+\t\tcallback_minimal_pmd_bulk, \u005c\n+\t\tsizeof(struct per_session_data__minimal_pmd_bulk), \u005c\n+\t\t4096, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/CMakeLists.txt\nnew file mode 100644\nindex 0000000..9be9eb9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-server-pmd-corner C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-pmd-corner)\n+set(SRCS minimal-ws-server-pmd-corner.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/README.md\nnew file mode 100644\nindex 0000000..eb5a738\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/README.md\n@@ -0,0 +1,24 @@\n+# lws minimal ws server + permessage-deflate corner case tests\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server-pmd-corner\n+[2018/11/21 16:47:49:0171] USER: LWS minimal ws server + permessage-deflate Corner Cases | visit http://localhost:7681\n+[2018/11/21 16:47:49:0172] NOTICE: Creating Vhost 'default' port 7681, 2 protocols, IPv6 off\n+\n+```\n+\n+Visit http://localhost:7681 \n+\n+5 ws connections are made via permessage-deflate extension.\n+\n+When the ws connection is established, various amounts of data are sent\n+resulting in ciphertext packets of a known size.\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/minimal-ws-server-pmd-corner.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/minimal-ws-server-pmd-corner.c\nnew file mode 100644\nindex 0000000..06ecb67\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/minimal-ws-server-pmd-corner.c\n@@ -0,0 +1,108 @@\n+/*\n+ * lws-minimal-ws-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022,\n+\t\tlws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022\n+\t\t \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server + permessage-deflate Corner Cases | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.extensions \u003d extensions;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/example.js\nnew file mode 100644\nindex 0000000..aedf5bf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/example.js\n@@ -0,0 +1,85 @@\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+var ws \u003d new Array();\n+\n+function conn(n)\n+{\n+\tws[n] \u003d new_ws(get_appropriate_ws_url(\u0022/\u0022 + (n + 1)), \u0022lws-minimal\u0022);\n+\tws[n].n \u003d n;\n+\ttry {\n+\t\tws[n].onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t\tdocument.getElementById(\u0022status\u0022).textContent \u003d\n+\t\t\t\tdocument.getElementById(\u0022status\u0022).textContent + \u0022 \u0022 +\n+\t\t\t\t\u0022ws open \u0022+ ws[n].extensions;\n+\t\t};\n+\t\n+\t\tws[n].onmessage \u003d function got_packet(msg) {\n+\t\t\tif (typeof msg.data !\u003d\u003d \u0022string\u0022) {\n+\t\t\t\t//console.log(msg.data);\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\t\tdocument.getElementById(\u0022r\u0022).value +\n+\t\t\t\t\tws[n].n + \u0022 \u0022 + \u0022blob uncompressed length \u0022 +\n+\t\t\t\t\t\tmsg.data.size + \u0022\u005cn\u0022;\n+\t\t\t} else\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\t\tdocument.getElementById(\u0022r\u0022).value + msg.data + \u0022\u005cn\u0022;\n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws[n].onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 1;\n+\t\t\tdocument.getElementById(\u0022status\u0022).textContent \u003d \u0022ws closed\u0022;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+}\n+\n+window.addEventListener(\u0022load\u0022, function() {\n+\t\n+\tvar n;\n+\n+\t/*\n+\t * we make 5 individual connections. Because if we don't, by default pmd\n+\t * will reuse its dictionary to make subsequent tests very short. \n+\t */\n+\t\n+\tfor (n \u003d 0; n \u003c 5; n++)\n+\t\tconn(n);\n+\t\n+\tconsole.log(\u0022load\u0022);\n+\t\t\n+}, false);\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/index.html\nnew file mode 100644\nindex 0000000..45b0d81\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/index.html\n@@ -0,0 +1,21 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\t\n+\t\tLWS \u003cb\u003epmd corner case test\u003c/b\u003e.\u003cbr\u003e\n+\t\tA ws link is made back to the server and results shown here.\u003cbr\u003e\n+\t\tIt should show four binary blobs of increasing size.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003cspan id\u003dstatus\u003eWs closed\u003c/span\u003e\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d10\u003e\u003c/textarea\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..785fec3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/protocol_lws_minimal.c\n@@ -0,0 +1,271 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This version holds a single message at a time, which may be lost if a new\n+ * message comes. See the minimal-ws-server-ring sample for the same thing\n+ * but using an lws_ring ringbuffer to hold up to 8 messages at a time.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/*\n+ * This came from...\n+ *\n+ * cat /dev/urandom | hexdump -C -n 1024 | tr -s ' ' | cut -d' ' -f 2-17 | head -n-1 | sed \u0022s/\u005c /, 0x/g\u0022 | sed \u0022s/^/0x/g\u0022 | sed \u0022s/\u005c$/,/g\u0022\n+ *\n+ * ...then the length tuned by hand to get the ciphertext sizes that we want to\n+ * confirm are OK.\n+ *\n+ * We can only pass in a maximum of one compression buffer of input at a time,\n+ * which is 1024 by default.\n+ */\n+\n+unsigned char uncompressible[] \u003d {\n+\t0xfe, 0xcc, 0x47, 0xcb, 0x10, 0xf4, 0x3c, 0x85,\n+\t0x8e, 0xd4, 0xe2, 0xf6, 0xd1, 0xd1, 0xdb, 0x64,\n+\t0x94, 0x50, 0xf6, 0x14, 0x25, 0x03, 0x09, 0x3a,\n+\t0xb1, 0x47, 0x86, 0xa8, 0x3c, 0x4f, 0x3b, 0x98,\n+\t0x7b, 0x3e, 0x67, 0x3e, 0x22, 0xc5, 0x4c, 0x45,\n+\t0xf4, 0xf7, 0xb5, 0x79, 0xc0, 0x26, 0x6e, 0x5c,\n+\t0xf4, 0x10, 0x04, 0xa9, 0x3c, 0x4f, 0xed, 0xc5,\n+\t0x3d, 0xd4, 0x9f, 0x9f, 0xa3, 0xdb, 0x29, 0xeb,\n+\t0x1e, 0xe1, 0x52, 0xab, 0xb5, 0x75, 0x25, 0x86,\n+\t0x86, 0x02, 0x2c, 0x9d, 0x9c, 0x86, 0x46, 0x92,\n+\t0xe9, 0x04, 0xd8, 0x2c, 0x7d, 0x8a, 0x56, 0xe1,\n+\t0xe1, 0xb6, 0x84, 0x4d, 0x17, 0x30, 0x01, 0x60,\n+\t0xa6, 0xf4, 0xba, 0xc9, 0x5a, 0x29, 0xe3, 0x05,\n+\t0xe1, 0xb4, 0x0b, 0x23, 0x74, 0x93, 0x25, 0x76,\n+\t0xce, 0x15, 0xe4, 0x82, 0x9f, 0xbf, 0xe8, 0x6a,\n+\t0x4a, 0xc5, 0xc2, 0x22, 0x91, 0x80, 0xb5, 0xd7,\n+\t0xb3, 0xce, 0x70, 0x0e, 0xf7, 0xbb, 0x2f, 0xc5,\n+\t0x83, 0x39, 0x86, 0xe5, 0x3e, 0xb7, 0x83, 0x87,\n+\t0xc2, 0xeb, 0xc8, 0xed, 0x59, 0x26, 0xc1, 0xe6,\n+\t0x80, 0x17, 0x3c, 0x29, 0x53, 0x4c, 0x1c, 0x3f,\n+\t0x54, 0xbe, 0x34, 0x26, 0x72, 0xed, 0x38, 0x10,\n+\t0xd1, 0x37, 0x07, 0x2d, 0x12, 0x31, 0x9b, 0xc5,\n+\t0x92, 0x09, 0x13, 0x5d, 0x8e, 0xef, 0xdb, 0x52,\n+\t0x7f, 0x7d, 0x6f, 0x62, 0x1e, 0x17, 0xd2, 0xf9,\n+\t0x72, 0x74, 0xc7, 0xd6, 0x1f, 0x8b, 0x9c, 0x4c,\n+\t0x26, 0xd2, 0x6f, 0x7c, 0x33, 0x06, 0xee, 0xc2,\n+\t0xa3, 0x41, 0x43, 0x4f, 0x40, 0x2a, 0x9c, 0xb3,\n+\t0x4a, 0xb1, 0x88, 0x4e, 0x6f, 0xf2, 0xb7, 0x38,\n+\t0xde, 0x87, 0x0d, 0xdc, 0x15, 0x6a, 0x36, 0x6b,\n+\t0xf3, 0x6c, 0x61, 0xf5, 0x24, 0x8e, 0xb6, 0xcc,\n+\t0x8a, 0x3a, 0xa0, 0xb4, 0x9b, 0xae, 0x85, 0x87,\n+\t0x75, 0xf5, 0xbd, 0x50, 0x1f, 0xb5, 0x0c, 0xdb,\n+\t0x6c, 0x68, 0x59, 0xef, 0x37, 0x5a, 0x2a, 0x85,\n+\t0xf0, 0xce, 0x4d, 0x58, 0xa1, 0xa5, 0xde, 0x73,\n+\t0x9b, 0x1a, 0x3d, 0x8a, 0x00, 0xba, 0x2f, 0xe2,\n+\t0xda, 0xad, 0x3c, 0x63, 0x8a, 0x33, 0x39, 0xc4,\n+\t0x07, 0x29, 0x1d, 0xa7, 0x40, 0x3b, 0xa4, 0xa6,\n+\t0xae, 0xee, 0x37, 0x08, 0x83, 0xd1, 0x72, 0x66,\n+\t0x3d, 0x43, 0xe3, 0x7a, 0x48, 0xfc, 0xf8, 0xd4,\n+\t0xe3, 0xab, 0xd0, 0xe9, 0xb1, 0xf4, 0x4d, 0x3c,\n+\t0x6b, 0x58, 0xde, 0x3c, 0x91, 0x0d, 0x3e, 0xec,\n+\t0x35, 0x6d, 0x53, 0xe6, 0xb6, 0x4b, 0xc0, 0x80,\n+\t0x18, 0xab, 0x96, 0x7f, 0x05, 0xd7, 0xd4, 0x81,\n+\t0x0f, 0x92, 0x2b, 0xaf, 0x72, 0x59, 0xc2, 0x14,\n+\t0xca, 0x62, 0x82, 0xac, 0xe3, 0x17, 0x43, 0x61,\n+\t0x4d, 0x1e, 0xfc, 0x72, 0xaf, 0xfc, 0x55, 0x2a,\n+\t0x2b, 0xb6, 0x8e, 0x6e, 0xe6, 0x86, 0xeb, 0xcc,\n+\t0x26, 0x6c, 0xdf, 0xac, 0x02, 0x58, 0xa1, 0x5d,\n+\t0x1b, 0x07, 0xe2, 0x5d, 0x50, 0xb9, 0xbf, 0x2e,\n+\t0x1f, 0x49, 0x39, 0xe6, 0x7f, 0x2f, 0x0e, 0x9d,\n+\t0x09, 0x42, 0xc7, 0xa1, 0xcc, 0xeb, 0x5b, 0x06,\n+\t0x1c, 0x11, 0x9f, 0xea, 0xc1, 0x96, 0x82, 0xa9,\n+\t0x30, 0x6a, 0xda, 0x98, 0x87, 0x43, 0xfd, 0x25,\n+\t0xe7, 0x27, 0x53, 0x9a, 0xb3, 0x2f, 0x19, 0xa9,\n+\t0x1a, 0xf4, 0xd6, 0xf3, 0x9e, 0xba, 0x9a, 0x91,\n+\t0x52, 0x8f, 0x20, 0x6b, 0x4c, 0x3a, 0x2a, 0x3d,\n+\t0xa0, 0xff, 0x8d, 0x61, 0x04, 0xee, 0x26, 0x55,\n+\t0xdd, 0xd7, 0x67, 0xe4, 0x84, 0x0d, 0xf1, 0x5d,\n+\t0xc7, 0xeb, 0xb3, 0x8c, 0x67, 0xa2, 0xc8, 0x1f,\n+\t0x53, 0x02, 0xc4, 0x8c, 0x89, 0xd5, 0x51, 0xc8,\n+\t0x8b, 0xb7, 0xc8, 0x11, 0xbe, 0x0e, 0xc2, 0xb1,\n+\t0x00, 0x35, 0x81, 0x96, 0xac, 0x90, 0x9c, 0xbc,\n+\t0x09, 0x82, 0x75, 0xc3, 0xe7, 0x66, 0x4e, 0x68,\n+\t0xdc, 0xa1, 0xf0, 0xd0, 0x2d, 0x49, 0x3b, 0x47,\n+\t0xba, 0x19, 0xc8, 0x9b, 0x90, 0x12, 0xc0, 0xdf,\n+\t0xda, 0x32, 0x0f, 0x79, 0x6d, 0x1a, 0x5f, 0x92,\n+\t0x51, 0x70, 0xfc, 0xca, 0x08, 0xd4, 0x7f, 0x1a,\n+\t0x56, 0x04, 0x99, 0x33, 0x89, 0x3d, 0x6f, 0x89,\n+\t0x10, 0x25, 0x81, 0xe2, 0xbd, 0x06, 0xd6, 0xaa,\n+\t0x02, 0x8e, 0x4c, 0xa3, 0x60, 0xfd, 0xaf, 0x9c,\n+\t0x81, 0x75, 0xaf, 0x2f, 0xe1, 0x72, 0xe0, 0x6e,\n+\t0x15, 0xdd, 0xbb, 0x92, 0xd1, 0xbe, 0x8e, 0x9b,\n+\t0xfb, 0x82, 0xb9, 0x47, 0x6f, 0x02, 0x28, 0x2a,\n+\t0x67, 0x50, 0xed, 0x24, 0x9b, 0x4d, 0x69, 0xd7,\n+\t0xa9, 0x66, 0x3e, 0x14, 0x4b, 0x00, 0x2a, 0xe4,\n+\t0x3d, 0x63, 0xb2, 0x10, 0xd4, 0x05, 0x9d, 0xe3,\n+\t0xde, 0xce, 0xd8, 0x04, 0x41, 0x03, 0xb5, 0xda,\n+\t0xb0, 0x6f, 0xca, 0x63, 0x64, 0x04, 0xff, 0x07,\n+\t0x58, 0x5f, 0x96, 0xf7, 0x6c, 0xb7, 0x67, 0x05,\n+\t0xd6, 0x85, 0xf2, 0x1e, 0xc1, 0xdc, 0x76, 0x12,\n+\t0x50, 0x83, 0x78, 0xa2, 0x51, 0x94, 0xe1, 0x2e,\n+\t0xb8, 0x97, 0x5b, 0x08, 0x81, 0xac, 0x59, 0x43,\n+\t0xe9, 0x01, 0x09, 0xa2, 0xed, 0x10, 0x4f, 0xb1,\n+\t0x5b, 0xb8, 0x67, 0xe8, 0x61, 0x8d, 0xc8, 0xd9,\n+\t0xc3, 0x5f, 0x65, 0xd7, 0xaa, 0x30, 0x0e, 0xc9,\n+\t0x43, 0x98, 0x1d, 0xf1, 0xa5, 0x28, 0xd5, 0xa1,\n+\t0x6b, 0x8f, 0x89, 0x76, 0x97, 0xa1, 0x3e, 0x6f,\n+\t0x39, 0xf4, 0xb9, 0x6b, 0xa7, 0xfe, 0x58, 0x24,\n+\t0xcd, 0x75, 0xa8, 0xec, 0x9e, 0x1c, 0x8e, 0x02,\n+\t0x2a, 0xce, 0xe9, 0x0a, 0x24, 0x31, 0x89, 0x5a,\n+\t0xd5, 0xdd, 0x70, 0x8e, 0x5f, 0xee, 0xc1, 0x34,\n+\t0xf8, 0xe2, 0x8a, 0xca, 0xf1, 0xf2, 0x71, 0x4c,\n+\t0x31, 0x56, 0xeb, 0x03, 0xf9, 0x6c, 0x0d, 0xa9,\n+\t0x65, 0x6e, 0x88, 0x4f, 0x8e, 0x80, 0x69, 0xd7,\n+\t0xd4, 0x63, 0x45, 0x9c, 0xab, 0x8c, 0x3d, 0x08,\n+\t0x8b, 0xd9, 0x97, 0xdc, 0x88, 0x59, 0x19, 0x2d,\n+\t0xb2, 0x84, 0xf4, 0x78, 0x3e, 0xce, 0x80, 0xba,\n+\t0xeb, 0x34, 0x5a, 0x9e, 0x8e, 0x98, 0xc4, 0x45,\n+\t0x9d, 0x59, 0xb2, 0x7e, 0xc1, 0x7e, 0x5b, 0x89,\n+\t0xd0, 0x02, 0xcb, 0xa4, 0xf1, 0xf2, 0xa7, 0x3a,\n+\t0x05, 0xc3, 0x7d, 0x43, 0x64, 0x7f, 0xf0, 0xc1,\n+\t0xf8, 0x71, 0x3b, 0x38, 0x39, 0xc7, 0x1b, 0xf4,\n+\t0x2f, 0x5a, 0x5c, 0x43, 0x1b, 0xe3, 0x93, 0xe8,\n+\t0x79, 0xe8, 0x35, 0x63, 0x34, 0x7e, 0x25, 0x41,\n+\t0x6f, 0x08, 0xce, 0x6f, 0x95, 0x2a, 0xc2, 0xdc,\n+\t0x65, 0xe2, 0xa5, 0xc0, 0xfd, 0xf1, 0x78, 0x32,\n+\t0x23, 0x09, 0x75, 0x99, 0x12, 0x7a, 0x83, 0xfd,\n+\t0xae, 0x1e, 0xb2, 0xe9, 0x12, 0x5c, 0x3d, 0x03,\n+\t0x68, 0x12, 0x1e, 0xe3, 0x8f, 0xff, 0x47, 0xe3,\n+\t0xb4, 0x7e, 0x9b, 0x7e, 0x60, 0x2e, 0xf4, 0x06,\n+\t0xba, 0x10, 0x08, 0x6b, 0xf9, 0x25, 0x59, 0xf3,\n+\t0x61, 0x13, 0x2b, 0xd1, 0x2f, 0x04, 0x5f, 0xd6,\n+\t0xd3, 0x42, 0xf6, 0x21, 0x57, 0xf6, 0xd3, 0xb3,\n+\t0xec, 0xec, 0x07, 0x33, 0xbf, 0x69, 0x04, 0xec,\n+\t0x88, 0x8d, 0x06, 0x2b, 0xfa, 0xee, 0xb2, 0x7b,\n+\t0x41, 0x2a, 0x49, 0x0f, 0x30, 0x52, 0x41, 0x29,\n+\t0x70, 0xd0, 0xf6, 0xb6, 0xbf, 0x27, 0x1a, 0x56,\n+\t0x9a, 0x4b, 0x2a, 0x67, 0xfb, 0xc8, 0x16, 0x46,\n+\t0x59, 0xc7, 0xf5, 0x5f, 0x20, 0x10, 0x25, 0x6c,\n+\t0x1e, 0x36, 0x20, 0x0c, 0x3e, 0x7e, 0x15, 0x6c,\n+\t0xa2, 0xbd, 0x22, 0xc4, 0x3d, 0xc9, 0x74, 0x56,\n+\t0xab, 0x31, 0x92, 0xb8, 0x9f, 0xa1, 0x05, 0x2e,\n+\t0xc4, 0xdb, 0x32, 0x91, 0xcb, 0x0f, 0x4a, 0x73,\n+\t0x7f, 0xe1, 0xe6, 0x65, 0x2e, 0x5e, 0xa6, 0xaf,\n+\t0xae, 0xa9, 0x04, 0x14, 0x83, 0xef, 0x19, 0x70,\n+\t0x5e, 0xcb, 0xf5, 0x87, 0xcc, 0x45, 0xf7, 0x60,\n+\t0xd7, 0x9d, 0x1e, 0x2e, /* 1012 */\n+\n+\t/* up to here, this generates a 1022-byte single packet of compressed\n+\t * data that is well-formed and produces 1012 bytes of plaintext.\n+\t *\n+\t * The compressed packet ends\n+\t *\n+\t * 03F0: 70 5E CB F5 87 CC 45 F7 60 D7 9D 1E 2E 00\n+\t */\n+\n+\t0x54, /* 1013 */\n+\n+\t/* up to here, this generates a 1023-byte single packet of compressed\n+\t * data that is well-formed and produces 1013 bytes of plaintext.\n+\t *\n+\t * The compressed packet ends\n+\t *\n+\t * 03F0: 70 5E CB F5 87 CC 45 F7 60 D7 9D 1E 2E 54 00\n+\t */\n+\n+\t0x83, /* 1014 */\n+\n+\t/* up to here, a 1023-byte + 3-byte (1 byte payload) packet\n+\t * of uncompressed length 1014 */\n+\n+\t0x09, 0x99, 0xf9, 0x71, 0x9f, 0x15, 0x49, 0xda, 0xa8, 0x99, /* 1024 */\n+\n+\t/* up to here, a 1023-byte (1020 payload) + 3-byte (1 payload) packet\n+\t * of uncompressed length 1019 */\n+\n+\t0xf5, 0xe6, 0xa1, 0x71, 0x64, 0x9a, 0x95, 0xed,\n+\n+\n+};\n+\n+/* generates ciphertext: 1022 1023 1023 + 3 1023 + 3 */\n+static int corner_lengths[] \u003d {\n+/* bytes plaintext,\tciphertext */\n+\t1012,\t/*\t1019 */\n+\t1013,\t/*\t1020 */\n+\t1014,\t/*\t1021 */\n+\t1019,\t/*\t1021 */\n+\t1024,\t/*\t1021*/\n+};\n+\n+\n+/* one of these is created for each client connecting to us */\n+\n+struct per_session_data__minimal {\n+\tint which;\n+\tint last; /* 0 no test, else test number in corner_lengths[] + 1 */\n+};\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tunsigned char buf[LWS_PRE + 2048];\n+\tint m;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\tif (lws_hdr_copy(wsi, (char *)buf, sizeof(buf),\n+\t\t\t\t WSI_TOKEN_GET_URI) \u003c 0)\n+\t\t\treturn -1;\n+\n+\t\tpss-\u003elast \u003d atoi((char *)buf + 1);\n+\n+\t\tif (pss-\u003elast \u003e (int)LWS_ARRAY_SIZE(corner_lengths))\n+\t\t\tpss-\u003elast \u003d 0;\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tif (!pss-\u003elast)\n+\t\t\tbreak;\n+\n+\t\tlwsl_err(\u0022%s: writable %d, %d\u005cn\u0022, __func__, pss-\u003elast,\n+\t\t\t\tcorner_lengths[pss-\u003elast - 1]);\n+\n+\t\tmemcpy(buf + LWS_PRE, uncompressible,\n+\t\t (unsigned int)corner_lengths[pss-\u003elast - 1]);\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, buf + LWS_PRE, (unsigned int)corner_lengths[pss-\u003elast - 1],\n+\t\t\t\tLWS_WRITE_BINARY);\n+\t\tif (m \u003c corner_lengths[pss-\u003elast - 1]) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tpss-\u003elast \u003d 0;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t2048, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/CMakeLists.txt\nnew file mode 100644\nindex 0000000..507ec3e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/CMakeLists.txt\n@@ -0,0 +1,25 @@\n+project(lws-minimal-ws-server-pmd C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-pmd)\n+set(SRCS minimal-ws-server-pmd.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/README.md\nnew file mode 100644\nindex 0000000..468f74f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/README.md\n@@ -0,0 +1,23 @@\n+# lws minimal ws server + permessage-deflate\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server\n+[2018/03/04 09:30:02:7986] USER: LWS minimal ws server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681 on multiple browser windows\n+\n+Text you type in any browser window is sent to all of them.\n+\n+For simplicity of this example, only one line of text is cached at the server.\n+\n+The ws connection is made via permessage-deflate extension.\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/minimal-ws-server-pmd.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/minimal-ws-server-pmd.c\nnew file mode 100644\nindex 0000000..4496a35\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/minimal-ws-server-pmd.c\n@@ -0,0 +1,108 @@\n+/*\n+ * lws-minimal-ws-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022,\n+\t\tlws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022\n+\t\t \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server + permessage-deflate | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.extensions \u003d extensions;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/example.js\nnew file mode 100644\nindex 0000000..d10384a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/example.js\n@@ -0,0 +1,68 @@\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 0;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 0;\n+\t\t\tdocument.getElementById(\u0022status\u0022).textContent \u003d \u0022ws open \u0022+ ws.extensions;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value + msg.data + \u0022\u005cn\u0022;\n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 1;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 1;\n+\t\t\tdocument.getElementById(\u0022status\u0022).textContent \u003d \u0022ws closed\u0022;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\t\n+\tfunction sendmsg()\n+\t{\n+\t\tws.send(document.getElementById(\u0022m\u0022).value);\n+\t\tdocument.getElementById(\u0022m\u0022).value \u003d \u0022\u0022;\n+\t}\n+\t\n+\tdocument.getElementById(\u0022b\u0022).addEventListener(\u0022click\u0022, sendmsg);\n+\n+}, false);\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/index.html\nnew file mode 100644\nindex 0000000..43c548a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/index.html\n@@ -0,0 +1,21 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\t\n+\t\tLWS chat \u003cb\u003eminimal ws server example\u003c/b\u003e.\u003cbr\u003e\n+\t\tChat is sent to all browsers open on this page.\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003cspan id\u003dstatus\u003eWs closed\u003c/span\u003e\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d10\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\t\u003cinput type\u003d\u0022text\u0022 id\u003dm cols\u003d40 rows\u003d1\u003e\n+\t\t\u003cbutton id\u003db\u003eSend\u003c/button\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..00287d7\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/protocol_lws_minimal.c\n@@ -0,0 +1,160 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This version holds a single message at a time, which may be lost if a new\n+ * message comes. See the minimal-ws-server-ring sample for the same thing\n+ * but using an lws_ring ringbuffer to hold up to 8 messages at a time.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/* one of these created for each message */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/* one of these is created for each client connecting to us */\n+\n+struct per_session_data__minimal {\n+\tstruct per_session_data__minimal *pss_list;\n+\tstruct lws *wsi;\n+\tint last; /* the last message number we sent */\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n+\n+\tstruct msg amsg; /* the one pending message... */\n+\tint current; /* the current message number we are caching */\n+};\n+\n+/* destroys the message when everyone has had a copy of it */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tint m;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* add ourselves to the list of live pss held in the vhd */\n+\t\tpss-\u003epss_list \u003d vhd-\u003epss_list;\n+\t\tvhd-\u003epss_list \u003d pss;\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tpss-\u003elast \u003d vhd-\u003ecurrent;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\t/* remove our closing pss from the list of live pss */\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tif (*ppss \u003d\u003d pss) {\n+\t\t\t\t*ppss \u003d pss-\u003epss_list;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tif (!vhd-\u003eamsg.payload)\n+\t\t\tbreak;\n+\n+\t\tif (pss-\u003elast \u003d\u003d vhd-\u003ecurrent)\n+\t\t\tbreak;\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)vhd-\u003eamsg.payload) +\n+\t\t\t LWS_PRE, vhd-\u003eamsg.len, LWS_WRITE_TEXT);\n+\t\tif (m \u003c (int)vhd-\u003eamsg.len) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tpss-\u003elast \u003d vhd-\u003ecurrent;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\t\tif (vhd-\u003eamsg.payload)\n+\t\t\t__minimal_destroy_message(\u0026vhd-\u003eamsg);\n+\n+\t\tvhd-\u003eamsg.len \u003d len;\n+\t\t/* notice we over-allocate by LWS_PRE */\n+\t\tvhd-\u003eamsg.payload \u003d malloc(LWS_PRE + len);\n+\t\tif (!vhd-\u003eamsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmemcpy((char *)vhd-\u003eamsg.payload + LWS_PRE, in, len);\n+\t\tvhd-\u003ecurrent++;\n+\n+\t\t/*\n+\t\t * let everybody know we want to write something on them\n+\t\t * as soon as they are ready\n+\t\t */\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t128, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/CMakeLists.txt\nnew file mode 100644\nindex 0000000..7f58124\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-ws-server-ring C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-ring)\n+set(SRCS minimal-ws-server-ring.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/README.md\nnew file mode 100644\nindex 0000000..25eb0ae\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/README.md\n@@ -0,0 +1,24 @@\n+# lws minimal ws server (lws_ring)\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server\n+[2018/03/04 09:30:02:7986] USER: LWS minimal ws server (lws_ring) | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681 on multiple browser windows\n+\n+Text you type in any browser window is sent to all of them.\n+\n+A ringbuffer holds up to 8 lines of text.\n+\n+This also demonstrates how the ringbuffer can take action against lagging or\n+disconnected clients that cause the ringbuffer to fill.\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/minimal-ws-server-ring.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/minimal-ws-server-ring.c\nnew file mode 100644\nindex 0000000..f4e02a2\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/minimal-ws-server-ring.c\n@@ -0,0 +1,97 @@\n+/*\n+ * lws-minimal-ws-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws,\n+ * with an added websocket chat server using a ringbuffer.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server (lws_ring) | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/example.js\nnew file mode 100644\nindex 0000000..6b2cdce\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/example.js\n@@ -0,0 +1,65 @@\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 0;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value + msg.data + \u0022\u005cn\u0022;\n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 1;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\t\n+\tfunction sendmsg()\n+\t{\n+\t\tws.send(document.getElementById(\u0022m\u0022).value);\n+\t\tdocument.getElementById(\u0022m\u0022).value \u003d \u0022\u0022;\n+\t}\n+\t\n+\tdocument.getElementById(\u0022b\u0022).addEventListener(\u0022click\u0022, sendmsg);\n+\n+}, false);\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/index.html\nnew file mode 100644\nindex 0000000..7081c31\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/index.html\n@@ -0,0 +1,20 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\t\n+\t\tLWS chat \u003cb\u003eminimal ws server example\u003c/b\u003e.\u003cbr\u003e\n+\t\tChat is sent to all browsers open on this page.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d10\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\n+\t\t\u003cinput type\u003d\u0022text\u0022 id\u003dm cols\u003d40 rows\u003d1\u003e\n+\t\t\u003cbutton id\u003db\u003eSend\u003c/button\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..4b6e87e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/protocol_lws_minimal.c\n@@ -0,0 +1,281 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This version uses an lws_ring ringbuffer to cache up to 8 messages at a time,\n+ * so it's not so easy to lose messages.\n+ *\n+ * This also demonstrates how to \u0022cull\u0022, ie, kill, connections that can't\n+ * keep up for some reason.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/* one of these created for each message */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/* one of these is created for each client connecting to us */\n+\n+struct per_session_data__minimal {\n+\tstruct per_session_data__minimal *pss_list;\n+\tstruct lws *wsi;\n+\tuint32_t tail;\n+\n+\tunsigned int culled:1;\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n+\n+\tstruct lws_ring *ring; /* ringbuffer holding unsent messages */\n+};\n+\n+static void\n+cull_lagging_clients(struct per_vhost_data__minimal *vhd)\n+{\n+\tuint32_t oldest_tail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n+\tstruct per_session_data__minimal *old_pss \u003d NULL;\n+\tint most \u003d 0, before \u003d (int)lws_ring_get_count_waiting_elements(vhd-\u003ering,\n+\t\t\t\t\t\u0026oldest_tail), m;\n+\n+\t/*\n+\t * At least one guy with the oldest tail has lagged too far, filling\n+\t * the ringbuffer with stuff waiting for them, while new stuff is\n+\t * coming in, and they must close, freeing up ringbuffer entries.\n+\t */\n+\n+\tlws_start_foreach_llp_safe(struct per_session_data__minimal **,\n+\t\t\t ppss, vhd-\u003epss_list, pss_list) {\n+\n+\t\tif ((*ppss)-\u003etail \u003d\u003d oldest_tail) {\n+\t\t\told_pss \u003d *ppss;\n+\n+\t\t\tlwsl_user(\u0022Killing lagging client %p\u005cn\u0022, (*ppss)-\u003ewsi);\n+\n+\t\t\tlws_set_timeout((*ppss)-\u003ewsi, PENDING_TIMEOUT_LAGGING,\n+\t\t\t\t\t/*\n+\t\t\t\t\t * we may kill the wsi we came in on,\n+\t\t\t\t\t * so the actual close is deferred\n+\t\t\t\t\t */\n+\t\t\t\t\tLWS_TO_KILL_ASYNC);\n+\n+\t\t\t/*\n+\t\t\t * We might try to write something before we get a\n+\t\t\t * chance to close. But this pss is now detached\n+\t\t\t * from the ring buffer. Mark this pss as culled so we\n+\t\t\t * don't try to do anything more with it.\n+\t\t\t */\n+\n+\t\t\t(*ppss)-\u003eculled \u003d 1;\n+\n+\t\t\t/*\n+\t\t\t * Because we can't kill it synchronously, but we\n+\t\t\t * know it's closing momentarily and don't want its\n+\t\t\t * participation any more, remove its pss from the\n+\t\t\t * vhd pss list early. (This is safe to repeat\n+\t\t\t * uselessly later in the close flow).\n+\t\t\t *\n+\t\t\t * Notice this changes *ppss!\n+\t\t\t */\n+\n+\t\t\tlws_ll_fwd_remove(struct per_session_data__minimal,\n+\t\t\t\t\t pss_list, (*ppss), vhd-\u003epss_list);\n+\n+\t\t\t/* use the changed *ppss so we won't skip anything */\n+\n+\t\t\tcontinue;\n+\n+\t\t} else {\n+\t\t\t/*\n+\t\t\t * so this guy is a survivor of the cull. Let's track\n+\t\t\t * what is the largest number of pending ring elements\n+\t\t\t * for any survivor.\n+\t\t\t */\n+\t\t\tm \u003d (int)lws_ring_get_count_waiting_elements(vhd-\u003ering,\n+\t\t\t\t\t\t\t\u0026((*ppss)-\u003etail));\n+\t\t\tif (m \u003e most)\n+\t\t\t\tmost \u003d m;\n+\t\t}\n+\n+\t} lws_end_foreach_llp_safe(ppss);\n+\n+\t/* it would mean we lost track of oldest... but Coverity insists */\n+\tif (!old_pss)\n+\t\treturn;\n+\n+\t/*\n+\t * Let's recover (ie, free up) all the ring slots between the\n+\t * original oldest's last one and the \u0022worst\u0022 survivor.\n+\t */\n+\n+\tlws_ring_consume_and_update_oldest_tail(vhd-\u003ering,\n+\t\tstruct per_session_data__minimal, \u0026old_pss-\u003etail, (size_t)(before - most),\n+\t\tvhd-\u003epss_list, tail, pss_list);\n+\n+\tlwsl_user(\u0022%s: shrunk ring from %d to %d\u005cn\u0022, __func__, before, most);\n+}\n+\n+/* destroys the message when everyone has had a copy of it */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct msg *pmsg;\n+\tstruct msg amsg;\n+\tint n, m;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!vhd-\u003ering)\n+\t\t\treturn 1;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tlws_ring_destroy(vhd-\u003ering);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* add ourselves to the list of live pss held in the vhd */\n+\t\tlwsl_user(\u0022LWS_CALLBACK_ESTABLISHED: wsi %p\u005cn\u0022, wsi);\n+\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+\t\tpss-\u003etail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLOSED: wsi %p\u005cn\u0022, wsi);\n+\t\t/* remove our closing pss from the list of live pss */\n+\t\tlws_ll_fwd_remove(struct per_session_data__minimal, pss_list,\n+\t\t\t\t pss, vhd-\u003epss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tif (pss-\u003eculled)\n+\t\t\tbreak;\n+\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg)\n+\t\t\tbreak;\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) +\n+\t\t\t LWS_PRE, pmsg-\u003elen, LWS_WRITE_TEXT);\n+\t\tif (m \u003c (int)pmsg-\u003elen) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlws_ring_consume_and_update_oldest_tail(\n+\t\t\tvhd-\u003ering,\t/* lws_ring object */\n+\t\t\tstruct per_session_data__minimal, /* type of objects with tails */\n+\t\t\t\u0026pss-\u003etail,\t/* tail of guy doing the consuming */\n+\t\t\t1,\t\t/* number of payload objects being consumed */\n+\t\t\tvhd-\u003epss_list,\t/* head of list of objects with tails */\n+\t\t\ttail,\t\t/* member name of tail in objects with tails */\n+\t\t\tpss_list\t/* member name of next object in objects with tails */\n+\t\t);\n+\n+\t\t/* more to do for us? */\n+\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(pss-\u003ewsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(vhd-\u003ering);\n+\t\tif (!n) {\n+\t\t\t/* forcibly make space */\n+\t\t\tcull_lagging_clients(vhd);\n+\t\t\tn \u003d (int)lws_ring_get_count_free_elements(vhd-\u003ering);\n+\t\t}\n+\t\tif (!n)\n+\t\t\tbreak;\n+\n+\t\tlwsl_user(\u0022LWS_CALLBACK_RECEIVE: free space %d\u005cn\u0022, n);\n+\n+\t\tamsg.len \u003d len;\n+\t\t/* notice we over-allocate by LWS_PRE... */\n+\t\tamsg.payload \u003d malloc(LWS_PRE + len);\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/* ...and we copy the payload in at +LWS_PRE */\n+\t\tmemcpy((char *)amsg.payload + LWS_PRE, in, len);\n+\t\tif (!lws_ring_insert(vhd-\u003ering, \u0026amsg, 1)) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/*\n+\t\t * let everybody know we want to write something on them\n+\t\t * as soon as they are ready\n+\t\t */\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t0, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/CMakeLists.txt\nnew file mode 100644\nindex 0000000..b7c153f\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/CMakeLists.txt\n@@ -0,0 +1,27 @@\n+project(lws-minimal-ws-server-threadpool C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-threadpool)\n+set(SRCS minimal-ws-server-threadpool.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_THREADPOOL 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/README.md\nnew file mode 100644\nindex 0000000..c8a91df\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/README.md\n@@ -0,0 +1,26 @@\n+# lws minimal ws server (threadpool)\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+Pthreads is required on your system.\n+\n+This demonstrates how to cleanly assign tasks bound to a wsi to a thread pool,\n+with a queue if the pool is occupied.\n+\n+It creates a threadpool with 3 worker threads and a maxiumum queue size of 4.\n+\n+The web page at http://localhost:7681 then starts up 8 x ws connections.\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server-threadpool \n+[2018/03/13 13:09:52:2208] USER: LWS minimal ws server + threadpool | visit http://localhost:7681\n+[2018/03/13 13:09:52:2365] NOTICE: Creating Vhost 'default' port 7681, 2 protocols, IPv6 off\n+```\n+\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/minimal-ws-server-threadpool.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/minimal-ws-server-threadpool.c\nnew file mode 100644\nindex 0000000..63a1202\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/minimal-ws-server-threadpool.c\n@@ -0,0 +1,137 @@\n+/*\n+ * lws-minimal-ws-server\u003dthreadpool\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal ws server that can cooperate with\n+ * other threads cleanly. Two other threads are started, which fill\n+ * a ringbuffer with strings at 10Hz.\n+ *\n+ * The actual work and thread spawning etc are done in the protocol\n+ * implementation in protocol_lws_minimal.c.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal_threadpool.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/*\n+ * This demonstrates how to pass a pointer into a specific protocol handler\n+ * running on a specific vhost. In this case, it's our default vhost and\n+ * we pass the pvo named \u0022config\u0022 with the value a const char * \u0022myconfig\u0022.\n+ *\n+ * This is the preferred way to pass configuration into a specific vhost +\n+ * protocol instance.\n+ */\n+\n+static const struct lws_protocol_vhost_options pvo_ops \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022config\u0022,\t\t/* pvo name */\n+\t(void *)\u0022myconfig\u0022\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_ops,\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-minimal\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t/* ignored */\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server + threadpool | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo; /* per-vhost options */\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* start the threads that create content */\n+\n+\twhile (!interrupted)\n+\t\tif (lws_service(context, 0))\n+\t\t\tinterrupted \u003d 1;\n+\n+\tlws_context_destroy(context);\n+\n+\tlwsl_user(\u0022%s: exiting cleanly...\u005cn\u0022, __func__);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/example.js\nnew file mode 100644\nindex 0000000..cccc7d9\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/example.js\n@@ -0,0 +1,76 @@\n+var head \u003d 0, tail \u003d 0, ring \u003d new Array();\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar n, wsa \u003d new Array, alive \u003d 0;\n+\t\n+\tfor (n \u003d 0; n \u003c 8; n++) {\n+\t\n+\t\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal\u0022);\n+\t\twsa.push(ws);\n+\t\ttry {\n+\t\t\tws.onopen \u003d function() {\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t\t\talive++;\n+\t\t\t};\n+\n+\t\t\tws.onmessage \u003d function got_packet(msg) {\n+\t\t\t\tvar n, s \u003d \u0022\u0022;\n+\t\t\n+\t\t\t\tring[head] \u003d msg.data + \u0022\u005cn\u0022;\n+\t\t\t\thead \u003d (head + 1) % 50;\n+\t\t\t\tif (tail \u003d\u003d\u003d head)\n+\t\t\t\t\ttail \u003d (tail + 1) % 50;\n+\t\t\n+\t\t\t\tn \u003d tail;\n+\t\t\t\tdo {\n+\t\t\t\t\ts \u003d s + ring[n];\n+\t\t\t\t\tn \u003d (n + 1) % 50;\n+\t\t\t\t} while (n !\u003d\u003d head);\n+\t\t\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d s; \n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t\t};\n+\n+\t\t\tws.onclose \u003d function(){\n+\t\t\t\talive--;\n+\t\t\t\tif (alive \u003d\u003d\u003d 0)\n+\t\t\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 1;\n+\t\t\t};\n+\t\t} catch(exception) {\n+\t\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t\t}\n+\t}\n+}, false);\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/index.html\nnew file mode 100644\nindex 0000000..ab3a306\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+ \u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\t\u003cb\u003eMinimal ws server threadpool example\u003c/b\u003e.\u003cbr\u003e\n+\t\t8 x ws connections are opened back to the example server.\u003cbr\u003e\n+\t\tThere are three threads in the pool to service them, the\u003cbr\u003e\n+\t\tremainder are queued until a thread in the pool is free.\u003cp\u003e\n+\t\tThe textarea show the last 50 lines received.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d50\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/protocol_lws_minimal_threadpool.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/protocol_lws_minimal_threadpool.c\nnew file mode 100644\nindex 0000000..c93d742\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/protocol_lws_minimal_threadpool.c\n@@ -0,0 +1,324 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022 demonstrating lws threadpool\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * The main reason some things are as they are is that the task lifecycle may\n+ * be unrelated to the wsi lifecycle that queued that task.\n+ *\n+ * Consider the task may call an external library and run for 30s without\n+ * \u0022checking in\u0022 to see if it should stop. The wsi that started the task may\n+ * have closed at any time before the 30s are up, with the browser window\n+ * closing or whatever.\n+ *\n+ * So data shared between the asynchronous task and the wsi must have its\n+ * lifecycle determined by the task, not the wsi. That means a separate struct\n+ * that can be freed by the task.\n+ *\n+ * In the case the wsi outlives the task, the tasks do not get destroyed until\n+ * the service thread has called lws_threadpool_task_status() on the completed\n+ * task. So there is no danger of the shared task private data getting randomly\n+ * freed.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_threadpool *tp;\n+\tstruct lws_context *context;\n+\tlws_sorted_usec_list_t sul;\n+\tconst char *config;\n+};\n+\n+struct task_data {\n+\tchar result[64];\n+\n+\tuint64_t pos, end;\n+};\n+\n+#if defined(WIN32)\n+static void usleep(unsigned long l) { Sleep(l / 1000); }\n+#endif\n+\n+/*\n+ * Create the private data for the task\n+ *\n+ * Notice we hand over responsibility for the cleanup and freeing of the\n+ * allocated task_data to the threadpool, because the wsi it was originally\n+ * bound to may close while the thread is still running. So we allocate\n+ * something discrete for the task private data that can be definitively owned\n+ * and freed by the threadpool, not the wsi... the pss won't do, as it only\n+ * exists for the lifecycle of the wsi connection.\n+ *\n+ * When the task is created, we also tell it how to destroy the private data\n+ * by giving it args.cleanup as cleanup_task_private_data() defined below.\n+ */\n+\n+static struct task_data *\n+create_task_private_data(void)\n+{\n+\tstruct task_data *priv \u003d malloc(sizeof(*priv));\n+\n+\treturn priv;\n+}\n+\n+/*\n+ * Destroy the private data for the task\n+ *\n+ * Notice the wsi the task was originally bound to may be long gone, in the\n+ * case we are destroying the lws context and the thread was doing something\n+ * for a long time without checking in.\n+ */\n+static void\n+cleanup_task_private_data(struct lws *wsi, void *user)\n+{\n+\tstruct task_data *priv \u003d (struct task_data *)user;\n+\n+\tfree(priv);\n+}\n+\n+/*\n+ * This runs in its own thread, from the threadpool.\n+ *\n+ * The implementation behind this in lws uses pthreads, but no pthreadisms are\n+ * required in the user code.\n+ *\n+ * The example counts to 10M, \u0022checking in\u0022 to see if it should stop after every\n+ * 100K and pausing to sync with the service thread to send a ws message every\n+ * 1M. It resumes after the service thread determines the wsi is writable and\n+ * the LWS_CALLBACK_SERVER_WRITEABLE indicates the task thread can continue by\n+ * calling lws_threadpool_task_sync().\n+ */\n+\n+static enum lws_threadpool_task_return\n+task_function(void *user, enum lws_threadpool_task_status s)\n+{\n+\tstruct task_data *priv \u003d (struct task_data *)user;\n+\tint budget \u003d 100 * 1000;\n+\n+\tif (priv-\u003epos \u003d\u003d priv-\u003eend)\n+\t\treturn LWS_TP_RETURN_FINISHED;\n+\n+\t/*\n+\t * Preferably replace this with ~100ms of your real task, so it\n+\t * can \u0022check in\u0022 at short intervals to see if it has been asked to\n+\t * stop.\n+\t *\n+\t * You can just run tasks atomically here with the thread dedicated\n+\t * to it, but it will cause odd delays while shutting down etc and\n+\t * the task will run to completion even if the wsi that started it\n+\t * has since closed.\n+\t */\n+\n+\twhile (budget--)\n+\t\tpriv-\u003epos++;\n+\n+\tusleep(100000);\n+\n+\tif (!(priv-\u003epos % (1000 * 1000))) {\n+\t\tlws_snprintf(priv-\u003eresult + LWS_PRE,\n+\t\t\t sizeof(priv-\u003eresult) - LWS_PRE,\n+\t\t\t \u0022pos %llu\u0022, (unsigned long long)priv-\u003epos);\n+\n+\t\treturn LWS_TP_RETURN_SYNC;\n+\t}\n+\n+\treturn LWS_TP_RETURN_CHECKING_IN;\n+}\n+\n+\n+static void\n+sul_tp_dump(struct lws_sorted_usec_list *sul)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\tlws_container_of(sul, struct per_vhost_data__minimal, sul);\n+\t/*\n+\t * in debug mode, dump the threadpool stat to the logs once\n+\t * a second\n+\t */\n+\tlws_threadpool_dump(vhd-\u003etp);\n+\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t sul_tp_dump, LWS_US_PER_SEC);\n+}\n+\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct lws_protocol_vhost_options *pvo;\n+\tstruct lws_threadpool_create_args cargs;\n+\tstruct lws_threadpool_task_args args;\n+\tstruct lws_threadpool_task *task;\n+\tstruct task_data *priv;\n+\tint n, m, r \u003d 0;\n+\tchar name[32];\n+\tvoid *_user;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\t/* create our per-vhost struct */\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tif (!vhd)\n+\t\t\treturn 1;\n+\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\n+\t\t/* recover the pointer to the globals struct */\n+\t\tpvo \u003d lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022config\u0022);\n+\t\tif (!pvo || !pvo-\u003evalue) {\n+\t\t\tlwsl_err(\u0022%s: Can't find \u005c\u0022config\u005c\u0022 pvo\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tvhd-\u003econfig \u003d pvo-\u003evalue;\n+\n+\t\tmemset(\u0026cargs, 0, sizeof(cargs));\n+\n+\t\tcargs.max_queue_depth \u003d 8;\n+\t\tcargs.threads \u003d 3;\n+\t\tvhd-\u003etp \u003d lws_threadpool_create(lws_get_context(wsi),\n+\t\t\t\t\u0026cargs, \u0022%s\u0022,\n+\t\t\t\tlws_get_vhost_name(lws_get_vhost(wsi)));\n+\t\tif (!vhd-\u003etp)\n+\t\t\treturn 1;\n+\n+\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n+\t\t\t\t sul_tp_dump, LWS_US_PER_SEC);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+\t\tlws_threadpool_finish(vhd-\u003etp);\n+\t\tlws_threadpool_destroy(vhd-\u003etp);\n+\t\tlws_sul_cancel(\u0026vhd-\u003esul);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\n+\t\tmemset(\u0026args, 0, sizeof(args));\n+\t\tpriv \u003d args.user \u003d create_task_private_data();\n+\t\tif (!args.user)\n+\t\t\treturn 1;\n+\n+\t\tpriv-\u003epos \u003d 0;\n+\t\tpriv-\u003eend \u003d 10 * 1000 * 1000;\n+\n+\t\t/* queue the task... the task takes on responsibility for\n+\t\t * destroying args.user. pss-\u003epriv just has a copy of it */\n+\n+\t\targs.wsi \u003d wsi;\n+\t\targs.task \u003d task_function;\n+\t\targs.cleanup \u003d cleanup_task_private_data;\n+\n+\t\tlws_get_peer_simple(wsi, name, sizeof(name));\n+\n+\t\tif (!lws_threadpool_enqueue(vhd-\u003etp, \u0026args, \u0022ws %s\u0022, name)) {\n+\t\t\tlwsl_user(\u0022%s: Couldn't enqueue task\u005cn\u0022, __func__);\n+\t\t\tcleanup_task_private_data(wsi, priv);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tlws_set_timeout(wsi, PENDING_TIMEOUT_THREADPOOL, 30);\n+\n+\t\t/*\n+\t\t * so the asynchronous worker will let us know the next step\n+\t\t * by causing LWS_CALLBACK_SERVER_WRITEABLE\n+\t\t */\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_WS_SERVER_DROP_PROTOCOL:\n+\t\tlwsl_debug(\u0022LWS_CALLBACK_WS_SERVER_DROP_PROTOCOL: %p\u005cn\u0022, wsi);\n+\t\tlws_threadpool_dequeue_task(lws_threadpool_get_task_wsi(wsi));\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\n+\t\t/*\n+\t\t * even completed tasks wait in a queue until we call the\n+\t\t * below on them. Then they may destroy themselves and their\n+\t\t * args.user data (by calling the cleanup callback).\n+\t\t *\n+\t\t * If you need to get things from the still-valid private task\n+\t\t * data, copy it here before calling\n+\t\t * lws_threadpool_task_status() that may free the task and the\n+\t\t * private task data.\n+\t\t */\n+\n+\t\ttask \u003d lws_threadpool_get_task_wsi(wsi);\n+\t\tif (!task)\n+\t\t\tbreak;\n+\t\tn \u003d (int)lws_threadpool_task_status(task, \u0026_user);\n+\t\tlwsl_debug(\u0022%s: LWS_CALLBACK_SERVER_WRITEABLE: status %d\u005cn\u0022,\n+\t\t\t __func__, n);\n+\t\tswitch(n) {\n+\n+\t\tcase LWS_TP_STATUS_FINISHED:\n+\t\tcase LWS_TP_STATUS_STOPPED:\n+\t\tcase LWS_TP_STATUS_QUEUED:\n+\t\tcase LWS_TP_STATUS_RUNNING:\n+\t\tcase LWS_TP_STATUS_STOPPING:\n+\t\t\treturn 0;\n+\n+\t\tcase LWS_TP_STATUS_SYNCING:\n+\t\t\t/* the task has paused for us to do something */\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tpriv \u003d (struct task_data *)_user;\n+\n+\t\tlws_set_timeout(wsi, PENDING_TIMEOUT_THREADPOOL_TASK, 5);\n+\n+\t\tn \u003d (int)strlen(priv-\u003eresult + LWS_PRE);\n+\t\tm \u003d lws_write(wsi, (unsigned char *)priv-\u003eresult + LWS_PRE,\n+\t\t\t (unsigned int)n, LWS_WRITE_TEXT);\n+\t\tif (m \u003c n) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\tlws_threadpool_task_sync(task, 1);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/*\n+\t\t * service thread has done whatever it wanted to do with the\n+\t\t * data the task produced: if it's waiting to do more it can\n+\t\t * continue now.\n+\t\t */\n+\t\tlws_threadpool_task_sync(task, 0);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn r;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\t0, \u005c\n+\t\t128, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..78fbf29\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/CMakeLists.txt\n@@ -0,0 +1,44 @@\n+project(lws-minimal-ws-server-threads-foreign-libuv-smp C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-threads-foreign-smp)\n+set(SRCS minimal-ws-server.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_TLS 1 requirements)\n+require_lws_config(LWS_WITH_LIBUV 1 requirements)\n+\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cn#if defined(LWS_WITH_LIBUV)\u005cn return 0;\u005cn#else\u005cn fail;\u005cn#endif\u005cn return 0;\u005cn}\u005cn\u0022 LWS_WITH_LIBUV)\n+\n+if (NOT LWS_WITH_LIBUV)\n+\tset(requirements 0)\n+endif()\n+\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\t\n+\tfind_path(LIBUV_INCLUDE_DIRS NAMES uv.h)\n+\tfind_library(LIBUV_LIBRARIES NAMES uv)\n+\tmessage(\u0022libuv include dir: ${LIBUV_INCLUDE_DIRS}\u0022)\n+\tmessage(\u0022libuv libraries: ${LIBUV_LIBRARIES}\u0022)\n+\tinclude_directories(\u0022${LIBUV_INCLUDE_DIRS}\u0022)\n+\tset(extralibs ${extralibs} ${LIBUV_LIBRARIES})\n+\t\n+\tmessage(\u0022Extra libs: ${extralibs}\u0022)\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${SAMP} websockets_shared ${extralibs} ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${SAMP} websockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${SAMP} websockets ${extralibs} ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/README.md\nnew file mode 100644\nindex 0000000..e50adaf\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/README.md\n@@ -0,0 +1,39 @@\n+# lws minimal ws server (threads) + SMP\n+\n+This demonstrates both independent threads creating content as in the\n+-threads example, multiple service threads as in the http-server-smp\n+example (but with ws), and using the foreign libuv loop.\n+\n+## build\n+\n+You must first build libwebsockets itself with cmake `-DLWS_MAX_SMP\u003d8`\n+or some other number greater than one, as well as `-DLWS_WITH_LIBUV\u003d1`\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+Pthreads is required on your system.\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server-threads-smp\n+[2019/01/28 06:59:17:4217] USER: LWS minimal ws server + threads + smp | visit http://localhost:7681\n+[2019/01/28 06:59:17:4219] NOTICE: Service threads: 2\n+[2019/01/28 06:59:17:4220] NOTICE: LWS_CALLBACK_EVENT_WAIT_CANCELLED in svc tid 0x7fec48af8700\n+[2019/01/28 06:59:17:4220] NOTICE: LWS_CALLBACK_EVENT_WAIT_CANCELLED in svc tid 0x7fec48af8700\n+...\n+```\n+\n+Visit http://localhost:7681 on multiple browser windows. You may need to open\n+4 before the second service thread is used (check \u0022svc tid\u0022 in the browser output).\n+\n+Two lws service threads are started.\n+\n+Two separate asynchronous threads generate strings and add them to a ringbuffer,\n+signalling all lws service threads to send new entries to all the browser windows.\n+\n+This demonstrates how to safely manage asynchronously generated content\n+and hook it up to the lws service threads.\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/minimal-ws-server.c\nnew file mode 100644\nindex 0000000..1b8299a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/minimal-ws-server.c\n@@ -0,0 +1,204 @@\n+/*\n+ * lws-minimal-ws-server-threads-foreign-smp\n+ *\n+ * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal ws server that can cooperate with\n+ * other threads cleanly. Two other threads are started, which fill\n+ * a ringbuffer with strings at 10Hz.\n+ *\n+ * The actual work and thread spawning etc are done in the protocol\n+ * implementation in protocol_lws_minimal.c.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+#include \u003cuv.h\u003e\n+\n+#define COUNT_THREADS 5\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static struct lws_context *context;\n+static int interrupted;\n+static uv_loop_t loop[COUNT_THREADS];\n+static uv_signal_t *s, signal_outer[COUNT_THREADS];\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/*\n+ * This demonstrates how to pass a pointer into a specific protocol handler\n+ * running on a specific vhost. In this case, it's our default vhost and\n+ * we pass the pvo named \u0022config\u0022 with the value a const char * \u0022myconfig\u0022.\n+ *\n+ * This is the preferred way to pass configuration into a specific vhost +\n+ * protocol instance.\n+ */\n+\n+static const struct lws_protocol_vhost_options pvo_ops \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022config\u0022,\t\t/* pvo name */\n+\t(void *)\u0022myconfig\u0022\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_ops,\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-minimal\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t/* ignored */\n+};\n+\n+void *thread_service(void *threadid)\n+{\n+\t/*\n+\t * This is a foreign thread context for each event loop... lws doesn't\n+\t * know about it, except that it's getting called into from the event\n+\t * lib bound to each of these.\n+\t *\n+\t * When closing, at the point we have detached everything related to\n+\t * lws from the loop and destroyed the context we can as the \u0022foreign\n+\t * app\u0022 take care of stopping the foreign loop and cloing this thread.\n+\t *\n+\t * The call to lws_service_tsi just starts the related event loop\n+\t */\n+\twhile (lws_service_tsi(context, 0,\n+\t\t\t (int)(lws_intptr_t)threadid) \u003e\u003d 0 \u0026\u0026\n+\t !interrupted)\n+\t\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n+\n+\tlwsl_info(\u0022%s: thr %d: exiting\u005cn\u0022, __func__, (int)(lws_intptr_t)threadid);\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+static void\n+signal_cb(uv_signal_t *watcher, int signum)\n+{\n+\tint n;\n+\n+\tn \u003d (int)(watcher - signal_outer);\n+\n+\tlwsl_notice(\u0022%s: thr %d: signal %d caught\u005cn\u0022, __func__, n,\n+\t\t\twatcher-\u003esignum);\n+\n+\tuv_signal_stop(watcher);\n+\tuv_close((uv_handle_t *)\u0026signal_outer[n], NULL);\n+\tif (!interrupted) {\n+\t\tinterrupted \u003d 1;\n+\t\tlws_context_destroy(context);\n+\t}\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tpthread_t pthread_service[COUNT_THREADS];\n+\tstruct lws_context_creation_info info;\n+\tvoid *foreign_loops[COUNT_THREADS];\n+\tint actual_threads;\n+\tconst char *p;\n+\tvoid *retval;\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server + threads + smp | visit http://localhost:7681\u005cn\u0022);\n+\n+\tfor (n \u003d 0; n \u003c COUNT_THREADS; n++) {\n+\t\tuv_loop_init(\u0026loop[n]);\n+\n+\t\ts \u003d \u0026signal_outer[n];\n+\t\tuv_signal_init(\u0026loop[n], s);\n+\t\tuv_signal_start(s, signal_cb, SIGINT);\n+\n+\t\tforeign_loops[n] \u003d \u0026loop[n];\n+\t}\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.pcontext \u003d \u0026context;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo; /* per-vhost options */\n+\tinfo.foreign_loops \u003d foreign_loops;\n+\tinfo.count_threads \u003d COUNT_THREADS;\n+\tinfo.options \u003d LWS_SERVER_OPTION_LIBUV |\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tactual_threads \u003d lws_get_count_threads(context);\n+\tlwsl_notice(\u0022 Service threads: %d\u005cn\u0022, actual_threads);\n+\n+\t/* start all the service threads */\n+\n+\tfor (n \u003d 0; n \u003c actual_threads; n++)\n+\t\tif (pthread_create(\u0026pthread_service[n], NULL, thread_service,\n+\t\t\t\t (void *)(lws_intptr_t)n))\n+\t\t\tlwsl_err(\u0022Failed to start service thread\u005cn\u0022);\n+\n+\t/* wait for all the service threads to exit */\n+\n+\twhile ((--n) \u003e\u003d 0)\n+\t\tpthread_join(pthread_service[n], \u0026retval);\n+\n+\tlws_context_destroy(context);\n+\n+\tfor (n \u003d 0; n \u003c COUNT_THREADS; n++) {\n+\t\tint m;\n+\n+\t\tm \u003d uv_loop_close(\u0026loop[n]);\n+\t\tif (m)\n+\t\t\tlwsl_notice(\u0022%s: uv_close_loop %d: %d\u005cn\u0022, __func__, n, m);\n+\t}\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/example.js\nnew file mode 100644\nindex 0000000..b17a826\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/example.js\n@@ -0,0 +1,68 @@\n+var head \u003d 0, tail \u003d 0, ring \u003d new Array();\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tvar n, s \u003d \u0022\u0022;\n+\t\n+\t\t\tring[head] \u003d msg.data + \u0022\u005cn\u0022;\n+\t\t\thead \u003d (head + 1) % 50;\n+\t\t\tif (tail \u003d\u003d\u003d head)\n+\t\t\t\ttail \u003d (tail + 1) % 50;\n+\t\n+\t\t\tn \u003d tail;\n+\t\t\tdo {\n+\t\t\t\ts \u003d s + ring[n];\n+\t\t\t\tn \u003d (n + 1) % 50;\n+\t\t\t} while (n !\u003d\u003d head);\n+\t\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d s; \n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\n+}, false);\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/index.html\nnew file mode 100644\nindex 0000000..13145f6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\t\u003cb\u003eMinimal ws server threads SMP example\u003c/b\u003e.\u003cbr\u003e\n+\t\tStrings generated by server threads are sent to\n+\t\tall browsers open on this page.\u003cbr\u003e\n+\t\tThe textarea show the last 50 lines received.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d80 rows\u003d50\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..7feaaca\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/protocol_lws_minimal.c\n@@ -0,0 +1,321 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022 demonstrating multithread\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+#include \u003cassert.h\u003e\n+\n+/* one of these created for each message in the ringbuffer */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/*\n+ * One of these is created for each client connecting to us.\n+ *\n+ * It is ONLY read or written from the lws service thread context.\n+ */\n+\n+struct per_session_data__minimal {\n+\tstruct per_session_data__minimal *pss_list;\n+\tstruct lws *wsi;\n+\tuint32_t tail;\n+};\n+\n+/*\n+ * One of these is created for each vhost our protocol is used with, that\n+ * means it is a shared resource between the SMP threads and must be locked.\n+ */\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n+\tpthread_t pthread_spam[2];\n+\n+\tpthread_mutex_t lock_ring; /* serialize access to the ring buffer */\n+\tstruct lws_ring *ring; /* {lock_ring} ringbuffer holding unsent content */\n+\n+\tconst char *config;\n+\tchar finished;\n+};\n+\n+#if defined(WIN32)\n+static void usleep(unsigned long l) { Sleep(l / 1000); }\n+#endif\n+\n+/*\n+ * This runs under both lws service and \u0022spam threads\u0022 contexts.\n+ * Access is serialized by vhd-\u003elock_ring.\n+ */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+/*\n+ * This runs under the \u0022spam thread\u0022 thread context only.\n+ *\n+ * We spawn two threads that generate messages with this.\n+ *\n+ */\n+\n+static void *\n+thread_spam(void *d)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)d;\n+\tstruct msg amsg;\n+\tint len \u003d 128, index \u003d 1, n, whoami \u003d 0;\n+\n+\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\tif (pthread_equal(pthread_self(), vhd-\u003epthread_spam[n]))\n+\t\t\twhoami \u003d n + 1;\n+\n+\tdo {\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\t/* don't generate output if nobody connected */\n+\t\tif (!vhd-\u003epss_list)\n+\t\t\tgoto wait_unlock;\n+\n+\t\t/* only create if space in ringbuffer */\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(vhd-\u003ering);\n+\t\tif (!n) {\n+\t\t\t// lwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\n+\t\tamsg.payload \u003d malloc((unsigned int)(LWS_PRE + len));\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\t\tn \u003d lws_snprintf((char *)amsg.payload + LWS_PRE, (unsigned int)len,\n+\t\t\t \u0022%s: spam tid: %d, msg: %d\u0022, vhd-\u003econfig,\n+\t\t\t whoami, index++);\n+\t\tamsg.len \u003d (unsigned int)n;\n+\t\tn \u003d (int)lws_ring_insert(vhd-\u003ering, \u0026amsg, 1);\n+\t\tif (n !\u003d 1) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\t// lwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t} else\n+\t\t\t/*\n+\t\t\t * This will cause a LWS_CALLBACK_EVENT_WAIT_CANCELLED\n+\t\t\t * in the lws service thread context.\n+\t\t\t */\n+\t\t\tlws_cancel_service(vhd-\u003econtext);\n+\n+wait_unlock:\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\n+\t\tusleep(100000);\n+\n+\t} while (!vhd-\u003efinished);\n+\n+\tlwsl_notice(\u0022thread_spam %d exiting\u005cn\u0022, whoami);\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+/* this runs under the lws service thread context only */\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct lws_protocol_vhost_options *pvo;\n+\tconst struct msg *pmsg;\n+\tchar temp[LWS_PRE + 256];\n+\tvoid *retval;\n+\tint n, m, r \u003d 0;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\t/* create our per-vhost struct */\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tif (!vhd)\n+\t\t\treturn 1;\n+\n+\t\tpthread_mutex_init(\u0026vhd-\u003elock_ring, NULL);\n+\n+\t\t/* recover the pointer to the globals struct */\n+\t\tpvo \u003d lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022config\u0022);\n+\t\tif (!pvo || !pvo-\u003evalue) {\n+\t\t\tlwsl_err(\u0022%s: Can't find \u005c\u0022config\u005c\u0022 pvo\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tvhd-\u003econfig \u003d pvo-\u003evalue;\n+\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!vhd-\u003ering) {\n+\t\t\tlwsl_err(\u0022%s: failed to create ring\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\t/* start the content-creating threads */\n+\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tif (pthread_create(\u0026vhd-\u003epthread_spam[n], NULL,\n+\t\t\t\t\t thread_spam, vhd)) {\n+\t\t\t\tlwsl_err(\u0022thread creation failed\u005cn\u0022);\n+\t\t\t\tr \u003d 1;\n+\t\t\t\tgoto init_fail;\n+\t\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+init_fail:\n+\t\tvhd-\u003efinished \u003d 1;\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tpthread_join(vhd-\u003epthread_spam[n], \u0026retval);\n+\n+\t\tif (vhd-\u003ering)\n+\t\t\tlws_ring_destroy(vhd-\u003ering);\n+\n+\t\tpthread_mutex_destroy(\u0026vhd-\u003elock_ring);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* add ourselves to the list of live pss held in the vhd */\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring);\n+\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+\t\tpss-\u003etail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\t/* doesn't reference ring */\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring);\n+\t\t/* remove our closing pss from the list of live pss */\n+\t\tlws_ll_fwd_remove(struct per_session_data__minimal, pss_list,\n+\t\t\t\t pss, vhd-\u003epss_list);\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg) {\n+\t\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tassert(pmsg-\u003epayload);\n+\n+\t\tn \u003d lws_snprintf(temp + LWS_PRE, sizeof(temp) - LWS_PRE,\n+\t\t\t \u0022svc, %s\u0022,\n+\t\t\t (char *)pmsg-\u003epayload + LWS_PRE);\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, (unsigned char *)temp + LWS_PRE, (unsigned int)n,\n+\t\t\t LWS_WRITE_TEXT);\n+\t\tif (m \u003c n) {\n+\t\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlws_ring_consume_and_update_oldest_tail(\n+\t\t\tvhd-\u003ering,\t/* lws_ring object */\n+\t\t\tstruct per_session_data__minimal, /* type of objects with tails */\n+\t\t\t\u0026pss-\u003etail,\t/* tail of guy doing the consuming */\n+\t\t\t1,\t\t/* number of payload objects being consumed */\n+\t\t\tvhd-\u003epss_list, /* head of list of objects with tails */\n+\t\t\ttail,\t\t/* member name of tail in objects with tails */\n+\t\t\tpss_list\t/* member name of next object in objects with tails */\n+\t\t);\n+\n+\t\t/* more to do? */\n+\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(pss-\u003ewsi);\n+\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_EVENT_WAIT_CANCELLED:\n+\t\t// lwsl_notice(\u0022EVENT_WAIT_CANCELLED tsi %d\u005cn\u0022, lws_wsi_tsi(wsi));\n+\t\tif (!vhd)\n+\t\t\tbreak;\n+\t\t/*\n+\t\t * When the \u0022spam\u0022 threads add a message to the ringbuffer,\n+\t\t * they create this event in the lws service thread context\n+\t\t * using lws_cancel_service().\n+\t\t *\n+\t\t * We respond by scheduling a writable callback for all\n+\t\t * connected clients.\n+\t\t */\n+\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tif (lws_wsi_tsi((*ppss)-\u003ewsi) \u003d\u003d lws_wsi_tsi(wsi))\n+\t\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn r;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t128, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/CMakeLists.txt\nnew file mode 100644\nindex 0000000..098a174\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/CMakeLists.txt\n@@ -0,0 +1,27 @@\n+project(lws-minimal-ws-server-threads-smp C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-threads-smp)\n+set(SRCS minimal-ws-server.c)\n+\n+set(requirements 1)\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/README.md\nnew file mode 100644\nindex 0000000..81be312\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/README.md\n@@ -0,0 +1,39 @@\n+# lws minimal ws server (threads) + SMP\n+\n+This demonstrates both independent threads creating content\n+as in the -threads example, and multiple service threads\n+as in the http-server-smp example (but with ws).\n+\n+## build\n+\n+You must first build libwebsockets itself with cmake `-DLWS_MAX_SMP\u003d8`\n+or some other number greater than one.\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+Pthreads is required on your system.\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server-threads-smp\n+[2019/01/28 06:59:17:4217] USER: LWS minimal ws server + threads + smp | visit http://localhost:7681\n+[2019/01/28 06:59:17:4219] NOTICE: Service threads: 2\n+[2019/01/28 06:59:17:4220] NOTICE: LWS_CALLBACK_EVENT_WAIT_CANCELLED in svc tid 0x7fec48af8700\n+[2019/01/28 06:59:17:4220] NOTICE: LWS_CALLBACK_EVENT_WAIT_CANCELLED in svc tid 0x7fec48af8700\n+...\n+```\n+\n+Visit http://localhost:7681 on multiple browser windows. You may need to open\n+4 before the second service thread is used (check \u0022svc tid\u0022 in the browser output).\n+\n+Two lws service threads are started.\n+\n+Two separate asynchronous threads generate strings and add them to a ringbuffer,\n+signalling all lws service threads to send new entries to all the browser windows.\n+\n+This demonstrates how to safely manage asynchronously generated content\n+and hook it up to the lws service threads.\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/minimal-ws-server.c\nnew file mode 100644\nindex 0000000..43c5ea3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/minimal-ws-server.c\n@@ -0,0 +1,185 @@\n+/*\n+ * lws-minimal-ws-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal ws server that can cooperate with\n+ * other threads cleanly. Two other threads are started, which fill\n+ * a ringbuffer with strings at 10Hz.\n+ *\n+ * The actual work and thread spawning etc are done in the protocol\n+ * implementation in protocol_lws_minimal.c.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+#define COUNT_THREADS 2\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static struct lws_context *context;\n+static int interrupted, started;\n+static pthread_t pthread_service[COUNT_THREADS];\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/*\n+ * This demonstrates how to pass a pointer into a specific protocol handler\n+ * running on a specific vhost. In this case, it's our default vhost and\n+ * we pass the pvo named \u0022config\u0022 with the value a const char * \u0022myconfig\u0022.\n+ *\n+ * This is the preferred way to pass configuration into a specific vhost +\n+ * protocol instance.\n+ */\n+\n+static const struct lws_protocol_vhost_options pvo_ops \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022config\u0022,\t\t/* pvo name */\n+\t(void *)\u0022myconfig\u0022\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_ops,\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-minimal\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t/* ignored */\n+};\n+\n+void *thread_service(void *threadid)\n+{\n+\twhile (lws_service_tsi(context, 1000,\n+\t\t\t (int)(lws_intptr_t)threadid) \u003e\u003d 0 \u0026\u0026\n+\t !interrupted)\n+\t\t;\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+static int\n+system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n+\t\t int current, int target)\n+{\n+\tstruct lws_context *context \u003d mgr-\u003eparent;\n+\tvoid *retval;\n+\n+\tif (current !\u003d target)\n+\t\treturn 0;\n+\n+\tswitch (current) {\n+\tcase LWS_SYSTATE_OPERATIONAL:\n+\t\tlwsl_notice(\u0022 Service threads: %d\u005cn\u0022,\n+\t\t\t lws_get_count_threads(context));\n+\n+\t\t/* start all the service threads */\n+\n+\t\tfor (started \u003d 1; started \u003c lws_get_count_threads(context);\n+\t\t started++)\n+\t\t\tif (pthread_create(\u0026pthread_service[started], NULL,\n+\t\t\t\t\t thread_service,\n+\t\t\t\t\t (void *)(lws_intptr_t)started))\n+\t\t\t\tlwsl_err(\u0022Failed to start service thread\u005cn\u0022);\n+\t\tbreak;\n+\tcase LWS_SYSTATE_CONTEXT_DESTROYING:\n+\t\t/* wait for all the service threads to exit */\n+\n+\t\twhile ((--started) \u003e\u003d 1)\n+\t\t\tpthread_join(pthread_service[started], \u0026retval);\n+\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+lws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n+\t\t\t\t system_notify_cb, \u0022app\u0022 };\n+lws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+\tlws_cancel_service(context);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n+\tstruct lws_context_creation_info info;\n+\tconst char *p;\n+\tint n \u003d 0;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server + threads + smp | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo; /* per-vhost options */\n+\tinfo.count_threads \u003d COUNT_THREADS;\n+\tinfo.register_notifier_list \u003d na;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/example.js\nnew file mode 100644\nindex 0000000..b17a826\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/example.js\n@@ -0,0 +1,68 @@\n+var head \u003d 0, tail \u003d 0, ring \u003d new Array();\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tvar n, s \u003d \u0022\u0022;\n+\t\n+\t\t\tring[head] \u003d msg.data + \u0022\u005cn\u0022;\n+\t\t\thead \u003d (head + 1) % 50;\n+\t\t\tif (tail \u003d\u003d\u003d head)\n+\t\t\t\ttail \u003d (tail + 1) % 50;\n+\t\n+\t\t\tn \u003d tail;\n+\t\t\tdo {\n+\t\t\t\ts \u003d s + ring[n];\n+\t\t\t\tn \u003d (n + 1) % 50;\n+\t\t\t} while (n !\u003d\u003d head);\n+\t\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d s; \n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\n+}, false);\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/index.html\nnew file mode 100644\nindex 0000000..13145f6\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\t\u003cb\u003eMinimal ws server threads SMP example\u003c/b\u003e.\u003cbr\u003e\n+\t\tStrings generated by server threads are sent to\n+\t\tall browsers open on this page.\u003cbr\u003e\n+\t\tThe textarea show the last 50 lines received.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d80 rows\u003d50\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..8c085aa\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/protocol_lws_minimal.c\n@@ -0,0 +1,302 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022 demonstrating multithread\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/* one of these created for each message in the ringbuffer */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/*\n+ * One of these is created for each client connecting to us.\n+ *\n+ * It is ONLY read or written from the lws service thread context.\n+ */\n+\n+struct per_session_data__minimal {\n+\tstruct per_session_data__minimal *pss_list;\n+\tstruct lws *wsi;\n+\tuint32_t tail;\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n+\tpthread_t pthread_spam[2];\n+\n+\tpthread_mutex_t lock_ring; /* serialize access to the ring buffer */\n+\tstruct lws_ring *ring; /* {lock_ring} ringbuffer holding unsent content */\n+\n+\tconst char *config;\n+\tchar finished;\n+};\n+\n+#if defined(WIN32)\n+static void usleep(unsigned long l) { Sleep(l / 1000); }\n+#endif\n+\n+/*\n+ * This runs under both lws service and \u0022spam threads\u0022 contexts.\n+ * Access is serialized by vhd-\u003elock_ring.\n+ */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+/*\n+ * This runs under the \u0022spam thread\u0022 thread context only.\n+ *\n+ * We spawn two threads that generate messages with this.\n+ *\n+ */\n+\n+static void *\n+thread_spam(void *d)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)d;\n+\tstruct msg amsg;\n+\tint len \u003d 128, index \u003d 1, n, whoami \u003d 0;\n+\n+\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\tif (pthread_equal(pthread_self(), vhd-\u003epthread_spam[n]))\n+\t\t\twhoami \u003d n + 1;\n+\n+\tdo {\n+\t\t/* don't generate output if nobody connected */\n+\t\tif (!vhd-\u003epss_list)\n+\t\t\tgoto wait;\n+\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\t/* only create if space in ringbuffer */\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(vhd-\u003ering);\n+\t\tif (!n) {\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\n+\t\tamsg.payload \u003d malloc((unsigned int)(LWS_PRE + len));\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\t\tn \u003d lws_snprintf((char *)amsg.payload + LWS_PRE, (unsigned int)len,\n+\t\t\t \u0022%s: spam tid: %d, msg: %d\u0022, vhd-\u003econfig,\n+\t\t\t whoami, index++);\n+\t\tamsg.len \u003d (unsigned int)n;\n+\t\tn \u003d (int)lws_ring_insert(vhd-\u003ering, \u0026amsg, 1);\n+\t\tif (n !\u003d 1) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t} else\n+\t\t\t/*\n+\t\t\t * This will cause a LWS_CALLBACK_EVENT_WAIT_CANCELLED\n+\t\t\t * in the lws service thread context.\n+\t\t\t */\n+\t\t\tlws_cancel_service(vhd-\u003econtext);\n+\n+wait_unlock:\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\n+wait:\n+\t\tusleep(100000);\n+\n+\t} while (!vhd-\u003efinished);\n+\n+\tlwsl_notice(\u0022thread_spam %d exiting\u005cn\u0022, whoami);\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+/* this runs under the lws service thread context only */\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct lws_protocol_vhost_options *pvo;\n+\tconst struct msg *pmsg;\n+\tchar temp[LWS_PRE + 256];\n+\tvoid *retval;\n+\tint n, m, r \u003d 0;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\t/* create our per-vhost struct */\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tif (!vhd)\n+\t\t\treturn 1;\n+\n+\t\tpthread_mutex_init(\u0026vhd-\u003elock_ring, NULL);\n+\n+\t\t/* recover the pointer to the globals struct */\n+\t\tpvo \u003d lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022config\u0022);\n+\t\tif (!pvo || !pvo-\u003evalue) {\n+\t\t\tlwsl_err(\u0022%s: Can't find \u005c\u0022config\u005c\u0022 pvo\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tvhd-\u003econfig \u003d pvo-\u003evalue;\n+\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!vhd-\u003ering) {\n+\t\t\tlwsl_err(\u0022%s: failed to create ring\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\t/* start the content-creating threads */\n+\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tif (pthread_create(\u0026vhd-\u003epthread_spam[n], NULL,\n+\t\t\t\t\t thread_spam, vhd)) {\n+\t\t\t\tlwsl_err(\u0022thread creation failed\u005cn\u0022);\n+\t\t\t\tr \u003d 1;\n+\t\t\t\tgoto init_fail;\n+\t\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+init_fail:\n+\t\tvhd-\u003efinished \u003d 1;\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tpthread_join(vhd-\u003epthread_spam[n], \u0026retval);\n+\n+\t\tif (vhd-\u003ering)\n+\t\t\tlws_ring_destroy(vhd-\u003ering);\n+\n+\t\tpthread_mutex_destroy(\u0026vhd-\u003elock_ring);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* add ourselves to the list of live pss held in the vhd */\n+\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+\t\tpss-\u003etail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\t/* remove our closing pss from the list of live pss */\n+\t\tlws_ll_fwd_remove(struct per_session_data__minimal, pss_list,\n+\t\t\t\t pss, vhd-\u003epss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg) {\n+\t\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tn \u003d lws_snprintf(temp + LWS_PRE, sizeof(temp) - LWS_PRE,\n+\t\t\t \u0022svc, %s\u0022,\n+\t\t\t (char *)pmsg-\u003epayload + LWS_PRE);\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, (unsigned char *)temp + LWS_PRE, (unsigned int)n,\n+\t\t\t LWS_WRITE_TEXT);\n+\t\tif (m \u003c n) {\n+\t\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlws_ring_consume_and_update_oldest_tail(\n+\t\t\tvhd-\u003ering,\t/* lws_ring object */\n+\t\t\tstruct per_session_data__minimal, /* type of objects with tails */\n+\t\t\t\u0026pss-\u003etail,\t/* tail of guy doing the consuming */\n+\t\t\t1,\t\t/* number of payload objects being consumed */\n+\t\t\tvhd-\u003epss_list,\t/* head of list of objects with tails */\n+\t\t\ttail,\t\t/* member name of tail in objects with tails */\n+\t\t\tpss_list\t/* member name of next object in objects with tails */\n+\t\t);\n+\n+\t\t/* more to do? */\n+\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(pss-\u003ewsi);\n+\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_EVENT_WAIT_CANCELLED:\n+\t\tlwsl_notice(\u0022LWS_CALLBACK_EVENT_WAIT_CANCELLED in svc\u005cn\u0022);\n+\t\tif (!vhd)\n+\t\t\tbreak;\n+\t\t/*\n+\t\t * When the \u0022spam\u0022 threads add a message to the ringbuffer,\n+\t\t * they create this event in the lws service thread context\n+\t\t * using lws_cancel_service().\n+\t\t *\n+\t\t * We respond by scheduling a writable callback for all\n+\t\t * connected clients.\n+\t\t */\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn r;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t128, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/CMakeLists.txt\nnew file mode 100644\nindex 0000000..513ea9d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/CMakeLists.txt\n@@ -0,0 +1,29 @@\n+project(lws-minimal-ws-server-threads C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-threads)\n+set(SRCS minimal-ws-server.c)\n+\n+set(requirements 1)\n+if (WIN32)\n+\tset(requirements 0)\n+endif()\n+require_pthreads(requirements)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/README.md\nnew file mode 100644\nindex 0000000..123b7bb\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/README.md\n@@ -0,0 +1,25 @@\n+# lws minimal ws server (threads)\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+Pthreads is required on your system.\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server-threads\n+[2018/03/13 13:09:52:2208] USER: LWS minimal ws server + threads | visit http://localhost:7681\n+[2018/03/13 13:09:52:2365] NOTICE: Creating Vhost 'default' port 7681, 2 protocols, IPv6 off\n+```\n+\n+Visit http://localhost:7681 on multiple browser windows\n+\n+Two asynchronous threads generate strings and add them to a ringbuffer,\n+signalling lws to send new entries to all the browser windows.\n+\n+This demonstrates how to safely manage asynchronously generated content\n+and hook it up to the lws service thread.\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/minimal-ws-server.c\nnew file mode 100644\nindex 0000000..9e4627e\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/minimal-ws-server.c\n@@ -0,0 +1,135 @@\n+/*\n+ * lws-minimal-ws-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a minimal ws server that can cooperate with\n+ * other threads cleanly. Two other threads are started, which fill\n+ * a ringbuffer with strings at 10Hz.\n+ *\n+ * The actual work and thread spawning etc are done in the protocol\n+ * implementation in protocol_lws_minimal.c.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#if defined(WIN32)\n+#define HAVE_STRUCT_TIMESPEC\n+#if defined(pid_t)\n+#undef pid_t\n+#endif\n+#endif\n+#include \u003cpthread.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+/*\n+ * This demonstrates how to pass a pointer into a specific protocol handler\n+ * running on a specific vhost. In this case, it's our default vhost and\n+ * we pass the pvo named \u0022config\u0022 with the value a const char * \u0022myconfig\u0022.\n+ *\n+ * This is the preferred way to pass configuration into a specific vhost +\n+ * protocol instance.\n+ */\n+\n+static const struct lws_protocol_vhost_options pvo_ops \u003d {\n+\tNULL,\n+\tNULL,\n+\t\u0022config\u0022,\t\t/* pvo name */\n+\t(void *)\u0022myconfig\u0022\t/* pvo value */\n+};\n+\n+static const struct lws_protocol_vhost_options pvo \u003d {\n+\tNULL,\t\t/* \u0022next\u0022 pvo linked-list */\n+\t\u0026pvo_ops,\t/* \u0022child\u0022 pvo linked-list */\n+\t\u0022lws-minimal\u0022,\t/* protocol name we belong to on this vhost */\n+\t\u0022\u0022\t\t/* ignored */\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server + threads | visit http://localhost:7681\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.pvo \u003d \u0026pvo; /* per-vhost options */\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\t/* start the threads that create content */\n+\n+\twhile (!interrupted)\n+\t\tif (lws_service(context, 0))\n+\t\t\tinterrupted \u003d 1;\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/example.js\nnew file mode 100644\nindex 0000000..b17a826\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/example.js\n@@ -0,0 +1,68 @@\n+var head \u003d 0, tail \u003d 0, ring \u003d new Array();\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tvar n, s \u003d \u0022\u0022;\n+\t\n+\t\t\tring[head] \u003d msg.data + \u0022\u005cn\u0022;\n+\t\t\thead \u003d (head + 1) % 50;\n+\t\t\tif (tail \u003d\u003d\u003d head)\n+\t\t\t\ttail \u003d (tail + 1) % 50;\n+\t\n+\t\t\tn \u003d tail;\n+\t\t\tdo {\n+\t\t\t\ts \u003d s + ring[n];\n+\t\t\t\tn \u003d (n + 1) % 50;\n+\t\t\t} while (n !\u003d\u003d head);\n+\t\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d s; \n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\n+}, false);\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/index.html\nnew file mode 100644\nindex 0000000..8bd248c\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\u003cbr\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\t\u003cb\u003eMinimal ws server threads example\u003c/b\u003e.\u003cbr\u003e\n+\t\tStrings generated by server threads are sent to\n+\t\tall browsers open on this page.\u003cbr\u003e\n+\t\tThe textarea show the last 50 lines received.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d50\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..e01f64d\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/protocol_lws_minimal.c\n@@ -0,0 +1,297 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022 demonstrating multithread\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/* one of these created for each message in the ringbuffer */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/*\n+ * One of these is created for each client connecting to us.\n+ *\n+ * It is ONLY read or written from the lws service thread context.\n+ */\n+\n+struct per_session_data__minimal {\n+\tstruct per_session_data__minimal *pss_list;\n+\tstruct lws *wsi;\n+\tuint32_t tail;\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n+\tpthread_t pthread_spam[2];\n+\n+\tpthread_mutex_t lock_ring; /* serialize access to the ring buffer */\n+\tstruct lws_ring *ring; /* {lock_ring} ringbuffer holding unsent content */\n+\n+\tconst char *config;\n+\tchar finished;\n+};\n+\n+#if defined(WIN32)\n+static void usleep(unsigned long l) { Sleep(l / 1000); }\n+#endif\n+\n+/*\n+ * This runs under both lws service and \u0022spam threads\u0022 contexts.\n+ * Access is serialized by vhd-\u003elock_ring.\n+ */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+/*\n+ * This runs under the \u0022spam thread\u0022 thread context only.\n+ *\n+ * We spawn two threads that generate messages with this.\n+ *\n+ */\n+\n+static void *\n+thread_spam(void *d)\n+{\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)d;\n+\tstruct msg amsg;\n+\tint len \u003d 128, index \u003d 1, n, whoami \u003d 0;\n+\n+\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\tif (pthread_equal(pthread_self(), vhd-\u003epthread_spam[n]))\n+\t\t\twhoami \u003d n + 1;\n+\n+\tdo {\n+\t\t/* don't generate output if nobody connected */\n+\t\tif (!vhd-\u003epss_list)\n+\t\t\tgoto wait;\n+\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\t/* only create if space in ringbuffer */\n+\t\tn \u003d (int)lws_ring_get_count_free_elements(vhd-\u003ering);\n+\t\tif (!n) {\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\n+\t\tamsg.payload \u003d malloc((unsigned int)(LWS_PRE + len));\n+\t\tif (!amsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tgoto wait_unlock;\n+\t\t}\n+\t\tn \u003d lws_snprintf((char *)amsg.payload + LWS_PRE, (unsigned int)len,\n+\t\t\t \u0022%s: tid: %d, msg: %d\u0022, vhd-\u003econfig,\n+\t\t\t whoami, index++);\n+\t\tamsg.len \u003d (unsigned int)n;\n+\t\tn \u003d (int)lws_ring_insert(vhd-\u003ering, \u0026amsg, 1);\n+\t\tif (n !\u003d 1) {\n+\t\t\t__minimal_destroy_message(\u0026amsg);\n+\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n+\t\t} else\n+\t\t\t/*\n+\t\t\t * This will cause a LWS_CALLBACK_EVENT_WAIT_CANCELLED\n+\t\t\t * in the lws service thread context.\n+\t\t\t */\n+\t\t\tlws_cancel_service(vhd-\u003econtext);\n+\n+wait_unlock:\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\n+wait:\n+\t\tusleep(100000);\n+\n+\t} while (!vhd-\u003efinished);\n+\n+\tlwsl_notice(\u0022thread_spam %d exiting\u005cn\u0022, whoami);\n+\n+\tpthread_exit(NULL);\n+\n+\treturn NULL;\n+}\n+\n+/* this runs under the lws service thread context only */\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tconst struct lws_protocol_vhost_options *pvo;\n+\tconst struct msg *pmsg;\n+\tvoid *retval;\n+\tint n, m, r \u003d 0;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\t/* create our per-vhost struct */\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tif (!vhd)\n+\t\t\treturn 1;\n+\n+\t\tpthread_mutex_init(\u0026vhd-\u003elock_ring, NULL);\n+\n+\t\t/* recover the pointer to the globals struct */\n+\t\tpvo \u003d lws_pvo_search(\n+\t\t\t(const struct lws_protocol_vhost_options *)in,\n+\t\t\t\u0022config\u0022);\n+\t\tif (!pvo || !pvo-\u003evalue) {\n+\t\t\tlwsl_err(\u0022%s: Can't find \u005c\u0022config\u005c\u0022 pvo\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\t\tvhd-\u003econfig \u003d pvo-\u003evalue;\n+\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\n+\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n+\t\t\t\t\t __minimal_destroy_message);\n+\t\tif (!vhd-\u003ering) {\n+\t\t\tlwsl_err(\u0022%s: failed to create ring\u005cn\u0022, __func__);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\t/* start the content-creating threads */\n+\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tif (pthread_create(\u0026vhd-\u003epthread_spam[n], NULL,\n+\t\t\t\t\t thread_spam, vhd)) {\n+\t\t\t\tlwsl_err(\u0022thread creation failed\u005cn\u0022);\n+\t\t\t\tr \u003d 1;\n+\t\t\t\tgoto init_fail;\n+\t\t\t}\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n+init_fail:\n+\t\tvhd-\u003efinished \u003d 1;\n+\t\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(vhd-\u003epthread_spam); n++)\n+\t\t\tif (vhd-\u003epthread_spam[n])\n+\t\t\t\tpthread_join(vhd-\u003epthread_spam[n], \u0026retval);\n+\n+\t\tif (vhd-\u003ering)\n+\t\t\tlws_ring_destroy(vhd-\u003ering);\n+\n+\t\tpthread_mutex_destroy(\u0026vhd-\u003elock_ring);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* add ourselves to the list of live pss held in the vhd */\n+\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+\t\tpss-\u003etail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\t/* remove our closing pss from the list of live pss */\n+\t\tlws_ll_fwd_remove(struct per_session_data__minimal, pss_list,\n+\t\t\t\t pss, vhd-\u003epss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tpthread_mutex_lock(\u0026vhd-\u003elock_ring); /* --------- ring lock { */\n+\n+\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail);\n+\t\tif (!pmsg) {\n+\t\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) + LWS_PRE,\n+\t\t\t pmsg-\u003elen, LWS_WRITE_TEXT);\n+\t\tif (m \u003c (int)pmsg-\u003elen) {\n+\t\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tlws_ring_consume_and_update_oldest_tail(\n+\t\t\tvhd-\u003ering,\t/* lws_ring object */\n+\t\t\tstruct per_session_data__minimal, /* type of objects with tails */\n+\t\t\t\u0026pss-\u003etail,\t/* tail of guy doing the consuming */\n+\t\t\t1,\t\t/* number of payload objects being consumed */\n+\t\t\tvhd-\u003epss_list,\t/* head of list of objects with tails */\n+\t\t\ttail,\t\t/* member name of tail in objects with tails */\n+\t\t\tpss_list\t/* member name of next object in objects with tails */\n+\t\t);\n+\n+\t\t/* more to do? */\n+\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail))\n+\t\t\t/* come back as soon as we can write more */\n+\t\t\tlws_callback_on_writable(pss-\u003ewsi);\n+\n+\t\tpthread_mutex_unlock(\u0026vhd-\u003elock_ring); /* } ring lock ------- */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_EVENT_WAIT_CANCELLED:\n+\t\tif (!vhd)\n+\t\t\tbreak;\n+\t\t/*\n+\t\t * When the \u0022spam\u0022 threads add a message to the ringbuffer,\n+\t\t * they create this event in the lws service thread context\n+\t\t * using lws_cancel_service().\n+\t\t *\n+\t\t * We respond by scheduling a writable callback for all\n+\t\t * connected clients.\n+\t\t */\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn r;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t128, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/CMakeLists.txt\nnew file mode 100644\nindex 0000000..bc95805\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-ws-server-timer C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server-timer)\n+set(SRCS minimal-ws-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/README.md\nnew file mode 100644\nindex 0000000..2f90df5\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/README.md\n@@ -0,0 +1,34 @@\n+# lws minimal ws server timer\n+\n+This is designed to confirm long term stability of ws timers on a\n+particular platform.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+-s|Serve using TLS selfsigned cert (ie, connect to it with https://...)\n+-h|Strict Host: header checking against vhost name (localhost) and port\n+-v|Connection validity use 3s / 10s instead of default 5m / 5m10s\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server-timer\n+[2018/03/04 09:30:02:7986] USER: LWS minimal ws server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681 and the browser will connect back to the test\n+server, you'll see ESTABLISHED logged. That triggers a TIMER event at 20s\n+intervals which sets the wsi timeout to 60s. It should just stay like\n+that forever doing the TIMER events at 20s intervals and not sending any\n+traffic either way.\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.cert b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.key b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/minimal-ws-server.c\nnew file mode 100644\nindex 0000000..a7f0d1a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/minimal-ws-server.c\n@@ -0,0 +1,144 @@\n+/*\n+ * lws-minimal-ws-server-timer\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws,\n+ * with an added websocket chat server.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int\n+callback_protocol(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\t void *user, void *in, size_t len)\n+{\n+\tswitch (reason) {\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_ESTABLISHED\u005cn\u0022);\n+\t\tlws_set_timer_usecs(wsi, 20 * LWS_USEC_PER_SEC);\n+\t\tlws_set_timeout(wsi, 1, 60);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_TIMER:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_TIMER\u005cn\u0022);\n+\t\tlws_set_timer_usecs(wsi, 20 * LWS_USEC_PER_SEC);\n+\t\tlws_set_timeout(wsi, 1, 60);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_CLOSED\u005cn\u0022);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0 },\n+\t{ \u0022timer\u0022, callback_protocol, 0, 0, 0, NULL, 0 },\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping \u003d 3,\n+\t.secs_since_valid_hangup \u003d 10,\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server | visit http://localhost:7681 (-s \u003d use TLS / https)\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.vhost_name \u003d \u0022localhost\u0022;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tlwsl_user(\u0022Server using TLS\u005cn\u0022);\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-h\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-v\u0022))\n+\t\tinfo.retry_and_idle_policy \u003d \u0026retry;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/example.js\nnew file mode 100644\nindex 0000000..5cc3073\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/example.js\n@@ -0,0 +1,66 @@\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022timer\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 0;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 0;\n+\t\t};\n+\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value + msg.data + \u0022\u005cn\u0022;\n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 1;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception);\n+\t}\n+\n+\tfunction sendmsg()\n+\t{\n+\t\tws.send(document.getElementById(\u0022m\u0022).value);\n+\t\tdocument.getElementById(\u0022m\u0022).value \u003d \u0022\u0022;\n+\t}\n+\n+\tdocument.getElementById(\u0022b\u0022).addEventListener(\u0022click\u0022, sendmsg);\n+\n+}, false);\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/index.html\nnew file mode 100644\nindex 0000000..5b59786\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/index.html\n@@ -0,0 +1,16 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\n+\t\tLWS wsi timer \u003cb\u003eminimal ws server timer example\u003c/b\u003e.\u003cbr\u003e\n+\t\tThis opens a ws connection back to the server and just sits there\n+\t\tsetting the timer to fire every 20s, which resets the wsi timeout\n+\t\tfor 60s each timer. It should just stay like that forever.\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server/CMakeLists.txt\nnew file mode 100644\nindex 0000000..69a6481\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/CMakeLists.txt\n@@ -0,0 +1,24 @@\n+project(lws-minimal-ws-server C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SAMP lws-minimal-ws-server)\n+set(SRCS minimal-ws-server.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_SERVER 1 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server/README.md\nnew file mode 100644\nindex 0000000..5132072\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/README.md\n@@ -0,0 +1,30 @@\n+# lws minimal ws server\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+-s|Serve using TLS selfsigned cert (ie, connect to it with https://...)\n+-h|Strict Host: header checking against vhost name (localhost) and port\n+-v|Connection validity use 3s / 10s instead of default 5m / 5m10s\n+\n+## usage\n+\n+```\n+ $ ./lws-minimal-ws-server\n+[2018/03/04 09:30:02:7986] USER: LWS minimal ws server | visit http://localhost:7681\n+[2018/03/04 09:30:02:7986] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 on\n+```\n+\n+Visit http://localhost:7681 on multiple browser windows\n+\n+Text you type in any browser window is sent to all of them.\n+\n+For simplicity of this example, only one line of text is cached at the server.\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.cert b/minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.cert\nnew file mode 100644\nindex 0000000..6f372db\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.cert\n@@ -0,0 +1,34 @@\n+-----BEGIN CERTIFICATE-----\n+MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\n+VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\n+MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\n+HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\n+WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\n+d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\n+cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\n+aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\n+aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\n+Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\n+LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\n+KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\n+jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\n+Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\n+TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\n+Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\n+nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\n+GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\n+sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\n+9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\n+jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\n+YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\n+xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\n+wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\n+H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\n+xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\n+ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\n+1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\n+AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\n+mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\n+8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\n+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\n+-----END CERTIFICATE-----\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.key b/minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.key\nnew file mode 100644\nindex 0000000..148f859\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.key\n@@ -0,0 +1,52 @@\n+-----BEGIN PRIVATE KEY-----\n+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\n+PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\n+nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\n+toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\n+0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\n+J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\n+Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\n+uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\n+fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\n+zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\n+ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\n+QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\n+qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\n+vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\n+fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\n+Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\n+G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\n+HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\n+YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\n+xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\n+esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\n+zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\n+mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\n+au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\n+40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\n+YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\n+PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\n+W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\n+naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\n+2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\n+39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\n+J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\n+R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\n+Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\n+BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\n+fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\n+x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\n+UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\n+OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\n+65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\n+aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\n+SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\n+me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\n+G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\n+TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\n+56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\n+gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\n+Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\n+NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\n+fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\n+-----END PRIVATE KEY-----\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server/minimal-ws-server.c\nnew file mode 100644\nindex 0000000..921bcff\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/minimal-ws-server.c\n@@ -0,0 +1,118 @@\n+/*\n+ * lws-minimal-ws-server\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the most minimal http server you can make with lws,\n+ * with an added websocket chat server.\n+ *\n+ * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n+ * the directory it was started in.\n+ * You can change that by changing mount.origin.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+#define LWS_PLUGIN_STATIC\n+#include \u0022protocol_lws_minimal.c\u0022\n+\n+static struct lws_protocols protocols[] \u003d {\n+\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0},\n+\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n+\tLWS_PROTOCOL_LIST_TERM\n+};\n+\n+static const lws_retry_bo_t retry \u003d {\n+\t.secs_since_valid_ping \u003d 3,\n+\t.secs_since_valid_hangup \u003d 10,\n+};\n+\n+static int interrupted;\n+\n+static const struct lws_http_mount mount \u003d {\n+\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n+\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n+\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n+\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n+\t/* .protocol */\t\t\tNULL,\n+\t/* .cgienv */\t\t\tNULL,\n+\t/* .extra_mimetypes */\t\tNULL,\n+\t/* .interpret */\t\tNULL,\n+\t/* .cgi_timeout */\t\t0,\n+\t/* .cache_max_age */\t\t0,\n+\t/* .auth_mask */\t\t0,\n+\t/* .cache_reusable */\t\t0,\n+\t/* .cache_revalidate */\t\t0,\n+\t/* .cache_intermediaries */\t0,\n+\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n+\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n+\t/* .basic_auth_login_file */\tNULL,\n+};\n+\n+void sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n+\t\t\t * lws must have been configured and built with\n+\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n+\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n+\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n+\t\t\t/* | LLL_DEBUG */;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal ws server | visit http://localhost:7681 (-s \u003d use TLS / https)\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.port \u003d 7681;\n+\tinfo.mounts \u003d \u0026mount;\n+\tinfo.protocols \u003d protocols;\n+\tinfo.vhost_name \u003d \u0022localhost\u0022;\n+\tinfo.options \u003d\n+\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n+\n+#if defined(LWS_WITH_TLS)\n+\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022)) {\n+\t\tlwsl_user(\u0022Server using TLS\u005cn\u0022);\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\t\tinfo.ssl_cert_filepath \u003d \u0022localhost-100y.cert\u0022;\n+\t\tinfo.ssl_private_key_filepath \u003d \u0022localhost-100y.key\u0022;\n+\t}\n+#endif\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-h\u0022))\n+\t\tinfo.options |\u003d LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-v\u0022))\n+\t\tinfo.retry_and_idle_policy \u003d \u0026retry;\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 0);\n+\n+\tlws_context_destroy(context);\n+\n+\treturn 0;\n+}\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/example.js\nnew file mode 100644\nindex 0000000..9c0a6ab\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/example.js\n@@ -0,0 +1,66 @@\n+\n+function get_appropriate_ws_url(extra_url)\n+{\n+\tvar pcol;\n+\tvar u \u003d document.URL;\n+\n+\t/*\n+\t * We open the websocket encrypted if this page came on an\n+\t * https:// url itself, otherwise unencrypted\n+\t */\n+\n+\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n+\t\tpcol \u003d \u0022wss://\u0022;\n+\t\tu \u003d u.substr(8);\n+\t} else {\n+\t\tpcol \u003d \u0022ws://\u0022;\n+\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n+\t\t\tu \u003d u.substr(7);\n+\t}\n+\n+\tu \u003d u.split(\u0022/\u0022);\n+\n+\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n+\n+\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n+}\n+\n+function new_ws(urlpath, protocol)\n+{\n+\treturn new WebSocket(urlpath, protocol);\n+}\n+\n+document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n+\t\n+\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal\u0022);\n+\ttry {\n+\t\tws.onopen \u003d function() {\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 0;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 0;\n+\t\t};\n+\t\n+\t\tws.onmessage \u003dfunction got_packet(msg) {\n+\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).value + msg.data + \u0022\u005cn\u0022;\n+\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n+\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n+\t\t};\n+\t\n+\t\tws.onclose \u003d function(){\n+\t\t\tdocument.getElementById(\u0022m\u0022).disabled \u003d 1;\n+\t\t\tdocument.getElementById(\u0022b\u0022).disabled \u003d 1;\n+\t\t};\n+\t} catch(exception) {\n+\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n+\t}\n+\t\n+\tfunction sendmsg()\n+\t{\n+\t\tws.send(document.getElementById(\u0022m\u0022).value);\n+\t\tdocument.getElementById(\u0022m\u0022).value \u003d \u0022\u0022;\n+\t}\n+\t\n+\tdocument.getElementById(\u0022b\u0022).addEventListener(\u0022click\u0022, sendmsg);\n+\t\n+}, false);\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/favicon.ico\nnew file mode 100644\nindex 0000000..c0cc2e3\nBinary files /dev/null and b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/favicon.ico differ\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/index.html\nnew file mode 100644\nindex 0000000..9c1dc9a\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/index.html\n@@ -0,0 +1,19 @@\n+\u003chtml\u003e\n+ \u003chead\u003e\n+ \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n+ \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n+ \u003c/head\u003e\n+\t\u003cbody\u003e\n+\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n+\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n+\t\n+\t\tLWS chat \u003cb\u003eminimal ws server example\u003c/b\u003e.\u003cbr\u003e\n+\t\tChat is sent to all browsers open on this page.\n+\t\t\u003cbr\u003e\n+\t\t\u003cbr\u003e\n+\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d10\u003e\u003c/textarea\u003e\u003cbr\u003e\n+\t\t\u003cinput type\u003d\u0022text\u0022 id\u003dm cols\u003d40 rows\u003d1\u003e\n+\t\t\u003cbutton id\u003db\u003eSend\u003c/button\u003e\n+\t\u003c/body\u003e\n+\u003c/html\u003e\n+\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/libwebsockets.org-logo.svg\nnew file mode 100644\nindex 0000000..ef241b3\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/libwebsockets.org-logo.svg\n@@ -0,0 +1,66 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n+\u003cmetadata\u003e\n+\u003crdf:RDF\u003e\n+\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n+\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n+\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n+\u003cdc:title/\u003e\n+\u003c/cc:Work\u003e\n+\u003c/rdf:RDF\u003e\n+\u003c/metadata\u003e\n+\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n+\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n+\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n+\u003c/g\u003e\n+\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n+\u003c/g\u003e\n+\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n+\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n+\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n+\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n+\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n+\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n+\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n+\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n+\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n+\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n+\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n+\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n+\u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/strict-csp.svg\nnew file mode 100644\nindex 0000000..cd128f1\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/strict-csp.svg\n@@ -0,0 +1,53 @@\n+\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n+\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n+ \u003cdefs\u003e\n+ \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n+ \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n+ \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n+ \u003c/linearGradient\u003e\n+ \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n+ \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n+ \u003c/filter\u003e\n+ \u003c/defs\u003e\n+ \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n+ \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n+ \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n+ \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg fill\u003d\u0022#fff\u0022\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n+ \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n+ \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n+ \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\ndiff --git a/minimal-examples-lowlevel/ws-server/minimal-ws-server/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server/protocol_lws_minimal.c\nnew file mode 100644\nindex 0000000..6e0ed94\n--- /dev/null\n+++ b/minimal-examples-lowlevel/ws-server/minimal-ws-server/protocol_lws_minimal.c\n@@ -0,0 +1,154 @@\n+/*\n+ * ws protocol handler plugin for \u0022lws-minimal\u0022\n+ *\n+ * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This version holds a single message at a time, which may be lost if a new\n+ * message comes. See the minimal-ws-server-ring sample for the same thing\n+ * but using an lws_ring ringbuffer to hold up to 8 messages at a time.\n+ */\n+\n+#if !defined (LWS_PLUGIN_STATIC)\n+#define LWS_DLL\n+#define LWS_INTERNAL\n+#include \u003clibwebsockets.h\u003e\n+#endif\n+\n+#include \u003cstring.h\u003e\n+\n+/* one of these created for each message */\n+\n+struct msg {\n+\tvoid *payload; /* is malloc'd */\n+\tsize_t len;\n+};\n+\n+/* one of these is created for each client connecting to us */\n+\n+struct per_session_data__minimal {\n+\tstruct per_session_data__minimal *pss_list;\n+\tstruct lws *wsi;\n+\tint last; /* the last message number we sent */\n+};\n+\n+/* one of these is created for each vhost our protocol is used with */\n+\n+struct per_vhost_data__minimal {\n+\tstruct lws_context *context;\n+\tstruct lws_vhost *vhost;\n+\tconst struct lws_protocols *protocol;\n+\n+\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n+\n+\tstruct msg amsg; /* the one pending message... */\n+\tint current; /* the current message number we are caching */\n+};\n+\n+/* destroys the message when everyone has had a copy of it */\n+\n+static void\n+__minimal_destroy_message(void *_msg)\n+{\n+\tstruct msg *msg \u003d _msg;\n+\n+\tfree(msg-\u003epayload);\n+\tmsg-\u003epayload \u003d NULL;\n+\tmsg-\u003elen \u003d 0;\n+}\n+\n+static int\n+callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n+\t\t\tvoid *user, void *in, size_t len)\n+{\n+\tstruct per_session_data__minimal *pss \u003d\n+\t\t\t(struct per_session_data__minimal *)user;\n+\tstruct per_vhost_data__minimal *vhd \u003d\n+\t\t\t(struct per_vhost_data__minimal *)\n+\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n+\t\t\t\t\tlws_get_protocol(wsi));\n+\tint m;\n+\n+\tswitch (reason) {\n+\tcase LWS_CALLBACK_PROTOCOL_INIT:\n+\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n+\t\t\t\tlws_get_protocol(wsi),\n+\t\t\t\tsizeof(struct per_vhost_data__minimal));\n+\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n+\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n+\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_ESTABLISHED:\n+\t\t/* add ourselves to the list of live pss held in the vhd */\n+\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n+\t\tpss-\u003ewsi \u003d wsi;\n+\t\tpss-\u003elast \u003d vhd-\u003ecurrent;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED:\n+\t\t/* remove our closing pss from the list of live pss */\n+\t\tlws_ll_fwd_remove(struct per_session_data__minimal, pss_list,\n+\t\t\t\t pss, vhd-\u003epss_list);\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n+\t\tif (!vhd-\u003eamsg.payload)\n+\t\t\tbreak;\n+\n+\t\tif (pss-\u003elast \u003d\u003d vhd-\u003ecurrent)\n+\t\t\tbreak;\n+\n+\t\t/* notice we allowed for LWS_PRE in the payload already */\n+\t\tm \u003d lws_write(wsi, ((unsigned char *)vhd-\u003eamsg.payload) +\n+\t\t\t LWS_PRE, vhd-\u003eamsg.len, LWS_WRITE_TEXT);\n+\t\tif (m \u003c (int)vhd-\u003eamsg.len) {\n+\t\t\tlwsl_err(\u0022ERROR %d writing to ws\u005cn\u0022, m);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tpss-\u003elast \u003d vhd-\u003ecurrent;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_RECEIVE:\n+\t\tif (vhd-\u003eamsg.payload)\n+\t\t\t__minimal_destroy_message(\u0026vhd-\u003eamsg);\n+\n+\t\tvhd-\u003eamsg.len \u003d len;\n+\t\t/* notice we over-allocate by LWS_PRE */\n+\t\tvhd-\u003eamsg.payload \u003d malloc(LWS_PRE + len);\n+\t\tif (!vhd-\u003eamsg.payload) {\n+\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmemcpy((char *)vhd-\u003eamsg.payload + LWS_PRE, in, len);\n+\t\tvhd-\u003ecurrent++;\n+\n+\t\t/*\n+\t\t * let everybody know we want to write something on them\n+\t\t * as soon as they are ready\n+\t\t */\n+\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n+\t\t\t\t ppss, vhd-\u003epss_list) {\n+\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n+\t\t} lws_end_foreach_llp(ppss, pss_list);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n+\t{ \u005c\n+\t\t\u0022lws-minimal\u0022, \u005c\n+\t\tcallback_minimal, \u005c\n+\t\tsizeof(struct per_session_data__minimal), \u005c\n+\t\t128, \u005c\n+\t\t0, NULL, 0 \u005c\n+\t}\ndiff --git a/minimal-examples/CMakeLists.txt b/minimal-examples/CMakeLists.txt\nindex 8591c2e..2fab2af 100644\n--- a/minimal-examples/CMakeLists.txt\n+++ b/minimal-examples/CMakeLists.txt\n@@ -1,7 +1,7 @@\n #\n # libwebsockets - small server side websockets and web server implementation\n #\n-# Copyright (C) 2010 - 2020 Andy Green \u003candy@warmcat.com\u003e\n+# Copyright (C) 2010 - 2021 Andy Green \u003candy@warmcat.com\u003e\n #\n # Permission is hereby granted, free of charge, to any person obtaining a copy\n # of this software and associated documentation files (the \u0022Software\u0022), to\n@@ -38,6 +38,7 @@ include_directories(${LWS_LIB_BUILD_INC_PATHS})\n link_libraries(${LIB_LIST_AT_END})\n \n SUBDIRLIST(SUBDIRS \u0022${PROJECT_SOURCE_DIR}/minimal-examples\u0022)\n+\n FOREACH(subdir ${SUBDIRS})\n \n \tSUBDIRLIST(SUBDIRS2 \u0022${PROJECT_SOURCE_DIR}/minimal-examples/${subdir}\u0022)\ndiff --git a/minimal-examples/README.md b/minimal-examples/README.md\nindex 956256d..7372572 100644\n--- a/minimal-examples/README.md\n+++ b/minimal-examples/README.md\n@@ -1,89 +1,9 @@\n-|name|demonstrates|\n----|---\n-client-server|Minimal examples providing client and server connections simultaneously\n-crypto|Minimal examples related to using lws crypto apis\n-dbus-server|Minimal examples showing how to integrate DBUS into lws event loop\n-http-client|Minimal examples providing an http client\n-http-server|Minimal examples providing an http server\n-raw|Minimal examples related to adopting raw file or socket descriptors into the event loop\n-secure-streams|Minimal examples related to the Secure Streams client api\n-ws-client|Minimal examples providing a ws client\n-ws-server|Minimal examples providing a ws server (and an http server)\n+# minimal-examples\n \n-## FAQ\n+These are examples using the high-level Secure Streams features of lws.\n \n-### Getting started\n-\n-Build and install lws itself first (note that after installing lws on \u005c*nix, you need to run `ldconfig` one time so the OS can learn about the new library. Lws installs in `/usr/local` by default, Debian / Ubuntu ldconfig knows to look there already, but Fedora / CentOS need you to add the line `/usr/local/lib` to `/etc/ld.so.conf` and run ldconfig)\n-\n-Then start with the simplest:\n-\n-`http-server/minimal-http-server`\n-\n-### Why are most of the sources split into a main C file file and a protocol file?\n-\n-Lws supports three ways to implement the protocol callback code:\n-\n- - you can just add it all in the same source file\n-\n- - you can separate it as these examples do, and #include it\n- into the main sources\n-\n- - you can build it as a standalone plugin that is discovered\n- and loaded at runtime.\n-\n-The way these examples are structured, you can easily also build\n-the protocol callback as a plugin just with a different\n-CMakeLists.txt... see https://github.com/warmcat/libwebsockets/tree/master/plugin-standalone\n-for an example.\n-\n-### Why would we want the protocol as a plugin?\n-\n-You will notice a lot of the main C code is the same boilerplate\n-repeated for each example. The actual interesting part is in\n-the protocol callback only.\n-\n-Lws provides (-DLWS_WITH_LWSWS\u003d1) a generic lightweight server app called 'lwsws' that\n-can be configured by JSON. Combined with your protocol as a plugin,\n-it means you don't actually have to make a special server \u0022app\u0022\n-part, you can just use lwsws and pass per-vhost configuration\n-from JSON into your protocol. (Of course in some cases you have\n-an existing app you are bolting lws on to, then you don't care\n-about this for that particular case).\n-\n-Because lwsws has no dependency on whatever your plugin does, it\n-can mix and match different protocols randomly without needing any code\n-changes. It reduces the size of the task to just writing the\n-code you care about in your protocol handler, and nothing else to write\n-or maintain.\n-\n-Lwsws supports advanced features like reload, where it starts a new server\n-instance with changed config or different plugins, while keeping the old\n-instance around until the last connection to it closes.\n-\n-### I get why there is a pss, but why is there a vhd?\n-\n-The pss is instantiated per-connection. But there are almost always\n-other variables that have a lifetime longer than a single connection.\n-\n-You could make these variables \u0022filescope\u0022 one-time globals, but that\n-means your protocol cannot instantiate multiple times.\n-\n-Lws supports vhosts (virtual hosts), for example both https://warmcat.com\n-and https://libwebsockets are running on the same lwsws instance on the\n-same server and same IP... each of these is a separate vhost.\n-\n-Your protocol may be enabled on multiple vhosts, each of these vhosts\n-provides a different vhd specific to the protocol instance on that\n-vhost. For example many of the samples keep a linked-list head to\n-a list of live pss in the vhd... that means it's cleanly a list of\n-pss opened **on that vhost**. If another vhost has the protocol\n-enabled, connections to that will point to a different vhd, and the\n-linked-list head on that vhd will only list connections to his vhost.\n-\n-The example \u0022ws-server/minimal-ws-server-threads\u0022 demonstrates how to deliver\n-external configuration data to a specific vhost + protocol\n-combination using code. In lwsws, this is simply a matter of setting\n-the desired JSON config.\n+There are lower-level examples in `./minimal-examples-lowlevel` that\n+cover more usecases. However the capability of Secure Streams is\n+continuing to cover more cases and it is quite a bit simpler to use.\n \n \ndiff --git a/minimal-examples/abstract/protocols/smtp-client/CMakeLists.txt b/minimal-examples/abstract/protocols/smtp-client/CMakeLists.txt\ndeleted file mode 100644\nindex 5264313..0000000\n--- a/minimal-examples/abstract/protocols/smtp-client/CMakeLists.txt\n+++ /dev/null\n@@ -1,23 +0,0 @@\n-project(lws-api-test-smtp_client C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-smtp_client)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_SMTP 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/abstract/protocols/smtp-client/README.md b/minimal-examples/abstract/protocols/smtp-client/README.md\ndeleted file mode 100644\nindex a3b3d01..0000000\n--- a/minimal-examples/abstract/protocols/smtp-client/README.md\n+++ /dev/null\n@@ -1,29 +0,0 @@\n-# lws api test smtp client\n-\n-Demonstrates how to send email through your local MTA\n-\n-## build\n-\n-Requires lws was built with `-DLWS_WITH_SMTP\u003d1` at cmake.\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--r \u003crecipient@whatever.com\u003e|Send the test email to this email address\n-\n-\n-```\n- $ ./lws-api-test-smtp_client -r andy@warmcat.com\n-[2019/04/17 05:12:06:5293] USER: LWS API selftest: SMTP client\n-[2019/04/17 05:12:06:5635] NOTICE: LGSSMTP_IDLE: connecting to 127.0.0.1:25\n-[2019/04/17 05:12:06:6238] NOTICE: email_sent_or_failed: sent OK\n-[2019/04/17 05:12:06:6394] USER: Completed: PASS\n-\n-```\n-\ndiff --git a/minimal-examples/abstract/protocols/smtp-client/main.c b/minimal-examples/abstract/protocols/smtp-client/main.c\ndeleted file mode 100644\nindex d21c4ea..0000000\n--- a/minimal-examples/abstract/protocols/smtp-client/main.c\n+++ /dev/null\n@@ -1,126 +0,0 @@\n-/*\n- * lws-api-test-smtp_client\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, result \u003d 1;\n-static const char *recip;\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-static int\n-done_cb(struct lws_smtp_email *email, void *buf, size_t len)\n-{\n-\t/* you could examine email-\u003edata here */\n-\tif (buf) {\n-\t\tchar dotstar[96];\n-\t\tlws_strnncpy(dotstar, (const char *)buf, len, sizeof(dotstar));\n-\t\tlwsl_notice(\u0022%s: %s\u005cn\u0022, __func__, dotstar);\n-\t} else\n-\t\tlwsl_notice(\u0022%s:\u005cn\u0022, __func__);\n-\n-\t/* destroy any allocations in email */\n-\n-\tfree((char *)email-\u003epayload);\n-\n-\tresult \u003d 0;\n-\tinterrupted \u003d 1;\n-\n-\treturn 0;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_context_creation_info info;\n-\tlws_smtp_sequencer_args_t ss_args;\n-\tstruct lws_context *context;\n-\tlws_smtp_sequencer_t *sseq;\n-\tlws_smtp_email_t *email;\n-\tstruct lws_vhost *vh;\n-\tchar payload[2048];\n-\tconst char *p;\n-\n-\t/* the normal lws init */\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tp \u003d lws_cmdline_option(argc, argv, \u0022-r\u0022);\n-\tif (!p) {\n-\t\tlwsl_err(\u0022-r \u003crecipient email\u003e is required\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\trecip \u003d p;\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: SMTP client\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tvh \u003d lws_create_vhost(context, \u0026info);\n-\tif (!vh) {\n-\t\tlwsl_err(\u0022Failed to create first vhost\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\tmemset(\u0026ss_args, 0, sizeof(ss_args));\n-\tss_args.helo \u003d \u0022lws-abs-smtp-test\u0022;\n-\tss_args.vhost \u003d vh;\n-\n-\tsseq \u003d lws_smtp_sequencer_create(\u0026ss_args);\n-\tif (!sseq) {\n-\t\tlwsl_err(\u0022%s: smtp sequencer create failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* attach an email to it */\n-\n-\tn \u003d lws_snprintf(payload, sizeof(payload),\n-\t\t\t\u0022From: noreply@example.com\u005cn\u0022\n-\t\t\t\u0022To: %s\u005cn\u0022\n-\t\t\t\u0022Subject: Test email for lws smtp-client\u005cn\u0022\n-\t\t\t\u0022\u005cn\u0022\n-\t\t\t\u0022Hello this was an api test for lws smtp-client\u005cn\u0022\n-\t\t\t\u0022\u005cr\u005cn.\u005cr\u005cn\u0022, recip);\n-\n-\tif (lws_smtpc_add_email(sseq, payload, n, \u0022testserver\u0022,\n-\t\t\t\t\u0022andy@warmcat.com\u0022, recip, NULL, done_cb)) {\n-\t\tlwsl_err(\u0022%s: failed to add email\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* the usual lws event loop */\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-bail1:\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, result ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/api-tests/README.md b/minimal-examples/api-tests/README.md\ndeleted file mode 100644\nindex a28df4f..0000000\n--- a/minimal-examples/api-tests/README.md\n+++ /dev/null\n@@ -1,12 +0,0 @@\n-These are buildable test apps that run in CI to confirm correct api operation.\n-\n-|name|tests|\n----|---\n-api-test-lwsac|LWS Allocated Chunks api\n-api-test-lws_struct-json|Selftests for lws_struct JSON serialization and deserialization\n-api-test-lws_tokenize|Generic secure string tokenizer api\n-api-test-fts|LWS Full-text Search api\n-api-test-gencrypto|LWS Generic Crypto apis\n-api-test-jose|LWS JOSE apis\n-api-test-smtp_client|SMTP client for sending emails\n-\ndiff --git a/minimal-examples/api-tests/api-test-async-dns/CMakeLists.txt b/minimal-examples/api-tests/api-test-async-dns/CMakeLists.txt\ndeleted file mode 100644\nindex 256726c..0000000\n--- a/minimal-examples/api-tests/api-test-async-dns/CMakeLists.txt\n+++ /dev/null\n@@ -1,30 +0,0 @@\n-project(lws-api-test-async-dns C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-async-dns)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-require_lws_config(LWS_WITH_SYS_ASYNC_DNS 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\tadd_test(NAME api-test-async-dns COMMAND lws-api-test-async-dns)\n-\tset_tests_properties(api-test-async-dns\n-\t\t\t PROPERTIES\n-\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/api-tests/api-test-async-dns\n-\t\t\t TIMEOUT 60)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-async-dns/main.c b/minimal-examples/api-tests/api-test-async-dns/main.c\ndeleted file mode 100644\nindex 4af79d3..0000000\n--- a/minimal-examples/api-tests/api-test-async-dns/main.c\n+++ /dev/null\n@@ -1,372 +0,0 @@\n-/*\n- * lws-api-test-async-dns\n- *\n- * Written in 2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This api test confirms various kinds of async dns apis\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, dtest, ok, fail, _exp \u003d 26;\n-struct lws_context *context;\n-\n-/*\n- * These are used to test the apis to parse and print ipv4 / ipv6 literal\n- * address strings for various cases.\n- *\n- * Expected error cases are not used to test the ip data -\u003e string api.\n- */\n-\n-static const struct ipparser_tests {\n-\tconst char\t*test;\n-\tint\t\trlen;\n-\tconst char\t*emit_test;\n-\tint\t\temit_len;\n-\tuint8_t\t\tb[16];\n-} ipt[] \u003d {\n-\t{ \u00222001:db8:85a3:0:0:8a2e:370:7334\u0022, 16,\n-\t \u00222001:db8:85a3::8a2e:370:7334\u0022, 28,\n-\t\t{ 0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00,\n-\t\t 0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34 } },\n-\n-\t{ \u00222001:db8:85a3::8a2e:370:7334\u0022, 16,\n-\t \u00222001:db8:85a3::8a2e:370:7334\u0022, 28,\n-\t\t{ 0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00,\n-\t\t 0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34 } },\n-\n-\t{ \u0022::1\u0022, 16, \u0022::1\u0022, 3,\n-\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n-\n-\t{ \u0022::\u0022, 16, \u0022::\u0022, 2,\n-\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },\n-\n-\t{ \u0022::ffff:192.0.2.128\u0022, 16, \u0022::ffff:192.0.2.128\u0022, 18,\n-\t\t{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n-\t\t 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x02, 0x80 } },\n-\n-\t{ \u0022cats\u0022, -1, \u0022\u0022, 0,\n-\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n-\n-\t{ \u0022onevalid.bogus.warmcat.com\u0022, -1, \u0022\u0022, 0,\n-\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n-\n-\t{ \u00221.cat.dog.com\u0022, -1, \u0022\u0022, 0,\n-\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n-\n-\t{ \u0022:::1\u0022, -8, \u0022\u0022, 0,\n-\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n-\n-\t{ \u00220:0::0:1\u0022, 16, \u0022::1\u0022, 3,\n-\t\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },\n-\n-\t{ \u00221.2.3.4\u0022, 4, \u00221.2.3.4\u0022, 7, { 1, 2, 3, 4 } },\n-};\n-\n-static const struct async_dns_tests {\n-\tconst char *dns_name;\n-\tint recordtype;\n-\tint addrlen;\n-\tuint8_t ads[16];\n-} adt[] \u003d {\n-\t{ \u0022warmcat.com\u0022, LWS_ADNS_RECORD_A, 4,\n-\t\t{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n-\t{ \u0022libwebsockets.org\u0022, LWS_ADNS_RECORD_A, 4,\n-\t\t{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n-\t{ \u0022doesntexist\u0022, LWS_ADNS_RECORD_A, 0,\n-\t\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n-\t{ \u0022localhost\u0022, LWS_ADNS_RECORD_A, 4,\n-\t\t{ 127, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n-\t{ \u0022ipv4only.warmcat.com\u0022, LWS_ADNS_RECORD_A, 4,\n-\t\t{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n-\t{ \u0022onevalid.bogus.warmcat.com\u0022, LWS_ADNS_RECORD_A, 4,\n-\t\t{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },\n-#if defined(LWS_WITH_IPV6)\n-\t{ \u0022warmcat.com\u0022, LWS_ADNS_RECORD_AAAA, 16, /* check ipv6 */\n-\t\t{ 0x20, 0x01, 0x41, 0xd0, 0x00, 0x02, 0xee, 0x93,\n-\t\t\t\t0, 0, 0, 0, 0, 0, 0, 1, } },\n-\t{ \u0022ipv6only.warmcat.com\u0022, LWS_ADNS_RECORD_AAAA, 16, /* check ipv6 */\n-\t\t{ 0x20, 0x01, 0x41, 0xd0, 0x00, 0x02, 0xee, 0x93,\n-\t\t\t\t0, 0, 0, 0, 0, 0, 0, 1, } },\n-#endif\n-};\n-\n-static lws_sorted_usec_list_t sul;\n-\n-struct lws *\n-cb1(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,\n- void *opaque);\n-\n-static void\n-next_test_cb(lws_sorted_usec_list_t *sul)\n-{\n-\tint m;\n-\n-\tlwsl_notice(\u0022%s: querying %s\u005cn\u0022, __func__, adt[dtest].dns_name);\n-\n-\tm \u003d lws_async_dns_query(context, 0,\n-\t\t\t\tadt[dtest].dns_name,\n-\t\t\t\t(adns_query_type_t)adt[dtest].recordtype, cb1, NULL,\n-\t\t\t\tcontext);\n-\tif (m !\u003d LADNS_RET_CONTINUING \u0026\u0026 m !\u003d LADNS_RET_FOUND \u0026\u0026 m !\u003d LADNS_RET_FAILED_WSI_CLOSED) {\n-\t\tlwsl_err(\u0022%s: adns 1: %s failed: %d\u005cn\u0022, __func__, adt[dtest].dns_name, m);\n-\t\tinterrupted \u003d 1;\n-\t}\n-}\n-\n-struct lws *\n-cb1(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,\n- void *opaque)\n-{\n-\tconst struct addrinfo *ac \u003d a;\n-\tint ctr \u003d 0, alen;\n-\tuint8_t *addr;\n-\tchar buf[64];\n-\n-\tdtest++;\n-\n-\tif (!ac)\n-\t\tlwsl_warn(\u0022%s: no results\u005cn\u0022, __func__);\n-\n-\t/* dump the results */\n-\n-\twhile (ac) {\n-\t\tif (ac-\u003eai_family \u003d\u003d AF_INET) {\n-\t\t\taddr \u003d (uint8_t *)\u0026(((struct sockaddr_in *)\n-\t\t\t\t\tac-\u003eai_addr)-\u003esin_addr.s_addr);\n-\t\t\talen \u003d 4;\n-\t\t} else {\n-\t\t\taddr \u003d (uint8_t *)\u0026(((struct sockaddr_in6 *)\n-\t\t\t\t\tac-\u003eai_addr)-\u003esin6_addr.s6_addr);\n-\t\t\talen \u003d 16;\n-\t\t}\n-\t\tstrcpy(buf, \u0022unknown\u0022);\n-\t\tlws_write_numeric_address(addr, alen, buf, sizeof(buf));\n-\n-\t\tlwsl_warn(\u0022%s: %d: %s %d %s\u005cn\u0022, __func__, ctr++, ads, alen, buf);\n-\n-\t\tac \u003d ac-\u003eai_next;\n-\t}\n-\n-\tac \u003d a;\n-\twhile (ac) {\n-\t\tif (ac-\u003eai_family \u003d\u003d AF_INET) {\n-\t\t\taddr \u003d (uint8_t *)\u0026(((struct sockaddr_in *)\n-\t\t\t\t\tac-\u003eai_addr)-\u003esin_addr.s_addr);\n-\t\t\talen \u003d 4;\n-\t\t} else {\n-#if defined(LWS_WITH_IPV6)\n-\t\t\taddr \u003d (uint8_t *)\u0026(((struct sockaddr_in6 *)\n-\t\t\t\t\tac-\u003eai_addr)-\u003esin6_addr.s6_addr);\n-\t\t\talen \u003d 16;\n-#else\n-\t\t\tgoto again;\n-#endif\n-\t\t}\n-\t\tif (alen \u003d\u003d adt[dtest - 1].addrlen \u0026\u0026\n-\t\t !memcmp(adt[dtest - 1].ads, addr, (unsigned int)alen)) {\n-\t\t\tok++;\n-\t\t\tgoto next;\n-\t\t}\n-#if !defined(LWS_WITH_IPV6)\n-again:\n-#endif\n-\t\tac \u003d ac-\u003eai_next;\n-\t}\n-\n-\t/* testing for NXDOMAIN? */\n-\n-\tif (!a \u0026\u0026 !adt[dtest - 1].addrlen) {\n-\t\tok++;\n-\t\tgoto next;\n-\t}\n-\n-\tlwsl_err(\u0022%s: dns test %d: no match\u005cn\u0022, __func__, dtest);\n-\tfail++;\n-\n-next:\n-\tlws_async_dns_freeaddrinfo(\u0026a);\n-\tif (dtest \u003d\u003d (int)LWS_ARRAY_SIZE(adt))\n-\t\tinterrupted \u003d 1;\n-\telse\n-\t\tlws_sul_schedule(context, 0, \u0026sul, next_test_cb, 1);\n-\n-\treturn NULL;\n-}\n-\n-static lws_sorted_usec_list_t sul_l;\n-\n-struct lws *\n-cb_loop(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,\n-\t\tvoid *opaque)\n-{\n-\tif (!a) {\n-\t\tlwsl_err(\u0022%s: no results\u005cn\u0022, __func__);\n-\t\treturn NULL;\n-\t}\n-\n-\tlwsl_notice(\u0022%s: addrinfo %p\u005cn\u0022, __func__, a);\u005c\n-\tlws_async_dns_freeaddrinfo(\u0026a);\n-\n-\treturn NULL;\n-}\n-\n-\n-static void\n-sul_retry_l(struct lws_sorted_usec_list *sul)\n-{\n-\tint m;\n-\n-\tlwsl_user(\u0022%s: starting new query\u005cn\u0022, __func__);\n-\n-\tm \u003d lws_async_dns_query(context, 0, \u0022warmcat.com\u0022,\n-\t\t\t\t (adns_query_type_t)LWS_ADNS_RECORD_A,\n-\t\t\t\t cb_loop, NULL, context);\n-\tswitch (m) {\n-\tcase LADNS_RET_FAILED_WSI_CLOSED:\n-\t\tlwsl_warn(\u0022%s: LADNS_RET_FAILED_WSI_CLOSED \u0022\n-\t\t\t \u0022(\u003d\u003d from cache / success in this test)\u005cn\u0022, __func__);\n-\t\tbreak;\n-\tcase LADNS_RET_NXDOMAIN:\n-\t\tlwsl_warn(\u0022%s: LADNS_RET_NXDOMAIN\u005cn\u0022, __func__);\n-\t\tbreak;\n-\tcase LADNS_RET_TIMEDOUT:\n-\t\tlwsl_warn(\u0022%s: LADNS_RET_TIMEDOUT\u005cn\u0022, __func__);\n-\t\tbreak;\n-\tcase LADNS_RET_FAILED:\n-\t\tlwsl_warn(\u0022%s: LADNS_RET_FAILED\u005cn\u0022, __func__);\n-\t\tbreak;\n-\tcase LADNS_RET_FOUND:\n-\t\tlwsl_warn(\u0022%s: LADNS_RET_FOUND\u005cn\u0022, __func__);\n-\t\tbreak;\n-\tcase LADNS_RET_CONTINUING:\n-\t\tlwsl_warn(\u0022%s: LADNS_RET_CONTINUING\u005cn\u0022, __func__);\n-\t\tbreak;\n-\t}\n-\n-\tlws_sul_schedule(context, 0, \u0026sul_l, sul_retry_l, 5 * LWS_US_PER_SEC);\n-}\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int\n-main(int argc, const char **argv)\n-{\n-\tint n \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_context_creation_info info;\n-\tconst char *p;\n-\n-\t/* the normal lws init */\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: Async DNS\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n-\t\tlws_sul_schedule(context, 0, \u0026sul_l, sul_retry_l, LWS_US_PER_SEC);\n-\t\tgoto evloop;\n-\t}\n-\n-\n-\t/* ip address parser tests */\n-\n-\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(ipt); n++) {\n-\t\tuint8_t u[16];\n-\t\tint m \u003d lws_parse_numeric_address(ipt[n].test, u, sizeof(u));\n-\n-\t\tif (m !\u003d ipt[n].rlen) {\n-\t\t\tlwsl_err(\u0022%s: fail %s ret %d\u005cn\u0022,\n-\t\t\t\t\t__func__, ipt[n].test, m);\n-\t\t\tfail++;\n-\t\t\tcontinue;\n-\t\t}\n-\n-\t\tif (m \u003e 0) {\n-\t\t\tif (memcmp(ipt[n].b, u, (unsigned int)m)) {\n-\t\t\t\tlwsl_err(\u0022%s: fail %s compare\u005cn\u0022, __func__,\n-\t\t\t\t\t\tipt[n].test);\n-\t\t\t\tlwsl_hexdump_notice(u, (unsigned int)m);\n-\t\t\t\tfail++;\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t}\n-\t\tok++;\n-\t}\n-\n-\t/* ip address formatter tests */\n-\n-\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(ipt); n++) {\n-\t\tchar buf[64];\n-\t\tint m;\n-\n-\t\t/* don't attempt to reverse the ones that are meant to fail */\n-\t\tif (ipt[n].rlen \u003c 0)\n-\t\t\tcontinue;\n-\n-\t\tm \u003d lws_write_numeric_address(ipt[n].b, ipt[n].rlen, buf,\n-\t\t\t\t\t\tsizeof(buf));\n-\t\tif (m !\u003d ipt[n].emit_len) {\n-\t\t\tlwsl_err(\u0022%s: fail %s ret %d\u005cn\u0022,\n-\t\t\t\t\t__func__, ipt[n].emit_test, m);\n-\t\t\tfail++;\n-\t\t\tcontinue;\n-\t\t}\n-\n-\t\tif (m \u003e 0) {\n-\t\t\tif (strcmp(ipt[n].emit_test, buf)) {\n-\t\t\t\tlwsl_err(\u0022%s: fail %s compare\u005cn\u0022, __func__,\n-\t\t\t\t\t\tipt[n].test);\n-\t\t\t\tlwsl_hexdump_notice(buf, (unsigned int)m);\n-\t\t\t\tfail++;\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t}\n-\t\tok++;\n-\t}\n-\n-#if !defined(LWS_WITH_IPV6)\n-\t_exp -\u003d 2;\n-#endif\n-\n-\t/* kick off the async dns tests */\n-\n-\tlws_sul_schedule(context, 0, \u0026sul, next_test_cb, 1);\n-\n-evloop:\n-\t/* the usual lws event loop */\n-\n-\tn \u003d 1;\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\n-\tif (fail || ok !\u003d _exp)\n-\t\tlwsl_user(\u0022Completed: PASS: %d / %d, FAIL: %d\u005cn\u0022, ok, _exp,\n-\t\t\t\tfail);\n-\telse\n-\t\tlwsl_user(\u0022Completed: ALL PASS: %d / %d\u005cn\u0022, ok, _exp);\n-\n-\treturn !(ok \u003d\u003d _exp \u0026\u0026 !fail);\n-}\ndiff --git a/minimal-examples/api-tests/api-test-cose/CMakeLists.txt b/minimal-examples/api-tests/api-test-cose/CMakeLists.txt\ndeleted file mode 100644\nindex bd6b142..0000000\n--- a/minimal-examples/api-tests/api-test-cose/CMakeLists.txt\n+++ /dev/null\n@@ -1,29 +0,0 @@\n-project(lws-api-test-cose C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-cose)\n-set(SRCS main.c keys.c sign.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_COSE 1 requirements)\n-require_lws_config(LWS_WITH_CBOR 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (NOT (LWS_WITH_MBEDTLS AND NOT LWS_HAVE_mbedtls_internal_aes_encrypt))\n-\t\tadd_test(NAME api-test-cose COMMAND lws-api-test-cose)\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-cose/README.md b/minimal-examples/api-tests/api-test-cose/README.md\ndeleted file mode 100644\nindex 74034c7..0000000\n--- a/minimal-examples/api-tests/api-test-cose/README.md\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-# lws api test lwsac\n-\n-Demonstrates how to use and performs selftests for lwsac\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-lwsac\n-[2018/10/09 09:14:17:4834] USER: LWS API selftest: lwsac\n-[2018/10/09 09:14:17:4835] USER: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-cose/keys.c b/minimal-examples/api-tests/api-test-cose/keys.c\ndeleted file mode 100644\nindex 134784d..0000000\n--- a/minimal-examples/api-tests/api-test-cose/keys.c\n+++ /dev/null\n@@ -1,931 +0,0 @@\n-/*\n- * lws-api-test-jose - RFC8152 cose_key tests\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * Raw key CBOR created from descriptions at\n- *\n- * https://github.com/cose-wg/Examples/blob/master/KeySet.txt\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstdlib.h\u003e\n-#include \u003cfcntl.h\u003e\n-\n-static int\n-key_import_cb(struct lws_cose_key *s, void *user)\n-{\n-\tlwsl_notice(\u0022%s: key type %lld\u005cn\u0022, __func__, (long long)s-\u003ekty);\n-\n-\treturn 0;\n-}\n-\n-static const uint8_t\n-\tcose_key1[] \u003d {\n-\t\t\t0xa6, 0x01, 0x02, 0x02, 0x62,\n-\t\t\t0x31, 0x31, 0x20, 0x01, 0x21,\n-\t\t\t0x58, 0x20, 0xba, 0xc5, 0xb1,\n-\t\t\t0x1c, 0xad, 0x8f, 0x99, 0xf9,\n-\t\t\t0xc7, 0x2b, 0x05, 0xcf, 0x4b,\n-\t\t\t0x9e, 0x26, 0xd2, 0x44, 0xdc,\n-\t\t\t0x18, 0x9f, 0x74, 0x52, 0x28,\n-\t\t\t0x25, 0x5a, 0x21, 0x9a, 0x86,\n-\t\t\t0xd6, 0xa0, 0x9e, 0xff, 0x22,\n-\t\t\t0x58, 0x20, 0x20, 0x13, 0x8b,\n-\t\t\t0xf8, 0x2d, 0xc1, 0xb6, 0xd5,\n-\t\t\t0x62, 0xbe, 0x0f, 0xa5, 0x4a,\n-\t\t\t0xb7, 0x80, 0x4a, 0x3a, 0x64,\n-\t\t\t0xb6, 0xd7, 0x2c, 0xcf, 0xed,\n-\t\t\t0x6b, 0x6f, 0xb6, 0xed, 0x28,\n-\t\t\t0xbb, 0xfc, 0x11, 0x7e, 0x23,\n-\t\t\t0x58, 0x20, 0x57, 0xc9, 0x20,\n-\t\t\t0x77, 0x66, 0x41, 0x46, 0xe8,\n-\t\t\t0x76, 0x76, 0x0c, 0x95, 0x20,\n-\t\t\t0xd0, 0x54, 0xaa, 0x93, 0xc3,\n-\t\t\t0xaf, 0xb0, 0x4e, 0x30, 0x67,\n-\t\t\t0x05, 0xdb, 0x60, 0x90, 0x30,\n-\t\t\t0x85, 0x07, 0xb4, 0xd3 },\n-\tcose_key2[] \u003d {\n-\t\t\t0xa6, 0x01, 0x02, 0x02, 0x78,\n-\t\t\t0x24, 0x6d, 0x65, 0x72, 0x69,\n-\t\t\t0x61, 0x64, 0x6f, 0x63, 0x2e,\n-\t\t\t0x62, 0x72, 0x61, 0x6e, 0x64,\n-\t\t\t0x79, 0x62, 0x75, 0x63, 0x6b,\n-\t\t\t0x40, 0x62, 0x75, 0x63, 0x6b,\n-\t\t\t0x6c, 0x61, 0x6e, 0x64, 0x2e,\n-\t\t\t0x65, 0x78, 0x61, 0x6d, 0x70,\n-\t\t\t0x6c, 0x65, 0x20, 0x01, 0x21,\n-\t\t\t0x58, 0x20, 0x65, 0xed, 0xa5,\n-\t\t\t0xa1, 0x25, 0x77, 0xc2, 0xba,\n-\t\t\t0xe8, 0x29, 0x43, 0x7f, 0xe3,\n-\t\t\t0x38, 0x70, 0x1a, 0x10, 0xaa,\n-\t\t\t0xa3, 0x75, 0xe1, 0xbb, 0x5b,\n-\t\t\t0x5d, 0xe1, 0x08, 0xde, 0x43,\n-\t\t\t0x9c, 0x08, 0x55, 0x1d, 0x22,\n-\t\t\t0x58, 0x20, 0x1e, 0x52, 0xed,\n-\t\t\t0x75, 0x70, 0x11, 0x63, 0xf7,\n-\t\t\t0xf9, 0xe4, 0x0d, 0xdf, 0x9f,\n-\t\t\t0x34, 0x1b, 0x3d, 0xc9, 0xba,\n-\t\t\t0x86, 0x0a, 0xf7, 0xe0, 0xca,\n-\t\t\t0x7c, 0xa7, 0xe9, 0xee, 0xcd,\n-\t\t\t0x00, 0x84, 0xd1, 0x9c, 0x23,\n-\t\t\t0x58, 0x20, 0xaf, 0xf9, 0x07,\n-\t\t\t0xc9, 0x9f, 0x9a, 0xd3, 0xaa,\n-\t\t\t0xe6, 0xc4, 0xcd, 0xf2, 0x11,\n-\t\t\t0x22, 0xbc, 0xe2, 0xbd, 0x68,\n-\t\t\t0xb5, 0x28, 0x3e, 0x69, 0x07,\n-\t\t\t0x15, 0x4a, 0xd9, 0x11, 0x84,\n-\t\t\t0x0f, 0xa2, 0x08, 0xcf },\n-\n-\tcose_key3[] \u003d { 0xa3, 0x01, 0x04, 0x02, 0x6a,\n-\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n-\t\t\t0x20, 0x58, 0x20, 0x84, 0x9b,\n-\t\t\t0x57, 0x21, 0x9d, 0xae, 0x48,\n-\t\t\t0xde, 0x64, 0x6d, 0x07, 0xdb,\n-\t\t\t0xb5, 0x33, 0x56, 0x6e, 0x97,\n-\t\t\t0x66, 0x86, 0x45, 0x7c, 0x14,\n-\t\t\t0x91, 0xbe, 0x3a, 0x76, 0xdc,\n-\t\t\t0xea, 0x6c, 0x42, 0x71, 0x88 },\n-\n-\tcose_key4[] \u003d { 0xa6, 0x01, 0x02, 0x02, 0x78,\n-\t\t\t0x1e, 0x62, 0x69, 0x6c, 0x62,\n-\t\t\t0x6f, 0x2e, 0x62, 0x61, 0x67,\n-\t\t\t0x67, 0x69, 0x6e, 0x73, 0x40,\n-\t\t\t0x68, 0x6f, 0x62, 0x62, 0x69,\n-\t\t\t0x74, 0x6f, 0x6e, 0x2e, 0x65,\n-\t\t\t0x78, 0x61, 0x6d, 0x70, 0x6c,\n-\t\t\t0x65, 0x20, 0x03, 0x21, 0x58,\n-\t\t\t0x42, 0x00, 0x72, 0x99, 0x2c,\n-\t\t\t0xb3, 0xac, 0x08, 0xec, 0xf3,\n-\t\t\t0xe5, 0xc6, 0x3d, 0xed, 0xec,\n-\t\t\t0x0d, 0x51, 0xa8, 0xc1, 0xf7,\n-\t\t\t0x9e, 0xf2, 0xf8, 0x2f, 0x94,\n-\t\t\t0xf3, 0xc7, 0x37, 0xbf, 0x5d,\n-\t\t\t0xe7, 0x98, 0x66, 0x71, 0xea,\n-\t\t\t0xc6, 0x25, 0xfe, 0x82, 0x57,\n-\t\t\t0xbb, 0xd0, 0x39, 0x46, 0x44,\n-\t\t\t0xca, 0xaa, 0x3a, 0xaf, 0x8f,\n-\t\t\t0x27, 0xa4, 0x58, 0x5f, 0xbb,\n-\t\t\t0xca, 0xd0, 0xf2, 0x45, 0x76,\n-\t\t\t0x20, 0x08, 0x5e, 0x5c, 0x8f,\n-\t\t\t0x42, 0xad, 0x22, 0x58, 0x42,\n-\t\t\t0x01, 0xdc, 0xa6, 0x94, 0x7b,\n-\t\t\t0xce, 0x88, 0xbc, 0x57, 0x90,\n-\t\t\t0x48, 0x5a, 0xc9, 0x74, 0x27,\n-\t\t\t0x34, 0x2b, 0xc3, 0x5f, 0x88,\n-\t\t\t0x7d, 0x86, 0xd6, 0x5a, 0x08,\n-\t\t\t0x93, 0x77, 0xe2, 0x47, 0xe6,\n-\t\t\t0x0b, 0xaa, 0x55, 0xe4, 0xe8,\n-\t\t\t0x50, 0x1e, 0x2a, 0xda, 0x57,\n-\t\t\t0x24, 0xac, 0x51, 0xd6, 0x90,\n-\t\t\t0x90, 0x08, 0x03, 0x3e, 0xbc,\n-\t\t\t0x10, 0xac, 0x99, 0x9b, 0x9d,\n-\t\t\t0x7f, 0x5c, 0xc2, 0x51, 0x9f,\n-\t\t\t0x3f, 0xe1, 0xea, 0x1d, 0x94,\n-\t\t\t0x75, 0x23, 0x58, 0x42, 0x00,\n-\t\t\t0x08, 0x51, 0x38, 0xdd, 0xab,\n-\t\t\t0xf5, 0xca, 0x97, 0x5f, 0x58,\n-\t\t\t0x60, 0xf9, 0x1a, 0x08, 0xe9,\n-\t\t\t0x1d, 0x6d, 0x5f, 0x9a, 0x76,\n-\t\t\t0xad, 0x40, 0x18, 0x76, 0x6a,\n-\t\t\t0x47, 0x66, 0x80, 0xb5, 0x5c,\n-\t\t\t0xd3, 0x39, 0xe8, 0xab, 0x6c,\n-\t\t\t0x72, 0xb5, 0xfa, 0xcd, 0xb2,\n-\t\t\t0xa2, 0xa5, 0x0a, 0xc2, 0x5b,\n-\t\t\t0xd0, 0x86, 0x64, 0x7d, 0xd3,\n-\t\t\t0xe2, 0xe6, 0xe9, 0x9e, 0x84,\n-\t\t\t0xca, 0x2c, 0x36, 0x09, 0xfd,\n-\t\t\t0xf1, 0x77, 0xfe, 0xb2, 0x6d },\n-\tcose_key5[] \u003d { 0xa3, 0x01, 0x04, 0x02, 0x6b,\n-\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n-\t\t\t0x32, 0x20, 0x50, 0x84, 0x9b,\n-\t\t\t0x57, 0x86, 0x45, 0x7c, 0x14,\n-\t\t\t0x91, 0xbe, 0x3a, 0x76, 0xdc,\n-\t\t\t0xea, 0x6c, 0x42, 0x71 },\n-\n-\tcose_key6[] \u003d { 0xa6, 0x01, 0x02, 0x02, 0x78,\n-\t\t\t0x21, 0x70, 0x65, 0x72, 0x65,\n-\t\t\t0x67, 0x72, 0x69, 0x6e, 0x2e,\n-\t\t\t0x74, 0x6f, 0x6f, 0x6b, 0x40,\n-\t\t\t0x74, 0x75, 0x63, 0x6b, 0x62,\n-\t\t\t0x6f, 0x72, 0x6f, 0x75, 0x67,\n-\t\t\t0x68, 0x2e, 0x65, 0x78, 0x61,\n-\t\t\t0x6d, 0x70, 0x6c, 0x65, 0x20,\n-\t\t\t0x01, 0x21, 0x58, 0x20, 0x98,\n-\t\t\t0xf5, 0x0a, 0x4f, 0xf6, 0xc0,\n-\t\t\t0x58, 0x61, 0xc8, 0x86, 0x0d,\n-\t\t\t0x13, 0xa6, 0x38, 0xea, 0x56,\n-\t\t\t0xc3, 0xf5, 0xad, 0x75, 0x90,\n-\t\t\t0xbb, 0xfb, 0xf0, 0x54, 0xe1,\n-\t\t\t0xc7, 0xb4, 0xd9, 0x1d, 0x62,\n-\t\t\t0x80, 0x22, 0x58, 0x20, 0xf0,\n-\t\t\t0x14, 0x00, 0xb0, 0x89, 0x86,\n-\t\t\t0x78, 0x04, 0xb8, 0xe9, 0xfc,\n-\t\t\t0x96, 0xc3, 0x93, 0x21, 0x61,\n-\t\t\t0xf1, 0x93, 0x4f, 0x42, 0x23,\n-\t\t\t0x06, 0x91, 0x70, 0xd9, 0x24,\n-\t\t\t0xb7, 0xe0, 0x3b, 0xf8, 0x22,\n-\t\t\t0xbb, 0x23, 0x58, 0x20, 0x02,\n-\t\t\t0xd1, 0xf7, 0xe6, 0xf2, 0x6c,\n-\t\t\t0x43, 0xd4, 0x86, 0x8d, 0x87,\n-\t\t\t0xce, 0xb2, 0x35, 0x31, 0x61,\n-\t\t\t0x74, 0x0a, 0xac, 0xf1, 0xf7,\n-\t\t\t0x16, 0x36, 0x47, 0x98, 0x4b,\n-\t\t\t0x52, 0x2a, 0x84, 0x8d, 0xf1,\n-\t\t\t0xc3 },\n-\tcose_key7[] \u003d { 0xa3, 0x01, 0x04, 0x02, 0x58,\n-\t\t\t0x24, 0x30, 0x31, 0x38, 0x63,\n-\t\t\t0x30, 0x61, 0x65, 0x35, 0x2d,\n-\t\t\t0x34, 0x64, 0x39, 0x62, 0x2d,\n-\t\t\t0x34, 0x37, 0x31, 0x62, 0x2d,\n-\t\t\t0x62, 0x66, 0x64, 0x36, 0x2d,\n-\t\t\t0x65, 0x65, 0x66, 0x33, 0x31,\n-\t\t\t0x34, 0x62, 0x63, 0x37, 0x30,\n-\t\t\t0x33, 0x37, 0x20, 0x58, 0x20,\n-\t\t\t0x84, 0x9b, 0x57, 0x21, 0x9d,\n-\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n-\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n-\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n-\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n-\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n-\t\t\t0x71, 0x88 },\n-\n-\tcose_key8[] \u003d {\n-\t\t\t/* kid \u0022sec-48\u0022 for hmac 384 */\n-\n-\t\t\t0xa3, 0x01, 0x04, 0x02, 0x66,\n-\t\t\t0x73, 0x65, 0x63, 0x2d, 0x34,\n-\t\t\t0x38, 0x20, 0x58, 0x30, 0x84,\n-\t\t\t0x9b, 0x57, 0x21, 0x9d, 0xae,\n-\t\t\t0x48, 0xde, 0x64, 0x6d, 0x07,\n-\t\t\t0xdb, 0xb5, 0x33, 0x56, 0x6e,\n-\t\t\t0x97, 0x66, 0x86, 0x45, 0x7c,\n-\t\t\t0x14, 0x91, 0xbe, 0x3a, 0x76,\n-\t\t\t0xdc, 0xea, 0x6c, 0x42, 0x71,\n-\t\t\t0x88, 0x00, 0x11, 0x22, 0x33,\n-\t\t\t0x77, 0x88, 0x99, 0xaa, 0x21,\n-\t\t\t0x22, 0x23, 0x24, 0x25, 0x26,\n-\t\t\t0x27, 0x28\n-\t},\n-\n-\tcose_key9[] \u003d {\n-\t\t\t/* kid \u0022sec-64\u0022 for hmac 512 */\n-\n-\t\t\t0xa3, 0x01, 0x04, 0x02, 0x46,\n-\t\t\t0x73, 0x65, 0x63, 0x2d, 0x36,\n-\t\t\t0x34, 0x20, 0x58, 0x40, 0x84,\n-\t\t\t0x9b, 0x57, 0x21, 0x9d, 0xae,\n-\t\t\t0x48, 0xde, 0x64, 0x6d, 0x07,\n-\t\t\t0xdb, 0xb5, 0x33, 0x56, 0x6e,\n-\t\t\t0x97, 0x66, 0x86, 0x45, 0x7c,\n-\t\t\t0x14, 0x91, 0xbe, 0x3a, 0x76,\n-\t\t\t0xdc, 0xea, 0x6c, 0x42, 0x71,\n-\t\t\t0x88, 0x00, 0x11, 0x22, 0x33,\n-\t\t\t0x77, 0x88, 0x99, 0xaa, 0x21,\n-\t\t\t0x22, 0x23, 0x24, 0x25, 0x26,\n-\t\t\t0x27, 0x28, 0xaa, 0xbb, 0xcc,\n-\t\t\t0xdd, 0xee, 0xff, 0xa5, 0xa6,\n-\t\t\t0xa7, 0xa8, 0xa9, 0xa0, 0xb1,\n-\t\t\t0xb2, 0xb3, 0xb4,\n-\t},\n-\n-\tcose_key10[] \u003d { /* kid \u002211\u0022 (again) ed22519 OKP key */\n-\t\t\t0xa5, 0x01, 0x01, 0x02, 0x42,\n-\t\t\t0x31, 0x31, 0x20, 0x06, 0x21,\n-\t\t\t0x58, 0x20, 0xd7, 0x5a, 0x98,\n-\t\t\t0x01, 0x82, 0xb1, 0x0a, 0xb7,\n-\t\t\t0xd5, 0x4b, 0xfe, 0xd3, 0xc9,\n-\t\t\t0x64, 0x07, 0x3a, 0x0e, 0xe1,\n-\t\t\t0x72, 0xf3, 0xda, 0xa6, 0x23,\n-\t\t\t0x25, 0xaf, 0x02, 0x1a, 0x68,\n-\t\t\t0xf7, 0x07, 0x51, 0x1a, 0x23,\n-\t\t\t0x58, 0x20, 0x9d, 0x61, 0xb1,\n-\t\t\t0x9d, 0xef, 0xfd, 0x5a, 0x60,\n-\t\t\t0xba, 0x84, 0x4a, 0xf4, 0x92,\n-\t\t\t0xec, 0x2c, 0xc4, 0x44, 0x49,\n-\t\t\t0xc5, 0x69, 0x7b, 0x32, 0x69,\n-\t\t\t0x19, 0x70, 0x3b, 0xac, 0x03,\n-\t\t\t0x1c, 0xae, 0x7f, 0x60\n-\t},\n-\n-\tcose_key_set1[] \u003d {\n-\n-\t\t\t0x89,\n-\n-\t\t\t0xa6, 0x01, 0x02, 0x02, 0x42,\n-\t\t\t0x31, 0x31, 0x20, 0x01, 0x21,\n-\t\t\t0x58, 0x20, 0xba, 0xc5, 0xb1,\n-\t\t\t0x1c, 0xad, 0x8f, 0x99, 0xf9,\n-\t\t\t0xc7, 0x2b, 0x05, 0xcf, 0x4b,\n-\t\t\t0x9e, 0x26, 0xd2, 0x44, 0xdc,\n-\t\t\t0x18, 0x9f, 0x74, 0x52, 0x28,\n-\t\t\t0x25, 0x5a, 0x21, 0x9a, 0x86,\n-\t\t\t0xd6, 0xa0, 0x9e, 0xff, 0x22,\n-\t\t\t0x58, 0x20, 0x20, 0x13, 0x8b,\n-\t\t\t0xf8, 0x2d, 0xc1, 0xb6, 0xd5,\n-\t\t\t0x62, 0xbe, 0x0f, 0xa5, 0x4a,\n-\t\t\t0xb7, 0x80, 0x4a, 0x3a, 0x64,\n-\t\t\t0xb6, 0xd7, 0x2c, 0xcf, 0xed,\n-\t\t\t0x6b, 0x6f, 0xb6, 0xed, 0x28,\n-\t\t\t0xbb, 0xfc, 0x11, 0x7e, 0x23,\n-\t\t\t0x58, 0x20, 0x57, 0xc9, 0x20,\n-\t\t\t0x77, 0x66, 0x41, 0x46, 0xe8,\n-\t\t\t0x76, 0x76, 0x0c, 0x95, 0x20,\n-\t\t\t0xd0, 0x54, 0xaa, 0x93, 0xc3,\n-\t\t\t0xaf, 0xb0, 0x4e, 0x30, 0x67,\n-\t\t\t0x05, 0xdb, 0x60, 0x90, 0x30,\n-\t\t\t0x85, 0x07, 0xb4, 0xd3,\n-\n-\t\t\t0xa6, 0x01, 0x02, 0x02, 0x58,\n-\t\t\t0x24, 0x6d, 0x65, 0x72, 0x69,\n-\t\t\t0x61, 0x64, 0x6f, 0x63, 0x2e,\n-\t\t\t0x62, 0x72, 0x61, 0x6e, 0x64,\n-\t\t\t0x79, 0x62, 0x75, 0x63, 0x6b,\n-\t\t\t0x40, 0x62, 0x75, 0x63, 0x6b,\n-\t\t\t0x6c, 0x61, 0x6e, 0x64, 0x2e,\n-\t\t\t0x65, 0x78, 0x61, 0x6d, 0x70,\n-\t\t\t0x6c, 0x65, 0x20, 0x01, 0x21,\n-\t\t\t0x58, 0x20, 0x65, 0xed, 0xa5,\n-\t\t\t0xa1, 0x25, 0x77, 0xc2, 0xba,\n-\t\t\t0xe8, 0x29, 0x43, 0x7f, 0xe3,\n-\t\t\t0x38, 0x70, 0x1a, 0x10, 0xaa,\n-\t\t\t0xa3, 0x75, 0xe1, 0xbb, 0x5b,\n-\t\t\t0x5d, 0xe1, 0x08, 0xde, 0x43,\n-\t\t\t0x9c, 0x08, 0x55, 0x1d, 0x22,\n-\t\t\t0x58, 0x20, 0x1e, 0x52, 0xed,\n-\t\t\t0x75, 0x70, 0x11, 0x63, 0xf7,\n-\t\t\t0xf9, 0xe4, 0x0d, 0xdf, 0x9f,\n-\t\t\t0x34, 0x1b, 0x3d, 0xc9, 0xba,\n-\t\t\t0x86, 0x0a, 0xf7, 0xe0, 0xca,\n-\t\t\t0x7c, 0xa7, 0xe9, 0xee, 0xcd,\n-\t\t\t0x00, 0x84, 0xd1, 0x9c, 0x23,\n-\t\t\t0x58, 0x20, 0xaf, 0xf9, 0x07,\n-\t\t\t0xc9, 0x9f, 0x9a, 0xd3, 0xaa,\n-\t\t\t0xe6, 0xc4, 0xcd, 0xf2, 0x11,\n-\t\t\t0x22, 0xbc, 0xe2, 0xbd, 0x68,\n-\t\t\t0xb5, 0x28, 0x3e, 0x69, 0x07,\n-\t\t\t0x15, 0x4a, 0xd9, 0x11, 0x84,\n-\t\t\t0x0f, 0xa2, 0x08, 0xcf,\n-\n-\t\t\t0xa3, 0x01, 0x04, 0x02, 0x4a,\n-\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n-\t\t\t0x20, 0x58, 0x20, 0x84, 0x9b,\n-\t\t\t0x57, 0x21, 0x9d, 0xae, 0x48,\n-\t\t\t0xde, 0x64, 0x6d, 0x07, 0xdb,\n-\t\t\t0xb5, 0x33, 0x56, 0x6e, 0x97,\n-\t\t\t0x66, 0x86, 0x45, 0x7c, 0x14,\n-\t\t\t0x91, 0xbe, 0x3a, 0x76, 0xdc,\n-\t\t\t0xea, 0x6c, 0x42, 0x71, 0x88,\n-\n-\t\t\t0xa6, 0x01, 0x02, 0x02, 0x58,\n-\t\t\t0x1e, 0x62, 0x69, 0x6c, 0x62,\n-\t\t\t0x6f, 0x2e, 0x62, 0x61, 0x67,\n-\t\t\t0x67, 0x69, 0x6e, 0x73, 0x40,\n-\t\t\t0x68, 0x6f, 0x62, 0x62, 0x69,\n-\t\t\t0x74, 0x6f, 0x6e, 0x2e, 0x65,\n-\t\t\t0x78, 0x61, 0x6d, 0x70, 0x6c,\n-\t\t\t0x65, 0x20, 0x03, 0x21, 0x58,\n-\t\t\t0x42, 0x00, 0x72, 0x99, 0x2c,\n-\t\t\t0xb3, 0xac, 0x08, 0xec, 0xf3,\n-\t\t\t0xe5, 0xc6, 0x3d, 0xed, 0xec,\n-\t\t\t0x0d, 0x51, 0xa8, 0xc1, 0xf7,\n-\t\t\t0x9e, 0xf2, 0xf8, 0x2f, 0x94,\n-\t\t\t0xf3, 0xc7, 0x37, 0xbf, 0x5d,\n-\t\t\t0xe7, 0x98, 0x66, 0x71, 0xea,\n-\t\t\t0xc6, 0x25, 0xfe, 0x82, 0x57,\n-\t\t\t0xbb, 0xd0, 0x39, 0x46, 0x44,\n-\t\t\t0xca, 0xaa, 0x3a, 0xaf, 0x8f,\n-\t\t\t0x27, 0xa4, 0x58, 0x5f, 0xbb,\n-\t\t\t0xca, 0xd0, 0xf2, 0x45, 0x76,\n-\t\t\t0x20, 0x08, 0x5e, 0x5c, 0x8f,\n-\t\t\t0x42, 0xad, 0x22, 0x58, 0x42,\n-\t\t\t0x01, 0xdc, 0xa6, 0x94, 0x7b,\n-\t\t\t0xce, 0x88, 0xbc, 0x57, 0x90,\n-\t\t\t0x48, 0x5a, 0xc9, 0x74, 0x27,\n-\t\t\t0x34, 0x2b, 0xc3, 0x5f, 0x88,\n-\t\t\t0x7d, 0x86, 0xd6, 0x5a, 0x08,\n-\t\t\t0x93, 0x77, 0xe2, 0x47, 0xe6,\n-\t\t\t0x0b, 0xaa, 0x55, 0xe4, 0xe8,\n-\t\t\t0x50, 0x1e, 0x2a, 0xda, 0x57,\n-\t\t\t0x24, 0xac, 0x51, 0xd6, 0x90,\n-\t\t\t0x90, 0x08, 0x03, 0x3e, 0xbc,\n-\t\t\t0x10, 0xac, 0x99, 0x9b, 0x9d,\n-\t\t\t0x7f, 0x5c, 0xc2, 0x51, 0x9f,\n-\t\t\t0x3f, 0xe1, 0xea, 0x1d, 0x94,\n-\t\t\t0x75, 0x23, 0x58, 0x42, 0x00,\n-\t\t\t0x08, 0x51, 0x38, 0xdd, 0xab,\n-\t\t\t0xf5, 0xca, 0x97, 0x5f, 0x58,\n-\t\t\t0x60, 0xf9, 0x1a, 0x08, 0xe9,\n-\t\t\t0x1d, 0x6d, 0x5f, 0x9a, 0x76,\n-\t\t\t0xad, 0x40, 0x18, 0x76, 0x6a,\n-\t\t\t0x47, 0x66, 0x80, 0xb5, 0x5c,\n-\t\t\t0xd3, 0x39, 0xe8, 0xab, 0x6c,\n-\t\t\t0x72, 0xb5, 0xfa, 0xcd, 0xb2,\n-\t\t\t0xa2, 0xa5, 0x0a, 0xc2, 0x5b,\n-\t\t\t0xd0, 0x86, 0x64, 0x7d, 0xd3,\n-\t\t\t0xe2, 0xe6, 0xe9, 0x9e, 0x84,\n-\t\t\t0xca, 0x2c, 0x36, 0x09, 0xfd,\n-\t\t\t0xf1, 0x77, 0xfe, 0xb2, 0x6d,\n-\n-\t\t\t0xa3, 0x01, 0x04, 0x02, 0x4b,\n-\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n-\t\t\t0x32, 0x20, 0x50, 0x84, 0x9b,\n-\t\t\t0x57, 0x86, 0x45, 0x7c, 0x14,\n-\t\t\t0x91, 0xbe, 0x3a, 0x76, 0xdc,\n-\t\t\t0xea, 0x6c, 0x42, 0x71,\n-\n-\t\t\t0xa6, 0x01, 0x02, 0x02, 0x58,\n-\t\t\t0x21, 0x70, 0x65, 0x72, 0x65,\n-\t\t\t0x67, 0x72, 0x69, 0x6e, 0x2e,\n-\t\t\t0x74, 0x6f, 0x6f, 0x6b, 0x40,\n-\t\t\t0x74, 0x75, 0x63, 0x6b, 0x62,\n-\t\t\t0x6f, 0x72, 0x6f, 0x75, 0x67,\n-\t\t\t0x68, 0x2e, 0x65, 0x78, 0x61,\n-\t\t\t0x6d, 0x70, 0x6c, 0x65, 0x20,\n-\t\t\t0x01, 0x21, 0x58, 0x20, 0x98,\n-\t\t\t0xf5, 0x0a, 0x4f, 0xf6, 0xc0,\n-\t\t\t0x58, 0x61, 0xc8, 0x86, 0x0d,\n-\t\t\t0x13, 0xa6, 0x38, 0xea, 0x56,\n-\t\t\t0xc3, 0xf5, 0xad, 0x75, 0x90,\n-\t\t\t0xbb, 0xfb, 0xf0, 0x54, 0xe1,\n-\t\t\t0xc7, 0xb4, 0xd9, 0x1d, 0x62,\n-\t\t\t0x80, 0x22, 0x58, 0x20, 0xf0,\n-\t\t\t0x14, 0x00, 0xb0, 0x89, 0x86,\n-\t\t\t0x78, 0x04, 0xb8, 0xe9, 0xfc,\n-\t\t\t0x96, 0xc3, 0x93, 0x21, 0x61,\n-\t\t\t0xf1, 0x93, 0x4f, 0x42, 0x23,\n-\t\t\t0x06, 0x91, 0x70, 0xd9, 0x24,\n-\t\t\t0xb7, 0xe0, 0x3b, 0xf8, 0x22,\n-\t\t\t0xbb, 0x23, 0x58, 0x20, 0x02,\n-\t\t\t0xd1, 0xf7, 0xe6, 0xf2, 0x6c,\n-\t\t\t0x43, 0xd4, 0x86, 0x8d, 0x87,\n-\t\t\t0xce, 0xb2, 0x35, 0x31, 0x61,\n-\t\t\t0x74, 0x0a, 0xac, 0xf1, 0xf7,\n-\t\t\t0x16, 0x36, 0x47, 0x98, 0x4b,\n-\t\t\t0x52, 0x2a, 0x84, 0x8d, 0xf1,\n-\t\t\t0xc3,\n-\n-\t\t\t0xa3, 0x01, 0x04, 0x02, 0x58,\n-\t\t\t0x24, 0x30, 0x31, 0x38, 0x63,\n-\t\t\t0x30, 0x61, 0x65, 0x35, 0x2d,\n-\t\t\t0x34, 0x64, 0x39, 0x62, 0x2d,\n-\t\t\t0x34, 0x37, 0x31, 0x62, 0x2d,\n-\t\t\t0x62, 0x66, 0x64, 0x36, 0x2d,\n-\t\t\t0x65, 0x65, 0x66, 0x33, 0x31,\n-\t\t\t0x34, 0x62, 0x63, 0x37, 0x30,\n-\t\t\t0x33, 0x37, 0x04, 0x58, 0x20,\n-\t\t\t0x84, 0x9b, 0x57, 0x21, 0x9d,\n-\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n-\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n-\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n-\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n-\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n-\t\t\t0x71, 0x88,\n-\n-\t\t\t/* kid \u0022sec-48\u0022 for hmac 384 */\n-\n-\t\t\t0xa3, 0x01, 0x04, 0x02, 0x46,\n-\t\t\t0x73, 0x65, 0x63, 0x2d, 0x34,\n-\t\t\t0x38, 0x20, 0x58, 0x30, 0x84,\n-\t\t\t0x9b, 0x57, 0x21, 0x9d, 0xae,\n-\t\t\t0x48, 0xde, 0x64, 0x6d, 0x07,\n-\t\t\t0xdb, 0xb5, 0x33, 0x56, 0x6e,\n-\t\t\t0x97, 0x66, 0x86, 0x45, 0x7c,\n-\t\t\t0x14, 0x91, 0xbe, 0x3a, 0x76,\n-\t\t\t0xdc, 0xea, 0x6c, 0x42, 0x71,\n-\t\t\t0x88, 0x00, 0x11, 0x22, 0x33,\n-\t\t\t0x77, 0x88, 0x99, 0xaa, 0x21,\n-\t\t\t0x22, 0x23, 0x24, 0x25, 0x26,\n-\t\t\t0x27, 0x28,\n-\n-\t\t\t/* kid \u0022sec-64\u0022 for hmac 512 */\n-\n-\t\t\t0xa3, 0x01, 0x04, 0x02, 0x46,\n-\t\t\t0x73, 0x65, 0x63, 0x2d, 0x36,\n-\t\t\t0x34, 0x20, 0x58, 0x40, 0x84,\n-\t\t\t0x9b, 0x57, 0x21, 0x9d, 0xae,\n-\t\t\t0x48, 0xde, 0x64, 0x6d, 0x07,\n-\t\t\t0xdb, 0xb5, 0x33, 0x56, 0x6e,\n-\t\t\t0x97, 0x66, 0x86, 0x45, 0x7c,\n-\t\t\t0x14, 0x91, 0xbe, 0x3a, 0x76,\n-\t\t\t0xdc, 0xea, 0x6c, 0x42, 0x71,\n-\t\t\t0x88, 0x00, 0x11, 0x22, 0x33,\n-\t\t\t0x77, 0x88, 0x99, 0xaa, 0x21,\n-\t\t\t0x22, 0x23, 0x24, 0x25, 0x26,\n-\t\t\t0x27, 0x28, 0xaa, 0xbb, 0xcc,\n-\t\t\t0xdd, 0xee, 0xff, 0xa5, 0xa6,\n-\t\t\t0xa7, 0xa8, 0xa9, 0xa0, 0xb1,\n-\t\t\t0xb2, 0xb3, 0xb4,\n-}\n-;\n-\n-struct keyinfo {\n-\tconst uint8_t\t\t*set;\n-\tsize_t\t\t\tlen;\n-};\n-\n-struct keyinfo keyset1 \u003d { cose_key_set1, sizeof(cose_key_set1) },\n-\t\tkey3 \u003d { cose_key3, sizeof(cose_key3) },\n-\t\tkey8 \u003d { cose_key8, sizeof(cose_key8) },\n-\t\tkey9 \u003d { cose_key9, sizeof(cose_key9) },\n-\t\tkey10 \u003d { cose_key10, sizeof(cose_key10) }\n-;\n-\n-/* key pieces */\n-\n-static const uint8_t\n-\tkey1_x[] \u003d { 0xba, 0xc5, 0xb1, 0x1c, 0xad,\n-\t\t\t0x8f, 0x99, 0xf9, 0xc7, 0x2b,\n-\t\t\t0x05, 0xcf, 0x4b, 0x9e, 0x26,\n-\t\t\t0xd2, 0x44, 0xdc, 0x18, 0x9f,\n-\t\t\t0x74, 0x52, 0x28, 0x25, 0x5a,\n-\t\t\t0x21, 0x9a, 0x86, 0xd6, 0xa0,\n-\t\t\t0x9e, 0xff },\n-\tkey1_y[] \u003d { 0x20, 0x13, 0x8b, 0xf8, 0x2d,\n-\t\t\t0xc1, 0xb6, 0xd5, 0x62, 0xbe,\n-\t\t\t0x0f, 0xa5, 0x4a, 0xb7, 0x80,\n-\t\t\t0x4a, 0x3a, 0x64, 0xb6, 0xd7,\n-\t\t\t0x2c, 0xcf, 0xed, 0x6b, 0x6f,\n-\t\t\t0xb6, 0xed, 0x28, 0xbb, 0xfc,\n-\t\t\t0x11, 0x7e },\n-\tkey1_d[] \u003d { 0x57, 0xc9, 0x20, 0x77, 0x66,\n-\t\t\t0x41, 0x46, 0xe8, 0x76, 0x76,\n-\t\t\t0x0c, 0x95, 0x20, 0xd0, 0x54,\n-\t\t\t0xaa, 0x93, 0xc3, 0xaf, 0xb0,\n-\t\t\t0x4e, 0x30, 0x67, 0x05, 0xdb,\n-\t\t\t0x60, 0x90, 0x30, 0x85, 0x07,\n-\t\t\t0xb4, 0xd3 },\n-\n-\tkey2_x[] \u003d { 0x65, 0xed, 0xa5, 0xa1, 0x25,\n-\t\t\t0x77, 0xc2, 0xba, 0xe8, 0x29,\n-\t\t\t0x43, 0x7f, 0xe3, 0x38, 0x70,\n-\t\t\t0x1a, 0x10, 0xaa, 0xa3, 0x75,\n-\t\t\t0xe1, 0xbb, 0x5b, 0x5d, 0xe1,\n-\t\t\t0x08, 0xde, 0x43, 0x9c, 0x08,\n-\t\t\t0x55, 0x1d },\n-\tkey2_y[] \u003d { 0x1e, 0x52, 0xed, 0x75, 0x70,\n-\t\t\t0x11, 0x63, 0xf7, 0xf9, 0xe4,\n-\t\t\t0x0d, 0xdf, 0x9f, 0x34, 0x1b,\n-\t\t\t0x3d, 0xc9, 0xba, 0x86, 0x0a,\n-\t\t\t0xf7, 0xe0, 0xca, 0x7c, 0xa7,\n-\t\t\t0xe9, 0xee, 0xcd, 0x00, 0x84,\n-\t\t\t0xd1, 0x9c },\n-\tkey2_d[] \u003d { 0xaf, 0xf9, 0x07, 0xc9, 0x9f,\n-\t\t\t0x9a, 0xd3, 0xaa, 0xe6, 0xc4,\n-\t\t\t0xcd, 0xf2, 0x11, 0x22, 0xbc,\n-\t\t\t0xe2, 0xbd, 0x68, 0xb5, 0x28,\n-\t\t\t0x3e, 0x69, 0x07, 0x15, 0x4a,\n-\t\t\t0xd9, 0x11, 0x84, 0x0f, 0xa2,\n-\t\t\t0x08, 0xcf },\n-\n-\tkey3_k[] \u003d { 0x84, 0x9b, 0x57, 0x21, 0x9d,\n-\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n-\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n-\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n-\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n-\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n-\t\t\t0x71, 0x88 },\n-\n-\tkey4_x[] \u003d { 0x00, 0x72, 0x99, 0x2c, 0xb3,\n-\t\t\t0xac, 0x08, 0xec, 0xf3, 0xe5,\n-\t\t\t0xc6, 0x3d, 0xed, 0xec, 0x0d,\n-\t\t\t0x51, 0xa8, 0xc1, 0xf7, 0x9e,\n-\t\t\t0xf2, 0xf8, 0x2f, 0x94, 0xf3,\n-\t\t\t0xc7, 0x37, 0xbf, 0x5d, 0xe7,\n-\t\t\t0x98, 0x66, 0x71, 0xea, 0xc6,\n-\t\t\t0x25, 0xfe, 0x82, 0x57, 0xbb,\n-\t\t\t0xd0, 0x39, 0x46, 0x44, 0xca,\n-\t\t\t0xaa, 0x3a, 0xaf, 0x8f, 0x27,\n-\t\t\t0xa4, 0x58, 0x5f, 0xbb, 0xca,\n-\t\t\t0xd0, 0xf2, 0x45, 0x76, 0x20,\n-\t\t\t0x08, 0x5e, 0x5c, 0x8f, 0x42,\n-\t\t\t0xad },\n-\tkey4_y[] \u003d { 0x01, 0xdc, 0xa6, 0x94, 0x7b,\n-\t\t\t0xce, 0x88, 0xbc, 0x57, 0x90,\n-\t\t\t0x48, 0x5a, 0xc9, 0x74, 0x27,\n-\t\t\t0x34, 0x2b, 0xc3, 0x5f, 0x88,\n-\t\t\t0x7d, 0x86, 0xd6, 0x5a, 0x08,\n-\t\t\t0x93, 0x77, 0xe2, 0x47, 0xe6,\n-\t\t\t0x0b, 0xaa, 0x55, 0xe4, 0xe8,\n-\t\t\t0x50, 0x1e, 0x2a, 0xda, 0x57,\n-\t\t\t0x24, 0xac, 0x51, 0xd6, 0x90,\n-\t\t\t0x90, 0x08, 0x03, 0x3e, 0xbc,\n-\t\t\t0x10, 0xac, 0x99, 0x9b, 0x9d,\n-\t\t\t0x7f, 0x5c, 0xc2, 0x51, 0x9f,\n-\t\t\t0x3f, 0xe1, 0xea, 0x1d, 0x94,\n-\t\t\t0x75 },\n-\tkey4_d[] \u003d { 0x00, 0x08, 0x51, 0x38, 0xdd,\n-\t\t\t0xab, 0xf5, 0xca, 0x97, 0x5f,\n-\t\t\t0x58, 0x60, 0xf9, 0x1a, 0x08,\n-\t\t\t0xe9, 0x1d, 0x6d, 0x5f, 0x9a,\n-\t\t\t0x76, 0xad, 0x40, 0x18, 0x76,\n-\t\t\t0x6a, 0x47, 0x66, 0x80, 0xb5,\n-\t\t\t0x5c, 0xd3, 0x39, 0xe8, 0xab,\n-\t\t\t0x6c, 0x72, 0xb5, 0xfa, 0xcd,\n-\t\t\t0xb2, 0xa2, 0xa5, 0x0a, 0xc2,\n-\t\t\t0x5b, 0xd0, 0x86, 0x64, 0x7d,\n-\t\t\t0xd3, 0xe2, 0xe6, 0xe9, 0x9e,\n-\t\t\t0x84, 0xca, 0x2c, 0x36, 0x09,\n-\t\t\t0xfd, 0xf1, 0x77, 0xfe, 0xb2,\n-\t\t\t0x6d },\n-\tkey5_k[] \u003d { 0x84, 0x9b, 0x57, 0x86, 0x45,\n-\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n-\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n-\t\t\t0x71 },\n-\n-\tkey6_x[] \u003d { 0x98, 0xf5, 0x0a, 0x4f, 0xf6,\n-\t\t\t0xc0, 0x58, 0x61, 0xc8, 0x86,\n-\t\t\t0x0d, 0x13, 0xa6, 0x38, 0xea,\n-\t\t\t0x56, 0xc3, 0xf5, 0xad, 0x75,\n-\t\t\t0x90, 0xbb, 0xfb, 0xf0, 0x54,\n-\t\t\t0xe1, 0xc7, 0xb4, 0xd9, 0x1d,\n-\t\t\t0x62, 0x80 },\n-\tkey6_y[] \u003d { 0xf0, 0x14, 0x00, 0xb0, 0x89,\n-\t\t\t0x86, 0x78, 0x04, 0xb8, 0xe9,\n-\t\t\t0xfc, 0x96, 0xc3, 0x93, 0x21,\n-\t\t\t0x61, 0xf1, 0x93, 0x4f, 0x42,\n-\t\t\t0x23, 0x06, 0x91, 0x70, 0xd9,\n-\t\t\t0x24, 0xb7, 0xe0, 0x3b, 0xf8,\n-\t\t\t0x22, 0xbb },\n-\tkey6_d[] \u003d { 0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t\t\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t\t\t0x87, 0xce, 0xb2, 0x35, 0x31,\n-\t\t\t0x61, 0x74, 0x0a, 0xac, 0xf1,\n-\t\t\t0xf7, 0x16, 0x36, 0x47, 0x98,\n-\t\t\t0x4b, 0x52, 0x2a, 0x84, 0x8d,\n-\t\t\t0xf1, 0xc3 },\n-\n-\tkey7_k[] \u003d { 0x84, 0x9b, 0x57, 0x21, 0x9d,\n-\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n-\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n-\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n-\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n-\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n-\t\t\t0x71, 0x88 },\n-\n-\tkey8_k[] \u003d { 0x84, 0x9b, 0x57, 0x21, 0x9d,\n-\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n-\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n-\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n-\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n-\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n-\t\t\t0x71, 0x88, 0x00, 0x11, 0x22,\n-\t\t\t0x33, 0x77, 0x88, 0x99, 0xaa,\n-\t\t\t0x21, 0x22, 0x23, 0x24, 0x25,\n-\t\t\t0x26, 0x27, 0x28 },\n-\n-\tkey9_k[] \u003d { 0x84, 0x9b, 0x57, 0x21, 0x9d,\n-\t\t\t0xae, 0x48, 0xde, 0x64, 0x6d,\n-\t\t\t0x07, 0xdb, 0xb5, 0x33, 0x56,\n-\t\t\t0x6e, 0x97, 0x66, 0x86, 0x45,\n-\t\t\t0x7c, 0x14, 0x91, 0xbe, 0x3a,\n-\t\t\t0x76, 0xdc, 0xea, 0x6c, 0x42,\n-\t\t\t0x71, 0x88, 0x00, 0x11, 0x22,\n-\t\t\t0x33, 0x77, 0x88, 0x99, 0xaa,\n-\t\t\t0x21, 0x22, 0x23, 0x24, 0x25,\n-\t\t\t0x26, 0x27, 0x28, 0xaa, 0xbb,\n-\t\t\t0xcc, 0xdd, 0xee, 0xff, 0xa5,\n-\t\t\t0xa6, 0xa7, 0xa8, 0xa9, 0xa0,\n-\t\t\t0xb1, 0xb2, 0xb3, 0xb4 }\n-#if 0\n-\t\t\t,\n-\tkey10_x[] \u003d {\n-\t\t\t0xd7, 0x5a, 0x98, 0x01, 0x82,\n-\t\t\t0xb1, 0x0a, 0xb7, 0xd5, 0x4b,\n-\t\t\t0xfe, 0xd3, 0xc9, 0x64, 0x07,\n-\t\t\t0x3a, 0x0e, 0xe1, 0x72, 0xf3,\n-\t\t\t0xda, 0xa6, 0x23, 0x25, 0xaf,\n-\t\t\t0x02, 0x1a, 0x68, 0xf7, 0x07,\n-\t\t\t0x51, 0x1a\n-\t}, key10_d[] \u003d {\n-\t\t\t0x9d, 0x61, 0xb1, 0x9d, 0xef,\n-\t\t\t0xfd, 0x5a, 0x60, 0xba, 0x84,\n-\t\t\t0x4a, 0xf4, 0x92, 0xec, 0x2c,\n-\t\t\t0xc4, 0x44, 0x49, 0xc5, 0x69,\n-\t\t\t0x7b, 0x32, 0x69, 0x19, 0x70,\n-\t\t\t0x3b, 0xac, 0x03, 0x1c, 0xae,\n-\t\t\t0x7f, 0x60\n-\t}\n-#endif\n-;\n-\n-int\n-test_cose_keys(struct lws_context *context)\n-{\n-\tstruct lws_cose_key *ck;\n-\tlws_dll2_owner_t set;\n-\tlws_lec_pctx_t wc;\n-\tuint8_t buf[4096];\n-\tint n;\n-\n-#if 0\n-\t{\n-\t\tint fd \u003d open(\u0022set1.cks\u0022,\n-\t\t\t LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);\n-\n-\t\tif (fd \u003e\u003d 0) {\n-\t\t\twrite(fd, cose_key_set1, sizeof(cose_key_set1));\n-\t\t\tclose(fd);\n-\t\t}\n-\t}\n-#endif\n-\n-#if 0\n-\tlws_lec_pctx_t wx;\n-\tuint8_t dump[8192];\n-\n-\tlws_lec_init(\u0026wx, buf, sizeof(buf));\n-\n-\tif (lws_lec_printf(\u0026wx,\n-\t\t\u0022{%d:%d, %d:%.*b, %d:%d, %d:%.*b, %d:%.*b}\u0022,\n-\t\tLWSCOSE_WKK_KTY, LWSCOSE_WKKTV_OKP,\n-\t\tLWSCOSE_WKK_KID, 2, \u002211\u0022,\n-\t\tLWSCOSE_WKOKP_CRV, LWSCOSE_WKEC_ED25519,\n-\t\tLWSCOSE_WKECKP_X, (int)sizeof(key10_x), key10_x,\n-//\t\tLWSCOSE_WKECKP_Y, (int)sizeof(key6_y), key6_y,\n-\t\tLWSCOSE_WKECKP_D, (int)sizeof(key10_d), key10_d) !\u003d\n-\t\t\tLWS_LECPCTX_RET_FINISHED)\n-\t\treturn 1;\n-\n-\tlws_hex_from_byte_array(buf, wx.used, (char *)dump, sizeof(dump));\n-\tputs((const char *)dump);\n-#endif\n-#if 0\n-\tlws_lec_pctx_t wx;\n-\tuint8_t dump[8192];\n-\n-\tlws_lec_init(\u0026wx, buf, sizeof(buf));\n-\n-\tif (lws_lec_printf(\u0026wx,\n-\t\t\u0022{%d:%d, %d:%.*b, %d:%.*b}\u0022,\n-\t\tLWSCOSE_WKK_KTY, LWSCOSE_WKKTV_SYMMETRIC,\n-\t\tLWSCOSE_WKK_KID, 6, \u0022sec-64\u0022,\n-\t\t-1, (int)sizeof(key9_k), key9_k) !\u003d\n-\t\t\tLWS_LECPCTX_RET_FINISHED)\n-\t\treturn 1;\n-\n-\tlws_hex_from_byte_array(buf, wx.used, (char *)dump, sizeof(dump));\n-\tputs((const char *)dump);\n-#endif\n-\n-\t/* key1 import */\n-\n-\tlwsl_user(\u0022%s: key 1 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, key_import_cb, NULL, cose_key1, sizeof(cose_key1));\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_EC2 ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_EC ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].len !\u003d sizeof(key1_x) ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].len !\u003d sizeof(key1_y) ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].len !\u003d sizeof(key1_d) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].buf, key1_x, sizeof(key1_x)) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].buf, key1_y, sizeof(key1_y)) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].buf, key1_d, sizeof(key1_d)))\n-\t\tgoto bail;\n-\n-\t// lws_cose_key_dump(ck);\n-\n-\t/* key 1 export */\n-\n-\tlwsl_user(\u0022%s: key 1 export\u005cn\u0022, __func__);\n-\n-\tlws_lec_init(\u0026wc, buf, sizeof(buf));\n-\tn \u003d (int)lws_cose_key_export(ck, \u0026wc, LWSJWKF_EXPORT_PRIVATE);\n-\tlws_cose_key_destroy(\u0026ck);\n-\tif (n !\u003d LWS_LECPCTX_RET_FINISHED)\n-\t\tgoto bail;\n-\n-\t// lwsl_hexdump_notice(buf, wc.used);\n-\n-\t/* key2 import */\n-\n-\tlwsl_user(\u0022%s: key 2 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key2, sizeof(cose_key2));\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_EC2 ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_EC ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].len !\u003d sizeof(key2_x) ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].len !\u003d sizeof(key2_y) ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].len !\u003d sizeof(key2_d) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].buf, key2_x, sizeof(key2_x)) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].buf, key2_y, sizeof(key2_y)) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].buf, key2_d, sizeof(key2_d)))\n-\t\tgoto bail;\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\t/* key3 import */\n-\n-\tlwsl_user(\u0022%s: key 3 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key3, sizeof(cose_key3));\n-\tif (!ck) {\n-\t\tlwsl_err(\u0022%s: key 3 import failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n-\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key3_k) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key3_k, sizeof(key3_k))) {\n-\t\tlwsl_err(\u0022%s: key 3 checks failed %d %d %d\u005cn\u0022, __func__,\n-\t\t\t\t(int)ck-\u003ekty, (int)ck-\u003egencrypto_kty,\n-\t\t\t\t(int)ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\t/* key4 import */\n-\n-\tlwsl_user(\u0022%s: key 4 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key4, sizeof(cose_key4));\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_EC2 ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_EC ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].len !\u003d sizeof(key4_x) ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].len !\u003d sizeof(key4_y) ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].len !\u003d sizeof(key4_d) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].buf, key4_x, sizeof(key4_x)) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].buf, key4_y, sizeof(key4_y)) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].buf, key4_d, sizeof(key4_d)))\n-\t\tgoto bail;\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\t/* key5 import */\n-\n-\tlwsl_user(\u0022%s: key 5 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key5, sizeof(cose_key5));\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n-\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key5_k) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key5_k, sizeof(key5_k)))\n-\t\tgoto bail;\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\t/* key6 import */\n-\n-\tlwsl_user(\u0022%s: key 6 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key6, sizeof(cose_key6));\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_EC2 ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_EC ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].len !\u003d sizeof(key6_x) ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].len !\u003d sizeof(key6_y) ||\n-\t ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].len !\u003d sizeof(key6_d) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_X].buf, key6_x, sizeof(key6_x)) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_Y].buf, key6_y, sizeof(key6_y)) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_EC_KEYEL_D].buf, key6_d, sizeof(key6_d)))\n-\t\tgoto bail;\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\t/* key7 import */\n-\n-\tlwsl_user(\u0022%s: key 7 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key7, sizeof(cose_key7));\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n-\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key7_k) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key7_k, sizeof(key7_k)))\n-\t\tgoto bail;\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\t/* key8 import */\n-\n-\tlwsl_user(\u0022%s: key 8 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key8, sizeof(cose_key8));\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n-\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key8_k) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key8_k, sizeof(key8_k)))\n-\t\tgoto bail;\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\t/* key9 import */\n-\n-\tlwsl_user(\u0022%s: key 9 import\u005cn\u0022, __func__);\n-\n-\tck \u003d lws_cose_key_import(NULL, NULL, NULL, cose_key9, sizeof(cose_key9));\n-\tif (!ck) {\n-\t\tlwsl_err(\u0022%s: cose9 import fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (ck-\u003ekty !\u003d LWSCOSE_WKKTV_SYMMETRIC ||\n-\t ck-\u003egencrypto_kty !\u003d LWS_GENCRYPTO_KTY_OCT ||\n-\t ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].len !\u003d sizeof(key9_k) ||\n-\t memcmp(ck-\u003ee[LWS_GENCRYPTO_OCT_KEYEL_K].buf, key9_k, sizeof(key9_k))) {\n-\t\tlwsl_notice(\u0022%s: key9 check fails\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\t/* key set 1 */\n-\n-\tlwsl_user(\u0022%s: key_set1\u005cn\u0022, __func__);\n-\tlws_dll2_owner_clear(\u0026set);\n-\tck \u003d lws_cose_key_import(\u0026set, NULL, NULL, cose_key_set1, sizeof(cose_key_set1));\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/* generate */\n-\n-\tck \u003d lws_cose_key_generate(context, LWSCOSE_WKKTV_EC2,\n-\t\t\t\t (1 \u003c\u003c LWSCOSE_WKKO_SIGN) |\n-\t\t\t\t (1 \u003c\u003c LWSCOSE_WKKO_VERIFY) |\n-\t\t\t\t (1 \u003c\u003c LWSCOSE_WKKO_ENCRYPT) |\n-\t\t\t\t (1 \u003c\u003c LWSCOSE_WKKO_DECRYPT),\n-\t\t\t\t 0, \u0022P-256\u0022, (const uint8_t *)\u0022the-keyid\u0022, 9);\n-\tif (!ck)\n-\t\treturn 1;\n-\n-\t// lws_cose_key_dump(ck);\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-cose/main.c b/minimal-examples/api-tests/api-test-cose/main.c\ndeleted file mode 100644\nindex 19de29c..0000000\n--- a/minimal-examples/api-tests/api-test-cose/main.c\n+++ /dev/null\n@@ -1,50 +0,0 @@\n-/*\n- * lws-api-test-cose\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-int\n-test_cose_keys(struct lws_context *context);\n-int\n-test_cose_sign(struct lws_context *context);\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tconst char *p;\n-\tint result \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS COSE api tests\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\tinfo.options \u003d 0;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tresult |\u003d test_cose_keys(context);\n-\tresult |\u003d test_cose_sign(context);\n-\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, result ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-cose/sign.c b/minimal-examples/api-tests/api-test-cose/sign.c\ndeleted file mode 100644\nindex 6c8c50b..0000000\n--- a/minimal-examples/api-tests/api-test-cose/sign.c\n+++ /dev/null\n@@ -1,1862 +0,0 @@\n-/*\n- * lws-api-test-jose - RFC8152 cose_sign tests\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * Raw key CBOR created from descriptions at\n- *\n- * https://github.com/cose-wg/Examples/blob/master/KeySet.txt\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstdlib.h\u003e\n-#include \u003cfcntl.h\u003e\n-\n-static const uint8_t\n-\tsign1_pass_01[] \u003d {\n-\t\t/*\n-\t\t * https://github.com/cose-wg/Examples/blob/master/\n-\t\t * sign1-tests/sign-pass-01.json\n-\t\t */\n-\t\t0xd2, 0x84, 0x41, 0xa0, 0xa2,\n-\t\t0x01, 0x26, 0x04, 0x42, 0x31,\n-\t\t0x31, 0x54, 0x54, 0x68, 0x69,\n-\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n-\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n-\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n-\t\t0x74, 0x2e, 0x58, 0x40, 0x87,\n-\t\t0xdb, 0x0d, 0x2e, 0x55, 0x71,\n-\t\t0x84, 0x3b, 0x78, 0xac, 0x33,\n-\t\t0xec, 0xb2, 0x83, 0x0d, 0xf7,\n-\t\t0xb6, 0xe0, 0xa4, 0xd5, 0xb7,\n-\t\t0x37, 0x6d, 0xe3, 0x36, 0xb2,\n-\t\t0x3c, 0x59, 0x1c, 0x90, 0xc4,\n-\t\t0x25, 0x31, 0x7e, 0x56, 0x12,\n-\t\t0x7f, 0xbe, 0x04, 0x37, 0x00,\n-\t\t0x97, 0xce, 0x34, 0x70, 0x87,\n-\t\t0xb2, 0x33, 0xbf, 0x72, 0x2b,\n-\t\t0x64, 0x07, 0x2b, 0xeb, 0x44,\n-\t\t0x86, 0xbd, 0xa4, 0x03, 0x1d,\n-\t\t0x27, 0x24, 0x4f },\n-\tsign1_pass_02[] \u003d {\n-\t\t0xd2, 0x84, 0x43, 0xa1, 0x01,\n-\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n-\t\t0x31, 0x54, 0x54, 0x68, 0x69,\n-\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n-\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n-\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n-\t\t0x74, 0x2e, 0x58, 0x40, 0x10,\n-\t\t0x72, 0x9c, 0xd7, 0x11, 0xcb,\n-\t\t0x38, 0x13, 0xd8, 0xd8, 0xe9,\n-\t\t0x44, 0xa8, 0xda, 0x71, 0x11,\n-\t\t0xe7, 0xb2, 0x58, 0xc9, 0xbd,\n-\t\t0xca, 0x61, 0x35, 0xf7, 0xae,\n-\t\t0x1a, 0xdb, 0xee, 0x95, 0x09,\n-\t\t0x89, 0x12, 0x67, 0x83, 0x7e,\n-\t\t0x1e, 0x33, 0xbd, 0x36, 0xc1,\n-\t\t0x50, 0x32, 0x6a, 0xe6, 0x27,\n-\t\t0x55, 0xc6, 0xbd, 0x8e, 0x54,\n-\t\t0x0c, 0x3e, 0x8f, 0x92, 0xd7,\n-\t\t0xd2, 0x25, 0xe8, 0xdb, 0x72,\n-\t\t0xb8, 0x82, 0x0b },\n-\n-\tsign1_pass_02_ext[] \u003d {\n-\t\t0x11, 0xaa, 0x22, 0xbb, 0x33,\n-\t\t0xcc, 0x44, 0xdd, 0x55, 0x00,\n-\t\t0x66, 0x99 },\n-\n-\tsign1_pass_03[] \u003d {\n-\t\t0x84, 0x43, 0xa1, 0x01, 0x26,\n-\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n-\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t0x2e, 0x58, 0x40, 0x8e, 0xb3,\n-\t\t0x3e, 0x4c, 0xa3, 0x1d, 0x1c,\n-\t\t0x46, 0x5a, 0xb0, 0x5a, 0xac,\n-\t\t0x34, 0xcc, 0x6b, 0x23, 0xd5,\n-\t\t0x8f, 0xef, 0x5c, 0x08, 0x31,\n-\t\t0x06, 0xc4, 0xd2, 0x5a, 0x91,\n-\t\t0xae, 0xf0, 0xb0, 0x11, 0x7e,\n-\t\t0x2a, 0xf9, 0xa2, 0x91, 0xaa,\n-\t\t0x32, 0xe1, 0x4a, 0xb8, 0x34,\n-\t\t0xdc, 0x56, 0xed, 0x2a, 0x22,\n-\t\t0x34, 0x44, 0x54, 0x7e, 0x01,\n-\t\t0xf1, 0x1d, 0x3b, 0x09, 0x16,\n-\t\t0xe5, 0xa4, 0xc3, 0x45, 0xca,\n-\t\t0xcb, 0x36 },\n-\tsign1_fail_01[] \u003d {\n-\t\t0xd9, 0x03, 0xe6, 0x84, 0x43,\n-\t\t0xa1, 0x01, 0x26, 0xa1, 0x04,\n-\t\t0x42, 0x31, 0x31, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n-\t\t0x40, 0x8e, 0xb3, 0x3e, 0x4c,\n-\t\t0xa3, 0x1d, 0x1c, 0x46, 0x5a,\n-\t\t0xb0, 0x5a, 0xac, 0x34, 0xcc,\n-\t\t0x6b, 0x23, 0xd5, 0x8f, 0xef,\n-\t\t0x5c, 0x08, 0x31, 0x06, 0xc4,\n-\t\t0xd2, 0x5a, 0x91, 0xae, 0xf0,\n-\t\t0xb0, 0x11, 0x7e, 0x2a, 0xf9,\n-\t\t0xa2, 0x91, 0xaa, 0x32, 0xe1,\n-\t\t0x4a, 0xb8, 0x34, 0xdc, 0x56,\n-\t\t0xed, 0x2a, 0x22, 0x34, 0x44,\n-\t\t0x54, 0x7e, 0x01, 0xf1, 0x1d,\n-\t\t0x3b, 0x09, 0x16, 0xe5, 0xa4,\n-\t\t0xc3, 0x45, 0xca, 0xcb, 0x36 },\n-\tsign1_fail_02[] \u003d {\n-\t\t0xd2, 0x84, 0x43, 0xa1, 0x01,\n-\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n-\t\t0x31, 0x54, 0x54, 0x68, 0x69,\n-\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n-\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n-\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n-\t\t0x74, 0x2f, 0x58, 0x40, 0x8e,\n-\t\t0xb3, 0x3e, 0x4c, 0xa3, 0x1d,\n-\t\t0x1c, 0x46, 0x5a, 0xb0, 0x5a,\n-\t\t0xac, 0x34, 0xcc, 0x6b, 0x23,\n-\t\t0xd5, 0x8f, 0xef, 0x5c, 0x08,\n-\t\t0x31, 0x06, 0xc4, 0xd2, 0x5a,\n-\t\t0x91, 0xae, 0xf0, 0xb0, 0x11,\n-\t\t0x7e, 0x2a, 0xf9, 0xa2, 0x91,\n-\t\t0xaa, 0x32, 0xe1, 0x4a, 0xb8,\n-\t\t0x34, 0xdc, 0x56, 0xed, 0x2a,\n-\t\t0x22, 0x34, 0x44, 0x54, 0x7e,\n-\t\t0x01, 0xf1, 0x1d, 0x3b, 0x09,\n-\t\t0x16, 0xe5, 0xa4, 0xc3, 0x45,\n-\t\t0xca, 0xcb, 0x36 },\n-\tsign1_fail_03[] \u003d {\n-\t\t0xd2, 0x84, 0x45, 0xa1, 0x01,\n-\t\t0x39, 0x03, 0xe6, 0xa1, 0x04,\n-\t\t0x42, 0x31, 0x31, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n-\t\t0x40, 0x8e, 0xb3, 0x3e, 0x4c,\n-\t\t0xa3, 0x1d, 0x1c, 0x46, 0x5a,\n-\t\t0xb0, 0x5a, 0xac, 0x34, 0xcc,\n-\t\t0x6b, 0x23, 0xd5, 0x8f, 0xef,\n-\t\t0x5c, 0x08, 0x31, 0x06, 0xc4,\n-\t\t0xd2, 0x5a, 0x91, 0xae, 0xf0,\n-\t\t0xb0, 0x11, 0x7e, 0x2a, 0xf9,\n-\t\t0xa2, 0x91, 0xaa, 0x32, 0xe1,\n-\t\t0x4a, 0xb8, 0x34, 0xdc, 0x56,\n-\t\t0xed, 0x2a, 0x22, 0x34, 0x44,\n-\t\t0x54, 0x7e, 0x01, 0xf1, 0x1d,\n-\t\t0x3b, 0x09, 0x16, 0xe5, 0xa4,\n-\t\t0xc3, 0x45, 0xca, 0xcb, 0x36 },\n-\tsign1_fail_04[] \u003d {\n-\t\t0xd2, 0x84, 0x4a, 0xa1, 0x01,\n-\t\t0x67, 0x75, 0x6e, 0x6b, 0x6e,\n-\t\t0x6f, 0x77, 0x6e, 0xa1, 0x04,\n-\t\t0x42, 0x31, 0x31, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n-\t\t0x40, 0x8e, 0xb3, 0x3e, 0x4c,\n-\t\t0xa3, 0x1d, 0x1c, 0x46, 0x5a,\n-\t\t0xb0, 0x5a, 0xac, 0x34, 0xcc,\n-\t\t0x6b, 0x23, 0xd5, 0x8f, 0xef,\n-\t\t0x5c, 0x08, 0x31, 0x06, 0xc4,\n-\t\t0xd2, 0x5a, 0x91, 0xae, 0xf0,\n-\t\t0xb0, 0x11, 0x7e, 0x2a, 0xf9,\n-\t\t0xa2, 0x91, 0xaa, 0x32, 0xe1,\n-\t\t0x4a, 0xb8, 0x34, 0xdc, 0x56,\n-\t\t0xed, 0x2a, 0x22, 0x34, 0x44,\n-\t\t0x54, 0x7e, 0x01, 0xf1, 0x1d,\n-\t\t0x3b, 0x09, 0x16, 0xe5, 0xa4,\n-\t\t0xc3, 0x45, 0xca, 0xcb, 0x36 },\n-\n-\t\t/* sign1/fail05 is missing upstream */\n-\n-\tsign1_fail_06[] \u003d {\n-\t\t0xd2, 0x84, 0x45, 0xa2, 0x01,\n-\t\t0x26, 0x03, 0x00, 0xa1, 0x04,\n-\t\t0x42, 0x31, 0x31, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n-\t\t0x40, 0x8e, 0xb3, 0x3e, 0x4c,\n-\t\t0xa3, 0x1d, 0x1c, 0x46, 0x5a,\n-\t\t0xb0, 0x5a, 0xac, 0x34, 0xcc,\n-\t\t0x6b, 0x23, 0xd5, 0x8f, 0xef,\n-\t\t0x5c, 0x08, 0x31, 0x06, 0xc4,\n-\t\t0xd2, 0x5a, 0x91, 0xae, 0xf0,\n-\t\t0xb0, 0x11, 0x7e, 0x2a, 0xf9,\n-\t\t0xa2, 0x91, 0xaa, 0x32, 0xe1,\n-\t\t0x4a, 0xb8, 0x34, 0xdc, 0x56,\n-\t\t0xed, 0x2a, 0x22, 0x34, 0x44,\n-\t\t0x54, 0x7e, 0x01, 0xf1, 0x1d,\n-\t\t0x3b, 0x09, 0x16, 0xe5, 0xa4,\n-\t\t0xc3, 0x45, 0xca, 0xcb, 0x36 },\n-\n-\tsign1_fail_07[] \u003d {\n-\t\t0xd2, 0x84, 0x43, 0xa1, 0x01,\n-\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n-\t\t0x31, 0x54, 0x54, 0x68, 0x69,\n-\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n-\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n-\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n-\t\t0x74, 0x2e, 0x58, 0x40, 0x65,\n-\t\t0x20, 0xbb, 0xaf, 0x20, 0x81,\n-\t\t0xd7, 0xe0, 0xed, 0x0f, 0x95,\n-\t\t0xf7, 0x6e, 0xb0, 0x73, 0x3d,\n-\t\t0x66, 0x70, 0x05, 0xf7, 0x46,\n-\t\t0x7c, 0xec, 0x4b, 0x87, 0xb9,\n-\t\t0x38, 0x1a, 0x6b, 0xa1, 0xed,\n-\t\t0xe8, 0xe0, 0x0d, 0xf2, 0x9f,\n-\t\t0x32, 0xa3, 0x72, 0x30, 0xf3,\n-\t\t0x9a, 0x84, 0x2a, 0x54, 0x82,\n-\t\t0x1f, 0xdd, 0x22, 0x30, 0x92,\n-\t\t0x81, 0x9d, 0x77, 0x28, 0xef,\n-\t\t0xb9, 0xd3, 0xa0, 0x08, 0x0b,\n-\t\t0x75, 0x38, 0x0b },\n-\n-\tsign_pass_01[] \u003d {\n-\t\t0xd8, 0x62, 0x84, 0x41, 0xa0,\n-\t\t0xa0, 0x54, 0x54, 0x68, 0x69,\n-\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n-\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n-\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n-\t\t0x74, 0x2e, 0x81, 0x83, 0x43,\n-\t\t0xa1, 0x01, 0x26, 0xa1, 0x04,\n-\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n-\t\t0xe2, 0xae, 0xaf, 0xd4, 0x0d,\n-\t\t0x69, 0xd1, 0x9d, 0xfe, 0x6e,\n-\t\t0x52, 0x07, 0x7c, 0x5d, 0x7f,\n-\t\t0xf4, 0xe4, 0x08, 0x28, 0x2c,\n-\t\t0xbe, 0xfb, 0x5d, 0x06, 0xcb,\n-\t\t0xf4, 0x14, 0xaf, 0x2e, 0x19,\n-\t\t0xd9, 0x82, 0xac, 0x45, 0xac,\n-\t\t0x98, 0xb8, 0x54, 0x4c, 0x90,\n-\t\t0x8b, 0x45, 0x07, 0xde, 0x1e,\n-\t\t0x90, 0xb7, 0x17, 0xc3, 0xd3,\n-\t\t0x48, 0x16, 0xfe, 0x92, 0x6a,\n-\t\t0x2b, 0x98, 0xf5, 0x3a, 0xfd,\n-\t\t0x2f, 0xa0, 0xf3, 0x0a },\n-\n-\tsign_pass_02[] \u003d {\n-\t\t0xd8, 0x62, 0x84, 0x40, 0xa0,\n-\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t0x2e, 0x81, 0x83, 0x43, 0xa1,\n-\t\t0x01, 0x26, 0xa1, 0x04, 0x42,\n-\t\t0x31, 0x31, 0x58, 0x40, 0xcb,\n-\t\t0xb8, 0xda, 0xd9, 0xbe, 0xaf,\n-\t\t0xb8, 0x90, 0xe1, 0xa4, 0x14,\n-\t\t0x12, 0x4d, 0x8b, 0xfb, 0xc2,\n-\t\t0x6b, 0xed, 0xf2, 0xa9, 0x4f,\n-\t\t0xcb, 0x5a, 0x88, 0x24, 0x32,\n-\t\t0xbf, 0xf6, 0xd6, 0x3e, 0x15,\n-\t\t0xf5, 0x74, 0xee, 0xb2, 0xab,\n-\t\t0x51, 0xd8, 0x3f, 0xa2, 0xcb,\n-\t\t0xf6, 0x26, 0x72, 0xeb, 0xf4,\n-\t\t0xc7, 0xd9, 0x93, 0xb0, 0xf4,\n-\t\t0xc2, 0x44, 0x76, 0x47, 0xd8,\n-\t\t0x31, 0xba, 0x57, 0xcc, 0xa8,\n-\t\t0x6b, 0x93, 0x0a },\n-\n-\tsign_pass_03[] \u003d {\n-\t\t0x84, 0x40, 0xa0, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n-\t\t0x83, 0x43, 0xa1, 0x01, 0x26,\n-\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n-\t\t0x58, 0x40, 0xe2, 0xae, 0xaf,\n-\t\t0xd4, 0x0d, 0x69, 0xd1, 0x9d,\n-\t\t0xfe, 0x6e, 0x52, 0x07, 0x7c,\n-\t\t0x5d, 0x7f, 0xf4, 0xe4, 0x08,\n-\t\t0x28, 0x2c, 0xbe, 0xfb, 0x5d,\n-\t\t0x06, 0xcb, 0xf4, 0x14, 0xaf,\n-\t\t0x2e, 0x19, 0xd9, 0x82, 0xac,\n-\t\t0x45, 0xac, 0x98, 0xb8, 0x54,\n-\t\t0x4c, 0x90, 0x8b, 0x45, 0x07,\n-\t\t0xde, 0x1e, 0x90, 0xb7, 0x17,\n-\t\t0xc3, 0xd3, 0x48, 0x16, 0xfe,\n-\t\t0x92, 0x6a, 0x2b, 0x98, 0xf5,\n-\t\t0x3a, 0xfd, 0x2f, 0xa0, 0xf3,\n-\t\t0x0a },\n-\n-\tsign_fail_01[] \u003d {\n-\t\t0xd9, 0x03, 0xe6, 0x84, 0x40,\n-\t\t0xa0, 0x54, 0x54, 0x68, 0x69,\n-\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n-\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n-\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n-\t\t0x74, 0x2e, 0x81, 0x83, 0x43,\n-\t\t0xa1, 0x01, 0x26, 0xa1, 0x04,\n-\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n-\t\t0xe2, 0xae, 0xaf, 0xd4, 0x0d,\n-\t\t0x69, 0xd1, 0x9d, 0xfe, 0x6e,\n-\t\t0x52, 0x07, 0x7c, 0x5d, 0x7f,\n-\t\t0xf4, 0xe4, 0x08, 0x28, 0x2c,\n-\t\t0xbe, 0xfb, 0x5d, 0x06, 0xcb,\n-\t\t0xf4, 0x14, 0xaf, 0x2e, 0x19,\n-\t\t0xd9, 0x82, 0xac, 0x45, 0xac,\n-\t\t0x98, 0xb8, 0x54, 0x4c, 0x90,\n-\t\t0x8b, 0x45, 0x07, 0xde, 0x1e,\n-\t\t0x90, 0xb7, 0x17, 0xc3, 0xd3,\n-\t\t0x48, 0x16, 0xfe, 0x92, 0x6a,\n-\t\t0x2b, 0x98, 0xf5, 0x3a, 0xfd,\n-\t\t0x2f, 0xa0, 0xf3, 0x0a },\n-\n-\tsign_fail_02[] \u003d {\n-\t\t0xd8, 0x62, 0x84, 0x40, 0xa0,\n-\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t0x2e, 0x81, 0x83, 0x43, 0xa1,\n-\t\t0x01, 0x26, 0xa1, 0x04, 0x42,\n-\t\t0x31, 0x31, 0x58, 0x40, 0xe2,\n-\t\t0xae, 0xaf, 0xd4, 0x0d, 0x69,\n-\t\t0xd1, 0x9d, 0xfe, 0x6e, 0x52,\n-\t\t0x07, 0x7c, 0x5d, 0x7f, 0xf4,\n-\t\t0xe4, 0x08, 0x28, 0x2c, 0xbe,\n-\t\t0xfb, 0x5d, 0x06, 0xcb, 0xf4,\n-\t\t0x14, 0xaf, 0x2e, 0x19, 0xd9,\n-\t\t0x82, 0xac, 0x45, 0xac, 0x98,\n-\t\t0xb8, 0x54, 0x4c, 0x90, 0x8b,\n-\t\t0x45, 0x07, 0xde, 0x1e, 0x90,\n-\t\t0xb7, 0x17, 0xc3, 0xd3, 0x48,\n-\t\t0x16, 0xfe, 0x92, 0x6a, 0x2b,\n-\t\t0x98, 0xf5, 0x3a, 0xfd, 0x2f,\n-\t\t0xa0, 0xf3, 0x0b },\n-\n-\tsign_fail_03[] \u003d {\n-\t\t0xd8, 0x62, 0x84, 0x40, 0xa0,\n-\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t0x2e, 0x81, 0x83, 0x45, 0xa1,\n-\t\t0x01, 0x39, 0x03, 0xe6, 0xa1,\n-\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t0x40, 0xe2, 0xae, 0xaf, 0xd4,\n-\t\t0x0d, 0x69, 0xd1, 0x9d, 0xfe,\n-\t\t0x6e, 0x52, 0x07, 0x7c, 0x5d,\n-\t\t0x7f, 0xf4, 0xe4, 0x08, 0x28,\n-\t\t0x2c, 0xbe, 0xfb, 0x5d, 0x06,\n-\t\t0xcb, 0xf4, 0x14, 0xaf, 0x2e,\n-\t\t0x19, 0xd9, 0x82, 0xac, 0x45,\n-\t\t0xac, 0x98, 0xb8, 0x54, 0x4c,\n-\t\t0x90, 0x8b, 0x45, 0x07, 0xde,\n-\t\t0x1e, 0x90, 0xb7, 0x17, 0xc3,\n-\t\t0xd3, 0x48, 0x16, 0xfe, 0x92,\n-\t\t0x6a, 0x2b, 0x98, 0xf5, 0x3a,\n-\t\t0xfd, 0x2f, 0xa0, 0xf3, 0x0a },\n-\n-\tsign_fail_04[] \u003d {\n-\t\t0xd8, 0x62, 0x84, 0x40, 0xa0,\n-\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t0x2e, 0x81, 0x83, 0x4a, 0xa1,\n-\t\t0x01, 0x67, 0x75, 0x6e, 0x6b,\n-\t\t0x6e, 0x6f, 0x77, 0x6e, 0xa1,\n-\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t0x40, 0xe2, 0xae, 0xaf, 0xd4,\n-\t\t0x0d, 0x69, 0xd1, 0x9d, 0xfe,\n-\t\t0x6e, 0x52, 0x07, 0x7c, 0x5d,\n-\t\t0x7f, 0xf4, 0xe4, 0x08, 0x28,\n-\t\t0x2c, 0xbe, 0xfb, 0x5d, 0x06,\n-\t\t0xcb, 0xf4, 0x14, 0xaf, 0x2e,\n-\t\t0x19, 0xd9, 0x82, 0xac, 0x45,\n-\t\t0xac, 0x98, 0xb8, 0x54, 0x4c,\n-\t\t0x90, 0x8b, 0x45, 0x07, 0xde,\n-\t\t0x1e, 0x90, 0xb7, 0x17, 0xc3,\n-\t\t0xd3, 0x48, 0x16, 0xfe, 0x92,\n-\t\t0x6a, 0x2b, 0x98, 0xf5, 0x3a,\n-\t\t0xfd, 0x2f, 0xa0, 0xf3, 0x0a },\n-\n-\t\t/* fail 5 missing upstream */\n-\n-\tsign_fail_06[] \u003d {\n-\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n-\t\t0x03, 0x00, 0xa0, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n-\t\t0x83, 0x43, 0xa1, 0x01, 0x26,\n-\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n-\t\t0x58, 0x40, 0xe2, 0xae, 0xaf,\n-\t\t0xd4, 0x0d, 0x69, 0xd1, 0x9d,\n-\t\t0xfe, 0x6e, 0x52, 0x07, 0x7c,\n-\t\t0x5d, 0x7f, 0xf4, 0xe4, 0x08,\n-\t\t0x28, 0x2c, 0xbe, 0xfb, 0x5d,\n-\t\t0x06, 0xcb, 0xf4, 0x14, 0xaf,\n-\t\t0x2e, 0x19, 0xd9, 0x82, 0xac,\n-\t\t0x45, 0xac, 0x98, 0xb8, 0x54,\n-\t\t0x4c, 0x90, 0x8b, 0x45, 0x07,\n-\t\t0xde, 0x1e, 0x90, 0xb7, 0x17,\n-\t\t0xc3, 0xd3, 0x48, 0x16, 0xfe,\n-\t\t0x92, 0x6a, 0x2b, 0x98, 0xf5,\n-\t\t0x3a, 0xfd, 0x2f, 0xa0, 0xf3,\n-\t\t0x0a },\n-\n-\tsign_fail_07[] \u003d {\n-\t\t0xd8, 0x62, 0x84, 0x41, 0xa0,\n-\t\t0xa0, 0x54, 0x54, 0x68, 0x69,\n-\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n-\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n-\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n-\t\t0x74, 0x2e, 0x81, 0x83, 0x43,\n-\t\t0xa1, 0x01, 0x26, 0xa1, 0x04,\n-\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n-\t\t0xd7, 0x1c, 0x05, 0xdb, 0x52,\n-\t\t0xc9, 0xce, 0x7f, 0x1b, 0xf5,\n-\t\t0xaa, 0xc0, 0x13, 0x34, 0xbb,\n-\t\t0xea, 0xca, 0xc1, 0xd8, 0x6a,\n-\t\t0x23, 0x03, 0xe6, 0xee, 0xaa,\n-\t\t0x89, 0x26, 0x6f, 0x45, 0xc0,\n-\t\t0x1e, 0xd6, 0x02, 0xca, 0x64,\n-\t\t0x9e, 0xaf, 0x79, 0x0d, 0x8b,\n-\t\t0xc9, 0x9d, 0x24, 0x58, 0x45,\n-\t\t0x7c, 0xa6, 0xa8, 0x72, 0x06,\n-\t\t0x19, 0x40, 0xe7, 0xaf, 0xbe,\n-\t\t0x48, 0xe2, 0x89, 0xdf, 0xac,\n-\t\t0x14, 0x6a, 0xe2, 0x58 },\n-\n-\tsign_hmac_01[] \u003d {\n-\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n-\t\t0x01, 0x05, 0xa0, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n-\t\t0x20, 0x2b, 0xdc, 0xc8, 0x9f,\n-\t\t0x05, 0x82, 0x16, 0xb8, 0xa2,\n-\t\t0x08, 0xdd, 0xc6, 0xd8, 0xb5,\n-\t\t0x4a, 0xa9, 0x1f, 0x48, 0xbd,\n-\t\t0x63, 0x48, 0x49, 0x86, 0x56,\n-\t\t0x51, 0x05, 0xc9, 0xad, 0x5a,\n-\t\t0x66, 0x82, 0xf6, 0x81, 0x83,\n-\t\t0x40, 0xa2, 0x01, 0x25, 0x04,\n-\t\t0x4a, 0x6f, 0x75, 0x72, 0x2d,\n-\t\t0x73, 0x65, 0x63, 0x72, 0x65,\n-\t\t0x74, 0x40 },\n-\n-\tsign_hmac_02[] \u003d {\n-\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n-\t\t0x01, 0x06, 0xa0, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n-\t\t0x30, 0xb3, 0x09, 0x7f, 0x70,\n-\t\t0x00, 0x9a, 0x11, 0x50, 0x74,\n-\t\t0x09, 0x59, 0x8a, 0x83, 0xe1,\n-\t\t0x5b, 0xbb, 0xbf, 0x19, 0x82,\n-\t\t0xdc, 0xe2, 0x8e, 0x5a, 0xb6,\n-\t\t0xd5, 0xa6, 0xaf, 0xf6, 0x89,\n-\t\t0x7b, 0xd2, 0x4b, 0xb8, 0xb7,\n-\t\t0x47, 0x96, 0x22, 0xc9, 0x40,\n-\t\t0x1b, 0x24, 0x09, 0x0d, 0x45,\n-\t\t0x82, 0x06, 0xd5, 0x87, 0x81,\n-\t\t0x83, 0x40, 0xa2, 0x01, 0x25,\n-\t\t0x04, 0x46, 0x73, 0x65, 0x63,\n-\t\t0x2d, 0x34, 0x38, 0x40 },\n-\n-\tsign_hmac_03[] \u003d {\n-\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n-\t\t0x01, 0x07, 0xa0, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n-\t\t0x40, 0xcd, 0x28, 0xa6, 0xb3,\n-\t\t0xcf, 0xbb, 0xbf, 0x21, 0x48,\n-\t\t0x51, 0xb9, 0x06, 0xe0, 0x50,\n-\t\t0x05, 0x6c, 0xb4, 0x38, 0xa8,\n-\t\t0xb8, 0x89, 0x05, 0xb8, 0xb7,\n-\t\t0x46, 0x19, 0x77, 0x02, 0x27,\n-\t\t0x11, 0xa9, 0xd8, 0xac, 0x5d,\n-\t\t0xbc, 0x54, 0xe2, 0x9a, 0x56,\n-\t\t0xd9, 0x26, 0x04, 0x6b, 0x40,\n-\t\t0xfc, 0x26, 0x07, 0xc2, 0x5b,\n-\t\t0x34, 0x44, 0x54, 0xaa, 0x5f,\n-\t\t0x68, 0xde, 0x09, 0xa3, 0xe5,\n-\t\t0x25, 0xd3, 0x86, 0x5a, 0x05,\n-\t\t0x81, 0x83, 0x40, 0xa2, 0x01,\n-\t\t0x25, 0x04, 0x46, 0x73, 0x65,\n-\t\t0x63, 0x2d, 0x36, 0x34, 0x40 },\n-\n-\tsign_hmac_04[] \u003d {\n-\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n-\t\t0x01, 0x05, 0xa0, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x58,\n-\t\t0x20, 0x2b, 0xdc, 0xc8, 0x9f,\n-\t\t0x05, 0x82, 0x16, 0xb8, 0xa2,\n-\t\t0x08, 0xdd, 0xc6, 0xd8, 0xb5,\n-\t\t0x4a, 0xa9, 0x1f, 0x48, 0xbd,\n-\t\t0x63, 0x48, 0x49, 0x86, 0x56,\n-\t\t0x51, 0x05, 0xc9, 0xad, 0x5a,\n-\t\t0x66, 0x82, 0xf7, 0x81, 0x83,\n-\t\t0x40, 0xa2, 0x01, 0x25, 0x04,\n-\t\t0x4a, 0x6f, 0x75, 0x72, 0x2d,\n-\t\t0x73, 0x65, 0x63, 0x72, 0x65,\n-\t\t0x74, 0x40 },\n-\n-\tsign_hmac_05[] \u003d {\n-\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n-\t\t0x01, 0x04, 0xa0, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x48,\n-\t\t0x6f, 0x35, 0xca, 0xb7, 0x79,\n-\t\t0xf7, 0x78, 0x33, 0x81, 0x83,\n-\t\t0x40, 0xa2, 0x01, 0x25, 0x04,\n-\t\t0x4a, 0x6f, 0x75, 0x72, 0x2d,\n-\t\t0x73, 0x65, 0x63, 0x72, 0x65,\n-\t\t0x74, 0x40 },\n-\n-\tenc_hmac_01[] \u003d {\n-\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n-\t\t0x05, 0xa0, 0x54, 0x54, 0x68,\n-\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n-\t\t0x6e, 0x74, 0x2e, 0x58, 0x20,\n-\t\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n-\t\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n-\t\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n-\t\t0x47, 0x72, 0xf2, 0x23, 0xad,\n-\t\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n-\t\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n-\t\t0x8c, 0x58 },\n-\n-\tenc_hmac_02[] \u003d {\n-\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n-\t\t0x06, 0xa0, 0x54, 0x54, 0x68,\n-\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n-\t\t0x6e, 0x74, 0x2e, 0x58, 0x30,\n-\t\t0x99, 0x8d, 0x26, 0xc6, 0x45,\n-\t\t0x9a, 0xae, 0xec, 0xf4, 0x4e,\n-\t\t0xd2, 0x0c, 0xe0, 0x0c, 0x8c,\n-\t\t0xce, 0xdf, 0x0a, 0x1f, 0x3d,\n-\t\t0x22, 0xa9, 0x2f, 0xc0, 0x5d,\n-\t\t0xb0, 0x8c, 0x5a, 0xeb, 0x1c,\n-\t\t0xb5, 0x94, 0xca, 0xaf, 0x5a,\n-\t\t0x5c, 0x5e, 0x2e, 0x9d, 0x01,\n-\t\t0xcc, 0xe7, 0xe7, 0x7a, 0x93,\n-\t\t0xaa, 0x8c, 0x62 },\n-\n-\tenc_hmac_03[] \u003d {\n-\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n-\t\t0x07, 0xa0, 0x54, 0x54, 0x68,\n-\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n-\t\t0x6e, 0x74, 0x2e, 0x58, 0x40,\n-\t\t0x4a, 0x55, 0x5b, 0xf9, 0x71,\n-\t\t0xf7, 0xc1, 0x89, 0x1d, 0x9d,\n-\t\t0xdf, 0x30, 0x4a, 0x1a, 0x13,\n-\t\t0x2e, 0x2d, 0x6f, 0x81, 0x74,\n-\t\t0x49, 0x47, 0x4d, 0x81, 0x3e,\n-\t\t0x6d, 0x04, 0xd6, 0x59, 0x62,\n-\t\t0xbe, 0xd8, 0xbb, 0xa7, 0x0c,\n-\t\t0x17, 0xe1, 0xf5, 0x30, 0x8f,\n-\t\t0xa3, 0x99, 0x62, 0x95, 0x9a,\n-\t\t0x4b, 0x9b, 0x8d, 0x7d, 0xa8,\n-\t\t0xe6, 0xd8, 0x49, 0xb2, 0x09,\n-\t\t0xdc, 0xd3, 0xe9, 0x8c, 0xc0,\n-\t\t0xf1, 0x1e, 0xdd, 0xf2 },\n-\n-\tenc_hmac_04[] \u003d {\n-\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n-\t\t0x05, 0xa0, 0x54, 0x54, 0x68,\n-\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n-\t\t0x6e, 0x74, 0x2e, 0x58, 0x20,\n-\t\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n-\t\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n-\t\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n-\t\t0x47, 0x72, 0xf2, 0x23, 0xad,\n-\t\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n-\t\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n-\t\t0x8c, 0x59 },\n-\n-\tenc_hmac_05[] \u003d {\n-\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n-\t\t0x04, 0xa0, 0x54, 0x54, 0x68,\n-\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n-\t\t0x6e, 0x74, 0x2e, 0x48, 0x11,\n-\t\t0xf9, 0xe3, 0x57, 0x97, 0x5f,\n-\t\t0xb8, 0x49 }\n-#if 0\n-,\n-\n-\tcountersign_sign_01[] \u003d {\n-\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n-\t\t0x03, 0x00, 0xa0, 0x54, 0x54,\n-\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n-\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n-\t\t0xa2, 0x07, 0x83, 0x43, 0xa1,\n-\t\t0x01, 0x27, 0xa1, 0x04, 0x42,\n-\t\t0x31, 0x31, 0x58, 0x40, 0x8e,\n-\t\t0x1b, 0xe2, 0xf9, 0x45, 0x3d,\n-\t\t0x26, 0x48, 0x12, 0xe5, 0x90,\n-\t\t0x49, 0x91, 0x32, 0xbe, 0xf3,\n-\t\t0xfb, 0xf9, 0xee, 0x9d, 0xb2,\n-\t\t0x7c, 0x2c, 0x16, 0x87, 0x88,\n-\t\t0xe3, 0xb7, 0xeb, 0xe5, 0x06,\n-\t\t0xc0, 0x4f, 0xd3, 0xd1, 0x9f,\n-\t\t0xaa, 0x9f, 0x51, 0x23, 0x2a,\n-\t\t0xf5, 0xc9, 0x59, 0xe4, 0xef,\n-\t\t0x47, 0x92, 0x88, 0x34, 0x64,\n-\t\t0x7f, 0x56, 0xdf, 0xbe, 0x93,\n-\t\t0x91, 0x12, 0x88, 0x4d, 0x08,\n-\t\t0xef, 0x25, 0x05, 0x04, 0x42,\n-\t\t0x31, 0x31, 0x58, 0x40, 0x77,\n-\t\t0xf3, 0xea, 0xcd, 0x11, 0x85,\n-\t\t0x2c, 0x4b, 0xf9, 0xcb, 0x1d,\n-\t\t0x72, 0xfa, 0xbe, 0x6b, 0x26,\n-\t\t0xfb, 0xa1, 0xd7, 0x60, 0x92,\n-\t\t0xb2, 0xb5, 0xb7, 0xec, 0x83,\n-\t\t0xb8, 0x35, 0x57, 0x65, 0x22,\n-\t\t0x64, 0xe6, 0x96, 0x90, 0xdb,\n-\t\t0xc1, 0x17, 0x2d, 0xdc, 0x0b,\n-\t\t0xf8, 0x84, 0x11, 0xc0, 0xd2,\n-\t\t0x5a, 0x50, 0x7f, 0xdb, 0x24,\n-\t\t0x7a, 0x20, 0xc4, 0x0d, 0x5e,\n-\t\t0x24, 0x5f, 0xab, 0xd3, 0xfc,\n-\t\t0x9e, 0xc1, 0x06 }\n-#endif\n-;\n-\n-extern const struct {\n-\tconst uint8_t\t\t*set;\n-\tsize_t\t\t\tlen;\n-} keyset1, key3, key8, key9, key10;\n-\n-static int\n-xcb(lws_cose_sig_ext_pay_t *x)\n-{\n-\tx-\u003eext \u003d sign1_pass_02_ext;\n-\tx-\u003exl \u003d sizeof(sign1_pass_02_ext);\n-\n-\treturn LCOSESIGEXTCB_RET_FINISHED;\n-}\n-\n-\n-\n-int\n-test_cose_sign(struct lws_context *context)\n-{\n-\tstruct lws_cose_validate_context *cps;\n-\tlws_cose_validate_create_info_t info;\n-\tlws_cose_validate_res_t *res;\n-\tlws_dll2_owner_t set;\n-\tlws_dll2_owner_t *o;\n-\tint n;\n-\n-\tmemset(\u0026info, 0, sizeof(info));\n-\tinfo.cx \u003d context;\n-\tinfo.keyset \u003d \u0026set;\n-\n-#if 1\n-\t{\n-\t\tint fd \u003d open(\u0022sign_hmac01.sig\u0022,\n-\t\t\t LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);\n-\n-\t\tif (fd \u003e\u003d 0) {\n-\t\t\twrite(fd, sign_hmac_01, sizeof(sign_hmac_01));\n-\t\t\tclose(fd);\n-\t\t}\n-\t}\n-#endif\n-\n-\t/*\n-\t * valid sign1 we have key for\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-pass-01\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_pass_01, sizeof(sign1_pass_01),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid sign1 but empty key set, so can't judge it\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-pass-01 - no key\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_pass_01, sizeof(sign1_pass_01),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid sign1\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-pass-02\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tinfo.ext_cb \u003d xcb;\n-\tinfo.ext_len \u003d sizeof(sign1_pass_02_ext);\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_pass_02, sizeof(sign1_pass_02),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid sign1 without enclosing tag\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-pass-03\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tinfo.ext_cb \u003d NULL;\n-\tinfo.ext_len \u003d 0;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_pass_03, sizeof(sign1_pass_03),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * sign1 with wrong tag\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-fail-01\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_01, sizeof(sign1_fail_01),\n-\t\t\t\t NULL);\n-\tif (!n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk should have failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * invalid sign1, signature tampered\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-fail-02\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_02, sizeof(sign1_fail_02),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\t/* validation result must be fail */\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * invalid sign1, alg tampered\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-fail-03\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_03, sizeof(sign1_fail_03),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\t/* validation result must be fail */\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * invalid sign1, alg sign tampered\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-fail-04\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_04, sizeof(sign1_fail_04),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\t/* validation result must be fail */\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * invalid sign1, protected attributes tampered\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-fail-06\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_06, sizeof(sign1_fail_06),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\t/* validation result must be fail */\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * invalid sign1, protected attribute removed\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign1/sign-fail-07\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_SINGLE;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign1_fail_07, sizeof(sign1_fail_07),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1)\n-\t\tgoto bail1;\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\t/* validation result must be fail */\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid sign we have key for\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-pass-01\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_pass_01, sizeof(sign_pass_01),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid sign we have key for\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-pass-02\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tinfo.ext_cb \u003d xcb;\n-\tinfo.ext_len \u003d sizeof(sign1_pass_02_ext);\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_pass_02, sizeof(sign_pass_02),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid sign we have key for\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-pass-03\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tinfo.ext_cb \u003d NULL;\n-\tinfo.ext_len \u003d 0;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_pass_03, sizeof(sign_pass_03),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * wrong cbor tag\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-fail-01\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_fail_01, sizeof(sign_fail_01),\n-\t\t\t\t NULL);\n-\tif (!n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk should fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * tampered signature\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-fail-02\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_fail_02, sizeof(sign_fail_02),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * tampered sign alg -999\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-fail-03\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_fail_03, sizeof(sign_fail_03),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * tampered sign alg 0\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-fail-04\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_fail_04, sizeof(sign_fail_04),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * add protected attribute\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-fail-06\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_fail_06, sizeof(sign_fail_06),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * remove protected attribute\n-\t */\n-\n-\tlwsl_user(\u0022%s: sign/sign-fail-07\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MULTI;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_fail_07, sizeof(sign_fail_07),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_notice(\u0022%s: results: %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult)\n-\t\tgoto bail1;\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\n-\t/*\n-\t * valid HMAC sign we have key for\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/hmac-01\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_01, sizeof(sign_hmac_01),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid HMAC sign we have key for\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/hmac-02\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_02, sizeof(sign_hmac_02),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\n-\t/*\n-\t * valid HMAC sign we have key for\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/hmac-03\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_03, sizeof(sign_hmac_03),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * invalid HMAC sign we have key for\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/hmac-04 fail mac tag\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_04, sizeof(sign_hmac_04),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is wrongly succeeding\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid HMAC sign we have key for HS256/64\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/hmac-05\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, keyset1.set, keyset1.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, sign_hmac_05, sizeof(sign_hmac_05),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid HMAC sign with implicit HS256 key\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/enc-01\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key3.set, key3.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC0;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_01, sizeof(enc_hmac_01),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid HMAC sign with implicit HS384 key\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/enc-02\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key8.set, key8.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC0;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_02, sizeof(enc_hmac_02),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid HMAC sign with implicit HS512 key\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/enc-03\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key9.set, key9.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC0;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_03, sizeof(enc_hmac_03),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * invalid HMAC sign with implicit HS256 key, tampered hmac tag\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/enc-04\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key3.set, key3.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC0;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_04, sizeof(enc_hmac_04),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (!res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result wrongly succeeds\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\t/*\n-\t * valid HMAC sign with implicit HS256 key, HS256/64\n-\t */\n-\n-\tlwsl_user(\u0022%s: hmac-examples/enc-05\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key3.set, key3.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_MAC0;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, enc_hmac_05, sizeof(enc_hmac_05),\n-\t\t\t\t NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-#if 0\n-\t/*\n-\t * valid Ed25519 signature with countersignature from same key + alg\n-\t */\n-\n-\tlwsl_user(\u0022%s: countersign/sign-01\u005cn\u0022, __func__);\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, key10.set, key10.len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.sigtype \u003d SIGTYPE_COUNTERSIGNED;\n-\tcps \u003d lws_cose_validate_create(\u0026info);\n-\tif (!cps) {\n-\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_cose_validate_chunk(cps, countersign_sign_01,\n-\t\t\t\t\t sizeof(countersign_sign_01), NULL);\n-\tif (n) {\n-\t\tlwsl_notice(\u0022%s: sign_val_chunk failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\to \u003d lws_cose_validate_results(cps);\n-\tif (o-\u003ecount !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: result count %d\u005cn\u0022, __func__, o-\u003ecount);\n-\t\tgoto bail1;\n-\t}\n-\n-\tres \u003d lws_container_of(o-\u003ehead, lws_cose_validate_res_t, list);\n-\tif (res-\u003eresult) {\n-\t\tlwsl_err(\u0022%s: result is fail\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_cose_validate_destroy(\u0026cps);\n-\tlws_cose_key_set_destroy(\u0026set);\n-#endif\n-\n-\treturn 0;\n-\n-bail1:\n-\tlws_cose_validate_destroy(\u0026cps);\n-bail:\n-\tlws_cose_key_set_destroy(\u0026set);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-dhcpc/CMakeLists.txt b/minimal-examples/api-tests/api-test-dhcpc/CMakeLists.txt\ndeleted file mode 100644\nindex 1bb2dcd..0000000\n--- a/minimal-examples/api-tests/api-test-dhcpc/CMakeLists.txt\n+++ /dev/null\n@@ -1,23 +0,0 @@\n-project(lws-api-test-dhcpc C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-dhcpc)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_SYS_DHCP_CLIENT 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-dhcpc/README.md b/minimal-examples/api-tests/api-test-dhcpc/README.md\ndeleted file mode 100644\nindex 74f79a0..0000000\n--- a/minimal-examples/api-tests/api-test-dhcpc/README.md\n+++ /dev/null\n@@ -1,27 +0,0 @@\n-# api test dhcpc\n-\n-The application confirms it can set DHCP on the given interface\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--i \u003cnetif\u003e|Network interface name to set by DHCP, eg, eth0 or wlo1\n-\n-```\n- $ ./lws-api-test-dhcpc -i wlo1\n-[2019/10/06 14:56:41:7683] U: LWS API selftest: Async DNS\n-[2019/10/06 14:56:42:4461] U: main: requesting DHCP for wlo1\n-[2019/10/06 14:56:42:5207] N: callback_dhcpc: DHCP configured wlo1\n-[2019/10/06 14:56:42:5246] U: lws_dhcpc_cb: dhcp set OK\n-[2019/10/06 14:56:42:5999] U: Completed: ALL PASS: 1 / 1\n-```\n-\n-\ndiff --git a/minimal-examples/api-tests/api-test-dhcpc/main.c b/minimal-examples/api-tests/api-test-dhcpc/main.c\ndeleted file mode 100644\nindex 3914f43..0000000\n--- a/minimal-examples/api-tests/api-test-dhcpc/main.c\n+++ /dev/null\n@@ -1,99 +0,0 @@\n-/*\n- * lws-api-test-dhcpc\n- *\n- * Written in 2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, ok, fail, exp \u003d 1;\n-struct lws_context *context;\n-const char *nif;\n-\n-static const char * const sa46_names[] \u003d {\n-\t\u0022LWSDH_SA46_IP\u0022,\n-\t\u0022LWSDH_SA46_DNS_SRV_1\u0022,\n-\t\u0022LWSDH_SA46_DNS_SRV_2\u0022,\n-\t\u0022LWSDH_SA46_DNS_SRV_3\u0022,\n-\t\u0022LWSDH_SA46_DNS_SRV_4\u0022,\n-\t\u0022LWSDH_SA46_IPV4_ROUTER\u0022,\n-\t\u0022LWSDH_SA46_NTP_SERVER\u0022,\n-\t\u0022LWSDH_SA46_DHCP_SERVER\u0022,\n-};\n-\n-static int\n-lws_dhcpc_cb(void *opaque, lws_dhcpc_ifstate_t *is)\n-{\n-\tunsigned int n;\n-\tchar buf[64];\n-\n-\tlwsl_user(\u0022%s: dhcp set OK\u005cn\u0022, __func__);\n-\n-\tfor (n \u003d 0; n \u003c LWS_ARRAY_SIZE(sa46_names); n++) {\n-\t\tlws_sa46_write_numeric_address(\u0026is-\u003esa46[n], buf, sizeof(buf));\n-\t\tlwsl_notice(\u0022%s: %s: %s\u005cn\u0022, __func__, sa46_names[n], buf);\n-\t}\n-\n-\tok \u003d 1;\n-\tinterrupted \u003d 1;\n-\treturn 0;\n-}\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int\n-main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tconst char *p;\n-\tint n \u003d 1;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n-\tlwsl_user(\u0022LWS API selftest: DHCP Client\u005cn\u0022);\n-\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-i\u0022)))\n-\t\tnif \u003d p;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tif (nif) {\n-\t\tlwsl_user(\u0022%s: requesting DHCP for %s\u005cn\u0022, __func__, nif);\n-\t\tlws_dhcpc_request(context, nif, AF_INET, lws_dhcpc_cb, NULL);\n-\t} else {\n-\t\tlwsl_err(\u0022%s: use -i \u003cnetwork-interface\u003e to select if\u005cn\u0022, __func__);\n-\t\tinterrupted \u003d 1;\n-\t}\n-\n-\t/* the usual lws event loop */\n-\n-\tn \u003d 1;\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\n-\tif (fail || ok !\u003d exp)\n-\t\tlwsl_user(\u0022Completed: PASS: %d / %d, FAIL: %d\u005cn\u0022, ok, exp,\n-\t\t\t\tfail);\n-\telse\n-\t\tlwsl_user(\u0022Completed: ALL PASS: %d / %d\u005cn\u0022, ok, exp);\n-\n-\treturn !(ok \u003d\u003d exp \u0026\u0026 !fail);\n-}\ndiff --git a/minimal-examples/api-tests/api-test-fts/CMakeLists.txt b/minimal-examples/api-tests/api-test-fts/CMakeLists.txt\ndeleted file mode 100644\nindex 5a81ae8..0000000\n--- a/minimal-examples/api-tests/api-test-fts/CMakeLists.txt\n+++ /dev/null\n@@ -1,23 +0,0 @@\n-project(lws-api-test-fts C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-fts)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_FTS 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-fts/README.md b/minimal-examples/api-tests/api-test-fts/README.md\ndeleted file mode 100644\nindex fe7881f..0000000\n--- a/minimal-examples/api-tests/api-test-fts/README.md\n+++ /dev/null\n@@ -1,53 +0,0 @@\n-# lws api test fts\n-\n-Demonstrates how to create indexes and perform full-text searches.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--c / --createindex|Create an index file, instead of searching\n--i / --index \u003cfile\u003e|Use this file as the index\n-\n-The two modes are:\n-\n- - create an index: `--createindex inputfile [inputfile...]`\n-\n-```\n- $ ./lws-api-test-fts -c ./the-picture-of-dorian-gray.txt\n-[2018/10/15 07:14:15:1175] USER: LWS API selftest: full-text search\n-[2018/10/15 07:14:15:1531] NOTICE: lws_fts_serialize: index 1 files (0MiB) cpu time 32ms, alloc: 1024KiB + 1024KiB, serialize: 3ms, file: 325KiB \n-```\n-\n- - perform search[es]: `searchterm [searchterm...]`\n-\n-```\n- $ ./lws-api-test-fts b\n-[2018/10/15 07:15:44:1442] USER: LWS API selftest: full-text search \n-[2018/10/15 07:15:44:1442] NOTICE: lws_fts_search: 'b' Matched: 3 instances, 8 children, 0ms\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC b: 3 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC be: 472 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC bee: 3 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC been: 236 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC beaut: 1 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC beauty: 55 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC because: 40 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC believe: 49 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC better: 54 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC before: 75 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC beg: 5 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC began: 44 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC but: 401 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC basil: 158 agg hits\n-[2018/10/15 07:15:44:1443] NOTICE: lws_fts_results_dump: AC broke: 22 agg hits\n-[2018/10/15 07:15:44:1444] NOTICE: lws_fts_results_dump: AC by: 242 agg hits\n-[2018/10/15 07:15:44:1444] NOTICE: lws_fts_results_dump: AC boy: 36 agg hits\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-fts/canned-1.txt b/minimal-examples/api-tests/api-test-fts/canned-1.txt\ndeleted file mode 100644\nindex b211f89..0000000\n--- a/minimal-examples/api-tests/api-test-fts/canned-1.txt\n+++ /dev/null\n@@ -1,26 +0,0 @@\n-API selftest: full-text search\n-AC be: 472 agg hits\n-AC but: 401 agg hits\n-AC by: 242 agg hits\n-AC been: 236 agg hits\n-AC basil: 158 agg hits\n-AC before: 75 agg hits\n-AC beauty: 55 agg hits\n-AC better: 54 agg hits\n-AC believe: 49 agg hits\n-AC began: 44 agg hits\n-AC because: 40 agg hits\n-AC boy: 36 agg hits\n-AC book: 31 agg hits\n-AC body: 28 agg hits\n-AC both: 26 agg hits\n-AC broke: 22 agg hits\n-AC beg: 5 agg hits\n-AC bore: 5 agg hits\n-AC b: 3 agg hits\n-AC bee: 3 agg hits\n-AC beaut: 1 agg hits\n-no filepath results\n-\n-\n-\ndiff --git a/minimal-examples/api-tests/api-test-fts/canned-2.txt b/minimal-examples/api-tests/api-test-fts/canned-2.txt\ndeleted file mode 100644\nindex 579f3ba..0000000\n--- a/minimal-examples/api-tests/api-test-fts/canned-2.txt\n+++ /dev/null\n@@ -1,42 +0,0 @@\n-API selftest: full-text search\n-no autocomplete results\n-../minimal-examples/api-tests/api-test-fts/the-picture-of-dorian-gray.txt: (8904 lines) 32 hits \n-360\n-17482\n-393\n-18984\n-562\n-28820\n-837\n-42903\n-1640\n-82057\n-2037\n-102214\n-2091\n-105019\n-2145\n-107351\n-2725\n-137188\n-2808\n-141127\n-2977\n-149971\n-3429\n-173810\n-4417\n-229186\n-4431\n-230058\n-4656\n-241181\n-4708\n-244372\n-../minimal-examples/api-tests/api-test-fts/les-mis-utf8.txt: (14399 lines) 3 hits \n-14106\n-14313\n-14396\n-\n-\n-\ndiff --git a/minimal-examples/api-tests/api-test-fts/les-mis-utf8.txt b/minimal-examples/api-tests/api-test-fts/les-mis-utf8.txt\ndeleted file mode 100644\nindex 20aa7e3..0000000\n--- a/minimal-examples/api-tests/api-test-fts/les-mis-utf8.txt\n+++ /dev/null\n@@ -1,14399 +0,0 @@\n-The Project Gutenberg EBook of Les misérables Tome I, by Victor Hugo\r\n-\r\n-This eBook is for the use of anyone anywhere at no cost and with\r\n-almost no restrictions whatsoever. You may copy it, give it away or\r\n-re-use it under the terms of the Project Gutenberg License included\r\n-with this eBook or online at www.gutenberg.org\r\n-\r\n-\r\n-Title: Les misérables Tome I\r\n- Fantine\r\n-\r\n-Author: Victor Hugo\r\n-\r\n-Release Date: January 10, 2006 [EBook #17489]\r\n-[Date last updated: July 28, 2010]\r\n-\r\n-Language: French\r\n-\r\n-\r\n-*** START OF THIS PROJECT GUTENBERG EBOOK LES MISÉRABLES TOME I ***\r\n-\r\n-\r\n-\r\n-\r\n-Produced by www.ebooksgratuits.com and Chuck Greif\r\n-\r\n-\r\n-\r\n-\r\n-Victor Hugo\r\n-\r\n-LES MISÉRABLES\r\n-\r\n-Tome I--FANTINE\r\n-\r\n-(1862)\r\n-\r\n-\r\n-TABLE DES MATIÈRES\r\n-\r\n-Livre premier--Un juste\r\n-\r\n-Chapitre I Monsieur Myriel\r\n-Chapitre II Monsieur Myriel devient monseigneur Bienvenu\r\n-Chapitre III À bon évêque dur évêché\r\n-Chapitre IV Les oeuvres semblables aux paroles\r\n-Chapitre V Que monseigneur Bienvenu faisait durer trop longtemps ses\r\n- soutanes\r\n-Chapitre VI Par qui il faisait garder sa maison\r\n-Chapitre VII Cravatte\r\n-Chapitre VIII Philosophie après boire\r\n-Chapitre IX Le frère raconté par la soeur\r\n-Chapitre X L'évêque en présence d'une lumière inconnue\r\n-Chapitre XI Une restriction\r\n-Chapitre XII Solitude de monseigneur Bienvenu\r\n-Chapitre XIII Ce qu'il croyait\r\n-Chapitre XIV Ce qu'il pensait\r\n-\r\n-\r\n-Livre deuxième--La chute\r\n-\r\n-Chapitre I Le soir d'un jour de marche\r\n-Chapitre II La prudence conseillée à la sagesse\r\n-Chapitre III Héroïsme de l'obéissance passive\r\n-Chapitre IV Détails sur les fromageries de Pontarlier\r\n-Chapitre V Tranquillité\r\n-Chapitre VI Jean Valjean\r\n-Chapitre VII Le dedans du désespoir\r\n-Chapitre VIII L'onde et l'ombre\r\n-Chapitre IX Nouveaux griefs\r\n-Chapitre X L'homme réveillé\r\n-Chapitre XI Ce qu'il fait\r\n-Chapitre XII L'évêque travaille\r\n-Chapitre XIII Petit-Gervais\r\n-\r\n-\r\n-Livre troisième--En l'année 1817\r\n-\r\n-Chapitre I L'année 1817\r\n-Chapitre II Double quatuor\r\n-Chapitre III Quatre à quatre\r\n-Chapitre IV Tholomyès est si joyeux qu'il chante une chanson espagnole\r\n-Chapitre V Chez Bombarda\r\n-Chapitre VI Chapitre où l'on s'adore\r\n-Chapitre VII Sagesse de Tholomyès\r\n-Chapitre VIII Mort d'un cheval\r\n-Chapitre IX Fin joyeuse de la joie\r\n-Livre quatrième--Confier, c'est quelquefois livrer\r\n-Chapitre I Une mère qui en rencontre une autre\r\n-Chapitre II Première esquisse de deux figures louches\r\n-Chapitre III L'Alouette\r\n-\r\n-\r\n-Livre cinquième--La descente\r\n-\r\n-Chapitre I Histoire d'un progrès dans les verroteries noires\r\n-Chapitre II M. Madeleine\r\n-Chapitre III Sommes déposées chez Laffitte\r\n-Chapitre IV M. Madeleine en deuil\r\n-Chapitre V Vagues éclairs à l'horizon\r\n-Chapitre VI Le père Fauchelevent\r\n-Chapitre VII Fauchelevent devient jardinier à Paris\r\n-Chapitre VIII Madame Victurnien dépense trente-cinq francs pour la morale\r\n-Chapitre IX Succès de Madame Victurnien\r\n-Chapitre X Suite du succès\r\n-Chapitre XI _Christus nos liberavit_\r\n-Chapitre XII Le désoeuvrement de M. Bamatabois\r\n-Chapitre XIII Solution de quelques questions de police municipale\r\n-\r\n-\r\n-Livre sixième--Javert\r\n-\r\n-Chapitre I Commencement du repos\r\n-Chapitre II Comment Jean peut devenir Champ\r\n-\r\n-\r\n-Livre septième--L'affaire Champmathieu\r\n-\r\n-Chapitre I La soeur Simplice\r\n-Chapitre II Perspicacité de maître Scaufflaire\r\n-Chapitre III Une tempête sous un crâne\r\n-Chapitre IV Formes que prend la souffrance pendant le sommeil\r\n-Chapitre V Bâtons dans les roues\r\n-Chapitre VI La soeur Simplice mise à l'épreuve\r\n-Chapitre VII Le voyageur arrivé prend ses précautions pour repartir\r\n-Chapitre VIII Entrée de faveur\r\n-Chapitre IX Un lieu où des convictions sont en train de se former\r\n-Chapitre X Le système de dénégations\r\n-Chapitre XI Champmathieu de plus en plus étonné\r\n-\r\n-\r\n-Livre huitième--Contre-coup\r\n-\r\n-Chapitre I Dans quel miroir M. Madeleine regarde ses cheveux\r\n-Chapitre II Fantine heureuse\r\n-Chapitre III Javert content\r\n-Chapitre IV L'autorité reprend ses droits\r\n-Chapitre V Tombeau convenable\r\n-\r\n-\r\n-\r\n-\r\n-Livre premier--Un juste\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre I\r\n-\r\n-Monsieur Myriel\r\n-\r\n-\r\n-En 1815, M. Charles-François-Bienvenu Myriel était évêque de Digne.\r\n-C'était un vieillard d'environ soixante-quinze ans; il occupait le siège\r\n-de Digne depuis 1806.\r\n-\r\n-Quoique ce détail ne touche en aucune manière au fond même de ce que\r\n-nous avons à raconter, il n'est peut-être pas inutile, ne fût-ce que\r\n-pour être exact en tout, d'indiquer ici les bruits et les propos qui\r\n-avaient couru sur son compte au moment où il était arrivé dans le\r\n-diocèse. Vrai ou faux, ce qu'on dit des hommes tient souvent autant de\r\n-place dans leur vie et surtout dans leur destinée que ce qu'ils font. M.\r\n-Myriel était fils d'un conseiller au parlement d'Aix; noblesse de robe.\r\n-On contait de lui que son père, le réservant pour hériter de sa charge,\r\n-l'avait marié de fort bonne heure, à dix-huit ou vingt ans, suivant un\r\n-usage assez répandu dans les familles parlementaires. Charles Myriel,\r\n-nonobstant ce mariage, avait, disait-on, beaucoup fait parler de lui. Il\r\n-était bien fait de sa personne, quoique d'assez petite taille, élégant,\r\n-gracieux, spirituel; toute la première partie de sa vie avait été donnée\r\n-au monde et aux galanteries. La révolution survint, les événements se\r\n-précipitèrent, les familles parlementaires décimées, chassées, traquées,\r\n-se dispersèrent. M. Charles Myriel, dès les premiers jours de la\r\n-révolution, émigra en Italie. Sa femme y mourut d'une maladie de\r\n-poitrine dont elle était atteinte depuis longtemps. Ils n'avaient point\r\n-d'enfants. Que se passa-t-il ensuite dans la destinée de M. Myriel?\r\n-L'écroulement de l'ancienne société française, la chute de sa propre\r\n-famille, les tragiques spectacles de 93, plus effrayants encore\r\n-peut-être pour les émigrés qui les voyaient de loin avec le\r\n-grossissement de l'épouvante, firent-ils germer en lui des idées de\r\n-renoncement et de solitude? Fut-il, au milieu d'une de ces distractions\r\n-et de ces affections qui occupaient sa vie, subitement atteint d'un de\r\n-ces coups mystérieux et terribles qui viennent quelquefois renverser, en\r\n-le frappant au coeur, l'homme que les catastrophes publiques\r\n-n'ébranleraient pas en le frappant dans son existence et dans sa\r\n-fortune? Nul n'aurait pu le dire; tout ce qu'on savait, c'est que,\r\n-lorsqu'il revint d'Italie, il était prêtre.\r\n-\r\n-En 1804, M. Myriel était curé de Brignolles. Il était déjà vieux, et\r\n-vivait dans une retraite profonde.\r\n-\r\n-Vers l'époque du couronnement, une petite affaire de sa cure, on ne sait\r\n-plus trop quoi, l'amena à Paris. Entre autres personnes puissantes, il\r\n-alla solliciter pour ses paroissiens M. le cardinal Fesch. Un jour que\r\n-l'empereur était venu faire visite à son oncle, le digne curé, qui\r\n-attendait dans l'antichambre, se trouva sur le passage de sa majesté.\r\n-Napoléon, se voyant regardé avec une certaine curiosité par ce\r\n-vieillard, se retourna, et dit brusquement:\r\n-\r\n---Quel est ce bonhomme qui me regarde?\r\n-\r\n---Sire, dit M. Myriel, vous regardez un bonhomme, et moi je regarde un\r\n-grand homme. Chacun de nous peut profiter.\r\n-\r\n-L'empereur, le soir même, demanda au cardinal le nom de ce curé, et\r\n-quelque temps après M. Myriel fut tout surpris d'apprendre qu'il était\r\n-nommé évêque de Digne.\r\n-\r\n-Qu'y avait-il de vrai, du reste, dans les récits qu'on faisait sur la\r\n-première partie de la vie de M. Myriel? Personne ne le savait. Peu de\r\n-familles avaient connu la famille Myriel avant la révolution.\r\n-\r\n-M. Myriel devait subir le sort de tout nouveau venu dans une petite\r\n-ville où il y a beaucoup de bouches qui parlent et fort peu de têtes qui\r\n-pensent. Il devait le subir, quoiqu'il fût évêque et parce qu'il était\r\n-évêque. Mais, après tout, les propos auxquels on mêlait son nom\r\n-n'étaient peut-être que des propos; du bruit, des mots, des paroles;\r\n-moins que des paroles, des _palabres_, comme dit l'énergique langue du\r\n-midi.\r\n-\r\n-Quoi qu'il en fût, après neuf ans d'épiscopat et de résidence à Digne,\r\n-tous ces racontages, sujets de conversation qui occupent dans le premier\r\n-moment les petites villes et les petites gens, étaient tombés dans un\r\n-oubli profond. Personne n'eût osé en parler, personne n'eût même osé\r\n-s'en souvenir.\r\n-\r\n-M. Myriel était arrivé à Digne accompagné d'une vieille fille,\r\n-mademoiselle Baptistine, qui était sa soeur et qui avait dix ans de\r\n-moins que lui.\r\n-\r\n-Ils avaient pour tout domestique une servante du même âge que\r\n-mademoiselle Baptistine, et appelée madame Magloire, laquelle, après\r\n-avoir été _la servante de M. le Curé_, prenait maintenant le double\r\n-titre de femme de chambre de mademoiselle et femme de charge de\r\n-monseigneur.\r\n-\r\n-Mademoiselle Baptistine était une personne longue, pâle, mince, douce;\r\n-elle réalisait l'idéal de ce qu'exprime le mot «respectable»; car il\r\n-semble qu'il soit nécessaire qu'une femme soit mère pour être vénérable.\r\n-Elle n'avait jamais été jolie; toute sa vie, qui n'avait été qu'une\r\n-suite de saintes oeuvres, avait fini par mettre sur elle une sorte de\r\n-blancheur et de clarté; et, en vieillissant, elle avait gagné ce qu'on\r\n-pourrait appeler la beauté de la bonté. Ce qui avait été de la maigreur\r\n-dans sa jeunesse était devenu, dans sa maturité, de la transparence; et\r\n-cette diaphanéité laissait voir l'ange. C'était une âme plus encore que\r\n-ce n'était une vierge. Sa personne semblait faite d'ombre; à peine assez\r\n-de corps pour qu'il y eût là un sexe; un peu de matière contenant une\r\n-lueur; de grands yeux toujours baissés; un prétexte pour qu'une âme\r\n-reste sur la terre.\r\n-\r\n-Madame Magloire était une petite vieille, blanche, grasse, replète,\r\n-affairée, toujours haletante, à cause de son activité d'abord, ensuite à \r\n-cause d'un asthme.\r\n-\r\n-À son arrivée, on installa M. Myriel en son palais épiscopal avec les\r\n-honneurs voulus par les décrets impériaux qui classent l'évêque\r\n-immédiatement après le maréchal de camp. Le maire et le président lui\r\n-firent la première visite, et lui de son côté fit la première visite au\r\n-général et au préfet.\r\n-\r\n-L'installation terminée, la ville attendit son évêque à l'oeuvre.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre II\r\n-\r\n-Monsieur Myriel devient monseigneur Bienvenu\r\n-\r\n-\r\n-Le palais épiscopal de Digne était attenant à l'hôpital.\r\n-\r\n-Le palais épiscopal était un vaste et bel hôtel bâti en pierre au\r\n-commencement du siècle dernier par monseigneur Henri Puget, docteur en\r\n-théologie de la faculté de Paris, abbé de Simore, lequel était évêque de\r\n-Digne en 1712. Ce palais était un vrai logis seigneurial. Tout y avait\r\n-grand air, les appartements de l'évêque, les salons, les chambres, la\r\n-cour d'honneur, fort large, avec promenoirs à arcades, selon l'ancienne\r\n-mode florentine, les jardins plantés de magnifiques arbres. Dans la\r\n-salle à manger, longue et superbe galerie qui était au rez-de-chaussée\r\n-et s'ouvrait sur les jardins, monseigneur Henri Puget avait donné à \r\n-manger en cérémonie le 29 juillet 1714 à messeigneurs Charles Brûlart de\r\n-Genlis, archevêque-prince d'Embrun, Antoine de Mesgrigny, capucin,\r\n-évêque de Grasse, Philippe de Vendôme, grand prieur de France, abbé de\r\n-Saint-Honoré de Lérins, François de Berton de Grillon, évêque-baron de\r\n-Vence, César de Sabran de Forcalquier, évêque-seigneur de Glandève, et\r\n-Jean Soanen, prêtre de l'oratoire, prédicateur ordinaire du roi,\r\n-évêque-seigneur de Senez. Les portraits de ces sept révérends\r\n-personnages décoraient cette salle, et cette date mémorable, 29 juillet\r\n-1714, y était gravée en lettres d'or sur une table de marbre blanc.\r\n-\r\n-L'hôpital était une maison étroite et basse à un seul étage avec un\r\n-petit jardin. Trois jours après son arrivée, l'évêque visita l'hôpital.\r\n-La visite terminée, il fit prier le directeur de vouloir bien venir\r\n-jusque chez lui.\r\n-\r\n---Monsieur le directeur de l'hôpital, lui dit-il, combien en ce moment\r\n-avez-vous de malades?\r\n-\r\n---Vingt-six, monseigneur.\r\n-\r\n---C'est ce que j'avais compté, dit l'évêque.\r\n-\r\n---Les lits, reprit le directeur, sont bien serrés les uns contre les\r\n-autres.\r\n-\r\n---C'est ce que j'avais remarqué.\r\n-\r\n---Les salles ne sont que des chambres, et l'air s'y renouvelle\r\n-difficilement.\r\n-\r\n---C'est ce qui me semble.\r\n-\r\n---Et puis, quand il y a un rayon de soleil, le jardin est bien petit\r\n-pour les convalescents.\r\n-\r\n---C'est ce que je me disais.\r\n-\r\n---Dans les épidémies, nous avons eu cette année le typhus, nous avons eu\r\n-une suette militaire il y a deux ans, cent malades quelquefois; nous ne\r\n-savons que faire.\r\n-\r\n---C'est la pensée qui m'était venue.\r\n-\r\n---Que voulez-vous, monseigneur? dit le directeur, il faut se résigner.\r\n-\r\n-Cette conversation avait lieu dans la salle à manger-galerie du\r\n-rez-de-chaussée. L'évêque garda un moment le silence, puis il se tourna\r\n-brusquement vers le directeur de l'hôpital:\r\n-\r\n---Monsieur, dit-il, combien pensez-vous qu'il tiendrait de lits rien que\r\n-dans cette salle?\r\n-\r\n---La salle à manger de monseigneur! s'écria le directeur stupéfait.\r\n-\r\n-L'évêque parcourait la salle du regard et semblait y faire avec les yeux\r\n-des mesures et des calculs.\r\n-\r\n---Il y tiendrait bien vingt lits! dit-il, comme se parlant à lui-même.\r\n-\r\n-Puis élevant la voix:\r\n-\r\n---Tenez, monsieur le directeur de l'hôpital, je vais vous dire. Il y a\r\n-évidemment une erreur. Vous êtes vingt-six personnes dans cinq ou six\r\n-petites chambres. Nous sommes trois ici, et nous avons place pour\r\n-soixante. Il y a erreur, je vous dis. Vous avez mon logis, et j'ai le\r\n-vôtre. Rendez-moi ma maison. C'est ici chez vous.\r\n-\r\n-Le lendemain, les vingt-six pauvres étaient installés dans le palais de\r\n-l'évêque et l'évêque était à l'hôpital.\r\n-\r\n-M. Myriel n'avait point de bien, sa famille ayant été ruinée par la\r\n-révolution. Sa soeur touchait une rente viagère de cinq cents francs\r\n-qui, au presbytère, suffisait à sa dépense personnelle. M. Myriel\r\n-recevait de l'état comme évêque un traitement de quinze mille francs. Le\r\n-jour même où il vint se loger dans la maison de l'hôpital, M. Myriel\r\n-détermina l'emploi de cette somme une fois pour toutes de la manière\r\n-suivante. Nous transcrivons ici une note écrite de sa main.\r\n-\r\n-_Note pour régler les dépenses de ma maison._\r\n-\r\n-_Pour le petit séminaire: quinze cents livres_\r\n-_Congrégation de la mission: cent livres_\r\n-_Pour les lazaristes de Montdidier: cent livres_\r\n-_Séminaire des missions étrangères à Paris: deux cents livres_\r\n-_Congrégation du Saint-Esprit: cent cinquante livres_\r\n-_Établissements religieux de la Terre-Sainte: cent livres_\r\n-_Sociétés de charité maternelle: trois cents livres_\r\n-_En sus, pour celle d'Arles: cinquante livres_\r\n-_OEuvre pour l'amélioration des prisons: quatre cents livres_\r\n-_OEuvre pour le soulagement et la délivrance des prisonniers: cinq cents\r\n-livres_\r\n-_Pour libérer des pères de famille prisonniers pour dettes: mille livres_\r\n-_Supplément au traitement des pauvres maîtres d'école du diocèse: deux\r\n-mille livres_\r\n-_Grenier d'abondance des Hautes-Alpes: cent livres_\r\n-_Congrégation des dames de Digne, de Manosque et de Sisteron,\r\n-pour l'enseignement gratuit des filles indigentes: quinze cents livres_\r\n-_Pour les pauvres: six mille livres_\r\n-_Ma dépense personnelle: mille livres_\r\n-\r\n-Total: _quinze mille livres_\r\n-\r\n-Pendant tout le temps qu'il occupa le siège de Digne, M. Myriel ne\r\n-changea presque rien à cet arrangement. Il appelait cela, comme on voit,\r\n-_avoir réglé les dépenses de sa maison_.\r\n-\r\n-Cet arrangement fut accepté avec une soumission absolue par mademoiselle\r\n-Baptistine. Pour cette sainte fille, M. de Digne était tout à la fois\r\n-son frère et son évêque, son ami selon la nature et son supérieur selon\r\n-l'église. Elle l'aimait et elle le vénérait tout simplement. Quand il\r\n-parlait, elle s'inclinait; quand il agissait, elle adhérait. La servante\r\n-seule, madame Magloire, murmura un peu. M. l'évêque, on l'a pu\r\n-remarquer, ne s'était réservé que mille livres, ce qui, joint à la\r\n-pension de mademoiselle Baptistine, faisait quinze cents francs par an.\r\n-Avec ces quinze cents francs, ces deux vieilles femmes et ce vieillard\r\n-vivaient.\r\n-\r\n-Et quand un curé de village venait à Digne, M. l'évêque trouvait encore\r\n-moyen de le traiter, grâce à la sévère économie de madame Magloire et à \r\n-l'intelligente administration de mademoiselle Baptistine.\r\n-\r\n-Un jour--il était à Digne depuis environ trois mois--l'évêque dit:\r\n-\r\n---Avec tout cela je suis bien gêné!\r\n-\r\n---Je le crois bien! s'écria madame Magloire, Monseigneur n'a seulement\r\n-pas réclamé la rente que le département lui doit pour ses frais de\r\n-carrosse en ville et de tournées dans le diocèse. Pour les évêques\r\n-d'autrefois c'était l'usage.\r\n-\r\n---Tiens! dit l'évêque, vous avez raison, madame Magloire.\r\n-\r\n-Il fit sa réclamation.\r\n-\r\n-Quelque temps après, le conseil général, prenant cette demande en\r\n-considération, lui vota une somme annuelle de trois mille francs, sous\r\n-cette rubrique: _Allocation à M. l'évêque pour frais de carrosse, frais\r\n-de poste et frais de tournées pastorales_.\r\n-\r\n-Cela fit beaucoup crier la bourgeoisie locale, et, à cette occasion, un\r\n-sénateur de l'empire, ancien membre du conseil des cinq-cents favorable\r\n-au dix-huit brumaire et pourvu près de la ville de Digne d'une\r\n-sénatorerie magnifique, écrivit au ministre des cultes, M. Bigot de\r\n-Préameneu, un petit billet irrité et confidentiel dont nous extrayons\r\n-ces lignes authentiques:\r\n-\r\n-«--Des frais de carrosse? pourquoi faire dans une ville de moins de\r\n-quatre mille habitants? Des frais de poste et de tournées? à quoi bon\r\n-ces tournées d'abord? ensuite comment courir la poste dans un pays de\r\n-montagnes? Il n'y a pas de routes. On ne va qu'à cheval. Le pont même de\r\n-la Durance à Château-Arnoux peut à peine porter des charrettes à boeufs.\r\n-Ces prêtres sont tous ainsi. Avides et avares. Celui-ci a fait le bon\r\n-apôtre en arrivant. Maintenant il fait comme les autres. Il lui faut\r\n-carrosse et chaise de poste. Il lui faut du luxe comme aux anciens\r\n-évêques. Oh! toute cette prêtraille! Monsieur le comte, les choses\r\n-n'iront bien que lorsque l'empereur nous aura délivrés des calotins. À\r\n-bas le pape! (les affaires se brouillaient avec Rome). Quant à moi, je\r\n-suis pour César tout seul. Etc., etc.»\r\n-\r\n-La chose, en revanche, réjouit fort madame Magloire.\r\n-\r\n---Bon, dit-elle à mademoiselle Baptistine, Monseigneur a commencé par\r\n-les autres, mais il a bien fallu qu'il finît par lui-même. Il a réglé\r\n-toutes ses charités. Voilà trois mille livres pour nous. Enfin!\r\n-\r\n-Le soir même, l'évêque écrivit et remit à sa soeur une note ainsi\r\n-conçue:\r\n-\r\n-_Frais de carrosse et de tournées._\r\n-\r\n-_Pour donner du bouillon de viande aux malades de l'hôpital: quinze\r\n-cents livres_\r\n-_Pour la société de charité maternelle d'Aix: deux cent cinquante livres_\r\n-_Pour la société de charité maternelle de Draguignan: deux cent cinquante\r\n-livres_\r\n-_Pour les enfants trouvés: cinq cents livres_\r\n-_Pour les orphelins: cinq cents livres_\r\n-\r\n-Total: _trois mille livres_\r\n-\r\n-Tel était le budget de M. Myriel.\r\n-\r\n-Quant au casuel épiscopal, rachats de bans, dispenses, ondoiements,\r\n-prédications, bénédictions d'églises ou de chapelles, mariages, etc.,\r\n-l'évêque le percevait sur les riches avec d'autant plus d'âpreté qu'il\r\n-le donnait aux pauvres.\r\n-\r\n-Au bout de peu de temps, les offrandes d'argent affluèrent. Ceux qui ont\r\n-et ceux qui manquent frappaient à la porte de M. Myriel, les uns venant\r\n-chercher l'aumône que les autres venaient y déposer. L'évêque, en moins\r\n-d'un an, devint le trésorier de tous les bienfaits et le caissier de\r\n-toutes les détresses. Des sommes considérables passaient par ses mains;\r\n-mais rien ne put faire qu'il changeât quelque chose à son genre de vie\r\n-et qu'il ajoutât le moindre superflu à son nécessaire.\r\n-\r\n-Loin de là . Comme il y a toujours encore plus de misère en bas que de\r\n-fraternité en haut, tout était donné, pour ainsi dire, avant d'être\r\n-reçu; c'était comme de l'eau sur une terre sèche; il avait beau recevoir\r\n-de l'argent, il n'en avait jamais. Alors il se dépouillait.\r\n-\r\n-L'usage étant que les évêques énoncent leurs noms de baptême en tête de\r\n-leurs mandements et de leurs lettres pastorales, les pauvres gens du\r\n-pays avaient choisi, avec une sorte d'instinct affectueux, dans les noms\r\n-et prénoms de l'évêque, celui qui leur présentait un sens, et ils ne\r\n-l'appelaient que monseigneur Bienvenu. Nous ferons comme eux, et nous le\r\n-nommerons ainsi dans l'occasion. Du reste, cette appellation lui\r\n-plaisait.\r\n-\r\n---J'aime ce nom-là , disait-il. Bienvenu corrige monseigneur.\r\n-\r\n-Nous ne prétendons pas que le portrait que nous faisons ici soit\r\n-vraisemblable; nous nous bornons à dire qu'il est ressemblant.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre III\r\n-\r\n-À bon évêque dur évêché\r\n-\r\n-\r\n-M. l'évêque, pour avoir converti son carrosse en aumônes, n'en faisait\r\n-pas moins ses tournées. C'est un diocèse fatigant que celui de Digne. Il\r\n-a fort peu de plaines, beaucoup de montagnes, presque pas de routes, on\r\n-l'a vu tout à l'heure; trente-deux cures, quarante et un vicariats et\r\n-deux cent quatre-vingt-cinq succursales. Visiter tout cela, c'est une\r\n-affaire. M. l'évêque en venait à bout. Il allait à pied quand c'était\r\n-dans le voisinage, en carriole dans la plaine, en cacolet dans la\r\n-montagne. Les deux vieilles femmes l'accompagnaient. Quand le trajet\r\n-était trop pénible pour elles, il allait seul.\r\n-\r\n-Un jour, il arriva à Senez, qui est une ancienne ville épiscopale, monté\r\n-sur un âne. Sa bourse, fort à sec dans ce moment, ne lui avait pas\r\n-permis d'autre équipage. Le maire de la ville vint le recevoir à la\r\n-porte de l'évêché et le regardait descendre de son âne avec des yeux\r\n-scandalisés. Quelques bourgeois riaient autour de lui.\r\n-\r\n---Monsieur le maire, dit l'évêque, et messieurs les bourgeois, je vois\r\n-ce qui vous scandalise; vous trouvez que c'est bien de l'orgueil à un\r\n-pauvre prêtre de monter une monture qui a été celle de Jésus-Christ. Je\r\n-l'ai fait par nécessité, je vous assure, non par vanité.\r\n-\r\n-Dans ses tournées, il était indulgent et doux, et prêchait moins qu'il\r\n-ne causait. Il ne mettait aucune vertu sur un plateau inaccessible. Il\r\n-n'allait jamais chercher bien loin ses raisonnements et ses modèles.\r\n-Aux habitants d'un pays il citait l'exemple du pays voisin. Dans les\r\n-cantons où l'on était dur pour les nécessiteux, il disait:\r\n-\r\n---Voyez les gens de Briançon. Ils ont donné aux indigents, aux veuves et\r\n-aux orphelins le droit de faire faucher leurs prairies trois jours avant\r\n-tous les autres. Ils leur rebâtissent gratuitement leurs maisons quand\r\n-elles sont en ruines. Aussi est-ce un pays béni de Dieu. Durant tout un\r\n-siècle de cent ans, il n'y a pas eu un meurtrier.\r\n-\r\n-Dans les villages âpres au gain et à la moisson, il disait:\r\n-\r\n---Voyez ceux d'Embrun. Si un père de famille, au temps de la récolte, a\r\n-ses fils au service à l'armée et ses filles en service à la ville, et\r\n-qu'il soit malade et empêché, le curé le recommande au prône; et le\r\n-dimanche, après la messe, tous les gens du village, hommes, femmes,\r\n-enfants, vont dans le champ du pauvre homme lui faire sa moisson, et lui\r\n-rapportent paille et grain dans son grenier.\r\n-\r\n-Aux familles divisées par des questions d'argent et d'héritage, il\r\n-disait:\r\n-\r\n---Voyez les montagnards de Devoluy, pays si sauvage qu'on n'y entend pas\r\n-le rossignol une fois en cinquante ans. Eh bien, quand le père meurt\r\n-dans une famille, les garçons s'en vont chercher fortune, et laissent le\r\n-bien aux filles, afin qu'elles puissent trouver des maris.\r\n-\r\n-Aux cantons qui ont le goût des procès et où les fermiers se ruinent en\r\n-papier timbré, il disait:\r\n-\r\n---Voyez ces bons paysans de la vallée de Queyras. Ils sont là trois\r\n-mille âmes. Mon Dieu! c'est comme une petite république. On n'y connaît\r\n-ni le juge, ni l'huissier. Le maire fait tout. Il répartit l'impôt, taxe\r\n-chacun en conscience, juge les querelles gratis, partage les patrimoines\r\n-sans honoraires, rend des sentences sans frais; et on lui obéit, parce\r\n-que c'est un homme juste parmi des hommes simples.\r\n-\r\n-Aux villages où il ne trouvait pas de maître d'école, il citait encore\r\n-ceux de Queyras:\r\n-\r\n---Savez-vous comment ils font? disait-il. Comme un petit pays de douze\r\n-ou quinze feux ne peut pas toujours nourrir un magister, ils ont des\r\n-maîtres d'école payés par toute la vallée qui parcourent les villages,\r\n-passant huit jours dans celui-ci, dix dans celui-là , et enseignant. Ces\r\n-magisters vont aux foires, où je les ai vus. On les reconnaît à des\r\n-plumes à écrire qu'ils portent dans la ganse de leur chapeau. Ceux qui\r\n-n'enseignent qu'à lire ont une plume, ceux qui enseignent la lecture et\r\n-le calcul ont deux plumes; ceux qui enseignent la lecture, le calcul et\r\n-le latin ont trois plumes. Ceux-là sont de grands savants. Mais quelle\r\n-honte d'être ignorants! Faites comme les gens de Queyras.\r\n-\r\n-Il parlait ainsi, gravement et paternellement, à défaut d'exemples\r\n-inventant des paraboles, allant droit au but, avec peu de phrases et\r\n-beaucoup d'images, ce qui était l'éloquence même de Jésus-Christ,\r\n-convaincu et persuadant.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IV\r\n-\r\n-Les oeuvres semblables aux paroles\r\n-\r\n-\r\n-Sa conversation était affable et gaie. Il se mettait à la portée des\r\n-deux vieilles femmes qui passaient leur vie près de lui; quand il riait,\r\n-c'était le rire d'un écolier.\r\n-\r\n-Madame Magloire l'appelait volontiers _Votre Grandeur_. Un jour, il se\r\n-leva de son fauteuil et alla à sa bibliothèque chercher un livre. Ce\r\n-livre était sur un des rayons d'en haut. Comme l'évêque était d'assez\r\n-petite taille, il ne put y atteindre.\r\n-\r\n---Madame Magloire, dit-il, apportez-moi une chaise. Ma grandeur ne va\r\n-pas jusqu'à cette planche.\r\n-\r\n-Une de ses parentes éloignées, madame la comtesse de Lô, laissait\r\n-rarement échapper une occasion d'énumérer en sa présence ce qu'elle\r\n-appelait «les espérances» de ses trois fils. Elle avait plusieurs\r\n-ascendants fort vieux et proches de la mort dont ses fils étaient\r\n-naturellement les héritiers. Le plus jeune des trois avait à recueillir\r\n-d'une grand'tante cent bonnes mille livres de rentes; le deuxième était\r\n-substitué au titre de duc de son oncle; l'aîné devait succéder à la\r\n-pairie de son aïeul. L'évêque écoutait habituellement en silence ces\r\n-innocents et pardonnables étalages maternels. Une fois pourtant, il\r\n-paraissait plus rêveur que de coutume, tandis que madame de Lô\r\n-renouvelait le détail de toutes ces successions et de toutes ces\r\n-«espérances». Elle s'interrompit avec quelque impatience:\r\n-\r\n---Mon Dieu, mon cousin! mais à quoi songez-vous donc?\r\n-\r\n---Je songe, dit l'évêque, à quelque chose de singulier qui est, je\r\n-crois, dans saint Augustin: «Mettez votre espérance dans celui auquel on\r\n-ne succède point.»\r\n-\r\n-Une autre fois, recevant une lettre de faire-part du décès d'un\r\n-gentilhomme du pays, où s'étalaient en une longue page, outre les\r\n-dignités du défunt, toutes les qualifications féodales et nobiliaires de\r\n-tous ses parents:\r\n-\r\n---Quel bon dos a la mort! s'écria-t-il. Quelle admirable charge de\r\n-titres on lui fait allègrement porter, et comme il faut que les hommes\r\n-aient de l'esprit pour employer ainsi la tombe à la vanité!\r\n-\r\n-Il avait dans l'occasion une raillerie douce qui contenait presque\r\n-toujours un sens sérieux. Pendant un carême, un jeune vicaire vint à \r\n-Digne et prêcha dans la cathédrale. Il fut assez éloquent. Le sujet de\r\n-son sermon était la charité. Il invita les riches à donner aux\r\n-indigents, afin d'éviter l'enfer qu'il peignit le plus effroyable qu'il\r\n-put et de gagner le paradis qu'il fit désirable et charmant. Il y avait\r\n-dans l'auditoire un riche marchand retiré, un peu usurier, nommé M.\r\n-Géborand, lequel avait gagné un demi-million à fabriquer de gros draps,\r\n-des serges, des cadis et des gasquets. De sa vie M. Géborand n'avait\r\n-fait l'aumône à un malheureux. À partir de ce sermon, on remarqua qu'il\r\n-donnait tous les dimanches un sou aux vieilles mendiantes du portail de\r\n-la cathédrale. Elles étaient six à se partager cela. Un jour, l'évêque\r\n-le vit faisant sa charité et dit à sa soeur avec un sourire:\r\n-\r\n---Voilà monsieur Géborand qui achète pour un sou de paradis.\r\n-\r\n-Quand il s'agissait de charité, il ne se rebutait pas, même devant un\r\n-refus, et il trouvait alors des mots qui faisaient réfléchir. Une fois,\r\n-il quêtait pour les pauvres dans un salon de la ville. Il y avait là le\r\n-marquis de Champtercier, vieux, riche, avare, lequel trouvait moyen\r\n-d'être tout ensemble ultra-royaliste et ultra-voltairien. Cette variété\r\n-a existé. L'évêque, arrivé à lui, lui toucha le bras.\r\n-\r\n---Monsieur le marquis, il faut que vous me donniez quelque chose.\r\n-\r\n-Le marquis se retourna et répondit sèchement:\r\n-\r\n---Monseigneur, j'ai mes pauvres.\r\n-\r\n---Donnez-les-moi, dit l'évêque.\r\n-\r\n-Un jour, dans la cathédrale, il fit ce sermon.\r\n-\r\n-«Mes très chers frères, mes bons amis, il y a en France treize cent\r\n-vingt mille maisons de paysans qui n'ont que trois ouvertures, dix-huit\r\n-cent dix-sept mille qui ont deux ouvertures, la porte et une fenêtre, et\r\n-enfin trois cent quarante-six mille cabanes qui n'ont qu'une ouverture,\r\n-la porte. Et cela, à cause d'une chose qu'on appelle l'impôt des portes\r\n-et fenêtres. Mettez-moi de pauvres familles, des vieilles femmes, des\r\n-petits enfants, dans ces logis-là , et voyez les fièvres et les maladies.\r\n-Hélas! Dieu donne l'air aux hommes, la loi le leur vend. Je n'accuse pas\r\n-la loi, mais je bénis Dieu. Dans l'Isère, dans le Var, dans les deux\r\n-Alpes, les hautes et les basses, les paysans n'ont pas même de\r\n-brouettes, ils transportent les engrais à dos d'hommes; ils n'ont pas de\r\n-chandelles, et ils brûlent des bâtons résineux et des bouts de corde\r\n-trempés dans la poix résine. C'est comme cela dans tout le pays haut du\r\n-Dauphiné. Ils font le pain pour six mois, ils le font cuire avec de la\r\n-bouse de vache séchée. L'hiver, ils cassent ce pain à coups de hache et\r\n-ils le font tremper dans l'eau vingt-quatre heures pour pouvoir le\r\n-manger.--Mes frères, ayez pitié! voyez comme on souffre autour de vous.»\r\n-\r\n-Né provençal, il s'était facilement familiarisé avec tous les patois du\r\n-midi. Il disait: «_Eh bé! moussu, sès sagé?_» comme dans le bas\r\n-Languedoc. «_Onté anaras passa?_» comme dans les basses Alpes. «_Puerte\r\n-un bouen moutou embe un bouen froumage grase_», comme dans le haut\r\n-Dauphiné. Ceci plaisait au peuple, et n'avait pas peu contribué à lui\r\n-donner accès près de tous les esprits. Il était dans la chaumière et\r\n-dans la montagne comme chez lui. Il savait dire les choses les plus\r\n-grandes dans les idiomes les plus vulgaires. Parlant toutes les langues,\r\n-il entrait dans toutes les âmes. Du reste, il était le même pour les\r\n-gens du monde et pour les gens du peuple. Il ne condamnait rien\r\n-hâtivement, et sans tenir compte des circonstances environnantes. Il\r\n-disait:\r\n-\r\n---Voyons le chemin par où la faute a passé.\r\n-\r\n-Étant, comme il se qualifiait lui-même en souriant, un _ex-pécheur_, il\r\n-n'avait aucun des escarpements du rigorisme, et il professait assez\r\n-haut, et sans le froncement de sourcil des vertueux féroces, une\r\n-doctrine qu'on pourrait résumer à peu près ainsi:\r\n-\r\n-«L'homme a sur lui la chair qui est tout à la fois son fardeau et sa\r\n-tentation. Il la traîne et lui cède.\r\n-\r\n-«Il doit la surveiller, la contenir, la réprimer, et ne lui obéir qu'à \r\n-la dernière extrémité. Dans cette obéissance-là , il peut encore y avoir\r\n-de la faute; mais la faute, ainsi faite, est vénielle. C'est une chute,\r\n-mais une chute sur les genoux, qui peut s'achever en prière.\r\n-\r\n-«Être un saint, c'est l'exception; être un juste, c'est la règle. Errez,\r\n-défaillez, péchez, mais soyez des justes.\r\n-\r\n-«Le moins de péché possible, c'est la loi de l'homme. Pas de péché du\r\n-tout est le rêve de l'ange. Tout ce qui est terrestre est soumis au\r\n-péché. Le péché est une gravitation.»\r\n-\r\n-Quand il voyait tout le monde crier bien fort et s'indigner bien vite:\r\n-\r\n---Oh! oh! disait-il en souriant, il y a apparence que ceci est un gros\r\n-crime que tout le monde commet. Voilà les hypocrisies effarées qui se\r\n-dépêchent de protester et de se mettre à couvert.\r\n-\r\n-Il était indulgent pour les femmes et les pauvres sur qui pèse le poids\r\n-de la société humaine. Il disait:\r\n-\r\n---Les fautes des femmes, des enfants, des serviteurs, des faibles, des\r\n-indigents et des ignorants sont la faute des maris, des pères, des\r\n-maîtres, des forts, des riches et des savants.\r\n-\r\n-Il disait encore:\r\n-\r\n---À ceux qui ignorent, enseignez-leur le plus de choses que vous\r\n-pourrez; la société est coupable de ne pas donner l'instruction gratis;\r\n-elle répond de la nuit qu'elle produit. Cette âme est pleine d'ombre, le\r\n-péché s'y commet. Le coupable n'est pas celui qui y fait le péché, mais\r\n-celui qui y a fait l'ombre.\r\n-\r\n-Comme on voit, il avait une manière étrange et à lui de juger les\r\n-choses. Je soupçonne qu'il avait pris cela dans l'évangile.\r\n-\r\n-Il entendit un jour conter dans un salon un procès criminel qu'on\r\n-instruisait et qu'on allait juger. Un misérable homme, par amour pour\r\n-une femme et pour l'enfant qu'il avait d'elle, à bout de ressources,\r\n-avait fait de la fausse monnaie. La fausse monnaie était encore punie de\r\n-mort à cette époque. La femme avait été arrêtée émettant la première\r\n-pièce fausse fabriquée par l'homme. On la tenait, mais on n'avait de\r\n-preuves que contre elle. Elle seule pouvait charger son amant et le\r\n-perdre en avouant. Elle nia. On insista. Elle s'obstina à nier. Sur ce,\r\n-le procureur du roi avait eu une idée. Il avait supposé une infidélité\r\n-de l'amant, et était parvenu, avec des fragments de lettres savamment\r\n-présentés, à persuader à la malheureuse qu'elle avait une rivale et que\r\n-cet homme la trompait. Alors, exaspérée de jalousie, elle avait dénoncé\r\n-son amant, tout avoué, tout prouvé. L'homme était perdu. Il allait être\r\n-prochainement jugé à Aix avec sa complice. On racontait le fait, et\r\n-chacun s'extasiait sur l'habileté du magistrat. En mettant la jalousie\r\n-en jeu, il avait fait jaillir la vérité par la colère, il avait fait\r\n-sortir la justice de la vengeance. L'évêque écoutait tout cela en\r\n-silence. Quand ce fut fini, il demanda:\r\n-\r\n---Où jugera-t-on cet homme et cette femme?\r\n-\r\n---À la cour d'assises.\r\n-\r\n-Il reprit:\r\n-\r\n---Et où jugera-t-on monsieur le procureur du roi?\r\n-\r\n-Il arriva à Digne une aventure tragique. Un homme fut condamné à mort\r\n-pour meurtre. C'était un malheureux pas tout à fait lettré, pas tout à \r\n-fait ignorant, qui avait été bateleur dans les foires et écrivain\r\n-public. Le procès occupa beaucoup la ville. La veille du jour fixé pour\r\n-l'exécution du condamné, l'aumônier de la prison tomba malade. Il\r\n-fallait un prêtre pour assister le patient à ses derniers moments. On\r\n-alla chercher le curé. Il paraît qu'il refusa en disant: Cela ne me\r\n-regarde pas. Je n'ai que faire de cette corvée et de ce saltimbanque;\r\n-moi aussi, je suis malade; d'ailleurs ce n'est pas là ma place. On\r\n-rapporta cette réponse à l'évêque qui dit:\r\n-\r\n---Monsieur le curé a raison. Ce n'est pas sa place, c'est la mienne.\r\n-\r\n-Il alla sur-le-champ à la prison, il descendit au cabanon du\r\n-«saltimbanque», il l'appela par son nom, lui prit la main et lui parla.\r\n-Il passa toute la journée et toute la nuit près de lui, oubliant la\r\n-nourriture et le sommeil, priant Dieu pour l'âme du condamné et priant\r\n-le condamné pour la sienne propre. Il lui dit les meilleures vérités qui\r\n-sont les plus simples. Il fut père, frère, ami; évêque pour bénir\r\n-seulement. Il lui enseigna tout, en le rassurant et en le consolant. Cet\r\n-homme allait mourir désespéré. La mort était pour lui comme un abîme.\r\n-Debout et frémissant sur ce seuil lugubre, il reculait avec horreur. Il\r\n-n'était pas assez ignorant pour être absolument indifférent. Sa\r\n-condamnation, secousse profonde, avait en quelque sorte rompu çà et là \r\n-autour de lui cette cloison qui nous sépare du mystère des choses et que\r\n-nous appelons la vie. Il regardait sans cesse au dehors de ce monde par\r\n-ces brèches fatales, et ne voyait que des ténèbres. L'évêque lui fit\r\n-voir une clarté.\r\n-\r\n-Le lendemain, quand on vint chercher le malheureux, l'évêque était là .\r\n-Il le suivit. Il se montra aux yeux de la foule en camail violet et avec\r\n-sa croix épiscopale au cou, côte à côte avec ce misérable lié de cordes.\r\n-\r\n-Il monta sur la charrette avec lui, il monta sur l'échafaud avec lui. Le\r\n-patient, si morne et si accablé la veille, était rayonnant. Il sentait\r\n-que son âme était réconciliée et il espérait Dieu. L'évêque l'embrassa,\r\n-et, au moment où le couteau allait tomber, il lui dit:\r\n-\r\n---Celui que l'homme tue, Dieu le ressuscite; celui que les frères\r\n-chassent retrouve le Père. Priez, croyez, entrez dans la vie! le Père\r\n-est là .\r\n-\r\n-Quand il redescendit de l'échafaud, il avait quelque chose dans son\r\n-regard qui fit ranger le peuple. On ne savait ce qui était le plus\r\n-admirable de sa pâleur ou de sa sérénité. En rentrant à cet humble logis\r\n-qu'il appelait en souriant son palais, il dit à sa soeur:\r\n-\r\n---Je viens d'officier pontificalement.\r\n-\r\n-Comme les choses les plus sublimes sont souvent aussi les choses les\r\n-moins comprises, il y eut dans la ville des gens qui dirent, en\r\n-commentant cette conduite de l'évêque: «C'est de l'affectation.» Ceci ne\r\n-fut du reste qu'un propos de salons. Le peuple, qui n'entend pas malice\r\n-aux actions saintes, fut attendri et admira.\r\n-\r\n-Quant à l'évêque, avoir vu la guillotine fut pour lui un choc, et il fut\r\n-longtemps à s'en remettre.\r\n-\r\n-L'échafaud, en effet, quand il est là , dressé et debout, a quelque chose\r\n-qui hallucine. On peut avoir une certaine indifférence sur la peine de\r\n-mort, ne point se prononcer, dire oui et non, tant qu'on n'a pas vu de\r\n-ses yeux une guillotine; mais si l'on en rencontre une, la secousse est\r\n-violente, il faut se décider et prendre parti pour ou contre. Les uns\r\n-admirent, comme de Maistre; les autres exècrent, comme Beccaria. La\r\n-guillotine est la concrétion de la loi; elle se nomme _vindicte;_ elle\r\n-n'est pas neutre, et ne vous permet pas de rester neutre. Qui l'aperçoit\r\n-frissonne du plus mystérieux des frissons. Toutes les questions sociales\r\n-dressent autour de ce couperet leur point d'interrogation. L'échafaud\r\n-est vision. L'échafaud n'est pas une charpente, l'échafaud n'est pas une\r\n-machine, l'échafaud n'est pas une mécanique inerte faite de bois, de fer\r\n-et de cordes. Il semble que ce soit une sorte d'être qui a je ne sais\r\n-quelle sombre initiative; on dirait que cette charpente voit, que cette\r\n-machine entend, que cette mécanique comprend, que ce bois, ce fer et ces\r\n-cordes veulent. Dans la rêverie affreuse où sa présence jette l'âme,\r\n-l'échafaud apparaît terrible et se mêlant de ce qu'il fait. L'échafaud\r\n-est le complice du bourreau; il dévore; il mange de la chair, il boit du\r\n-sang. L'échafaud est une sorte de monstre fabriqué par le juge et par le\r\n-charpentier, un spectre qui semble vivre d'une espèce de vie\r\n-épouvantable faite de toute la mort qu'il a donnée.\r\n-\r\n-Aussi l'impression fut-elle horrible et profonde; le lendemain de\r\n-l'exécution et beaucoup de jours encore après, l'évêque parut accablé.\r\n-La sérénité presque violente du moment funèbre avait disparu: le fantôme\r\n-de la justice sociale l'obsédait. Lui qui d'ordinaire revenait de toutes\r\n-ses actions avec une satisfaction si rayonnante, il semblait qu'il se\r\n-fît un reproche. Par moments, il se parlait à lui-même, et bégayait à \r\n-demi-voix des monologues lugubres. En voici un que sa soeur entendit un\r\n-soir et recueillit:\r\n-\r\n---Je ne croyais pas que cela fût si monstrueux. C'est un tort de\r\n-s'absorber dans la loi divine au point de ne plus s'apercevoir de la loi\r\n-humaine. La mort n'appartient qu'à Dieu. De quel droit les hommes\r\n-touchent-ils à cette chose inconnue?\r\n-\r\n-Avec le temps ces impressions s'atténuèrent, et probablement\r\n-s'effacèrent. Cependant on remarqua que l'évêque évitait désormais de\r\n-passer sur la place des exécutions. On pouvait appeler M. Myriel à toute\r\n-heure au chevet des malades et des mourants. Il n'ignorait pas que là \r\n-était son plus grand devoir et son plus grand travail. Les familles\r\n-veuves ou orphelines n'avaient pas besoin de le demander, il arrivait de\r\n-lui-même. Il savait s'asseoir et se taire de longues heures auprès de\r\n-l'homme qui avait perdu la femme qu'il aimait, de la mère qui avait\r\n-perdu son enfant. Comme il savait le moment de se taire, il savait aussi\r\n-le moment de parler. Ô admirable consolateur! il ne cherchait pas à \r\n-effacer la douleur par l'oubli, mais à l'agrandir et à la dignifier par\r\n-l'espérance. Il disait:\r\n-\r\n---Prenez garde à la façon dont vous vous tournez vers les morts. Ne\r\n-songez pas à ce qui pourrit. Regardez fixement. Vous apercevrez la lueur\r\n-vivante de votre mort bien-aimé au fond du ciel.\r\n-\r\n-Il savait que la croyance est saine. Il cherchait à conseiller et à \r\n-calmer l'homme désespéré en lui indiquant du doigt l'homme résigné, et à \r\n-transformer la douleur qui regarde une fosse en lui montrant la douleur\r\n-qui regarde une étoile.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre V\r\n-\r\n-Que monseigneur Bienvenu faisait durer trop longtemps ses soutanes\r\n-\r\n-\r\n-La vie intérieure de M. Myriel était pleine des mêmes pensées que sa vie\r\n-publique. Pour qui eût pu la voir de près, c'eût été un spectacle grave\r\n-et charmant que cette pauvreté volontaire dans laquelle vivait M.\r\n-l'évêque de Digne.\r\n-\r\n-Comme tous les vieillards et comme la plupart des penseurs, il dormait\r\n-peu. Ce court sommeil était profond. Le matin il se recueillait pendant\r\n-une heure, puis il disait sa messe, soit à la cathédrale, soit dans son\r\n-oratoire. Sa messe dite, il déjeunait d'un pain de seigle trempé dans le\r\n-lait de ses vaches. Puis il travaillait.\r\n-\r\n-Un évêque est un homme fort occupé; il faut qu'il reçoive tous les jours\r\n-le secrétaire de l'évêché, qui est d'ordinaire un chanoine, presque tous\r\n-les jours ses grands vicaires. Il a des congrégations à contrôler, des\r\n-privilèges à donner, toute une librairie ecclésiastique à examiner,\r\n-paroissiens, catéchismes diocésains, livres d'heures, etc., des\r\n-mandements à écrire, des prédications à autoriser, des curés et des\r\n-maires à mettre d'accord, une correspondance cléricale, une\r\n-correspondance administrative, d'un côté l'état, de l'autre le\r\n-Saint-Siège, mille affaires.\r\n-\r\n-Le temps que lui laissaient ces mille affaires, ses offices et son\r\n-bréviaire, il le donnait d'abord aux nécessiteux, aux malades et aux\r\n-affligés; le temps que les affligés, les malades et les nécessiteux lui\r\n-laissaient, il le donnait au travail. Tantôt il bêchait la terre dans\r\n-son jardin, tantôt il lisait et écrivait. Il n'avait qu'un mot pour ces\r\n-deux sortes de travail; il appelait cela _jardiner_.\r\n-\r\n---L'esprit est un jardin, disait-il.\r\n-\r\n-À midi, il dînait. Le dîner ressemblait au déjeuner.\r\n-\r\n-Vers deux heures, quand le temps était beau, il sortait et se promenait\r\n-à pied dans la campagne ou dans la ville, entrant souvent dans les\r\n-masures. On le voyait cheminer seul, tout à ses pensées, l'oeil baissé,\r\n-appuyé sur sa longue canne, vêtu de sa douillette violette ouatée et\r\n-bien chaude, chaussé de bas violets dans de gros souliers, et coiffé de\r\n-son chapeau plat qui laissait passer par ses trois cornes trois glands\r\n-d'or à graine d'épinards.\r\n-\r\n-C'était une fête partout où il paraissait. On eût dit que son passage\r\n-avait quelque chose de réchauffant et de lumineux. Les enfants et les\r\n-vieillards venaient sur le seuil des portes pour l'évêque comme pour le\r\n-soleil. Il bénissait et on le bénissait. On montrait sa maison à \r\n-quiconque avait besoin de quelque chose.\r\n-\r\n-Çà et là , il s'arrêtait, parlait aux petits garçons et aux petites\r\n-filles et souriait aux mères. Il visitait les pauvres tant qu'il avait\r\n-de l'argent; quand il n'en avait plus, il visitait les riches.\r\n-\r\n-Comme il faisait durer ses soutanes beaucoup de temps, et qu'il ne\r\n-voulait pas qu'on s'en aperçût, il ne sortait jamais dans la ville\r\n-autrement qu'avec sa douillette violette. Cela le gênait un peu en été.\r\n-\r\n-Le soir à huit heures et demie il soupait avec sa soeur, madame Magloire\r\n-debout derrière eux et les servant à table. Rien de plus frugal que ce\r\n-repas. Si pourtant l'évêque avait un de ses curés à souper, madame\r\n-Magloire en profitait pour servir à Monseigneur quelque excellent\r\n-poisson des lacs ou quelque fin gibier de la montagne. Tout curé était\r\n-un prétexte à bon repas; l'évêque se laissait faire. Hors de là , son\r\n-ordinaire ne se composait guère que de légumes cuits dans l'eau et de\r\n-soupe à l'huile. Aussi disait-on dans la ville:\r\n-\r\n---Quand l'évêque fait pas chère de curé, il fait chère de trappiste.\r\n-\r\n-Après son souper, il causait pendant une demi-heure avec mademoiselle\r\n-Baptistine et madame Magloire; puis il rentrait dans sa chambre et se\r\n-remettait à écrire, tantôt sur des feuilles volantes, tantôt sur la\r\n-marge de quelque in-folio. Il était lettré et quelque peu savant. Il a\r\n-laissé cinq ou six manuscrits assez curieux; entre autres une\r\n-dissertation sur le verset de la Genèse: _Au commencement l'esprit de\r\n-Dieu flottait sur les eaux_. Il confronte avec ce verset trois textes:\r\n-la version arabe qui dit: _Les vents de Dieu soufflaient;_ Flavius\r\n-Josèphe qui dit: _Un vent d'en haut se précipitait sur la terre_, et\r\n-enfin la paraphrase chaldaïque d'Onkelos qui porte: _Un vent venant de\r\n-Dieu soufflait sur la face des eaux_. Dans une autre dissertation, il\r\n-examine les oeuvres théologiques de Hugo, évêque de Ptolémaïs,\r\n-arrière-grand-oncle de celui qui écrit ce livre, et il établit qu'il\r\n-faut attribuer à cet évêque les divers opuscules publiés, au siècle\r\n-dernier, sous le pseudonyme de Barleycourt.\r\n-\r\n-Parfois au milieu d'une lecture, quel que fût le livre qu'il eût entre\r\n-les mains, il tombait tout à coup dans une méditation profonde, d'où il\r\n-ne sortait que pour écrire quelques lignes sur les pages mêmes du\r\n-volume. Ces lignes souvent n'ont aucun rapport avec le livre qui les\r\n-contient. Nous avons sous les yeux une note écrite par lui sur une des\r\n-marges d'un in-quarto intitulé: _Correspondance du lord Germain avec les\r\n-généraux Clinton, Cornwallis et les amiraux de la station de l'Amérique.\r\n-À Versailles, chez Poinçot, libraire, et à Paris, chez Pissot, libraire,\r\n-quai des Augustins_.\r\n-\r\n-Voici cette note:\r\n-\r\n-«Ô vous qui êtes!\r\n-\r\n-«L'Ecclésiaste vous nomme Toute-Puissance, les Macchabées vous nomment\r\n-Créateur, l'Épître aux Éphésiens vous nomme Liberté, Baruch vous nomme\r\n-Immensité, les Psaumes vous nomment Sagesse et Vérité, Jean vous nomme\r\n-Lumière, les Rois vous nomment Seigneur, l'Exode vous appelle\r\n-Providence, le Lévitique Sainteté, Esdras Justice, la création vous\r\n-nomme Dieu, l'homme vous nomme Père; mais Salomon vous nomme\r\n-Miséricorde, et c'est là le plus beau de tous vos noms.»\r\n-\r\n-Vers neuf heures du soir, les deux femmes se retiraient et montaient à \r\n-leurs chambres au premier, le laissant jusqu'au matin seul au\r\n-rez-de-chaussée.\r\n-\r\n-Ici il est nécessaire que nous donnions une idée exacte du logis de M.\r\n-l'évêque de Digne.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VI\r\n-\r\n-Par qui il faisait garder sa maison\r\n-\r\n-\r\n-La maison qu'il habitait se composait, nous l'avons dit, d'un\r\n-rez-de-chaussée et d'un seul étage: trois pièces au rez-de-chaussée,\r\n-trois chambres au premier, au-dessus un grenier. Derrière la maison, un\r\n-jardin d'un quart d'arpent. Les deux femmes occupaient le premier.\r\n-L'évêque logeait en bas. La première pièce, qui s'ouvrait sur la rue,\r\n-lui servait de salle à manger, la deuxième de chambre à coucher, et la\r\n-troisième d'oratoire. On ne pouvait sortir de cet oratoire sans passer\r\n-par la chambre à coucher, et sortir de la chambre à coucher sans passer\r\n-par la salle à manger. Dans l'oratoire, au fond, il y avait une alcôve\r\n-fermée, avec un lit pour les cas d'hospitalité. M. l'évêque offrait ce\r\n-lit aux curés de campagne que des affaires ou les besoins de leur\r\n-paroisse amenaient à Digne.\r\n-\r\n-La pharmacie de l'hôpital, petit bâtiment ajouté à la maison et pris sur\r\n-le jardin, avait été transformée en cuisine et en cellier.\r\n-\r\n-Il y avait en outre dans le jardin une étable qui était l'ancienne\r\n-cuisine de l'hospice et où l'évêque entretenait deux vaches. Quelle que\r\n-fût la quantité de lait qu'elles lui donnassent, il en envoyait\r\n-invariablement tous les matins la moitié aux malades de l'hôpital.--Je\r\n-paye ma dîme, disait-il.\r\n-\r\n-Sa chambre était assez grande et assez difficile à chauffer dans la\r\n-mauvaise saison. Comme le bois est très cher à Digne, il avait imaginé\r\n-de faire faire dans l'étable à vaches un compartiment fermé d'une\r\n-cloison en planches. C'était là qu'il passait ses soirées dans les\r\n-grands froids. Il appelait cela son _salon d'hiver_.\r\n-\r\n-Il n'y avait dans ce salon d'hiver, comme dans la salle à manger,\r\n-d'autres meubles qu'une table de bois blanc, carrée, et quatre chaises\r\n-de paille. La salle à manger était ornée en outre d'un vieux buffet\r\n-peint en rose à la détrempe. Du buffet pareil, convenablement habillé de\r\n-napperons blancs et de fausses dentelles, l'évêque avait fait l'autel\r\n-qui décorait son oratoire.\r\n-\r\n-Ses pénitentes riches et les saintes femmes de Digne s'étaient souvent\r\n-cotisées pour faire les frais d'un bel autel neuf à l'oratoire de\r\n-monseigneur; il avait chaque fois pris l'argent et l'avait donné aux\r\n-pauvres.\r\n-\r\n---Le plus beau des autels, disait-il, c'est l'âme d'un malheureux\r\n-consolé qui remercie Dieu.\r\n-\r\n-Il avait dans son oratoire deux chaises prie-Dieu en paille, et un\r\n-fauteuil à bras également en paille dans sa chambre à coucher. Quand par\r\n-hasard il recevait sept ou huit personnes à la fois, le préfet, ou le\r\n-général, ou l'état-major du régiment en garnison, ou quelques élèves du\r\n-petit séminaire, on était obligé d'aller chercher dans l'étable les\r\n-chaises du salon d'hiver, dans l'oratoire les prie-Dieu, et le fauteuil\r\n-dans la chambre à coucher; de cette façon, on pouvait réunir jusqu'à \r\n-onze sièges pour les visiteurs. À chaque nouvelle visite on démeublait\r\n-une pièce.\r\n-\r\n-Il arrivait parfois qu'on était douze; alors l'évêque dissimulait\r\n-l'embarras de la situation en se tenant debout devant la cheminée si\r\n-c'était l'hiver, ou en proposant un tour dans le jardin si c'était\r\n-l'été.\r\n-\r\n-Il y avait bien encore dans l'alcôve fermée une chaise, mais elle était\r\n-à demi dépaillée et ne portait que sur trois pieds, ce qui faisait\r\n-qu'elle ne pouvait servir qu'appuyée contre le mur. Mademoiselle\r\n-Baptistine avait bien aussi dans sa chambre une très grande bergère en\r\n-bois jadis doré et revêtue de pékin à fleurs, mais on avait été obligé\r\n-de monter cette bergère au premier par la fenêtre, l'escalier étant trop\r\n-étroit; elle ne pouvait donc pas compter parmi les en-cas du mobilier.\r\n-\r\n-L'ambition de mademoiselle Baptistine eût été de pouvoir acheter un\r\n-meuble de salon en velours d'Utrecht jaune à rosaces et en acajou à cou\r\n-de cygne, avec canapé. Mais cela eût coûté au moins cinq cents francs,\r\n-et, ayant vu qu'elle n'avait réussi à économiser pour cet objet que\r\n-quarante-deux francs dix sous en cinq ans, elle avait fini par y\r\n-renoncer. D'ailleurs qui est-ce qui atteint son idéal?\r\n-\r\n-Rien de plus simple à se figurer que la chambre à coucher de l'évêque.\r\n-Une porte-fenêtre donnant sur le jardin, vis-à -vis le lit; un lit\r\n-d'hôpital, en fer avec baldaquin de serge verte; dans l'ombre du lit,\r\n-derrière un rideau, les ustensiles de toilette trahissant encore les\r\n-anciennes habitudes élégantes de l'homme du monde; deux portes, l'une\r\n-près de la cheminée, donnant dans l'oratoire; l'autre, près de la\r\n-bibliothèque, donnant dans la salle à manger; la bibliothèque, grande\r\n-armoire vitrée pleine de livres; la cheminée, de bois peint en marbre,\r\n-habituellement sans feu; dans la cheminée, une paire de chenets en fer\r\n-ornés de deux vases à guirlandes et cannelures jadis argentés à l'argent\r\n-haché, ce qui était un genre de luxe épiscopal; au-dessus, à l'endroit\r\n-où d'ordinaire on met la glace, un crucifix de cuivre désargenté fixé\r\n-sur un velours noir râpé dans un cadre de bois dédoré. Près de la\r\n-porte-fenêtre, une grande table avec un encrier, chargée de papiers\r\n-confus et de gros volumes. Devant la table, le fauteuil de paille.\r\n-Devant le lit, un prie-Dieu, emprunté à l'oratoire.\r\n-\r\n-Deux portraits dans des cadres ovales étaient accrochés au mur des deux\r\n-côtés du lit. De petites inscriptions dorées sur le fond neutre de la\r\n-toile à côté des figures indiquaient que les portraits représentaient,\r\n-l'un, l'abbé de Chaliot, évêque de Saint-Claude, l'autre, l'abbé\r\n-Tourteau, vicaire général d'Agde, abbé de Grand-Champ, ordre de Cîteaux,\r\n-diocèse de Chartres. L'évêque, en succédant dans cette chambre aux\r\n-malades de l'hôpital, y avait trouvé ces portraits et les y avait\r\n-laissés. C'étaient des prêtres, probablement des donateurs: deux motifs\r\n-pour qu'il les respectât. Tout ce qu'il savait de ces deux personnages,\r\n-c'est qu'ils avaient été nommés par le roi, l'un à son évêché, l'autre à \r\n-son bénéfice, le même jour, le 27 avril 1785. Madame Magloire ayant\r\n-décroché les tableaux pour en secouer la poussière, l'évêque avait\r\n-trouvé cette particularité écrite d'une encre blanchâtre sur un petit\r\n-carré de papier jauni par le temps, collé avec quatre pains à cacheter\r\n-derrière le portrait de l'abbé de Grand-Champ.\r\n-\r\n-Il avait à sa fenêtre un antique rideau de grosse étoffe de laine qui\r\n-finit par devenir tellement vieux que, pour éviter la dépense d'un neuf,\r\n-madame Magloire fut obligée de faire une grande couture au beau milieu.\r\n-Cette couture dessinait une croix. L'évêque le faisait souvent\r\n-remarquer.\r\n-\r\n---Comme cela fait bien! disait-il.\r\n-\r\n-Toutes les chambres de la maison, au rez-de-chaussée ainsi qu'au\r\n-premier, sans exception, étaient blanchies au lait de chaux, ce qui est\r\n-une mode de caserne et d'hôpital.\r\n-\r\n-Cependant, dans les dernières années, madame Magloire retrouva, comme on\r\n-le verra plus loin, sous le papier badigeonné, des peintures qui\r\n-ornaient l'appartement de mademoiselle Baptistine. Avant d'être\r\n-l'hôpital, cette maison avait été le parloir aux bourgeois. De là cette\r\n-décoration. Les chambres étaient pavées de briques rouges qu'on lavait\r\n-toutes les semaines, avec des nattes de paille tressée devant tous les\r\n-lits. Du reste, ce logis, tenu par deux femmes, était du haut en bas\r\n-d'une propreté exquise. C'était le seul luxe que l'évêque permit. Il\r\n-disait:\r\n-\r\n---Cela ne prend rien aux pauvres.\r\n-\r\n-Il faut convenir cependant qu'il lui restait de ce qu'il avait possédé\r\n-jadis six couverts d'argent et une grande cuiller à soupe que madame\r\n-Magloire regardait tous les jours avec bonheur reluire splendidement sur\r\n-la grosse nappe de toile blanche. Et comme nous peignons ici l'évêque de\r\n-Digne tel qu'il était, nous devons ajouter qu'il lui était arrivé plus\r\n-d'une fois de dire:\r\n-\r\n---Je renoncerais difficilement à manger dans de l'argenterie.\r\n-\r\n-Il faut ajouter à cette argenterie deux gros flambeaux d'argent massif\r\n-qui lui venaient de l'héritage d'une grand'tante. Ces flambeaux\r\n-portaient deux bougies de cire et figuraient habituellement sur la\r\n-cheminée de l'évêque. Quand il avait quelqu'un à dîner, madame Magloire\r\n-allumait les deux bougies et mettait les deux flambeaux sur la table.\r\n-\r\n-Il y avait dans la chambre même de l'évêque, à la tête de son lit, un\r\n-petit placard dans lequel madame Magloire serrait chaque soir les six\r\n-couverts d'argent et la grande cuiller. Il faut dire qu'on n'en ôtait\r\n-jamais la clef.\r\n-\r\n-Le jardin, un peu gâté par les constructions assez laides dont nous\r\n-avons parlé, se composait de quatre allées en croix rayonnant autour\r\n-d'un puisard; une autre allée faisait tout le tour du jardin et\r\n-cheminait le long du mur blanc dont il était enclos. Ces allées\r\n-laissaient entre elles quatre carrés bordés de buis. Dans trois, madame\r\n-Magloire cultivait des légumes; dans le quatrième, l'évêque avait mis\r\n-des fleurs. Il y avait çà et là quelques arbres fruitiers.\r\n-\r\n-Une fois madame Magloire lui avait dit avec une sorte de malice douce:\r\n-\r\n---Monseigneur, vous qui tirez parti de tout, voilà pourtant un carré\r\n-inutile. Il vaudrait mieux avoir là des salades que des bouquets.\r\n-\r\n---Madame Magloire, répondit l'évêque, vous vous trompez. Le beau est\r\n-aussi utile que l'utile.\r\n-\r\n-Il ajouta après un silence:\r\n-\r\n---Plus peut-être.\r\n-\r\n-Ce carré, composé de trois ou quatre plates-bandes, occupait M. l'évêque\r\n-presque autant que ses livres. Il y passait volontiers une heure ou\r\n-deux, coupant, sarclant, et piquant çà et là des trous en terre où il\r\n-mettait des graines. Il n'était pas aussi hostile aux insectes qu'un\r\n-jardinier l'eût voulu. Du reste, aucune prétention à la botanique; il\r\n-ignorait les groupes et le solidisme; il ne cherchait pas le moins du\r\n-monde à décider entre Tournefort et la méthode naturelle; il ne prenait\r\n-parti ni pour les utricules contre les cotylédons, ni pour Jussieu\r\n-contre Linné. Il n'étudiait pas les plantes; il aimait les fleurs. Il\r\n-respectait beaucoup les savants, il respectait encore plus les\r\n-ignorants, et, sans jamais manquer à ces deux respects, il arrosait ses\r\n-plates-bandes chaque soir d'été avec un arrosoir de fer-blanc peint en\r\n-vert.\r\n-\r\n-La maison n'avait pas une porte qui fermât à clef. La porte de la salle\r\n-à manger qui, nous l'avons dit, donnait de plain-pied sur la place de la\r\n-cathédrale, était jadis armée de serrures et de verrous comme une porte\r\n-de prison. L'évêque avait fait ôter toutes ces ferrures, et cette porte,\r\n-la nuit comme le jour, n'était fermée qu'au loquet. Le premier passant\r\n-venu, à quelque heure que ce fût, n'avait qu'à la pousser. Dans les\r\n-commencements, les deux femmes avaient été fort tourmentées de cette\r\n-porte jamais close; mais M. de Digne leur avait dit:\r\n-\r\n---Faites mettre des verrous à vos chambres, si cela vous plaît.\r\n-\r\n-Elles avaient fini par partager sa confiance ou du moins par faire comme\r\n-si elles la partageaient. Madame Magloire seule avait de temps en temps\r\n-des frayeurs. Pour ce qui est de l'évêque, on peut trouver sa pensée\r\n-expliquée ou du moins indiquée dans ces trois lignes écrites par lui sur\r\n-la marge d'une bible: «Voici la nuance: la porte du médecin ne doit\r\n-jamais être fermée; la porte du prêtre doit toujours être ouverte.» Sur\r\n-un autre livre, intitulé _Philosophie de la science médicale_, il avait\r\n-écrit cette autre note: «Est-ce que je ne suis pas médecin comme eux?\r\n-Moi aussi j'ai mes malades; d'abord j'ai les leurs, qu'ils appellent les\r\n-malades; et puis j'ai les miens, que j'appelle les malheureux.»\r\n-\r\n-Ailleurs encore il avait écrit: «Ne demandez pas son nom à qui vous\r\n-demande un gîte. C'est surtout celui-là que son nom embarrasse qui a\r\n-besoin d'asile.»\r\n-\r\n-Il advint qu'un digne curé, je ne sais plus si c'était le curé de\r\n-Couloubroux ou le curé de Pompierry, s'avisa de lui demander un jour,\r\n-probablement à l'instigation de madame Magloire, si Monseigneur était\r\n-bien sûr de ne pas commettre jusqu'à un certain point une imprudence en\r\n-laissant jour et nuit sa porte ouverte à la disposition de qui voulait\r\n-entrer, et s'il ne craignait pas enfin qu'il n'arrivât quelque malheur\r\n-dans une maison si peu gardée. L'évêque lui toucha l'épaule avec une\r\n-gravité douce et lui dit:--_Nisi Dominus custodierit domum, in vanum\r\n-vigilant qui custodiunt eam_.\r\n-\r\n-Puis il parla d'autre chose.\r\n-\r\n-Il disait assez volontiers:\r\n-\r\n---Il y a la bravoure du prêtre comme il y a la bravoure du colonel de\r\n-dragons. Seulement, ajoutait-il, la nôtre doit être tranquille.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VII\r\n-\r\n-Cravatte\r\n-\r\n-\r\n-Ici se place naturellement un fait que nous ne devons pas omettre, car\r\n-il est de ceux qui font le mieux voir quel homme c'était que M. l'évêque\r\n-de Digne.\r\n-\r\n-Après la destruction de la bande de Gaspard Bès qui avait infesté les\r\n-gorges d'Ollioules, un de ses lieutenants, Cravatte, se réfugia dans la\r\n-montagne. Il se cacha quelque temps avec ses bandits, reste de la troupe\r\n-de Gaspard Bès, dans le comté de Nice, puis gagna le Piémont, et tout à \r\n-coup reparut en France, du côté de Barcelonnette. On le vit à Jauziers\r\n-d'abord, puis aux Tuiles. Il se cacha dans les cavernes du\r\n-Joug-de-l'Aigle, et de là il descendait vers les hameaux et les villages\r\n-par les ravins de l'Ubaye et de l'Ubayette. Il osa même pousser jusqu'à \r\n-Embrun, pénétra une nuit dans la cathédrale et dévalisa la sacristie.\r\n-Ses brigandages désolaient le pays. On mit la gendarmerie à ses\r\n-trousses, mais en vain. Il échappait toujours; quelquefois il résistait\r\n-de vive force. C'était un hardi misérable. Au milieu de toute cette\r\n-terreur, l'évêque arriva. Il faisait sa tournée. Au Chastelar, le maire\r\n-vint le trouver et l'engagea à rebrousser chemin. Cravatte tenait la\r\n-montagne jusqu'à l'Arche, et au-delà . Il y avait danger, même avec une\r\n-escorte. C'était exposer inutilement trois ou quatre malheureux\r\n-gendarmes.\r\n-\r\n---Aussi, dit l'évêque, je compte aller sans escorte.\r\n-\r\n---Y pensez-vous, monseigneur? s'écria le maire.\r\n-\r\n---J'y pense tellement, que je refuse absolument les gendarmes et que je\r\n-vais partir dans une heure.\r\n-\r\n---Partir?\r\n-\r\n---Partir.\r\n-\r\n---Seul?\r\n-\r\n---Seul.\r\n-\r\n---Monseigneur! vous ne ferez pas cela.\r\n-\r\n---Il y a là , dans la montagne, reprit l'évêque, une humble petite\r\n-commune grande comme ça, que je n'ai pas vue depuis trois ans. Ce sont\r\n-mes bons amis. De doux et honnêtes bergers. Ils possèdent une chèvre sur\r\n-trente qu'ils gardent. Ils font de fort jolis cordons de laine de\r\n-diverses couleurs, et ils jouent des airs de montagne sur de petites\r\n-flûtes à six trous. Ils ont besoin qu'on leur parle de temps en temps du\r\n-bon Dieu. Que diraient-ils d'un évêque qui a peur? Que diraient-ils si\r\n-je n'y allais pas?\r\n-\r\n---Mais, monseigneur, les brigands! Si vous rencontrez les brigands!\r\n-\r\n---Tiens, dit l'évêque, j'y songe. Vous avez raison. Je puis les\r\n-rencontrer. Eux aussi doivent avoir besoin qu'on leur parle du bon Dieu.\r\n-\r\n---Monseigneur! mais c'est une bande! c'est un troupeau de loups!\r\n-\r\n---Monsieur le maire, c'est peut-être précisément de ce troupeau que\r\n-Jésus me fait le pasteur. Qui sait les voies de la Providence?\r\n-\r\n---Monseigneur, ils vous dévaliseront.\r\n-\r\n---Je n'ai rien.\r\n-\r\n---Ils vous tueront.\r\n-\r\n---Un vieux bonhomme de prêtre qui passe en marmottant ses momeries? Bah!\r\n-à quoi bon?\r\n-\r\n---Ah! mon Dieu! si vous alliez les rencontrer!\r\n-\r\n---Je leur demanderai l'aumône pour mes pauvres.\r\n-\r\n---Monseigneur, n'y allez pas, au nom du ciel! vous exposez votre vie.\r\n-\r\n---Monsieur le maire, dit l'évêque, n'est-ce décidément que cela? Je ne\r\n-suis pas en ce monde pour garder ma vie, mais pour garder les âmes.\r\n-\r\n-Il fallut le laisser faire. Il partit, accompagné seulement d'un enfant\r\n-qui s'offrit à lui servir de guide. Son obstination fit bruit dans le\r\n-pays, et effraya très fort.\r\n-\r\n-Il ne voulut emmener ni sa soeur ni madame Magloire. Il traversa la\r\n-montagne à mulet, ne rencontra personne, et arriva sain et sauf chez ses\r\n-«bons amis» les bergers. Il y resta quinze jours, prêchant,\r\n-administrant, enseignant, moralisant. Lorsqu'il fut proche de son\r\n-départ, il résolut de chanter pontificalement un _Te Deum_. Il en parla\r\n-au curé. Mais comment faire? pas d'ornements épiscopaux. On ne pouvait\r\n-mettre à sa disposition qu'une chétive sacristie de village avec\r\n-quelques vieilles chasubles de damas usé ornées de galons faux.\r\n-\r\n---Bah! dit l'évêque. Monsieur le curé, annonçons toujours au prône notre\r\n-_Te Deum_. Cela s'arrangera.\r\n-\r\n-On chercha dans les églises d'alentour. Toutes les magnificences de ces\r\n-humbles paroisses réunies n'auraient pas suffi à vêtir convenablement un\r\n-chantre de cathédrale. Comme on était dans cet embarras, une grande\r\n-caisse fut apportée et déposée au presbytère pour M. l'évêque par deux\r\n-cavaliers inconnus qui repartirent sur-le-champ. On ouvrit la caisse;\r\n-elle contenait une chape de drap d'or, une mitre ornée de diamants, une\r\n-croix archiépiscopale, une crosse magnifique, tous les vêtements\r\n-pontificaux volés un mois auparavant au trésor de Notre-Dame d'Embrun.\r\n-Dans la caisse, il y avait un papier sur lequel étaient écrits ces mots:\r\n-_Cravatte à monseigneur Bienvenu_.\r\n-\r\n---Quand je disais que cela s'arrangerait! dit l'évêque.\r\n-\r\n-Puis il ajouta en souriant:\r\n-\r\n---À qui se contente d'un surplis de curé, Dieu envoie une chape\r\n-d'archevêque.\r\n-\r\n---Monseigneur, murmura le curé en hochant la tête avec un sourire, Dieu,\r\n-ou le diable.\r\n-\r\n-L'évêque regarda fixement le curé et reprit avec autorité:\r\n-\r\n---Dieu!\r\n-\r\n-Quand il revint au Chastelar, et tout le long de la route, on venait le\r\n-regarder par curiosité. Il retrouva au presbytère du Chastelar\r\n-mademoiselle Baptistine et madame Magloire qui l'attendaient, et il dit\r\n-à sa soeur:\r\n-\r\n---Eh bien, avais-je raison? Le pauvre prêtre est allé chez ces pauvres\r\n-montagnards les mains vides, il en revient les mains pleines. J'étais\r\n-parti n'emportant que ma confiance en Dieu; je rapporte le trésor d'une\r\n-cathédrale.\r\n-\r\n-Le soir, avant de se coucher, il dit encore:\r\n-\r\n---Ne craignons jamais les voleurs ni les meurtriers. Ce sont là les\r\n-dangers du dehors, les petits dangers. Craignons-nous nous-mêmes. Les\r\n-préjugés, voilà les voleurs; les vices, voilà les meurtriers. Les grands\r\n-dangers sont au dedans de nous. Qu'importe ce qui menace notre tête ou\r\n-notre bourse! Ne songeons qu'à ce qui menace notre âme.\r\n-\r\n-Puis se tournant vers sa soeur:\r\n-\r\n---Ma soeur, de la part du prêtre jamais de précaution contre le\r\n-prochain. Ce que le prochain fait, Dieu le permet. Bornons-nous à prier\r\n-Dieu quand nous croyons qu'un danger arrive sur nous. Prions-le, non\r\n-pour nous, mais pour que notre frère ne tombe pas en faute à notre\r\n-occasion.\r\n-\r\n-Du reste, les événements étaient rares dans son existence. Nous\r\n-racontons ceux que nous savons; mais d'ordinaire il passait sa vie à \r\n-faire toujours les mêmes choses aux mêmes moments. Un mois de son année\r\n-ressemblait à une heure de sa journée.\r\n-\r\n-Quant à ce que devint «le trésor» de la cathédrale d'Embrun, on nous\r\n-embarrasserait de nous interroger là -dessus. C'étaient là de bien belles\r\n-choses, et bien tentantes, et bien bonnes à voler au profit des\r\n-malheureux. Volées, elles l'étaient déjà d'ailleurs. La moitié de\r\n-l'aventure était accomplie; il ne restait plus qu'à changer la direction\r\n-du vol, et qu'à lui faire faire un petit bout de chemin du côté des\r\n-pauvres. Nous n'affirmons rien du reste à ce sujet. Seulement on a\r\n-trouvé dans les papiers de l'évêque une note assez obscure qui se\r\n-rapporte peut-être à cette affaire, et qui est ainsi conçue: _La\r\n-question est de savoir si cela doit faire retour à la cathédrale ou à \r\n-l'hôpital_.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VIII\r\n-\r\n-Philosophie après boire\r\n-\r\n-\r\n-Le sénateur dont il a été parlé plus haut était un homme entendu qui\r\n-avait fait son chemin avec une rectitude inattentive à toutes ces\r\n-rencontres qui font obstacle et qu'on nomme conscience, foi jurée,\r\n-justice, devoir; il avait marché droit à son but et sans broncher une\r\n-seule fois dans la ligne de son avancement et de son intérêt. C'était un\r\n-ancien procureur, attendri par le succès, pas méchant homme du tout,\r\n-rendant tous les petits services qu'il pouvait à ses fils, à ses\r\n-gendres, à ses parents, même à des amis; ayant sagement pris de la vie\r\n-les bons côtés, les bonnes occasions, les bonnes aubaines. Le reste lui\r\n-semblait assez bête. Il était spirituel, et juste assez lettré pour se\r\n-croire un disciple d'Épicure en n'étant peut-être qu'un produit de\r\n-Pigault-Lebrun. Il riait volontiers, et agréablement, des choses\r\n-infinies et éternelles, et des «billevesées du bonhomme évêque». Il en\r\n-riait quelquefois, avec une aimable autorité, devant M. Myriel lui-même,\r\n-qui écoutait.\r\n-\r\n-À je ne sais plus quelle cérémonie demi-officielle, le comte*** (ce\r\n-sénateur) et M. Myriel durent dîner chez le préfet. Au dessert, le\r\n-sénateur, un peu égayé, quoique toujours digne, s'écria:\r\n-\r\n---Parbleu, monsieur l'évêque, causons. Un sénateur et un évêque se\r\n-regardent difficilement sans cligner de l'oeil. Nous sommes deux\r\n-augures. Je vais vous faire un aveu. J'ai ma philosophie.\r\n-\r\n---Et vous avez raison, répondit l'évêque. Comme on fait sa philosophie\r\n-on se couche. Vous êtes sur le lit de pourpre, monsieur le sénateur.\r\n-\r\n-Le sénateur, encouragé, reprit:\r\n-\r\n---Soyons bons enfants.\r\n-\r\n---Bons diables même, dit l'évêque.\r\n-\r\n---Je vous déclare, reprit le sénateur, que le marquis d'Argens, Pyrrhon,\r\n-Hobbes et M. Naigeon ne sont pas des maroufles. J'ai dans ma\r\n-bibliothèque tous mes philosophes dorés sur tranche.\r\n-\r\n---Comme vous-même, monsieur le comte, interrompit l'évêque.\r\n-\r\n-Le sénateur poursuivit:\r\n-\r\n---Je hais Diderot; c'est un idéologue, un déclamateur et un\r\n-révolutionnaire, au fond croyant en Dieu, et plus bigot que Voltaire.\r\n-Voltaire s'est moqué de Needham, et il a eu tort; car les anguilles de\r\n-Needham prouvent que Dieu est inutile. Une goutte de vinaigre dans une\r\n-cuillerée de pâte de farine supplée le _fiat lux_. Supposez la goutte\r\n-plus grosse et la cuillerée plus grande, vous avez le monde. L'homme,\r\n-c'est l'anguille. Alors à quoi bon le Père éternel? Monsieur l'évêque,\r\n-l'hypothèse Jéhovah me fatigue. Elle n'est bonne qu'à produire des gens\r\n-maigres qui songent creux. À bas ce grand Tout qui me tracasse! Vive\r\n-Zéro qui me laisse tranquille! De vous à moi, et pour vider mon sac, et\r\n-pour me confesser à mon pasteur comme il convient, je vous avoue que\r\n-j'ai du bon sens. Je ne suis pas fou de votre Jésus qui prêche à tout\r\n-bout de champ le renoncement et le sacrifice. Conseil d'avare à des\r\n-gueux. Renoncement! pourquoi? Sacrifice! à quoi? Je ne vois pas qu'un\r\n-loup s'immole au bonheur d'un autre loup. Restons donc dans la nature.\r\n-Nous sommes au sommet; ayons la philosophie supérieure. Que sert d'être\r\n-en haut, si l'on ne voit pas plus loin que le bout du nez des autres?\r\n-Vivons gaîment. La vie, c'est tout. Que l'homme ait un autre avenir,\r\n-ailleurs, là -haut, là -bas, quelque part, je n'en crois pas un traître\r\n-mot. Ah! l'on me recommande le sacrifice et le renoncement, je dois\r\n-prendre garde à tout ce que je fais, il faut que je me casse la tête sur\r\n-le bien et le mal, sur le juste et l'injuste, sur le _fas_ et le\r\n-_nefas_. Pourquoi? parce que j'aurai à rendre compte de mes actions.\r\n-Quand? après ma mort. Quel bon rêve! Après ma mort, bien fin qui me\r\n-pincera. Faites donc saisir une poignée de cendre par une main d'ombre.\r\n-Disons le vrai, nous qui sommes des initiés et qui avons levé la jupe\r\n-d'Isis: il n'y a ni bien, ni mal; il y a de la végétation. Cherchons le\r\n-réel. Creusons tout à fait. Allons au fond, que diable! Il faut flairer\r\n-la vérité, fouiller sous terre, et la saisir. Alors elle vous donne des\r\n-joies exquises. Alors vous devenez fort, et vous riez. Je suis carré par\r\n-la base, moi. Monsieur l'évêque, l'immortalité de l'homme est un\r\n-écoute-s'il-pleut. Oh! la charmante promesse! Fiez-vous-y. Le bon billet\r\n-qu'a Adam! On est âme, on sera ange, on aura des ailes bleues aux\r\n-omoplates. Aidez-moi donc, n'est-ce pas Tertullien qui dit que les\r\n-bienheureux iront d'un astre à l'autre? Soit. On sera les sauterelles\r\n-des étoiles. Et puis, on verra Dieu. Ta ta ta. Fadaises que tous ces\r\n-paradis. Dieu est une sonnette monstre. Je ne dirais point cela dans le\r\n-_Moniteur_, parbleu! mais je le chuchote entre amis. _Inter pocula_.\r\n-Sacrifier la terre au paradis, c'est lâcher la proie pour l'ombre. Être\r\n-dupe de l'infini! pas si bête. Je suis néant. Je m'appelle monsieur le\r\n-comte Néant, sénateur. Étais-je avant ma naissance? Non. Serai-je après\r\n-ma mort? Non. Que suis-je? un peu de poussière agrégée par un organisme.\r\n-Qu'ai-je à faire sur cette terre? J'ai le choix. Souffrir ou jouir. Où\r\n-me mènera la souffrance? Au néant. Mais j'aurai souffert. Où me mènera\r\n-la jouissance? Au néant. Mais j'aurai joui. Mon choix est fait. Il faut\r\n-être mangeant ou mangé. Je mange. Mieux vaut être la dent que l'herbe.\r\n-Telle est ma sagesse. Après quoi, va comme je te pousse, le fossoyeur\r\n-est là , le Panthéon pour nous autres, tout tombe dans le grand trou.\r\n-Fin. _Finis_. Liquidation totale. Ceci est l'endroit de\r\n-l'évanouissement. La mort est morte, croyez-moi. Qu'il y ait là \r\n-quelqu'un qui ait quelque chose à me dire, je ris d'y songer. Invention\r\n-de nourrices. Croquemitaine pour les enfants, Jéhovah pour les hommes.\r\n-Non, notre lendemain est de la nuit. Derrière la tombe, il n'y a plus\r\n-que des néants égaux. Vous avez été Sardanapale, vous avez été Vincent\r\n-de Paul, cela fait le même rien. Voilà le vrai. Donc vivez, par-dessus\r\n-tout. Usez de votre moi pendant que vous le tenez. En vérité, je vous le\r\n-dis, monsieur l'évêque, j'ai ma philosophie, et j'ai mes philosophes. Je\r\n-ne me laisse pas enguirlander par des balivernes. Après ça, il faut bien\r\n-quelque chose à ceux qui sont en bas, aux va-nu-pieds, aux gagne-petit,\r\n-aux misérables. On leur donne à gober les légendes, les chimères, l'âme,\r\n-l'immortalité, le paradis, les étoiles. Ils mâchent cela. Ils le mettent\r\n-sur leur pain sec. Qui n'a rien a le bon Dieu. C'est bien le moins. Je\r\n-n'y fais point obstacle, mais je garde pour moi monsieur Naigeon. Le bon\r\n-Dieu est bon pour le peuple.\r\n-\r\n-L'évêque battit des mains.\r\n-\r\n---Voilà parler! s'écria-t-il. L'excellente chose, et vraiment\r\n-merveilleuse, que ce matérialisme-là ! Ne l'a pas qui veut. Ah! quand on\r\n-l'a, on n'est plus dupe; on ne se laisse pas bêtement exiler comme\r\n-Caton, ni lapider comme Étienne, ni brûler vif comme Jeanne d'Arc. Ceux\r\n-qui ont réussi à se procurer ce matérialisme admirable ont la joie de se\r\n-sentir irresponsables, et de penser qu'ils peuvent dévorer tout, sans\r\n-inquiétude, les places, les sinécures, les dignités, le pouvoir bien ou\r\n-mal acquis, les palinodies lucratives, les trahisons utiles, les\r\n-savoureuses capitulations de conscience, et qu'ils entreront dans la\r\n-tombe, leur digestion faite. Comme c'est agréable! Je ne dis pas cela\r\n-pour vous, monsieur le sénateur. Cependant il m'est impossible de ne\r\n-point vous féliciter. Vous autres grands seigneurs, vous avez, vous le\r\n-dites, une philosophie à vous et pour vous, exquise, raffinée,\r\n-accessible aux riches seuls, bonne à toutes les sauces, assaisonnant\r\n-admirablement les voluptés de la vie. Cette philosophie est prise dans\r\n-les profondeurs et déterrée par des chercheurs spéciaux. Mais vous êtes\r\n-bons princes, et vous ne trouvez pas mauvais que la croyance au bon Dieu\r\n-soit la philosophie du peuple, à peu près comme l'oie aux marrons est la\r\n-dinde aux truffes du pauvre.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IX\r\n-\r\n-Le frère raconté par la soeur\r\n-\r\n-\r\n-Pour donner une idée du ménage intérieur de M. l'évêque de Digne et de\r\n-la façon dont ces deux saintes filles subordonnaient leurs actions,\r\n-leurs pensées, même leurs instincts de femmes aisément effrayées, aux\r\n-habitudes et aux intentions de l'évêque, sans qu'il eût même à prendre\r\n-la peine de parler pour les exprimer, nous ne pouvons mieux faire que de\r\n-transcrire ici une lettre de mademoiselle Baptistine à madame la\r\n-vicomtesse de Boischevron, son amie d'enfance. Cette lettre est entre\r\n-nos mains.\r\n-\r\n-«Digne, 16 décembre 18....\r\n-\r\n-«Ma bonne madame, pas un jour ne se passe sans que nous parlions de\r\n-vous. C'est assez notre habitude, mais il y a une raison de plus.\r\n-Figurez-vous qu'en lavant et époussetant les plafonds et les murs,\r\n-madame Magloire a fait des découvertes; maintenant nos deux chambres\r\n-tapissées de vieux papier blanchi à la chaux ne dépareraient pas un\r\n-château dans le genre du vôtre. Madame Magloire a déchiré tout le\r\n-papier. Il y avait des choses dessous. Mon salon, où il n'y a pas de\r\n-meubles, et dont nous nous servons pour étendre le linge après les\r\n-lessives, a quinze pieds de haut, dix-huit de large carrés, un plafond\r\n-peint anciennement avec dorure, des solives comme chez vous. C'était\r\n-recouvert d'une toile, du temps que c'était l'hôpital. Enfin des\r\n-boiseries du temps de nos grand'mères. Mais c'est ma chambre qu'il faut\r\n-voir. Madame Magloire a découvert, sous au moins dix papiers collés\r\n-dessus, des peintures, sans être bonnes, qui peuvent se supporter. C'est\r\n-Télémaque reçu chevalier par Minerve, c'est lui encore dans les jardins.\r\n-Le nom m'échappe. Enfin où les dames romaines se rendaient une seule\r\n-nuit. Que vous dirai-je? j'ai des romains, des romaines (_ici un mot\r\n-illisible_), et toute la suite. Madame Magloire a débarbouillé tout\r\n-cela, et cet été elle va réparer quelques petites avaries, revenir le\r\n-tout, et ma chambre sera un vrai musée. Elle a trouvé aussi dans un coin\r\n-du grenier deux consoles en bois, genre ancien. On demandait deux écus\r\n-de six livres pour les redorer, mais il vaut bien mieux donner cela aux\r\n-pauvres; d'ailleurs c'est fort laid, et j'aimerais mieux une table ronde\r\n-en acajou.\r\n-\r\n-«Je suis toujours bien heureuse. Mon frère est si bon. Il donne tout ce\r\n-qu'il a aux indigents et aux malades. Nous sommes très gênés. Le pays\r\n-est dur l'hiver, et il faut bien faire quelque chose pour ceux qui\r\n-manquent. Nous sommes à peu près chauffés et éclairés. Vous voyez que ce\r\n-sont de grandes douceurs.\r\n-\r\n-«Mon frère a ses habitudes à lui. Quand il cause, il dit qu'un évêque\r\n-doit être ainsi. Figurez-vous que la porte de la maison n'est jamais\r\n-fermée. Entre qui veut, et l'on est tout de suite chez mon frère. Il ne\r\n-craint rien, même la nuit. C'est là sa bravoure à lui, comme il dit.\r\n-\r\n-«Il ne veut pas que je craigne pour lui, ni que madame Magloire craigne.\r\n-Il s'expose à tous les dangers, et il ne veut même pas que nous ayons\r\n-l'air de nous en apercevoir. Il faut savoir le comprendre.\r\n-\r\n-«Il sort par la pluie, il marche dans l'eau, il voyage en hiver. Il n'a\r\n-pas peur de la nuit, des routes suspectes ni des rencontres.\r\n-\r\n-«L'an dernier, il est allé tout seul dans un pays de voleurs. Il n'a pas\r\n-voulu nous emmener. Il est resté quinze jours absent. À son retour, il\r\n-n'avait rien eu, on le croyait mort, et il se portait bien, et il a dit:\r\n-\u0022Voilà comme on m'a volé!\u0022 Et il a ouvert une malle pleine de tous les\r\n-bijoux de la cathédrale d'Embrun, que les voleurs lui avaient donnés.\r\n-\r\n-«Cette fois-là , en revenant, comme j'étais allée à sa rencontre à deux\r\n-lieues avec d'autres de ses amis, je n'ai pu m'empêcher de le gronder un\r\n-peu, en ayant soin de ne parler que pendant que la voiture faisait du\r\n-bruit, afin que personne autre ne pût entendre.\r\n-\r\n-«Dans les premiers temps, je me disais: il n'y a pas de dangers qui\r\n-l'arrêtent, il est terrible. À présent j'ai fini par m'y accoutumer. Je\r\n-fais signe à madame Magloire pour qu'elle ne le contrarie pas. Il se\r\n-risque comme il veut. Moi j'emmène madame Magloire, je rentre dans ma\r\n-chambre, je prie pour lui, et je m'endors. Je suis tranquille, parce que\r\n-je sais bien que s'il lui arrivait malheur, ce serait ma fin. Je m'en\r\n-irais au bon Dieu avec mon frère et mon évêque. Madame Magloire a eu\r\n-plus de peine que moi à s'habituer à ce qu'elle appelait ses\r\n-imprudences. Mais à présent le pli est pris. Nous prions toutes les\r\n-deux, nous avons peur ensemble, et nous nous endormons. Le diable\r\n-entrerait dans la maison qu'on le laisserait faire. Après tout, que\r\n-craignons-nous dans cette maison? Il y a toujours quelqu'un avec nous,\r\n-qui est le plus fort. Le diable peut y passer, mais le bon Dieu\r\n-l'habite.\r\n-\r\n-«Voilà qui me suffit. Mon frère n'a plus même besoin de me dire un mot\r\n-maintenant. Je le comprends sans qu'il parle, et nous nous abandonnons à \r\n-la Providence.\r\n-\r\n-«Voilà comme il faut être avec un homme qui a du grand dans l'esprit.\r\n-\r\n-«J'ai questionné mon frère pour le renseignement que vous me demandez\r\n-sur la famille de Faux. Vous savez comme il sait tout et comme il a des\r\n-souvenirs, car il est toujours très bon royaliste. C'est de vrai une\r\n-très ancienne famille normande de la généralité de Caen. Il y a cinq\r\n-cents ans d'un Raoul de Faux, d'un Jean de Faux et d'un Thomas de Faux,\r\n-qui étaient des gentilshommes, dont un seigneur de Rochefort. Le dernier\r\n-était Guy-Étienne-Alexandre, et était maître de camp, et quelque chose\r\n-dans les chevaux-légers de Bretagne. Sa fille Marie-Louise a épousé\r\n-Adrien-Charles de Gramont, fils du duc Louis de Gramont, pair de France,\r\n-colonel des gardes françaises et lieutenant général des armées. On écrit\r\n-Faux, Fauq et Faoucq.\r\n-\r\n-«Bonne madame, recommandez-nous aux prières de votre saint parent, M. le\r\n-cardinal. Quant à votre chère Sylvanie, elle a bien fait de ne pas\r\n-prendre les courts instants qu'elle passe près de vous pour m'écrire.\r\n-Elle se porte bien, travaille selon vos désirs, m'aime toujours. C'est\r\n-tout ce que je veux. Son souvenir par vous m'est arrivé. Je m'en trouve\r\n-heureuse. Ma santé n'est pas trop mauvaise, et cependant je maigris tous\r\n-les jours davantage. Adieu, le papier me manque et me force de vous\r\n-quitter. Mille bonnes choses.\r\n-\r\n-«Baptistine.\r\n-\r\n-«P. S. Madame votre belle-soeur est toujours ici avec sa jeune famille.\r\n-Votre petit-neveu est charmant. Savez-vous qu'il a cinq ans bientôt!\r\n-Hier il a vu passer un cheval auquel on avait mis des genouillères, et\r\n-il disait: \u0022Qu'est-ce qu'il a donc aux genoux?\u0022 Il est si gentil, cet\r\n-enfant! Son petit frère traîne un vieux balai dans l'appartement comme\r\n-une voiture, et dit: \u0022Hu!\u0022\r\n-\r\n-»Comme on le voit par cette lettre, ces deux femmes savaient se plier\r\n-aux façons d'être de l'évêque avec ce génie particulier de la femme qui\r\n-comprend l'homme mieux que l'homme ne se comprend. L'évêque de Digne,\r\n-sous cet air doux et candide qui ne se démentait jamais, faisait parfois\r\n-des choses grandes, hardies et magnifiques, sans paraître même s'en\r\n-douter. Elles en tremblaient, mais elles le laissaient faire.\r\n-Quelquefois madame Magloire essayait une remontrance avant; jamais\r\n-pendant ni après. Jamais on ne le troublait, ne fût-ce que par un signe,\r\n-dans une action commencée. À de certains moments, sans qu'il eût besoin\r\n-de le dire, lorsqu'il n'en avait peut-être pas lui-même conscience, tant\r\n-sa simplicité était parfaite, elles sentaient vaguement qu'il agissait\r\n-comme évêque; alors elles n'étaient plus que deux ombres dans la maison.\r\n-Elles le servaient passivement, et, si c'était obéir que de disparaître,\r\n-elles disparaissaient. Elles savaient, avec une admirable délicatesse\r\n-d'instinct, que certaines sollicitudes peuvent gêner. Aussi, même le\r\n-croyant en péril, elles comprenaient, je ne dis pas sa pensée, mais sa\r\n-nature, jusqu'au point de ne plus veiller sur lui. Elles le confiaient à \r\n-Dieu.\r\n-\r\n-D'ailleurs Baptistine disait, comme on vient de le lire, que la fin de\r\n-son frère serait la sienne. Madame Magloire ne le disait pas, mais elle\r\n-le savait.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre X\r\n-\r\n-L'évêque en présence d'une lumière inconnue\r\n-\r\n-\r\n-À une époque un peu postérieure à la date de la lettre citée dans les\r\n-pages précédentes, il fit une chose, à en croire toute la ville, plus\r\n-risquée encore que sa promenade à travers les montagnes des bandits. Il\r\n-y avait près de Digne, dans la campagne, un homme qui vivait solitaire.\r\n-Cet homme, disons tout de suite le gros mot, était un ancien\r\n-conventionnel. Il se nommait G.\r\n-\r\n-On parlait du conventionnel G. dans le petit monde de Digne avec une\r\n-sorte d'horreur. Un conventionnel, vous figurez-vous cela? Cela existait\r\n-du temps qu'on se tutoyait et qu'on disait: citoyen. Cet homme était à \r\n-peu près un monstre. Il n'avait pas voté la mort du roi, mais presque.\r\n-C'était un quasi-régicide. Il avait été terrible. Comment, au retour des\r\n-princes légitimes, n'avait-on pas traduit cet homme-là devant une cour\r\n-prévôtale? On ne lui eût pas coupé la tête, si vous voulez, il faut de\r\n-la clémence, soit; mais un bon bannissement à vie. Un exemple enfin!\r\n-etc., etc. C'était un athée d'ailleurs, comme tous ces\r\n-gens-là .--Commérages des oies sur le vautour.\r\n-\r\n-Était-ce du reste un vautour que G.? Oui, si l'on en jugeait par ce\r\n-qu'il y avait de farouche dans sa solitude. N'ayant pas voté la mort du\r\n-roi, il n'avait pas été compris dans les décrets d'exil et avait pu\r\n-rester en France.\r\n-\r\n-Il habitait, à trois quarts d'heure de la ville, loin de tout hameau,\r\n-loin de tout chemin, on ne sait quel repli perdu d'un vallon très\r\n-sauvage. Il avait là , disait-on, une espèce de champ, un trou, un\r\n-repaire. Pas de voisins; pas même de passants. Depuis qu'il demeurait\r\n-dans ce vallon, le sentier qui y conduisait avait disparu sous l'herbe.\r\n-On parlait de cet endroit-là comme de la maison du bourreau. Pourtant\r\n-l'évêque songeait, et de temps en temps regardait l'horizon à l'endroit\r\n-où un bouquet d'arbres marquait le vallon du vieux conventionnel, et il\r\n-disait:\r\n-\r\n---Il y a là une âme qui est seule.\r\n-\r\n-Et au fond de sa pensée il ajoutait: «Je lui dois ma visite.»\r\n-\r\n-Mais, avouons-le, cette idée, au premier abord naturelle, lui\r\n-apparaissait, après un moment de réflexion, comme étrange et impossible,\r\n-et presque repoussante. Car, au fond, il partageait l'impression\r\n-générale, et le conventionnel lui inspirait, sans qu'il s'en rendît\r\n-clairement compte, ce sentiment qui est comme la frontière de la haine\r\n-et qu'exprime si bien le mot éloignement.\r\n-\r\n-Toutefois, la gale de la brebis doit-elle faire reculer le pasteur? Non.\r\n-Mais quelle brebis!\r\n-\r\n-Le bon évêque était perplexe. Quelquefois il allait de ce côté-là , puis\r\n-il revenait. Un jour enfin le bruit se répandit dans la ville qu'une\r\n-façon de jeune pâtre qui servait le conventionnel G. dans sa bauge était\r\n-venu chercher un médecin; que le vieux scélérat se mourait, que la\r\n-paralysie le gagnait, et qu'il ne passerait pas la nuit.\r\n-\r\n---Dieu merci! ajoutaient quelques-uns.\r\n-\r\n-L'évêque prit son bâton, mit son pardessus à cause de sa soutane un peu\r\n-trop usée, comme nous l'avons dit, et aussi à cause du vent du soir qui\r\n-ne devait pas tarder à souffler, et partit.\r\n-\r\n-Le soleil déclinait et touchait presque à l'horizon, quand l'évêque\r\n-arriva à l'endroit excommunié. Il reconnut avec un certain battement de\r\n-coeur qu'il était près de la tanière. Il enjamba un fossé, franchit une\r\n-haie, leva un échalier, entra dans un courtil délabré, fit quelques pas\r\n-assez hardiment, et tout à coup, au fond de la friche, derrière une\r\n-haute broussaille, il aperçut la caverne.\r\n-\r\n-C'était une cabane toute basse, indigente, petite et propre, avec une\r\n-treille clouée à la façade.\r\n-\r\n-Devant la porte, dans une vieille chaise à roulettes, fauteuil du\r\n-paysan, il y avait un homme en cheveux blancs qui souriait au soleil.\r\n-\r\n-Près du vieillard assis se tenait debout un jeune garçon, le petit\r\n-pâtre. Il tendait au vieillard une jatte de lait.\r\n-\r\n-Pendant que l'évêque regardait, le vieillard éleva la voix:\r\n-\r\n---Merci, dit-il, je n'ai plus besoin de rien.\r\n-\r\n-Et son sourire quitta le soleil pour s'arrêter sur l'enfant.\r\n-\r\n-L'évêque s'avança. Au bruit qu'il fit en marchant, le vieux homme assis\r\n-tourna la tête, et son visage exprima toute la quantité de surprise\r\n-qu'on peut avoir après une longue vie.\r\n-\r\n---Depuis que je suis ici, dit-il, voilà la première fois qu'on entre\r\n-chez moi. Qui êtes-vous, monsieur?\r\n-\r\n-L'évêque répondit:\r\n-\r\n---Je me nomme Bienvenu Myriel.\r\n-\r\n---Bienvenu Myriel! j'ai entendu prononcer ce nom. Est-ce que c'est vous\r\n-que le peuple appelle monseigneur Bienvenu?\r\n-\r\n---C'est moi.\r\n-\r\n-Le vieillard reprit avec un demi-sourire:\r\n-\r\n---En ce cas, vous êtes mon évêque?\r\n-\r\n---Un peu.\r\n-\r\n---Entrez, monsieur.\r\n-\r\n-Le conventionnel tendit la main à l'évêque, mais l'évêque ne la prit\r\n-pas. L'évêque se borna à dire:\r\n-\r\n---Je suis satisfait de voir qu'on m'avait trompé. Vous ne me semblez,\r\n-certes, pas malade.\r\n-\r\n---Monsieur, répondit le vieillard, je vais guérir.\r\n-\r\n-Il fit une pause et dit:\r\n-\r\n---Je mourrai dans trois heures.\r\n-\r\n-Puis il reprit:\r\n-\r\n---Je suis un peu médecin; je sais de quelle façon la dernière heure\r\n-vient. Hier, je n'avais que les pieds froids; aujourd'hui, le froid a\r\n-gagné les genoux; maintenant je le sens qui monte jusqu'à la ceinture;\r\n-quand il sera au coeur, je m'arrêterai. Le soleil est beau, n'est-ce\r\n-pas? je me suis fait rouler dehors pour jeter un dernier coup d'oeil sur\r\n-les choses, vous pouvez me parler, cela ne me fatigue point. Vous faites\r\n-bien de venir regarder un homme qui va mourir. Il est bon que ce\r\n-moment-là ait des témoins. On a des manies; j'aurais voulu aller jusqu'à \r\n-l'aube. Mais je sais que j'en ai à peine pour trois heures. Il fera\r\n-nuit. Au fait, qu'importe! Finir est une affaire simple. On n'a pas\r\n-besoin du matin pour cela. Soit. Je mourrai à la belle étoile.\r\n-\r\n-Le vieillard se tourna vers le pâtre.\r\n-\r\n---Toi, va te coucher. Tu as veillé l'autre nuit. Tu es fatigué.\r\n-\r\n-L'enfant rentra dans la cabane.\r\n-\r\n-Le vieillard le suivit des yeux et ajouta comme se parlant à lui-même:\r\n-\r\n---Pendant qu'il dormira, je mourrai. Les deux sommeils peuvent faire bon\r\n-voisinage.\r\n-\r\n-L'évêque n'était pas ému comme il semble qu'il aurait pu l'être. Il ne\r\n-croyait pas sentir Dieu dans cette façon de mourir. Disons tout, car les\r\n-petites contradictions des grands coeurs veulent être indiquées comme le\r\n-reste, lui qui, dans l'occasion, riait si volontiers de Sa Grandeur, il\r\n-était quelque peu choqué de ne pas être appelé monseigneur, et il était\r\n-presque tenté de répliquer: citoyen. Il lui vint une velléité de\r\n-familiarité bourrue, assez ordinaire aux médecins et aux prêtres, mais\r\n-qui ne lui était pas habituelle, à lui. Cet homme, après tout, ce\r\n-conventionnel, ce représentant du peuple, avait été un puissant de la\r\n-terre; pour la première fois de sa vie peut-être, l'évêque se sentit en\r\n-humeur de sévérité.\r\n-\r\n-Le conventionnel cependant le considérait avec une cordialité modeste,\r\n-où l'on eût pu démêler l'humilité qui sied quand on est si près de sa\r\n-mise en poussière.\r\n-\r\n-L'évêque, de son côté, quoiqu'il se gardât ordinairement de la\r\n-curiosité, laquelle, selon lui, était contiguë à l'offense, ne pouvait\r\n-s'empêcher d'examiner le conventionnel avec une attention qui, n'ayant\r\n-pas sa source dans la sympathie, lui eût été probablement reprochée par\r\n-sa conscience vis-à -vis de tout autre homme. Un conventionnel lui\r\n-faisait un peu l'effet d'être hors la loi, même hors la loi de charité.\r\n-\r\n-G., calme, le buste presque droit, la voix vibrante, était un de ces\r\n-grands octogénaires qui font l'étonnement du physiologiste. La\r\n-révolution a eu beaucoup de ces hommes proportionnés à l'époque. On\r\n-sentait dans ce vieillard l'homme à l'épreuve. Si près de sa fin, il\r\n-avait conservé tous les gestes de la santé. Il y avait dans son coup\r\n-d'oeil clair, dans son accent ferme, dans son robuste mouvement\r\n-d'épaules, de quoi déconcerter la mort. Azraël, l'ange mahométan du\r\n-sépulcre, eût rebroussé chemin et eût cru se tromper de porte. G.\r\n-semblait mourir parce qu'il le voulait bien. Il y avait de la liberté\r\n-dans son agonie. Les jambes seulement étaient immobiles. Les ténèbres le\r\n-tenaient par là . Les pieds étaient morts et froids, et la tête vivait de\r\n-toute la puissance de la vie et paraissait en pleine lumière. G., en ce\r\n-grave moment, ressemblait à ce roi du conte oriental, chair par en haut,\r\n-marbre par en bas.\r\n-\r\n-Une pierre était là . L'évêque s'y assit. L'exorde fut _ex abrupto_.\r\n-\r\n---Je vous félicite, dit-il du ton dont on réprimande. Vous n'avez\r\n-toujours pas voté la mort du roi.\r\n-\r\n-Le conventionnel ne parut pas remarquer le sous-entendu amer caché dans\r\n-ce mot: toujours. Il répondit. Tout sourire avait disparu de sa face.\r\n-\r\n---Ne me félicitez pas trop, monsieur; j'ai voté la fin du tyran.\r\n-\r\n-C'était l'accent austère en présence de l'accent sévère.\r\n-\r\n---Que voulez-vous dire? reprit l'évêque.\r\n-\r\n---Je veux dire que l'homme a un tyran, l'ignorance. J'ai voté la fin de\r\n-ce tyran-là . Ce tyran-là a engendré la royauté qui est l'autorité prise\r\n-dans le faux, tandis que la science est l'autorité prise dans le vrai.\r\n-L'homme ne doit être gouverné que par la science.\r\n-\r\n---Et la conscience, ajouta l'évêque.\r\n-\r\n---C'est la même chose. La conscience, c'est la quantité de science innée\r\n-que nous avons en nous.\r\n-\r\n-Monseigneur Bienvenu écoutait, un peu étonné, ce langage très nouveau\r\n-pour lui. Le conventionnel poursuivit:\r\n-\r\n---Quant à Louis XVI, j'ai dit non. Je ne me crois pas le droit de tuer\r\n-un homme; mais je me sens le devoir d'exterminer le mal. J'ai voté la\r\n-fin du tyran. C'est-à -dire la fin de la prostitution pour la femme, la\r\n-fin de l'esclavage pour l'homme, la fin de la nuit pour l'enfant. En\r\n-votant la république, j'ai voté cela. J'ai voté la fraternité, la\r\n-concorde, l'aurore! J'ai aidé à la chute des préjugés et des erreurs.\r\n-Les écroulements des erreurs et des préjugés font de la lumière. Nous\r\n-avons fait tomber le vieux monde, nous autres, et le vieux monde, vase\r\n-des misères, en se renversant sur le genre humain, est devenu une urne\r\n-de joie.\r\n-\r\n---Joie mêlée, dit l'évêque.\r\n-\r\n---Vous pourriez dire joie troublée, et aujourd'hui, après ce fatal\r\n-retour du passé qu'on nomme 1814, joie disparue. Hélas, l'oeuvre a été\r\n-incomplète, j'en conviens; nous avons démoli l'ancien régime dans les\r\n-faits, nous n'avons pu entièrement le supprimer dans les idées. Détruire\r\n-les abus, cela ne suffit pas; il faut modifier les moeurs. Le moulin n'y\r\n-est plus, le vent y est encore.\r\n-\r\n---Vous avez démoli. Démolir peut être utile; mais je me défie d'une\r\n-démolition compliquée de colère.\r\n-\r\n---Le droit a sa colère, monsieur l'évêque, et la colère du droit est un\r\n-élément du progrès. N'importe, et quoi qu'on en dise, la révolution\r\n-française est le plus puissant pas du genre humain depuis l'avènement du\r\n-Christ. Incomplète, soit; mais sublime. Elle a dégagé toutes les\r\n-inconnues sociales. Elle a adouci les esprits; elle a calmé, apaisé,\r\n-éclairé; elle a fait couler sur la terre des flots de civilisation. Elle\r\n-a été bonne. La révolution française, c'est le sacre de l'humanité.\r\n-\r\n-L'évêque ne put s'empêcher de murmurer:\r\n-\r\n---Oui? 93!\r\n-\r\n-Le conventionnel se dressa sur sa chaise avec une solennité presque\r\n-lugubre, et, autant qu'un mourant peut s'écrier, il s'écria:\r\n-\r\n---Ah! vous y voilà ! 93! J'attendais ce mot-là . Un nuage s'est formé\r\n-pendant quinze cents ans. Au bout de quinze siècles, il a crevé. Vous\r\n-faites le procès au coup de tonnerre.\r\n-\r\n-L'évêque sentit, sans se l'avouer peut-être, que quelque chose en lui\r\n-était atteint. Pourtant il fit bonne contenance. Il répondit:\r\n-\r\n---Le juge parle au nom de la justice; le prêtre parle au nom de la\r\n-pitié, qui n'est autre chose qu'une justice plus élevée. Un coup de\r\n-tonnerre ne doit pas se tromper.\r\n-\r\n-Et il ajouta en regardant fixement le conventionnel.\r\n-\r\n---Louis XVII?\r\n-\r\n-Le conventionnel étendit la main et saisit le bras de l'évêque:\r\n-\r\n---Louis XVII! Voyons, sur qui pleurez-vous? Est-ce sur l'enfant\r\n-innocent? alors, soit. Je pleure avec vous. Est-ce sur l'enfant royal?\r\n-je demande à réfléchir. Pour moi, le frère de Cartouche, enfant\r\n-innocent, pendu sous les aisselles en place de Grève jusqu'à ce que mort\r\n-s'ensuive, pour le seul crime d'avoir été le frère de Cartouche, n'est\r\n-pas moins douloureux que le petit-fils de Louis XV, enfant innocent,\r\n-martyrisé dans la tour du Temple pour le seul crime d'avoir été le\r\n-petit-fils de Louis XV.\r\n-\r\n---Monsieur, dit l'évêque, je n'aime pas ces rapprochements de noms.\r\n-\r\n---Cartouche? Louis XV? pour lequel des deux réclamez-vous?\r\n-\r\n-Il y eut un moment de silence. L'évêque regrettait presque d'être venu,\r\n-et pourtant il se sentait vaguement et étrangement ébranlé.\r\n-\r\n-Le conventionnel reprit:\r\n-\r\n---Ah! monsieur le prêtre, vous n'aimez pas les crudités du vrai. Christ\r\n-les aimait, lui. Il prenait une verge et il époussetait le temple. Son\r\n-fouet plein d'éclairs était un rude diseur de vérités. Quand il\r\n-s'écriait: _Sinite parvulos_..., il ne distinguait pas entre les petits\r\n-enfants. Il ne se fût pas gêné de rapprocher le dauphin de Barabbas du\r\n-dauphin d'Hérode. Monsieur, l'innocence est sa couronne à elle-même.\r\n-L'innocence n'a que faire d'être altesse. Elle est aussi auguste\r\n-déguenillée que fleurdelysée.\r\n-\r\n---C'est vrai, dit l'évêque à voix basse.\r\n-\r\n---J'insiste, continua le conventionnel G. Vous m'avez nommé Louis XVII.\r\n-Entendons-nous. Pleurons-nous sur tous les innocents, sur tous les\r\n-martyrs, sur tous les enfants, sur ceux d'en bas comme sur ceux d'en\r\n-haut? J'en suis. Mais alors, je vous l'ai dit, il faut remonter plus\r\n-haut que 93, et c'est avant Louis XVII qu'il faut commencer nos larmes.\r\n-Je pleurerai sur les enfants des rois avec vous, pourvu que vous\r\n-pleuriez avec moi sur les petits du peuple.\r\n-\r\n---Je pleure sur tous, dit l'évêque.\r\n-\r\n---Également! s'écria G., et si la balance doit pencher, que ce soit du\r\n-côté du peuple. Il y a plus longtemps qu'il souffre.\r\n-\r\n-Il y eut encore un silence. Ce fut le conventionnel qui le rompit. Il se\r\n-souleva sur un coude, prit entre son pouce et son index replié un peu de\r\n-sa joue, comme on fait machinalement lorsqu'on interroge et qu'on juge,\r\n-et interpella l'évêque avec un regard plein de toutes les énergies de\r\n-l'agonie. Ce fut presque une explosion.\r\n-\r\n---Oui, monsieur, il y a longtemps que le peuple souffre. Et puis, tenez,\r\n-ce n'est pas tout cela, que venez-vous me questionner et me parler de\r\n-Louis XVII? Je ne vous connais pas, moi. Depuis que je suis dans ce\r\n-pays, j'ai vécu dans cet enclos, seul, ne mettant pas les pieds dehors,\r\n-ne vient personne que cet enfant qui m'aide. Votre nom est, il est vrai,\r\n-arrivé confusément jusqu'à moi, et, je dois le dire, pas très mal\r\n-prononcé; mais cela ne signifie rien; les gens habiles ont tant de\r\n-manières d'en faire accroire à ce brave bonhomme de peuple. À propos, je\r\n-n'ai pas entendu le bruit de votre voiture, vous l'aurez sans doute\r\n-laissée derrière le taillis, là -bas, à l'embranchement de la route. Je\r\n-ne vous connais pas, vous dis-je. Vous m'avez dit que vous étiez\r\n-l'évêque, mais cela ne me renseigne point sur votre personne morale. En\r\n-somme, je vous répète ma question. Qui êtes-vous? Vous êtes un évêque,\r\n-c'est-à -dire un prince de l'église, un de ces hommes dorés, armoriés,\r\n-rentés, qui ont de grosses prébendes--l'évêché de Digne, quinze mille\r\n-francs de fixe, dix mille francs de casuel, total, vingt-cinq mille\r\n-francs--, qui ont des cuisines, qui ont des livrées, qui font bonne\r\n-chère, qui mangent des poules d'eau le vendredi, qui se pavanent,\r\n-laquais devant, laquais derrière, en berline de gala, et qui ont des\r\n-palais, et qui roulent carrosse au nom de Jésus-Christ qui allait pieds\r\n-nus! Vous êtes un prélat; rentes, palais, chevaux, valets, bonne table,\r\n-toutes les sensualités de la vie, vous avez cela comme les autres, et\r\n-comme les autres vous en jouissez, c'est bien, mais cela en dit trop ou\r\n-pas assez; cela ne m'éclaire pas sur votre valeur intrinsèque et\r\n-essentielle, à vous qui venez avec la prétention probable de m'apporter\r\n-de la sagesse. À qui est-ce que je parle? Qui êtes-vous?\r\n-\r\n-L'évêque baissa la tête et répondit:\r\n-\r\n---_Vermis sum_.\r\n-\r\n---Un ver de terre en carrosse! grommela le conventionnel.\r\n-\r\n-C'était le tour du conventionnel d'être hautain, et de l'évêque d'être\r\n-humble.\r\n-\r\n-L'évêque reprit avec douceur.\r\n-\r\n---Monsieur, soit. Mais expliquez-moi en quoi mon carrosse, qui est là à \r\n-deux pas derrière les arbres, en quoi ma bonne table et les poules d'eau\r\n-que je mange le vendredi, en quoi mes vingt-cinq mille livres de rentes,\r\n-en quoi mon palais et mes laquais prouvent que la pitié n'est pas une\r\n-vertu, que la clémence n'est pas un devoir, et que 93 n'a pas été\r\n-inexorable.\r\n-\r\n-Le conventionnel passa la main sur son front comme pour en écarter un\r\n-nuage.\r\n-\r\n---Avant de vous répondre, dit-il, je vous prie de me pardonner. Je viens\r\n-d'avoir un tort, monsieur. Vous êtes chez moi, vous êtes mon hôte. Je\r\n-vous dois courtoisie. Vous discutez mes idées, il sied que je me borne à \r\n-combattre vos raisonnements. Vos richesses et vos jouissances sont des\r\n-avantages que j'ai contre vous dans le débat, mais il est de bon goût de\r\n-ne pas m'en servir. Je vous promets de ne plus en user.\r\n-\r\n---Je vous remercie, dit l'évêque.\r\n-\r\n-G. reprit:\r\n-\r\n---Revenons à l'explication que vous me demandiez. Où en étions-nous? Que\r\n-me disiez-vous? que 93 a été inexorable?\r\n-\r\n---Inexorable, oui, dit l'évêque. Que pensez-vous de Marat battant des\r\n-mains à la guillotine?\r\n-\r\n---Que pensez-vous de Bossuet chantant le _Te Deum_ sur les dragonnades?\r\n-\r\n-La réponse était dure, mais elle allait au but avec la rigidité d'une\r\n-pointe d'acier. L'évêque en tressaillit; il ne lui vint aucune riposte,\r\n-mais il était froissé de cette façon de nommer Bossuet. Les meilleurs\r\n-esprits ont leurs fétiches, et parfois se sentent vaguement meurtris des\r\n-manques de respect de la logique.\r\n-\r\n-Le conventionnel commençait à haleter; l'asthme de l'agonie, qui se mêle\r\n-aux derniers souffles, lui entrecoupait la voix; cependant il avait\r\n-encore une parfaite lucidité d'âme dans les yeux. Il continua:\r\n-\r\n---Disons encore quelques mots çà et là , je veux bien. En dehors de la\r\n-révolution qui, prise dans son ensemble, est une immense affirmation\r\n-humaine, 93, hélas! est une réplique. Vous le trouvez inexorable, mais\r\n-toute la monarchie, monsieur? Carrier est un bandit; mais quel nom\r\n-donnez-vous à Montrevel? Fouquier-Tinville est un gueux, mais quel est\r\n-votre avis sur Lamoignon-Bâville? Maillard est affreux, mais\r\n-Saulx-Tavannes, s'il vous plaît? Le père Duchêne est féroce, mais quelle\r\n-épithète m'accorderez-vous pour le père Letellier? Jourdan-Coupe-Tête\r\n-est un monstre, mais moindre que M. le marquis de Louvois. Monsieur,\r\n-monsieur, je plains Marie-Antoinette, archiduchesse et reine, mais je\r\n-plains aussi cette pauvre femme huguenote qui, en 1685, sous Louis le\r\n-Grand, monsieur, allaitant son enfant, fut liée, nue jusqu'à la\r\n-ceinture, à un poteau, l'enfant tenu à distance; le sein se gonflait de\r\n-lait et le coeur d'angoisse. Le petit, affamé et pâle, voyait ce sein,\r\n-agonisait et criait, et le bourreau disait à la femme, mère et nourrice:\r\n-«Abjure!» lui donnant à choisir entre la mort de son enfant et la mort\r\n-de sa conscience. Que dites-vous de ce supplice de Tantale accommodé à \r\n-une mère? Monsieur, retenez bien ceci: la révolution française a eu ses\r\n-raisons. Sa colère sera absoute par l'avenir. Son résultat, c'est le\r\n-monde meilleur. De ses coups les plus terribles, il sort une caresse\r\n-pour le genre humain. J'abrège. Je m'arrête, j'ai trop beau jeu.\r\n-D'ailleurs je me meurs.\r\n-\r\n-Et, cessant de regarder l'évêque, le conventionnel acheva sa pensée en\r\n-ces quelques mots tranquilles:\r\n-\r\n---Oui, les brutalités du progrès s'appellent révolutions. Quand elles\r\n-sont finies, on reconnaît ceci: que le genre humain a été rudoyé, mais\r\n-qu'il a marché.\r\n-\r\n-Le conventionnel ne se doutait pas qu'il venait d'emporter\r\n-successivement l'un après l'autre tous les retranchements intérieurs de\r\n-l'évêque. Il en restait un pourtant, et de ce retranchement, suprême\r\n-ressource de la résistance de monseigneur Bienvenu, sortit cette parole\r\n-où reparut presque toute la rudesse du commencement:\r\n-\r\n---Le progrès doit croire en Dieu. Le bien ne peut pas avoir de serviteur\r\n-impie. C'est un mauvais conducteur du genre humain que celui qui est\r\n-athée.\r\n-\r\n-Le vieux représentant du peuple ne répondit pas. Il eut un tremblement.\r\n-Il regarda le ciel, et une larme germa lentement dans ce regard. Quand\r\n-la paupière fut pleine, la larme coula le long de sa joue livide, et il\r\n-dit presque en bégayant, bas et se parlant à lui-même, l'oeil perdu dans\r\n-les profondeurs:\r\n-\r\n---O toi! ô idéal! toi seul existes!\r\n-\r\n-L'évêque eut une sorte d'inexprimable commotion. Après un silence, le\r\n-vieillard leva un doigt vers le ciel, et dit:\r\n-\r\n---L'infini est. Il est là . Si l'infini n'avait pas de moi, le moi serait\r\n-sa borne; il ne serait pas infini; en d'autres termes, il ne serait pas.\r\n-Or il est. Donc il a un moi. Ce moi de l'infini, c'est Dieu.\r\n-\r\n-Le mourant avait prononcé ces dernières paroles d'une voix haute et avec\r\n-le frémissement de l'extase, comme s'il voyait quelqu'un. Quand il eut\r\n-parlé, ses yeux se fermèrent. L'effort l'avait épuisé. Il était évident\r\n-qu'il venait de vivre en une minute les quelques heures qui lui\r\n-restaient. Ce qu'il venait de dire l'avait approché de celui qui est\r\n-dans la mort. L'instant suprême arrivait.\r\n-\r\n-L'évêque le comprit, le moment pressait, c'était comme prêtre qu'il\r\n-était venu; de l'extrême froideur, il était passé par degrés à l'émotion\r\n-extrême; il regarda ces yeux fermés, il prit cette vieille main ridée et\r\n-glacée, et se pencha vers le moribond:\r\n-\r\n---Cette heure est celle de Dieu. Ne trouvez-vous pas qu'il serait\r\n-regrettable que nous nous fussions rencontrés en vain?\r\n-\r\n-Le conventionnel rouvrit les yeux. Une gravité où il y avait de l'ombre\r\n-s'empreignit sur son visage.\r\n-\r\n---Monsieur l'évêque, dit-il, avec une lenteur qui venait peut-être plus\r\n-encore de la dignité de l'âme que de la défaillance des forces, j'ai\r\n-passé ma vie dans la méditation, l'étude et la contemplation. J'avais\r\n-soixante ans quand mon pays m'a appelé, et m'a ordonné de me mêler de\r\n-ses affaires. J'ai obéi. Il y avait des abus, je les ai combattus; il y\r\n-avait des tyrannies, je les ai détruites; il y avait des droits et des\r\n-principes, je les ai proclamés et confessés. Le territoire était envahi,\r\n-je l'ai défendu; la France était menacée, j'ai offert ma poitrine. Je\r\n-n'étais pas riche; je suis pauvre. J'ai été l'un des maîtres de l'État,\r\n-les caves du Trésor étaient encombrées d'espèces au point qu'on était\r\n-forcé d'étançonner les murs, prêts à se fendre sous le poids de l'or et\r\n-de l'argent, je dînais rue de l'Arbre-Sec à vingt-deux sous par tête.\r\n-J'ai secouru les opprimés, j'ai soulagé les souffrants. J'ai déchiré la\r\n-nappe de l'autel, c'est vrai; mais c'était pour panser les blessures de\r\n-la patrie. J'ai toujours soutenu la marche en avant du genre humain vers\r\n-la lumière, et j'ai résisté quelquefois au progrès sans pitié. J'ai,\r\n-dans l'occasion, protégé mes propres adversaires, vous autres. Et il y a\r\n-à Peteghem en Flandre, à l'endroit même où les rois mérovingiens avaient\r\n-leur palais d'été, un couvent d'urbanistes, l'abbaye de Sainte-Claire en\r\n-Beaulieu, que j'ai sauvé en 1793. J'ai fait mon devoir selon mes forces,\r\n-et le bien que j'ai pu. Après quoi j'ai été chassé, traqué, poursuivi,\r\n-persécuté, noirci, raillé, conspué, maudit, proscrit. Depuis bien des\r\n-années déjà , avec mes cheveux blancs, je sens que beaucoup de gens se\r\n-croient sur moi le droit de mépris, j'ai pour la pauvre foule ignorante\r\n-visage de damné, et j'accepte, ne haïssant personne, l'isolement de la\r\n-haine. Maintenant, j'ai quatre-vingt-six ans; je vais mourir. Qu'est-ce\r\n-que vous venez me demander?\r\n-\r\n---Votre bénédiction, dit l'évêque.\r\n-\r\n-Et il s'agenouilla.\r\n-\r\n-Quand l'évêque releva la tête, la face du conventionnel était devenue\r\n-auguste. Il venait d'expirer.\r\n-\r\n-L'évêque rentra chez lui profondément absorbé dans on ne sait quelles\r\n-pensées. Il passa toute la nuit en prière. Le lendemain, quelques braves\r\n-curieux essayèrent de lui parler du conventionnel G.; il se borna à \r\n-montrer le ciel. À partir de ce moment, il redoubla de tendresse et de\r\n-fraternité pour les petits et les souffrants.\r\n-\r\n-Toute allusion à ce «vieux scélérat de G.» le faisait tomber dans une\r\n-préoccupation singulière. Personne ne pourrait dire que le passage de\r\n-cet esprit devant le sien et le reflet de cette grande conscience sur la\r\n-sienne ne fût pas pour quelque chose dans son approche de la perfection.\r\n-\r\n-Cette «visite pastorale» fut naturellement une occasion de bourdonnement\r\n-pour les petites coteries locales:\r\n-\r\n---Était-ce la place d'un évêque que le chevet d'un tel mourant? Il n'y\r\n-avait évidemment pas de conversion à attendre. Tous ces révolutionnaires\r\n-sont relaps. Alors pourquoi y aller? Qu'a-t-il été regarder là ? Il\r\n-fallait donc qu'il fût bien curieux d'un emportement d'âme par le\r\n-diable.\r\n-\r\n-Un jour, une douairière, de la variété impertinente qui se croit\r\n-spirituelle, lui adressa cette saillie:\r\n-\r\n---Monseigneur, on demande quand Votre Grandeur aura le bonnet rouge.\r\n-\r\n---Oh! oh! voilà une grosse couleur, répondit l'évêque. Heureusement que\r\n-ceux qui la méprisent dans un bonnet la vénèrent dans un chapeau.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XI\r\n-\r\n-Une restriction\r\n-\r\n-\r\n-On risquerait fort de se tromper si l'on concluait de là que monseigneur\r\n-Bienvenu fût «un évêque philosophe» ou «un curé patriote». Sa rencontre,\r\n-ce qu'on pourrait presque appeler sa conjonction avec le conventionnel\r\n-G., lui laissa une sorte d'étonnement qui le rendit plus doux encore.\r\n-Voilà tout.\r\n-\r\n-Quoique monseigneur Bienvenu n'ait été rien moins qu'un homme politique,\r\n-c'est peut-être ici le lieu d'indiquer, très brièvement, quelle fut son\r\n-attitude dans les événements d'alors, en supposant que monseigneur\r\n-Bienvenu ait jamais songé à avoir une attitude. Remontons donc en\r\n-arrière de quelques années.\r\n-\r\n-Quelque temps après l'élévation de M. Myriel à l'épiscopat, l'empereur\r\n-l'avait fait baron de l'empire, en même temps que plusieurs autres\r\n-évêques. L'arrestation du pape eut lieu, comme on sait, dans la nuit du\r\n-5 au 6 juillet 1809; à cette occasion, M. Myriel fut appelé par Napoléon\r\n-au synode des évêques de France et d'Italie convoqué à Paris. Ce synode\r\n-se tint à Notre-Dame et s'assembla pour la première fois le 15 juin 1811\r\n-sous la présidence de M. le cardinal Fesch. M. Myriel fut du nombre des\r\n-quatre-vingt-quinze évêques qui s'y rendirent. Mais il n'assista qu'à \r\n-une séance et à trois ou quatre conférences particulières. Évêque d'un\r\n-diocèse montagnard, vivant si près de la nature, dans la rusticité et le\r\n-dénuement, il paraît qu'il apportait parmi ces personnages éminents des\r\n-idées qui changeaient la température de l'assemblée. Il revint bien vite\r\n-à Digne. On le questionna sur ce prompt retour, il répondit:\r\n-\r\n---Je les gênais. L'air du dehors leur venait par moi. Je leur faisais\r\n-l'effet d'une porte ouverte.\r\n-\r\n-Une autre fois il dit:\r\n-\r\n---Que voulez-vous? ces messeigneurs-là sont des princes. Moi, je ne suis\r\n-qu'un pauvre évêque paysan.\r\n-\r\n-Le fait est qu'il avait déplu. Entre autres choses étranges, il lui\r\n-serait échappé de dire, un soir qu'il se trouvait chez un de ses\r\n-collègues les plus qualifiés:\r\n-\r\n---Les belles pendules! les beaux tapis! les belles livrées! Ce doit être\r\n-bien importun! Oh! que je ne voudrais pas avoir tout ce superflu-là à me\r\n-crier sans cesse aux oreilles: Il y a des gens qui ont faim! il y a des\r\n-gens qui ont froid! il y a des pauvres! il y a des pauvres!\r\n-\r\n-Disons-le en passant, ce ne serait pas une haine intelligente que la\r\n-haine du luxe. Cette haine impliquerait la haine des arts. Cependant,\r\n-chez les gens d'église, en dehors de la représentation et des\r\n-cérémonies, le luxe est un tort. Il semble révéler des habitudes peu\r\n-réellement charitables. Un prêtre opulent est un contre-sens. Le prêtre\r\n-doit se tenir près des pauvres. Or peut-on toucher sans cesse, et nuit\r\n-et jour, à toutes les détresses, à toutes les infortunes, à toutes les\r\n-indigences, sans avoir soi-même sur soi un peu de cette sainte misère,\r\n-comme la poussière du travail? Se figure-t-on un homme qui est près d'un\r\n-brasier, et qui n'a pas chaud? Se figure-t-on un ouvrier qui travaille\r\n-sans cesse à une fournaise, et qui n'a ni un cheveu brûlé, ni un ongle\r\n-noirci, ni une goutte de sueur, ni un grain de cendre au visage? La\r\n-première preuve de la charité chez le prêtre, chez l'évêque surtout,\r\n-c'est la pauvreté. C'était là sans doute ce que pensait M. l'évêque de\r\n-Digne.\r\n-\r\n-Il ne faudrait pas croire d'ailleurs qu'il partageait sur certains\r\n-points délicats ce que nous appellerions «les idées du siècle». Il se\r\n-mêlait peu aux querelles théologiques du moment et se taisait sur les\r\n-questions où sont compromis l'Église et l'État; mais si on l'eût\r\n-beaucoup pressé, il paraît qu'on l'eût trouvé plutôt ultramontain que\r\n-gallican. Comme nous faisons un portrait et que nous ne voulons rien\r\n-cacher, nous sommes forcé d'ajouter qu'il fut glacial pour Napoléon\r\n-déclinant. À partir de 1813, il adhéra ou il applaudit à toutes les\r\n-manifestations hostiles. Il refusa de le voir à son passage au retour de\r\n-l'île d'Elbe, et s'abstint d'ordonner dans son diocèse les prières\r\n-publiques pour l'empereur pendant les Cent-Jours.\r\n-\r\n-Outre sa soeur, mademoiselle Baptistine, il avait deux frères: l'un\r\n-général, l'autre préfet. Il écrivait assez souvent à tous les deux. Il\r\n-tint quelque temps rigueur au premier, parce qu'ayant un commandement en\r\n-Provence, à l'époque du débarquement de Cannes, le général s'était mis à \r\n-la tête de douze cents hommes et avait poursuivi l'empereur comme\r\n-quelqu'un qui veut le laisser échapper. Sa correspondance resta plus\r\n-affectueuse pour l'autre frère, l'ancien préfet, brave et digne homme\r\n-qui vivait retiré à Paris, rue Cassette.\r\n-\r\n-Monseigneur Bienvenu eut donc, aussi lui, son heure d'esprit de parti,\r\n-son heure d'amertume, son nuage. L'ombre des passions du moment traversa\r\n-ce doux et grand esprit occupé des choses éternelles. Certes, un pareil\r\n-homme eût mérité de n'avoir pas d'opinions politiques. Qu'on ne se\r\n-méprenne pas sur notre pensée, nous ne confondons point ce qu'on appelle\r\n-«opinions politiques» avec la grande aspiration au progrès, avec la\r\n-sublime foi patriotique, démocratique et humaine, qui, de nos jours,\r\n-doit être le fond même de toute intelligence généreuse. Sans approfondir\r\n-des questions qui ne touchent qu'indirectement au sujet de ce livre,\r\n-nous disons simplement ceci: Il eût été beau que monseigneur Bienvenu\r\n-n'eût pas été royaliste et que son regard ne se fût pas détourné un seul\r\n-instant de cette contemplation sereine où l'on voit rayonner\r\n-distinctement, au-dessus du va-et-vient orageux des choses humaines, ces\r\n-trois pures lumières, la Vérité, la Justice, la Charité.\r\n-\r\n-Tout en convenant que ce n'était point pour une fonction politique que\r\n-Dieu avait créé monseigneur Bienvenu, nous eussions compris et admiré la\r\n-protestation au nom du droit et de la liberté, l'opposition fière, la\r\n-résistance périlleuse et juste à Napoléon tout-puissant. Mais ce qui\r\n-nous plaît vis-à -vis de ceux qui montent nous plaît moins vis-à -vis de\r\n-ceux qui tombent. Nous n'aimons le combat que tant qu'il y a danger; et,\r\n-dans tous les cas, les combattants de la première heure ont seuls le\r\n-droit d'être les exterminateurs de la dernière. Qui n'a pas été\r\n-accusateur opiniâtre pendant la prospérité doit se taire devant\r\n-l'écroulement. Le dénonciateur du succès est le seul légitime justicier\r\n-de la chute. Quant à nous, lorsque la Providence s'en mêle et frappe,\r\n-nous la laissons faire. 1812 commence à nous désarmer. En 1813, la lâche\r\n-rupture de silence de ce corps législatif taciturne enhardi par les\r\n-catastrophes n'avait que de quoi indigner, et c'était un tort\r\n-d'applaudir; en 1814, devant ces maréchaux trahissant, devant ce sénat\r\n-passant d'une fange à l'autre, insultant après avoir divinisé, devant\r\n-cette idolâtrie lâchant pied et crachant sur l'idole, c'était un devoir\r\n-de détourner la tête; en 1815, comme les suprêmes désastres étaient dans\r\n-l'air, comme la France avait le frisson de leur approche sinistre, comme\r\n-on pouvait vaguement distinguer Waterloo ouvert devant Napoléon, la\r\n-douloureuse acclamation de l'armée et du peuple au condamné du destin\r\n-n'avait rien de risible, et, toute réserve faite sur le despote, un\r\n-coeur comme l'évêque de Digne n'eût peut-être pas dû méconnaître ce\r\n-qu'avait d'auguste et de touchant, au bord de l'abîme, l'étroit\r\n-embrassement d'une grande nation et d'un grand homme.\r\n-\r\n-À cela près, il était et il fut, en toute chose, juste, vrai, équitable,\r\n-intelligent, humble et digne; bienfaisant, et bienveillant, ce qui est\r\n-une autre bienfaisance. C'était un prêtre, un sage, et un homme. Même,\r\n-il faut le dire, dans cette opinion politique que nous venons de lui\r\n-reprocher et que nous sommes disposé à juger presque sévèrement, il\r\n-était tolérant et facile, peut-être plus que nous qui parlons ici.--Le\r\n-portier de la maison de ville avait été placé là par l'empereur. C'était\r\n-un vieux sous-officier de la vieille garde, légionnaire d'Austerlitz,\r\n-bonapartiste comme l'aigle. Il échappait dans l'occasion à ce pauvre\r\n-diable de ces paroles peu réfléchies que la loi d'alors qualifiait\r\n-_propos séditieux_. Depuis que le profil impérial avait disparu de la\r\n-légion d'honneur, il ne s'habillait jamais _dans l'ordonnance_, comme il\r\n-disait, afin de ne pas être forcé de porter sa croix. Il avait ôté\r\n-lui-même dévotement l'effigie impériale de la croix que Napoléon lui\r\n-avait donnée, cela faisait un trou, et il n'avait rien voulu mettre à la\r\n-place. «Plutôt mourir, disait-il, que de porter sur mon coeur les trois\r\n-crapauds!» Il raillait volontiers tout haut Louis XVIII. «Vieux goutteux\r\n-à guêtres d'anglais!» disait-il, «qu'il s'en aille en Prusse avec son\r\n-salsifis!» Heureux de réunir dans la même imprécation les deux choses\r\n-qu'il détestait le plus, la Prusse et l'Angleterre. Il en fit tant qu'il\r\n-perdit sa place. Le voilà sans pain sur le pavé avec femme et enfants.\r\n-L'évêque le fit venir, le gronda doucement, et le nomma suisse de la\r\n-cathédrale.\r\n-\r\n-M. Myriel était dans le diocèse le vrai pasteur, l'ami de tous. En neuf\r\n-ans, à force de saintes actions et de douces manières, monseigneur\r\n-Bienvenu avait rempli la ville de Digne d'une sorte de vénération tendre\r\n-et filiale. Sa conduite même envers Napoléon avait été acceptée et comme\r\n-tacitement pardonnée par le peuple, bon troupeau faible, qui adorait son\r\n-empereur, mais qui aimait son évêque.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XII\r\n-\r\n-Solitude de monseigneur Bienvenu\r\n-\r\n-\r\n-Il y a presque toujours autour d'un évêque une escouade de petits abbés\r\n-comme autour d'un général une volée de jeunes officiers. C'est là ce que\r\n-ce charmant saint François de Sales appelle quelque part «les prêtres\r\n-blancs-becs». Toute carrière a ses aspirants qui font cortège aux\r\n-arrivés. Pas une puissance qui n'ait son entourage; pas une fortune qui\r\n-n'ait sa cour. Les chercheurs d'avenir tourbillonnent autour du présent\r\n-splendide. Toute métropole a son état-major. Tout évêque un peu influent\r\n-a près de lui sa patrouille de chérubins séminaristes, qui fait la ronde\r\n-et maintient le bon ordre dans le palais épiscopal, et qui monte la\r\n-garde autour du sourire de monseigneur. Agréer à un évêque, c'est le\r\n-pied à l'étrier pour un sous-diacre. Il faut bien faire son chemin;\r\n-l'apostolat ne dédaigne pas le canonicat.\r\n-\r\n-De même qu'il y a ailleurs les gros bonnets, il y a dans l'église les\r\n-grosses mitres. Ce sont les évêques bien en cour, riches, rentés,\r\n-habiles, acceptés du monde, sachant prier, sans doute, mais sachant\r\n-aussi solliciter, peu scrupuleux de faire faire antichambre en leur\r\n-personne à tout un diocèse, traits d'union entre la sacristie et la\r\n-diplomatie, plutôt abbés que prêtres, plutôt prélats qu'évêques. Heureux\r\n-qui les approche! Gens en crédit qu'ils sont, ils font pleuvoir autour\r\n-d'eux, sur les empressés et les favorisés, et sur toute cette jeunesse\r\n-qui sait plaire, les grasses paroisses, les prébendes, les\r\n-archidiaconats, les aumôneries et les fonctions cathédrales, en\r\n-attendant les dignités épiscopales. En avançant eux-mêmes, ils font\r\n-progresser leurs satellites; c'est tout un système solaire en marche.\r\n-Leur rayonnement empourpre leur suite. Leur prospérité s'émiette sur la\r\n-cantonade en bonnes petites promotions. Plus grand diocèse au patron,\r\n-plus grosse cure au favori. Et puis Rome est là . Un évêque qui sait\r\n-devenir archevêque, un archevêque qui sait devenir cardinal, vous emmène\r\n-comme conclaviste, vous entrez dans la rote, vous avez le pallium, vous\r\n-voilà auditeur, vous voilà camérier, vous voilà monsignor, et de la\r\n-Grandeur à Imminence il n'y a qu'un pas, et entre Imminence et la\r\n-Sainteté il n'y a que la fumée d'un scrutin. Toute calotte peut rêver la\r\n-tiare. Le prêtre est de nos jours le seul homme qui puisse régulièrement\r\n-devenir roi; et quel roi! le roi suprême. Aussi quelle pépinière\r\n-d'aspirations qu'un séminaire! Que d'enfants de choeur rougissants, que\r\n-de jeunes abbés ont sur la tête le pot au lait de Perrette! Comme\r\n-l'ambition s'intitule aisément vocation, qui sait? de bonne foi\r\n-peut-être et se trompant elle-même, béate qu'elle est!\r\n-\r\n-Monseigneur Bienvenu, humble, pauvre, particulier, n'était pas compté\r\n-parmi les grosses mitres. Cela était visible à l'absence complète de\r\n-jeunes prêtres autour de lui. On a vu qu'à Paris «il n'avait pas pris».\r\n-Pas un avenir ne songeait à se greffer sur ce vieillard solitaire. Pas\r\n-une ambition en herbe ne faisait la folie de verdir à son ombre. Ses\r\n-chanoines et ses grands vicaires étaient de bons vieux hommes, un peu\r\n-peuple comme lui, murés comme lui dans ce diocèse sans issue sur le\r\n-cardinafat, et qui ressemblaient à leur évêque, avec cette différence\r\n-qu'eux étaient finis, et que lui était achevé.\r\n-\r\n-On sentait si bien l'impossibilité de croître près de monseigneur\r\n-Bienvenu qu'à peine sortis du séminaire, les jeunes gens ordonnés par\r\n-lui se faisaient recommander aux archevêques d'Aix ou d'Auch, et s'en\r\n-allaient bien vite. Car enfin, nous le répétons, on veut être poussé. Un\r\n-saint qui vit dans un excès d'abnégation est un voisinage dangereux; il\r\n-pourrait bien vous communiquer par contagion une pauvreté incurable,\r\n-l'ankylose des articulations utiles à l'avancement, et, en somme, plus\r\n-de renoncement que vous n'en voulez; et l'on fuit cette vertu galeuse.\r\n-De là l'isolement de monseigneur Bienvenu. Nous vivons dans une société\r\n-sombre. Réussir, voilà l'enseignement qui tombe goutte à goutte de la\r\n-corruption en surplomb.\r\n-\r\n-Soit dit en passant, c'est une chose assez hideuse que le succès. Sa\r\n-fausse ressemblance avec le mérite trompe les hommes. Pour la foule, la\r\n-réussite a presque le même profil que la suprématie. Le succès, ce\r\n-ménechme du talent, a une dupe: l'histoire. Juvénal et Tacite seuls en\r\n-bougonnent. De nos jours, une philosophie à peu près officielle est\r\n-entrée en domesticité chez lui, porte la livrée du succès, et fait le\r\n-service de son antichambre. Réussissez: théorie. Prospérité suppose\r\n-Capacité. Gagnez à la loterie, vous voilà un habile homme. Qui triomphe\r\n-est vénéré. Naissez coiffé, tout est là . Ayez de la chance, vous aurez\r\n-le reste; soyez heureux, on vous croira grand. En dehors des cinq ou six\r\n-exceptions immenses qui font l'éclat d'un siècle, l'admiration\r\n-contemporaine n'est guère que myopie. Dorure est or. Être le premier\r\n-venu, cela ne gâte rien, pourvu qu'on soit le parvenu. Le vulgaire est\r\n-un vieux Narcisse qui s'adore lui-même et qui applaudit le vulgaire.\r\n-Cette faculté énorme par laquelle on est Moïse, Eschyle, Dante,\r\n-Michel-Ange ou Napoléon, la multitude la décerne d'emblée et par\r\n-acclamation à quiconque atteint son but dans quoi que ce soit. Qu'un\r\n-notaire se transfigure en député, qu'un faux Corneille fasse _Tiridate_,\r\n-qu'un eunuque parvienne à posséder un harem, qu'un Prud'homme militaire\r\n-gagne par accident la bataille décisive d'une époque, qu'un apothicaire\r\n-invente les semelles de carton pour l'armée de Sambre-et-Meuse et se\r\n-construise, avec ce carton vendu pour du cuir, quatre cent mille livres\r\n-de rente, qu'un porte-balle épouse l'usure et la fasse accoucher de sept\r\n-ou huit millions dont il est le père et dont elle est la mère, qu'un\r\n-prédicateur devienne évêque par le nasillement, qu'un intendant de bonne\r\n-maison soit si riche en sortant de service qu'on le fasse ministre des\r\n-finances, les hommes appellent cela Génie, de même qu'ils appellent\r\n-Beauté la figure de Mousqueton et Majesté l'encolure de Claude. Ils\r\n-confondent avec les constellations de l'abîme les étoiles que font dans\r\n-la vase molle du bourbier les pattes des canards.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XIII\r\n-\r\n-Ce qu'il croyait\r\n-\r\n-\r\n-Au point de vue de l'orthodoxie, nous n'avons point à sonder M. l'évêque\r\n-de Digne. Devant une telle âme, nous ne nous sentons en humeur que de\r\n-respect. La conscience du juste doit être crue sur parole. D'ailleurs,\r\n-de certaines natures étant données, nous admettons le développement\r\n-possible de toutes les beautés de la vertu humaine dans une croyance\r\n-différente de la nôtre.\r\n-\r\n-Que pensait-il de ce dogme-ci ou de ce mystère-là ? Ces secrets du for\r\n-intérieur ne sont connus que de la tombe où les âmes entrent nues. Ce\r\n-dont nous sommes certain, c'est que jamais les difficultés de foi ne se\r\n-résolvaient pour lui en hypocrisie. Aucune pourriture n'est possible au\r\n-diamant. Il croyait le plus qu'il pouvait. _Credo in Patrem_,\r\n-s'écriait-il souvent. Puisant d'ailleurs dans les bonnes oeuvres cette\r\n-quantité de satisfaction qui suffit à la conscience, et qui vous dit\r\n-tout bas: «Tu es avec Dieu.»\r\n-\r\n-Ce que nous croyons devoir noter, c'est que, en dehors, pour ainsi dire,\r\n-et au-delà de sa foi, l'évêque avait un excès d'amour. C'est par là ,\r\n-_quia multum amavit_, qu'il était jugé vulnérable par les «hommes\r\n-sérieux», les «personnes graves» et les «gens raisonnables»; locutions\r\n-favorites de notre triste monde où l'égoïsme reçoit le mot d'ordre du\r\n-pédantisme. Qu'était-ce que cet excès d'amour? C'était une bienveillance\r\n-sereine, débordant les hommes, comme nous l'avons indiqué déjà , et, dans\r\n-l'occasion, s'étendant jusqu'aux choses. Il vivait sans dédain. Il était\r\n-indulgent pour la création de Dieu. Tout homme, même le meilleur, a en\r\n-lui une dureté irréfléchie qu'il tient en réserve pour l'animal.\r\n-L'évêque de Digne n'avait point cette dureté-là , particulière à beaucoup\r\n-de prêtres pourtant. Il n'allait pas jusqu'au bramine, mais il semblait\r\n-avoir médité cette parole de l'Ecclésiaste: «Sait-on où va l'âme des\r\n-animaux?» Les laideurs de l'aspect, les difformités de l'instinct, ne le\r\n-troublaient pas et ne l'indignaient pas. Il en était ému, presque\r\n-attendri. Il semblait que, pensif, il en allât chercher, au-delà de la\r\n-vie apparente, la cause, l'explication ou l'excuse. Il semblait par\r\n-moments demander à Dieu des commutations. Il examinait sans colère, et\r\n-avec l'oeil du linguiste qui déchiffre un palimpseste, la quantité de\r\n-chaos qui est encore dans la nature. Cette rêverie faisait parfois\r\n-sortir de lui des mots étranges. Un matin, il était dans son jardin; il\r\n-se croyait seul, mais sa soeur marchait derrière lui sans qu'il la vît;\r\n-tout à coup, il s'arrêta, et il regarda quelque chose à terre; c'était\r\n-une grosse araignée, noire, velue, horrible. Sa soeur l'entendit qui\r\n-disait:\r\n-\r\n---Pauvre bête! ce n'est pas sa faute.\r\n-\r\n-Pourquoi ne pas dire ces enfantillages presque divins de la bonté?\r\n-Puérilités, soit; mais ces puérilités sublimes ont été celles de saint\r\n-François d'Assise et de Marc-Aurèle. Un jour il se donna une entorse\r\n-pour n'avoir pas voulu écraser une fourmi.\r\n-\r\n-Ainsi vivait cet homme juste. Quelquefois, il s'endormait dans son\r\n-jardin, et alors il n'était rien de plus vénérable.\r\n-\r\n-Monseigneur Bienvenu avait été jadis, à en croire les récits sur sa\r\n-jeunesse et même sur sa virilité, un homme passionné, peut-être violent.\r\n-Sa mansuétude universelle était moins un instinct de nature que le\r\n-résultat d'une grande conviction filtrée dans son coeur à travers la vie\r\n-et lentement tombée en lui, pensée à pensée; car, dans un caractère\r\n-comme dans un rocher, il peut y avoir des trous de gouttes d'eau. Ces\r\n-creusements-là sont ineffaçables; ces formations-là sont\r\n-indestructibles.\r\n-\r\n-En 1815, nous croyons l'avoir dit, il atteignit soixante-quinze ans,\r\n-mais il n'en paraissait pas avoir plus de soixante. Il n'était pas\r\n-grand; il avait quelque embonpoint, et, pour le combattre, il faisait\r\n-volontiers de longues marches à pied, il avait le pas ferme et n'était\r\n-que fort peu courbé, détail d'où nous ne prétendons rien conclure;\r\n-Grégoire XVI, à quatre-vingts ans, se tenait droit et souriant, ce qui\r\n-ne l'empêchait pas d'être un mauvais évêque. Monseigneur Bienvenu avait\r\n-ce que le peuple appelle «une belle tête», mais si aimable qu'on\r\n-oubliait qu'elle était belle.\r\n-\r\n-Quand il causait avec cette santé enfantine qui était une de ses grâces,\r\n-et dont nous avons déjà parlé, on se sentait à l'aise près de lui, il\r\n-semblait que de toute sa personne il sortît de la joie. Son teint coloré\r\n-et frais, toutes ses dents bien blanches qu'il avait conservées et que\r\n-son rire faisait voir, lui donnaient cet air ouvert et facile qui fait\r\n-dire d'un homme: «C'est un bon enfant», et d'un vieillard: «C'est un\r\n-bonhomme». C'était, on s'en souvient, l'effet qu'il avait fait à \r\n-Napoléon. Au premier abord, et pour qui le voyait pour la première fois,\r\n-ce n'était guère qu'un bonhomme en effet. Mais si l'on restait quelques\r\n-heures près de lui, et pour peu qu'on le vît pensif, le bonhomme se\r\n-transfigurait peu à peu et prenait je ne sais quoi d'imposant; son front\r\n-large et sérieux, auguste par les cheveux blancs, devenait auguste aussi\r\n-par la méditation; la majesté se dégageait de cette bonté, sans que la\r\n-bonté cessât de rayonner; on éprouvait quelque chose de l'émotion qu'on\r\n-aurait si l'on voyait un ange souriant ouvrir lentement ses ailes sans\r\n-cesser de sourire. Le respect, un respect inexprimable, vous pénétrait\r\n-par degrés et vous montait au coeur, et l'on sentait qu'on avait devant\r\n-soi une de ces âmes fortes, éprouvées et indulgentes, où la pensée est\r\n-si grande qu'elle ne peut plus être que douce.\r\n-\r\n-Comme on l'a vu, la prière, la célébration des offices religieux,\r\n-l'aumône, la consolation aux affligés, la culture d'un coin de terre, la\r\n-fraternité, la frugalité, l'hospitalité, le renoncement, la confiance,\r\n-l'étude, le travail remplissaient chacune des journées de sa vie.\r\n-_Remplissaient_ est bien le mot, et certes cette journée de l'évêque\r\n-était bien pleine jusqu'aux bords de bonnes pensées, de bonnes paroles\r\n-et de bonnes actions. Cependant elle n'était pas complète si le temps\r\n-froid ou pluvieux l'empêchait d'aller passer, le soir, quand les deux\r\n-femmes s'étaient retirées, une heure ou deux dans son jardin avant de\r\n-s'endormir. Il semblait que ce fût une sorte de rite pour lui de se\r\n-préparer au sommeil par la méditation en présence des grands spectacles\r\n-du ciel nocturne. Quelquefois, à une heure même assez avancée de la\r\n-nuit, si les deux vieilles filles ne dormaient pas, elles l'entendaient\r\n-marcher lentement dans les allées. Il était là , seul avec lui-même,\r\n-recueilli, paisible, adorant, comparant la sérénité de son coeur à la\r\n-sérénité de l'éther, ému dans les ténèbres par les splendeurs visibles\r\n-des constellations et les splendeurs invisibles de Dieu, ouvrant son âme\r\n-aux pensées qui tombent de l'inconnu. Dans ces moments-là , offrant son\r\n-coeur à l'heure où les fleurs nocturnes offrent leur parfum, allumé\r\n-comme une lampe au centre de la nuit étoilée, se répandant en extase au\r\n-milieu du rayonnement universel de la création, il n'eût pu peut-être\r\n-dire lui-même ce qui se passait dans son esprit, il sentait quelque\r\n-chose s'envoler hors de lui et quelque chose descendre en lui.\r\n-Mystérieux échanges des gouffres de l'âme avec les gouffres de\r\n-l'univers!\r\n-\r\n-Il songeait à la grandeur et à la présence de Dieu; à l'éternité future,\r\n-étrange mystère; à l'éternité passée, mystère plus étrange encore; à \r\n-tous les infinis qui s'enfonçaient sous ses yeux dans tous les sens; et,\r\n-sans chercher à comprendre l'incompréhensible, il le regardait. Il\r\n-n'étudiait pas Dieu, il s'en éblouissait. Il considérait ces magnifiques\r\n-rencontres des atomes qui donnent des aspects à la matière, révèlent les\r\n-forces en les constatant, créent les individualités dans l'unité, les\r\n-proportions dans l'étendue, l'innombrable dans l'infini, et par la\r\n-lumière produisent la beauté. Ces rencontres se nouent et se dénouent\r\n-sans cesse; de là la vie et la mort. Il s'asseyait sur un banc de bois\r\n-adossé à une treille décrépite, et il regardait les astres à travers les\r\n-silhouettes chétives et rachitiques de ses arbres fruitiers. Ce quart\r\n-d'arpent, si pauvrement planté, si encombré de masures et de hangars,\r\n-lui était cher et lui suffisait.\r\n-\r\n-Que fallait-il de plus à ce vieillard, qui partageait le loisir de sa\r\n-vie, où il y avait si peu de loisir, entre le jardinage le jour et la\r\n-contemplation la nuit? Cet étroit enclos, ayant les cieux pour plafond,\r\n-n'était-ce pas assez pour pouvoir adorer Dieu tour à tour dans ses\r\n-oeuvres les plus charmantes et dans ses oeuvres les plus sublimes?\r\n-N'est-ce pas là tout, en effet, et que désirer au-delà ? Un petit jardin\r\n-pour se promener, et l'immensité pour rêver. À ses pieds ce qu'on peut\r\n-cultiver et cueillir; sur sa tête ce qu'on peut étudier et méditer;\r\n-quelques fleurs sur la terre et toutes les étoiles dans le ciel.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XIV\r\n-\r\n-Ce qu'il pensait\r\n-\r\n-\r\n-Un dernier mot.\r\n-\r\n-Comme cette nature de détails pourrait, particulièrement au moment où\r\n-nous sommes, et pour nous servir d'une expression actuellement à la\r\n-mode, donner à l'évêque de Digne une certaine physionomie «panthéiste»,\r\n-et faire croire, soit à son blâme, soit à sa louange, qu'il y avait en\r\n-lui une de ces philosophies personnelles, propres à notre siècle, qui\r\n-germent quelquefois dans les esprits solitaires et s'y construisent et y\r\n-grandissent jusqu'à y remplacer les religions, nous insistons sur ceci\r\n-que pas un de ceux qui ont connu monseigneur Bienvenu ne se fût cru\r\n-autorisé à penser rien de pareil. Ce qui éclairait cet homme, c'était le\r\n-coeur. Sa sagesse était faite de la lumière qui vient de là .\r\n-\r\n-Point de systèmes, beaucoup d'oeuvres. Les spéculations abstruses\r\n-contiennent du vertige; rien n'indique qu'il hasardât son esprit dans\r\n-les apocalypses. L'apôtre peut être hardi, mais l'évêque doit être\r\n-timide. Il se fût probablement fait scrupule de sonder trop avant de\r\n-certains problèmes réservés en quelque sorte aux grands esprits\r\n-terribles. Il y a de l'horreur sacrée sous les porches de l'énigme; ces\r\n-ouvertures sombres sont là béantes, mais quelque chose vous dit, à vous\r\n-passant de la vie, qu'on n'entre pas. Malheur à qui y pénètre! Les\r\n-génies, dans les profondeurs inouïes de l'abstraction et de la\r\n-spéculation pure, situés pour ainsi dire au-dessus des dogmes, proposent\r\n-leurs idées à Dieu. Leur prière offre audacieusement la discussion. Leur\r\n-adoration interroge. Ceci est la religion directe, pleine d'anxiété et\r\n-de responsabilité pour qui en tente les escarpements.\r\n-\r\n-La méditation humaine n'a point de limite. À ses risques et périls, elle\r\n-analyse et creuse son propre éblouissement. On pourrait presque dire\r\n-que, par une sorte de réaction splendide, elle en éblouit la nature; le\r\n-mystérieux monde qui nous entoure rend ce qu'il reçoit, il est probable\r\n-que les contemplateurs sont contemplés. Quoi qu'il en soit, il y a sur\r\n-la terre des hommes--sont-ce des hommes?--qui aperçoivent distinctement\r\n-au fond des horizons du rêve les hauteurs de l'absolu, et qui ont la\r\n-vision terrible de la montagne infinie. Monseigneur Bienvenu n'était\r\n-point de ces hommes-là , monseigneur Bienvenu n'était pas un génie. Il\r\n-eût redouté ces sublimités d'où quelques-uns, très grands même, comme\r\n-Swedenborg et Pascal, ont glissé dans la démence. Certes, ces puissantes\r\n-rêveries ont leur utilité morale, et par ces routes ardues on s'approche\r\n-de la perfection idéale. Lui, il prenait le sentier qui abrège:\r\n-l'évangile. Il n'essayait point de faire faire à sa chasuble les plis du\r\n-manteau d'Élie, il ne projetait aucun rayon d'avenir sur le roulis\r\n-ténébreux des événements, il ne cherchait pas à condenser en flamme la\r\n-lueur des choses, il n'avait rien du prophète et rien du mage. Cette âme\r\n-simple aimait, voilà tout.\r\n-\r\n-Qu'il dilatât la prière jusqu'à une aspiration surhumaine, cela est\r\n-probable; mais on ne peut pas plus prier trop qu'aimer trop; et, si\r\n-c'était une hérésie de prier au-delà des textes, sainte Thérèse et saint\r\n-Jérôme seraient des hérétiques.\r\n-\r\n-Il se penchait sur ce qui gémit et sur ce qui expie. L'univers lui\r\n-apparaissait comme une immense maladie; il sentait partout de la fièvre,\r\n-il auscultait partout de la souffrance, et, sans chercher à deviner\r\n-l'énigme, il tâchait de panser la plaie. Le redoutable spectacle des\r\n-choses créées développait en lui l'attendrissement; il n'était occupé\r\n-qu'à trouver pour lui-même et à inspirer aux autres la meilleure manière\r\n-de plaindre et de soulager. Ce qui existe était pour ce bon et rare\r\n-prêtre un sujet permanent de tristesse cherchant à consoler.\r\n-\r\n-Il y a des hommes qui travaillent à l'extraction de l'or; lui, il\r\n-travaillait à l'extraction de la pitié. L'universelle misère était sa\r\n-mine. La douleur partout n'était qu'une occasion de bonté toujours.\r\n-_Aimez-vous les uns les autres;_ il déclarait cela complet, ne\r\n-souhaitait rien de plus, et c'était là toute sa doctrine. Un jour, cet\r\n-homme qui se croyait «philosophe», ce sénateur, déjà nommé, dit à \r\n-l'évêque:\r\n-\r\n---Mais voyez donc le spectacle du monde; guerre de tous contre tous; le\r\n-plus fort a le plus d'esprit. Votre _aimez-vous les uns les autres_ est\r\n-une bêtise.\r\n-\r\n---Eh bien, répondit monseigneur Bienvenu sans disputer, si c'est une\r\n-bêtise, l'âme doit s'y enfermer comme la perle dans l'huître.\r\n-\r\n-Il s'y enfermait donc, il y vivait, il s'en satisfaisait absolument,\r\n-laissant de côté les questions prodigieuses qui attirent et qui\r\n-épouvantent, les perspectives insondables de l'abstraction, les\r\n-précipices de la métaphysique, toutes ces profondeurs convergentes, pour\r\n-l'apôtre à Dieu, pour l'athée au néant: la destinée, le bien et le mal,\r\n-la guerre de l'être contre l'être, la conscience de l'homme, le\r\n-somnambulisme pensif de l'animal, la transformation par la mort, la\r\n-récapitulation d'existences que contient le tombeau, la greffe\r\n-incompréhensible des amours successifs sur le moi persistant, l'essence,\r\n-la substance, le Nil et l'Ens, l'âme, la nature, la liberté, la\r\n-nécessité; problèmes à pic, épaisseurs sinistres, où se penchent les\r\n-gigantesques archanges de l'esprit humain; formidables abîmes que\r\n-Lucrèce, Manou, saint Paul et Dante contemplent avec cet oeil fulgurant\r\n-qui semble, en regardant fixement l'infini, y faire éclore des étoiles.\r\n-\r\n-Monseigneur Bienvenu était simplement un homme qui constatait du dehors\r\n-les questions mystérieuses sans les scruter, sans les agiter, et sans en\r\n-troubler son propre esprit, et qui avait dans l'âme le grave respect de\r\n-l'ombre.\r\n-\r\n-\r\n-\r\n-\r\n-Livre deuxième--La chute\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre I\r\n-\r\n-Le soir d'un jour de marche\r\n-\r\n-\r\n-Dans les premiers jours du mois d'octobre 1815, une heure environ avant\r\n-le coucher du soleil, un homme qui voyageait à pied entrait dans la\r\n-petite ville de Digne. Les rares habitants qui se trouvaient en ce moment\r\n-à leurs fenêtres ou sur le seuil de leurs maisons regardaient ce\r\n-voyageur avec une sorte d'inquiétude. Il était difficile de rencontrer\r\n-un passant d'un aspect plus misérable. C'était un homme de moyenne\r\n-taille, trapu et robuste, dans la force de l'âge. Il pouvait avoir\r\n-quarante-six ou quarante-huit ans. Une casquette à visière de cuir\r\n-rabattue cachait en partie son visage, brûlé par le soleil et le hâle,\r\n-et ruisselant de sueur. Sa chemise de grosse toile jaune, rattachée au\r\n-col par une petite ancre d'argent, laissait voir sa poitrine velue; il\r\n-avait une cravate tordue en corde, un pantalon de coutil bleu, usé et\r\n-râpé, blanc à un genou, troué à l'autre, une vieille blouse grise en\r\n-haillons, rapiécée à l'un des coudes d'un morceau de drap vert cousu\r\n-avec de la ficelle, sur le dos un sac de soldat fort plein, bien bouclé\r\n-et tout neuf, à la main un énorme bâton noueux, les pieds sans bas dans\r\n-des souliers ferrés, la tête tondue et la barbe longue.\r\n-\r\n-La sueur, la chaleur, le voyage à pied, la poussière, ajoutaient je ne\r\n-sais quoi de sordide à cet ensemble délabré.\r\n-\r\n-Les cheveux étaient ras, et pourtant hérissés; car ils commençaient à \r\n-pousser un peu, et semblaient n'avoir pas été coupés depuis quelque\r\n-temps.\r\n-\r\n-Personne ne le connaissait. Ce n'était évidemment qu'un passant. D'où\r\n-venait-il? Du midi. Des bords de la mer peut-être. Car il faisait son\r\n-entrée dans Digne par la même rue qui, sept mois auparavant, avait vu\r\n-passer l'empereur Napoléon allant de Cannes à Paris. Cet homme avait dû\r\n-marcher tout le jour. Il paraissait très fatigué. Des femmes de l'ancien\r\n-bourg qui est au bas de la ville l'avaient vu s'arrêter sous les arbres\r\n-du boulevard Gassendi et boire à la fontaine qui est à l'extrémité de la\r\n-promenade. Il fallait qu'il eût bien soif, car des enfants qui le\r\n-suivaient le virent encore s'arrêter, et boire, deux cents pas plus\r\n-loin, à la fontaine de la place du marché.\r\n-\r\n-Arrivé au coin de la rue Poichevert, il tourna à gauche et se dirigea\r\n-vers la mairie. Il y entra, puis sortit un quart d'heure après. Un\r\n-gendarme était assis près de la porte sur le banc de pierre où le\r\n-général Drouot monta le 4 mars pour lire à la foule effarée des\r\n-habitants de Digne la proclamation du golfe Juan. L'homme ôta sa\r\n-casquette et salua humblement le gendarme.\r\n-\r\n-Le gendarme, sans répondre à son salut, le regarda avec attention, le\r\n-suivit quelque temps des yeux, puis entra dans la maison de ville.\r\n-\r\n-Il y avait alors à Digne une belle auberge à l'enseigne de _la\r\n-Croix-de-Colbas_. Cette auberge avait pour hôtelier un nommé Jacquin\r\n-Labarre, homme considéré dans la ville pour sa parenté avec un autre\r\n-Labarre, qui tenait à Grenoble l'auberge des _Trois-Dauphins_ et qui\r\n-avait servi dans les guides. Lors du débarquement de l'empereur,\r\n-beaucoup de bruits avaient couru dans le pays sur cette auberge des\r\n-_Trois-Dauphins_. On contait que le général Bertrand, déguisé en\r\n-charretier, y avait fait de fréquents voyages au mois de janvier, et\r\n-qu'il y avait distribué des croix d'honneur à des soldats et des\r\n-poignées de napoléons à des bourgeois. La réalité est que l'empereur,\r\n-entré dans Grenoble, avait refusé de s'installer à l'hôtel de la\r\n-préfecture; il avait remercié le maire en disant: _Je vais chez un brave\r\n-homme que je connais_, et il était allé aux _Trois-Dauphins_. Cette\r\n-gloire du Labarre des _Trois-Dauphins_ se reflétait à vingt-cinq lieues\r\n-de distance jusque sur le Labarre de la _Croix-de-Colbas_. On disait de\r\n-lui dans la ville: _C'est le cousin de celui de Grenoble_.\r\n-\r\n-L'homme se dirigea vers cette auberge, qui était la meilleure du pays.\r\n-Il entra dans la cuisine, laquelle s'ouvrait de plain-pied sur la rue.\r\n-Tous les fourneaux étaient allumés; un grand feu flambait gaîment dans\r\n-la cheminée. L'hôte, qui était en même temps le chef, allait de l'âtre\r\n-aux casseroles, fort occupé et surveillant un excellent dîner destiné à \r\n-des rouliers qu'on entendait rire et parler à grand bruit dans une salle\r\n-voisine. Quiconque a voyagé sait que personne ne fait meilleure chère\r\n-que les rouliers. Une marmotte grasse, flanquée de perdrix blanches et\r\n-de coqs de bruyère, tournait sur une longue broche devant le feu; sur\r\n-les fourneaux cuisaient deux grosses carpes du lac de Lauzet et une\r\n-truite du lac d'Alloz.\r\n-\r\n-L'hôte, entendant la porte s'ouvrir et entrer un nouveau venu, dit sans\r\n-lever les yeux de ses fourneaux:\r\n-\r\n---Que veut monsieur?\r\n-\r\n---Manger et coucher, dit l'homme.\r\n-\r\n---Rien de plus facile, reprit l'hôte.\r\n-\r\n-En ce moment il tourna la tête, embrassa d'un coup d'oeil tout\r\n-l'ensemble du voyageur, et ajouta:\r\n-\r\n---... en payant.\r\n-\r\n-L'homme tira une grosse bourse de cuir de la poche de sa blouse et\r\n-répondit:\r\n-\r\n---J'ai de l'argent.\r\n-\r\n---En ce cas on est à vous, dit l'hôte.\r\n-\r\n-L'homme remit sa bourse en poche, se déchargea de son sac, le posa à \r\n-terre près de la porte, garda son bâton à la main, et alla s'asseoir sur\r\n-une escabelle basse près du feu. Digne est dans la montagne. Les soirées\r\n-d'octobre y sont froides.\r\n-\r\n-Cependant, tout en allant et venant, l'homme considérait le voyageur.\r\n-\r\n---Dîne-t-on bientôt? dit l'homme.\r\n-\r\n---Tout à l'heure, dit l'hôte.\r\n-\r\n-Pendant que le nouveau venu se chauffait, le dos tourné, le digne\r\n-aubergiste Jacquin Labarre tira un crayon de sa poche, puis il déchira\r\n-le coin d'un vieux journal qui traînait sur une petite table près de la\r\n-fenêtre. Sur la marge blanche il écrivit une ligne ou deux, plia sans\r\n-cacheter et remit ce chiffon de papier à un enfant qui paraissait lui\r\n-servir tout à la fois de marmiton et de laquais. L'aubergiste dit un mot\r\n-à l'oreille du marmiton, et l'enfant partit en courant dans la direction\r\n-de la mairie.\r\n-\r\n-Le voyageur n'avait rien vu de tout cela.\r\n-\r\n-Il demanda encore une fois:\r\n-\r\n---Dîne-t-on bientôt?\r\n-\r\n---Tout à l'heure, dit l'hôte.\r\n-\r\n-L'enfant revint. Il rapportait le papier. L'hôte le déplia avec\r\n-empressement, comme quelqu'un qui attend une réponse. Il parut lire\r\n-attentivement, puis hocha la tête, et resta un moment pensif. Enfin il\r\n-fit un pas vers le voyageur qui semblait plongé dans des réflexions peu\r\n-sereines.\r\n-\r\n---Monsieur, dit-il, je ne puis vous recevoir.\r\n-\r\n-L'homme se dressa à demi sur son séant.\r\n-\r\n---Comment! Avez-vous peur que je ne paye pas? Voulez-vous que je paye\r\n-d'avance? J'ai de l'argent, vous dis-je.\r\n-\r\n---Ce n'est pas cela.\r\n-\r\n---Quoi donc?\r\n-\r\n---Vous avez de l'argent....\r\n-\r\n---Oui, dit l'homme.\r\n-\r\n---Et moi, dit l'hôte, je n'ai pas de chambre.\r\n-\r\n-L'homme reprit tranquillement:\r\n-\r\n---Mettez-moi à l'écurie.\r\n-\r\n---Je ne puis.\r\n-\r\n---Pourquoi?\r\n-\r\n---Les chevaux prennent toute la place.\r\n-\r\n---Eh bien, repartit l'homme, un coin dans le grenier. Une botte de\r\n-paille. Nous verrons cela après dîner.\r\n-\r\n---Je ne puis vous donner à dîner.\r\n-\r\n-Cette déclaration, faite d'un ton mesuré, mais ferme, parut grave à \r\n-l'étranger. Il se leva.\r\n-\r\n---Ah bah! mais je meurs de faim, moi. J'ai marché dès le soleil levé.\r\n-J'ai fait douze lieues. Je paye. Je veux manger.\r\n-\r\n---Je n'ai rien, dit l'hôte.\r\n-\r\n-L'homme éclata de rire et se tourna vers la cheminée et les fourneaux.\r\n-\r\n---Rien! et tout cela?\r\n-\r\n---Tout cela m'est retenu.\r\n-\r\n---Par qui?\r\n-\r\n---Par ces messieurs les rouliers.\r\n-\r\n---Combien sont-ils?\r\n-\r\n---Douze.\r\n-\r\n---Il y a là à manger pour vingt.\r\n-\r\n---Ils ont tout retenu et tout payé d'avance.\r\n-\r\n-L'homme se rassit et dit sans hausser la voix:\r\n-\r\n---Je suis à l'auberge, j'ai faim, et je reste.\r\n-\r\n-L'hôte alors se pencha à son oreille, et lui dit d'un accent qui le fit\r\n-tressaillir:\r\n-\r\n---Allez-vous en.\r\n-\r\n-Le voyageur était courbé en cet instant et poussait quelques braises\r\n-dans le feu avec le bout ferré de son bâton, il se retourna vivement,\r\n-et, comme il ouvrait la bouche pour répliquer, l'hôte le regarda\r\n-fixement et ajouta toujours à voix basse:\r\n-\r\n---Tenez, assez de paroles comme cela. Voulez-vous que je vous dise votre\r\n-nom? Vous vous appelez Jean Valjean. Maintenant voulez-vous que je vous\r\n-dise qui vous êtes? En vous voyant entrer, je me suis douté de quelque\r\n-chose, j'ai envoyé à la mairie, et voici ce qu'on m'a répondu.\r\n-Savez-vous lire?\r\n-\r\n-En parlant ainsi il tendait à l'étranger, tout déplié, le papier qui\r\n-venait de voyager de l'auberge à la mairie, et de la mairie à l'auberge.\r\n-L'homme y jeta un regard. L'aubergiste reprit après un silence:\r\n-\r\n---J'ai l'habitude d'être poli avec tout le monde. Allez-vous-en.\r\n-\r\n-L'homme baissa la tête, ramassa le sac qu'il avait déposé à terre, et\r\n-s'en alla. Il prit la grande rue. Il marchait devant lui au hasard,\r\n-rasant de près les maisons, comme un homme humilié et triste. Il ne se\r\n-retourna pas une seule fois. S'il s'était retourné, il aurait vu\r\n-l'aubergiste de la _Croix-de-Colbas_ sur le seuil de sa porte, entouré\r\n-de tous les voyageurs de son auberge et de tous les passants de la rue,\r\n-parlant vivement et le désignant du doigt, et, aux regards de défiance\r\n-et d'effroi du groupe, il aurait deviné qu'avant peu son arrivée serait\r\n-l'événement de toute la ville.\r\n-\r\n-Il ne vit rien de tout cela. Les gens accablés ne regardent pas derrière\r\n-eux. Ils ne savent que trop que le mauvais sort les suit.\r\n-\r\n-Il chemina ainsi quelque temps, marchant toujours, allant à l'aventure\r\n-par des rues qu'il ne connaissait pas, oubliant la fatigue, comme cela\r\n-arrive dans la tristesse. Tout à coup il sentit vivement la faim. La\r\n-nuit approchait. Il regarda autour de lui pour voir s'il ne découvrirait\r\n-pas quelque gîte.\r\n-\r\n-La belle hôtellerie s'était fermée pour lui; il cherchait quelque\r\n-cabaret bien humble, quelque bouge bien pauvre.\r\n-\r\n-Précisément une lumière s'allumait au bout de la rue; une branche de\r\n-pin, pendue à une potence en fer, se dessinait sur le ciel blanc du\r\n-crépuscule. Il y alla.\r\n-\r\n-C'était en effet un cabaret. Le cabaret qui est dans la rue de Chaffaut.\r\n-\r\n-Le voyageur s'arrêta un moment, et regarda par la vitre l'intérieur de\r\n-la salle basse du cabaret, éclairée par une petite lampe sur une table\r\n-et par un grand feu dans la cheminée. Quelques hommes y buvaient. L'hôte\r\n-se chauffait. La flamme faisait bruire une marmite de fer accrochée à la\r\n-crémaillère.\r\n-\r\n-On entre dans ce cabaret, qui est aussi une espèce d'auberge, par deux\r\n-portes. L'une donne sur la rue, l'autre s'ouvre sur une petite cour\r\n-pleine de fumier.\r\n-\r\n-Le voyageur n'osa pas entrer par la porte de la rue. Il se glissa dans\r\n-la cour, s'arrêta encore, puis leva timidement le loquet et poussa la\r\n-porte.\r\n-\r\n---Qui va là ? dit le maître.\r\n-\r\n---Quelqu'un qui voudrait souper et coucher.\r\n-\r\n---C'est bon. Ici on soupe et on couche.\r\n-\r\n-Il entra. Tous les gens qui buvaient se retournèrent. La lampe\r\n-l'éclairait d'un côté, le feu de l'autre. On l'examina quelque temps\r\n-pendant qu'il défaisait son sac.\r\n-\r\n-L'hôte lui dit:\r\n-\r\n---Voilà du feu. Le souper cuit dans la marmite. Venez vous chauffer,\r\n-camarade.\r\n-\r\n-Il alla s'asseoir près de l'âtre. Il allongea devant le feu ses pieds\r\n-meurtris par la fatigue; une bonne odeur sortait de la marmite. Tout ce\r\n-qu'on pouvait distinguer de son visage sous sa casquette baissée prit\r\n-une vague apparence de bien-être mêlée à cet autre aspect si poignant\r\n-que donne l'habitude de la souffrance.\r\n-\r\n-C'était d'ailleurs un profil ferme, énergique et triste. Cette\r\n-physionomie était étrangement composée; elle commençait par paraître\r\n-humble et finissait par sembler sévère. L'oeil luisait sous les sourcils\r\n-comme un feu sous une broussaille.\r\n-\r\n-Cependant un des hommes attablés était un poissonnier qui, avant\r\n-d'entrer au cabaret de la rue de Chaffaut, était allé mettre son cheval\r\n-à l'écurie chez Labarre. Le hasard faisait que le matin même il avait\r\n-rencontré cet étranger de mauvaise mine, cheminant entre Bras dasse\r\n-et... j'ai oublié le nom. (Je crois que c'est Escoublon). Or, en le\r\n-rencontrant, l'homme, qui paraissait déjà très fatigué, lui avait\r\n-demandé de le prendre en croupe; à quoi le poissonnier n'avait répondu\r\n-qu'en doublant le pas. Ce poissonnier faisait partie, une demi-heure\r\n-auparavant, du groupe qui entourait Jacquin Labarre, et lui-même avait\r\n-raconté sa désagréable rencontre du matin aux gens de _la\r\n-Croix-de-Colbas_. Il fit de sa place au cabaretier un signe\r\n-imperceptible. Le cabaretier vint à lui. Ils échangèrent quelques\r\n-paroles à voix basse. L'homme était retombé dans ses réflexions.\r\n-\r\n-Le cabaretier revint à la cheminée, posa brusquement sa main sur\r\n-l'épaule de l'homme, et lui dit:\r\n-\r\n---Tu vas t'en aller d'ici.\r\n-\r\n-L'étranger se retourna et répondit avec douceur.\r\n-\r\n---Ah! vous savez?\r\n-\r\n---Oui.\r\n-\r\n---On m'a renvoyé de l'autre auberge.\r\n-\r\n---Et l'on te chasse de celle-ci.\r\n-\r\n---Où voulez-vous que j'aille?\r\n-\r\n---Ailleurs.\r\n-\r\n-L'homme prit son bâton et son sac, et s'en alla.\r\n-\r\n-Comme il sortait, quelques enfants, qui l'avaient suivi depuis _la\r\n-Croix-de-Colbas_ et qui semblaient l'attendre, lui jetèrent des pierres.\r\n-Il revint sur ses pas avec colère et les menaça de son bâton; les\r\n-enfants se dispersèrent comme une volée d'oiseaux.\r\n-\r\n-Il passa devant la prison. À la porte pendait une chaîne de fer attachée\r\n-à une cloche. Il sonna.\r\n-\r\n-Un guichet s'ouvrit.\r\n-\r\n---Monsieur le guichetier, dit-il en ôtant respectueusement sa casquette,\r\n-voudriez-vous bien m'ouvrir et me loger pour cette nuit?\r\n-\r\n-Une voix répondit:\r\n-\r\n---Une prison n'est pas une auberge. Faites-vous arrêter. On vous\r\n-ouvrira.\r\n-\r\n-Le guichet se referma.\r\n-\r\n-Il entra dans une petite rue où il y a beaucoup de jardins. Quelques-uns\r\n-ne sont enclos que de haies, ce qui égaye la rue. Parmi ces jardins et\r\n-ces haies, il vit une petite maison d'un seul étage dont la fenêtre\r\n-était éclairée. Il regarda par cette vitre comme il avait fait pour le\r\n-cabaret. C'était une grande chambre blanchie à la chaux, avec un lit\r\n-drapé d'indienne imprimée, et un berceau dans un coin, quelques chaises\r\n-de bois et un fusil à deux coups accroché au mur. Une table était servie\r\n-au milieu de la chambre. Une lampe de cuivre éclairait la nappe de\r\n-grosse toile blanche, le broc d'étain luisant comme l'argent et plein de\r\n-vin et la soupière brune qui fumait. À cette table était assis un homme\r\n-d'une quarantaine d'années, à la figure joyeuse et ouverte, qui faisait\r\n-sauter un petit enfant sur ses genoux. Près de lui, une femme toute\r\n-jeune allaitait un autre enfant. Le père riait, l'enfant riait, la mère\r\n-souriait.\r\n-\r\n-L'étranger resta un moment rêveur devant ce spectacle doux et calmant.\r\n-Que se passait-il en lui? Lui seul eût pu le dire. Il est probable qu'il\r\n-pensa que cette maison joyeuse serait hospitalière, et que là où il\r\n-voyait tant de bonheur il trouverait peut-être un peu de pitié.\r\n-\r\n-Il frappa au carreau un petit coup très faible.\r\n-\r\n-On n'entendit pas.\r\n-\r\n-Il frappa un second coup.\r\n-\r\n-Il entendit la femme qui disait:\r\n-\r\n---Mon homme, il me semble qu'on frappe.\r\n-\r\n---Non, répondit le mari.\r\n-\r\n-Il frappa un troisième coup.\r\n-\r\n-Le mari se leva, prit la lampe, et alla à la porte qu'il ouvrit.\r\n-\r\n-C'était un homme de haute taille, demi-paysan, demi-artisan. Il portait\r\n-un vaste tablier de cuir qui montait jusqu'à son épaule gauche, et dans\r\n-lequel faisaient ventre un marteau, un mouchoir rouge, une poire à \r\n-poudre, toutes sortes d'objets que la ceinture retenait comme dans une\r\n-poche. Il renversait la tête en arrière; sa chemise largement ouverte et\r\n-rabattue montrait son cou de taureau, blanc et nu. Il avait d'épais\r\n-sourcils, d'énormes favoris noirs, les yeux à fleur de tête, le bas du\r\n-visage en museau, et sur tout cela cet air d'être chez soi qui est une\r\n-chose inexprimable.\r\n-\r\n---Monsieur, dit le voyageur, pardon. En payant, pourriez-vous me donner\r\n-une assiettée de soupe et un coin pour dormir dans ce hangar qui est là \r\n-dans ce jardin? Dites, pourriez-vous? En payant?\r\n-\r\n---Qui êtes-vous? demanda le maître du logis.\r\n-\r\n-L'homme répondit:\r\n-\r\n---J'arrive de Puy-Moisson. J'ai marché toute la journée. J'ai fait douze\r\n-lieues. Pourriez-vous? En payant?\r\n-\r\n---Je ne refuserais pas, dit le paysan, de loger quelqu'un de bien qui\r\n-payerait. Mais pourquoi n'allez-vous pas à l'auberge.\r\n-\r\n---Il n'y a pas de place.\r\n-\r\n---Bah! pas possible. Ce n'est pas jour de foire ni de marché. Êtes-vous\r\n-allé chez Labarre?\r\n-\r\n---Oui.\r\n-\r\n---Eh bien?\r\n-\r\n-Le voyageur répondit avec embarras:\r\n-\r\n---Je ne sais pas, il ne m'a pas reçu.\r\n-\r\n---Êtes-vous allé chez chose, de la rue de Chaffaut?\r\n-\r\n-L'embarras de l'étranger croissait. Il balbutia:\r\n-\r\n---Il ne m'a pas reçu non plus.\r\n-\r\n-Le visage du paysan prit une expression de défiance, il regarda le\r\n-nouveau venu de la tête aux pieds, et tout à coup il s'écria avec une\r\n-sorte de frémissement:\r\n-\r\n---Est-ce que vous seriez l'homme?...\r\n-\r\n-Il jeta un nouveau coup d'oeil sur l'étranger, fit trois pas en arrière,\r\n-posa la lampe sur la table et décrocha son fusil du mur.\r\n-\r\n-Cependant aux paroles du paysan: _Est-ce que vous seriez l'homme?..._ la\r\n-femme s'était levée, avait pris ses deux enfants dans ses bras et\r\n-s'était réfugiée précipitamment derrière son mari, regardant l'étranger\r\n-avec épouvante, la gorge nue, les yeux effarés, en murmurant tout bas:_\r\n-Tso-maraude_.\r\n-\r\n-Tout cela se fit en moins de temps qu'il ne faut pour se le figurer.\r\n-Après avoir examiné quelques instants l'homme comme on examine une\r\n-vipère, le maître du logis revint à la porte et dit:\r\n-\r\n---Va-t'en.\r\n-\r\n---Par grâce, reprit l'homme, un verre d'eau.\r\n-\r\n---Un coup de fusil! dit le paysan.\r\n-\r\n-Puis il referma la porte violemment, et l'homme l'entendit tirer deux\r\n-gros verrous. Un moment après, la fenêtre se ferma au volet, et un bruit\r\n-de barre de fer qu'on posait parvint au dehors.\r\n-\r\n-La nuit continuait de tomber. Le vent froid des Alpes soufflait. À la\r\n-lueur du jour expirant, l'étranger aperçut dans un des jardins qui\r\n-bordent la rue une sorte de hutte qui lui parut maçonnée en mottes de\r\n-gazon. Il franchit résolument une barrière de bois et se trouva dans le\r\n-jardin. Il s'approcha de la hutte; elle avait pour porte une étroite\r\n-ouverture très basse et elle ressemblait à ces constructions que les\r\n-cantonniers se bâtissent au bord des routes. Il pensa sans doute que\r\n-c'était en effet le logis d'un cantonnier; il souffrait du froid et de\r\n-la faim; il s'était résigné à la faim, mais c'était du moins là un abri\r\n-contre le froid. Ces sortes de logis ne sont habituellement pas occupés\r\n-la nuit. Il se coucha à plat ventre et se glissa dans la hutte. Il y\r\n-faisait chaud, et il y trouva un assez bon lit de paille. Il resta un\r\n-moment étendu sur ce lit, sans pouvoir faire un mouvement tant il était\r\n-fatigué. Puis, comme son sac sur son dos le gênait et que c'était\r\n-d'ailleurs un oreiller tout trouvé, il se mit à déboucler une des\r\n-courroies. En ce moment un grondement farouche se fit entendre. Il leva\r\n-les yeux. La tête d'un dogue énorme se dessinait dans l'ombre à \r\n-l'ouverture de la hutte.\r\n-\r\n-C'était la niche d'un chien.\r\n-\r\n-Il était lui-même vigoureux et redoutable; il s'arma de son bâton, il se\r\n-fit de son sac un bouclier, et sortit de la niche comme il put, non sans\r\n-élargir les déchirures de ses haillons.\r\n-\r\n-Il sortit également du jardin, mais à reculons, obligé, pour tenir le\r\n-dogue en respect, d'avoir recours à cette manoeuvre du bâton que les\r\n-maîtres en ce genre d'escrime appellent _la rose couverte_.\r\n-\r\n-Quand il eut, non sans peine, repassé la barrière et qu'il se retrouva\r\n-dans la rue, seul, sans gîte, sans toit, sans abri, chassé même de ce\r\n-lit de paille et de cette niche misérable, il se laissa tomber plutôt\r\n-qu'il ne s'assit sur une pierre, et il paraît qu'un passant qui\r\n-traversait l'entendit s'écrier:\r\n-\r\n---Je ne suis pas même un chien!\r\n-\r\n-Bientôt il se releva et se remit à marcher. Il sortit de la ville,\r\n-espérant trouver quelque arbre ou quelque meule dans les champs, et s'y\r\n-abriter.\r\n-\r\n-Il chemina ainsi quelque temps, la tête toujours baissée. Quand il se\r\n-sentit loin de toute habitation humaine, il leva les yeux et chercha\r\n-autour de lui. Il était dans un champ; il avait devant lui une de ces\r\n-collines basses couvertes de chaume coupé ras, qui après la moisson\r\n-ressemblent à des têtes tondues.\r\n-\r\n-L'horizon était tout noir; ce n'était pas seulement le sombre de la\r\n-nuit; c'étaient des nuages très bas qui semblaient s'appuyer sur la\r\n-colline même et qui montaient, emplissant tout le ciel. Cependant, comme\r\n-la lune allait se lever et qu'il flottait encore au zénith un reste de\r\n-clarté crépusculaire, ces nuages formaient au haut du ciel une sorte de\r\n-voûte blanchâtre d'où tombait sur la terre une lueur.\r\n-\r\n-La terre était donc plus éclairée que le ciel, ce qui est un effet\r\n-particulièrement sinistre, et la colline, d'un pauvre et chétif contour,\r\n-se dessinait vague et blafarde sur l'horizon ténébreux. Tout cet\r\n-ensemble était hideux, petit, lugubre et borné. Rien dans le champ ni\r\n-sur la colline qu'un arbre difforme qui se tordait en frissonnant à \r\n-quelques pas du voyageur.\r\n-\r\n-Cet homme était évidemment très loin d'avoir de ces délicates habitudes\r\n-d'intelligence et d'esprit qui font qu'on est sensible aux aspects\r\n-mystérieux des choses; cependant il y avait dans ce ciel, dans cette\r\n-colline, dans cette plaine et dans cet arbre, quelque chose de si\r\n-profondément désolé qu'après un moment d'immobilité et de rêverie, il\r\n-rebroussa chemin brusquement. Il y a des instants où la nature semble\r\n-hostile.\r\n-\r\n-Il revint sur ses pas. Les portes de Digne étaient fermées. Digne, qui a\r\n-soutenu des sièges dans les guerres de religion, était encore entourée\r\n-en 1815 de vieilles murailles flanquées de tours carrées qu'on a\r\n-démolies depuis. Il passa par une brèche et rentra dans la ville.\r\n-\r\n-Il pouvait être huit heures du soir. Comme il ne connaissait pas les\r\n-rues, il recommença sa promenade à l'aventure.\r\n-\r\n-Il parvint ainsi à la préfecture, puis au séminaire. En passant sur la\r\n-place de la cathédrale, il montra le poing à l'église.\r\n-\r\n-Il y a au coin de cette place une imprimerie. C'est là que furent\r\n-imprimées pour la première fois les proclamations de l'empereur et de la\r\n-garde impériale à l'armée, apportées de l'île d'Elbe et dictées par\r\n-Napoléon lui-même.\r\n-\r\n-Épuisé de fatigue et n'espérant plus rien, il se coucha sur le banc de\r\n-pierre qui est à la porte de cette imprimerie.\r\n-\r\n-Une vieille femme sortait de l'église en ce moment. Elle vit cet homme\r\n-étendu dans l'ombre.\r\n-\r\n---Que faites-vous là , mon ami? dit-elle.\r\n-\r\n-Il répondit durement et avec colère:\r\n-\r\n---Vous le voyez, bonne femme, je me couche.\r\n-\r\n-La bonne femme, bien digne de ce nom en effet, était madame la marquise\r\n-de R.\r\n-\r\n---Sur ce banc? reprit-elle.\r\n-\r\n---J'ai eu pendant dix-neuf ans un matelas de bois, dit l'homme, j'ai\r\n-aujourd'hui un matelas de pierre.\r\n-\r\n---Vous avez été soldat?\r\n-\r\n---Oui, bonne femme. Soldat.\r\n-\r\n---Pourquoi n'allez-vous pas à l'auberge?\r\n-\r\n---Parce que je n'ai pas d'argent.\r\n-\r\n---Hélas, dit madame de R., je n'ai dans ma bourse que quatre sous.\r\n-\r\n---Donnez toujours.\r\n-\r\n-L'homme prit les quatre sous. Madame de R. continua:\r\n-\r\n---Vous ne pouvez vous loger avec si peu dans une auberge. Avez-vous\r\n-essayé pourtant? Il est impossible que vous passiez ainsi la nuit. Vous\r\n-avez sans doute froid et faim. On aurait pu vous loger par charité.\r\n-\r\n---J'ai frappé à toutes les portes.\r\n-\r\n---Eh bien?\r\n-\r\n---Partout on m'a chassé.\r\n-\r\n-La «bonne femme» toucha le bras de l'homme et lui montra de l'autre côté\r\n-de la place une petite maison basse à côté de l'évêché.\r\n-\r\n---Vous avez, reprit-elle, frappé à toutes les portes?\r\n-\r\n---Oui.\r\n-\r\n---Avez-vous frappé à celle-là ?\r\n-\r\n---Non.\r\n-\r\n---Frappez-y.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre II\r\n-\r\n-La prudence conseillée à la sagesse\r\n-\r\n-\r\n-Ce soir-là , M. l'évêque de Digne, après sa promenade en ville, était\r\n-resté assez tard enfermé dans sa chambre. Il s'occupait d'un grand\r\n-travail sur les _Devoirs_, lequel est malheureusement demeuré inachevé.\r\n-Il dépouillait soigneusement tout ce que les Pères et les Docteurs ont\r\n-dit sur cette grave matière. Son livre était divisé en deux parties;\r\n-premièrement les devoirs de tous, deuxièmement les devoirs de chacun,\r\n-selon la classe à laquelle il appartient. Les devoirs de tous sont les\r\n-grands devoirs. Il y en a quatre. Saint Matthieu les indique: devoirs\r\n-envers Dieu (Matth., VI), devoirs envers soi-même (Matth., V, 29, 30),\r\n-devoirs envers le prochain (Matth., VII, 12), devoirs envers les\r\n-créatures (Matth., VI, 20, 25). Pour les autres devoirs, l'évêque les\r\n-avait trouvés indiqués et prescrits ailleurs; aux souverains et aux\r\n-sujets, dans l'Épître aux Romains; aux magistrats, aux épouses, aux\r\n-mères et aux jeunes hommes, par saint Pierre; aux maris, aux pères, aux\r\n-enfants et aux serviteurs, dans l'Épître aux Éphésiens; aux fidèles,\r\n-dans l'Épître aux Hébreux; aux vierges, dans l'Épître aux Corinthiens.\r\n-Il faisait laborieusement de toutes ces prescriptions un ensemble\r\n-harmonieux qu'il voulait présenter aux âmes.\r\n-\r\n-Il travaillait encore à huit heures, écrivant assez incommodément sur de\r\n-petits carrés de papier avec un gros livre ouvert sur ses genoux, quand\r\n-madame Magloire entra, selon son habitude, pour prendre l'argenterie\r\n-dans le placard près du lit. Un moment après, l'évêque, sentant que le\r\n-couvert était mis et que sa soeur l'attendait peut-être, ferma son\r\n-livre, se leva de sa table et entra dans la salle à manger.\r\n-\r\n-La salle à manger était une pièce oblongue à cheminée, avec porte sur la\r\n-rue (nous l'avons dit), et fenêtre sur le jardin.\r\n-\r\n-Madame Magloire achevait en effet de mettre le couvert.\r\n-\r\n-Tout en vaquant au service, elle causait avec mademoiselle Baptistine.\r\n-\r\n-Une lampe était sur la table; la table était près de la cheminée. Un\r\n-assez bon feu était allumé.\r\n-\r\n-On peut se figurer facilement ces deux femmes qui avaient toutes deux\r\n-passé soixante ans: madame Magloire petite, grasse, vive; mademoiselle\r\n-Baptistine, douce, mince, frêle, un peu plus grande que son frère, vêtue\r\n-d'une robe de soie puce, couleur à la mode en 1806, qu'elle avait\r\n-achetée alors à Paris et qui lui durait encore. Pour emprunter des\r\n-locutions vulgaires qui ont le mérite de dire avec un seul mot une idée\r\n-qu'une page suffirait à peine à exprimer, madame Magloire avait l'air\r\n-d'une _paysanne_ et mademoiselle Baptistine d'une _dame_. Madame\r\n-Magloire avait un bonnet blanc à tuyaux, au cou une jeannette d'or, le\r\n-seul bijou de femme qu'il y eût dans la maison, un fichu très blanc\r\n-sortant de la robe de bure noire à manches larges et courtes, un tablier\r\n-de toile de coton à carreaux rouges et verts, noué à la ceinture d'un\r\n-ruban vert, avec pièce d'estomac pareille rattachée par deux épingles\r\n-aux deux coins d'en haut, aux pieds de gros souliers et des bas jaunes\r\n-comme les femmes de Marseille. La robe de mademoiselle Baptistine était\r\n-coupée sur les patrons de 1806, taille courte, fourreau étroit, manches\r\n-à épaulettes, avec pattes et boutons. Elle cachait ses cheveux gris sous\r\n-une perruque frisée dite à _l'enfant_. Madame Magloire avait l'air\r\n-intelligent, vif et bon; les deux angles de sa bouche inégalement\r\n-relevés et la lèvre supérieure plus grosse que la lèvre inférieure lui\r\n-donnaient quelque chose de bourru et d'impérieux. Tant que monseigneur\r\n-se taisait, elle lui parlait résolument avec un mélange de respect et de\r\n-liberté; mais dès que monseigneur parlait, on a vu cela, elle obéissait\r\n-passivement comme mademoiselle. Mademoiselle Baptistine ne parlait même\r\n-pas. Elle se bornait à obéir et à complaire. Même quand elle était\r\n-jeune, elle n'était pas jolie, elle avait de gros yeux bleus à fleur de\r\n-tête et le nez long et busqué; mais tout son visage, toute sa personne,\r\n-nous l'avons dit en commençant, respiraient une ineffable bonté. Elle\r\n-avait toujours été prédestinée à la mansuétude; mais la foi, la charité,\r\n-l'espérance, ces trois vertus qui chauffent doucement l'âme, avaient\r\n-élevé peu à peu cette mansuétude jusqu'à la sainteté. La nature n'en\r\n-avait fait qu'une brebis, la religion en avait fait un ange. Pauvre\r\n-sainte fille! doux souvenir disparu! Mademoiselle Baptistine a depuis\r\n-raconté tant de fois ce qui s'était passé à l'évêché cette soirée-là ,\r\n-que plusieurs personnes qui vivent encore s'en rappellent les moindres\r\n-détails.\r\n-\r\n-Au moment où M. l'évêque entra, madame Magloire parlait avec quelque\r\n-vivacité. Elle entretenait _mademoiselle_ d'un sujet qui lui était\r\n-familier et auquel l'évêque était accoutumé. Il s'agissait du loquet de\r\n-la porte d'entrée.\r\n-\r\n-Il paraît que, tout en allant faire quelques provisions pour le souper,\r\n-madame Magloire avait entendu dire des choses en divers lieux. On\r\n-parlait d'un rôdeur de mauvaise mine; qu'un vagabond suspect serait\r\n-arrivé, qu'il devait être quelque part dans la ville, et qu'il se\r\n-pourrait qu'il y eût de méchantes rencontres pour ceux qui s'aviseraient\r\n-de rentrer tard chez eux cette nuit-là . Que la police était bien mal\r\n-faite du reste, attendu que M. le préfet et M. le maire ne s'aimaient\r\n-pas, et cherchaient à se nuire en faisant arriver des événements. Que\r\n-c'était donc aux gens sages à faire la police eux-mêmes et à se bien\r\n-garder, et qu'il faudrait avoir soin de dûment clore, verrouiller et\r\n-barricader sa maison, _et de bien fermer ses portes_.\r\n-\r\n-Madame Magloire appuya sur ce dernier mot; mais l'évêque venait de sa\r\n-chambre où il avait eu assez froid, il s'était assis devant la cheminée\r\n-et se chauffait, et puis il pensait à autre chose. Il ne releva pas le\r\n-mot à effet que madame Magloire venait de laisser tomber. Elle le\r\n-répéta. Alors, mademoiselle Baptistine, voulant satisfaire madame\r\n-Magloire sans déplaire à son frère, se hasarda à dire timidement:\r\n-\r\n---Mon frère, entendez-vous ce que dit madame Magloire?\r\n-\r\n---J'en ai entendu vaguement quelque chose, répondit l'évêque.\r\n-\r\n-Puis tournant à demi sa chaise, mettant ses deux mains sur ses genoux,\r\n-et levant vers la vieille servante son visage cordial et facilement\r\n-joyeux, que le feu éclairait d'en bas:\r\n-\r\n---Voyons. Qu'y a-t-il? qu'y a-t-il? Nous sommes donc dans quelque gros\r\n-danger?\r\n-\r\n-Alors madame Magloire recommença toute l'histoire, en l'exagérant\r\n-quelque peu, sans s'en douter. Il paraîtrait qu'un bohémien, un\r\n-va-nu-pieds, une espèce de mendiant dangereux serait en ce moment dans\r\n-la ville. Il s'était présenté pour loger chez Jacquin Labarre qui\r\n-n'avait pas voulu le recevoir. On l'avait vu arriver par le boulevard\r\n-Gassendi et rôder dans les rues à la brume. Un homme de sac et de corde\r\n-avec une figure terrible.\r\n-\r\n---Vraiment? dit l'évêque.\r\n-\r\n-Ce consentement à l'interroger encouragea madame Magloire; cela lui\r\n-semblait indiquer que l'évêque n'était pas loin de s'alarmer; elle\r\n-poursuivit triomphante:\r\n-\r\n---Oui, monseigneur. C'est comme cela. Il y aura quelque malheur cette\r\n-nuit dans la ville. Tout le monde le dit. Avec cela que la police est si\r\n-mal faite (répétition inutile). Vivre dans un pays de montagnes, et\r\n-n'avoir pas même de lanternes la nuit dans les rues! On sort. Des fours,\r\n-quoi! Et je dis, monseigneur, et mademoiselle que voilà dit comme moi....\r\n-\r\n---Moi, interrompit la soeur, je ne dis rien. Ce que mon frère fait est\r\n-bien fait.\r\n-\r\n-Madame Magloire continua comme s'il n'y avait pas eu de protestation:\r\n-\r\n---Nous disons que cette maison-ci n'est pas sûre du tout; que, si\r\n-monseigneur le permet, je vais aller dire à Paulin Musebois, le\r\n-serrurier, qu'il vienne remettre les anciens verrous de la porte; on les\r\n-a là , c'est une minute; et je dis qu'il faut des verrous, monseigneur,\r\n-ne serait-ce que pour cette nuit; car je dis qu'une porte qui s'ouvre du\r\n-dehors avec un loquet, par le premier passant venu, rien n'est plus\r\n-terrible; avec cela que monseigneur a l'habitude de toujours dire\r\n-d'entrer, et que d'ailleurs, même au milieu de la nuit, ô mon Dieu! on\r\n-n'a pas besoin d'en demander la permission....\r\n-\r\n-En ce moment, on frappa à la porte un coup assez violent.\r\n-\r\n---Entrez, dit l'évêque.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre III\r\n-\r\n-Héroïsme de l'obéissance passive\r\n-\r\n-\r\n-La porte s'ouvrit.\r\n-\r\n-Elle s'ouvrit vivement, toute grande, comme si quelqu'un la poussait\r\n-avec énergie et résolution.\r\n-\r\n-Un homme entra.\r\n-\r\n-Cet homme, nous le connaissons déjà . C'est le voyageur que nous avons vu\r\n-tout à l'heure errer cherchant un gîte.\r\n-\r\n-Il entra, fit un pas, et s'arrêta, laissant la porte ouverte derrière\r\n-lui. Il avait son sac sur l'épaule, son bâton à la main, une expression\r\n-rude, hardie, fatiguée et violente dans les yeux. Le feu de la cheminée\r\n-l'éclairait. Il était hideux. C'était une sinistre apparition.\r\n-\r\n-Madame Magloire n'eut pas même la force de jeter un cri. Elle\r\n-tressaillit, et resta béante.\r\n-\r\n-Mademoiselle Baptistine se retourna, aperçut l'homme qui entrait et se\r\n-dressa à demi d'effarement, puis, ramenant peu à peu sa tête vers la\r\n-cheminée, elle se mit à regarder son frère et son visage redevint\r\n-profondément calme et serein.\r\n-\r\n-L'évêque fixait sur l'homme un oeil tranquille.\r\n-\r\n-Comme il ouvrait la bouche, sans doute pour demander au nouveau venu ce\r\n-qu'il désirait, l'homme appuya ses deux mains à la fois sur son bâton,\r\n-promena ses yeux tour à tour sur le vieillard et les femmes, et, sans\r\n-attendre que l'évêque parlât, dit d'une voix haute:\r\n-\r\n---Voici. Je m'appelle Jean Valjean. Je suis un galérien. J'ai passé\r\n-dix-neuf ans au bagne. Je suis libéré depuis quatre jours et en route\r\n-pour Pontarlier qui est ma destination. Quatre jours et que je marche\r\n-depuis Toulon. Aujourd'hui, j'ai fait douze lieues à pied. Ce soir, en\r\n-arrivant dans ce pays, j'ai été dans une auberge, on m'a renvoyé à cause\r\n-de mon passeport jaune que j'avais montré à la mairie. Il avait fallu.\r\n-J'ai été à une autre auberge. On m'a dit: Va-t-en! Chez l'un, chez\r\n-l'autre. Personne n'a voulu de moi. J'ai été à la prison, le guichetier\r\n-n'a pas ouvert. J'ai été dans la niche d'un chien. Ce chien m'a mordu et\r\n-m'a chassé, comme s'il avait été un homme. On aurait dit qu'il savait\r\n-qui j'étais. Je m'en suis allé dans les champs pour coucher à la belle\r\n-étoile. Il n'y avait pas d'étoile. J'ai pensé qu'il pleuvrait, et qu'il\r\n-n'y avait pas de bon Dieu pour empêcher de pleuvoir, et je suis rentré\r\n-dans la ville pour y trouver le renfoncement d'une porte. Là , dans la\r\n-place, j'allais me coucher sur une pierre. Une bonne femme m'a montré\r\n-votre maison et m'a dit: «Frappe là ». J'ai frappé. Qu'est-ce que c'est\r\n-ici? Êtes-vous une auberge? J'ai de l'argent. Ma masse. Cent neuf francs\r\n-quinze sous que j'ai gagnés au bagne par mon travail en dix-neuf ans. Je\r\n-payerai. Qu'est-ce que cela me fait? J'ai de l'argent. Je suis très\r\n-fatigué, douze lieues à pied, j'ai bien faim. Voulez-vous que je reste?\r\n-\r\n---Madame Magloire, dit l'évêque, vous mettrez un couvert de plus.\r\n-\r\n-L'homme fit trois pas et s'approcha de la lampe qui était sur la table.\r\n-\r\n---Tenez, reprit-il, comme s'il n'avait pas bien compris, ce n'est pas\r\n-ça. Avez-vous entendu? Je suis un galérien. Un forçat. Je viens des\r\n-galères.\r\n-\r\n-Il tira de sa poche une grande feuille de papier jaune qu'il déplia.\r\n-\r\n---Voilà mon passeport. Jaune, comme vous voyez. Cela sert à me faire\r\n-chasser de partout où je suis. Voulez-vous lire? Je sais lire, moi. J'ai\r\n-appris au bagne. Il y a une école pour ceux qui veulent. Tenez, voilà ce\r\n-qu'on a mis sur le passeport: «Jean Valjean, forçat libéré, natif\r\n-de...--cela vous est égal...--Est resté dix-neuf ans au bagne. Cinq ans\r\n-pour vol avec effraction. Quatorze ans pour avoir tenté de s'évader\r\n-quatre fois. Cet homme est très dangereux.»--Voilà ! Tout le monde m'a\r\n-jeté dehors. Voulez-vous me recevoir, vous? Est-ce une auberge?\r\n-Voulez-vous me donner à manger et à coucher? Avez-vous une écurie?\r\n-\r\n---Madame Magloire, dit l'évêque, vous mettrez des draps blancs au lit de\r\n-l'alcôve.\r\n-\r\n-Nous avons déjà expliqué de quelle nature était l'obéissance des deux\r\n-femmes.\r\n-\r\n-Madame Magloire sortit pour exécuter ces ordres. L'évêque se tourna vers\r\n-l'homme.\r\n-\r\n---Monsieur, asseyez-vous et chauffez-vous. Nous allons souper dans un\r\n-instant, et l'on fera votre lit pendant que vous souperez.\r\n-\r\n-Ici l'homme comprit tout à fait. L'expression de son visage, jusqu'alors\r\n-sombre et dure, s'empreignit de stupéfaction, de doute, de joie, et\r\n-devint extraordinaire. Il se mit à balbutier comme un homme fou:\r\n-\r\n---Vrai? quoi? vous me gardez? vous ne me chassez pas! un forçat! Vous\r\n-m'appelez monsieur! vous ne me tutoyez pas! Va-t-en, chien! qu'on me dit\r\n-toujours. Je croyais bien que vous me chasseriez. Aussi j'avais dit tout\r\n-de suite qui je suis. Oh! la brave femme qui m'a enseigné ici! Je vais\r\n-souper! un lit! Un lit avec des matelas et des draps! comme tout le\r\n-monde! il y a dix-neuf ans que je n'ai couché dans un lit! Vous voulez\r\n-bien que je ne m'en aille pas! Vous êtes de dignes gens! D'ailleurs j'ai\r\n-de l'argent. Je payerai bien. Pardon, monsieur l'aubergiste, comment\r\n-vous appelez-vous? Je payerai tout ce qu'on voudra. Vous êtes un brave\r\n-homme. Vous êtes aubergiste, n'est-ce pas?\r\n-\r\n---Je suis, dit l'évêque, un prêtre qui demeure ici.\r\n-\r\n---Un prêtre! reprit l'homme. Oh! un brave homme de prêtre! Alors vous ne\r\n-me demandez pas d'argent? Le curé, n'est-ce pas? le curé de cette grande\r\n-église? Tiens! c'est vrai, que je suis bête! je n'avais pas vu votre\r\n-calotte!\r\n-\r\n-Tout en parlant, il avait déposé son sac et son bâton dans un coin, puis\r\n-remis son passeport dans sa poche, et il s'était assis. Mademoiselle\r\n-Baptistine le considérait avec douceur. Il continua:\r\n-\r\n---Vous êtes humain, monsieur le curé. Vous n'avez pas de mépris. C'est\r\n-bien bon un bon prêtre. Alors vous n'avez pas besoin que je paye?\r\n-\r\n---Non, dit l'évêque, gardez votre argent. Combien avez-vous? ne\r\n-m'avez-vous pas dit cent neuf francs?\r\n-\r\n---Quinze sous, ajouta l'homme.\r\n-\r\n---Cent neuf francs quinze sous. Et combien de temps avez-vous mis à \r\n-gagner cela?\r\n-\r\n---Dix-neuf ans.\r\n-\r\n---Dix-neuf ans!\r\n-\r\n-L'évêque soupira profondément.\r\n-\r\n-L'homme poursuivit:\r\n-\r\n---J'ai encore tout mon argent. Depuis quatre jours je n'ai dépensé que\r\n-vingt-cinq sous que j'ai gagnés en aidant à décharger des voitures à \r\n-Grasse. Puisque vous êtes abbé, je vais vous dire, nous avions un\r\n-aumônier au bagne. Et puis un jour j'ai vu un évêque. Monseigneur, qu'on\r\n-appelle. C'était l'évêque de la Majore, à Marseille. C'est le curé qui\r\n-est sur les curés. Vous savez, pardon, je dis mal cela, mais pour moi,\r\n-c'est si loin!--Vous comprenez, nous autres! Il a dit la messe au milieu\r\n-du bagne, sur un autel, il avait une chose pointue, en or, sur la tête.\r\n-Au grand jour de midi, cela brillait. Nous étions en rang. Des trois\r\n-côtés. Avec les canons, mèche allumée, en face de nous. Nous ne voyions\r\n-pas bien. Il a parlé, mais il était trop au fond, nous n'entendions pas.\r\n-Voilà ce que c'est qu'un évêque.\r\n-\r\n-Pendant qu'il parlait, l'évêque était allé pousser la porte qui était\r\n-restée toute grande ouverte.\r\n-\r\n-Madame Magloire rentra. Elle apportait un couvert qu'elle mit sur la\r\n-table.\r\n-\r\n---Madame Magloire, dit l'évêque, mettez ce couvert le plus près possible\r\n-du feu.\r\n-\r\n-Et se tournant vers son hôte:\r\n-\r\n---Le vent de nuit est dur dans les Alpes. Vous devez avoir froid,\r\n-monsieur?\r\n-\r\n-Chaque fois qu'il disait ce mot monsieur, avec sa voix doucement grave\r\n-et de si bonne compagnie, le visage de l'homme s'illuminait. Monsieur à \r\n-un forçat, c'est un verre d'eau à un naufragé de la Méduse. L'ignominie\r\n-a soif de considération.\r\n-\r\n---Voici, reprit l'évêque, une lampe qui éclaire bien mal.\r\n-\r\n-Madame Magloire comprit, et elle alla chercher sur la cheminée de la\r\n-chambre à coucher de monseigneur les deux chandeliers d'argent qu'elle\r\n-posa sur la table tout allumés.\r\n-\r\n---Monsieur le curé, dit l'homme, vous êtes bon. Vous ne me méprisez pas.\r\n-Vous me recevez chez vous. Vous allumez vos cierges pour moi. Je ne vous\r\n-ai pourtant pas caché d'où je viens et que je suis un homme malheureux.\r\n-\r\n-L'évêque, assis près de lui, lui toucha doucement la main.\r\n-\r\n---Vous pouviez ne pas me dire qui vous étiez.\r\n-\r\n-Ce n'est pas ici ma maison, c'est la maison de Jésus-Christ. Cette porte\r\n-ne demande pas à celui qui entre s'il a un nom, mais s'il a une douleur.\r\n-Vous souffrez; vous avez faim et soif; soyez le bienvenu. Et ne me\r\n-remerciez pas, ne me dites pas que je vous reçois chez moi. Personne\r\n-n'est ici chez soi, excepté celui qui a besoin d'un asile. Je vous le\r\n-dis à vous qui passez, vous êtes ici chez vous plus que moi-même. Tout\r\n-ce qui est ici est à vous. Qu'ai-je besoin de savoir votre nom?\r\n-D'ailleurs, avant que vous me le disiez, vous en avez un que je savais.\r\n-\r\n-L'homme ouvrit des yeux étonnés.\r\n-\r\n---Vrai? vous saviez comment je m'appelle?\r\n-\r\n---Oui, répondit l'évêque, vous vous appelez mon frère.\r\n-\r\n---Tenez, monsieur le curé! s'écria l'homme, j'avais bien faim en entrant\r\n-ici; mais vous êtes si bon qu'à présent je ne sais plus ce que j'ai;\r\n-cela m'a passé.\r\n-\r\n-L'évêque le regarda et lui dit:\r\n-\r\n---Vous avez bien souffert?\r\n-\r\n---Oh! la casaque rouge, le boulet au pied, une planche pour dormir, le\r\n-chaud, le froid, le travail, la chiourme, les coups de bâton! La double\r\n-chaîne pour rien. Le cachot pour un mot. Même malade au lit, la chaîne.\r\n-Les chiens, les chiens sont plus heureux! Dix-neuf ans! J'en ai\r\n-quarante-six. À présent, le passeport jaune! Voilà .\r\n-\r\n---Oui, reprit l'évêque, vous sortez d'un lieu de tristesse. Écoutez. Il\r\n-y aura plus de joie au ciel pour le visage en larmes d'un pécheur\r\n-repentant que pour la robe blanche de cent justes. Si vous sortez de ce\r\n-lieu douloureux avec des pensées de haine et de colère contre les\r\n-hommes, vous êtes digne de pitié; si vous en sortez avec des pensées de\r\n-bienveillance, de douceur et de paix, vous valez mieux qu'aucun de nous.\r\n-\r\n-Cependant madame Magloire avait servi le souper. Une soupe faite avec de\r\n-l'eau, de l'huile, du pain et du sel, un peu de lard, un morceau de\r\n-viande de mouton, des figues, un fromage frais, et un gros pain de\r\n-seigle. Elle avait d'elle-même ajouté à l'ordinaire de M. l'évêque une\r\n-bouteille de vieux vin de Mauves.\r\n-\r\n-Le visage de l'évêque prit tout à coup cette expression de gaîté propre\r\n-aux natures hospitalières:\r\n-\r\n---À table! dit-il vivement.\r\n-\r\n-Comme il en avait coutume lorsque quelque étranger soupait avec lui, il\r\n-fit asseoir l'homme à sa droite. Mademoiselle Baptistine, parfaitement\r\n-paisible et naturelle, prit place à sa gauche.\r\n-\r\n-L'évêque dit le bénédicité, puis servit lui-même la soupe, selon son\r\n-habitude. L'homme se mit à manger avidement.\r\n-\r\n-Tout à coup l'évêque dit:\r\n-\r\n---Mais il me semble qu'il manque quelque chose sur cette table.\r\n-\r\n-Madame Magloire en effet n'avait mis que les trois couverts absolument\r\n-nécessaires. Or c'était l'usage de la maison, quand l'évêque avait\r\n-quelqu'un à souper, de disposer sur la nappe les six couverts d'argent,\r\n-étalage innocent. Ce gracieux semblant de luxe était une sorte\r\n-d'enfantillage plein de charme dans cette maison douce et sévère qui\r\n-élevait la pauvreté jusqu'à la dignité.\r\n-\r\n-Madame Magloire comprit l'observation, sortit sans dire un mot, et un\r\n-moment après les trois couverts réclamés par l'évêque brillaient sur la\r\n-nappe, symétriquement arrangés devant chacun des trois convives.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IV\r\n-\r\n-Détails sur les fromageries de Pontarlier\r\n-\r\n-\r\n-Maintenant, pour donner une idée de ce qui se passa à cette table, nous\r\n-ne saurions mieux faire que de transcrire ici un passage d'une lettre de\r\n-mademoiselle Baptistine à madame de Boischevron, où la conversation du\r\n-forçat et de l'évêque est racontée avec une minutie naïve:\r\n-\r\n- * * * * *\r\n-\r\n-«...Cet homme ne faisait aucune attention à personne. Il mangeait avec\r\n-une voracité d'affamé. Cependant, après la soupe, il a dit:\r\n-\r\n-«--Monsieur le curé du bon Dieu, tout ceci est encore bien trop bon pour\r\n-moi, mais je dois dire que les rouliers qui n'ont pas voulu me laisser\r\n-manger avec eux font meilleure chère que vous.\r\n-\r\n-«Entre nous, l'observation m'a un peu choquée. Mon frère a répondu:\r\n-\r\n-«--Ils ont plus de fatigue que moi.\r\n-\r\n-«--Non, a repris cet homme, ils ont plus d'argent. Vous êtes pauvre. Je\r\n-vois bien. Vous n'êtes peut-être pas même curé. Êtes-vous curé\r\n-seulement? Ah! par exemple, si le bon Dieu était juste, vous devriez\r\n-bien être curé.\r\n-\r\n-«--Le bon Dieu est plus que juste, a dit mon frère.\r\n-\r\n-«Un moment après il a ajouté:\r\n-\r\n-«--Monsieur Jean Valjean, c'est à Pontarlier que vous allez?\r\n-\r\n-«--Avec itinéraire obligé.\r\n-\r\n-«Je crois bien que c'est comme cela que l'homme a dit. Puis il a\r\n-continué:\r\n-\r\n-«--Il faut que je sois en route demain à la pointe du jour. Il fait dur\r\n-voyager. Si les nuits sont froides, les journées sont chaudes.\r\n-\r\n-«--Vous allez là , a repris mon frère, dans un bon pays. À la révolution,\r\n-ma famille a été ruinée, je me suis réfugié en Franche-Comté d'abord, et\r\n-j'y ai vécu quelque temps du travail de mes bras. J'avais de la bonne\r\n-volonté. J'ai trouvé à m'y occuper. On n'a qu'à choisir. Il y a des\r\n-papeteries, des tanneries, des distilleries, des huileries, des\r\n-fabriques d'horlogerie en grand, des fabriques d'acier, des fabriques de\r\n-cuivre, au moins vingt usines de fer, dont quatre à Lods, à Châtillon, à \r\n-Audincourt et à Beure qui sont très considérables....\r\n-\r\n-«Je crois ne pas me tromper et que ce sont bien là les noms que mon\r\n-frère a cités, puis il s'est interrompu et m'a adressé la parole:\r\n-\r\n-«--Chère soeur, n'avons-nous pas des parents dans ce pays-là ?\r\n-\r\n-«J'ai répondu:\r\n-\r\n-«--Nous en avions, entre autres M. de Lucenet qui était capitaine des\r\n-portes à Pontarlier dans l'ancien régime.\r\n-\r\n-«--Oui, a repris mon frère, mais en 93 on n'avait plus de parents, on\r\n-n'avait que ses bras. J'ai travaillé. Ils ont dans le pays de\r\n-Pontarlier, où vous allez, monsieur Valjean, une industrie toute\r\n-patriarcale et toute charmante, ma soeur. Ce sont leurs fromageries\r\n-qu'ils appellent fruitières.\r\n-\r\n-«Alors mon frère, tout en faisant manger cet homme, lui a expliqué très\r\n-en détail ce que c'étaient que les fruitières de Pontarlier;--qu'on en\r\n-distinguait deux sortes:--les _grosses granges_, qui sont aux riches, et\r\n-où il y a quarante ou cinquante vaches, lesquelles produisent sept à \r\n-huit milliers de fromages par été; les _fruitières d'association_, qui\r\n-sont aux pauvres; ce sont les paysans de la moyenne montagne qui mettent\r\n-leurs vaches en commun et partagent les produits.--Ils prennent à leurs\r\n-gages un fromager qu'ils appellent le grurin;--le grurin reçoit le lait\r\n-des associés trois fois par jour et marque les quantités sur une taille\r\n-double;--c'est vers la fin d'avril que le travail des fromageries\r\n-commence; c'est vers la mi-juin que les fromagers conduisent leurs\r\n-vaches dans la montagne.\r\n-\r\n-«L'homme se ranimait tout en mangeant. Mon frère lui faisait boire de ce\r\n-bon vin de Mauves dont il ne boit pas lui-même parce qu'il dit que c'est\r\n-du vin cher. Mon frère lui disait tous ces détails avec cette gaîté\r\n-aisée que vous lui connaissez, entremêlant ses paroles de façons\r\n-gracieuses pour moi. Il est beaucoup revenu sur ce bon état de grurin,\r\n-comme s'il eût souhaité que cet homme comprît, sans le lui conseiller\r\n-directement et durement, que ce serait un asile pour lui. Une chose m'a\r\n-frappée. Cet homme était ce que je vous ai dit. Eh bien! mon frère,\r\n-pendant tout le souper, ni de toute la soirée, à l'exception de quelques\r\n-paroles sur Jésus quand il est entré, n'a pas dit un mot qui pût\r\n-rappeler à cet homme qui il était ni apprendre à cet homme qui était mon\r\n-frère. C'était bien une occasion en apparence de faire un peu de sermon\r\n-et d'appuyer l'évêque sur le galérien pour laisser la marque du passage.\r\n-Il eût paru peut-être à un autre que c'était le cas, ayant ce malheureux\r\n-sous la main, de lui nourrir l'âme en même temps que le corps et de lui\r\n-faire quelque reproche assaisonné de morale et de conseil, ou bien un\r\n-peu de commisération avec exhortation de se mieux conduire à l'avenir.\r\n-Mon frère ne lui a même pas demandé de quel pays il était, ni son\r\n-histoire. Car dans son histoire il y a sa faute, et mon frère semblait\r\n-éviter tout ce qui pouvait l'en faire souvenir. C'est au point qu'à un\r\n-certain moment, comme mon frère parlait des montagnards de Pontarlier,\r\n-qui ont _un doux travail près du ciel et qui_, ajoutait-il, _sont\r\n-heureux parce qu'ils sont innocents_, il s'est arrêté court, craignant\r\n-qu'il n'y eût dans ce mot qui lui échappait quelque chose qui pût\r\n-froisser l'homme. À force d'y réfléchir, je crois avoir compris ce qui\r\n-se passait dans le coeur de mon frère. Il pensait sans doute que cet\r\n-homme, qui s'appelle Jean Valjean, n'avait que trop sa misère présente à \r\n-l'esprit, que le mieux était de l'en distraire, et de lui faire croire,\r\n-ne fût-ce qu'un moment, qu'il était une personne comme une autre, en\r\n-étant pour lui tout ordinaire. N'est-ce pas là en effet bien entendre la\r\n-charité? N'y a-t-il pas, bonne madame, quelque chose de vraiment\r\n-évangélique dans cette délicatesse qui s'abstient de sermon, de morale\r\n-et d'allusion, et la meilleure pitié, quand un homme a un point\r\n-douloureux, n'est-ce pas de n'y point toucher du tout? Il m'a semblé que\r\n-ce pouvait être là la pensée intérieure de mon frère. Dans tous les cas,\r\n-ce que je puis dire, c'est que, s'il a eu toutes ces idées, il n'en a\r\n-rien marqué, même pour moi; il a été d'un bout à l'autre le même homme\r\n-que tous les soirs, et il a soupé avec ce Jean Valjean du même air et de\r\n-la même façon qu'il aurait soupé avec M. Gédéon Le Prévost ou avec M. le\r\n-curé de la paroisse.\r\n-\r\n-«Vers la fin, comme nous étions aux figues, on a cogné à la porte.\r\n-C'était la mère Gerbaud avec son petit dans ses bras. Mon frère a baisé\r\n-l'enfant au front, et m'a emprunté quinze sous que j'avais sur moi pour\r\n-les donner à la mère Gerbaud. L'homme pendant ce temps-là ne faisait pas\r\n-grande attention. Il ne parlait plus et paraissait très fatigué. La\r\n-pauvre vieille Gerbaud partie, mon frère a dit les grâces, puis il s'est\r\n-tourné vers cet homme, et il lui a dit: Vous devez avoir bien besoin de\r\n-votre lit. Madame Magloire a enlevé le couvert bien vite. J'ai compris\r\n-qu'il fallait nous retirer pour laisser dormir ce voyageur, et nous\r\n-sommes montées toutes les deux. J'ai cependant envoyé madame Magloire un\r\n-instant après porter sur le lit de cet homme une peau de chevreuil de la\r\n-Forêt-Noire qui est dans ma chambre. Les nuits sont glaciales, et cela\r\n-tient chaud. C'est dommage que cette peau soit vieille; tout le poil\r\n-s'en va. Mon frère l'a achetée du temps qu'il était en Allemagne, à \r\n-Tottlingen, près des sources du Danube, ainsi que le petit couteau à \r\n-manche d'ivoire dont je me sers à table.\r\n-\r\n-«Madame Magloire est remontée presque tout de suite, nous nous sommes\r\n-mises à prier Dieu dans le salon où l'on étend le linge, et puis nous\r\n-sommes rentrées chacune dans notre chambre sans nous rien dire.»\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre V\r\n-\r\n-Tranquillité\r\n-\r\n-\r\n-Après avoir donné le bonsoir à sa soeur, monseigneur Bienvenu prit sur\r\n-la table un des deux flambeaux d'argent, remit l'autre à son hôte, et\r\n-lui dit:\r\n-\r\n---Monsieur, je vais vous conduire à votre chambre.\r\n-\r\n-L'homme le suivit.\r\n-\r\n-Comme on a pu le remarquer dans ce qui a été dit plus haut, le logis\r\n-était distribué de telle sorte que, pour passer dans l'oratoire où était\r\n-l'alcôve ou pour en sortir, il fallait traverser la chambre à coucher de\r\n-l'évêque.\r\n-\r\n-Au moment où ils traversaient cette chambre, madame Magloire serrait\r\n-l'argenterie dans le placard qui était au chevet du lit. C'était le\r\n-dernier soin qu'elle prenait chaque soir avant de s'aller coucher.\r\n-\r\n-L'évêque installa son hôte dans l'alcôve. Un lit blanc et frais y était\r\n-dressé. L'homme posa le flambeau sur une petite table.\r\n-\r\n---Allons, dit l'évêque, faites une bonne nuit. Demain matin, avant de\r\n-partir, vous boirez une tasse de lait de nos vaches tout chaud.\r\n-\r\n---Merci, monsieur l'abbé, dit l'homme.\r\n-\r\n-À peine eut-il prononcé ces paroles pleines de paix que, tout à coup et\r\n-sans transition, il eut un mouvement étrange et qui eût glacé\r\n-d'épouvante les deux saintes filles si elles en eussent été témoins.\r\n-Aujourd'hui même il nous est difficile de nous rendre compte de ce qui\r\n-le poussait en ce moment. Voulait-il donner un avertissement ou jeter\r\n-une menace? Obéissait-il simplement à une sorte d'impulsion instinctive\r\n-et obscure pour lui-même? Il se tourna brusquement vers le vieillard,\r\n-croisa les bras, et, fixant sur son hôte un regard sauvage, il s'écria\r\n-d'une voix rauque:\r\n-\r\n---Ah çà ! décidément! vous me logez chez vous près de vous comme cela!\r\n-\r\n-Il s'interrompit et ajouta avec un rire où il y avait quelque chose de\r\n-monstrueux:\r\n-\r\n---Avez-vous bien fait toutes vos réflexions? Qui est-ce qui vous dit que\r\n-je n'ai pas assassiné?\r\n-\r\n-L'évêque leva les yeux vers le plafond et répondit:\r\n-\r\n---Cela regarde le bon Dieu.\r\n-\r\n-Puis, gravement et remuant les lèvres comme quelqu'un qui prie ou qui se\r\n-parle à lui-même, il dressa les deux doigts de sa main droite et bénit\r\n-l'homme qui ne se courba pas, et, sans tourner la tête et sans regarder\r\n-derrière lui, il rentra dans sa chambre.\r\n-\r\n-Quand l'alcôve était habitée, un grand rideau de serge tiré de part en\r\n-part dans l'oratoire cachait l'autel. L'évêque s'agenouilla en passant\r\n-devant ce rideau et fit une courte prière.\r\n-\r\n-Un moment après, il était dans son jardin, marchant, rêvant,\r\n-contemplant, l'âme et la pensée tout entières à ces grandes choses\r\n-mystérieuses que Dieu montre la nuit aux yeux qui restent ouverts.\r\n-\r\n-Quant à l'homme, il était vraiment si fatigué qu'il n'avait même pas\r\n-profité de ces bons draps blancs. Il avait soufflé sa bougie avec sa\r\n-narine à la manière des forçats et s'était laissé tomber tout habillé\r\n-sur le lit, où il s'était tout de suite profondément endormi.\r\n-\r\n-Minuit sonnait comme l'évêque rentrait de son jardin dans son\r\n-appartement.\r\n-\r\n-Quelques minutes après, tout dormait dans la petite maison.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VI\r\n-\r\n-Jean Valjean\r\n-\r\n-\r\n-Vers le milieu de la nuit, Jean Valjean se réveilla.\r\n-\r\n-Jean Valjean était d'une pauvre famille de paysans de la Brie. Dans son\r\n-enfance, il n'avait pas appris à lire. Quand il eut l'âge d'homme, il\r\n-était émondeur à Faverolles. Sa mère s'appelait Jeanne Mathieu; son père\r\n-s'appelait Jean Valjean, ou Vlajean, sobriquet probablement, et\r\n-contraction de _Voilà Jean_.\r\n-\r\n-Jean Valjean était d'un caractère pensif sans être triste, ce qui est le\r\n-propre des natures affectueuses. Somme toute, pourtant, c'était quelque\r\n-chose d'assez endormi et d'assez insignifiant, en apparence du moins,\r\n-que Jean Valjean. Il avait perdu en très bas âge son père et sa mère. Sa\r\n-mère était morte d'une fièvre de lait mal soignée. Son père, émondeur\r\n-comme lui, s'était tué en tombant d'un arbre. Il n'était resté à Jean\r\n-Valjean qu'une soeur plus âgée que lui, veuve, avec sept enfants, filles\r\n-et garçons. Cette soeur avait élevé Jean Valjean, et tant qu'elle eut\r\n-son mari elle logea et nourrit son jeune frère. Le mari mourut. L'aîné\r\n-des sept enfants avait huit ans, le dernier un an. Jean Valjean venait\r\n-d'atteindre, lui, sa vingt-cinquième année. Il remplaça le père, et\r\n-soutint à son tour sa soeur qui l'avait élevé. Cela se fit simplement,\r\n-comme un devoir, même avec quelque chose de bourru de la part de Jean\r\n-Valjean. Sa jeunesse se dépensait ainsi dans un travail rude et mal\r\n-payé. On ne lui avait jamais connu de «bonne amie» dans le pays. Il\r\n-n'avait pas eu le temps d'être amoureux.\r\n-\r\n-Le soir il rentrait fatigué et mangeait sa soupe sans dire un mot. Sa\r\n-soeur, mère Jeanne, pendant qu'il mangeait, lui prenait souvent dans son\r\n-écuelle le meilleur de son repas, le morceau de viande, la tranche de\r\n-lard le coeur de chou, pour le donner à quelqu'un de ses enfants; lui,\r\n-mangeant toujours, penché sur la table, presque la tête dans sa soupe,\r\n-ses longs cheveux tombant autour de son écuelle et cachant ses yeux,\r\n-avait l'air de ne rien voir et laissait faire. Il y avait à Faverolles,\r\n-pas loin de la chaumière Valjean, de l'autre côté de la ruelle, une\r\n-fermière appelée Marie-Claude; les enfants Valjean, habituellement\r\n-affamés, allaient quelquefois emprunter au nom de leur mère une pinte de\r\n-lait à Marie-Claude, qu'ils buvaient derrière une haie ou dans quelque\r\n-coin d'allée, s'arrachant le pot, et si hâtivement que les petites\r\n-filles s'en répandaient sur leur tablier et dans leur goulotte. La mère,\r\n-si elle eût su cette maraude, eût sévèrement corrigé les délinquants.\r\n-Jean Valjean, brusque et bougon, payait en arrière de la mère la pinte\r\n-de lait à Marie-Claude, et les enfants n'étaient pas punis.\r\n-\r\n-Il gagnait dans la saison de l'émondage vingt-quatre sous par jour, puis\r\n-il se louait comme moissonneur, comme manoeuvre, comme garçon de ferme\r\n-bouvier, comme homme de peine. Il faisait ce qu'il pouvait. Sa soeur\r\n-travaillait de son côté, mais que faire avec sept petits enfants?\r\n-C'était un triste groupe que la misère enveloppa et étreignit peu à peu.\r\n-Il arriva qu'un hiver fut rude. Jean n'eut pas d'ouvrage. La famille\r\n-n'eut pas de pain. Pas de pain. À la lettre. Sept enfants! Un dimanche\r\n-soir, Maubert Isabeau, boulanger sur la place de l'Église, à Faverolles,\r\n-se disposait à se coucher, lorsqu'il entendit un coup violent dans la\r\n-devanture grillée et vitrée de sa boutique. Il arriva à temps pour voir\r\n-un bras passé à travers un trou fait d'un coup de poing dans la grille\r\n-et dans la vitre. Le bras saisit un pain et l'emporta. Isabeau sortit en\r\n-hâte; le voleur s'enfuyait à toutes jambes; Isabeau courut après lui et\r\n-l'arrêta. Le voleur avait jeté le pain, mais il avait encore le bras\r\n-ensanglanté. C'était Jean Valjean.\r\n-\r\n-Ceci se passait en 1795. Jean Valjean fut traduit devant les tribunaux\r\n-du temps «pour vol avec effraction la nuit dans une maison habitée». Il\r\n-avait un fusil dont il se servait mieux que tireur au monde, il était\r\n-quelque peu braconnier; ce qui lui nuisit. Il y a contre les braconniers\r\n-un préjugé légitime. Le braconnier, de même que le contrebandier, côtoie\r\n-de fort près le brigand. Pourtant, disons-le en passant, il y a encore\r\n-un abîme entre ces races d'hommes et le hideux assassin des villes. Le\r\n-braconnier vit dans la forêt; le contrebandier vit dans la montagne ou\r\n-sur la mer. Les villes font des hommes féroces parce qu'elles font des\r\n-hommes corrompus. La montagne, la mer, la forêt, font des hommes\r\n-sauvages. Elles développent le côté farouche, mais souvent sans détruire\r\n-le côté humain.\r\n-\r\n-Jean Valjean fut déclaré coupable. Les termes du code étaient formels.\r\n-Il y a dans notre civilisation des heures redoutables; ce sont les\r\n-moments où la pénalité prononce un naufrage. Quelle minute funèbre que\r\n-celle où la société s'éloigne et consomme l'irréparable abandon d'un\r\n-être pensant! Jean Valjean fut condamné à cinq ans de galères.\r\n-\r\n-Le 22 avril 1796, on cria dans Paris la victoire de Montenotte remportée\r\n-par le général en chef de l'année d'Italie, que le message du Directoire\r\n-aux Cinq-Cents, du 2 floréal an IV, appelle Buona-Parte; ce même jour\r\n-une grande chaîne fut ferrée à Bicêtre. Jean Valjean fit partie de cette\r\n-chaîne. Un ancien guichetier de la prison, qui a près de\r\n-quatre-vingt-dix ans aujourd'hui, se souvient encore parfaitement de ce\r\n-malheureux qui fut ferré à l'extrémité du quatrième cordon dans l'angle\r\n-nord de la cour. Il était assis à terre comme tous les autres. Il\r\n-paraissait ne rien comprendre à sa position, sinon qu'elle était\r\n-horrible. Il est probable qu'il y démêlait aussi, à travers les vagues\r\n-idées d'un pauvre homme ignorant de tout, quelque chose d'excessif.\r\n-Pendant qu'on rivait à grands coups de marteau derrière sa tête le\r\n-boulon de son carcan, il pleurait, les larmes l'étouffaient, elles\r\n-l'empêchaient de parler, il parvenait seulement à dire de temps en\r\n-temps: _J'étais émondeur à Faverolles_. Puis, tout en sanglotant, il\r\n-élevait sa main droite et l'abaissait graduellement sept fois comme s'il\r\n-touchait successivement sept têtes inégales, et par ce geste on devinait\r\n-que la chose quelconque qu'il avait faite, il l'avait faite pour vêtir\r\n-et nourrir sept petits enfants.\r\n-\r\n-Il partit pour Toulon. Il y arriva après un voyage de vingt-sept jours,\r\n-sur une charrette, la chaîne au cou. À Toulon, il fut revêtu de la\r\n-casaque rouge. Tout s'effaça de ce qui avait été sa vie, jusqu'à son\r\n-nom; il ne fut même plus Jean Valjean; il fut le numéro 24601. Que\r\n-devint la soeur? que devinrent les sept enfants? Qui est-ce qui s'occupe\r\n-de cela? Que devient la poignée de feuilles du jeune arbre scié par le\r\n-pied?\r\n-\r\n-C'est toujours la même histoire. Ces pauvres êtres vivants, ces\r\n-créatures de Dieu, sans appui désormais, sans guide, sans asile, s'en\r\n-allèrent au hasard, qui sait même? chacun de leur côté peut-être, et\r\n-s'enfoncèrent peu à peu dans cette froide brume où s'engloutissent les\r\n-destinées solitaires, moines ténèbres où disparaissent successivement\r\n-tant de têtes infortunées dans la sombre marche du genre humain. Ils\r\n-quittèrent le pays. Le clocher de ce qui avait été leur village les\r\n-oublia; la borne de ce qui avait été leur champ les oublia; après\r\n-quelques années de séjour au bagne, Jean Valjean lui-même les oublia.\r\n-Dans ce coeur où il y avait eu une plaie, il y eut une cicatrice. Voilà \r\n-tout. À peine, pendant tout le temps qu'il passa à Toulon, entendit-il\r\n-parler une seule fois de sa soeur. C'était, je crois, vers la fin de la\r\n-quatrième année de sa captivité. Je ne sais plus par quelle voie ce\r\n-renseignement lui parvint. Quelqu'un, qui les avait connus au pays,\r\n-avait vu sa soeur. Elle était à Paris. Elle habitait une pauvre rue près\r\n-de Saint-Sulpice, la rue du Geindre. Elle n'avait plus avec elle qu'un\r\n-enfant, un petit garçon, le dernier. Où étaient les six autres? Elle ne\r\n-le savait peut-être pas elle-même. Tous les matins elle allait à une\r\n-imprimerie rue du Sabot, n° 3, où elle était plieuse et brocheuse. Il\r\n-fallait être là à six heures du matin, bien avant le jour l'hiver. Dans\r\n-la maison de l'imprimerie il y avait une école, elle menait à cette\r\n-école son petit garçon qui avait sept ans. Seulement, comme elle entrait\r\n-à l'imprimerie à six heures et que l'école n'ouvrait qu'à sept, il\r\n-fallait que l'enfant attendît, dans la cour, que l'école ouvrit, une\r\n-heure; l'hiver, une heure de nuit, en plein air. On ne voulait pas que\r\n-l'enfant entrât dans l'imprimerie, parce qu'il gênait, disait-on. Les\r\n-ouvriers voyaient le matin en passant ce pauvre petit être assis sur le\r\n-pavé, tombant de sommeil, et souvent endormi dans l'ombre, accroupi et\r\n-plié sur son panier. Quand il pleuvait, une vieille femme, la portière,\r\n-en avait pitié; elle le recueillait dans son bouge où il n'y avait qu'un\r\n-grabat, un rouet et deux chaises de bois, et le petit dormait là dans un\r\n-coin, se serrant contre le chat pour avoir moins froid. À sept heures,\r\n-l'école ouvrait et il y entrait. Voilà ce qu'on dit à Jean Valjean. On\r\n-l'en entretint un jour, ce fut un moment, un éclair, comme une fenêtre\r\n-brusquement ouverte sur la destinée de ces êtres qu'il avait aimés, puis\r\n-tout se referma; il n'en entendit plus parler, et ce fut pour jamais.\r\n-Plus rien n'arriva d'eux à lui; jamais il ne les revit, jamais il ne les\r\n-rencontra, et, dans la suite de cette douloureuse histoire, on ne les\r\n-retrouvera plus.\r\n-\r\n-Vers la fin de cette quatrième année, le tour d'évasion de Jean Valjean\r\n-arriva. Ses camarades l'aidèrent comme cela se fait dans ce triste lieu.\r\n-Il s'évada. Il erra deux jours en liberté dans les champs; si c'est être\r\n-libre que d'être traqué; de tourner la tête à chaque instant; de\r\n-tressaillir au moindre bruit; d'avoir peur de tout, du toit qui fume, de\r\n-l'homme qui passe, du chien qui aboie, du cheval qui galope, de l'heure\r\n-qui sonne, du jour parce qu'on voit, de la nuit parce qu'on ne voit pas,\r\n-de la route, du sentier, du buisson, du sommeil. Le soir du second jour,\r\n-il fut repris. Il n'avait ni mangé ni dormi depuis trente-six heures. Le\r\n-tribunal maritime le condamna pour ce délit à une prolongation de trois\r\n-ans, ce qui lui fit huit ans. La sixième année, ce fut encore son tour\r\n-de s'évader; il en usa, mais il ne put consommer sa fuite. Il avait\r\n-manqué à l'appel. On tira le coup de canon, et à la nuit les gens de\r\n-ronde le trouvèrent caché sous la quille d'un vaisseau en construction;\r\n-il résista aux gardes-chiourme qui le saisirent. Évasion et rébellion.\r\n-Ce fait prévu par le code spécial fut puni d'une aggravation de cinq\r\n-ans, dont deux ans de double chaîne. Treize ans. La dixième année, son\r\n-tour revint, il en profita encore. Il ne réussit pas mieux. Trois ans\r\n-pour cette nouvelle tentative. Seize ans. Enfin, ce fut, je crois,\r\n-pendant la treizième année qu'il essaya une dernière fois et ne réussit\r\n-qu'à se faire reprendre après quatre heures d'absence. Trois ans pour\r\n-ces quatre heures. Dix-neuf ans. En octobre 1815 il fut libéré; il était\r\n-entré là en 1796 pour avoir cassé un carreau et pris un pain.\r\n-\r\n-Place pour une courte parenthèse. C'est la seconde fois que, dans ses\r\n-études sur la question pénale et sur la damnation par la loi, l'auteur\r\n-de ce livre rencontre le vol d'un pain, comme point de départ du\r\n-désastre d'une destinée. Claude Gueux avait volé un pain; Jean Valjean\r\n-avait volé un pain. Une statistique anglaise constate qu'à Londres\r\n-quatre vols sur cinq ont pour cause immédiate la faim.\r\n-\r\n-Jean Valjean était entré au bagne sanglotant et frémissant; il en sortit\r\n-impassible. Il y était entré désespéré; il en sortit sombre.\r\n-\r\n-Que s'était-il passé dans cette âme?\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VII\r\n-\r\n-Le dedans du désespoir\r\n-\r\n-\r\n-Essayons de le dire.\r\n-\r\n-Il faut bien que la société regarde ces choses puisque c'est elle qui\r\n-les fait.\r\n-\r\n-C'était, nous l'avons dit, un ignorant; mais ce n'était pas un imbécile.\r\n-La lumière naturelle était allumée en lui. Le malheur, qui a aussi sa\r\n-clarté, augmenta le peu de jour qu'il y avait dans cet esprit. Sous le\r\n-bâton, sous la chaîne, au cachot, à la fatigue, sous l'ardent soleil du\r\n-bagne, sur le lit de planches des forçats, il se replia en sa conscience\r\n-et réfléchit.\r\n-\r\n-Il se constitua tribunal.\r\n-\r\n-Il commença par se juger lui-même.\r\n-\r\n-Il reconnut qu'il n'était pas un innocent injustement puni. Il s'avoua\r\n-qu'il avait commis une action extrême et blâmable; qu'on ne lui eût\r\n-peut-être pas refusé ce pain s'il l'avait demandé; que dans tous les cas\r\n-il eût mieux valu l'attendre, soit de la pitié, soit du travail; que ce\r\n-n'est pas tout à fait une raison sans réplique de dire: peut-on attendre\r\n-quand on a faim? que d'abord il est très rare qu'on meure littéralement\r\n-de faim; ensuite que, malheureusement ou heureusement, l'homme est ainsi\r\n-fait qu'il peut souffrir longtemps et beaucoup, moralement et\r\n-physiquement, sans mourir; qu'il fallait donc de la patience; que cela\r\n-eût mieux valu même pour ces pauvres petits enfants; que c'était un acte\r\n-de folie, à lui, malheureux homme chétif, de prendre violemment au\r\n-collet la société tout entière et de se figurer qu'on sort de la misère\r\n-par le vol; que c'était, dans tous les cas, une mauvaise porte pour\r\n-sortir de la misère que celle par où l'on entre dans l'infamie; enfin\r\n-qu'il avait eu tort.\r\n-\r\n-Puis il se demanda:\r\n-\r\n-S'il était le seul qui avait eu tort dans sa fatale histoire? Si d'abord\r\n-ce n'était pas une chose grave qu'il eût, lui travailleur, manqué de\r\n-travail, lui laborieux, manqué de pain. Si, ensuite, la faute commise et\r\n-avouée, le châtiment n'avait pas été féroce et outré. S'il n'y avait pas\r\n-plus d'abus de la part de la loi dans la peine qu'il n'y avait eu d'abus\r\n-de la part du coupable dans la faute. S'il n'y avait pas excès de poids\r\n-dans un des plateaux de la balance, celui où est l'expiation. Si la\r\n-surcharge de la peine n'était point l'effacement du délit, et n'arrivait\r\n-pas à ce résultat: de retourner la situation, de remplacer la faute du\r\n-délinquant par la faute de la répression, de faire du coupable la\r\n-victime et du débiteur le créancier, et de mettre définitivement le\r\n-droit du côté de celui-là même qui l'avait violé. Si cette peine,\r\n-compliquée des aggravations successives pour les tentatives d'évasion,\r\n-ne finissait pas par être une sorte d'attentat du plus fort sur le plus\r\n-faible, un crime de la société sur l'individu, un crime qui recommençait\r\n-tous les jours, un crime qui durait dix-neuf ans.\r\n-\r\n-Il se demanda si la société humaine pouvait avoir le droit de faire\r\n-également subir à ses membres, dans un cas son imprévoyance\r\n-déraisonnable, et dans l'autre cas sa prévoyance impitoyable, et de\r\n-saisir à jamais un pauvre homme entre un défaut et un excès, défaut de\r\n-travail, excès de châtiment. S'il n'était pas exorbitant que la société\r\n-traitât ainsi précisément ses membres les plus mal dotés dans la\r\n-répartition de biens que fait le hasard, et par conséquent les plus\r\n-dignes de ménagements.\r\n-\r\n-Ces questions faites et résolues, il jugea la société et la condamna.\r\n-\r\n-Il la condamna sans haine.\r\n-\r\n-Il la fit responsable du sort qu'il subissait, et se dit qu'il\r\n-n'hésiterait peut-être pas à lui en demander compte un jour. Il se\r\n-déclara à lui-même qu'il n'y avait pas équilibre entre le dommage qu'il\r\n-avait causé et le dommage qu'on lui causait; il conclut enfin que son\r\n-châtiment n'était pas, à la vérité, une injustice, mais qu'à coup sûr\r\n-c'était une iniquité.\r\n-\r\n-La colère peut être folle et absurde; on peut être irrité à tort; on\r\n-n'est indigné que lorsqu'on a raison au fond par quelque côté. Jean\r\n-Valjean se sentait indigné. Et puis, la société humaine ne lui avait\r\n-fait que du mal. Jamais il n'avait vu d'elle que ce visage courroucé\r\n-qu'elle appelle sa justice et qu'elle montre à ceux qu'elle frappe. Les\r\n-hommes ne l'avaient touché que pour le meurtrir. Tout contact avec eux\r\n-lui avait été un coup. Jamais, depuis son enfance, depuis sa mère,\r\n-depuis sa soeur, jamais il n'avait rencontré une parole amie et un\r\n-regard bienveillant. De souffrance en souffrance il arriva peu à peu à \r\n-cette conviction que la vie était une guerre; et que dans cette guerre\r\n-il était le vaincu. Il n'avait d'autre arme que sa haine. Il résolut de\r\n-l'aiguiser au bagne et de l'emporter en s'en allant.\r\n-\r\n-Il y avait à Toulon une école pour la chiourme tenue par des frères\r\n-ignorantins où l'on enseignait le plus nécessaire à ceux de ces\r\n-malheureux qui avaient de la bonne volonté. Il fut du nombre des hommes\r\n-de bonne volonté. Il alla à l'école à quarante ans, et apprit à lire, à \r\n-écrire, à compter. Il sentit que fortifier son intelligence, c'était\r\n-fortifier sa haine. Dans certains cas, l'instruction et la lumière\r\n-peuvent servir de rallonge au mal.\r\n-\r\n-Cela est triste à dire, après avoir jugé la société qui avait fait son\r\n-malheur, il jugea la providence qui avait fait la société.\r\n-\r\n-Il la condamna aussi.\r\n-\r\n-Ainsi, pendant ces dix-neuf ans de torture et d'esclavage, cette âme\r\n-monta et tomba en même temps. Il y entra de la lumière d'un côté et des\r\n-ténèbres de l'autre.\r\n-\r\n-Jean Valjean n'était pas, on l'a vu, d'une nature mauvaise. Il était\r\n-encore bon lorsqu'il arriva au bagne. Il y condamna la société et sentit\r\n-qu'il devenait méchant, il y condamna la providence et sentit qu'il\r\n-devenait impie.\r\n-\r\n-Ici il est difficile de ne pas méditer un instant.\r\n-\r\n-La nature humaine se transforme-t-elle ainsi de fond en comble et tout à \r\n-fait? L'homme créé bon par Dieu peut-il être fait méchant par l'homme?\r\n-L'âme peut-elle être refaite tout d'une pièce par la destinée, et\r\n-devenir mauvaise, la destinée étant mauvaise? Le coeur peut-il devenir\r\n-difforme et contracter des laideurs et des infirmités incurables sous la\r\n-pression d'un malheur disproportionné, comme la colonne vertébrale sous\r\n-une voûte trop basse? N'y a-t-il pas dans toute âme humaine, n'y\r\n-avait-il pas dans l'âme de Jean Valjean en particulier, une première\r\n-étincelle, un élément divin, incorruptible dans ce monde, immortel dans\r\n-l'autre, que le bien peut développer, attiser, allumer, enflammer et\r\n-faire rayonner splendidement, et que le mal ne peut jamais entièrement\r\n-éteindre?\r\n-\r\n-Questions graves et obscures, à la dernière desquelles tout\r\n-physiologiste eût probablement répondu non, et sans hésiter, s'il eût vu\r\n-à Toulon, aux heures de repos qui étaient pour Jean Valjean des heures\r\n-de rêverie, assis, les bras croisés, sur la barre de quelque cabestan,\r\n-le bout de sa chaîne enfoncé dans sa poche pour l'empêcher de traîner,\r\n-ce galérien morne, sérieux, silencieux et pensif, paria des lois qui\r\n-regardait l'homme avec colère, damné de la civilisation qui regardait le\r\n-ciel avec sévérité.\r\n-\r\n-Certes, et nous ne voulons pas le dissimuler, le physiologiste\r\n-observateur eût vu là une misère irrémédiable, il eût plaint peut-être\r\n-ce malade du fait de la loi, mais il n'eût pas même essayé de\r\n-traitement; il eût détourné le regard des cavernes qu'il aurait\r\n-entrevues dans cette âme; et, comme Dante de la porte de l'enfer, il eût\r\n-effacé de cette existence le mot que le doigt de Dieu écrit pourtant sur\r\n-le front de tout homme: _Espérance_!\r\n-\r\n-Cet état de son âme que nous avons tenté d'analyser était-il aussi\r\n-parfaitement clair pour Jean Valjean que nous avons essayé de le rendre\r\n-pour ceux qui nous lisent? Jean Valjean voyait-il distinctement, après\r\n-leur formation, et avait-il vu distinctement, à mesure qu'ils se\r\n-formaient, tous les éléments dont se composait sa misère morale? Cet\r\n-homme rude et illettré s'était-il bien nettement rendu compte de la\r\n-succession d'idées par laquelle il était, degré à degré, monté et\r\n-descendu jusqu'aux lugubres aspects qui étaient depuis tant d'années\r\n-déjà l'horizon intérieur de son esprit? Avait-il bien conscience de tout\r\n-ce qui s'était passé en lui et de tout ce qui s'y remuait? C'est ce que\r\n-nous n'oserions dire; c'est même ce que nous ne croyons pas. Il y avait\r\n-trop d'ignorance dans Jean Valjean pour que, même après tant de malheur,\r\n-il n'y restât pas beaucoup de vague. Par moments il ne savait pas même\r\n-bien au juste ce qu'il éprouvait. Jean Valjean était dans les ténèbres;\r\n-il souffrait dans les ténèbres; il haïssait dans les ténèbres; on eût pu\r\n-dire qu'il haïssait devant lui. Il vivait habituellement dans cette\r\n-ombre, tâtonnant comme un aveugle et comme un rêveur. Seulement, par\r\n-intervalles, il lui venait tout à coup, de lui-même ou du dehors, une\r\n-secousse de colère, un surcroît de souffrance, un pâle et rapide éclair\r\n-qui illuminait toute son âme, et faisait brusquement apparaître partout\r\n-autour de lui, en avant et en arrière, aux lueurs d'une lumière\r\n-affreuse, les hideux précipices et les sombres perspectives de sa\r\n-destinée.\r\n-\r\n-L'éclair passé, la nuit retombait, et où était-il? il ne le savait plus.\r\n-\r\n-Le propre des peines de cette nature, dans lesquelles domine ce qui est\r\n-impitoyable, c'est-à -dire ce qui est abrutissant, c'est de transformer\r\n-peu à peu, par une sorte de transfiguration stupide, un homme en une\r\n-bête fauve. Quelquefois en une bête féroce. Les tentatives d'évasion de\r\n-Jean Valjean, successives et obstinées, suffiraient à prouver cet\r\n-étrange travail fait par la loi sur l'âme humaine. Jean Valjean eût\r\n-renouvelé ces tentatives, si parfaitement inutiles et folles, autant de\r\n-fois que l'occasion s'en fût présentée, sans songer un instant au\r\n-résultat, ni aux expériences déjà faites. Il s'échappait impétueusement\r\n-comme le loup qui trouve la cage ouverte. L'instinct lui disait:\r\n-sauve-toi! Le raisonnement lui eût dit: reste! Mais, devant une\r\n-tentation si violente, le raisonnement avait disparu; il n'y avait plus\r\n-que l'instinct. La bête seule agissait. Quand il était repris, les\r\n-nouvelles sévérités qu'on lui infligeait ne servaient qu'à l'effarer\r\n-davantage.\r\n-\r\n-Un détail que nous ne devons pas omettre, c'est qu'il était d'une force\r\n-physique dont n'approchait pas un des habitants du bagne. À la fatigue,\r\n-pour filer un câble, pour virer un cabestan, Jean Valjean valait quatre\r\n-hommes. Il soulevait et soutenait parfois d'énormes poids sur son dos,\r\n-et remplaçait dans l'occasion cet instrument qu'on appelle cric et qu'on\r\n-appelait jadis orgueil, d'où a pris nom, soit dit en passant, la rue\r\n-Montorgueil près des halles de Paris. Ses camarades l'avaient surnommé\r\n-Jean-le-Cric. Une fois, comme on réparait le balcon de l'hôtel de ville\r\n-de Toulon, une des admirables cariatides de Puget qui soutiennent ce\r\n-balcon se descella et faillit tomber. Jean Valjean, qui se trouvait là ,\r\n-soutint de l'épaule la cariatide et donna le temps aux ouvriers\r\n-d'arriver.\r\n-\r\n-Sa souplesse dépassait encore sa vigueur. Certains forçats, rêveurs\r\n-perpétuels d'évasions, finissent par faire de la force et de l'adresse\r\n-combinées une véritable science. C'est la science des muscles. Toute une\r\n-statique mystérieuse est quotidiennement pratiquée par les prisonniers,\r\n-ces éternels envieux des mouches et des oiseaux. Gravir une verticale,\r\n-et trouver des points d'appui là où l'on voit à peine une saillie, était\r\n-un jeu pour Jean Valjean. Étant donné un angle de mur, avec la tension\r\n-de son dos et de ses jarrets, avec ses coudes et ses talons emboîtés\r\n-dans les aspérités de la pierre, il se hissait comme magiquement à un\r\n-troisième étage. Quelquefois il montait ainsi jusqu'au toit du bagne.\r\n-\r\n-Il parlait peu. Il ne riait pas. Il fallait quelque émotion extrême pour\r\n-lui arracher, une ou deux fois l'an, ce lugubre rire du forçat qui est\r\n-comme un écho du rire du démon. À le voir, il semblait occupé à regarder\r\n-continuellement quelque chose de terrible.\r\n-\r\n-Il était absorbé en effet.\r\n-\r\n-À travers les perceptions maladives d'une nature incomplète et d'une\r\n-intelligence accablée, il sentait confusément qu'une chose monstrueuse\r\n-était sur lui. Dans cette pénombre obscure et blafarde où il rampait,\r\n-chaque fois qu'il tournait le cou et qu'il essayait d'élever son regard,\r\n-il voyait, avec une terreur mêlée de rage, s'échafauder, s'étager et\r\n-monter à perte de vue au-dessus de lui, avec des escarpements horribles,\r\n-une sorte d'entassement effrayant de choses, de lois, de préjugés,\r\n-d'hommes et de faits, dont les contours lui échappaient, dont la masse\r\n-l'épouvantait, et qui n'était autre chose que cette prodigieuse pyramide\r\n-que nous appelons la civilisation. Il distinguait çà et là dans cet\r\n-ensemble fourmillant et difforme, tantôt près de lui, tantôt loin et sur\r\n-des plateaux inaccessibles, quelque groupe, quelque détail vivement\r\n-éclairé, ici l'argousin et son bâton, ici le gendarme et son sabre,\r\n-là -bas l'archevêque mitré, tout en haut, dans une sorte de soleil,\r\n-l'empereur couronné et éblouissant. Il lui semblait que ces splendeurs\r\n-lointaines, loin de dissiper sa nuit, la rendaient plus funèbre et plus\r\n-noire. Tout cela, lois, préjugés, faits, hommes, choses, allait et\r\n-venait au-dessus de lui, selon le mouvement compliqué et mystérieux que\r\n-Dieu imprime à la civilisation, marchant sur lui et l'écrasant avec je\r\n-ne sais quoi de paisible dans la cruauté et d'inexorable dans\r\n-l'indifférence. Âmes tombées au fond de l'infortune possible, malheureux\r\n-hommes perdus au plus bas de ces limbes où l'on ne regarde plus, les\r\n-réprouvés de la loi sentent peser de tout son poids sur leur tête cette\r\n-société humaine, si formidable pour qui est dehors, si effroyable pour\r\n-qui est dessous.\r\n-\r\n-Dans cette situation, Jean Valjean songeait, et quelle pouvait être la\r\n-nature de sa rêverie?\r\n-\r\n-Si le grain de mil sous la meule avait des pensées, il penserait sans\r\n-doute ce que pensait Jean Valjean.\r\n-\r\n-Toutes ces choses, réalités pleines de spectres, fantasmagories pleines\r\n-de réalités, avaient fini par lui créer une sorte d'état intérieur\r\n-presque inexprimable.\r\n-\r\n-Par moments, au milieu de son travail du bagne, il s'arrêtait. Il se\r\n-mettait à penser. Sa raison, à la fois plus mûre et plus troublée\r\n-qu'autrefois, se révoltait. Tout ce qui lui était arrivé lui paraissait\r\n-absurde; tout ce qui l'entourait lui paraissait impossible. Il se\r\n-disait: c'est un rêve. Il regardait l'argousin debout à quelques pas de\r\n-lui; l'argousin lui semblait un fantôme; tout à coup le fantôme lui\r\n-donnait un coup de bâton.\r\n-\r\n-La nature visible existait à peine pour lui. Il serait presque vrai de\r\n-dire qu'il n'y avait point pour Jean Valjean de soleil, ni de beaux\r\n-jours d'été, ni de ciel rayonnant, ni de fraîches aubes d'avril. Je ne\r\n-sais quel jour de soupirail éclairait habituellement son âme.\r\n-\r\n-Pour résumer, en terminant, ce qui peut être résumé et traduit en\r\n-résultats positifs dans tout ce que nous venons d'indiquer, nous nous\r\n-bornerons à constater qu'en dix-neuf ans, Jean Valjean, l'inoffensif\r\n-émondeur de Faverolles, le redoutable galérien de Toulon, était devenu\r\n-capable, grâce à la manière dont le bagne l'avait façonné, de deux\r\n-espèces de mauvaises actions: premièrement, d'une mauvaise action\r\n-rapide, irréfléchie, pleine d'étourdissement, toute d'instinct, sorte de\r\n-représaille pour le mal souffert; deuxièmement, d'une mauvaise action\r\n-grave, sérieuse, débattue en conscience et méditée avec les idées\r\n-fausses que peut donner un pareil malheur. Ses préméditations passaient\r\n-par les trois phases successives que les natures d'une certaine trempe\r\n-peuvent seules parcourir, raisonnement, volonté, obstination. Il avait\r\n-pour mobiles l'indignation habituelle, l'amertume de l'âme, le profond\r\n-sentiment des iniquités subies, la réaction, même contre les bons, les\r\n-innocents et les justes, s'il y en a. Le point de départ comme le point\r\n-d'arrivée de toutes ses pensées était la haine de la loi humaine; cette\r\n-haine qui, si elle n'est arrêtée dans son développement par quelque\r\n-incident providentiel, devient, dans un temps donné, la haine de la\r\n-société, puis la haine du genre humain, puis la haine de la création, et\r\n-se traduit par un vague et incessant et brutal désir de nuire, n'importe\r\n-à qui, à un être vivant quelconque. Comme on voit, ce n'était pas sans\r\n-raison que le passeport qualifiait Jean Valjean d'_homme très\r\n-dangereux_.\r\n-\r\n-D'année en année, cette âme s'était desséchée de plus en plus,\r\n-lentement, mais fatalement. À coeur sec, oeil sec. À sa sortie du bagne,\r\n-il y avait dix-neuf ans qu'il n'avait versé une larme.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VIII\r\n-\r\n-L'onde et l'ombre\r\n-\r\n-\r\n-Un homme à la mer!\r\n-\r\n-Qu'importe! le navire ne s'arrête pas. Le vent souffle, ce sombre\r\n-navire-là a une route qu'il est forcé de continuer. Il passe.\r\n-\r\n-L'homme disparaît, puis reparaît, il plonge et remonte à la surface, il\r\n-appelle, il tend les bras, on ne l'entend pas; le navire, frissonnant\r\n-sous l'ouragan, est tout à sa manoeuvre, les matelots et les passagers\r\n-ne voient même plus l'homme submergé; sa misérable tête n'est qu'un\r\n-point dans l'énormité des vagues. Il jette des cris désespérés dans les\r\n-profondeurs. Quel spectre que cette voile qui s'en va! Il la regarde, il\r\n-la regarde frénétiquement. Elle s'éloigne, elle blêmit, elle décroît. Il\r\n-était là tout à l'heure, il était de l'équipage, il allait et venait sur\r\n-le pont avec les autres, il avait sa part de respiration et de soleil,\r\n-il était un vivant. Maintenant, que s'est-il donc passé? Il a glissé, il\r\n-est tombé, c'est fini.\r\n-\r\n-Il est dans l'eau monstrueuse. Il n'a plus sous les pieds que de la\r\n-fuite et de l'écroulement. Les flots déchirés et déchiquetés par le vent\r\n-l'environnent hideusement, les roulis de l'abîme l'emportent, tous les\r\n-haillons de l'eau s'agitent autour de sa tête, une populace de vagues\r\n-crache sur lui, de confuses ouvertures le dévorent à demi; chaque fois\r\n-qu'il enfonce, il entrevoit des précipices pleins de nuit; d'affreuses\r\n-végétations inconnues le saisissent, lui nouent les pieds, le tirent à \r\n-elles; il sent qu'il devient abîme, il fait partie de l'écume, les flots\r\n-se le jettent de l'un à l'autre, il boit l'amertume, l'océan lâche\r\n-s'acharne à le noyer, l'énormité joue avec son agonie. Il semble que\r\n-toute cette eau soit de la haine.\r\n-\r\n-Il lutte pourtant, il essaie de se défendre, il essaie de se soutenir,\r\n-il fait effort, il nage. Lui, cette pauvre force tout de suite épuisée,\r\n-il combat l'inépuisable.\r\n-\r\n-Où donc est le navire? Là -bas. À peine visible dans les pâles ténèbres\r\n-de l'horizon.\r\n-\r\n-Les rafales soufflent; toutes les écumes l'accablent. Il lève les yeux\r\n-et ne voit que les lividités des nuages. Il assiste, agonisant, à \r\n-l'immense démence de la mer. Il est supplicié par cette folie. Il entend\r\n-des bruits étrangers à l'homme qui semblent venir d'au delà de la terre\r\n-et d'on ne sait quel dehors effrayant.\r\n-\r\n-Il y a des oiseaux dans les nuées, de même qu'il y a des anges au-dessus\r\n-des détresses humaines, mais que peuvent-ils pour lui? Cela vole, chante\r\n-et plane, et lui, il râle.\r\n-\r\n-Il se sent enseveli à la fois par ces deux infinis, l'océan et le ciel;\r\n-l'un est une tombe, l'autre est un linceul.\r\n-\r\n-La nuit descend, voilà des heures qu'il nage, ses forces sont à bout; ce\r\n-navire, cette chose lointaine où il y avait des hommes, s'est effacé; il\r\n-est seul dans le formidable gouffre crépusculaire, il enfonce, il se\r\n-roidit, il se tord, il sent au-dessous de lui les vagues monstres de\r\n-l'invisible; il appelle.\r\n-\r\n-Il n'y a plus d'hommes. Où est Dieu?\r\n-\r\n-Il appelle. Quelqu'un! quelqu'un! Il appelle toujours.\r\n-\r\n-Rien à l'horizon. Rien au ciel.\r\n-\r\n-Il implore l'étendue, la vague, l'algue, l'écueil; cela est sourd. Il\r\n-supplie la tempête; la tempête imperturbable n'obéit qu'à l'infini.\r\n-\r\n-Autour de lui, l'obscurité, la brume, la solitude, le tumulte orageux et\r\n-inconscient, le plissement indéfini des eaux farouches. En lui l'horreur\r\n-et la fatigue. Sous lui la chute. Pas de point d'appui. Il songe aux\r\n-aventures ténébreuses du cadavre dans l'ombre illimitée. Le froid sans\r\n-fond le paralyse. Ses mains se crispent et se ferment et prennent du\r\n-néant. Vents, nuées, tourbillons, souffles, étoiles inutiles! Que faire?\r\n-Le désespéré s'abandonne, qui est las prend le parti de mourir, il se\r\n-laisse faire, il se laisse aller, il lâche prise, et le voilà qui roule\r\n-à jamais dans les profondeurs lugubres de l'engloutissement.\r\n-\r\n-Ô marche implacable des sociétés humaines! Pertes d'hommes et d'âmes\r\n-chemin faisant! Océan où tombe tout ce que laisse tomber la loi!\r\n-Disparition sinistre du secours! ô mort morale!\r\n-\r\n-La mer, c'est l'inexorable nuit sociale où la pénalité jette ses damnés.\r\n-La mer, c'est l'immense misère.\r\n-\r\n-L'âme, à vau-l'eau dans ce gouffre, peut devenir un cadavre. Qui la\r\n-ressuscitera?\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IX\r\n-\r\n-Nouveaux griefs\r\n-\r\n-\r\n-Quand vint l'heure de la sortie du bagne, quand Jean Valjean entendit à \r\n-son oreille ce mot étrange: _tu es libre_! le moment fut invraisemblable\r\n-et inouï, un rayon de vive lumière, un rayon de la vraie lumière des\r\n-vivants pénétra subitement en lui. Mais ce rayon ne tarda point à pâlir.\r\n-Jean Valjean avait été ébloui de l'idée de la liberté. Il avait cru à \r\n-une vie nouvelle. Il vit bien vite ce que c'était qu'une liberté à \r\n-laquelle on donne un passeport jaune.\r\n-\r\n-Et autour de cela bien des amertumes. Il avait calculé que sa masse,\r\n-pendant son séjour au bagne, aurait dû s'élever à cent soixante et onze\r\n-francs. Il est juste d'ajouter qu'il avait oublié de faire entrer dans\r\n-ses calculs le repos forcé des dimanches et fêtes qui, pour dix-neuf\r\n-ans, entraînait une diminution de vingt-quatre francs environ. Quoi\r\n-qu'il en fût, cette masse avait été réduite, par diverses retenues\r\n-locales, à la somme de cent neuf francs quinze sous, qui lui avait été\r\n-comptée à sa sortie.\r\n-\r\n-Il n'y avait rien compris, et se croyait lésé. Disons le mot, volé.\r\n-\r\n-Le lendemain de sa libération, à Grasse, il vit devant la porte d'une\r\n-distillerie de fleurs d'oranger des hommes qui déchargeaient des\r\n-ballots. Il offrit ses services. La besogne pressait, on les accepta. Il\r\n-se mit à l'ouvrage. Il était intelligent, robuste et adroit; il faisait\r\n-de son mieux; le maître paraissait content. Pendant qu'il travaillait,\r\n-un gendarme passa, le remarqua, et lui demanda ses papiers. Il fallut\r\n-montrer le passeport jaune. Cela fait, Jean Valjean reprit son travail.\r\n-Un peu auparavant, il avait questionné l'un des ouvriers sur ce qu'ils\r\n-gagnaient à cette besogne par jour; on lui avait répondu: _trente sous_.\r\n-Le soir venu, comme il était forcé de repartir le lendemain matin, il se\r\n-présenta devant le maître de la distillerie et le pria de le payer. Le\r\n-maître ne proféra pas une parole, et lui remit vingt-cinq sous. Il\r\n-réclama. On lui répondit: cela est assez bon pour toi. Il insista. Le\r\n-maître le regarda entre les deux yeux et lui dit: _Gare le bloc_.\r\n-\r\n-Là encore il se considéra comme volé.\r\n-\r\n-La société, l'état, en lui diminuant sa masse, l'avait volé en grand.\r\n-Maintenant, c'était le tour de l'individu qui le volait en petit.\r\n-\r\n-Libération n'est pas délivrance. On sort du bagne, mais non de la\r\n-condamnation. Voilà ce qui lui était arrivé à Grasse. On a vu de quelle\r\n-façon il avait été accueilli à Digne.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre X\r\n-\r\n-L'homme réveillé\r\n-\r\n-\r\n-Donc, comme deux heures du matin sonnaient à l'horloge de la cathédrale,\r\n-Jean Valjean se réveilla.\r\n-\r\n-Ce qui le réveilla, c'est que le lit était trop bon. Il y avait vingt\r\n-ans bientôt qu'il n'avait couché dans un lit, et quoiqu'il ne se fût pas\r\n-déshabillé, la sensation était trop nouvelle pour ne pas troubler son\r\n-sommeil.\r\n-\r\n-Il avait dormi plus de quatre heures. Sa fatigue était passée. Il était\r\n-accoutumé à ne pas donner beaucoup d'heures au repos.\r\n-\r\n-Il ouvrit les yeux et regarda un moment dans l'obscurité autour de lui,\r\n-puis il les referma pour se rendormir.\r\n-\r\n-Quand beaucoup de sensations diverses ont agité la journée, quand des\r\n-choses préoccupent l'esprit, on s'endort, mais on ne se rendort pas. Le\r\n-sommeil vient plus aisément qu'il ne revient. C'est ce qui arriva à Jean\r\n-Valjean. Il ne put se rendormir, et il se mit à penser.\r\n-\r\n-Il était dans un de ces moments où les idées qu'on a dans l'esprit sont\r\n-troubles. Il avait une sorte de va-et-vient obscur dans le cerveau. Ses\r\n-souvenirs anciens et ses souvenirs immédiats y flottaient pêle-mêle et\r\n-s'y croisaient confusément, perdant leurs formes, se grossissant\r\n-démesurément, puis disparaissant tout à coup comme dans une eau fangeuse\r\n-et agitée. Beaucoup de pensées lui venaient, mais il y en avait une qui\r\n-se représentait continuellement et qui chassait toutes les autres. Cette\r\n-pensée, nous allons la dire tout de suite:--Il avait remarqué les six\r\n-couverts d'argent et la grande cuiller que madame Magloire avait posés\r\n-sur la table.\r\n-\r\n-Ces six couverts d'argent l'obsédaient.--Ils étaient là .--À quelques\r\n-pas.--À l'instant où il avait traversé la chambre d'à côté pour venir\r\n-dans celle où il était, la vieille servante les mettait dans un petit\r\n-placard à la tête du lit.--Il avait bien remarqué ce placard.--À droite,\r\n-en entrant par la salle à manger.--Ils étaient massifs.--Et de vieille\r\n-argenterie.--Avec la grande cuiller, on en tirerait au moins deux cents\r\n-francs.--Le double de ce qu'il avait gagné en dix-neuf ans.--Il est\r\n-vrai qu'il eût gagné davantage si l'_administration_ ne l'avait pas\r\n-_volé_.\r\n-\r\n-Son esprit oscilla toute une grande heure dans des fluctuations\r\n-auxquelles se mêlait bien quelque lutte. Trois heures sonnèrent. Il\r\n-rouvrit les yeux, se dressa brusquement sur son séant, étendit le bras\r\n-et tâta son havresac qu'il avait jeté dans le coin de l'alcôve, puis il\r\n-laissa pendre ses jambes et poser ses pieds à terre, et se trouva,\r\n-presque sans savoir comment, assis sur son lit.\r\n-\r\n-Il resta un certain temps rêveur dans cette attitude qui eût eu quelque\r\n-chose de sinistre pour quelqu'un qui l'eût aperçu ainsi dans cette\r\n-ombre, seul éveillé dans la maison endormie. Tout à coup il se baissa,\r\n-ôta ses souliers et les posa doucement sur la natte près du lit, puis il\r\n-reprit sa posture de rêverie et redevint immobile.\r\n-\r\n-Au milieu de cette méditation hideuse, les idées que nous venons\r\n-d'indiquer remuaient sans relâche son cerveau, entraient, sortaient,\r\n-rentraient, faisaient sur lui une sorte de pesée; et puis il songeait\r\n-aussi, sans savoir pourquoi, et avec cette obstination machinale de la\r\n-rêverie, à un forçat nommé Brevet qu'il avait connu au bagne, et dont le\r\n-pantalon n'était retenu que par une seule bretelle de coton tricoté. Le\r\n-dessin en damier de cette bretelle lui revenait sans cesse à l'esprit.\r\n-\r\n-Il demeurait dans cette situation, et y fût peut-être resté indéfiniment\r\n-jusqu'au lever du jour, si l'horloge n'eût sonné un coup--le quart ou la\r\n-demie. Il sembla que ce coup lui eût dit: allons!\r\n-\r\n-Il se leva debout, hésita encore un moment, et écouta; tout se taisait\r\n-dans la maison; alors il marcha droit et à petits pas vers la fenêtre\r\n-qu'il entrevoyait. La nuit n'était pas très obscure; c'était une pleine\r\n-lune sur laquelle couraient de larges nuées chassées par le vent. Cela\r\n-faisait au dehors des alternatives d'ombre et de clarté, des éclipses,\r\n-puis des éclaircies, et au dedans une sorte de crépuscule. Ce\r\n-crépuscule, suffisant pour qu'on pût se guider, intermittent à cause des\r\n-nuages, ressemblait à l'espèce de lividité qui tombe d'un soupirail de\r\n-cave devant lequel vont et viennent des passants. Arrivé à la fenêtre,\r\n-Jean Valjean l'examina. Elle était sans barreaux, donnait sur le jardin\r\n-et n'était fermée, selon la mode du pays, que d'une petite clavette. Il\r\n-l'ouvrit, mais, comme un air froid et vif entra brusquement dans la\r\n-chambre, il la referma tout de suite. Il regarda le jardin de ce regard\r\n-attentif qui étudie plus encore qu'il ne regarde. Le jardin était enclos\r\n-d'un mur blanc assez bas, facile à escalader. Au fond, au-delà , il\r\n-distingua des têtes d'arbres également espacées, ce qui indiquait que ce\r\n-mur séparait le jardin d'une avenue ou d'une ruelle plantée.\r\n-\r\n-Ce coup d'oeil jeté, il fit le mouvement d'un homme déterminé, marcha à \r\n-son alcôve, prit son havresac, l'ouvrit, le fouilla, en tira quelque\r\n-chose qu'il posa sur le lit, mit ses souliers dans une des poches,\r\n-referma le tout, chargea le sac sur ses épaules, se couvrit de sa\r\n-casquette dont il baissa la visière sur ses yeux, chercha son bâton en\r\n-tâtonnant, et l'alla poser dans l'angle de la fenêtre, puis revint au\r\n-lit et saisit résolument l'objet qu'il y avait déposé. Cela ressemblait\r\n-à une barre de fer courte, aiguisée comme un épieu à l'une de ses\r\n-extrémités.\r\n-\r\n-Il eût été difficile de distinguer dans les ténèbres pour quel emploi\r\n-avait pu être façonné ce morceau de fer. C'était peut-être un levier?\r\n-C'était peut-être une massue?\r\n-\r\n-Au jour on eût pu reconnaître que ce n'était autre chose qu'un\r\n-chandelier de mineur. On employait alors quelquefois les forçats à \r\n-extraire de la roche des hautes collines qui environnent Toulon, et il\r\n-n'était pas rare qu'ils eussent à leur disposition des outils de mineur.\r\n-Les chandeliers des mineurs sont en fer massif, terminés à leur\r\n-extrémité inférieure par une pointe au moyen de laquelle on les enfonce\r\n-dans le rocher.\r\n-\r\n-Il prit ce chandelier dans sa main droite, et retenant son haleine,\r\n-assourdissant son pas, il se dirigea vers la porte de la chambre\r\n-voisine, celle de l'évêque, comme on sait. Arrivé à cette porte, il la\r\n-trouva entrebâillée. L'évêque ne l'avait point fermée.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XI\r\n-\r\n-Ce qu'il fait\r\n-\r\n-\r\n-Jean Valjean écouta. Aucun bruit.\r\n-\r\n-Il poussa la porte.\r\n-\r\n-Il la poussa du bout du doigt, légèrement, avec cette douceur furtive et\r\n-inquiète d'un chat qui veut entrer.\r\n-\r\n-La porte céda à la pression et fit un mouvement imperceptible et\r\n-silencieux qui élargit un peu l'ouverture.\r\n-\r\n-Il attendit un moment, puis poussa la porte une seconde fois, plus\r\n-hardiment. Elle continua de céder en silence. L'ouverture était assez\r\n-grande maintenant pour qu'il pût passer. Mais il y avait près de la\r\n-porte une petite table qui faisait avec elle un angle gênant et qui\r\n-barrait l'entrée.\r\n-\r\n-Jean Valjean reconnut la difficulté. Il fallait à toute force que\r\n-l'ouverture fût encore élargie.\r\n-\r\n-Il prit son parti, et poussa une troisième fois la porte, plus\r\n-énergiquement que les deux premières. Cette fois il y eut un gond mal\r\n-huilé qui jeta tout à coup dans cette obscurité un cri rauque et\r\n-prolongé.\r\n-\r\n-Jean Valjean tressaillit. Le bruit de ce gond sonna dans son oreille\r\n-avec quelque chose d'éclatant et de formidable comme le clairon du\r\n-jugement dernier. Dans les grossissements fantastiques de la première\r\n-minute, il se figura presque que ce gond venait de s'animer et de\r\n-prendre tout à coup une vie terrible, et qu'il aboyait comme un chien\r\n-pour avertir tout le monde et réveiller les gens endormis.\r\n-\r\n-Il s'arrêta, frissonnant, éperdu, et retomba de la pointe du pied sur le\r\n-talon. Il entendait ses artères battre dans ses tempes comme deux\r\n-marteaux de forge, et il lui semblait que son souffle sortait de sa\r\n-poitrine avec le bruit du vent qui sort d'une caverne. Il lui paraissait\r\n-impossible que l'horrible clameur de ce gond irrité n'eût pas ébranlé\r\n-toute la maison comme une secousse de tremblement de terre; la porte,\r\n-poussée par lui, avait pris l'alarme et avait appelé; le vieillard\r\n-allait se lever, les deux vieilles femmes allaient crier, on viendrait à \r\n-l'aide; avant un quart d'heure, la ville serait en rumeur et la\r\n-gendarmerie sur pied. Un moment il se crut perdu.\r\n-\r\n-Il demeura où il était, pétrifié comme la statue de sel, n'osant faire\r\n-un mouvement.\r\n-\r\n-Quelques minutes s'écoulèrent. La porte s'était ouverte toute grande. Il\r\n-se hasarda à regarder dans la chambre. Rien n'y avait bougé. Il prêta\r\n-l'oreille. Rien ne remuait dans la maison. Le bruit du gond rouillé\r\n-n'avait éveillé personne. Ce premier danger était passé, mais il y avait\r\n-encore en lui un affreux tumulte. Il ne recula pas pourtant. Même quand\r\n-il s'était cru perdu, il n'avait pas reculé. Il ne songea plus qu'à \r\n-finir vite. Il fit un pas et entra dans la chambre.\r\n-\r\n-Cette chambre était dans un calme parfait. On y distinguait çà et là des\r\n-formes confuses et vagues qui, au jour, étaient des papiers épars sur\r\n-une table, des in-folio ouverts, des volumes empilés sur un tabouret, un\r\n-fauteuil chargé de vêtements, un prie-Dieu, et qui à cette heure\r\n-n'étaient plus que des coins ténébreux et des places blanchâtres. Jean\r\n-Valjean avança avec précaution en évitant de se heurter aux meubles. Il\r\n-entendait au fond de la chambre la respiration égale et tranquille de\r\n-l'évêque endormi.\r\n-\r\n-Il s'arrêta tout à coup. Il était près du lit. Il y était arrivé plus\r\n-tôt qu'il n'aurait cru.\r\n-\r\n-La nature mêle quelquefois ses effets et ses spectacles à nos actions\r\n-avec une espèce d'à -propos sombre et intelligent, comme si elle voulait\r\n-nous faire réfléchir. Depuis près d'une demi-heure un grand nuage\r\n-couvrait le ciel. Au moment où Jean Valjean s'arrêta en face du lit, ce\r\n-nuage se déchira, comme s'il l'eût fait exprès, et un rayon de lune,\r\n-traversant la longue fenêtre, vint éclairer subitement le visage pâle de\r\n-l'évêque. Il dormait paisiblement. Il était presque vêtu dans son lit, à \r\n-cause des nuits froides des Basses-Alpes, d'un vêtement de laine brune\r\n-qui lui couvrait les bras jusqu'aux poignets. Sa tête était renversée\r\n-sur l'oreiller dans l'attitude abandonnée du repos; il laissait pendre\r\n-hors du lit sa main ornée de l'anneau pastoral et d'où étaient tombées\r\n-tant de bonnes oeuvres et de saintes actions. Toute sa face s'illuminait\r\n-d'une vague expression de satisfaction, d'espérance et de béatitude.\r\n-C'était plus qu'un sourire et presque un rayonnement. Il y avait sur son\r\n-front l'inexprimable réverbération d'une lumière qu'on ne voyait pas.\r\n-L'âme des justes pendant le sommeil contemple un ciel mystérieux.\r\n-\r\n-Un reflet de ce ciel était sur l'évêque.\r\n-\r\n-C'était en même temps une transparence lumineuse, car ce ciel était au\r\n-dedans de lui. Ce ciel, c'était sa conscience.\r\n-\r\n-Au moment où le rayon de lune vint se superposer, pour ainsi dire, à \r\n-cette clarté intérieure, l'évêque endormi apparut comme dans une gloire.\r\n-Cela pourtant resta doux et voilé d'un demi-jour ineffable. Cette lune\r\n-dans le ciel, cette nature assoupie, ce jardin sans un frisson, cette\r\n-maison si calme, l'heure, le moment, le silence, ajoutaient je ne sais\r\n-quoi de solennel et d'indicible au vénérable repos de ce sage, et\r\n-enveloppaient d'une sorte d'auréole majestueuse et sereine ces cheveux\r\n-blancs et ces yeux fermés, cette figure où tout était espérance et où\r\n-tout était confiance, cette tête de vieillard et ce sommeil d'enfant.\r\n-\r\n-Il y avait presque de la divinité dans cet homme ainsi auguste à son\r\n-insu. Jean Valjean, lui, était dans l'ombre, son chandelier de fer à la\r\n-main, debout, immobile, effaré de ce vieillard lumineux. Jamais il\r\n-n'avait rien vu de pareil. Cette confiance l'épouvantait. Le monde moral\r\n-n'a pas de plus grand spectacle que celui-là : une conscience troublée et\r\n-inquiète, parvenue au bord d'une mauvaise action, et contemplant le\r\n-sommeil d'un juste.\r\n-\r\n-Ce sommeil, dans cet isolement, et avec un voisin tel que lui, avait\r\n-quelque chose de sublime qu'il sentait vaguement, mais impérieusement.\r\n-\r\n-Nul n'eût pu dire ce qui se passait en lui, pas même lui. Pour essayer\r\n-de s'en rendre compte, il faut rêver ce qu'il y a de plus violent en\r\n-présence de ce qu'il y a de plus doux. Sur son visage même on n'eût rien\r\n-pu distinguer avec certitude. C'était une sorte d'étonnement hagard. Il\r\n-regardait cela. Voilà tout. Mais quelle était sa pensée? Il eût été\r\n-impossible de le deviner. Ce qui était évident, c'est qu'il était ému et\r\n-bouleversé. Mais de quelle nature était cette émotion?\r\n-\r\n-Son oeil ne se détachait pas du vieillard. La seule chose qui se\r\n-dégageât clairement de son attitude et de sa physionomie, c'était une\r\n-étrange indécision. On eût dit qu'il hésitait entre les deux abîmes,\r\n-celui où l'on se perd et celui où l'on se sauve. Il semblait prêt à \r\n-briser ce crâne ou à baiser cette main.\r\n-\r\n-Au bout de quelques instants, son bras gauche se leva lentement vers son\r\n-front, et il ôta sa casquette, puis son bras retomba avec la même\r\n-lenteur, et Jean Valjean rentra dans sa contemplation, sa casquette dans\r\n-la main gauche, sa massue dans la main droite, ses cheveux hérissés sur\r\n-sa tête farouche.\r\n-\r\n-L'évêque continuait de dormir dans une paix profonde sous ce regard\r\n-effrayant. Un reflet de lune faisait confusément visible au-dessus de la\r\n-cheminée le crucifix qui semblait leur ouvrir les bras à tous les deux,\r\n-avec une bénédiction pour l'un et un pardon pour l'autre.\r\n-\r\n-Tout à coup Jean Valjean remit sa casquette sur son front, puis marcha\r\n-rapidement, le long du lit, sans regarder l'évêque, droit au placard\r\n-qu'il entrevoyait près du chevet; il leva le chandelier de fer comme\r\n-pour forcer la serrure; la clef y était; il l'ouvrit; la première chose\r\n-qui lui apparut fut le panier d'argenterie; il le prit, traversa la\r\n-chambre à grands pas sans précaution et sans s'occuper du bruit, gagna\r\n-la porte, rentra dans l'oratoire, ouvrit la fenêtre, saisit un bâton,\r\n-enjamba l'appui du rez-de-chaussée, mit l'argenterie dans son sac, jeta\r\n-le panier, franchit le jardin, sauta par-dessus le mur comme un tigre,\r\n-et s'enfuit.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XII\r\n-\r\n-L'évêque travaille\r\n-\r\n-\r\n-Le lendemain, au soleil levant, monseigneur Bienvenu se promenait dans\r\n-son jardin. Madame Magloire accourut vers lui toute bouleversée.\r\n-\r\n---Monseigneur, monseigneur, cria-t-elle, votre grandeur sait-elle où est\r\n-le panier d'argenterie?\r\n-\r\n---Oui, dit l'évêque.\r\n-\r\n---Jésus-Dieu soit béni! reprit-elle. Je ne savais ce qu'il était devenu.\r\n-\r\n-L'évêque venait de ramasser le panier dans une plate-bande. Il le\r\n-présenta à madame Magloire.\r\n-\r\n---Le voilà .\r\n-\r\n---Eh bien? dit-elle. Rien dedans! et l'argenterie?\r\n-\r\n---Ah! repartit l'évêque. C'est donc l'argenterie qui vous occupe? Je ne\r\n-sais où elle est.\r\n-\r\n---Grand bon Dieu! elle est volée! C'est l'homme d'hier soir qui l'a\r\n-volée!\r\n-\r\n-En un clin d'oeil, avec toute sa vivacité de vieille alerte, madame\r\n-Magloire courut à l'oratoire, entra dans l'alcôve et revint vers\r\n-l'évêque. L'évêque venait de se baisser et considérait en soupirant un\r\n-plant de cochléaria des Guillons que le panier avait brisé en tombant à \r\n-travers la plate-bande. Il se redressa au cri de madame Magloire.\r\n-\r\n---Monseigneur, l'homme est parti! l'argenterie est volée!\r\n-\r\n-Tout en poussant cette exclamation, ses yeux tombaient sur un angle du\r\n-jardin où l'on voyait des traces d'escalade. Le chevron du mur avait été\r\n-arraché.\r\n-\r\n---Tenez! c'est par là qu'il s'en est allé. Il a sauté dans la ruelle\r\n-Cochefilet! Ah! l'abomination! Il nous a volé notre argenterie!\r\n-\r\n-L'évêque resta un moment silencieux, puis leva son oeil sérieux, et dit\r\n-à madame Magloire avec douceur:\r\n-\r\n---Et d'abord, cette argenterie était-elle à nous?\r\n-\r\n-Madame Magloire resta interdite. Il y eut encore un silence, puis\r\n-l'évêque continua:\r\n-\r\n---Madame Magloire, je détenais à tort et depuis longtemps cette\r\n-argenterie. Elle était aux pauvres. Qu'était-ce que cet homme? Un pauvre\r\n-évidemment.\r\n-\r\n---Hélas Jésus! repartit madame Magloire. Ce n'est pas pour moi ni pour\r\n-mademoiselle. Cela nous est bien égal. Mais c'est pour monseigneur. Dans\r\n-quoi monseigneur va-t-il manger maintenant?\r\n-\r\n-L'évêque la regarda d'un air étonné.\r\n-\r\n---Ah çà mais! est-ce qu'il n'y a pas des couverts d'étain?\r\n-\r\n-Madame Magloire haussa les épaules.\r\n-\r\n---L'étain a une odeur.\r\n-\r\n---Alors, des couverts de fer.\r\n-\r\n-Madame Magloire fit une grimace significative.\r\n-\r\n---Le fer a un goût.\r\n-\r\n---Eh bien, dit l'évêque, des couverts de bois.\r\n-\r\n-Quelques instants après, il déjeunait à cette même table où Jean Valjean\r\n-s'était assis la veille. Tout en déjeunant, monseigneur Bienvenu faisait\r\n-gaîment remarquer à sa soeur qui ne disait rien et à madame Magloire qui\r\n-grommelait sourdement qu'il n'est nullement besoin d'une cuiller ni\r\n-d'une fourchette, même en bois, pour tremper un morceau de pain dans une\r\n-tasse de lait.\r\n-\r\n---Aussi a-t-on idée! disait madame Magloire toute seule en allant et\r\n-venant, recevoir un homme comme cela! et le loger à côté de soi! et quel\r\n-bonheur encore qu'il n'ait fait que voler! Ah mon Dieu! cela fait frémir\r\n-quand on songe!\r\n-\r\n-Comme le frère et la soeur allaient se lever de table, on frappa à la\r\n-porte.\r\n-\r\n---Entrez, dit l'évêque.\r\n-\r\n-La porte s'ouvrit. Un groupe étrange et violent apparut sur le seuil.\r\n-Trois hommes en tenaient un quatrième au collet. Les trois hommes\r\n-étaient des gendarmes; l'autre était Jean Valjean.\r\n-\r\n-Un brigadier de gendarmerie, qui semblait conduire le groupe, était près\r\n-de la porte. Il entra et s'avança vers l'évêque en faisant le salut\r\n-militaire.\r\n-\r\n---Monseigneur... dit-il.\r\n-\r\n-À ce mot Jean Valjean, qui était morne et semblait abattu, releva la\r\n-tête d'un air stupéfait.\r\n-\r\n---Monseigneur! murmura-t-il. Ce n'est donc pas le curé?...\r\n-\r\n---Silence! dit un gendarme. C'est monseigneur l'évêque.\r\n-\r\n-Cependant monseigneur Bienvenu s'était approché aussi vivement que son\r\n-grand âge le lui permettait.\r\n-\r\n---Ah! vous voilà ! s'écria-t-il en regardant Jean Valjean. Je suis aise\r\n-de vous voir. Et bien mais! je vous avais donné les chandeliers aussi,\r\n-qui sont en argent comme le reste et dont vous pourrez bien avoir deux\r\n-cents francs. Pourquoi ne les avez-vous pas emportés avec vos couverts?\r\n-\r\n-Jean Valjean ouvrit les yeux et regarda le vénérable évêque avec une\r\n-expression qu'aucune langue humaine ne pourrait rendre.\r\n-\r\n---Monseigneur, dit le brigadier de gendarmerie, ce que cet homme disait\r\n-était donc vrai? Nous l'avons rencontré. Il allait comme quelqu'un qui\r\n-s'en va. Nous l'avons arrêté pour voir. Il avait cette argenterie....\r\n-\r\n---Et il vous a dit, interrompit l'évêque en souriant, qu'elle lui avait\r\n-été donnée par un vieux bonhomme de prêtre chez lequel il avait passé la\r\n-nuit? Je vois la chose. Et vous l'avez ramené ici? C'est une méprise.\r\n-\r\n---Comme cela, reprit le brigadier, nous pouvons le laisser aller?\r\n-\r\n---Sans doute, répondit l'évêque.\r\n-\r\n-Les gendarmes lâchèrent Jean Valjean qui recula.\r\n-\r\n---Est-ce que c'est vrai qu'on me laisse? dit-il d'une voix presque\r\n-inarticulée et comme s'il parlait dans le sommeil.\r\n-\r\n---Oui, on te laisse, tu n'entends donc pas? dit un gendarme.\r\n-\r\n---Mon ami, reprit l'évêque, avant de vous en aller, voici vos\r\n-chandeliers. Prenez-les.\r\n-\r\n-Il alla à la cheminée, prit les deux flambeaux d'argent et les apporta à \r\n-Jean Valjean. Les deux femmes le regardaient faire sans un mot, sans un\r\n-geste, sans un regard qui pût déranger l'évêque.\r\n-\r\n-Jean Valjean tremblait de tous ses membres. Il prit les deux chandeliers\r\n-machinalement et d'un air égaré.\r\n-\r\n---Maintenant, dit l'évêque, allez en paix.\r\n-\r\n---À propos, quand vous reviendrez, mon ami, il est inutile de passer par\r\n-le jardin. Vous pourrez toujours entrer et sortir par la porte de la\r\n-rue. Elle n'est fermée qu'au loquet jour et nuit.\r\n-\r\n-Puis se tournant vers la gendarmerie:\r\n-\r\n---Messieurs, vous pouvez vous retirer.\r\n-\r\n-Les gendarmes s'éloignèrent.\r\n-\r\n-Jean Valjean était comme un homme qui va s'évanouir.\r\n-\r\n-L'évêque s'approcha de lui, et lui dit à voix basse:\r\n-\r\n---N'oubliez pas, n'oubliez jamais que vous m'avez promis d'employer cet\r\n-argent à devenir honnête homme.\r\n-\r\n-Jean Valjean, qui n'avait aucun souvenir d'avoir rien promis, resta\r\n-interdit. L'évêque avait appuyé sur ces paroles en les prononçant. Il\r\n-reprit avec une sorte de solennité:\r\n-\r\n---Jean Valjean, mon frère, vous n'appartenez plus au mal, mais au bien.\r\n-C'est votre âme que je vous achète; je la retire aux pensées noires et à \r\n-l'esprit de perdition, et je la donne à Dieu.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XIII\r\n-\r\n-Petit-Gervais\r\n-\r\n-\r\n-Jean Valjean sortit de la ville comme s'il s'échappait. Il se mit à \r\n-marcher en toute hâte dans les champs, prenant les chemins et les\r\n-sentiers qui se présentaient sans s'apercevoir qu'il revenait à chaque\r\n-instant sur ses pas. Il erra ainsi toute la matinée, n'ayant pas mangé\r\n-et n'ayant pas faim. Il était en proie à une foule de sensations\r\n-nouvelles. Il se sentait une sorte de colère; il ne savait contre qui.\r\n-Il n'eût pu dire s'il était touché ou humilié. Il lui venait par moments\r\n-un attendrissement étrange qu'il combattait et auquel il opposait\r\n-l'endurcissement de ses vingt dernières années. Cet état le fatiguait.\r\n-Il voyait avec inquiétude s'ébranler au dedans de lui l'espèce de calme\r\n-affreux que l'injustice de son malheur lui avait donné. Il se demandait\r\n-qu'est-ce qui remplacerait cela. Parfois il eût vraiment mieux aimé être\r\n-en prison avec les gendarmes, et que les choses ne se fussent point\r\n-passées ainsi; cela l'eût moins agité. Bien que la saison fut assez\r\n-avancée, il y avait encore çà et là dans les haies quelques fleurs\r\n-tardives dont l'odeur, qu'il traversait en marchant, lui rappelait des\r\n-souvenirs d'enfance. Ces souvenirs lui étaient presque insupportables,\r\n-tant il y avait longtemps qu'ils ne lui étaient apparus.\r\n-\r\n-Des pensées inexprimables s'amoncelèrent ainsi en lui toute la journée.\r\n-\r\n-Comme le soleil déclinait au couchant, allongeant sur le sol l'ombre du\r\n-moindre caillou, Jean Valjean était assis derrière un buisson dans une\r\n-grande plaine rousse absolument déserte. Il n'y avait à l'horizon que\r\n-les Alpes. Pas même le clocher d'un village lointain. Jean Valjean\r\n-pouvait être à trois lieues de Digne. Un sentier qui coupait la plaine\r\n-passait à quelques pas du buisson.\r\n-\r\n-Au milieu de cette méditation qui n'eût pas peu contribué à rendre ses\r\n-haillons effrayants pour quelqu'un qui l'eût rencontré, il entendit un\r\n-bruit joyeux.\r\n-\r\n-Il tourna la tête, et vit venir par le sentier un petit savoyard d'une\r\n-dizaine d'années qui chantait, sa vielle au flanc et sa boîte à marmotte\r\n-sur le dos; un de ces doux et gais enfants qui vont de pays en pays,\r\n-laissant voir leurs genoux par les trous de leur pantalon.\r\n-\r\n-Tout en chantant l'enfant interrompait de temps en temps sa marche et\r\n-jouait aux osselets avec quelques pièces de monnaie qu'il avait dans sa\r\n-main, toute sa fortune probablement. Parmi cette monnaie il y avait une\r\n-pièce de quarante sous. L'enfant s'arrêta à côté du buisson sans voir\r\n-Jean Valjean et fit sauter sa poignée de sous que jusque-là il avait\r\n-reçue avec assez d'adresse tout entière sur le dos de sa main.\r\n-\r\n-Cette fois la pièce de quarante sous lui échappa, et vint rouler vers la\r\n-broussaille jusqu'à Jean Valjean.\r\n-\r\n-Jean Valjean posa le pied dessus.\r\n-\r\n-Cependant l'enfant avait suivi sa pièce du regard, et l'avait vu.\r\n-\r\n-Il ne s'étonna point et marcha droit à l'homme.\r\n-\r\n-C'était un lieu absolument solitaire. Aussi loin que le regard pouvait\r\n-s'étendre, il n'y avait personne dans la plaine ni dans le sentier. On\r\n-n'entendait que les petits cris faibles d'une nuée d'oiseaux de passage\r\n-qui traversaient le ciel à une hauteur immense. L'enfant tournait le dos\r\n-au soleil qui lui mettait des fils d'or dans les cheveux et qui\r\n-empourprait d'une lueur sanglante la face sauvage de Jean Valjean.\r\n-\r\n---Monsieur, dit le petit savoyard, avec cette confiance de l'enfance qui\r\n-se compose d'ignorance et d'innocence,--ma pièce?\r\n-\r\n---Comment t'appelles-tu? dit Jean Valjean.\r\n-\r\n---Petit-Gervais, monsieur.\r\n-\r\n---Va-t'en, dit Jean Valjean.\r\n-\r\n---Monsieur, reprit l'enfant, rendez-moi ma pièce.\r\n-\r\n-Jean Valjean baissa la tête et ne répondit pas.\r\n-\r\n-L'enfant recommença:\r\n-\r\n---Ma pièce, monsieur!\r\n-\r\n-L'oeil de Jean Valjean resta fixé à terre.\r\n-\r\n---Ma pièce! cria l'enfant, ma pièce blanche! mon argent! Il semblait que\r\n-Jean Valjean n'entendit point. L'enfant le prit au collet de sa blouse\r\n-et le secoua. Et en même temps il faisait effort pour déranger le gros\r\n-soulier ferré posé sur son trésor.\r\n-\r\n---Je veux ma pièce! ma pièce de quarante sous!\r\n-\r\n-L'enfant pleurait. La tête de Jean Valjean se releva. Il était toujours\r\n-assis. Ses yeux étaient troubles. Il considéra l'enfant avec une sorte\r\n-d'étonnement, puis il étendit la main vers son bâton et cria d'une voix\r\n-terrible:\r\n-\r\n---Qui est là ?\r\n-\r\n---Moi, monsieur, répondit l'enfant. Petit-Gervais! moi! moi! Rendez-moi\r\n-mes quarante sous, s'il vous plaît! Ôtez votre pied, monsieur, s'il vous\r\n-plaît!\r\n-\r\n-Puis irrité, quoique tout petit, et devenant presque menaçant:\r\n-\r\n---Ah, çà , ôterez-vous votre pied? Ôtez donc votre pied, voyons.\r\n-\r\n---Ah! c'est encore toi! dit Jean Valjean, et se dressant brusquement\r\n-tout debout, le pied toujours sur la pièce d'argent, il ajouta:--Veux-tu\r\n-bien te sauver!\r\n-\r\n-L'enfant effaré le regarda, puis commença à trembler de la tête aux\r\n-pieds, et, après quelques secondes de stupeur, se mit à s'enfuir en\r\n-courant de toutes ses forces sans oser tourner le cou ni jeter un cri.\r\n-\r\n-Cependant à une certaine distance l'essoufflement le força de s'arrêter,\r\n-et Jean Valjean, à travers sa rêverie, l'entendit qui sanglotait.\r\n-\r\n-Au bout de quelques instants l'enfant avait disparu. Le soleil s'était\r\n-couché. L'ombre se faisait autour de Jean Valjean. Il n'avait pas mangé\r\n-de la journée; il est probable qu'il avait la fièvre.\r\n-\r\n-Il était resté debout, et n'avait pas changé d'attitude depuis que\r\n-l'enfant s'était enfui. Son souffle soulevait sa poitrine à des\r\n-intervalles longs et inégaux. Son regard, arrêté à dix ou douze pas\r\n-devant lui, semblait étudier avec une attention profonde la forme d'un\r\n-vieux tesson de faïence bleue tombé dans l'herbe. Tout à coup il\r\n-tressaillit; il venait de sentir le froid du soir.\r\n-\r\n-Il raffermit sa casquette sur son front, chercha machinalement à croiser\r\n-et à boutonner sa blouse, fit un pas, et se baissa pour reprendre à \r\n-terre son bâton. En ce moment il aperçut la pièce de quarante sous que\r\n-son pied avait à demi enfoncée dans la terre et qui brillait parmi les\r\n-cailloux.\r\n-\r\n-Ce fut comme une commotion galvanique. Qu'est-ce que c'est que ça?\r\n-dit-il entre ses dents. Il recula de trois pas, puis s'arrêta, sans\r\n-pouvoir détacher son regard de ce point que son pied avait foulé\r\n-l'instant d'auparavant, comme si cette chose qui luisait là dans\r\n-l'obscurité eût été un oeil ouvert fixé sur lui.\r\n-\r\n-Au bout de quelques minutes, il s'élança convulsivement vers la pièce\r\n-d'argent, la saisit, et, se redressant, se mit à regarder au loin dans\r\n-la plaine, jetant à la fois ses yeux vers tous les points de l'horizon,\r\n-debout et frissonnant comme une bête fauve effarée qui cherche un asile.\r\n-\r\n-Il ne vit rien. La nuit tombait, la plaine était froide et vague, de\r\n-grandes brumes violettes montaient dans la clarté crépusculaire.\r\n-\r\n-Il dit: «Ah!» et se mit à marcher rapidement dans une certaine\r\n-direction, du côté où l'enfant avait disparu. Après une centaine de pas,\r\n-il s'arrêta, regarda, et ne vit rien.\r\n-\r\n-Alors il cria de toute sa force: «Petit-Gervais! Petit-Gervais!»\r\n-\r\n-Il se tut, et attendit.\r\n-\r\n-Rien ne répondit.\r\n-\r\n-La campagne était déserte et morne. Il était environné de l'étendue. Il\r\n-n'y avait rien autour de lui qu'une ombre où se perdait son regard et un\r\n-silence où sa voix se perdait.\r\n-\r\n-Une bise glaciale soufflait, et donnait aux choses autour de lui une\r\n-sorte de vie lugubre. Des arbrisseaux secouaient leurs petits bras\r\n-maigres avec une furie incroyable. On eût dit qu'ils menaçaient et\r\n-poursuivaient quelqu'un.\r\n-\r\n-Il recommença à marcher, puis il se mit à courir, et de temps en temps\r\n-il s'arrêtait, et criait dans cette solitude, avec une voix qui était ce\r\n-qu'on pouvait entendre de plus formidable et de plus désolé:\r\n-«Petit-Gervais! Petit-Gervais!»\r\n-\r\n-Certes, si l'enfant l'eût entendu, il eût eu peur et se fût bien gardé\r\n-de se montrer. Mais l'enfant était sans doute déjà bien loin.\r\n-\r\n-Il rencontra un prêtre qui était à cheval. Il alla à lui et lui dit:\r\n-\r\n---Monsieur le curé, avez-vous vu passer un enfant?\r\n-\r\n---Non, dit le prêtre.\r\n-\r\n---Un nommé Petit-Gervais?\r\n-\r\n---Je n'ai vu personne.\r\n-\r\n-Il tira deux pièces de cinq francs de sa sacoche et les remit au prêtre.\r\n-\r\n---Monsieur le curé, voici pour vos pauvres.--Monsieur le curé, c'est un\r\n-petit d'environ dix ans qui a une marmotte, je crois, et une vielle. Il\r\n-allait. Un de ces savoyards, vous savez?\r\n-\r\n---Je ne l'ai point vu.\r\n-\r\n---Petit-Gervais? il n'est point des villages d'ici? pouvez-vous me dire?\r\n-\r\n---Si c'est comme vous dites, mon ami, c'est un petit enfant étranger.\r\n-Cela passe dans le pays. On ne les connaît pas.\r\n-\r\n-Jean Valjean prit violemment deux autres écus de cinq francs qu'il donna\r\n-au prêtre.\r\n-\r\n---Pour vos pauvres, dit-il.\r\n-\r\n-Puis il ajouta avec égarement:\r\n-\r\n---Monsieur l'abbé, faites-moi arrêter. Je suis un voleur.\r\n-\r\n-Le prêtre piqua des deux et s'enfuit très effrayé.\r\n-\r\n-Jean Valjean se remit à courir dans la direction qu'il avait d'abord\r\n-prise.\r\n-\r\n-Il fit de la sorte un assez long chemin, regardant, appelant, criant,\r\n-mais il ne rencontra plus personne. Deux ou trois fois il courut dans la\r\n-plaine vers quelque chose qui lui faisait l'effet d'un être couché ou\r\n-accroupi; ce n'étaient que des broussailles ou des roches à fleur de\r\n-terre. Enfin, à un endroit où trois sentiers se croisaient, il s'arrêta.\r\n-La lune s'était levée. Il promena sa vue au loin et appela une dernière\r\n-fois: «Petit-Gervais! Petit-Gervais! Petit-Gervais!» Son cri s'éteignit\r\n-dans la brume, sans même éveiller un écho. Il murmura encore:\r\n-«Petit-Gervais!» mais d'une voix faible et presque inarticulée. Ce fut\r\n-là son dernier effort; ses jarrets fléchirent brusquement sous lui comme\r\n-si une puissance invisible l'accablait tout à coup du poids de sa\r\n-mauvaise conscience; il tomba épuisé sur une grosse pierre, les poings\r\n-dans ses cheveux et le visage dans ses genoux, et il cria: «Je suis un\r\n-misérable!»\r\n-\r\n-Alors son coeur creva et il se mit à pleurer. C'était la première fois\r\n-qu'il pleurait depuis dix-neuf ans.\r\n-\r\n-Quand Jean Valjean était sorti de chez l'évêque, on l'a vu, il était\r\n-hors de tout ce qui avait été sa pensée jusque-là . Il ne pouvait se\r\n-rendre compte de ce qui se passait en lui. Il se raidissait contre\r\n-l'action angélique et contre les douces paroles du vieillard. «Vous\r\n-m'avez promis de devenir honnête homme. Je vous achète votre âme. Je la\r\n-retire à l'esprit de perversité et je la donne au bon Dieu.» Cela lui\r\n-revenait sans cesse. Il opposait à cette indulgence céleste l'orgueil,\r\n-qui est en nous comme la forteresse du mal. Il sentait indistinctement\r\n-que le pardon de ce prêtre était le plus grand assaut et la plus\r\n-formidable attaque dont il eût encore été ébranlé; que son\r\n-endurcissement serait définitif s'il résistait à cette clémence; que,\r\n-s'il cédait, il faudrait renoncer à cette haine dont les actions des\r\n-autres hommes avaient rempli son âme pendant tant d'années, et qui lui\r\n-plaisait; que cette fois il fallait vaincre ou être vaincu, et que la\r\n-lutte, une lutte colossale et décisive, était engagée entre sa\r\n-méchanceté à lui et la bonté de cet homme.\r\n-\r\n-En présence de toutes ces lueurs, il allait comme un homme ivre. Pendant\r\n-qu'il marchait ainsi, les yeux hagards, avait-il une perception\r\n-distincte de ce qui pourrait résulter pour lui de son aventure à Digne?\r\n-Entendait-il tous ces bourdonnements mystérieux qui avertissent ou\r\n-importunent l'esprit à de certains moments de la vie? Une voix lui\r\n-disait-elle à l'oreille qu'il venait de traverser l'heure solennelle de\r\n-sa destinée, qu'il n'y avait plus de milieu pour lui, que si désormais\r\n-il n'était pas le meilleur des hommes il en serait le pire, qu'il\r\n-fallait pour ainsi dire que maintenant il montât plus haut que l'évêque\r\n-ou retombât plus bas que le galérien, que s'il voulait devenir bon il\r\n-fallait qu'il devînt ange; que s'il voulait rester méchant il fallait\r\n-qu'il devînt monstre?\r\n-\r\n-Ici encore il faut se faire ces questions que nous nous sommes déjà \r\n-faites ailleurs, recueillait-il confusément quelque ombre de tout ceci\r\n-dans sa pensée? Certes, le malheur, nous l'avons dit, fait l'éducation\r\n-de l'intelligence; cependant il est douteux que Jean Valjean fût en état\r\n-de démêler tout ce que nous indiquons ici. Si ces idées lui arrivaient,\r\n-il les entrevoyait plutôt qu'il ne les voyait, et elles ne réussissaient\r\n-qu'à le jeter dans un trouble insupportable et presque douloureux. Au\r\n-sortir de cette chose difforme et noire qu'on appelle le bagne, l'évêque\r\n-lui avait fait mal à l'âme comme une clarté trop vive lui eût fait mal\r\n-aux yeux en sortant des ténèbres. La vie future, la vie possible qui\r\n-s'offrait désormais à lui toute pure et toute rayonnante le remplissait\r\n-de frémissements et d'anxiété. Il ne savait vraiment plus où il en\r\n-était. Comme une chouette qui verrait brusquement se lever le soleil, le\r\n-forçat avait été ébloui et comme aveuglé par la vertu.\r\n-\r\n-Ce qui était certain, ce dont il ne se doutait pas, c'est qu'il n'était\r\n-déjà plus le même homme, c'est que tout était changé en lui, c'est qu'il\r\n-n'était plus en son pouvoir de faire que l'évêque ne lui eût pas parlé\r\n-et ne l'eût pas touché.\r\n-\r\n-Dans cette situation d'esprit, il avait rencontré Petit-Gervais et lui\r\n-avait volé ses quarante sous. Pourquoi? Il n'eût assurément pu\r\n-l'expliquer; était-ce un dernier effet et comme un suprême effort des\r\n-mauvaises pensées qu'il avait apportées du bagne, un reste d'impulsion,\r\n-un résultat de ce qu'on appelle en statique la _force acquise_? C'était\r\n-cela, et c'était aussi peut-être moins encore que cela. Disons-le\r\n-simplement, ce n'était pas lui qui avait volé, ce n'était pas l'homme,\r\n-c'était la bête qui, par habitude et par instinct, avait stupidement\r\n-posé le pied sur cet argent, pendant que l'intelligence se débattait au\r\n-milieu de tant d'obsessions inouïes et nouvelles. Quand l'intelligence\r\n-se réveilla et vit cette action de la brute, Jean Valjean recula avec\r\n-angoisse et poussa un cri d'épouvante.\r\n-\r\n-C'est que, phénomène étrange et qui n'était possible que dans la\r\n-situation où il était, en volant cet argent à cet enfant, il avait fait\r\n-une chose dont il n'était déjà plus capable.\r\n-\r\n-Quoi qu'il en soit, cette dernière mauvaise action eut sur lui un effet\r\n-décisif; elle traversa brusquement ce chaos qu'il avait dans\r\n-l'intelligence et le dissipa, mit d'un côté les épaisseurs obscures et\r\n-de l'autre la lumière, et agit sur son âme, dans l'état où elle se\r\n-trouvait, comme de certains réactifs chimiques agissent sur un mélange\r\n-trouble en précipitant un élément et en clarifiant l'autre.\r\n-\r\n-Tout d'abord, avant même de s'examiner et de réfléchir, éperdu, comme\r\n-quelqu'un qui cherche à se sauver, il tâcha de retrouver l'enfant pour\r\n-lui rendre son argent, puis, quand il reconnut que cela était inutile et\r\n-impossible, il s'arrêta désespéré. Au moment où il s'écria: «je suis un\r\n-misérable!» il venait de s'apercevoir tel qu'il était, et il était déjà \r\n-à ce point séparé de lui-même, qu'il lui semblait qu'il n'était plus\r\n-qu'un fantôme, et qu'il avait là devant lui, en chair et en os, le bâton\r\n-à la main, la blouse sur les reins, son sac rempli d'objets volés sur le\r\n-dos, avec son visage résolu et morne, avec sa pensée pleine de projets\r\n-abominables, le hideux galérien Jean Valjean.\r\n-\r\n-L'excès du malheur, nous l'avons remarqué, l'avait fait en quelque sorte\r\n-visionnaire. Ceci fut donc comme une vision. Il vit véritablement ce\r\n-Jean Valjean, cette face sinistre devant lui. Il fut presque au moment\r\n-de se demander qui était cet homme, et il en eut horreur.\r\n-\r\n-Son cerveau était dans un de ces moments violents et pourtant\r\n-affreusement calmes où la rêverie est si profonde qu'elle absorbe la\r\n-réalité. On ne voit plus les objets qu'on a autour de soi, et l'on voit\r\n-comme en dehors de soi les figures qu'on a dans l'esprit.\r\n-\r\n-Il se contempla donc, pour ainsi dire, face à face, et en même temps, à \r\n-travers cette hallucination, il voyait dans une profondeur mystérieuse\r\n-une sorte de lumière qu'il prit d'abord pour un flambeau. En regardant\r\n-avec plus d'attention cette lumière qui apparaissait à sa conscience, il\r\n-reconnut qu'elle avait la forme humaine, et que ce flambeau était\r\n-l'évêque.\r\n-\r\n-Sa conscience considéra tour à tour ces deux hommes ainsi placés devant\r\n-elle, l'évêque et Jean Valjean. Il n'avait pas fallu moins que le\r\n-premier pour détremper le second. Par un de ces effets singuliers qui\r\n-sont propres à ces sortes d'extases, à mesure que sa rêverie se\r\n-prolongeait, l'évêque grandissait et resplendissait à ses yeux, Jean\r\n-Valjean s'amoindrissait et s'effaçait. À un certain moment il ne fut\r\n-plus qu'une ombre. Tout à coup il disparut. L'évêque seul était resté.\r\n-\r\n-Il remplissait toute l'âme de ce misérable d'un rayonnement magnifique.\r\n-Jean Valjean pleura longtemps. Il pleura à chaudes larmes, il pleura à \r\n-sanglots, avec plus de faiblesse qu'une femme, avec plus d'effroi qu'un\r\n-enfant.\r\n-\r\n-Pendant qu'il pleurait, le jour se faisait de plus en plus dans son\r\n-cerveau, un jour extraordinaire, un jour ravissant et terrible à la\r\n-fois. Sa vie passée, sa première faute, sa longue expiation, son\r\n-abrutissement extérieur, son endurcissement intérieur, sa mise en\r\n-liberté réjouie par tant de plans de vengeance, ce qui lui était arrivé\r\n-chez l'évêque, la dernière chose qu'il avait faite, ce vol de quarante\r\n-sous à un enfant, crime d'autant plus lâche et d'autant plus monstrueux\r\n-qu'il venait après le pardon de l'évêque, tout cela lui revint et lui\r\n-apparut, clairement, mais dans une clarté qu'il n'avait jamais vue\r\n-jusque-là . Il regarda sa vie, et elle lui parut horrible; son âme, et\r\n-elle lui parut affreuse. Cependant un jour doux était sur cette vie et\r\n-sur cette âme. Il lui semblait qu'il voyait Satan à la lumière du\r\n-paradis.\r\n-\r\n-Combien d'heures pleura-t-il ainsi? que fit-il après avoir pleuré? où\r\n-alla-t-il? on ne l'a jamais su. Il paraît seulement avéré que, dans\r\n-cette même nuit, le voiturier qui faisait à cette époque le service de\r\n-Grenoble et qui arrivait à Digne vers trois heures du matin, vit en\r\n-traversant la rue de l'évêché un homme dans l'attitude de la prière, à \r\n-genoux sur le pavé, dans l'ombre, devant la porte de monseigneur\r\n-Bienvenu.\r\n-\r\n-\r\n-\r\n-\r\n-Livre troisième--En l'année 1817\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre I\r\n-\r\n-L'année 1817\r\n-\r\n-\r\n-1817 est l'année que Louis XVIII, avec un certain aplomb royal qui ne\r\n-manquait pas de fierté, qualifiait la vingt-deuxième de son règne. C'est\r\n-l'année où M. Bruguière de Sorsum était célèbre. Toutes les boutiques\r\n-des perruquiers, espérant la poudre et le retour de l'oiseau royal,\r\n-étaient badigeonnées d'azur et fleurdelysées. C'était le temps candide\r\n-où le comte Lynch siégeait tous les dimanches comme marguillier au banc\r\n-d'oeuvre de Saint-Germain-des-Prés en habit de pair de France, avec son\r\n-cordon rouge et son long nez, et cette majesté de profil particulière à \r\n-un homme qui a fait une action d'éclat. L'action d'éclat commise par M.\r\n-Lynch était ceci: avoir, étant maire de Bordeaux, le 12 mars 1814, donné\r\n-la ville un peu trop tôt à M. le duc d'Angoulême. De là sa pairie. En\r\n-1817, la mode engloutissait les petits garçons de quatre à six ans sous\r\n-de vastes casquettes en cuir maroquiné à oreillons assez ressemblantes à \r\n-des mitres d'esquimaux. L'armée française était vêtue de blanc, à \r\n-l'autrichienne; les régiments s'appelaient légions; au lieu de chiffres\r\n-ils portaient les noms des départements. Napoléon était à Sainte-Hélène,\r\n-et, comme l'Angleterre lui refusait du drap vert, il faisait retourner\r\n-ses vieux habits. En 1817, Pellegrini chantait, mademoiselle Bigottini\r\n-dansait; Potier régnait; Odry n'existait pas encore. Madame Saqui\r\n-succédait à Forioso. Il y avait encore des Prussiens en France. M.\r\n-Delalot était un personnage. La légitimité venait de s'affirmer en\r\n-coupant le poing, puis la tête, à Pleignier, à Carbonneau et à Tolleron.\r\n-Le prince de Talleyrand, grand chambellan, et l'abbé Louis, ministre\r\n-désigné des finances, se regardaient en riant du rire de deux augures;\r\n-tous deux avaient célébré, le 14 juillet 1790, la messe de la Fédération\r\n-au Champ de Mars; Talleyrand l'avait dite comme évêque, Louis l'avait\r\n-servie comme diacre. En 1817, dans les contre-allées de ce même Champ de\r\n-Mars, on apercevait de gros cylindres de bois, gisant sous la pluie,\r\n-pourrissant dans l'herbe, peints en bleu avec des traces d'aigles et\r\n-d'abeilles dédorées. C'étaient les colonnes qui, deux ans auparavant,\r\n-avaient soutenu l'estrade de l'empereur au Champ-de-Mai. Elles étaient\r\n-noircies çà et là de la brûlure du bivouac des Autrichiens baraqués près\r\n-du Gros-Caillou. Deux ou trois de ces colonnes avaient disparu dans les\r\n-feux de ces bivouacs et avaient chauffé les larges mains des\r\n-_kaiserlicks_. Le Champ de Mai avait eu cela de remarquable qu'il avait\r\n-été tenu au mois de juin et au Champ de Mars. En cette année 1817, deux\r\n-choses étaient populaires: le Voltaire-Touquet et la tabatière à la\r\n-Charte. L'émotion parisienne la plus récente était le crime de Dautun\r\n-qui avait jeté la tête de son frère dans le bassin du Marché-aux-Fleurs.\r\n-On commençait à faire au ministère de la marine une enquête sur cette\r\n-fatale frégate de la Méduse qui devait couvrir de honte Chaumareix et de\r\n-gloire Géricault. Le colonel Selves allait en Égypte pour y devenir\r\n-Soliman pacha. Le palais des Thermes, rue de la Harpe, servait de\r\n-boutique à un tonnelier. On voyait encore sur la plate-forme de la tour\r\n-octogone de l'hôtel de Cluny la petite logette en planches qui avait\r\n-servi d'observatoire à Messier, astronome de la marine sous Louis XVI.\r\n-La duchesse de Duras lisait à trois ou quatre amis, dans son boudoir\r\n-meublé d'X en satin bleu ciel, _Ourika_ inédite. On grattait les N au\r\n-Louvre. Le pont d'Austerlitz abdiquait et s'intitulait pont du Jardin du\r\n-Roi, double énigme qui déguisait à la fois le pont d'Austerlitz et le\r\n-jardin des Plantes. Louis XVIII, préoccupé, tout en annotant du coin de\r\n-l'ongle Horace, des héros qui se font empereurs et des sabotiers qui se\r\n-font dauphins, avait deux soucis: Napoléon et Mathurin Bruneau.\r\n-L'académie française donnait pour sujet de prix: _Le bonheur que procure\r\n-l'étude_. M. Bellart était officiellement éloquent. On voyait germer à \r\n-son ombre ce futur avocat général de Broè, promis aux sarcasmes de\r\n-Paul-Louis Courier. Il y avait un faux Chateaubriand appelé Marchangy,\r\n-en attendant qu'il y eut un faux Marchangy appelé d'Arlincourt. _Claire\r\n-d'Albe_ et _Malek-Adel_ étaient des chefs-d'oeuvre; madame Cottin était\r\n-déclarée le premier écrivain de l'époque. L'institut laissait rayer de\r\n-sa liste l'académicien Napoléon Bonaparte. Une ordonnance royale\r\n-érigeait Angoulême en école de marine, car, le duc d'Angoulême étant\r\n-grand amiral, il était évident que la ville d'Angoulême avait de droit\r\n-toutes les qualités d'un port de mer, sans quoi le principe monarchique\r\n-eût été entamé. On agitait en conseil des ministres la question de\r\n-savoir si l'on devait tolérer les vignettes représentant des voltiges\r\n-qui assaisonnaient les affiches de Franconi et qui attroupaient les\r\n-polissons des rues. M. Paër, auteur de l'_Agnese_, bonhomme à la face\r\n-carrée qui avait une verrue sur la joue, dirigeait les petits concerts\r\n-intimes de la marquise de Sassenaye, rue de la Ville-l'Évêque. Toutes\r\n-les jeunes filles chantaient _l'Ermite de Saint-Avelle_, paroles\r\n-d'Edmond Géraud. _Le Nain jaune_ se transformait en _Miroir_. Le café\r\n-Lemblin tenait pour l'empereur contre le café Valois qui tenait pour les\r\n-Bourbons. On venait de marier à une princesse de Sicile M. le duc de\r\n-Berry, déjà regardé du fond de l'ombre par Louvel. Il y avait un an que\r\n-madame de Staël était morte. Les gardes du corps sifflaient mademoiselle\r\n-Mars. Les grands journaux étaient tout petits. Le format était\r\n-restreint, mais la liberté était grande. _Le Constitutionnel_ était\r\n-constitutionnel. _La Minerve_ appelait Chateaubriand _Chateaubriant_. Ce\r\n-_t_ faisait beaucoup rire les bourgeois aux dépens du grand écrivain.\r\n-Dans des journaux vendus, des journalistes prostitués insultaient les\r\n-proscrits de 1815; David n'avait plus de talent, Arnault n'avait plus\r\n-d'esprit, Carnot n'avait plus de probité; Soult n'avait gagné aucune\r\n-bataille; il est vrai que Napoléon n'avait plus de génie. Personne\r\n-n'ignore qu'il est assez rare que les lettres adressées par la poste à \r\n-un exilé lui parviennent, les polices se faisant un religieux devoir de\r\n-les intercepter. Le fait n'est point nouveau; Descartes, banni, s'en\r\n-plaignait. Or, David ayant, dans un journal belge, montré quelque humeur\r\n-de ne pas recevoir les lettres qu'on lui écrivait, ceci paraissait\r\n-plaisant aux feuilles royalistes qui bafouaient à cette occasion le\r\n-proscrit. Dire: _les régicides_, ou dire: _les votants_, dire: _les\r\n-ennemis_, ou dire: _les alliés_, dire: _Napoléon_, ou dire: _Buonaparte_,\r\n-cela séparait deux hommes plus qu'un abîme. Tous les gens de bons sens\r\n-convenaient que l'ère des révolutions était à jamais fermée par le roi\r\n-Louis XVIII, surnommé «l'immortel auteur de la charte». Au terre-plein\r\n-du Pont-Neuf, on sculptait le mot _Redivivus_, sur le piédestal qui\r\n-attendait la statue de Henri IV. M. Piet ébauchait, rue Thérèse, n° 4,\r\n-son conciliabule pour consolider la monarchie. Les chefs de la droite\r\n-disaient dans les conjonctures graves: «Il faut écrire à Bacot». MM.\r\n-Canuel, O'Mahony et de Chappedelaine esquissaient, un peu approuvés de\r\n-Monsieur, ce qui devait être plus tard «la conspiration du bord de\r\n-l'eau». L'Épingle Noire complotait de son côté. Delaverderie s'abouchait\r\n-avec Trogoff. M. Decazes, esprit dans une certaine mesure libéral,\r\n-dominait. Chateaubriand, debout tous les matins devant sa fenêtre du n°\r\n-27 de la rue Saint-Dominique, en pantalon à pieds et en pantoufles, ses\r\n-cheveux gris coiffés d'un madras, les yeux fixés sur un miroir, une\r\n-trousse complète de chirurgien dentiste ouverte devant lui, se curait\r\n-les dents, qu'il avait charmantes, tout en dictant des variantes de _la\r\n-Monarchie selon la Charte_ à M. Pilorge, son secrétaire. La critique\r\n-faisant autorité préférait Lafon à Talma. M. de Féletz signait A.; M.\r\n-Hoffmann signait Z. Charles Nodier écrivait _Thérèse Aubert_. Le divorce\r\n-était aboli. Les lycées s'appelaient collèges. Les collégiens, ornés au\r\n-collet d'une fleur de lys d'or, s'y gourmaient à propos du roi de Rome.\r\n-La contre-police du château dénonçait à son altesse royale Madame le\r\n-portrait, partout exposé, de M. le duc d'Orléans, lequel avait meilleure\r\n-mine en uniforme de colonel général des houzards que M. le duc de Berry\r\n-en uniforme de colonel général des dragons; grave inconvénient. La ville\r\n-de Paris faisait redorer à ses frais le dôme des Invalides. Les hommes\r\n-sérieux se demandaient ce que ferait, dans telle ou telle occasion, M.\r\n-de Trinquelague; M. Clausel de Montals se séparait, sur divers points,\r\n-de M. Clausel de Coussergues; M. de Salaberry n'était pas content. Le\r\n-comédien Picard, qui était de l'Académie dont le comédien Molière\r\n-n'avait pu être, faisait jouer _les deux Philibert_ à l'Odéon, sur le\r\n-fronton duquel l'arrachement des lettres laissait encore lire\r\n-distinctement: THÉÂTRE DE L'IMPÉRATRICE. On prenait parti pour ou contre\r\n-Cugnet de Montarlot. Fabvier était factieux; Bavoux était\r\n-révolutionnaire. Le libraire Pélicier publiait une édition de Voltaire,\r\n-sous ce titre: _OEuvres de Voltaire_, de l'Académie française. «Cela\r\n-fait venir les acheteurs», disait cet éditeur naïf. L'opinion générale\r\n-était que M. Charles Loyson, serait le génie du siècle; l'envie\r\n-commençait à le mordre, signe de gloire; et l'on faisait sur lui ce\r\n-vers:\r\n-\r\n-_Même quand Loyson vole, on sent qu'il a des pattes._\r\n-\r\n-Le cardinal Fesch refusant de se démettre, M. de Pins, archevêque\r\n-d'Amasie, administrait le diocèse de Lyon. La querelle de la vallée des\r\n-Dappes commençait entre la Suisse et la France par un mémoire du\r\n-capitaine Dufour, depuis général. Saint-Simon, ignoré, échafaudait son\r\n-rêve sublime. Il y avait à l'académie des sciences un Fourier célèbre\r\n-que la postérité a oublié et dans je ne sais quel grenier un Fourier\r\n-obscur dont l'avenir se souviendra. Lord Byron commençait à poindre; une\r\n-note d'un poème de Millevoye l'annonçait à la France en ces termes: _un\r\n-certain lord Baron_. David d'Angers s'essayait à pétrir le marbre.\r\n-L'abbé Caron parlait avec éloge, en petit comité de séminaristes, dans\r\n-le cul-de-sac des Feuillantines, d'un prêtre inconnu nommé Félicité\r\n-Robert qui a été plus tard Lamennais. Une chose qui fumait et clapotait\r\n-sur la Seine avec le bruit d'un chien qui nage allait et venait sous les\r\n-fenêtres des Tuileries, du pont Royal au pont Louis XV c'était une\r\n-mécanique bonne à pas grand'chose, une espèce de joujou, une rêverie\r\n-d'inventeur songe-creux, une utopie: un bateau à vapeur. Les Parisiens\r\n-regardaient cette inutilité avec indifférence. M. de Vaublanc,\r\n-réformateur de l'Institut par coup d'État, ordonnance et fournée, auteur\r\n-distingué de plusieurs académiciens, après en avoir fait, ne pouvait\r\n-parvenir à l'être. Le faubourg Saint-Germain et la pavillon Marsan\r\n-souhaitaient pour préfet de police M. Delaveau, à cause de sa dévotion.\r\n-Dupuytren et Récamier se prenaient de querelle à l'amphithéâtre de\r\n-l'École de médecine et se menaçaient du poing à propos de la divinité de\r\n-Jésus-Christ. Cuvier, un oeil sur la Genèse et l'autre sur la nature,\r\n-s'efforçait de plaire à la réaction bigote en mettant les fossiles\r\n-d'accord avec les textes et en faisant flatter Moïse par les\r\n-mastodontes. M. François de Neufchâteau, louable cultivateur de la\r\n-mémoire de Parmentier, faisait mille efforts pour que _pomme de terre_\r\n-fût prononcée _parmentière_, et n'y réussissait point. L'abbé Grégoire,\r\n-ancien évêque, ancien conventionnel, ancien sénateur, était passé dans\r\n-la polémique royaliste à l'état «d'infâme Grégoire». Cette locution que\r\n-nous venons d'employer: _passer à l'état de_, était dénoncée comme\r\n-néologisme par M. Royer-Collard. On pouvait distinguer encore à sa\r\n-blancheur, sous la troisième arche du pont d'Iéna, la pierre neuve avec\r\n-laquelle, deux ans auparavant, on avait bouché le trou de mine pratiqué\r\n-par Blücher pour faire sauter le pont. La justice appelait à sa barre un\r\n-homme qui, en voyant entrer le comte d'Artois à Notre-Dame, avait dit\r\n-tout haut: _Sapristi! je regrette le temps où je voyais Bonaparte et\r\n-Talma entrer bras dessus bras dessous au Bal-Sauvage_. Propos séditieux.\r\n-Six mois de prison. Des traîtres se montraient déboutonnés; des hommes\r\n-qui avaient passé à l'ennemi la veille d'une bataille ne cachaient rien\r\n-de la récompense et marchaient impudiquement en plein soleil dans le\r\n-cynisme des richesses et des dignités; des déserteurs de Ligny et des\r\n-Quatre-Bras, dans le débraillé de leur turpitude payée, étalaient leur\r\n-dévouement monarchique tout nu; oubliant ce qui est écrit en Angleterre\r\n-sur la muraille intérieure des water-closets publics: _Please adjust\r\n-your dress before leaving_.\r\n-\r\n-Voilà , pêle-mêle, ce qui surnage confusément de l'année 1817, oubliée\r\n-aujourd'hui. L'histoire néglige presque toutes ces particularités, et ne\r\n-peut faire autrement; l'infini l'envahirait. Pourtant ces détails, qu'on\r\n-appelle à tort petits--il n'y a ni petits faits dans l'humanité, ni\r\n-petites feuilles dans la végétation--sont utiles. C'est de la\r\n-physionomie des années que se compose la figure des siècles.\r\n-\r\n-En cette année 1817, quatre jeunes Parisiens firent «une bonne farce».\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre II\r\n-\r\n-Double quatuor\r\n-\r\n-\r\n-Ces Parisiens étaient l'un de Toulouse, l'autre de Limoges, le troisième\r\n-de Cahors et le quatrième de Montauban; mais ils étaient étudiants, et\r\n-qui dit étudiant dit parisien; étudier à Paris, c'est naître à Paris.\r\n-\r\n-Ces jeunes gens étaient insignifiants; tout le monde a vu ces\r\n-figures-là ; quatre échantillons du premier venu; ni bons ni mauvais, ni\r\n-savants ni ignorants, ni des génies ni des imbéciles; beaux de ce\r\n-charmant avril qu'on appelle vingt ans. C'étaient quatre Oscars\r\n-quelconques, car à cette époque les Arthurs n'existaient pas encore.\r\n-_Brûlez pour lui les parfums d'Arabie_, s'écriait la romance, _Oscar\r\n-s'avance, Oscar, je vais le voir!_ On sortait d'Ossian, l'élégance était\r\n-scandinave et calédonienne, le genre anglais pur ne devait prévaloir que\r\n-plus tard, et le premier des Arthurs, Wellington, venait à peine de\r\n-gagner la bataille de Waterloo.\r\n-\r\n-Ces Oscars s'appelaient l'un Félix Tholomyès, de Toulouse; l'autre\r\n-Listolier, de Cahors; l'autre Fameuil, de Limoges; le dernier\r\n-Blachevelle, de Montauban. Naturellement chacun avait sa maîtresse.\r\n-Blachevelle aimait Favourite, ainsi nommée parce qu'elle était allée en\r\n-Angleterre; Listolier adorait Dahlia, qui avait pris pour nom de guerre\r\n-un nom de fleur; Fameuil idolâtrait Zéphine, abrégé de Joséphine;\r\n-Tholomyès avait Fantine, dite la Blonde à cause de ses beaux cheveux\r\n-couleur de soleil.\r\n-\r\n-Favourite, Dahlia, Zéphine et Fantine étaient quatre ravissantes filles,\r\n-parfumées et radieuses, encore un peu ouvrières, n'ayant pas tout à fait\r\n-quitté leur aiguille, dérangées par les amourettes, mais ayant sur le\r\n-visage un reste de la sérénité du travail et dans l'âme cette fleur\r\n-d'honnêteté qui dans la femme survit à la première chute. Il y avait une\r\n-des quatre qu'on appelait la jeune, parce qu'elle était la cadette; et\r\n-une qu'on appelait la vieille. La vieille avait vingt-trois ans. Pour ne\r\n-rien celer, les trois premières étaient plus expérimentées, plus\r\n-insouciantes et plus envolées dans le bruit de la vie que Fantine la\r\n-Blonde, qui en était à sa première illusion.\r\n-\r\n-Dahlia, Zéphine, et surtout Favourite, n'en auraient pu dire autant. Il\r\n-y avait déjà plus d'un épisode à leur roman à peine commencé, et\r\n-l'amoureux, qui s'appelait Adolphe au premier chapitre, se trouvait être\r\n-Alphonse au second, et Gustave au troisième. Pauvreté et coquetterie\r\n-sont deux conseillères fatales, l'une gronde, l'autre flatte; et les\r\n-belles filles du peuple les ont toutes les deux qui leur parlent bas à \r\n-l'oreille, chacune de son côté. Ces âmes mal gardées écoutent. De là les\r\n-chutes qu'elles font et les pierres qu'on leur jette. On les accable\r\n-avec la splendeur de tout ce qui est immaculé et inaccessible. Hélas! si\r\n-la _Yungfrau_ avait faim?\r\n-\r\n-Favourite, ayant été en Angleterre, avait pour admiratrices Zéphine et\r\n-Dahlia. Elle avait eu de très bonne heure un chez-soi. Son père était un\r\n-vieux professeur de mathématiques brutal et qui gasconnait; point marié,\r\n-courant le cachet malgré l'âge. Ce professeur, étant jeune, avait vu un\r\n-jour la robe d'une femme de chambre s'accrocher à un garde-cendre; il\r\n-était tombé amoureux de cet accident. Il en était résulté Favourite.\r\n-Elle rencontrait de temps en temps son père, qui la saluait. Un matin,\r\n-une vieille femme à l'air béguin était entrée chez elle et lui avait\r\n-dit:\r\n-\r\n---Vous ne me connaissez pas, mademoiselle?\r\n-\r\n---Non.\r\n-\r\n---Je suis ta mère.\r\n-\r\n-Puis la vieille avait ouvert le buffet, bu et mangé, fait apporter un\r\n-matelas qu'elle avait, et s'était installée. Cette mère, grognon et\r\n-dévote, ne parlait jamais à Favourite, restait des heures sans souffler\r\n-mot, déjeunait, dînait et soupait comme quatre, et descendait faire\r\n-salon chez le portier, où elle disait du mal de sa fille.\r\n-\r\n-Ce qui avait entraîné Dahlia vers Listolier, vers d'autres peut-être,\r\n-vers l'oisiveté, c'était d'avoir de trop jolis ongles roses. Comment\r\n-faire travailler ces ongles-là ? Qui veut rester vertueuse ne doit pas\r\n-avoir pitié de ses mains. Quant à Zéphine, elle avait conquis Fameuil\r\n-par sa petite manière mutine et caressante de dire: «Oui, monsieur».\r\n-\r\n-Les jeunes gens étant camarades, les jeunes filles étaient amies. Ces\r\n-amours-là sont toujours doublés de ces amitiés-là .\r\n-\r\n-Sage et philosophe, c'est deux; et ce qui le prouve, c'est que, toutes\r\n-réserves faites sur ces petits ménages irréguliers, Favourite, Zéphine\r\n-et Dahlia étaient des filles philosophes, et Fantine une fille sage.\r\n-\r\n-Sage, dira-t-on? et Tholomyès? Salomon répondrait que l'amour fait\r\n-partie de la sagesse. Nous nous bornons à dire que l'amour de Fantine\r\n-était un premier amour, un amour unique, un amour fidèle.\r\n-\r\n-Elle était la seule des quatre qui ne fût tutoyée que par un seul.\r\n-\r\n-Fantine était un de ces êtres comme il en éclôt, pour ainsi dire, au\r\n-fond du peuple. Sortie des plus insondables épaisseurs de l'ombre\r\n-sociale, elle avait au front le signe de l'anonyme et de l'inconnu. Elle\r\n-était née à Montreuil-sur-mer. De quels parents? Qui pourrait le dire?\r\n-On ne lui avait jamais connu ni père ni mère. Elle se nommait Fantine.\r\n-Pourquoi Fantine? On ne lui avait jamais connu d'autre nom. À l'époque\r\n-de sa naissance, le Directoire existait encore. Point de nom de famille,\r\n-elle n'avait pas de famille; point de nom de baptême, l'église n'était\r\n-plus là . Elle s'appela comme il plut au premier passant qui la rencontra\r\n-toute petite, allant pieds nus dans la rue. Elle reçut un nom comme elle\r\n-recevait l'eau des nuées sur son front quand il pleuvait. On l'appela la\r\n-petite Fantine. Personne n'en savait davantage. Cette créature humaine\r\n-était venue dans la vie comme cela. À dix ans, Fantine quitta la ville\r\n-et s'alla mettre en service chez des fermiers des environs. À quinze\r\n-ans, elle vint à Paris \u0022chercher fortune\u0022. Fantine était belle et resta\r\n-pure le plus longtemps qu'elle put. C'était une jolie blonde avec de\r\n-belles dents. Elle avait de l'or et des perles pour dot, mais son or\r\n-était sur sa tête et ses perles étaient dans sa bouche.\r\n-\r\n-Elle travailla pour vivre; puis, toujours pour vivre, car le coeur a sa\r\n-faim aussi, elle aima.\r\n-\r\n-Elle aima Tholomyès.\r\n-\r\n-Amourette pour lui, passion pour elle. Les rues du quartier latin,\r\n-qu'emplit le fourmillement des étudiants et des grisettes, virent le\r\n-commencement de ce songe. Fantine, dans ces dédales de la colline du\r\n-Panthéon, où tant d'aventures se nouent et se dénouent, avait fui\r\n-longtemps Tholomyès, mais de façon à le rencontrer toujours. Il y a une\r\n-manière d'éviter qui ressemble à chercher. Bref, l'églogue eut lieu.\r\n-\r\n-Blachevelle, Listolier et Fameuil formaient une sorte de groupe dont\r\n-Tholomyès était la tête. C'était lui qui avait l'esprit.\r\n-\r\n-Tholomyès était l'antique étudiant vieux; il était riche; il avait\r\n-quatre mille francs de rente; quatre mille francs de rente, splendide\r\n-scandale sur la montagne Sainte-Geneviève. Tholomyès était un viveur de\r\n-trente ans, mal conservé. Il était ridé et édenté; et il ébauchait une\r\n-calvitie dont il disait lui-même sans tristesse: _crâne à trente ans,\r\n-genou à quarante_. Il digérait médiocrement, et il lui était venu un\r\n-larmoiement à un oeil. Mais à mesure que sa jeunesse s'éteignait, il\r\n-allumait sa gaîté; il remplaçait ses dents par des lazzis, ses cheveux\r\n-par la joie, sa santé par l'ironie, et son oeil qui pleurait riait sans\r\n-cesse. Il était délabré, mais tout en fleurs. Sa jeunesse, pliant bagage\r\n-bien avant l'âge, battait en retraite en bon ordre, éclatait de rire, et\r\n-l'on n'y voyait que du feu. Il avait eu une pièce refusée au Vaudeville.\r\n-Il faisait çà et là des vers quelconques. En outre, il doutait\r\n-supérieurement de toute chose, grande force aux yeux des faibles. Donc,\r\n-étant ironique et chauve, il était le chef. _Iron_ est un mot anglais\r\n-qui veut dire fer. Serait-ce de là que viendrait ironie?\r\n-\r\n-Un jour Tholomyès prit à part les trois autres, fît un geste d'oracle,\r\n-et leur dit:\r\n-\r\n---Il y a bientôt un an que Fantine, Dahlia, Zéphine et Favourite nous\r\n-demandent de leur faire une surprise. Nous la leur avons promise\r\n-solennellement. Elles nous en parlent toujours, à moi surtout. De même\r\n-qu'à Naples les vieilles femmes crient à saint Janvier: _Faccia\r\n-gialluta, fa o miracolo_. Face jaune, fais ton miracle! nos belles me\r\n-disent sans cesse: «Tholomyès, quand accoucheras-tu de ta surprise?» En\r\n-même temps nos parents nous écrivent. Scie des deux côtés. Le moment me\r\n-semble venu. Causons.\r\n-\r\n-Sur ce, Tholomyès baissa la voix, et articula mystérieusement quelque\r\n-chose de si gai qu'un vaste et enthousiaste ricanement sortit des quatre\r\n-bouches à la fois et que Blachevelle s'écria:\r\n-\r\n---Ça, c'est une idée!\r\n-\r\n-Un estaminet plein de fumée se présenta, ils y entrèrent, et le reste de\r\n-leur conférence se perdit dans l'ombre.\r\n-\r\n-Le résultat de ces ténèbres fut une éblouissante partie de plaisir qui\r\n-eut lieu le dimanche suivant, les quatre jeunes gens invitant les quatre\r\n-jeunes filles.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre III\r\n-\r\n-Quatre à quatre\r\n-\r\n-\r\n-Ce qu'était une partie de campagne d'étudiants et de grisettes, il y a\r\n-quarante-cinq ans, on se le représente malaisément aujourd'hui. Paris\r\n-n'a plus les mêmes environs; la figure de ce qu'on pourrait appeler la\r\n-vie circumparisienne a complètement changé depuis un demi-siècle; où il\r\n-y avait le coucou, il y a le wagon; où il y avait la patache, il y a le\r\n-bateau à vapeur; on dit aujourd'hui Fécamp comme on disait Saint-Cloud.\r\n-Le Paris de 1862 est une ville qui a la France pour banlieue.\r\n-\r\n-Les quatre couples accomplirent consciencieusement toutes les folies\r\n-champêtres possibles alors. On entrait dans les vacances, et c'était une\r\n-chaude et claire journée d'été. La veille, Favourite, la seule qui sût\r\n-écrire, avait écrit ceci à Tholomyès au nom des quatre: «C'est un bonne\r\n-heure de sortir de bonheur.» C'est pourquoi ils se levèrent à cinq\r\n-heures du matin. Puis ils allèrent à Saint-Cloud par le coche,\r\n-regardèrent la cascade à sec, et s'écrièrent: «Cela doit être bien beau\r\n-quand il y a de l'eau!» déjeunèrent à la _Tête-Noire_, où Castaing\r\n-n'avait pas encore passé, se payèrent une partie de bagues au quinconce\r\n-du grand bassin, montèrent à la lanterne de Diogène, jouèrent des\r\n-macarons à la roulette du pont de Sèvres, cueillirent des bouquets à \r\n-Puteaux, achetèrent des mirlitons à Neuilly, mangèrent partout des\r\n-chaussons de pommes, furent parfaitement heureux.\r\n-\r\n-Les jeunes filles bruissaient et bavardaient comme des fauvettes\r\n-échappées. C'était un délire. Elles donnaient par moments de petites\r\n-tapes aux jeunes gens. Ivresse matinale de la vie! Adorables années!\r\n-L'aile des libellules frissonne. Oh! qui que vous soyez, vous\r\n-souvenez-vous? Avez-vous marché dans les broussailles, en écartant les\r\n-branches à cause de la tête charmante qui vient derrière vous? Avez-vous\r\n-glissé en riant sur quelque talus mouillé par la pluie avec une femme\r\n-aimée qui vous retient par la main et qui s'écrie: «Ah! mes brodequins\r\n-tout neufs! dans quel état ils sont!»\r\n-\r\n-Disons tout de suite que cette joyeuse contrariété, une ondée, manqua à \r\n-cette compagnie de belle humeur, quoique Favourite eût dit en partant,\r\n-avec un accent magistral et maternel: _Les limaces se promènent dans les\r\n-sentiers. Signe de pluie, mes enfants_.\r\n-\r\n-Toutes quatre étaient follement jolies. Un bon vieux poète classique,\r\n-alors en renom, un bonhomme qui avait une Éléonore, M. le chevalier de\r\n-Labouïsse, errant ce jour-là sous les marronniers de Saint-Cloud, les\r\n-vit passer vers dix heures du matin; il s'écria: _Il y en a une de\r\n-trop_, songeant aux Grâces. Favourite, l'amie de Blachevelle, celle de\r\n-vingt-trois ans, la vieille, courait en avant sous les grandes branches\r\n-vertes, sautait les fossés, enjambait éperdument les buissons, et\r\n-présidait cette gaîté avec une verve de jeune faunesse. Zéphine et\r\n-Dahlia, que le hasard avait faites belles de façon qu'elles se faisaient\r\n-valoir en se rapprochant et se complétaient, ne se quittaient point, par\r\n-instinct de coquetterie plus encore que par amitié, et, appuyées l'une à \r\n-l'autre, prenaient des poses anglaises; les premiers _keepsakes_\r\n-venaient de paraître, la mélancolie pointait pour les femmes, comme,\r\n-plus tard, le byronisme pour les hommes, et les cheveux du sexe tendre\r\n-commençaient à s'éplorer. Zéphine et Dahlia étaient coiffées en\r\n-rouleaux. Listolier et Fameuil, engagés dans une discussion sur leurs\r\n-professeurs, expliquaient à Fantine la différence qu'il y avait entre M.\r\n-Delvincourt et M. Blondeau.\r\n-\r\n-Blachevelle semblait avoir été créé expressément pour porter sur son\r\n-bras le dimanche le châle-ternaux boiteux de Favourite.\r\n-\r\n-Tholomyès suivait, dominant le groupe. Il était très gai, mais on\r\n-sentait en lui le gouvernement; il y avait de la dictature dans sa\r\n-jovialité; son ornement principal était un pantalon jambes-d'éléphant,\r\n-en nankin, avec sous-pieds de tresse de cuivre; il avait un puissant\r\n-rotin de deux cents francs à la main, et, comme il se permettait tout,\r\n-une chose étrange appelée cigare, à la bouche. Rien n'étant sacré pour\r\n-lui, il fumait.\r\n-\r\n---Ce Tholomyès est étonnant, disaient les autres avec vénération. Quels\r\n-pantalons! quelle énergie!\r\n-\r\n-Quant à Fantine, c'était la joie. Ses dents splendides avaient\r\n-évidemment reçu de Dieu une fonction, le rire. Elle portait à sa main\r\n-plus volontiers que sur sa tête son petit chapeau de paille cousue, aux\r\n-longues brides blanches. Ses épais cheveux blonds, enclins à flotter et\r\n-facilement dénoués et qu'il fallait rattacher sans cesse, semblaient\r\n-faits pour la fuite de Galatée sous les saules. Ses lèvres roses\r\n-babillaient avec enchantement. Les coins de sa bouche voluptueusement\r\n-relevés, comme aux mascarons antiques d'Érigone, avaient l'air\r\n-d'encourager les audaces; mais ses longs cils pleins d'ombre\r\n-s'abaissaient discrètement sur ce brouhaha du bas du visage comme pour\r\n-mettre le holà . Toute sa toilette avait on ne sait quoi de chantant et\r\n-de flambant. Elle avait une robe de barège mauve, de petits\r\n-souliers-cothurnes mordorés dont les rubans traçaient des X sur son fin\r\n-bas blanc à jour, et cette espèce de spencer en mousseline, invention\r\n-marseillaise, dont le nom, canezou, corruption du mot _quinze août_\r\n-prononcé à la Canebière, signifie beau temps, chaleur et midi. Les trois\r\n-autres, moins timides, nous l'avons dit, étaient décolletées tout net,\r\n-ce qui, l'été, sous des chapeaux couverts de fleurs, a beaucoup de grâce\r\n-et d'agacerie; mais, à côté de ces ajustements hardis, le canezou de la\r\n-blonde Fantine, avec ses transparences, ses indiscrétions et ses\r\n-réticences, cachant et montrant à la fois, semblait une trouvaille\r\n-provocante de la décence, et la fameuse cour d'amour, présidée par la\r\n-vicomtesse de Cette aux yeux vert de mer, eût peut-être donné le prix de\r\n-la coquetterie à ce canezou qui concourait pour la chasteté. Le plus\r\n-naïf est quelquefois le plus savant. Cela arrive.\r\n-\r\n-Éclatante de face, délicate de profil, les yeux d'un bleu profond, les\r\n-paupières grasses, les pieds cambrés et petits, les poignets et les\r\n-chevilles admirablement emboîtés, la peau blanche laissant voir çà et là \r\n-les arborescences azurées des veines, la joue puérile et franche, le cou\r\n-robuste des Junons éginétiques, la nuque forte et souple, les épaules\r\n-modelées comme par Coustou, ayant au centre une voluptueuse fossette\r\n-visible à travers la mousseline; une gaîté glacée de rêverie;\r\n-sculpturale et exquise; telle était Fantine; et l'on devinait sous ces\r\n-chiffons une statue, et dans cette statue une âme.\r\n-\r\n-Fantine était belle, sans trop le savoir. Les rares songeurs, prêtres\r\n-mystérieux du beau, qui confrontent silencieusement toute chose à la\r\n-perfection, eussent entrevu en cette petite ouvrière, à travers la\r\n-transparence de la grâce parisienne, l'antique euphonie sacrée. Cette\r\n-fille de l'ombre avait de la race. Elle était belle sous les deux\r\n-espèces, qui sont le style et le rythme. Le style est la forme de\r\n-l'idéal; le rythme en est le mouvement.\r\n-\r\n-Nous avons dit que Fantine était la joie, Fantine était aussi la pudeur.\r\n-\r\n-Pour un observateur qui l'eût étudiée attentivement, ce qui se dégageait\r\n-d'elle, à travers toute cette ivresse de l'âge, de la saison et de\r\n-l'amourette, c'était une invincible expression de retenue et de\r\n-modestie. Elle restait un peu étonnée. Ce chaste étonnement-là est la\r\n-nuance qui sépare Psyché de Vénus. Fantine avait les longs doigts blancs\r\n-et fins de la vestale qui remue les cendres du feu sacré avec une\r\n-épingle d'or. Quoiqu'elle n'eût rien refusé, on ne le verra que trop, à \r\n-Tholomyès, son visage, au repos, était souverainement virginal; une\r\n-sorte de dignité sérieuse et presque austère l'envahissait soudainement\r\n-à de certaines heures, et rien n'était singulier et troublant comme de\r\n-voir la gaîté s'y éteindre si vite et le recueillement y succéder sans\r\n-transition à l'épanouissement. Cette gravité subite, parfois sévèrement\r\n-accentuée, ressemblait au dédain d'une déesse. Son front, son nez et son\r\n-menton offraient cet équilibre de ligne, très distinct de l'équilibre de\r\n-proportion, et d'où résulte l'harmonie du visage; dans l'intervalle si\r\n-caractéristique qui sépare la base du nez de la lèvre supérieure, elle\r\n-avait ce pli imperceptible et charmant, signe mystérieux de la chasteté\r\n-qui rendit Barberousse amoureux d'une Diane trouvée dans les fouilles\r\n-d'Icône.\r\n-\r\n-L'amour est une faute; soit. Fantine était l'innocence surnageant sur la\r\n-faute.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IV\r\n-\r\n-Tholomyès est si joyeux qu'il chante une chanson espagnole\r\n-\r\n-\r\n-Cette journée-là était d'un bout à l'autre faite d'aurore. Toute la\r\n-nature semblait avoir congé, et rire. Les parterres de Saint-Cloud\r\n-embaumaient; le souffle de la Seine remuait vaguement les feuilles;\r\n-les branches gesticulaient dans le vent; les abeilles mettaient les\r\n-jasmins au pillage; toute une bohème de papillons s'ébattait dans les\r\n-achillées, les trèfles et les folles avoines; il y avait dans l'auguste\r\n-parc du roi de France un tas de vagabonds, les oiseaux.\r\n-\r\n-Les quatre joyeux couples, mêlés au soleil, aux champs, aux fleurs, aux\r\n-arbres, resplendissaient.\r\n-\r\n-Et, dans cette communauté de paradis, parlant, chantant, courant,\r\n-dansant, chassant aux papillons, cueillant des liserons, mouillant leurs\r\n-bas à jour roses dans les hautes herbes, fraîches, folles, point\r\n-méchantes, toutes recevaient un peu çà et là les baisers de tous,\r\n-excepté Fantine, enfermée dans sa vague résistance rêveuse et farouche,\r\n-et qui aimait.\r\n-\r\n---Toi, lui disait Favourite, tu as toujours l'air chose.\r\n-\r\n-Ce sont là les joies. Ces passages de couples heureux sont un appel\r\n-profond à la vie et à la nature, et font sortir de tout la caresse et la\r\n-lumière. Il y avait une fois une fée qui fit les prairies et les arbres\r\n-exprès pour les amoureux. De là cette éternelle école buissonnière des\r\n-amants qui recommence sans cesse et qui durera tant qu'il y aura des\r\n-buissons et des écoliers. De là la popularité du printemps parmi les\r\n-penseurs. Le patricien et le gagne-petit, le duc et pair et le robin,\r\n-les gens de la cour et les gens de la ville, comme on parlait autrefois,\r\n-tous sont sujets de cette fée. On rit, on se cherche, il y a dans l'air\r\n-une clarté d'apothéose, quelle transfiguration que d'aimer! Les clercs\r\n-de notaire sont des dieux. Et les petits cris, les poursuites dans\r\n-l'herbe, les tailles prises au vol, ces jargons qui sont des mélodies,\r\n-ces adorations qui éclatent dans la façon de dire une syllabe, ces\r\n-cerises arrachées d'une bouche à l'autre, tout cela flamboie et passe\r\n-dans des gloires célestes. Les belles filles font un doux gaspillage\r\n-d'elles-mêmes. On croit que cela ne finira jamais. Les philosophes, les\r\n-poètes, les peintres regardent ces extases et ne savent qu'en faire,\r\n-tant cela les éblouit. Le départ pour Cythère! s'écrie Watteau; Lancret,\r\n-le peintre de la roture, contemple ses bourgeois envolés dans le bleu;\r\n-Diderot tend les bras à toutes ces amourettes, et d'Urfé y mêle des\r\n-druides.\r\n-\r\n-Après le déjeuner les quatre couples étaient allés voir, dans ce qu'on\r\n-appelait alors le carré du roi, une plante nouvellement arrivée de\r\n-l'Inde, dont le nom nous échappe en ce moment, et qui à cette époque\r\n-attirait tout Paris à Saint-Cloud; c'était un bizarre et charmant\r\n-arbrisseau haut sur tige, dont les innombrables branches fines comme des\r\n-fils, ébouriffées, sans feuilles, étaient couvertes d'un million de\r\n-petites rosettes blanches; ce qui faisait que l'arbuste avait l'air\r\n-d'une chevelure pouilleuse de fleurs. Il y avait toujours foule à \r\n-l'admirer.\r\n-\r\n-L'arbuste vu, Tholomyès s'était écrié: «J'offre des ânes!» et, prix fait\r\n-avec un ânier, ils étaient revenus par Vanves et Issy. À Issy, incident.\r\n-Le parc, Bien National possédé à cette époque par le munitionnaire\r\n-Bourguin, était d'aventure tout grand ouvert. Ils avaient franchi la\r\n-grille, visité l'anachorète mannequin dans sa grotte, essayé les petits\r\n-effets mystérieux du fameux cabinet des miroirs, lascif traquenard digne\r\n-d'un satyre devenu millionnaire ou de Turcaret métamorphosé en Priape.\r\n-Ils avaient robustement secoué le grand filet balançoire attaché aux\r\n-deux châtaigniers célébrés par l'abbé de Bernis. Tout en y balançant ces\r\n-belles l'une après l'autre, ce qui faisait, parmi les rires universels,\r\n-des plis de jupe envolée où Greuze eût trouvé son compte, le toulousain\r\n-Tholomyès, quelque peu espagnol, Toulouse est cousine de Tolosa,\r\n-chantait, sur une mélopée mélancolique, la vieille chanson _gallega_\r\n-probablement inspirée par quelque belle fille lancée à toute volée sur\r\n-une corde entre deux arbres:\r\n-\r\n- _Soy de Badajoz._\r\n- _Amor me llama._\r\n- _Toda mi alma_\r\n- _Es en mi ojos_\r\n- _Porque enseñas_\r\n- _À tus piernas._\r\n-\r\n-Fantine seule refusa de se balancer.\r\n-\r\n---Je n'aime pas qu'on ait du genre comme ça, murmura assez aigrement\r\n-Favourite.\r\n-\r\n-Les ânes quittés, joie nouvelle; on passa la Seine en bateau, et de\r\n-Passy, à pied, ils gagnèrent la barrière de l'Étoile. Ils étaient, on\r\n-s'en souvient, debout depuis cinq heures du matin; mais, bah! _il n'y a\r\n-pas de lassitude le dimanche_, disait Favourite; _le dimanche, la\r\n-fatigue ne travaille pas_. Vers trois heures les quatre couples, effarés\r\n-de bonheur, dégringolaient aux montagnes russes, édifice singulier qui\r\n-occupait alors les hauteurs Beaujon et dont on apercevait la ligne\r\n-serpentante au-dessus des arbres des Champs-Élysées.\r\n-\r\n-De temps en temps Favourite s'écriait:\r\n-\r\n---Et la surprise? je demande la surprise.\r\n-\r\n---Patience, répondait Tholomyès.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre V\r\n-\r\n-Chez Bombarda\r\n-\r\n-\r\n-Les montagnes russes épuisées, on avait songé au dîner; et le radieux\r\n-huitain, enfin un peu las, s'était échoué au cabaret Bombarda,\r\n-succursale qu'avait établie aux Champs-Élysées ce fameux restaurateur\r\n-Bombarda, dont on voyait alors l'enseigne rue de Rivoli à côté du\r\n-passage Delorme.\r\n-\r\n-Une chambre grande, mais laide, avec alcôve et lit au fond (vu la\r\n-plénitude du cabaret le dimanche, il avait fallu accepter ce gîte); deux\r\n-fenêtres d'où l'on pouvait contempler, à travers les ormes, le quai et\r\n-la rivière; un magnifique rayon d'août effleurant les fenêtres; deux\r\n-tables; sur l'une une triomphante montagne de bouquets mêlés à des\r\n-chapeaux d'hommes et de femmes; à l'autre les quatre couples attablés\r\n-autour d'un joyeux encombrement de plats, d'assiettes, de verres et de\r\n-bouteilles; des cruchons de bière mêlés à des flacons de vin; peu\r\n-d'ordre sur la table, quelque désordre dessous;\r\n-\r\n- _Ils faisaient sous la table_\r\n- _Un bruit, un trique-trac de pieds épouvantable_\r\n-\r\n-dit Molière.\r\n-\r\n-Voilà où en était vers quatre heures et demie du soir la bergerade\r\n-commencée à cinq heures du matin. Le soleil déclinait, l'appétit\r\n-s'éteignait.\r\n-\r\n-Les Champs-Élysées, pleins de soleil et de foule, n'étaient que lumière\r\n-et poussière, deux choses dont se compose la gloire. Les chevaux de\r\n-Marly, ces marbres hennissants, se cabraient dans un nuage d'or. Les\r\n-carrosses allaient et venaient. Un escadron de magnifiques gardes du\r\n-corps, clairon en tête, descendait l'avenue de Neuilly; le drapeau\r\n-blanc, vaguement rose au soleil couchant, flottait sur le dôme des\r\n-Tuileries. La place de la Concorde, redevenue alors place Louis XV,\r\n-regorgeait de promeneurs contents. Beaucoup portaient la fleur de lys\r\n-d'argent suspendue au ruban blanc moiré qui, en 1817, n'avait pas encore\r\n-tout à fait disparu des boutonnières. Çà et là au milieu des passants\r\n-faisant cercle et applaudissant, des rondes de petites filles jetaient\r\n-au vent une bourrée bourbonienne alors célèbre, destinée à foudroyer les\r\n-Cent-Jours, et qui avait pour ritournelle:\r\n-\r\n- _Rendez-nous notre père de Gand,_\r\n- _Rendez-nous notre père._\r\n-\r\n-Des tas de faubouriens endimanchés, parfois même fleurdelysés comme les\r\n-bourgeois, épars dans le grand carré et dans le carré Marigny, jouaient\r\n-aux bagues et tournaient sur les chevaux de bois; d'autres buvaient;\r\n-quelques-uns, apprentis imprimeurs, avaient des bonnets de papier; on\r\n-entendait leurs rires. Tout était radieux. C'était un temps de paix\r\n-incontestable et de profonde sécurité royaliste; c'était l'époque où un\r\n-rapport intime et spécial du préfet de police Anglès au roi sur les\r\n-faubourgs de Paris se terminait par ces lignes: «Tout bien considéré,\r\n-sire, il n'y a rien à craindre de ces gens-là . Ils sont insouciants et\r\n-indolents comme des chats. Le bas peuple des provinces est remuant,\r\n-celui de Paris ne l'est pas. Ce sont tous petits hommes. Sire, il en\r\n-faudrait deux bout à bout pour faire un de vos grenadiers. Il n'y a\r\n-point de crainte du côté de la populace de la capitale. Il est\r\n-remarquable que la taille a encore décru dans cette population depuis\r\n-cinquante ans; et le peuple des faubourgs de Paris est plus petit\r\n-qu'avant la révolution. Il n'est point dangereux. En somme, c'est de la\r\n-canaille bonne.»\r\n-\r\n-Qu'un chat puisse se changer en lion, les préfets de police ne le\r\n-croient pas possible; cela est pourtant, et c'est là le miracle du\r\n-peuple de Paris. Le chat d'ailleurs, si méprisé du comte Anglès, avait\r\n-l'estime des républiques antiques; il incarnait à leurs yeux la liberté,\r\n-et, comme pour servir de pendant à la Minerve aptère du Pirée, il y\r\n-avait sur la place publique de Corinthe le colosse de bronze d'un chat.\r\n-La police naïve de la restauration voyait trop «en beau» le peuple de\r\n-Paris. Ce n'est point, autant qu'on le croit, de la «canaille bonne». Le\r\n-Parisien est au Français ce que l'Athénien était au Grec; personne ne\r\n-dort mieux que lui, personne n'est plus franchement frivole et paresseux\r\n-que lui, personne mieux que lui n'a l'air d'oublier; qu'on ne s'y fie\r\n-pas pourtant; il est propre à toute sorte de nonchalance, mais, quand il\r\n-y a de la gloire au bout, il est admirable à toute espèce de furie.\r\n-Donnez-lui une pique, il fera le 10 août; donnez-lui un fusil, vous\r\n-aurez Austerlitz. Il est le point d'appui de Napoléon et la ressource de\r\n-Danton. S'agit-il de la patrie? il s'enrôle; s'agit-il de la liberté? il\r\n-dépave. Gare! ses cheveux pleins de colère sont épiques; sa blouse se\r\n-drape en chlamyde. Prenez garde. De la première rue Greneta venue, il\r\n-fera des fourches caudines. Si l'heure sonne, ce faubourien va grandir,\r\n-ce petit homme va se lever, et il regardera d'une façon terrible, et son\r\n-souffle deviendra tempête, et il sortira de cette pauvre poitrine grêle\r\n-assez de vent pour déranger les plis des Alpes. C'est grâce au\r\n-faubourien de Paris que la révolution, mêlée aux armées, conquiert\r\n-l'Europe. Il chante, c'est sa joie. Proportionnez sa chanson à sa\r\n-nature, et vous verrez! Tant qu'il n'a pour refrain que la Carmagnole,\r\n-il ne renverse que Louis XVI; faites-lui chanter la Marseillaise, il\r\n-délivrera le monde.\r\n-\r\n-Cette note écrite en marge du rapport Anglès, nous revenons à nos quatre\r\n-couples. Le dîner, comme nous l'avons dit, s'achevait.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VI\r\n-\r\n-Chapitre où l'on s'adore\r\n-\r\n-\r\n-Propos de table et propos d'amour; les uns sont aussi insaisissables que\r\n-les autres; les propos d'amour sont des nuées, les propos de table sont\r\n-des fumées.\r\n-\r\n-Fameuil et Dahlia fredonnaient; Tholomyès buvait; Zéphine riait, Fantine\r\n-souriait. Listolier soufflait dans une trompette de bois achetée à \r\n-Saint-Cloud. Favourite regardait tendrement Blachevelle et disait:\r\n-\r\n---Blachevelle, je t'adore.\r\n-\r\n-Ceci amena une question de Blachevelle:\r\n-\r\n---Qu'est-ce que tu ferais, Favourite, si je cessais de t'aimer?\r\n-\r\n---Moi! s'écria Favourite. Ah! ne dis pas cela, même pour rire! Si tu\r\n-cessais de m'aimer, je te sauterais après, je te grifferais, je te\r\n-gratignerais, je te jetterais de l'eau, je te ferais arrêter.\r\n-\r\n-Blachevelle sourit avec la fatuité voluptueuse d'un homme chatouillé à \r\n-l'amour-propre. Favourite reprit:\r\n-\r\n---Oui, je crierais à la garde! Ah! je me gênerais par exemple! Canaille!\r\n-\r\n-Blachevelle, extasié, se renversa sur sa chaise et ferma\r\n-orgueilleusement les deux yeux.\r\n-\r\n-Dahlia, tout en mangeant, dit bas à Favourite dans le brouhaha:\r\n-\r\n---Tu l'idolâtres donc bien, ton Blachevelle?\r\n-\r\n---Moi, je le déteste, répondit Favourite du même ton en ressaisissant sa\r\n-fourchette. Il est avare. J'aime le petit d'en face de chez moi. Il est\r\n-très bien, ce jeune homme-là , le connais-tu? On voit qu'il a le genre\r\n-d'être acteur. J'aime les acteurs. Sitôt qu'il rentre, sa mère dit: «Ah!\r\n-mon Dieu! ma tranquillité est perdue. Le voilà qui va crier. Mais, mon\r\n-ami, tu me casses la tête!» Parce qu'il va dans la maison, dans des\r\n-greniers à rats, dans des trous noirs, si haut qu'il peut monter,--et\r\n-chanter, et déclamer, est-ce que je sais, moi? qu'on l'entend d'en bas!\r\n-Il gagne déjà vingt sous par jour chez un avoué à écrire de la chicane.\r\n-Il est fils d'un ancien chantre de Saint-Jacques-du-Haut-Pas. Ah! il est\r\n-très bien. Il m'idolâtre tant qu'un jour qu'il me voyait faire de la\r\n-pâte pour des crêpes, il m'a dit: _Mamselle, faites des beignets de vos\r\n-gants et je les mangerai_. Il n'y a que les artistes pour dire des\r\n-choses comme ça. Ah! il est très bien. Je suis en train d'être insensée\r\n-de ce petit-là . C'est égal, je dis à Blachevelle que je l'adore. Comme\r\n-je mens! Hein? comme je mens!\r\n-\r\n-Favourite fit une pause, et continua:\r\n-\r\n---Dahlia, vois-tu, je suis triste. Il n'a fait que pleuvoir tout l'été,\r\n-le vent m'agace, le vent ne décolère pas, Blachevelle est très pingre,\r\n-c'est à peine s'il y a des petits pois au marché, on ne sait que manger,\r\n-j'ai le spleen, comme disent les Anglais, le beurre est si cher! et\r\n-puis, vois, c'est une horreur, nous dînons dans un endroit où il y a un\r\n-lit, ça me dégoûte de la vie.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VII\r\n-\r\n-Sagesse de Tholomyès\r\n-\r\n-\r\n-Cependant, tandis que quelques-uns chantaient, les autres causaient\r\n-tumultueusement, et tous ensemble; ce n'était plus que du bruit.\r\n-Tholomyès intervint:\r\n-\r\n---Ne parlons point au hasard ni trop vite, s'écria-t-il. Méditons si\r\n-nous voulons être éblouissants. Trop d'improvisation vide bêtement\r\n-l'esprit. Bière qui coule n'amasse point de mousse. Messieurs, pas de\r\n-hâte. Mêlons la majesté à la ripaille; mangeons avec recueillement;\r\n-festinons lentement. Ne nous pressons pas. Voyez le printemps; s'il se\r\n-dépêche, il est flambé, c'est-à -dire gelé. L'excès de zèle perd les\r\n-pêchers et les abricotiers. L'excès de zèle tue la grâce et la joie des\r\n-bons dîners. Pas de zèle, messieurs! Grimod de la Reynière est de l'avis\r\n-de Talleyrand.\r\n-\r\n-Une sourde rébellion gronda dans le groupe.\r\n-\r\n---Tholomyès, laisse-nous tranquilles, dit Blachevelle.\r\n-\r\n---À bas le tyran! dit Fameuil.\r\n-\r\n---Bombarda, Bombance et Bamboche! cria Listolier.\r\n-\r\n---Le dimanche existe, reprit Fameuil.\r\n-\r\n---Nous sommes sobres, ajouta Listolier.\r\n-\r\n---Tholomyès, fit Blachevelle, contemple mon calme.\r\n-\r\n---Tu en es le marquis, répondit Tholomyès.\r\n-\r\n-Ce médiocre jeu de mots fit l'effet d'une pierre dans une mare. Le\r\n-marquis de Montcalm était un royaliste alors célèbre. Toutes les\r\n-grenouilles se turent.\r\n-\r\n---Amis, s'écria Tholomyès, de l'accent d'un homme qui ressaisit\r\n-l'empire, remettez-vous. Il ne faut pas que trop de stupeur accueille ce\r\n-calembour tombé du ciel. Tout ce qui tombe de la sorte n'est pas\r\n-nécessairement digne d'enthousiasme et de respect. Le calembour est la\r\n-fiente de l'esprit qui vole. Le lazzi tombe n'importe où; et l'esprit,\r\n-après la ponte d'une bêtise, s'enfonce dans l'azur. Une tache blanchâtre\r\n-qui s'aplatit sur le rocher n'empêche pas le condor de planer. Loin de\r\n-moi l'insulte au calembour! Je l'honore dans la proportion de ses\r\n-mérites; rien de plus. Tout ce qu'il y a de plus auguste, de plus\r\n-sublime et de plus charmant dans l'humanité, et peut-être hors de\r\n-l'humanité, a fait des jeux de mots. Jésus-Christ a fait un calembour\r\n-sur saint Pierre, Moïse sur Isaac, Eschyle sur Polynice, Cléopâtre sur\r\n-Octave. Et notez que ce calembour de Cléopâtre a précédé la bataille\r\n-d'Actium, et que, sans lui, personne ne se souviendrait de la ville de\r\n-Toryne, nom grec qui signifie cuiller à pot. Cela concédé, je reviens à \r\n-mon exhortation. Mes frères, je le répète, pas de zèle, pas de\r\n-tohu-bohu, pas d'excès, même en pointes, gaîtés, liesses et jeux de\r\n-mots. Écoutez-moi, j'ai la prudence d'Amphiaraüs et la calvitie de\r\n-César. Il faut une limite, même aux rébus. _Est modus in rebus_. Il faut\r\n-une limite, même aux dîners. Vous aimez les chaussons aux pommes,\r\n-mesdames, n'en abusez pas. Il faut, même en chaussons, du bon sens et de\r\n-l'art. La gloutonnerie châtie le glouton. Gula punit Gulax.\r\n-L'indigestion est chargée par le bon Dieu de faire de la morale aux\r\n-estomacs. Et, retenez ceci: chacune de nos passions, même l'amour, a un\r\n-estomac qu'il ne faut pas trop remplir. En toute chose il faut écrire à \r\n-temps le mot _finis_, il faut se contenir, quand cela devient urgent,\r\n-tirer le verrou sur son appétit, mettre au violon sa fantaisie et se\r\n-mener soi-même au poste. Le sage est celui qui sait à un moment donné\r\n-opérer sa propre arrestation. Ayez quelque confiance en moi. Parce que\r\n-j'ai fait un peu mon droit, à ce que me disent mes examens, parce que je\r\n-sais la différence qu'il y a entre la question mue et la question\r\n-pendante, parce que j'ai soutenu une thèse en latin sur la manière dont\r\n-on donnait la torture à Rome au temps où Munatius Demens était questeur\r\n-du Parricide, parce que je vais être docteur, à ce qu'il paraît, il ne\r\n-s'ensuit pas de toute nécessité que je sois un imbécile. Je vous\r\n-recommande la modération dans vos désirs. Vrai comme je m'appelle Félix\r\n-Tholomyès, je parle bien. Heureux celui qui, lorsque l'heure a sonné,\r\n-prend un parti héroïque, et abdique comme Sylla, ou Origène!\r\n-\r\n-Favourite écoutait avec une attention profonde.\r\n-\r\n---Félix! dit-elle, quel joli mot! j'aime ce nom-là . C'est en latin. Ça\r\n-veut dire Prosper.\r\n-\r\n-Tholomyès poursuivit:\r\n-\r\n---Quirites, gentlemen, Caballeros, mes amis! voulez-vous ne sentir aucun\r\n-aiguillon et vous passer de lit nuptial et braver l'amour? Rien de plus\r\n-simple. Voici la recette: la limonade, l'exercice outré, le travail\r\n-forcé, éreintez-vous, traînez des blocs, ne dormez pas, veillez,\r\n-gorgez-vous de boissons nitreuses et de tisanes de nymphaeas, savourez\r\n-des émulsions de pavots et d'agnuscastus, assaisonnez-moi cela d'une\r\n-diète sévère, crevez de faim, et joignez-y les bains froids, les\r\n-ceintures d'herbes, l'application d'une plaque de plomb, les lotions\r\n-avec la liqueur de Saturne et les fomentations avec l'oxycrat.\r\n-\r\n---J'aime mieux une femme, dit Listolier.\r\n-\r\n---La femme! reprit Tholomyès, méfiez-vous-en. Malheur à celui qui se\r\n-livre au coeur changeant de la femme! La femme est perfide et tortueuse.\r\n-Elle déteste le serpent par jalousie de métier. Le serpent, c'est la\r\n-boutique en face.\r\n-\r\n---Tholomyès, cria Blachevelle, tu es ivre!\r\n-\r\n---Pardieu! dit Tholomyès.\r\n-\r\n---Alors sois gai, reprit Blachevelle.\r\n-\r\n-Et, remplissant son verre, il se leva:\r\n-\r\n---Gloire au vin! _Nunc te, Bacche, canam_! Pardon, mesdemoiselles, c'est\r\n-de l'espagnol. Et la preuve, señoras, la voici: tel peuple, telle\r\n-futaille. L'arrobe de Castille contient seize litres, le cantaro\r\n-d'Alicante douze, l'almude des Canaries vingt-cinq, le cuartin des\r\n-Baléares vingt-six, la botte du czar Pierre trente. Vive ce czar qui\r\n-était grand, et vive sa botte qui était plus grande encore! Mesdames, un\r\n-conseil d'ami: trompez-vous de voisin, si bon vous semble. Le propre de\r\n-l'amour, c'est d'errer. L'amourette n'est pas faite pour s'accroupir et\r\n-s'abrutir comme une servante anglaise qui a le calus du scrobage aux\r\n-genoux. Elle n'est pas faite pour cela, elle erre gaîment, la douce\r\n-amourette! On a dit: l'erreur est humaine; moi je dis: l'erreur est\r\n-amoureuse. Mesdames, je vous idolâtre toutes. Ô Zéphine, ô Joséphine,\r\n-figure plus que chiffonnée, vous seriez charmante, si vous n'étiez de\r\n-travers. Vous avez l'air d'un joli visage sur lequel, par mégarde, on\r\n-s'est assis. Quant à Favourite, ô nymphes et muses! un jour que\r\n-Blachevelle passait le ruisseau de la rue Guérin-Boisseau, il vit une\r\n-belle fille aux bas blancs et bien tirés qui montrait ses jambes. Ce\r\n-prologue lui plut, et Blachevelle aima. Celle qu'il aima était\r\n-Favourite. Ô Favourite, tu as des lèvres ioniennes. Il y avait un\r\n-peintre grec, appelé Euphorion, qu'on avait surnommé le peintre des\r\n-lèvres. Ce Grec seul eût été digne de peindre ta bouche! Écoute! avant\r\n-toi, il n'y avait pas de créature digne de ce nom. Tu es faite pour\r\n-recevoir la pomme comme Vénus ou pour la manger comme Ève. La beauté\r\n-commence à toi. Je viens de parler d'Ève, c'est toi qui l'as créée. Tu\r\n-mérites le brevet d'invention de la jolie femme. Ô Favourite, je cesse\r\n-de vous tutoyer, parce que je passe de la poésie à la prose. Vous\r\n-parliez de mon nom tout à l'heure. Cela m'a attendri; mais, qui que nous\r\n-soyons, méfions-nous des noms. Ils peuvent se tromper. Je me nomme Félix\r\n-et ne suis pas heureux. Les mots sont des menteurs. N'acceptons pas\r\n-aveuglément les indications qu'ils nous donnent. Ce serait une erreur\r\n-d'écrire à Liège pour avoir des bouchons et à Pau pour avoir des gants.\r\n-Miss Dahlia, à votre place, je m'appellerais Rosa. Il faut que la fleur\r\n-sente bon et que la femme ait de l'esprit. Je ne dis rien de Fantine,\r\n-c'est une songeuse, une rêveuse, une pensive, une sensitive; c'est un\r\n-fantôme ayant la forme d'une nymphe et la pudeur d'une nonne, qui se\r\n-fourvoie dans la vie de grisette, mais qui se réfugie dans les\r\n-illusions, et qui chante, et qui prie, et qui regarde l'azur sans trop\r\n-savoir ce qu'elle voit ni ce qu'elle fait, et qui, les yeux au ciel,\r\n-erre dans un jardin où il y a plus d'oiseaux qu'il n'en existe! Ô\r\n-Fantine, sache ceci: moi Tholomyès, je suis une illusion; mais elle ne\r\n-m'entend même pas, la blonde fille des chimères! Du reste, tout en elle\r\n-est fraîcheur, suavité, jeunesse, douce clarté matinale. Ô Fantine,\r\n-fille digne de vous appeler marguerite ou perle, vous êtes une femme du\r\n-plus bel orient. Mesdames, un deuxième conseil: ne vous mariez point; le\r\n-mariage est une greffe; cela prend bien ou mal; fuyez ce risque. Mais,\r\n-bah! qu'est-ce que je chante là ? Je perds mes paroles. Les filles sont\r\n-incurables sur l'épousaille; et tout ce que nous pouvons dire, nous\r\n-autres sages, n'empêchera point les giletières et les piqueuses de\r\n-bottines de rêver des maris enrichis de diamants. Enfin, soit; mais,\r\n-belles, retenez ceci: vous mangez trop de sucre. Vous n'avez qu'un tort,\r\n-ô femmes, c'est de grignoter du sucre. Ô sexe rongeur, tes jolies\r\n-petites dents blanches adorent le sucre. Or, écoutez bien, le sucre est\r\n-un sel. Tout sel est desséchant. Le sucre est le plus desséchant de tous\r\n-les sels. Il pompe à travers les veines les liquides du sang; de là la\r\n-coagulation, puis la solidification du sang; de là les tubercules dans\r\n-le poumon; de là la mort. Et c'est pourquoi le diabète confine à la\r\n-phthisie. Donc ne croquez pas de sucre, et vous vivrez! Je me tourne\r\n-vers les hommes. Messieurs, faites des conquêtes. Pillez-vous les uns\r\n-aux autres sans remords vos bien-aimées. Chassez-croisez. En amour, il\r\n-n'y a pas d'amis. Partout où il y a une jolie femme l'hostilité est\r\n-ouverte. Pas de quartier, guerre à outrance! Une jolie femme est un\r\n-casus belli; une jolie femme est un flagrant délit. Toutes les invasions\r\n-de l'histoire sont déterminées par des cotillons. La femme est le droit\r\n-de l'homme. Romulus a enlevé les Sabines, Guillaume a enlevé les\r\n-Saxonnes, César a enlevé les Romaines. L'homme qui n'est pas aimé plane\r\n-comme un vautour sur les amantes d'autrui; et quant à moi, à tous ces\r\n-infortunés qui sont veufs, je jette la proclamation sublime de Bonaparte\r\n-à l'armée d'Italie: «Soldats, vous manquez de tout. L'ennemi en a.»\r\n-\r\n-Tholomyès s'interrompit.\r\n-\r\n---Souffle, Tholomyès, dit Blachevelle.\r\n-\r\n-En même temps, Blachevelle, appuyé de Listolier et de Fameuil, entonna\r\n-sur un air de complainte une de ces chansons d'atelier composées des\r\n-premiers mots venus, rimées richement et pas du tout, vides de sens\r\n-comme le geste de l'arbre et le bruit du vent, qui naissent de la vapeur\r\n-des pipes et se dissipent et s'envolent avec elle. Voici par quel\r\n-couplet le groupe donna la réplique à la harangue de Tholomyès:\r\n-\r\n-Les pères dindons donnèrent de l'argent à un agent pour que mons\r\n-Clermont-Tonnerre fût fait pape à la Saint-Jean; Mais Clermont ne put\r\n-pas être fait pape, n'étant pas prêtre.\r\n-\r\n-Alors leur agent rageant leur rapporta leur argent.\r\n-\r\n-Ceci n'était pas fait pour calmer l'improvisation de Tholomyès; il vida\r\n-son verre, le remplit, et recommença.\r\n-\r\n---À bas la sagesse! oubliez tout ce que j'ai dit. Ne soyons ni prudes,\r\n-ni prudents, ni prud'hommes. Je porte un toast à l'allégresse; soyons\r\n-allègres! Complétons notre cours de droit par la folie et la nourriture.\r\n-Indigestion et digeste. Que Justinien soit le mâle et que Ripaille soit\r\n-la femelle! Joie dans les profondeurs! Vis, ô création! Le monde est un\r\n-gros diamant! Je suis heureux. Les oiseaux sont étonnants. Quelle fête\r\n-partout! Le rossignol est un Elleviou gratis. Été, je te salue. Ô\r\n-Luxembourg, ô Géorgiques de la rue Madame et de l'allée de\r\n-l'Observatoire! Ô pioupious rêveurs! ô toutes ces bonnes charmantes qui,\r\n-tout en gardant des enfants, s'amusent à en ébaucher! Les pampas de\r\n-l'Amérique me plairaient, si je n'avais les arcades de l'Odéon. Mon âme\r\n-s'envole dans les forêts vierges et dans les savanes. Tout est beau. Les\r\n-mouches bourdonnent dans les rayons. Le soleil a éternué le colibri.\r\n-Embrasse-moi, Fantine!\r\n-\r\n-Il se trompa, et embrassa Favourite.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VIII\r\n-\r\n-Mort d'un cheval\r\n-\r\n-\r\n---On dîne mieux chez Edon que chez Bombarda, s'écria Zéphine.\r\n-\r\n---Je préfère Bombarda à Edon, déclara Blachevelle. Il a plus de luxe.\r\n-C'est plus asiatique. Voyez la salle d'en bas. Il y a des glaces sur les\r\n-murs.\r\n-\r\n---J'en aime mieux dans mon assiette, dit Favourite.\r\n-\r\n-Blachevelle insista:\r\n-\r\n---Regardez les couteaux. Les manches sont en argent chez Bombarda, et en\r\n-os chez Edon. Or, l'argent est plus précieux que l'os.\r\n-\r\n---Excepté pour ceux qui ont un menton d'argent, observa Tholomyès.\r\n-\r\n-Il regardait en cet instant-là le dôme des Invalides, visible des\r\n-fenêtres de Bombarda.\r\n-\r\n-Il y eut une pause.\r\n-\r\n---Tholomyès, cria Fameuil, tout à l'heure, Listolier et moi, nous avions\r\n-une discussion.\r\n-\r\n---Une discussion est bonne, répondit Tholomyès, une querelle vaut mieux.\r\n-\r\n---Nous disputions philosophie.\r\n-\r\n---Soit.\r\n-\r\n---Lequel préfères-tu de Descartes ou de Spinosa?\r\n-\r\n---Désaugiers, dit Tholomyès.\r\n-\r\n-Cet arrêt rendu, il but et reprit:\r\n-\r\n---Je consens à vivre. Tout n'est pas fini sur la terre, puisqu'on peut\r\n-encore déraisonner. J'en rends grâces aux dieux immortels. On ment, mais\r\n-on rit. On affirme, mais on doute. L'inattendu jaillit du syllogisme.\r\n-C'est beau. Il est encore ici-bas des humains qui savent joyeusement\r\n-ouvrir et fermer la boîte à surprises du paradoxe. Ceci, mesdames, que\r\n-vous buvez d'un air tranquille, est du vin de Madère, sachez-le, du cru\r\n-de Coural das Freiras qui est à trois cent dix-sept toises au-dessus du\r\n-niveau de la mer! Attention en buvant! trois cent dix-sept toises! et\r\n-monsieur Bombarda, le magnifique restaurateur, vous donne ces trois cent\r\n-dix-sept toises pour quatre francs cinquante centimes!\r\n-\r\n-Fameuil interrompit de nouveau:\r\n-\r\n---Tholomyès, tes opinions font loi. Quel est ton auteur favori?\r\n-\r\n---Ber....\r\n-\r\n---Quin?\r\n-\r\n---Non. Choux.\r\n-\r\n-Et Tholomyès poursuivit:\r\n-\r\n---Honneur à Bombarda! il égalerait Munophis d'Elephanta s'il pouvait me\r\n-cueillir une almée, et Thygélion de Chéronée s'il pouvait m'apporter une\r\n-hétaïre! car, ô mesdames, il y avait des Bombarda en Grèce et en Égypte.\r\n-C'est Apulée qui nous l'apprend. Hélas! toujours les mêmes choses et\r\n-rien de nouveau. Plus rien d'inédit dans la création du créateur! _Nil\r\n-sub sole novum_, dit Salomon; _amor omnibus idem_, dit Virgile; et\r\n-Carabine monte avec Carabin dans la galiote de Saint-Cloud, comme\r\n-Aspasie s'embarquait avec Périclès sur la flotte de Samos. Un dernier\r\n-mot. Savez-vous ce que c'était qu'Aspasie, mesdames? Quoiqu'elle vécût\r\n-dans un temps où les femmes n'avaient pas encore d'âme, c'était une âme;\r\n-une âme d'une nuance rose et pourpre, plus embrasée que le feu, plus\r\n-franche que l'aurore. Aspasie était une créature en qui se touchaient\r\n-les deux extrêmes de la femme; c'était la prostituée déesse. Socrate,\r\n-plus Manon Lescaut. Aspasie fut créée pour le cas où il faudrait une\r\n-catin à Prométhée.\r\n-\r\n-Tholomyès, lancé, se serait difficilement arrêté, si un cheval ne se fût\r\n-abattu sur le quai en cet instant-là même. Du choc, la charrette et\r\n-l'orateur restèrent court. C'était une jument beauceronne, vieille et\r\n-maigre et digne de l'équarrisseur, qui traînait une charrette fort\r\n-lourde. Parvenue devant Bombarda, la bête, épuisée et accablée, avait\r\n-refusé d'aller plus loin. Cet incident avait fait de la foule. À peine\r\n-le charretier, jurant et indigné, avait-il eu le temps de prononcer avec\r\n-l'énergie convenable le mot sacramentel: _mâtin_! appuyé d'un implacable\r\n-coup de fouet, que la haridelle était tombée pour ne plus se relever. Au\r\n-brouhaha des passants, les gais auditeurs de Tholomyès tournèrent la\r\n-tête, et Tholomyès en profita pour clore son allocution par cette\r\n-strophe mélancolique:\r\n-\r\n- _Elle était de ce monde où coucous et carrosses_\r\n- _Ont le même destin,_\r\n- _Et, rosse, elle a vécu ce que vivent les rosses,_\r\n- _L'espace d'un: mâtin!_\r\n-\r\n---Pauvre cheval, soupira Fantine.\r\n-\r\n-Et Dahlia s'écria:\r\n-\r\n---Voilà Fantine qui va se mettre à plaindre les chevaux! Peut-on être\r\n-fichue bête comme ça!\r\n-\r\n-En ce moment, Favourite, croisant les bras et renversant la tête en\r\n-arrière, regarda résolûment Tholomyès et dit:\r\n-\r\n---Ah çà ! et la surprise?\r\n-\r\n---Justement. L'instant est arrivé, répondit Tholomyès. Messieurs,\r\n-l'heure de la surprise a sonné. Mesdames, attendez-nous un moment.\r\n-\r\n---Cela commence par un baiser, dit Blachevelle.\r\n-\r\n---Sur le front, ajouta Tholomyès.\r\n-\r\n-Chacun déposa gravement un baiser sur le front de sa maîtresse; puis ils\r\n-se dirigèrent vers la porte tous les quatre à la file, en mettant leur\r\n-doigt sur la bouche.\r\n-\r\n-Favourite battit des mains à leur sortie.\r\n-\r\n---C'est déjà amusant, dit-elle.\r\n-\r\n---Ne soyez pas trop longtemps, murmura Fantine. Nous vous attendons.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IX\r\n-\r\n-Fin joyeuse de la joie\r\n-\r\n-\r\n-Les jeunes filles, restées seules, s'accoudèrent deux à deux sur l'appui\r\n-des fenêtres, jasant, penchant leur tête et se parlant d'une croisée à \r\n-l'autre.\r\n-\r\n-Elles virent les jeunes gens sortir du cabaret Bombarda bras dessus bras\r\n-dessous; ils se retournèrent, leur firent des signes en riant, et\r\n-disparurent dans cette poudreuse cohue du dimanche qui envahit\r\n-hebdomadairement les Champs-Élysées.\r\n-\r\n---Ne soyez pas longtemps! cria Fantine.\r\n-\r\n---Que vont-ils nous rapporter? dit Zéphine.\r\n-\r\n---Pour sûr ce sera joli, dit Dahlia.\r\n-\r\n---Moi, reprit Favourite, je veux que ce soit en or.\r\n-\r\n-Elles furent bientôt distraites par le mouvement du bord de l'eau\r\n-qu'elles distinguaient dans les branches des grands arbres et qui les\r\n-divertissait fort. C'était l'heure du départ des malles-poste et des\r\n-diligences. Presque toutes les messageries du midi et de l'ouest\r\n-passaient alors par les Champs-Élysées. La plupart suivaient le quai et\r\n-sortaient par la barrière de Passy. De minute en minute, quelque grosse\r\n-voiture peinte en jaune et en noir, pesamment chargée, bruyamment\r\n-attelée, difforme à force de malles, de bâches et de valises, pleine de\r\n-têtes tout de suite disparues, broyant la chaussée, changeant tous les\r\n-pavés en briquets, se ruait à travers la foule avec toutes les\r\n-étincelles d'une forge, de la poussière pour fumée, et un air de furie.\r\n-Ce vacarme réjouissait les jeunes filles. Favourite s'exclamait:\r\n-\r\n---Quel tapage! on dirait des tas de chaînes qui s'envolent.\r\n-\r\n-Il arriva une fois qu'une de ces voitures qu'on distinguait\r\n-difficilement dans l'épaisseur des ormes, s'arrêta un moment, puis\r\n-repartit au galop. Cela étonna Fantine.\r\n-\r\n---C'est particulier! dit-elle. Je croyais que la diligence ne s'arrêtait\r\n-jamais. Favourite haussa les épaules.\r\n-\r\n---Cette Fantine est surprenante. Je viens la voir par curiosité. Elle\r\n-s'éblouit des choses les plus simples. Une supposition; je suis un\r\n-voyageur, je dis à la diligence: je vais en avant, vous me prendrez sur\r\n-le quai en passant. La diligence passe, me voit, s'arrête, et me prend.\r\n-Cela se fait tous les jours. Tu ne connais pas la vie, ma chère.\r\n-\r\n-Un certain temps s'écoula ainsi. Tout à coup Favourite eut le mouvement\r\n-de quelqu'un qui se réveille.\r\n-\r\n---Eh bien, fit-elle, et la surprise?\r\n-\r\n---À propos, oui, reprit Dahlia, la fameuse surprise?\r\n-\r\n---Ils sont bien longtemps! dit Fantine.\r\n-\r\n-Comme Fantine achevait ce soupir, le garçon qui avait servi le dîner\r\n-entra. Il tenait à la main quelque chose qui ressemblait à une lettre.\r\n-\r\n---Qu'est-ce que cela? demanda Favourite.\r\n-\r\n-Le garçon répondit:\r\n-\r\n---C'est un papier que ces messieurs ont laissé pour ces dames.\r\n-\r\n---Pourquoi ne l'avoir pas apporté tout de suite?\r\n-\r\n---Parce que ces messieurs, reprit le garçon, ont commandé de ne le\r\n-remettre à ces dames qu'au bout d'une heure.\r\n-\r\n-Favourite arracha le papier des mains du garçon. C'était une lettre en\r\n-effet.\r\n-\r\n---Tiens! dit-elle. Il n'y a pas d'adresse. Mais voici ce qui est écrit\r\n-dessus:\r\n-\r\n-Ceci est la surprise.\r\n-\r\n-Elle décacheta vivement la lettre, l'ouvrit et lut (elle savait lire):\r\n-\r\n-«Ô nos amantes!\r\n-\r\n-«Sachez que nous avons des parents. Des parents, vous ne connaissez pas\r\n-beaucoup ça. Ça s'appelle des pères et mères dans le code civil, puéril\r\n-et honnête. Or, ces parents gémissent, ces vieillards nous réclament,\r\n-ces bons hommes et ces bonnes femmes nous appellent enfants prodigues,\r\n-ils souhaitent nos retours, et nous offrent de tuer des veaux. Nous leur\r\n-obéissons, étant vertueux. À l'heure où vous lirez ceci, cinq chevaux\r\n-fougueux nous rapporteront à nos papas et à nos mamans. Nous fichons le\r\n-camp, comme dit Bossuet. Nous partons, nous sommes partis. Nous fuyons\r\n-dans les bras de Laffitte et sur les ailes de Caillard. La diligence de\r\n-Toulouse nous arrache à l'abîme, et l'abîme c'est vous, ô nos belles\r\n-petites! Nous rentrons dans la société, dans le devoir et dans l'ordre,\r\n-au grand trot, à raison de trois lieues à l'heure. Il importe à la\r\n-patrie que nous soyons, comme tout le monde, préfets, pères de famille,\r\n-gardes champêtres et conseillers d'État. Vénérez-nous. Nous nous\r\n-sacrifions. Pleurez-nous rapidement et remplacez-nous vite. Si cette\r\n-lettre vous déchire, rendez-le-lui. Adieu.\r\n-\r\n-«Pendant près de deux ans, nous vous avons rendues heureuses. Ne nous en\r\n-gardez pas rancune.\r\n-\r\n-«Signé: Blachevelle.\r\n-\r\n-«Fameuil.\r\n-\r\n-«Listolier.\r\n-\r\n-«Félix Tholomyès\r\n-\r\n-«Post-scriptum. Le dîner est payé.»\r\n-\r\n-Les quatre jeunes filles se regardèrent.\r\n-\r\n-Favourite rompit la première le silence.\r\n-\r\n---Eh bien! s'écria-t-elle, c'est tout de même une bonne farce.\r\n-\r\n---C'est très drôle, dit Zéphine.\r\n-\r\n---Ce doit être Blachevelle qui a eu cette idée-là , reprit Favourite. Ça\r\n-me rend amoureuse de lui. Sitôt parti, sitôt aimé. Voilà l'histoire.\r\n-\r\n---Non, dit Dahlia, c'est une idée à Tholomyès. Ça se reconnaît.\r\n-\r\n---En ce cas, reprit Favourite, mort à Blachevelle et vive Tholomyès!\r\n-\r\n---Vive Tholomyès! crièrent Dahlia et Zéphine.\r\n-\r\n-Et elles éclatèrent de rire.\r\n-\r\n-Fantine rit comme les autres.\r\n-\r\n-Une heure après, quand elle fut rentrée dans sa chambre, elle pleura.\r\n-C'était, nous l'avons dit, son premier amour; elle s'était donnée à ce\r\n-Tholomyès comme à un mari, et la pauvre fille avait un enfant.\r\n-\r\n-\r\n-\r\n-\r\n-Livre quatrième--Confier, c'est quelquefois livrer\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre I\r\n-\r\n-Une mère qui en rencontre une autre\r\n-\r\n-\r\n-Il y avait, dans le premier quart de ce siècle, à Montfermeil, près de\r\n-Paris, une façon de gargote qui n'existe plus aujourd'hui. Cette gargote\r\n-était tenue par des gens appelés Thénardier, mari et femme. Elle était\r\n-située dans la ruelle du Boulanger. On voyait au-dessus de la porte une\r\n-planche clouée à plat sur le mur. Sur cette planche était peint quelque\r\n-chose qui ressemblait à un homme portant sur son dos un autre homme,\r\n-lequel avait de grosses épaulettes de général dorées avec de larges\r\n-étoiles argentées; des taches rouges figuraient du sang; le reste du\r\n-tableau était de la fumée et représentait probablement une bataille. Au\r\n-bas on lisait cette inscription: _Au Sergent de Waterloo._\r\n-\r\n-Rien n'est plus ordinaire qu'un tombereau ou une charrette à la porte\r\n-d'une auberge. Cependant le véhicule ou, pour mieux dire, le fragment de\r\n-véhicule qui encombrait la rue devant la gargote du Sergent de Waterloo,\r\n-un soir du printemps de 1818, eût certainement attiré par sa masse\r\n-l'attention d'un peintre qui eût passé là .\r\n-\r\n-C'était l'avant-train d'un de ces fardiers, usités dans les pays de\r\n-forêts, et qui servent à charrier des madriers et des troncs d'arbres.\r\n-Cet avant-train se composait d'un massif essieu de fer à pivot où\r\n-s'emboîtait un lourd timon, et que supportaient deux roues démesurées.\r\n-Tout cet ensemble était trapu, écrasant et difforme. On eût dit l'affût\r\n-d'un canon géant. Les ornières avaient donné aux roues, aux jantes, aux\r\n-moyeux, à l'essieu et au timon, une couche de vase, hideux badigeonnage\r\n-jaunâtre assez semblable à celui dont on orne volontiers les\r\n-cathédrales. Le bois disparaissait sous la boue et le fer sous la\r\n-rouille. Sous l'essieu pendait en draperie une grosse chaîne digne de\r\n-Goliath forçat. Cette chaîne faisait songer, non aux poutres qu'elle\r\n-avait fonction de transporter, mais aux mastodontes et aux mammons\r\n-qu'elle eût pu atteler; elle avait un air de bagne, mais de bagne\r\n-cyclopéen et surhumain, et elle semblait détachée de quelque monstre.\r\n-Homère y eût lié Polyphème et Shakespeare Caliban.\r\n-\r\n-Pourquoi cet avant-train de fardier était-il à cette place dans la rue?\r\n-D'abord, pour encombrer la rue; ensuite pour achever de se rouiller. Il\r\n-y a dans le vieil ordre social une foule d'institutions qu'on trouve de\r\n-la sorte sur son passage en plein air et qui n'ont pas pour être là \r\n-d'autres raisons.\r\n-\r\n-Le centre de la chaîne pendait sous l'essieu assez près de terre, et sur\r\n-la courbure, comme sur la corde d'une balançoire, étaient assises et\r\n-groupées, ce soir-là , dans un entrelacement exquis, deux petites filles,\r\n-l'une d'environ deux ans et demi, l'autre de dix-huit mois, la plus\r\n-petite dans les bras de la plus grande. Un mouchoir savamment noué les\r\n-empêchait de tomber. Une mère avait vu cette effroyable chaîne, et avait\r\n-dit: Tiens! voilà un joujou pour mes enfants.\r\n-\r\n-Les deux enfants, du reste gracieusement attifées, et avec quelque\r\n-recherche, rayonnaient; on eût dit deux roses dans de la ferraille;\r\n-leurs yeux étaient un triomphe; leurs fraîches joues riaient. L'une\r\n-était châtain, l'autre était brune. Leurs naïfs visages étaient deux\r\n-étonnements ravis; un buisson fleuri qui était près de là envoyait aux\r\n-passants des parfums qui semblaient venir d'elles; celle de dix-huit\r\n-mois montrait son gentil ventre nu avec cette chaste indécence de la\r\n-petitesse.\r\n-\r\n-Au-dessus et autour de ces deux têtes délicates, pétries dans le bonheur\r\n-et trempées dans la lumière, le gigantesque avant-train, noir de\r\n-rouille, presque terrible, tout enchevêtré de courbes et d'angles\r\n-farouches, s'arrondissait comme un porche de caverne. À quelques pas,\r\n-accroupie sur le seuil de l'auberge, la mère, femme d'un aspect peu\r\n-avenant du reste, mais touchante en ce moment-là , balançait les deux\r\n-enfants au moyen d'une longue ficelle, les couvant des yeux de peur\r\n-d'accident avec cette expression animale et céleste propre à la\r\n-maternité; à chaque va-et-vient, les hideux anneaux jetaient un bruit\r\n-strident qui ressemblait à un cri de colère; les petites filles\r\n-s'extasiaient, le soleil couchant se mêlait à cette joie, et rien\r\n-n'était charmant comme ce caprice du hasard, qui avait fait d'une chaîne\r\n-de titans une escarpolette de chérubins.\r\n-\r\n-Tout en berçant ses deux petites, la mère chantonnait d'une voix fausse\r\n-une romance alors célèbre:\r\n-\r\n- _Il le faut, disait un guerrier._\r\n-\r\n-Sa chanson et la contemplation de ses filles l'empêchaient d'entendre et\r\n-de voir ce qui se passait dans la rue.\r\n-\r\n-Cependant quelqu'un s'était approché d'elle, comme elle commençait le\r\n-premier couplet de la romance, et tout à coup elle entendit une voix qui\r\n-disait très près de son oreille:\r\n-\r\n---Vous avez là deux jolis enfants, madame, répondit la mère, continuant\r\n-sa romance:\r\n-\r\n- _À la belle et tendre Imogine._\r\n-\r\n-répondit la mère, continuant sa romance, puis elle tourna la tête.\r\n-\r\n-Une femme était devant elle, à quelques pas. Cette femme, elle aussi,\r\n-avait un enfant qu'elle portait dans ses bras.\r\n-\r\n-Elle portait en outre un assez gros sac de nuit qui semblait fort lourd.\r\n-\r\n-L'enfant de cette femme était un des plus divins êtres qu'on pût voir.\r\n-C'était une fille de deux à trois ans. Elle eût pu jouter avec les deux\r\n-autres pour la coquetterie de l'ajustement; elle avait un bavolet de\r\n-linge fin, des rubans à sa brassière et de la valenciennes à son bonnet.\r\n-Le pli de sa jupe relevée laissait voir sa cuisse blanche, potelée et\r\n-ferme. Elle était admirablement rose et bien portante. La belle petite\r\n-donnait envie de mordre dans les pommes de ses joues. On ne pouvait rien\r\n-dire de ses yeux, sinon qu'ils devaient être très grands et qu'ils\r\n-avaient des cils magnifiques. Elle dormait.\r\n-\r\n-Elle dormait de ce sommeil d'absolue confiance propre à son âge. Les\r\n-bras des mères sont faits de tendresse; les enfants y dorment\r\n-profondément.\r\n-\r\n-Quant à la mère, l'aspect en était pauvre et triste. Elle avait la mise\r\n-d'une ouvrière qui tend à redevenir paysanne. Elle était jeune.\r\n-Était-elle belle? peut-être; mais avec cette mise il n'y paraissait pas.\r\n-Ses cheveux, d'où s'échappait une mèche blonde, semblaient fort épais,\r\n-mais disparaissaient sévèrement sous une coiffe de béguine, laide,\r\n-serrée, étroite, et nouée au menton. Le rire montre les belles dents\r\n-quand on en a; mais elle ne riait point. Ses yeux ne semblaient pas être\r\n-secs depuis très longtemps. Elle était pâle; elle avait l'air très lasse\r\n-et un peu malade; elle regardait sa fille endormie dans ses bras avec\r\n-cet air particulier d'une mère qui a nourri son enfant. Un large\r\n-mouchoir bleu, comme ceux où se mouchent les invalides, plié en fichu,\r\n-masquait lourdement sa taille. Elle avait les mains hâlées et toutes\r\n-piquées de taches de rousseur, l'index durci et déchiqueté par\r\n-l'aiguille, une Mante brune de laine bourrue, une robe de toile et de\r\n-gros souliers. C'était Fantine.\r\n-\r\n-C'était Fantine. Difficile à reconnaître. Pourtant, à l'examiner\r\n-attentivement, elle avait toujours sa beauté. Un pli triste, qui\r\n-ressemblait à un commencement d'ironie, ridait sa joue droite. Quant à \r\n-sa toilette, cette aérienne toilette de mousseline et de rubans qui\r\n-semblait faite avec de la gaîté, de la folie et de la musique, pleine de\r\n-grelots et parfumée de lilas, elle s'était évanouie comme ces beaux\r\n-givres éclatants qu'on prend pour des diamants au soleil; ils fondent et\r\n-laissent la branche toute noire.\r\n-\r\n-Dix mois s'étaient écoulés depuis «la bonne farce».\r\n-\r\n-Que s'était-il passé pendant ces dix mois? on le devine.\r\n-\r\n-Après l'abandon, la gêne. Fantine avait tout de suite perdu de vue\r\n-Favourite, Zéphine et Dahlia; le lien, brisé du côté des hommes, s'était\r\n-défait du côté des femmes; on les eût bien étonnées, quinze jours après,\r\n-si on leur eût dit qu'elles étaient amies; cela n'avait plus de raison\r\n-d'être. Fantine était restée seule. Le père de son enfant parti,--hélas!\r\n-ces ruptures-là sont irrévocables,--elle se trouva absolument isolée,\r\n-avec l'habitude du travail de moins et le goût du plaisir de plus.\r\n-Entraînée par sa liaison avec Tholomyès à dédaigner le petit métier\r\n-qu'elle savait, elle avait négligé ses débouchés; ils s'étaient fermés.\r\n-Nulle ressource. Fantine savait à peine lire et ne savait pas écrire; on\r\n-lui avait seulement appris dans son enfance à signer son nom; elle avait\r\n-fait écrire par un écrivain public une lettre à Tholomyès, puis une\r\n-seconde, puis une troisième. Tholomyès n'avait répondu à aucune. Un\r\n-jour, Fantine entendit des commères dire en regardant sa fille:\r\n-\r\n---Est-ce qu'on prend ces enfants-là au sérieux? on hausse les épaules de\r\n-ces enfants-là !\r\n-\r\n-Alors elle songea à Tholomyès qui haussait les épaules de son enfant et\r\n-qui ne prenait pas cet être innocent au sérieux; et son coeur devint\r\n-sombre à l'endroit de cet homme. Quel parti prendre pourtant? Elle ne\r\n-savait plus à qui s'adresser. Elle avait commis une faute, mais le fond\r\n-de sa nature, on s'en souvient, était pudeur et vertu. Elle sentit\r\n-vaguement qu'elle était à la veille de tomber dans la détresse, et de\r\n-glisser dans le pire. Il fallait du courage; elle en eut, et se roidit.\r\n-L'idée lui vint de retourner dans sa ville natale, à Montreuil-sur-mer.\r\n-Là quelqu'un peut-être la connaîtrait et lui donnerait du travail. Oui;\r\n-mais il faudrait cacher sa faute. Et elle entrevoyait confusément la\r\n-nécessité possible d'une séparation plus douloureuse encore que la\r\n-première. Son coeur se serra, mais elle prit sa résolution. Fantine, on\r\n-le verra, avait la farouche bravoure de la vie.\r\n-\r\n-Elle avait déjà vaillamment renoncé à la parure, s'était vêtue de toile,\r\n-et avait mis toute sa soie, tous ses chiffons, tous ses rubans et toutes\r\n-ses dentelles sur sa fille, seule vanité qui lui restât, et sainte\r\n-celle-là . Elle vendit tout ce qu'elle avait, ce qui lui produisit deux\r\n-cents francs; ses petites dettes payées, elle n'eut plus que\r\n-quatre-vingts francs environ. À vingt-deux ans, par une belle matinée de\r\n-printemps, elle quittait Paris, emportant son enfant sur son dos.\r\n-Quelqu'un qui les eût vues passer toutes les deux eût pitié. Cette femme\r\n-n'avait au monde que cet enfant, et cet enfant n'avait au monde que\r\n-cette femme. Fantine avait nourri sa fille; cela lui avait fatigué la\r\n-poitrine, et elle toussait un peu.\r\n-\r\n-Nous n'aurons plus occasion de parler de M. Félix Tholomyès.\r\n-Bornons-nous à dire que, vingt ans plus tard, sous le roi\r\n-Louis-Philippe, c'était un gros avoué de province, influent et riche,\r\n-électeur sage et juré très sévère; toujours homme de plaisir.\r\n-\r\n-Vers le milieu du jour, après avoir, pour se reposer, cheminé de temps\r\n-en temps, moyennant trois ou quatre sous par lieue, dans ce qu'on\r\n-appelait alors les Petites Voitures des Environs de Paris, Fantine se\r\n-trouvait à Montfermeil, dans la ruelle du Boulanger.\r\n-\r\n-Comme elle passait devant l'auberge Thénardier, les deux petites filles,\r\n-enchantées sur leur escarpolette monstre, avaient été pour elle une\r\n-sorte d'éblouissement, et elle s'était arrêtée devant cette vision de\r\n-joie.\r\n-\r\n-Il y a des charmes. Ces deux petites filles en furent un pour cette\r\n-mère.\r\n-\r\n-Elle les considérait, toute émue. La présence des anges est une annonce\r\n-de paradis. Elle crut voir au dessus de cette auberge le mystérieux ICI\r\n-de la providence. Ces deux petites étaient si évidemment heureuses! Elle\r\n-les regardait, elle les admirait, tellement attendrie qu'au moment où la\r\n-mère reprenait haleine entre deux vers de sa chanson, elle ne put\r\n-s'empêcher de lui dire ce mot qu'on vient de lire:\r\n-\r\n---Vous avez là deux jolis enfants, madame.\r\n-\r\n-Les créatures les plus féroces sont désarmées par la caresse à leurs\r\n-petits. La mère leva la tête et remercia, et fit asseoir la passante sur\r\n-le banc de la porte, elle-même étant sur le seuil. Les deux femmes\r\n-causèrent.\r\n-\r\n---Je m'appelle madame Thénardier, dit la mère des deux petites. Nous\r\n-tenons cette auberge.\r\n-\r\n-Puis, toujours à sa romance, elle reprit entre ses dents:\r\n-\r\n- _Il le faut, je suis chevalier,_\r\n- _Et je pars pour la Palestine._\r\n-\r\n-Cette madame Thénardier était une femme rousse, charnue, anguleuse; le\r\n-type femme-à -soldat dans toute sa disgrâce. Et, chose bizarre, avec un\r\n-air penché qu'elle devait à des lectures romanesques. C'était une\r\n-minaudière hommasse. De vieux romans qui se sont éraillés sur des\r\n-imaginations de gargotières ont de ces effets-là . Elle était jeune\r\n-encore; elle avait à peine trente ans. Si cette femme, qui était\r\n-accroupie, se fût tenue droite, peut-être sa haute taille et sa carrure\r\n-de colosse ambulant propre aux foires, eussent-elles dès l'abord\r\n-effarouché la voyageuse, troublé sa confiance, et fait évanouir ce que\r\n-nous avons à raconter. Une personne qui est assise au lieu d'être\r\n-debout, les destinées tiennent à cela.\r\n-\r\n-La voyageuse raconta son histoire, un peu modifiée:\r\n-\r\n-Qu'elle était ouvrière; que son mari était mort; que le travail lui\r\n-manquait à Paris, et qu'elle allait en chercher ailleurs; dans son pays;\r\n-qu'elle avait quitté Paris, le matin même, à pied; que, comme elle\r\n-portait son enfant, se sentant fatiguée, et ayant rencontré la voiture\r\n-de Villemomble, elle y était montée; que de Villemomble elle était venue\r\n-à Montfermeil à pied, que la petite avait un peu marché, mais pas\r\n-beaucoup, c'est si jeune, et qu'il avait fallu la prendre, et que le\r\n-bijou s'était endormi.\r\n-\r\n-Et sur ce mot elle donna à sa fille un baiser passionné qui la réveilla.\r\n-L'enfant ouvrit les yeux, de grands yeux bleus comme ceux de sa mère, et\r\n-regarda, quoi? rien, tout, avec cet air sérieux et quelquefois sévère\r\n-des petits enfants, qui est un mystère de leur lumineuse innocence\r\n-devant nos crépuscules de vertus. On dirait qu'ils se sentent anges et\r\n-qu'ils nous savent hommes. Puis l'enfant se mit à rire, et, quoique la\r\n-mère la retint, glissa à terre avec l'indomptable énergie d'un petit\r\n-être qui veut courir. Tout à coup elle aperçut les deux autres sur leur\r\n-balançoire, s'arrêta court, et tira la langue, signe d'admiration.\r\n-\r\n-La mère Thénardier détacha ses filles, les fit descendre de\r\n-l'escarpolette, et dit:\r\n-\r\n---Amusez-vous toutes les trois.\r\n-\r\n-Ces âges-là s'apprivoisent vite, et au bout d'une minute les petites\r\n-Thénardier jouaient avec la nouvelle venue à faire des trous dans la\r\n-terre, plaisir immense.\r\n-\r\n-Cette nouvelle venue était très gaie; la bonté de la mère est écrite\r\n-dans la gaîté du marmot; elle avait pris un brin de bois qui lui servait\r\n-de pelle, et elle creusait énergiquement une fosse bonne pour une\r\n-mouche. Ce que fait le fossoyeur devient riant, fait par l'enfant.\r\n-\r\n-Les deux femmes continuaient de causer.\r\n-\r\n---Comment s'appelle votre mioche?\r\n-\r\n---Cosette.\r\n-\r\n-Cosette, lisez Euphrasie. La petite se nommait Euphrasie. Mais\r\n-d'Euphrasie la mère avait fait Cosette, par ce doux et gracieux instinct\r\n-des mères et du peuple qui change Josefa en Pepita et Françoise en\r\n-Sillette. C'est là un genre de dérivés qui dérange et déconcerte toute\r\n-la science des étymologistes. Nous avons connu une grand'mère qui avait\r\n-réussi à faire de Théodore, Gnon.\r\n-\r\n---Quel âge a-t-elle?\r\n-\r\n---Elle va sur trois ans.\r\n-\r\n---C'est comme mon aînée.\r\n-\r\n-Cependant les trois petites filles étaient groupées dans une posture\r\n-d'anxiété profonde et de béatitude; un événement avait lieu; un gros ver\r\n-venait de sortir de terre; et elles avaient peur, et elles étaient en\r\n-extase.\r\n-\r\n-Leurs fronts radieux se touchaient; on eût dit trois têtes dans une\r\n-auréole.\r\n-\r\n---Les enfants, s'écria la mère Thénardier, comme ça se connaît tout de\r\n-suite! les voilà qu'on jurerait trois soeurs!\r\n-\r\n-Ce mot fut l'étincelle qu'attendait probablement l'autre mère. Elle\r\n-saisit la main de la Thénardier, la regarda fixement, et lui dit:\r\n-\r\n---Voulez-vous me garder mon enfant?\r\n-\r\n-La Thénardier eut un de ces mouvements surpris qui ne sont ni le\r\n-consentement ni le refus.\r\n-\r\n-La mère de Cosette poursuivit:\r\n-\r\n---Voyez-vous, je ne peux pas emmener ma fille au pays. L'ouvrage ne le\r\n-permet pas. Avec un enfant, on ne trouve pas à se placer. Ils sont si\r\n-ridicules dans ce pays-là . C'est le bon Dieu qui m'a fait passer devant\r\n-votre auberge. Quand j'ai vu vos petites si jolies et si propres et si\r\n-contentes, cela m'a bouleversée. J'ai dit: voilà une bonne mère. C'est\r\n-ça; ça fera trois soeurs. Et puis, je ne serai pas longtemps à revenir.\r\n-Voulez-vous me garder mon enfant?\r\n-\r\n---Il faudrait voir, dit la Thénardier.\r\n-\r\n---Je donnerais six francs par mois.\r\n-\r\n-Ici une voix d'homme cria du fond de la gargote:\r\n-\r\n---Pas à moins de sept francs. Et six mois payés d'avance.\r\n-\r\n---Six fois sept quarante-deux, dit la Thénardier.\r\n-\r\n---Je les donnerai, dit la mère.\r\n-\r\n---Et quinze francs en dehors pour les premiers frais, ajouta la voix\r\n-d'homme.\r\n-\r\n---Total cinquante-sept francs, dit la madame Thénardier. Et à travers\r\n-ces chiffres, elle chantonnait vaguement:\r\n-\r\n-_Il le faut, disait un guerrier._\r\n-\r\n---Je les donnerai, dit la mère, j'ai quatre-vingts francs. Il me restera\r\n-de quoi aller au pays. En allant à pied. Je gagnerai de l'argent là -bas,\r\n-et dès que j'en aurai un peu, je reviendrai chercher l'amour.\r\n-\r\n-La voix d'homme reprit:\r\n-\r\n---La petite a un trousseau?\r\n-\r\n---C'est mon mari, dit la Thénardier.\r\n-\r\n---Sans doute elle a un trousseau, le pauvre trésor. J'ai bien vu que\r\n-c'était votre mari. Et un beau trousseau encore! un trousseau insensé.\r\n-Tout par douzaines; et des robes de soie comme une dame. Il est là dans\r\n-mon sac de nuit.\r\n-\r\n---Il faudra le donner, repartit la voix d'homme.\r\n-\r\n---Je crois bien que je le donnerai! dit la mère. Ce serait cela qui\r\n-serait drôle si je laissais ma fille toute nue!\r\n-\r\n-La face du maître apparut.\r\n-\r\n---C'est bon, dit-il.\r\n-\r\n-Le marché fut conclu. La mère passa la nuit à l'auberge, donna son\r\n-argent et laissa son enfant, renoua son sac de nuit dégonflé du\r\n-trousseau et léger désormais, et partit le lendemain matin, comptant\r\n-revenir bientôt. On arrange tranquillement ces départs-là , mais ce sont\r\n-des désespoirs.\r\n-\r\n-Une voisine des Thénardier rencontra cette mère comme elle s'en allait,\r\n-et s'en revint en disant:\r\n-\r\n---Je viens de voir une femme qui pleure dans la rue, que c'est un\r\n-déchirement.\r\n-\r\n-Quand la mère de Cosette fut partie, l'homme dit à la femme:\r\n-\r\n---Cela va me payer mon effet de cent dix francs qui échoit demain. Il me\r\n-manquait cinquante francs. Sais-tu que j'aurais eu l'huissier et un\r\n-protêt? Tu as fait là une bonne souricière avec tes petites.\r\n-\r\n---Sans m'en douter, dit la femme.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre II\r\n-\r\n-Première esquisse de deux figures louches\r\n-\r\n-\r\n-La souris prise était bien chétive; mais le chat se réjouit même d'une\r\n-souris maigre. Qu'était-ce que les Thénardier?\r\n-\r\n-Disons-en un mot dès à présent. Nous compléterons le croquis plus tard.\r\n-\r\n-Ces êtres appartenaient à cette classe bâtarde composée de gens\r\n-grossiers parvenus et de gens intelligents déchus, qui est entre la\r\n-classe dite moyenne et la classe dite inférieure, et qui combine\r\n-quelques-uns des défauts de la seconde avec presque tous les vices de la\r\n-première, sans avoir le généreux élan de l'ouvrier ni l'ordre honnête du\r\n-bourgeois.\r\n-\r\n-C'étaient de ces natures naines qui, si quelque feu sombre les chauffe\r\n-par hasard, deviennent facilement monstrueuses. Il y avait dans la femme\r\n-le fond d'une brute et dans l'homme l'étoffe d'un gueux. Tous deux\r\n-étaient au plus haut degré susceptibles de l'espèce de hideux progrès\r\n-qui se fait dans le sens du mal. Il existe des âmes écrevisses reculant\r\n-continuellement vers les ténèbres, rétrogradant dans la vie plutôt\r\n-qu'elles n'y avancent, employant l'expérience à augmenter leur\r\n-difformité, empirant sans cesse, et s'empreignant de plus en plus d'une\r\n-noirceur croissante. Cet homme et cette femme étaient de ces âmes-là .\r\n-\r\n-Le Thénardier particulièrement était gênant pour le physionomiste. On\r\n-n'a qu'à regarder certains hommes pour s'en défier, on les sent\r\n-ténébreux à leurs deux extrémités. Ils sont inquiets derrière eux et\r\n-menaçants devant eux. Il y a en eux de l'inconnu. On ne peut pas plus\r\n-répondre de ce qu'ils ont fait que de ce qu'ils feront. L'ombre qu'ils\r\n-ont dans le regard les dénonce. Rien qu'en les entendant dire un mot ou\r\n-qu'en les voyant faire un geste on entrevoit de sombres secrets dans\r\n-leur passé et de sombres mystères dans leur avenir.\r\n-\r\n-Ce Thénardier, s'il fallait l'en croire, avait été soldat; sergent,\r\n-disait-il; il avait fait probablement la campagne de 1815, et s'était\r\n-même comporté assez bravement, à ce qu'il paraît. Nous verrons plus tard\r\n-ce qu'il en était. L'enseigne de son cabaret était une allusion à l'un\r\n-de ses faits d'armes. Il l'avait peinte lui-même, car il savait faire un\r\n-peu de tout; mal.\r\n-\r\n-C'était l'époque où l'antique roman classique, qui, après avoir été\r\n-_Clélie_, n'était plus que _Lodoïska_, toujours noble, mais de plus en\r\n-plus vulgaire, tombé de mademoiselle de Scudéri à madame\r\n-Barthélemy-Hadot, et de madame de Lafayette à madame Bournon-Malarme,\r\n-incendiait l'âme aimante des portières de Paris et ravageait même un peu\r\n-la banlieue. Madame Thénardier était juste assez intelligente pour lire\r\n-ces espèces de livres. Elle s'en nourrissait. Elle y noyait ce qu'elle\r\n-avait de cervelle; cela lui avait donné, tant qu'elle avait été très\r\n-jeune, et même un peu plus tard, une sorte d'attitude pensive près de\r\n-son mari, coquin d'une certaine profondeur, ruffian lettré à la\r\n-grammaire près, grossier et fin en même temps, mais, en fait de\r\n-sentimentalisme, lisant Pigault-Lebrun, et pour «tout ce qui touche le\r\n-sexe», comme il disait dans son jargon, butor correct et sans mélange.\r\n-Sa femme avait quelque douze ou quinze ans de moins que lui. Plus tard,\r\n-quand les cheveux romanesquement pleureurs commencèrent à grisonner,\r\n-quand la Mégère se dégagea de la Paméla, la Thénardier ne fut plus\r\n-qu'une grosse méchante femme ayant savouré des romans bêtes. Or on ne\r\n-lit pas impunément des niaiseries. Il en résulta que sa fille aînée se\r\n-nomma Eponine. Quant à la cadette, la pauvre petite faillit se nommer\r\n-Gulnare; elle dut à je ne sais quelle heureuse diversion faite par un\r\n-roman de Ducray-Duminil, de ne s'appeler qu'Azelma.\r\n-\r\n-Au reste, pour le dire en passant, tout n'est pas ridicule et\r\n-superficiel dans cette curieuse époque à laquelle nous faisons ici\r\n-allusion, et qu'on pourrait appeler l'anarchie des noms de baptême. À\r\n-côté de l'élément romanesque, que nous venons d'indiquer, il y a le\r\n-symptôme social. Il n'est pas rare aujourd'hui que le garçon bouvier se\r\n-nomme Arthur, Alfred ou Alphonse, et que le vicomte--s'il y a encore des\r\n-vicomtes--se nomme Thomas, Pierre ou Jacques. Ce déplacement qui met le\r\n-nom «élégant» sur le plébéien et le nom campagnard sur l'aristocrate\r\n-n'est autre chose qu'un remous d'égalité. L'irrésistible pénétration du\r\n-souffle nouveau est là comme en tout. Sous cette discordance apparente,\r\n-il y a une chose grande et profonde: la révolution française.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre III\r\n-\r\n-L'Alouette\r\n-\r\n-\r\n-Il ne suffit pas d'être méchant pour prospérer. La gargote allait mal.\r\n-\r\n-Grâce aux cinquante-sept francs de la voyageuse, Thénardier avait pu\r\n-éviter un protêt et faire honneur à sa signature. Le mois suivant ils\r\n-eurent encore besoin d'argent; la femme porta à Paris et engagea au\r\n-Mont-de-Piété le trousseau de Cosette pour une somme de soixante francs.\r\n-Dès que cette somme fut dépensée, les Thénardier s'accoutumèrent à ne\r\n-plus voir dans la petite fille qu'un enfant qu'ils avaient chez eux par\r\n-charité, et la traitèrent en conséquence. Comme elle n'avait plus de\r\n-trousseau, on l'habilla des vieilles jupes et des vieilles chemises des\r\n-petites Thénardier, c'est-à -dire de haillons.\r\n-\r\n-On la nourrit des restes de tout le monde, un peu mieux que le chien et\r\n-un peu plus mal que le chat. Le chat et le chien étaient du reste ses\r\n-commensaux habituels; Cosette mangeait avec eux sous la table dans une\r\n-écuelle de bois pareille à la leur. La mère qui s'était fixée, comme on\r\n-le verra plus tard, à Montreuil-sur-mer, écrivait, ou, pour mieux dire,\r\n-faisait écrire tous les mois afin d'avoir des nouvelles de son enfant.\r\n-Les Thénardier répondaient invariablement: Cosette est à merveille. Les\r\n-six premiers mois révolus, la mère envoya sept francs pour le septième\r\n-mois, et continua assez exactement ses envois de mois en mois. L'année\r\n-n'était pas finie que le Thénardier dit:\r\n-\r\n---Une belle grâce qu'elle nous fait là ! que veut-elle que nous fassions\r\n-avec ses sept francs?\r\n-\r\n-Et il écrivit pour exiger douze francs. La mère, à laquelle ils\r\n-persuadaient que son enfant était heureuse \u0022et venait bien\u0022, se soumit\r\n-et envoya les douze francs.\r\n-\r\n-Certaines natures ne peuvent aimer d'un côté sans haïr de l'autre. La\r\n-mère Thénardier aimait passionnément ses deux filles à elle, ce qui fit\r\n-qu'elle détesta l'étrangère. Il est triste de songer que l'amour d'une\r\n-mère peut avoir de vilains aspects. Si peu de place que Cosette tînt\r\n-chez elle, il lui semblait que cela était pris aux siens, et que cette\r\n-petite diminuait l'air que ses filles respiraient. Cette femme, comme\r\n-beaucoup de femmes de sa sorte, avait une somme de caresses et une somme\r\n-de coups et d'injures à dépenser chaque jour. Si elle n'avait pas eu\r\n-Cosette, il est certain que ses filles, tout idolâtrées qu'elles\r\n-étaient, auraient tout reçu; mais l'étrangère leur rendit le service de\r\n-détourner les coups sur elle. Ses filles n'eurent que les caresses.\r\n-Cosette ne faisait pas un mouvement qui ne fît pleuvoir sur sa tête une\r\n-grêle de châtiments violents et immérités. Doux être faible qui ne\r\n-devait rien comprendre à ce monde ni à Dieu, sans cesse punie, grondée,\r\n-rudoyée, battue et voyant à côté d'elle deux petites créatures comme\r\n-elle, qui vivaient dans un rayon d'aurore!\r\n-\r\n-La Thénardier étant méchante pour Cosette, Éponine et Azelma furent\r\n-méchantes. Les enfants, à cet âge, ne sont que des exemplaires de la\r\n-mère. Le format est plus petit, voilà tout.\r\n-\r\n-Une année s'écoula, puis une autre.\r\n-\r\n-On disait dans le village:\r\n-\r\n---Ces Thénardier sont de braves gens. Ils ne sont pas riches, et ils\r\n-élèvent un pauvre enfant qu'on leur a abandonné chez eux!\r\n-\r\n-On croyait Cosette oubliée par sa mère.\r\n-\r\n-Cependant le Thénardier, ayant appris par on ne sait quelles voies\r\n-obscures que l'enfant était probablement bâtard et que la mère ne\r\n-pouvait l'avouer, exigea quinze francs par mois, disant que «la\r\n-créature» grandissait et «_mangeait_», et menaçant de la renvoyer.\r\n-«Quelle ne m'embête pas! s'écriait-il, je lui bombarde son mioche tout\r\n-au beau milieu de ses cachotteries. Il me faut de l'augmentation.» La\r\n-mère paya les quinze francs.\r\n-\r\n-D'année en année, l'enfant grandit, et sa misère aussi.\r\n-\r\n-Tant que Cosette fut toute petite, elle fut le souffre-douleur des deux\r\n-autres enfants; dès qu'elle se mit à se développer un peu, c'est-à -dire\r\n-avant même qu'elle eût cinq ans, elle devint la servante de la maison.\r\n-\r\n-Cinq ans, dira-t-on, c'est invraisemblable. Hélas, c'est vrai. La\r\n-souffrance sociale commence à tout âge.\r\n-\r\n-N'avons-nous pas vu, récemment, le procès d'un nommé Dumolard, orphelin\r\n-devenu bandit, qui, dès l'âge de cinq ans, disent les documents\r\n-officiels, étant seul au monde «travaillait pour vivre, et volait.»\r\n-\r\n-On fit faire à Cosette les commissions, balayer les chambres, la cour,\r\n-la rue, laver la vaisselle, porter même des fardeaux. Les Thénardier se\r\n-crurent d'autant plus autorisés à agir ainsi que la mère qui était\r\n-toujours à Montreuil-sur-mer commença à mal payer. Quelques mois\r\n-restèrent en souffrance.\r\n-\r\n-Si cette mère fût revenue à Montfermeil au bout de ces trois années,\r\n-elle n'eût point reconnu son enfant. Cosette, si jolie et si fraîche à \r\n-son arrivée dans cette maison, était maintenant maigre et blême. Elle\r\n-avait je ne sais quelle allure inquiète. Sournoise! disaient les\r\n-Thénardier.\r\n-\r\n-L'injustice l'avait faite hargneuse et la misère l'avait rendue laide.\r\n-Il ne lui restait plus que ses beaux yeux qui faisaient peine, parce\r\n-que, grands comme ils étaient, il semblait qu'on y vît une plus grande\r\n-quantité de tristesse.\r\n-\r\n-C'était une chose navrante de voir, l'hiver, ce pauvre enfant, qui\r\n-n'avait pas encore six ans, grelottant sous de vieilles loques de toile\r\n-trouées, balayer la rue avant le jour avec un énorme balai dans ses\r\n-petites mains rouges et une larme dans ses grands yeux.\r\n-\r\n-Dans le pays on l'appelait l'Alouette. Le peuple, qui aime les figures,\r\n-s'était plu à nommer de ce nom ce petit être pas plus gros qu'un oiseau,\r\n-tremblant, effarouché et frissonnant, éveillé le premier chaque matin\r\n-dans la maison et dans le village, toujours dans la rue ou dans les\r\n-champs avant l'aube. Seulement la pauvre Alouette ne chantait jamais.\r\n-\r\n-\r\n-\r\n-\r\n-Livre cinquième--La descente\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre I\r\n-\r\n-Histoire d'un progrès dans les verroteries noires\r\n-\r\n-\r\n-Cette mère cependant qui, au dire des gens de Montfermeil, semblait\r\n-avoir abandonné son enfant, que devenait-elle? où était-elle? que\r\n-faisait-elle?\r\n-\r\n-Après avoir laissé sa petite Cosette aux Thénardier, elle avait continué\r\n-son chemin et était arrivée à Montreuil-sur-mer.\r\n-\r\n-C'était, on se le rappelle, en 1818.\r\n-\r\n-Fantine avait quitté sa province depuis une dizaine d'années.\r\n-Montreuil-sur-mer avait changé d'aspect. Tandis que Fantine descendait\r\n-lentement de misère en misère, sa ville natale avait prospéré.\r\n-\r\n-Depuis deux ans environ, il s'y était accompli un de ces faits\r\n-industriels qui sont les grands événements des petits pays.\r\n-\r\n-Ce détail importe, et nous croyons utile de le développer; nous dirions\r\n-presque, de le souligner.\r\n-\r\n-De temps immémorial, Montreuil-sur-mer avait pour industrie spéciale\r\n-l'imitation des jais anglais et des verroteries noires d'Allemagne.\r\n-Cette industrie avait toujours végété, à cause de la cherté des matières\r\n-premières qui réagissait sur la main-d'oeuvre. Au moment où Fantine\r\n-revint à Montreuil-sur-mer, une transformation inouïe s'était opérée\r\n-dans cette production des «articles noirs». Vers la fin de 1815, un\r\n-homme, un inconnu, était venu s'établir dans la ville et avait eu l'idée\r\n-de substituer, dans cette fabrication, la gomme laque à la résine et,\r\n-pour les bracelets en particulier, les coulants en tôle simplement\r\n-rapprochée aux coulants en tôle soudée. Ce tout petit changement avait\r\n-été une révolution.\r\n-\r\n-Ce tout petit changement en effet avait prodigieusement réduit le prix\r\n-de la matière première, ce qui avait permis, premièrement, d'élever le\r\n-prix de la main-d'oeuvre, bienfait pour le pays; deuxièmement,\r\n-d'améliorer la fabrication, avantage pour le consommateur;\r\n-troisièmement, de vendre à meilleur marché tout en triplant le bénéfice,\r\n-profit pour le manufacturier.\r\n-\r\n-Ainsi pour une idée trois résultats.\r\n-\r\n-En moins de trois ans, l'auteur de ce procédé était devenu riche, ce qui\r\n-est bien, et avait tout fait riche autour de lui, ce qui est mieux. Il\r\n-était étranger au département. De son origine, on ne savait rien; de ses\r\n-commencements, peu de chose.\r\n-\r\n-On contait qu'il était venu dans la ville avec fort peu d'argent,\r\n-quelques centaines de francs tout au plus.\r\n-\r\n-C'est de ce mince capital, mis au service d'une idée ingénieuse, fécondé\r\n-par l'ordre et par la pensée, qu'il avait tiré sa fortune et la fortune\r\n-de tout ce pays.\r\n-\r\n-À son arrivée à Montreuil-sur-mer, il n'avait que les vêtements, la\r\n-tournure et le langage d'un ouvrier.\r\n-\r\n-Il paraît que, le jour même où il faisait obscurément son entrée dans la\r\n-petite ville de Montreuil-sur-mer, à la tombée d'un soir de décembre, le\r\n-sac au dos et le bâton d'épine à la main, un gros incendie venait\r\n-d'éclater à la maison commune. Cet homme s'était jeté dans le feu, et\r\n-avait sauvé, au péril de sa vie, deux enfants qui se trouvaient être\r\n-ceux du capitaine de gendarmerie; ce qui fait qu'on n'avait pas songé à \r\n-lui demander son passeport. Depuis lors, on avait su son nom. Il\r\n-s'appelait le _père Madeleine_.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre II\r\n-\r\n-M. Madeleine\r\n-\r\n-\r\n-C'était un homme d'environ cinquante ans, qui avait l'air préoccupé et\r\n-qui était bon. Voilà tout ce qu'on en pouvait dire.\r\n-\r\n-Grâce aux progrès rapides de cette industrie qu'il avait si\r\n-admirablement remaniée, Montreuil-sur-mer était devenu un centre\r\n-d'affaires considérable. L'Espagne, qui consomme beaucoup de jais noir,\r\n-y commandait chaque année des achats immenses. Montreuil-sur-mer, pour\r\n-ce commerce, faisait presque concurrence à Londres et à Berlin. Les\r\n-bénéfices du père Madeleine étaient tels que, dès la deuxième année, il\r\n-avait pu bâtir une grande fabrique dans laquelle il y avait deux vastes\r\n-ateliers, l'un pour les hommes, l'autre pour les femmes. Quiconque avait\r\n-faim pouvait s'y présenter, et était sûr de trouver là de l'emploi et du\r\n-pain. Le père Madeleine demandait aux hommes de la bonne volonté, aux\r\n-femmes des moeurs pures, à tous de la probité. Il avait divisé les\r\n-ateliers afin de séparer les sexes et que les filles et les femmes\r\n-pussent rester sages. Sur ce point, il était inflexible. C'était le seul\r\n-où il fût en quelque sorte intolérant. Il était d'autant plus fondé à \r\n-cette sévérité que, Montreuil-sur-mer étant une ville de garnison, les\r\n-occasions de corruption abondaient. Du reste sa venue avait été un\r\n-bienfait, et sa présence était une providence. Avant l'arrivée du père\r\n-Madeleine, tout languissait dans le pays; maintenant tout y vivait de la\r\n-vie saine du travail. Une forte circulation échauffait tout et pénétrait\r\n-partout. Le chômage et la misère étaient inconnus. Il n'y avait pas de\r\n-poche si obscure où il n'y eût un peu d'argent, pas de logis si pauvre\r\n-où il n'y eût un peu de joie.\r\n-\r\n-Le père Madeleine employait tout le monde. Il n'exigeait qu'une chose:\r\n-soyez honnête homme! soyez honnête fille!\r\n-\r\n-Comme nous l'avons dit, au milieu de cette activité dont il était la\r\n-cause et le pivot, le père Madeleine faisait sa fortune, mais, chose\r\n-assez singulière dans un simple homme de commerce, il ne paraissait\r\n-point que ce fût là son principal souci. Il semblait qu'il songeât\r\n-beaucoup aux autres et peu à lui. En 1820, on lui connaissait une somme\r\n-de six cent trente mille francs placée à son nom chez Laffitte; mais\r\n-avant de se réserver ces six cent trente mille francs, il avait dépensé\r\n-plus d'un million pour la ville et pour les pauvres.\r\n-\r\n-L'hôpital était mal doté; il y avait fondé dix lits. Montreuil-sur-mer\r\n-est divisé en ville haute et ville basse. La ville basse, qu'il\r\n-habitait, n'avait qu'une école, méchante masure qui tombait en ruine; il\r\n-en avait construit deux, une pour les filles, l'autre pour les garçons.\r\n-Il allouait de ses deniers aux deux instituteurs une indemnité double de\r\n-leur maigre traitement officiel, et un jour, à quelqu'un qui s'en\r\n-étonnait, il dit: «Les deux premiers fonctionnaires de l'état, c'est la\r\n-nourrice et le maître d'école.» Il avait créé à ses frais une salle\r\n-d'asile, chose alors presque inconnue en France, et une caisse de\r\n-secours pour les ouvriers vieux et infirmes. Sa manufacture étant un\r\n-centre, un nouveau quartier où il y avait bon nombre de familles\r\n-indigentes avait rapidement surgi autour de lui; il y avait établi une\r\n-pharmacie gratuite.\r\n-\r\n-Dans les premiers temps, quand on le vit commencer, les bonnes âmes\r\n-dirent: C'est un gaillard qui veut s'enrichir. Quand on le vit enrichir\r\n-le pays avant de s'enrichir lui-même, les mêmes bonnes âmes dirent:\r\n-C'est un ambitieux. Cela semblait d'autant plus probable que cet homme\r\n-était religieux, et même pratiquait dans une certaine mesure, chose fort\r\n-bien vue à cette époque. Il allait régulièrement entendre une basse\r\n-messe tous les dimanches. Le député local, qui flairait partout des\r\n-concurrences, ne tarda pas à s'inquiéter de cette religion. Ce député,\r\n-qui avait été membre du corps législatif de l'empire, partageait les\r\n-idées religieuses d'un père de l'oratoire connu sous le nom de Fouché,\r\n-duc d'Otrante, dont il avait été la créature et l'ami. À huis clos il\r\n-riait de Dieu doucement. Mais quand il vit le riche manufacturier\r\n-Madeleine aller à la basse messe de sept heures, il entrevit un candidat\r\n-possible, et résolut de le dépasser; il prit un confesseur jésuite et\r\n-alla à la grand'messe et à vêpres. L'ambition en ce temps-là était, dans\r\n-l'acception directe du mot, une course au clocher. Les pauvres\r\n-profitèrent de cette terreur comme le bon Dieu, car l'honorable député\r\n-fonda aussi deux lits à l'hôpital; ce qui fit douze.\r\n-\r\n-Cependant en 1819 le bruit se répandit un matin dans la ville que, sur\r\n-la présentation de M. le préfet, et en considération des services rendus\r\n-au pays, le père Madeleine allait être nommé par le roi maire de\r\n-Montreuil-sur-mer. Ceux qui avaient déclaré ce nouveau venu «un\r\n-ambitieux», saisirent avec transport cette occasion que tous les hommes\r\n-souhaitent de s'écrier: «Là ! qu'est-ce que nous avions dit?» Tout\r\n-Montreuil-sur-mer fut en rumeur. Le bruit était fondé. Quelques jours\r\n-après, la nomination parut dans _le Moniteur_. Le lendemain, le père\r\n-Madeleine refusa.\r\n-\r\n-Dans cette même année 1819, les produits du nouveau procédé inventé par\r\n-Madeleine figurèrent à l'exposition de l'industrie; sur le rapport du\r\n-jury, le roi nomma l'inventeur chevalier de la Légion d'honneur.\r\n-Nouvelle rumeur dans la petite ville. Eh bien! c'est la croix qu'il\r\n-voulait! Le père Madeleine refusa la croix.\r\n-\r\n-Décidément cet homme était une énigme. Les bonnes âmes se tirèrent\r\n-d'affaire en disant: Après tout, c'est une espèce d'aventurier.\r\n-\r\n-On l'a vu, le pays lui devait beaucoup, les pauvres lui devaient tout;\r\n-il était si utile qu'il avait bien fallu qu'on finît par l'honorer, et\r\n-il était si doux qu'il avait bien fallu qu'on finît par l'aimer; ses\r\n-ouvriers en particulier l'adoraient, et il portait cette adoration avec\r\n-une sorte de gravité mélancolique. Quand il fut constaté riche, «les\r\n-personnes de la société» le saluèrent, et on l'appela dans la ville\r\n-monsieur Madeleine; ses ouvriers et les enfants continuèrent de\r\n-l'appeler _le père Madeleine_, et c'était la chose qui le faisait le\r\n-mieux sourire. À mesure qu'il montait, les invitations pleuvaient sur\r\n-lui. «La société» le réclamait. Les petits salons guindés de\r\n-Montreuil-sur-mer qui, bien entendu, se fussent dans les premiers temps\r\n-fermés à l'artisan, s'ouvrirent à deux battants au millionnaire. On lui\r\n-fit mille avances. Il refusa.\r\n-\r\n-Cette fois encore les bonnes âmes ne furent point empêchées.\r\n-\r\n---C'est un homme ignorant et de basse éducation. On ne sait d'où cela\r\n-sort. Il ne saurait pas se tenir dans le monde. Il n'est pas du tout\r\n-prouvé qu'il sache lire.\r\n-\r\n-Quand on l'avait vu gagner de l'argent, on avait dit: c'est un marchand.\r\n-Quand on l'avait vu semer son argent, on avait dit: c'est un ambitieux.\r\n-Quand on l'avait vu repousser les honneurs, on avait dit: c'est un\r\n-aventurier. Quand on le vit repousser le monde, on dit: c'est une brute.\r\n-\r\n-En 1820, cinq ans après son arrivée à Montreuil-sur-mer, les services\r\n-qu'il avait rendus au pays étaient si éclatants, le voeu de la contrée\r\n-fut tellement unanime, que le roi le nomma de nouveau maire de la ville.\r\n-Il refusa encore, mais le préfet résista à son refus, tous les notables\r\n-vinrent le prier, le peuple en pleine rue le suppliait, l'insistance fut\r\n-si vive qu'il finit par accepter. On remarqua que ce qui parut surtout\r\n-le déterminer, ce fut l'apostrophe presque irritée d'une vieille femme\r\n-du peuple qui lui cria du seuil de sa porte avec humeur: _Un bon maire,\r\n-c'est utile. Est-ce qu'on recule devant du bien qu'on peut faire?_\r\n-\r\n-Ce fut là la troisième phase de son ascension. Le père Madeleine était\r\n-devenu monsieur Madeleine, monsieur Madeleine devint monsieur le maire.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre III\r\n-\r\n-Sommes déposées chez Laffitte\r\n-\r\n-\r\n-Du reste, il était demeuré aussi simple que le premier jour. Il avait\r\n-les cheveux gris, l'oeil sérieux, le teint hâlé d'un ouvrier, le visage\r\n-pensif d'un philosophe. Il portait habituellement un chapeau à bords\r\n-larges et une longue redingote de gros drap, boutonnée jusqu'au menton.\r\n-Il remplissait ses fonctions de maire, mais hors de là il vivait\r\n-solitaire. Il parlait à peu de monde. Il se dérobait aux politesses,\r\n-saluait de côté, s'esquivait vite, souriait pour se dispenser de causer,\r\n-donnait pour se dispenser de sourire. Les femmes disaient de lui: Quel\r\n-bon ours! Son plaisir était de se promener dans les champs.\r\n-\r\n-Il prenait ses repas toujours seul, avec un livre ouvert devant lui où\r\n-il lisait. Il avait une petite bibliothèque bien faite. Il aimait les\r\n-livres; les livres sont des amis froids et sûrs. À mesure que le loisir\r\n-lui venait avec la fortune, il semblait qu'il en profitât pour cultiver\r\n-son esprit. Depuis qu'il était à Montreuil-sur-mer, on remarquait que\r\n-d'année en année son langage devenait plus poli, plus choisi et plus\r\n-doux.\r\n-\r\n-Il emportait volontiers un fusil dans ses promenades, mais il s'en\r\n-servait rarement. Quand cela lui arrivait par aventure, il avait un tir\r\n-infaillible qui effrayait. Jamais il ne tuait un animal inoffensif.\r\n-Jamais il ne tirait un petit oiseau. Quoiqu'il ne fût plus jeune, on\r\n-contait qu'il était d'une force prodigieuse. Il offrait un coup de main\r\n-à qui en avait besoin, relevait un cheval, poussait à une roue\r\n-embourbée, arrêtait par les cornes un taureau échappé. Il avait toujours\r\n-ses poches pleines de monnaie en sortant et vides en rentrant. Quand il\r\n-passait dans un village, les marmots déguenillés couraient joyeusement\r\n-après lui et l'entouraient comme une nuée de moucherons.\r\n-\r\n-On croyait deviner qu'il avait dû vivre jadis de la vie des champs, car\r\n-il avait toutes sortes de secrets utiles qu'il enseignait aux paysans.\r\n-Il leur apprenait à détruire la teigne des blés en aspergeant le grenier\r\n-et en inondant les fentes du plancher d'une dissolution de sel commun,\r\n-et à chasser les charançons en suspendant partout, aux murs et aux\r\n-toits, dans les héberges et dans les maisons, de l'orviot en fleur. Il\r\n-avait des \u0022recettes\u0022 pour extirper d'un champ la luzette, la nielle, la\r\n-vesce, la gaverolle, la queue-de-renard, toutes les herbes parasites qui\r\n-mangent le blé. Il défendait une lapinière contre les rats rien qu'avec\r\n-l'odeur d'un petit cochon de Barbarie qu'il y mettait. Un jour il voyait\r\n-des gens du pays très occupés à arracher des orties. Il regarda ce tas\r\n-de plantes déracinées et déjà desséchées, et dit:\r\n-\r\n---C'est mort. Cela serait pourtant bon si l'on savait s'en servir. Quand\r\n-l'ortie est jeune, la feuille est un légume excellent; quand elle\r\n-vieillit, elle a des filaments et des fibres comme le chanvre et le lin.\r\n-La toile d'ortie vaut la toile de chanvre. Hachée, l'ortie est bonne\r\n-pour la volaille; broyée, elle est bonne pour les bêtes à cornes. La\r\n-graine de l'ortie mêlée au fourrage donne du luisant au poil des\r\n-animaux; la racine mêlée au sel produit une belle couleur jaune. C'est\r\n-du reste un excellent foin qu'on peut faucher deux fois. Et que faut-il\r\n-à l'ortie? Peu de terre, nul soin, nulle culture. Seulement la graine\r\n-tombe à mesure qu'elle mûrit, et est difficile à récolter. Voilà tout.\r\n-Avec quelque peine qu'on prendrait, l'ortie serait utile; on la néglige,\r\n-elle devient nuisible. Alors on la tue. Que d'hommes ressemblent à \r\n-l'ortie!\r\n-\r\n-Il ajouta après un silence:\r\n-\r\n---Mes amis, retenez ceci, il n'y a ni mauvaises herbes ni mauvais\r\n-hommes. Il n'y a que de mauvais cultivateurs.\r\n-\r\n-Les enfants l'aimaient encore parce qu'il savait faire de charmants\r\n-petits ouvrages avec de la paille et des noix de coco.\r\n-\r\n-Quand il voyait la porte d'une église tendue de noir, il entrait; il\r\n-recherchait un enterrement comme d'autres recherchent un baptême. Le\r\n-veuvage et le malheur d'autrui l'attiraient à cause de sa grande\r\n-douceur; il se mêlait aux amis en deuil, aux familles vêtues de noir,\r\n-aux prêtres gémissant autour d'un cercueil. Il semblait donner\r\n-volontiers pour texte à ses pensées ces psalmodies funèbres pleines de\r\n-la vision d'un autre monde. L'oeil au ciel, il écoutait, avec une sorte\r\n-d'aspiration vers tous les mystères de l'infini, ces voix tristes qui\r\n-chantent sur le bord de l'abîme obscur de la mort.\r\n-\r\n-Il faisait une foule de bonnes actions en se cachant comme on se cache\r\n-pour les mauvaises. Il pénétrait à la dérobée, le soir, dans les\r\n-maisons; il montait furtivement des escaliers. Un pauvre diable, en\r\n-rentrant dans son galetas, trouvait que sa porte avait été ouverte,\r\n-quelquefois même forcée, dans son absence. Le pauvre homme se récriait:\r\n-quelque malfaiteur est venu! Il entrait, et la première chose qu'il\r\n-voyait, c'était une pièce d'or oubliée sur un meuble. \u0022Le malfaiteur\u0022\r\n-qui était venu, c'était le père Madeleine.\r\n-\r\n-Il était affable et triste. Le peuple disait: «Voilà un homme riche qui\r\n-n'a pas l'air fier. Voilà un homme heureux qui n'a pas l'air content.»\r\n-\r\n-Quelques-uns prétendaient que c'était un personnage mystérieux, et\r\n-affirmaient qu'on n'entrait jamais dans sa chambre, laquelle était une\r\n-vraie cellule d'anachorète meublée de sabliers ailés et enjolivée de\r\n-tibias en croix et de têtes de mort. Cela se disait beaucoup, si bien\r\n-que quelques jeunes femmes élégantes et malignes de Montreuil-sur-mer\r\n-vinrent chez lui un jour, et lui demandèrent:\r\n-\r\n---Monsieur le maire, montrez-nous donc votre chambre. On dit que c'est\r\n-une grotte.\r\n-\r\n-Il sourit, et les introduisit sur-le-champ dans cette «grotte». Elles\r\n-furent bien punies de leur curiosité. C'était une chambre garnie tout\r\n-bonnement de meubles d'acajou assez laids comme tous les meubles de ce\r\n-genre et tapissée de papier à douze sous. Elles n'y purent rien\r\n-remarquer que deux flambeaux de forme vieillie qui étaient sur la\r\n-cheminée et qui avaient l'air d'être en argent, «car ils étaient\r\n-contrôlés». Observation pleine de l'esprit des petites villes.\r\n-\r\n-On n'en continua pas moins de dire que personne ne pénétrait dans cette\r\n-chambre et que c'était une caverne d'ermite, un rêvoir, un trou, un\r\n-tombeau.\r\n-\r\n-On se chuchotait aussi qu'il avait des sommes «immenses» déposées chez\r\n-Laffitte, avec cette particularité qu'elles étaient toujours à sa\r\n-disposition immédiate, de telle sorte, ajoutait-on, que M. Madeleine\r\n-pourrait arriver un matin chez Laffitte, signer un reçu et emporter ses\r\n-deux ou trois millions en dix minutes. Dans la réalité ces «deux ou\r\n-trois millions» se réduisaient, nous l'avons dit, à six cent trente ou\r\n-quarante mille francs.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IV\r\n-\r\n-M. Madeleine en deuil\r\n-\r\n-\r\n-Au commencement de 1821, les journaux annoncèrent la mort de M. Myriel,\r\n-évêque de Digne, «surnommé _monseigneur Bienvenu_», et trépassé en odeur\r\n-de sainteté à l'âge de quatre-vingt-deux ans.\r\n-\r\n-L'évêque de Digne, pour ajouter ici un détail que les journaux omirent,\r\n-était, quand il mourut, depuis plusieurs années aveugle, et content\r\n-d'être aveugle, sa soeur étant près de lui.\r\n-\r\n-Disons-le en passant, être aveugle et être aimé, c'est en effet, sur\r\n-cette terre où rien n'est complet, une des formes les plus étrangement\r\n-exquises du bonheur. Avoir continuellement à ses côtés une femme, une\r\n-fille, une soeur, un être charmant, qui est là parce que vous avez\r\n-besoin d'elle et parce qu'elle ne peut se passer de vous, se savoir\r\n-indispensable à qui nous est nécessaire, pouvoir incessamment mesurer\r\n-son affection à la quantité de présence qu'elle nous donne, et se dire:\r\n-puisqu'elle me consacre tout son temps, c'est que j'ai tout son coeur;\r\n-voir la pensée à défaut de la figure, constater la fidélité d'un être\r\n-dans l'éclipse du monde, percevoir le frôlement d'une robe comme un\r\n-bruit d'ailes, l'entendre aller et venir, sortir, rentrer, parler,\r\n-chanter, et songer qu'on est le centre de ces pas, de cette parole, de\r\n-ce chant, manifester à chaque minute sa propre attraction, se sentir\r\n-d'autant plus puissant qu'on est plus infirme, devenir dans l'obscurité,\r\n-et par l'obscurité, l'astre autour duquel gravite cet ange, peu de\r\n-félicités égalent celle-là . Le suprême bonheur de la vie, c'est la\r\n-conviction qu'on est aimé; aimé pour soi-même, disons mieux, aimé malgré\r\n-soi-même; cette conviction, l'aveugle l'a. Dans cette détresse, être\r\n-servi, c'est être caressé. Lui manque-t-il quelque chose? Non. Ce n'est\r\n-point perdre la lumière qu'avoir l'amour. Et quel amour! un amour\r\n-entièrement fait de vertu. Il n'y a point de cécité où il y a certitude.\r\n-L'âme à tâtons cherche l'âme, et la trouve. Et cette âme trouvée et\r\n-prouvée est une femme. Une main vous soutient, c'est la sienne; une\r\n-bouche effleure votre front, c'est sa bouche; vous entendez une\r\n-respiration tout près de vous, c'est elle. Tout avoir d'elle, depuis son\r\n-culte jusqu'à sa pitié, n'être jamais quitté, avoir cette douce\r\n-faiblesse qui vous secourt, s'appuyer sur ce roseau inébranlable,\r\n-toucher de ses mains la providence et pouvoir la prendre dans ses bras,\r\n-Dieu palpable, quel ravissement! Le coeur, cette céleste fleur obscure,\r\n-entre dans un épanouissement mystérieux. On ne donnerait pas cette ombre\r\n-pour toute la clarté. L'âme ange est là , sans cesse là ; si elle\r\n-s'éloigne, c'est pour revenir; elle s'efface comme le rêve et reparaît\r\n-comme la réalité. On sent de la chaleur qui approche, la voilà . On\r\n-déborde de sérénité, de gaîté et d'extase; on est un rayonnement dans la\r\n-nuit. Et mille petits soins. Des riens qui sont énormes dans ce vide.\r\n-Les plus ineffables accents de la voix féminine employés à vous bercer,\r\n-et suppléant pour vous à l'univers évanoui. On est caressé avec de\r\n-l'âme. On ne voit rien, mais on se sent adoré. C'est un paradis de\r\n-ténèbres.\r\n-\r\n-C'est de ce paradis que monseigneur Bienvenu était passé à l'autre.\r\n-\r\n-L'annonce de sa mort fut reproduite par le journal local de\r\n-Montreuil-sur-mer. M. Madeleine parut le lendemain tout en noir avec un\r\n-crêpe à son chapeau.\r\n-\r\n-On remarqua dans la ville ce deuil, et l'on jasa. Cela parut une lueur\r\n-sur l'origine de M. Madeleine. On en conclut qu'il avait quelque\r\n-alliance avec le vénérable évêque. _Il drape pour l'évêque de Digne_,\r\n-dirent les salons; cela rehaussa fort M. Madeleine, et lui donna\r\n-subitement et d'emblée une certaine considération dans le monde noble de\r\n-Montreuil-sur-mer. Le microscopique faubourg Saint-Germain de l'endroit\r\n-songea à faire cesser la quarantaine de M. Madeleine, parent probable\r\n-d'un évêque. M. Madeleine s'aperçut de l'avancement qu'il obtenait à \r\n-plus de révérences des vieilles femmes et à plus de sourires des jeunes.\r\n-Un soir, une doyenne de ce petit grand monde-là , curieuse par droit\r\n-d'ancienneté, se hasarda à lui demander:\r\n-\r\n---Monsieur le maire est sans doute cousin du feu évêque de Digne?\r\n-\r\n-Il dit:\r\n-\r\n---Non, madame.\r\n-\r\n---Mais, reprit la douairière, vous en portez le deuil?\r\n-\r\n-Il répondit:\r\n-\r\n---C'est que dans ma jeunesse j'ai été laquais dans sa famille.\r\n-\r\n-Une remarque qu'on faisait encore, c'est que, chaque fois qu'il passait\r\n-dans la ville un jeune savoyard courant le pays et cherchant des\r\n-cheminées à ramoner, M. le maire le faisait appeler, lui demandait son\r\n-nom, et lui donnait de l'argent. Les petits savoyards se le disaient, et\r\n-il en passait beaucoup.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre V\r\n-\r\n-Vagues éclairs à l'horizon\r\n-\r\n-\r\n-Peu à peu, et avec le temps, toutes les oppositions étaient tombées. Il\r\n-y avait eu d'abord contre M. Madeleine, sorte de loi que subissent\r\n-toujours ceux qui s'élèvent, des noirceurs et des calomnies, puis ce ne\r\n-fut plus que des méchancetés, puis ce ne fut que des malices, puis cela\r\n-s'évanouit tout à fait; le respect devint complet, unanime, cordial, et\r\n-il arriva un moment, vers 1821, où ce mot: monsieur le maire, fut\r\n-prononcé à Montreuil-sur-mer presque du même accent que ce mot:\r\n-monseigneur l'évêque, était prononcé à Digne en 1815. On venait de dix\r\n-lieues à la ronde consulter M. Madeleine. Il terminait les différends,\r\n-il empêchait les procès, il réconciliait les ennemis. Chacun le prenait\r\n-pour juge de son bon droit. Il semblait qu'il eût pour âme le livre de\r\n-la loi naturelle. Ce fut comme une contagion de vénération qui, en six\r\n-ou sept ans et de proche en proche, gagna tout le pays.\r\n-\r\n-Un seul homme, dans la ville et dans l'arrondissement, se déroba\r\n-absolument à cette contagion, et, quoi que fît le père Madeleine, y\r\n-demeura rebelle, comme si une sorte d'instinct, incorruptible et\r\n-imperturbable, l'éveillait et l'inquiétait. Il semblerait en effet qu'il\r\n-existe dans certains hommes un véritable instinct bestial, pur et\r\n-intègre comme tout instinct, qui crée les antipathies et les sympathies,\r\n-qui sépare fatalement une nature d'une autre nature, qui n'hésite pas,\r\n-qui ne se trouble, ne se tait et ne se dément jamais, clair dans son\r\n-obscurité, infaillible, impérieux, réfractaire à tous les conseils de\r\n-l'intelligence et à tous les dissolvants de la raison, et qui, de\r\n-quelque façon que les destinées soient faites, avertit secrètement\r\n-l'homme-chien de la présence de l'homme-chat, et l'homme-renard de la\r\n-présence de l'homme-lion.\r\n-\r\n-Souvent, quand M. Madeleine passait dans une rue, calme, affectueux,\r\n-entouré des bénédictions de tous, il arrivait qu'un homme de haute\r\n-taille, vêtu d'une redingote gris de fer, armé d'une grosse canne et\r\n-coiffé d'un chapeau rabattu, se retournait brusquement derrière lui, et\r\n-le suivait des yeux jusqu'à ce qu'il eût disparu, croisant les bras,\r\n-secouant lentement la tête, et haussant sa lèvre supérieure avec sa\r\n-lèvre inférieure jusqu'à son nez, sorte de grimace significative qui\r\n-pourrait se traduire par: «Mais qu'est-ce que c'est que cet\r\n-homme-là ?--Pour sûr je l'ai vu quelque part.--En tout cas, je ne suis\r\n-toujours pas sa dupe.»\r\n-\r\n-Ce personnage, grave d'une gravité presque menaçante, était de ceux qui,\r\n-même rapidement entrevus, préoccupent l'observateur.\r\n-\r\n-Il se nommait Javert, et il était de la police.\r\n-\r\n-Il remplissait à Montreuil-sur-mer les fonctions pénibles, mais utiles,\r\n-d'inspecteur. Il n'avait pas vu les commencements de Madeleine. Javert\r\n-devait le poste qu'il occupait à la protection de M. Chabouillet, le\r\n-secrétaire du ministre d'État, comte Anglès, alors préfet de police à \r\n-Paris. Quand Javert était arrivé à Montreuil-sur-mer, la fortune du\r\n-grand manufacturier était déjà faite, et le père Madeleine était devenu\r\n-monsieur Madeleine.\r\n-\r\n-Certains officiers de police ont une physionomie à part et qui se\r\n-complique d'un air de bassesse mêlé à un air d'autorité. Javert avait\r\n-cette physionomie, moins la bassesse.\r\n-\r\n-Dans notre conviction, si les âmes étaient visibles aux yeux, on verrait\r\n-distinctement cette chose étrange que chacun des individus de l'espèce\r\n-humaine correspond à quelqu'une des espèces de la création animale; et\r\n-l'on pourrait reconnaître aisément cette vérité à peine entrevue par le\r\n-penseur, que, depuis l'huître jusqu'à l'aigle, depuis le porc jusqu'au\r\n-tigre, tous les animaux sont dans l'homme et que chacun d'eux est dans\r\n-un homme. Quelquefois même plusieurs d'entre eux à la fois.\r\n-\r\n-Les animaux ne sont autre chose que les figures de nos vertus et de nos\r\n-vices, errantes devant nos yeux, les fantômes visibles de nos âmes. Dieu\r\n-nous les montre pour nous faire réfléchir. Seulement, comme les animaux\r\n-ne sont que des ombres, Dieu ne les a point faits éducables dans le sens\r\n-complet du mot; à quoi bon? Au contraire, nos âmes étant des réalités et\r\n-ayant une fin qui leur est propre, Dieu leur a donné l'intelligence,\r\n-c'est-à -dire l'éducation possible. L'éducation sociale bien faite peut\r\n-toujours tirer d'une âme, quelle qu'elle soit, l'utilité qu'elle\r\n-contient.\r\n-\r\n-Ceci soit dit, bien entendu, au point de vue restreint de la vie\r\n-terrestre apparente, et sans préjuger la question profonde de la\r\n-personnalité antérieure et ultérieure des êtres qui ne sont pas l'homme.\r\n-Le moi visible n'autorise en aucune façon le penseur à nier le moi\r\n-latent. Cette réserve faite, passons.\r\n-\r\n-Maintenant, si l'on admet un moment avec nous que dans tout homme il y a\r\n-une des espèces animales de la création, il nous sera facile de dire ce\r\n-que c'était que l'officier de paix Javert.\r\n-\r\n-Les paysans asturiens sont convaincus que dans toute portée de louve il\r\n-y a un chien, lequel est tué par la mère, sans quoi en grandissant il\r\n-dévorerait les autres petits.\r\n-\r\n-Donnez une face humaine à ce chien fils d'une louve, et ce sera Javert.\r\n-\r\n-Javert était né dans une prison d'une tireuse de cartes dont le mari\r\n-était aux galères. En grandissant, il pensa qu'il était en dehors de la\r\n-société et désespéra d'y rentrer jamais. Il remarqua que la société\r\n-maintient irrémissiblement en dehors d'elle deux classes d'hommes, ceux\r\n-qui l'attaquent et ceux qui la gardent; il n'avait le choix qu'entre ces\r\n-deux classes; en même temps il se sentait je ne sais quel fond de\r\n-rigidité, de régularité et de probité, compliqué d'une inexprimable\r\n-haine pour cette race de bohèmes dont il était. Il entra dans la police.\r\n-\r\n-Il y réussit. À quarante ans il était inspecteur.\r\n-\r\n-Il avait dans sa jeunesse été employé dans les chiourmes du midi.\r\n-\r\n-Avant d'aller plus loin, entendons-nous sur ce mot face humaine que nous\r\n-appliquions tout à l'heure à Javert.\r\n-\r\n-La face humaine de Javert consistait en un nez camard, avec deux\r\n-profondes narines vers lesquelles montaient sur ses deux joues d'énormes\r\n-favoris. On se sentait mal à l'aise la première fois qu'on voyait ces\r\n-deux forêts et ces deux cavernes. Quand Javert riait, ce qui était rare\r\n-et terrible, ses lèvres minces s'écartaient, et laissaient voir, non\r\n-seulement ses dents, mais ses gencives, et il se faisait autour de son\r\n-nez un plissement épaté et sauvage comme sur un mufle de bête fauve.\r\n-Javert sérieux était un dogue; lorsqu'il riait, c'était un tigre. Du\r\n-reste, peu de crâne, beaucoup de mâchoire, les cheveux cachant le front\r\n-et tombant sur les sourcils, entre les deux yeux un froncement central\r\n-permanent comme une étoile de colère, le regard obscur, la bouche pincée\r\n-et redoutable, l'air du commandement féroce.\r\n-\r\n-Cet homme était composé de deux sentiments très simples, et relativement\r\n-très bons, mais qu'il faisait presque mauvais à force de les exagérer:\r\n-le respect de l'autorité, la haine de la rébellion; et à ses yeux le\r\n-vol, le meurtre, tous les crimes, n'étaient que des formes de la\r\n-rébellion. Il enveloppait dans une sorte de foi aveugle et profonde tout\r\n-ce qui a une fonction dans l'État, depuis le premier ministre jusqu'au\r\n-garde champêtre. Il couvrait de mépris, d'aversion et de dégoût tout ce\r\n-qui avait franchi une fois le seuil légal du mal. Il était absolu et\r\n-n'admettait pas d'exceptions. D'une part il disait:\r\n-\r\n---Le fonctionnaire ne peut se tromper; le magistrat n'a jamais tort.\r\n-\r\n-D'autre part il disait:\r\n-\r\n---Ceux-ci sont irrémédiablement perdus. Rien de bon n'en peut sortir.\r\n-\r\n-Il partageait pleinement l'opinion de ces esprits extrêmes qui\r\n-attribuent à la loi humaine je ne sais quel pouvoir de faire ou, si l'on\r\n-veut, de constater des damnés, et qui mettent un Styx au bas de la\r\n-société. Il était stoïque, sérieux, austère; rêveur triste; humble et\r\n-hautain comme les fanatiques. Son regard était une vrille. Cela était\r\n-froid et cela perçait. Toute sa vie tenait dans ces deux mots: veiller\r\n-et surveiller. Il avait introduit la ligne droite dans ce qu'il y a de\r\n-plus tortueux au monde; il avait la conscience de son utilité, la\r\n-religion de ses fonctions, et il était espion comme on est prêtre.\r\n-Malheur à qui tombait sous sa main! Il eût arrêté son père s'évadant du\r\n-bagne et dénoncé sa mère en rupture de ban. Et il l'eût fait avec cette\r\n-sorte de satisfaction intérieure que donne la vertu. Avec cela une vie\r\n-de privations, l'isolement, l'abnégation, la chasteté, jamais une\r\n-distraction. C'était le devoir implacable, la police comprise comme les\r\n-Spartiates comprenaient Sparte, un guet impitoyable, une honnêteté\r\n-farouche, un mouchard marmoréen, Brutus dans Vidocq.\r\n-\r\n-Toute la personne de Javert exprimait l'homme qui épie et qui se dérobe.\r\n-L'école mystique de Joseph de Maistre, laquelle à cette époque\r\n-assaisonnait de haute cosmogonie ce qu'on appelait les journaux ultras,\r\n-n'eût pas manqué de dire que Javert était un symbole. On ne voyait pas\r\n-son front qui disparaissait sous son chapeau, on ne voyait pas ses yeux\r\n-qui se perdaient sous ses sourcils, on ne voyait pas son menton qui\r\n-plongeait dans sa cravate, on ne voyait pas ses mains qui rentraient\r\n-dans ses manches, on ne voyait pas sa canne qu'il portait sous sa\r\n-redingote. Mais l'occasion venue, on voyait tout à coup sortir de toute\r\n-cette ombre, comme d'une embuscade, un front anguleux et étroit, un\r\n-regard funeste, un menton menaçant, des mains énormes; et un gourdin\r\n-monstrueux.\r\n-\r\n-À ses moments de loisir, qui étaient peu fréquents, tout en haïssant les\r\n-livres, il lisait; ce qui fait qu'il n'était pas complètement illettré.\r\n-Cela se reconnaissait à quelque emphase dans la parole.\r\n-\r\n-Il n'avait aucun vice, nous l'avons dit. Quand il était content de lui,\r\n-il s'accordait une prise de tabac. Il tenait à l'humanité par là .\r\n-\r\n-On comprendra sans peine que Javert était l'effroi de toute cette classe\r\n-que la statistique annuelle du ministère de la justice désigne sous la\r\n-rubrique: _Gens sans aveu_. Le nom de Javert prononcé les mettait en\r\n-déroute; la face de Javert apparaissant les pétrifiait.\r\n-\r\n-Tel était cet homme formidable.\r\n-\r\n-Javert était comme un oeil toujours fixé sur M. Madeleine. Oeil plein de\r\n-soupçon et de conjectures. M. Madeleine avait fini par s'en apercevoir,\r\n-mais il sembla que cela fût insignifiant pour lui. Il ne fit pas même\r\n-une question à Javert, il ne le cherchait ni ne l'évitait, et il\r\n-portait, sans paraître y faire attention, ce regard gênant et presque\r\n-pesant. Il traitait Javert comme tout le monde, avec aisance et bonté.\r\n-\r\n-À quelques paroles échappées à Javert, on devinait qu'il avait recherché\r\n-secrètement, avec cette curiosité qui tient à la race et où il entre\r\n-autant d'instinct que de volonté, toutes les traces antérieures que le\r\n-père Madeleine avait pu laisser ailleurs. Il paraissait savoir, et il\r\n-disait parfois à mots couverts, que quelqu'un avait pris certaines\r\n-informations dans un certain pays sur une certaine famille disparue. Une\r\n-fois il lui arriva de dire, se parlant à lui-même:\r\n-\r\n---Je crois que je le tiens!\r\n-\r\n-Puis il resta trois jours pensif sans prononcer une parole. Il paraît\r\n-que le fil qu'il croyait tenir s'était rompu. Du reste, et ceci est le\r\n-correctif nécessaire à ce que le sens de certains mots pourrait\r\n-présenter de trop absolu, il ne peut y avoir rien de vraiment\r\n-infaillible dans une créature humaine, et le propre de l'instinct est\r\n-précisément de pouvoir être troublé, dépisté et dérouté. Sans quoi il\r\n-serait supérieur à l'intelligence, et la bête se trouverait avoir une\r\n-meilleure lumière que l'homme.\r\n-\r\n-Javert était évidemment quelque peu déconcerté par le complet naturel et\r\n-la tranquillité de M. Madeleine.\r\n-\r\n-Un jour pourtant son étrange manière d'être parut faire impression sur\r\n-M. Madeleine. Voici à quelle occasion.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VI\r\n-\r\n-Le père Fauchelevent\r\n-\r\n-\r\n-M. Madeleine passait un matin dans une ruelle non pavée de\r\n-Montreuil-sur-mer. Il entendit du bruit et vit un groupe à quelque\r\n-distance. Il y alla. Un vieux homme, nommé le père Fauchelevent, venait\r\n-de tomber sous sa charrette dont le cheval s'était abattu.\r\n-\r\n-Ce Fauchelevent était un des rares ennemis qu'eût encore M. Madeleine à \r\n-cette époque. Lorsque Madeleine était arrivé dans le pays, Fauchelevent,\r\n-ancien tabellion et paysan presque lettré, avait un commerce qui\r\n-commençait à aller mal. Fauchelevent avait vu ce simple ouvrier qui\r\n-s'enrichissait, tandis que lui, maître, se ruinait. Cela l'avait rempli\r\n-de jalousie, et il avait fait ce qu'il avait pu en toute occasion pour\r\n-nuire à Madeleine. Puis la faillite était venue, et, vieux, n'ayant plus\r\n-à lui qu'une charrette et un cheval, sans famille et sans enfants du\r\n-reste, pour vivre il s'était fait charretier.\r\n-\r\n-Le cheval avait les deux cuisses cassées et ne pouvait se relever. Le\r\n-vieillard était engagé entre les roues. La chute avait été tellement\r\n-malheureuse que toute la voiture pesait sur sa poitrine. La charrette\r\n-était assez lourdement chargée. Le père Fauchelevent poussait des râles\r\n-lamentables. On avait essayé de le tirer, mais en vain. Un effort\r\n-désordonné, une aide maladroite, une secousse à faux pouvaient\r\n-l'achever. Il était impossible de le dégager autrement qu'en soulevant\r\n-la voiture par-dessous. Javert, qui était survenu au moment de\r\n-l'accident, avait envoyé chercher un cric.\r\n-\r\n-M. Madeleine arriva. On s'écarta avec respect.\r\n-\r\n---À l'aide! criait le vieux Fauchelevent. Qui est-ce qui est bon enfant\r\n-pour sauver le vieux?\r\n-\r\n-M. Madeleine se tourna vers les assistants:\r\n-\r\n---A-t-on un cric?\r\n-\r\n---On en est allé quérir un, répondit un paysan.\r\n-\r\n---Dans combien de temps l'aura-t-on?\r\n-\r\n---On est allé au plus près, au lieu Flachot, où il y a un maréchal; mais\r\n-c'est égal, il faudra bien un bon quart d'heure.\r\n-\r\n---Un quart d'heure! s'écria Madeleine.\r\n-\r\n-Il avait plu la veille, le sol était détrempé, la charrette s'enfonçait\r\n-dans la terre à chaque instant et comprimait de plus en plus la poitrine\r\n-du vieux charretier. Il était évident qu'avant cinq minutes il aurait\r\n-les côtes brisées.\r\n-\r\n---Il est impossible d'attendre un quart d'heure, dit Madeleine aux\r\n-paysans qui regardaient.\r\n-\r\n---Il faut bien!\r\n-\r\n---Mais il ne sera plus temps! Vous ne voyez donc pas que la charrette\r\n-s'enfonce?\r\n-\r\n---Dame!\r\n-\r\n---Écoutez, reprit Madeleine, il y a encore assez de place sous la\r\n-voiture pour qu'un homme s'y glisse et la soulève avec son dos. Rien\r\n-qu'une demi-minute, et l'on tirera le pauvre homme. Y a-t-il ici\r\n-quelqu'un qui ait des reins et du coeur? Cinq louis d'or à gagner!\r\n-\r\n-Personne ne bougea dans le groupe.\r\n-\r\n---Dix louis, dit Madeleine.\r\n-\r\n-Les assistants baissaient les yeux. Un d'eux murmura:\r\n-\r\n---Il faudrait être diablement fort. Et puis, on risque de se faire\r\n-écraser!\r\n-\r\n---Allons! recommença Madeleine, vingt louis! Même silence.\r\n-\r\n---Ce n'est pas la bonne volonté qui leur manque, dit une voix.\r\n-\r\n-M. Madeleine se retourna, et reconnut Javert. Il ne l'avait pas aperçu\r\n-en arrivant. Javert continua:\r\n-\r\n---C'est la force. Il faudrait être un terrible homme pour faire la chose\r\n-de lever une voiture comme cela sur son dos.\r\n-\r\n-Puis, regardant fixement M. Madeleine, il poursuivit en appuyant sur\r\n-chacun des mots qu'il prononçait:\r\n-\r\n---Monsieur Madeleine, je n'ai jamais connu qu'un seul homme capable de\r\n-faire ce que vous demandez là .\r\n-\r\n-Madeleine tressaillit.\r\n-\r\n-Javert ajouta avec un air d'indifférence, mais sans quitter des yeux\r\n-Madeleine:\r\n-\r\n---C'était un forçat.\r\n-\r\n---Ah! dit Madeleine.\r\n-\r\n---Du bagne de Toulon.\r\n-\r\n-Madeleine devint pâle.\r\n-\r\n-Cependant la charrette continuait à s'enfoncer lentement. Le père\r\n-Fauchelevent râlait et hurlait:\r\n-\r\n---J'étouffe! Ça me brise les côtes! Un cric! quelque chose! Ah!\r\n-\r\n-Madeleine regarda autour de lui:\r\n-\r\n---Il n'y a donc personne qui veuille gagner vingt louis et sauver la vie\r\n-à ce pauvre vieux?\r\n-\r\n-Aucun des assistants ne remua. Javert reprit:\r\n-\r\n---Je n'ai jamais connu qu'un homme qui pût remplacer un cric. C'était ce\r\n-forçat.\r\n-\r\n---Ah! voilà que ça m'écrase! cria le vieillard.\r\n-\r\n-Madeleine leva la tête, rencontra l'oeil de faucon de Javert toujours\r\n-attaché sur lui, regarda les paysans immobiles, et sourit tristement.\r\n-Puis, sans dire une parole, il tomba à genoux, et avant même que la\r\n-foule eût eu le temps de jeter un cri, il était sous la voiture.\r\n-\r\n-Il y eut un affreux moment d'attente et de silence.\r\n-\r\n-On vit Madeleine presque à plat ventre sous ce poids effrayant essayer\r\n-deux fois en vain de rapprocher ses coudes de ses genoux. On lui cria:\r\n-\r\n---Père Madeleine! retirez-vous de là !\r\n-\r\n-Le vieux Fauchelevent lui-même lui dit:\r\n-\r\n---Monsieur Madeleine! allez-vous-en! C'est qu'il faut que je meure,\r\n-voyez-vous! Laissez-moi! Vous allez vous faire écraser aussi!\r\n-\r\n-Madeleine ne répondit pas.\r\n-\r\n-Les assistants haletaient. Les roues avaient continué de s'enfoncer, et\r\n-il était déjà devenu presque impossible que Madeleine sortît de dessous\r\n-la voiture.\r\n-\r\n-Tout à coup on vit l'énorme masse s'ébranler, la charrette se soulevait\r\n-lentement, les roues sortaient à demi de l'ornière. On entendit une voix\r\n-étouffée qui criait:\r\n-\r\n---Dépêchez-vous! aidez!\r\n-\r\n-C'était Madeleine qui venait de faire un dernier effort.\r\n-\r\n-Ils se précipitèrent. Le dévouement d'un seul avait donné de la force et\r\n-du courage à tous. La charrette fut enlevée par vingt bras. Le vieux\r\n-Fauchelevent était sauvé.\r\n-\r\n-Madeleine se releva. Il était blême, quoique ruisselant de sueur. Ses\r\n-habits étaient déchirés et couverts de boue. Tous pleuraient. Le\r\n-vieillard lui baisait les genoux et l'appelait le bon Dieu. Lui, il\r\n-avait sur le visage je ne sais quelle expression de souffrance heureuse\r\n-et céleste, et il fixait son oeil tranquille sur Javert qui le regardait\r\n-toujours.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VII\r\n-\r\n-Fauchelevent devient jardinier à Paris\r\n-\r\n-\r\n-Fauchelevent s'était démis la rotule dans sa chute. Le père Madeleine le\r\n-fit transporter dans une infirmerie qu'il avait établie pour ses\r\n-ouvriers dans le bâtiment même de sa fabrique et qui était desservie par\r\n-deux soeurs de charité. Le lendemain matin, le vieillard trouva un\r\n-billet de mille francs sur sa table de nuit, avec ce mot de la main du\r\n-père Madeleine: _Je vous achète votre charrette et votre cheval_. La\r\n-charrette était brisée et le cheval était mort. Fauchelevent guérit,\r\n-mais son genou resta ankylosé. M. Madeleine, par les recommandations des\r\n-soeurs et de son curé, fit placer le bonhomme comme jardinier dans un\r\n-couvent de femmes du quartier Saint-Antoine à Paris.\r\n-\r\n-Quelque temps après, M. Madeleine fut nommé maire. La première fois que\r\n-Javert vit M. Madeleine revêtu de l'écharpe qui lui donnait toute\r\n-autorité sur la ville, il éprouva cette sorte de frémissement\r\n-qu'éprouverait un dogue qui flairerait un loup sous les habits de son\r\n-maître. À partir de ce moment, il l'évita le plus qu'il put. Quand les\r\n-besoins du service l'exigeaient impérieusement et qu'il ne pouvait faire\r\n-autrement que de se trouver avec M. le maire, il lui parlait avec un\r\n-respect profond.\r\n-\r\n-Cette prospérité créée à Montreuil-sur-mer par le père Madeleine avait,\r\n-outre les signes visibles que nous avons indiqués, un autre symptôme\r\n-qui, pour n'être pas visible, n'était pas moins significatif. Ceci ne\r\n-trompe jamais.\r\n-\r\n-Quand la population souffre, quand le travail manque, quand le commerce\r\n-est nul, le contribuable résiste à l'impôt par pénurie, épuise et\r\n-dépasse les délais, et l'état dépense beaucoup d'argent en frais de\r\n-contrainte et de rentrée. Quand le travail abonde, quand le pays est\r\n-heureux et riche, l'impôt se paye aisément et coûte peu à l'état. On\r\n-peut dire que la misère et la richesse publiques ont un thermomètre\r\n-infaillible, les frais de perception de l'impôt. En sept ans, les frais\r\n-de perception de l'impôt s'étaient réduits des trois quarts dans\r\n-l'arrondissement de Montreuil-sur-mer, ce qui faisait fréquemment citer\r\n-cet arrondissement entre tous par M. de Villèle, alors ministre des\r\n-finances.\r\n-\r\n-Telle était la situation du pays, lorsque Fantine y revint. Personne ne\r\n-se souvenait plus d'elle. Heureusement la porte de la fabrique de M.\r\n-Madeleine était comme un visage ami. Elle s'y présenta, et fut admise\r\n-dans l'atelier des femmes. Le métier était tout nouveau pour Fantine,\r\n-elle n'y pouvait être bien adroite, elle ne tirait donc de sa journée de\r\n-travail que peu de chose, mais enfin cela suffisait, le problème était\r\n-résolu, elle gagnait sa vie.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VIII\r\n-\r\n-Madame Victurnien dépense trente-cinq francs pour la morale\r\n-\r\n-\r\n-Quand Fantine vit qu'elle vivait, elle eut un moment de joie. Vivre\r\n-honnêtement de son travail, quelle grâce du ciel! Le goût du travail lui\r\n-revint vraiment. Elle acheta un miroir, se réjouit d'y regarder sa\r\n-jeunesse, ses beaux cheveux et ses belles dents, oublia beaucoup de\r\n-choses, ne songea plus qu'à sa Cosette et à l'avenir possible, et fut\r\n-presque heureuse. Elle loua une petite chambre et la meubla à crédit sur\r\n-son travail futur; reste de ses habitudes de désordre.\r\n-\r\n-Ne pouvant pas dire qu'elle était mariée, elle s'était bien gardée,\r\n-comme nous l'avons déjà fait entrevoir, de parler de sa petite fille.\r\n-\r\n-En ces commencements, on l'a vu, elle payait exactement les Thénardier.\r\n-Comme elle ne savait que signer, elle était obligée de leur écrire par\r\n-un écrivain public.\r\n-\r\n-Elle écrivait souvent. Cela fut remarqué. On commença à dire tout bas\r\n-dans l'atelier des femmes que Fantine «écrivait des lettres» et qu'«elle\r\n-avait des allures».\r\n-\r\n-Il n'y a rien de tel pour épier les actions des gens que ceux qu'elles\r\n-ne regardent pas.--Pourquoi ce monsieur ne vient-il jamais qu'à la\r\n-brune? pourquoi monsieur un tel n'accroche-t-il jamais sa clef au clou\r\n-le jeudi? pourquoi prend-il toujours les petites rues? pourquoi madame\r\n-descend-elle toujours de son fiacre avant d'arriver à la maison?\r\n-pourquoi envoie-t-elle acheter un cahier de papier à lettres, quand elle\r\n-en a «plein sa papeterie?» etc., etc.--Il existe des êtres qui, pour\r\n-connaître le mot de ces énigmes, lesquelles leur sont du reste\r\n-parfaitement indifférentes, dépensent plus d'argent, prodiguent plus de\r\n-temps, se donnent plus de peine qu'il n'en faudrait pour dix bonnes\r\n-actions; et cela, gratuitement, pour le plaisir, sans être payés de la\r\n-curiosité autrement que par la curiosité. Ils suivront celui-ci ou\r\n-celle-là des jours entiers, feront faction des heures à des coins de\r\n-rue, sous des portes d'allées, la nuit, par le froid et par la pluie,\r\n-corrompront des commissionnaires, griseront des cochers de fiacre et des\r\n-laquais, achèteront une femme de chambre, feront acquisition d'un\r\n-portier. Pourquoi? pour rien. Pur acharnement de voir, de savoir et de\r\n-pénétrer. Pure démangeaison de dire. Et souvent ces secrets connus, ces\r\n-mystères publiés, ces énigmes éclairées du grand jour, entraînent des\r\n-catastrophes, des duels, des faillites, des familles ruinées, des\r\n-existences brisées, à la grande joie de ceux qui ont «tout découvert»\r\n-sans intérêt et par pur instinct. Chose triste.\r\n-\r\n-Certaines personnes sont méchantes uniquement par besoin de parler. Leur\r\n-conversation, causerie dans le salon, bavardage dans l'antichambre, est\r\n-comme ces cheminées qui usent vite le bois; il leur faut beaucoup de\r\n-combustible; et le combustible, c'est le prochain.\r\n-\r\n-On observa donc Fantine.\r\n-\r\n-Avec cela, plus d'une était jalouse de ses cheveux blonds et de ses\r\n-dents blanches. On constata que dans l'atelier, au milieu des autres,\r\n-elle se détournait souvent pour essuyer une larme. C'étaient les moments\r\n-où elle songeait à son enfant; peut-être aussi à l'homme qu'elle avait\r\n-aimé.\r\n-\r\n-C'est un douloureux labeur que la rupture des sombres attaches du passé.\r\n-\r\n-On constata qu'elle écrivait, au moins deux fois par mois, toujours à la\r\n-même adresse, et qu'elle affranchissait la lettre. On parvint à se\r\n-procurer l'adresse: _Monsieur, Monsieur Thénardier, aubergiste, à \r\n-Montfermeil_. On fit jaser au cabaret l'écrivain public, vieux bonhomme\r\n-qui ne pouvait pas emplir son estomac de vin rouge sans vider sa poche\r\n-aux secrets. Bref, on sut que Fantine avait un enfant. «Ce devait être\r\n-une espèce de fille.» Il se trouva une commère qui fit le voyage de\r\n-Montfermeil, parla aux Thénardier, et dit à son retour: «Pour mes\r\n-trente-cinq francs, j'en ai eu le coeur net. J'ai vu l'enfant!»\r\n-\r\n-La commère qui fit cela était une gorgone appelée madame Victurnien,\r\n-gardienne et portière de la vertu de tout le monde. Madame Victurnien\r\n-avait cinquante-six ans, et doublait le masque de la laideur du masque\r\n-de la vieillesse. Voix chevrotante, esprit capricant. Cette vieille\r\n-femme avait été jeune, chose étonnante. Dans sa jeunesse, en plein 93,\r\n-elle avait épousé un moine échappé du cloître en bonnet rouge et passé\r\n-des bernardins aux jacobins. Elle était sèche, rêche, revêche, pointue,\r\n-épineuse, presque venimeuse; tout en se souvenant de son moine dont elle\r\n-était veuve, et qui l'avait fort domptée et pliée. C'était une ortie où\r\n-l'on voyait le froissement du froc. À la restauration, elle s'était\r\n-faite bigote, et si énergiquement que les prêtres lui avaient pardonné\r\n-son moine. Elle avait un petit bien qu'elle léguait bruyamment à une\r\n-communauté religieuse. Elle était fort bien vue à l'évêché d'Arras.\r\n-Cette madame Victurnien donc alla à Montfermeil, et revint en disant:\r\n-«J'ai vu l'enfant».\r\n-\r\n-Tout cela prit du temps. Fantine était depuis plus d'un an à la\r\n-fabrique, lorsqu'un matin la surveillante de l'atelier lui remit, de la\r\n-part de M. le maire, cinquante francs, en lui disant qu'elle ne faisait\r\n-plus partie de l'atelier et en l'engageant, de la part de M. le maire, à \r\n-quitter le pays.\r\n-\r\n-C'était précisément dans ce même mois que les Thénardier, après avoir\r\n-demandé douze francs au lieu de six, venaient d'exiger quinze francs au\r\n-lieu de douze.\r\n-\r\n-Fantine fut atterrée. Elle ne pouvait s'en aller du pays, elle devait\r\n-son loyer et ses meubles. Cinquante francs ne suffisaient pas pour\r\n-acquitter cette dette. Elle balbutia quelques mots suppliants. La\r\n-surveillante lui signifia qu'elle eût à sortir sur-le-champ de\r\n-l'atelier. Fantine n'était du reste qu'une ouvrière médiocre. Accablée\r\n-de honte plus encore que de désespoir, elle quitta l'atelier et rentra\r\n-dans sa chambre. Sa faute était donc maintenant connue de tous!\r\n-\r\n-Elle ne se sentit plus la force de dire un mot. On lui conseilla de voir\r\n-M. le maire; elle n'osa pas. M. le maire lui donnait cinquante francs,\r\n-parce qu'il était bon, et la chassait, parce qu'il était juste. Elle\r\n-plia sous cet arrêt.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IX\r\n-\r\n-Succès de Madame Victurnien\r\n-\r\n-\r\n-La veuve du moine fut donc bonne à quelque chose.\r\n-\r\n-Du reste, M. Madeleine n'avait rien su de tout cela. Ce sont là de ces\r\n-combinaisons d'événements dont la vie est pleine. M. Madeleine avait\r\n-pour habitude de n'entrer presque jamais dans l'atelier des femmes. Il\r\n-avait mis à la tête de cet atelier une vieille fille, que le curé lui\r\n-avait donnée, et il avait toute confiance dans cette surveillante,\r\n-personne vraiment respectable, ferme, équitable, intègre, remplie de la\r\n-charité qui consiste à donner, mais n'ayant pas au même degré la charité\r\n-qui consiste à comprendre et à pardonner. M. Madeleine se remettait de\r\n-tout sur elle. Les meilleurs hommes sont souvent forcés de déléguer leur\r\n-autorité. C'est dans cette pleine puissance et avec la conviction\r\n-qu'elle faisait bien, que la surveillante avait instruit le procès,\r\n-jugé, condamné et exécuté Fantine.\r\n-\r\n-Quant aux cinquante francs, elle les avait donnés sur une somme que M.\r\n-Madeleine lui confiait pour aumônes et secours aux ouvrières et dont\r\n-elle ne rendait pas compte.\r\n-\r\n-Fantine s'offrit comme servante dans le pays; elle alla d'une maison à \r\n-l'autre. Personne ne voulut d'elle. Elle n'avait pu quitter la ville. Le\r\n-marchand fripier auquel elle devait ses meubles, quels meubles! lui\r\n-avait dit: «Si vous vous en allez, je vous fais arrêter comme voleuse.»\r\n-Le propriétaire auquel elle devait son loyer, lui avait dit:\r\n-\r\n-«Vous êtes jeune et jolie, vous pouvez payer.» Elle partagea les\r\n-cinquante francs entre le propriétaire et le fripier, rendit au marchand\r\n-les trois quarts de son mobilier, ne garda que le nécessaire, et se\r\n-trouva sans travail, sans état, n'ayant plus que son lit, et devant\r\n-encore environ cent francs.\r\n-\r\n-Elle se mit à coudre de grosses chemises pour les soldats de la\r\n-garnison, et gagnait douze sous par jour. Sa fille lui en coûtait dix.\r\n-C'est en ce moment qu'elle commença à mal payer les Thénardier.\r\n-\r\n-Cependant une vieille femme qui lui allumait sa chandelle quand elle\r\n-rentrait le soir, lui enseigna l'art de vivre dans la misère. Derrière\r\n-vivre de peu, il y a vivre de rien. Ce sont deux chambres; la première\r\n-est obscure, la seconde est noire.\r\n-\r\n-Fantine apprit comment on se passe tout à fait de feu en hiver, comment\r\n-on renonce à un oiseau qui vous mange un liard de millet tous les deux\r\n-jours, comment on fait de son jupon sa couverture et de sa couverture\r\n-son jupon, comment on ménage sa chandelle en prenant son repas à la\r\n-lumière de la fenêtre d'en face. On ne sait pas tout ce que certains\r\n-êtres faibles, qui ont vieilli dans le dénûment et l'honnêteté, savent\r\n-tirer d'un sou. Cela finit par être un talent. Fantine acquit ce sublime\r\n-talent et reprit un peu de courage.\r\n-\r\n-À cette époque, elle disait à une voisine:\r\n-\r\n---Bah! je me dis: en ne dormant que cinq heures et en travaillant tout\r\n-le reste à mes coutures, je parviendrai bien toujours à gagner à peu\r\n-près du pain. Et puis, quand on est triste, on mange moins. Eh bien! des\r\n-souffrances, des inquiétudes, un peu de pain d'un côté, des chagrins de\r\n-l'autre, tout cela me nourrira.\r\n-\r\n-Dans cette détresse, avoir sa petite fille eût été un étrange bonheur.\r\n-Elle songea à la faire venir. Mais quoi! lui faire partager son\r\n-dénûment! Et puis, elle devait aux Thénardier! comment s'acquitter? Et\r\n-le voyage! comment le payer?\r\n-\r\n-La vieille qui lui avait donné ce qu'on pourrait appeler des leçons de\r\n-vie indigente était une sainte fille nommée Marguerite, dévote de la\r\n-bonne dévotion, pauvre, et charitable pour les pauvres et même pour les\r\n-riches, sachant tout juste assez écrire pour signer _Margueritte_, et\r\n-croyant en Dieu, ce qui est la science.\r\n-\r\n-Il y a beaucoup de ces vertus-là en bas; un jour elles seront en haut.\r\n-Cette vie a un lendemain.\r\n-\r\n-Dans les premiers temps, Fantine avait été si honteuse qu'elle n'avait\r\n-pas osé sortir. Quand elle était dans la rue, elle devinait qu'on se\r\n-retournait derrière elle et qu'on la montrait du doigt; tout le monde la\r\n-regardait et personne ne la saluait; le mépris âcre et froid des\r\n-passants lui pénétrait dans la chair et dans l'âme comme une bise.\r\n-\r\n-Dans les petites villes, il semble qu'une malheureuse soit nue sous les\r\n-sarcasmes et la curiosité de tous. À Paris, du moins, personne ne vous\r\n-connaît, et cette obscurité est un vêtement. Oh! comme elle eût souhaité\r\n-venir à Paris! Impossible.\r\n-\r\n-Il fallut bien s'accoutumer à la déconsidération, comme elle s'était\r\n-accoutumée à l'indigence. Peu à peu elle en prit son parti. Après deux\r\n-ou trois mois elle secoua la honte et se remit à sortir comme si de rien\r\n-n'était.\r\n-\r\n---Cela m'est bien égal, dit-elle.\r\n-\r\n-Elle alla et vint, la tête haute, avec un sourire amer, et sentit\r\n-qu'elle devenait effrontée.\r\n-\r\n-Madame Victurnien quelquefois la voyait passer de sa fenêtre, remarquait\r\n-la détresse de «cette créature», grâce à elle \u0022remise à sa place\u0022, et se\r\n-félicitait. Les méchants ont un bonheur noir.\r\n-\r\n-L'excès du travail fatiguait Fantine, et la petite toux sèche qu'elle\r\n-avait augmenta. Elle disait quelquefois à sa voisine Marguerite: «Tâtez\r\n-donc comme mes mains sont chaudes.»\r\n-\r\n-Cependant le matin, quand elle peignait avec un vieux peigne cassé ses\r\n-beaux cheveux qui ruisselaient comme de la soie floche, elle avait une\r\n-minute de coquetterie heureuse.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre X\r\n-\r\n-Suite du succès\r\n-\r\n-\r\n-Elle avait été congédiée vers la fin de l'hiver; l'été se passa, mais\r\n-l'hiver revint. Jours courts, moins de travail. L'hiver, point de\r\n-chaleur, point de lumière, point de midi, le soir touche au matin,\r\n-brouillard, crépuscule, la fenêtre est grise, on n'y voit pas clair. Le\r\n-ciel est un soupirail. Toute la journée est une cave. Le soleil a l'air\r\n-d'un pauvre. L'affreuse saison! L'hiver change en pierre l'eau du ciel\r\n-et le coeur de l'homme. Ses créanciers la harcelaient.\r\n-\r\n-Fantine gagnait trop peu. Ses dettes avaient grossi. Les Thénardier, mal\r\n-payés, lui écrivaient à chaque instant des lettres dont le contenu la\r\n-désolait et dont le port la ruinait. Un jour ils lui écrivirent que sa\r\n-petite Cosette était toute nue par le froid qu'il faisait, qu'elle avait\r\n-besoin d'une jupe de laine, et qu'il fallait au moins que la mère\r\n-envoyât dix francs pour cela. Elle reçut la lettre, et la froissa dans\r\n-ses mains tout le jour. Le soir elle entra chez un barbier qui habitait\r\n-le coin de la rue, et défit son peigne. Ses admirables cheveux blonds\r\n-lui tombèrent jusqu'aux reins.\r\n-\r\n---Les beaux cheveux! s'écria le barbier.\r\n-\r\n---Combien m'en donneriez-vous? dit-elle.\r\n-\r\n---Dix francs.\r\n-\r\n---Coupez-les.\r\n-\r\n-Elle acheta une jupe de tricot et l'envoya aux Thénardier.\r\n-\r\n-Cette jupe fit les Thénardier furieux. C'était de l'argent qu'ils\r\n-voulaient. Ils donnèrent la jupe à Eponine. La pauvre Alouette continua\r\n-de frissonner.\r\n-\r\n-Fantine pensa: «Mon enfant n'a plus froid. Je l'ai habillée de mes\r\n-cheveux.» Elle mettait de petits bonnets ronds qui cachaient sa tête\r\n-tondue et avec lesquels elle était encore jolie.\r\n-\r\n-Un travail ténébreux se faisait dans le coeur de Fantine. Quand elle vit\r\n-qu'elle ne pouvait plus se coiffer, elle commença à tout prendre en\r\n-haine autour d'elle. Elle avait longtemps partagé la vénération de tous\r\n-pour le père Madeleine; cependant, à force de se répéter que c'était lui\r\n-qui l'avait chassée, et qu'il était la cause de son malheur, elle en\r\n-vint à le haïr lui aussi, lui surtout. Quand elle passait devant la\r\n-fabrique aux heures où les ouvriers sont sur la porte, elle affectait de\r\n-rire et de chanter.\r\n-\r\n-Une vieille ouvrière qui la vit une fois chanter et rire de cette façon\r\n-dit:\r\n-\r\n---Voilà une fille qui finira mal.\r\n-\r\n-Elle prit un amant, le premier venu, un homme qu'elle n'aimait pas, par\r\n-bravade, avec la rage dans le coeur. C'était un misérable, une espèce de\r\n-musicien mendiant, un oisif gueux, qui la battait, et qui la quitta\r\n-comme elle l'avait pris, avec dégoût. Elle adorait son enfant.\r\n-\r\n-Plus elle descendait, plus tout devenait sombre autour d'elle plus ce\r\n-doux petit ange rayonnait dans le fond de son âme. Elle disait. Quand je\r\n-serai riche, j'aurai ma Cosette avec moi; et elle riait. La toux ne la\r\n-quittait pas, et elle avait des sueurs dans le dos.\r\n-\r\n-Un jour elle reçut des Thénardier une lettre ainsi conçue:\r\n-\r\n-«Cosette est malade d'une maladie qui est dans le pays. Une fièvre\r\n-miliaire, qu'ils appellent. Il faut des drogues chères. Cela nous ruine\r\n-et nous ne pouvons plus payer. Si vous ne nous envoyez pas quarante\r\n-francs avant huit jours, la petite est morte.»\r\n-\r\n-Elle se mit à rire aux éclats, et elle dit à sa vieille voisine:\r\n-\r\n---Ah! ils sont bons! quarante francs! que ça! ça fait deux napoléons! Où\r\n-veulent-ils que je les prenne? Sont-ils bêtes, ces paysans!\r\n-\r\n-Cependant elle alla dans l'escalier près d'une lucarne et relut la\r\n-lettre.\r\n-\r\n-Puis elle descendit l'escalier et sortit en courant et en sautant, riant\r\n-toujours. Quelqu'un qui la rencontra lui dit:\r\n-\r\n---Qu'est-ce que vous avez donc à être si gaie?\r\n-\r\n-Elle répondit:\r\n-\r\n---C'est une bonne bêtise que viennent de m'écrire des gens de la\r\n-campagne. Ils me demandent quarante francs. Paysans, va!\r\n-\r\n-Comme elle passait sur la place, elle vit beaucoup de monde qui\r\n-entourait une voiture de forme bizarre sur l'impériale de laquelle\r\n-pérorait tout debout un homme vêtu de rouge. C'était un bateleur\r\n-dentiste en tournée, qui offrait au public des râteliers complets, des\r\n-opiats, des poudres et des élixirs.\r\n-\r\n-Fantine se mêla au groupe et se mit à rire comme les autres de cette\r\n-harangue où il y avait de l'argot pour la canaille et du jargon pour les\r\n-gens comme il faut. L'arracheur de dents vit cette belle fille qui\r\n-riait, et s'écria tout à coup:\r\n-\r\n---Vous avez de jolies dents, la fille qui riez là . Si vous voulez me\r\n-vendre vos deux palettes, je vous donne de chaque un napoléon d'or.\r\n-\r\n---Qu'est-ce que c'est que ça, mes palettes? demanda Fantine.\r\n-\r\n---Les palettes, reprit le professeur dentiste, c'est les dents de\r\n-devant, les deux d'en haut.\r\n-\r\n---Quelle horreur! s'écria Fantine.\r\n-\r\n---Deux napoléons! grommela une vieille édentée qui était là . Qu'en voilà \r\n-une qui est heureuse!\r\n-\r\n-Fantine s'enfuit, et se boucha les oreilles pour ne pas entendre la voix\r\n-enrouée de l'homme qui lui criait: Réfléchissez, la belle! deux\r\n-napoléons, ça peut servir. Si le coeur vous en dit, venez ce soir à \r\n-l'auberge du _Tillac d'argent_, vous m'y trouverez.\r\n-\r\n-Fantine rentra, elle était furieuse et conta la chose à sa bonne voisine\r\n-Marguerite:\r\n-\r\n---Comprenez-vous cela? ne voilà -t-il pas un abominable homme? comment\r\n-laisse-t-on des gens comme cela aller dans le pays! M'arracher mes deux\r\n-dents de devant! mais je serais horrible! Les cheveux repoussent, mais\r\n-les dents! Ah! le monstre d'homme! j'aimerais mieux me jeter d'un\r\n-cinquième la tête la première sur le pavé! Il m'a dit qu'il serait ce\r\n-soir au _Tillac d'argent_.\r\n-\r\n---Et qu'est-ce qu'il offrait? demanda Marguerite.\r\n-\r\n---Deux napoléons.\r\n-\r\n---Cela fait quarante francs.\r\n-\r\n---Oui, dit Fantine, cela fait quarante francs.\r\n-\r\n-Elle resta pensive, et se mit à son ouvrage. Au bout d'un quart d'heure,\r\n-elle quitta sa couture et alla relire la lettre des Thénardier sur\r\n-l'escalier.\r\n-\r\n-En rentrant, elle dit à Marguerite qui travaillait près d'elle:\r\n-\r\n---Qu'est-ce que c'est donc que cela, une fièvre miliaire? Savez-vous?\r\n-\r\n---Oui, répondit la vieille fille, c'est une maladie.\r\n-\r\n---Ça a donc besoin de beaucoup de drogues?\r\n-\r\n---Oh! des drogues terribles.\r\n-\r\n---Où ça vous prend-il?\r\n-\r\n---C'est une maladie qu'on a comme ça.\r\n-\r\n---Cela attaque donc les enfants?\r\n-\r\n---Surtout les enfants.\r\n-\r\n---Est-ce qu'on en meurt?\r\n-\r\n---Très bien, dit Marguerite.\r\n-\r\n-Fantine sortit et alla encore une fois relire la lettre sur l'escalier.\r\n-\r\n-Le soir elle descendit, et on la vit qui se dirigeait du côté de la rue\r\n-de Paris où sont les auberges.\r\n-\r\n-Le lendemain matin, comme Marguerite entrait dans la chambre de Fantine\r\n-avant le jour, car elles travaillaient toujours ensemble et de cette\r\n-façon n'allumaient qu'une chandelle pour deux, elle trouva Fantine\r\n-assise sur son lit, pâle, glacée. Elle ne s'était pas couchée. Son\r\n-bonnet était tombé sur ses genoux. La chandelle avait brûlé toute la\r\n-nuit et était presque entièrement consumée.\r\n-\r\n-Marguerite s'arrêta sur le seuil, pétrifiée de cet énorme désordre, et\r\n-s'écria:\r\n-\r\n---Seigneur! la chandelle qui est toute brûlée! il s'est passé des\r\n-événements!\r\n-\r\n-Puis elle regarda Fantine qui tournait vers elle sa tête sans cheveux.\r\n-\r\n-Fantine depuis la veille avait vieilli de dix ans.\r\n-\r\n---Jésus! fit Marguerite, qu'est-ce que vous avez, Fantine?\r\n-\r\n---Je n'ai rien, répondit Fantine. Au contraire. Mon enfant ne mourra pas\r\n-de cette affreuse maladie, faute de secours. Je suis contente.\r\n-\r\n-En parlant ainsi, elle montrait à la vieille fille deux napoléons qui\r\n-brillaient sur la table.\r\n-\r\n---Ah, Jésus Dieu! dit Marguerite. Mais c'est une fortune! Où avez-vous\r\n-eu ces louis d'or?\r\n-\r\n---Je les ai eus, répondit Fantine.\r\n-\r\n-En même temps elle sourit. La chandelle éclairait son visage. C'était un\r\n-sourire sanglant. Une salive rougeâtre lui souillait le coin des lèvres,\r\n-et elle avait un trou noir dans la bouche.\r\n-\r\n-Les deux dents étaient arrachées.\r\n-\r\n-Elle envoya les quarante francs à Montfermeil.\r\n-\r\n-Du reste c'était une ruse des Thénardier pour avoir de l'argent. Cosette\r\n-n'était pas malade.\r\n-\r\n-Fantine jeta son miroir par la fenêtre. Depuis longtemps elle avait\r\n-quitté sa cellule du second pour une mansarde fermée d'un loquet sous le\r\n-toit; un de ces galetas dont le plafond fait angle avec le plancher et\r\n-vous heurte à chaque instant la tête. Le pauvre ne peut aller au fond de\r\n-sa chambre comme au fond de sa destinée qu'en se courbant de plus en\r\n-plus. Elle n'avait plus de lit, il lui restait une loque qu'elle\r\n-appelait sa couverture, un matelas à terre et une chaise dépaillée. Un\r\n-petit rosier qu'elle avait s'était désséché dans un coin, oublié. Dans\r\n-l'autre coin, il y avait un pot à beurre à mettre l'eau, qui gelait\r\n-l'hiver, et où les différents niveaux de l'eau restaient longtemps\r\n-marqués par des cercles de glace. Elle avait perdu la honte, elle perdit\r\n-la coquetterie. Dernier signe. Elle sortait avec des bonnets sales. Soit\r\n-faute de temps, soit indifférence, elle ne raccommodait plus son linge.\r\n-À mesure que les talons s'usaient, elle tirait ses bas dans ses\r\n-souliers. Cela se voyait à de certains plis perpendiculaires. Elle\r\n-rapiéçait son corset, vieux et usé, avec des morceaux de calicot qui se\r\n-déchiraient au moindre mouvement. Les gens auxquels elle devait, lui\r\n-faisaient «des scènes», et ne lui laissaient aucun repos. Elle les\r\n-trouvait dans la rue, elle les retrouvait dans son escalier. Elle\r\n-passait des nuits à pleurer et à songer. Elle avait les yeux très\r\n-brillants, et elle sentait une douleur fixe dans l'épaule, vers le haut\r\n-de l'omoplate gauche. Elle toussait beaucoup. Elle haïssait profondément\r\n-le père Madeleine, et ne se plaignait pas. Elle cousait dix-sept heures\r\n-par jour; mais un entrepreneur du travail des prisons, qui faisait\r\n-travailler les prisonnières au rabais, fit tout à coup baisser les prix,\r\n-ce qui réduisit la journée des ouvrières libres à neuf sous. Dix-sept\r\n-heures de travail, et neuf sous par jour! Ses créanciers étaient plus\r\n-impitoyables que jamais. Le fripier, qui avait repris presque tous les\r\n-meubles, lui disait sans cesse: Quand me payeras-tu, coquine? Que\r\n-voulait-on d'elle, bon Dieu! Elle se sentait traquée et il se\r\n-développait en elle quelque chose de la bête farouche. Vers le même\r\n-temps, le Thénardier lui écrivit que décidément il avait attendu avec\r\n-beaucoup trop de bonté, et qu'il lui fallait cent francs, tout de suite;\r\n-sinon qu'il mettrait à la porte la petite Cosette, toute convalescente\r\n-de sa grande maladie, par le froid, par les chemins, et qu'elle\r\n-deviendrait ce qu'elle pourrait, et qu'elle crèverait, si elle voulait.\r\n-«Cent francs, songea Fantine! Mais où y a-t-il un état à gagner cent\r\n-sous par jour?»\r\n-\r\n---Allons! dit-elle, vendons le reste.\r\n-\r\n-L'infortunée se fit fille publique.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XI\r\n-\r\n-_Christus nos liberavit_\r\n-\r\n-\r\n-Qu'est-ce que c'est que cette histoire de Fantine? C'est la société\r\n-achetant une esclave.\r\n-\r\n-À qui? À la misère.\r\n-\r\n-À la faim, au froid, à l'isolement, à l'abandon, au dénûment. Marché\r\n-douloureux. Une âme pour un morceau de pain. La misère offre, la société\r\n-accepte.\r\n-\r\n-La sainte loi de Jésus-Christ gouverne notre civilisation, mais elle ne\r\n-la pénètre pas encore. On dit que l'esclavage a disparu de la\r\n-civilisation européenne. C'est une erreur. Il existe toujours, mais il\r\n-ne pèse plus que sur la femme, et il s'appelle prostitution.\r\n-\r\n-Il pèse sur la femme, c'est-à -dire sur la grâce, sur la faiblesse, sur\r\n-la beauté, sur la maternité. Ceci n'est pas une des moindres hontes de\r\n-l'homme.\r\n-\r\n-Au point de ce douloureux drame où nous sommes arrivés, il ne reste plus\r\n-rien à Fantine de ce qu'elle a été autrefois. Elle est devenue marbre en\r\n-devenant boue. Qui la touche a froid. Elle passe, elle vous subit et\r\n-elle vous ignore; elle est la figure déshonorée et sévère. La vie et\r\n-l'ordre social lui ont dit leur dernier mot. Il lui est arrivé tout ce\r\n-qui lui arrivera. Elle a tout ressenti, tout supporté, tout éprouvé,\r\n-tout souffert, tout perdu, tout pleuré. Elle est résignée de cette\r\n-résignation qui ressemble à l'indifférence comme la mort ressemble au\r\n-sommeil. Elle n'évite plus rien. Elle ne craint plus rien. Tombe sur\r\n-elle toute la nuée et passe sur elle tout l'océan! que lui importe!\r\n-c'est une éponge imbibée.\r\n-\r\n-Elle le croit du moins, mais c'est une erreur de s'imaginer qu'on épuise\r\n-le sort et qu'on touche le fond de quoi que ce soit.\r\n-\r\n-Hélas! qu'est-ce que toutes ces destinées ainsi poussées pêle-mêle? où\r\n-vont-elles? pourquoi sont-elles ainsi?\r\n-\r\n-Celui qui sait cela voit toute l'ombre.\r\n-\r\n-Il est seul. Il s'appelle Dieu.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XII\r\n-\r\n-Le désoeuvrement de M. Bamatabois\r\n-\r\n-\r\n-Il y a dans toutes les petites villes, et il y avait à Montreuil-sur-mer\r\n-en particulier, une classe de jeunes gens qui grignotent quinze cents\r\n-livres de rente en province du même air dont leurs pareils dévorent à \r\n-Paris deux cent mille francs par an. Ce sont des êtres de la grande\r\n-espèce neutre; hongres, parasites, nuls, qui ont un peu de terre, un peu\r\n-de sottise et un peu d'esprit, qui seraient des rustres dans un salon et\r\n-se croient des gentilshommes au cabaret, qui disent: mes prés, mes bois,\r\n-mes paysans, sifflent les actrices du théâtre pour prouver qu'ils sont\r\n-gens de goût, querellent les officiers de la garnison pour montrer\r\n-qu'ils sont gens de guerre, chassent, fument, bâillent, boivent, sentent\r\n-le tabac, jouent au billard, regardent les voyageurs descendre de\r\n-diligence, vivent au café, dînent à l'auberge, ont un chien qui mange\r\n-les os sous la table et une maîtresse qui pose les plats dessus,\r\n-tiennent à un sou, exagèrent les modes, admirent la tragédie, méprisent\r\n-les femmes, usent leurs vieilles bottes, copient Londres à travers Paris\r\n-et Paris à travers Pont-à -Mousson, vieillissent hébétés, ne travaillent\r\n-pas, ne servent à rien et ne nuisent pas à grand'chose.\r\n-\r\n-M. Félix Tholomyès, resté dans sa province et n'ayant jamais vu Paris,\r\n-serait un de ces hommes-là .\r\n-\r\n-S'ils étaient plus riches, on dirait: ce sont des élégants; s'ils\r\n-étaient plus pauvres, on dirait: ce sont des fainéants. Ce sont tout\r\n-simplement des désoeuvrés. Parmi ces désoeuvrés, il y a des ennuyeux,\r\n-des ennuyés, des rêvasseurs, et quelques drôles.\r\n-\r\n-Dans ce temps-là , un élégant se composait d'un grand col, d'une grande\r\n-cravate, d'une montre à breloques, de trois gilets superposés de\r\n-couleurs différentes, le bleu et le rouge en dedans, d'un habit couleur\r\n-olive à taille courte, à queue de morue, à double rangée de boutons\r\n-d'argent serrés les uns contre les autres et montant jusque sur\r\n-l'épaule, et d'un pantalon olive plus clair, orné sur les deux coutures\r\n-d'un nombre de côtes indéterminé, mais toujours impair, variant de une à \r\n-onze, limite qui n'était jamais franchie. Ajoutez à cela des\r\n-souliers-bottes avec de petits fers au talon, un chapeau à haute forme\r\n-et à bords étroits, des cheveux en touffe, une énorme canne, et une\r\n-conversation rehaussée des calembours de Potier. Sur le tout des éperons\r\n-et des moustaches. À cette époque, des moustaches voulaient dire\r\n-bourgeois et des éperons voulaient dire piéton.\r\n-\r\n-L'élégant de province portait les éperons plus longs et les moustaches\r\n-plus farouches. C'était le temps de la lutte des républiques de\r\n-l'Amérique méridionale contre le roi d'Espagne, de Bolivar contre\r\n-Morillo. Les chapeaux à petits bords étaient royalistes et se nommaient\r\n-des morillos; les libéraux portaient des chapeaux à larges bords qui\r\n-s'appelaient des bolivars.\r\n-\r\n-Huit ou dix mois donc après ce qui a été raconté dans les pages\r\n-précédentes, vers les premiers jours de janvier 1823, un soir qu'il\r\n-avait neigé, un de ces élégants, un de ces désoeuvrés, un \u0022bien\r\n-pensant\u0022, car il avait un morillo, de plus chaudement enveloppé d'un de\r\n-ces grands manteaux qui complétaient dans les temps froids le costume à \r\n-la mode, se divertissait à harceler une créature qui rôdait en robe de\r\n-bal et toute décolletée avec des fleurs sur la tête devant la vitre du\r\n-café des officiers. Cet élégant fumait, car c'était décidément la mode.\r\n-\r\n-Chaque fois que cette femme passait devant lui, il lui jetait, avec une\r\n-bouffée de la fumée de son cigare, quelque apostrophe qu'il croyait\r\n-spirituelle et gaie, comme:--Que tu es laide!--Veux-tu te cacher!--Tu\r\n-n'as pas de dents! etc., etc.--Ce monsieur s'appelait monsieur\r\n-Bamatabois. La femme, triste spectre paré qui allait et venait sur la\r\n-neige, ne lui répondait pas, ne le regardait même pas, et n'en\r\n-accomplissait pas moins en silence et avec une régularité sombre sa\r\n-promenade qui la ramenait de cinq minutes en cinq minutes sous le\r\n-sarcasme, comme le soldat condamné qui revient sous les verges. Ce peu\r\n-d'effet piqua sans doute l'oisif qui, profitant d'un moment où elle se\r\n-retournait, s'avança derrière elle à pas de loup et en étouffant son\r\n-rire, se baissa, prit sur le pavé une poignée de neige et la lui plongea\r\n-brusquement dans le dos entre ses deux épaules nues. La fille poussa un\r\n-rugissement, se tourna, bondit comme une panthère, et se rua sur\r\n-l'homme, lui enfonçant ses ongles dans le visage, avec les plus\r\n-effroyables paroles qui puissent tomber du corps de garde dans le\r\n-ruisseau. Ces injures, vomies d'une voix enrouée par l'eau-de-vie,\r\n-sortaient hideusement d'une bouche à laquelle manquaient en effet les\r\n-deux dents de devant. C'était la Fantine.\r\n-\r\n-Au bruit que cela fit, les officiers sortirent en foule du café, les\r\n-passants s'amassèrent, et il se forma un grand cercle riant, huant et\r\n-applaudissant, autour de ce tourbillon composé de deux êtres où l'on\r\n-avait peine à reconnaître un homme et une femme, l'homme se débattant,\r\n-son chapeau à terre, la femme frappant des pieds et des poings,\r\n-décoiffée, hurlant, sans dents et sans cheveux, livide de colère,\r\n-horrible. Tout à coup un homme de haute taille sortit vivement de la\r\n-foule, saisit la femme à son corsage de satin couvert de boue, et lui\r\n-dit: Suis-moi!\r\n-\r\n-La femme leva la tête; sa voix furieuse s'éteignit subitement. Ses yeux\r\n-étaient vitreux, de livide elle était devenue pâle, et elle tremblait\r\n-d'un tremblement de terreur. Elle avait reconnu Javert.\r\n-\r\n-L'élégant avait profité de l'incident pour s'esquiver.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XIII\r\n-\r\n-Solution de quelques questions de police municipale\r\n-\r\n-\r\n-Javert écarta les assistants, rompit le cercle et se mit à marcher à grands\r\n-pas vers le bureau de police qui est à l'extrémité de la place, traînant\r\n-après lui la misérable. Elle se laissait faire machinalement. Ni lui ni\r\n-elle ne disaient un mot. La nuée des spectateurs, au paroxysme de la\r\n-joie, suivait avec des quolibets. La suprême misère, occasion\r\n-d'obscénités. Arrivé au bureau de police qui était une salle basse\r\n-chauffée par un poêle et gardée par un poste, avec une porte vitrée et\r\n-grillée sur la rue, Javert ouvrit la porte, entra avec Fantine, et\r\n-referma la porte derrière lui, au grand désappointement des curieux qui\r\n-se haussèrent sur la pointe du pied et allongèrent le cou devant la\r\n-vitre trouble du corps de garde, cherchant à voir. La curiosité est une\r\n-gourmandise. Voir, c'est dévorer.\r\n-\r\n-En entrant, la Fantine alla tomber dans un coin, immobile et muette,\r\n-accroupie comme une chienne qui a peur.\r\n-\r\n-Le sergent du poste apporta une chandelle allumée sur une table. Javert\r\n-s'assit, tira de sa poche une feuille de papier timbré et se mit à \r\n-écrire.\r\n-\r\n-Ces classes de femmes sont entièrement remises par nos lois à la\r\n-discrétion de la police. Elle en fait ce qu'elle veut, les punit comme\r\n-bon lui semble, et confisque à son gré ces deux tristes choses qu'elles\r\n-appellent leur industrie et leur liberté. Javert était impassible; son\r\n-visage sérieux ne trahissait aucune émotion. Pourtant il était gravement\r\n-et profondément préoccupé. C'était un de ces moments où il exerçait sans\r\n-contrôle, mais avec tous les scrupules d'une conscience sévère, son\r\n-redoutable pouvoir discrétionnaire. En cet instant, il le sentait, son\r\n-escabeau d'agent de police était un tribunal. Il jugeait. Il jugeait, et\r\n-il condamnait. Il appelait tout ce qu'il pouvait avoir d'idées dans\r\n-l'esprit autour de la grande chose qu'il faisait. Plus il examinait le\r\n-fait de cette fille, plus il se sentait révolté. Il était évident qu'il\r\n-venait de voir commettre un crime. Il venait de voir, là dans la rue, la\r\n-société, représentée par un propriétaire-électeur, insultée et attaquée\r\n-par une créature en dehors de tout. Une prostituée avait attenté à un\r\n-bourgeois. Il avait vu cela, lui Javert. Il écrivait en silence.\r\n-\r\n-Quand il eut fini, il signa, plia le papier et dit au sergent du poste,\r\n-en le lui remettant:\r\n-\r\n---Prenez trois hommes, et menez cette fille au bloc.\r\n-\r\n-Puis se tournant vers la Fantine:\r\n-\r\n---Tu en as pour six mois.\r\n-\r\n-La malheureuse tressaillit.\r\n-\r\n---Six mois! six mois de prison! Six mois à gagner sept sous par jour!\r\n-Mais que deviendra Cosette? ma fille! ma fille! Mais je dois encore plus\r\n-de cent francs aux Thénardier, monsieur l'inspecteur, savez-vous cela?\r\n-\r\n-Elle se traîna sur la dalle mouillée par les bottes boueuses de tous ces\r\n-hommes, sans se lever, joignant les mains, faisant de grands pas avec\r\n-ses genoux.\r\n-\r\n---Monsieur Javert, dit-elle, je vous demande grâce. Je vous assure que\r\n-je n'ai pas eu tort. Si vous aviez vu le commencement, vous auriez vu!\r\n-je vous jure le bon Dieu que je n'ai pas eu tort. C'est ce monsieur le\r\n-bourgeois que je ne connais pas qui m'a mis de la neige dans le dos.\r\n-Est-ce qu'on a le droit de nous mettre de la neige dans le dos quand\r\n-nous passons comme cela tranquillement sans faire de mal à personne?\r\n-Cela m'a saisie. Je suis un peu malade, voyez-vous! Et puis il y avait\r\n-déjà un peu de temps qu'il me disait des raisons. Tu es laide! tu n'as\r\n-pas de dents! Je le sais bien que je n'ai plus mes dents. Je ne faisais\r\n-rien, moi; je disais: c'est un monsieur qui s'amuse. J'étais honnête\r\n-avec lui, je ne lui parlais pas. C'est à cet instant-là qu'il m'a mis de\r\n-la neige. Monsieur Javert, mon bon monsieur l'inspecteur! est-ce qu'il\r\n-n'y a personne là qui ait vu pour vous dire que c'est bien vrai? J'ai\r\n-peut-être eu tort de me fâcher. Vous savez, dans le premier moment, on\r\n-n'est pas maître. On a des vivacités. Et puis, quelque chose de si froid\r\n-qu'on vous met dans le dos à l'heure que vous ne vous y attendez pas!\r\n-J'ai eu tort d'abîmer le chapeau de ce monsieur. Pourquoi s'est-il en\r\n-allé? Je lui demanderais pardon. Oh! mon Dieu, cela me serait bien égal\r\n-de lui demander pardon. Faites-moi grâce pour aujourd'hui cette fois,\r\n-monsieur Javert. Tenez, vous ne savez pas ça, dans les prisons on ne\r\n-gagne que sept sous, ce n'est pas la faute du gouvernement, mais on\r\n-gagne sept sous, et figurez-vous que j'ai cent francs à payer, ou\r\n-autrement on me renverra ma petite. Ô mon Dieu! je ne peux pas l'avoir\r\n-avec moi. C'est si vilain ce que je fais! Ô ma Cosette, ô mon petit ange\r\n-de la bonne sainte Vierge, qu'est-ce qu'elle deviendra, pauvre loup! Je\r\n-vais vous dire, c'est les Thénardier, des aubergistes, des paysans, ça\r\n-n'a pas de raisonnement. Il leur faut de l'argent. Ne me mettez pas en\r\n-prison! Voyez-vous, c'est une petite qu'on mettrait à même sur la grande\r\n-route, va comme tu pourras, en plein coeur d'hiver, il faut avoir pitié\r\n-de cette chose-là , mon bon monsieur Javert. Si c'était plus grand, ça\r\n-gagnerait sa vie, mais ça ne peut pas, à ces âges-là . Je ne suis pas une\r\n-mauvaise femme au fond. Ce n'est pas la lâcheté et la gourmandise qui\r\n-ont fait de moi ça. J'ai bu de l'eau-de-vie, c'est par misère. Je ne\r\n-l'aime pas, mais cela étourdit. Quand j'étais plus heureuse, on n'aurait\r\n-eu qu'à regarder dans mes armoires, on aurait bien vu que je n'étais pas\r\n-une femme coquette qui a du désordre. J'avais du linge, beaucoup de\r\n-linge. Ayez pitié de moi, monsieur Javert!\r\n-\r\n-Elle parlait ainsi, brisée en deux, secouée par les sanglots, aveuglée\r\n-par les larmes, la gorge nue, se tordant les mains, toussant d'une toux\r\n-sèche et courte, balbutiant tout doucement avec la voix de l'agonie. La\r\n-grande douleur est un rayon divin et terrible qui transfigure les\r\n-misérables. À ce moment-là , la Fantine était redevenue belle. À de\r\n-certains instants, elle s'arrêtait et baisait tendrement le bas de la\r\n-redingote du mouchard. Elle eût attendri un coeur de granit, mais on\r\n-n'attendrit pas un coeur de bois.\r\n-\r\n---Allons! dit Javert, je t'ai écoutée. As-tu bien tout dit? Marche à \r\n-présent! Tu as tes six mois; _le Père éternel en personne n'y pourrait\r\n-plus rien_.\r\n-\r\n-À cette solennelle parole, Le Père éternel en personne n'y pourrait plus\r\n-rien, elle comprit que l'arrêt était prononcé. Elle s'affaissa sur\r\n-elle-même en murmurant:\r\n-\r\n---Grâce!\r\n-\r\n-Javert tourna le dos.\r\n-\r\n-Les soldats la saisirent par les bras.\r\n-\r\n-Depuis quelques minutes, un homme était entré sans qu'on eût pris garde\r\n-à lui. Il avait refermé la porte, s'y était adossé, et avait entendu les\r\n-prières désespérées de la Fantine. Au moment où les soldats mirent la\r\n-main sur la malheureuse, qui ne voulait pas se lever, il fit un pas,\r\n-sortit de l'ombre, et dit:\r\n-\r\n---Un instant, s'il vous plaît!\r\n-\r\n-Javert leva les yeux et reconnut M. Madeleine. Il ôta son chapeau, et\r\n-saluant avec une sorte de gaucherie fâchée:\r\n-\r\n---Pardon, monsieur le maire....\r\n-\r\n-Ce mot, monsieur le maire, fit sur la Fantine un effet étrange. Elle se\r\n-dressa debout tout d'une pièce comme un spectre qui sort de terre,\r\n-repoussa les soldats des deux bras, marcha droit à M. Madeleine avant\r\n-qu'on eût pu la retenir, et le regardant fixement, l'air égaré, elle\r\n-cria:\r\n-\r\n---Ah! c'est donc toi qui es monsieur le maire!\r\n-\r\n-Puis elle éclata de rire et lui cracha au visage.\r\n-\r\n-M. Madeleine s'essuya le visage, et dit:\r\n-\r\n---Inspecteur Javert, mettez cette femme en liberté.\r\n-\r\n-Javert se sentit au moment de devenir fou. Il éprouvait en cet instant,\r\n-coup sur coup, et presque mêlées ensemble, les plus violentes émotions\r\n-qu'il eût ressenties de sa vie. Voir une fille publique cracher au\r\n-visage d'un maire, cela était une chose si monstrueuse que, dans ses\r\n-suppositions les plus effroyables, il eût regardé comme un sacrilège de\r\n-le croire possible. D'un autre côté, dans le fond de sa pensée, il\r\n-faisait confusément un rapprochement hideux entre ce qu'était cette\r\n-femme et ce que pouvait être ce maire, et alors il entrevoyait avec\r\n-horreur je ne sais quoi de tout simple dans ce prodigieux attentat. Mais\r\n-quand il vit ce maire, ce magistrat, s'essuyer tranquillement le visage\r\n-et dire: _mettez cette femme en liberté_, il eut comme un éblouissement\r\n-de stupeur; la pensée et la parole lui manquèrent également; la somme de\r\n-l'étonnement possible était dépassée pour lui. Il resta muet.\r\n-\r\n-Ce mot n'avait pas porté un coup moins étrange à la Fantine. Elle leva\r\n-son bras nu et se cramponna à la clef du poêle comme une personne qui\r\n-chancelle. Cependant elle regardait tout autour d'elle et elle se mit à \r\n-parler à voix basse, comme si elle se parlait à elle-même.\r\n-\r\n---En liberté! qu'on me laisse aller! que je n'aille pas en prison six\r\n-mois! Qui est-ce qui a dit cela? Il n'est pas possible qu'on ait dit\r\n-cela. J'ai mal entendu. Ça ne peut pas être ce monstre de maire! Est-ce\r\n-que c'est vous, mon bon monsieur Javert, qui avez dit qu'on me mette en\r\n-liberté? Oh! voyez-vous! je vais vous dire et vous me laisserez aller.\r\n-Ce monstre de maire, ce vieux gredin de maire, c'est lui qui est cause\r\n-de tout. Figurez-vous, monsieur Javert, qu'il m'a chassée! à cause d'un\r\n-tas de gueuses qui tiennent des propos dans l'atelier. Si ce n'est pas\r\n-là une horreur! renvoyer une pauvre fille qui fait honnêtement son\r\n-ouvrage! Alors je n'ai plus gagné assez, et tout le malheur est venu.\r\n-D'abord il y a une amélioration que ces messieurs de la police devraient\r\n-bien faire, ce serait d'empêcher les entrepreneurs des prisons de faire\r\n-du tort aux pauvres gens. Je vais vous expliquer cela, voyez-vous. Vous\r\n-gagnez douze sous dans les chemises, cela tombe à neuf sous, il n'y a\r\n-plus moyen de vivre. Il faut donc devenir ce qu'on peut. Moi, j'avais ma\r\n-petite Cosette, j'ai bien été forcée de devenir une mauvaise femme. Vous\r\n-comprenez à présent, que c'est ce gueux de maire qui a tout fait le mal.\r\n-Après cela, j'ai piétiné le chapeau de ce monsieur bourgeois devant le\r\n-café des officiers. Mais lui, il m'avait perdu toute ma robe avec sa\r\n-neige. Nous autres, nous n'avons qu'une robe de soie, pour le soir.\r\n-Voyez-vous, je n'ai jamais fait de mal exprès, vrai, monsieur Javert, et\r\n-je vois partout des femmes bien plus méchantes que moi qui sont bien\r\n-plus heureuses. Ô monsieur Javert, c'est vous qui avez dit qu'on me\r\n-mette dehors, n'est-ce pas? Prenez des informations, parlez à mon\r\n-propriétaire, maintenant je paye mon terme, on vous dira bien que je\r\n-suis honnête. Ah! mon Dieu, je vous demande pardon, j'ai touché, sans\r\n-faire attention, à la clef du poêle, et cela fait fumer.\r\n-\r\n-M. Madeleine l'écoutait avec une attention profonde. Pendant qu'elle\r\n-parlait, il avait fouillé dans son gilet, en avait tiré sa bourse et\r\n-l'avait ouverte. Elle était vide. Il l'avait remise dans sa poche. Il\r\n-dit à la Fantine:\r\n-\r\n---Combien avez-vous dit que vous deviez?\r\n-\r\n-La Fantine, qui ne regardait que Javert, se retourna de son côté:\r\n-\r\n---Est-ce que je te parle à toi!\r\n-\r\n-Puis s'adressant aux soldats:\r\n-\r\n---Dites donc, vous autres, avez-vous vu comme je te vous lui ai craché à \r\n-la figure? Ah! vieux scélérat de maire, tu viens ici pour me faire peur,\r\n-mais je n'ai pas peur de toi. J'ai peur de monsieur Javert. J'ai peur de\r\n-mon bon monsieur Javert!\r\n-\r\n-En parlant ainsi elle se retourna vers l'inspecteur:\r\n-\r\n---Avec ça, voyez-vous, monsieur l'inspecteur, il faut être juste. Je\r\n-comprends que vous êtes juste, monsieur l'inspecteur. Au fait, c'est\r\n-tout simple, un homme qui joue à mettre un peu de neige dans le dos\r\n-d'une femme, ça les faisait rire, les officiers, il faut bien qu'on se\r\n-divertisse à quelque chose, nous autres nous sommes là pour qu'on\r\n-s'amuse, quoi! Et puis, vous, vous venez, vous êtes bien forcé de mettre\r\n-l'ordre, vous emmenez la femme qui a tort, mais en y réfléchissant,\r\n-comme vous êtes bon, vous dites qu'on me mette en liberté, c'est pour la\r\n-petite, parce que six mois en prison, cela m'empêcherait de nourrir mon\r\n-enfant. Seulement n'y reviens plus, coquine! Oh! je n'y reviendrai plus,\r\n-monsieur Javert! on me fera tout ce qu'on voudra maintenant, je ne\r\n-bougerai plus. Seulement, aujourd'hui, voyez-vous, j'ai crié parce que\r\n-cela m'a fait mal, je ne m'attendais pas du tout à cette neige de ce\r\n-monsieur, et puis, je vous ai dit, je ne me porte pas très bien, je\r\n-tousse, j'ai là dans l'estomac comme une boule qui me brûle, que le\r\n-médecin me dit: soignez-vous. Tenez, tâtez, donnez votre main, n'ayez\r\n-pas peur, c'est ici.\r\n-\r\n-Elle ne pleurait plus, sa voix était caressante, elle appuyait sur sa\r\n-gorge blanche et délicate la grosse main rude de Javert, et elle le\r\n-regardait en souriant.\r\n-\r\n-Tout à coup elle rajusta vivement le désordre de ses vêtements, fit\r\n-retomber les plis de sa robe qui en se traînant s'était relevée presque\r\n-à la hauteur du genou, et marcha vers la porte en disant à demi-voix aux\r\n-soldats avec un signe de tête amical:\r\n-\r\n---Les enfants, monsieur l'inspecteur a dit qu'on me lâche, je m'en vas.\r\n-\r\n-Elle mit la main sur le loquet. Un pas de plus, elle était dans la rue.\r\n-\r\n-Javert jusqu'à cet instant était resté debout, immobile, l'oeil fixé à \r\n-terre, posé de travers au milieu de cette scène comme une statue\r\n-dérangée qui attend qu'on la mette quelque part.\r\n-\r\n-Le bruit que fit le loquet le réveilla. Il releva la tête avec une\r\n-expression d'autorité souveraine, expression toujours d'autant plus\r\n-effrayante que le pouvoir se trouve placé plus bas, féroce chez la bête\r\n-fauve, atroce chez l'homme de rien.\r\n-\r\n---Sergent, cria-t-il, vous ne voyez pas que cette drôlesse s'en va! Qui\r\n-est-ce qui vous a dit de la laisser aller?\r\n-\r\n---Moi, dit Madeleine.\r\n-\r\n-La Fantine à la voix de Javert avait tremblé et lâché le loquet comme un\r\n-voleur pris lâche l'objet volé. À la voix de Madeleine, elle se\r\n-retourna, et à partir de ce moment, sans qu'elle prononçât un mot, sans\r\n-qu'elle osât même laisser sortir son souffle librement, son regard alla\r\n-tour à tour de Madeleine à Javert et de Javert à Madeleine, selon que\r\n-c'était l'un ou l'autre qui parlait.\r\n-\r\n-Il était évident qu'il fallait que Javert eût été, comme on dit, «jeté\r\n-hors des gonds» pour qu'il se fût permis d'apostropher le sergent comme\r\n-il l'avait fait, après l'invitation du maire de mettre Fantine en\r\n-liberté. En était-il venu à oublier la présence de monsieur le maire?\r\n-Avait-il fini par se déclarer à lui-même qu'il était impossible qu'une\r\n-«autorité» eût donné un pareil ordre, et que bien certainement monsieur\r\n-le maire avait dû dire sans le vouloir une chose pour une autre? Ou\r\n-bien, devant les énormités dont il était témoin depuis deux heures, se\r\n-disait-il qu'il fallait revenir aux suprêmes résolutions, qu'il était\r\n-nécessaire que le petit se fit grand, que le mouchard se transformât en\r\n-magistrat, que l'homme de police devînt homme de justice, et qu'en cette\r\n-extrémité prodigieuse l'ordre, la loi, la morale, le gouvernement, la\r\n-société tout entière, se personnifiaient en lui Javert?\r\n-\r\n-Quoi qu'il en soit, quand M. Madeleine eut dit ce moi qu'on vient\r\n-d'entendre, on vit l'inspecteur de police Javert se tourner vers\r\n-monsieur le maire, pâle, froid, les lèvres bleues, le regard désespéré,\r\n-tout le corps agité d'un tremblement imperceptible, et, chose inouïe,\r\n-lui dire, l'oeil baissé, mais la voix ferme:\r\n-\r\n---Monsieur le maire, cela ne se peut pas.\r\n-\r\n---Comment? dit M. Madeleine.\r\n-\r\n---Cette malheureuse a insulté un bourgeois.\r\n-\r\n---Inspecteur Javert, repartit M. Madeleine avec un accent conciliant et\r\n-calme, écoutez. Vous êtes un honnête homme, et je ne fais nulle\r\n-difficulté de m'expliquer avec vous. Voici le vrai. Je passais sur la\r\n-place comme vous emmeniez cette femme, il y avait encore des groupes, je\r\n-me suis informé, j'ai tout su, c'est le bourgeois qui a eu tort et qui,\r\n-en bonne police, eût dû être arrêté.\r\n-\r\n-Javert reprit:\r\n-\r\n---Cette misérable vient d'insulter monsieur le maire.\r\n-\r\n---Ceci me regarde, dit M. Madeleine. Mon injure est à moi peut-être.\r\n-J'en puis faire ce que je veux.\r\n-\r\n---Je demande pardon à monsieur le maire. Son injure n'est pas à lui,\r\n-elle est à la justice.\r\n-\r\n---Inspecteur Javert, répliqua M. Madeleine, la première justice, c'est\r\n-la conscience. J'ai entendu cette femme. Je sais ce que je fais.\r\n-\r\n---Et moi, monsieur le maire, je ne sais pas ce que je vois.\r\n-\r\n---Alors contentez-vous d'obéir.\r\n-\r\n---J'obéis à mon devoir. Mon devoir veut que cette femme fasse six mois\r\n-de prison.\r\n-\r\n-M. Madeleine répondit avec douceur:\r\n-\r\n---Écoutez bien ceci. Elle n'en fera pas un jour.\r\n-\r\n-À cette parole décisive, Javert osa regarder le maire fixement, et lui\r\n-dit, mais avec un son de voix toujours profondément respectueux:\r\n-\r\n---Je suis au désespoir de résister à monsieur le maire, c'est la\r\n-première fois de ma vie, mais il daignera me permettre de lui faire\r\n-observer que je suis dans la limite de mes attributions. Je reste,\r\n-puisque monsieur le maire le veut, dans le fait du bourgeois. J'étais\r\n-là . C'est cette fille qui s'est jetée sur monsieur Bamatabois, qui est\r\n-électeur et propriétaire de cette belle maison à balcon qui fait le coin\r\n-de l'esplanade, à trois étages et toute en pierre de taille. Enfin, il y\r\n-a des choses dans ce monde! Quoi qu'il en soit, monsieur le maire, cela,\r\n-c'est un fait de police de la rue qui me regarde, et je retiens la femme\r\n-Fantine.\r\n-\r\n-Alors M. Madeleine croisa les bras et dit avec une voix sévère que\r\n-personne dans la ville n'avait encore entendue:\r\n-\r\n---Le fait dont vous parlez est un fait de police municipale. Aux termes\r\n-des articles neuf, onze, quinze et soixante-six du code d'instruction\r\n-criminelle, j'en suis juge. J'ordonne que cette femme soit mise en\r\n-liberté.\r\n-\r\n-Javert voulut tenter un dernier effort.\r\n-\r\n---Mais, monsieur le maire....\r\n-\r\n---Je vous rappelle, à vous, l'article quatre-vingt-un de la loi du 13\r\n-décembre 1799 sur la détention arbitraire.\r\n-\r\n---Monsieur le maire, permettez....\r\n-\r\n---Plus un mot.\r\n-\r\n---Pourtant....\r\n-\r\n---Sortez, dit M. Madeleine.\r\n-\r\n-Javert reçut le coup, debout, de face, et en pleine poitrine comme un\r\n-soldat russe. Il salua jusqu'à terre monsieur le maire, et sortit.\r\n-\r\n-Fantine se rangea de la porte et le regarda avec stupeur passer devant\r\n-elle.\r\n-\r\n-Cependant elle aussi était en proie à un bouleversement étrange. Elle\r\n-venait de se voir en quelque sorte disputée par deux puissances\r\n-opposées. Elle avait vu lutter devant ses yeux deux hommes tenant dans\r\n-leurs mains sa liberté, sa vie, son âme, son enfant; l'un de ces hommes\r\n-la tirait du côté de l'ombre, l'autre la ramenait vers la lumière. Dans\r\n-cette lutte, entrevue à travers les grossissements de l'épouvante, ces\r\n-deux hommes lui étaient apparus comme deux géants; l'un parlait comme\r\n-son démon, l'autre parlait comme son bon ange. L'ange avait vaincu le\r\n-démon, et, chose qui la faisait frissonner de la tête aux pieds, cet\r\n-ange, ce libérateur, c'était précisément l'homme qu'elle abhorrait, ce\r\n-maire qu'elle avait si longtemps considéré comme l'auteur de tous ses\r\n-maux, ce Madeleine! et au moment même où elle venait de l'insulter d'une\r\n-façon hideuse, il la sauvait! S'était-elle donc trompée? Devait-elle\r\n-donc changer toute son âme?... Elle ne savait, elle tremblait. Elle\r\n-écoutait éperdue, elle regardait effarée, et à chaque parole que disait\r\n-M. Madeleine, elle sentait fondre et s'écrouler en elle les affreuses\r\n-ténèbres de la haine et naître dans son coeur je ne sais quoi de\r\n-réchauffant et d'ineffable qui était de la joie, de la confiance et de\r\n-l'amour.\r\n-\r\n-Quand Javert fut sorti, M. Madeleine se tourna vers elle, et lui dit\r\n-avec une voix lente, ayant peine à parler comme un homme sérieux qui ne\r\n-veut pas pleurer:\r\n-\r\n---Je vous ai entendue. Je ne savais rien de ce que vous avez dit. Je\r\n-crois que c'est vrai, et je sens que c'est vrai. J'ignorais même que\r\n-vous eussiez quitté mes ateliers. Pourquoi ne vous êtes-vous pas\r\n-adressée à moi? Mais voici: je payerai vos dettes, je ferai venir votre\r\n-enfant, ou vous irez la rejoindre. Vous vivrez ici, à Paris, où vous\r\n-voudrez. Je me charge de votre enfant et de vous. Vous ne travaillerez\r\n-plus, si vous voulez. Je vous donnerai tout l'argent qu'il vous faudra.\r\n-Vous redeviendrez honnête en redevenant heureuse. Et même, écoutez, je\r\n-vous le déclare dès à présent, si tout est comme vous le dites, et je\r\n-n'en doute pas, vous n'avez jamais cessé d'être vertueuse et sainte\r\n-devant Dieu. Oh! pauvre femme!\r\n-\r\n-C'en était plus que la pauvre Fantine n'en pouvait supporter. Avoir\r\n-Cosette! sortir de cette vie infâme! vivre libre, riche, heureuse,\r\n-honnête, avec Cosette! voir brusquement s'épanouir au milieu de sa\r\n-misère toutes ces réalités du paradis! Elle regarda comme hébétée cet\r\n-homme qui lui parlait, et ne put que jeter deux ou trois sanglots: oh!\r\n-oh! oh! Ses jarrets plièrent, elle se mit à genoux devant M. Madeleine,\r\n-et, avant qu'il eût pu l'en empêcher, il sentit qu'elle lui prenait la\r\n-main et que ses lèvres s'y posaient.\r\n-\r\n-Puis elle s'évanouit.\r\n-\r\n-\r\n-\r\n-\r\n-Livre sixième--Javert\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre I\r\n-\r\n-Commencement du repos\r\n-\r\n-\r\n-M. Madeleine fit transporter la Fantine à cette infirmerie qu'il avait\r\n-dans sa propre maison. Il la confia aux soeurs qui la mirent au lit. Une\r\n-fièvre ardente était survenue. Elle passa une partie de la nuit à \r\n-délirer et à parler haut. Cependant elle finit par s'endormir.\r\n-\r\n-Le lendemain vers midi Fantine se réveilla, elle entendit une\r\n-respiration tout près de son lit, elle écarta son rideau et vit M.\r\n-Madeleine debout qui regardait quelque chose au-dessus de sa tête. Ce\r\n-regard était plein de pitié et d'angoisse et suppliait. Elle en suivit\r\n-la direction et vit qu'il s'adressait à un crucifix cloué au mur.\r\n-\r\n-M. Madeleine était désormais transfiguré aux yeux de Fantine. Il lui\r\n-paraissait enveloppé de lumière. Il était absorbé dans une sorte de\r\n-prière. Elle le considéra longtemps sans oser l'interrompre. Enfin elle\r\n-lui dit timidement:\r\n-\r\n---Que faites-vous donc là ?\r\n-\r\n-M. Madeleine était à cette place depuis une heure. Il attendait que\r\n-Fantine se réveillât. Il lui prit la main, lui tâta le pouls, et\r\n-répondit:\r\n-\r\n---Comment êtes-vous?\r\n-\r\n---Bien, j'ai dormi, dit-elle, je crois que je vais mieux. Ce ne sera\r\n-rien.\r\n-\r\n-Lui reprit, répondant à la question qu'elle lui avait adressée d'abord,\r\n-comme s'il ne faisait que de l'entendre:\r\n-\r\n---Je priais le martyr qui est là -haut.\r\n-\r\n-Et il ajouta dans sa pensée: «Pour la martyre qui est ici-bas.»\r\n-\r\n-M. Madeleine avait passé la nuit et la matinée à s'informer. Il savait\r\n-tout maintenant. Il connaissait dans tous ses poignants détails\r\n-l'histoire de Fantine. Il continua:\r\n-\r\n---Vous avez bien souffert, pauvre mère. Oh! ne vous plaignez pas, vous\r\n-avez à présent la dot des élus. C'est de cette façon que les hommes font\r\n-des anges. Ce n'est point leur faute; ils ne savent pas s'y prendre\r\n-autrement. Voyez-vous, cet enfer dont vous sortez est la première forme\r\n-du ciel. Il fallait commencer par là .\r\n-\r\n-Il soupira profondément. Elle cependant lui souriait avec ce sublime\r\n-sourire auquel il manquait deux dents.\r\n-\r\n-Javert dans cette même nuit avait écrit une lettre. Il remit lui-même\r\n-cette lettre le lendemain matin au bureau de poste de Montreuil-sur-mer.\r\n-Elle était pour Paris, et la suscription portait: À _monsieur\r\n-Chabouillet, secrétaire de monsieur le préfet de police_. Comme\r\n-l'affaire du corps de garde s'était ébruitée, la directrice du bureau de\r\n-poste et quelques autres personnes qui virent la lettre avant le départ\r\n-et qui reconnurent l'écriture de Javert sur l'adresse, pensèrent que\r\n-c'était sa démission qu'il envoyait.\r\n-\r\n-M. Madeleine se hâta d'écrire aux Thénardier. Fantine leur devait cent\r\n-vingt francs. Il leur envoya trois cents francs en leur disant de se\r\n-payer sur cette somme, et d'amener tout de suite l'enfant à \r\n-Montreuil-sur-mer où sa mère malade la réclamait.\r\n-\r\n-Ceci éblouit le Thénardier.\r\n-\r\n---Diable! dit-il à sa femme, ne lâchons pas l'enfant. Voilà que cette\r\n-mauviette va devenir une vache à lait. Je devine. Quelque jocrisse se\r\n-sera amouraché de la mère.\r\n-\r\n-Il riposta par un mémoire de cinq cents et quelques francs fort bien\r\n-fait. Dans ce mémoire figuraient pour plus de trois cents francs deux\r\n-notes incontestables, l'une d'un médecin, l'autre d'un apothicaire,\r\n-lesquels avaient soigné et médicamenté dans deux longues maladies\r\n-Éponine et Azelma. Cosette, nous l'avons dit, n'avait pas été malade. Ce\r\n-fut l'affaire d'une toute petite substitution de noms. Thénardier mit au\r\n-bas du mémoire: _reçu à compte trois cents francs_.\r\n-\r\n-M. Madeleine envoya tout de suite trois cents autres francs et écrivit:\r\n-Dépêchez-vous d'amener Cosette.\r\n-\r\n---Christi! dit le Thénardier, ne lâchons pas l'enfant.\r\n-\r\n-Cependant Fantine ne se rétablissait point. Elle était toujours à \r\n-l'infirmerie. Les soeurs n'avaient d'abord reçu et soigné «cette fille»\r\n-qu'avec répugnance. Qui a vu les bas-reliefs de Reims se souvient du\r\n-gonflement de la lèvre inférieure des vierges sages regardant les\r\n-vierges folles. Cet antique mépris des vestales pour les ambulaïes est\r\n-un des plus profonds instincts de la dignité féminine; les soeurs\r\n-l'avaient éprouvé, avec le redoublement qu'ajoute la religion. Mais, en\r\n-peu de jours, Fantine les avait désarmées. Elle avait toutes sortes de\r\n-paroles humbles et douces, et la mère qui était en elle attendrissait.\r\n-Un jour les soeurs l'entendirent qui disait à travers la fièvre:\r\n-\r\n---J'ai été une pécheresse, mais quand j'aurai mon enfant près de moi,\r\n-cela voudra dire que Dieu m'a pardonné. Pendant que j'étais dans le mal,\r\n-je n'aurais pas voulu avoir ma Cosette avec moi, je n'aurais pas pu\r\n-supporter ses yeux étonnés et tristes. C'était pour elle pourtant que je\r\n-faisais le mal, et c'est ce qui fait que Dieu me pardonne. Je sentirai\r\n-la bénédiction du bon Dieu quand Cosette sera ici. Je la regarderai,\r\n-cela me fera du bien de voir cette innocente. Elle ne sait rien du tout.\r\n-C'est un ange, voyez-vous, mes soeurs. À cet âge-là , les ailes, ça n'est\r\n-pas encore tombé.\r\n-\r\n-M. Madeleine l'allait voir deux fois par jour, et chaque fois elle lui\r\n-demandait:\r\n-\r\n---Verrai-je bientôt ma Cosette?\r\n-\r\n-Il lui répondait:\r\n-\r\n---Peut-être demain matin. D'un moment à l'autre elle arrivera, je\r\n-l'attends.\r\n-\r\n-Et le visage pâle de la mère rayonnait.\r\n-\r\n---Oh! disait-elle, comme je vais être heureuse!\r\n-\r\n-Nous venons de dire qu'elle ne se rétablissait pas. Au contraire, son\r\n-état semblait s'aggraver de semaine en semaine. Cette poignée de neige\r\n-appliquée à nu sur la peau entre les deux omoplates avait déterminé une\r\n-suppression subite de transpiration à la suite de laquelle la maladie\r\n-qu'elle couvait depuis plusieurs années finit par se déclarer\r\n-violemment. On commençait alors à suivre pour l'étude et le traitement\r\n-des maladies de poitrine les belles indications de Laennec. Le médecin\r\n-ausculta Fantine et hocha la tête.\r\n-\r\n-M. Madeleine dit au médecin:\r\n-\r\n---Eh bien?\r\n-\r\n---N'a-t-elle pas un enfant qu'elle désire voir? dit le médecin.\r\n-\r\n---Oui.\r\n-\r\n---Eh bien, hâtez-vous de le faire venir.\r\n-\r\n-M. Madeleine eut un tressaillement.\r\n-\r\n-Fantine lui demanda:\r\n-\r\n---Qu'a dit le médecin?\r\n-\r\n-M. Madeleine s'efforça de sourire.\r\n-\r\n---Il a dit de faire venir bien vite votre enfant. Que cela vous rendra\r\n-la santé.\r\n-\r\n---Oh! reprit-elle, il a raison! Mais qu'est-ce qu'ils ont donc ces\r\n-Thénardier à me garder ma Cosette! Oh! elle va venir. Voici enfin que je\r\n-vois le bonheur tout près de moi!\r\n-\r\n-Le Thénardier cependant ne «lâchait pas l'enfant» et donnait cent\r\n-mauvaises raisons. Cosette était un peu souffrante pour se mettre en\r\n-route l'hiver. Et puis il y avait un reste de petites dettes criardes\r\n-dans le pays dont il rassemblait les factures, etc., etc.\r\n-\r\n---J'enverrai quelqu'un chercher Cosette, dit le père Madeleine. S'il le\r\n-faut, j'irai moi-même.\r\n-\r\n-Il écrivit sous la dictée de Fantine cette lettre qu'il lui fit signer:\r\n-\r\n-«Monsieur Thénardier,\r\n-\r\n-«Vous remettrez Cosette à la personne.\r\n-\r\n-«On vous payera toutes les petites choses.\r\n-\r\n-«J'ai l'honneur de vous saluer avec considération.\r\n-\r\n-«Fantine.»\r\n-\r\n-Sur ces entrefaites, il survint un grave incident. Nous avons beau\r\n-tailler de notre mieux le bloc mystérieux dont notre vie est faite, la\r\n-veine noire de la destinée y reparaît toujours.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre II\r\n-\r\n-Comment Jean peut devenir Champ\r\n-\r\n-\r\n-Un matin, M. Madeleine était dans son cabinet, occupé à régler d'avance\r\n-quelques affaires pressantes de la mairie pour le cas où il se\r\n-déciderait à ce voyage de Montfermeil, lorsqu'on vint lui dire que\r\n-l'inspecteur de police Javert demandait à lui parler. En entendant\r\n-prononcer ce nom, M. Madeleine ne put se défendre d'une impression\r\n-désagréable. Depuis l'aventure du bureau de police, Javert l'avait plus\r\n-que jamais évité, et M. Madeleine ne l'avait point revu.\r\n-\r\n---Faites entrer, dit-il.\r\n-\r\n-Javert entra.\r\n-\r\n-M. Madeleine était resté assis près de la cheminée, une plume à la main,\r\n-l'oeil sur un dossier qu'il feuilletait et qu'il annotait, et qui\r\n-contenait des procès-verbaux de contraventions à la police de la voirie.\r\n-Il ne se dérangea point pour Javert. Il ne pouvait s'empêcher de songer\r\n-à la pauvre Fantine, et il lui convenait d'être glacial.\r\n-\r\n-Javert salua respectueusement M. le maire qui lui tournait le dos. M. le\r\n-maire ne le regarda pas et continua d'annoter son dossier.\r\n-\r\n-Javert fit deux ou trois pas dans le cabinet, et s'arrêta sans rompre le\r\n-silence. Un physionomiste qui eût été familier avec la nature de Javert,\r\n-qui eût étudié depuis longtemps ce sauvage au service de la\r\n-civilisation, ce composé bizarre du Romain, du Spartiate, du moine et du\r\n-caporal, cet espion incapable d'un mensonge, ce mouchard vierge, un\r\n-physionomiste qui eût su sa secrète et ancienne aversion pour M.\r\n-Madeleine, son conflit avec le maire au sujet de la Fantine, et qui eût\r\n-considéré Javert en ce moment, se fût dit: que s'est-il passé? Il était\r\n-évident, pour qui eût connu cette conscience droite, claire, sincère,\r\n-probe, austère et féroce, que Javert sortait de quelque grand événement\r\n-intérieur. Javert n'avait rien dans l'âme qu'il ne l'eût aussi sur le\r\n-visage. Il était, comme les gens violents, sujet aux revirements\r\n-brusques. Jamais sa physionomie n'avait été plus étrange et plus\r\n-inattendue. En entrant, il s'était incliné devant M. Madeleine avec un\r\n-regard où il n'y avait ni rancune, ni colère, ni défiance, il s'était\r\n-arrêté à quelques pas derrière le fauteuil du maire; et maintenant il se\r\n-tenait là , debout, dans une attitude presque disciplinaire, avec la\r\n-rudesse naïve et froide d'un homme qui n'a jamais été doux et qui a\r\n-toujours été patient; il attendait, sans dire un mot, sans faire un\r\n-mouvement, dans une humilité vraie et dans une résignation tranquille,\r\n-qu'il plût à monsieur le maire de se retourner, calme, sérieux, le\r\n-chapeau à la main, les yeux baissés, avec une expression qui tenait le\r\n-milieu entre le soldat devant son officier et le coupable devant son\r\n-juge. Tous les sentiments comme tous les souvenirs qu'on eût pu lui\r\n-supposer avaient disparu. Il n'y avait plus rien sur ce visage\r\n-impénétrable et simple comme le granit, qu'une morne tristesse. Toute sa\r\n-personne respirait l'abaissement et la fermeté, et je ne sais quel\r\n-accablement courageux.\r\n-\r\n-Enfin M. le maire posa sa plume et se tourna à demi.\r\n-\r\n---Eh bien! qu'est-ce? qu'y a-t-il, Javert?\r\n-\r\n-Javert demeura un instant silencieux comme s'il se recueillait, puis\r\n-éleva la voix avec une sorte de solennité triste qui n'excluait pourtant\r\n-pas la simplicité:\r\n-\r\n---Il y a, monsieur le maire, qu'un acte coupable a été commis.\r\n-\r\n---Quel acte?\r\n-\r\n---Un agent inférieur de l'autorité a manqué de respect à un magistrat de\r\n-la façon la plus grave. Je viens, comme c'est mon devoir, porter le fait\r\n-à votre connaissance.\r\n-\r\n---Quel est cet agent? demanda M. Madeleine.\r\n-\r\n---Moi, dit Javert.\r\n-\r\n---Vous?\r\n-\r\n---Moi.\r\n-\r\n---Et quel est le magistrat qui aurait à se plaindre de l'agent?\r\n-\r\n---Vous, monsieur le maire.\r\n-\r\n-M. Madeleine se dressa sur son fauteuil. Javert poursuivit, l'air sévère\r\n-et les yeux toujours baissés:\r\n-\r\n---Monsieur le maire, je viens vous prier de vouloir bien provoquer près\r\n-de l'autorité ma destitution.\r\n-\r\n-M. Madeleine stupéfait ouvrit la bouche. Javert l'interrompit.\r\n-\r\n---Vous direz, j'aurais pu donner ma démission, mais cela ne suffit pas.\r\n-Donner sa démission, c'est honorable. J'ai failli, je dois être puni. Il\r\n-faut que je sois chassé.\r\n-\r\n-Et après une pause, il ajouta:\r\n-\r\n---Monsieur le maire, vous avez été sévère pour moi l'autre jour\r\n-injustement. Soyez-le aujourd'hui justement.\r\n-\r\n---Ah çà ! pourquoi? s'écria M. Madeleine. Quel est ce galimatias?\r\n-qu'est-ce que cela veut dire? où y a-t-il un acte coupable commis contre\r\n-moi par vous? qu'est-ce que vous m'avez fait? quels torts avez-vous\r\n-envers moi? Vous vous accusez, vous voulez être remplacé....\r\n-\r\n---Chassé, dit Javert.\r\n-\r\n---Chassé, soit. C'est fort bien. Je ne comprends pas.\r\n-\r\n---Vous allez comprendre, monsieur le maire.\r\n-\r\n-Javert soupira du fond de sa poitrine et reprit toujours froidement et\r\n-tristement:\r\n-\r\n---Monsieur le maire, il y a six semaines, à la suite de cette scène pour\r\n-cette fille, j'étais furieux, je vous ai dénoncé.\r\n-\r\n---Dénoncé!\r\n-\r\n---À la préfecture de police de Paris.\r\n-\r\n-M. Madeleine, qui ne riait pas beaucoup plus souvent que Javert, se mit\r\n-à rire.\r\n-\r\n---Comme maire ayant empiété sur la police?\r\n-\r\n---Comme ancien forçat.\r\n-\r\n-Le maire devint livide.\r\n-\r\n-Javert, qui n'avait pas levé les yeux, continua:\r\n-\r\n---Je le croyais. Depuis longtemps j'avais des idées.\r\n-\r\n-Une ressemblance, des renseignements que vous avez fait prendre à \r\n-Faverolles, votre force des reins, l'aventure du vieux Fauchelevent,\r\n-votre adresse au tir, votre jambe qui traîne un peu, est-ce que je sais,\r\n-moi? des bêtises! mais enfin je vous prenais pour un nommé Jean Valjean.\r\n-\r\n---Un nommé?... Comment dites-vous ce nom-là ?\r\n-\r\n---Jean Valjean. C'est un forçat que j'avais vu il y a vingt ans quand\r\n-j'étais adjudant-garde-chiourme à Toulon. En sortant du bagne, ce Jean\r\n-Valjean avait, à ce qu'il paraît, volé chez un évêque, puis il avait\r\n-commis un autre vol à main armée, dans un chemin public, sur un petit\r\n-savoyard. Depuis huit ans il s'était dérobé, on ne sait comment, et on\r\n-le cherchait. Moi je m'étais figuré... Enfin, j'ai fait cette chose! La\r\n-colère m'a décidé, je vous ai dénoncé à la préfecture.\r\n-\r\n-M. Madeleine, qui avait ressaisi le dossier depuis quelques instants,\r\n-reprit avec un accent de parfaite indifférence:\r\n-\r\n---Et que vous a-t-on répondu?\r\n-\r\n---Que j'étais fou.\r\n-\r\n---Eh bien?\r\n-\r\n---Eh bien, on avait raison.\r\n-\r\n---C'est heureux que vous le reconnaissiez!\r\n-\r\n---Il faut bien, puisque le véritable Jean Valjean est trouvé.\r\n-\r\n-La feuille que tenait M. Madeleine lui échappa des mains, il leva la\r\n-tête, regarda fixement Javert, et dit avec un accent inexprimable:\r\n-\r\n---Ah!\r\n-\r\n-Javert poursuivit:\r\n-\r\n---Voilà ce que c'est, monsieur le maire. Il paraît qu'il y avait dans le\r\n-pays, du côté d'Ailly-le-Haut-Clocher, une espèce de bonhomme qu'on\r\n-appelait le père Champmathieu. C'était très misérable. On n'y faisait\r\n-pas attention. Ces gens-là , on ne sait pas de quoi cela vit.\r\n-Dernièrement, cet automne, le père Champmathieu a été arrêté pour un vol\r\n-de pommes à cidre, commis chez...--enfin n'importe! Il y a eu vol, mur\r\n-escaladé, branches de l'arbre cassées. On a arrêté mon Champmathieu. Il\r\n-avait encore la branche de pommier à la main. On coffre le drôle.\r\n-Jusqu'ici ce n'est pas beaucoup plus qu'une affaire correctionnelle.\r\n-Mais voici qui est de la providence. La geôle étant en mauvais état,\r\n-monsieur le juge d'instruction trouve à propos de faire transférer\r\n-Champmathieu à Arras où est la prison départementale. Dans cette prison\r\n-d'Arras, il y a un ancien forçat nommé Brevet qui est détenu pour je ne\r\n-sais quoi et qu'on a fait guichetier de chambrée parce qu'il se conduit\r\n-bien. Monsieur le maire, Champmathieu n'est pas plus tôt débarqué que\r\n-voilà Brevet qui s'écrie: «Eh mais! je connais cet homme-là . C'est un\r\n-fagot. Regardez-moi donc, bonhomme! Vous êtes Jean Valjean!--Jean\r\n-Valjean! qui ça Jean Valjean? Le Champmathieu joue l'étonné.--Ne fais\r\n-donc pas le sinvre, dit Brevet. Tu es Jean Valjean! Tu as été au bagne\r\n-de Toulon. Il y a vingt ans. Nous y étions ensemble.--Le Champmathieu\r\n-nie. Parbleu! vous comprenez. On approfondit. On me fouille cette\r\n-aventure-là . Voici ce qu'on trouve: ce Champmathieu, il y a une\r\n-trentaine d'années, a été ouvrier émondeur d'arbres dans plusieurs pays,\r\n-notamment à Faverolles. Là on perd sa trace. Longtemps après, on le\r\n-revoit en Auvergne, puis à Paris, où il dit avoir été charron et avoir\r\n-eu une fille blanchisseuse, mais cela n'est pas prouvé; enfin dans ce\r\n-pays-ci. Or, avant d'aller au bagne pour vol qualifié, qu'était Jean\r\n-Valjean? émondeur. Où? à Faverolles. Autre fait. Ce Valjean s'appelait\r\n-de son nom de baptême Jean et sa mère se nommait de son nom de famille\r\n-Mathieu. Quoi de plus naturel que de penser qu'en sortant du bagne il\r\n-aura pris le nom de sa mère pour se cacher et se sera fait appeler Jean\r\n-Mathieu? Il va en Auvergne. De _Jean_ la prononciation du pays fait\r\n-_Chan_, on l'appelle Chan Mathieu. Notre homme se laisse faire et le\r\n-voilà transformé en Champmathieu. Vous me suivez, n'est-ce pas? On\r\n-s'informe à Faverolles. La famille de Jean Valjean n'y est plus. On ne\r\n-sait plus où elle est. Vous savez, dans ces classes-là , il y a souvent\r\n-de ces évanouissements d'une famille. On cherche, on ne trouve plus\r\n-rien. Ces gens-là , quand ce n'est pas de la boue, c'est de la poussière.\r\n-Et puis, comme le commencement de ces histoires date de trente ans, il\r\n-n'y a plus personne à Faverolles qui ait connu Jean Valjean. On\r\n-s'informe à Toulon. Avec Brevet, il n'y a plus que deux forçats qui\r\n-aient vu Jean Valjean. Ce sont les condamnés à vie Cochepaille et\r\n-Chenildieu. On les extrait du bagne et on les fait venir. On les\r\n-confronte au prétendu Champmathieu. Ils n'hésitent pas. Pour eux comme\r\n-pour Brevet, c'est Jean Valjean. Même âge, il a cinquante-quatre ans,\r\n-même taille, même air, même homme enfin, c'est lui. C'est en ce\r\n-moment-là même que j'envoyais ma dénonciation à la préfecture de Paris.\r\n-On me répond que je perds l'esprit et que Jean Valjean est à Arras au\r\n-pouvoir de la justice. Vous concevez si cela m'étonne, moi qui croyais\r\n-tenir ici ce même Jean Valjean! J'écris à monsieur le juge\r\n-d'instruction. Il me fait venir, on m'amène le Champmathieu....\r\n-\r\n---Eh bien? interrompit M. Madeleine.\r\n-\r\n-Javert répondit avec son visage incorruptible et triste:\r\n-\r\n---Monsieur le maire, la vérité est la vérité. J'en suis fâché, mais\r\n-c'est cet homme-là qui est Jean Valjean. Moi aussi je l'ai reconnu.\r\n-\r\n-M. Madeleine reprit d'une voix très basse:\r\n-\r\n---Vous êtes sûr?\r\n-\r\n-Javert se mit à rire de ce rire douloureux qui échappe à une conviction\r\n-profonde:\r\n-\r\n---Oh, sûr!\r\n-\r\n-Il demeura un moment pensif, prenant machinalement des pincées de poudre\r\n-de bois dans la sébille à sécher l'encre qui était sur la table, et il\r\n-ajouta:\r\n-\r\n---Et même, maintenant que je vois le vrai Jean Valjean, je ne comprends\r\n-pas comment j'ai pu croire autre chose. Je vous demande pardon, monsieur\r\n-le maire.\r\n-\r\n-En adressant cette parole suppliante et grave à celui qui, six semaines\r\n-auparavant, l'avait humilié en plein corps de garde et lui avait dit:\r\n-«sortez!» Javert, cet homme hautain, était à son insu plein de\r\n-simplicité et de dignité. M. Madeleine ne répondit à sa prière que par\r\n-cette question brusque:\r\n-\r\n---Et que dit cet homme?\r\n-\r\n---Ah, dame! monsieur le maire, l'affaire est mauvaise. Si c'est Jean\r\n-Valjean, il y a récidive. Enjamber un mur, casser une branche, chiper\r\n-des pommes, pour un enfant, c'est une polissonnerie; pour un homme,\r\n-c'est un délit; pour un forçat, c'est un crime. Escalade et vol, tout y\r\n-est. Ce n'est plus la police correctionnelle, c'est la cour d'assises.\r\n-Ce n'est plus quelques jours de prison, ce sont les galères à \r\n-perpétuité. Et puis, il y a l'affaire du petit savoyard que j'espère\r\n-bien qui reviendra. Diable! il y a de quoi se débattre, n'est-ce pas?\r\n-Oui, pour un autre que Jean Valjean. Mais Jean Valjean est un sournois.\r\n-C'est encore là que je le reconnais. Un autre sentirait que cela\r\n-chauffe; il se démènerait, il crierait, la bouilloire chante devant le\r\n-feu, il ne voudrait pas être Jean Valjean, et caetera. Lui, il n'a pas\r\n-l'air de comprendre, il dit: Je suis Champmathieu, je ne sors pas de là !\r\n-Il a l'air étonné, il fait la brute, c'est bien mieux. Oh! le drôle est\r\n-habile. Mais c'est égal, les preuves sont là . Il est reconnu par quatre\r\n-personnes, le vieux coquin sera condamné. C'est porté aux assises, à \r\n-Arras. Je vais y aller pour témoigner. Je suis cité.\r\n-\r\n-M. Madeleine s'était remis à son bureau, avait ressaisi son dossier, et\r\n-le feuilletait tranquillement, lisant et écrivant tour à tour comme un\r\n-homme affairé. Il se tourna vers Javert:\r\n-\r\n---Assez, Javert. Au fait, tous ces détails m'intéressent fort peu. Nous\r\n-perdons notre temps, et nous avons des affaires pressées. Javert, vous\r\n-allez vous rendre sur-le-champ chez la bonne femme Buseaupied qui vend\r\n-des herbes là -bas au coin de la rue Saint-Saulve. Vous lui direz de\r\n-déposer sa plainte contre le charretier Pierre Chesnelong. Cet homme est\r\n-un brutal qui a failli écraser cette femme et son enfant. Il faut qu'il\r\n-soit puni. Vous irez ensuite chez M. Charcellay, rue\r\n-Montre-de-Champigny. Il se plaint qu'il y a une gouttière de la maison\r\n-voisine qui verse l'eau de la pluie chez lui, et qui affouille les\r\n-fondations de sa maison. Après vous constaterez des contraventions de\r\n-police qu'on me signale rue Guibourg chez la veuve Doris, et rue du\r\n-Garraud-Blanc chez madame Renée Le Bossé, et vous dresserez\r\n-procès-verbal. Mais je vous donne là beaucoup de besogne. N'allez-vous\r\n-pas être absent? ne m'avez-vous pas dit que vous alliez à Arras pour\r\n-cette affaire dans huit ou dix jours?...\r\n-\r\n---Plus tôt que cela, monsieur le maire.\r\n-\r\n---Quel jour donc?\r\n-\r\n---Mais je croyais avoir dit à monsieur le maire que cela se jugeait\r\n-demain et que je partais par la diligence cette nuit.\r\n-\r\n-M. Madeleine fit un mouvement imperceptible.\r\n-\r\n---Et combien de temps durera l'affaire?\r\n-\r\n---Un jour tout au plus. L'arrêt sera prononcé au plus tard demain dans\r\n-la nuit. Mais je n'attendrai pas l'arrêt, qui ne peut manquer. Sitôt ma\r\n-déposition faite, je reviendrai ici.\r\n-\r\n---C'est bon, dit M. Madeleine.\r\n-\r\n-Et il congédia Javert d'un signe de main. Javert ne s'en alla pas.\r\n-\r\n---Pardon, monsieur le maire, dit-il.\r\n-\r\n---Qu'est-ce encore? demanda M. Madeleine.\r\n-\r\n---Monsieur le maire, il me reste une chose à vous rappeler.\r\n-\r\n---Laquelle?\r\n-\r\n---C'est que je dois être destitué.\r\n-\r\n-M. Madeleine se leva.\r\n-\r\n---Javert, vous êtes un homme d'honneur, et je vous estime. Vous vous\r\n-exagérez votre faute. Ceci d'ailleurs est encore une offense qui me\r\n-concerne. Javert, vous êtes digne de monter et non de descendre.\r\n-J'entends que vous gardiez votre place.\r\n-\r\n-Javert regarda M. Madeleine avec sa prunelle candide au fond de laquelle\r\n-il semblait qu'on vit cette conscience peu éclairée, mais rigide et\r\n-chaste, et il dit d'une voix tranquille:\r\n-\r\n---Monsieur le maire, je ne puis vous accorder cela.\r\n-\r\n---Je vous répète, répliqua M. Madeleine, que la chose me regarde.\r\n-\r\n-Mais Javert, attentif à sa seule pensée, continua:\r\n-\r\n---Quant à exagérer, je n'exagère point. Voici comment je raisonne. Je\r\n-vous ai soupçonné injustement. Cela, ce n'est rien. C'est notre droit à \r\n-nous autres de soupçonner, quoiqu'il y ait pourtant abus à soupçonner\r\n-au-dessus de soi. Mais, sans preuves, dans un accès de colère, dans le\r\n-but de me venger, je vous ai dénoncé comme forçat, vous, un homme\r\n-respectable, un maire, un magistrat! ceci est grave. Très grave. J'ai\r\n-offensé l'autorité dans votre personne, moi, agent de l'autorité! Si\r\n-l'un de mes subordonnés avait fait ce que j'ai fait, je l'aurais déclaré\r\n-indigne du service, et chassé. Eh bien?\r\n-\r\n-Tenez, monsieur le maire, encore un mot. J'ai souvent été sévère dans ma\r\n-vie. Pour les autres. C'était juste. Je faisais bien. Maintenant, si je\r\n-n'étais pas sévère pour moi, tout ce que j'ai fait de juste deviendrait\r\n-injuste.\r\n-\r\n-Est-ce que je dois m'épargner plus que les autres? Non. Quoi! je\r\n-n'aurais été bon qu'à châtier autrui, et pas moi! mais je serais un\r\n-misérable! mais ceux qui disent: ce gueux de Javert! auraient raison!\r\n-Monsieur le maire, je ne souhaite pas que vous me traitiez avec bonté,\r\n-votre bonté m'a fait faire assez de mauvais sang quand elle était pour\r\n-les autres. Je n'en veux pas pour moi. La bonté qui consiste à donner\r\n-raison à la fille publique contre le bourgeois, à l'agent de police\r\n-contre le maire, à celui qui est en bas contre celui qui est en haut,\r\n-c'est ce que j'appelle de la mauvaise bonté. C'est avec cette bonté-là \r\n-que la société se désorganise. Mon Dieu! c'est bien facile d'être bon,\r\n-le malaisé c'est d'être juste. Allez! si vous aviez été ce que je\r\n-croyais, je n'aurais pas été bon pour vous, moi! vous auriez vu!\r\n-Monsieur le maire, je dois me traiter comme je traiterais tout autre.\r\n-Quand je réprimais des malfaiteurs, quand je sévissais sur des gredins,\r\n-je me suis souvent dit à moi-même: toi, si tu bronches, si jamais je te\r\n-prends en faute, sois tranquille!--J'ai bronché, je me prends en faute,\r\n-tant pis! Allons, renvoyé, cassé, chassé! c'est bon. J'ai des bras, je\r\n-travaillerai à la terre, cela m'est égal. Monsieur le maire, le bien du\r\n-service veut un exemple. Je demande simplement la destitution de\r\n-l'inspecteur Javert.\r\n-\r\n-Tout cela était prononcé d'un accent humble, fier, désespéré et\r\n-convaincu qui donnait je ne sais quelle grandeur bizarre à cet étrange\r\n-honnête homme.\r\n-\r\n---Nous verrons, fit M. Madeleine.\r\n-\r\n-Et il lui tendit la main.\r\n-\r\n-Javert recula, et dit d'un ton farouche:\r\n-\r\n---Pardon, monsieur le maire, mais cela ne doit pas être. Un maire ne\r\n-donne pas la main à un mouchard.\r\n-\r\n-Il ajouta entre ses dents:\r\n-\r\n---Mouchard, oui; du moment où j'ai médusé de la police, je ne suis plus\r\n-qu'un mouchard. Puis il salua profondément, et se dirigea vers la porte.\r\n-Là il se retourna, et, les yeux toujours baissés:\r\n-\r\n---Monsieur le maire, dit-il, je continuerai le service jusqu'à ce que je\r\n-sois remplacé.\r\n-\r\n-Il sortit. M. Madeleine resta rêveur, écoutant ce pas ferme et assuré\r\n-qui s'éloignait sur le pavé du corridor.\r\n-\r\n-\r\n-\r\n-\r\n-Livre septième--L'affaire Champmathieu\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre I\r\n-\r\n-La soeur Simplice\r\n-\r\n-\r\n-Les incidents qu'on va lire n'ont pas tous été connus à \r\n-Montreuil-sur-mer, mais le peu qui en a percé a laissé dans cette ville\r\n-un tel souvenir, que ce serait une grave lacune dans ce livre si nous ne\r\n-les racontions dans leurs moindres détails.\r\n-\r\n-Dans ces détails, le lecteur rencontrera deux ou trois circonstances\r\n-invraisemblables que nous maintenons par respect pour la vérité.\r\n-\r\n-Dans l'après-midi qui suivit la visite de Javert, M. Madeleine alla voir\r\n-la Fantine comme d'habitude.\r\n-\r\n-Avant de pénétrer près de Fantine, il fit demander la soeur Simplice.\r\n-Les deux religieuses qui faisaient le service de l'infirmerie, dames\r\n-lazaristes comme toutes les soeurs de charité, s'appelaient soeur\r\n-Perpétue et soeur Simplice.\r\n-\r\n-La soeur Perpétue était la première villageoise venue, grossièrement\r\n-soeur de charité, entrée chez Dieu comme on entre en place. Elle était\r\n-religieuse comme on est cuisinière. Ce type n'est point très rare. Les\r\n-ordres monastiques acceptent volontiers cette lourde poterie paysanne,\r\n-aisément façonnée en capucin ou en ursuline. Ces rusticités s'utilisent\r\n-pour les grosses besognes de la dévotion. La transition d'un bouvier à \r\n-un carme n'a rien de heurté; l'un devient l'autre sans grand travail; le\r\n-fond commun d'ignorance du village et du cloître est une préparation\r\n-toute faite, et met tout de suite le campagnard de plain-pied avec le\r\n-moine. Un peu d'ampleur au sarrau, et voilà un froc. La soeur Perpétue\r\n-était une forte religieuse, de Marines, près Pontoise, patoisant,\r\n-psalmodiant, bougonnant, sucrant la tisane selon le bigotisme ou\r\n-l'hypocrisie du grabataire, brusquant les malades, bourrue avec les\r\n-mourants, leur jetant presque Dieu au visage, lapidant l'agonie avec des\r\n-prières en colère, hardie, honnête et rougeaude.\r\n-\r\n-La soeur Simplice était blanche d'une blancheur de cire. Près de soeur\r\n-Perpétue, c'était le cierge à côté de la chandelle. Vincent de Paul a\r\n-divinement fixé la figure de la soeur de charité dans ces admirables\r\n-paroles où il mêle tant de liberté à tant de servitude: «Elles n'auront\r\n-pour monastère que la maison des malades, pour cellule qu'une chambre de\r\n-louage, pour chapelle que l'église de leur paroisse, pour cloître que\r\n-les rues de la ville ou les salles des hôpitaux, pour clôture que\r\n-l'obéissance, pour grille que la crainte de Dieu, pour voile que la\r\n-modestie.» Cet idéal était vivant dans la soeur Simplice. Personne n'eût\r\n-pu dire l'âge de la soeur Simplice; elle n'avait jamais été jeune et\r\n-semblait ne devoir jamais être vieille. C'était une personne--nous\r\n-n'osons dire une femme--calme, austère, de bonne compagnie, froide, et\r\n-qui n'avait jamais menti. Elle était si douce qu'elle paraissait\r\n-fragile; plus solide d'ailleurs que le granit. Elle touchait aux\r\n-malheureux avec de charmants doigts fins et purs. Il y avait, pour ainsi\r\n-dire, du silence dans sa parole; elle parlait juste le nécessaire, et\r\n-elle avait un son de voix qui eût tout à la fois édifié un confessionnal\r\n-et enchanté un salon. Cette délicatesse s'accommodait de la robe de\r\n-bure, trouvant à ce rude contact un rappel continuel du ciel et de Dieu.\r\n-Insistons sur un détail. N'avoir jamais menti, n'avoir jamais dit, pour\r\n-un intérêt quelconque, même indifféremment, une chose qui ne fût la\r\n-vérité, la sainte vérité, c'était le trait distinctif de la soeur\r\n-Simplice; c'était l'accent de sa vertu. Elle était presque célèbre dans\r\n-la congrégation pour cette véracité imperturbable. L'abbé Sicard parle\r\n-de la soeur Simplice dans une lettre au sourd-muet Massieu. Si sincères,\r\n-si loyaux et si purs que nous soyons, nous avons tous sur notre candeur\r\n-au moins la fêlure du petit mensonge innocent. Elle, point. Petit\r\n-mensonge, mensonge innocent, est-ce que cela existe? Mentir, c'est\r\n-l'absolu du mal. Peu mentir n'est pas possible; celui qui ment, ment\r\n-tout le mensonge; mentir, c'est la face même du démon; Satan a deux\r\n-noms, il s'appelle Satan et il s'appelle Mensonge. Voilà ce qu'elle\r\n-pensait. Et comme elle pensait, elle pratiquait. Il en résultait cette\r\n-blancheur dont nous avons parlé, blancheur qui couvrait de son\r\n-rayonnement même ses lèvres et ses yeux. Son sourire était blanc, son\r\n-regard était blanc. Il n'y avait pas une toile d'araignée, pas un grain\r\n-de poussière à la vitre de cette conscience. En entrant dans l'obédience\r\n-de saint Vincent de Paul, elle avait pris le nom de Simplice par choix\r\n-spécial. Simplice de Sicile, on le sait, est cette sainte qui aima mieux\r\n-se laisser arracher les deux seins que de répondre, étant née à \r\n-Syracuse, qu'elle était née à Ségeste, mensonge qui la sauvait. Cette\r\n-patronne convenait à cette âme.\r\n-\r\n-La soeur Simplice, en entrant dans l'ordre, avait deux défauts dont elle\r\n-s'était peu à peu corrigée; elle avait eu le goût des friandises et elle\r\n-avait aimé à recevoir des lettres. Elle ne lisait jamais qu'un livre de\r\n-prières en gros caractères et en latin. Elle ne comprenait pas le latin,\r\n-mais elle comprenait le livre.\r\n-\r\n-La pieuse fille avait pris en affection Fantine, y sentant probablement\r\n-de la vertu latente, et s'était dévouée à la soigner presque\r\n-exclusivement.\r\n-\r\n-M. Madeleine emmena à part la soeur Simplice et lui recommanda Fantine\r\n-avec un accent singulier dont la soeur se souvint plus tard.\r\n-\r\n-En quittant la soeur, il s'approcha de Fantine.\r\n-\r\n-Fantine attendait chaque jour l'apparition de M. Madeleine comme on\r\n-attend un rayon de chaleur et de joie. Elle disait aux soeurs:\r\n-\r\n---Je ne vis que lorsque monsieur le maire est là .\r\n-\r\n-Elle avait ce jour-là beaucoup de fièvre. Dès qu'elle vit M. Madeleine,\r\n-elle lui demanda:\r\n-\r\n---Et Cosette?\r\n-\r\n-Il répondit en souriant:\r\n-\r\n---Bientôt.\r\n-\r\n-M. Madeleine fut avec Fantine comme à l'ordinaire. Seulement il resta\r\n-une heure au lieu d'une demi-heure, au grand contentement de Fantine. Il\r\n-fît mille instances à tout le monde pour que rien ne manquât à la\r\n-malade. On remarqua qu'il y eut un moment où son visage devint très\r\n-sombre. Mais cela s'expliqua quand on sut que le médecin s'était penché\r\n-à son oreille et lui avait dit:\r\n-\r\n---Elle baisse beaucoup.\r\n-\r\n-Puis il rentra à la mairie, et le garçon de bureau le vit examiner avec\r\n-attention une carte routière de France qui était suspendue dans son\r\n-cabinet. Il écrivit quelques chiffres au crayon sur un papier.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre II\r\n-\r\n-Perspicacité de maître Scaufflaire\r\n-\r\n-\r\n-De la mairie il se rendit au bout de la ville chez un Flamand, maître\r\n-Scaufflaër, francisé Scaufflaire, qui louait des chevaux et des\r\n-«cabriolets à volonté».\r\n-\r\n-Pour aller chez ce Scaufflaire, le plus court était de prendre une rue\r\n-peu fréquentée où était le presbytère de la paroisse que M. Madeleine\r\n-habitait. Le curé était, disait-on, un homme digne et respectable, et de\r\n-bon conseil. À l'instant où M. Madeleine arriva devant le presbytère, il\r\n-n'y avait dans la rue qu'un passant, et ce passant remarqua ceci: M. le\r\n-maire, après avoir dépassé la maison curiale, s'arrêta, demeura\r\n-immobile, puis revint sur ses pas et rebroussa chemin jusqu'à la porte\r\n-du presbytère, qui était une porte bâtarde avec marteau de fer. Il mit\r\n-vivement la main au marteau, et le souleva; puis il s'arrêta de nouveau,\r\n-et resta court, et comme pensif, et, après quelques secondes, au lieu de\r\n-laisser bruyamment retomber le marteau, il le reposa doucement et reprit\r\n-son chemin avec une sorte de hâte qu'il n'avait pas auparavant.\r\n-\r\n-M. Madeleine trouva maître Scaufflaire chez lui occupé à repiquer un\r\n-harnais.\r\n-\r\n---Maître Scaufflaire, demanda-t-il, avez-vous un bon cheval?\r\n-\r\n---Monsieur le maire, dit le Flamand, tous mes chevaux sont bons.\r\n-Qu'entendez-vous par un bon cheval?\r\n-\r\n---J'entends un cheval qui puisse faire vingt lieues en un jour.\r\n-\r\n---Diable! fit le Flamand, vingt lieues!\r\n-\r\n---Oui.\r\n-\r\n---Attelé à un cabriolet?\r\n-\r\n---Oui.\r\n-\r\n---Et combien de temps se reposera-t-il après la course?\r\n-\r\n---Il faut qu'il puisse au besoin repartir le lendemain.\r\n-\r\n---Pour refaire le même trajet?\r\n-\r\n---Oui.\r\n-\r\n---Diable! diable! et c'est vingt lieues? M. Madeleine tira de sa poche\r\n-le papier où il avait crayonné des chiffres. Il les montra au Flamand.\r\n-C'étaient les chiffres 5, 6, 8-1/2.\r\n-\r\n---Vous voyez, dit-il. Total, dix-neuf et demi, autant dire vingt lieues.\r\n-\r\n---Monsieur le maire, reprit le Flamand, j'ai votre affaire. Mon petit\r\n-cheval blanc. Vous avez dû le voir passer quelquefois. C'est une petite\r\n-bête du bas Boulonnais. C'est plein de feu. On a voulu d'abord en faire\r\n-un cheval de selle. Bah! il ruait, il flanquait tout le monde par terre.\r\n-On le croyait vicieux, on ne savait qu'en faire. Je l'ai acheté. Je l'ai\r\n-mis au cabriolet. Monsieur, c'est cela qu'il voulait; il est doux comme\r\n-une fille, il va le vent. Ah! par exemple, il ne faudrait pas lui monter\r\n-sur le dos. Ce n'est pas son idée d'être cheval de selle. Chacun a son\r\n-ambition. Tirer, oui, porter, non; il faut croire qu'il s'est dit ça.\r\n-\r\n---Et il fera la course?\r\n-\r\n---Vos vingt lieues. Toujours au grand trot, et en moins de huit heures.\r\n-Mais voici à quelles conditions.\r\n-\r\n---Dites.\r\n-\r\n---Premièrement, vous le ferez souffler une heure à moitié chemin; il\r\n-mangera, et on sera là pendant qu'il mangera pour empêcher le garçon de\r\n-l'auberge de lui voler son avoine; car j'ai remarqué que dans les\r\n-auberges l'avoine est plus souvent bue par les garçons d'écurie que\r\n-mangée par les chevaux.\r\n-\r\n---On sera là .\r\n-\r\n---Deuxièmement.... Est-ce pour monsieur le maire le cabriolet?\r\n-\r\n---Oui.\r\n-\r\n---Monsieur le maire sait conduire?\r\n-\r\n---Oui.\r\n-\r\n---Eh bien, monsieur le maire voyagera seul et sans bagage afin de ne\r\n-point charger le cheval.\r\n-\r\n---Convenu.\r\n-\r\n---Mais monsieur le maire, n'ayant personne avec lui, sera obligé de\r\n-prendre la peine de surveiller lui-même l'avoine.\r\n-\r\n---C'est dit.\r\n-\r\n---Il me faudra trente francs par jour. Les jours de repos payés. Pas un\r\n-liard de moins, et la nourriture de la bête à la charge de monsieur le\r\n-maire.\r\n-\r\n-M. Madeleine tira trois napoléons de sa bourse et les mit sur la table.\r\n-\r\n---Voilà deux jours d'avance.\r\n-\r\n---Quatrièmement, pour une course pareille sur cabriolet serait trop\r\n-lourd et fatiguerait le cheval. Il faudrait que monsieur le maire\r\n-consentît à voyager dans un petit tilbury que j'ai.\r\n-\r\n---J'y consens.\r\n-\r\n---C'est léger, mais c'est découvert.\r\n-\r\n---Cela m'est égal.\r\n-\r\n---Monsieur le maire a-t-il réfléchi que nous sommes en hiver?...\r\n-\r\n-M. Madeleine ne répondit pas. Le Flamand reprit:\r\n-\r\n---Qu'il fait très froid?\r\n-\r\n-M. Madeleine garda le silence. Maître Scaufflaire continua:\r\n-\r\n---Qu'il peut pleuvoir?\r\n-\r\n-M. Madeleine leva la tête et dit:\r\n-\r\n---Le tilbury et le cheval seront devant ma porte demain à quatre heures\r\n-et demie du matin.\r\n-\r\n---C'est entendu, monsieur le maire, répondit Scaufflaire, puis, grattant\r\n-avec l'ongle de son pouce une tache qui était dans le bois de la table,\r\n-il reprit de cet air insouciant que les Flamands savent si bien mêler à \r\n-leur finesse:\r\n-\r\n---Mais voilà que j'y songe à présent! monsieur le maire ne me dit pas où\r\n-il va. Où est-ce que va monsieur le maire?\r\n-\r\n-Il ne songeait pas à autre chose depuis le commencement de la\r\n-conversation, mais il ne savait pourquoi il n'avait pas osé faire cette\r\n-question.\r\n-\r\n---Votre cheval a-t-il de bonnes jambes de devant? dit M. Madeleine.\r\n-\r\n---Oui, monsieur le maire. Vous le soutiendrez un peu dans les descentes.\r\n-Y a-t-il beaucoup de descentes d'ici où vous allez?\r\n-\r\n---N'oubliez pas d'être à ma porte à quatre heures et demie du matin,\r\n-très précises, répondit M. Madeleine; et il sortit.\r\n-\r\n-Le Flamand resta «tout bête», comme il disait lui-même quelque temps\r\n-après.\r\n-\r\n-Monsieur le maire était sorti depuis deux ou trois minutes, lorsque la\r\n-porte se rouvrit; c'était M. le maire. Il avait toujours le même air\r\n-impassible et préoccupé.\r\n-\r\n---Monsieur Scaufflaire, dit-il, à quelle somme estimez-vous le cheval et\r\n-le tilbury que vous me louerez, l'un portant l'autre?\r\n-\r\n---L'un traînant l'autre, monsieur le maire, dit le Flamand avec un gros\r\n-rire.\r\n-\r\n---Soit. Eh bien!\r\n-\r\n---Est-ce que monsieur le maire veut me les acheter?\r\n-\r\n---Non, mais à tout événement, je veux vous les garantir. À mon retour\r\n-vous me rendrez la somme. Combien estimez-vous cabriolet et cheval?\r\n-\r\n---À cinq cents francs, monsieur le maire.\r\n-\r\n---Les voici.\r\n-\r\n-M. Madeleine posa un billet de banque sur la table, puis sortit et cette\r\n-fois ne rentra plus.\r\n-\r\n-Maître Scaufflaire regretta affreusement de n'avoir point dit mille\r\n-francs. Du reste le cheval et le tilbury, en bloc, valaient cent écus.\r\n-\r\n-Le Flamand appela sa femme, et lui conta la chose. Où diable monsieur le\r\n-maire peut-il aller? Ils tinrent conseil.\r\n-\r\n---Il va à Paris, dit la femme.\r\n-\r\n---Je ne crois pas, dit le mari.\r\n-\r\n-M. Madeleine avait oublié sur la cheminée le papier où il avait tracé\r\n-des chiffres. Le Flamand le prit et l'étudia.\r\n-\r\n---Cinq, six, huit et demi? cela doit marquer des relais de poste.\r\n-\r\n-Il se tourna vers sa femme.\r\n-\r\n---J'ai trouvé.\r\n-\r\n---Comment?\r\n-\r\n---Il y a cinq lieues d'ici à Hesdin, six de Hesdin à Saint-Pol, huit et\r\n-demie de Saint-Pol à Arras. Il va à Arras.\r\n-\r\n-Cependant M. Madeleine était rentré chez lui.\r\n-\r\n-Pour revenir de chez maître Scaufflaire, il avait pris le plus long,\r\n-comme si la porte du presbytère avait été pour lui une tentation, et\r\n-qu'il eût voulu l'éviter. Il était monté dans sa chambre et s'y était\r\n-enfermé, ce qui n'avait rien que de simple, car il se couchait\r\n-volontiers de bonne heure. Pourtant la concierge de la fabrique, qui\r\n-était en même temps l'unique servante de M. Madeleine, observa que sa\r\n-lumière s'éteignit à huit heures et demie, et elle le dit au caissier\r\n-qui rentrait, en ajoutant:\r\n-\r\n---Est-ce que monsieur le maire est malade? je lui ai trouvé l'air un peu\r\n-singulier.\r\n-\r\n-Ce caissier habitait une chambre située précisément au-dessous de la\r\n-chambre de M. Madeleine. Il ne prit point garde aux paroles de la\r\n-portière, se coucha et s'endormit. Vers minuit, il se réveilla\r\n-brusquement; il avait entendu à travers son sommeil un bruit au-dessus\r\n-de sa tête. Il écouta. C'était un pas qui allait et venait, comme si\r\n-l'on marchait dans la chambre en haut. Il écouta plus attentivement, et\r\n-reconnut le pas de M. Madeleine. Cela lui parut étrange; habituellement\r\n-aucun bruit ne se faisait dans la chambre de M. Madeleine avant l'heure\r\n-de son lever. Un moment après le caissier entendit quelque chose qui\r\n-ressemblait à une armoire qu'on ouvre et qu'on referme. Puis on dérangea\r\n-un meuble, il y eut un silence, et le pas recommença. Le caissier se\r\n-dressa sur son séant, s'éveilla tout à fait, regarda, et à travers les\r\n-vitres de sa croisée aperçut sur le mur d'en face la réverbération\r\n-rougeâtre d'une fenêtre éclairée. À la direction des rayons, ce ne\r\n-pouvait être que la fenêtre de la chambre de M. Madeleine. La\r\n-réverbération tremblait comme si elle venait plutôt d'un feu allumé que\r\n-d'une lumière. L'ombre des châssis vitrés ne s'y dessinait pas, ce qui\r\n-indiquait que la fenêtre était toute grande ouverte. Par le froid qu'il\r\n-faisait, cette fenêtre ouverte était surprenante. Le caissier se\r\n-rendormit. Une heure ou deux après, il se réveilla encore. Le même pas,\r\n-lent et régulier, allait et venait toujours au-dessus de sa tête.\r\n-\r\n-La réverbération se dessinait toujours sur le mur, mais elle était\r\n-maintenant pâle et paisible comme le reflet d'une lampe ou d'une bougie.\r\n-La fenêtre était toujours ouverte. Voici ce qui se passait dans la\r\n-chambre de M. Madeleine.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre III\r\n-\r\n-Une tempête sous un crâne\r\n-\r\n-\r\n-Le lecteur a sans doute deviné que M. Madeleine n'est autre que Jean\r\n-Valjean.\r\n-\r\n-Nous avons déjà regardé dans les profondeurs de cette conscience; le\r\n-moment est venu d'y regarder encore. Nous ne le faisons pas sans émotion\r\n-et sans tremblement. Il n'existe rien de plus terrifiant que cette sorte\r\n-de contemplation. L'oeil de l'esprit ne peut trouver nulle part plus\r\n-d'éblouissements ni plus de ténèbres que dans l'homme; il ne peut se\r\n-fixer sur aucune chose qui soit plus redoutable, plus compliquée, plus\r\n-mystérieuse et plus infinie. Il y a un spectacle plus grand que la mer,\r\n-c'est le ciel; il y a un spectacle plus grand que le ciel, c'est\r\n-l'intérieur de l'âme.\r\n-\r\n-Faire le poème de la conscience humaine, ne fût-ce qu'à propos d'un seul\r\n-homme, ne fût-ce qu'à propos du plus infime des hommes, ce serait fondre\r\n-toutes les épopées dans une épopée supérieure et définitive. La\r\n-conscience, c'est le chaos des chimères, des convoitises et des\r\n-tentatives, la fournaise des rêves, l'antre des idées dont on a honte;\r\n-c'est le pandémonium des sophismes, c'est le champ de bataille des\r\n-passions. À de certaines heures, pénétrez à travers la face livide d'un\r\n-être humain qui réfléchit, et regardez derrière, regardez dans cette\r\n-âme, regardez dans cette obscurité. Il y a là , sous le silence\r\n-extérieur, des combats de géants comme dans Homère, des mêlées de\r\n-dragons et d'hydres et des nuées de fantômes comme dans Milton, des\r\n-spirales visionnaires comme chez Dante. Chose sombre que cet infini que\r\n-tout homme porte en soi et auquel il mesure avec désespoir les volontés\r\n-de son cerveau et les actions de sa vie!\r\n-\r\n-Alighieri rencontra un jour une sinistre porte devant laquelle il\r\n-hésita. En voici une aussi devant nous, au seuil de laquelle nous\r\n-hésitons. Entrons pourtant.\r\n-\r\n-Nous n'avons que peu de chose à ajouter à ce que le lecteur connaît déjà \r\n-de ce qui était arrivé à Jean Valjean depuis l'aventure de\r\n-Petit-Gervais. À partir de ce moment, on l'a vu, il fut un autre homme.\r\n-Ce que l'évêque avait voulu faire de lui, il l'exécuta. Ce fut plus\r\n-qu'une transformation, ce fut une transfiguration.\r\n-\r\n-Il réussit à disparaître, vendit l'argenterie de l'évêque, ne gardant\r\n-que les flambeaux, comme souvenir, se glissa de ville en ville, traversa\r\n-la France, vint à Montreuil-sur-mer, eut l'idée que nous avons dite,\r\n-accomplit ce que nous avons raconté, parvint à se faire insaisissable et\r\n-inaccessible, et désormais, établi à Montreuil-sur-mer, heureux de\r\n-sentir sa conscience attristée par son passé et la première moitié de\r\n-son existence démentie par la dernière, il vécut paisible, rassuré et\r\n-espérant, n'ayant plus que deux pensées: cacher son nom, et sanctifier\r\n-sa vie; échapper aux hommes, et revenir à Dieu.\r\n-\r\n-Ces deux pensées étaient si étroitement mêlées dans son esprit qu'elles\r\n-n'en formaient qu'une seule; elles étaient toutes deux également\r\n-absorbantes et impérieuses, et dominaient ses moindres actions.\r\n-D'ordinaire elles étaient d'accord pour régler la conduite de sa vie;\r\n-elles le tournaient vers l'ombre; elles le faisaient bienveillant et\r\n-simple; elles lui conseillaient les mêmes choses. Quelquefois cependant\r\n-il y avait conflit entre elles. Dans ce cas-là , on s'en souvient,\r\n-l'homme que tout le pays de Montreuil-sur-mer appelait M. Madeleine ne\r\n-balançait pas à sacrifier la première à la seconde, sa sécurité à sa\r\n-vertu. Ainsi, en dépit de toute réserve et de toute prudence, il avait\r\n-gardé les chandeliers de l'évêque, porté son deuil, appelé et interrogé\r\n-tous les petits savoyards qui passaient, pris des renseignements sur les\r\n-familles de Faverolles, et sauvé la vie au vieux Fauchelevent, malgré\r\n-les inquiétantes insinuations de Javert. Il semblait, nous l'avons déjà \r\n-remarqué, qu'il pensât, à l'exemple de tous ceux qui ont été sages,\r\n-saints et justes, que son premier devoir n'était pas envers lui.\r\n-\r\n-Toutefois, il faut le dire, jamais rien de pareil ne s'était encore\r\n-présenté. Jamais les deux idées qui gouvernaient le malheureux homme\r\n-dont nous racontons les souffrances n'avaient engagé une lutte si\r\n-sérieuse. Il le comprit confusément, mais profondément, dès les\r\n-premières paroles que prononça Javert, en entrant dans son cabinet.\r\n-\r\n-Au moment où fut si étrangement articulé ce nom qu'il avait enseveli\r\n-sous tant d'épaisseurs, il fut saisi de stupeur et comme enivré par la\r\n-sinistre bizarrerie de sa destinée, et, à travers cette stupeur, il eut\r\n-ce tressaillement qui précède les grandes secousses; il se courba comme\r\n-un chêne à l'approche d'un orage, comme un soldat à l'approche d'un\r\n-assaut. Il sentit venir sur sa tête des ombres pleines de foudres et\r\n-d'éclairs. Tout en écoutant parler Javert, il eut une première pensée\r\n-d'aller, de courir, de se dénoncer, de tirer ce Champmathieu de prison\r\n-et de s'y mettre; cela fut douloureux et poignant comme une incision\r\n-dans la chair vive, puis cela passa, et il se dit: «Voyons! voyons!» Il\r\n-réprima ce premier mouvement généreux et recula devant l'héroïsme.\r\n-\r\n-Sans doute, il serait beau qu'après les saintes paroles de l'évêque,\r\n-après tant d'années de repentir et d'abnégation, au milieu d'une\r\n-pénitence admirablement commencée, cet homme, même en présence d'une si\r\n-terrible conjoncture, n'eût pas bronché un instant et eût continué de\r\n-marcher du même pas vers ce précipice ouvert au fond duquel était le\r\n-ciel; cela serait beau, mais cela ne fut pas ainsi. Il faut bien que\r\n-nous rendions compte des choses qui s'accomplissaient dans cette âme, et\r\n-nous ne pouvons dire que ce qui y était. Ce qui l'emporta tout d'abord,\r\n-ce fut l'instinct de la conservation; il rallia en hâte ses idées,\r\n-étouffa ses émotions, considéra la présence de Javert, ce grand péril,\r\n-ajourna toute résolution avec la fermeté de l'épouvante, s'étourdit sur\r\n-ce qu'il y avait à faire, et reprit son calme comme un lutteur ramasse\r\n-son bouclier.\r\n-\r\n-Le reste de la journée il fut dans cet état, un tourbillon au dedans,\r\n-une tranquillité profonde au dehors; il ne prit que ce qu'on pourrait\r\n-appeler «les mesures conservatoires». Tout était encore confus et se\r\n-heurtait dans son cerveau; le trouble y était tel qu'il ne voyait\r\n-distinctement la forme d'aucune idée; et lui-même n'aurait pu rien dire\r\n-de lui-même, si ce n'est qu'il venait de recevoir un grand coup. Il se\r\n-rendit comme d'habitude près du lit de douleur de Fantine et prolongea\r\n-sa visite, par un instinct de bonté, se disant qu'il fallait agir ainsi\r\n-et la bien recommander aux soeurs pour le cas où il arriverait qu'il eût\r\n-à s'absenter. Il sentit vaguement qu'il faudrait peut-être aller à \r\n-Arras, et, sans être le moins du monde décidé à ce voyage, il se dit\r\n-qu'à l'abri de tout soupçon comme il l'était, il n'y avait point\r\n-d'inconvénient à être témoin de ce qui se passerait, et il retint le\r\n-tilbury de Scaufflaire, afin d'être préparé à tout événement.\r\n-\r\n-Il dîna avec assez d'appétit.\r\n-\r\n-Rentré dans sa chambre il se recueillit.\r\n-\r\n-Il examina la situation et la trouva inouïe; tellement inouïe qu'au\r\n-milieu de sa rêverie, par je ne sais quelle impulsion d'anxiété presque\r\n-inexplicable, il se leva de sa chaise et ferma sa porte au verrou. Il\r\n-craignait qu'il n'entrât encore quelque chose. Il se barricadait contre\r\n-le possible.\r\n-\r\n-Un moment après il souffla sa lumière. Elle le gênait.\r\n-\r\n-Il lui semblait qu'on pouvait le voir.\r\n-\r\n-Qui, on?\r\n-\r\n-Hélas! ce qu'il voulait mettre à la porte était entré ce qu'il voulait\r\n-aveugler, le regardait. Sa conscience.\r\n-\r\n-Sa conscience, c'est-à -dire Dieu.\r\n-\r\n-Pourtant, dans le premier moment, il se fit illusion; il eut un\r\n-sentiment de sûreté et de solitude; le verrou tiré, il se crut\r\n-imprenable; la chandelle éteinte, il se sentit invisible. Alors il prit\r\n-possession de lui-même; il posa ses coudes sur la table, appuya la tête\r\n-sur sa main, et se mit à songer dans les ténèbres.\r\n-\r\n---Où en suis-je?--Est-ce que je ne rêve pas? Que m'a-t-on dit?--Est-il\r\n-bien vrai que j'aie vu ce Javert et qu'il m'ait parlé ainsi?--Que peut\r\n-être ce Champmathieu?--Il me ressemble donc?--Est-ce possible?--Quand\r\n-je pense qu'hier j'étais si tranquille et si loin de me douter de\r\n-rien!--Qu'est-ce que je faisais donc hier à pareille heure?--Qu'y a-t-il\r\n-dans cet incident?--Comment se dénouera-t-il?--Que faire?\r\n-\r\n-Voilà dans quelle tourmente il était. Son cerveau avait perdu la force\r\n-de retenir ses idées, elles passaient comme des ondes, et il prenait son\r\n-front dans ses deux mains pour les arrêter.\r\n-\r\n-De ce tumulte qui bouleversait sa volonté et sa raison, et dont il\r\n-cherchait à tirer une évidence et une résolution, rien ne se dégageait\r\n-que l'angoisse.\r\n-\r\n-Sa tête était brûlante. Il alla à la fenêtre et l'ouvrit toute grande.\r\n-Il n'y avait pas d'étoiles au ciel. Il revint s'asseoir près de la\r\n-table.\r\n-\r\n-La première heure s'écoula ainsi.\r\n-\r\n-Peu à peu cependant des linéaments vagues commencèrent à se former et à \r\n-se fixer dans sa méditation, et il put entrevoir avec la précision de la\r\n-réalité, non l'ensemble de la situation, mais quelques détails.\r\n-\r\n-Il commença par reconnaître que, si extraordinaire et si critique que\r\n-fût cette situation, il en était tout à fait le maître.\r\n-\r\n-Sa stupeur ne fit que s'en accroître.\r\n-\r\n-Indépendamment du but sévère et religieux que se proposaient ses\r\n-actions, tout ce qu'il avait fait jusqu'à ce jour n'était autre chose\r\n-qu'un trou qu'il creusait pour y enfouir son nom. Ce qu'il avait\r\n-toujours le plus redouté, dans ses heures de repli sur lui-même, dans\r\n-ses nuits d'insomnie, c'était d'entendre jamais prononcer ce nom; il se\r\n-disait que ce serait là pour lui la fin de tout; que le jour où ce nom\r\n-reparaîtrait, il ferait évanouir autour de lui sa vie nouvelle, et qui\r\n-sait même peut-être? au dedans de lui sa nouvelle âme. Il frémissait de\r\n-la seule pensée que c'était possible. Certes, si quelqu'un lui eût dit\r\n-en ces moments-là qu'une heure viendrait où ce nom retentirait à son\r\n-oreille, où ce hideux mot, Jean Valjean, sortirait tout à coup de la\r\n-nuit et se dresserait devant lui, où cette lumière formidable faite pour\r\n-dissiper le mystère dont il s'enveloppait resplendirait subitement sur\r\n-sa tête; et que ce nom ne le menacerait pas, que cette lumière ne\r\n-produirait qu'une obscurité plus épaisse, que ce voile déchiré\r\n-accroîtrait le mystère; que ce tremblement de terre consoliderait son\r\n-édifice, que ce prodigieux incident n'aurait d'autre résultat, si bon\r\n-lui semblait, à lui, que de rendre son existence à la fois plus claire\r\n-et plus impénétrable, et que, de sa confrontation avec le fantôme de\r\n-Jean Valjean, le bon et digne bourgeois monsieur Madeleine sortirait\r\n-plus honoré, plus paisible et plus respecté que jamais,--si quelqu'un\r\n-lui eût dit cela, il eût hoché la tête et regardé ces paroles comme\r\n-insensées. Eh bien! tout cela venait précisément d'arriver, tout cet\r\n-entassement de l'impossible était un fait, et Dieu avait permis que ces\r\n-choses folles devinssent des choses réelles!\r\n-\r\n-Sa rêverie continuait de s'éclaircir. Il se rendait de plus en plus\r\n-compte de sa position. Il lui semblait qu'il venait de s'éveiller de je\r\n-ne sais quel sommeil, et qu'il se trouvait glissant sur une pente au\r\n-milieu de la nuit, debout, frissonnant, reculant en vain, sur le bord\r\n-extrême d'un abîme. Il entrevoyait distinctement dans l'ombre un\r\n-inconnu, un étranger, que la destinée prenait pour lui et poussait dans\r\n-le gouffre à sa place. Il fallait, pour que le gouffre se refermât, que\r\n-quelqu'un y tombât, lui ou l'autre.\r\n-\r\n-Il n'avait qu'à laisser faire.\r\n-\r\n-La clarté devint complète, et il s'avoua ceci:--Que sa place était vide\r\n-aux galères, qu'il avait beau faire, qu'elle l'y attendait toujours, que\r\n-le vol de Petit-Gervais l'y ramenait, que cette place vide l'attendrait\r\n-et l'attirerait jusqu'à ce qu'il y fût, que cela était inévitable et\r\n-fatal.--Et puis il se dit:--Qu'en ce moment il avait un remplaçant,\r\n-qu'il paraissait qu'un nommé Champmathieu avait cette mauvaise chance,\r\n-et que, quant à lui, présent désormais au bagne dans la personne de ce\r\n-Champmathieu, présent dans la société sous le nom de M. Madeleine, il\r\n-n'avait plus rien à redouter, pourvu qu'il n'empêchât pas les hommes de\r\n-sceller sur la tête de ce Champmathieu cette pierre de l'infamie qui,\r\n-comme la pierre du sépulcre, tombe une fois et ne se relève jamais.\r\n-\r\n-Tout cela était si violent et si étrange qu'il se fit soudain en lui\r\n-cette espèce de mouvement indescriptible qu'aucun homme n'éprouve plus\r\n-de deux ou trois fois dans sa vie, sorte de convulsion de la conscience\r\n-qui remue tout ce que le coeur a de douteux, qui se compose d'ironie, de\r\n-joie et de désespoir, et qu'on pourrait appeler un éclat de rire\r\n-intérieur.\r\n-\r\n-Il ralluma brusquement sa bougie.\r\n-\r\n---Eh bien quoi! se dit-il, de quoi est-ce que j'ai peur? qu'est-ce que\r\n-j'ai à songer comme cela? Me voilà sauvé. Tout est fini. Je n'avais plus\r\n-qu'une porte entr'ouverte par laquelle mon passé pouvait faire irruption\r\n-dans ma vie; cette porte, la voilà murée! à jamais! Ce Javert qui me\r\n-trouble depuis si longtemps, ce redoutable instinct qui semblait m'avoir\r\n-deviné, qui m'avait deviné, pardieu! et qui me suivait partout, cet\r\n-affreux chien de chasse toujours en arrêt sur moi, le voilà dérouté,\r\n-occupé ailleurs, absolument dépisté! Il est satisfait désormais, il me\r\n-laissera tranquille, il tient son Jean Valjean! Qui sait même, il est\r\n-probable qu'il voudra quitter la ville! Et tout cela s'est fait sans\r\n-moi! Et je n'y suis pour rien! Ah çà , mais! qu'est-ce qu'il y a de\r\n-malheureux dans ceci? Des gens qui me verraient, parole d'honneur!\r\n-croiraient qu'il m'est arrivé une catastrophe! Après tout, s'il y a du\r\n-mal pour quelqu'un, ce n'est aucunement de ma faute. C'est la providence\r\n-qui a tout fait. C'est qu'elle veut cela apparemment!\r\n-\r\n-Ai-je le droit de déranger ce qu'elle arrange? Qu'est-ce que je demande\r\n-à présent? De quoi est-ce que je vais me mêler? Cela ne me regarde pas.\r\n-Comment! je ne suis pas content! Mais qu'est-ce qu'il me faut donc? Le\r\n-but auquel j'aspire depuis tant d'années, le songe de mes nuits, l'objet\r\n-de mes prières au ciel, la sécurité, je l'atteins! C'est Dieu qui le\r\n-veut. Je n'ai rien à faire contre la volonté de Dieu. Et pourquoi Dieu\r\n-le veut-il? Pour que je continue ce que j'ai commencé, pour que je fasse\r\n-le bien, pour que je sois un jour un grand et encourageant exemple, pour\r\n-qu'il soit dit qu'il y a eu enfin un peu de bonheur attaché à cette\r\n-pénitence que j'ai subie et à cette vertu où je suis revenu! Vraiment je\r\n-ne comprends pas pourquoi j'ai eu peur tantôt d'entrer chez ce brave\r\n-curé et de tout lui raconter comme à un confesseur, et de lui demander\r\n-conseil, c'est évidemment là ce qu'il m'aurait dit. C'est décidé,\r\n-laissons aller les choses! laissons faire le bon Dieu!\r\n-\r\n-Il se parlait ainsi dans les profondeurs de sa conscience, penché sur ce\r\n-qu'on pourrait appeler son propre abîme. Il se leva de sa chaise, et se\r\n-mit à marcher dans la chambre.--Allons, dit-il, n'y pensons plus. Voilà \r\n-une résolution prise!--Mais il ne sentit aucune joie.\r\n-\r\n-Au contraire.\r\n-\r\n-On n'empêche pas plus la pensée de revenir à une idée que la mer de\r\n-revenir à un rivage. Pour le matelot, cela s'appelle la marée; pour le\r\n-coupable, cela s'appelle le remords. Dieu soulève l'âme comme l'océan.\r\n-\r\n-Au bout de peu d'instants, il eut beau faire, il reprit ce sombre\r\n-dialogue dans lequel c'était lui qui parlait et lui qui écoutait, disant\r\n-ce qu'il eût voulu taire, écoutant ce qu'il n'eût pas voulu entendre,\r\n-cédant à cette puissance mystérieuse qui lui disait: pense! comme elle\r\n-disait il y a deux mille ans à un autre condamné, marche!\r\n-\r\n-Avant d'aller plus loin et pour être pleinement compris, insistons sur\r\n-une observation nécessaire.\r\n-\r\n-Il est certain qu'on se parle à soi-même, il n'est pas un être pensant\r\n-qui ne l'ait éprouvé. On peut dire même que le verbe n'est jamais un\r\n-plus magnifique mystère que lorsqu'il va, dans l'intérieur d'un homme,\r\n-de la pensée à la conscience et qu'il retourne de la conscience à la\r\n-pensée. C'est dans ce sens seulement qu'il faut entendre les mots\r\n-souvent employés dans ce chapitre, il dit, il s'écria. On se dit, on se\r\n-parle, on s'écrie en soi-même, sans que le silence extérieur soit rompu.\r\n-Il y a un grand tumulte; tout parle en nous, excepté la bouche. Les\r\n-réalités de l'âme, pour n'être point visibles et palpables, n'en sont\r\n-pas moins des réalités.\r\n-\r\n-Il se demanda donc où il en était. Il s'interrogea sur cette «résolution\r\n-prise». Il se confessa à lui-même que tout ce qu'il venait d'arranger\r\n-dans son esprit était monstrueux, que «laisser aller les choses, laisser\r\n-faire le bon Dieu», c'était tout simplement horrible. Laisser\r\n-s'accomplir cette méprise de la destinée et des hommes, ne pas\r\n-l'empêcher, s'y prêter par son silence, ne rien faire enfin, c'était\r\n-faire tout! c'était le dernier degré de l'indignité hypocrite! c'était\r\n-un crime bas, lâche, sournois, abject, hideux!\r\n-\r\n-Pour la première fois depuis huit années, le malheureux homme venait de\r\n-sentir la saveur amère d'une mauvaise pensée et d'une mauvaise action.\r\n-\r\n-Il la recracha avec dégoût.\r\n-\r\n-Il continua de se questionner. Il se demanda sévèrement ce qu'il avait\r\n-entendu par ceci: \u0022Mon but est atteint!\u0022 Il se déclara que sa vie avait\r\n-un but en effet. Mais quel but? cacher son nom? tromper la police?\r\n-Était-ce pour une chose si petite qu'il avait fait tout ce qu'il avait\r\n-fait? Est-ce qu'il n'avait pas un autre but, qui était le grand, qui\r\n-était le vrai? Sauver, non sa personne, mais son âme. Redevenir honnête\r\n-et bon. Être un juste! est-ce que ce n'était pas là surtout, là \r\n-uniquement, ce qu'il avait toujours voulu, ce que l'évêque lui avait\r\n-ordonné?--Fermer la porte à son passé? Mais il ne la fermait pas, grand\r\n-Dieu! il la rouvrait en faisant une action infâme! mais il redevenait un\r\n-voleur, et le plus odieux des voleurs! il volait à un autre son\r\n-existence, sa vie, sa paix, sa place au soleil! il devenait un assassin!\r\n-il tuait, il tuait moralement un misérable homme, il lui infligeait\r\n-cette affreuse mort vivante, cette mort à ciel ouvert, qu'on appelle le\r\n-bagne! Au contraire, se livrer, sauver cet homme frappé d'une si lugubre\r\n-erreur, reprendre son nom, redevenir par devoir le forçat Jean Valjean,\r\n-c'était là vraiment achever sa résurrection, et fermer à jamais l'enfer\r\n-d'où il sortait! Y retomber en apparence, c'était en sortir en réalité!\r\n-Il fallait faire cela! il n'avait rien fait s'il ne faisait pas cela!\r\n-toute sa vie était inutile, toute sa pénitence était perdue, et il n'y\r\n-avait plus qu'à dire: à quoi bon? Il sentait que l'évêque était là , que\r\n-l'évêque était d'autant plus présent qu'il était mort, que l'évêque le\r\n-regardait fixement, que désormais le maire Madeleine avec toutes ses\r\n-vertus lui serait abominable, et que le galérien Jean Valjean serait\r\n-admirable et pur devant lui. Que les hommes voyaient son masque, mais\r\n-que l'évêque voyait sa face. Que les hommes voyaient sa vie, mais que\r\n-l'évêque voyait sa conscience. Il fallait donc aller à Arras, délivrer\r\n-le faux Jean Valjean, dénoncer le véritable! Hélas! c'était là le plus\r\n-grand des sacrifices, la plus poignante des victoires, le dernier pas à \r\n-franchir; mais il le fallait. Douloureuse destinée! il n'entrerait dans\r\n-la sainteté aux yeux de Dieu que s'il rentrait dans l'infamie aux yeux\r\n-des hommes!\r\n-\r\n---Eh bien, dit-il, prenons ce parti! faisons notre devoir! sauvons cet\r\n-homme!\r\n-\r\n-Il prononça ces paroles à haute voix, sans s'apercevoir qu'il parlait\r\n-tout haut.\r\n-\r\n-Il prit ses livres, les vérifia et les mit en ordre. Il jeta au feu une\r\n-liasse de créances qu'il avait sur de petits commerçants gênés. Il\r\n-écrivit une lettre qu'il cacheta et sur l'enveloppe de laquelle on\r\n-aurait pu lire, s'il y avait eu quelqu'un dans sa chambre en cet\r\n-instant: _À Monsieur Laffitte, banquier, rue d'Artois, à Paris_.\r\n-\r\n-Il tira d'un secrétaire un portefeuille qui contenait quelques billets\r\n-de banque et le passeport dont il s'était servi cette même année pour\r\n-aller aux élections.\r\n-\r\n-Qui l'eût vu pendant qu'il accomplissait ces divers actes auxquels se\r\n-mêlait une méditation si grave, ne se fût pas douté de ce qui se passait\r\n-en lui. Seulement par moments ses lèvres remuaient; dans d'autres\r\n-instants il relevait la tête et fixait son regard sur un point\r\n-quelconque de la muraille, comme s'il y avait précisément là quelque\r\n-chose qu'il voulait éclaircir ou interroger.\r\n-\r\n-La lettre à M. Laffitte terminée, il la mit dans sa poche ainsi que le\r\n-portefeuille, et recommença à marcher.\r\n-\r\n-Sa rêverie n'avait point dévié. Il continuait de voir clairement son\r\n-devoir écrit en lettres lumineuses qui flamboyaient devant ses yeux et\r\n-se déplaçaient avec son regard:--_Va! nomme-toi! dénonce-toi!_\r\n-\r\n-Il voyait de même, et comme si elles se fussent mues devant lui avec des\r\n-formes sensibles, les deux idées qui avaient été jusque-là la double\r\n-règle de sa vie: cacher son nom, sanctifier son âme. Pour la première\r\n-fois, elles lui apparaissaient absolument distinctes, et il voyait la\r\n-différence qui les séparait. Il reconnaissait que l'une de ces idées\r\n-était nécessairement bonne, tandis que l'autre pouvait devenir mauvaise;\r\n-que celle-là était le dévouement et que celle-ci était la personnalité;\r\n-que l'une disait: le _prochain_, et que l'autre disait: _moi_; que l'une\r\n-venait de la lumière et que l'autre venait de la nuit.\r\n-\r\n-Elles se combattaient, il les voyait se combattre. À mesure qu'il\r\n-songeait, elles avaient grandi devant l'oeil de son esprit; elles\r\n-avaient maintenant des statures colossales; et il lui semblait qu'il\r\n-voyait lutter au dedans de lui-même, dans cet infini dont nous parlions\r\n-tout à l'heure, au milieu des obscurités et des lueurs, une déesse et\r\n-une géante.\r\n-\r\n-Il était plein d'épouvante, mais il lui semblait que la bonne pensée\r\n-l'emportait.\r\n-\r\n-Il sentait qu'il touchait à l'autre moment décisif de sa conscience et\r\n-de sa destinée; que l'évêque avait marqué la première phase de sa vie\r\n-nouvelle, et que ce Champmathieu en marquait la seconde. Après la grande\r\n-crise, la grande épreuve.\r\n-\r\n-Cependant la fièvre, un instant apaisée, lui revenait peu à peu. Mille\r\n-pensées le traversaient, mais elles continuaient de le fortifier dans sa\r\n-résolution.\r\n-\r\n-Un moment il s'était dit:--qu'il prenait peut-être la chose trop\r\n-vivement, qu'après tout ce Champmathieu n'était pas intéressant, qu'en\r\n-somme il avait volé.\r\n-\r\n-Il se répondit:--Si cet homme a en effet volé quelques pommes, c'est un\r\n-mois de prison. Il y a loin de là aux galères. Et qui sait même? a-t-il\r\n-volé? est-ce prouvé? Le nom de Jean Valjean l'accable et semble\r\n-dispenser de preuves. Les procureurs du roi n'agissent-ils pas\r\n-habituellement ainsi? On le croit voleur, parce qu'on le sait forçat.\r\n-\r\n-Dans un autre instant, cette idée lui vint que, lorsqu'il se serait\r\n-dénoncé, peut-être on considérerait l'héroïsme de son action, et sa vie\r\n-honnête depuis sept ans, et ce qu'il avait fait pour le pays, et qu'on\r\n-lui ferait grâce.\r\n-\r\n-Mais cette supposition s'évanouit bien vite, et il sourit amèrement en\r\n-songeant que le vol des quarante sous à Petit-Gervais le faisait\r\n-récidiviste, que cette affaire reparaîtrait certainement et, aux termes\r\n-précis de la loi, le ferait passible des travaux forcés à perpétuité.\r\n-\r\n-Il se détourna de toute illusion, se détacha de plus en plus de la terre\r\n-et chercha la consolation et la force ailleurs. Il se dit qu'il fallait\r\n-faire son devoir; que peut-être même ne serait-il pas plus malheureux\r\n-après avoir fait son devoir qu'après l'avoir éludé; que s'il _laissait\r\n-faire_, s'il restait à Montreuil-sur-mer, sa considération, sa bonne\r\n-renommée, ses bonnes oeuvres, la déférence, la vénération, sa charité,\r\n-sa richesse, sa popularité, sa vertu, seraient assaisonnées d'un crime;\r\n-et quel goût auraient toutes ces choses saintes liées à cette chose\r\n-hideuse! tandis que, s'il accomplissait son sacrifice, au bagne, au\r\n-poteau, au carcan, au bonnet vert, au travail sans relâche, à la honte\r\n-sans pitié, il se mêlerait une idée céleste!\r\n-\r\n-Enfin il se dit qu'il y avait nécessité, que sa destinée était ainsi\r\n-faite, qu'il n'était pas maître de déranger les arrangements d'en haut,\r\n-que dans tous les cas il fallait choisir: ou la vertu au dehors et\r\n-l'abomination au dedans, ou la sainteté au dedans et l'infamie au\r\n-dehors.\r\n-\r\n-À remuer tant d'idées lugubres, son courage ne défaillait pas, mais son\r\n-cerveau se fatiguait. Il commençait à penser malgré lui à d'autres\r\n-choses, à des choses indifférentes. Ses artères battaient violemment\r\n-dans ses tempes. Il allait et venait toujours. Minuit sonna d'abord à la\r\n-paroisse, puis à la maison de ville. Il compta les douze coups aux deux\r\n-horloges, et il compara le son des deux cloches. Il se rappela à cette\r\n-occasion que quelques jours auparavant il avait vu chez un marchand de\r\n-ferrailles une vieille cloche à vendre sur laquelle ce nom était écrit:\r\n-_Antoine Albin de Romainville_.\r\n-\r\n-Il avait froid. Il alluma un peu de feu. Il ne songea pas à fermer la\r\n-fenêtre.\r\n-\r\n-Cependant il était retombé dans sa stupeur. Il lui fallait faire un\r\n-assez grand effort pour se rappeler à quoi il songeait avant que minuit\r\n-sonnât. Il y parvint enfin.\r\n-\r\n---Ah! oui, se dit-il, j'avais pris la résolution de me dénoncer.\r\n-\r\n-Et puis tout à coup il pensa à la Fantine.\r\n-\r\n---Tiens! dit-il, et cette pauvre femme!\r\n-\r\n-Ici une crise nouvelle se déclara.\r\n-\r\n-Fantine, apparaissant brusquement dans sa rêverie, y fut comme un rayon\r\n-d'une lumière inattendue. Il lui sembla que tout changeait d'aspect\r\n-autour de lui, il s'écria:\r\n-\r\n---Ah çà , mais! jusqu'ici je n'ai considéré que moi! je n'ai eu égard\r\n-qu'à ma convenance! Il me convient de me taire ou de me\r\n-dénoncer,--cacher ma personne ou sauver mon âme,--être un magistrat\r\n-méprisable et respecté ou un galérien infâme et vénérable, c'est moi,\r\n-c'est toujours moi, ce n'est que moi! Mais, mon Dieu, c'est de l'égoïsme\r\n-tout cela! Ce sont des formes diverses de l'égoïsme, mais c'est de\r\n-l'égoïsme! Si je songeais un peu aux autres? La première sainteté est de\r\n-penser à autrui. Voyons, examinons. Moi excepté, moi effacé, moi oublié,\r\n-qu'arrivera-t-il de tout ceci?--Si je me dénonce? on me prend. On lâche\r\n-ce Champmathieu, on me remet aux galères, c'est bien. Et puis? Que se\r\n-passe-t-il ici? Ah! ici, il y a un pays, une ville, des fabriques, une\r\n-industrie, des ouvriers, des hommes, des femmes, des vieux grands-pères,\r\n-des enfants, des pauvres gens! J'ai créé tout ceci, je fais vivre tout\r\n-cela; partout où il y a une cheminée qui fume, c'est moi qui ai mis le\r\n-tison dans le feu et la viande dans la marmite; j'ai fait l'aisance, la\r\n-circulation, le crédit; avant moi il n'y avait rien; j'ai relevé,\r\n-vivifié, animé, fécondé, stimulé, enrichi tout le pays; moi de moins,\r\n-c'est l'âme de moins. Je m'ôte, tout meurt.--Et cette femme qui a tant\r\n-souffert, qui a tant de mérites dans sa chute, dont j'ai causé sans le\r\n-vouloir tout le malheur! Et cet enfant que je voulais aller chercher,\r\n-que j'ai promis à la mère! Est-ce que je ne dois pas aussi quelque chose\r\n-à cette femme, en réparation du mal que je lui ai fait? Si je disparais,\r\n-qu'arrive-t-il? La mère meurt. L'enfant devient ce qu'il peut. Voilà ce\r\n-qui se passe, si je me dénonce.--Si je ne me dénonce pas? Voyons, si je\r\n-ne me dénonce pas? Après s'être fait cette question, il s'arrêta; il eut\r\n-comme un moment d'hésitation et de tremblement; mais ce moment dura peu,\r\n-et il se répondit avec calme:\r\n-\r\n---Eh bien, cet homme va aux galères, c'est vrai, mais, que diable! il a\r\n-volé! J'ai beau me dire qu'il n'a pas volé, il a volé! Moi, je reste\r\n-ici, je continue. Dans dix ans j'aurai gagné dix millions, je les\r\n-répands dans le pays, je n'ai rien à moi, qu'est-ce que cela me fait? Ce\r\n-n'est pas pour moi ce que je fais! La prospérité de tous va croissant,\r\n-les industries s'éveillent et s'excitent, les manufactures et les usines\r\n-se multiplient, les familles, cent familles, mille familles! sont\r\n-heureuses; la contrée se peuple; il naît des villages où il n'y a que\r\n-des fermes, il naît des fermes où il n'y a rien; la misère disparaît, et\r\n-avec la misère disparaissent la débauche, la prostitution, le vol, le\r\n-meurtre, tous les vices, tous les crimes! Et cette pauvre mère élève son\r\n-enfant! et voilà tout un pays riche et honnête! Ah çà , j'étais fou,\r\n-j'étais absurde, qu'est-ce que je parlais donc de me dénoncer? Il faut\r\n-faire attention, vraiment, et ne rien précipiter. Quoi! parce qu'il\r\n-m'aura plu de faire le grand et le généreux,--c'est du mélodrame, après\r\n-tout!--parce que je n'aurai songé qu'à moi, qu'à moi seul, quoi! pour\r\n-sauver d'une punition peut-être un peu exagérée, mais juste au fond, on\r\n-ne sait qui, un voleur, un drôle évidemment, il faudra que tout un pays\r\n-périsse! il faudra qu'une pauvre femme crève à l'hôpital! qu'une pauvre\r\n-petite fille crève sur le pavé! comme des chiens! Ah! mais c'est\r\n-abominable! Sans même que la mère ait revu son enfant! sans que l'enfant\r\n-ait presque connu sa mère! Et tout ça pour ce vieux gredin de voleur de\r\n-pommes qui, à coup sûr, a mérité les galères pour autre chose, si ce\r\n-n'est pour cela! Beaux scrupules qui sauvent un coupable et qui\r\n-sacrifient des innocents, qui sauvent un vieux vagabond, lequel n'a plus\r\n-que quelques années à vivre au bout du compte et ne sera guère plus\r\n-malheureux au bagne que dans sa masure, et qui sacrifient toute une\r\n-population, mères, femmes, enfants! Cette pauvre petite Cosette qui n'a\r\n-que moi au monde et qui est sans doute en ce moment toute bleue de froid\r\n-dans le bouge de ces Thénardier! Voilà encore des canailles ceux-là ! Et\r\n-je manquerais à mes devoirs envers tous ces pauvres êtres! Et je m'en\r\n-irais me dénoncer! Et je ferais cette inepte sottise! Mettons tout au\r\n-pis. Supposons qu'il y ait une mauvaise action pour moi dans ceci et que\r\n-ma conscience me la reproche un jour, accepter, pour le bien d'autrui,\r\n-ces reproches qui ne chargent que moi, cette mauvaise action qui ne\r\n-compromet que mon âme, c'est là qu'est le dévouement, c'est là qu'est la\r\n-vertu.\r\n-\r\n-Il se leva, il se remit à marcher. Cette fois il lui semblait qu'il\r\n-était content. On ne trouve les diamants que dans les ténèbres de la\r\n-terre; on ne trouve les vérités que dans les profondeurs de la pensée.\r\n-Il lui semblait qu'après être descendu dans ces profondeurs, après avoir\r\n-longtemps tâtonné au plus noir de ces ténèbres, il venait enfin de\r\n-trouver un de ces diamants, une de ces vérités, et qu'il la tenait dans\r\n-sa main; et il s'éblouissait à la regarder.\r\n-\r\n---Oui, pensa-t-il, c'est cela. Je suis dans le vrai. J'ai la solution.\r\n-Il faut finir par s'en tenir à quelque chose. Mon parti est pris.\r\n-Laissons faire! Ne vacillons plus, ne reculons plus. Ceci est dans\r\n-l'intérêt de tous, non dans le mien. Je suis Madeleine, je reste\r\n-Madeleine. Malheur à celui qui est Jean Valjean! Ce n'est plus moi. Je\r\n-ne connais pas cet homme, je ne sais plus ce que c'est, s'il se trouve\r\n-que quelqu'un est Jean Valjean à cette heure, qu'il s'arrange! cela ne\r\n-me regarde pas. C'est un nom de fatalité qui flotte dans la nuit, s'il\r\n-s'arrête et s'abat sur une tête, tant pis pour elle!\r\n-\r\n-Il se regarda dans le petit miroir qui était sur sa cheminée, et dit:\r\n-\r\n---Tiens! cela m'a soulagé de prendre une résolution! Je suis tout autre\r\n-à présent.\r\n-\r\n-Il marcha encore quelques pas, puis il s'arrêta court:\r\n-\r\n---Allons! dit-il, il ne faut hésiter devant aucune des conséquences de\r\n-la résolution prise. Il y a encore des fils qui m'attachent à ce Jean\r\n-Valjean. Il faut les briser! Il y a ici, dans cette chambre même, des\r\n-objets qui m'accuseraient, des choses muettes qui seraient des témoins,\r\n-c'est dit, il faut que tout cela disparaisse.\r\n-\r\n-Il fouilla dans sa poche, en tira sa bourse, l'ouvrit, et y prit une\r\n-petite clef.\r\n-\r\n-Il introduisit cette clef dans une serrure dont on voyait à peine le\r\n-trou, perdu qu'il était dans les nuances les plus sombres du dessin qui\r\n-couvrait le papier collé sur le mur. Une cachette s'ouvrit, une espèce\r\n-de fausse armoire ménagée entre l'angle de la muraille et le manteau de\r\n-la cheminée. Il n'y avait dans cette cachette que quelques guenilles, un\r\n-sarrau de toile bleue, un vieux pantalon, un vieux havresac, et un gros\r\n-bâton d'épine ferré aux deux bouts. Ceux qui avaient vu Jean Valjean à \r\n-l'époque où il traversait Digne, en octobre 1815, eussent aisément\r\n-reconnu toutes les pièces de ce misérable accoutrement.\r\n-\r\n-Il les avait conservées comme il avait conservé les chandeliers\r\n-d'argent, pour se rappeler toujours son point de départ. Seulement il\r\n-cachait ceci qui venait du bagne, et il laissait voir les flambeaux qui\r\n-venaient de l'évêque.\r\n-\r\n-Il jeta un regard furtif vers la porte, comme s'il eût craint qu'elle ne\r\n-s'ouvrît malgré le verrou qui la fermait; puis d'un mouvement vif et\r\n-brusque et d'une seule brassée, sans même donner un coup d'oeil à ces\r\n-choses qu'il avait si religieusement et si périlleusement gardées\r\n-pendant tant d'années, il prit tout, haillons, bâton, havresac, et jeta\r\n-tout au feu. Il referma la fausse armoire, et, redoublant de\r\n-précautions, désormais inutiles puisqu'elle était vide, en cacha la\r\n-porte derrière un gros meuble qu'il y poussa.\r\n-\r\n-Au bout de quelques secondes, la chambre et le mur d'en face furent\r\n-éclairés d'une grande réverbération rouge et tremblante. Tout brûlait.\r\n-Le bâton d'épine pétillait et jetait des étincelles jusqu'au milieu de\r\n-la chambre.\r\n-\r\n-Le havresac, en se consumant avec d'affreux chiffons qu'il contenait,\r\n-avait mis à nu quelque chose qui brillait dans la cendre. En se\r\n-penchant, on eût aisément reconnu une pièce d'argent. Sans doute la\r\n-pièce de quarante sous volée au petit savoyard.\r\n-\r\n-Lui ne regardait pas le feu et marchait, allant et venant toujours du\r\n-même pas.\r\n-\r\n-Tout à coup ses yeux tombèrent sur les deux flambeaux d'argent que la\r\n-réverbération faisait reluire vaguement sur la cheminée.\r\n-\r\n---Tiens! pensa-t-il, tout Jean Valjean est encore là -dedans. Il faut\r\n-aussi détruire cela.\r\n-\r\n-Il prit les deux flambeaux.\r\n-\r\n-Il y avait assez de feu pour qu'on pût les déformer promptement et en\r\n-faire une sorte de lingot méconnaissable.\r\n-\r\n-Il se pencha sur le foyer et s'y chauffa un instant. Il eut un vrai\r\n-bien-être.--La bonne chaleur! dit-il.\r\n-\r\n-Il remua le brasier avec un des deux chandeliers. Une minute de plus, et\r\n-ils étaient dans le feu. En ce moment il lui sembla qu'il entendait une\r\n-voix qui criait au dedans de lui:\r\n-\r\n---Jean Valjean! Jean Valjean!\r\n-\r\n-Ses cheveux se dressèrent, il devint comme un homme qui écoute une chose\r\n-terrible.\r\n-\r\n---Oui, c'est cela, achève! disait la voix. Complète ce que tu fais!\r\n-détruis ces flambeaux! anéantis ce souvenir! oublie l'évêque! oublie\r\n-tout! perds ce Champmathieu! va, c'est bien. Applaudis-toi! Ainsi, c'est\r\n-convenu, c'est résolu, c'est dit, voilà un homme, voilà un vieillard qui\r\n-ne sait ce qu'on lui veut, qui n'a rien fait peut-être, un innocent,\r\n-dont ton nom fait tout le malheur, sur qui ton nom pèse comme un crime,\r\n-qui va être pris pour toi, qui va être condamné, qui va finir ses jours\r\n-dans l'abjection et dans l'horreur! c'est bien. Sois honnête homme, toi.\r\n-Reste monsieur le maire, reste honorable et honoré, enrichis la ville,\r\n-nourris des indigents, élève des orphelins, vis heureux, vertueux et\r\n-admiré, et pendant ce temps-là , pendant que tu seras ici dans la joie et\r\n-dans la lumière, il y aura quelqu'un qui aura ta casaque rouge, qui\r\n-portera ton nom dans l'ignominie et qui traînera ta chaîne au bagne!\r\n-Oui, c'est bien arrangé ainsi! Ah! misérable!\r\n-\r\n-La sueur lui coulait du front. Il attachait sur les flambeaux un oeil\r\n-hagard. Cependant ce qui parlait en lui n'avait pas fini. La voix\r\n-continuait:\r\n-\r\n---Jean Valjean! il y aura autour de toi beaucoup de voix qui feront un\r\n-grand bruit, qui parleront bien haut, et qui te béniront, et une seule\r\n-que personne n'entendra et qui te maudira dans les ténèbres. Eh bien!\r\n-écoute, infâme! toutes ces bénédictions retomberont avant d'arriver au\r\n-ciel, et il n'y aura que la malédiction qui montera jusqu'à Dieu! Cette\r\n-voix, d'abord toute faible et qui s'était élevée du plus obscur de sa\r\n-conscience, était devenue par degrés éclatante et formidable, et il\r\n-l'entendait maintenant à son oreille. Il lui semblait qu'elle était\r\n-sortie de lui-même et qu'elle parlait à présent en dehors de lui. Il\r\n-crut entendre les dernières paroles si distinctement qu'il regarda dans\r\n-la chambre avec une sorte de terreur.\r\n-\r\n---Y a-t-il quelqu'un ici? demanda-t-il à haute voix, et tout égaré.\r\n-\r\n-Puis il reprit avec un rire qui ressemblait au rire d'un idiot:\r\n-\r\n---Que je suis bête! il ne peut y avoir personne.\r\n-\r\n-Il y avait quelqu'un; mais celui qui y était n'était pas de ceux que\r\n-l'oeil humain peut voir.\r\n-\r\n-Il posa les flambeaux sur la cheminée.\r\n-\r\n-Alors il reprit cette marche monotone et lugubre qui troublait dans ses\r\n-rêves et réveillait en sursaut l'homme endormi au-dessous de lui.\r\n-\r\n-Cette marche le soulageait et l'enivrait en même temps. Il semble que\r\n-parfois dans les occasions suprêmes on se remue pour demander conseil à \r\n-tout ce qu'on peut rencontrer en se déplaçant. Au bout de quelques\r\n-instants il ne savait plus où il en était.\r\n-\r\n-Il reculait maintenant avec une égale épouvante devant les deux\r\n-résolutions qu'il avait prises tour à tour. Les deux idées qui le\r\n-conseillaient lui paraissaient aussi funestes l'une que l'autre.--Quelle\r\n-fatalité! quelle rencontre que ce Champmathieu pris pour lui! Être\r\n-précipité justement par le moyen que la providence paraissait d'abord\r\n-avoir employé pour l'affermir!\r\n-\r\n-Il y eut un moment où il considéra l'avenir. Se dénoncer, grand Dieu! se\r\n-livrer! Il envisagea avec un immense désespoir tout ce qu'il faudrait\r\n-quitter, tout ce qu'il faudrait reprendre. Il faudrait donc dire adieu à \r\n-cette existence si bonne, si pure, si radieuse, à ce respect de tous, à \r\n-l'honneur, à la liberté! Il n'irait plus se promener dans les champs, il\r\n-n'entendrait plus chanter les oiseaux au mois de mai, il ne ferait plus\r\n-l'aumône aux petits enfants! Il ne sentirait plus la douceur des regards\r\n-de reconnaissance et d'amour fixés sur lui! Il quitterait cette maison\r\n-qu'il avait bâtie, cette chambre, cette petite chambre! Tout lui\r\n-paraissait charmant à cette heure. Il ne lirait plus dans ces livres, il\r\n-n'écrirait plus sur cette petite table de bois blanc! Sa vieille\r\n-portière, la seule servante qu'il eût, ne lui monterait plus son café le\r\n-matin. Grand Dieu! au lieu de cela, la chiourme, le carcan, la veste\r\n-rouge, la chaîne au pied, la fatigue, le cachot, le lit de camp, toutes\r\n-ces horreurs connues! À son âge, après avoir été ce qu'il était! Si\r\n-encore il était jeune! Mais, vieux, être tutoyé par le premier venu,\r\n-être fouillé par le garde-chiourme, recevoir le coup de bâton de\r\n-l'argousin! avoir les pieds nus dans des souliers ferrés! tendre matin\r\n-et soir sa jambe au marteau du rondier qui visite la manille! subir la\r\n-curiosité des étrangers auxquels on dirait: _Celui-là , c'est le fameux\r\n-Jean Valjean, qui a été maire à Montreuil-sur-mer_! Le soir, ruisselant\r\n-de sueur, accablé de lassitude, le bonnet vert sur les yeux, remonter\r\n-deux à deux, sous le fouet du sergent, l'escalier-échelle du bagne\r\n-flottant! Oh! quelle misère! La destinée peut-elle donc être méchante\r\n-comme un être intelligent et devenir monstrueuse comme le coeur humain!\r\n-\r\n-Et, quoi qu'il fît, il retombait toujours sur ce poignant dilemme qui\r\n-était au fond de sa rêverie:--rester dans le paradis, et y devenir\r\n-démon! rentrer dans l'enfer, et y devenir ange!\r\n-\r\n-Que faire, grand Dieu! que faire?\r\n-\r\n-La tourmente dont il était sorti avec tant de peine se déchaîna de\r\n-nouveau en lui. Ses idées recommencèrent à se mêler. Elles prirent ce je\r\n-ne sais quoi de stupéfié et de machinal qui est propre au désespoir. Ce\r\n-nom de Romainville lui revenait sans cesse à l'esprit avec deux vers\r\n-d'une chanson qu'il avait entendue autrefois. Il songeait que\r\n-Romainville est un petit bois près Paris où les jeunes gens amoureux\r\n-vont cueillir des lilas au mois d'avril.\r\n-\r\n-Il chancelait au dehors comme au dedans. Il marchait comme un petit\r\n-enfant qu'on laisse aller seul.\r\n-\r\n-À de certains moments, luttant contre sa lassitude, il faisait effort\r\n-pour ressaisir son intelligence. Il tâchait de se poser une dernière\r\n-fois, et définitivement, le problème sur lequel il était en quelque\r\n-sorte tombé d'épuisement. Faut-il se dénoncer? Faut-il se taire?--Il ne\r\n-réussissait à rien voir de distinct. Les vagues aspects de tous les\r\n-raisonnements ébauchés par sa rêverie tremblaient et se dissipaient l'un\r\n-après l'autre en fumée. Seulement il sentait que, à quelque parti qu'il\r\n-s'arrêtât, nécessairement, et sans qu'il fût possible d'y échapper,\r\n-quelque chose de lui allait mourir; qu'il entrait dans un sépulcre à \r\n-droite comme à gauche; qu'il accomplissait une agonie, l'agonie de son\r\n-bonheur ou l'agonie de sa vertu.\r\n-\r\n-Hélas! toutes ses irrésolutions l'avaient repris. Il n'était pas plus\r\n-avancé qu'au commencement.\r\n-\r\n-Ainsi se débattait sous l'angoisse cette malheureuse âme. Dix-huit cents\r\n-ans avant cet homme infortuné, l'être mystérieux, en qui se résument\r\n-toutes les saintetés et toutes les souffrances de l'humanité, avait\r\n-aussi lui, pendant que les oliviers frémissaient au vent farouche de\r\n-l'infini, longtemps écarté de la main l'effrayant calice qui lui\r\n-apparaissait ruisselant d'ombre et débordant de ténèbres dans des\r\n-profondeurs pleines d'étoiles.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IV\r\n-\r\n-Formes que prend la souffrance pendant le sommeil\r\n-\r\n-\r\n-Trois heures du matin venaient de sonner, et il y avait cinq heures\r\n-qu'il marchait ainsi, presque sans interruption lorsqu'il se laissa\r\n-tomber sur sa chaise.\r\n-\r\n-Il s'y endormit et fit un rêve.\r\n-\r\n-Ce rêve, comme la plupart des rêves, ne se rapportait à la situation que\r\n-par je ne sais quoi de funeste et de poignant, mais il lui fit\r\n-impression. Ce cauchemar le frappa tellement que plus tard il l'a écrit.\r\n-C'est un des papiers écrits de sa main qu'il a laissés. Nous croyons\r\n-devoir transcrire ici cette chose textuellement.\r\n-\r\n-Quel que soit ce rêve, l'histoire de cette nuit serait incomplète si\r\n-nous l'omettions. C'est la sombre aventure d'une âme malade.\r\n-\r\n-Le voici. Sur l'enveloppe nous trouvons cette ligne écrite: _Le rêve que\r\n-j'ai eu cette nuit-là ._\r\n-\r\n-«J'étais dans une campagne. Une grande campagne triste où il n'y avait\r\n-pas d'herbe. Il ne me semblait pas qu'il fît jour ni qu'il fît nuit.\r\n-\r\n-«Je me promenais avec mon frère, le frère de mes années d'enfance, ce\r\n-frère auquel je dois dire que je ne pense jamais et dont je ne me\r\n-souviens presque plus.\r\n-\r\n-«Nous causions, et nous rencontrions des passants. Nous parlions d'une\r\n-voisine que nous avions eue autrefois, et qui, depuis qu'elle demeurait\r\n-sur la rue, travaillait la fenêtre toujours ouverte. Tout en causant,\r\n-nous avions froid à cause de cette fenêtre ouverte.\r\n-\r\n-«Il n'y avait pas d'arbres dans la campagne.\r\n-\r\n-«Nous vîmes un homme qui passa près de nous. C'était un homme tout nu,\r\n-couleur de cendre, monté sur un cheval couleur de terre. L'homme n'avait\r\n-pas de cheveux; on voyait son crâne et des veines sur son crâne. Il\r\n-tenait à la main une baguette qui était souple comme un sarment de vigne\r\n-et lourde comme du fer. Ce cavalier passa et ne nous dit rien.\r\n-\r\n-«Mon frère me dit: Prenons par le chemin creux.\r\n-\r\n-«Il y avait un chemin creux où l'on ne voyait pas une broussaille ni un\r\n-brin de mousse. Tout était couleur de terre, même le ciel. Au bout de\r\n-quelques pas, on ne me répondit plus quand je parlais. Je m'aperçus que\r\n-mon frère n'était plus avec moi.\r\n-\r\n-«J'entrai dans un village que je vis. Je songeai que ce devait être là \r\n-Romainville (pourquoi Romainville?).\r\n-\r\n-«La première rue où j'entrai était déserte. J'entrai dans une seconde\r\n-rue. Derrière l'angle que faisaient les deux rues, il y avait un homme\r\n-debout contre le mur. Je dis à cet homme:--Quel est ce pays? où suis-je?\r\n-L'homme ne répondit pas. Je vis la porte d'une maison ouverte, j'y\r\n-entrai.\r\n-\r\n-«La première chambre était déserte. J'entrai dans la seconde. Derrière\r\n-la porte de cette chambre, il y avait un homme debout contre le mur. Je\r\n-demandai à cet homme:--À qui est cette maison? où suis-je? L'homme ne\r\n-répondit pas. La maison avait un jardin.\r\n-\r\n-«Je sortis de la maison et j'entrai dans le jardin. Le jardin était\r\n-désert. Derrière le premier arbre, je trouvai un homme qui se tenait\r\n-debout. Je dis à cet homme:--Quel est ce jardin? où suis-je? L'homme ne\r\n-répondit pas.\r\n-\r\n-«J'errai dans le village, et je m'aperçus que c'était une ville. Toutes\r\n-les rues étaient désertes, toutes les portes étaient ouvertes. Aucun\r\n-être vivant ne passait dans les rues, ne marchait dans les chambres ou\r\n-ne se promenait dans les jardins. Mais il y avait derrière chaque angle\r\n-de mur, derrière chaque porte, derrière chaque arbre, un homme debout\r\n-qui se taisait. On n'en voyait jamais qu'un à la fois. Ces hommes me\r\n-regardaient passer.\r\n-\r\n-«Je sortis de la ville et je me mis à marcher dans les champs.\r\n-\r\n-«Au bout de quelque temps, je me retournai, et je vis une grande foule\r\n-qui venait derrière moi. Je reconnus tous les hommes que j'avais vus\r\n-dans la ville. Ils avaient des têtes étranges. Ils ne semblaient pas se\r\n-hâter, et cependant ils marchaient plus vite que moi. Ils ne faisaient\r\n-aucun bruit en marchant. En un instant, cette foule me rejoignit et\r\n-m'entoura. Les visages de ces hommes étaient couleur de terre.\r\n-\r\n-«Alors le premier que j'avais vu et questionné en entrant dans la ville\r\n-me dit:--Où allez-vous? Est-ce que vous ne savez pas que vous êtes mort\r\n-depuis longtemps?\r\n-\r\n-«J'ouvris la bouche pour répondre, et je m'aperçus qu'il n'y avait\r\n-personne autour de moi.»\r\n-\r\n-Il se réveilla. Il était glacé. Un vent qui était froid comme le vent du\r\n-matin faisait tourner dans leurs gonds les châssis de la croisée restée\r\n-ouverte. Le feu s'était éteint. La bougie touchait à sa fin. Il était\r\n-encore nuit noire.\r\n-\r\n-Il se leva, il alla à la fenêtre. Il n'y avait toujours pas d'étoiles au\r\n-ciel.\r\n-\r\n-De sa fenêtre on voyait la cour de la maison et la rue. Un bruit sec et\r\n-dur qui résonna tout à coup sur le sol lui fit baisser les yeux.\r\n-\r\n-Il vit au-dessous de lui deux étoiles rouges dont les rayons\r\n-s'allongeaient et se raccourcissaient bizarrement dans l'ombre.\r\n-\r\n-Comme sa pensée était encore à demi submergée dans la brume des\r\n-rêves.--tiens! songea-t-il, il n'y en a pas dans le ciel. Elles sont sur\r\n-la terre maintenant.\r\n-\r\n-Cependant ce trouble se dissipa, un second bruit pareil au premier\r\n-acheva de le réveiller; il regarda, et il reconnut que ces deux étoiles\r\n-étaient les lanternes d'une voiture. À la clarté qu'elles jetaient, il\r\n-put distinguer la forme de cette voiture. C'était un tilbury attelé d'un\r\n-petit cheval blanc. Le bruit qu'il avait entendu, c'étaient les coups de\r\n-pied du cheval sur le pavé.\r\n-\r\n---Qu'est-ce que c'est que cette voiture? se dit-il. Qui est-ce qui vient\r\n-donc si matin? En ce moment on frappa un petit coup à la porte de sa\r\n-chambre.\r\n-\r\n-Il frissonna de la tête aux pieds, et cria d'une voix terrible:\r\n-\r\n---Qui est là ?\r\n-\r\n-Quelqu'un répondit:\r\n-\r\n---Moi, monsieur le maire.\r\n-\r\n-Il reconnut la voix de la vieille femme, sa portière.\r\n-\r\n---Eh bien, reprit-il, qu'est-ce que c'est?\r\n-\r\n---Monsieur le maire, il est tout à l'heure cinq heures du matin.\r\n-\r\n---Qu'est-ce que cela me fait?\r\n-\r\n---Monsieur le maire, c'est le cabriolet.\r\n-\r\n---Quel cabriolet?\r\n-\r\n---Le tilbury.\r\n-\r\n---Quel tilbury?\r\n-\r\n---Est-ce que monsieur le maire n'a pas fait demander un tilbury?\r\n-\r\n---Non, dit-il.\r\n-\r\n---Le cocher dit qu'il vient chercher monsieur le maire.\r\n-\r\n---Quel cocher?\r\n-\r\n---Le cocher de M. Scaufflaire.\r\n-\r\n---M. Scaufflaire?\r\n-\r\n-Ce nom le fit tressaillir comme si un éclair lui eût passé devant la\r\n-face.\r\n-\r\n---Ah! oui! reprit-il, M. Scaufflaire.\r\n-\r\n-Si la vieille femme l'eût pu voir en ce moment, elle eût été épouvantée.\r\n-\r\n-Il se fit un assez long silence. Il examinait d'un air stupide la flamme\r\n-de la bougie et prenait autour de la mèche de la cire brûlante qu'il\r\n-roulait dans ses doigts.\r\n-\r\n-La vieille attendait. Elle se hasarda pourtant à élever encore la voix:\r\n-\r\n---Monsieur le maire, que faut-il que je réponde?\r\n-\r\n---Dites que c'est bien, et que je descends.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre V\r\n-\r\n-Bâtons dans les roues\r\n-\r\n-\r\n-Le service des postes d'Arras à Montreuil-sur-mer se faisait encore à \r\n-cette époque par de petites malles du temps de l'empire. Ces malles\r\n-étaient des cabriolets à deux roues, tapissés de cuir fauve au dedans,\r\n-suspendus sur des ressorts à pompe, et n'ayant que deux places, l'une\r\n-pour le courrier, l'autre pour le voyageur. Les roues étaient armées de\r\n-ces longs moyeux offensifs qui tiennent les autres voitures à distance\r\n-et qu'on voit encore sur les routes d'Allemagne. Le coffre aux dépêches,\r\n-immense boîte oblongue, était placé derrière le cabriolet et faisait\r\n-corps avec lui. Ce coffre était peint en noir et le cabriolet en jaune.\r\n-\r\n-Ces voitures, auxquelles rien ne ressemble aujourd'hui, avaient je ne\r\n-sais quoi de difforme et de bossu, et, quand on les voyait passer de\r\n-loin et ramper dans quelque route à l'horizon, elles ressemblaient à ces\r\n-insectes qu'on appelle, je crois, termites, et qui, avec un petit\r\n-corsage, traînent un gros arrière-train. Elles allaient, du reste, fort\r\n-vite. La malle partie d'Arras toutes les nuits à une heure, après le\r\n-passage du courrier de Paris, arrivait à Montreuil-sur-mer un peu avant\r\n-cinq heures du matin.\r\n-\r\n-Cette nuit-là , la malle qui descendait à Montreuil-sur-mer par la route\r\n-de Hesdin accrocha, au tournant d'une rue, au moment où elle entrait\r\n-dans la ville, un petit tilbury attelé d'un cheval blanc, qui venait en\r\n-sens inverse et dans lequel il n'y avait qu'une personne, un homme\r\n-enveloppé d'un manteau. La roue du tilbury reçut un choc assez rude. Le\r\n-courrier cria à cet homme d'arrêter, mais le voyageur n'écouta pas, et\r\n-continua sa route au grand trot.\r\n-\r\n---Voilà un homme diablement pressé! dit le courrier.\r\n-\r\n-L'homme qui se hâtait ainsi, c'est celui que nous venons de voir se\r\n-débattre dans des convulsions dignes à coup sûr de pitié.\r\n-\r\n-Où allait-il? Il n'eût pu le dire. Pourquoi se hâtait-il? Il ne savait.\r\n-Il allait au hasard devant lui. Où? À Arras sans doute; mais il allait\r\n-peut-être ailleurs aussi. Par moments il le sentait, et il tressaillait.\r\n-\r\n-Il s'enfonçait dans cette nuit comme dans un gouffre. Quelque chose le\r\n-poussait, quelque chose l'attirait. Ce qui se passait en lui, personne\r\n-ne pourrait le dire, tous le comprendront. Quel homme n'est entré, au\r\n-moins une fois en sa vie, dans cette obscure caverne de l'inconnu?\r\n-\r\n-Du reste il n'avait rien résolu, rien décidé, rien arrêté, rien fait.\r\n-Aucun des actes de sa conscience n'avait été définitif. Il était plus\r\n-que jamais comme au premier moment. Pourquoi allait-il à Arras?\r\n-\r\n-Il se répétait ce qu'il s'était déjà dit en retenant le cabriolet de\r\n-Scaufflaire,--que, quel que dût être le résultat, il n'y avait aucun\r\n-inconvénient à voir de ses yeux, à juger les choses par lui-même;--que\r\n-cela même était prudent, qu'il fallait savoir ce qui se passerait; qu'on\r\n-ne pouvait rien décider sans avoir observé et scruté;--que de loin on se\r\n-faisait des montagnes de tout; qu'au bout du compte, lorsqu'il aurait vu\r\n-ce Champmathieu, quelque misérable, sa conscience serait probablement\r\n-fort soulagée de le laisser aller au bagne à sa place;--qu'à la vérité\r\n-il y aurait là Javert, et ce Brevet, ce Chenildieu, ce Cochepaille,\r\n-anciens forçats qui l'avaient connu; mais qu'à coup sûr ils ne le\r\n-reconnaîtraient pas;--bah! quelle idée!--que Javert en était à cent\r\n-lieues;--que toutes les conjectures et toutes les suppositions étaient\r\n-fixées sur ce Champmathieu, et que rien n'est entêté comme les\r\n-suppositions et les conjectures;--qu'il n'y avait donc aucun danger. Que\r\n-sans doute c'était un moment noir, mais qu'il en sortirait;--qu'après\r\n-tout il tenait sa destinée, si mauvaise qu'elle voulût être, dans sa\r\n-main;--qu'il en était le maître. Il se cramponnait à cette pensée.\r\n-\r\n-Au fond, pour tout dire, il eût mieux aimé ne point aller à Arras.\r\n-\r\n-Cependant il y allait.\r\n-\r\n-Tout en songeant, il fouettait le cheval, lequel trottait de ce bon trot\r\n-réglé et sûr qui fait deux lieues et demie à l'heure.\r\n-\r\n-À mesure que le cabriolet avançait, il sentait quelque chose en lui qui\r\n-reculait.\r\n-\r\n-Au point du jour il était en rase campagne; la ville de\r\n-Montreuil-sur-mer était assez loin derrière lui. Il regarda l'horizon\r\n-blanchir; il regarda, sans les voir, passer devant ses yeux toutes les\r\n-froides figures d'une aube d'hiver. Le matin a ses spectres comme le\r\n-soir. Il ne les voyait pas, mais, à son insu, et par une sorte de\r\n-pénétration presque physique, ces noires silhouettes d'arbres et de\r\n-collines ajoutaient à l'état violent de son âme je ne sais quoi de morne\r\n-et de sinistre.\r\n-\r\n-Chaque fois qu'il passait devant une de ces maisons isolées qui côtoient\r\n-parfois les routes, il se disait: il y a pourtant là -dedans des gens qui\r\n-dorment!\r\n-\r\n-Le trot du cheval, les grelots du harnais, les roues sur le pavé,\r\n-faisaient un bruit doux et monotone. Ces choses-là sont charmantes quand\r\n-on est joyeux et lugubres quand on est triste. Il était grand jour\r\n-lorsqu'il arriva à Hesdin. Il s'arrêta devant une auberge pour laisser\r\n-souffler le cheval et lui faire donner l'avoine.\r\n-\r\n-Ce cheval était, comme l'avait dit Scaufflaire, de cette petite race du\r\n-Boulonnais qui a trop de tête, trop de ventre et pas assez d'encolure,\r\n-mais qui a le poitrail ouvert, la croupe large, la jambe sèche et fine\r\n-et le pied solide; race laide, mais robuste et saine. L'excellente bête\r\n-avait fait cinq lieues en deux heures et n'avait pas une goutte de sueur\r\n-sur la croupe.\r\n-\r\n-Il n'était pas descendu du tilbury. Le garçon d'écurie qui apportait\r\n-l'avoine se baissa tout à coup et examina la roue de gauche.\r\n-\r\n---Allez-vous loin comme cela? dit cet homme.\r\n-\r\n-Il répondit, presque sans sortir de sa rêverie:\r\n-\r\n---Pourquoi?\r\n-\r\n---Venez-vous de loin? reprit le garçon.\r\n-\r\n---De cinq lieues d'ici.\r\n-\r\n---Ah!\r\n-\r\n---Pourquoi dites-vous: ah?\r\n-\r\n-Le garçon se pencha de nouveau, resta un moment silencieux, l'oeil fixé\r\n-sur la roue, puis se redressa en disant:\r\n-\r\n---C'est que voilà une roue qui vient de faire cinq lieues, c'est\r\n-possible, mais qui à coup sûr ne fera pas maintenant un quart de lieue.\r\n-\r\n-Il sauta à bas du tilbury.\r\n-\r\n---Que dites-vous là , mon ami?\r\n-\r\n---Je dis que c'est un miracle que vous ayez fait cinq lieues sans\r\n-rouler, vous et votre cheval, dans quelque fossé de la grande route.\r\n-Regardez plutôt.\r\n-\r\n-La roue en effet était gravement endommagée. Le choc de la malle-poste\r\n-avait fendu deux rayons et labouré le moyeu dont l'écrou ne tenait plus.\r\n-\r\n---Mon ami, dit-il au garçon d'écurie, il y a un charron ici?\r\n-\r\n---Sans doute, monsieur.\r\n-\r\n---Rendez-moi le service de l'aller chercher.\r\n-\r\n---Il est là , à deux pas. Hé! maître Bourgaillard!\r\n-\r\n-Maître Bourgaillard, le charron, était sur le seuil de sa porte. Il vint\r\n-examiner la roue et fit la grimace d'un chirurgien qui considère une\r\n-jambe cassée.\r\n-\r\n---Pouvez-vous raccommoder cette roue sur-le-champ?\r\n-\r\n---Oui, monsieur.\r\n-\r\n---Quand pourrai-je repartir?\r\n-\r\n---Demain.\r\n-\r\n---Demain!\r\n-\r\n---Il y a une grande journée d'ouvrage. Est-ce que monsieur est pressé?\r\n-\r\n---Très pressé. Il faut que je reparte dans une heure au plus tard.\r\n-\r\n---Impossible, monsieur.\r\n-\r\n---Je payerai tout ce qu'on voudra.\r\n-\r\n---Impossible.\r\n-\r\n---Eh bien! dans deux heures.\r\n-\r\n---Impossible pour aujourd'hui. Il faut refaire deux rais et un moyeu.\r\n-Monsieur ne pourra repartir avant demain.\r\n-\r\n---L'affaire que j'ai ne peut attendre à demain. Si, au lieu de\r\n-raccommoder cette roue, on la remplaçait?\r\n-\r\n---Comment cela?\r\n-\r\n---Vous êtes charron?\r\n-\r\n---Sans doute, monsieur.\r\n-\r\n---Est-ce que vous n'auriez pas une roue à me vendre? Je pourrais\r\n-repartir tout de suite.\r\n-\r\n---Une roue de rechange?\r\n-\r\n---Oui.\r\n-\r\n---Je n'ai pas une roue toute faite pour votre cabriolet. Deux roues font\r\n-la paire. Deux roues ne vont pas ensemble au hasard.\r\n-\r\n---En ce cas, vendez-moi une paire de roues.\r\n-\r\n---Monsieur, toutes les roues ne vont pas à tous les essieux.\r\n-\r\n---Essayez toujours.\r\n-\r\n---C'est inutile, monsieur. Je n'ai à vendre que des roues de charrette.\r\n-Nous sommes un petit pays ici.\r\n-\r\n---Auriez-vous un cabriolet à me louer?\r\n-\r\n-Le maître charron, du premier coup d'oeil, avait reconnu que le tilbury\r\n-était une voiture de louage. Il haussa les épaules.\r\n-\r\n---Vous les arrangez bien, les cabriolets qu'on vous loue! j'en aurais un\r\n-que je ne vous le louerais pas.\r\n-\r\n---Eh bien, à me vendre?\r\n-\r\n---Je n'en ai pas.\r\n-\r\n---Quoi! pas une carriole? Je ne suis pas difficile, comme vous voyez.\r\n-\r\n---Nous sommes un petit pays. J'ai bien là sous la remise, ajouta le\r\n-charron, une vieille calèche qui est à un bourgeois de la ville qui me\r\n-l'a donnée en garde et qui s'en sert tous les trente-six du mois. Je\r\n-vous la louerais bien, qu'est-ce que cela me fait? mais il ne faudrait\r\n-pas que le bourgeois la vît passer; et puis, c'est une calèche, il\r\n-faudrait deux chevaux.\r\n-\r\n---Je prendrai des chevaux de poste.\r\n-\r\n---Où va monsieur?\r\n-\r\n---À Arras.\r\n-\r\n---Et monsieur veut arriver aujourd'hui?\r\n-\r\n---Mais oui.\r\n-\r\n---En prenant des chevaux de poste?\r\n-\r\n---Pourquoi pas?\r\n-\r\n---Est-il égal à monsieur d'arriver cette nuit à quatre heures du matin?\r\n-\r\n---Non certes.\r\n-\r\n---C'est que, voyez-vous bien, il y a une chose à dire, en prenant des\r\n-chevaux de poste....\r\n-\r\n---Monsieur a son passeport?\r\n-\r\n---Oui.\r\n-\r\n---Eh bien, en prenant des chevaux de poste, monsieur n'arrivera pas à \r\n-Arras avant demain. Nous sommes un chemin de traverse. Les relais sont\r\n-mal servis, les chevaux sont aux champs. C'est la saison des grandes\r\n-charrues qui commence, il faut de forts attelages, et l'on prend les\r\n-chevaux partout, à la poste comme ailleurs. Monsieur attendra au moins\r\n-trois ou quatre heures à chaque relais. Et puis on va au pas. Il y a\r\n-beaucoup de côtes à monter.\r\n-\r\n---Allons, j'irai à cheval. Dételez le cabriolet. On me vendra bien une\r\n-selle dans le pays.\r\n-\r\n---Sans doute. Mais ce cheval-ci endure-t-il la selle?\r\n-\r\n---C'est vrai, vous m'y faites penser. Il ne l'endure pas.\r\n-\r\n---Alors....\r\n-\r\n---Mais je trouverai bien dans le village un cheval à louer?\r\n-\r\n---Un cheval pour aller à Arras d'une traite!\r\n-\r\n---Oui.\r\n-\r\n---Il faudrait un cheval comme on n'en a pas dans nos endroits. Il\r\n-faudrait l'acheter d'abord, car on ne vous connaît pas. Mais ni à vendre\r\n-ni à louer, ni pour cinq cents francs, ni pour mille, vous ne le\r\n-trouveriez pas!\r\n-\r\n---Comment faire?\r\n-\r\n---Le mieux, là , en honnête homme, c'est que je raccommode la roue et que\r\n-vous remettiez votre voyage à demain.\r\n-\r\n---Demain il sera trop tard.\r\n-\r\n---Dame!\r\n-\r\n---N'y a-t-il pas la malle-poste qui va à Arras? Quand passe-t-elle?\r\n-\r\n---La nuit prochaine. Les deux malles font le service la nuit, celle qui\r\n-monte comme celle qui descend.\r\n-\r\n---Comment! il vous faut une journée pour raccommoder cette roue?\r\n-\r\n---Une journée, et une bonne!\r\n-\r\n---En mettant deux ouvriers?\r\n-\r\n---En en mettant dix!\r\n-\r\n---Si on liait les rayons avec des cordes?\r\n-\r\n---Les rayons, oui; le moyeu, non. Et puis la jante aussi est en mauvais\r\n-état.\r\n-\r\n---Y a-t-il un loueur de voitures dans la ville?\r\n-\r\n---Non.\r\n-\r\n---Y a-t-il un autre charron?\r\n-\r\n-Le garçon d'écurie et le maître charron répondirent en même temps en\r\n-hochant la tête.\r\n-\r\n---Non.\r\n-\r\n-Il sentit une immense joie.\r\n-\r\n-Il était évident que la providence s'en mêlait. C'était elle qui avait\r\n-brisé la roue du tilbury et qui l'arrêtait en route. Il ne s'était pas\r\n-rendu à cette espèce de première sommation; il venait de faire tous les\r\n-efforts possibles pour continuer son voyage; il avait loyalement et\r\n-scrupuleusement épuisé tous les moyens; il n'avait reculé ni devant la\r\n-saison, ni devant la fatigue, ni devant la dépense; il n'avait rien à se\r\n-reprocher. S'il n'allait pas plus loin, cela ne le regardait plus. Ce\r\n-n'était plus sa faute, c'était, non le fait de sa conscience, mais le\r\n-fait de la providence.\r\n-\r\n-Il respira. Il respira librement et à pleine poitrine pour la première\r\n-fois depuis la visite de Javert. Il lui semblait que le poignet de fer\r\n-qui lui serrait le coeur depuis vingt heures venait de le lâcher.\r\n-\r\n-Il lui paraissait que maintenant Dieu était pour lui, et se déclarait.\r\n-\r\n-Il se dit qu'il avait fait tout ce qu'il pouvait, et qu'à présent il\r\n-n'avait qu'à revenir sur ses pas, tranquillement.\r\n-\r\n-Si sa conversation avec le charron eût eu lieu dans une chambre de\r\n-l'auberge, elle n'eût point eu de témoins, personne ne l'eût entendue,\r\n-les choses en fussent restées là , et il est probable que nous n'aurions\r\n-eu à raconter aucun des événements qu'on va lire; mais cette\r\n-conversation s'était faite dans la rue. Tout colloque dans la rue\r\n-produit inévitablement un cercle. Il y a toujours des gens qui ne\r\n-demandent qu'à être spectateurs. Pendant qu'il questionnait le charron,\r\n-quelques allants et venants s'étaient arrêtés autour d'eux. Après avoir\r\n-écouté pendant quelques minutes, un jeune garçon, auquel personne\r\n-n'avait pris garde, s'était détaché du groupe en courant.\r\n-\r\n-Au moment où le voyageur, après la délibération intérieure que nous\r\n-venons d'indiquer, prenait la résolution de rebrousser chemin, cet\r\n-enfant revenait. Il était accompagné d'une vieille femme.\r\n-\r\n---Monsieur, dit la femme, mon garçon me dit que vous avez envie de louer\r\n-un cabriolet. Cette simple parole, prononcée par une vieille femme que\r\n-conduisait un enfant, lui fit ruisseler la sueur dans les reins. Il crut\r\n-voir la main qui l'avait lâché reparaître dans l'ombre derrière lui,\r\n-toute prête à le reprendre.\r\n-\r\n-Il répondit:\r\n-\r\n---Oui, bonne femme, je cherche un cabriolet à louer.\r\n-\r\n-Et il se hâta d'ajouter:\r\n-\r\n---Mais il n'y en a pas dans le pays.\r\n-\r\n---Si fait, dit la vieille.\r\n-\r\n---Où ça donc? reprit le charron.\r\n-\r\n---Chez moi, répliqua la vieille.\r\n-\r\n-Il tressaillit. La main fatale l'avait ressaisi.\r\n-\r\n-La vieille avait en effet sous un hangar une façon de carriole en osier.\r\n-Le charron et le garçon d'auberge, désolés que le voyageur leur\r\n-échappât, intervinrent.\r\n-\r\n---C'était une affreuse guimbarde,--cela était posé à cru sur\r\n-l'essieu,--il est vrai que les banquettes étaient suspendues à \r\n-l'intérieur avec des lanières de cuir,--il pleuvait dedans,--les roues\r\n-étaient rouillées et rongées d'humidité,--cela n'irait pas beaucoup plus\r\n-loin que le tilbury,--une vraie patache!--Ce monsieur aurait bien tort\r\n-de s'y embarquer,--etc., etc.\r\n-\r\n-Tout cela était vrai, mais cette guimbarde, cette patache, cette chose,\r\n-quelle qu'elle fût, roulait sur ses deux roues et pouvait aller à Arras.\r\n-\r\n-Il paya ce qu'on voulut, laissa le tilbury à réparer chez le charron\r\n-pour l'y retrouver à son retour, fit atteler le cheval blanc à la\r\n-carriole, y monta, et reprit la route qu'il suivait depuis le matin.\r\n-\r\n-Au moment où la carriole s'ébranla, il s'avoua qu'il avait eu l'instant\r\n-d'auparavant une certaine joie de songer qu'il n'irait point où il\r\n-allait. Il examina cette joie avec une sorte de colère et la trouva\r\n-absurde. Pourquoi de la joie à revenir en arrière? Après tout, il\r\n-faisait ce voyage librement. Personne ne l'y forçait. Et, certainement,\r\n-rien n'arriverait que ce qu'il voudrait bien.\r\n-\r\n-Comme il sortait de Hesdin, il entendit une voix qui lui criait:\r\n-arrêtez! arrêtez! Il arrêta la carriole d'un mouvement vif dans lequel\r\n-il y avait encore je ne sais quoi de fébrile et de convulsif qui\r\n-ressemblait à de l'espérance.\r\n-\r\n-C'était le petit garçon de la vieille.\r\n-\r\n---Monsieur, dit-il, c'est moi qui vous ai procuré la carriole.\r\n-\r\n---Eh bien!\r\n-\r\n---Vous ne m'avez rien donné.\r\n-\r\n-Lui qui donnait à tous et si facilement, il trouva cette prétention\r\n-exorbitante et presque odieuse.\r\n-\r\n---Ah! c'est toi, drôle? dit-il, tu n'auras rien!\r\n-\r\n-Il fouetta le cheval et repartit au grand trot.\r\n-\r\n-Il avait perdu beaucoup de temps à Hesdin, il eût voulu le rattraper. Le\r\n-petit cheval était courageux et tirait comme deux; mais on était au mois\r\n-de février, il avait plu, les routes étaient mauvaises. Et puis, ce\r\n-n'était plus le tilbury. La carriole était dure et très lourde. Avec\r\n-cela force montées.\r\n-\r\n-Il mit près de quatre heures pour aller de Hesdin à Saint-Pol. Quatre\r\n-heures pour cinq lieues.\r\n-\r\n-À Saint-Pol il détela à la première auberge venue, et fit mener le\r\n-cheval à l'écurie. Comme il l'avait promis à Scaufflaire, il se tint\r\n-près du râtelier pendant que le cheval mangeait. Il songeait à des\r\n-choses tristes et confuses.\r\n-\r\n-La femme de l'aubergiste entre dans l'écurie.\r\n-\r\n---Est-ce que monsieur ne veut pas déjeuner?\r\n-\r\n---Tiens, c'est vrai, dit-il, j'ai même bon appétit. Il suivit cette\r\n-femme qui avait une figure fraîche et réjouie. Elle le conduisit dans\r\n-une salle basse où il y avait des tables ayant pour nappes des toiles\r\n-cirées.\r\n-\r\n---Dépêchez-vous, reprit-il, il faut que je reparte. Je suis pressé.\r\n-\r\n-Une grosse servante flamande mit son couvert en toute hâte. Il regardait\r\n-cette fille avec un sentiment de bien-être.\r\n-\r\n---C'est là ce que j'avais, pensa-t-il. Je n'avais pas déjeuné.\r\n-\r\n-On le servit. Il se jeta sur le pain, mordit une bouchée, puis le reposa\r\n-lentement sur la table et n'y toucha plus.\r\n-\r\n-Un routier mangeait à une autre table. Il dit à cet homme:\r\n-\r\n---Pourquoi leur pain est-il donc si amer?\r\n-\r\n-Le routier était allemand et n'entendit pas.\r\n-\r\n-Il retourna dans l'écurie près du cheval.\r\n-\r\n-Une heure après, il avait quitté Saint-Pol et se dirigeait vers Tinques\r\n-qui n'est qu'à cinq lieues d'Arras.\r\n-\r\n-Que faisait-il pendant ce trajet? À quoi pensait-il? Comme le matin, il\r\n-regardait passer les arbres, les toits de chaume, les champs cultivés,\r\n-et les évanouissements du paysage qui se disloque à chaque coude du\r\n-chemin. C'est là une contemplation qui suffit quelquefois à l'âme et qui\r\n-la dispense presque de penser. Voir mille objets pour la première et\r\n-pour la dernière fois, quoi de plus mélancolique et de plus profond!\r\n-Voyager, c'est naître et mourir à chaque instant. Peut-être, dans la\r\n-région la plus vague de son esprit, faisait-il des rapprochements entre\r\n-ces horizons changeants et l'existence humaine. Toutes les choses de la\r\n-vie sont perpétuellement en fuite devant nous. Les obscurcissements et\r\n-les clartés s'entremêlent: après un éblouissement, une éclipse; on\r\n-regarde, on se hâte, on tend les mains pour saisir ce qui passe; chaque\r\n-événement est un tournant de la route; et tout à coup on est vieux. On\r\n-sent comme une secousse, tout est noir, on distingue une porte obscure,\r\n-ce sombre cheval de la vie qui vous traînait s'arrête, et l'on voit\r\n-quelqu'un de voilé et d'inconnu qui le dételle dans les ténèbres.\r\n-\r\n-Le crépuscule tombait au moment où des enfants qui sortaient de l'école\r\n-regardèrent ce voyageur entrer dans Tinques. Il est vrai qu'on était\r\n-encore aux jours courts de l'année. Il ne s'arrêta pas à Tinques. Comme\r\n-il débouchait du village, un cantonnier qui empierrait la route dressa\r\n-la tête et dit:\r\n-\r\n---Voilà un cheval bien fatigué.\r\n-\r\n-La pauvre bête en effet n'allait plus qu'au pas.\r\n-\r\n---Est-ce que vous allez à Arras? ajouta le cantonnier.\r\n-\r\n---Oui.\r\n-\r\n---Si vous allez de ce train, vous n'y arriverez pas de bonne heure.\r\n-\r\n-Il arrêta le cheval et demanda au cantonnier:\r\n-\r\n---Combien y a-t-il encore d'ici à Arras?\r\n-\r\n---Près de sept grandes lieues.\r\n-\r\n---Comment cela? le livre de poste ne marque que cinq lieues et un quart.\r\n-\r\n---Ah! reprit le cantonnier, vous ne savez donc pas que la route est en\r\n-réparation? Vous allez la trouver coupée à un quart d'heure d'ici. Pas\r\n-moyen d'aller plus loin.\r\n-\r\n---Vraiment.\r\n-\r\n---Vous prendrez à gauche, le chemin qui va à Carency, vous passerez la\r\n-rivière; et, quand vous serez à Camblin, vous tournerez à droite; c'est\r\n-la route de Mont-Saint-Éloy qui va à Arras.\r\n-\r\n---Mais voilà la nuit, je me perdrai.\r\n-\r\n---Vous n'êtes pas du pays?\r\n-\r\n---Non.\r\n-\r\n---Avec ça, c'est tout chemins de traverse. Tenez, Monsieur, reprit le\r\n-cantonnier, voulez-vous que je vous donne un conseil? Votre cheval est\r\n-las, rentrez dans Tinques. Il y a une bonne auberge. Couchez-y. Vous\r\n-irez demain à Arras.\r\n-\r\n---Il faut que j'y sois ce soir.\r\n-\r\n---C'est différent. Alors allez tout de même à cette auberge et prenez-y\r\n-un cheval de renfort. Le garçon du cheval vous guidera dans la traverse.\r\n-\r\n-Il suivit le conseil du cantonnier, rebroussa chemin, et une demi-heure\r\n-après il repassait au même endroit, mais au grand trot, avec un bon\r\n-cheval de renfort. Un garçon d'écurie qui s'intitulait postillon était\r\n-assis sur le brancard de la carriole.\r\n-\r\n-Cependant il sentait qu'il perdait du temps.\r\n-\r\n-Il faisait tout à fait nuit.\r\n-\r\n-Ils s'engagèrent dans la traverse. La route devint affreuse. La carriole\r\n-tombait d'une ornière dans l'autre. Il dit au postillon:\r\n-\r\n---Toujours au trot, et double pourboire.\r\n-\r\n-Dans un cahot le palonnier cassa.\r\n-\r\n---Monsieur, dit le postillon, voilà le palonnier cassé, je ne sais plus\r\n-comment atteler mon cheval, cette route-ci est bien mauvaise la nuit; si\r\n-vous vouliez revenir coucher à Tinques, nous pourrions être demain matin\r\n-de bonne heure à Arras.\r\n-\r\n-Il répondit:\r\n-\r\n---As-tu un bout de corde et un couteau?\r\n-\r\n---Oui, monsieur.\r\n-\r\n-Il coupa une branche d'arbre et en fit un palonnier.\r\n-\r\n-Ce fut encore une perte de vingt minutes; mais ils repartirent au galop.\r\n-\r\n-La plaine était ténébreuse. Des brouillards bas, courts et noirs\r\n-rampaient sur les collines et s'en arrachaient comme des fumées. Il y\r\n-avait des lueurs blanchâtres dans les nuages. Un grand vent qui venait\r\n-de la mer faisait dans tous les coins de l'horizon le bruit de quelqu'un\r\n-qui remue des meubles. Tout ce qu'on entrevoyait avait des attitudes de\r\n-terreur. Que de choses frissonnent sous ces vastes souffles de la nuit!\r\n-\r\n-Le froid le pénétrait. Il n'avait pas mangé depuis la veille. Il se\r\n-rappelait vaguement son autre course nocturne dans la grande plaine aux\r\n-environs de Digne. Il y avait huit ans; et cela lui semblait hier.\r\n-\r\n-Une heure sonna à quelque clocher lointain. Il demanda au garçon:\r\n-\r\n---Quelle est cette heure?\r\n-\r\n---Sept heures, monsieur. Nous serons à Arras à huit. Nous n'avons plus\r\n-que trois lieues. En ce moment il fit pour la première fois cette\r\n-réflexion--en trouvant étrange qu'elle ne lui fût pas venue plus\r\n-tôt--que c'était peut-être inutile, toute la peine qu'il prenait; qu'il\r\n-ne savait seulement pas l'heure du procès; qu'il aurait dû au moins s'en\r\n-informer; qu'il était extravagant d'aller ainsi devant soi sans savoir\r\n-si cela servirait à quelque chose.--Puis il ébaucha quelques calculs\r\n-dans son esprit:--qu'ordinairement les séances des cours d'assises\r\n-commençaient à neuf heures du matin;--que cela ne devait pas être long,\r\n-cette affaire-là ;--que le vol de pommes, ce serait très court;--qu'il\r\n-n'y aurait plus ensuite qu'une question d'identité;--quatre ou cinq\r\n-dépositions, peu de chose à dire pour les avocats;--qu'il allait\r\n-arriver lorsque tout serait fini!\r\n-\r\n-Le postillon fouettait les chevaux. Ils avaient passé la rivière et\r\n-laissé derrière eux Mont-Saint-Éloy.\r\n-\r\n-La nuit devenait de plus en plus profonde.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VI\r\n-\r\n-La soeur Simplice mise à l'épreuve\r\n-\r\n-\r\n-Cependant, en ce moment-là même, Fantine était dans la joie.\r\n-\r\n-Elle avait passé une très mauvaise nuit. Toux affreuse, redoublement de\r\n-fièvre; elle avait eu des songes. Le matin, à la visite du médecin, elle\r\n-délirait. Il avait eu l'air alarmé et avait recommandé qu'on le prévînt\r\n-dès que M. Madeleine viendrait.\r\n-\r\n-Toute la matinée elle fut morne, parla peu, et fit des plis à ses draps\r\n-en murmurant à voix basse des calculs qui avaient l'air d'être des\r\n-calculs de distances. Ses yeux étaient caves et fixes. Ils paraissaient\r\n-presque éteints, et puis, par moments, ils se rallumaient et\r\n-resplendissaient comme des étoiles. Il semble qu'aux approches d'une\r\n-certaine heure sombre, la clarté du ciel emplisse ceux que quitte la\r\n-clarté de la terre.\r\n-\r\n-Chaque fois que la soeur Simplice lui demandait comment elle se\r\n-trouvait, elle répondait invariablement:\r\n-\r\n---Bien. Je voudrais voir monsieur Madeleine.\r\n-\r\n-Quelques mois auparavant, à ce moment où Fantine venait de perdre sa\r\n-dernière pudeur, sa dernière honte et sa dernière joie, elle était\r\n-l'ombre d'elle-même; maintenant elle en était le spectre. Le mal\r\n-physique avait complété l'oeuvre du mal moral. Cette créature de\r\n-vingt-cinq ans avait le front ridé, les joues flasques, les narines\r\n-pincées, les dents déchaussées, le teint plombé, le cou osseux, les\r\n-clavicules saillantes, les membres chétifs, la peau terreuse, et ses\r\n-cheveux blonds poussaient mêlés de cheveux gris. Hélas! comme la maladie\r\n-improvise la vieillesse! À midi, le médecin revint, il fit quelques\r\n-prescriptions, s'informa si M. le maire avait paru à l'infirmerie, et\r\n-branla la tête.\r\n-\r\n-M. Madeleine venait d'habitude à trois heures voir la malade. Comme\r\n-l'exactitude était de la bonté, il était exact.\r\n-\r\n-Vers deux heures et demie, Fantine commença à s'agiter. Dans l'espace de\r\n-vingt minutes, elle demanda plus de dix fois à la religieuse:\r\n-\r\n---Ma soeur, quelle heure est-il?\r\n-\r\n-Trois heures sonnèrent. Au troisième coup, Fantine se dressa sur son\r\n-séant, elle qui d'ordinaire pouvait à peine remuer dans son lit; elle\r\n-joignit dans une sorte d'étreinte convulsive ses deux mains décharnées\r\n-et jaunes, et la religieuse entendit sortir de sa poitrine un de ces\r\n-soupirs profonds qui semblent soulever un accablement. Puis Fantine se\r\n-tourna et regarda la porte.\r\n-\r\n-Personne n'entra; la porte ne s'ouvrit point.\r\n-\r\n-Elle resta ainsi un quart d'heure, l'oeil attaché sur la porte, immobile\r\n-et comme retenant son haleine. La soeur n'osait lui parler. L'église\r\n-sonna trois heures un quart. Fantine se laissa retomber sur l'oreiller.\r\n-\r\n-Elle ne dit rien et se remit à faire des plis à son drap. La demi-heure\r\n-passa, puis l'heure. Personne ne vint.\r\n-\r\n-Chaque fois que l'horloge sonnait, Fantine se dressait et regardait du\r\n-côté de la porte, puis elle retombait.\r\n-\r\n-On voyait clairement sa pensée, mais elle ne prononçait aucun nom, elle\r\n-ne se plaignait pas, elle n'accusait pas. Seulement elle toussait d'une\r\n-façon lugubre. On eût dit que quelque chose d'obscur s'abaissait sur\r\n-elle. Elle était livide et avait les lèvres bleues. Elle souriait par\r\n-moments.\r\n-\r\n-Cinq heures sonnèrent. Alors la soeur l'entendit qui disait très bas et\r\n-doucement:\r\n-\r\n---Mais puisque je m'en vais demain, il a tort de ne pas venir\r\n-aujourd'hui!\r\n-\r\n-La soeur Simplice elle-même était surprise du retard de M. Madeleine.\r\n-\r\n-Cependant Fantine regardait le ciel de son lit. Elle avait l'air de\r\n-chercher à se rappeler quelque chose. Tout à coup elle se mit à chanter\r\n-d'une voix faible comme un souffle. La religieuse écouta. Voici ce que\r\n-Fantine chantait:\r\n-\r\n- _Nous achèterons de bien belles choses_\r\n- _En nous promenant le long des faubourgs._\r\n- _Les bleuets sont bleus, les roses sont roses,_\r\n- _Les bleuets sont bleus, j'aime mes amours._\r\n- _La vierge Marie auprès de mon poêle_\r\n- _Est venue hier en manteau brodé,_\r\n- _Et m'a dit:--Voici, caché sous mon voile,_\r\n- _Le petit qu'un jour tu m'as demandé._\r\n- _Courez à la ville, ayez de la toile,_\r\n- _Achetez du fil, achetez un dé._\r\n- _Nous achèterons de bien belles choses_\r\n- _En nous promenant le long des faubourgs._\r\n- _Bonne sainte Vierge, auprès de mon poêle_\r\n- _J'ai mis un berceau de rubans orné_\r\n- _Dieu me donnerait sa plus belle étoile,_\r\n- _J'aime mieux l'enfant que tu m'as donné._\r\n- --_Madame, que faire avec cette toile?_\r\n- --_Faites un trousseau pour mon nouveau-né._\r\n- _Les bleuets sont bleus, les roses sont roses,_\r\n- _Les bleuets sont bleus, j'aime mes amours._\r\n- --_Lavez cette toile._\r\n- --_Où?_--_Dans la rivière._\r\n- _Faites-en, sans rien gâter ni salir,_\r\n- _Une belle jupe avec sa brassière_\r\n- _Que je veux broder et de fleurs emplir._\r\n- --_L'enfant n'est plus là , madame, qu'en faire?_\r\n- --_Faites-en un drap pour m'ensevelir._\r\n- _Nous achèterons de bien belles choses_\r\n- _En nous promenant le long des faubourgs._\r\n- _Les bleuets sont bleus, les roses sont roses,_\r\n- _Les bleuets sont bleus, j'aime mes amours._\r\n-\r\n-Cette chanson était une vieille romance de berceuse avec laquelle\r\n-autrefois elle endormait sa petite Cosette, et qui ne s'était pas\r\n-offerte à son esprit depuis cinq ans qu'elle n'avait plus son enfant.\r\n-Elle chantait cela d'une voix si triste et sur un air si doux que\r\n-c'était à faire pleurer, même une religieuse. La soeur, habituée aux\r\n-choses austères, sentit une larme lui venir.\r\n-\r\n-L'horloge sonna six heures. Fantine ne parut pas entendre. Elle semblait\r\n-ne plus faire attention à aucune chose autour d'elle.\r\n-\r\n-La soeur Simplice envoya une fille de service s'informer près de la\r\n-portière de la fabrique si M. le maire était rentré et s'il ne monterait\r\n-pas bientôt à l'infirmerie. La fille revint au bout de quelques minutes.\r\n-\r\n-Fantine était toujours immobile et paraissait attentive à des idées\r\n-qu'elle avait.\r\n-\r\n-La servante raconta très bas à la soeur Simplice que M. le maire était\r\n-parti le matin même avant six heures dans un petit tilbury attelé d'un\r\n-cheval blanc, par le froid qu'il faisait, qu'il était parti seul, pas\r\n-même de cocher, qu'on ne savait pas le chemin qu'il avait pris, que des\r\n-personnes disaient l'avoir vu tourner par la route d'Arras, que d'autres\r\n-assuraient l'avoir rencontré sur la route de Paris. Qu'en s'en allant il\r\n-avait été comme à l'ordinaire très doux, et qu'il avait seulement dit à \r\n-la portière qu'on ne l'attendît pas cette nuit.\r\n-\r\n-Pendant que les deux femmes, le dos tourné au lit de la Fantine,\r\n-chuchotaient, la soeur questionnant, la servante conjecturant, la\r\n-Fantine, avec cette vivacité fébrile de certaines maladies organiques\r\n-qui mêle les mouvements libres de la santé à l'effrayante maigreur de la\r\n-mort, s'était mise à genoux sur son lit, ses deux poings crispés appuyés\r\n-sur le traversin, et, la tête passée par l'intervalle des rideaux, elle\r\n-écoutait. Tout à coup elle cria:\r\n-\r\n---Vous parlez là de monsieur Madeleine! pourquoi parlez-vous tout bas?\r\n-Qu'est-ce qu'il fait? Pourquoi ne vient-il pas?\r\n-\r\n-Sa voix était si brusque et si rauque que les deux femmes crurent\r\n-entendre une voix d'homme; elles se retournèrent effrayées.\r\n-\r\n---Répondez donc! cria Fantine.\r\n-\r\n-La servante balbutia:\r\n-\r\n---La portière m'a dit qu'il ne pourrait pas venir aujourd'hui.\r\n-\r\n---Mon enfant, dit la soeur, tenez-vous tranquille, recouchez-vous.\r\n-\r\n-Fantine, sans changer d'attitude, reprit d'une voix haute et avec un\r\n-accent tout à la fois impérieux et déchirant:\r\n-\r\n---Il ne pourra venir? Pourquoi cela? Vous savez la raison. Vous la\r\n-chuchotiez là entre vous. Je veux la savoir.\r\n-\r\n-La servante se hâta de dire à l'oreille de la religieuse:\r\n-\r\n---Répondez qu'il est occupé au conseil municipal.\r\n-\r\n-La soeur Simplice rougit légèrement; c'était un mensonge que la servante\r\n-lui proposait. D'un autre côté il lui semblait bien que dire la vérité à \r\n-la malade ce serait sans doute lui porter un coup terrible et que cela\r\n-était grave dans l'état où était Fantine. Cette rougeur dura peu. La\r\n-soeur leva sur Fantine son oeil calme et triste, et dit:\r\n-\r\n---Monsieur le maire est parti.\r\n-\r\n-Fantine se redressa et s'assit sur ses talons. Ses yeux étincelèrent.\r\n-Une joie inouïe rayonna sur cette physionomie douloureuse.\r\n-\r\n---Parti! s'écria-t-elle. Il est allé chercher Cosette!\r\n-\r\n-Puis elle tendit ses deux mains vers le ciel et tout son visage devint\r\n-ineffable. Ses lèvres remuaient; elle priait à voix basse.\r\n-\r\n-Quand sa prière fut finie:\r\n-\r\n---Ma soeur, dit-elle, je veux bien me recoucher, je vais faire tout ce\r\n-qu'on voudra; tout à l'heure j'ai été méchante, je vous demande pardon\r\n-d'avoir parlé si haut, c'est très mal de parler haut, je le sais bien,\r\n-ma bonne soeur, mais voyez-vous, je suis très contente. Le bon Dieu est\r\n-bon, monsieur Madeleine est bon, figurez-vous qu'il est allé chercher ma\r\n-petite Cosette à Montfermeil.\r\n-\r\n-Elle se recoucha, aida la religieuse à arranger l'oreiller et baisa une\r\n-petite croix d'argent qu'elle avait au cou et que la soeur Simplice lui\r\n-avait donnée.\r\n-\r\n---Mon enfant, dit la soeur, tâchez de reposer maintenant, et ne parlez\r\n-plus.\r\n-\r\n-Fantine prit dans ses mains moites la main de la soeur, qui souffrait de\r\n-lui sentir cette sueur.\r\n-\r\n---Il est parti ce matin pour aller à Paris. Au fait il n'a pas même\r\n-besoin de passer par Paris. Montfermeil, c'est un peu à gauche en\r\n-venant. Vous rappelez-vous comme il me disait hier quand je lui parlais\r\n-de Cosette: bientôt, bientôt? C'est une surprise qu'il veut me faire.\r\n-Vous savez? il m'avait fait signer une lettre pour la reprendre aux\r\n-Thénardier. Ils n'auront rien à dire, pas vrai? Ils rendront Cosette.\r\n-Puisqu'ils sont payés. Les autorités ne souffriraient pas qu'on garde un\r\n-enfant quand on est payé. Ma soeur, ne me faites pas signe qu'il ne faut\r\n-pas que je parle. Je suis extrêmement heureuse, je vais très bien, je\r\n-n'ai plus de mal du tout, je vais revoir Cosette, j'ai même très faim.\r\n-Il y a près de cinq ans que je ne l'ai vue. Vous ne vous figurez pas,\r\n-vous, comme cela vous tient, les enfants! Et puis elle sera si gentille,\r\n-vous verrez! Si vous saviez, elle a de si jolis petits doigts roses!\r\n-D'abord elle aura de très belles mains. À un an, elle avait des mains\r\n-ridicules. Ainsi!--Elle doit être grande à présent. Cela vous a sept\r\n-ans. C'est une demoiselle. Je l'appelle Cosette, mais elle s'appelle\r\n-Euphrasie. Tenez, ce matin, je regardais de la poussière qui était sur\r\n-la cheminée et j'avais bien l'idée comme cela que je reverrais bientôt\r\n-Cosette. Mon Dieu! comme on a tort d'être des années sans voir ses\r\n-enfants! on devrait bien réfléchir que la vie n'est pas éternelle! Oh!\r\n-comme il est bon d'être parti, monsieur le maire! C'est vrai ça, qu'il\r\n-fait bien froid? avait-il son manteau au moins? Il sera ici demain,\r\n-n'est-ce pas? Ce sera demain fête. Demain matin, ma soeur, vous me ferez\r\n-penser à mettre mon petit bonnet qui a de la dentelle. Montfermeil,\r\n-c'est un pays. J'ai fait cette route-là , à pied, dans le temps. Il y a\r\n-eu bien loin pour moi. Mais les diligences vont très vite! Il sera ici\r\n-demain avec Cosette. Combien y a-t-il d'ici Montfermeil?\r\n-\r\n-La soeur, qui n'avait aucune idée des distances, répondit:\r\n-\r\n---Oh! je crois bien qu'il pourra être ici demain.\r\n-\r\n---Demain! demain! dit Fantine, je verrai Cosette demain! Voyez-vous,\r\n-bonne soeur du bon Dieu, je ne suis plus malade. Je suis folle. Je\r\n-danserais, si on voulait.\r\n-\r\n-Quelqu'un qui l'eût vue un quart d'heure auparavant n'y eût rien\r\n-compris. Elle était maintenant toute rose, elle parlait d'une voix vive\r\n-et naturelle, toute sa figure n'était qu'un sourire. Par moments elle\r\n-riait en se parlant tout bas. Joie de mère, c'est presque joie d'enfant.\r\n-\r\n---Eh bien, reprit la religieuse, vous voilà heureuse, obéissez-moi, ne\r\n-parlez plus.\r\n-\r\n-Fantine posa sa tête sur l'oreiller et dit à demi-voix:\r\n-\r\n---Oui, recouche-toi, sois sage puisque tu vas avoir ton enfant. Elle a\r\n-raison, soeur Simplice. Tous ceux qui sont ici ont raison.\r\n-\r\n-Et puis, sans bouger, sans remuer la tête, elle se mit à regarder\r\n-partout avec ses yeux tout grands ouverts et un air joyeux, et elle ne\r\n-dit plus rien.\r\n-\r\n-La soeur referma ses rideaux, espérant qu'elle s'assoupirait.\r\n-\r\n-Entre sept et huit heures le médecin vint. N'entendant aucun bruit, il\r\n-crut que Fantine dormait, entra doucement et s'approcha du lit sur la\r\n-pointe du pied. Il entrouvrit les rideaux, et à la lueur de la veilleuse\r\n-il vit les grands yeux calmes de Fantine qui le regardaient.\r\n-\r\n-Elle lui dit:\r\n-\r\n---Monsieur, n'est-ce pas, on me laissera la coucher à côté de moi dans\r\n-un petit lit?\r\n-\r\n-Le médecin crut qu'elle délirait. Elle ajouta:\r\n-\r\n---Regardez plutôt, il y a juste de la place.\r\n-\r\n-Le médecin prit à part la soeur Simplice qui lui expliqua la chose, que\r\n-M. Madeleine était absent pour un jour ou deux, et que, dans le doute,\r\n-on n'avait pas cru devoir détromper la malade qui croyait monsieur le\r\n-maire parti pour Montfermeil; qu'il était possible en somme qu'elle eût\r\n-deviné juste. Le médecin approuva.\r\n-\r\n-Il se rapprocha du lit de Fantine, qui reprit:\r\n-\r\n---C'est que, voyez-vous, le matin, quand elle s'éveillera, je lui dirai\r\n-bonjour à ce pauvre chat, et la nuit, moi qui ne dors pas, je\r\n-l'entendrai dormir. Sa petite respiration si douce, cela me fera du\r\n-bien.\r\n-\r\n---Donnez-moi votre main, dit le médecin.\r\n-\r\n-Elle tendit son bras, et s'écria en riant.\r\n-\r\n---Ah! tiens! au fait, c'est vrai, vous ne savez pas c'est que je suis\r\n-guérie. Cosette arrive demain.\r\n-\r\n-Le médecin fut surpris. Elle était mieux. L'oppression était moindre. Le\r\n-pouls avait repris de la force. Une sorte de vie survenue tout à coup\r\n-ranimait ce pauvre être épuisé.\r\n-\r\n---Monsieur le docteur, reprit-elle, la soeur vous a-t-elle dit que\r\n-monsieur le maire était allé chercher le chiffon?\r\n-\r\n-Le médecin recommanda le silence et qu'on évitât toute émotion pénible.\r\n-Il prescrivit une infusion de quinquina pur, et, pour le cas où la\r\n-fièvre reprendrait dans la nuit, une potion calmante. En s'en allant, il\r\n-dit à la soeur:\r\n-\r\n---Cela va mieux. Si le bonheur voulait qu'en effet monsieur le maire\r\n-arrivât demain avec l'enfant, qui sait? il y a des crises si étonnantes,\r\n-on a vu de grandes joies arrêter court des maladies; je sais bien que\r\n-celle-ci est une maladie organique, et bien avancée, mais c'est un tel\r\n-mystère que tout cela! Nous la sauverions peut-être.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VII\r\n-\r\n-Le voyageur arrivé prend ses précautions pour repartir.\r\n-\r\n-\r\n-Il était près de huit heures du soir quand la carriole que nous avons\r\n-laissée en route entra sous la porte cochère de l'hôtel de la Poste\r\n-à Arras. L'homme que nous avons suivi jusqu'à ce moment en descendit,\r\n-répondit d'un air distrait aux empressements des gens de l'auberge,\r\n-renvoya le cheval de renfort, et conduisit lui-même le petit cheval\r\n-blanc à l'écurie; puis il poussa la porte d'une salle de billard qui\r\n-était au rez-de-chaussée, s'y assit, et s'accouda sur une table. Il\r\n-avait mis quatorze heures à ce trajet qu'il comptait faire en six.\r\n-Il se rendait la justice que ce n'était pas sa faute; mais au fond il\r\n-n'en était pas fâché.\r\n-\r\n-La maîtresse de l'hôtel entra.\r\n-\r\n---Monsieur couche-t-il? monsieur soupe-t-il?\r\n-\r\n-Il fit un signe de tête négatif.\r\n-\r\n---Le garçon d'écurie dit que le cheval de monsieur est bien fatigué!\r\n-\r\n-Ici il rompit le silence.\r\n-\r\n---Est-ce que le cheval ne pourra pas repartir demain matin?\r\n-\r\n---Oh! monsieur! il lui faut au moins deux jours de repos.\r\n-\r\n-Il demanda:\r\n-\r\n---N'est-ce pas ici le bureau de poste?\r\n-\r\n---Oui, monsieur.\r\n-\r\n-L'hôtesse le mena à ce bureau; il montra son passeport et s'informa s'il\r\n-y avait moyen de revenir cette nuit même à Montreuil-sur-mer par la\r\n-malle; la place à côté du courrier était justement vacante; il la retint\r\n-et la paya.\r\n-\r\n---Monsieur, dit le buraliste, ne manquez pas d'être ici pour partir à \r\n-une heure précise du matin.\r\n-\r\n-Cela fait, il sortit de l'hôtel et se mit à marcher dans la ville.\r\n-\r\n-Il ne connaissait pas Arras, les rues étaient obscures, et il allait au\r\n-hasard. Cependant il semblait s'obstiner à ne pas demander son chemin\r\n-aux passants. Il traversa la petite rivière Crinchon et se trouva dans\r\n-un dédale de ruelles étroites où il se perdit. Un bourgeois cheminait\r\n-avec un falot. Après quelque hésitation, il prit le parti de s'adresser\r\n-à ce bourgeois, non sans avoir d'abord regardé devant et derrière lui,\r\n-comme s'il craignait que quelqu'un n'entendit la question qu'il allait\r\n-faire.\r\n-\r\n---Monsieur, dit-il, le palais de justice, s'il vous plaît?\r\n-\r\n---Vous n'êtes pas de la ville, monsieur? répondit le bourgeois qui était\r\n-un assez vieux homme, eh bien, suivez-moi. Je vais précisément du côté\r\n-du palais de justice, c'est-à -dire du côté de l'hôtel de la préfecture.\r\n-Car on répare en ce moment le palais, et provisoirement les tribunaux\r\n-ont leurs audiences à la préfecture.\r\n-\r\n---Est-ce là , demanda-t-il, qu'on tient les assises?\r\n-\r\n---Sans doute, monsieur. Voyez-vous, ce qui est la préfecture aujourd'hui\r\n-était l'évêché avant la révolution. Monsieur de Conzié, qui était évêque\r\n-en quatre-vingt-deux, y a fait bâtir une grande salle. C'est dans cette\r\n-grande salle qu'on juge.\r\n-\r\n-Chemin faisant, le bourgeois lui dit:\r\n-\r\n---Si c'est un procès que monsieur veut voir, il est un peu tard.\r\n-Ordinairement les séances finissent à six heures.\r\n-\r\n-Cependant, comme ils arrivaient sur la grande place, le bourgeois lui\r\n-montra quatre longues fenêtres éclairées sur la façade d'un vaste\r\n-bâtiment ténébreux.\r\n-\r\n---Ma foi, monsieur, vous arrivez à temps, vous avez du bonheur.\r\n-Voyez-vous ces quatre fenêtres? c'est la cour d'assises. Il y a de la\r\n-lumière. Donc ce n'est pas fini. L'affaire aura traîné en longueur et on\r\n-fait une audience du soir. Vous vous intéressez à cette affaire? Est-ce\r\n-que c'est un procès criminel? Est-ce que vous êtes témoin?\r\n-\r\n-Il répondit:\r\n-\r\n---Je ne viens pour aucune affaire, j'ai seulement à parler à un avocat.\r\n-\r\n---C'est différent, dit le bourgeois. Tenez, monsieur, voici la porte. Où\r\n-est le factionnaire. Vous n'aurez qu'à monter le grand escalier.\r\n-\r\n-Il se conforma aux indications du bourgeois, et, quelques minutes après,\r\n-il était dans une salle où il y avait beaucoup de monde et où des\r\n-groupes mêlés d'avocats en robe chuchotaient çà et là .\r\n-\r\n-C'est toujours une chose qui serre le coeur de voir ces attroupements\r\n-d'hommes vêtus de noir qui murmurent entre eux à voix basse sur le seuil\r\n-des chambres de justice. Il est rare que la charité et la pitié sortent\r\n-de toutes ces paroles. Ce qui en sort le plus souvent, ce sont des\r\n-condamnations faites d'avance. Tous ces groupes semblent à l'observateur\r\n-qui passe et qui rêve autant de ruches sombres où des espèces d'esprits\r\n-bourdonnants construisent en commun toutes sortes d'édifices ténébreux.\r\n-\r\n-Cette salle, spacieuse et éclairée d'une seule lampe, était une ancienne\r\n-antichambre de l'évêché et servait de salle des pas perdus. Une porte à \r\n-deux battants, fermée en ce moment, la séparait de la grande chambre où\r\n-siégeait la cour d'assises.\r\n-\r\n-L'obscurité était telle qu'il ne craignit pas de s'adresser au premier\r\n-avocat qu'il rencontra.\r\n-\r\n---Monsieur, dit-il, où en est-on?\r\n-\r\n---C'est fini, dit l'avocat.\r\n-\r\n---Fini!\r\n-\r\n-Ce mot fut répété d'un tel accent que l'avocat se retourna.\r\n-\r\n---Pardon, monsieur, vous êtes peut-être un parent?\r\n-\r\n---Non. Je ne connais personne ici. Et y a-t-il eu condamnation?\r\n-\r\n---Sans doute. Cela n'était guère possible autrement.\r\n-\r\n---Aux travaux forcés?...\r\n-\r\n---À perpétuité.\r\n-\r\n-Il reprit d'une voix tellement faible qu'on l'entendait à peine:\r\n-\r\n---L'identité a donc été constatée?\r\n-\r\n---Quelle identité? répondit l'avocat. Il n'y avait pas d'identité à \r\n-constater. L'affaire était simple. Cette femme avait tué son enfant,\r\n-l'infanticide a été prouvé, le jury a écarté la préméditation, on l'a\r\n-condamnée à vie.\r\n-\r\n---C'est donc une femme? dit-il.\r\n-\r\n---Mais sûrement. La fille Limosin. De quoi me parlez-vous donc?\r\n-\r\n---De rien. Mais puisque c'est fini, comment se fait-il que la salle soit\r\n-encore éclairée?\r\n-\r\n---C'est pour l'autre affaire qu'on a commencée il y a à peu près deux\r\n-heures.\r\n-\r\n---Quelle autre affaire?\r\n-\r\n---Oh! celle-là est claire aussi. C'est une espèce de gueux, un\r\n-récidiviste, un galérien, qui a volé. Je ne sais plus trop son nom. En\r\n-voilà un qui vous a une mine de bandit. Rien que pour avoir cette\r\n-figure-là , je l'enverrais aux galères.\r\n-\r\n---Monsieur, demanda-t-il, y a-t-il moyen de pénétrer dans la salle?\r\n-\r\n---Je ne crois vraiment pas. Il y a beaucoup de foule. Cependant\r\n-l'audience est suspendue. Il y a des gens qui sont sortis, et, à la\r\n-reprise de l'audience, vous pourrez essayer.\r\n-\r\n---Par où entre-t-on?\r\n-\r\n---Par cette grande porte.\r\n-\r\n-L'avocat le quitta. En quelques instants, il avait éprouvé, presque en\r\n-même temps, presque mêlées, toutes les émotions possibles. Les paroles\r\n-de cet indifférent lui avaient tour à tour traversé le coeur comme des\r\n-aiguilles de glace et comme des lames de feu. Quand il vit que rien\r\n-n'était terminé, il respira; mais il n'eût pu dire si ce qu'il\r\n-ressentait était du contentement ou de la douleur.\r\n-\r\n-Il s'approcha de plusieurs groupes et il écouta ce qu'on disait. Le rôle\r\n-de la session étant très chargé, le président avait indiqué pour ce même\r\n-jour deux affaires simples et courtes. On avait commencé par\r\n-l'infanticide, et maintenant on en était au forçat, au récidiviste, au\r\n-\u0022cheval de retour\u0022. Cet homme avait volé des pommes, mais cela ne\r\n-paraissait pas bien prouvé; ce qui était prouvé, c'est qu'il avait été\r\n-déjà aux galères à Toulon. C'est ce qui faisait son affaire mauvaise. Du\r\n-reste, l'interrogatoire de l'homme était terminé et les dépositions des\r\n-témoins; mais il y avait encore les plaidoiries de l'avocat et le\r\n-réquisitoire du ministère public; cela ne devait guère finir avant\r\n-minuit. L'homme serait probablement condamné; l'avocat général était\r\n-très bon--et ne manquait pas ses accusés--c'était un garçon d'esprit qui\r\n-faisait des vers.\r\n-\r\n-Un huissier se tenait debout près de la porte qui communiquait avec la\r\n-salle des assises. Il demanda à cet huissier:\r\n-\r\n---Monsieur, la porte va-t-elle bientôt s'ouvrir?\r\n-\r\n---Elle ne s'ouvrira pas, dit l'huissier.\r\n-\r\n---Comment! on ne l'ouvrira pas à la reprise de l'audience? est-ce que\r\n-l'audience n'est pas suspendue?\r\n-\r\n---L'audience vient d'être reprise, répondit l'huissier, mais la porte ne\r\n-se rouvrira pas.\r\n-\r\n---Pourquoi?\r\n-\r\n---Parce que la salle est pleine.\r\n-\r\n---Quoi? il n'y a plus une place?\r\n-\r\n---Plus une seule. La porte est fermée. Personne ne peut plus entrer.\r\n-\r\n-L'huissier ajouta après un silence:\r\n-\r\n---Il y a bien encore deux ou trois places derrière monsieur le\r\n-président, mais monsieur le président n'y admet que les fonctionnaires\r\n-publics.\r\n-\r\n-Cela dit, l'huissier lui tourna le dos.\r\n-\r\n-Il se retira la tête baissée, traversa l'antichambre et redescendit\r\n-l'escalier lentement, comme hésitant à chaque marche. Il est probable\r\n-qu'il tenait conseil avec lui-même. Le violent combat qui se livrait en\r\n-lui depuis la veille n'était pas fini; et, à chaque instant, il en\r\n-traversait quelque nouvelle péripétie. Arrivé sur le palier de\r\n-l'escalier, il s'adossa à la rampe et croisa les bras. Tout à coup il\r\n-ouvrit sa redingote, prit son portefeuille, en tira un crayon, déchira\r\n-une feuille, et écrivit rapidement sur cette feuille à la lueur du\r\n-réverbère cette ligne:--_M. Madeleine, maire de Montreuil-sur-mer_.\r\n-Puis il remonta l'escalier à grands pas, fendit la foule, marcha droit à \r\n-l'huissier, lui remit le papier, et lui dit avec autorité:\r\n-\r\n---Portez ceci à monsieur le président.\r\n-\r\n-L'huissier prit le papier, y jeta un coup d'oeil et obéit.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre VIII\r\n-\r\n-Entrée de faveur\r\n-\r\n-\r\n-Sans qu'il s'en doutât, le maire de Montreuil-sur-mer avait une sorte de\r\n-célébrité. Depuis sept ans que sa réputation de vertu remplissait tout\r\n-le bas Boulonnais, elle avait fini par franchir les limites d'un petit\r\n-pays et s'était répandue dans les deux ou trois départements voisins.\r\n-Outre le service considérable qu'il avait rendu au chef-lieu en y\r\n-restaurant l'industrie des verroteries noires, il n'était pas une des\r\n-cent quarante et une communes de l'arrondissement de Montreuil-sur-mer\r\n-qui ne lui dût quelque bienfait. Il avait su même au besoin aider et\r\n-féconder les industries des autres arrondissements. C'est ainsi qu'il\r\n-avait dans l'occasion soutenu de son crédit et de ses fonds la fabrique\r\n-de tulle de Boulogne, la filature de lin à la mécanique de Frévent et la\r\n-manufacture hydraulique de toiles de Boubers-sur-Canche. Partout on\r\n-prononçait avec vénération le nom de M. Madeleine. Arras et Douai\r\n-enviaient son maire à l'heureuse petite ville de Montreuil-sur-mer.\r\n-\r\n-Le conseiller à la cour royale de Douai, qui présidait cette session des\r\n-assises à Arras, connaissait comme tout le monde ce nom si profondément\r\n-et si universellement honoré. Quand l'huissier, ouvrant discrètement la\r\n-porte qui communiquait de la chambre du conseil à l'audience, se pencha\r\n-derrière le fauteuil du président et lui remit le papier où était écrite\r\n-la ligne qu'on vient de lire, en ajoutant: _Ce monsieur désire assister\r\n-à l'audience_, le président fit un vif mouvement de déférence, saisit\r\n-une plume, écrivit quelques mots au bas du papier, et le rendit à \r\n-l'huissier en lui disant: Faites entrer.\r\n-\r\n-L'homme malheureux dont nous racontons l'histoire était resté près de la\r\n-porte de la salle à la même place et dans la même attitude où l'huissier\r\n-l'avait quitté. Il entendit, à travers sa rêverie, quelqu'un qui lui\r\n-disait: Monsieur veut-il bien me faire l'honneur de me suivre? C'était\r\n-ce même huissier qui lui avait tourné le dos l'instant d'auparavant et\r\n-qui maintenant le saluait jusqu'à terre. L'huissier en même temps lui\r\n-remit le papier. Il le déplia, et, comme il se rencontrait qu'il était\r\n-près de la lampe, il put lire:\r\n-\r\n-«Le président de la cour d'assises présente son respect à M. Madeleine.»\r\n-\r\n-Il froissa le papier entre ses mains, comme si ces quelques mots eussent\r\n-eu pour lui un arrière-goût étrange et amer.\r\n-\r\n-Il suivit l'huissier.\r\n-\r\n-Quelques minutes après, il se trouvait seul dans une espèce de cabinet\r\n-lambrissé, d'un aspect sévère, éclairé par deux bougies posées sur une\r\n-table à tapis vert. Il avait encore dans l'oreille les dernières paroles\r\n-de l'huissier qui venait de le quitter--«Monsieur, vous voici dans la\r\n-chambre du conseil; vous n'avez qu'à tourner le bouton de cuivre de\r\n-cette porte, et vous vous trouverez dans l'audience derrière le fauteuil\r\n-de monsieur le président.»--Ces paroles se mêlaient dans sa pensée à un\r\n-souvenir vague de corridors étroits et d'escaliers noirs qu'il venait de\r\n-parcourir.\r\n-\r\n-L'huissier l'avait laissé seul. Le moment suprême était arrivé. Il\r\n-cherchait à se recueillir sans pouvoir y parvenir. C'est surtout aux\r\n-heures où l'on aurait le plus besoin de les rattacher aux réalités\r\n-poignantes de la vie que tous les fils de la pensée se rompent dans le\r\n-cerveau. Il était dans l'endroit même où les juges délibèrent et\r\n-condamnent. Il regardait avec une tranquillité stupide cette chambre\r\n-paisible et redoutable où tant d'existences avaient été brisées, où son\r\n-nom allait retentir tout à l'heure, et que sa destinée traversait en ce\r\n-moment. Il regardait la muraille, puis il se regardait lui-même,\r\n-s'étonnant que ce fût cette chambre et que ce fût lui.\r\n-\r\n-Il n'avait pas mangé depuis plus de vingt-quatre heures, il était brisé\r\n-par les cahots de la carriole, mais il ne le sentait pas; il lui\r\n-semblait qu'il ne sentait rien.\r\n-\r\n-Il s'approcha d'un cadre noir qui était accroché au mur et qui contenait\r\n-sous verre une vieille lettre autographe de Jean-Nicolas Pache, maire de\r\n-Paris et ministre, datée, sans doute par erreur, du _9 juin an II_, et\r\n-dans laquelle Pache envoyait à la commune la liste des ministres et des\r\n-députés tenus en arrestation chez eux. Un témoin qui l'eût pu voir et\r\n-qui l'eût observé en cet instant eût sans doute imaginé Fantine et\r\n-Cosette.\r\n-\r\n-Tout en rêvant, il se retourna, et ses yeux rencontrèrent le bouton de\r\n-cuivre de la porte qui le séparait de la salle des assises. Il avait\r\n-presque oublié cette porte. Son regard, d'abord calme, s'y arrêta, resta\r\n-attaché à ce bouton de cuivre, puis devint effaré et fixe, et\r\n-s'empreignit peu à peu d'épouvante. Des gouttes de sueur lui sortaient\r\n-d'entre les cheveux et ruisselaient sur ses tempes.\r\n-\r\n-À un certain moment, il fit avec une sorte d'autorité mêlée de rébellion\r\n-ce geste indescriptible qui veut dire et qui dit si bien: _Pardieu! qui\r\n-est-ce qui m'y force?_ Puis il se tourna vivement, vit devant lui la\r\n-porte par laquelle il était entré, y alla, l'ouvrit, et sortit. Il\r\n-n'était plus dans cette chambre, il était dehors, dans un corridor, un\r\n-corridor long, étroit, coupé de degrés et de guichets, faisant toutes\r\n-sortes d'angles, éclairé çà et là de réverbères pareils à des veilleuses\r\n-de malades, le corridor par où il était venu. Il respira, il écouta;\r\n-aucun bruit derrière lui, aucun bruit devant lui; il se mit à fuir comme\r\n-si on le poursuivait.\r\n-\r\n-Quand il eut doublé plusieurs des coudes de ce couloir, il écouta\r\n-encore. C'était toujours le même silence et la même ombre autour de lui.\r\n-Il était essoufflé, il chancelait, il s'appuya au mur. La pierre était\r\n-froide, sa sueur était glacée sur son front, il se redressa en\r\n-frissonnant.\r\n-\r\n-Alors, là , seul, debout dans cette obscurité, tremblant de froid et\r\n-d'autre chose peut-être, il songea.\r\n-\r\n-Il avait songé toute la nuit, il avait songé toute la journée; il\r\n-n'entendait plus en lui qu'une voix qui disait: hélas!\r\n-\r\n-Un quart d'heure s'écoula ainsi. Enfin, il pencha la tête, soupira avec\r\n-angoisse, laissa pendre ses bras, et revint sur ses pas. Il marchait\r\n-lentement et comme accablé. Il semblait que quelqu'un l'eût atteint dans\r\n-sa fuite et le ramenât.\r\n-\r\n-Il rentra dans la chambre du conseil. La première chose qu'il aperçut,\r\n-ce fut la gâchette de la porte. Cette gâchette, ronde et en cuivre poli,\r\n-resplendissait pour lui comme une effroyable étoile. Il la regardait\r\n-comme une brebis regarderait l'oeil d'un tigre.\r\n-\r\n-Ses yeux ne pouvaient s'en détacher.\r\n-\r\n-De temps en temps il faisait un pas et se rapprochait de la porte.\r\n-\r\n-S'il eût écouté, il eût entendu, comme une sorte de murmure confus, le\r\n-bruit de la salle voisine; mais il n'écoutait pas, et il n'entendait\r\n-pas.\r\n-\r\n-Tout à coup, sans qu'il sût lui-même comment, il se trouva près de la\r\n-porte. Il saisit convulsivement le bouton; la porte s'ouvrit.\r\n-\r\n-Il était dans la salle d'audience.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IX\r\n-\r\n-Un lieu où des convictions sont en train de se former\r\n-\r\n-\r\n-Il fit un pas, referma machinalement la porte derrière lui, et resta\r\n-debout, considérant ce qu'il voyait.\r\n-\r\n-C'était une assez vaste enceinte à peine éclairée, tantôt pleine de\r\n-rumeur, tantôt pleine de silence, où tout l'appareil d'un procès\r\n-criminel se développait avec sa gravité mesquine et lugubre au milieu de\r\n-la foule.\r\n-\r\n-À un bout de la salle, celui où il se trouvait, des juges à l'air\r\n-distrait, en robe usée, se rongeant les ongles ou fermant les paupières;\r\n-à l'autre bout, une foule en haillons; des avocats dans toutes sortes\r\n-d'attitudes; des soldats au visage honnête et dur; de vieilles boiseries\r\n-tachées, un plafond sale, des tables couvertes d'une serge plutôt jaune\r\n-que verte, des portes noircies par les mains; à des clous plantés dans\r\n-le lambris, des quinquets d'estaminet donnant plus de fumée que de\r\n-clarté; sur les tables, des chandelles dans des chandeliers de cuivre;\r\n-l'obscurité, la laideur, la tristesse; et de tout cela se dégageait une\r\n-impression austère et auguste, car on y sentait cette grande chose\r\n-humaine qu'on appelle la loi et cette grande chose divine qu'on appelle\r\n-la justice.\r\n-\r\n-Personne dans cette foule ne fit attention à lui. Tous les regards\r\n-convergeaient vers un point unique, un banc de bois adossé à une petite\r\n-porte, le long de la muraille, à gauche du président. Sur ce banc, que\r\n-plusieurs chandelles éclairaient, il y avait un homme entre deux\r\n-gendarmes.\r\n-\r\n-Cet homme, c'était l'homme.\r\n-\r\n-Il ne le chercha pas, il le vit. Ses yeux allèrent là naturellement,\r\n-comme s'ils avaient su d'avance où était cette figure.\r\n-\r\n-Il crut se voir lui-même, vieilli, non pas sans doute absolument\r\n-semblable de visage, mais tout pareil d'attitude et d'aspect, avec ces\r\n-cheveux hérissés, avec cette prunelle fauve et inquiète, avec cette\r\n-blouse, tel qu'il était le jour où il entrait à Digne, plein de haine et\r\n-cachant dans son âme ce hideux trésor de pensées affreuses qu'il avait\r\n-mis dix-neuf ans à ramasser sur le pavé du bagne.\r\n-\r\n-Il se dit avec un frémissement:\r\n-\r\n---Mon Dieu! est-ce que je redeviendrai ainsi?\r\n-\r\n-Cet être paraissait au moins soixante ans. Il avait je ne sais quoi de\r\n-rude, de stupide et d'effarouché.\r\n-\r\n-Au bruit de la porte, on s'était rangé pour lui faire place, le\r\n-président avait tourné la tête, et comprenant que le personnage qui\r\n-venait d'entrer était M. le maire de Montreuil-sur-mer, il l'avait\r\n-salué. L'avocat général, qui avait vu M. Madeleine à Montreuil-sur-mer\r\n-où des opérations de son ministère l'avaient plus d'une fois appelé, le\r\n-reconnut, et salua également. Lui s'en aperçut à peine. Il était en\r\n-proie à une sorte d'hallucination; il regardait.\r\n-\r\n-Des juges, un greffier, des gendarmes, une foule de têtes cruellement\r\n-curieuses, il avait déjà vu cela une fois, autrefois, il y avait\r\n-vingt-sept ans. Ces choses funestes, il les retrouvait; elles étaient\r\n-là , elles remuaient, elles existaient. Ce n'était plus un effort de sa\r\n-mémoire, un mirage de sa pensée, c'étaient de vrais gendarmes et de\r\n-vrais juges, une vraie foule et de vrais hommes en chair et en os. C'en\r\n-était fait, il voyait reparaître et revivre autour de lui, avec tout ce\r\n-que la réalité a de formidable, les aspects monstrueux de son passé.\r\n-\r\n-Tout cela était béant devant lui.\r\n-\r\n-Il en eut horreur, il ferma les yeux, et s'écria au plus profond de son\r\n-âme: jamais!\r\n-\r\n-Et par un jeu tragique de la destinée qui faisait trembler toutes ses\r\n-idées et le rendait presque fou, c'était un autre lui-même qui était là !\r\n-Cet homme qu'on jugeait, tous l'appelaient Jean Valjean!\r\n-\r\n-Il avait sous les yeux, vision inouïe, une sorte de représentation du\r\n-moment le plus horrible de sa vie, jouée par son fantôme.\r\n-\r\n-Tout y était, c'était le même appareil, la même heure de nuit, presque\r\n-les mêmes faces de juges, de soldats et de spectateurs. Seulement,\r\n-au-dessus de la tête du président, il y avait un crucifix, chose qui\r\n-manquait aux tribunaux du temps de sa condamnation. Quand on l'avait\r\n-jugé, Dieu était absent.\r\n-\r\n-Une chaise était derrière lui; il s'y laissa tomber, terrifié de l'idée\r\n-qu'on pouvait le voir. Quand il fut assis, il profita d'une pile de\r\n-cartons qui était sur le bureau des juges pour dérober son visage à \r\n-toute la salle. Il pouvait maintenant voir sans être vu. Peu à peu il se\r\n-remit. Il rentra pleinement dans le sentiment du réel; il arriva à cette\r\n-phase de calme où l'on peut écouter.\r\n-\r\n-M. Bamatabois était au nombre des jurés. Il chercha Javert, mais il ne\r\n-le vit pas. Le banc des témoins lui était caché par la table du\r\n-greffier. Et puis, nous venons de le dire, la salle était à peine\r\n-éclairée.\r\n-\r\n-Au moment où il était entré, l'avocat de l'accusé achevait sa\r\n-plaidoirie. L'attention de tous était excitée au plus haut point;\r\n-l'affaire durait depuis trois heures. Depuis trois heures, cette foule\r\n-regardait plier peu à peu sous le poids d'une vraisemblance terrible un\r\n-homme, un inconnu, une espèce d'être misérable, profondément stupide ou\r\n-profondément habile. Cet homme, on le sait déjà , était un vagabond qui\r\n-avait été trouvé dans un champ, emportant une branche chargée de pommes\r\n-mûres, cassée à un pommier dans un clos voisin, appelé le clos Pierron.\r\n-Qui était cet homme? Une enquête avait eu lieu; des témoins venaient\r\n-d'être entendus, ils avaient été unanimes, des lumières avaient jailli\r\n-de tout le débat. L'accusation disait:\r\n-\r\n---Nous ne tenons pas seulement un voleur de fruits, un maraudeur; nous\r\n-tenons là , dans notre main, un bandit, un relaps en rupture de ban, un\r\n-ancien forçat, un scélérat des plus dangereux, un malfaiteur appelé Jean\r\n-Valjean que la justice recherche depuis longtemps, et qui, il y a huit\r\n-ans, en sortant du bagne de Toulon, a commis un vol de grand chemin à \r\n-main armée sur la personne d'un enfant savoyard appelé Petit-Gervais,\r\n-crime prévu par l'article 383 du code pénal, pour lequel nous nous\r\n-réservons de le poursuivre ultérieurement, quand l'identité sera\r\n-judiciairement acquise. Il vient de commettre un nouveau vol. C'est un\r\n-cas de récidive. Condamnez-le pour le fait nouveau; il sera jugé plus\r\n-tard pour le fait ancien.\r\n-\r\n-Devant cette accusation, devant l'unanimité des témoins, l'accusé\r\n-paraissait surtout étonné. Il faisait des gestes et des signes qui\r\n-voulaient dire non, ou bien il considérait le plafond. Il parlait avec\r\n-peine, répondait avec embarras, mais de la tête aux pieds toute sa\r\n-personne niait. Il était comme un idiot en présence de toutes ces\r\n-intelligences rangées en bataille autour de lui, et comme un étranger au\r\n-milieu de cette société qui le saisissait. Cependant il y allait pour\r\n-lui de l'avenir le plus menaçant, la vraisemblance croissait à chaque\r\n-minute, et toute cette foule regardait avec plus d'anxiété que lui-même\r\n-cette sentence pleine de calamités qui penchait sur lui de plus en plus.\r\n-Une éventualité laissait même entrevoir, outre le bagne, la peine de\r\n-mort possible, si l'identité était reconnue et si l'affaire\r\n-Petit-Gervais se terminait plus tard par une condamnation. Qu'était-ce\r\n-que cet homme? De quelle nature était son apathie? Etait-ce imbécillité\r\n-ou ruse? Comprenait-il trop, ou ne comprenait-il pas du tout? Questions\r\n-qui divisaient la foule et semblaient partager le jury. Il y avait dans\r\n-ce procès ce qui effraye et ce qui intrigue; le drame n'était pas\r\n-seulement sombre, il était obscur. Le défenseur avait assez bien plaidé,\r\n-dans cette langue de province qui a longtemps constitué l'éloquence du\r\n-barreau et dont usaient jadis tous les avocats, aussi bien à Paris qu'à \r\n-Romorantin ou à Montbrison, et qui aujourd'hui, étant devenue classique,\r\n-n'est plus guère parlée que par les orateurs officiels du parquet,\r\n-auxquels elle convient par sa sonorité grave et son allure majestueuse;\r\n-langue où un mari s'appelle un époux, une femme, une épouse, Paris, le\r\n-centre des arts et de la civilisation, le roi, le monarque, monseigneur\r\n-l'évêque, un saint pontife, l'avocat général, l'éloquent interprète de\r\n-la vindicte, la plaidoirie, les accents qu'on vient d'entendre, le\r\n-siècle de Louis XIV, le grand siècle, un théâtre, le temple de\r\n-Melpomène, la famille régnante, l'auguste sang de nos rois, un concert,\r\n-une solennité musicale, monsieur le général commandant le département,\r\n-l'illustre guerrier qui, etc., les élèves du séminaire, ces tendres\r\n-lévites, les erreurs imputées aux journaux, l'imposture qui distille son\r\n-venin dans les colonnes de ces organes, etc., etc.--L'avocat donc avait\r\n-commencé par s'expliquer sur le vol des pommes,--chose malaisée en beau\r\n-style; mais Bénigne Bossuet lui-même a été obligé de faire allusion à \r\n-une poule en pleine oraison funèbre, et il s'en est tiré avec pompe.\r\n-L'avocat avait établi que le vol de pommes n'était pas matériellement\r\n-prouvé.--Son client, qu'en sa qualité de défenseur, il persistait à \r\n-appeler Champmathieu, n'avait été vu de personne escaladant le mur ou\r\n-cassant la branche. On l'avait arrêté nanti de cette branche (que\r\n-l'avocat appelait plus volontiers rameau); mais il disait l'avoir\r\n-trouvée à terre et ramassée. Où était la preuve du contraire?--Sans\r\n-doute cette branche avait été cassée et dérobée après escalade, puis\r\n-jetée là par le maraudeur alarmé; sans doute il y avait un voleur. Mais\r\n-qu'est-ce qui prouvait que ce voleur était Champmathieu? Une seule\r\n-chose. Sa qualité d'ancien forçat. L'avocat ne niait pas que cette\r\n-qualité ne parût malheureusement bien constatée; l'accusé avait résidé à \r\n-Faverolles; l'accusé y avait été émondeur; le nom de Champmathieu\r\n-pouvait bien avoir pour origine Jean Mathieu; tout cela était vrai;\r\n-enfin quatre témoins reconnaissaient sans hésiter et positivement\r\n-Champmathieu pour être le galérien Jean Valjean; à ces indications, à \r\n-ces témoignages, l'avocat ne pouvait opposer que la dénégation de son\r\n-client, dénégation intéressée; mais en supposant qu'il fût le forçat\r\n-Jean Valjean, cela prouvait-il qu'il fût le voleur des pommes? C'était\r\n-une présomption, tout au plus; non une preuve. L'accusé, cela était\r\n-vrai, et le défenseur «dans sa bonne foi» devait en convenir, avait\r\n-adopté «un mauvais système de défense»--Il s'obstinait à nier tout, le\r\n-vol et sa qualité de forçat. Un aveu sur ce dernier point eût mieux\r\n-valu, à coup sûr, et lui eût concilié l'indulgence de ses juges;\r\n-l'avocat le lui avait conseillé; mais l'accusé s'y était refusé\r\n-obstinément, croyant sans doute sauver tout en n'avouant rien. C'était\r\n-un tort; mais ne fallait-il pas considérer la brièveté de cette\r\n-intelligence? Cet homme était visiblement stupide. Un long malheur au\r\n-bagne, une longue misère hors du bagne, l'avaient abruti, etc., etc. Il\r\n-se défendait mal, était-ce une raison pour le condamner? Quant à \r\n-l'affaire Petit-Gervais, l'avocat n'avait pas à la discuter, elle\r\n-n'était point dans la cause. L'avocat concluait en suppliant le jury et\r\n-la cour, si l'identité de Jean Valjean leur paraissait évidente, de lui\r\n-appliquer les peines de police qui s'adressent au condamné en rupture de\r\n-ban, et non le châtiment épouvantable qui frappe le forçat récidiviste.\r\n-\r\n-L'avocat général répliqua au défenseur. Il fut violent et fleuri, comme\r\n-sont habituellement les avocats généraux.\r\n-\r\n-Il félicita le défenseur de sa «loyauté», et profita habilement de cette\r\n-loyauté. Il atteignit l'accusé par toutes les concessions que l'avocat\r\n-avait faites. L'avocat semblait accorder que l'accusé était Jean\r\n-Valjean. Il en prit acte. Cet homme était donc Jean Valjean. Ceci était\r\n-acquis à l'accusation et ne pouvait plus se contester. Ici, par une\r\n-habile antonomase, remontant aux sources et aux causes de la\r\n-criminalité, l'avocat général tonna contre l'immoralité de l'école\r\n-romantique, alors à son aurore sous le nom d'école satanique que lui\r\n-avaient décerné les critiques de l'Oriflamme et de la Quotidienne, il\r\n-attribua, non sans vraisemblance, à l'influence de cette littérature\r\n-perverse le délit de Champmathieu, ou pour mieux dire, de Jean Valjean.\r\n-Ces considérations épuisées, il passa à Jean Valjean lui-même.\r\n-Qu'était-ce que Jean Valjean? Description de Jean Valjean. Un monstre\r\n-vomi, etc. Le modèle de ces sortes de descriptions est dans le récit de\r\n-Théramène, lequel n'est pas utile à la tragédie, mais rend tous les\r\n-jours de grands services à l'éloquence judiciaire. L'auditoire et les\r\n-jurés «frémirent». La description achevée, l'avocat général reprit, dans\r\n-un mouvement oratoire fait pour exciter au plus haut point le lendemain\r\n-matin l'enthousiasme du Journal de la Préfecture:\r\n-\r\n-Et c'est un pareil homme, etc., etc., etc., vagabond, mendiant, sans\r\n-moyens d'existence, etc., etc.,--accoutumé par sa vie passée aux actions\r\n-coupables et peu corrigé par son séjour au bagne, comme le prouve le\r\n-crime commis sur Petit-Gervais, etc., etc.,--c'est un homme pareil qui,\r\n-trouvé sur la voie publique en flagrant délit de vol, à quelques pas\r\n-d'un mur escaladé, tenant encore à la main l'objet volé, nie le flagrant\r\n-délit, le vol, l'escalade, nie tout, nie jusqu'à son nom, nie jusqu'à \r\n-son identité! Outre cent autres preuves sur lesquelles nous ne revenons\r\n-pas, quatre témoins le reconnaissent, Javert, l'intègre inspecteur de\r\n-police Javert, et trois de ses anciens compagnons d'ignominie, les\r\n-forçats Brevet, Chenildieu et Cochepaille. Qu'oppose-t-il à cette\r\n-unanimité foudroyante? Il nie. Quel endurcissement! Vous ferez justice,\r\n-messieurs les jurés, etc., etc.\r\n-\r\n-Pendant que l'avocat général parlait, l'accusé écoutait, la bouche\r\n-ouverte, avec une sorte d'étonnement où il entrait bien quelque\r\n-admiration. Il était évidemment surpris qu'un homme pût parler comme\r\n-cela. De temps en temps, aux moments les plus «énergiques» du\r\n-réquisitoire, dans ces instants où l'éloquence, qui ne peut se contenir,\r\n-déborde dans un flux d'épithètes flétrissantes et enveloppe l'accusé\r\n-comme un orage, il remuait lentement la tête de droite à gauche et de\r\n-gauche à droite, sorte de protestation triste et muette dont il se\r\n-contentait depuis le commencement des débats. Deux ou trois fois les\r\n-spectateurs placés le plus près de lui l'entendirent dire à demi-voix:\r\n-\r\n---Voilà ce que c'est, de n'avoir pas demandé à M. Baloup!\r\n-\r\n-L'avocat général fit remarquer au jury cette attitude hébétée, calculée\r\n-évidemment, qui dénotait, non l'imbécillité, mais l'adresse, la ruse,\r\n-l'habitude de tromper la justice, et qui mettait dans tout son jour «la\r\n-profonde perversité» de cet homme. Il termina en faisant ses réserves\r\n-pour l'affaire Petit-Gervais, et en réclamant une condamnation sévère.\r\n-\r\n-C'était, pour l'instant, on s'en souvient, les travaux forcés à \r\n-perpétuité.\r\n-\r\n-Le défenseur se leva, commença par complimenter «monsieur l'avocat\r\n-général» sur son «admirable parole», puis répliqua comme il put, mais il\r\n-faiblissait; le terrain évidemment se dérobait sous lui.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre X\r\n-\r\n-Le système de dénégations\r\n-\r\n-\r\n-L'instant de clore les débats était venu. Le président fit lever\r\n-l'accusé et lui adressa la question d'usage:\r\n-\r\n---Avez-vous quelque chose à ajouter à votre défense?\r\n-\r\n-L'homme, debout, roulant dans ses mains un affreux bonnet qu'il avait,\r\n-sembla ne pas entendre.\r\n-\r\n-Le président répéta la question.\r\n-\r\n-Cette fois l'homme entendit. Il parut comprendre, il fit le mouvement de\r\n-quelqu'un qui se réveille, promena ses yeux autour de lui, regarda le\r\n-public, les gendarmes, son avocat, les jurés, la cour, posa son poing\r\n-monstrueux sur le rebord de la boiserie placée devant son banc, regarda\r\n-encore, et tout à coup, fixant sont regard sur l'avocat général, il se\r\n-mit à parler. Ce fut comme une éruption. Il sembla, à la façon dont les\r\n-paroles s'échappaient de sa bouche, incohérentes, impétueuses, heurtées,\r\n-pêle-mêle, qu'elles s'y pressaient toutes à la fois pour sortir en même\r\n-temps. Il dit:\r\n-\r\n---J'ai à dire ça. Que j'ai été charron à Paris, même que c'était chez\r\n-monsieur Baloup. C'est un état dur. Dans la chose de charron, on\r\n-travaille toujours en plein air, dans des cours, sous des hangars chez\r\n-les bons maîtres, jamais dans des ateliers fermés, parce qu'il faut des\r\n-espaces, voyez-vous. L'hiver, on a si froid qu'on se bat les bras pour\r\n-se réchauffer; mais les maîtres ne veulent pas, ils disent que cela perd\r\n-du temps. Manier du fer quand il y a de la glace entre les pavés, c'est\r\n-rude. Ça vous use vite un homme. On est vieux tout jeune dans cet\r\n-état-là . À quarante ans, un homme est fini. Moi, j'en avais\r\n-cinquante-trois, j'avais bien du mal. Et puis c'est si méchant les\r\n-ouvriers! Quand un bonhomme n'est plus jeune, on vous l'appelle pour\r\n-tout vieux serin, vieille bête! Je ne gagnais plus que trente sous par\r\n-jour, on me payait le moins cher qu'on pouvait, les maîtres profitaient\r\n-de mon âge. Avec ça, j'avais ma fille qui était blanchisseuse à la\r\n-rivière. Elle gagnait un peu de son côté. À nous deux, cela allait. Elle\r\n-avait de la peine aussi. Toute la journée dans un baquet jusqu'à \r\n-mi-corps, à la pluie, à la neige, avec le vent qui vous coupe la figure;\r\n-quand il gèle, c'est tout de même, il faut laver; il y a des personnes\r\n-qui n'ont pas beaucoup de linge et qui attendent après; si on ne lavait\r\n-pas, on perdrait des pratiques. Les planches sont mal jointes et il vous\r\n-tombe des gouttes d'eau partout. On a ses jupes toutes mouillées, dessus\r\n-et dessous. Ça pénètre. Elle a aussi travaillé au lavoir des\r\n-Enfants-Rouges, où l'eau arrive par des robinets. On n'est pas dans le\r\n-baquet. On lave devant soi au robinet et on rince derrière soi dans le\r\n-bassin. Comme c'est fermé, on a moins froid au corps. Mais il y a une\r\n-buée d'eau chaude qui est terrible et qui vous perd les yeux. Elle\r\n-revenait à sept heures du soir, et se couchait bien vite; elle était si\r\n-fatiguée. Son mari la battait. Elle est morte. Nous n'avons pas été bien\r\n-heureux. C'était une brave fille qui n'allait pas au bal, qui était bien\r\n-tranquille. Je me rappelle un mardi gras où elle était couchée à huit\r\n-heures. Voilà . Je dis vrai. Vous n'avez qu'à demander. Ah, bien oui,\r\n-demander! que je suis bête! Paris, c'est un gouffre. Qui est-ce qui\r\n-connaît le père Champmathieu? Pourtant je vous dis monsieur Baloup.\r\n-Voyez chez monsieur Baloup. Après ça, je ne sais pas ce qu'on me veut.\r\n-\r\n-L'homme se tut, et resta debout. Il avait dit ces choses d'une voix\r\n-haute, rapide, rauque, dure et enrouée, avec une sorte de naïveté\r\n-irritée et sauvage. Une fois il s'était interrompu pour saluer quelqu'un\r\n-dans la foule. Les espèces d'affirmations qu'il semblait jeter au hasard\r\n-devant lui, lui venaient comme des hoquets, et il ajoutait à chacune\r\n-d'elles le geste d'un bûcheron qui fend du bois. Quand il eut fini,\r\n-l'auditoire éclata de rire. Il regarda le public, et voyant qu'on riait,\r\n-et ne comprenant pas, il se mit à rire lui-même.\r\n-\r\n-Cela était sinistre.\r\n-\r\n-Le président, homme attentif et bienveillant, éleva la voix.\r\n-\r\n-Il rappela à «messieurs les jurés» que «le sieur Baloup, l'ancien maître\r\n-charron chez lequel l'accusé disait avoir servi, avait été inutilement\r\n-cité. Il était en faillite, et n'avait pu être retrouvé.» Puis se\r\n-tournant vers l'accusé, il l'engagea à écouter ce qu'il allait lui dire\r\n-et ajouta:\r\n-\r\n---Vous êtes dans une situation où il faut réfléchir. Les présomptions\r\n-les plus graves pèsent sur vous et peuvent entraîner des conséquences\r\n-capitales. Accusé, dans votre intérêt, je vous interpelle une dernière\r\n-fois, expliquez-vous clairement sur ces deux faits:--Premièrement,\r\n-avez-vous, oui ou non, franchi le mur du clos Pierron, cassé la branche\r\n-et volé les pommes, c'est-à -dire commis le crime de vol avec escalade?\r\n-Deuxièmement, oui ou non, êtes-vous le forçat libéré Jean Valjean?\r\n-\r\n-L'accusé secoua la tête d'un air capable, comme un homme qui a bien\r\n-compris et qui sait ce qu'il va répondre. Il ouvrit la bouche, se tourna\r\n-vers le président et dit:\r\n-\r\n---D'abord....\r\n-\r\n-Puis il regarda son bonnet, il regarda le plafond, et se tut.\r\n-\r\n---Accusé, reprit l'avocat général d'une voix sévère, faites attention.\r\n-Vous ne répondez à rien de ce qu'on vous demande. Votre trouble vous\r\n-condamne. Il est évident que vous ne vous appelez pas Champmathieu, que\r\n-vous êtes le forçat Jean Valjean caché d'abord sous le nom de Jean\r\n-Mathieu qui était le nom de sa mère, que vous êtes allé en Auvergne, que\r\n-vous êtes né à Faverolles où vous avez été émondeur. Il est évident que\r\n-vous avez volé avec escalade des pommes mûres dans le clos Pierron.\r\n-Messieurs les jurés apprécieront.\r\n-\r\n-L'accusé avait fini par se rasseoir; il se leva brusquement quand\r\n-l'avocat général eut fini, et s'écria:\r\n-\r\n---Vous êtes très méchant, vous! Voilà ce que je voulais dire. Je ne\r\n-trouvais pas d'abord. Je n'ai rien volé. Je suis un homme qui ne mange\r\n-pas tous les jours. Je venais d'Ailly, je marchais dans le pays après\r\n-une ondée qui avait fait la campagne toute jaune, même que les mares\r\n-débordaient et qu'il ne sortait plus des sables que de petits brins\r\n-d'herbe au bord de la route, j'ai trouvé une branche cassée par terre où\r\n-il y avait des pommes, j'ai ramassé la branche sans savoir qu'elle me\r\n-ferait arriver de la peine. Il y a trois mois que je suis en prison et\r\n-qu'on me trimballe. Après ça, je ne peux pas dire, on parle contre moi,\r\n-on me dit: répondez! le gendarme, qui est bon enfant, me pousse le coude\r\n-et me dit tout bas: réponds donc. Je ne sais pas expliquer, moi, je n'ai\r\n-pas fait les études, je suis un pauvre homme. Voilà ce qu'on a tort de\r\n-ne pas voir. Je n'ai pas volé, j'ai ramassé par terre des choses qu'il y\r\n-avait. Vous dites Jean Valjean, Jean Mathieu! Je ne connais pas ces\r\n-personnes-là . C'est des villageois. J'ai travaillé chez monsieur Baloup,\r\n-boulevard de l'Hôpital. Je m'appelle Champmathieu. Vous êtes bien malins\r\n-de me dire où je suis né. Moi, je l'ignore. Tout le monde n'a pas des\r\n-maisons pour y venir au monde. Ce serait trop commode. Je crois que mon\r\n-père et ma mère étaient des gens qui allaient sur les routes. Je ne sais\r\n-pas d'ailleurs. Quand j'étais enfant, on m'appelait Petit, maintenant,\r\n-on m'appelle Vieux. Voilà mes noms de baptême. Prenez ça comme vous\r\n-voudrez. J'ai été en Auvergne, j'ai été à Faverolles, pardi! Eh bien?\r\n-est-ce qu'on ne peut pas avoir été en Auvergne et avoir été à Faverolles\r\n-sans avoir été aux galères? Je vous dis que je n'ai pas volé, et que je\r\n-suis le père Champmathieu. J'ai été chez monsieur Baloup, j'ai été\r\n-domicilié. Vous m'ennuyez avec vos bêtises à la fin! Pourquoi donc\r\n-est-ce que le monde est après moi comme des acharnés!\r\n-\r\n-L'avocat général était demeuré debout; il s'adressa au président:\r\n-\r\n---Monsieur le président, en présence des dénégations confuses, mais fort\r\n-habiles de l'accusé, qui voudrait bien se faire passer pour idiot, mais\r\n-qui n'y parviendra pas--nous l'en prévenons--nous requérons qu'il vous\r\n-plaise et qu'il plaise à la cour appeler de nouveau dans cette enceinte\r\n-les condamnés Brevet, Cochepaille et Chenildieu et l'inspecteur de\r\n-police Javert, et les interpeller une dernière fois sur l'identité de\r\n-l'accusé avec le forçat Jean Valjean.\r\n-\r\n---Je fais remarquer à monsieur l'avocat général, dit le président, que\r\n-l'inspecteur de police Javert, rappelé par ses fonctions au chef-lieu\r\n-d'un arrondissement voisin, a quitté l'audience et même la ville,\r\n-aussitôt sa déposition faite. Nous lui en avons accordé l'autorisation,\r\n-avec l'agrément de monsieur l'avocat général et du défenseur de\r\n-l'accusé.\r\n-\r\n---C'est juste, monsieur le président, reprit l'avocat général. En\r\n-l'absence du sieur Javert, je crois devoir rappeler à messieurs les\r\n-jurés ce qu'il a dit ici-même, il y a peu d'heures. Javert est un homme\r\n-estimé qui honore par sa rigoureuse et stricte probité des fonctions\r\n-inférieures, mais importantes. Voici en quels termes il a déposé:--«Je\r\n-n'ai pas même besoin des présomptions morales et des preuves matérielles\r\n-qui démentent les dénégations de l'accusé. Je le reconnais parfaitement.\r\n-Cet homme ne s'appelle pas Champmathieu; c'est un ancien forçat très\r\n-méchant et très redouté nommé Jean Valjean. On ne l'a libéré à \r\n-l'expiration de sa peine qu'avec un extrême regret. Il a subi dix-neuf\r\n-ans de travaux forcés pour vol qualifié. Il avait cinq ou six fois tenté\r\n-de s'évader. Outre le vol Petit-Gervais et le vol Pierron, je le\r\n-soupçonne encore d'un vol commis chez sa grandeur le défunt évêque de\r\n-Digne. Je l'ai souvent vu, à l'époque où j'étais adjudant garde-chiourme\r\n-au bagne de Toulon. Je répète que je le reconnais parfaitement.» Cette\r\n-déclaration si précise parut produire une vive impression sur le public\r\n-et le jury. L'avocat général termina en insistant pour qu'à défaut de\r\n-Javert, les trois témoins Brevet, Chenildieu et Cochepaille fussent\r\n-entendus de nouveau et interpellés solennellement.\r\n-\r\n-Le président transmit un ordre à un huissier, et un moment après la\r\n-porte de la chambre des témoins s'ouvrit. L'huissier, accompagné d'un\r\n-gendarme prêt à lui prêter main-forte, introduisit le condamné Brevet.\r\n-L'auditoire était en suspens et toutes les poitrines palpitaient comme\r\n-si elles n'eussent eu qu'une seule âme.\r\n-\r\n-L'ancien forçat Brevet portait la veste noire et grise des maisons\r\n-centrales. Brevet était un personnage d'une soixantaine d'années qui\r\n-avait une espèce de figure d'homme d'affaires et l'air d'un coquin. Cela\r\n-va quelquefois ensemble. Il était devenu, dans la prison où de nouveaux\r\n-méfaits l'avaient ramené, quelque chose comme guichetier. C'était un\r\n-homme dont les chefs disaient: Il cherche à se rendre utile. Les\r\n-aumôniers portaient bon témoignage de ses habitudes religieuses. Il ne\r\n-faut pas oublier que ceci se passait sous la restauration.\r\n-\r\n---Brevet, dit le président, vous avez subi une condamnation infamante et\r\n-vous ne pouvez prêter serment....\r\n-\r\n-Brevet baissa les yeux.\r\n-\r\n---Cependant, reprit le président, même dans l'homme que la loi a\r\n-dégradé, il peut rester, quand la pitié divine le permet, un sentiment\r\n-d'honneur et d'équité. C'est à ce sentiment que je fais appel à cette\r\n-heure décisive. S'il existe encore en vous, et je l'espère, réfléchissez\r\n-avant de me répondre, considérez d'une part cet homme qu'un mot de vous\r\n-peut perdre, d'autre part la justice qu'un mot de vous peut éclairer.\r\n-L'instant est solennel, et il est toujours temps de vous rétracter, si\r\n-vous croyez vous être trompé.--Accusé, levez-vous.\r\n-\r\n---Brevet, regardez bien l'accusé, recueillez vos souvenirs, et\r\n-dites-nous, en votre âme et conscience, si vous persistez à reconnaître\r\n-cet homme pour votre ancien camarade de bagne Jean Valjean.\r\n-\r\n-Brevet regarda l'accusé, puis se retourna vers la cour.\r\n-\r\n---Oui, monsieur le président. C'est moi qui l'ai reconnu le premier et\r\n-je persiste. Cet homme est Jean Valjean. Entré à Toulon en 1796 et sorti\r\n-en 1815. Je suis sorti l'an d'après. Il a l'air d'une brute maintenant,\r\n-alors ce serait que l'âge l'a abruti; au bagne il était sournois. Je le\r\n-reconnais positivement.\r\n-\r\n---Allez vous asseoir, dit le président. Accusé, restez debout.\r\n-\r\n-On introduisit Chenildieu, forçat à vie, comme l'indiquaient sa casaque\r\n-rouge et son bonnet vert. Il subissait sa peine au bagne de Toulon, d'où\r\n-on l'avait extrait pour cette affaire. C'était un petit homme d'environ\r\n-cinquante ans, vif, ridé, chétif, jaune, effronté, fiévreux, qui avait\r\n-dans tous ses membres et dans toute sa personne une sorte de faiblesse\r\n-maladive et dans le regard une force immense. Ses compagnons du bagne\r\n-l'avaient surnommé Je-nie-Dieu.\r\n-\r\n-Le président lui adressa à peu près les mêmes paroles qu'à Brevet. Au\r\n-moment où il lui rappela que son infamie lui ôtait le droit de prêter\r\n-serment, Chenildieu leva la tête et regarda la foule en face. Le\r\n-président l'invita à se recueillir et lui demanda, comme à Brevet, s'il\r\n-persistait à reconnaître l'accusé.\r\n-\r\n-Chenildieu éclata de rire.\r\n-\r\n---Pardine! si je le reconnais! nous avons été cinq ans attachés à la\r\n-même chaîne. Tu boudes donc, mon vieux?\r\n-\r\n---Allez vous asseoir, dit le président.\r\n-\r\n-L'huissier amena Cochepaille. Cet autre condamné à perpétuité, venu du\r\n-bagne et vêtu de rouge comme Chenildieu, était un paysan de Lourdes et\r\n-un demi-ours des Pyrénées. Il avait gardé des troupeaux dans la\r\n-montagne, et de pâtre il avait glissé brigand. Cochepaille n'était pas\r\n-moins sauvage et paraissait plus stupide encore que l'accusé. C'était un\r\n-de ces malheureux hommes que la nature a ébauchés en bêtes fauves et que\r\n-la société termine en galériens.\r\n-\r\n-Le président essaya de le remuer par quelques paroles pathétiques et\r\n-graves et lui demanda, comme aux deux autres, s'il persistait, sans\r\n-hésitation et sans trouble, à reconnaître l'homme debout devant lui.\r\n-\r\n---C'est Jean Valjean, dit Cochepaille. Même qu'on l'appelait\r\n-Jean-le-Cric, tant il était fort.\r\n-\r\n-Chacune des affirmations de ces trois hommes, évidemment sincères et de\r\n-bonne foi, avait soulevé dans l'auditoire un murmure de fâcheux augure\r\n-pour l'accusé, murmure qui croissait et se prolongeait plus longtemps\r\n-chaque fois qu'une déclaration nouvelle venait s'ajouter à la\r\n-précédente. L'accusé, lui, les avait écoutées avec ce visage étonné qui,\r\n-selon l'accusation, était son principal moyen de défense. À la première,\r\n-les gendarmes ses voisins l'avaient entendu grommeler entre ses dents:\r\n-Ah bien! en voilà un! Après la seconde il dit un peu plus haut, d'un air\r\n-presque satisfait: Bon! À la troisième il s'écria: Fameux!\r\n-\r\n-Le président l'interpella.\r\n-\r\n---Accusé, vous avez entendu. Qu'avez-vous à dire?\r\n-\r\n-Il répondit:\r\n-\r\n---Je dis--Fameux!\r\n-\r\n-Une rumeur éclata dans le public et gagna presque le jury. Il était\r\n-évident que l'homme était perdu.\r\n-\r\n---Huissiers, dit le président, faites faire silence. Je vais clore les\r\n-débats.\r\n-\r\n-En ce moment un mouvement se fit tout à côté du président. On entendit\r\n-une voix qui criait:\r\n-\r\n---Brevet, Chenildieu, Cochepaille! regardez de ce côté-ci.\r\n-\r\n-Tous ceux qui entendirent cette voix se sentirent glacés, tant elle\r\n-était lamentable et terrible. Les yeux se tournèrent vers le point d'où\r\n-elle venait. Un homme, placé parmi les spectateurs privilégiés qui\r\n-étaient assis derrière la cour, venait de se lever, avait poussé la\r\n-porte à hauteur d'appui qui séparait le tribunal du prétoire, et était\r\n-debout au milieu de la salle. Le président, l'avocat général, M.\r\n-Bamatabois, vingt personnes, le reconnurent, et s'écrièrent à la fois:\r\n-\r\n---Monsieur Madeleine!\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre XI\r\n-\r\n-Champmathieu de plus en plus étonné\r\n-\r\n-\r\n-C'était lui en effet. La lampe du greffier éclairait son visage. Il\r\n-tenait son chapeau à la main, il n'y avait aucun désordre dans ses\r\n-vêtements, sa redingote était boutonnée avec soin. Il était très pâle et\r\n-il tremblait légèrement. Ses cheveux, gris encore au moment de son\r\n-arrivée à Arras, étaient maintenant tout à fait blancs. Ils avaient\r\n-blanchi depuis une heure qu'il était là .\r\n-\r\n-Toutes les têtes se dressèrent. La sensation fut indescriptible. Il y\r\n-eut dans l'auditoire un instant d'hésitation. La voix avait été si\r\n-poignante, l'homme qui était là paraissait si calme, qu'au premier abord\r\n-on ne comprit pas. On se demanda qui avait crié. On ne pouvait croire\r\n-que ce fût cet homme tranquille qui eût jeté ce cri effrayant.\r\n-\r\n-Cette indécision ne dura que quelques secondes. Avant même que le\r\n-président et l'avocat général eussent pu dire un mot, avant que les\r\n-gendarmes et les huissiers eussent pu faire un geste, l'homme que tous\r\n-appelaient encore en ce moment M. Madeleine s'était avancé vers les\r\n-témoins Cochepaille, Brevet et Chenildieu.\r\n-\r\n---Vous ne me reconnaissez pas? dit-il.\r\n-\r\n-Tous trois demeurèrent interdits et indiquèrent par un signe de tête\r\n-qu'ils ne le connaissaient point. Cochepaille intimidé fit le salut\r\n-militaire. M. Madeleine se tourna vers les jurés et vers la cour et dit\r\n-d'une voix douce:\r\n-\r\n---Messieurs les jurés, faites relâcher l'accusé. Monsieur le président,\r\n-faites-moi arrêter. L'homme que vous cherchez, ce n'est pas lui, c'est\r\n-moi. Je suis Jean Valjean. Pas une bouche ne respirait. À la première\r\n-commotion de l'étonnement avait succédé un silence de sépulcre. On\r\n-sentait dans la salle cette espèce de terreur religieuse qui saisit la\r\n-foule lorsque quelque chose de grand s'accomplit.\r\n-\r\n-Cependant le visage du président s'était empreint de sympathie et de\r\n-tristesse; il avait échangé un signe rapide avec l'avocat et quelques\r\n-paroles à voix basse avec les conseillers assesseurs. Il s'adressa au\r\n-public, et demanda avec un accent qui fut compris de tous:\r\n-\r\n---Y a-t-il un médecin ici?\r\n-\r\n-L'avocat général prit la parole:\r\n-\r\n---Messieurs les jurés, l'incident si étrange et si inattendu qui trouble\r\n-l'audience ne nous inspire, ainsi qu'à vous, qu'un sentiment que nous\r\n-n'avons pas besoin d'exprimer. Vous connaissez tous, au moins de\r\n-réputation, l'honorable M. Madeleine, maire de Montreuil-sur-mer. S'il y\r\n-a un médecin dans l'auditoire, nous nous joignons à monsieur le\r\n-président pour le prier de vouloir bien assister monsieur Madeleine et\r\n-le reconduire à sa demeure.\r\n-\r\n-M. Madeleine ne laissa point achever l'avocat général.\r\n-\r\n-Il l'interrompit d'un accent plein de mansuétude et d'autorité. Voici\r\n-les paroles qu'il prononça; les voici littéralement, telles qu'elles\r\n-furent écrites immédiatement après l'audience par un des témoins de\r\n-cette scène; telles qu'elles sont encore dans l'oreille de ceux qui les\r\n-ont entendues, il y a près de quarante ans aujourd'hui.\r\n-\r\n---Je vous remercie, monsieur l'avocat général, mais je ne suis pas fou.\r\n-Vous allez voir. Vous étiez sur le point de commettre une grande erreur,\r\n-lâchez cet homme, j'accomplis un devoir, je suis ce malheureux condamné.\r\n-Je suis le seul qui voie clair ici, et je vous dis la vérité. Ce que je\r\n-fais en ce moment, Dieu, qui est là -haut, le regarde, et cela suffit.\r\n-Vous pouvez me prendre, puisque me voilà . J'avais pourtant fait de mon\r\n-mieux. Je me suis caché sous un nom; je suis devenu riche, je suis\r\n-devenu maire; j'ai voulu rentrer parmi les honnêtes gens. Il paraît que\r\n-cela ne se peut pas. Enfin, il y a bien des choses que je ne puis pas\r\n-dire, je ne vais pas vous raconter ma vie, un jour on saura. J'ai volé\r\n-monseigneur l'évêque, cela est vrai; j'ai volé Petit-Gervais, cela est\r\n-vrai. On a eu raison de vous dire que Jean Valjean était un malheureux\r\n-très méchant. Toute la faute n'est peut-être pas à lui. Écoutez,\r\n-messieurs les juges, un homme aussi abaissé que moi n'a pas de\r\n-remontrance à faire à la providence ni de conseil à donner à la société;\r\n-mais, voyez-vous, l'infamie d'où j'avais essayé de sortir est une chose\r\n-nuisible. Les galères font le galérien. Recueillez cela, si vous voulez.\r\n-\r\n-Avant le bagne, j'étais un pauvre paysan très peu intelligent, une\r\n-espèce d'idiot; le bagne m'a changé. J'étais stupide, je suis devenu\r\n-méchant; j'étais bûche, je suis devenu tison. Plus tard l'indulgence et\r\n-la bonté m'ont sauvé, comme la sévérité m'avait perdu. Mais, pardon,\r\n-vous ne pouvez pas comprendre ce que je dis là . Vous trouverez chez moi,\r\n-dans les cendres de la cheminée, la pièce de quarante sous que j'ai\r\n-volée il y a sept ans à Petit-Gervais. Je n'ai plus rien à ajouter.\r\n-Prenez-moi. Mon Dieu! monsieur l'avocat général remue la tête, vous\r\n-dites: M. Madeleine est devenu fou, vous ne me croyez pas! Voilà qui est\r\n-affligeant. N'allez point condamner cet homme au moins! Quoi! ceux-ci ne\r\n-me reconnaissent pas! Je voudrais que Javert fût ici. Il me\r\n-reconnaîtrait, lui!\r\n-\r\n-Rien ne pourrait rendre ce qu'il y avait de mélancolie bienveillante et\r\n-sombre dans l'accent qui accompagnait ces paroles.\r\n-\r\n-Il se tourna vers les trois forçats:\r\n-\r\n---Eh bien, je vous reconnais, moi! Brevet! vous rappelez-vous?...\r\n-\r\n-Il s'interrompit, hésita un moment, et dit:\r\n-\r\n---Te rappelles-tu ces bretelles en tricot à damier que tu avais au\r\n-bagne?\r\n-\r\n-Brevet eut comme une secousse de surprise et le regarda de la tête aux\r\n-pieds d'un air effrayé. Lui continua:\r\n-\r\n---Chenildieu, qui te surnommais toi-même Je-nie-Dieu, tu as toute\r\n-l'épaule droite brûlée profondément, parce que tu t'es couché un jour\r\n-l'épaule sur un réchaud plein de braise, pour effacer les trois lettres\r\n-T. F. P., qu'on y voit toujours cependant. Réponds, est-ce vrai?\r\n-\r\n---C'est vrai, dit Chenildieu.\r\n-\r\n-Il s'adressa à Cochepaille:\r\n-\r\n---Cochepaille, tu as près de la saignée du bras gauche une date gravée\r\n-en lettres bleues avec de la poudre brûlée. Cette date, c'est celle du\r\n-débarquement de l'empereur à Cannes, _1er mars 1815_. Relève ta manche.\r\n-\r\n-Cochepaille releva sa manche, tous les regards se penchèrent autour de\r\n-lui sur son bras nu. Un gendarme approcha une lampe; la date y était.\r\n-\r\n-Le malheureux homme se tourna vers l'auditoire et vers les juges avec un\r\n-sourire dont ceux qui l'ont vu sont encore navrés lorsqu'ils y songent.\r\n-C'était le sourire du triomphe, c'était aussi le sourire du désespoir.\r\n-\r\n---Vous voyez bien, dit-il, que je suis Jean Valjean.\r\n-\r\n-Il n'y avait plus dans cette enceinte ni juges, ni accusateurs, ni\r\n-gendarmes; il n'y avait que des yeux fixes et des coeurs émus. Personne\r\n-ne se rappelait plus le rôle que chacun pouvait avoir à jouer; l'avocat\r\n-général oubliait qu'il était là pour requérir, le président qu'il était\r\n-là pour présider, le défenseur qu'il était là pour défendre. Chose\r\n-frappante, aucune question ne fut faite, aucune autorité n'intervint. Le\r\n-propre des spectacles sublimes, c'est de prendre toutes les âmes et de\r\n-faire de tous les témoins des spectateurs. Aucun peut-être ne se rendait\r\n-compte de ce qu'il éprouvait; aucun, sans doute, ne se disait qu'il\r\n-voyait resplendir là une grande lumière; tous intérieurement se\r\n-sentaient éblouis.\r\n-\r\n-Il était évident qu'on avait sous les yeux Jean Valjean. Cela rayonnait.\r\n-L'apparition de cet homme avait suffi pour remplir de clarté cette\r\n-aventure si obscure le moment d'auparavant. Sans qu'il fût besoin\r\n-d'aucune explication désormais, toute cette foule, comme par une sorte\r\n-de révélation électrique, comprit tout de suite et d'un seul coup d'oeil\r\n-cette simple et magnifique histoire d'un homme qui se livrait pour qu'un\r\n-autre homme ne fût pas condamné à sa place. Les détails, les\r\n-hésitations, les petites résistances possibles se perdirent dans ce\r\n-vaste fait lumineux.\r\n-\r\n-Impression qui passa vite, mais qui dans l'instant fut irrésistible.\r\n-\r\n---Je ne veux pas déranger davantage l'audience, reprit Jean Valjean. Je\r\n-m'en vais, puisqu'on ne m'arrête pas. J'ai plusieurs choses à faire.\r\n-Monsieur l'avocat général sait qui je suis, il sait où je vais, il me\r\n-fera arrêter quand il voudra.\r\n-\r\n-Il se dirigea vers la porte de sortie. Pas une voix ne s'éleva, pas un\r\n-bras ne s'étendit pour l'empêcher. Tous s'écartèrent. Il avait en ce\r\n-moment ce je ne sais quoi de divin qui fait que les multitudes reculent\r\n-et se rangent devant un homme. Il traversa la foule à pas lents. On n'a\r\n-jamais su qui ouvrit la porte, mais il est certain que la porte se\r\n-trouva ouverte lorsqu'il y parvint. Arrivé là , il se retourna et dit:\r\n-\r\n---Monsieur l'avocat général, je reste à votre disposition.\r\n-\r\n-Puis il s'adressa à l'auditoire:\r\n-\r\n---Vous tous, tous ceux qui sont ici, vous me trouvez digne de pitié,\r\n-n'est-ce pas? Mon Dieu! quand je pense à ce que j'ai été sur le point de\r\n-faire, je me trouve digne d'envie. Cependant j'aurais mieux aimé que\r\n-tout ceci n'arrivât pas.\r\n-\r\n-Il sortit, et la porte se referma comme elle avait été ouverte, car ceux\r\n-qui font de certaines choses souveraines sont toujours sûrs d'être\r\n-servis par quelqu'un dans la foule.\r\n-\r\n-Moins d'une heure après, le verdict du jury déchargeait de toute\r\n-accusation le nommé Champmathieu; et Champmathieu, mis en liberté\r\n-immédiatement, s'en allait stupéfait, croyant tous les hommes fous et ne\r\n-comprenant rien à cette vision.\r\n-\r\n-\r\n-\r\n-\r\n-Livre huitième--Contre-coup\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre I\r\n-\r\n-Dans quel miroir M. Madeleine regarde ses cheveux\r\n-\r\n-\r\n-Le jour commençait à poindre. Fantine avait eu une nuit de fièvre et\r\n-d'insomnie, pleine d'ailleurs d'images heureuses; au matin, elle\r\n-s'endormit. La soeur Simplice qui l'avait veillée profita de ce sommeil\r\n-pour aller préparer une nouvelle potion de quinquina. La digne soeur\r\n-était depuis quelques instants dans le laboratoire de l'infirmerie,\r\n-penchée sur ses drogues et sur ses fioles et regardant de très près à \r\n-cause de cette brume que le crépuscule répand sur les objets. Tout à \r\n-coup elle tourna la tête et fit un léger cri. M. Madeleine était devant\r\n-elle. Il venait d'entrer silencieusement.\r\n-\r\n---C'est vous, monsieur le maire! s'écria-t-elle.\r\n-\r\n-Il répondit, à voix basse:\r\n-\r\n---Comment va cette pauvre femme?\r\n-\r\n---Pas mal en ce moment. Mais nous avons été bien inquiets, allez!\r\n-\r\n-Elle lui expliqua ce qui s'était passé, que Fantine était bien mal la\r\n-veille et que maintenant elle était mieux, parce qu'elle croyait que\r\n-monsieur le maire était allé chercher son enfant à Montfermeil. La soeur\r\n-n'osa pas interroger monsieur le maire, mais elle vit bien à son air que\r\n-ce n'était point de là qu'il venait.\r\n-\r\n---Tout cela est bien, dit-il, vous avez eu raison de ne pas la\r\n-détromper.\r\n-\r\n---Oui, reprit la soeur, mais maintenant, monsieur le maire, qu'elle va\r\n-vous voir et qu'elle ne verra pas son enfant, que lui dirons-nous?\r\n-\r\n-Il resta un moment rêveur.\r\n-\r\n---Dieu nous inspirera, dit-il.\r\n-\r\n---On ne pourrait cependant pas mentir, murmura la soeur à demi-voix.\r\n-\r\n-Le plein jour s'était fait dans la chambre. Il éclairait en face le\r\n-visage de M. Madeleine. Le hasard fit que la soeur leva les yeux.\r\n-\r\n---Mon Dieu, monsieur! s'écria-t-elle, que vous est-il donc arrivé? vos\r\n-cheveux sont tout blancs!\r\n-\r\n---Blancs! dit-il.\r\n-\r\n-La soeur Simplice n'avait point de miroir; elle fouilla dans une trousse\r\n-et en tira une petite glace dont se servait le médecin de l'infirmerie\r\n-pour constater qu'un malade était mort et ne respirait plus. M.\r\n-Madeleine prit la glace, y considéra ses cheveux, et dit:\r\n-\r\n---Tiens!\r\n-\r\n-Il prononça ce mot avec indifférence et comme s'il pensait à autre\r\n-chose.\r\n-\r\n-La soeur se sentit glacée par je ne sais quoi d'inconnu qu'elle\r\n-entrevoyait dans tout ceci.\r\n-\r\n-Il demanda:\r\n-\r\n---Puis-je la voir?\r\n-\r\n---Est-ce que monsieur le maire ne lui fera pas revenir son enfant? dit\r\n-la soeur, osant à peine hasarder une question.\r\n-\r\n---Sans doute, mais il faut au moins deux ou trois jours.\r\n-\r\n---Si elle ne voyait pas monsieur le maire d'ici là , reprit timidement la\r\n-soeur, elle ne saurait pas que monsieur le maire est de retour, il\r\n-serait aisé de lui faire prendre patience, et quand l'enfant arriverait\r\n-elle penserait tout naturellement que monsieur le maire est arrivé avec\r\n-l'enfant. On n'aurait pas de mensonge à faire.\r\n-\r\n-M. Madeleine parut réfléchir quelques instants, puis il dit avec sa\r\n-gravité calme:\r\n-\r\n---Non, ma soeur, il faut que je la voie. Je suis peut-être pressé.\r\n-\r\n-La religieuse ne sembla pas remarquer ce mot «peut-être», qui donnait un\r\n-sens obscur et singulier aux paroles de M. le maire. Elle répondit en\r\n-baissant les yeux et la voix respectueusement:\r\n-\r\n---En ce cas, elle repose, mais monsieur le maire peut entrer.\r\n-\r\n-Il fit quelques observations sur une porte qui fermait mal, et dont le\r\n-bruit pouvait réveiller la malade, puis il entra dans la chambre de\r\n-Fantine, s'approcha du lit et entrouvrit les rideaux. Elle dormait. Son\r\n-souffle sortait de sa poitrine avec ce bruit tragique qui est propre à \r\n-ces maladies, et qui navre les pauvres mères lorsqu'elles veillent la\r\n-nuit près de leur enfant condamné et endormi. Mais cette respiration\r\n-pénible troublait à peine une sorte de sérénité ineffable, répandue sur\r\n-son visage, qui la transfigurait dans son sommeil. Sa pâleur était\r\n-devenue de la blancheur; ses joues étaient vermeilles. Ses longs cils\r\n-blonds, la seule beauté qui lui fût restée de sa virginité et de sa\r\n-jeunesse, palpitaient tout en demeurant clos et baissés. Toute sa\r\n-personne tremblait de je ne sais quel déploiement d'ailes prêtes à \r\n-s'entrouvrir et à l'emporter, qu'on sentait frémir, mais qu'on ne voyait\r\n-pas. À la voir ainsi, on n'eût jamais pu croire que c'était là une\r\n-malade presque désespérée. Elle ressemblait plutôt à ce qui va s'envoler\r\n-qu'à ce qui va mourir.\r\n-\r\n-La branche, lorsqu'une main s'approche pour détacher la fleur,\r\n-frissonne, et semble à la fois se dérober et s'offrir. Le corps humain a\r\n-quelque chose de ce tressaillement, quand arrive l'instant où les doigts\r\n-mystérieux de la mort vont cueillir l'âme.\r\n-\r\n-M. Madeleine resta quelque temps immobile près de ce lit, regardant tour\r\n-à tour la malade et le crucifix, comme il faisait deux mois auparavant,\r\n-le jour où il était venu pour la première fois la voir dans cet asile.\r\n-Ils étaient encore là tous les deux dans la même attitude, elle dormant,\r\n-lui priant; seulement maintenant, depuis ces deux mois écoulés, elle\r\n-avait des cheveux gris et lui des cheveux blancs.\r\n-\r\n-La soeur n'était pas entrée avec lui. Il se tenait près de ce lit,\r\n-debout, le doigt sur la bouche, comme s'il y eût eu dans la chambre\r\n-quelqu'un à faire taire.\r\n-\r\n-Elle ouvrit les yeux, le vit, et dit paisiblement, avec un sourire:\r\n-\r\n---Et Cosette?\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre II\r\n-\r\n-Fantine heureuse\r\n-\r\n-\r\n-Elle n'eut pas un mouvement de surprise, ni un mouvement de joie; elle\r\n-était la joie même. Cette simple question: «Et Cosette?» fut faite avec\r\n-une foi si profonde, avec tant de certitude, avec une absence si\r\n-complète d'inquiétude et de doute, qu'il ne trouva pas une parole. Elle\r\n-continua:\r\n-\r\n---Je savais que vous étiez là . Je dormais, mais je vous voyais. Il y a\r\n-longtemps que je vous vois. Je vous ai suivi des yeux toute la nuit.\r\n-Vous étiez dans une gloire et vous aviez autour de vous toutes sortes de\r\n-figures célestes.\r\n-\r\n-Il leva son regard vers le crucifix.\r\n-\r\n---Mais, reprit-elle, dites-moi donc où est Cosette? Pourquoi ne l'avoir\r\n-pas mise sur mon lit pour le moment où je m'éveillerais?\r\n-\r\n-Il répondit machinalement quelque chose qu'il n'a jamais pu se rappeler\r\n-plus tard.\r\n-\r\n-Heureusement le médecin, averti, était survenu. Il vint en aide à M.\r\n-Madeleine.\r\n-\r\n---Mon enfant, dit le médecin, calmez-vous. Votre enfant est là .\r\n-\r\n-Les yeux de Fantine s'illuminèrent et couvrirent de clarté tout son\r\n-visage. Elle joignit les mains avec une expression qui contenait tout ce\r\n-que la prière peut avoir à la fois de plus violent et de plus doux.\r\n-\r\n---Oh! s'écria-t-elle, apportez-la-moi!\r\n-\r\n-Touchante illusion de mère! Cosette était toujours pour elle le petit\r\n-enfant qu'on apporte.\r\n-\r\n---Pas encore, reprit le médecin, pas en ce moment. Vous avez un reste de\r\n-fièvre. La vue de votre enfant vous agiterait et vous ferait du mal. Il\r\n-faut d'abord vous guérir. Elle l'interrompit impétueusement.\r\n-\r\n---Mais je suis guérie! je vous dis que je suis guérie! Est-il âne, ce\r\n-médecin! Ah çà ! je veux voir mon enfant, moi!\r\n-\r\n---Vous voyez, dit le médecin, comme vous vous emportez. Tant que vous\r\n-serez ainsi, je m'opposerai à ce que vous ayez votre enfant. Il ne\r\n-suffit pas de la voir, il faut vivre pour elle. Quand vous serez\r\n-raisonnable, je vous l'amènerai moi-même.\r\n-\r\n-La pauvre mère courba la tête.\r\n-\r\n---Monsieur le médecin, je vous demande pardon, je vous demande vraiment\r\n-bien pardon. Autrefois, je n'aurais pas parlé comme je viens de faire,\r\n-il m'est arrivé tant de malheurs que quelquefois je ne sais plus ce que\r\n-je dis. Je comprends, vous craignez l'émotion, j'attendrai tant que vous\r\n-voudrez, mais je vous jure que cela ne m'aurait pas fait de mal de voir\r\n-ma fille. Je la vois, je ne la quitte pas des yeux depuis hier au soir.\r\n-Savez-vous? on me l'apporterait maintenant que je me mettrais à lui\r\n-parler doucement. Voilà tout. Est-ce que ce n'est pas bien naturel que\r\n-j'aie envie de voir mon enfant qu'on a été me chercher exprès à \r\n-Montfermeil? Je ne suis pas en colère. Je sais bien que je vais être\r\n-heureuse. Toute la nuit j'ai vu des choses blanches et des personnes qui\r\n-me souriaient. Quand monsieur le médecin voudra, il m'apportera ma\r\n-Cosette. Je n'ai plus de fièvre, puisque je suis guérie; je sens bien\r\n-que je n'ai plus rien du tout; mais je vais faire comme si j'étais\r\n-malade et ne pas bouger pour faire plaisir aux dames d'ici. Quand on\r\n-verra que je suis bien tranquille, on dira: il faut lui donner son\r\n-enfant.\r\n-\r\n-M. Madeleine s'était assis sur une chaise qui était à côté du lit. Elle\r\n-se tourna vers lui; elle faisait visiblement effort pour paraître calme\r\n-et «bien sage», comme elle disait dans cet affaiblissement de la maladie\r\n-qui ressemble à l'enfance, afin que, la voyant si paisible, on ne fît\r\n-pas difficulté de lui amener Cosette. Cependant, tout en se contenant,\r\n-elle ne pouvait s'empêcher d'adresser à M. Madeleine mille questions.\r\n-\r\n---Avez-vous fait un bon voyage, monsieur le maire? Oh! comme vous êtes\r\n-bon d'avoir été me la chercher! Dites-moi seulement comment elle est.\r\n-A-t-elle bien supporté la route? Hélas! elle ne me reconnaîtra pas!\r\n-Depuis le temps, elle m'a oubliée, pauvre chou! Les enfants, cela n'a\r\n-pas de mémoire. C'est comme des oiseaux. Aujourd'hui cela voit une chose\r\n-et demain une autre, et cela ne pense plus à rien. Avait-elle du linge\r\n-blanc seulement? Ces Thénardier la tenaient-ils proprement? Comment la\r\n-nourrissait-on? Oh! comme j'ai souffert, si vous saviez! de me faire\r\n-toutes ces questions-là dans le temps de ma misère! Maintenant, c'est\r\n-passé. Je suis joyeuse. Oh! que je voudrais donc la voir! Monsieur le\r\n-maire, l'avez-vous trouvée jolie? N'est-ce pas qu'elle est belle, ma\r\n-fille? Vous devez avoir eu bien froid dans cette diligence! Est-ce qu'on\r\n-ne pourrait pas l'amener rien qu'un petit moment? On la remporterait\r\n-tout de suite après. Dites! vous qui êtes le maître, si vous vouliez!\r\n-\r\n-Il lui prit la main:\r\n-\r\n---Cosette est belle, dit-il, Cosette se porte bien, vous la verrez\r\n-bientôt, mais apaisez-vous. Vous parlez trop vivement, et puis vous\r\n-sortez vos bras du lit, et cela vous fait tousser.\r\n-\r\n-En effet, des quintes de toux interrompaient Fantine presque à chaque\r\n-mot.\r\n-\r\n-Fantine ne murmura pas, elle craignait d'avoir compromis par quelques\r\n-plaintes trop passionnées la confiance qu'elle voulait inspirer, et elle\r\n-se mit à dire des paroles indifférentes.\r\n-\r\n---C'est assez joli, Montfermeil, n'est-ce-pas? L'été, on va y faire des\r\n-parties de plaisir. Ces Thénardier font-ils de bonnes affaires? Il ne\r\n-passe pas grand monde dans leur pays. C'est une espèce de gargote que\r\n-cette auberge-là .\r\n-\r\n-M. Madeleine lui tenait toujours la main, il la considérait avec\r\n-anxiété; il était évident qu'il était venu pour lui dire des choses\r\n-devant lesquelles sa pensée hésitait maintenant. Le médecin, sa visite\r\n-faite, s'était retiré. La soeur Simplice était seule restée auprès\r\n-d'eux.\r\n-\r\n-Cependant, au milieu de ce silence, Fantine s'écria:\r\n-\r\n---Je l'entends! mon Dieu! je l'entends!\r\n-\r\n-Elle étendit le bras pour qu'on se tût autour d'elle, retint son\r\n-souffle, et se mit à écouter avec ravissement.\r\n-\r\n-Il y avait un enfant qui jouait dans la cour; l'enfant de la portière ou\r\n-d'une ouvrière quelconque. C'est là un de ces hasards qu'on retrouve\r\n-toujours et qui semblent faire partie de la mystérieuse mise en scène\r\n-des événements lugubres. L'enfant, c'était une petite fille, allait,\r\n-venait, courait pour se réchauffer, riait et chantait à haute voix.\r\n-Hélas! à quoi les jeux des enfants ne se mêlent-ils pas! C'était cette\r\n-petite fille que Fantine entendait chanter.\r\n-\r\n---Oh! reprit-elle, c'est ma Cosette! je reconnais sa voix!\r\n-\r\n-L'enfant s'éloigna comme il était venu, la voix s'éteignit, Fantine\r\n-écouta encore quelque temps, puis son visage s'assombrit, et M.\r\n-Madeleine l'entendit qui disait à voix basse:\r\n-\r\n---Comme ce médecin est méchant de ne pas me laisser voir ma fille! Il a\r\n-une mauvaise figure, cet homme-là !\r\n-\r\n-Cependant le fond riant de ses idées revint. Elle continua de se parler\r\n-à elle-même, la tête sur l'oreiller.\r\n-\r\n---Comme nous allons être heureuses! Nous aurons un petit jardin,\r\n-d'abord! M. Madeleine me l'a promis. Ma fille jouera dans le jardin.\r\n-Elle doit savoir ses lettres maintenant. Je la ferai épeler. Elle courra\r\n-dans l'herbe après les papillons. Je la regarderai. Et puis elle fera sa\r\n-première communion. Ah çà ! quand fera-t-elle sa première communion? Elle\r\n-se mit à compter sur ses doigts.\r\n-\r\n---... Un, deux, trois, quatre... elle a sept ans. Dans cinq ans. Elle\r\n-aura un voile blanc, des bas à jour, elle aura l'air d'une petite femme.\r\n-Ô ma bonne soeur, vous ne savez pas comme je suis bête, voilà que je\r\n-pense à la première communion de ma fille! Et elle se mit à rire.\r\n-\r\n-Il avait quitté la main de Fantine. Il écoutait ces paroles comme on\r\n-écoute un vent qui souffle, les yeux à terre, l'esprit plongé dans des\r\n-réflexions sans fond. Tout à coup elle cessa de parler, cela lui fit\r\n-lever machinalement la tête. Fantine était devenue effrayante.\r\n-\r\n-Elle ne parlait plus, elle ne respirait plus; elle s'était soulevée à \r\n-demi sur son séant, son épaule maigre sortait de sa chemise, son visage,\r\n-radieux le moment d'auparavant, était blême, et elle paraissait fixer\r\n-sur quelque chose de formidable, devant elle, à l'autre extrémité de la\r\n-chambre, son oeil agrandi par la terreur.\r\n-\r\n---Mon Dieu! s'écria-t-il. Qu'avez-vous, Fantine?\r\n-\r\n-Elle ne répondit pas, elle ne quitta point des yeux l'objet quelconque\r\n-qu'elle semblait voir, elle lui toucha le bras d'une main et de l'autre\r\n-lui fit signe de regarder derrière lui.\r\n-\r\n-Il se retourna, et vit Javert.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre III\r\n-\r\n-Javert content\r\n-\r\n-\r\n-Voici ce qui s'était passé.\r\n-\r\n-Minuit et demi venait de sonner, quand M. Madeleine était sorti de la\r\n-salle des assises d'Arras. Il était rentré à son auberge juste à temps\r\n-pour repartir par la malle-poste où l'on se rappelle qu'il avait retenu\r\n-sa place. Un peu avant six heures du matin, il était arrivé à \r\n-Montreuil-sur-mer, et son premier soin avait été de jeter à la poste sa\r\n-lettre à M. Laffitte, puis d'entrer à l'infirmerie et de voir Fantine.\r\n-\r\n-Cependant, à peine avait-il quitté la salle d'audience de la cour\r\n-d'assises, que l'avocat général, revenu du premier saisissement, avait\r\n-pris la parole pour déplorer l'acte de folie de l'honorable maire de\r\n-Montreuil-sur-mer, déclarer que ses convictions n'étaient en rien\r\n-modifiées par cet incident bizarre qui s'éclaircirait plus tard, et\r\n-requérir, en attendant, la condamnation de ce Champmathieu, évidemment\r\n-le vrai Jean Valjean. La persistance de l'avocat général était\r\n-visiblement en contradiction avec le sentiment de tous, du public, de la\r\n-cour et du jury. Le défenseur avait eu peu de peine à réfuter cette\r\n-harangue et à établir que, par suite des révélations de M. Madeleine,\r\n-c'est-à -dire du vrai Jean Valjean, la face de l'affaire était\r\n-bouleversée de fond en comble, et que le jury n'avait plus devant les\r\n-yeux qu'un innocent. L'avocat avait tiré de là quelques épiphonèmes,\r\n-malheureusement peu neufs, sur les erreurs judiciaires, etc., etc., le\r\n-président dans son résumé s'était joint au défenseur, et le jury en\r\n-quelques minutes avait mis hors de cause Champmathieu.\r\n-\r\n-Cependant il fallait un Jean Valjean à l'avocat général, et, n'ayant\r\n-plus Champmathieu, il prit Madeleine.\r\n-\r\n-Immédiatement après la mise en liberté de Champmathieu, l'avocat général\r\n-s'enferma avec le président. Ils conférèrent «de la nécessité de se\r\n-saisir de la personne de M. le maire de Montreuil-sur-mer». Cette\r\n-phrase, où il y a beaucoup de _de_, est de M. l'avocat général,\r\n-entièrement écrite de sa main sur la minute de son rapport au procureur\r\n-général. La première émotion passée, le président fit peu d'objections.\r\n-Il fallait bien que justice eût son cours. Et puis, pour tout dire,\r\n-quoique le président fût homme bon et assez intelligent, il était en\r\n-même temps fort royaliste et presque ardent, et il avait été choqué que\r\n-le maire de Montreuil-sur-mer, en parlant du débarquement à Cannes, eût\r\n-dit l'_empereur_ et non _Buonaparte_.\r\n-\r\n-L'ordre d'arrestation fut donc expédié. L'avocat général l'envoya à \r\n-Montreuil-sur-mer par un exprès, à franc étrier, et en chargea\r\n-l'inspecteur de police Javert.\r\n-\r\n-On sait que Javert était revenu à Montreuil-sur-mer immédiatement après\r\n-avoir fait sa déposition.\r\n-\r\n-Javert se levait au moment où l'exprès lui remit l'ordre d'arrestation\r\n-et le mandat d'amener.\r\n-\r\n-L'exprès était lui-même un homme de police fort entendu qui, en deux\r\n-mots, mit Javert au fait de ce qui était arrivé à Arras. L'ordre\r\n-d'arrestation, signé de l'avocat général, était ainsi\r\n-conçu:--L'inspecteur Javert appréhendera au corps le sieur Madeleine,\r\n-maire de Montreuil-sur-mer, qui, dans l'audience de ce jour, a été\r\n-reconnu pour être le forçat libéré Jean Valjean.\r\n-\r\n-Quelqu'un qui n'eût pas connu Javert et qui l'eût vu au moment où il\r\n-pénétra dans l'antichambre de l'infirmerie n'eût pu rien deviner de ce\r\n-qui se passait, et lui eût trouvé l'air le plus ordinaire du monde. Il\r\n-était froid, calme, grave, avait ses cheveux gris parfaitement lissés\r\n-sur les tempes et venait de monter l'escalier avec sa lenteur\r\n-habituelle. Quelqu'un qui l'eût connu à fond et qui l'eût examiné\r\n-attentivement eût frémi. La boucle de son col de cuir, au lieu d'être\r\n-sur sa nuque, était sur son oreille gauche. Ceci révélait une agitation\r\n-inouïe.\r\n-\r\n-Javert était un caractère complet, ne laissant faire de pli ni à son\r\n-devoir, ni à son uniforme; méthodique avec les scélérats, rigide avec\r\n-les boutons de son habit.\r\n-\r\n-Pour qu'il eût mal mis la boucle de son col, il fallait qu'il y eût en\r\n-lui une de ces émotions qu'on pourrait appeler des tremblements de terre\r\n-intérieurs.\r\n-\r\n-Il était venu simplement, avait requis un caporal et quatre soldats au\r\n-poste voisin, avait laissé les soldats dans la cour, et s'était fait\r\n-indiquer la chambre de Fantine par la portière sans défiance, accoutumée\r\n-qu'elle était à voir des gens armés demander monsieur le maire.\r\n-\r\n-Arrivé à la chambre de Fantine, Javert tourna la clef, poussa la porte\r\n-avec une douceur de garde-malade ou de mouchard, et entra.\r\n-\r\n-À proprement parler, il n'entra pas. Il se tint debout dans la porte\r\n-entrebâillée, le chapeau sur la tête, la main gauche dans sa redingote\r\n-fermée jusqu'au menton. Dans le pli du coude on pouvait voir le pommeau\r\n-de plomb de son énorme canne, laquelle disparaissait derrière lui.\r\n-\r\n-Il resta ainsi près d'une minute sans qu'on s'aperçût de sa présence.\r\n-Tout à coup Fantine leva les yeux, le vit, et fit retourner M.\r\n-Madeleine.\r\n-\r\n-À l'instant où le regard de Madeleine rencontra le regard de Javert,\r\n-Javert, sans bouger, sans remuer, sans approcher, devint épouvantable.\r\n-Aucun sentiment humain ne réussit à être effroyable comme la joie.\r\n-\r\n-Ce fut le visage d'un démon qui vient de retrouver son damné.\r\n-\r\n-La certitude de tenir enfin Jean Valjean fit apparaître sur sa\r\n-physionomie tout ce qu'il avait dans l'âme. Le fond remué monta à la\r\n-surface. L'humiliation d'avoir un peu perdu la piste et de s'être mépris\r\n-quelques minutes sur ce Champmathieu, s'effaçait sous l'orgueil d'avoir\r\n-si bien deviné d'abord et d'avoir eu si longtemps un instinct juste. Le\r\n-contentement de Javert éclata dans son attitude souveraine. La\r\n-difformité du triomphe s'épanouit sur ce front étroit. Ce fut tout le\r\n-déploiement d'horreur que peut donner une figure satisfaite.\r\n-\r\n-Javert en ce moment était au ciel. Sans qu'il s'en rendit nettement\r\n-compte, mais pourtant avec une intuition confuse de sa nécessité et de\r\n-son succès, il personnifiait, lui Javert, la justice, la lumière et la\r\n-vérité dans leur fonction céleste d'écrasement du mal. Il avait derrière\r\n-lui et autour de lui, à une profondeur infinie, l'autorité, la raison,\r\n-la chose jugée, la conscience légale, la vindicte publique, toutes les\r\n-étoiles; il protégeait l'ordre, il faisait sortir de la loi la foudre,\r\n-il vengeait la société, il prêtait main-forte à l'absolu; il se dressait\r\n-dans une gloire; il y avait dans sa victoire un reste de défi et de\r\n-combat; debout, altier, éclatant, il étalait en plein azur la bestialité\r\n-surhumaine d'un archange féroce; l'ombre redoutable de l'action qu'il\r\n-accomplissait faisait visible à son poing crispé le vague flamboiement\r\n-de l'épée sociale; heureux et indigné, il tenait sous son talon le\r\n-crime, le vice, la rébellion, la perdition, l'enfer, il rayonnait, il\r\n-exterminait, il souriait et il y avait une incontestable grandeur dans\r\n-ce saint Michel monstrueux.\r\n-\r\n-Javert, effroyable, n'avait rien d'ignoble.\r\n-\r\n-La probité, la sincérité, la candeur, la conviction, l'idée du devoir,\r\n-sont des choses qui, en se trompant, peuvent devenir hideuses, mais qui,\r\n-même hideuses, restent grandes; leur majesté, propre à la conscience\r\n-humaine, persiste dans l'horreur. Ce sont des vertus qui ont un vice,\r\n-l'erreur. L'impitoyable joie honnête d'un fanatique en pleine atrocité\r\n-conserve on ne sait quel rayonnement lugubrement vénérable. Sans qu'il\r\n-s'en doutât, Javert, dans son bonheur formidable, était à plaindre comme\r\n-tout ignorant qui triomphe. Rien n'était poignant et terrible comme\r\n-cette figure où se montrait ce qu'on pourrait appeler tout le mauvais du\r\n-bon.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre IV\r\n-\r\n-L'autorité reprend ses droits\r\n-\r\n-\r\n-La Fantine n'avait point vu Javert depuis le jour où M. le maire l'avait\r\n-arrachée à cet homme. Son cerveau malade ne se rendit compte de rien,\r\n-seulement elle ne douta pas qu'il ne revint la chercher. Elle ne put\r\n-supporter cette figure affreuse, elle se sentit expirer, elle cacha son\r\n-visage de ses deux mains et cria avec angoisse:\r\n-\r\n---Monsieur Madeleine, sauvez-moi!\r\n-\r\n-Jean Valjean--nous ne le nommerons plus désormais autrement--s'était\r\n-levé. Il dit à Fantine de sa voix la plus douce et la plus calme:\r\n-\r\n---Soyez tranquille. Ce n'est pas pour vous qu'il vient.\r\n-\r\n-Puis il s'adressa à Javert et lui dit:\r\n-\r\n---Je sais ce que vous voulez.\r\n-\r\n-Javert répondit:\r\n-\r\n---Allons, vite!\r\n-\r\n-Il y eut dans l'inflexion qui accompagna ces deux mots je ne sais quoi\r\n-de fauve et de frénétique. Javert ne dit pas: «Allons, vite!» il dit:\r\n-«Allonouaite!» Aucune orthographe ne pourrait rendre l'accent dont cela\r\n-fut prononcé; ce n'était plus une parole humaine, c'était un\r\n-rugissement.\r\n-\r\n-Il ne fit point comme d'habitude; il n'entra point en matière; il\r\n-n'exhiba point de mandat d'amener. Pour lui, Jean Valjean était une\r\n-sorte de combattant mystérieux et insaisissable, un lutteur ténébreux\r\n-qu'il étreignait depuis cinq ans sans pouvoir le renverser. Cette\r\n-arrestation n'était pas un commencement, mais une fin. Il se borna à \r\n-dire: «Allons, vite!»\r\n-\r\n-En parlant ainsi, il ne fit point un pas; il lança sur Jean Valjean ce\r\n-regard qu'il jetait comme un crampon, et avec lequel il avait coutume de\r\n-tirer violemment les misérables à lui.\r\n-\r\n-C'était ce regard que la Fantine avait senti pénétrer jusque dans la\r\n-moelle de ses os deux mois auparavant.\r\n-\r\n-Au cri de Javert, Fantine avait rouvert les yeux. Mais M. le maire était\r\n-là . Que pouvait-elle craindre?\r\n-\r\n-Javert avança au milieu de la chambre et cria:\r\n-\r\n---Ah çà ! viendras-tu?\r\n-\r\n-La malheureuse regarda autour d'elle. Il n'y avait personne que la\r\n-religieuse et monsieur le maire. À qui pouvait s'adresser ce tutoiement\r\n-abject? elle seulement. Elle frissonna.\r\n-\r\n-Alors elle vit une chose inouïe, tellement inouïe que jamais rien de\r\n-pareil ne lui était apparu dans les plus noirs délires de la fièvre.\r\n-\r\n-Elle vit le mouchard Javert saisir au collet monsieur le maire; elle vit\r\n-monsieur le maire courber la tête. Il lui sembla que le monde\r\n-s'évanouissait.\r\n-\r\n-Javert, en effet, avait pris Jean Valjean au collet.\r\n-\r\n---Monsieur le maire! cria Fantine.\r\n-\r\n-Javert éclata de rire, de cet affreux rire qui lui déchaussait toutes\r\n-les dents.\r\n-\r\n---Il n'y a plus de monsieur le maire ici!\r\n-\r\n-Jean Valjean n'essaya pas de déranger la main qui tenait le col de sa\r\n-redingote. Il dit:\r\n-\r\n---Javert....\r\n-\r\n-Javert l'interrompit:\r\n-\r\n---Appelle-moi monsieur l'inspecteur.\r\n-\r\n---Monsieur, reprit Jean Valjean, je voudrais vous dire un mot en\r\n-particulier.\r\n-\r\n---Tout haut! parle tout haut! répondit Javert; on me parle tout haut à \r\n-moi!\r\n-\r\n-Jean Valjean continua en baissant la voix:\r\n-\r\n---C'est une prière que j'ai à vous faire....\r\n-\r\n---Je te dis de parler tout haut.\r\n-\r\n---Mais cela ne doit être entendu que de vous seul....\r\n-\r\n---Qu'est-ce que cela me fait? je n'écoute pas!\r\n-\r\n-Jean Valjean se tourna vers lui et lui dit rapidement et très bas:\r\n-\r\n---Accordez-moi trois jours! trois jours pour aller chercher l'enfant de\r\n-cette malheureuse femme! Je payerai ce qu'il faudra. Vous\r\n-m'accompagnerez si vous voulez.\r\n-\r\n---Tu veux rire! cria Javert. Ah çà ! je ne te croyais pas bête! Tu me\r\n-demandes trois jours pour t'en aller! Tu dis que c'est pour aller\r\n-chercher l'enfant de cette fille! Ah! ah! c'est bon! voilà qui est bon!\r\n-Fantine eut un tremblement.\r\n-\r\n---Mon enfant! s'écria-t-elle, aller chercher mon enfant! Elle n'est donc\r\n-pas ici! Ma soeur, répondez-moi, où est Cosette? Je veux mon enfant!\r\n-Monsieur Madeleine! monsieur le maire!\r\n-\r\n-Javert frappa du pied.\r\n-\r\n---Voilà l'autre, à présent! Te tairas-tu, drôlesse! Gredin de pays où\r\n-les galériens sont magistrats et où les filles publiques sont soignées\r\n-comme des comtesses! Ah mais! tout ça va changer; il était temps!\r\n-\r\n-Il regarda fixement Fantine et ajouta en reprenant à poignée la cravate,\r\n-la chemise et le collet de Jean Valjean:\r\n-\r\n---Je te dis qu'il n'y a point de monsieur Madeleine et qu'il n'y a point\r\n-de monsieur le maire. Il y a un voleur, il y a un brigand, il y a un\r\n-forçat appelé Jean Valjean! c'est lui que je tiens! voilà ce qu'il y a!\r\n-\r\n-Fantine se dressa en sursaut, appuyée sur ses bras roides et sur ses\r\n-deux mains, elle regarda Jean Valjean, elle regarda Javert, elle regarda\r\n-la religieuse, elle ouvrit la bouche comme pour parler, un râle sortit\r\n-du fond de sa gorge, ses dents claquèrent, elle étendit les bras avec\r\n-angoisse, ouvrant convulsivement les mains, et cherchant autour d'elle\r\n-comme quelqu'un qui se noie, puis elle s'affaissa subitement sur\r\n-l'oreiller. Sa tête heurta le chevet du lit et vint retomber sur sa\r\n-poitrine, la bouche béante, les yeux ouverts et éteints.\r\n-\r\n-Elle était morte.\r\n-\r\n-Jean Valjean posa sa main sur la main de Javert qui le tenait, et\r\n-l'ouvrit comme il eût ouvert la main d'un enfant, puis il dit à Javert:\r\n-\r\n---Vous avez tué cette femme.\r\n-\r\n---Finirons-nous! cria Javert furieux. Je ne suis pas ici pour entendre\r\n-des raisons. Économisons tout ça. La garde est en bas. Marchons tout de\r\n-suite, ou les poucettes!\r\n-\r\n-Il y avait dans un coin de la chambre un vieux lit en fer en assez\r\n-mauvais état qui servait de lit de camp aux soeurs quand elles\r\n-veillaient. Jean Valjean alla à ce lit, disloqua en un clin d'oeil le\r\n-chevet déjà fort délabré, chose facile à des muscles comme les siens,\r\n-saisit à poigne-main la maîtresse-tringle, et considéra Javert. Javert\r\n-recula vers la porte.\r\n-\r\n-Jean Valjean, sa barre de fer au poing, marcha lentement vers le lit de\r\n-Fantine. Quand il y fut parvenu, il se retourna, et dit à Javert d'une\r\n-voix qu'on entendait à peine:\r\n-\r\n---Je ne vous conseille pas de me déranger en ce moment.\r\n-\r\n-Ce qui est certain, c'est que Javert tremblait.\r\n-\r\n-Il eut l'idée d'aller appeler la garde, mais Jean Valjean pouvait\r\n-profiter de cette minute pour s'évader. Il resta donc, saisit sa canne\r\n-par le petit bout, et s'adossa au chambranle de la porte sans quitter du\r\n-regard Jean Valjean.\r\n-\r\n-Jean Valjean posa son coude sur la pomme du chevet du lit et son front\r\n-sur sa main, et se mit à contempler Fantine immobile et étendue. Il\r\n-demeura ainsi, absorbé, muet, et ne songeant évidemment plus à aucune\r\n-chose de cette vie. Il n'y avait plus rien sur son visage et dans son\r\n-attitude qu'une inexprimable pitié. Après quelques instants de cette\r\n-rêverie, il se pencha vers Fantine et lui parla à voix basse.\r\n-\r\n-Que lui dit-il? Que pouvait dire cet homme qui était réprouvé à cette\r\n-femme qui était morte? Qu'était-ce que ces paroles? Personne sur la\r\n-terre ne les a entendues. La morte les entendit-elle? Il y a des\r\n-illusions touchantes qui sont peut-être des réalités sublimes. Ce qui\r\n-est hors de doute, c'est que la soeur Simplice, unique témoin de la\r\n-chose qui se passait, a souvent raconté qu'au moment où Jean Valjean\r\n-parla à l'oreille de Fantine, elle vit distinctement poindre un\r\n-ineffable sourire sur ces lèvres pâles et dans ces prunelles vagues,\r\n-pleines de l'étonnement du tombeau.\r\n-\r\n-Jean Valjean prit dans ses deux mains la tête de Fantine et l'arrangea\r\n-sur l'oreiller comme une mère eût fait pour son enfant, il lui rattacha\r\n-le cordon de sa chemise et rentra ses cheveux sous son bonnet. Cela\r\n-fait, il lui ferma les yeux.\r\n-\r\n-La face de Fantine en cet instant semblait étrangement éclairée.\r\n-\r\n-La mort, c'est l'entrée dans la grande lueur.\r\n-\r\n-La main de Fantine pendait hors du lit. Jean Valjean s'agenouilla devant\r\n-cette main, la souleva doucement, et la baisa.\r\n-\r\n-Puis il se redressa, et, se tournant vers Javert:\r\n-\r\n---Maintenant, dit-il, je suis à vous.\r\n-\r\n-\r\n-\r\n-\r\n-Chapitre V\r\n-\r\n-Tombeau convenable\r\n-\r\n-\r\n-Javert déposa Jean Valjean à la prison de la ville.\r\n-\r\n-L'arrestation de M. Madeleine produisit à Montreuil-sur-mer une\r\n-sensation, ou pour mieux dire une commotion extraordinaire. Nous sommes\r\n-triste de ne pouvoir dissimuler que sur ce seul mot: _c'était un\r\n-galérien_, tout le monde à peu près l'abandonna. En moins de deux heures\r\n-tout le bien qu'il avait fait fut oublié, et ce ne fut plus «qu'un\r\n-galérien». Il est juste de dire qu'on ne connaissait pas encore les\r\n-détails de l'événement d'Arras. Toute la journée on entendait dans\r\n-toutes les parties de la ville des conversations comme celle-ci:\r\n-\r\n---Vous ne savez pas? c'était un forçat libéré! Qui ça?--Le maire.--Bah!\r\n-M. Madeleine?--Oui. Vraiment?--Il ne s'appelait pas Madeleine, il a un\r\n-affreux nom, Béjean, Bojean, Boujean.--Ah, mon Dieu!--Il est\r\n-arrêté.--Arrêté!--En prison à la prison de la ville, en attendant qu'on\r\n-le transfère.--Qu'on le transfère! On va le transférer! Où va-t-on le\r\n-transférer?--Il va passer aux assises pour un vol de grand chemin qu'il\r\n-a fait autrefois.--Eh bien! je m'en doutais. Cet homme était trop bon,\r\n-trop parfait, trop confit. Il refusait la croix, il donnait des sous à \r\n-tous les petits drôles qu'il rencontrait. J'ai toujours pensé qu'il y\r\n-avait là -dessous quelque mauvaise histoire.\r\n-\r\n-«Les salons» surtout abondèrent dans ce sens.\r\n-\r\n-Une vieille dame, abonnée au _Drapeau blanc_, fit cette réflexion dont\r\n-il est presque impossible de sonder la profondeur:\r\n-\r\n---Je n'en suis pas fâchée. Cela apprendra aux buonapartistes!\r\n-\r\n-C'est ainsi que ce fantôme qui s'était appelé M. Madeleine se dissipa à \r\n-Montreuil-sur-mer. Trois ou quatre personnes seulement dans toute la\r\n-ville restèrent fidèles à cette mémoire. La vieille portière qui l'avait\r\n-servi fut du nombre. Le soir de ce même jour, cette digne vieille était\r\n-assise dans sa loge, encore tout effarée et réfléchissant tristement. La\r\n-fabrique avait été fermée toute la journée, la porte cochère était\r\n-verrouillée, la rue était déserte. Il n'y avait dans la maison que deux\r\n-religieuses, soeur Perpétue et soeur Simplice, qui veillaient près du\r\n-corps de Fantine.\r\n-\r\n-Vers l'heure où M. Madeleine avait coutume de rentrer, la brave portière\r\n-se leva machinalement, prit la clef de la chambre de M. Madeleine dans\r\n-un tiroir et le bougeoir dont il se servait tous les soirs pour monter\r\n-chez lui, puis elle accrocha la clef au clou où il la prenait\r\n-d'habitude, et plaça le bougeoir à côté, comme si elle l'attendait.\r\n-Ensuite elle se rassit sur sa chaise et se remit à songer. La pauvre\r\n-bonne vieille avait fait tout cela sans en avoir conscience.\r\n-\r\n-Ce ne fut qu'au bout de plus de deux heures qu'elle sortit de sa rêverie\r\n-et s'écria: «Tiens! mon bon Dieu Jésus! moi qui ai mis sa clef au clou!»\r\n-\r\n-En ce moment la vitre de la loge s'ouvrit, une main passa par\r\n-l'ouverture, saisit la clef et le bougeoir et alluma la bougie à la\r\n-chandelle qui brûlait.\r\n-\r\n-La portière leva les yeux et resta béante, avec un cri dans le gosier\r\n-qu'elle retint. Elle connaissait cette main, ce bras, cette manche de\r\n-redingote.\r\n-\r\n-C'était M. Madeleine.\r\n-\r\n-Elle fut quelques secondes avant de pouvoir parler, saisie, comme elle\r\n-le disait elle-même plus tard en racontant son aventure.\r\n-\r\n---Mon Dieu, monsieur le maire, s'écria-t-elle enfin, je vous croyais....\r\n-\r\n-Elle s'arrêta, la fin de sa phrase eût manqué de respect au\r\n-commencement. Jean Valjean était toujours pour elle monsieur le maire.\r\n-\r\n-Il acheva sa pensée.\r\n-\r\n---En prison, dit-il. J'y étais. J'ai brisé un barreau d'une fenêtre, je\r\n-me suis laissé tomber du haut d'un toit, et me voici. Je monte à ma\r\n-chambre, allez me chercher la soeur Simplice. Elle est sans doute près\r\n-de cette pauvre femme.\r\n-\r\n-La vieille obéit en toute hâte.\r\n-\r\n-Il ne lui fit aucune recommandation; il était bien sûr qu'elle le\r\n-garderait mieux qu'il ne se garderait lui-même.\r\n-\r\n-On n'a jamais su comment il avait réussi à pénétrer dans la cour sans\r\n-faire ouvrir la porte cochère. Il avait, et portait toujours sur lui, un\r\n-passe-partout qui ouvrait une petite porte latérale; mais on avait dû le\r\n-fouiller et lui prendre son passe-partout. Ce point n'a pas été\r\n-éclairci.\r\n-\r\n-Il monta l'escalier qui conduisait à sa chambre. Arrivé en haut, il\r\n-laissa son bougeoir sur les dernières marches de l'escalier, ouvrit sa\r\n-porte avec peu de bruit, et alla fermer à tâtons sa fenêtre et son\r\n-volet, puis il revint prendre sa bougie et rentra dans sa chambre.\r\n-\r\n-La précaution était utile; on se souvient que sa fenêtre pouvait être\r\n-aperçue de la rue. Il jeta un coup d'oeil autour de lui, sur sa table,\r\n-sur sa chaise, sur son lit qui n'avait pas été défait depuis trois\r\n-jours. Il ne restait aucune trace du désordre de l'avant-dernière nuit.\r\n-La portière avait «fait la chambre». Seulement elle avait ramassé dans\r\n-les cendres et posé proprement sur la table les deux bouts du bâton\r\n-ferré et la pièce de quarante sous noircie par le feu.\r\n-\r\n-Il prit une feuille de papier sur laquelle il écrivit: _Voici les deux\r\n-bouts de mon bâton ferré et la pièce de quarante sous volée à \r\n-Petit-Gervais dont j'ai parlé à la cour d'assises_, et il posa sur cette\r\n-feuille la pièce d'argent et les deux morceaux de fer, de façon que ce\r\n-fût la première chose qu'on aperçût en entrant dans la chambre. Il tira\r\n-d'une armoire une vieille chemise à lui qu'il déchira. Cela fit quelques\r\n-morceaux de toile dans lesquels il emballa les deux flambeaux d'argent.\r\n-Du reste il n'avait ni hâte ni agitation, et, tout en emballant les\r\n-chandeliers de l'évêque, il mordait dans un morceau de pain noir. Il est\r\n-probable que c'était le pain de la prison qu'il avait emporté en\r\n-s'évadant.\r\n-\r\n-Ceci a été constaté par les miettes de pain qui furent trouvées sur le\r\n-carreau de la chambre, lorsque la justice plus tard fit une\r\n-perquisition.\r\n-\r\n-On frappa deux petits coups à la porte.\r\n-\r\n---Entrez, dit-il.\r\n-\r\n-C'était la soeur Simplice.\r\n-\r\n-Elle était pâle, elle avait les yeux rouges, la chandelle qu'elle tenait\r\n-vacillait dans sa main. Les violences de la destinée ont cela de\r\n-particulier que, si perfectionnés ou si refroidis que nous soyons, elles\r\n-nous tirent du fond des entrailles la nature humaine et la forcent de\r\n-reparaître au dehors. Dans les émotions de cette journée, la religieuse\r\n-était redevenue femme. Elle avait pleuré, et elle tremblait.\r\n-\r\n-Jean Valjean venait d'écrire quelques lignes sur un papier qu'il tendit\r\n-à la religieuse en disant:\r\n-\r\n---Ma soeur, vous remettrez ceci à monsieur le curé.\r\n-\r\n-Le papier était déplié. Elle y jeta les yeux.\r\n-\r\n---Vous pouvez lire, dit-il.\r\n-\r\n-Elle lut.--«Je prie monsieur le curé de veiller sur tout ce que je\r\n-laisse ici. Il voudra bien payer là -dessus les frais de mon procès et\r\n-l'enterrement de la femme qui est morte aujourd'hui. Le reste sera aux\r\n-pauvres.»\r\n-\r\n-La soeur voulut parler, mais elle put à peine balbutier quelques sons\r\n-inarticulés. Elle parvint cependant à dire:\r\n-\r\n---Est-ce que monsieur le maire ne désire pas revoir une dernière fois\r\n-cette pauvre malheureuse?\r\n-\r\n---Non, dit-il, on est à ma poursuite, on n'aurait qu'à m'arrêter dans sa\r\n-chambre, cela la troublerait.\r\n-\r\n-Il achevait à peine qu'un grand bruit se fit dans l'escalier. Ils\r\n-entendirent un tumulte de pas qui montaient, et la vieille portière qui\r\n-disait de sa voix la plus haute et la plus perçante:\r\n-\r\n---Mon bon monsieur, je vous jure le bon Dieu qu'il n'est entré personne\r\n-ici de toute la journée ni de toute la soirée, que même je n'ai pas\r\n-quitté ma porte!\r\n-\r\n-Un homme répondit:\r\n-\r\n---Cependant il y a de la lumière dans cette chambre.\r\n-\r\n-Ils reconnurent la voix de Javert.\r\n-\r\n-La chambre était disposée de façon que la porte en s'ouvrant masquait\r\n-l'angle du mur à droite. Jean Valjean souffla la bougie et se mit dans\r\n-cet angle.\r\n-\r\n-La soeur Simplice tomba à genoux près de la table.\r\n-\r\n-La porte s'ouvrit.\r\n-\r\n-Javert entra.\r\n-\r\n-On entendait le chuchotement de plusieurs hommes et les protestations de\r\n-la portière dans le corridor.\r\n-\r\n-La religieuse ne leva pas les yeux. Elle priait.\r\n-\r\n-La chandelle était sur la cheminée et ne donnait que peu de clarté.\r\n-\r\n-Javert aperçut la soeur et s'arrêta interdit.\r\n-\r\n-On se rappelle que le fond même de Javert, son élément, son milieu\r\n-respirable, c'était la vénération de toute autorité. Il était tout d'une\r\n-pièce et n'admettait ni objection, ni restriction. Pour lui, bien\r\n-entendu, l'autorité ecclésiastique était la première de toutes. Il était\r\n-religieux, superficiel et correct sur ce point comme sur tous. À ses\r\n-yeux un prêtre était un esprit qui ne se trompe pas, une religieuse\r\n-était une créature qui ne pèche pas. C'étaient des âmes murées à ce\r\n-monde avec une seule porte qui ne s'ouvrait jamais que pour laisser\r\n-sortir la vérité.\r\n-\r\n-En apercevant la soeur, son premier mouvement fut de se retirer.\r\n-\r\n-Cependant il y avait aussi un autre devoir qui le tenait, et qui le\r\n-poussait impérieusement en sens inverse. Son second mouvement fut de\r\n-rester, et de hasarder au moins une question.\r\n-\r\n-C'était cette soeur Simplice qui n'avait menti de sa vie. Javert le\r\n-savait, et la vénérait particulièrement à cause de cela.\r\n-\r\n---Ma soeur, dit-il, êtes-vous seule dans cette chambre?\r\n-\r\n-Il y eut un moment affreux pendant lequel la pauvre portière se sentit\r\n-défaillir.\r\n-\r\n-La soeur leva les yeux et répondit:\r\n-\r\n---Oui.\r\n-\r\n---Ainsi, reprit Javert, excusez-moi si j'insiste, c'est mon devoir, vous\r\n-n'avez pas vu ce soir une personne, un homme. Il s'est évadé, nous le\r\n-cherchons, ce nommé Jean Valjean, vous ne l'avez pas vu?\r\n-\r\n-La soeur répondit:\r\n-\r\n---Non.\r\n-\r\n-Elle mentit. Elle mentit deux fois de suite, coup sur coup, sans\r\n-hésiter, rapidement, comme on se dévoue.\r\n-\r\n---Pardon, dit Javert, et il se retira en saluant profondément.\r\n-\r\n-Ô sainte fille! vous n'êtes plus de ce monde depuis beaucoup d'années;\r\n-vous avez rejoint dans la lumière vos soeurs les vierges et vos frères\r\n-les anges; que ce mensonge vous soit compté dans le paradis!\r\n-\r\n-L'affirmation de la soeur fut pour Javert quelque chose de si décisif\r\n-qu'il ne remarqua même pas la singularité de cette bougie qu'on venait\r\n-de souffler et qui fumait sur la table.\r\n-\r\n-Une heure après, un homme, marchant à travers les arbres et les brumes,\r\n-s'éloignait rapidement de Montreuil-sur-mer dans la direction de Paris.\r\n-Cet homme était Jean Valjean. Il a été établi, par le témoignage de deux\r\n-ou trois rouliers qui l'avaient rencontré, qu'il portait un paquet et\r\n-qu'il était vêtu d'une blouse. Où avait-il pris cette blouse? On ne l'a\r\n-jamais su. Cependant un vieux ouvrier était mort quelques jours\r\n-auparavant à l'infirmerie de la fabrique, ne laissant que sa blouse.\r\n-C'était peut-être celle-là .\r\n-\r\n-Un dernier mot sur Fantine.\r\n-\r\n-Nous avons tous une mère, la terre. On rendit Fantine à cette mère.\r\n-\r\n-Le curé crut bien faire, et fit bien peut-être, en réservant, sur ce que\r\n-Jean Valjean avait laissé, le plus d'argent possible aux pauvres. Après\r\n-tout, de qui s'agissait-il? d'un forçat et d'une fille publique. C'est\r\n-pourquoi il simplifia l'enterrement de Fantine, et le réduisit à ce\r\n-strict nécessaire qu'on appelle la fosse commune.\r\n-\r\n-Fantine fut donc enterrée dans ce coin gratis du cimetière qui est à \r\n-tous et à personne, et où l'on perd les pauvres. Heureusement Dieu sait\r\n-où retrouver l'âme. On coucha Fantine dans les ténèbres parmi les\r\n-premiers os venus; elle subit la promiscuité des cendres. Elle fut jetée\r\n-à la fosse publique. Sa tombe ressembla à son lit.\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-End of the Project Gutenberg EBook of Les misérables Tome I, by Victor Hugo\r\n-\r\n-*** END OF THIS PROJECT GUTENBERG EBOOK LES MISÉRABLES TOME I ***\r\n-\r\n-***** This file should be named 17489-8.txt or 17489-8.zip *****\r\n-This and all associated files of various formats will be found in:\r\n- http://www.gutenberg.org/1/7/4/8/17489/\r\n-\r\n-Produced by www.ebooksgratuits.com and Chuck Greif\r\n-\r\n-Updated editions will replace the previous one--the old editions\r\n-will be renamed.\r\n-\r\n-Creating the works from public domain print editions means that no\r\n-one owns a United States copyright in these works, so the Foundation\r\n-(and you!) can copy and distribute it in the United States without\r\n-permission and without paying copyright royalties. Special rules,\r\n-set forth in the General Terms of Use part of this license, apply to\r\n-copying and distributing Project Gutenberg-tm electronic works to\r\n-protect the PROJECT GUTENBERG-tm concept and trademark. Project\r\n-Gutenberg is a registered trademark, and may not be used if you\r\n-charge for the eBooks, unless you receive specific permission. If you\r\n-do not charge anything for copies of this eBook, complying with the\r\n-rules is very easy. You may use this eBook for nearly any purpose\r\n-such as creation of derivative works, reports, performances and\r\n-research. They may be modified and printed and given away--you may do\r\n-practically ANYTHING with public domain eBooks. Redistribution is\r\n-subject to the trademark license, especially commercial\r\n-redistribution.\r\n-\r\n-\r\n-\r\n-*** START: FULL LICENSE ***\r\n-\r\n-THE FULL PROJECT GUTENBERG LICENSE\r\n-PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK\r\n-\r\n-To protect the Project Gutenberg-tm mission of promoting the free\r\n-distribution of electronic works, by using or distributing this work\r\n-(or any other work associated in any way with the phrase \u0022Project\r\n-Gutenberg\u0022), you agree to comply with all the terms of the Full Project\r\n-Gutenberg-tm License (available with this file or online at\r\n-http://gutenberg.org/license).\r\n-\r\n-\r\n-Section 1. General Terms of Use and Redistributing Project Gutenberg-tm\r\n-electronic works\r\n-\r\n-1.A. By reading or using any part of this Project Gutenberg-tm\r\n-electronic work, you indicate that you have read, understand, agree to\r\n-and accept all the terms of this license and intellectual property\r\n-(trademark/copyright) agreement. If you do not agree to abide by all\r\n-the terms of this agreement, you must cease using and return or destroy\r\n-all copies of Project Gutenberg-tm electronic works in your possession.\r\n-If you paid a fee for obtaining a copy of or access to a Project\r\n-Gutenberg-tm electronic work and you do not agree to be bound by the\r\n-terms of this agreement, you may obtain a refund from the person or\r\n-entity to whom you paid the fee as set forth in paragraph 1.E.8.\r\n-\r\n-1.B. \u0022Project Gutenberg\u0022 is a registered trademark. It may only be\r\n-used on or associated in any way with an electronic work by people who\r\n-agree to be bound by the terms of this agreement. There are a few\r\n-things that you can do with most Project Gutenberg-tm electronic works\r\n-even without complying with the full terms of this agreement. See\r\n-paragraph 1.C below. There are a lot of things you can do with Project\r\n-Gutenberg-tm electronic works if you follow the terms of this agreement\r\n-and help preserve free future access to Project Gutenberg-tm electronic\r\n-works. See paragraph 1.E below.\r\n-\r\n-1.C. The Project Gutenberg Literary Archive Foundation (\u0022the Foundation\u0022\r\n-or PGLAF), owns a compilation copyright in the collection of Project\r\n-Gutenberg-tm electronic works. Nearly all the individual works in the\r\n-collection are in the public domain in the United States. If an\r\n-individual work is in the public domain in the United States and you are\r\n-located in the United States, we do not claim a right to prevent you from\r\n-copying, distributing, performing, displaying or creating derivative\r\n-works based on the work as long as all references to Project Gutenberg\r\n-are removed. Of course, we hope that you will support the Project\r\n-Gutenberg-tm mission of promoting free access to electronic works by\r\n-freely sharing Project Gutenberg-tm works in compliance with the terms of\r\n-this agreement for keeping the Project Gutenberg-tm name associated with\r\n-the work. You can easily comply with the terms of this agreement by\r\n-keeping this work in the same format with its attached full Project\r\n-Gutenberg-tm License when you share it without charge with others.\r\n-\r\n-1.D. The copyright laws of the place where you are located also govern\r\n-what you can do with this work. Copyright laws in most countries are in\r\n-a constant state of change. If you are outside the United States, check\r\n-the laws of your country in addition to the terms of this agreement\r\n-before downloading, copying, displaying, performing, distributing or\r\n-creating derivative works based on this work or any other Project\r\n-Gutenberg-tm work. The Foundation makes no representations concerning\r\n-the copyright status of any work in any country outside the United\r\n-States.\r\n-\r\n-1.E. Unless you have removed all references to Project Gutenberg:\r\n-\r\n-1.E.1. The following sentence, with active links to, or other immediate\r\n-access to, the full Project Gutenberg-tm License must appear prominently\r\n-whenever any copy of a Project Gutenberg-tm work (any work on which the\r\n-phrase \u0022Project Gutenberg\u0022 appears, or with which the phrase \u0022Project\r\n-Gutenberg\u0022 is associated) is accessed, displayed, performed, viewed,\r\n-copied or distributed:\r\n-\r\n-This eBook is for the use of anyone anywhere at no cost and with\r\n-almost no restrictions whatsoever. You may copy it, give it away or\r\n-re-use it under the terms of the Project Gutenberg License included\r\n-with this eBook or online at www.gutenberg.org\r\n-\r\n-1.E.2. If an individual Project Gutenberg-tm electronic work is derived\r\n-from the public domain (does not contain a notice indicating that it is\r\n-posted with permission of the copyright holder), the work can be copied\r\n-and distributed to anyone in the United States without paying any fees\r\n-or charges. If you are redistributing or providing access to a work\r\n-with the phrase \u0022Project Gutenberg\u0022 associated with or appearing on the\r\n-work, you must comply either with the requirements of paragraphs 1.E.1\r\n-through 1.E.7 or obtain permission for the use of the work and the\r\n-Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or\r\n-1.E.9.\r\n-\r\n-1.E.3. If an individual Project Gutenberg-tm electronic work is posted\r\n-with the permission of the copyright holder, your use and distribution\r\n-must comply with both paragraphs 1.E.1 through 1.E.7 and any additional\r\n-terms imposed by the copyright holder. Additional terms will be linked\r\n-to the Project Gutenberg-tm License for all works posted with the\r\n-permission of the copyright holder found at the beginning of this work.\r\n-\r\n-1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm\r\n-License terms from this work, or any files containing a part of this\r\n-work or any other work associated with Project Gutenberg-tm.\r\n-\r\n-1.E.5. Do not copy, display, perform, distribute or redistribute this\r\n-electronic work, or any part of this electronic work, without\r\n-prominently displaying the sentence set forth in paragraph 1.E.1 with\r\n-active links or immediate access to the full terms of the Project\r\n-Gutenberg-tm License.\r\n-\r\n-1.E.6. You may convert to and distribute this work in any binary,\r\n-compressed, marked up, nonproprietary or proprietary form, including any\r\n-word processing or hypertext form. However, if you provide access to or\r\n-distribute copies of a Project Gutenberg-tm work in a format other than\r\n-\u0022Plain Vanilla ASCII\u0022 or other format used in the official version\r\n-posted on the official Project Gutenberg-tm web site (www.gutenberg.org),\r\n-you must, at no additional cost, fee or expense to the user, provide a\r\n-copy, a means of exporting a copy, or a means of obtaining a copy upon\r\n-request, of the work in its original \u0022Plain Vanilla ASCII\u0022 or other\r\n-form. Any alternate format must include the full Project Gutenberg-tm\r\n-License as specified in paragraph 1.E.1.\r\n-\r\n-1.E.7. Do not charge a fee for access to, viewing, displaying,\r\n-performing, copying or distributing any Project Gutenberg-tm works\r\n-unless you comply with paragraph 1.E.8 or 1.E.9.\r\n-\r\n-1.E.8. You may charge a reasonable fee for copies of or providing\r\n-access to or distributing Project Gutenberg-tm electronic works provided\r\n-that\r\n-\r\n-- You pay a royalty fee of 20% of the gross profits you derive from\r\n- the use of Project Gutenberg-tm works calculated using the method\r\n- you already use to calculate your applicable taxes. The fee is\r\n- owed to the owner of the Project Gutenberg-tm trademark, but he\r\n- has agreed to donate royalties under this paragraph to the\r\n- Project Gutenberg Literary Archive Foundation. Royalty payments\r\n- must be paid within 60 days following each date on which you\r\n- prepare (or are legally required to prepare) your periodic tax\r\n- returns. Royalty payments should be clearly marked as such and\r\n- sent to the Project Gutenberg Literary Archive Foundation at the\r\n- address specified in Section 4, \u0022Information about donations to\r\n- the Project Gutenberg Literary Archive Foundation.\u0022\r\n-\r\n-- You provide a full refund of any money paid by a user who notifies\r\n- you in writing (or by e-mail) within 30 days of receipt that s/he\r\n- does not agree to the terms of the full Project Gutenberg-tm\r\n- License. You must require such a user to return or\r\n- destroy all copies of the works possessed in a physical medium\r\n- and discontinue all use of and all access to other copies of\r\n- Project Gutenberg-tm works.\r\n-\r\n-- You provide, in accordance with paragraph 1.F.3, a full refund of any\r\n- money paid for a work or a replacement copy, if a defect in the\r\n- electronic work is discovered and reported to you within 90 days\r\n- of receipt of the work.\r\n-\r\n-- You comply with all other terms of this agreement for free\r\n- distribution of Project Gutenberg-tm works.\r\n-\r\n-1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm\r\n-electronic work or group of works on different terms than are set\r\n-forth in this agreement, you must obtain permission in writing from\r\n-both the Project Gutenberg Literary Archive Foundation and Michael\r\n-Hart, the owner of the Project Gutenberg-tm trademark. Contact the\r\n-Foundation as set forth in Section 3 below.\r\n-\r\n-1.F.\r\n-\r\n-1.F.1. Project Gutenberg volunteers and employees expend considerable\r\n-effort to identify, do copyright research on, transcribe and proofread\r\n-public domain works in creating the Project Gutenberg-tm\r\n-collection. Despite these efforts, Project Gutenberg-tm electronic\r\n-works, and the medium on which they may be stored, may contain\r\n-\u0022Defects,\u0022 such as, but not limited to, incomplete, inaccurate or\r\n-corrupt data, transcription errors, a copyright or other intellectual\r\n-property infringement, a defective or damaged disk or other medium, a\r\n-computer virus, or computer codes that damage or cannot be read by\r\n-your equipment.\r\n-\r\n-1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the \u0022Right\r\n-of Replacement or Refund\u0022 described in paragraph 1.F.3, the Project\r\n-Gutenberg Literary Archive Foundation, the owner of the Project\r\n-Gutenberg-tm trademark, and any other party distributing a Project\r\n-Gutenberg-tm electronic work under this agreement, disclaim all\r\n-liability to you for damages, costs and expenses, including legal\r\n-fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT\r\n-LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE\r\n-PROVIDED IN PARAGRAPH F3. YOU AGREE THAT THE FOUNDATION, THE\r\n-TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE\r\n-LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR\r\n-INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH\r\n-DAMAGE.\r\n-\r\n-1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a\r\n-defect in this electronic work within 90 days of receiving it, you can\r\n-receive a refund of the money (if any) you paid for it by sending a\r\n-written explanation to the person you received the work from. If you\r\n-received the work on a physical medium, you must return the medium with\r\n-your written explanation. The person or entity that provided you with\r\n-the defective work may elect to provide a replacement copy in lieu of a\r\n-refund. If you received the work electronically, the person or entity\r\n-providing it to you may choose to give you a second opportunity to\r\n-receive the work electronically in lieu of a refund. If the second copy\r\n-is also defective, you may demand a refund in writing without further\r\n-opportunities to fix the problem.\r\n-\r\n-1.F.4. Except for the limited right of replacement or refund set forth\r\n-in paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO OTHER\r\n-WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\r\n-WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE.\r\n-\r\n-1.F.5. Some states do not allow disclaimers of certain implied\r\n-warranties or the exclusion or limitation of certain types of damages.\r\n-If any disclaimer or limitation set forth in this agreement violates the\r\n-law of the state applicable to this agreement, the agreement shall be\r\n-interpreted to make the maximum disclaimer or limitation permitted by\r\n-the applicable state law. The invalidity or unenforceability of any\r\n-provision of this agreement shall not void the remaining provisions.\r\n-\r\n-1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the\r\n-trademark owner, any agent or employee of the Foundation, anyone\r\n-providing copies of Project Gutenberg-tm electronic works in accordance\r\n-with this agreement, and any volunteers associated with the production,\r\n-promotion and distribution of Project Gutenberg-tm electronic works,\r\n-harmless from all liability, costs and expenses, including legal fees,\r\n-that arise directly or indirectly from any of the following which you do\r\n-or cause to occur: (a) distribution of this or any Project Gutenberg-tm\r\n-work, (b) alteration, modification, or additions or deletions to any\r\n-Project Gutenberg-tm work, and (c) any Defect you cause.\r\n-\r\n-\r\n-Section 2. Information about the Mission of Project Gutenberg-tm\r\n-\r\n-Project Gutenberg-tm is synonymous with the free distribution of\r\n-electronic works in formats readable by the widest variety of computers\r\n-including obsolete, old, middle-aged and new computers. It exists\r\n-because of the efforts of hundreds of volunteers and donations from\r\n-people in all walks of life.\r\n-\r\n-Volunteers and financial support to provide volunteers with the\r\n-assistance they need, is critical to reaching Project Gutenberg-tm's\r\n-goals and ensuring that the Project Gutenberg-tm collection will\r\n-remain freely available for generations to come. In 2001, the Project\r\n-Gutenberg Literary Archive Foundation was created to provide a secure\r\n-and permanent future for Project Gutenberg-tm and future generations.\r\n-To learn more about the Project Gutenberg Literary Archive Foundation\r\n-and how your efforts and donations can help, see Sections 3 and 4\r\n-and the Foundation web page at http://www.pglaf.org.\r\n-\r\n-\r\n-Section 3. Information about the Project Gutenberg Literary Archive\r\n-Foundation\r\n-\r\n-The Project Gutenberg Literary Archive Foundation is a non profit\r\n-501(c)(3) educational corporation organized under the laws of the\r\n-state of Mississippi and granted tax exempt status by the Internal\r\n-Revenue Service. The Foundation's EIN or federal tax identification\r\n-number is 64-6221541. Its 501(c)(3) letter is posted at\r\n-http://pglaf.org/fundraising. Contributions to the Project Gutenberg\r\n-Literary Archive Foundation are tax deductible to the full extent\r\n-permitted by U.S. federal laws and your state's laws.\r\n-\r\n-The Foundation's principal office is located at 4557 Melan Dr. S.\r\n-Fairbanks, AK, 99712., but its volunteers and employees are scattered\r\n-throughout numerous locations. Its business office is located at\r\n-809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email\r\n-business@pglaf.org. Email contact links and up to date contact\r\n-information can be found at the Foundation's web site and official\r\n-page at http://pglaf.org\r\n-\r\n-For additional contact information:\r\n- Dr. Gregory B. Newby\r\n- Chief Executive and Director\r\n- gbnewby@pglaf.org\r\n-\r\n-Section 4. Information about Donations to the Project Gutenberg\r\n-Literary Archive Foundation\r\n-\r\n-Project Gutenberg-tm depends upon and cannot survive without wide\r\n-spread public support and donations to carry out its mission of\r\n-increasing the number of public domain and licensed works that can be\r\n-freely distributed in machine readable form accessible by the widest\r\n-array of equipment including outdated equipment. Many small donations\r\n-($1 to $5,000) are particularly important to maintaining tax exempt\r\n-status with the IRS.\r\n-\r\n-The Foundation is committed to complying with the laws regulating\r\n-charities and charitable donations in all 50 states of the United\r\n-States. Compliance requirements are not uniform and it takes a\r\n-considerable effort, much paperwork and many fees to meet and keep up\r\n-with these requirements. We do not solicit donations in locations\r\n-where we have not received written confirmation of compliance. To\r\n-SEND DONATIONS or determine the status of compliance for any\r\n-particular state visit http://pglaf.org\r\n-\r\n-While we cannot and do not solicit contributions from states where we\r\n-have not met the solicitation requirements, we know of no prohibition\r\n-against accepting unsolicited donations from donors in such states who\r\n-approach us with offers to donate.\r\n-\r\n-International donations are gratefully accepted, but we cannot make\r\n-any statements concerning tax treatment of donations received from\r\n-outside the United States. U.S. laws alone swamp our small staff.\r\n-\r\n-Please check the Project Gutenberg Web pages for current donation\r\n-methods and addresses. Donations are accepted in a number of other\r\n-ways including checks, online payments and credit card\r\n-donations. To donate, please visit: http://pglaf.org/donate\r\n-\r\n-\r\n-Section 5. General Information About Project Gutenberg-tm electronic\r\n-works.\r\n-\r\n-Professor Michael S. Hart is the originator of the Project Gutenberg-tm\r\n-concept of a library of electronic works that could be freely shared\r\n-with anyone. For thirty years, he produced and distributed Project\r\n-Gutenberg-tm eBooks with only a loose network of volunteer support.\r\n-\r\n-Project Gutenberg-tm eBooks are often created from several printed\r\n-editions, all of which are confirmed as Public Domain in the U.S.\r\n-unless a copyright notice is included. Thus, we do not necessarily\r\n-keep eBooks in compliance with any particular paper edition.\r\n-\r\n-Most people start at our Web site which has the main PG search facility:\r\n-\r\n- http://www.gutenberg.org\r\n-\r\n-This Web site includes information about Project Gutenberg-tm,\r\n-including how to make donations to the Project Gutenberg Literary\r\n-Archive Foundation, how to help produce our new eBooks, and how to\r\n-subscribe to our email newsletter to hear about new eBooks.\r\n-\r\n-*** END: FULL LICENSE ***\r\ndiff --git a/minimal-examples/api-tests/api-test-fts/main.c b/minimal-examples/api-tests/api-test-fts/main.c\ndeleted file mode 100644\nindex d21a19b..0000000\n--- a/minimal-examples/api-tests/api-test-fts/main.c\n+++ /dev/null\n@@ -1,230 +0,0 @@\n-/*\n- * lws-api-test-fts - lws full-text search api test\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#if defined(LWS_HAS_GETOPT_LONG) || defined(WIN32)\n-#include \u003cgetopt.h\u003e\n-#endif\n-#include \u003cfcntl.h\u003e\n-\n-#if defined(LWS_HAS_GETOPT_LONG) || defined(WIN32)\n-static struct option options[] \u003d {\n-\t{ \u0022help\u0022,\tno_argument,\t\tNULL, 'h' },\n-\t{ \u0022createindex\u0022, no_argument,\t\tNULL, 'c' },\n-\t{ \u0022index\u0022,\trequired_argument,\tNULL, 'i' },\n-\t{ \u0022debug\u0022,\trequired_argument,\tNULL, 'd' },\n-\t{ \u0022file\u0022,\trequired_argument,\tNULL, 'f' },\n-\t{ \u0022lines\u0022,\trequired_argument,\tNULL, 'l' },\n-\t{ NULL, 0, 0, 0 }\n-};\n-#endif\n-\n-static const char *index_filepath \u003d \u0022/tmp/lws-fts-test-index\u0022;\n-static char filepath[256];\n-\n-int main(int argc, char **argv)\n-{\n-\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tint fd, fi, ft, createindex \u003d 0, flags \u003d LWSFTS_F_QUERY_AUTOCOMPLETE;\n-\tstruct lws_fts_search_params params;\n-\tstruct lws_fts_result *result;\n-\tstruct lws_fts_file *jtf;\n-\tstruct lws_fts *t;\n-\tchar buf[16384];\n-\n-\tdo {\n-#if defined(LWS_HAS_GETOPT_LONG) || defined(WIN32)\n-\t\tn \u003d getopt_long(argc, argv, \u0022hd:i:cfl\u0022, options, NULL);\n-#else\n- n \u003d getopt(argc, argv, \u0022hd:i:cfl\u0022);\n-#endif\n-\t\tif (n \u003c 0)\n-\t\t\tcontinue;\n-\t\tswitch (n) {\n-\t\tcase 'i':\n-\t\t\tstrncpy(filepath, optarg, sizeof(filepath) - 1);\n-\t\t\tfilepath[sizeof(filepath) - 1] \u003d '\u005c0';\n-\t\t\tindex_filepath \u003d filepath;\n-\t\t\tbreak;\n-\t\tcase 'd':\n-\t\t\tlogs \u003d atoi(optarg);\n-\t\t\tbreak;\n-\t\tcase 'c':\n-\t\t\tcreateindex \u003d 1;\n-\t\t\tbreak;\n-\t\tcase 'f':\n-\t\t\tflags \u0026\u003d ~LWSFTS_F_QUERY_AUTOCOMPLETE;\n-\t\t\tflags |\u003d LWSFTS_F_QUERY_FILES;\n-\t\t\tbreak;\n-\t\tcase 'l':\n-\t\t\tflags |\u003d LWSFTS_F_QUERY_FILES |\n-\t\t\t\t LWSFTS_F_QUERY_FILE_LINES;\n-\t\t\tbreak;\n-\t\tcase 'h':\n-\t\t\tfprintf(stderr,\n-\t\t\t\t\u0022Usage: %s [--createindex]\u0022\n-\t\t\t\t\t\u0022[--index\u003d\u003cindex filepath\u003e] \u0022\n-\t\t\t\t\t\u0022[-d \u003clog bitfield\u003e] file1 file2 \u005cn\u0022,\n-\t\t\t\t\targv[0]);\n-\t\t\texit(1);\n-\t\t}\n-\t} while (n \u003e\u003d 0);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: full-text search\u005cn\u0022);\n-\n-\tif (createindex) {\n-\n-\t\tlwsl_notice(\u0022Creating index\u005cn\u0022);\n-\n-\t\t/*\n-\t\t * create an index by shifting through argv and indexing each\n-\t\t * file given there into a single combined index\n-\t\t */\n-\n-\t\tft \u003d open(index_filepath, O_CREAT | O_WRONLY | O_TRUNC, 0600);\n-\t\tif (ft \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: can't open index %s\u005cn\u0022, __func__,\n-\t\t\t\t index_filepath);\n-\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t\tt \u003d lws_fts_create(ft);\n-\t\tif (!t) {\n-\t\t\tlwsl_err(\u0022%s: Unable to allocate trie\u005cn\u0022, __func__);\n-\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\twhile (optind \u003c argc) {\n-\n-\t\t\tfi \u003d lws_fts_file_index(t, argv[optind],\n-\t\t\t\t\t\t(int)strlen(argv[optind]), 1);\n-\t\t\tif (fi \u003c 0) {\n-\t\t\t\tlwsl_err(\u0022%s: Failed to get file idx for %s\u005cn\u0022,\n-\t\t\t\t\t __func__, argv[optind]);\n-\n-\t\t\t\tgoto bail1;\n-\t\t\t}\n-\n-\t\t\tfd \u003d open(argv[optind], O_RDONLY);\n-\t\t\tif (fd \u003c 0) {\n-\t\t\t\tlwsl_err(\u0022unable to open %s for read\u005cn\u0022,\n-\t\t\t\t\t\targv[optind]);\n-\t\t\t\tgoto bail;\n-\t\t\t}\n-\n-\t\t\tdo {\n-\t\t\t\tint n \u003d (int)read(fd, buf, sizeof(buf));\n-\n-\t\t\t\tif (n \u003c\u003d 0)\n-\t\t\t\t\tbreak;\n-\n-\t\t\t\tif (lws_fts_fill(t, (uint32_t)fi, buf, (size_t)n)) {\n-\t\t\t\t\tlwsl_err(\u0022%s: lws_fts_fill failed\u005cn\u0022,\n-\t\t\t\t\t\t __func__);\n-\t\t\t\t\tclose(fd);\n-\n-\t\t\t\t\tgoto bail;\n-\t\t\t\t}\n-\n-\t\t\t} while (1);\n-\n-\t\t\tclose(fd);\n-\t\t\toptind++;\n-\t\t}\n-\n-\t\tif (lws_fts_serialize(t)) {\n-\t\t\tlwsl_err(\u0022%s: serialize failed\u005cn\u0022, __func__);\n-\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t\tlws_fts_destroy(\u0026t);\n-\t\tclose(ft);\n-\n-\t\treturn 0;\n-\t}\n-\n-\t/*\n-\t * shift through argv searching for each token\n-\t */\n-\n-\tjtf \u003d lws_fts_open(index_filepath);\n-\tif (!jtf)\n-\t\tgoto bail;\n-\n-\twhile (optind \u003c argc) {\n-\n-\t\tstruct lws_fts_result_autocomplete *ac;\n-\t\tstruct lws_fts_result_filepath *fp;\n-\t\tuint32_t *l, n;\n-\n-\t\tmemset(\u0026params, 0, sizeof(params));\n-\n-\t\tparams.needle \u003d argv[optind];\n-\t\tparams.flags \u003d flags;\n-\t\tparams.max_autocomplete \u003d 20;\n-\t\tparams.max_files \u003d 20;\n-\n-\t\tresult \u003d lws_fts_search(jtf, \u0026params);\n-\n-\t\tif (!result) {\n-\t\t\tlwsl_err(\u0022%s: search failed\u005cn\u0022, __func__);\n-\t\t\tlws_fts_close(jtf);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t\tac \u003d result-\u003eautocomplete_head;\n-\t\tfp \u003d result-\u003efilepath_head;\n-\n-\t\tif (!ac)\n-\t\t\tlwsl_notice(\u0022%s: no autocomplete results\u005cn\u0022, __func__);\n-\n-\t\twhile (ac) {\n-\t\t\tlwsl_notice(\u0022%s: AC %s: %d agg hits\u005cn\u0022, __func__,\n-\t\t\t\t((char *)(ac + 1)), ac-\u003einstances);\n-\n-\t\t\tac \u003d ac-\u003enext;\n-\t\t}\n-\n-\t\tif (!fp)\n-\t\t\tlwsl_notice(\u0022%s: no filepath results\u005cn\u0022, __func__);\n-\n-\t\twhile (fp) {\n-\t\t\tlwsl_notice(\u0022%s: %s: (%d lines) %d hits \u005cn\u0022, __func__,\n-\t\t\t\t(((char *)(fp + 1)) + fp-\u003ematches_length),\n-\t\t\t\tfp-\u003elines_in_file, fp-\u003ematches);\n-\n-\t\t\tif (fp-\u003ematches_length) {\n-\t\t\t\tl \u003d (uint32_t *)(fp + 1);\n-\t\t\t\tn \u003d 0;\n-\t\t\t\twhile ((int)n++ \u003c fp-\u003ematches)\n-\t\t\t\t\tlwsl_notice(\u0022 %d\u005cn\u0022, *l++);\n-\t\t\t}\n-\t\t\tfp \u003d fp-\u003enext;\n-\t\t}\n-\n-\t\tlwsac_free(\u0026params.results_head);\n-\n-\t\toptind++;\n-\t}\n-\n-\tlws_fts_close(jtf);\n-\n-\treturn 0;\n-\n-bail1:\n-\tclose(ft);\n-bail:\n-\tlwsl_user(\u0022FAILED\u005cn\u0022);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-fts/the-picture-of-dorian-gray.txt b/minimal-examples/api-tests/api-test-fts/the-picture-of-dorian-gray.txt\ndeleted file mode 100644\nindex f4ffc49..0000000\n--- a/minimal-examples/api-tests/api-test-fts/the-picture-of-dorian-gray.txt\n+++ /dev/null\n@@ -1,8904 +0,0 @@\n-The Project Gutenberg EBook of The Picture of Dorian Gray, by Oscar Wilde\r\n-\r\n-This eBook is for the use of anyone anywhere at no cost and with\r\n-almost no restrictions whatsoever. You may copy it, give it away or\r\n-re-use it under the terms of the Project Gutenberg License included\r\n-with this eBook or online at www.gutenberg.net\r\n-\r\n-\r\n-Title: The Picture of Dorian Gray\r\n-\r\n-Author: Oscar Wilde\r\n-\r\n-Release Date: June 9, 2008 [EBook #174]\r\n-[This file last updated on July 2, 2011]\r\n-[This file last updated on July 23, 2014]\r\n-\r\n-\r\n-Language: English\r\n-\r\n-\r\n-*** START OF THIS PROJECT GUTENBERG EBOOK THE PICTURE OF DORIAN GRAY ***\r\n-\r\n-\r\n-\r\n-\r\n-Produced by Judith Boss. HTML version by Al Haines.\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-The Picture of Dorian Gray\r\n-\r\n-by\r\n-\r\n-Oscar Wilde\r\n-\r\n-\r\n-\r\n-\r\n-THE PREFACE\r\n-\r\n-The artist is the creator of beautiful things. To reveal art and\r\n-conceal the artist is art's aim. The critic is he who can translate\r\n-into another manner or a new material his impression of beautiful\r\n-things.\r\n-\r\n-The highest as the lowest form of criticism is a mode of autobiography.\r\n-Those who find ugly meanings in beautiful things are corrupt without\r\n-being charming. This is a fault.\r\n-\r\n-Those who find beautiful meanings in beautiful things are the\r\n-cultivated. For these there is hope. They are the elect to whom\r\n-beautiful things mean only beauty.\r\n-\r\n-There is no such thing as a moral or an immoral book. Books are well\r\n-written, or badly written. That is all.\r\n-\r\n-The nineteenth century dislike of realism is the rage of Caliban seeing\r\n-his own face in a glass.\r\n-\r\n-The nineteenth century dislike of romanticism is the rage of Caliban\r\n-not seeing his own face in a glass. The moral life of man forms part\r\n-of the subject-matter of the artist, but the morality of art consists\r\n-in the perfect use of an imperfect medium. No artist desires to prove\r\n-anything. Even things that are true can be proved. No artist has\r\n-ethical sympathies. An ethical sympathy in an artist is an\r\n-unpardonable mannerism of style. No artist is ever morbid. The artist\r\n-can express everything. Thought and language are to the artist\r\n-instruments of an art. Vice and virtue are to the artist materials for\r\n-an art. From the point of view of form, the type of all the arts is\r\n-the art of the musician. From the point of view of feeling, the\r\n-actor's craft is the type. All art is at once surface and symbol.\r\n-Those who go beneath the surface do so at their peril. Those who read\r\n-the symbol do so at their peril. It is the spectator, and not life,\r\n-that art really mirrors. Diversity of opinion about a work of art\r\n-shows that the work is new, complex, and vital. When critics disagree,\r\n-the artist is in accord with himself. We can forgive a man for making\r\n-a useful thing as long as he does not admire it. The only excuse for\r\n-making a useless thing is that one admires it intensely.\r\n-\r\n- All art is quite useless.\r\n-\r\n- OSCAR WILDE\r\n-\r\n-\r\n-\r\n-\r\n-CHAPTER 1\r\n-\r\n-The studio was filled with the rich odour of roses, and when the light\r\n-summer wind stirred amidst the trees of the garden, there came through\r\n-the open door the heavy scent of the lilac, or the more delicate\r\n-perfume of the pink-flowering thorn.\r\n-\r\n-From the corner of the divan of Persian saddle-bags on which he was\r\n-lying, smoking, as was his custom, innumerable cigarettes, Lord Henry\r\n-Wotton could just catch the gleam of the honey-sweet and honey-coloured\r\n-blossoms of a laburnum, whose tremulous branches seemed hardly able to\r\n-bear the burden of a beauty so flamelike as theirs; and now and then\r\n-the fantastic shadows of birds in flight flitted across the long\r\n-tussore-silk curtains that were stretched in front of the huge window,\r\n-producing a kind of momentary Japanese effect, and making him think of\r\n-those pallid, jade-faced painters of Tokyo who, through the medium of\r\n-an art that is necessarily immobile, seek to convey the sense of\r\n-swiftness and motion. The sullen murmur of the bees shouldering their\r\n-way through the long unmown grass, or circling with monotonous\r\n-insistence round the dusty gilt horns of the straggling woodbine,\r\n-seemed to make the stillness more oppressive. The dim roar of London\r\n-was like the bourdon note of a distant organ.\r\n-\r\n-In the centre of the room, clamped to an upright easel, stood the\r\n-full-length portrait of a young man of extraordinary personal beauty,\r\n-and in front of it, some little distance away, was sitting the artist\r\n-himself, Basil Hallward, whose sudden disappearance some years ago\r\n-caused, at the time, such public excitement and gave rise to so many\r\n-strange conjectures.\r\n-\r\n-As the painter looked at the gracious and comely form he had so\r\n-skilfully mirrored in his art, a smile of pleasure passed across his\r\n-face, and seemed about to linger there. But he suddenly started up,\r\n-and closing his eyes, placed his fingers upon the lids, as though he\r\n-sought to imprison within his brain some curious dream from which he\r\n-feared he might awake.\r\n-\r\n-\u0022It is your best work, Basil, the best thing you have ever done,\u0022 said\r\n-Lord Henry languidly. \u0022You must certainly send it next year to the\r\n-Grosvenor. The Academy is too large and too vulgar. Whenever I have\r\n-gone there, there have been either so many people that I have not been\r\n-able to see the pictures, which was dreadful, or so many pictures that\r\n-I have not been able to see the people, which was worse. The Grosvenor\r\n-is really the only place.\u0022\r\n-\r\n-\u0022I don't think I shall send it anywhere,\u0022 he answered, tossing his head\r\n-back in that odd way that used to make his friends laugh at him at\r\n-Oxford. \u0022No, I won't send it anywhere.\u0022\r\n-\r\n-Lord Henry elevated his eyebrows and looked at him in amazement through\r\n-the thin blue wreaths of smoke that curled up in such fanciful whorls\r\n-from his heavy, opium-tainted cigarette. \u0022Not send it anywhere? My\r\n-dear fellow, why? Have you any reason? What odd chaps you painters\r\n-are! You do anything in the world to gain a reputation. As soon as\r\n-you have one, you seem to want to throw it away. It is silly of you,\r\n-for there is only one thing in the world worse than being talked about,\r\n-and that is not being talked about. A portrait like this would set you\r\n-far above all the young men in England, and make the old men quite\r\n-jealous, if old men are ever capable of any emotion.\u0022\r\n-\r\n-\u0022I know you will laugh at me,\u0022 he replied, \u0022but I really can't exhibit\r\n-it. I have put too much of myself into it.\u0022\r\n-\r\n-Lord Henry stretched himself out on the divan and laughed.\r\n-\r\n-\u0022Yes, I knew you would; but it is quite true, all the same.\u0022\r\n-\r\n-\u0022Too much of yourself in it! Upon my word, Basil, I didn't know you\r\n-were so vain; and I really can't see any resemblance between you, with\r\n-your rugged strong face and your coal-black hair, and this young\r\n-Adonis, who looks as if he was made out of ivory and rose-leaves. Why,\r\n-my dear Basil, he is a Narcissus, and you--well, of course you have an\r\n-intellectual expression and all that. But beauty, real beauty, ends\r\n-where an intellectual expression begins. Intellect is in itself a mode\r\n-of exaggeration, and destroys the harmony of any face. The moment one\r\n-sits down to think, one becomes all nose, or all forehead, or something\r\n-horrid. Look at the successful men in any of the learned professions.\r\n-How perfectly hideous they are! Except, of course, in the Church. But\r\n-then in the Church they don't think. A bishop keeps on saying at the\r\n-age of eighty what he was told to say when he was a boy of eighteen,\r\n-and as a natural consequence he always looks absolutely delightful.\r\n-Your mysterious young friend, whose name you have never told me, but\r\n-whose picture really fascinates me, never thinks. I feel quite sure of\r\n-that. He is some brainless beautiful creature who should be always\r\n-here in winter when we have no flowers to look at, and always here in\r\n-summer when we want something to chill our intelligence. Don't flatter\r\n-yourself, Basil: you are not in the least like him.\u0022\r\n-\r\n-\u0022You don't understand me, Harry,\u0022 answered the artist. \u0022Of course I am\r\n-not like him. I know that perfectly well. Indeed, I should be sorry\r\n-to look like him. You shrug your shoulders? I am telling you the\r\n-truth. There is a fatality about all physical and intellectual\r\n-distinction, the sort of fatality that seems to dog through history the\r\n-faltering steps of kings. It is better not to be different from one's\r\n-fellows. The ugly and the stupid have the best of it in this world.\r\n-They can sit at their ease and gape at the play. If they know nothing\r\n-of victory, they are at least spared the knowledge of defeat. They\r\n-live as we all should live--undisturbed, indifferent, and without\r\n-disquiet. They neither bring ruin upon others, nor ever receive it\r\n-from alien hands. Your rank and wealth, Harry; my brains, such as they\r\n-are--my art, whatever it may be worth; Dorian Gray's good looks--we\r\n-shall all suffer for what the gods have given us, suffer terribly.\u0022\r\n-\r\n-\u0022Dorian Gray? Is that his name?\u0022 asked Lord Henry, walking across the\r\n-studio towards Basil Hallward.\r\n-\r\n-\u0022Yes, that is his name. I didn't intend to tell it to you.\u0022\r\n-\r\n-\u0022But why not?\u0022\r\n-\r\n-\u0022Oh, I can't explain. When I like people immensely, I never tell their\r\n-names to any one. It is like surrendering a part of them. I have\r\n-grown to love secrecy. It seems to be the one thing that can make\r\n-modern life mysterious or marvellous to us. The commonest thing is\r\n-delightful if one only hides it. When I leave town now I never tell my\r\n-people where I am going. If I did, I would lose all my pleasure. It\r\n-is a silly habit, I dare say, but somehow it seems to bring a great\r\n-deal of romance into one's life. I suppose you think me awfully\r\n-foolish about it?\u0022\r\n-\r\n-\u0022Not at all,\u0022 answered Lord Henry, \u0022not at all, my dear Basil. You\r\n-seem to forget that I am married, and the one charm of marriage is that\r\n-it makes a life of deception absolutely necessary for both parties. I\r\n-never know where my wife is, and my wife never knows what I am doing.\r\n-When we meet--we do meet occasionally, when we dine out together, or go\r\n-down to the Duke's--we tell each other the most absurd stories with the\r\n-most serious faces. My wife is very good at it--much better, in fact,\r\n-than I am. She never gets confused over her dates, and I always do.\r\n-But when she does find me out, she makes no row at all. I sometimes\r\n-wish she would; but she merely laughs at me.\u0022\r\n-\r\n-\u0022I hate the way you talk about your married life, Harry,\u0022 said Basil\r\n-Hallward, strolling towards the door that led into the garden. \u0022I\r\n-believe that you are really a very good husband, but that you are\r\n-thoroughly ashamed of your own virtues. You are an extraordinary\r\n-fellow. You never say a moral thing, and you never do a wrong thing.\r\n-Your cynicism is simply a pose.\u0022\r\n-\r\n-\u0022Being natural is simply a pose, and the most irritating pose I know,\u0022\r\n-cried Lord Henry, laughing; and the two young men went out into the\r\n-garden together and ensconced themselves on a long bamboo seat that\r\n-stood in the shade of a tall laurel bush. The sunlight slipped over\r\n-the polished leaves. In the grass, white daisies were tremulous.\r\n-\r\n-After a pause, Lord Henry pulled out his watch. \u0022I am afraid I must be\r\n-going, Basil,\u0022 he murmured, \u0022and before I go, I insist on your\r\n-answering a question I put to you some time ago.\u0022\r\n-\r\n-\u0022What is that?\u0022 said the painter, keeping his eyes fixed on the ground.\r\n-\r\n-\u0022You know quite well.\u0022\r\n-\r\n-\u0022I do not, Harry.\u0022\r\n-\r\n-\u0022Well, I will tell you what it is. I want you to explain to me why you\r\n-won't exhibit Dorian Gray's picture. I want the real reason.\u0022\r\n-\r\n-\u0022I told you the real reason.\u0022\r\n-\r\n-\u0022No, you did not. You said it was because there was too much of\r\n-yourself in it. Now, that is childish.\u0022\r\n-\r\n-\u0022Harry,\u0022 said Basil Hallward, looking him straight in the face, \u0022every\r\n-portrait that is painted with feeling is a portrait of the artist, not\r\n-of the sitter. The sitter is merely the accident, the occasion. It is\r\n-not he who is revealed by the painter; it is rather the painter who, on\r\n-the coloured canvas, reveals himself. The reason I will not exhibit\r\n-this picture is that I am afraid that I have shown in it the secret of\r\n-my own soul.\u0022\r\n-\r\n-Lord Henry laughed. \u0022And what is that?\u0022 he asked.\r\n-\r\n-\u0022I will tell you,\u0022 said Hallward; but an expression of perplexity came\r\n-over his face.\r\n-\r\n-\u0022I am all expectation, Basil,\u0022 continued his companion, glancing at him.\r\n-\r\n-\u0022Oh, there is really very little to tell, Harry,\u0022 answered the painter;\r\n-\u0022and I am afraid you will hardly understand it. Perhaps you will\r\n-hardly believe it.\u0022\r\n-\r\n-Lord Henry smiled, and leaning down, plucked a pink-petalled daisy from\r\n-the grass and examined it. \u0022I am quite sure I shall understand it,\u0022 he\r\n-replied, gazing intently at the little golden, white-feathered disk,\r\n-\u0022and as for believing things, I can believe anything, provided that it\r\n-is quite incredible.\u0022\r\n-\r\n-The wind shook some blossoms from the trees, and the heavy\r\n-lilac-blooms, with their clustering stars, moved to and fro in the\r\n-languid air. A grasshopper began to chirrup by the wall, and like a\r\n-blue thread a long thin dragon-fly floated past on its brown gauze\r\n-wings. Lord Henry felt as if he could hear Basil Hallward's heart\r\n-beating, and wondered what was coming.\r\n-\r\n-\u0022The story is simply this,\u0022 said the painter after some time. \u0022Two\r\n-months ago I went to a crush at Lady Brandon's. You know we poor\r\n-artists have to show ourselves in society from time to time, just to\r\n-remind the public that we are not savages. With an evening coat and a\r\n-white tie, as you told me once, anybody, even a stock-broker, can gain\r\n-a reputation for being civilized. Well, after I had been in the room\r\n-about ten minutes, talking to huge overdressed dowagers and tedious\r\n-academicians, I suddenly became conscious that some one was looking at\r\n-me. I turned half-way round and saw Dorian Gray for the first time.\r\n-When our eyes met, I felt that I was growing pale. A curious sensation\r\n-of terror came over me. I knew that I had come face to face with some\r\n-one whose mere personality was so fascinating that, if I allowed it to\r\n-do so, it would absorb my whole nature, my whole soul, my very art\r\n-itself. I did not want any external influence in my life. You know\r\n-yourself, Harry, how independent I am by nature. I have always been my\r\n-own master; had at least always been so, till I met Dorian Gray.\r\n-Then--but I don't know how to explain it to you. Something seemed to\r\n-tell me that I was on the verge of a terrible crisis in my life. I had\r\n-a strange feeling that fate had in store for me exquisite joys and\r\n-exquisite sorrows. I grew afraid and turned to quit the room. It was\r\n-not conscience that made me do so: it was a sort of cowardice. I take\r\n-no credit to myself for trying to escape.\u0022\r\n-\r\n-\u0022Conscience and cowardice are really the same things, Basil.\r\n-Conscience is the trade-name of the firm. That is all.\u0022\r\n-\r\n-\u0022I don't believe that, Harry, and I don't believe you do either.\r\n-However, whatever was my motive--and it may have been pride, for I used\r\n-to be very proud--I certainly struggled to the door. There, of course,\r\n-I stumbled against Lady Brandon. 'You are not going to run away so\r\n-soon, Mr. Hallward?' she screamed out. You know her curiously shrill\r\n-voice?\u0022\r\n-\r\n-\u0022Yes; she is a peacock in everything but beauty,\u0022 said Lord Henry,\r\n-pulling the daisy to bits with his long nervous fingers.\r\n-\r\n-\u0022I could not get rid of her. She brought me up to royalties, and\r\n-people with stars and garters, and elderly ladies with gigantic tiaras\r\n-and parrot noses. She spoke of me as her dearest friend. I had only\r\n-met her once before, but she took it into her head to lionize me. I\r\n-believe some picture of mine had made a great success at the time, at\r\n-least had been chattered about in the penny newspapers, which is the\r\n-nineteenth-century standard of immortality. Suddenly I found myself\r\n-face to face with the young man whose personality had so strangely\r\n-stirred me. We were quite close, almost touching. Our eyes met again.\r\n-It was reckless of me, but I asked Lady Brandon to introduce me to him.\r\n-Perhaps it was not so reckless, after all. It was simply inevitable.\r\n-We would have spoken to each other without any introduction. I am sure\r\n-of that. Dorian told me so afterwards. He, too, felt that we were\r\n-destined to know each other.\u0022\r\n-\r\n-\u0022And how did Lady Brandon describe this wonderful young man?\u0022 asked his\r\n-companion. \u0022I know she goes in for giving a rapid _precis_ of all her\r\n-guests. I remember her bringing me up to a truculent and red-faced old\r\n-gentleman covered all over with orders and ribbons, and hissing into my\r\n-ear, in a tragic whisper which must have been perfectly audible to\r\n-everybody in the room, the most astounding details. I simply fled. I\r\n-like to find out people for myself. But Lady Brandon treats her guests\r\n-exactly as an auctioneer treats his goods. She either explains them\r\n-entirely away, or tells one everything about them except what one wants\r\n-to know.\u0022\r\n-\r\n-\u0022Poor Lady Brandon! You are hard on her, Harry!\u0022 said Hallward\r\n-listlessly.\r\n-\r\n-\u0022My dear fellow, she tried to found a _salon_, and only succeeded in\r\n-opening a restaurant. How could I admire her? But tell me, what did\r\n-she say about Mr. Dorian Gray?\u0022\r\n-\r\n-\u0022Oh, something like, 'Charming boy--poor dear mother and I absolutely\r\n-inseparable. Quite forget what he does--afraid he--doesn't do\r\n-anything--oh, yes, plays the piano--or is it the violin, dear Mr.\r\n-Gray?' Neither of us could help laughing, and we became friends at\r\n-once.\u0022\r\n-\r\n-\u0022Laughter is not at all a bad beginning for a friendship, and it is far\r\n-the best ending for one,\u0022 said the young lord, plucking another daisy.\r\n-\r\n-Hallward shook his head. \u0022You don't understand what friendship is,\r\n-Harry,\u0022 he murmured--\u0022or what enmity is, for that matter. You like\r\n-every one; that is to say, you are indifferent to every one.\u0022\r\n-\r\n-\u0022How horribly unjust of you!\u0022 cried Lord Henry, tilting his hat back\r\n-and looking up at the little clouds that, like ravelled skeins of\r\n-glossy white silk, were drifting across the hollowed turquoise of the\r\n-summer sky. \u0022Yes; horribly unjust of you. I make a great difference\r\n-between people. I choose my friends for their good looks, my\r\n-acquaintances for their good characters, and my enemies for their good\r\n-intellects. A man cannot be too careful in the choice of his enemies.\r\n-I have not got one who is a fool. They are all men of some\r\n-intellectual power, and consequently they all appreciate me. Is that\r\n-very vain of me? I think it is rather vain.\u0022\r\n-\r\n-\u0022I should think it was, Harry. But according to your category I must\r\n-be merely an acquaintance.\u0022\r\n-\r\n-\u0022My dear old Basil, you are much more than an acquaintance.\u0022\r\n-\r\n-\u0022And much less than a friend. A sort of brother, I suppose?\u0022\r\n-\r\n-\u0022Oh, brothers! I don't care for brothers. My elder brother won't die,\r\n-and my younger brothers seem never to do anything else.\u0022\r\n-\r\n-\u0022Harry!\u0022 exclaimed Hallward, frowning.\r\n-\r\n-\u0022My dear fellow, I am not quite serious. But I can't help detesting my\r\n-relations. I suppose it comes from the fact that none of us can stand\r\n-other people having the same faults as ourselves. I quite sympathize\r\n-with the rage of the English democracy against what they call the vices\r\n-of the upper orders. The masses feel that drunkenness, stupidity, and\r\n-immorality should be their own special property, and that if any one of\r\n-us makes an ass of himself, he is poaching on their preserves. When\r\n-poor Southwark got into the divorce court, their indignation was quite\r\n-magnificent. And yet I don't suppose that ten per cent of the\r\n-proletariat live correctly.\u0022\r\n-\r\n-\u0022I don't agree with a single word that you have said, and, what is\r\n-more, Harry, I feel sure you don't either.\u0022\r\n-\r\n-Lord Henry stroked his pointed brown beard and tapped the toe of his\r\n-patent-leather boot with a tasselled ebony cane. \u0022How English you are\r\n-Basil! That is the second time you have made that observation. If one\r\n-puts forward an idea to a true Englishman--always a rash thing to\r\n-do--he never dreams of considering whether the idea is right or wrong.\r\n-The only thing he considers of any importance is whether one believes\r\n-it oneself. Now, the value of an idea has nothing whatsoever to do\r\n-with the sincerity of the man who expresses it. Indeed, the\r\n-probabilities are that the more insincere the man is, the more purely\r\n-intellectual will the idea be, as in that case it will not be coloured\r\n-by either his wants, his desires, or his prejudices. However, I don't\r\n-propose to discuss politics, sociology, or metaphysics with you. I\r\n-like persons better than principles, and I like persons with no\r\n-principles better than anything else in the world. Tell me more about\r\n-Mr. Dorian Gray. How often do you see him?\u0022\r\n-\r\n-\u0022Every day. I couldn't be happy if I didn't see him every day. He is\r\n-absolutely necessary to me.\u0022\r\n-\r\n-\u0022How extraordinary! I thought you would never care for anything but\r\n-your art.\u0022\r\n-\r\n-\u0022He is all my art to me now,\u0022 said the painter gravely. \u0022I sometimes\r\n-think, Harry, that there are only two eras of any importance in the\r\n-world's history. The first is the appearance of a new medium for art,\r\n-and the second is the appearance of a new personality for art also.\r\n-What the invention of oil-painting was to the Venetians, the face of\r\n-Antinous was to late Greek sculpture, and the face of Dorian Gray will\r\n-some day be to me. It is not merely that I paint from him, draw from\r\n-him, sketch from him. Of course, I have done all that. But he is much\r\n-more to me than a model or a sitter. I won't tell you that I am\r\n-dissatisfied with what I have done of him, or that his beauty is such\r\n-that art cannot express it. There is nothing that art cannot express,\r\n-and I know that the work I have done, since I met Dorian Gray, is good\r\n-work, is the best work of my life. But in some curious way--I wonder\r\n-will you understand me?--his personality has suggested to me an\r\n-entirely new manner in art, an entirely new mode of style. I see\r\n-things differently, I think of them differently. I can now recreate\r\n-life in a way that was hidden from me before. 'A dream of form in days\r\n-of thought'--who is it who says that? I forget; but it is what Dorian\r\n-Gray has been to me. The merely visible presence of this lad--for he\r\n-seems to me little more than a lad, though he is really over\r\n-twenty--his merely visible presence--ah! I wonder can you realize all\r\n-that that means? Unconsciously he defines for me the lines of a fresh\r\n-school, a school that is to have in it all the passion of the romantic\r\n-spirit, all the perfection of the spirit that is Greek. The harmony of\r\n-soul and body--how much that is! We in our madness have separated the\r\n-two, and have invented a realism that is vulgar, an ideality that is\r\n-void. Harry! if you only knew what Dorian Gray is to me! You remember\r\n-that landscape of mine, for which Agnew offered me such a huge price\r\n-but which I would not part with? It is one of the best things I have\r\n-ever done. And why is it so? Because, while I was painting it, Dorian\r\n-Gray sat beside me. Some subtle influence passed from him to me, and\r\n-for the first time in my life I saw in the plain woodland the wonder I\r\n-had always looked for and always missed.\u0022\r\n-\r\n-\u0022Basil, this is extraordinary! I must see Dorian Gray.\u0022\r\n-\r\n-Hallward got up from the seat and walked up and down the garden. After\r\n-some time he came back. \u0022Harry,\u0022 he said, \u0022Dorian Gray is to me simply\r\n-a motive in art. You might see nothing in him. I see everything in\r\n-him. He is never more present in my work than when no image of him is\r\n-there. He is a suggestion, as I have said, of a new manner. I find\r\n-him in the curves of certain lines, in the loveliness and subtleties of\r\n-certain colours. That is all.\u0022\r\n-\r\n-\u0022Then why won't you exhibit his portrait?\u0022 asked Lord Henry.\r\n-\r\n-\u0022Because, without intending it, I have put into it some expression of\r\n-all this curious artistic idolatry, of which, of course, I have never\r\n-cared to speak to him. He knows nothing about it. He shall never know\r\n-anything about it. But the world might guess it, and I will not bare\r\n-my soul to their shallow prying eyes. My heart shall never be put\r\n-under their microscope. There is too much of myself in the thing,\r\n-Harry--too much of myself!\u0022\r\n-\r\n-\u0022Poets are not so scrupulous as you are. They know how useful passion\r\n-is for publication. Nowadays a broken heart will run to many editions.\u0022\r\n-\r\n-\u0022I hate them for it,\u0022 cried Hallward. \u0022An artist should create\r\n-beautiful things, but should put nothing of his own life into them. We\r\n-live in an age when men treat art as if it were meant to be a form of\r\n-autobiography. We have lost the abstract sense of beauty. Some day I\r\n-will show the world what it is; and for that reason the world shall\r\n-never see my portrait of Dorian Gray.\u0022\r\n-\r\n-\u0022I think you are wrong, Basil, but I won't argue with you. It is only\r\n-the intellectually lost who ever argue. Tell me, is Dorian Gray very\r\n-fond of you?\u0022\r\n-\r\n-The painter considered for a few moments. \u0022He likes me,\u0022 he answered\r\n-after a pause; \u0022I know he likes me. Of course I flatter him\r\n-dreadfully. I find a strange pleasure in saying things to him that I\r\n-know I shall be sorry for having said. As a rule, he is charming to\r\n-me, and we sit in the studio and talk of a thousand things. Now and\r\n-then, however, he is horribly thoughtless, and seems to take a real\r\n-delight in giving me pain. Then I feel, Harry, that I have given away\r\n-my whole soul to some one who treats it as if it were a flower to put\r\n-in his coat, a bit of decoration to charm his vanity, an ornament for a\r\n-summer's day.\u0022\r\n-\r\n-\u0022Days in summer, Basil, are apt to linger,\u0022 murmured Lord Henry.\r\n-\u0022Perhaps you will tire sooner than he will. It is a sad thing to think\r\n-of, but there is no doubt that genius lasts longer than beauty. That\r\n-accounts for the fact that we all take such pains to over-educate\r\n-ourselves. In the wild struggle for existence, we want to have\r\n-something that endures, and so we fill our minds with rubbish and\r\n-facts, in the silly hope of keeping our place. The thoroughly\r\n-well-informed man--that is the modern ideal. And the mind of the\r\n-thoroughly well-informed man is a dreadful thing. It is like a\r\n-_bric-a-brac_ shop, all monsters and dust, with everything priced above\r\n-its proper value. I think you will tire first, all the same. Some day\r\n-you will look at your friend, and he will seem to you to be a little\r\n-out of drawing, or you won't like his tone of colour, or something.\r\n-You will bitterly reproach him in your own heart, and seriously think\r\n-that he has behaved very badly to you. The next time he calls, you\r\n-will be perfectly cold and indifferent. It will be a great pity, for\r\n-it will alter you. What you have told me is quite a romance, a romance\r\n-of art one might call it, and the worst of having a romance of any kind\r\n-is that it leaves one so unromantic.\u0022\r\n-\r\n-\u0022Harry, don't talk like that. As long as I live, the personality of\r\n-Dorian Gray will dominate me. You can't feel what I feel. You change\r\n-too often.\u0022\r\n-\r\n-\u0022Ah, my dear Basil, that is exactly why I can feel it. Those who are\r\n-faithful know only the trivial side of love: it is the faithless who\r\n-know love's tragedies.\u0022 And Lord Henry struck a light on a dainty\r\n-silver case and began to smoke a cigarette with a self-conscious and\r\n-satisfied air, as if he had summed up the world in a phrase. There was\r\n-a rustle of chirruping sparrows in the green lacquer leaves of the ivy,\r\n-and the blue cloud-shadows chased themselves across the grass like\r\n-swallows. How pleasant it was in the garden! And how delightful other\r\n-people's emotions were!--much more delightful than their ideas, it\r\n-seemed to him. One's own soul, and the passions of one's\r\n-friends--those were the fascinating things in life. He pictured to\r\n-himself with silent amusement the tedious luncheon that he had missed\r\n-by staying so long with Basil Hallward. Had he gone to his aunt's, he\r\n-would have been sure to have met Lord Goodbody there, and the whole\r\n-conversation would have been about the feeding of the poor and the\r\n-necessity for model lodging-houses. Each class would have preached the\r\n-importance of those virtues, for whose exercise there was no necessity\r\n-in their own lives. The rich would have spoken on the value of thrift,\r\n-and the idle grown eloquent over the dignity of labour. It was\r\n-charming to have escaped all that! As he thought of his aunt, an idea\r\n-seemed to strike him. He turned to Hallward and said, \u0022My dear fellow,\r\n-I have just remembered.\u0022\r\n-\r\n-\u0022Remembered what, Harry?\u0022\r\n-\r\n-\u0022Where I heard the name of Dorian Gray.\u0022\r\n-\r\n-\u0022Where was it?\u0022 asked Hallward, with a slight frown.\r\n-\r\n-\u0022Don't look so angry, Basil. It was at my aunt, Lady Agatha's. She\r\n-told me she had discovered a wonderful young man who was going to help\r\n-her in the East End, and that his name was Dorian Gray. I am bound to\r\n-state that she never told me he was good-looking. Women have no\r\n-appreciation of good looks; at least, good women have not. She said\r\n-that he was very earnest and had a beautiful nature. I at once\r\n-pictured to myself a creature with spectacles and lank hair, horribly\r\n-freckled, and tramping about on huge feet. I wish I had known it was\r\n-your friend.\u0022\r\n-\r\n-\u0022I am very glad you didn't, Harry.\u0022\r\n-\r\n-\u0022Why?\u0022\r\n-\r\n-\u0022I don't want you to meet him.\u0022\r\n-\r\n-\u0022You don't want me to meet him?\u0022\r\n-\r\n-\u0022No.\u0022\r\n-\r\n-\u0022Mr. Dorian Gray is in the studio, sir,\u0022 said the butler, coming into\r\n-the garden.\r\n-\r\n-\u0022You must introduce me now,\u0022 cried Lord Henry, laughing.\r\n-\r\n-The painter turned to his servant, who stood blinking in the sunlight.\r\n-\u0022Ask Mr. Gray to wait, Parker: I shall be in in a few moments.\u0022 The\r\n-man bowed and went up the walk.\r\n-\r\n-Then he looked at Lord Henry. \u0022Dorian Gray is my dearest friend,\u0022 he\r\n-said. \u0022He has a simple and a beautiful nature. Your aunt was quite\r\n-right in what she said of him. Don't spoil him. Don't try to\r\n-influence him. Your influence would be bad. The world is wide, and\r\n-has many marvellous people in it. Don't take away from me the one\r\n-person who gives to my art whatever charm it possesses: my life as an\r\n-artist depends on him. Mind, Harry, I trust you.\u0022 He spoke very\r\n-slowly, and the words seemed wrung out of him almost against his will.\r\n-\r\n-\u0022What nonsense you talk!\u0022 said Lord Henry, smiling, and taking Hallward\r\n-by the arm, he almost led him into the house.\r\n-\r\n-\r\n-\r\n-CHAPTER 2\r\n-\r\n-As they entered they saw Dorian Gray. He was seated at the piano, with\r\n-his back to them, turning over the pages of a volume of Schumann's\r\n-\u0022Forest Scenes.\u0022 \u0022You must lend me these, Basil,\u0022 he cried. \u0022I want\r\n-to learn them. They are perfectly charming.\u0022\r\n-\r\n-\u0022That entirely depends on how you sit to-day, Dorian.\u0022\r\n-\r\n-\u0022Oh, I am tired of sitting, and I don't want a life-sized portrait of\r\n-myself,\u0022 answered the lad, swinging round on the music-stool in a\r\n-wilful, petulant manner. When he caught sight of Lord Henry, a faint\r\n-blush coloured his cheeks for a moment, and he started up. \u0022I beg your\r\n-pardon, Basil, but I didn't know you had any one with you.\u0022\r\n-\r\n-\u0022This is Lord Henry Wotton, Dorian, an old Oxford friend of mine. I\r\n-have just been telling him what a capital sitter you were, and now you\r\n-have spoiled everything.\u0022\r\n-\r\n-\u0022You have not spoiled my pleasure in meeting you, Mr. Gray,\u0022 said Lord\r\n-Henry, stepping forward and extending his hand. \u0022My aunt has often\r\n-spoken to me about you. You are one of her favourites, and, I am\r\n-afraid, one of her victims also.\u0022\r\n-\r\n-\u0022I am in Lady Agatha's black books at present,\u0022 answered Dorian with a\r\n-funny look of penitence. \u0022I promised to go to a club in Whitechapel\r\n-with her last Tuesday, and I really forgot all about it. We were to\r\n-have played a duet together--three duets, I believe. I don't know what\r\n-she will say to me. I am far too frightened to call.\u0022\r\n-\r\n-\u0022Oh, I will make your peace with my aunt. She is quite devoted to you.\r\n-And I don't think it really matters about your not being there. The\r\n-audience probably thought it was a duet. When Aunt Agatha sits down to\r\n-the piano, she makes quite enough noise for two people.\u0022\r\n-\r\n-\u0022That is very horrid to her, and not very nice to me,\u0022 answered Dorian,\r\n-laughing.\r\n-\r\n-Lord Henry looked at him. Yes, he was certainly wonderfully handsome,\r\n-with his finely curved scarlet lips, his frank blue eyes, his crisp\r\n-gold hair. There was something in his face that made one trust him at\r\n-once. All the candour of youth was there, as well as all youth's\r\n-passionate purity. One felt that he had kept himself unspotted from\r\n-the world. No wonder Basil Hallward worshipped him.\r\n-\r\n-\u0022You are too charming to go in for philanthropy, Mr. Gray--far too\r\n-charming.\u0022 And Lord Henry flung himself down on the divan and opened\r\n-his cigarette-case.\r\n-\r\n-The painter had been busy mixing his colours and getting his brushes\r\n-ready. He was looking worried, and when he heard Lord Henry's last\r\n-remark, he glanced at him, hesitated for a moment, and then said,\r\n-\u0022Harry, I want to finish this picture to-day. Would you think it\r\n-awfully rude of me if I asked you to go away?\u0022\r\n-\r\n-Lord Henry smiled and looked at Dorian Gray. \u0022Am I to go, Mr. Gray?\u0022\r\n-he asked.\r\n-\r\n-\u0022Oh, please don't, Lord Henry. I see that Basil is in one of his sulky\r\n-moods, and I can't bear him when he sulks. Besides, I want you to tell\r\n-me why I should not go in for philanthropy.\u0022\r\n-\r\n-\u0022I don't know that I shall tell you that, Mr. Gray. It is so tedious a\r\n-subject that one would have to talk seriously about it. But I\r\n-certainly shall not run away, now that you have asked me to stop. You\r\n-don't really mind, Basil, do you? You have often told me that you\r\n-liked your sitters to have some one to chat to.\u0022\r\n-\r\n-Hallward bit his lip. \u0022If Dorian wishes it, of course you must stay.\r\n-Dorian's whims are laws to everybody, except himself.\u0022\r\n-\r\n-Lord Henry took up his hat and gloves. \u0022You are very pressing, Basil,\r\n-but I am afraid I must go. I have promised to meet a man at the\r\n-Orleans. Good-bye, Mr. Gray. Come and see me some afternoon in Curzon\r\n-Street. I am nearly always at home at five o'clock. Write to me when\r\n-you are coming. I should be sorry to miss you.\u0022\r\n-\r\n-\u0022Basil,\u0022 cried Dorian Gray, \u0022if Lord Henry Wotton goes, I shall go,\r\n-too. You never open your lips while you are painting, and it is\r\n-horribly dull standing on a platform and trying to look pleasant. Ask\r\n-him to stay. I insist upon it.\u0022\r\n-\r\n-\u0022Stay, Harry, to oblige Dorian, and to oblige me,\u0022 said Hallward,\r\n-gazing intently at his picture. \u0022It is quite true, I never talk when I\r\n-am working, and never listen either, and it must be dreadfully tedious\r\n-for my unfortunate sitters. I beg you to stay.\u0022\r\n-\r\n-\u0022But what about my man at the Orleans?\u0022\r\n-\r\n-The painter laughed. \u0022I don't think there will be any difficulty about\r\n-that. Sit down again, Harry. And now, Dorian, get up on the platform,\r\n-and don't move about too much, or pay any attention to what Lord Henry\r\n-says. He has a very bad influence over all his friends, with the\r\n-single exception of myself.\u0022\r\n-\r\n-Dorian Gray stepped up on the dais with the air of a young Greek\r\n-martyr, and made a little _moue_ of discontent to Lord Henry, to whom he\r\n-had rather taken a fancy. He was so unlike Basil. They made a\r\n-delightful contrast. And he had such a beautiful voice. After a few\r\n-moments he said to him, \u0022Have you really a very bad influence, Lord\r\n-Henry? As bad as Basil says?\u0022\r\n-\r\n-\u0022There is no such thing as a good influence, Mr. Gray. All influence\r\n-is immoral--immoral from the scientific point of view.\u0022\r\n-\r\n-\u0022Why?\u0022\r\n-\r\n-\u0022Because to influence a person is to give him one's own soul. He does\r\n-not think his natural thoughts, or burn with his natural passions. His\r\n-virtues are not real to him. His sins, if there are such things as\r\n-sins, are borrowed. He becomes an echo of some one else's music, an\r\n-actor of a part that has not been written for him. The aim of life is\r\n-self-development. To realize one's nature perfectly--that is what each\r\n-of us is here for. People are afraid of themselves, nowadays. They\r\n-have forgotten the highest of all duties, the duty that one owes to\r\n-one's self. Of course, they are charitable. They feed the hungry and\r\n-clothe the beggar. But their own souls starve, and are naked. Courage\r\n-has gone out of our race. Perhaps we never really had it. The terror\r\n-of society, which is the basis of morals, the terror of God, which is\r\n-the secret of religion--these are the two things that govern us. And\r\n-yet--\u0022\r\n-\r\n-\u0022Just turn your head a little more to the right, Dorian, like a good\r\n-boy,\u0022 said the painter, deep in his work and conscious only that a look\r\n-had come into the lad's face that he had never seen there before.\r\n-\r\n-\u0022And yet,\u0022 continued Lord Henry, in his low, musical voice, and with\r\n-that graceful wave of the hand that was always so characteristic of\r\n-him, and that he had even in his Eton days, \u0022I believe that if one man\r\n-were to live out his life fully and completely, were to give form to\r\n-every feeling, expression to every thought, reality to every dream--I\r\n-believe that the world would gain such a fresh impulse of joy that we\r\n-would forget all the maladies of mediaevalism, and return to the\r\n-Hellenic ideal--to something finer, richer than the Hellenic ideal, it\r\n-may be. But the bravest man amongst us is afraid of himself. The\r\n-mutilation of the savage has its tragic survival in the self-denial\r\n-that mars our lives. We are punished for our refusals. Every impulse\r\n-that we strive to strangle broods in the mind and poisons us. The body\r\n-sins once, and has done with its sin, for action is a mode of\r\n-purification. Nothing remains then but the recollection of a pleasure,\r\n-or the luxury of a regret. The only way to get rid of a temptation is\r\n-to yield to it. Resist it, and your soul grows sick with longing for\r\n-the things it has forbidden to itself, with desire for what its\r\n-monstrous laws have made monstrous and unlawful. It has been said that\r\n-the great events of the world take place in the brain. It is in the\r\n-brain, and the brain only, that the great sins of the world take place\r\n-also. You, Mr. Gray, you yourself, with your rose-red youth and your\r\n-rose-white boyhood, you have had passions that have made you afraid,\r\n-thoughts that have filled you with terror, day-dreams and sleeping\r\n-dreams whose mere memory might stain your cheek with shame--\u0022\r\n-\r\n-\u0022Stop!\u0022 faltered Dorian Gray, \u0022stop! you bewilder me. I don't know\r\n-what to say. There is some answer to you, but I cannot find it. Don't\r\n-speak. Let me think. Or, rather, let me try not to think.\u0022\r\n-\r\n-For nearly ten minutes he stood there, motionless, with parted lips and\r\n-eyes strangely bright. He was dimly conscious that entirely fresh\r\n-influences were at work within him. Yet they seemed to him to have\r\n-come really from himself. The few words that Basil's friend had said\r\n-to him--words spoken by chance, no doubt, and with wilful paradox in\r\n-them--had touched some secret chord that had never been touched before,\r\n-but that he felt was now vibrating and throbbing to curious pulses.\r\n-\r\n-Music had stirred him like that. Music had troubled him many times.\r\n-But music was not articulate. It was not a new world, but rather\r\n-another chaos, that it created in us. Words! Mere words! How\r\n-terrible they were! How clear, and vivid, and cruel! One could not\r\n-escape from them. And yet what a subtle magic there was in them! They\r\n-seemed to be able to give a plastic form to formless things, and to\r\n-have a music of their own as sweet as that of viol or of lute. Mere\r\n-words! Was there anything so real as words?\r\n-\r\n-Yes; there had been things in his boyhood that he had not understood.\r\n-He understood them now. Life suddenly became fiery-coloured to him.\r\n-It seemed to him that he had been walking in fire. Why had he not\r\n-known it?\r\n-\r\n-With his subtle smile, Lord Henry watched him. He knew the precise\r\n-psychological moment when to say nothing. He felt intensely\r\n-interested. He was amazed at the sudden impression that his words had\r\n-produced, and, remembering a book that he had read when he was sixteen,\r\n-a book which had revealed to him much that he had not known before, he\r\n-wondered whether Dorian Gray was passing through a similar experience.\r\n-He had merely shot an arrow into the air. Had it hit the mark? How\r\n-fascinating the lad was!\r\n-\r\n-Hallward painted away with that marvellous bold touch of his, that had\r\n-the true refinement and perfect delicacy that in art, at any rate comes\r\n-only from strength. He was unconscious of the silence.\r\n-\r\n-\u0022Basil, I am tired of standing,\u0022 cried Dorian Gray suddenly. \u0022I must\r\n-go out and sit in the garden. The air is stifling here.\u0022\r\n-\r\n-\u0022My dear fellow, I am so sorry. When I am painting, I can't think of\r\n-anything else. But you never sat better. You were perfectly still.\r\n-And I have caught the effect I wanted--the half-parted lips and the\r\n-bright look in the eyes. I don't know what Harry has been saying to\r\n-you, but he has certainly made you have the most wonderful expression.\r\n-I suppose he has been paying you compliments. You mustn't believe a\r\n-word that he says.\u0022\r\n-\r\n-\u0022He has certainly not been paying me compliments. Perhaps that is the\r\n-reason that I don't believe anything he has told me.\u0022\r\n-\r\n-\u0022You know you believe it all,\u0022 said Lord Henry, looking at him with his\r\n-dreamy languorous eyes. \u0022I will go out to the garden with you. It is\r\n-horribly hot in the studio. Basil, let us have something iced to\r\n-drink, something with strawberries in it.\u0022\r\n-\r\n-\u0022Certainly, Harry. Just touch the bell, and when Parker comes I will\r\n-tell him what you want. I have got to work up this background, so I\r\n-will join you later on. Don't keep Dorian too long. I have never been\r\n-in better form for painting than I am to-day. This is going to be my\r\n-masterpiece. It is my masterpiece as it stands.\u0022\r\n-\r\n-Lord Henry went out to the garden and found Dorian Gray burying his\r\n-face in the great cool lilac-blossoms, feverishly drinking in their\r\n-perfume as if it had been wine. He came close to him and put his hand\r\n-upon his shoulder. \u0022You are quite right to do that,\u0022 he murmured.\r\n-\u0022Nothing can cure the soul but the senses, just as nothing can cure the\r\n-senses but the soul.\u0022\r\n-\r\n-The lad started and drew back. He was bareheaded, and the leaves had\r\n-tossed his rebellious curls and tangled all their gilded threads.\r\n-There was a look of fear in his eyes, such as people have when they are\r\n-suddenly awakened. His finely chiselled nostrils quivered, and some\r\n-hidden nerve shook the scarlet of his lips and left them trembling.\r\n-\r\n-\u0022Yes,\u0022 continued Lord Henry, \u0022that is one of the great secrets of\r\n-life--to cure the soul by means of the senses, and the senses by means\r\n-of the soul. You are a wonderful creation. You know more than you\r\n-think you know, just as you know less than you want to know.\u0022\r\n-\r\n-Dorian Gray frowned and turned his head away. He could not help liking\r\n-the tall, graceful young man who was standing by him. His romantic,\r\n-olive-coloured face and worn expression interested him. There was\r\n-something in his low languid voice that was absolutely fascinating.\r\n-His cool, white, flowerlike hands, even, had a curious charm. They\r\n-moved, as he spoke, like music, and seemed to have a language of their\r\n-own. But he felt afraid of him, and ashamed of being afraid. Why had\r\n-it been left for a stranger to reveal him to himself? He had known\r\n-Basil Hallward for months, but the friendship between them had never\r\n-altered him. Suddenly there had come some one across his life who\r\n-seemed to have disclosed to him life's mystery. And, yet, what was\r\n-there to be afraid of? He was not a schoolboy or a girl. It was\r\n-absurd to be frightened.\r\n-\r\n-\u0022Let us go and sit in the shade,\u0022 said Lord Henry. \u0022Parker has brought\r\n-out the drinks, and if you stay any longer in this glare, you will be\r\n-quite spoiled, and Basil will never paint you again. You really must\r\n-not allow yourself to become sunburnt. It would be unbecoming.\u0022\r\n-\r\n-\u0022What can it matter?\u0022 cried Dorian Gray, laughing, as he sat down on\r\n-the seat at the end of the garden.\r\n-\r\n-\u0022It should matter everything to you, Mr. Gray.\u0022\r\n-\r\n-\u0022Why?\u0022\r\n-\r\n-\u0022Because you have the most marvellous youth, and youth is the one thing\r\n-worth having.\u0022\r\n-\r\n-\u0022I don't feel that, Lord Henry.\u0022\r\n-\r\n-\u0022No, you don't feel it now. Some day, when you are old and wrinkled\r\n-and ugly, when thought has seared your forehead with its lines, and\r\n-passion branded your lips with its hideous fires, you will feel it, you\r\n-will feel it terribly. Now, wherever you go, you charm the world.\r\n-Will it always be so? ... You have a wonderfully beautiful face, Mr.\r\n-Gray. Don't frown. You have. And beauty is a form of genius--is\r\n-higher, indeed, than genius, as it needs no explanation. It is of the\r\n-great facts of the world, like sunlight, or spring-time, or the\r\n-reflection in dark waters of that silver shell we call the moon. It\r\n-cannot be questioned. It has its divine right of sovereignty. It\r\n-makes princes of those who have it. You smile? Ah! when you have lost\r\n-it you won't smile.... People say sometimes that beauty is only\r\n-superficial. That may be so, but at least it is not so superficial as\r\n-thought is. To me, beauty is the wonder of wonders. It is only\r\n-shallow people who do not judge by appearances. The true mystery of\r\n-the world is the visible, not the invisible.... Yes, Mr. Gray, the\r\n-gods have been good to you. But what the gods give they quickly take\r\n-away. You have only a few years in which to live really, perfectly,\r\n-and fully. When your youth goes, your beauty will go with it, and then\r\n-you will suddenly discover that there are no triumphs left for you, or\r\n-have to content yourself with those mean triumphs that the memory of\r\n-your past will make more bitter than defeats. Every month as it wanes\r\n-brings you nearer to something dreadful. Time is jealous of you, and\r\n-wars against your lilies and your roses. You will become sallow, and\r\n-hollow-cheeked, and dull-eyed. You will suffer horribly.... Ah!\r\n-realize your youth while you have it. Don't squander the gold of your\r\n-days, listening to the tedious, trying to improve the hopeless failure,\r\n-or giving away your life to the ignorant, the common, and the vulgar.\r\n-These are the sickly aims, the false ideals, of our age. Live! Live\r\n-the wonderful life that is in you! Let nothing be lost upon you. Be\r\n-always searching for new sensations. Be afraid of nothing.... A new\r\n-Hedonism--that is what our century wants. You might be its visible\r\n-symbol. With your personality there is nothing you could not do. The\r\n-world belongs to you for a season.... The moment I met you I saw that\r\n-you were quite unconscious of what you really are, of what you really\r\n-might be. There was so much in you that charmed me that I felt I must\r\n-tell you something about yourself. I thought how tragic it would be if\r\n-you were wasted. For there is such a little time that your youth will\r\n-last--such a little time. The common hill-flowers wither, but they\r\n-blossom again. The laburnum will be as yellow next June as it is now.\r\n-In a month there will be purple stars on the clematis, and year after\r\n-year the green night of its leaves will hold its purple stars. But we\r\n-never get back our youth. The pulse of joy that beats in us at twenty\r\n-becomes sluggish. Our limbs fail, our senses rot. We degenerate into\r\n-hideous puppets, haunted by the memory of the passions of which we were\r\n-too much afraid, and the exquisite temptations that we had not the\r\n-courage to yield to. Youth! Youth! There is absolutely nothing in\r\n-the world but youth!\u0022\r\n-\r\n-Dorian Gray listened, open-eyed and wondering. The spray of lilac fell\r\n-from his hand upon the gravel. A furry bee came and buzzed round it\r\n-for a moment. Then it began to scramble all over the oval stellated\r\n-globe of the tiny blossoms. He watched it with that strange interest\r\n-in trivial things that we try to develop when things of high import\r\n-make us afraid, or when we are stirred by some new emotion for which we\r\n-cannot find expression, or when some thought that terrifies us lays\r\n-sudden siege to the brain and calls on us to yield. After a time the\r\n-bee flew away. He saw it creeping into the stained trumpet of a Tyrian\r\n-convolvulus. The flower seemed to quiver, and then swayed gently to\r\n-and fro.\r\n-\r\n-Suddenly the painter appeared at the door of the studio and made\r\n-staccato signs for them to come in. They turned to each other and\r\n-smiled.\r\n-\r\n-\u0022I am waiting,\u0022 he cried. \u0022Do come in. The light is quite perfect,\r\n-and you can bring your drinks.\u0022\r\n-\r\n-They rose up and sauntered down the walk together. Two green-and-white\r\n-butterflies fluttered past them, and in the pear-tree at the corner of\r\n-the garden a thrush began to sing.\r\n-\r\n-\u0022You are glad you have met me, Mr. Gray,\u0022 said Lord Henry, looking at\r\n-him.\r\n-\r\n-\u0022Yes, I am glad now. I wonder shall I always be glad?\u0022\r\n-\r\n-\u0022Always! That is a dreadful word. It makes me shudder when I hear it.\r\n-Women are so fond of using it. They spoil every romance by trying to\r\n-make it last for ever. It is a meaningless word, too. The only\r\n-difference between a caprice and a lifelong passion is that the caprice\r\n-lasts a little longer.\u0022\r\n-\r\n-As they entered the studio, Dorian Gray put his hand upon Lord Henry's\r\n-arm. \u0022In that case, let our friendship be a caprice,\u0022 he murmured,\r\n-flushing at his own boldness, then stepped up on the platform and\r\n-resumed his pose.\r\n-\r\n-Lord Henry flung himself into a large wicker arm-chair and watched him.\r\n-The sweep and dash of the brush on the canvas made the only sound that\r\n-broke the stillness, except when, now and then, Hallward stepped back\r\n-to look at his work from a distance. In the slanting beams that\r\n-streamed through the open doorway the dust danced and was golden. The\r\n-heavy scent of the roses seemed to brood over everything.\r\n-\r\n-After about a quarter of an hour Hallward stopped painting, looked for\r\n-a long time at Dorian Gray, and then for a long time at the picture,\r\n-biting the end of one of his huge brushes and frowning. \u0022It is quite\r\n-finished,\u0022 he cried at last, and stooping down he wrote his name in\r\n-long vermilion letters on the left-hand corner of the canvas.\r\n-\r\n-Lord Henry came over and examined the picture. It was certainly a\r\n-wonderful work of art, and a wonderful likeness as well.\r\n-\r\n-\u0022My dear fellow, I congratulate you most warmly,\u0022 he said. \u0022It is the\r\n-finest portrait of modern times. Mr. Gray, come over and look at\r\n-yourself.\u0022\r\n-\r\n-The lad started, as if awakened from some dream.\r\n-\r\n-\u0022Is it really finished?\u0022 he murmured, stepping down from the platform.\r\n-\r\n-\u0022Quite finished,\u0022 said the painter. \u0022And you have sat splendidly\r\n-to-day. I am awfully obliged to you.\u0022\r\n-\r\n-\u0022That is entirely due to me,\u0022 broke in Lord Henry. \u0022Isn't it, Mr.\r\n-Gray?\u0022\r\n-\r\n-Dorian made no answer, but passed listlessly in front of his picture\r\n-and turned towards it. When he saw it he drew back, and his cheeks\r\n-flushed for a moment with pleasure. A look of joy came into his eyes,\r\n-as if he had recognized himself for the first time. He stood there\r\n-motionless and in wonder, dimly conscious that Hallward was speaking to\r\n-him, but not catching the meaning of his words. The sense of his own\r\n-beauty came on him like a revelation. He had never felt it before.\r\n-Basil Hallward's compliments had seemed to him to be merely the\r\n-charming exaggeration of friendship. He had listened to them, laughed\r\n-at them, forgotten them. They had not influenced his nature. Then had\r\n-come Lord Henry Wotton with his strange panegyric on youth, his\r\n-terrible warning of its brevity. That had stirred him at the time, and\r\n-now, as he stood gazing at the shadow of his own loveliness, the full\r\n-reality of the description flashed across him. Yes, there would be a\r\n-day when his face would be wrinkled and wizen, his eyes dim and\r\n-colourless, the grace of his figure broken and deformed. The scarlet\r\n-would pass away from his lips and the gold steal from his hair. The\r\n-life that was to make his soul would mar his body. He would become\r\n-dreadful, hideous, and uncouth.\r\n-\r\n-As he thought of it, a sharp pang of pain struck through him like a\r\n-knife and made each delicate fibre of his nature quiver. His eyes\r\n-deepened into amethyst, and across them came a mist of tears. He felt\r\n-as if a hand of ice had been laid upon his heart.\r\n-\r\n-\u0022Don't you like it?\u0022 cried Hallward at last, stung a little by the\r\n-lad's silence, not understanding what it meant.\r\n-\r\n-\u0022Of course he likes it,\u0022 said Lord Henry. \u0022Who wouldn't like it? It\r\n-is one of the greatest things in modern art. I will give you anything\r\n-you like to ask for it. I must have it.\u0022\r\n-\r\n-\u0022It is not my property, Harry.\u0022\r\n-\r\n-\u0022Whose property is it?\u0022\r\n-\r\n-\u0022Dorian's, of course,\u0022 answered the painter.\r\n-\r\n-\u0022He is a very lucky fellow.\u0022\r\n-\r\n-\u0022How sad it is!\u0022 murmured Dorian Gray with his eyes still fixed upon\r\n-his own portrait. \u0022How sad it is! I shall grow old, and horrible, and\r\n-dreadful. But this picture will remain always young. It will never be\r\n-older than this particular day of June.... If it were only the other\r\n-way! If it were I who was to be always young, and the picture that was\r\n-to grow old! For that--for that--I would give everything! Yes, there\r\n-is nothing in the whole world I would not give! I would give my soul\r\n-for that!\u0022\r\n-\r\n-\u0022You would hardly care for such an arrangement, Basil,\u0022 cried Lord\r\n-Henry, laughing. \u0022It would be rather hard lines on your work.\u0022\r\n-\r\n-\u0022I should object very strongly, Harry,\u0022 said Hallward.\r\n-\r\n-Dorian Gray turned and looked at him. \u0022I believe you would, Basil.\r\n-You like your art better than your friends. I am no more to you than a\r\n-green bronze figure. Hardly as much, I dare say.\u0022\r\n-\r\n-The painter stared in amazement. It was so unlike Dorian to speak like\r\n-that. What had happened? He seemed quite angry. His face was flushed\r\n-and his cheeks burning.\r\n-\r\n-\u0022Yes,\u0022 he continued, \u0022I am less to you than your ivory Hermes or your\r\n-silver Faun. You will like them always. How long will you like me?\r\n-Till I have my first wrinkle, I suppose. I know, now, that when one\r\n-loses one's good looks, whatever they may be, one loses everything.\r\n-Your picture has taught me that. Lord Henry Wotton is perfectly right.\r\n-Youth is the only thing worth having. When I find that I am growing\r\n-old, I shall kill myself.\u0022\r\n-\r\n-Hallward turned pale and caught his hand. \u0022Dorian! Dorian!\u0022 he cried,\r\n-\u0022don't talk like that. I have never had such a friend as you, and I\r\n-shall never have such another. You are not jealous of material things,\r\n-are you?--you who are finer than any of them!\u0022\r\n-\r\n-\u0022I am jealous of everything whose beauty does not die. I am jealous of\r\n-the portrait you have painted of me. Why should it keep what I must\r\n-lose? Every moment that passes takes something from me and gives\r\n-something to it. Oh, if it were only the other way! If the picture\r\n-could change, and I could be always what I am now! Why did you paint\r\n-it? It will mock me some day--mock me horribly!\u0022 The hot tears welled\r\n-into his eyes; he tore his hand away and, flinging himself on the\r\n-divan, he buried his face in the cushions, as though he was praying.\r\n-\r\n-\u0022This is your doing, Harry,\u0022 said the painter bitterly.\r\n-\r\n-Lord Henry shrugged his shoulders. \u0022It is the real Dorian Gray--that\r\n-is all.\u0022\r\n-\r\n-\u0022It is not.\u0022\r\n-\r\n-\u0022If it is not, what have I to do with it?\u0022\r\n-\r\n-\u0022You should have gone away when I asked you,\u0022 he muttered.\r\n-\r\n-\u0022I stayed when you asked me,\u0022 was Lord Henry's answer.\r\n-\r\n-\u0022Harry, I can't quarrel with my two best friends at once, but between\r\n-you both you have made me hate the finest piece of work I have ever\r\n-done, and I will destroy it. What is it but canvas and colour? I will\r\n-not let it come across our three lives and mar them.\u0022\r\n-\r\n-Dorian Gray lifted his golden head from the pillow, and with pallid\r\n-face and tear-stained eyes, looked at him as he walked over to the deal\r\n-painting-table that was set beneath the high curtained window. What\r\n-was he doing there? His fingers were straying about among the litter\r\n-of tin tubes and dry brushes, seeking for something. Yes, it was for\r\n-the long palette-knife, with its thin blade of lithe steel. He had\r\n-found it at last. He was going to rip up the canvas.\r\n-\r\n-With a stifled sob the lad leaped from the couch, and, rushing over to\r\n-Hallward, tore the knife out of his hand, and flung it to the end of\r\n-the studio. \u0022Don't, Basil, don't!\u0022 he cried. \u0022It would be murder!\u0022\r\n-\r\n-\u0022I am glad you appreciate my work at last, Dorian,\u0022 said the painter\r\n-coldly when he had recovered from his surprise. \u0022I never thought you\r\n-would.\u0022\r\n-\r\n-\u0022Appreciate it? I am in love with it, Basil. It is part of myself. I\r\n-feel that.\u0022\r\n-\r\n-\u0022Well, as soon as you are dry, you shall be varnished, and framed, and\r\n-sent home. Then you can do what you like with yourself.\u0022 And he walked\r\n-across the room and rang the bell for tea. \u0022You will have tea, of\r\n-course, Dorian? And so will you, Harry? Or do you object to such\r\n-simple pleasures?\u0022\r\n-\r\n-\u0022I adore simple pleasures,\u0022 said Lord Henry. \u0022They are the last refuge\r\n-of the complex. But I don't like scenes, except on the stage. What\r\n-absurd fellows you are, both of you! I wonder who it was defined man\r\n-as a rational animal. It was the most premature definition ever given.\r\n-Man is many things, but he is not rational. I am glad he is not, after\r\n-all--though I wish you chaps would not squabble over the picture. You\r\n-had much better let me have it, Basil. This silly boy doesn't really\r\n-want it, and I really do.\u0022\r\n-\r\n-\u0022If you let any one have it but me, Basil, I shall never forgive you!\u0022\r\n-cried Dorian Gray; \u0022and I don't allow people to call me a silly boy.\u0022\r\n-\r\n-\u0022You know the picture is yours, Dorian. I gave it to you before it\r\n-existed.\u0022\r\n-\r\n-\u0022And you know you have been a little silly, Mr. Gray, and that you\r\n-don't really object to being reminded that you are extremely young.\u0022\r\n-\r\n-\u0022I should have objected very strongly this morning, Lord Henry.\u0022\r\n-\r\n-\u0022Ah! this morning! You have lived since then.\u0022\r\n-\r\n-There came a knock at the door, and the butler entered with a laden\r\n-tea-tray and set it down upon a small Japanese table. There was a\r\n-rattle of cups and saucers and the hissing of a fluted Georgian urn.\r\n-Two globe-shaped china dishes were brought in by a page. Dorian Gray\r\n-went over and poured out the tea. The two men sauntered languidly to\r\n-the table and examined what was under the covers.\r\n-\r\n-\u0022Let us go to the theatre to-night,\u0022 said Lord Henry. \u0022There is sure\r\n-to be something on, somewhere. I have promised to dine at White's, but\r\n-it is only with an old friend, so I can send him a wire to say that I\r\n-am ill, or that I am prevented from coming in consequence of a\r\n-subsequent engagement. I think that would be a rather nice excuse: it\r\n-would have all the surprise of candour.\u0022\r\n-\r\n-\u0022It is such a bore putting on one's dress-clothes,\u0022 muttered Hallward.\r\n-\u0022And, when one has them on, they are so horrid.\u0022\r\n-\r\n-\u0022Yes,\u0022 answered Lord Henry dreamily, \u0022the costume of the nineteenth\r\n-century is detestable. It is so sombre, so depressing. Sin is the\r\n-only real colour-element left in modern life.\u0022\r\n-\r\n-\u0022You really must not say things like that before Dorian, Harry.\u0022\r\n-\r\n-\u0022Before which Dorian? The one who is pouring out tea for us, or the\r\n-one in the picture?\u0022\r\n-\r\n-\u0022Before either.\u0022\r\n-\r\n-\u0022I should like to come to the theatre with you, Lord Henry,\u0022 said the\r\n-lad.\r\n-\r\n-\u0022Then you shall come; and you will come, too, Basil, won't you?\u0022\r\n-\r\n-\u0022I can't, really. I would sooner not. I have a lot of work to do.\u0022\r\n-\r\n-\u0022Well, then, you and I will go alone, Mr. Gray.\u0022\r\n-\r\n-\u0022I should like that awfully.\u0022\r\n-\r\n-The painter bit his lip and walked over, cup in hand, to the picture.\r\n-\u0022I shall stay with the real Dorian,\u0022 he said, sadly.\r\n-\r\n-\u0022Is it the real Dorian?\u0022 cried the original of the portrait, strolling\r\n-across to him. \u0022Am I really like that?\u0022\r\n-\r\n-\u0022Yes; you are just like that.\u0022\r\n-\r\n-\u0022How wonderful, Basil!\u0022\r\n-\r\n-\u0022At least you are like it in appearance. But it will never alter,\u0022\r\n-sighed Hallward. \u0022That is something.\u0022\r\n-\r\n-\u0022What a fuss people make about fidelity!\u0022 exclaimed Lord Henry. \u0022Why,\r\n-even in love it is purely a question for physiology. It has nothing to\r\n-do with our own will. Young men want to be faithful, and are not; old\r\n-men want to be faithless, and cannot: that is all one can say.\u0022\r\n-\r\n-\u0022Don't go to the theatre to-night, Dorian,\u0022 said Hallward. \u0022Stop and\r\n-dine with me.\u0022\r\n-\r\n-\u0022I can't, Basil.\u0022\r\n-\r\n-\u0022Why?\u0022\r\n-\r\n-\u0022Because I have promised Lord Henry Wotton to go with him.\u0022\r\n-\r\n-\u0022He won't like you the better for keeping your promises. He always\r\n-breaks his own. I beg you not to go.\u0022\r\n-\r\n-Dorian Gray laughed and shook his head.\r\n-\r\n-\u0022I entreat you.\u0022\r\n-\r\n-The lad hesitated, and looked over at Lord Henry, who was watching them\r\n-from the tea-table with an amused smile.\r\n-\r\n-\u0022I must go, Basil,\u0022 he answered.\r\n-\r\n-\u0022Very well,\u0022 said Hallward, and he went over and laid down his cup on\r\n-the tray. \u0022It is rather late, and, as you have to dress, you had\r\n-better lose no time. Good-bye, Harry. Good-bye, Dorian. Come and see\r\n-me soon. Come to-morrow.\u0022\r\n-\r\n-\u0022Certainly.\u0022\r\n-\r\n-\u0022You won't forget?\u0022\r\n-\r\n-\u0022No, of course not,\u0022 cried Dorian.\r\n-\r\n-\u0022And ... Harry!\u0022\r\n-\r\n-\u0022Yes, Basil?\u0022\r\n-\r\n-\u0022Remember what I asked you, when we were in the garden this morning.\u0022\r\n-\r\n-\u0022I have forgotten it.\u0022\r\n-\r\n-\u0022I trust you.\u0022\r\n-\r\n-\u0022I wish I could trust myself,\u0022 said Lord Henry, laughing. \u0022Come, Mr.\r\n-Gray, my hansom is outside, and I can drop you at your own place.\r\n-Good-bye, Basil. It has been a most interesting afternoon.\u0022\r\n-\r\n-As the door closed behind them, the painter flung himself down on a\r\n-sofa, and a look of pain came into his face.\r\n-\r\n-\r\n-\r\n-CHAPTER 3\r\n-\r\n-At half-past twelve next day Lord Henry Wotton strolled from Curzon\r\n-Street over to the Albany to call on his uncle, Lord Fermor, a genial\r\n-if somewhat rough-mannered old bachelor, whom the outside world called\r\n-selfish because it derived no particular benefit from him, but who was\r\n-considered generous by Society as he fed the people who amused him.\r\n-His father had been our ambassador at Madrid when Isabella was young\r\n-and Prim unthought of, but had retired from the diplomatic service in a\r\n-capricious moment of annoyance on not being offered the Embassy at\r\n-Paris, a post to which he considered that he was fully entitled by\r\n-reason of his birth, his indolence, the good English of his dispatches,\r\n-and his inordinate passion for pleasure. The son, who had been his\r\n-father's secretary, had resigned along with his chief, somewhat\r\n-foolishly as was thought at the time, and on succeeding some months\r\n-later to the title, had set himself to the serious study of the great\r\n-aristocratic art of doing absolutely nothing. He had two large town\r\n-houses, but preferred to live in chambers as it was less trouble, and\r\n-took most of his meals at his club. He paid some attention to the\r\n-management of his collieries in the Midland counties, excusing himself\r\n-for this taint of industry on the ground that the one advantage of\r\n-having coal was that it enabled a gentleman to afford the decency of\r\n-burning wood on his own hearth. In politics he was a Tory, except when\r\n-the Tories were in office, during which period he roundly abused them\r\n-for being a pack of Radicals. He was a hero to his valet, who bullied\r\n-him, and a terror to most of his relations, whom he bullied in turn.\r\n-Only England could have produced him, and he always said that the\r\n-country was going to the dogs. His principles were out of date, but\r\n-there was a good deal to be said for his prejudices.\r\n-\r\n-When Lord Henry entered the room, he found his uncle sitting in a rough\r\n-shooting-coat, smoking a cheroot and grumbling over _The Times_. \u0022Well,\r\n-Harry,\u0022 said the old gentleman, \u0022what brings you out so early? I\r\n-thought you dandies never got up till two, and were not visible till\r\n-five.\u0022\r\n-\r\n-\u0022Pure family affection, I assure you, Uncle George. I want to get\r\n-something out of you.\u0022\r\n-\r\n-\u0022Money, I suppose,\u0022 said Lord Fermor, making a wry face. \u0022Well, sit\r\n-down and tell me all about it. Young people, nowadays, imagine that\r\n-money is everything.\u0022\r\n-\r\n-\u0022Yes,\u0022 murmured Lord Henry, settling his button-hole in his coat; \u0022and\r\n-when they grow older they know it. But I don't want money. It is only\r\n-people who pay their bills who want that, Uncle George, and I never pay\r\n-mine. Credit is the capital of a younger son, and one lives charmingly\r\n-upon it. Besides, I always deal with Dartmoor's tradesmen, and\r\n-consequently they never bother me. What I want is information: not\r\n-useful information, of course; useless information.\u0022\r\n-\r\n-\u0022Well, I can tell you anything that is in an English Blue Book, Harry,\r\n-although those fellows nowadays write a lot of nonsense. When I was in\r\n-the Diplomatic, things were much better. But I hear they let them in\r\n-now by examination. What can you expect? Examinations, sir, are pure\r\n-humbug from beginning to end. If a man is a gentleman, he knows quite\r\n-enough, and if he is not a gentleman, whatever he knows is bad for him.\u0022\r\n-\r\n-\u0022Mr. Dorian Gray does not belong to Blue Books, Uncle George,\u0022 said\r\n-Lord Henry languidly.\r\n-\r\n-\u0022Mr. Dorian Gray? Who is he?\u0022 asked Lord Fermor, knitting his bushy\r\n-white eyebrows.\r\n-\r\n-\u0022That is what I have come to learn, Uncle George. Or rather, I know\r\n-who he is. He is the last Lord Kelso's grandson. His mother was a\r\n-Devereux, Lady Margaret Devereux. I want you to tell me about his\r\n-mother. What was she like? Whom did she marry? You have known nearly\r\n-everybody in your time, so you might have known her. I am very much\r\n-interested in Mr. Gray at present. I have only just met him.\u0022\r\n-\r\n-\u0022Kelso's grandson!\u0022 echoed the old gentleman. \u0022Kelso's grandson! ...\r\n-Of course.... I knew his mother intimately. I believe I was at her\r\n-christening. She was an extraordinarily beautiful girl, Margaret\r\n-Devereux, and made all the men frantic by running away with a penniless\r\n-young fellow--a mere nobody, sir, a subaltern in a foot regiment, or\r\n-something of that kind. Certainly. I remember the whole thing as if\r\n-it happened yesterday. The poor chap was killed in a duel at Spa a few\r\n-months after the marriage. There was an ugly story about it. They\r\n-said Kelso got some rascally adventurer, some Belgian brute, to insult\r\n-his son-in-law in public--paid him, sir, to do it, paid him--and that\r\n-the fellow spitted his man as if he had been a pigeon. The thing was\r\n-hushed up, but, egad, Kelso ate his chop alone at the club for some\r\n-time afterwards. He brought his daughter back with him, I was told,\r\n-and she never spoke to him again. Oh, yes; it was a bad business. The\r\n-girl died, too, died within a year. So she left a son, did she? I had\r\n-forgotten that. What sort of boy is he? If he is like his mother, he\r\n-must be a good-looking chap.\u0022\r\n-\r\n-\u0022He is very good-looking,\u0022 assented Lord Henry.\r\n-\r\n-\u0022I hope he will fall into proper hands,\u0022 continued the old man. \u0022He\r\n-should have a pot of money waiting for him if Kelso did the right thing\r\n-by him. His mother had money, too. All the Selby property came to\r\n-her, through her grandfather. Her grandfather hated Kelso, thought him\r\n-a mean dog. He was, too. Came to Madrid once when I was there. Egad,\r\n-I was ashamed of him. The Queen used to ask me about the English noble\r\n-who was always quarrelling with the cabmen about their fares. They\r\n-made quite a story of it. I didn't dare show my face at Court for a\r\n-month. I hope he treated his grandson better than he did the jarvies.\u0022\r\n-\r\n-\u0022I don't know,\u0022 answered Lord Henry. \u0022I fancy that the boy will be\r\n-well off. He is not of age yet. He has Selby, I know. He told me so.\r\n-And ... his mother was very beautiful?\u0022\r\n-\r\n-\u0022Margaret Devereux was one of the loveliest creatures I ever saw,\r\n-Harry. What on earth induced her to behave as she did, I never could\r\n-understand. She could have married anybody she chose. Carlington was\r\n-mad after her. She was romantic, though. All the women of that family\r\n-were. The men were a poor lot, but, egad! the women were wonderful.\r\n-Carlington went on his knees to her. Told me so himself. She laughed\r\n-at him, and there wasn't a girl in London at the time who wasn't after\r\n-him. And by the way, Harry, talking about silly marriages, what is\r\n-this humbug your father tells me about Dartmoor wanting to marry an\r\n-American? Ain't English girls good enough for him?\u0022\r\n-\r\n-\u0022It is rather fashionable to marry Americans just now, Uncle George.\u0022\r\n-\r\n-\u0022I'll back English women against the world, Harry,\u0022 said Lord Fermor,\r\n-striking the table with his fist.\r\n-\r\n-\u0022The betting is on the Americans.\u0022\r\n-\r\n-\u0022They don't last, I am told,\u0022 muttered his uncle.\r\n-\r\n-\u0022A long engagement exhausts them, but they are capital at a\r\n-steeplechase. They take things flying. I don't think Dartmoor has a\r\n-chance.\u0022\r\n-\r\n-\u0022Who are her people?\u0022 grumbled the old gentleman. \u0022Has she got any?\u0022\r\n-\r\n-Lord Henry shook his head. \u0022American girls are as clever at concealing\r\n-their parents, as English women are at concealing their past,\u0022 he said,\r\n-rising to go.\r\n-\r\n-\u0022They are pork-packers, I suppose?\u0022\r\n-\r\n-\u0022I hope so, Uncle George, for Dartmoor's sake. I am told that\r\n-pork-packing is the most lucrative profession in America, after\r\n-politics.\u0022\r\n-\r\n-\u0022Is she pretty?\u0022\r\n-\r\n-\u0022She behaves as if she was beautiful. Most American women do. It is\r\n-the secret of their charm.\u0022\r\n-\r\n-\u0022Why can't these American women stay in their own country? They are\r\n-always telling us that it is the paradise for women.\u0022\r\n-\r\n-\u0022It is. That is the reason why, like Eve, they are so excessively\r\n-anxious to get out of it,\u0022 said Lord Henry. \u0022Good-bye, Uncle George.\r\n-I shall be late for lunch, if I stop any longer. Thanks for giving me\r\n-the information I wanted. I always like to know everything about my\r\n-new friends, and nothing about my old ones.\u0022\r\n-\r\n-\u0022Where are you lunching, Harry?\u0022\r\n-\r\n-\u0022At Aunt Agatha's. I have asked myself and Mr. Gray. He is her latest\r\n-_protege_.\u0022\r\n-\r\n-\u0022Humph! tell your Aunt Agatha, Harry, not to bother me any more with\r\n-her charity appeals. I am sick of them. Why, the good woman thinks\r\n-that I have nothing to do but to write cheques for her silly fads.\u0022\r\n-\r\n-\u0022All right, Uncle George, I'll tell her, but it won't have any effect.\r\n-Philanthropic people lose all sense of humanity. It is their\r\n-distinguishing characteristic.\u0022\r\n-\r\n-The old gentleman growled approvingly and rang the bell for his\r\n-servant. Lord Henry passed up the low arcade into Burlington Street\r\n-and turned his steps in the direction of Berkeley Square.\r\n-\r\n-So that was the story of Dorian Gray's parentage. Crudely as it had\r\n-been told to him, it had yet stirred him by its suggestion of a\r\n-strange, almost modern romance. A beautiful woman risking everything\r\n-for a mad passion. A few wild weeks of happiness cut short by a\r\n-hideous, treacherous crime. Months of voiceless agony, and then a\r\n-child born in pain. The mother snatched away by death, the boy left to\r\n-solitude and the tyranny of an old and loveless man. Yes; it was an\r\n-interesting background. It posed the lad, made him more perfect, as it\r\n-were. Behind every exquisite thing that existed, there was something\r\n-tragic. Worlds had to be in travail, that the meanest flower might\r\n-blow.... And how charming he had been at dinner the night before, as\r\n-with startled eyes and lips parted in frightened pleasure he had sat\r\n-opposite to him at the club, the red candleshades staining to a richer\r\n-rose the wakening wonder of his face. Talking to him was like playing\r\n-upon an exquisite violin. He answered to every touch and thrill of the\r\n-bow.... There was something terribly enthralling in the exercise of\r\n-influence. No other activity was like it. To project one's soul into\r\n-some gracious form, and let it tarry there for a moment; to hear one's\r\n-own intellectual views echoed back to one with all the added music of\r\n-passion and youth; to convey one's temperament into another as though\r\n-it were a subtle fluid or a strange perfume: there was a real joy in\r\n-that--perhaps the most satisfying joy left to us in an age so limited\r\n-and vulgar as our own, an age grossly carnal in its pleasures, and\r\n-grossly common in its aims.... He was a marvellous type, too, this lad,\r\n-whom by so curious a chance he had met in Basil's studio, or could be\r\n-fashioned into a marvellous type, at any rate. Grace was his, and the\r\n-white purity of boyhood, and beauty such as old Greek marbles kept for\r\n-us. There was nothing that one could not do with him. He could be\r\n-made a Titan or a toy. What a pity it was that such beauty was\r\n-destined to fade! ... And Basil? From a psychological point of view,\r\n-how interesting he was! The new manner in art, the fresh mode of\r\n-looking at life, suggested so strangely by the merely visible presence\r\n-of one who was unconscious of it all; the silent spirit that dwelt in\r\n-dim woodland, and walked unseen in open field, suddenly showing\r\n-herself, Dryadlike and not afraid, because in his soul who sought for\r\n-her there had been wakened that wonderful vision to which alone are\r\n-wonderful things revealed; the mere shapes and patterns of things\r\n-becoming, as it were, refined, and gaining a kind of symbolical value,\r\n-as though they were themselves patterns of some other and more perfect\r\n-form whose shadow they made real: how strange it all was! He\r\n-remembered something like it in history. Was it not Plato, that artist\r\n-in thought, who had first analyzed it? Was it not Buonarotti who had\r\n-carved it in the coloured marbles of a sonnet-sequence? But in our own\r\n-century it was strange.... Yes; he would try to be to Dorian Gray\r\n-what, without knowing it, the lad was to the painter who had fashioned\r\n-the wonderful portrait. He would seek to dominate him--had already,\r\n-indeed, half done so. He would make that wonderful spirit his own.\r\n-There was something fascinating in this son of love and death.\r\n-\r\n-Suddenly he stopped and glanced up at the houses. He found that he had\r\n-passed his aunt's some distance, and, smiling to himself, turned back.\r\n-When he entered the somewhat sombre hall, the butler told him that they\r\n-had gone in to lunch. He gave one of the footmen his hat and stick and\r\n-passed into the dining-room.\r\n-\r\n-\u0022Late as usual, Harry,\u0022 cried his aunt, shaking her head at him.\r\n-\r\n-He invented a facile excuse, and having taken the vacant seat next to\r\n-her, looked round to see who was there. Dorian bowed to him shyly from\r\n-the end of the table, a flush of pleasure stealing into his cheek.\r\n-Opposite was the Duchess of Harley, a lady of admirable good-nature and\r\n-good temper, much liked by every one who knew her, and of those ample\r\n-architectural proportions that in women who are not duchesses are\r\n-described by contemporary historians as stoutness. Next to her sat, on\r\n-her right, Sir Thomas Burdon, a Radical member of Parliament, who\r\n-followed his leader in public life and in private life followed the\r\n-best cooks, dining with the Tories and thinking with the Liberals, in\r\n-accordance with a wise and well-known rule. The post on her left was\r\n-occupied by Mr. Erskine of Treadley, an old gentleman of considerable\r\n-charm and culture, who had fallen, however, into bad habits of silence,\r\n-having, as he explained once to Lady Agatha, said everything that he\r\n-had to say before he was thirty. His own neighbour was Mrs. Vandeleur,\r\n-one of his aunt's oldest friends, a perfect saint amongst women, but so\r\n-dreadfully dowdy that she reminded one of a badly bound hymn-book.\r\n-Fortunately for him she had on the other side Lord Faudel, a most\r\n-intelligent middle-aged mediocrity, as bald as a ministerial statement\r\n-in the House of Commons, with whom she was conversing in that intensely\r\n-earnest manner which is the one unpardonable error, as he remarked once\r\n-himself, that all really good people fall into, and from which none of\r\n-them ever quite escape.\r\n-\r\n-\u0022We are talking about poor Dartmoor, Lord Henry,\u0022 cried the duchess,\r\n-nodding pleasantly to him across the table. \u0022Do you think he will\r\n-really marry this fascinating young person?\u0022\r\n-\r\n-\u0022I believe she has made up her mind to propose to him, Duchess.\u0022\r\n-\r\n-\u0022How dreadful!\u0022 exclaimed Lady Agatha. \u0022Really, some one should\r\n-interfere.\u0022\r\n-\r\n-\u0022I am told, on excellent authority, that her father keeps an American\r\n-dry-goods store,\u0022 said Sir Thomas Burdon, looking supercilious.\r\n-\r\n-\u0022My uncle has already suggested pork-packing, Sir Thomas.\u0022\r\n-\r\n-\u0022Dry-goods! What are American dry-goods?\u0022 asked the duchess, raising\r\n-her large hands in wonder and accentuating the verb.\r\n-\r\n-\u0022American novels,\u0022 answered Lord Henry, helping himself to some quail.\r\n-\r\n-The duchess looked puzzled.\r\n-\r\n-\u0022Don't mind him, my dear,\u0022 whispered Lady Agatha. \u0022He never means\r\n-anything that he says.\u0022\r\n-\r\n-\u0022When America was discovered,\u0022 said the Radical member--and he began to\r\n-give some wearisome facts. Like all people who try to exhaust a\r\n-subject, he exhausted his listeners. The duchess sighed and exercised\r\n-her privilege of interruption. \u0022I wish to goodness it never had been\r\n-discovered at all!\u0022 she exclaimed. \u0022Really, our girls have no chance\r\n-nowadays. It is most unfair.\u0022\r\n-\r\n-\u0022Perhaps, after all, America never has been discovered,\u0022 said Mr.\r\n-Erskine; \u0022I myself would say that it had merely been detected.\u0022\r\n-\r\n-\u0022Oh! but I have seen specimens of the inhabitants,\u0022 answered the\r\n-duchess vaguely. \u0022I must confess that most of them are extremely\r\n-pretty. And they dress well, too. They get all their dresses in\r\n-Paris. I wish I could afford to do the same.\u0022\r\n-\r\n-\u0022They say that when good Americans die they go to Paris,\u0022 chuckled Sir\r\n-Thomas, who had a large wardrobe of Humour's cast-off clothes.\r\n-\r\n-\u0022Really! And where do bad Americans go to when they die?\u0022 inquired the\r\n-duchess.\r\n-\r\n-\u0022They go to America,\u0022 murmured Lord Henry.\r\n-\r\n-Sir Thomas frowned. \u0022I am afraid that your nephew is prejudiced\r\n-against that great country,\u0022 he said to Lady Agatha. \u0022I have travelled\r\n-all over it in cars provided by the directors, who, in such matters,\r\n-are extremely civil. I assure you that it is an education to visit it.\u0022\r\n-\r\n-\u0022But must we really see Chicago in order to be educated?\u0022 asked Mr.\r\n-Erskine plaintively. \u0022I don't feel up to the journey.\u0022\r\n-\r\n-Sir Thomas waved his hand. \u0022Mr. Erskine of Treadley has the world on\r\n-his shelves. We practical men like to see things, not to read about\r\n-them. The Americans are an extremely interesting people. They are\r\n-absolutely reasonable. I think that is their distinguishing\r\n-characteristic. Yes, Mr. Erskine, an absolutely reasonable people. I\r\n-assure you there is no nonsense about the Americans.\u0022\r\n-\r\n-\u0022How dreadful!\u0022 cried Lord Henry. \u0022I can stand brute force, but brute\r\n-reason is quite unbearable. There is something unfair about its use.\r\n-It is hitting below the intellect.\u0022\r\n-\r\n-\u0022I do not understand you,\u0022 said Sir Thomas, growing rather red.\r\n-\r\n-\u0022I do, Lord Henry,\u0022 murmured Mr. Erskine, with a smile.\r\n-\r\n-\u0022Paradoxes are all very well in their way....\u0022 rejoined the baronet.\r\n-\r\n-\u0022Was that a paradox?\u0022 asked Mr. Erskine. \u0022I did not think so. Perhaps\r\n-it was. Well, the way of paradoxes is the way of truth. To test\r\n-reality we must see it on the tight rope. When the verities become\r\n-acrobats, we can judge them.\u0022\r\n-\r\n-\u0022Dear me!\u0022 said Lady Agatha, \u0022how you men argue! I am sure I never can\r\n-make out what you are talking about. Oh! Harry, I am quite vexed with\r\n-you. Why do you try to persuade our nice Mr. Dorian Gray to give up\r\n-the East End? I assure you he would be quite invaluable. They would\r\n-love his playing.\u0022\r\n-\r\n-\u0022I want him to play to me,\u0022 cried Lord Henry, smiling, and he looked\r\n-down the table and caught a bright answering glance.\r\n-\r\n-\u0022But they are so unhappy in Whitechapel,\u0022 continued Lady Agatha.\r\n-\r\n-\u0022I can sympathize with everything except suffering,\u0022 said Lord Henry,\r\n-shrugging his shoulders. \u0022I cannot sympathize with that. It is too\r\n-ugly, too horrible, too distressing. There is something terribly\r\n-morbid in the modern sympathy with pain. One should sympathize with\r\n-the colour, the beauty, the joy of life. The less said about life's\r\n-sores, the better.\u0022\r\n-\r\n-\u0022Still, the East End is a very important problem,\u0022 remarked Sir Thomas\r\n-with a grave shake of the head.\r\n-\r\n-\u0022Quite so,\u0022 answered the young lord. \u0022It is the problem of slavery,\r\n-and we try to solve it by amusing the slaves.\u0022\r\n-\r\n-The politician looked at him keenly. \u0022What change do you propose,\r\n-then?\u0022 he asked.\r\n-\r\n-Lord Henry laughed. \u0022I don't desire to change anything in England\r\n-except the weather,\u0022 he answered. \u0022I am quite content with philosophic\r\n-contemplation. But, as the nineteenth century has gone bankrupt\r\n-through an over-expenditure of sympathy, I would suggest that we should\r\n-appeal to science to put us straight. The advantage of the emotions is\r\n-that they lead us astray, and the advantage of science is that it is\r\n-not emotional.\u0022\r\n-\r\n-\u0022But we have such grave responsibilities,\u0022 ventured Mrs. Vandeleur\r\n-timidly.\r\n-\r\n-\u0022Terribly grave,\u0022 echoed Lady Agatha.\r\n-\r\n-Lord Henry looked over at Mr. Erskine. \u0022Humanity takes itself too\r\n-seriously. It is the world's original sin. If the caveman had known\r\n-how to laugh, history would have been different.\u0022\r\n-\r\n-\u0022You are really very comforting,\u0022 warbled the duchess. \u0022I have always\r\n-felt rather guilty when I came to see your dear aunt, for I take no\r\n-interest at all in the East End. For the future I shall be able to\r\n-look her in the face without a blush.\u0022\r\n-\r\n-\u0022A blush is very becoming, Duchess,\u0022 remarked Lord Henry.\r\n-\r\n-\u0022Only when one is young,\u0022 she answered. \u0022When an old woman like myself\r\n-blushes, it is a very bad sign. Ah! Lord Henry, I wish you would tell\r\n-me how to become young again.\u0022\r\n-\r\n-He thought for a moment. \u0022Can you remember any great error that you\r\n-committed in your early days, Duchess?\u0022 he asked, looking at her across\r\n-the table.\r\n-\r\n-\u0022A great many, I fear,\u0022 she cried.\r\n-\r\n-\u0022Then commit them over again,\u0022 he said gravely. \u0022To get back one's\r\n-youth, one has merely to repeat one's follies.\u0022\r\n-\r\n-\u0022A delightful theory!\u0022 she exclaimed. \u0022I must put it into practice.\u0022\r\n-\r\n-\u0022A dangerous theory!\u0022 came from Sir Thomas's tight lips. Lady Agatha\r\n-shook her head, but could not help being amused. Mr. Erskine listened.\r\n-\r\n-\u0022Yes,\u0022 he continued, \u0022that is one of the great secrets of life.\r\n-Nowadays most people die of a sort of creeping common sense, and\r\n-discover when it is too late that the only things one never regrets are\r\n-one's mistakes.\u0022\r\n-\r\n-A laugh ran round the table.\r\n-\r\n-He played with the idea and grew wilful; tossed it into the air and\r\n-transformed it; let it escape and recaptured it; made it iridescent\r\n-with fancy and winged it with paradox. The praise of folly, as he went\r\n-on, soared into a philosophy, and philosophy herself became young, and\r\n-catching the mad music of pleasure, wearing, one might fancy, her\r\n-wine-stained robe and wreath of ivy, danced like a Bacchante over the\r\n-hills of life, and mocked the slow Silenus for being sober. Facts fled\r\n-before her like frightened forest things. Her white feet trod the huge\r\n-press at which wise Omar sits, till the seething grape-juice rose round\r\n-her bare limbs in waves of purple bubbles, or crawled in red foam over\r\n-the vat's black, dripping, sloping sides. It was an extraordinary\r\n-improvisation. He felt that the eyes of Dorian Gray were fixed on him,\r\n-and the consciousness that amongst his audience there was one whose\r\n-temperament he wished to fascinate seemed to give his wit keenness and\r\n-to lend colour to his imagination. He was brilliant, fantastic,\r\n-irresponsible. He charmed his listeners out of themselves, and they\r\n-followed his pipe, laughing. Dorian Gray never took his gaze off him,\r\n-but sat like one under a spell, smiles chasing each other over his lips\r\n-and wonder growing grave in his darkening eyes.\r\n-\r\n-At last, liveried in the costume of the age, reality entered the room\r\n-in the shape of a servant to tell the duchess that her carriage was\r\n-waiting. She wrung her hands in mock despair. \u0022How annoying!\u0022 she\r\n-cried. \u0022I must go. I have to call for my husband at the club, to take\r\n-him to some absurd meeting at Willis's Rooms, where he is going to be\r\n-in the chair. If I am late he is sure to be furious, and I couldn't\r\n-have a scene in this bonnet. It is far too fragile. A harsh word\r\n-would ruin it. No, I must go, dear Agatha. Good-bye, Lord Henry, you\r\n-are quite delightful and dreadfully demoralizing. I am sure I don't\r\n-know what to say about your views. You must come and dine with us some\r\n-night. Tuesday? Are you disengaged Tuesday?\u0022\r\n-\r\n-\u0022For you I would throw over anybody, Duchess,\u0022 said Lord Henry with a\r\n-bow.\r\n-\r\n-\u0022Ah! that is very nice, and very wrong of you,\u0022 she cried; \u0022so mind you\r\n-come\u0022; and she swept out of the room, followed by Lady Agatha and the\r\n-other ladies.\r\n-\r\n-When Lord Henry had sat down again, Mr. Erskine moved round, and taking\r\n-a chair close to him, placed his hand upon his arm.\r\n-\r\n-\u0022You talk books away,\u0022 he said; \u0022why don't you write one?\u0022\r\n-\r\n-\u0022I am too fond of reading books to care to write them, Mr. Erskine. I\r\n-should like to write a novel certainly, a novel that would be as lovely\r\n-as a Persian carpet and as unreal. But there is no literary public in\r\n-England for anything except newspapers, primers, and encyclopaedias.\r\n-Of all people in the world the English have the least sense of the\r\n-beauty of literature.\u0022\r\n-\r\n-\u0022I fear you are right,\u0022 answered Mr. Erskine. \u0022I myself used to have\r\n-literary ambitions, but I gave them up long ago. And now, my dear\r\n-young friend, if you will allow me to call you so, may I ask if you\r\n-really meant all that you said to us at lunch?\u0022\r\n-\r\n-\u0022I quite forget what I said,\u0022 smiled Lord Henry. \u0022Was it all very bad?\u0022\r\n-\r\n-\u0022Very bad indeed. In fact I consider you extremely dangerous, and if\r\n-anything happens to our good duchess, we shall all look on you as being\r\n-primarily responsible. But I should like to talk to you about life.\r\n-The generation into which I was born was tedious. Some day, when you\r\n-are tired of London, come down to Treadley and expound to me your\r\n-philosophy of pleasure over some admirable Burgundy I am fortunate\r\n-enough to possess.\u0022\r\n-\r\n-\u0022I shall be charmed. A visit to Treadley would be a great privilege.\r\n-It has a perfect host, and a perfect library.\u0022\r\n-\r\n-\u0022You will complete it,\u0022 answered the old gentleman with a courteous\r\n-bow. \u0022And now I must bid good-bye to your excellent aunt. I am due at\r\n-the Athenaeum. It is the hour when we sleep there.\u0022\r\n-\r\n-\u0022All of you, Mr. Erskine?\u0022\r\n-\r\n-\u0022Forty of us, in forty arm-chairs. We are practising for an English\r\n-Academy of Letters.\u0022\r\n-\r\n-Lord Henry laughed and rose. \u0022I am going to the park,\u0022 he cried.\r\n-\r\n-As he was passing out of the door, Dorian Gray touched him on the arm.\r\n-\u0022Let me come with you,\u0022 he murmured.\r\n-\r\n-\u0022But I thought you had promised Basil Hallward to go and see him,\u0022\r\n-answered Lord Henry.\r\n-\r\n-\u0022I would sooner come with you; yes, I feel I must come with you. Do\r\n-let me. And you will promise to talk to me all the time? No one talks\r\n-so wonderfully as you do.\u0022\r\n-\r\n-\u0022Ah! I have talked quite enough for to-day,\u0022 said Lord Henry, smiling.\r\n-\u0022All I want now is to look at life. You may come and look at it with\r\n-me, if you care to.\u0022\r\n-\r\n-\r\n-\r\n-CHAPTER 4\r\n-\r\n-One afternoon, a month later, Dorian Gray was reclining in a luxurious\r\n-arm-chair, in the little library of Lord Henry's house in Mayfair. It\r\n-was, in its way, a very charming room, with its high panelled\r\n-wainscoting of olive-stained oak, its cream-coloured frieze and ceiling\r\n-of raised plasterwork, and its brickdust felt carpet strewn with silk,\r\n-long-fringed Persian rugs. On a tiny satinwood table stood a statuette\r\n-by Clodion, and beside it lay a copy of Les Cent Nouvelles, bound for\r\n-Margaret of Valois by Clovis Eve and powdered with the gilt daisies\r\n-that Queen had selected for her device. Some large blue china jars and\r\n-parrot-tulips were ranged on the mantelshelf, and through the small\r\n-leaded panes of the window streamed the apricot-coloured light of a\r\n-summer day in London.\r\n-\r\n-Lord Henry had not yet come in. He was always late on principle, his\r\n-principle being that punctuality is the thief of time. So the lad was\r\n-looking rather sulky, as with listless fingers he turned over the pages\r\n-of an elaborately illustrated edition of Manon Lescaut that he had\r\n-found in one of the book-cases. The formal monotonous ticking of the\r\n-Louis Quatorze clock annoyed him. Once or twice he thought of going\r\n-away.\r\n-\r\n-At last he heard a step outside, and the door opened. \u0022How late you\r\n-are, Harry!\u0022 he murmured.\r\n-\r\n-\u0022I am afraid it is not Harry, Mr. Gray,\u0022 answered a shrill voice.\r\n-\r\n-He glanced quickly round and rose to his feet. \u0022I beg your pardon. I\r\n-thought--\u0022\r\n-\r\n-\u0022You thought it was my husband. It is only his wife. You must let me\r\n-introduce myself. I know you quite well by your photographs. I think\r\n-my husband has got seventeen of them.\u0022\r\n-\r\n-\u0022Not seventeen, Lady Henry?\u0022\r\n-\r\n-\u0022Well, eighteen, then. And I saw you with him the other night at the\r\n-opera.\u0022 She laughed nervously as she spoke, and watched him with her\r\n-vague forget-me-not eyes. She was a curious woman, whose dresses\r\n-always looked as if they had been designed in a rage and put on in a\r\n-tempest. She was usually in love with somebody, and, as her passion\r\n-was never returned, she had kept all her illusions. She tried to look\r\n-picturesque, but only succeeded in being untidy. Her name was\r\n-Victoria, and she had a perfect mania for going to church.\r\n-\r\n-\u0022That was at Lohengrin, Lady Henry, I think?\u0022\r\n-\r\n-\u0022Yes; it was at dear Lohengrin. I like Wagner's music better than\r\n-anybody's. It is so loud that one can talk the whole time without other\r\n-people hearing what one says. That is a great advantage, don't you\r\n-think so, Mr. Gray?\u0022\r\n-\r\n-The same nervous staccato laugh broke from her thin lips, and her\r\n-fingers began to play with a long tortoise-shell paper-knife.\r\n-\r\n-Dorian smiled and shook his head: \u0022I am afraid I don't think so, Lady\r\n-Henry. I never talk during music--at least, during good music. If one\r\n-hears bad music, it is one's duty to drown it in conversation.\u0022\r\n-\r\n-\u0022Ah! that is one of Harry's views, isn't it, Mr. Gray? I always hear\r\n-Harry's views from his friends. It is the only way I get to know of\r\n-them. But you must not think I don't like good music. I adore it, but\r\n-I am afraid of it. It makes me too romantic. I have simply worshipped\r\n-pianists--two at a time, sometimes, Harry tells me. I don't know what\r\n-it is about them. Perhaps it is that they are foreigners. They all\r\n-are, ain't they? Even those that are born in England become foreigners\r\n-after a time, don't they? It is so clever of them, and such a\r\n-compliment to art. Makes it quite cosmopolitan, doesn't it? You have\r\n-never been to any of my parties, have you, Mr. Gray? You must come. I\r\n-can't afford orchids, but I spare no expense in foreigners. They make\r\n-one's rooms look so picturesque. But here is Harry! Harry, I came in\r\n-to look for you, to ask you something--I forget what it was--and I\r\n-found Mr. Gray here. We have had such a pleasant chat about music. We\r\n-have quite the same ideas. No; I think our ideas are quite different.\r\n-But he has been most pleasant. I am so glad I've seen him.\u0022\r\n-\r\n-\u0022I am charmed, my love, quite charmed,\u0022 said Lord Henry, elevating his\r\n-dark, crescent-shaped eyebrows and looking at them both with an amused\r\n-smile. \u0022So sorry I am late, Dorian. I went to look after a piece of\r\n-old brocade in Wardour Street and had to bargain for hours for it.\r\n-Nowadays people know the price of everything and the value of nothing.\u0022\r\n-\r\n-\u0022I am afraid I must be going,\u0022 exclaimed Lady Henry, breaking an\r\n-awkward silence with her silly sudden laugh. \u0022I have promised to drive\r\n-with the duchess. Good-bye, Mr. Gray. Good-bye, Harry. You are\r\n-dining out, I suppose? So am I. Perhaps I shall see you at Lady\r\n-Thornbury's.\u0022\r\n-\r\n-\u0022I dare say, my dear,\u0022 said Lord Henry, shutting the door behind her\r\n-as, looking like a bird of paradise that had been out all night in the\r\n-rain, she flitted out of the room, leaving a faint odour of\r\n-frangipanni. Then he lit a cigarette and flung himself down on the\r\n-sofa.\r\n-\r\n-\u0022Never marry a woman with straw-coloured hair, Dorian,\u0022 he said after a\r\n-few puffs.\r\n-\r\n-\u0022Why, Harry?\u0022\r\n-\r\n-\u0022Because they are so sentimental.\u0022\r\n-\r\n-\u0022But I like sentimental people.\u0022\r\n-\r\n-\u0022Never marry at all, Dorian. Men marry because they are tired; women,\r\n-because they are curious: both are disappointed.\u0022\r\n-\r\n-\u0022I don't think I am likely to marry, Harry. I am too much in love.\r\n-That is one of your aphorisms. I am putting it into practice, as I do\r\n-everything that you say.\u0022\r\n-\r\n-\u0022Who are you in love with?\u0022 asked Lord Henry after a pause.\r\n-\r\n-\u0022With an actress,\u0022 said Dorian Gray, blushing.\r\n-\r\n-Lord Henry shrugged his shoulders. \u0022That is a rather commonplace\r\n-_debut_.\u0022\r\n-\r\n-\u0022You would not say so if you saw her, Harry.\u0022\r\n-\r\n-\u0022Who is she?\u0022\r\n-\r\n-\u0022Her name is Sibyl Vane.\u0022\r\n-\r\n-\u0022Never heard of her.\u0022\r\n-\r\n-\u0022No one has. People will some day, however. She is a genius.\u0022\r\n-\r\n-\u0022My dear boy, no woman is a genius. Women are a decorative sex. They\r\n-never have anything to say, but they say it charmingly. Women\r\n-represent the triumph of matter over mind, just as men represent the\r\n-triumph of mind over morals.\u0022\r\n-\r\n-\u0022Harry, how can you?\u0022\r\n-\r\n-\u0022My dear Dorian, it is quite true. I am analysing women at present, so\r\n-I ought to know. The subject is not so abstruse as I thought it was.\r\n-I find that, ultimately, there are only two kinds of women, the plain\r\n-and the coloured. The plain women are very useful. If you want to\r\n-gain a reputation for respectability, you have merely to take them down\r\n-to supper. The other women are very charming. They commit one\r\n-mistake, however. They paint in order to try and look young. Our\r\n-grandmothers painted in order to try and talk brilliantly. _Rouge_ and\r\n-_esprit_ used to go together. That is all over now. As long as a woman\r\n-can look ten years younger than her own daughter, she is perfectly\r\n-satisfied. As for conversation, there are only five women in London\r\n-worth talking to, and two of these can't be admitted into decent\r\n-society. However, tell me about your genius. How long have you known\r\n-her?\u0022\r\n-\r\n-\u0022Ah! Harry, your views terrify me.\u0022\r\n-\r\n-\u0022Never mind that. How long have you known her?\u0022\r\n-\r\n-\u0022About three weeks.\u0022\r\n-\r\n-\u0022And where did you come across her?\u0022\r\n-\r\n-\u0022I will tell you, Harry, but you mustn't be unsympathetic about it.\r\n-After all, it never would have happened if I had not met you. You\r\n-filled me with a wild desire to know everything about life. For days\r\n-after I met you, something seemed to throb in my veins. As I lounged\r\n-in the park, or strolled down Piccadilly, I used to look at every one\r\n-who passed me and wonder, with a mad curiosity, what sort of lives they\r\n-led. Some of them fascinated me. Others filled me with terror. There\r\n-was an exquisite poison in the air. I had a passion for sensations....\r\n-Well, one evening about seven o'clock, I determined to go out in search\r\n-of some adventure. I felt that this grey monstrous London of ours,\r\n-with its myriads of people, its sordid sinners, and its splendid sins,\r\n-as you once phrased it, must have something in store for me. I fancied\r\n-a thousand things. The mere danger gave me a sense of delight. I\r\n-remembered what you had said to me on that wonderful evening when we\r\n-first dined together, about the search for beauty being the real secret\r\n-of life. I don't know what I expected, but I went out and wandered\r\n-eastward, soon losing my way in a labyrinth of grimy streets and black\r\n-grassless squares. About half-past eight I passed by an absurd little\r\n-theatre, with great flaring gas-jets and gaudy play-bills. A hideous\r\n-Jew, in the most amazing waistcoat I ever beheld in my life, was\r\n-standing at the entrance, smoking a vile cigar. He had greasy\r\n-ringlets, and an enormous diamond blazed in the centre of a soiled\r\n-shirt. 'Have a box, my Lord?' he said, when he saw me, and he took off\r\n-his hat with an air of gorgeous servility. There was something about\r\n-him, Harry, that amused me. He was such a monster. You will laugh at\r\n-me, I know, but I really went in and paid a whole guinea for the\r\n-stage-box. To the present day I can't make out why I did so; and yet if\r\n-I hadn't--my dear Harry, if I hadn't--I should have missed the greatest\r\n-romance of my life. I see you are laughing. It is horrid of you!\u0022\r\n-\r\n-\u0022I am not laughing, Dorian; at least I am not laughing at you. But you\r\n-should not say the greatest romance of your life. You should say the\r\n-first romance of your life. You will always be loved, and you will\r\n-always be in love with love. A _grande passion_ is the privilege of\r\n-people who have nothing to do. That is the one use of the idle classes\r\n-of a country. Don't be afraid. There are exquisite things in store\r\n-for you. This is merely the beginning.\u0022\r\n-\r\n-\u0022Do you think my nature so shallow?\u0022 cried Dorian Gray angrily.\r\n-\r\n-\u0022No; I think your nature so deep.\u0022\r\n-\r\n-\u0022How do you mean?\u0022\r\n-\r\n-\u0022My dear boy, the people who love only once in their lives are really\r\n-the shallow people. What they call their loyalty, and their fidelity,\r\n-I call either the lethargy of custom or their lack of imagination.\r\n-Faithfulness is to the emotional life what consistency is to the life\r\n-of the intellect--simply a confession of failure. Faithfulness! I\r\n-must analyse it some day. The passion for property is in it. There\r\n-are many things that we would throw away if we were not afraid that\r\n-others might pick them up. But I don't want to interrupt you. Go on\r\n-with your story.\u0022\r\n-\r\n-\u0022Well, I found myself seated in a horrid little private box, with a\r\n-vulgar drop-scene staring me in the face. I looked out from behind the\r\n-curtain and surveyed the house. It was a tawdry affair, all Cupids and\r\n-cornucopias, like a third-rate wedding-cake. The gallery and pit were\r\n-fairly full, but the two rows of dingy stalls were quite empty, and\r\n-there was hardly a person in what I suppose they called the\r\n-dress-circle. Women went about with oranges and ginger-beer, and there\r\n-was a terrible consumption of nuts going on.\u0022\r\n-\r\n-\u0022It must have been just like the palmy days of the British drama.\u0022\r\n-\r\n-\u0022Just like, I should fancy, and very depressing. I began to wonder\r\n-what on earth I should do when I caught sight of the play-bill. What\r\n-do you think the play was, Harry?\u0022\r\n-\r\n-\u0022I should think 'The Idiot Boy', or 'Dumb but Innocent'. Our fathers\r\n-used to like that sort of piece, I believe. The longer I live, Dorian,\r\n-the more keenly I feel that whatever was good enough for our fathers is\r\n-not good enough for us. In art, as in politics, _les grandperes ont\r\n-toujours tort_.\u0022\r\n-\r\n-\u0022This play was good enough for us, Harry. It was Romeo and Juliet. I\r\n-must admit that I was rather annoyed at the idea of seeing Shakespeare\r\n-done in such a wretched hole of a place. Still, I felt interested, in\r\n-a sort of way. At any rate, I determined to wait for the first act.\r\n-There was a dreadful orchestra, presided over by a young Hebrew who sat\r\n-at a cracked piano, that nearly drove me away, but at last the\r\n-drop-scene was drawn up and the play began. Romeo was a stout elderly\r\n-gentleman, with corked eyebrows, a husky tragedy voice, and a figure\r\n-like a beer-barrel. Mercutio was almost as bad. He was played by the\r\n-low-comedian, who had introduced gags of his own and was on most\r\n-friendly terms with the pit. They were both as grotesque as the\r\n-scenery, and that looked as if it had come out of a country-booth. But\r\n-Juliet! Harry, imagine a girl, hardly seventeen years of age, with a\r\n-little, flowerlike face, a small Greek head with plaited coils of\r\n-dark-brown hair, eyes that were violet wells of passion, lips that were\r\n-like the petals of a rose. She was the loveliest thing I had ever seen\r\n-in my life. You said to me once that pathos left you unmoved, but that\r\n-beauty, mere beauty, could fill your eyes with tears. I tell you,\r\n-Harry, I could hardly see this girl for the mist of tears that came\r\n-across me. And her voice--I never heard such a voice. It was very low\r\n-at first, with deep mellow notes that seemed to fall singly upon one's\r\n-ear. Then it became a little louder, and sounded like a flute or a\r\n-distant hautboy. In the garden-scene it had all the tremulous ecstasy\r\n-that one hears just before dawn when nightingales are singing. There\r\n-were moments, later on, when it had the wild passion of violins. You\r\n-know how a voice can stir one. Your voice and the voice of Sibyl Vane\r\n-are two things that I shall never forget. When I close my eyes, I hear\r\n-them, and each of them says something different. I don't know which to\r\n-follow. Why should I not love her? Harry, I do love her. She is\r\n-everything to me in life. Night after night I go to see her play. One\r\n-evening she is Rosalind, and the next evening she is Imogen. I have\r\n-seen her die in the gloom of an Italian tomb, sucking the poison from\r\n-her lover's lips. I have watched her wandering through the forest of\r\n-Arden, disguised as a pretty boy in hose and doublet and dainty cap.\r\n-She has been mad, and has come into the presence of a guilty king, and\r\n-given him rue to wear and bitter herbs to taste of. She has been\r\n-innocent, and the black hands of jealousy have crushed her reedlike\r\n-throat. I have seen her in every age and in every costume. Ordinary\r\n-women never appeal to one's imagination. They are limited to their\r\n-century. No glamour ever transfigures them. One knows their minds as\r\n-easily as one knows their bonnets. One can always find them. There is\r\n-no mystery in any of them. They ride in the park in the morning and\r\n-chatter at tea-parties in the afternoon. They have their stereotyped\r\n-smile and their fashionable manner. They are quite obvious. But an\r\n-actress! How different an actress is! Harry! why didn't you tell me\r\n-that the only thing worth loving is an actress?\u0022\r\n-\r\n-\u0022Because I have loved so many of them, Dorian.\u0022\r\n-\r\n-\u0022Oh, yes, horrid people with dyed hair and painted faces.\u0022\r\n-\r\n-\u0022Don't run down dyed hair and painted faces. There is an extraordinary\r\n-charm in them, sometimes,\u0022 said Lord Henry.\r\n-\r\n-\u0022I wish now I had not told you about Sibyl Vane.\u0022\r\n-\r\n-\u0022You could not have helped telling me, Dorian. All through your life\r\n-you will tell me everything you do.\u0022\r\n-\r\n-\u0022Yes, Harry, I believe that is true. I cannot help telling you things.\r\n-You have a curious influence over me. If I ever did a crime, I would\r\n-come and confess it to you. You would understand me.\u0022\r\n-\r\n-\u0022People like you--the wilful sunbeams of life--don't commit crimes,\r\n-Dorian. But I am much obliged for the compliment, all the same. And\r\n-now tell me--reach me the matches, like a good boy--thanks--what are\r\n-your actual relations with Sibyl Vane?\u0022\r\n-\r\n-Dorian Gray leaped to his feet, with flushed cheeks and burning eyes.\r\n-\u0022Harry! Sibyl Vane is sacred!\u0022\r\n-\r\n-\u0022It is only the sacred things that are worth touching, Dorian,\u0022 said\r\n-Lord Henry, with a strange touch of pathos in his voice. \u0022But why\r\n-should you be annoyed? I suppose she will belong to you some day.\r\n-When one is in love, one always begins by deceiving one's self, and one\r\n-always ends by deceiving others. That is what the world calls a\r\n-romance. You know her, at any rate, I suppose?\u0022\r\n-\r\n-\u0022Of course I know her. On the first night I was at the theatre, the\r\n-horrid old Jew came round to the box after the performance was over and\r\n-offered to take me behind the scenes and introduce me to her. I was\r\n-furious with him, and told him that Juliet had been dead for hundreds\r\n-of years and that her body was lying in a marble tomb in Verona. I\r\n-think, from his blank look of amazement, that he was under the\r\n-impression that I had taken too much champagne, or something.\u0022\r\n-\r\n-\u0022I am not surprised.\u0022\r\n-\r\n-\u0022Then he asked me if I wrote for any of the newspapers. I told him I\r\n-never even read them. He seemed terribly disappointed at that, and\r\n-confided to me that all the dramatic critics were in a conspiracy\r\n-against him, and that they were every one of them to be bought.\u0022\r\n-\r\n-\u0022I should not wonder if he was quite right there. But, on the other\r\n-hand, judging from their appearance, most of them cannot be at all\r\n-expensive.\u0022\r\n-\r\n-\u0022Well, he seemed to think they were beyond his means,\u0022 laughed Dorian.\r\n-\u0022By this time, however, the lights were being put out in the theatre,\r\n-and I had to go. He wanted me to try some cigars that he strongly\r\n-recommended. I declined. The next night, of course, I arrived at the\r\n-place again. When he saw me, he made me a low bow and assured me that\r\n-I was a munificent patron of art. He was a most offensive brute,\r\n-though he had an extraordinary passion for Shakespeare. He told me\r\n-once, with an air of pride, that his five bankruptcies were entirely\r\n-due to 'The Bard,' as he insisted on calling him. He seemed to think\r\n-it a distinction.\u0022\r\n-\r\n-\u0022It was a distinction, my dear Dorian--a great distinction. Most\r\n-people become bankrupt through having invested too heavily in the prose\r\n-of life. To have ruined one's self over poetry is an honour. But when\r\n-did you first speak to Miss Sibyl Vane?\u0022\r\n-\r\n-\u0022The third night. She had been playing Rosalind. I could not help\r\n-going round. I had thrown her some flowers, and she had looked at\r\n-me--at least I fancied that she had. The old Jew was persistent. He\r\n-seemed determined to take me behind, so I consented. It was curious my\r\n-not wanting to know her, wasn't it?\u0022\r\n-\r\n-\u0022No; I don't think so.\u0022\r\n-\r\n-\u0022My dear Harry, why?\u0022\r\n-\r\n-\u0022I will tell you some other time. Now I want to know about the girl.\u0022\r\n-\r\n-\u0022Sibyl? Oh, she was so shy and so gentle. There is something of a\r\n-child about her. Her eyes opened wide in exquisite wonder when I told\r\n-her what I thought of her performance, and she seemed quite unconscious\r\n-of her power. I think we were both rather nervous. The old Jew stood\r\n-grinning at the doorway of the dusty greenroom, making elaborate\r\n-speeches about us both, while we stood looking at each other like\r\n-children. He would insist on calling me 'My Lord,' so I had to assure\r\n-Sibyl that I was not anything of the kind. She said quite simply to\r\n-me, 'You look more like a prince. I must call you Prince Charming.'\u0022\r\n-\r\n-\u0022Upon my word, Dorian, Miss Sibyl knows how to pay compliments.\u0022\r\n-\r\n-\u0022You don't understand her, Harry. She regarded me merely as a person\r\n-in a play. She knows nothing of life. She lives with her mother, a\r\n-faded tired woman who played Lady Capulet in a sort of magenta\r\n-dressing-wrapper on the first night, and looks as if she had seen\r\n-better days.\u0022\r\n-\r\n-\u0022I know that look. It depresses me,\u0022 murmured Lord Henry, examining\r\n-his rings.\r\n-\r\n-\u0022The Jew wanted to tell me her history, but I said it did not interest\r\n-me.\u0022\r\n-\r\n-\u0022You were quite right. There is always something infinitely mean about\r\n-other people's tragedies.\u0022\r\n-\r\n-\u0022Sibyl is the only thing I care about. What is it to me where she came\r\n-from? From her little head to her little feet, she is absolutely and\r\n-entirely divine. Every night of my life I go to see her act, and every\r\n-night she is more marvellous.\u0022\r\n-\r\n-\u0022That is the reason, I suppose, that you never dine with me now. I\r\n-thought you must have some curious romance on hand. You have; but it\r\n-is not quite what I expected.\u0022\r\n-\r\n-\u0022My dear Harry, we either lunch or sup together every day, and I have\r\n-been to the opera with you several times,\u0022 said Dorian, opening his\r\n-blue eyes in wonder.\r\n-\r\n-\u0022You always come dreadfully late.\u0022\r\n-\r\n-\u0022Well, I can't help going to see Sibyl play,\u0022 he cried, \u0022even if it is\r\n-only for a single act. I get hungry for her presence; and when I think\r\n-of the wonderful soul that is hidden away in that little ivory body, I\r\n-am filled with awe.\u0022\r\n-\r\n-\u0022You can dine with me to-night, Dorian, can't you?\u0022\r\n-\r\n-He shook his head. \u0022To-night she is Imogen,\u0022 he answered, \u0022and\r\n-to-morrow night she will be Juliet.\u0022\r\n-\r\n-\u0022When is she Sibyl Vane?\u0022\r\n-\r\n-\u0022Never.\u0022\r\n-\r\n-\u0022I congratulate you.\u0022\r\n-\r\n-\u0022How horrid you are! She is all the great heroines of the world in\r\n-one. She is more than an individual. You laugh, but I tell you she\r\n-has genius. I love her, and I must make her love me. You, who know\r\n-all the secrets of life, tell me how to charm Sibyl Vane to love me! I\r\n-want to make Romeo jealous. I want the dead lovers of the world to\r\n-hear our laughter and grow sad. I want a breath of our passion to stir\r\n-their dust into consciousness, to wake their ashes into pain. My God,\r\n-Harry, how I worship her!\u0022 He was walking up and down the room as he\r\n-spoke. Hectic spots of red burned on his cheeks. He was terribly\r\n-excited.\r\n-\r\n-Lord Henry watched him with a subtle sense of pleasure. How different\r\n-he was now from the shy frightened boy he had met in Basil Hallward's\r\n-studio! His nature had developed like a flower, had borne blossoms of\r\n-scarlet flame. Out of its secret hiding-place had crept his soul, and\r\n-desire had come to meet it on the way.\r\n-\r\n-\u0022And what do you propose to do?\u0022 said Lord Henry at last.\r\n-\r\n-\u0022I want you and Basil to come with me some night and see her act. I\r\n-have not the slightest fear of the result. You are certain to\r\n-acknowledge her genius. Then we must get her out of the Jew's hands.\r\n-She is bound to him for three years--at least for two years and eight\r\n-months--from the present time. I shall have to pay him something, of\r\n-course. When all that is settled, I shall take a West End theatre and\r\n-bring her out properly. She will make the world as mad as she has made\r\n-me.\u0022\r\n-\r\n-\u0022That would be impossible, my dear boy.\u0022\r\n-\r\n-\u0022Yes, she will. She has not merely art, consummate art-instinct, in\r\n-her, but she has personality also; and you have often told me that it\r\n-is personalities, not principles, that move the age.\u0022\r\n-\r\n-\u0022Well, what night shall we go?\u0022\r\n-\r\n-\u0022Let me see. To-day is Tuesday. Let us fix to-morrow. She plays\r\n-Juliet to-morrow.\u0022\r\n-\r\n-\u0022All right. The Bristol at eight o'clock; and I will get Basil.\u0022\r\n-\r\n-\u0022Not eight, Harry, please. Half-past six. We must be there before the\r\n-curtain rises. You must see her in the first act, where she meets\r\n-Romeo.\u0022\r\n-\r\n-\u0022Half-past six! What an hour! It will be like having a meat-tea, or\r\n-reading an English novel. It must be seven. No gentleman dines before\r\n-seven. Shall you see Basil between this and then? Or shall I write to\r\n-him?\u0022\r\n-\r\n-\u0022Dear Basil! I have not laid eyes on him for a week. It is rather\r\n-horrid of me, as he has sent me my portrait in the most wonderful\r\n-frame, specially designed by himself, and, though I am a little jealous\r\n-of the picture for being a whole month younger than I am, I must admit\r\n-that I delight in it. Perhaps you had better write to him. I don't\r\n-want to see him alone. He says things that annoy me. He gives me good\r\n-advice.\u0022\r\n-\r\n-Lord Henry smiled. \u0022People are very fond of giving away what they need\r\n-most themselves. It is what I call the depth of generosity.\u0022\r\n-\r\n-\u0022Oh, Basil is the best of fellows, but he seems to me to be just a bit\r\n-of a Philistine. Since I have known you, Harry, I have discovered\r\n-that.\u0022\r\n-\r\n-\u0022Basil, my dear boy, puts everything that is charming in him into his\r\n-work. The consequence is that he has nothing left for life but his\r\n-prejudices, his principles, and his common sense. The only artists I\r\n-have ever known who are personally delightful are bad artists. Good\r\n-artists exist simply in what they make, and consequently are perfectly\r\n-uninteresting in what they are. A great poet, a really great poet, is\r\n-the most unpoetical of all creatures. But inferior poets are\r\n-absolutely fascinating. The worse their rhymes are, the more\r\n-picturesque they look. The mere fact of having published a book of\r\n-second-rate sonnets makes a man quite irresistible. He lives the\r\n-poetry that he cannot write. The others write the poetry that they\r\n-dare not realize.\u0022\r\n-\r\n-\u0022I wonder is that really so, Harry?\u0022 said Dorian Gray, putting some\r\n-perfume on his handkerchief out of a large, gold-topped bottle that\r\n-stood on the table. \u0022It must be, if you say it. And now I am off.\r\n-Imogen is waiting for me. Don't forget about to-morrow. Good-bye.\u0022\r\n-\r\n-As he left the room, Lord Henry's heavy eyelids drooped, and he began\r\n-to think. Certainly few people had ever interested him so much as\r\n-Dorian Gray, and yet the lad's mad adoration of some one else caused\r\n-him not the slightest pang of annoyance or jealousy. He was pleased by\r\n-it. It made him a more interesting study. He had been always\r\n-enthralled by the methods of natural science, but the ordinary\r\n-subject-matter of that science had seemed to him trivial and of no\r\n-import. And so he had begun by vivisecting himself, as he had ended by\r\n-vivisecting others. Human life--that appeared to him the one thing\r\n-worth investigating. Compared to it there was nothing else of any\r\n-value. It was true that as one watched life in its curious crucible of\r\n-pain and pleasure, one could not wear over one's face a mask of glass,\r\n-nor keep the sulphurous fumes from troubling the brain and making the\r\n-imagination turbid with monstrous fancies and misshapen dreams. There\r\n-were poisons so subtle that to know their properties one had to sicken\r\n-of them. There were maladies so strange that one had to pass through\r\n-them if one sought to understand their nature. And, yet, what a great\r\n-reward one received! How wonderful the whole world became to one! To\r\n-note the curious hard logic of passion, and the emotional coloured life\r\n-of the intellect--to observe where they met, and where they separated,\r\n-at what point they were in unison, and at what point they were at\r\n-discord--there was a delight in that! What matter what the cost was?\r\n-One could never pay too high a price for any sensation.\r\n-\r\n-He was conscious--and the thought brought a gleam of pleasure into his\r\n-brown agate eyes--that it was through certain words of his, musical\r\n-words said with musical utterance, that Dorian Gray's soul had turned\r\n-to this white girl and bowed in worship before her. To a large extent\r\n-the lad was his own creation. He had made him premature. That was\r\n-something. Ordinary people waited till life disclosed to them its\r\n-secrets, but to the few, to the elect, the mysteries of life were\r\n-revealed before the veil was drawn away. Sometimes this was the effect\r\n-of art, and chiefly of the art of literature, which dealt immediately\r\n-with the passions and the intellect. But now and then a complex\r\n-personality took the place and assumed the office of art, was indeed,\r\n-in its way, a real work of art, life having its elaborate masterpieces,\r\n-just as poetry has, or sculpture, or painting.\r\n-\r\n-Yes, the lad was premature. He was gathering his harvest while it was\r\n-yet spring. The pulse and passion of youth were in him, but he was\r\n-becoming self-conscious. It was delightful to watch him. With his\r\n-beautiful face, and his beautiful soul, he was a thing to wonder at.\r\n-It was no matter how it all ended, or was destined to end. He was like\r\n-one of those gracious figures in a pageant or a play, whose joys seem\r\n-to be remote from one, but whose sorrows stir one's sense of beauty,\r\n-and whose wounds are like red roses.\r\n-\r\n-Soul and body, body and soul--how mysterious they were! There was\r\n-animalism in the soul, and the body had its moments of spirituality.\r\n-The senses could refine, and the intellect could degrade. Who could\r\n-say where the fleshly impulse ceased, or the psychical impulse began?\r\n-How shallow were the arbitrary definitions of ordinary psychologists!\r\n-And yet how difficult to decide between the claims of the various\r\n-schools! Was the soul a shadow seated in the house of sin? Or was the\r\n-body really in the soul, as Giordano Bruno thought? The separation of\r\n-spirit from matter was a mystery, and the union of spirit with matter\r\n-was a mystery also.\r\n-\r\n-He began to wonder whether we could ever make psychology so absolute a\r\n-science that each little spring of life would be revealed to us. As it\r\n-was, we always misunderstood ourselves and rarely understood others.\r\n-Experience was of no ethical value. It was merely the name men gave to\r\n-their mistakes. Moralists had, as a rule, regarded it as a mode of\r\n-warning, had claimed for it a certain ethical efficacy in the formation\r\n-of character, had praised it as something that taught us what to follow\r\n-and showed us what to avoid. But there was no motive power in\r\n-experience. It was as little of an active cause as conscience itself.\r\n-All that it really demonstrated was that our future would be the same\r\n-as our past, and that the sin we had done once, and with loathing, we\r\n-would do many times, and with joy.\r\n-\r\n-It was clear to him that the experimental method was the only method by\r\n-which one could arrive at any scientific analysis of the passions; and\r\n-certainly Dorian Gray was a subject made to his hand, and seemed to\r\n-promise rich and fruitful results. His sudden mad love for Sibyl Vane\r\n-was a psychological phenomenon of no small interest. There was no\r\n-doubt that curiosity had much to do with it, curiosity and the desire\r\n-for new experiences, yet it was not a simple, but rather a very complex\r\n-passion. What there was in it of the purely sensuous instinct of\r\n-boyhood had been transformed by the workings of the imagination,\r\n-changed into something that seemed to the lad himself to be remote from\r\n-sense, and was for that very reason all the more dangerous. It was the\r\n-passions about whose origin we deceived ourselves that tyrannized most\r\n-strongly over us. Our weakest motives were those of whose nature we\r\n-were conscious. It often happened that when we thought we were\r\n-experimenting on others we were really experimenting on ourselves.\r\n-\r\n-While Lord Henry sat dreaming on these things, a knock came to the\r\n-door, and his valet entered and reminded him it was time to dress for\r\n-dinner. He got up and looked out into the street. The sunset had\r\n-smitten into scarlet gold the upper windows of the houses opposite.\r\n-The panes glowed like plates of heated metal. The sky above was like a\r\n-faded rose. He thought of his friend's young fiery-coloured life and\r\n-wondered how it was all going to end.\r\n-\r\n-When he arrived home, about half-past twelve o'clock, he saw a telegram\r\n-lying on the hall table. He opened it and found it was from Dorian\r\n-Gray. It was to tell him that he was engaged to be married to Sibyl\r\n-Vane.\r\n-\r\n-\r\n-\r\n-CHAPTER 5\r\n-\r\n-\u0022Mother, Mother, I am so happy!\u0022 whispered the girl, burying her face\r\n-in the lap of the faded, tired-looking woman who, with back turned to\r\n-the shrill intrusive light, was sitting in the one arm-chair that their\r\n-dingy sitting-room contained. \u0022I am so happy!\u0022 she repeated, \u0022and you\r\n-must be happy, too!\u0022\r\n-\r\n-Mrs. Vane winced and put her thin, bismuth-whitened hands on her\r\n-daughter's head. \u0022Happy!\u0022 she echoed, \u0022I am only happy, Sibyl, when I\r\n-see you act. You must not think of anything but your acting. Mr.\r\n-Isaacs has been very good to us, and we owe him money.\u0022\r\n-\r\n-The girl looked up and pouted. \u0022Money, Mother?\u0022 she cried, \u0022what does\r\n-money matter? Love is more than money.\u0022\r\n-\r\n-\u0022Mr. Isaacs has advanced us fifty pounds to pay off our debts and to\r\n-get a proper outfit for James. You must not forget that, Sibyl. Fifty\r\n-pounds is a very large sum. Mr. Isaacs has been most considerate.\u0022\r\n-\r\n-\u0022He is not a gentleman, Mother, and I hate the way he talks to me,\u0022\r\n-said the girl, rising to her feet and going over to the window.\r\n-\r\n-\u0022I don't know how we could manage without him,\u0022 answered the elder\r\n-woman querulously.\r\n-\r\n-Sibyl Vane tossed her head and laughed. \u0022We don't want him any more,\r\n-Mother. Prince Charming rules life for us now.\u0022 Then she paused. A\r\n-rose shook in her blood and shadowed her cheeks. Quick breath parted\r\n-the petals of her lips. They trembled. Some southern wind of passion\r\n-swept over her and stirred the dainty folds of her dress. \u0022I love\r\n-him,\u0022 she said simply.\r\n-\r\n-\u0022Foolish child! foolish child!\u0022 was the parrot-phrase flung in answer.\r\n-The waving of crooked, false-jewelled fingers gave grotesqueness to the\r\n-words.\r\n-\r\n-The girl laughed again. The joy of a caged bird was in her voice. Her\r\n-eyes caught the melody and echoed it in radiance, then closed for a\r\n-moment, as though to hide their secret. When they opened, the mist of\r\n-a dream had passed across them.\r\n-\r\n-Thin-lipped wisdom spoke at her from the worn chair, hinted at\r\n-prudence, quoted from that book of cowardice whose author apes the name\r\n-of common sense. She did not listen. She was free in her prison of\r\n-passion. Her prince, Prince Charming, was with her. She had called on\r\n-memory to remake him. She had sent her soul to search for him, and it\r\n-had brought him back. His kiss burned again upon her mouth. Her\r\n-eyelids were warm with his breath.\r\n-\r\n-Then wisdom altered its method and spoke of espial and discovery. This\r\n-young man might be rich. If so, marriage should be thought of.\r\n-Against the shell of her ear broke the waves of worldly cunning. The\r\n-arrows of craft shot by her. She saw the thin lips moving, and smiled.\r\n-\r\n-Suddenly she felt the need to speak. The wordy silence troubled her.\r\n-\u0022Mother, Mother,\u0022 she cried, \u0022why does he love me so much? I know why\r\n-I love him. I love him because he is like what love himself should be.\r\n-But what does he see in me? I am not worthy of him. And yet--why, I\r\n-cannot tell--though I feel so much beneath him, I don't feel humble. I\r\n-feel proud, terribly proud. Mother, did you love my father as I love\r\n-Prince Charming?\u0022\r\n-\r\n-The elder woman grew pale beneath the coarse powder that daubed her\r\n-cheeks, and her dry lips twitched with a spasm of pain. Sybil rushed\r\n-to her, flung her arms round her neck, and kissed her. \u0022Forgive me,\r\n-Mother. I know it pains you to talk about our father. But it only\r\n-pains you because you loved him so much. Don't look so sad. I am as\r\n-happy to-day as you were twenty years ago. Ah! let me be happy for\r\n-ever!\u0022\r\n-\r\n-\u0022My child, you are far too young to think of falling in love. Besides,\r\n-what do you know of this young man? You don't even know his name. The\r\n-whole thing is most inconvenient, and really, when James is going away\r\n-to Australia, and I have so much to think of, I must say that you\r\n-should have shown more consideration. However, as I said before, if he\r\n-is rich ...\u0022\r\n-\r\n-\u0022Ah! Mother, Mother, let me be happy!\u0022\r\n-\r\n-Mrs. Vane glanced at her, and with one of those false theatrical\r\n-gestures that so often become a mode of second nature to a\r\n-stage-player, clasped her in her arms. At this moment, the door opened\r\n-and a young lad with rough brown hair came into the room. He was\r\n-thick-set of figure, and his hands and feet were large and somewhat\r\n-clumsy in movement. He was not so finely bred as his sister. One\r\n-would hardly have guessed the close relationship that existed between\r\n-them. Mrs. Vane fixed her eyes on him and intensified her smile. She\r\n-mentally elevated her son to the dignity of an audience. She felt sure\r\n-that the _tableau_ was interesting.\r\n-\r\n-\u0022You might keep some of your kisses for me, Sibyl, I think,\u0022 said the\r\n-lad with a good-natured grumble.\r\n-\r\n-\u0022Ah! but you don't like being kissed, Jim,\u0022 she cried. \u0022You are a\r\n-dreadful old bear.\u0022 And she ran across the room and hugged him.\r\n-\r\n-James Vane looked into his sister's face with tenderness. \u0022I want you\r\n-to come out with me for a walk, Sibyl. I don't suppose I shall ever\r\n-see this horrid London again. I am sure I don't want to.\u0022\r\n-\r\n-\u0022My son, don't say such dreadful things,\u0022 murmured Mrs. Vane, taking up\r\n-a tawdry theatrical dress, with a sigh, and beginning to patch it. She\r\n-felt a little disappointed that he had not joined the group. It would\r\n-have increased the theatrical picturesqueness of the situation.\r\n-\r\n-\u0022Why not, Mother? I mean it.\u0022\r\n-\r\n-\u0022You pain me, my son. I trust you will return from Australia in a\r\n-position of affluence. I believe there is no society of any kind in\r\n-the Colonies--nothing that I would call society--so when you have made\r\n-your fortune, you must come back and assert yourself in London.\u0022\r\n-\r\n-\u0022Society!\u0022 muttered the lad. \u0022I don't want to know anything about\r\n-that. I should like to make some money to take you and Sibyl off the\r\n-stage. I hate it.\u0022\r\n-\r\n-\u0022Oh, Jim!\u0022 said Sibyl, laughing, \u0022how unkind of you! But are you\r\n-really going for a walk with me? That will be nice! I was afraid you\r\n-were going to say good-bye to some of your friends--to Tom Hardy, who\r\n-gave you that hideous pipe, or Ned Langton, who makes fun of you for\r\n-smoking it. It is very sweet of you to let me have your last\r\n-afternoon. Where shall we go? Let us go to the park.\u0022\r\n-\r\n-\u0022I am too shabby,\u0022 he answered, frowning. \u0022Only swell people go to the\r\n-park.\u0022\r\n-\r\n-\u0022Nonsense, Jim,\u0022 she whispered, stroking the sleeve of his coat.\r\n-\r\n-He hesitated for a moment. \u0022Very well,\u0022 he said at last, \u0022but don't be\r\n-too long dressing.\u0022 She danced out of the door. One could hear her\r\n-singing as she ran upstairs. Her little feet pattered overhead.\r\n-\r\n-He walked up and down the room two or three times. Then he turned to\r\n-the still figure in the chair. \u0022Mother, are my things ready?\u0022 he asked.\r\n-\r\n-\u0022Quite ready, James,\u0022 she answered, keeping her eyes on her work. For\r\n-some months past she had felt ill at ease when she was alone with this\r\n-rough stern son of hers. Her shallow secret nature was troubled when\r\n-their eyes met. She used to wonder if he suspected anything. The\r\n-silence, for he made no other observation, became intolerable to her.\r\n-She began to complain. Women defend themselves by attacking, just as\r\n-they attack by sudden and strange surrenders. \u0022I hope you will be\r\n-contented, James, with your sea-faring life,\u0022 she said. \u0022You must\r\n-remember that it is your own choice. You might have entered a\r\n-solicitor's office. Solicitors are a very respectable class, and in\r\n-the country often dine with the best families.\u0022\r\n-\r\n-\u0022I hate offices, and I hate clerks,\u0022 he replied. \u0022But you are quite\r\n-right. I have chosen my own life. All I say is, watch over Sibyl.\r\n-Don't let her come to any harm. Mother, you must watch over her.\u0022\r\n-\r\n-\u0022James, you really talk very strangely. Of course I watch over Sibyl.\u0022\r\n-\r\n-\u0022I hear a gentleman comes every night to the theatre and goes behind to\r\n-talk to her. Is that right? What about that?\u0022\r\n-\r\n-\u0022You are speaking about things you don't understand, James. In the\r\n-profession we are accustomed to receive a great deal of most gratifying\r\n-attention. I myself used to receive many bouquets at one time. That\r\n-was when acting was really understood. As for Sibyl, I do not know at\r\n-present whether her attachment is serious or not. But there is no\r\n-doubt that the young man in question is a perfect gentleman. He is\r\n-always most polite to me. Besides, he has the appearance of being\r\n-rich, and the flowers he sends are lovely.\u0022\r\n-\r\n-\u0022You don't know his name, though,\u0022 said the lad harshly.\r\n-\r\n-\u0022No,\u0022 answered his mother with a placid expression in her face. \u0022He\r\n-has not yet revealed his real name. I think it is quite romantic of\r\n-him. He is probably a member of the aristocracy.\u0022\r\n-\r\n-James Vane bit his lip. \u0022Watch over Sibyl, Mother,\u0022 he cried, \u0022watch\r\n-over her.\u0022\r\n-\r\n-\u0022My son, you distress me very much. Sibyl is always under my special\r\n-care. Of course, if this gentleman is wealthy, there is no reason why\r\n-she should not contract an alliance with him. I trust he is one of the\r\n-aristocracy. He has all the appearance of it, I must say. It might be\r\n-a most brilliant marriage for Sibyl. They would make a charming\r\n-couple. His good looks are really quite remarkable; everybody notices\r\n-them.\u0022\r\n-\r\n-The lad muttered something to himself and drummed on the window-pane\r\n-with his coarse fingers. He had just turned round to say something\r\n-when the door opened and Sibyl ran in.\r\n-\r\n-\u0022How serious you both are!\u0022 she cried. \u0022What is the matter?\u0022\r\n-\r\n-\u0022Nothing,\u0022 he answered. \u0022I suppose one must be serious sometimes.\r\n-Good-bye, Mother; I will have my dinner at five o'clock. Everything is\r\n-packed, except my shirts, so you need not trouble.\u0022\r\n-\r\n-\u0022Good-bye, my son,\u0022 she answered with a bow of strained stateliness.\r\n-\r\n-She was extremely annoyed at the tone he had adopted with her, and\r\n-there was something in his look that had made her feel afraid.\r\n-\r\n-\u0022Kiss me, Mother,\u0022 said the girl. Her flowerlike lips touched the\r\n-withered cheek and warmed its frost.\r\n-\r\n-\u0022My child! my child!\u0022 cried Mrs. Vane, looking up to the ceiling in\r\n-search of an imaginary gallery.\r\n-\r\n-\u0022Come, Sibyl,\u0022 said her brother impatiently. He hated his mother's\r\n-affectations.\r\n-\r\n-They went out into the flickering, wind-blown sunlight and strolled\r\n-down the dreary Euston Road. The passersby glanced in wonder at the\r\n-sullen heavy youth who, in coarse, ill-fitting clothes, was in the\r\n-company of such a graceful, refined-looking girl. He was like a common\r\n-gardener walking with a rose.\r\n-\r\n-Jim frowned from time to time when he caught the inquisitive glance of\r\n-some stranger. He had that dislike of being stared at, which comes on\r\n-geniuses late in life and never leaves the commonplace. Sibyl,\r\n-however, was quite unconscious of the effect she was producing. Her\r\n-love was trembling in laughter on her lips. She was thinking of Prince\r\n-Charming, and, that she might think of him all the more, she did not\r\n-talk of him, but prattled on about the ship in which Jim was going to\r\n-sail, about the gold he was certain to find, about the wonderful\r\n-heiress whose life he was to save from the wicked, red-shirted\r\n-bushrangers. For he was not to remain a sailor, or a supercargo, or\r\n-whatever he was going to be. Oh, no! A sailor's existence was\r\n-dreadful. Fancy being cooped up in a horrid ship, with the hoarse,\r\n-hump-backed waves trying to get in, and a black wind blowing the masts\r\n-down and tearing the sails into long screaming ribands! He was to\r\n-leave the vessel at Melbourne, bid a polite good-bye to the captain,\r\n-and go off at once to the gold-fields. Before a week was over he was to\r\n-come across a large nugget of pure gold, the largest nugget that had\r\n-ever been discovered, and bring it down to the coast in a waggon\r\n-guarded by six mounted policemen. The bushrangers were to attack them\r\n-three times, and be defeated with immense slaughter. Or, no. He was\r\n-not to go to the gold-fields at all. They were horrid places, where\r\n-men got intoxicated, and shot each other in bar-rooms, and used bad\r\n-language. He was to be a nice sheep-farmer, and one evening, as he was\r\n-riding home, he was to see the beautiful heiress being carried off by a\r\n-robber on a black horse, and give chase, and rescue her. Of course,\r\n-she would fall in love with him, and he with her, and they would get\r\n-married, and come home, and live in an immense house in London. Yes,\r\n-there were delightful things in store for him. But he must be very\r\n-good, and not lose his temper, or spend his money foolishly. She was\r\n-only a year older than he was, but she knew so much more of life. He\r\n-must be sure, also, to write to her by every mail, and to say his\r\n-prayers each night before he went to sleep. God was very good, and\r\n-would watch over him. She would pray for him, too, and in a few years\r\n-he would come back quite rich and happy.\r\n-\r\n-The lad listened sulkily to her and made no answer. He was heart-sick\r\n-at leaving home.\r\n-\r\n-Yet it was not this alone that made him gloomy and morose.\r\n-Inexperienced though he was, he had still a strong sense of the danger\r\n-of Sibyl's position. This young dandy who was making love to her could\r\n-mean her no good. He was a gentleman, and he hated him for that, hated\r\n-him through some curious race-instinct for which he could not account,\r\n-and which for that reason was all the more dominant within him. He was\r\n-conscious also of the shallowness and vanity of his mother's nature,\r\n-and in that saw infinite peril for Sibyl and Sibyl's happiness.\r\n-Children begin by loving their parents; as they grow older they judge\r\n-them; sometimes they forgive them.\r\n-\r\n-His mother! He had something on his mind to ask of her, something that\r\n-he had brooded on for many months of silence. A chance phrase that he\r\n-had heard at the theatre, a whispered sneer that had reached his ears\r\n-one night as he waited at the stage-door, had set loose a train of\r\n-horrible thoughts. He remembered it as if it had been the lash of a\r\n-hunting-crop across his face. His brows knit together into a wedge-like\r\n-furrow, and with a twitch of pain he bit his underlip.\r\n-\r\n-\u0022You are not listening to a word I am saying, Jim,\u0022 cried Sibyl, \u0022and I\r\n-am making the most delightful plans for your future. Do say something.\u0022\r\n-\r\n-\u0022What do you want me to say?\u0022\r\n-\r\n-\u0022Oh! that you will be a good boy and not forget us,\u0022 she answered,\r\n-smiling at him.\r\n-\r\n-He shrugged his shoulders. \u0022You are more likely to forget me than I am\r\n-to forget you, Sibyl.\u0022\r\n-\r\n-She flushed. \u0022What do you mean, Jim?\u0022 she asked.\r\n-\r\n-\u0022You have a new friend, I hear. Who is he? Why have you not told me\r\n-about him? He means you no good.\u0022\r\n-\r\n-\u0022Stop, Jim!\u0022 she exclaimed. \u0022You must not say anything against him. I\r\n-love him.\u0022\r\n-\r\n-\u0022Why, you don't even know his name,\u0022 answered the lad. \u0022Who is he? I\r\n-have a right to know.\u0022\r\n-\r\n-\u0022He is called Prince Charming. Don't you like the name. Oh! you silly\r\n-boy! you should never forget it. If you only saw him, you would think\r\n-him the most wonderful person in the world. Some day you will meet\r\n-him--when you come back from Australia. You will like him so much.\r\n-Everybody likes him, and I ... love him. I wish you could come to the\r\n-theatre to-night. He is going to be there, and I am to play Juliet.\r\n-Oh! how I shall play it! Fancy, Jim, to be in love and play Juliet!\r\n-To have him sitting there! To play for his delight! I am afraid I may\r\n-frighten the company, frighten or enthrall them. To be in love is to\r\n-surpass one's self. Poor dreadful Mr. Isaacs will be shouting 'genius'\r\n-to his loafers at the bar. He has preached me as a dogma; to-night he\r\n-will announce me as a revelation. I feel it. And it is all his, his\r\n-only, Prince Charming, my wonderful lover, my god of graces. But I am\r\n-poor beside him. Poor? What does that matter? When poverty creeps in\r\n-at the door, love flies in through the window. Our proverbs want\r\n-rewriting. They were made in winter, and it is summer now; spring-time\r\n-for me, I think, a very dance of blossoms in blue skies.\u0022\r\n-\r\n-\u0022He is a gentleman,\u0022 said the lad sullenly.\r\n-\r\n-\u0022A prince!\u0022 she cried musically. \u0022What more do you want?\u0022\r\n-\r\n-\u0022He wants to enslave you.\u0022\r\n-\r\n-\u0022I shudder at the thought of being free.\u0022\r\n-\r\n-\u0022I want you to beware of him.\u0022\r\n-\r\n-\u0022To see him is to worship him; to know him is to trust him.\u0022\r\n-\r\n-\u0022Sibyl, you are mad about him.\u0022\r\n-\r\n-She laughed and took his arm. \u0022You dear old Jim, you talk as if you\r\n-were a hundred. Some day you will be in love yourself. Then you will\r\n-know what it is. Don't look so sulky. Surely you should be glad to\r\n-think that, though you are going away, you leave me happier than I have\r\n-ever been before. Life has been hard for us both, terribly hard and\r\n-difficult. But it will be different now. You are going to a new\r\n-world, and I have found one. Here are two chairs; let us sit down and\r\n-see the smart people go by.\u0022\r\n-\r\n-They took their seats amidst a crowd of watchers. The tulip-beds\r\n-across the road flamed like throbbing rings of fire. A white\r\n-dust--tremulous cloud of orris-root it seemed--hung in the panting air.\r\n-The brightly coloured parasols danced and dipped like monstrous\r\n-butterflies.\r\n-\r\n-She made her brother talk of himself, his hopes, his prospects. He\r\n-spoke slowly and with effort. They passed words to each other as\r\n-players at a game pass counters. Sibyl felt oppressed. She could not\r\n-communicate her joy. A faint smile curving that sullen mouth was all\r\n-the echo she could win. After some time she became silent. Suddenly\r\n-she caught a glimpse of golden hair and laughing lips, and in an open\r\n-carriage with two ladies Dorian Gray drove past.\r\n-\r\n-She started to her feet. \u0022There he is!\u0022 she cried.\r\n-\r\n-\u0022Who?\u0022 said Jim Vane.\r\n-\r\n-\u0022Prince Charming,\u0022 she answered, looking after the victoria.\r\n-\r\n-He jumped up and seized her roughly by the arm. \u0022Show him to me.\r\n-Which is he? Point him out. I must see him!\u0022 he exclaimed; but at\r\n-that moment the Duke of Berwick's four-in-hand came between, and when\r\n-it had left the space clear, the carriage had swept out of the park.\r\n-\r\n-\u0022He is gone,\u0022 murmured Sibyl sadly. \u0022I wish you had seen him.\u0022\r\n-\r\n-\u0022I wish I had, for as sure as there is a God in heaven, if he ever does\r\n-you any wrong, I shall kill him.\u0022\r\n-\r\n-She looked at him in horror. He repeated his words. They cut the air\r\n-like a dagger. The people round began to gape. A lady standing close\r\n-to her tittered.\r\n-\r\n-\u0022Come away, Jim; come away,\u0022 she whispered. He followed her doggedly\r\n-as she passed through the crowd. He felt glad at what he had said.\r\n-\r\n-When they reached the Achilles Statue, she turned round. There was\r\n-pity in her eyes that became laughter on her lips. She shook her head\r\n-at him. \u0022You are foolish, Jim, utterly foolish; a bad-tempered boy,\r\n-that is all. How can you say such horrible things? You don't know\r\n-what you are talking about. You are simply jealous and unkind. Ah! I\r\n-wish you would fall in love. Love makes people good, and what you said\r\n-was wicked.\u0022\r\n-\r\n-\u0022I am sixteen,\u0022 he answered, \u0022and I know what I am about. Mother is no\r\n-help to you. She doesn't understand how to look after you. I wish now\r\n-that I was not going to Australia at all. I have a great mind to chuck\r\n-the whole thing up. I would, if my articles hadn't been signed.\u0022\r\n-\r\n-\u0022Oh, don't be so serious, Jim. You are like one of the heroes of those\r\n-silly melodramas Mother used to be so fond of acting in. I am not\r\n-going to quarrel with you. I have seen him, and oh! to see him is\r\n-perfect happiness. We won't quarrel. I know you would never harm any\r\n-one I love, would you?\u0022\r\n-\r\n-\u0022Not as long as you love him, I suppose,\u0022 was the sullen answer.\r\n-\r\n-\u0022I shall love him for ever!\u0022 she cried.\r\n-\r\n-\u0022And he?\u0022\r\n-\r\n-\u0022For ever, too!\u0022\r\n-\r\n-\u0022He had better.\u0022\r\n-\r\n-She shrank from him. Then she laughed and put her hand on his arm. He\r\n-was merely a boy.\r\n-\r\n-At the Marble Arch they hailed an omnibus, which left them close to\r\n-their shabby home in the Euston Road. It was after five o'clock, and\r\n-Sibyl had to lie down for a couple of hours before acting. Jim\r\n-insisted that she should do so. He said that he would sooner part with\r\n-her when their mother was not present. She would be sure to make a\r\n-scene, and he detested scenes of every kind.\r\n-\r\n-In Sybil's own room they parted. There was jealousy in the lad's\r\n-heart, and a fierce murderous hatred of the stranger who, as it seemed\r\n-to him, had come between them. Yet, when her arms were flung round his\r\n-neck, and her fingers strayed through his hair, he softened and kissed\r\n-her with real affection. There were tears in his eyes as he went\r\n-downstairs.\r\n-\r\n-His mother was waiting for him below. She grumbled at his\r\n-unpunctuality, as he entered. He made no answer, but sat down to his\r\n-meagre meal. The flies buzzed round the table and crawled over the\r\n-stained cloth. Through the rumble of omnibuses, and the clatter of\r\n-street-cabs, he could hear the droning voice devouring each minute that\r\n-was left to him.\r\n-\r\n-After some time, he thrust away his plate and put his head in his\r\n-hands. He felt that he had a right to know. It should have been told\r\n-to him before, if it was as he suspected. Leaden with fear, his mother\r\n-watched him. Words dropped mechanically from her lips. A tattered\r\n-lace handkerchief twitched in her fingers. When the clock struck six,\r\n-he got up and went to the door. Then he turned back and looked at her.\r\n-Their eyes met. In hers he saw a wild appeal for mercy. It enraged\r\n-him.\r\n-\r\n-\u0022Mother, I have something to ask you,\u0022 he said. Her eyes wandered\r\n-vaguely about the room. She made no answer. \u0022Tell me the truth. I\r\n-have a right to know. Were you married to my father?\u0022\r\n-\r\n-She heaved a deep sigh. It was a sigh of relief. The terrible moment,\r\n-the moment that night and day, for weeks and months, she had dreaded,\r\n-had come at last, and yet she felt no terror. Indeed, in some measure\r\n-it was a disappointment to her. The vulgar directness of the question\r\n-called for a direct answer. The situation had not been gradually led\r\n-up to. It was crude. It reminded her of a bad rehearsal.\r\n-\r\n-\u0022No,\u0022 she answered, wondering at the harsh simplicity of life.\r\n-\r\n-\u0022My father was a scoundrel then!\u0022 cried the lad, clenching his fists.\r\n-\r\n-She shook her head. \u0022I knew he was not free. We loved each other very\r\n-much. If he had lived, he would have made provision for us. Don't\r\n-speak against him, my son. He was your father, and a gentleman.\r\n-Indeed, he was highly connected.\u0022\r\n-\r\n-An oath broke from his lips. \u0022I don't care for myself,\u0022 he exclaimed,\r\n-\u0022but don't let Sibyl.... It is a gentleman, isn't it, who is in love\r\n-with her, or says he is? Highly connected, too, I suppose.\u0022\r\n-\r\n-For a moment a hideous sense of humiliation came over the woman. Her\r\n-head drooped. She wiped her eyes with shaking hands. \u0022Sibyl has a\r\n-mother,\u0022 she murmured; \u0022I had none.\u0022\r\n-\r\n-The lad was touched. He went towards her, and stooping down, he kissed\r\n-her. \u0022I am sorry if I have pained you by asking about my father,\u0022 he\r\n-said, \u0022but I could not help it. I must go now. Good-bye. Don't forget\r\n-that you will have only one child now to look after, and believe me\r\n-that if this man wrongs my sister, I will find out who he is, track him\r\n-down, and kill him like a dog. I swear it.\u0022\r\n-\r\n-The exaggerated folly of the threat, the passionate gesture that\r\n-accompanied it, the mad melodramatic words, made life seem more vivid\r\n-to her. She was familiar with the atmosphere. She breathed more\r\n-freely, and for the first time for many months she really admired her\r\n-son. She would have liked to have continued the scene on the same\r\n-emotional scale, but he cut her short. Trunks had to be carried down\r\n-and mufflers looked for. The lodging-house drudge bustled in and out.\r\n-There was the bargaining with the cabman. The moment was lost in\r\n-vulgar details. It was with a renewed feeling of disappointment that\r\n-she waved the tattered lace handkerchief from the window, as her son\r\n-drove away. She was conscious that a great opportunity had been\r\n-wasted. She consoled herself by telling Sibyl how desolate she felt\r\n-her life would be, now that she had only one child to look after. She\r\n-remembered the phrase. It had pleased her. Of the threat she said\r\n-nothing. It was vividly and dramatically expressed. She felt that\r\n-they would all laugh at it some day.\r\n-\r\n-\r\n-\r\n-CHAPTER 6\r\n-\r\n-\u0022I suppose you have heard the news, Basil?\u0022 said Lord Henry that\r\n-evening as Hallward was shown into a little private room at the Bristol\r\n-where dinner had been laid for three.\r\n-\r\n-\u0022No, Harry,\u0022 answered the artist, giving his hat and coat to the bowing\r\n-waiter. \u0022What is it? Nothing about politics, I hope! They don't\r\n-interest me. There is hardly a single person in the House of Commons\r\n-worth painting, though many of them would be the better for a little\r\n-whitewashing.\u0022\r\n-\r\n-\u0022Dorian Gray is engaged to be married,\u0022 said Lord Henry, watching him\r\n-as he spoke.\r\n-\r\n-Hallward started and then frowned. \u0022Dorian engaged to be married!\u0022 he\r\n-cried. \u0022Impossible!\u0022\r\n-\r\n-\u0022It is perfectly true.\u0022\r\n-\r\n-\u0022To whom?\u0022\r\n-\r\n-\u0022To some little actress or other.\u0022\r\n-\r\n-\u0022I can't believe it. Dorian is far too sensible.\u0022\r\n-\r\n-\u0022Dorian is far too wise not to do foolish things now and then, my dear\r\n-Basil.\u0022\r\n-\r\n-\u0022Marriage is hardly a thing that one can do now and then, Harry.\u0022\r\n-\r\n-\u0022Except in America,\u0022 rejoined Lord Henry languidly. \u0022But I didn't say\r\n-he was married. I said he was engaged to be married. There is a great\r\n-difference. I have a distinct remembrance of being married, but I have\r\n-no recollection at all of being engaged. I am inclined to think that I\r\n-never was engaged.\u0022\r\n-\r\n-\u0022But think of Dorian's birth, and position, and wealth. It would be\r\n-absurd for him to marry so much beneath him.\u0022\r\n-\r\n-\u0022If you want to make him marry this girl, tell him that, Basil. He is\r\n-sure to do it, then. Whenever a man does a thoroughly stupid thing, it\r\n-is always from the noblest motives.\u0022\r\n-\r\n-\u0022I hope the girl is good, Harry. I don't want to see Dorian tied to\r\n-some vile creature, who might degrade his nature and ruin his\r\n-intellect.\u0022\r\n-\r\n-\u0022Oh, she is better than good--she is beautiful,\u0022 murmured Lord Henry,\r\n-sipping a glass of vermouth and orange-bitters. \u0022Dorian says she is\r\n-beautiful, and he is not often wrong about things of that kind. Your\r\n-portrait of him has quickened his appreciation of the personal\r\n-appearance of other people. It has had that excellent effect, amongst\r\n-others. We are to see her to-night, if that boy doesn't forget his\r\n-appointment.\u0022\r\n-\r\n-\u0022Are you serious?\u0022\r\n-\r\n-\u0022Quite serious, Basil. I should be miserable if I thought I should\r\n-ever be more serious than I am at the present moment.\u0022\r\n-\r\n-\u0022But do you approve of it, Harry?\u0022 asked the painter, walking up and\r\n-down the room and biting his lip. \u0022You can't approve of it, possibly.\r\n-It is some silly infatuation.\u0022\r\n-\r\n-\u0022I never approve, or disapprove, of anything now. It is an absurd\r\n-attitude to take towards life. We are not sent into the world to air\r\n-our moral prejudices. I never take any notice of what common people\r\n-say, and I never interfere with what charming people do. If a\r\n-personality fascinates me, whatever mode of expression that personality\r\n-selects is absolutely delightful to me. Dorian Gray falls in love with\r\n-a beautiful girl who acts Juliet, and proposes to marry her. Why not?\r\n-If he wedded Messalina, he would be none the less interesting. You\r\n-know I am not a champion of marriage. The real drawback to marriage is\r\n-that it makes one unselfish. And unselfish people are colourless.\r\n-They lack individuality. Still, there are certain temperaments that\r\n-marriage makes more complex. They retain their egotism, and add to it\r\n-many other egos. They are forced to have more than one life. They\r\n-become more highly organized, and to be highly organized is, I should\r\n-fancy, the object of man's existence. Besides, every experience is of\r\n-value, and whatever one may say against marriage, it is certainly an\r\n-experience. I hope that Dorian Gray will make this girl his wife,\r\n-passionately adore her for six months, and then suddenly become\r\n-fascinated by some one else. He would be a wonderful study.\u0022\r\n-\r\n-\u0022You don't mean a single word of all that, Harry; you know you don't.\r\n-If Dorian Gray's life were spoiled, no one would be sorrier than\r\n-yourself. You are much better than you pretend to be.\u0022\r\n-\r\n-Lord Henry laughed. \u0022The reason we all like to think so well of others\r\n-is that we are all afraid for ourselves. The basis of optimism is\r\n-sheer terror. We think that we are generous because we credit our\r\n-neighbour with the possession of those virtues that are likely to be a\r\n-benefit to us. We praise the banker that we may overdraw our account,\r\n-and find good qualities in the highwayman in the hope that he may spare\r\n-our pockets. I mean everything that I have said. I have the greatest\r\n-contempt for optimism. As for a spoiled life, no life is spoiled but\r\n-one whose growth is arrested. If you want to mar a nature, you have\r\n-merely to reform it. As for marriage, of course that would be silly,\r\n-but there are other and more interesting bonds between men and women.\r\n-I will certainly encourage them. They have the charm of being\r\n-fashionable. But here is Dorian himself. He will tell you more than I\r\n-can.\u0022\r\n-\r\n-\u0022My dear Harry, my dear Basil, you must both congratulate me!\u0022 said the\r\n-lad, throwing off his evening cape with its satin-lined wings and\r\n-shaking each of his friends by the hand in turn. \u0022I have never been so\r\n-happy. Of course, it is sudden--all really delightful things are. And\r\n-yet it seems to me to be the one thing I have been looking for all my\r\n-life.\u0022 He was flushed with excitement and pleasure, and looked\r\n-extraordinarily handsome.\r\n-\r\n-\u0022I hope you will always be very happy, Dorian,\u0022 said Hallward, \u0022but I\r\n-don't quite forgive you for not having let me know of your engagement.\r\n-You let Harry know.\u0022\r\n-\r\n-\u0022And I don't forgive you for being late for dinner,\u0022 broke in Lord\r\n-Henry, putting his hand on the lad's shoulder and smiling as he spoke.\r\n-\u0022Come, let us sit down and try what the new _chef_ here is like, and then\r\n-you will tell us how it all came about.\u0022\r\n-\r\n-\u0022There is really not much to tell,\u0022 cried Dorian as they took their\r\n-seats at the small round table. \u0022What happened was simply this. After\r\n-I left you yesterday evening, Harry, I dressed, had some dinner at that\r\n-little Italian restaurant in Rupert Street you introduced me to, and\r\n-went down at eight o'clock to the theatre. Sibyl was playing Rosalind.\r\n-Of course, the scenery was dreadful and the Orlando absurd. But Sibyl!\r\n-You should have seen her! When she came on in her boy's clothes, she\r\n-was perfectly wonderful. She wore a moss-coloured velvet jerkin with\r\n-cinnamon sleeves, slim, brown, cross-gartered hose, a dainty little\r\n-green cap with a hawk's feather caught in a jewel, and a hooded cloak\r\n-lined with dull red. She had never seemed to me more exquisite. She\r\n-had all the delicate grace of that Tanagra figurine that you have in\r\n-your studio, Basil. Her hair clustered round her face like dark leaves\r\n-round a pale rose. As for her acting--well, you shall see her\r\n-to-night. She is simply a born artist. I sat in the dingy box\r\n-absolutely enthralled. I forgot that I was in London and in the\r\n-nineteenth century. I was away with my love in a forest that no man\r\n-had ever seen. After the performance was over, I went behind and spoke\r\n-to her. As we were sitting together, suddenly there came into her eyes\r\n-a look that I had never seen there before. My lips moved towards hers.\r\n-We kissed each other. I can't describe to you what I felt at that\r\n-moment. It seemed to me that all my life had been narrowed to one\r\n-perfect point of rose-coloured joy. She trembled all over and shook\r\n-like a white narcissus. Then she flung herself on her knees and kissed\r\n-my hands. I feel that I should not tell you all this, but I can't help\r\n-it. Of course, our engagement is a dead secret. She has not even told\r\n-her own mother. I don't know what my guardians will say. Lord Radley\r\n-is sure to be furious. I don't care. I shall be of age in less than a\r\n-year, and then I can do what I like. I have been right, Basil, haven't\r\n-I, to take my love out of poetry and to find my wife in Shakespeare's\r\n-plays? Lips that Shakespeare taught to speak have whispered their\r\n-secret in my ear. I have had the arms of Rosalind around me, and\r\n-kissed Juliet on the mouth.\u0022\r\n-\r\n-\u0022Yes, Dorian, I suppose you were right,\u0022 said Hallward slowly.\r\n-\r\n-\u0022Have you seen her to-day?\u0022 asked Lord Henry.\r\n-\r\n-Dorian Gray shook his head. \u0022I left her in the forest of Arden; I\r\n-shall find her in an orchard in Verona.\u0022\r\n-\r\n-Lord Henry sipped his champagne in a meditative manner. \u0022At what\r\n-particular point did you mention the word marriage, Dorian? And what\r\n-did she say in answer? Perhaps you forgot all about it.\u0022\r\n-\r\n-\u0022My dear Harry, I did not treat it as a business transaction, and I did\r\n-not make any formal proposal. I told her that I loved her, and she\r\n-said she was not worthy to be my wife. Not worthy! Why, the whole\r\n-world is nothing to me compared with her.\u0022\r\n-\r\n-\u0022Women are wonderfully practical,\u0022 murmured Lord Henry, \u0022much more\r\n-practical than we are. In situations of that kind we often forget to\r\n-say anything about marriage, and they always remind us.\u0022\r\n-\r\n-Hallward laid his hand upon his arm. \u0022Don't, Harry. You have annoyed\r\n-Dorian. He is not like other men. He would never bring misery upon\r\n-any one. His nature is too fine for that.\u0022\r\n-\r\n-Lord Henry looked across the table. \u0022Dorian is never annoyed with me,\u0022\r\n-he answered. \u0022I asked the question for the best reason possible, for\r\n-the only reason, indeed, that excuses one for asking any\r\n-question--simple curiosity. I have a theory that it is always the\r\n-women who propose to us, and not we who propose to the women. Except,\r\n-of course, in middle-class life. But then the middle classes are not\r\n-modern.\u0022\r\n-\r\n-Dorian Gray laughed, and tossed his head. \u0022You are quite incorrigible,\r\n-Harry; but I don't mind. It is impossible to be angry with you. When\r\n-you see Sibyl Vane, you will feel that the man who could wrong her\r\n-would be a beast, a beast without a heart. I cannot understand how any\r\n-one can wish to shame the thing he loves. I love Sibyl Vane. I want\r\n-to place her on a pedestal of gold and to see the world worship the\r\n-woman who is mine. What is marriage? An irrevocable vow. You mock at\r\n-it for that. Ah! don't mock. It is an irrevocable vow that I want to\r\n-take. Her trust makes me faithful, her belief makes me good. When I\r\n-am with her, I regret all that you have taught me. I become different\r\n-from what you have known me to be. I am changed, and the mere touch of\r\n-Sibyl Vane's hand makes me forget you and all your wrong, fascinating,\r\n-poisonous, delightful theories.\u0022\r\n-\r\n-\u0022And those are ...?\u0022 asked Lord Henry, helping himself to some salad.\r\n-\r\n-\u0022Oh, your theories about life, your theories about love, your theories\r\n-about pleasure. All your theories, in fact, Harry.\u0022\r\n-\r\n-\u0022Pleasure is the only thing worth having a theory about,\u0022 he answered\r\n-in his slow melodious voice. \u0022But I am afraid I cannot claim my theory\r\n-as my own. It belongs to Nature, not to me. Pleasure is Nature's\r\n-test, her sign of approval. When we are happy, we are always good, but\r\n-when we are good, we are not always happy.\u0022\r\n-\r\n-\u0022Ah! but what do you mean by good?\u0022 cried Basil Hallward.\r\n-\r\n-\u0022Yes,\u0022 echoed Dorian, leaning back in his chair and looking at Lord\r\n-Henry over the heavy clusters of purple-lipped irises that stood in the\r\n-centre of the table, \u0022what do you mean by good, Harry?\u0022\r\n-\r\n-\u0022To be good is to be in harmony with one's self,\u0022 he replied, touching\r\n-the thin stem of his glass with his pale, fine-pointed fingers.\r\n-\u0022Discord is to be forced to be in harmony with others. One's own\r\n-life--that is the important thing. As for the lives of one's\r\n-neighbours, if one wishes to be a prig or a Puritan, one can flaunt\r\n-one's moral views about them, but they are not one's concern. Besides,\r\n-individualism has really the higher aim. Modern morality consists in\r\n-accepting the standard of one's age. I consider that for any man of\r\n-culture to accept the standard of his age is a form of the grossest\r\n-immorality.\u0022\r\n-\r\n-\u0022But, surely, if one lives merely for one's self, Harry, one pays a\r\n-terrible price for doing so?\u0022 suggested the painter.\r\n-\r\n-\u0022Yes, we are overcharged for everything nowadays. I should fancy that\r\n-the real tragedy of the poor is that they can afford nothing but\r\n-self-denial. Beautiful sins, like beautiful things, are the privilege\r\n-of the rich.\u0022\r\n-\r\n-\u0022One has to pay in other ways but money.\u0022\r\n-\r\n-\u0022What sort of ways, Basil?\u0022\r\n-\r\n-\u0022Oh! I should fancy in remorse, in suffering, in ... well, in the\r\n-consciousness of degradation.\u0022\r\n-\r\n-Lord Henry shrugged his shoulders. \u0022My dear fellow, mediaeval art is\r\n-charming, but mediaeval emotions are out of date. One can use them in\r\n-fiction, of course. But then the only things that one can use in\r\n-fiction are the things that one has ceased to use in fact. Believe me,\r\n-no civilized man ever regrets a pleasure, and no uncivilized man ever\r\n-knows what a pleasure is.\u0022\r\n-\r\n-\u0022I know what pleasure is,\u0022 cried Dorian Gray. \u0022It is to adore some\r\n-one.\u0022\r\n-\r\n-\u0022That is certainly better than being adored,\u0022 he answered, toying with\r\n-some fruits. \u0022Being adored is a nuisance. Women treat us just as\r\n-humanity treats its gods. They worship us, and are always bothering us\r\n-to do something for them.\u0022\r\n-\r\n-\u0022I should have said that whatever they ask for they had first given to\r\n-us,\u0022 murmured the lad gravely. \u0022They create love in our natures. They\r\n-have a right to demand it back.\u0022\r\n-\r\n-\u0022That is quite true, Dorian,\u0022 cried Hallward.\r\n-\r\n-\u0022Nothing is ever quite true,\u0022 said Lord Henry.\r\n-\r\n-\u0022This is,\u0022 interrupted Dorian. \u0022You must admit, Harry, that women give\r\n-to men the very gold of their lives.\u0022\r\n-\r\n-\u0022Possibly,\u0022 he sighed, \u0022but they invariably want it back in such very\r\n-small change. That is the worry. Women, as some witty Frenchman once\r\n-put it, inspire us with the desire to do masterpieces and always\r\n-prevent us from carrying them out.\u0022\r\n-\r\n-\u0022Harry, you are dreadful! I don't know why I like you so much.\u0022\r\n-\r\n-\u0022You will always like me, Dorian,\u0022 he replied. \u0022Will you have some\r\n-coffee, you fellows? Waiter, bring coffee, and _fine-champagne_, and\r\n-some cigarettes. No, don't mind the cigarettes--I have some. Basil, I\r\n-can't allow you to smoke cigars. You must have a cigarette. A\r\n-cigarette is the perfect type of a perfect pleasure. It is exquisite,\r\n-and it leaves one unsatisfied. What more can one want? Yes, Dorian,\r\n-you will always be fond of me. I represent to you all the sins you\r\n-have never had the courage to commit.\u0022\r\n-\r\n-\u0022What nonsense you talk, Harry!\u0022 cried the lad, taking a light from a\r\n-fire-breathing silver dragon that the waiter had placed on the table.\r\n-\u0022Let us go down to the theatre. When Sibyl comes on the stage you will\r\n-have a new ideal of life. She will represent something to you that you\r\n-have never known.\u0022\r\n-\r\n-\u0022I have known everything,\u0022 said Lord Henry, with a tired look in his\r\n-eyes, \u0022but I am always ready for a new emotion. I am afraid, however,\r\n-that, for me at any rate, there is no such thing. Still, your\r\n-wonderful girl may thrill me. I love acting. It is so much more real\r\n-than life. Let us go. Dorian, you will come with me. I am so sorry,\r\n-Basil, but there is only room for two in the brougham. You must follow\r\n-us in a hansom.\u0022\r\n-\r\n-They got up and put on their coats, sipping their coffee standing. The\r\n-painter was silent and preoccupied. There was a gloom over him. He\r\n-could not bear this marriage, and yet it seemed to him to be better\r\n-than many other things that might have happened. After a few minutes,\r\n-they all passed downstairs. He drove off by himself, as had been\r\n-arranged, and watched the flashing lights of the little brougham in\r\n-front of him. A strange sense of loss came over him. He felt that\r\n-Dorian Gray would never again be to him all that he had been in the\r\n-past. Life had come between them.... His eyes darkened, and the\r\n-crowded flaring streets became blurred to his eyes. When the cab drew\r\n-up at the theatre, it seemed to him that he had grown years older.\r\n-\r\n-\r\n-\r\n-CHAPTER 7\r\n-\r\n-For some reason or other, the house was crowded that night, and the fat\r\n-Jew manager who met them at the door was beaming from ear to ear with\r\n-an oily tremulous smile. He escorted them to their box with a sort of\r\n-pompous humility, waving his fat jewelled hands and talking at the top\r\n-of his voice. Dorian Gray loathed him more than ever. He felt as if\r\n-he had come to look for Miranda and had been met by Caliban. Lord\r\n-Henry, upon the other hand, rather liked him. At least he declared he\r\n-did, and insisted on shaking him by the hand and assuring him that he\r\n-was proud to meet a man who had discovered a real genius and gone\r\n-bankrupt over a poet. Hallward amused himself with watching the faces\r\n-in the pit. The heat was terribly oppressive, and the huge sunlight\r\n-flamed like a monstrous dahlia with petals of yellow fire. The youths\r\n-in the gallery had taken off their coats and waistcoats and hung them\r\n-over the side. They talked to each other across the theatre and shared\r\n-their oranges with the tawdry girls who sat beside them. Some women\r\n-were laughing in the pit. Their voices were horribly shrill and\r\n-discordant. The sound of the popping of corks came from the bar.\r\n-\r\n-\u0022What a place to find one's divinity in!\u0022 said Lord Henry.\r\n-\r\n-\u0022Yes!\u0022 answered Dorian Gray. \u0022It was here I found her, and she is\r\n-divine beyond all living things. When she acts, you will forget\r\n-everything. These common rough people, with their coarse faces and\r\n-brutal gestures, become quite different when she is on the stage. They\r\n-sit silently and watch her. They weep and laugh as she wills them to\r\n-do. She makes them as responsive as a violin. She spiritualizes them,\r\n-and one feels that they are of the same flesh and blood as one's self.\u0022\r\n-\r\n-\u0022The same flesh and blood as one's self! Oh, I hope not!\u0022 exclaimed\r\n-Lord Henry, who was scanning the occupants of the gallery through his\r\n-opera-glass.\r\n-\r\n-\u0022Don't pay any attention to him, Dorian,\u0022 said the painter. \u0022I\r\n-understand what you mean, and I believe in this girl. Any one you love\r\n-must be marvellous, and any girl who has the effect you describe must\r\n-be fine and noble. To spiritualize one's age--that is something worth\r\n-doing. If this girl can give a soul to those who have lived without\r\n-one, if she can create the sense of beauty in people whose lives have\r\n-been sordid and ugly, if she can strip them of their selfishness and\r\n-lend them tears for sorrows that are not their own, she is worthy of\r\n-all your adoration, worthy of the adoration of the world. This\r\n-marriage is quite right. I did not think so at first, but I admit it\r\n-now. The gods made Sibyl Vane for you. Without her you would have\r\n-been incomplete.\u0022\r\n-\r\n-\u0022Thanks, Basil,\u0022 answered Dorian Gray, pressing his hand. \u0022I knew that\r\n-you would understand me. Harry is so cynical, he terrifies me. But\r\n-here is the orchestra. It is quite dreadful, but it only lasts for\r\n-about five minutes. Then the curtain rises, and you will see the girl\r\n-to whom I am going to give all my life, to whom I have given everything\r\n-that is good in me.\u0022\r\n-\r\n-A quarter of an hour afterwards, amidst an extraordinary turmoil of\r\n-applause, Sibyl Vane stepped on to the stage. Yes, she was certainly\r\n-lovely to look at--one of the loveliest creatures, Lord Henry thought,\r\n-that he had ever seen. There was something of the fawn in her shy\r\n-grace and startled eyes. A faint blush, like the shadow of a rose in a\r\n-mirror of silver, came to her cheeks as she glanced at the crowded\r\n-enthusiastic house. She stepped back a few paces and her lips seemed\r\n-to tremble. Basil Hallward leaped to his feet and began to applaud.\r\n-Motionless, and as one in a dream, sat Dorian Gray, gazing at her.\r\n-Lord Henry peered through his glasses, murmuring, \u0022Charming! charming!\u0022\r\n-\r\n-The scene was the hall of Capulet's house, and Romeo in his pilgrim's\r\n-dress had entered with Mercutio and his other friends. The band, such\r\n-as it was, struck up a few bars of music, and the dance began. Through\r\n-the crowd of ungainly, shabbily dressed actors, Sibyl Vane moved like a\r\n-creature from a finer world. Her body swayed, while she danced, as a\r\n-plant sways in the water. The curves of her throat were the curves of\r\n-a white lily. Her hands seemed to be made of cool ivory.\r\n-\r\n-Yet she was curiously listless. She showed no sign of joy when her\r\n-eyes rested on Romeo. The few words she had to speak--\r\n-\r\n- Good pilgrim, you do wrong your hand too much,\r\n- Which mannerly devotion shows in this;\r\n- For saints have hands that pilgrims' hands do touch,\r\n- And palm to palm is holy palmers' kiss--\r\n-\r\n-with the brief dialogue that follows, were spoken in a thoroughly\r\n-artificial manner. The voice was exquisite, but from the point of view\r\n-of tone it was absolutely false. It was wrong in colour. It took away\r\n-all the life from the verse. It made the passion unreal.\r\n-\r\n-Dorian Gray grew pale as he watched her. He was puzzled and anxious.\r\n-Neither of his friends dared to say anything to him. She seemed to\r\n-them to be absolutely incompetent. They were horribly disappointed.\r\n-\r\n-Yet they felt that the true test of any Juliet is the balcony scene of\r\n-the second act. They waited for that. If she failed there, there was\r\n-nothing in her.\r\n-\r\n-She looked charming as she came out in the moonlight. That could not\r\n-be denied. But the staginess of her acting was unbearable, and grew\r\n-worse as she went on. Her gestures became absurdly artificial. She\r\n-overemphasized everything that she had to say. The beautiful passage--\r\n-\r\n- Thou knowest the mask of night is on my face,\r\n- Else would a maiden blush bepaint my cheek\r\n- For that which thou hast heard me speak to-night--\r\n-\r\n-was declaimed with the painful precision of a schoolgirl who has been\r\n-taught to recite by some second-rate professor of elocution. When she\r\n-leaned over the balcony and came to those wonderful lines--\r\n-\r\n- Although I joy in thee,\r\n- I have no joy of this contract to-night:\r\n- It is too rash, too unadvised, too sudden;\r\n- Too like the lightning, which doth cease to be\r\n- Ere one can say, \u0022It lightens.\u0022 Sweet, good-night!\r\n- This bud of love by summer's ripening breath\r\n- May prove a beauteous flower when next we meet--\r\n-\r\n-she spoke the words as though they conveyed no meaning to her. It was\r\n-not nervousness. Indeed, so far from being nervous, she was absolutely\r\n-self-contained. It was simply bad art. She was a complete failure.\r\n-\r\n-Even the common uneducated audience of the pit and gallery lost their\r\n-interest in the play. They got restless, and began to talk loudly and\r\n-to whistle. The Jew manager, who was standing at the back of the\r\n-dress-circle, stamped and swore with rage. The only person unmoved was\r\n-the girl herself.\r\n-\r\n-When the second act was over, there came a storm of hisses, and Lord\r\n-Henry got up from his chair and put on his coat. \u0022She is quite\r\n-beautiful, Dorian,\u0022 he said, \u0022but she can't act. Let us go.\u0022\r\n-\r\n-\u0022I am going to see the play through,\u0022 answered the lad, in a hard\r\n-bitter voice. \u0022I am awfully sorry that I have made you waste an\r\n-evening, Harry. I apologize to you both.\u0022\r\n-\r\n-\u0022My dear Dorian, I should think Miss Vane was ill,\u0022 interrupted\r\n-Hallward. \u0022We will come some other night.\u0022\r\n-\r\n-\u0022I wish she were ill,\u0022 he rejoined. \u0022But she seems to me to be simply\r\n-callous and cold. She has entirely altered. Last night she was a\r\n-great artist. This evening she is merely a commonplace mediocre\r\n-actress.\u0022\r\n-\r\n-\u0022Don't talk like that about any one you love, Dorian. Love is a more\r\n-wonderful thing than art.\u0022\r\n-\r\n-\u0022They are both simply forms of imitation,\u0022 remarked Lord Henry. \u0022But\r\n-do let us go. Dorian, you must not stay here any longer. It is not\r\n-good for one's morals to see bad acting. Besides, I don't suppose you\r\n-will want your wife to act, so what does it matter if she plays Juliet\r\n-like a wooden doll? She is very lovely, and if she knows as little\r\n-about life as she does about acting, she will be a delightful\r\n-experience. There are only two kinds of people who are really\r\n-fascinating--people who know absolutely everything, and people who know\r\n-absolutely nothing. Good heavens, my dear boy, don't look so tragic!\r\n-The secret of remaining young is never to have an emotion that is\r\n-unbecoming. Come to the club with Basil and myself. We will smoke\r\n-cigarettes and drink to the beauty of Sibyl Vane. She is beautiful.\r\n-What more can you want?\u0022\r\n-\r\n-\u0022Go away, Harry,\u0022 cried the lad. \u0022I want to be alone. Basil, you must\r\n-go. Ah! can't you see that my heart is breaking?\u0022 The hot tears came\r\n-to his eyes. His lips trembled, and rushing to the back of the box, he\r\n-leaned up against the wall, hiding his face in his hands.\r\n-\r\n-\u0022Let us go, Basil,\u0022 said Lord Henry with a strange tenderness in his\r\n-voice, and the two young men passed out together.\r\n-\r\n-A few moments afterwards the footlights flared up and the curtain rose\r\n-on the third act. Dorian Gray went back to his seat. He looked pale,\r\n-and proud, and indifferent. The play dragged on, and seemed\r\n-interminable. Half of the audience went out, tramping in heavy boots\r\n-and laughing. The whole thing was a _fiasco_. The last act was played\r\n-to almost empty benches. The curtain went down on a titter and some\r\n-groans.\r\n-\r\n-As soon as it was over, Dorian Gray rushed behind the scenes into the\r\n-greenroom. The girl was standing there alone, with a look of triumph\r\n-on her face. Her eyes were lit with an exquisite fire. There was a\r\n-radiance about her. Her parted lips were smiling over some secret of\r\n-their own.\r\n-\r\n-When he entered, she looked at him, and an expression of infinite joy\r\n-came over her. \u0022How badly I acted to-night, Dorian!\u0022 she cried.\r\n-\r\n-\u0022Horribly!\u0022 he answered, gazing at her in amazement. \u0022Horribly! It\r\n-was dreadful. Are you ill? You have no idea what it was. You have no\r\n-idea what I suffered.\u0022\r\n-\r\n-The girl smiled. \u0022Dorian,\u0022 she answered, lingering over his name with\r\n-long-drawn music in her voice, as though it were sweeter than honey to\r\n-the red petals of her mouth. \u0022Dorian, you should have understood. But\r\n-you understand now, don't you?\u0022\r\n-\r\n-\u0022Understand what?\u0022 he asked, angrily.\r\n-\r\n-\u0022Why I was so bad to-night. Why I shall always be bad. Why I shall\r\n-never act well again.\u0022\r\n-\r\n-He shrugged his shoulders. \u0022You are ill, I suppose. When you are ill\r\n-you shouldn't act. You make yourself ridiculous. My friends were\r\n-bored. I was bored.\u0022\r\n-\r\n-She seemed not to listen to him. She was transfigured with joy. An\r\n-ecstasy of happiness dominated her.\r\n-\r\n-\u0022Dorian, Dorian,\u0022 she cried, \u0022before I knew you, acting was the one\r\n-reality of my life. It was only in the theatre that I lived. I\r\n-thought that it was all true. I was Rosalind one night and Portia the\r\n-other. The joy of Beatrice was my joy, and the sorrows of Cordelia\r\n-were mine also. I believed in everything. The common people who acted\r\n-with me seemed to me to be godlike. The painted scenes were my world.\r\n-I knew nothing but shadows, and I thought them real. You came--oh, my\r\n-beautiful love!--and you freed my soul from prison. You taught me what\r\n-reality really is. To-night, for the first time in my life, I saw\r\n-through the hollowness, the sham, the silliness of the empty pageant in\r\n-which I had always played. To-night, for the first time, I became\r\n-conscious that the Romeo was hideous, and old, and painted, that the\r\n-moonlight in the orchard was false, that the scenery was vulgar, and\r\n-that the words I had to speak were unreal, were not my words, were not\r\n-what I wanted to say. You had brought me something higher, something\r\n-of which all art is but a reflection. You had made me understand what\r\n-love really is. My love! My love! Prince Charming! Prince of life!\r\n-I have grown sick of shadows. You are more to me than all art can ever\r\n-be. What have I to do with the puppets of a play? When I came on\r\n-to-night, I could not understand how it was that everything had gone\r\n-from me. I thought that I was going to be wonderful. I found that I\r\n-could do nothing. Suddenly it dawned on my soul what it all meant.\r\n-The knowledge was exquisite to me. I heard them hissing, and I smiled.\r\n-What could they know of love such as ours? Take me away, Dorian--take\r\n-me away with you, where we can be quite alone. I hate the stage. I\r\n-might mimic a passion that I do not feel, but I cannot mimic one that\r\n-burns me like fire. Oh, Dorian, Dorian, you understand now what it\r\n-signifies? Even if I could do it, it would be profanation for me to\r\n-play at being in love. You have made me see that.\u0022\r\n-\r\n-He flung himself down on the sofa and turned away his face. \u0022You have\r\n-killed my love,\u0022 he muttered.\r\n-\r\n-She looked at him in wonder and laughed. He made no answer. She came\r\n-across to him, and with her little fingers stroked his hair. She knelt\r\n-down and pressed his hands to her lips. He drew them away, and a\r\n-shudder ran through him.\r\n-\r\n-Then he leaped up and went to the door. \u0022Yes,\u0022 he cried, \u0022you have\r\n-killed my love. You used to stir my imagination. Now you don't even\r\n-stir my curiosity. You simply produce no effect. I loved you because\r\n-you were marvellous, because you had genius and intellect, because you\r\n-realized the dreams of great poets and gave shape and substance to the\r\n-shadows of art. You have thrown it all away. You are shallow and\r\n-stupid. My God! how mad I was to love you! What a fool I have been!\r\n-You are nothing to me now. I will never see you again. I will never\r\n-think of you. I will never mention your name. You don't know what you\r\n-were to me, once. Why, once ... Oh, I can't bear to think of it! I\r\n-wish I had never laid eyes upon you! You have spoiled the romance of\r\n-my life. How little you can know of love, if you say it mars your art!\r\n-Without your art, you are nothing. I would have made you famous,\r\n-splendid, magnificent. The world would have worshipped you, and you\r\n-would have borne my name. What are you now? A third-rate actress with\r\n-a pretty face.\u0022\r\n-\r\n-The girl grew white, and trembled. She clenched her hands together,\r\n-and her voice seemed to catch in her throat. \u0022You are not serious,\r\n-Dorian?\u0022 she murmured. \u0022You are acting.\u0022\r\n-\r\n-\u0022Acting! I leave that to you. You do it so well,\u0022 he answered\r\n-bitterly.\r\n-\r\n-She rose from her knees and, with a piteous expression of pain in her\r\n-face, came across the room to him. She put her hand upon his arm and\r\n-looked into his eyes. He thrust her back. \u0022Don't touch me!\u0022 he cried.\r\n-\r\n-A low moan broke from her, and she flung herself at his feet and lay\r\n-there like a trampled flower. \u0022Dorian, Dorian, don't leave me!\u0022 she\r\n-whispered. \u0022I am so sorry I didn't act well. I was thinking of you\r\n-all the time. But I will try--indeed, I will try. It came so suddenly\r\n-across me, my love for you. I think I should never have known it if\r\n-you had not kissed me--if we had not kissed each other. Kiss me again,\r\n-my love. Don't go away from me. I couldn't bear it. Oh! don't go\r\n-away from me. My brother ... No; never mind. He didn't mean it. He\r\n-was in jest.... But you, oh! can't you forgive me for to-night? I will\r\n-work so hard and try to improve. Don't be cruel to me, because I love\r\n-you better than anything in the world. After all, it is only once that\r\n-I have not pleased you. But you are quite right, Dorian. I should\r\n-have shown myself more of an artist. It was foolish of me, and yet I\r\n-couldn't help it. Oh, don't leave me, don't leave me.\u0022 A fit of\r\n-passionate sobbing choked her. She crouched on the floor like a\r\n-wounded thing, and Dorian Gray, with his beautiful eyes, looked down at\r\n-her, and his chiselled lips curled in exquisite disdain. There is\r\n-always something ridiculous about the emotions of people whom one has\r\n-ceased to love. Sibyl Vane seemed to him to be absurdly melodramatic.\r\n-Her tears and sobs annoyed him.\r\n-\r\n-\u0022I am going,\u0022 he said at last in his calm clear voice. \u0022I don't wish\r\n-to be unkind, but I can't see you again. You have disappointed me.\u0022\r\n-\r\n-She wept silently, and made no answer, but crept nearer. Her little\r\n-hands stretched blindly out, and appeared to be seeking for him. He\r\n-turned on his heel and left the room. In a few moments he was out of\r\n-the theatre.\r\n-\r\n-Where he went to he hardly knew. He remembered wandering through dimly\r\n-lit streets, past gaunt, black-shadowed archways and evil-looking\r\n-houses. Women with hoarse voices and harsh laughter had called after\r\n-him. Drunkards had reeled by, cursing and chattering to themselves\r\n-like monstrous apes. He had seen grotesque children huddled upon\r\n-door-steps, and heard shrieks and oaths from gloomy courts.\r\n-\r\n-As the dawn was just breaking, he found himself close to Covent Garden.\r\n-The darkness lifted, and, flushed with faint fires, the sky hollowed\r\n-itself into a perfect pearl. Huge carts filled with nodding lilies\r\n-rumbled slowly down the polished empty street. The air was heavy with\r\n-the perfume of the flowers, and their beauty seemed to bring him an\r\n-anodyne for his pain. He followed into the market and watched the men\r\n-unloading their waggons. A white-smocked carter offered him some\r\n-cherries. He thanked him, wondered why he refused to accept any money\r\n-for them, and began to eat them listlessly. They had been plucked at\r\n-midnight, and the coldness of the moon had entered into them. A long\r\n-line of boys carrying crates of striped tulips, and of yellow and red\r\n-roses, defiled in front of him, threading their way through the huge,\r\n-jade-green piles of vegetables. Under the portico, with its grey,\r\n-sun-bleached pillars, loitered a troop of draggled bareheaded girls,\r\n-waiting for the auction to be over. Others crowded round the swinging\r\n-doors of the coffee-house in the piazza. The heavy cart-horses slipped\r\n-and stamped upon the rough stones, shaking their bells and trappings.\r\n-Some of the drivers were lying asleep on a pile of sacks. Iris-necked\r\n-and pink-footed, the pigeons ran about picking up seeds.\r\n-\r\n-After a little while, he hailed a hansom and drove home. For a few\r\n-moments he loitered upon the doorstep, looking round at the silent\r\n-square, with its blank, close-shuttered windows and its staring blinds.\r\n-The sky was pure opal now, and the roofs of the houses glistened like\r\n-silver against it. From some chimney opposite a thin wreath of smoke\r\n-was rising. It curled, a violet riband, through the nacre-coloured air.\r\n-\r\n-In the huge gilt Venetian lantern, spoil of some Doge's barge, that\r\n-hung from the ceiling of the great, oak-panelled hall of entrance,\r\n-lights were still burning from three flickering jets: thin blue petals\r\n-of flame they seemed, rimmed with white fire. He turned them out and,\r\n-having thrown his hat and cape on the table, passed through the library\r\n-towards the door of his bedroom, a large octagonal chamber on the\r\n-ground floor that, in his new-born feeling for luxury, he had just had\r\n-decorated for himself and hung with some curious Renaissance tapestries\r\n-that had been discovered stored in a disused attic at Selby Royal. As\r\n-he was turning the handle of the door, his eye fell upon the portrait\r\n-Basil Hallward had painted of him. He started back as if in surprise.\r\n-Then he went on into his own room, looking somewhat puzzled. After he\r\n-had taken the button-hole out of his coat, he seemed to hesitate.\r\n-Finally, he came back, went over to the picture, and examined it. In\r\n-the dim arrested light that struggled through the cream-coloured silk\r\n-blinds, the face appeared to him to be a little changed. The\r\n-expression looked different. One would have said that there was a\r\n-touch of cruelty in the mouth. It was certainly strange.\r\n-\r\n-He turned round and, walking to the window, drew up the blind. The\r\n-bright dawn flooded the room and swept the fantastic shadows into dusky\r\n-corners, where they lay shuddering. But the strange expression that he\r\n-had noticed in the face of the portrait seemed to linger there, to be\r\n-more intensified even. The quivering ardent sunlight showed him the\r\n-lines of cruelty round the mouth as clearly as if he had been looking\r\n-into a mirror after he had done some dreadful thing.\r\n-\r\n-He winced and, taking up from the table an oval glass framed in ivory\r\n-Cupids, one of Lord Henry's many presents to him, glanced hurriedly\r\n-into its polished depths. No line like that warped his red lips. What\r\n-did it mean?\r\n-\r\n-He rubbed his eyes, and came close to the picture, and examined it\r\n-again. There were no signs of any change when he looked into the\r\n-actual painting, and yet there was no doubt that the whole expression\r\n-had altered. It was not a mere fancy of his own. The thing was\r\n-horribly apparent.\r\n-\r\n-He threw himself into a chair and began to think. Suddenly there\r\n-flashed across his mind what he had said in Basil Hallward's studio the\r\n-day the picture had been finished. Yes, he remembered it perfectly.\r\n-He had uttered a mad wish that he himself might remain young, and the\r\n-portrait grow old; that his own beauty might be untarnished, and the\r\n-face on the canvas bear the burden of his passions and his sins; that\r\n-the painted image might be seared with the lines of suffering and\r\n-thought, and that he might keep all the delicate bloom and loveliness\r\n-of his then just conscious boyhood. Surely his wish had not been\r\n-fulfilled? Such things were impossible. It seemed monstrous even to\r\n-think of them. And, yet, there was the picture before him, with the\r\n-touch of cruelty in the mouth.\r\n-\r\n-Cruelty! Had he been cruel? It was the girl's fault, not his. He had\r\n-dreamed of her as a great artist, had given his love to her because he\r\n-had thought her great. Then she had disappointed him. She had been\r\n-shallow and unworthy. And, yet, a feeling of infinite regret came over\r\n-him, as he thought of her lying at his feet sobbing like a little\r\n-child. He remembered with what callousness he had watched her. Why\r\n-had he been made like that? Why had such a soul been given to him?\r\n-But he had suffered also. During the three terrible hours that the\r\n-play had lasted, he had lived centuries of pain, aeon upon aeon of\r\n-torture. His life was well worth hers. She had marred him for a\r\n-moment, if he had wounded her for an age. Besides, women were better\r\n-suited to bear sorrow than men. They lived on their emotions. They\r\n-only thought of their emotions. When they took lovers, it was merely\r\n-to have some one with whom they could have scenes. Lord Henry had told\r\n-him that, and Lord Henry knew what women were. Why should he trouble\r\n-about Sibyl Vane? She was nothing to him now.\r\n-\r\n-But the picture? What was he to say of that? It held the secret of\r\n-his life, and told his story. It had taught him to love his own\r\n-beauty. Would it teach him to loathe his own soul? Would he ever look\r\n-at it again?\r\n-\r\n-No; it was merely an illusion wrought on the troubled senses. The\r\n-horrible night that he had passed had left phantoms behind it.\r\n-Suddenly there had fallen upon his brain that tiny scarlet speck that\r\n-makes men mad. The picture had not changed. It was folly to think so.\r\n-\r\n-Yet it was watching him, with its beautiful marred face and its cruel\r\n-smile. Its bright hair gleamed in the early sunlight. Its blue eyes\r\n-met his own. A sense of infinite pity, not for himself, but for the\r\n-painted image of himself, came over him. It had altered already, and\r\n-would alter more. Its gold would wither into grey. Its red and white\r\n-roses would die. For every sin that he committed, a stain would fleck\r\n-and wreck its fairness. But he would not sin. The picture, changed or\r\n-unchanged, would be to him the visible emblem of conscience. He would\r\n-resist temptation. He would not see Lord Henry any more--would not, at\r\n-any rate, listen to those subtle poisonous theories that in Basil\r\n-Hallward's garden had first stirred within him the passion for\r\n-impossible things. He would go back to Sibyl Vane, make her amends,\r\n-marry her, try to love her again. Yes, it was his duty to do so. She\r\n-must have suffered more than he had. Poor child! He had been selfish\r\n-and cruel to her. The fascination that she had exercised over him\r\n-would return. They would be happy together. His life with her would\r\n-be beautiful and pure.\r\n-\r\n-He got up from his chair and drew a large screen right in front of the\r\n-portrait, shuddering as he glanced at it. \u0022How horrible!\u0022 he murmured\r\n-to himself, and he walked across to the window and opened it. When he\r\n-stepped out on to the grass, he drew a deep breath. The fresh morning\r\n-air seemed to drive away all his sombre passions. He thought only of\r\n-Sibyl. A faint echo of his love came back to him. He repeated her\r\n-name over and over again. The birds that were singing in the\r\n-dew-drenched garden seemed to be telling the flowers about her.\r\n-\r\n-\r\n-\r\n-CHAPTER 8\r\n-\r\n-It was long past noon when he awoke. His valet had crept several times\r\n-on tiptoe into the room to see if he was stirring, and had wondered\r\n-what made his young master sleep so late. Finally his bell sounded,\r\n-and Victor came in softly with a cup of tea, and a pile of letters, on\r\n-a small tray of old Sevres china, and drew back the olive-satin\r\n-curtains, with their shimmering blue lining, that hung in front of the\r\n-three tall windows.\r\n-\r\n-\u0022Monsieur has well slept this morning,\u0022 he said, smiling.\r\n-\r\n-\u0022What o'clock is it, Victor?\u0022 asked Dorian Gray drowsily.\r\n-\r\n-\u0022One hour and a quarter, Monsieur.\u0022\r\n-\r\n-How late it was! He sat up, and having sipped some tea, turned over\r\n-his letters. One of them was from Lord Henry, and had been brought by\r\n-hand that morning. He hesitated for a moment, and then put it aside.\r\n-The others he opened listlessly. They contained the usual collection\r\n-of cards, invitations to dinner, tickets for private views, programmes\r\n-of charity concerts, and the like that are showered on fashionable\r\n-young men every morning during the season. There was a rather heavy\r\n-bill for a chased silver Louis-Quinze toilet-set that he had not yet\r\n-had the courage to send on to his guardians, who were extremely\r\n-old-fashioned people and did not realize that we live in an age when\r\n-unnecessary things are our only necessities; and there were several\r\n-very courteously worded communications from Jermyn Street money-lenders\r\n-offering to advance any sum of money at a moment's notice and at the\r\n-most reasonable rates of interest.\r\n-\r\n-After about ten minutes he got up, and throwing on an elaborate\r\n-dressing-gown of silk-embroidered cashmere wool, passed into the\r\n-onyx-paved bathroom. The cool water refreshed him after his long\r\n-sleep. He seemed to have forgotten all that he had gone through. A\r\n-dim sense of having taken part in some strange tragedy came to him once\r\n-or twice, but there was the unreality of a dream about it.\r\n-\r\n-As soon as he was dressed, he went into the library and sat down to a\r\n-light French breakfast that had been laid out for him on a small round\r\n-table close to the open window. It was an exquisite day. The warm air\r\n-seemed laden with spices. A bee flew in and buzzed round the\r\n-blue-dragon bowl that, filled with sulphur-yellow roses, stood before\r\n-him. He felt perfectly happy.\r\n-\r\n-Suddenly his eye fell on the screen that he had placed in front of the\r\n-portrait, and he started.\r\n-\r\n-\u0022Too cold for Monsieur?\u0022 asked his valet, putting an omelette on the\r\n-table. \u0022I shut the window?\u0022\r\n-\r\n-Dorian shook his head. \u0022I am not cold,\u0022 he murmured.\r\n-\r\n-Was it all true? Had the portrait really changed? Or had it been\r\n-simply his own imagination that had made him see a look of evil where\r\n-there had been a look of joy? Surely a painted canvas could not alter?\r\n-The thing was absurd. It would serve as a tale to tell Basil some day.\r\n-It would make him smile.\r\n-\r\n-And, yet, how vivid was his recollection of the whole thing! First in\r\n-the dim twilight, and then in the bright dawn, he had seen the touch of\r\n-cruelty round the warped lips. He almost dreaded his valet leaving the\r\n-room. He knew that when he was alone he would have to examine the\r\n-portrait. He was afraid of certainty. When the coffee and cigarettes\r\n-had been brought and the man turned to go, he felt a wild desire to\r\n-tell him to remain. As the door was closing behind him, he called him\r\n-back. The man stood waiting for his orders. Dorian looked at him for\r\n-a moment. \u0022I am not at home to any one, Victor,\u0022 he said with a sigh.\r\n-The man bowed and retired.\r\n-\r\n-Then he rose from the table, lit a cigarette, and flung himself down on\r\n-a luxuriously cushioned couch that stood facing the screen. The screen\r\n-was an old one, of gilt Spanish leather, stamped and wrought with a\r\n-rather florid Louis-Quatorze pattern. He scanned it curiously,\r\n-wondering if ever before it had concealed the secret of a man's life.\r\n-\r\n-Should he move it aside, after all? Why not let it stay there? What\r\n-was the use of knowing? If the thing was true, it was terrible. If it\r\n-was not true, why trouble about it? But what if, by some fate or\r\n-deadlier chance, eyes other than his spied behind and saw the horrible\r\n-change? What should he do if Basil Hallward came and asked to look at\r\n-his own picture? Basil would be sure to do that. No; the thing had to\r\n-be examined, and at once. Anything would be better than this dreadful\r\n-state of doubt.\r\n-\r\n-He got up and locked both doors. At least he would be alone when he\r\n-looked upon the mask of his shame. Then he drew the screen aside and\r\n-saw himself face to face. It was perfectly true. The portrait had\r\n-altered.\r\n-\r\n-As he often remembered afterwards, and always with no small wonder, he\r\n-found himself at first gazing at the portrait with a feeling of almost\r\n-scientific interest. That such a change should have taken place was\r\n-incredible to him. And yet it was a fact. Was there some subtle\r\n-affinity between the chemical atoms that shaped themselves into form\r\n-and colour on the canvas and the soul that was within him? Could it be\r\n-that what that soul thought, they realized?--that what it dreamed, they\r\n-made true? Or was there some other, more terrible reason? He\r\n-shuddered, and felt afraid, and, going back to the couch, lay there,\r\n-gazing at the picture in sickened horror.\r\n-\r\n-One thing, however, he felt that it had done for him. It had made him\r\n-conscious how unjust, how cruel, he had been to Sibyl Vane. It was not\r\n-too late to make reparation for that. She could still be his wife.\r\n-His unreal and selfish love would yield to some higher influence, would\r\n-be transformed into some nobler passion, and the portrait that Basil\r\n-Hallward had painted of him would be a guide to him through life, would\r\n-be to him what holiness is to some, and conscience to others, and the\r\n-fear of God to us all. There were opiates for remorse, drugs that\r\n-could lull the moral sense to sleep. But here was a visible symbol of\r\n-the degradation of sin. Here was an ever-present sign of the ruin men\r\n-brought upon their souls.\r\n-\r\n-Three o'clock struck, and four, and the half-hour rang its double\r\n-chime, but Dorian Gray did not stir. He was trying to gather up the\r\n-scarlet threads of life and to weave them into a pattern; to find his\r\n-way through the sanguine labyrinth of passion through which he was\r\n-wandering. He did not know what to do, or what to think. Finally, he\r\n-went over to the table and wrote a passionate letter to the girl he had\r\n-loved, imploring her forgiveness and accusing himself of madness. He\r\n-covered page after page with wild words of sorrow and wilder words of\r\n-pain. There is a luxury in self-reproach. When we blame ourselves, we\r\n-feel that no one else has a right to blame us. It is the confession,\r\n-not the priest, that gives us absolution. When Dorian had finished the\r\n-letter, he felt that he had been forgiven.\r\n-\r\n-Suddenly there came a knock to the door, and he heard Lord Henry's\r\n-voice outside. \u0022My dear boy, I must see you. Let me in at once. I\r\n-can't bear your shutting yourself up like this.\u0022\r\n-\r\n-He made no answer at first, but remained quite still. The knocking\r\n-still continued and grew louder. Yes, it was better to let Lord Henry\r\n-in, and to explain to him the new life he was going to lead, to quarrel\r\n-with him if it became necessary to quarrel, to part if parting was\r\n-inevitable. He jumped up, drew the screen hastily across the picture,\r\n-and unlocked the door.\r\n-\r\n-\u0022I am so sorry for it all, Dorian,\u0022 said Lord Henry as he entered.\r\n-\u0022But you must not think too much about it.\u0022\r\n-\r\n-\u0022Do you mean about Sibyl Vane?\u0022 asked the lad.\r\n-\r\n-\u0022Yes, of course,\u0022 answered Lord Henry, sinking into a chair and slowly\r\n-pulling off his yellow gloves. \u0022It is dreadful, from one point of\r\n-view, but it was not your fault. Tell me, did you go behind and see\r\n-her, after the play was over?\u0022\r\n-\r\n-\u0022Yes.\u0022\r\n-\r\n-\u0022I felt sure you had. Did you make a scene with her?\u0022\r\n-\r\n-\u0022I was brutal, Harry--perfectly brutal. But it is all right now. I am\r\n-not sorry for anything that has happened. It has taught me to know\r\n-myself better.\u0022\r\n-\r\n-\u0022Ah, Dorian, I am so glad you take it in that way! I was afraid I\r\n-would find you plunged in remorse and tearing that nice curly hair of\r\n-yours.\u0022\r\n-\r\n-\u0022I have got through all that,\u0022 said Dorian, shaking his head and\r\n-smiling. \u0022I am perfectly happy now. I know what conscience is, to\r\n-begin with. It is not what you told me it was. It is the divinest\r\n-thing in us. Don't sneer at it, Harry, any more--at least not before\r\n-me. I want to be good. I can't bear the idea of my soul being\r\n-hideous.\u0022\r\n-\r\n-\u0022A very charming artistic basis for ethics, Dorian! I congratulate you\r\n-on it. But how are you going to begin?\u0022\r\n-\r\n-\u0022By marrying Sibyl Vane.\u0022\r\n-\r\n-\u0022Marrying Sibyl Vane!\u0022 cried Lord Henry, standing up and looking at him\r\n-in perplexed amazement. \u0022But, my dear Dorian--\u0022\r\n-\r\n-\u0022Yes, Harry, I know what you are going to say. Something dreadful\r\n-about marriage. Don't say it. Don't ever say things of that kind to\r\n-me again. Two days ago I asked Sibyl to marry me. I am not going to\r\n-break my word to her. She is to be my wife.\u0022\r\n-\r\n-\u0022Your wife! Dorian! ... Didn't you get my letter? I wrote to you this\r\n-morning, and sent the note down by my own man.\u0022\r\n-\r\n-\u0022Your letter? Oh, yes, I remember. I have not read it yet, Harry. I\r\n-was afraid there might be something in it that I wouldn't like. You\r\n-cut life to pieces with your epigrams.\u0022\r\n-\r\n-\u0022You know nothing then?\u0022\r\n-\r\n-\u0022What do you mean?\u0022\r\n-\r\n-Lord Henry walked across the room, and sitting down by Dorian Gray,\r\n-took both his hands in his own and held them tightly. \u0022Dorian,\u0022 he\r\n-said, \u0022my letter--don't be frightened--was to tell you that Sibyl Vane\r\n-is dead.\u0022\r\n-\r\n-A cry of pain broke from the lad's lips, and he leaped to his feet,\r\n-tearing his hands away from Lord Henry's grasp. \u0022Dead! Sibyl dead!\r\n-It is not true! It is a horrible lie! How dare you say it?\u0022\r\n-\r\n-\u0022It is quite true, Dorian,\u0022 said Lord Henry, gravely. \u0022It is in all\r\n-the morning papers. I wrote down to you to ask you not to see any one\r\n-till I came. There will have to be an inquest, of course, and you must\r\n-not be mixed up in it. Things like that make a man fashionable in\r\n-Paris. But in London people are so prejudiced. Here, one should never\r\n-make one's _debut_ with a scandal. One should reserve that to give an\r\n-interest to one's old age. I suppose they don't know your name at the\r\n-theatre? If they don't, it is all right. Did any one see you going\r\n-round to her room? That is an important point.\u0022\r\n-\r\n-Dorian did not answer for a few moments. He was dazed with horror.\r\n-Finally he stammered, in a stifled voice, \u0022Harry, did you say an\r\n-inquest? What did you mean by that? Did Sibyl--? Oh, Harry, I can't\r\n-bear it! But be quick. Tell me everything at once.\u0022\r\n-\r\n-\u0022I have no doubt it was not an accident, Dorian, though it must be put\r\n-in that way to the public. It seems that as she was leaving the\r\n-theatre with her mother, about half-past twelve or so, she said she had\r\n-forgotten something upstairs. They waited some time for her, but she\r\n-did not come down again. They ultimately found her lying dead on the\r\n-floor of her dressing-room. She had swallowed something by mistake,\r\n-some dreadful thing they use at theatres. I don't know what it was,\r\n-but it had either prussic acid or white lead in it. I should fancy it\r\n-was prussic acid, as she seems to have died instantaneously.\u0022\r\n-\r\n-\u0022Harry, Harry, it is terrible!\u0022 cried the lad.\r\n-\r\n-\u0022Yes; it is very tragic, of course, but you must not get yourself mixed\r\n-up in it. I see by _The Standard_ that she was seventeen. I should have\r\n-thought she was almost younger than that. She looked such a child, and\r\n-seemed to know so little about acting. Dorian, you mustn't let this\r\n-thing get on your nerves. You must come and dine with me, and\r\n-afterwards we will look in at the opera. It is a Patti night, and\r\n-everybody will be there. You can come to my sister's box. She has got\r\n-some smart women with her.\u0022\r\n-\r\n-\u0022So I have murdered Sibyl Vane,\u0022 said Dorian Gray, half to himself,\r\n-\u0022murdered her as surely as if I had cut her little throat with a knife.\r\n-Yet the roses are not less lovely for all that. The birds sing just as\r\n-happily in my garden. And to-night I am to dine with you, and then go\r\n-on to the opera, and sup somewhere, I suppose, afterwards. How\r\n-extraordinarily dramatic life is! If I had read all this in a book,\r\n-Harry, I think I would have wept over it. Somehow, now that it has\r\n-happened actually, and to me, it seems far too wonderful for tears.\r\n-Here is the first passionate love-letter I have ever written in my\r\n-life. Strange, that my first passionate love-letter should have been\r\n-addressed to a dead girl. Can they feel, I wonder, those white silent\r\n-people we call the dead? Sibyl! Can she feel, or know, or listen?\r\n-Oh, Harry, how I loved her once! It seems years ago to me now. She\r\n-was everything to me. Then came that dreadful night--was it really\r\n-only last night?--when she played so badly, and my heart almost broke.\r\n-She explained it all to me. It was terribly pathetic. But I was not\r\n-moved a bit. I thought her shallow. Suddenly something happened that\r\n-made me afraid. I can't tell you what it was, but it was terrible. I\r\n-said I would go back to her. I felt I had done wrong. And now she is\r\n-dead. My God! My God! Harry, what shall I do? You don't know the\r\n-danger I am in, and there is nothing to keep me straight. She would\r\n-have done that for me. She had no right to kill herself. It was\r\n-selfish of her.\u0022\r\n-\r\n-\u0022My dear Dorian,\u0022 answered Lord Henry, taking a cigarette from his case\r\n-and producing a gold-latten matchbox, \u0022the only way a woman can ever\r\n-reform a man is by boring him so completely that he loses all possible\r\n-interest in life. If you had married this girl, you would have been\r\n-wretched. Of course, you would have treated her kindly. One can\r\n-always be kind to people about whom one cares nothing. But she would\r\n-have soon found out that you were absolutely indifferent to her. And\r\n-when a woman finds that out about her husband, she either becomes\r\n-dreadfully dowdy, or wears very smart bonnets that some other woman's\r\n-husband has to pay for. I say nothing about the social mistake, which\r\n-would have been abject--which, of course, I would not have allowed--but\r\n-I assure you that in any case the whole thing would have been an\r\n-absolute failure.\u0022\r\n-\r\n-\u0022I suppose it would,\u0022 muttered the lad, walking up and down the room\r\n-and looking horribly pale. \u0022But I thought it was my duty. It is not\r\n-my fault that this terrible tragedy has prevented my doing what was\r\n-right. I remember your saying once that there is a fatality about good\r\n-resolutions--that they are always made too late. Mine certainly were.\u0022\r\n-\r\n-\u0022Good resolutions are useless attempts to interfere with scientific\r\n-laws. Their origin is pure vanity. Their result is absolutely _nil_.\r\n-They give us, now and then, some of those luxurious sterile emotions\r\n-that have a certain charm for the weak. That is all that can be said\r\n-for them. They are simply cheques that men draw on a bank where they\r\n-have no account.\u0022\r\n-\r\n-\u0022Harry,\u0022 cried Dorian Gray, coming over and sitting down beside him,\r\n-\u0022why is it that I cannot feel this tragedy as much as I want to? I\r\n-don't think I am heartless. Do you?\u0022\r\n-\r\n-\u0022You have done too many foolish things during the last fortnight to be\r\n-entitled to give yourself that name, Dorian,\u0022 answered Lord Henry with\r\n-his sweet melancholy smile.\r\n-\r\n-The lad frowned. \u0022I don't like that explanation, Harry,\u0022 he rejoined,\r\n-\u0022but I am glad you don't think I am heartless. I am nothing of the\r\n-kind. I know I am not. And yet I must admit that this thing that has\r\n-happened does not affect me as it should. It seems to me to be simply\r\n-like a wonderful ending to a wonderful play. It has all the terrible\r\n-beauty of a Greek tragedy, a tragedy in which I took a great part, but\r\n-by which I have not been wounded.\u0022\r\n-\r\n-\u0022It is an interesting question,\u0022 said Lord Henry, who found an\r\n-exquisite pleasure in playing on the lad's unconscious egotism, \u0022an\r\n-extremely interesting question. I fancy that the true explanation is\r\n-this: It often happens that the real tragedies of life occur in such\r\n-an inartistic manner that they hurt us by their crude violence, their\r\n-absolute incoherence, their absurd want of meaning, their entire lack\r\n-of style. They affect us just as vulgarity affects us. They give us\r\n-an impression of sheer brute force, and we revolt against that.\r\n-Sometimes, however, a tragedy that possesses artistic elements of\r\n-beauty crosses our lives. If these elements of beauty are real, the\r\n-whole thing simply appeals to our sense of dramatic effect. Suddenly\r\n-we find that we are no longer the actors, but the spectators of the\r\n-play. Or rather we are both. We watch ourselves, and the mere wonder\r\n-of the spectacle enthralls us. In the present case, what is it that\r\n-has really happened? Some one has killed herself for love of you. I\r\n-wish that I had ever had such an experience. It would have made me in\r\n-love with love for the rest of my life. The people who have adored\r\n-me--there have not been very many, but there have been some--have\r\n-always insisted on living on, long after I had ceased to care for them,\r\n-or they to care for me. They have become stout and tedious, and when I\r\n-meet them, they go in at once for reminiscences. That awful memory of\r\n-woman! What a fearful thing it is! And what an utter intellectual\r\n-stagnation it reveals! One should absorb the colour of life, but one\r\n-should never remember its details. Details are always vulgar.\u0022\r\n-\r\n-\u0022I must sow poppies in my garden,\u0022 sighed Dorian.\r\n-\r\n-\u0022There is no necessity,\u0022 rejoined his companion. \u0022Life has always\r\n-poppies in her hands. Of course, now and then things linger. I once\r\n-wore nothing but violets all through one season, as a form of artistic\r\n-mourning for a romance that would not die. Ultimately, however, it did\r\n-die. I forget what killed it. I think it was her proposing to\r\n-sacrifice the whole world for me. That is always a dreadful moment.\r\n-It fills one with the terror of eternity. Well--would you believe\r\n-it?--a week ago, at Lady Hampshire's, I found myself seated at dinner\r\n-next the lady in question, and she insisted on going over the whole\r\n-thing again, and digging up the past, and raking up the future. I had\r\n-buried my romance in a bed of asphodel. She dragged it out again and\r\n-assured me that I had spoiled her life. I am bound to state that she\r\n-ate an enormous dinner, so I did not feel any anxiety. But what a lack\r\n-of taste she showed! The one charm of the past is that it is the past.\r\n-But women never know when the curtain has fallen. They always want a\r\n-sixth act, and as soon as the interest of the play is entirely over,\r\n-they propose to continue it. If they were allowed their own way, every\r\n-comedy would have a tragic ending, and every tragedy would culminate in\r\n-a farce. They are charmingly artificial, but they have no sense of\r\n-art. You are more fortunate than I am. I assure you, Dorian, that not\r\n-one of the women I have known would have done for me what Sibyl Vane\r\n-did for you. Ordinary women always console themselves. Some of them\r\n-do it by going in for sentimental colours. Never trust a woman who\r\n-wears mauve, whatever her age may be, or a woman over thirty-five who\r\n-is fond of pink ribbons. It always means that they have a history.\r\n-Others find a great consolation in suddenly discovering the good\r\n-qualities of their husbands. They flaunt their conjugal felicity in\r\n-one's face, as if it were the most fascinating of sins. Religion\r\n-consoles some. Its mysteries have all the charm of a flirtation, a\r\n-woman once told me, and I can quite understand it. Besides, nothing\r\n-makes one so vain as being told that one is a sinner. Conscience makes\r\n-egotists of us all. Yes; there is really no end to the consolations\r\n-that women find in modern life. Indeed, I have not mentioned the most\r\n-important one.\u0022\r\n-\r\n-\u0022What is that, Harry?\u0022 said the lad listlessly.\r\n-\r\n-\u0022Oh, the obvious consolation. Taking some one else's admirer when one\r\n-loses one's own. In good society that always whitewashes a woman. But\r\n-really, Dorian, how different Sibyl Vane must have been from all the\r\n-women one meets! There is something to me quite beautiful about her\r\n-death. I am glad I am living in a century when such wonders happen.\r\n-They make one believe in the reality of the things we all play with,\r\n-such as romance, passion, and love.\u0022\r\n-\r\n-\u0022I was terribly cruel to her. You forget that.\u0022\r\n-\r\n-\u0022I am afraid that women appreciate cruelty, downright cruelty, more\r\n-than anything else. They have wonderfully primitive instincts. We\r\n-have emancipated them, but they remain slaves looking for their\r\n-masters, all the same. They love being dominated. I am sure you were\r\n-splendid. I have never seen you really and absolutely angry, but I can\r\n-fancy how delightful you looked. And, after all, you said something to\r\n-me the day before yesterday that seemed to me at the time to be merely\r\n-fanciful, but that I see now was absolutely true, and it holds the key\r\n-to everything.\u0022\r\n-\r\n-\u0022What was that, Harry?\u0022\r\n-\r\n-\u0022You said to me that Sibyl Vane represented to you all the heroines of\r\n-romance--that she was Desdemona one night, and Ophelia the other; that\r\n-if she died as Juliet, she came to life as Imogen.\u0022\r\n-\r\n-\u0022She will never come to life again now,\u0022 muttered the lad, burying his\r\n-face in his hands.\r\n-\r\n-\u0022No, she will never come to life. She has played her last part. But\r\n-you must think of that lonely death in the tawdry dressing-room simply\r\n-as a strange lurid fragment from some Jacobean tragedy, as a wonderful\r\n-scene from Webster, or Ford, or Cyril Tourneur. The girl never really\r\n-lived, and so she has never really died. To you at least she was\r\n-always a dream, a phantom that flitted through Shakespeare's plays and\r\n-left them lovelier for its presence, a reed through which Shakespeare's\r\n-music sounded richer and more full of joy. The moment she touched\r\n-actual life, she marred it, and it marred her, and so she passed away.\r\n-Mourn for Ophelia, if you like. Put ashes on your head because\r\n-Cordelia was strangled. Cry out against Heaven because the daughter of\r\n-Brabantio died. But don't waste your tears over Sibyl Vane. She was\r\n-less real than they are.\u0022\r\n-\r\n-There was a silence. The evening darkened in the room. Noiselessly,\r\n-and with silver feet, the shadows crept in from the garden. The\r\n-colours faded wearily out of things.\r\n-\r\n-After some time Dorian Gray looked up. \u0022You have explained me to\r\n-myself, Harry,\u0022 he murmured with something of a sigh of relief. \u0022I\r\n-felt all that you have said, but somehow I was afraid of it, and I\r\n-could not express it to myself. How well you know me! But we will not\r\n-talk again of what has happened. It has been a marvellous experience.\r\n-That is all. I wonder if life has still in store for me anything as\r\n-marvellous.\u0022\r\n-\r\n-\u0022Life has everything in store for you, Dorian. There is nothing that\r\n-you, with your extraordinary good looks, will not be able to do.\u0022\r\n-\r\n-\u0022But suppose, Harry, I became haggard, and old, and wrinkled? What\r\n-then?\u0022\r\n-\r\n-\u0022Ah, then,\u0022 said Lord Henry, rising to go, \u0022then, my dear Dorian, you\r\n-would have to fight for your victories. As it is, they are brought to\r\n-you. No, you must keep your good looks. We live in an age that reads\r\n-too much to be wise, and that thinks too much to be beautiful. We\r\n-cannot spare you. And now you had better dress and drive down to the\r\n-club. We are rather late, as it is.\u0022\r\n-\r\n-\u0022I think I shall join you at the opera, Harry. I feel too tired to eat\r\n-anything. What is the number of your sister's box?\u0022\r\n-\r\n-\u0022Twenty-seven, I believe. It is on the grand tier. You will see her\r\n-name on the door. But I am sorry you won't come and dine.\u0022\r\n-\r\n-\u0022I don't feel up to it,\u0022 said Dorian listlessly. \u0022But I am awfully\r\n-obliged to you for all that you have said to me. You are certainly my\r\n-best friend. No one has ever understood me as you have.\u0022\r\n-\r\n-\u0022We are only at the beginning of our friendship, Dorian,\u0022 answered Lord\r\n-Henry, shaking him by the hand. \u0022Good-bye. I shall see you before\r\n-nine-thirty, I hope. Remember, Patti is singing.\u0022\r\n-\r\n-As he closed the door behind him, Dorian Gray touched the bell, and in\r\n-a few minutes Victor appeared with the lamps and drew the blinds down.\r\n-He waited impatiently for him to go. The man seemed to take an\r\n-interminable time over everything.\r\n-\r\n-As soon as he had left, he rushed to the screen and drew it back. No;\r\n-there was no further change in the picture. It had received the news\r\n-of Sibyl Vane's death before he had known of it himself. It was\r\n-conscious of the events of life as they occurred. The vicious cruelty\r\n-that marred the fine lines of the mouth had, no doubt, appeared at the\r\n-very moment that the girl had drunk the poison, whatever it was. Or\r\n-was it indifferent to results? Did it merely take cognizance of what\r\n-passed within the soul? He wondered, and hoped that some day he would\r\n-see the change taking place before his very eyes, shuddering as he\r\n-hoped it.\r\n-\r\n-Poor Sibyl! What a romance it had all been! She had often mimicked\r\n-death on the stage. Then Death himself had touched her and taken her\r\n-with him. How had she played that dreadful last scene? Had she cursed\r\n-him, as she died? No; she had died for love of him, and love would\r\n-always be a sacrament to him now. She had atoned for everything by the\r\n-sacrifice she had made of her life. He would not think any more of\r\n-what she had made him go through, on that horrible night at the\r\n-theatre. When he thought of her, it would be as a wonderful tragic\r\n-figure sent on to the world's stage to show the supreme reality of\r\n-love. A wonderful tragic figure? Tears came to his eyes as he\r\n-remembered her childlike look, and winsome fanciful ways, and shy\r\n-tremulous grace. He brushed them away hastily and looked again at the\r\n-picture.\r\n-\r\n-He felt that the time had really come for making his choice. Or had\r\n-his choice already been made? Yes, life had decided that for\r\n-him--life, and his own infinite curiosity about life. Eternal youth,\r\n-infinite passion, pleasures subtle and secret, wild joys and wilder\r\n-sins--he was to have all these things. The portrait was to bear the\r\n-burden of his shame: that was all.\r\n-\r\n-A feeling of pain crept over him as he thought of the desecration that\r\n-was in store for the fair face on the canvas. Once, in boyish mockery\r\n-of Narcissus, he had kissed, or feigned to kiss, those painted lips\r\n-that now smiled so cruelly at him. Morning after morning he had sat\r\n-before the portrait wondering at its beauty, almost enamoured of it, as\r\n-it seemed to him at times. Was it to alter now with every mood to\r\n-which he yielded? Was it to become a monstrous and loathsome thing, to\r\n-be hidden away in a locked room, to be shut out from the sunlight that\r\n-had so often touched to brighter gold the waving wonder of its hair?\r\n-The pity of it! the pity of it!\r\n-\r\n-For a moment, he thought of praying that the horrible sympathy that\r\n-existed between him and the picture might cease. It had changed in\r\n-answer to a prayer; perhaps in answer to a prayer it might remain\r\n-unchanged. And yet, who, that knew anything about life, would\r\n-surrender the chance of remaining always young, however fantastic that\r\n-chance might be, or with what fateful consequences it might be fraught?\r\n-Besides, was it really under his control? Had it indeed been prayer\r\n-that had produced the substitution? Might there not be some curious\r\n-scientific reason for it all? If thought could exercise its influence\r\n-upon a living organism, might not thought exercise an influence upon\r\n-dead and inorganic things? Nay, without thought or conscious desire,\r\n-might not things external to ourselves vibrate in unison with our moods\r\n-and passions, atom calling to atom in secret love or strange affinity?\r\n-But the reason was of no importance. He would never again tempt by a\r\n-prayer any terrible power. If the picture was to alter, it was to\r\n-alter. That was all. Why inquire too closely into it?\r\n-\r\n-For there would be a real pleasure in watching it. He would be able to\r\n-follow his mind into its secret places. This portrait would be to him\r\n-the most magical of mirrors. As it had revealed to him his own body,\r\n-so it would reveal to him his own soul. And when winter came upon it,\r\n-he would still be standing where spring trembles on the verge of\r\n-summer. When the blood crept from its face, and left behind a pallid\r\n-mask of chalk with leaden eyes, he would keep the glamour of boyhood.\r\n-Not one blossom of his loveliness would ever fade. Not one pulse of\r\n-his life would ever weaken. Like the gods of the Greeks, he would be\r\n-strong, and fleet, and joyous. What did it matter what happened to the\r\n-coloured image on the canvas? He would be safe. That was everything.\r\n-\r\n-He drew the screen back into its former place in front of the picture,\r\n-smiling as he did so, and passed into his bedroom, where his valet was\r\n-already waiting for him. An hour later he was at the opera, and Lord\r\n-Henry was leaning over his chair.\r\n-\r\n-\r\n-\r\n-CHAPTER 9\r\n-\r\n-As he was sitting at breakfast next morning, Basil Hallward was shown\r\n-into the room.\r\n-\r\n-\u0022I am so glad I have found you, Dorian,\u0022 he said gravely. \u0022I called\r\n-last night, and they told me you were at the opera. Of course, I knew\r\n-that was impossible. But I wish you had left word where you had really\r\n-gone to. I passed a dreadful evening, half afraid that one tragedy\r\n-might be followed by another. I think you might have telegraphed for\r\n-me when you heard of it first. I read of it quite by chance in a late\r\n-edition of _The Globe_ that I picked up at the club. I came here at once\r\n-and was miserable at not finding you. I can't tell you how\r\n-heart-broken I am about the whole thing. I know what you must suffer.\r\n-But where were you? Did you go down and see the girl's mother? For a\r\n-moment I thought of following you there. They gave the address in the\r\n-paper. Somewhere in the Euston Road, isn't it? But I was afraid of\r\n-intruding upon a sorrow that I could not lighten. Poor woman! What a\r\n-state she must be in! And her only child, too! What did she say about\r\n-it all?\u0022\r\n-\r\n-\u0022My dear Basil, how do I know?\u0022 murmured Dorian Gray, sipping some\r\n-pale-yellow wine from a delicate, gold-beaded bubble of Venetian glass\r\n-and looking dreadfully bored. \u0022I was at the opera. You should have\r\n-come on there. I met Lady Gwendolen, Harry's sister, for the first\r\n-time. We were in her box. She is perfectly charming; and Patti sang\r\n-divinely. Don't talk about horrid subjects. If one doesn't talk about\r\n-a thing, it has never happened. It is simply expression, as Harry\r\n-says, that gives reality to things. I may mention that she was not the\r\n-woman's only child. There is a son, a charming fellow, I believe. But\r\n-he is not on the stage. He is a sailor, or something. And now, tell\r\n-me about yourself and what you are painting.\u0022\r\n-\r\n-\u0022You went to the opera?\u0022 said Hallward, speaking very slowly and with a\r\n-strained touch of pain in his voice. \u0022You went to the opera while\r\n-Sibyl Vane was lying dead in some sordid lodging? You can talk to me\r\n-of other women being charming, and of Patti singing divinely, before\r\n-the girl you loved has even the quiet of a grave to sleep in? Why,\r\n-man, there are horrors in store for that little white body of hers!\u0022\r\n-\r\n-\u0022Stop, Basil! I won't hear it!\u0022 cried Dorian, leaping to his feet.\r\n-\u0022You must not tell me about things. What is done is done. What is\r\n-past is past.\u0022\r\n-\r\n-\u0022You call yesterday the past?\u0022\r\n-\r\n-\u0022What has the actual lapse of time got to do with it? It is only\r\n-shallow people who require years to get rid of an emotion. A man who\r\n-is master of himself can end a sorrow as easily as he can invent a\r\n-pleasure. I don't want to be at the mercy of my emotions. I want to\r\n-use them, to enjoy them, and to dominate them.\u0022\r\n-\r\n-\u0022Dorian, this is horrible! Something has changed you completely. You\r\n-look exactly the same wonderful boy who, day after day, used to come\r\n-down to my studio to sit for his picture. But you were simple,\r\n-natural, and affectionate then. You were the most unspoiled creature\r\n-in the whole world. Now, I don't know what has come over you. You\r\n-talk as if you had no heart, no pity in you. It is all Harry's\r\n-influence. I see that.\u0022\r\n-\r\n-The lad flushed up and, going to the window, looked out for a few\r\n-moments on the green, flickering, sun-lashed garden. \u0022I owe a great\r\n-deal to Harry, Basil,\u0022 he said at last, \u0022more than I owe to you. You\r\n-only taught me to be vain.\u0022\r\n-\r\n-\u0022Well, I am punished for that, Dorian--or shall be some day.\u0022\r\n-\r\n-\u0022I don't know what you mean, Basil,\u0022 he exclaimed, turning round. \u0022I\r\n-don't know what you want. What do you want?\u0022\r\n-\r\n-\u0022I want the Dorian Gray I used to paint,\u0022 said the artist sadly.\r\n-\r\n-\u0022Basil,\u0022 said the lad, going over to him and putting his hand on his\r\n-shoulder, \u0022you have come too late. Yesterday, when I heard that Sibyl\r\n-Vane had killed herself--\u0022\r\n-\r\n-\u0022Killed herself! Good heavens! is there no doubt about that?\u0022 cried\r\n-Hallward, looking up at him with an expression of horror.\r\n-\r\n-\u0022My dear Basil! Surely you don't think it was a vulgar accident? Of\r\n-course she killed herself.\u0022\r\n-\r\n-The elder man buried his face in his hands. \u0022How fearful,\u0022 he\r\n-muttered, and a shudder ran through him.\r\n-\r\n-\u0022No,\u0022 said Dorian Gray, \u0022there is nothing fearful about it. It is one\r\n-of the great romantic tragedies of the age. As a rule, people who act\r\n-lead the most commonplace lives. They are good husbands, or faithful\r\n-wives, or something tedious. You know what I mean--middle-class virtue\r\n-and all that kind of thing. How different Sibyl was! She lived her\r\n-finest tragedy. She was always a heroine. The last night she\r\n-played--the night you saw her--she acted badly because she had known\r\n-the reality of love. When she knew its unreality, she died, as Juliet\r\n-might have died. She passed again into the sphere of art. There is\r\n-something of the martyr about her. Her death has all the pathetic\r\n-uselessness of martyrdom, all its wasted beauty. But, as I was saying,\r\n-you must not think I have not suffered. If you had come in yesterday\r\n-at a particular moment--about half-past five, perhaps, or a quarter to\r\n-six--you would have found me in tears. Even Harry, who was here, who\r\n-brought me the news, in fact, had no idea what I was going through. I\r\n-suffered immensely. Then it passed away. I cannot repeat an emotion.\r\n-No one can, except sentimentalists. And you are awfully unjust, Basil.\r\n-You come down here to console me. That is charming of you. You find\r\n-me consoled, and you are furious. How like a sympathetic person! You\r\n-remind me of a story Harry told me about a certain philanthropist who\r\n-spent twenty years of his life in trying to get some grievance\r\n-redressed, or some unjust law altered--I forget exactly what it was.\r\n-Finally he succeeded, and nothing could exceed his disappointment. He\r\n-had absolutely nothing to do, almost died of _ennui_, and became a\r\n-confirmed misanthrope. And besides, my dear old Basil, if you really\r\n-want to console me, teach me rather to forget what has happened, or to\r\n-see it from a proper artistic point of view. Was it not Gautier who\r\n-used to write about _la consolation des arts_? I remember picking up a\r\n-little vellum-covered book in your studio one day and chancing on that\r\n-delightful phrase. Well, I am not like that young man you told me of\r\n-when we were down at Marlow together, the young man who used to say\r\n-that yellow satin could console one for all the miseries of life. I\r\n-love beautiful things that one can touch and handle. Old brocades,\r\n-green bronzes, lacquer-work, carved ivories, exquisite surroundings,\r\n-luxury, pomp--there is much to be got from all these. But the artistic\r\n-temperament that they create, or at any rate reveal, is still more to\r\n-me. To become the spectator of one's own life, as Harry says, is to\r\n-escape the suffering of life. I know you are surprised at my talking\r\n-to you like this. You have not realized how I have developed. I was a\r\n-schoolboy when you knew me. I am a man now. I have new passions, new\r\n-thoughts, new ideas. I am different, but you must not like me less. I\r\n-am changed, but you must always be my friend. Of course, I am very\r\n-fond of Harry. But I know that you are better than he is. You are not\r\n-stronger--you are too much afraid of life--but you are better. And how\r\n-happy we used to be together! Don't leave me, Basil, and don't quarrel\r\n-with me. I am what I am. There is nothing more to be said.\u0022\r\n-\r\n-The painter felt strangely moved. The lad was infinitely dear to him,\r\n-and his personality had been the great turning point in his art. He\r\n-could not bear the idea of reproaching him any more. After all, his\r\n-indifference was probably merely a mood that would pass away. There\r\n-was so much in him that was good, so much in him that was noble.\r\n-\r\n-\u0022Well, Dorian,\u0022 he said at length, with a sad smile, \u0022I won't speak to\r\n-you again about this horrible thing, after to-day. I only trust your\r\n-name won't be mentioned in connection with it. The inquest is to take\r\n-place this afternoon. Have they summoned you?\u0022\r\n-\r\n-Dorian shook his head, and a look of annoyance passed over his face at\r\n-the mention of the word \u0022inquest.\u0022 There was something so crude and\r\n-vulgar about everything of the kind. \u0022They don't know my name,\u0022 he\r\n-answered.\r\n-\r\n-\u0022But surely she did?\u0022\r\n-\r\n-\u0022Only my Christian name, and that I am quite sure she never mentioned\r\n-to any one. She told me once that they were all rather curious to\r\n-learn who I was, and that she invariably told them my name was Prince\r\n-Charming. It was pretty of her. You must do me a drawing of Sibyl,\r\n-Basil. I should like to have something more of her than the memory of\r\n-a few kisses and some broken pathetic words.\u0022\r\n-\r\n-\u0022I will try and do something, Dorian, if it would please you. But you\r\n-must come and sit to me yourself again. I can't get on without you.\u0022\r\n-\r\n-\u0022I can never sit to you again, Basil. It is impossible!\u0022 he exclaimed,\r\n-starting back.\r\n-\r\n-The painter stared at him. \u0022My dear boy, what nonsense!\u0022 he cried.\r\n-\u0022Do you mean to say you don't like what I did of you? Where is it?\r\n-Why have you pulled the screen in front of it? Let me look at it. It\r\n-is the best thing I have ever done. Do take the screen away, Dorian.\r\n-It is simply disgraceful of your servant hiding my work like that. I\r\n-felt the room looked different as I came in.\u0022\r\n-\r\n-\u0022My servant has nothing to do with it, Basil. You don't imagine I let\r\n-him arrange my room for me? He settles my flowers for me\r\n-sometimes--that is all. No; I did it myself. The light was too strong\r\n-on the portrait.\u0022\r\n-\r\n-\u0022Too strong! Surely not, my dear fellow? It is an admirable place for\r\n-it. Let me see it.\u0022 And Hallward walked towards the corner of the\r\n-room.\r\n-\r\n-A cry of terror broke from Dorian Gray's lips, and he rushed between\r\n-the painter and the screen. \u0022Basil,\u0022 he said, looking very pale, \u0022you\r\n-must not look at it. I don't wish you to.\u0022\r\n-\r\n-\u0022Not look at my own work! You are not serious. Why shouldn't I look\r\n-at it?\u0022 exclaimed Hallward, laughing.\r\n-\r\n-\u0022If you try to look at it, Basil, on my word of honour I will never\r\n-speak to you again as long as I live. I am quite serious. I don't\r\n-offer any explanation, and you are not to ask for any. But, remember,\r\n-if you touch this screen, everything is over between us.\u0022\r\n-\r\n-Hallward was thunderstruck. He looked at Dorian Gray in absolute\r\n-amazement. He had never seen him like this before. The lad was\r\n-actually pallid with rage. His hands were clenched, and the pupils of\r\n-his eyes were like disks of blue fire. He was trembling all over.\r\n-\r\n-\u0022Dorian!\u0022\r\n-\r\n-\u0022Don't speak!\u0022\r\n-\r\n-\u0022But what is the matter? Of course I won't look at it if you don't\r\n-want me to,\u0022 he said, rather coldly, turning on his heel and going over\r\n-towards the window. \u0022But, really, it seems rather absurd that I\r\n-shouldn't see my own work, especially as I am going to exhibit it in\r\n-Paris in the autumn. I shall probably have to give it another coat of\r\n-varnish before that, so I must see it some day, and why not to-day?\u0022\r\n-\r\n-\u0022To exhibit it! You want to exhibit it?\u0022 exclaimed Dorian Gray, a\r\n-strange sense of terror creeping over him. Was the world going to be\r\n-shown his secret? Were people to gape at the mystery of his life?\r\n-That was impossible. Something--he did not know what--had to be done\r\n-at once.\r\n-\r\n-\u0022Yes; I don't suppose you will object to that. Georges Petit is going\r\n-to collect all my best pictures for a special exhibition in the Rue de\r\n-Seze, which will open the first week in October. The portrait will\r\n-only be away a month. I should think you could easily spare it for\r\n-that time. In fact, you are sure to be out of town. And if you keep\r\n-it always behind a screen, you can't care much about it.\u0022\r\n-\r\n-Dorian Gray passed his hand over his forehead. There were beads of\r\n-perspiration there. He felt that he was on the brink of a horrible\r\n-danger. \u0022You told me a month ago that you would never exhibit it,\u0022 he\r\n-cried. \u0022Why have you changed your mind? You people who go in for\r\n-being consistent have just as many moods as others have. The only\r\n-difference is that your moods are rather meaningless. You can't have\r\n-forgotten that you assured me most solemnly that nothing in the world\r\n-would induce you to send it to any exhibition. You told Harry exactly\r\n-the same thing.\u0022 He stopped suddenly, and a gleam of light came into\r\n-his eyes. He remembered that Lord Henry had said to him once, half\r\n-seriously and half in jest, \u0022If you want to have a strange quarter of\r\n-an hour, get Basil to tell you why he won't exhibit your picture. He\r\n-told me why he wouldn't, and it was a revelation to me.\u0022 Yes, perhaps\r\n-Basil, too, had his secret. He would ask him and try.\r\n-\r\n-\u0022Basil,\u0022 he said, coming over quite close and looking him straight in\r\n-the face, \u0022we have each of us a secret. Let me know yours, and I shall\r\n-tell you mine. What was your reason for refusing to exhibit my\r\n-picture?\u0022\r\n-\r\n-The painter shuddered in spite of himself. \u0022Dorian, if I told you, you\r\n-might like me less than you do, and you would certainly laugh at me. I\r\n-could not bear your doing either of those two things. If you wish me\r\n-never to look at your picture again, I am content. I have always you\r\n-to look at. If you wish the best work I have ever done to be hidden\r\n-from the world, I am satisfied. Your friendship is dearer to me than\r\n-any fame or reputation.\u0022\r\n-\r\n-\u0022No, Basil, you must tell me,\u0022 insisted Dorian Gray. \u0022I think I have a\r\n-right to know.\u0022 His feeling of terror had passed away, and curiosity\r\n-had taken its place. He was determined to find out Basil Hallward's\r\n-mystery.\r\n-\r\n-\u0022Let us sit down, Dorian,\u0022 said the painter, looking troubled. \u0022Let us\r\n-sit down. And just answer me one question. Have you noticed in the\r\n-picture something curious?--something that probably at first did not\r\n-strike you, but that revealed itself to you suddenly?\u0022\r\n-\r\n-\u0022Basil!\u0022 cried the lad, clutching the arms of his chair with trembling\r\n-hands and gazing at him with wild startled eyes.\r\n-\r\n-\u0022I see you did. Don't speak. Wait till you hear what I have to say.\r\n-Dorian, from the moment I met you, your personality had the most\r\n-extraordinary influence over me. I was dominated, soul, brain, and\r\n-power, by you. You became to me the visible incarnation of that unseen\r\n-ideal whose memory haunts us artists like an exquisite dream. I\r\n-worshipped you. I grew jealous of every one to whom you spoke. I\r\n-wanted to have you all to myself. I was only happy when I was with\r\n-you. When you were away from me, you were still present in my art....\r\n-Of course, I never let you know anything about this. It would have\r\n-been impossible. You would not have understood it. I hardly\r\n-understood it myself. I only knew that I had seen perfection face to\r\n-face, and that the world had become wonderful to my eyes--too\r\n-wonderful, perhaps, for in such mad worships there is peril, the peril\r\n-of losing them, no less than the peril of keeping them.... Weeks and\r\n-weeks went on, and I grew more and more absorbed in you. Then came a\r\n-new development. I had drawn you as Paris in dainty armour, and as\r\n-Adonis with huntsman's cloak and polished boar-spear. Crowned with\r\n-heavy lotus-blossoms you had sat on the prow of Adrian's barge, gazing\r\n-across the green turbid Nile. You had leaned over the still pool of\r\n-some Greek woodland and seen in the water's silent silver the marvel of\r\n-your own face. And it had all been what art should be--unconscious,\r\n-ideal, and remote. One day, a fatal day I sometimes think, I\r\n-determined to paint a wonderful portrait of you as you actually are,\r\n-not in the costume of dead ages, but in your own dress and in your own\r\n-time. Whether it was the realism of the method, or the mere wonder of\r\n-your own personality, thus directly presented to me without mist or\r\n-veil, I cannot tell. But I know that as I worked at it, every flake\r\n-and film of colour seemed to me to reveal my secret. I grew afraid\r\n-that others would know of my idolatry. I felt, Dorian, that I had told\r\n-too much, that I had put too much of myself into it. Then it was that\r\n-I resolved never to allow the picture to be exhibited. You were a\r\n-little annoyed; but then you did not realize all that it meant to me.\r\n-Harry, to whom I talked about it, laughed at me. But I did not mind\r\n-that. When the picture was finished, and I sat alone with it, I felt\r\n-that I was right.... Well, after a few days the thing left my studio,\r\n-and as soon as I had got rid of the intolerable fascination of its\r\n-presence, it seemed to me that I had been foolish in imagining that I\r\n-had seen anything in it, more than that you were extremely good-looking\r\n-and that I could paint. Even now I cannot help feeling that it is a\r\n-mistake to think that the passion one feels in creation is ever really\r\n-shown in the work one creates. Art is always more abstract than we\r\n-fancy. Form and colour tell us of form and colour--that is all. It\r\n-often seems to me that art conceals the artist far more completely than\r\n-it ever reveals him. And so when I got this offer from Paris, I\r\n-determined to make your portrait the principal thing in my exhibition.\r\n-It never occurred to me that you would refuse. I see now that you were\r\n-right. The picture cannot be shown. You must not be angry with me,\r\n-Dorian, for what I have told you. As I said to Harry, once, you are\r\n-made to be worshipped.\u0022\r\n-\r\n-Dorian Gray drew a long breath. The colour came back to his cheeks,\r\n-and a smile played about his lips. The peril was over. He was safe\r\n-for the time. Yet he could not help feeling infinite pity for the\r\n-painter who had just made this strange confession to him, and wondered\r\n-if he himself would ever be so dominated by the personality of a\r\n-friend. Lord Henry had the charm of being very dangerous. But that\r\n-was all. He was too clever and too cynical to be really fond of.\r\n-Would there ever be some one who would fill him with a strange\r\n-idolatry? Was that one of the things that life had in store?\r\n-\r\n-\u0022It is extraordinary to me, Dorian,\u0022 said Hallward, \u0022that you should\r\n-have seen this in the portrait. Did you really see it?\u0022\r\n-\r\n-\u0022I saw something in it,\u0022 he answered, \u0022something that seemed to me very\r\n-curious.\u0022\r\n-\r\n-\u0022Well, you don't mind my looking at the thing now?\u0022\r\n-\r\n-Dorian shook his head. \u0022You must not ask me that, Basil. I could not\r\n-possibly let you stand in front of that picture.\u0022\r\n-\r\n-\u0022You will some day, surely?\u0022\r\n-\r\n-\u0022Never.\u0022\r\n-\r\n-\u0022Well, perhaps you are right. And now good-bye, Dorian. You have been\r\n-the one person in my life who has really influenced my art. Whatever I\r\n-have done that is good, I owe to you. Ah! you don't know what it cost\r\n-me to tell you all that I have told you.\u0022\r\n-\r\n-\u0022My dear Basil,\u0022 said Dorian, \u0022what have you told me? Simply that you\r\n-felt that you admired me too much. That is not even a compliment.\u0022\r\n-\r\n-\u0022It was not intended as a compliment. It was a confession. Now that I\r\n-have made it, something seems to have gone out of me. Perhaps one\r\n-should never put one's worship into words.\u0022\r\n-\r\n-\u0022It was a very disappointing confession.\u0022\r\n-\r\n-\u0022Why, what did you expect, Dorian? You didn't see anything else in the\r\n-picture, did you? There was nothing else to see?\u0022\r\n-\r\n-\u0022No; there was nothing else to see. Why do you ask? But you mustn't\r\n-talk about worship. It is foolish. You and I are friends, Basil, and\r\n-we must always remain so.\u0022\r\n-\r\n-\u0022You have got Harry,\u0022 said the painter sadly.\r\n-\r\n-\u0022Oh, Harry!\u0022 cried the lad, with a ripple of laughter. \u0022Harry spends\r\n-his days in saying what is incredible and his evenings in doing what is\r\n-improbable. Just the sort of life I would like to lead. But still I\r\n-don't think I would go to Harry if I were in trouble. I would sooner\r\n-go to you, Basil.\u0022\r\n-\r\n-\u0022You will sit to me again?\u0022\r\n-\r\n-\u0022Impossible!\u0022\r\n-\r\n-\u0022You spoil my life as an artist by refusing, Dorian. No man comes\r\n-across two ideal things. Few come across one.\u0022\r\n-\r\n-\u0022I can't explain it to you, Basil, but I must never sit to you again.\r\n-There is something fatal about a portrait. It has a life of its own.\r\n-I will come and have tea with you. That will be just as pleasant.\u0022\r\n-\r\n-\u0022Pleasanter for you, I am afraid,\u0022 murmured Hallward regretfully. \u0022And\r\n-now good-bye. I am sorry you won't let me look at the picture once\r\n-again. But that can't be helped. I quite understand what you feel\r\n-about it.\u0022\r\n-\r\n-As he left the room, Dorian Gray smiled to himself. Poor Basil! How\r\n-little he knew of the true reason! And how strange it was that,\r\n-instead of having been forced to reveal his own secret, he had\r\n-succeeded, almost by chance, in wresting a secret from his friend! How\r\n-much that strange confession explained to him! The painter's absurd\r\n-fits of jealousy, his wild devotion, his extravagant panegyrics, his\r\n-curious reticences--he understood them all now, and he felt sorry.\r\n-There seemed to him to be something tragic in a friendship so coloured\r\n-by romance.\r\n-\r\n-He sighed and touched the bell. The portrait must be hidden away at\r\n-all costs. He could not run such a risk of discovery again. It had\r\n-been mad of him to have allowed the thing to remain, even for an hour,\r\n-in a room to which any of his friends had access.\r\n-\r\n-\r\n-\r\n-CHAPTER 10\r\n-\r\n-When his servant entered, he looked at him steadfastly and wondered if\r\n-he had thought of peering behind the screen. The man was quite\r\n-impassive and waited for his orders. Dorian lit a cigarette and walked\r\n-over to the glass and glanced into it. He could see the reflection of\r\n-Victor's face perfectly. It was like a placid mask of servility.\r\n-There was nothing to be afraid of, there. Yet he thought it best to be\r\n-on his guard.\r\n-\r\n-Speaking very slowly, he told him to tell the house-keeper that he\r\n-wanted to see her, and then to go to the frame-maker and ask him to\r\n-send two of his men round at once. It seemed to him that as the man\r\n-left the room his eyes wandered in the direction of the screen. Or was\r\n-that merely his own fancy?\r\n-\r\n-After a few moments, in her black silk dress, with old-fashioned thread\r\n-mittens on her wrinkled hands, Mrs. Leaf bustled into the library. He\r\n-asked her for the key of the schoolroom.\r\n-\r\n-\u0022The old schoolroom, Mr. Dorian?\u0022 she exclaimed. \u0022Why, it is full of\r\n-dust. I must get it arranged and put straight before you go into it.\r\n-It is not fit for you to see, sir. It is not, indeed.\u0022\r\n-\r\n-\u0022I don't want it put straight, Leaf. I only want the key.\u0022\r\n-\r\n-\u0022Well, sir, you'll be covered with cobwebs if you go into it. Why, it\r\n-hasn't been opened for nearly five years--not since his lordship died.\u0022\r\n-\r\n-He winced at the mention of his grandfather. He had hateful memories\r\n-of him. \u0022That does not matter,\u0022 he answered. \u0022I simply want to see\r\n-the place--that is all. Give me the key.\u0022\r\n-\r\n-\u0022And here is the key, sir,\u0022 said the old lady, going over the contents\r\n-of her bunch with tremulously uncertain hands. \u0022Here is the key. I'll\r\n-have it off the bunch in a moment. But you don't think of living up\r\n-there, sir, and you so comfortable here?\u0022\r\n-\r\n-\u0022No, no,\u0022 he cried petulantly. \u0022Thank you, Leaf. That will do.\u0022\r\n-\r\n-She lingered for a few moments, and was garrulous over some detail of\r\n-the household. He sighed and told her to manage things as she thought\r\n-best. She left the room, wreathed in smiles.\r\n-\r\n-As the door closed, Dorian put the key in his pocket and looked round\r\n-the room. His eye fell on a large, purple satin coverlet heavily\r\n-embroidered with gold, a splendid piece of late seventeenth-century\r\n-Venetian work that his grandfather had found in a convent near Bologna.\r\n-Yes, that would serve to wrap the dreadful thing in. It had perhaps\r\n-served often as a pall for the dead. Now it was to hide something that\r\n-had a corruption of its own, worse than the corruption of death\r\n-itself--something that would breed horrors and yet would never die.\r\n-What the worm was to the corpse, his sins would be to the painted image\r\n-on the canvas. They would mar its beauty and eat away its grace. They\r\n-would defile it and make it shameful. And yet the thing would still\r\n-live on. It would be always alive.\r\n-\r\n-He shuddered, and for a moment he regretted that he had not told Basil\r\n-the true reason why he had wished to hide the picture away. Basil\r\n-would have helped him to resist Lord Henry's influence, and the still\r\n-more poisonous influences that came from his own temperament. The love\r\n-that he bore him--for it was really love--had nothing in it that was\r\n-not noble and intellectual. It was not that mere physical admiration\r\n-of beauty that is born of the senses and that dies when the senses\r\n-tire. It was such love as Michelangelo had known, and Montaigne, and\r\n-Winckelmann, and Shakespeare himself. Yes, Basil could have saved him.\r\n-But it was too late now. The past could always be annihilated.\r\n-Regret, denial, or forgetfulness could do that. But the future was\r\n-inevitable. There were passions in him that would find their terrible\r\n-outlet, dreams that would make the shadow of their evil real.\r\n-\r\n-He took up from the couch the great purple-and-gold texture that\r\n-covered it, and, holding it in his hands, passed behind the screen.\r\n-Was the face on the canvas viler than before? It seemed to him that it\r\n-was unchanged, and yet his loathing of it was intensified. Gold hair,\r\n-blue eyes, and rose-red lips--they all were there. It was simply the\r\n-expression that had altered. That was horrible in its cruelty.\r\n-Compared to what he saw in it of censure or rebuke, how shallow Basil's\r\n-reproaches about Sibyl Vane had been!--how shallow, and of what little\r\n-account! His own soul was looking out at him from the canvas and\r\n-calling him to judgement. A look of pain came across him, and he flung\r\n-the rich pall over the picture. As he did so, a knock came to the\r\n-door. He passed out as his servant entered.\r\n-\r\n-\u0022The persons are here, Monsieur.\u0022\r\n-\r\n-He felt that the man must be got rid of at once. He must not be\r\n-allowed to know where the picture was being taken to. There was\r\n-something sly about him, and he had thoughtful, treacherous eyes.\r\n-Sitting down at the writing-table he scribbled a note to Lord Henry,\r\n-asking him to send him round something to read and reminding him that\r\n-they were to meet at eight-fifteen that evening.\r\n-\r\n-\u0022Wait for an answer,\u0022 he said, handing it to him, \u0022and show the men in\r\n-here.\u0022\r\n-\r\n-In two or three minutes there was another knock, and Mr. Hubbard\r\n-himself, the celebrated frame-maker of South Audley Street, came in\r\n-with a somewhat rough-looking young assistant. Mr. Hubbard was a\r\n-florid, red-whiskered little man, whose admiration for art was\r\n-considerably tempered by the inveterate impecuniosity of most of the\r\n-artists who dealt with him. As a rule, he never left his shop. He\r\n-waited for people to come to him. But he always made an exception in\r\n-favour of Dorian Gray. There was something about Dorian that charmed\r\n-everybody. It was a pleasure even to see him.\r\n-\r\n-\u0022What can I do for you, Mr. Gray?\u0022 he said, rubbing his fat freckled\r\n-hands. \u0022I thought I would do myself the honour of coming round in\r\n-person. I have just got a beauty of a frame, sir. Picked it up at a\r\n-sale. Old Florentine. Came from Fonthill, I believe. Admirably\r\n-suited for a religious subject, Mr. Gray.\u0022\r\n-\r\n-\u0022I am so sorry you have given yourself the trouble of coming round, Mr.\r\n-Hubbard. I shall certainly drop in and look at the frame--though I\r\n-don't go in much at present for religious art--but to-day I only want a\r\n-picture carried to the top of the house for me. It is rather heavy, so\r\n-I thought I would ask you to lend me a couple of your men.\u0022\r\n-\r\n-\u0022No trouble at all, Mr. Gray. I am delighted to be of any service to\r\n-you. Which is the work of art, sir?\u0022\r\n-\r\n-\u0022This,\u0022 replied Dorian, moving the screen back. \u0022Can you move it,\r\n-covering and all, just as it is? I don't want it to get scratched\r\n-going upstairs.\u0022\r\n-\r\n-\u0022There will be no difficulty, sir,\u0022 said the genial frame-maker,\r\n-beginning, with the aid of his assistant, to unhook the picture from\r\n-the long brass chains by which it was suspended. \u0022And, now, where\r\n-shall we carry it to, Mr. Gray?\u0022\r\n-\r\n-\u0022I will show you the way, Mr. Hubbard, if you will kindly follow me.\r\n-Or perhaps you had better go in front. I am afraid it is right at the\r\n-top of the house. We will go up by the front staircase, as it is\r\n-wider.\u0022\r\n-\r\n-He held the door open for them, and they passed out into the hall and\r\n-began the ascent. The elaborate character of the frame had made the\r\n-picture extremely bulky, and now and then, in spite of the obsequious\r\n-protests of Mr. Hubbard, who had the true tradesman's spirited dislike\r\n-of seeing a gentleman doing anything useful, Dorian put his hand to it\r\n-so as to help them.\r\n-\r\n-\u0022Something of a load to carry, sir,\u0022 gasped the little man when they\r\n-reached the top landing. And he wiped his shiny forehead.\r\n-\r\n-\u0022I am afraid it is rather heavy,\u0022 murmured Dorian as he unlocked the\r\n-door that opened into the room that was to keep for him the curious\r\n-secret of his life and hide his soul from the eyes of men.\r\n-\r\n-He had not entered the place for more than four years--not, indeed,\r\n-since he had used it first as a play-room when he was a child, and then\r\n-as a study when he grew somewhat older. It was a large,\r\n-well-proportioned room, which had been specially built by the last Lord\r\n-Kelso for the use of the little grandson whom, for his strange likeness\r\n-to his mother, and also for other reasons, he had always hated and\r\n-desired to keep at a distance. It appeared to Dorian to have but\r\n-little changed. There was the huge Italian _cassone_, with its\r\n-fantastically painted panels and its tarnished gilt mouldings, in which\r\n-he had so often hidden himself as a boy. There the satinwood book-case\r\n-filled with his dog-eared schoolbooks. On the wall behind it was\r\n-hanging the same ragged Flemish tapestry where a faded king and queen\r\n-were playing chess in a garden, while a company of hawkers rode by,\r\n-carrying hooded birds on their gauntleted wrists. How well he\r\n-remembered it all! Every moment of his lonely childhood came back to\r\n-him as he looked round. He recalled the stainless purity of his boyish\r\n-life, and it seemed horrible to him that it was here the fatal portrait\r\n-was to be hidden away. How little he had thought, in those dead days,\r\n-of all that was in store for him!\r\n-\r\n-But there was no other place in the house so secure from prying eyes as\r\n-this. He had the key, and no one else could enter it. Beneath its\r\n-purple pall, the face painted on the canvas could grow bestial, sodden,\r\n-and unclean. What did it matter? No one could see it. He himself\r\n-would not see it. Why should he watch the hideous corruption of his\r\n-soul? He kept his youth--that was enough. And, besides, might not\r\n-his nature grow finer, after all? There was no reason that the future\r\n-should be so full of shame. Some love might come across his life, and\r\n-purify him, and shield him from those sins that seemed to be already\r\n-stirring in spirit and in flesh--those curious unpictured sins whose\r\n-very mystery lent them their subtlety and their charm. Perhaps, some\r\n-day, the cruel look would have passed away from the scarlet sensitive\r\n-mouth, and he might show to the world Basil Hallward's masterpiece.\r\n-\r\n-No; that was impossible. Hour by hour, and week by week, the thing\r\n-upon the canvas was growing old. It might escape the hideousness of\r\n-sin, but the hideousness of age was in store for it. The cheeks would\r\n-become hollow or flaccid. Yellow crow's feet would creep round the\r\n-fading eyes and make them horrible. The hair would lose its\r\n-brightness, the mouth would gape or droop, would be foolish or gross,\r\n-as the mouths of old men are. There would be the wrinkled throat, the\r\n-cold, blue-veined hands, the twisted body, that he remembered in the\r\n-grandfather who had been so stern to him in his boyhood. The picture\r\n-had to be concealed. There was no help for it.\r\n-\r\n-\u0022Bring it in, Mr. Hubbard, please,\u0022 he said, wearily, turning round.\r\n-\u0022I am sorry I kept you so long. I was thinking of something else.\u0022\r\n-\r\n-\u0022Always glad to have a rest, Mr. Gray,\u0022 answered the frame-maker, who\r\n-was still gasping for breath. \u0022Where shall we put it, sir?\u0022\r\n-\r\n-\u0022Oh, anywhere. Here: this will do. I don't want to have it hung up.\r\n-Just lean it against the wall. Thanks.\u0022\r\n-\r\n-\u0022Might one look at the work of art, sir?\u0022\r\n-\r\n-Dorian started. \u0022It would not interest you, Mr. Hubbard,\u0022 he said,\r\n-keeping his eye on the man. He felt ready to leap upon him and fling\r\n-him to the ground if he dared to lift the gorgeous hanging that\r\n-concealed the secret of his life. \u0022I shan't trouble you any more now.\r\n-I am much obliged for your kindness in coming round.\u0022\r\n-\r\n-\u0022Not at all, not at all, Mr. Gray. Ever ready to do anything for you,\r\n-sir.\u0022 And Mr. Hubbard tramped downstairs, followed by the assistant,\r\n-who glanced back at Dorian with a look of shy wonder in his rough\r\n-uncomely face. He had never seen any one so marvellous.\r\n-\r\n-When the sound of their footsteps had died away, Dorian locked the door\r\n-and put the key in his pocket. He felt safe now. No one would ever\r\n-look upon the horrible thing. No eye but his would ever see his shame.\r\n-\r\n-On reaching the library, he found that it was just after five o'clock\r\n-and that the tea had been already brought up. On a little table of\r\n-dark perfumed wood thickly incrusted with nacre, a present from Lady\r\n-Radley, his guardian's wife, a pretty professional invalid who had\r\n-spent the preceding winter in Cairo, was lying a note from Lord Henry,\r\n-and beside it was a book bound in yellow paper, the cover slightly torn\r\n-and the edges soiled. A copy of the third edition of _The St. James's\r\n-Gazette_ had been placed on the tea-tray. It was evident that Victor had\r\n-returned. He wondered if he had met the men in the hall as they were\r\n-leaving the house and had wormed out of them what they had been doing.\r\n-He would be sure to miss the picture--had no doubt missed it already,\r\n-while he had been laying the tea-things. The screen had not been set\r\n-back, and a blank space was visible on the wall. Perhaps some night he\r\n-might find him creeping upstairs and trying to force the door of the\r\n-room. It was a horrible thing to have a spy in one's house. He had\r\n-heard of rich men who had been blackmailed all their lives by some\r\n-servant who had read a letter, or overheard a conversation, or picked\r\n-up a card with an address, or found beneath a pillow a withered flower\r\n-or a shred of crumpled lace.\r\n-\r\n-He sighed, and having poured himself out some tea, opened Lord Henry's\r\n-note. It was simply to say that he sent him round the evening paper,\r\n-and a book that might interest him, and that he would be at the club at\r\n-eight-fifteen. He opened _The St. James's_ languidly, and looked through\r\n-it. A red pencil-mark on the fifth page caught his eye. It drew\r\n-attention to the following paragraph:\r\n-\r\n-\r\n-INQUEST ON AN ACTRESS.--An inquest was held this morning at the Bell\r\n-Tavern, Hoxton Road, by Mr. Danby, the District Coroner, on the body of\r\n-Sibyl Vane, a young actress recently engaged at the Royal Theatre,\r\n-Holborn. A verdict of death by misadventure was returned.\r\n-Considerable sympathy was expressed for the mother of the deceased, who\r\n-was greatly affected during the giving of her own evidence, and that of\r\n-Dr. Birrell, who had made the post-mortem examination of the deceased.\r\n-\r\n-\r\n-He frowned, and tearing the paper in two, went across the room and\r\n-flung the pieces away. How ugly it all was! And how horribly real\r\n-ugliness made things! He felt a little annoyed with Lord Henry for\r\n-having sent him the report. And it was certainly stupid of him to have\r\n-marked it with red pencil. Victor might have read it. The man knew\r\n-more than enough English for that.\r\n-\r\n-Perhaps he had read it and had begun to suspect something. And, yet,\r\n-what did it matter? What had Dorian Gray to do with Sibyl Vane's\r\n-death? There was nothing to fear. Dorian Gray had not killed her.\r\n-\r\n-His eye fell on the yellow book that Lord Henry had sent him. What was\r\n-it, he wondered. He went towards the little, pearl-coloured octagonal\r\n-stand that had always looked to him like the work of some strange\r\n-Egyptian bees that wrought in silver, and taking up the volume, flung\r\n-himself into an arm-chair and began to turn over the leaves. After a\r\n-few minutes he became absorbed. It was the strangest book that he had\r\n-ever read. It seemed to him that in exquisite raiment, and to the\r\n-delicate sound of flutes, the sins of the world were passing in dumb\r\n-show before him. Things that he had dimly dreamed of were suddenly\r\n-made real to him. Things of which he had never dreamed were gradually\r\n-revealed.\r\n-\r\n-It was a novel without a plot and with only one character, being,\r\n-indeed, simply a psychological study of a certain young Parisian who\r\n-spent his life trying to realize in the nineteenth century all the\r\n-passions and modes of thought that belonged to every century except his\r\n-own, and to sum up, as it were, in himself the various moods through\r\n-which the world-spirit had ever passed, loving for their mere\r\n-artificiality those renunciations that men have unwisely called virtue,\r\n-as much as those natural rebellions that wise men still call sin. The\r\n-style in which it was written was that curious jewelled style, vivid\r\n-and obscure at once, full of _argot_ and of archaisms, of technical\r\n-expressions and of elaborate paraphrases, that characterizes the work\r\n-of some of the finest artists of the French school of _Symbolistes_.\r\n-There were in it metaphors as monstrous as orchids and as subtle in\r\n-colour. The life of the senses was described in the terms of mystical\r\n-philosophy. One hardly knew at times whether one was reading the\r\n-spiritual ecstasies of some mediaeval saint or the morbid confessions\r\n-of a modern sinner. It was a poisonous book. The heavy odour of\r\n-incense seemed to cling about its pages and to trouble the brain. The\r\n-mere cadence of the sentences, the subtle monotony of their music, so\r\n-full as it was of complex refrains and movements elaborately repeated,\r\n-produced in the mind of the lad, as he passed from chapter to chapter,\r\n-a form of reverie, a malady of dreaming, that made him unconscious of\r\n-the falling day and creeping shadows.\r\n-\r\n-Cloudless, and pierced by one solitary star, a copper-green sky gleamed\r\n-through the windows. He read on by its wan light till he could read no\r\n-more. Then, after his valet had reminded him several times of the\r\n-lateness of the hour, he got up, and going into the next room, placed\r\n-the book on the little Florentine table that always stood at his\r\n-bedside and began to dress for dinner.\r\n-\r\n-It was almost nine o'clock before he reached the club, where he found\r\n-Lord Henry sitting alone, in the morning-room, looking very much bored.\r\n-\r\n-\u0022I am so sorry, Harry,\u0022 he cried, \u0022but really it is entirely your\r\n-fault. That book you sent me so fascinated me that I forgot how the\r\n-time was going.\u0022\r\n-\r\n-\u0022Yes, I thought you would like it,\u0022 replied his host, rising from his\r\n-chair.\r\n-\r\n-\u0022I didn't say I liked it, Harry. I said it fascinated me. There is a\r\n-great difference.\u0022\r\n-\r\n-\u0022Ah, you have discovered that?\u0022 murmured Lord Henry. And they passed\r\n-into the dining-room.\r\n-\r\n-\r\n-\r\n-CHAPTER 11\r\n-\r\n-For years, Dorian Gray could not free himself from the influence of\r\n-this book. Or perhaps it would be more accurate to say that he never\r\n-sought to free himself from it. He procured from Paris no less than\r\n-nine large-paper copies of the first edition, and had them bound in\r\n-different colours, so that they might suit his various moods and the\r\n-changing fancies of a nature over which he seemed, at times, to have\r\n-almost entirely lost control. The hero, the wonderful young Parisian\r\n-in whom the romantic and the scientific temperaments were so strangely\r\n-blended, became to him a kind of prefiguring type of himself. And,\r\n-indeed, the whole book seemed to him to contain the story of his own\r\n-life, written before he had lived it.\r\n-\r\n-In one point he was more fortunate than the novel's fantastic hero. He\r\n-never knew--never, indeed, had any cause to know--that somewhat\r\n-grotesque dread of mirrors, and polished metal surfaces, and still\r\n-water which came upon the young Parisian so early in his life, and was\r\n-occasioned by the sudden decay of a beau that had once, apparently,\r\n-been so remarkable. It was with an almost cruel joy--and perhaps in\r\n-nearly every joy, as certainly in every pleasure, cruelty has its\r\n-place--that he used to read the latter part of the book, with its\r\n-really tragic, if somewhat overemphasized, account of the sorrow and\r\n-despair of one who had himself lost what in others, and the world, he\r\n-had most dearly valued.\r\n-\r\n-For the wonderful beauty that had so fascinated Basil Hallward, and\r\n-many others besides him, seemed never to leave him. Even those who had\r\n-heard the most evil things against him--and from time to time strange\r\n-rumours about his mode of life crept through London and became the\r\n-chatter of the clubs--could not believe anything to his dishonour when\r\n-they saw him. He had always the look of one who had kept himself\r\n-unspotted from the world. Men who talked grossly became silent when\r\n-Dorian Gray entered the room. There was something in the purity of his\r\n-face that rebuked them. His mere presence seemed to recall to them the\r\n-memory of the innocence that they had tarnished. They wondered how one\r\n-so charming and graceful as he was could have escaped the stain of an\r\n-age that was at once sordid and sensual.\r\n-\r\n-Often, on returning home from one of those mysterious and prolonged\r\n-absences that gave rise to such strange conjecture among those who were\r\n-his friends, or thought that they were so, he himself would creep\r\n-upstairs to the locked room, open the door with the key that never left\r\n-him now, and stand, with a mirror, in front of the portrait that Basil\r\n-Hallward had painted of him, looking now at the evil and aging face on\r\n-the canvas, and now at the fair young face that laughed back at him\r\n-from the polished glass. The very sharpness of the contrast used to\r\n-quicken his sense of pleasure. He grew more and more enamoured of his\r\n-own beauty, more and more interested in the corruption of his own soul.\r\n-He would examine with minute care, and sometimes with a monstrous and\r\n-terrible delight, the hideous lines that seared the wrinkling forehead\r\n-or crawled around the heavy sensual mouth, wondering sometimes which\r\n-were the more horrible, the signs of sin or the signs of age. He would\r\n-place his white hands beside the coarse bloated hands of the picture,\r\n-and smile. He mocked the misshapen body and the failing limbs.\r\n-\r\n-There were moments, indeed, at night, when, lying sleepless in his own\r\n-delicately scented chamber, or in the sordid room of the little\r\n-ill-famed tavern near the docks which, under an assumed name and in\r\n-disguise, it was his habit to frequent, he would think of the ruin he\r\n-had brought upon his soul with a pity that was all the more poignant\r\n-because it was purely selfish. But moments such as these were rare.\r\n-That curiosity about life which Lord Henry had first stirred in him, as\r\n-they sat together in the garden of their friend, seemed to increase\r\n-with gratification. The more he knew, the more he desired to know. He\r\n-had mad hungers that grew more ravenous as he fed them.\r\n-\r\n-Yet he was not really reckless, at any rate in his relations to\r\n-society. Once or twice every month during the winter, and on each\r\n-Wednesday evening while the season lasted, he would throw open to the\r\n-world his beautiful house and have the most celebrated musicians of the\r\n-day to charm his guests with the wonders of their art. His little\r\n-dinners, in the settling of which Lord Henry always assisted him, were\r\n-noted as much for the careful selection and placing of those invited,\r\n-as for the exquisite taste shown in the decoration of the table, with\r\n-its subtle symphonic arrangements of exotic flowers, and embroidered\r\n-cloths, and antique plate of gold and silver. Indeed, there were many,\r\n-especially among the very young men, who saw, or fancied that they saw,\r\n-in Dorian Gray the true realization of a type of which they had often\r\n-dreamed in Eton or Oxford days, a type that was to combine something of\r\n-the real culture of the scholar with all the grace and distinction and\r\n-perfect manner of a citizen of the world. To them he seemed to be of\r\n-the company of those whom Dante describes as having sought to \u0022make\r\n-themselves perfect by the worship of beauty.\u0022 Like Gautier, he was one\r\n-for whom \u0022the visible world existed.\u0022\r\n-\r\n-And, certainly, to him life itself was the first, the greatest, of the\r\n-arts, and for it all the other arts seemed to be but a preparation.\r\n-Fashion, by which what is really fantastic becomes for a moment\r\n-universal, and dandyism, which, in its own way, is an attempt to assert\r\n-the absolute modernity of beauty, had, of course, their fascination for\r\n-him. His mode of dressing, and the particular styles that from time to\r\n-time he affected, had their marked influence on the young exquisites of\r\n-the Mayfair balls and Pall Mall club windows, who copied him in\r\n-everything that he did, and tried to reproduce the accidental charm of\r\n-his graceful, though to him only half-serious, fopperies.\r\n-\r\n-For, while he was but too ready to accept the position that was almost\r\n-immediately offered to him on his coming of age, and found, indeed, a\r\n-subtle pleasure in the thought that he might really become to the\r\n-London of his own day what to imperial Neronian Rome the author of the\r\n-Satyricon once had been, yet in his inmost heart he desired to be\r\n-something more than a mere _arbiter elegantiarum_, to be consulted on the\r\n-wearing of a jewel, or the knotting of a necktie, or the conduct of a\r\n-cane. He sought to elaborate some new scheme of life that would have\r\n-its reasoned philosophy and its ordered principles, and find in the\r\n-spiritualizing of the senses its highest realization.\r\n-\r\n-The worship of the senses has often, and with much justice, been\r\n-decried, men feeling a natural instinct of terror about passions and\r\n-sensations that seem stronger than themselves, and that they are\r\n-conscious of sharing with the less highly organized forms of existence.\r\n-But it appeared to Dorian Gray that the true nature of the senses had\r\n-never been understood, and that they had remained savage and animal\r\n-merely because the world had sought to starve them into submission or\r\n-to kill them by pain, instead of aiming at making them elements of a\r\n-new spirituality, of which a fine instinct for beauty was to be the\r\n-dominant characteristic. As he looked back upon man moving through\r\n-history, he was haunted by a feeling of loss. So much had been\r\n-surrendered! and to such little purpose! There had been mad wilful\r\n-rejections, monstrous forms of self-torture and self-denial, whose\r\n-origin was fear and whose result was a degradation infinitely more\r\n-terrible than that fancied degradation from which, in their ignorance,\r\n-they had sought to escape; Nature, in her wonderful irony, driving out\r\n-the anchorite to feed with the wild animals of the desert and giving to\r\n-the hermit the beasts of the field as his companions.\r\n-\r\n-Yes: there was to be, as Lord Henry had prophesied, a new Hedonism\r\n-that was to recreate life and to save it from that harsh uncomely\r\n-puritanism that is having, in our own day, its curious revival. It was\r\n-to have its service of the intellect, certainly, yet it was never to\r\n-accept any theory or system that would involve the sacrifice of any\r\n-mode of passionate experience. Its aim, indeed, was to be experience\r\n-itself, and not the fruits of experience, sweet or bitter as they might\r\n-be. Of the asceticism that deadens the senses, as of the vulgar\r\n-profligacy that dulls them, it was to know nothing. But it was to\r\n-teach man to concentrate himself upon the moments of a life that is\r\n-itself but a moment.\r\n-\r\n-There are few of us who have not sometimes wakened before dawn, either\r\n-after one of those dreamless nights that make us almost enamoured of\r\n-death, or one of those nights of horror and misshapen joy, when through\r\n-the chambers of the brain sweep phantoms more terrible than reality\r\n-itself, and instinct with that vivid life that lurks in all grotesques,\r\n-and that lends to Gothic art its enduring vitality, this art being, one\r\n-might fancy, especially the art of those whose minds have been troubled\r\n-with the malady of reverie. Gradually white fingers creep through the\r\n-curtains, and they appear to tremble. In black fantastic shapes, dumb\r\n-shadows crawl into the corners of the room and crouch there. Outside,\r\n-there is the stirring of birds among the leaves, or the sound of men\r\n-going forth to their work, or the sigh and sob of the wind coming down\r\n-from the hills and wandering round the silent house, as though it\r\n-feared to wake the sleepers and yet must needs call forth sleep from\r\n-her purple cave. Veil after veil of thin dusky gauze is lifted, and by\r\n-degrees the forms and colours of things are restored to them, and we\r\n-watch the dawn remaking the world in its antique pattern. The wan\r\n-mirrors get back their mimic life. The flameless tapers stand where we\r\n-had left them, and beside them lies the half-cut book that we had been\r\n-studying, or the wired flower that we had worn at the ball, or the\r\n-letter that we had been afraid to read, or that we had read too often.\r\n-Nothing seems to us changed. Out of the unreal shadows of the night\r\n-comes back the real life that we had known. We have to resume it where\r\n-we had left off, and there steals over us a terrible sense of the\r\n-necessity for the continuance of energy in the same wearisome round of\r\n-stereotyped habits, or a wild longing, it may be, that our eyelids\r\n-might open some morning upon a world that had been refashioned anew in\r\n-the darkness for our pleasure, a world in which things would have fresh\r\n-shapes and colours, and be changed, or have other secrets, a world in\r\n-which the past would have little or no place, or survive, at any rate,\r\n-in no conscious form of obligation or regret, the remembrance even of\r\n-joy having its bitterness and the memories of pleasure their pain.\r\n-\r\n-It was the creation of such worlds as these that seemed to Dorian Gray\r\n-to be the true object, or amongst the true objects, of life; and in his\r\n-search for sensations that would be at once new and delightful, and\r\n-possess that element of strangeness that is so essential to romance, he\r\n-would often adopt certain modes of thought that he knew to be really\r\n-alien to his nature, abandon himself to their subtle influences, and\r\n-then, having, as it were, caught their colour and satisfied his\r\n-intellectual curiosity, leave them with that curious indifference that\r\n-is not incompatible with a real ardour of temperament, and that,\r\n-indeed, according to certain modern psychologists, is often a condition\r\n-of it.\r\n-\r\n-It was rumoured of him once that he was about to join the Roman\r\n-Catholic communion, and certainly the Roman ritual had always a great\r\n-attraction for him. The daily sacrifice, more awful really than all\r\n-the sacrifices of the antique world, stirred him as much by its superb\r\n-rejection of the evidence of the senses as by the primitive simplicity\r\n-of its elements and the eternal pathos of the human tragedy that it\r\n-sought to symbolize. He loved to kneel down on the cold marble\r\n-pavement and watch the priest, in his stiff flowered dalmatic, slowly\r\n-and with white hands moving aside the veil of the tabernacle, or\r\n-raising aloft the jewelled, lantern-shaped monstrance with that pallid\r\n-wafer that at times, one would fain think, is indeed the \u0022_panis\r\n-caelestis_,\u0022 the bread of angels, or, robed in the garments of the\r\n-Passion of Christ, breaking the Host into the chalice and smiting his\r\n-breast for his sins. The fuming censers that the grave boys, in their\r\n-lace and scarlet, tossed into the air like great gilt flowers had their\r\n-subtle fascination for him. As he passed out, he used to look with\r\n-wonder at the black confessionals and long to sit in the dim shadow of\r\n-one of them and listen to men and women whispering through the worn\r\n-grating the true story of their lives.\r\n-\r\n-But he never fell into the error of arresting his intellectual\r\n-development by any formal acceptance of creed or system, or of\r\n-mistaking, for a house in which to live, an inn that is but suitable\r\n-for the sojourn of a night, or for a few hours of a night in which\r\n-there are no stars and the moon is in travail. Mysticism, with its\r\n-marvellous power of making common things strange to us, and the subtle\r\n-antinomianism that always seems to accompany it, moved him for a\r\n-season; and for a season he inclined to the materialistic doctrines of\r\n-the _Darwinismus_ movement in Germany, and found a curious pleasure in\r\n-tracing the thoughts and passions of men to some pearly cell in the\r\n-brain, or some white nerve in the body, delighting in the conception of\r\n-the absolute dependence of the spirit on certain physical conditions,\r\n-morbid or healthy, normal or diseased. Yet, as has been said of him\r\n-before, no theory of life seemed to him to be of any importance\r\n-compared with life itself. He felt keenly conscious of how barren all\r\n-intellectual speculation is when separated from action and experiment.\r\n-He knew that the senses, no less than the soul, have their spiritual\r\n-mysteries to reveal.\r\n-\r\n-And so he would now study perfumes and the secrets of their\r\n-manufacture, distilling heavily scented oils and burning odorous gums\r\n-from the East. He saw that there was no mood of the mind that had not\r\n-its counterpart in the sensuous life, and set himself to discover their\r\n-true relations, wondering what there was in frankincense that made one\r\n-mystical, and in ambergris that stirred one's passions, and in violets\r\n-that woke the memory of dead romances, and in musk that troubled the\r\n-brain, and in champak that stained the imagination; and seeking often\r\n-to elaborate a real psychology of perfumes, and to estimate the several\r\n-influences of sweet-smelling roots and scented, pollen-laden flowers;\r\n-of aromatic balms and of dark and fragrant woods; of spikenard, that\r\n-sickens; of hovenia, that makes men mad; and of aloes, that are said to\r\n-be able to expel melancholy from the soul.\r\n-\r\n-At another time he devoted himself entirely to music, and in a long\r\n-latticed room, with a vermilion-and-gold ceiling and walls of\r\n-olive-green lacquer, he used to give curious concerts in which mad\r\n-gipsies tore wild music from little zithers, or grave, yellow-shawled\r\n-Tunisians plucked at the strained strings of monstrous lutes, while\r\n-grinning Negroes beat monotonously upon copper drums and, crouching\r\n-upon scarlet mats, slim turbaned Indians blew through long pipes of\r\n-reed or brass and charmed--or feigned to charm--great hooded snakes and\r\n-horrible horned adders. The harsh intervals and shrill discords of\r\n-barbaric music stirred him at times when Schubert's grace, and Chopin's\r\n-beautiful sorrows, and the mighty harmonies of Beethoven himself, fell\r\n-unheeded on his ear. He collected together from all parts of the world\r\n-the strangest instruments that could be found, either in the tombs of\r\n-dead nations or among the few savage tribes that have survived contact\r\n-with Western civilizations, and loved to touch and try them. He had\r\n-the mysterious _juruparis_ of the Rio Negro Indians, that women are not\r\n-allowed to look at and that even youths may not see till they have been\r\n-subjected to fasting and scourging, and the earthen jars of the\r\n-Peruvians that have the shrill cries of birds, and flutes of human\r\n-bones such as Alfonso de Ovalle heard in Chile, and the sonorous green\r\n-jaspers that are found near Cuzco and give forth a note of singular\r\n-sweetness. He had painted gourds filled with pebbles that rattled when\r\n-they were shaken; the long _clarin_ of the Mexicans, into which the\r\n-performer does not blow, but through which he inhales the air; the\r\n-harsh _ture_ of the Amazon tribes, that is sounded by the sentinels who\r\n-sit all day long in high trees, and can be heard, it is said, at a\r\n-distance of three leagues; the _teponaztli_, that has two vibrating\r\n-tongues of wood and is beaten with sticks that are smeared with an\r\n-elastic gum obtained from the milky juice of plants; the _yotl_-bells of\r\n-the Aztecs, that are hung in clusters like grapes; and a huge\r\n-cylindrical drum, covered with the skins of great serpents, like the\r\n-one that Bernal Diaz saw when he went with Cortes into the Mexican\r\n-temple, and of whose doleful sound he has left us so vivid a\r\n-description. The fantastic character of these instruments fascinated\r\n-him, and he felt a curious delight in the thought that art, like\r\n-Nature, has her monsters, things of bestial shape and with hideous\r\n-voices. Yet, after some time, he wearied of them, and would sit in his\r\n-box at the opera, either alone or with Lord Henry, listening in rapt\r\n-pleasure to \u0022Tannhauser\u0022 and seeing in the prelude to that great work\r\n-of art a presentation of the tragedy of his own soul.\r\n-\r\n-On one occasion he took up the study of jewels, and appeared at a\r\n-costume ball as Anne de Joyeuse, Admiral of France, in a dress covered\r\n-with five hundred and sixty pearls. This taste enthralled him for\r\n-years, and, indeed, may be said never to have left him. He would often\r\n-spend a whole day settling and resettling in their cases the various\r\n-stones that he had collected, such as the olive-green chrysoberyl that\r\n-turns red by lamplight, the cymophane with its wirelike line of silver,\r\n-the pistachio-coloured peridot, rose-pink and wine-yellow topazes,\r\n-carbuncles of fiery scarlet with tremulous, four-rayed stars, flame-red\r\n-cinnamon-stones, orange and violet spinels, and amethysts with their\r\n-alternate layers of ruby and sapphire. He loved the red gold of the\r\n-sunstone, and the moonstone's pearly whiteness, and the broken rainbow\r\n-of the milky opal. He procured from Amsterdam three emeralds of\r\n-extraordinary size and richness of colour, and had a turquoise _de la\r\n-vieille roche_ that was the envy of all the connoisseurs.\r\n-\r\n-He discovered wonderful stories, also, about jewels. In Alphonso's\r\n-Clericalis Disciplina a serpent was mentioned with eyes of real\r\n-jacinth, and in the romantic history of Alexander, the Conqueror of\r\n-Emathia was said to have found in the vale of Jordan snakes \u0022with\r\n-collars of real emeralds growing on their backs.\u0022 There was a gem in\r\n-the brain of the dragon, Philostratus told us, and \u0022by the exhibition\r\n-of golden letters and a scarlet robe\u0022 the monster could be thrown into\r\n-a magical sleep and slain. According to the great alchemist, Pierre de\r\n-Boniface, the diamond rendered a man invisible, and the agate of India\r\n-made him eloquent. The cornelian appeased anger, and the hyacinth\r\n-provoked sleep, and the amethyst drove away the fumes of wine. The\r\n-garnet cast out demons, and the hydropicus deprived the moon of her\r\n-colour. The selenite waxed and waned with the moon, and the meloceus,\r\n-that discovers thieves, could be affected only by the blood of kids.\r\n-Leonardus Camillus had seen a white stone taken from the brain of a\r\n-newly killed toad, that was a certain antidote against poison. The\r\n-bezoar, that was found in the heart of the Arabian deer, was a charm\r\n-that could cure the plague. In the nests of Arabian birds was the\r\n-aspilates, that, according to Democritus, kept the wearer from any\r\n-danger by fire.\r\n-\r\n-The King of Ceilan rode through his city with a large ruby in his hand,\r\n-as the ceremony of his coronation. The gates of the palace of John the\r\n-Priest were \u0022made of sardius, with the horn of the horned snake\r\n-inwrought, so that no man might bring poison within.\u0022 Over the gable\r\n-were \u0022two golden apples, in which were two carbuncles,\u0022 so that the\r\n-gold might shine by day and the carbuncles by night. In Lodge's\r\n-strange romance 'A Margarite of America', it was stated that in the\r\n-chamber of the queen one could behold \u0022all the chaste ladies of the\r\n-world, inchased out of silver, looking through fair mirrours of\r\n-chrysolites, carbuncles, sapphires, and greene emeraults.\u0022 Marco Polo\r\n-had seen the inhabitants of Zipangu place rose-coloured pearls in the\r\n-mouths of the dead. A sea-monster had been enamoured of the pearl that\r\n-the diver brought to King Perozes, and had slain the thief, and mourned\r\n-for seven moons over its loss. When the Huns lured the king into the\r\n-great pit, he flung it away--Procopius tells the story--nor was it ever\r\n-found again, though the Emperor Anastasius offered five hundred-weight\r\n-of gold pieces for it. The King of Malabar had shown to a certain\r\n-Venetian a rosary of three hundred and four pearls, one for every god\r\n-that he worshipped.\r\n-\r\n-When the Duke de Valentinois, son of Alexander VI, visited Louis XII of\r\n-France, his horse was loaded with gold leaves, according to Brantome,\r\n-and his cap had double rows of rubies that threw out a great light.\r\n-Charles of England had ridden in stirrups hung with four hundred and\r\n-twenty-one diamonds. Richard II had a coat, valued at thirty thousand\r\n-marks, which was covered with balas rubies. Hall described Henry VIII,\r\n-on his way to the Tower previous to his coronation, as wearing \u0022a\r\n-jacket of raised gold, the placard embroidered with diamonds and other\r\n-rich stones, and a great bauderike about his neck of large balasses.\u0022\r\n-The favourites of James I wore ear-rings of emeralds set in gold\r\n-filigrane. Edward II gave to Piers Gaveston a suit of red-gold armour\r\n-studded with jacinths, a collar of gold roses set with\r\n-turquoise-stones, and a skull-cap _parseme_ with pearls. Henry II wore\r\n-jewelled gloves reaching to the elbow, and had a hawk-glove sewn with\r\n-twelve rubies and fifty-two great orients. The ducal hat of Charles\r\n-the Rash, the last Duke of Burgundy of his race, was hung with\r\n-pear-shaped pearls and studded with sapphires.\r\n-\r\n-How exquisite life had once been! How gorgeous in its pomp and\r\n-decoration! Even to read of the luxury of the dead was wonderful.\r\n-\r\n-Then he turned his attention to embroideries and to the tapestries that\r\n-performed the office of frescoes in the chill rooms of the northern\r\n-nations of Europe. As he investigated the subject--and he always had\r\n-an extraordinary faculty of becoming absolutely absorbed for the moment\r\n-in whatever he took up--he was almost saddened by the reflection of the\r\n-ruin that time brought on beautiful and wonderful things. He, at any\r\n-rate, had escaped that. Summer followed summer, and the yellow\r\n-jonquils bloomed and died many times, and nights of horror repeated the\r\n-story of their shame, but he was unchanged. No winter marred his face\r\n-or stained his flowerlike bloom. How different it was with material\r\n-things! Where had they passed to? Where was the great crocus-coloured\r\n-robe, on which the gods fought against the giants, that had been worked\r\n-by brown girls for the pleasure of Athena? Where the huge velarium\r\n-that Nero had stretched across the Colosseum at Rome, that Titan sail\r\n-of purple on which was represented the starry sky, and Apollo driving a\r\n-chariot drawn by white, gilt-reined steeds? He longed to see the\r\n-curious table-napkins wrought for the Priest of the Sun, on which were\r\n-displayed all the dainties and viands that could be wanted for a feast;\r\n-the mortuary cloth of King Chilperic, with its three hundred golden\r\n-bees; the fantastic robes that excited the indignation of the Bishop of\r\n-Pontus and were figured with \u0022lions, panthers, bears, dogs, forests,\r\n-rocks, hunters--all, in fact, that a painter can copy from nature\u0022; and\r\n-the coat that Charles of Orleans once wore, on the sleeves of which\r\n-were embroidered the verses of a song beginning \u0022_Madame, je suis tout\r\n-joyeux_,\u0022 the musical accompaniment of the words being wrought in gold\r\n-thread, and each note, of square shape in those days, formed with four\r\n-pearls. He read of the room that was prepared at the palace at Rheims\r\n-for the use of Queen Joan of Burgundy and was decorated with \u0022thirteen\r\n-hundred and twenty-one parrots, made in broidery, and blazoned with the\r\n-king's arms, and five hundred and sixty-one butterflies, whose wings\r\n-were similarly ornamented with the arms of the queen, the whole worked\r\n-in gold.\u0022 Catherine de Medicis had a mourning-bed made for her of\r\n-black velvet powdered with crescents and suns. Its curtains were of\r\n-damask, with leafy wreaths and garlands, figured upon a gold and silver\r\n-ground, and fringed along the edges with broideries of pearls, and it\r\n-stood in a room hung with rows of the queen's devices in cut black\r\n-velvet upon cloth of silver. Louis XIV had gold embroidered caryatides\r\n-fifteen feet high in his apartment. The state bed of Sobieski, King of\r\n-Poland, was made of Smyrna gold brocade embroidered in turquoises with\r\n-verses from the Koran. Its supports were of silver gilt, beautifully\r\n-chased, and profusely set with enamelled and jewelled medallions. It\r\n-had been taken from the Turkish camp before Vienna, and the standard of\r\n-Mohammed had stood beneath the tremulous gilt of its canopy.\r\n-\r\n-And so, for a whole year, he sought to accumulate the most exquisite\r\n-specimens that he could find of textile and embroidered work, getting\r\n-the dainty Delhi muslins, finely wrought with gold-thread palmates and\r\n-stitched over with iridescent beetles' wings; the Dacca gauzes, that\r\n-from their transparency are known in the East as \u0022woven air,\u0022 and\r\n-\u0022running water,\u0022 and \u0022evening dew\u0022; strange figured cloths from Java;\r\n-elaborate yellow Chinese hangings; books bound in tawny satins or fair\r\n-blue silks and wrought with _fleurs-de-lis_, birds and images; veils of\r\n-_lacis_ worked in Hungary point; Sicilian brocades and stiff Spanish\r\n-velvets; Georgian work, with its gilt coins, and Japanese _Foukousas_,\r\n-with their green-toned golds and their marvellously plumaged birds.\r\n-\r\n-He had a special passion, also, for ecclesiastical vestments, as indeed\r\n-he had for everything connected with the service of the Church. In the\r\n-long cedar chests that lined the west gallery of his house, he had\r\n-stored away many rare and beautiful specimens of what is really the\r\n-raiment of the Bride of Christ, who must wear purple and jewels and\r\n-fine linen that she may hide the pallid macerated body that is worn by\r\n-the suffering that she seeks for and wounded by self-inflicted pain.\r\n-He possessed a gorgeous cope of crimson silk and gold-thread damask,\r\n-figured with a repeating pattern of golden pomegranates set in\r\n-six-petalled formal blossoms, beyond which on either side was the\r\n-pine-apple device wrought in seed-pearls. The orphreys were divided\r\n-into panels representing scenes from the life of the Virgin, and the\r\n-coronation of the Virgin was figured in coloured silks upon the hood.\r\n-This was Italian work of the fifteenth century. Another cope was of\r\n-green velvet, embroidered with heart-shaped groups of acanthus-leaves,\r\n-from which spread long-stemmed white blossoms, the details of which\r\n-were picked out with silver thread and coloured crystals. The morse\r\n-bore a seraph's head in gold-thread raised work. The orphreys were\r\n-woven in a diaper of red and gold silk, and were starred with\r\n-medallions of many saints and martyrs, among whom was St. Sebastian.\r\n-He had chasubles, also, of amber-coloured silk, and blue silk and gold\r\n-brocade, and yellow silk damask and cloth of gold, figured with\r\n-representations of the Passion and Crucifixion of Christ, and\r\n-embroidered with lions and peacocks and other emblems; dalmatics of\r\n-white satin and pink silk damask, decorated with tulips and dolphins\r\n-and _fleurs-de-lis_; altar frontals of crimson velvet and blue linen; and\r\n-many corporals, chalice-veils, and sudaria. In the mystic offices to\r\n-which such things were put, there was something that quickened his\r\n-imagination.\r\n-\r\n-For these treasures, and everything that he collected in his lovely\r\n-house, were to be to him means of forgetfulness, modes by which he\r\n-could escape, for a season, from the fear that seemed to him at times\r\n-to be almost too great to be borne. Upon the walls of the lonely\r\n-locked room where he had spent so much of his boyhood, he had hung with\r\n-his own hands the terrible portrait whose changing features showed him\r\n-the real degradation of his life, and in front of it had draped the\r\n-purple-and-gold pall as a curtain. For weeks he would not go there,\r\n-would forget the hideous painted thing, and get back his light heart,\r\n-his wonderful joyousness, his passionate absorption in mere existence.\r\n-Then, suddenly, some night he would creep out of the house, go down to\r\n-dreadful places near Blue Gate Fields, and stay there, day after day,\r\n-until he was driven away. On his return he would sit in front of the\r\n-picture, sometimes loathing it and himself, but filled, at other\r\n-times, with that pride of individualism that is half the\r\n-fascination of sin, and smiling with secret pleasure at the misshapen\r\n-shadow that had to bear the burden that should have been his own.\r\n-\r\n-After a few years he could not endure to be long out of England, and\r\n-gave up the villa that he had shared at Trouville with Lord Henry, as\r\n-well as the little white walled-in house at Algiers where they had more\r\n-than once spent the winter. He hated to be separated from the picture\r\n-that was such a part of his life, and was also afraid that during his\r\n-absence some one might gain access to the room, in spite of the\r\n-elaborate bars that he had caused to be placed upon the door.\r\n-\r\n-He was quite conscious that this would tell them nothing. It was true\r\n-that the portrait still preserved, under all the foulness and ugliness\r\n-of the face, its marked likeness to himself; but what could they learn\r\n-from that? He would laugh at any one who tried to taunt him. He had\r\n-not painted it. What was it to him how vile and full of shame it\r\n-looked? Even if he told them, would they believe it?\r\n-\r\n-Yet he was afraid. Sometimes when he was down at his great house in\r\n-Nottinghamshire, entertaining the fashionable young men of his own rank\r\n-who were his chief companions, and astounding the county by the wanton\r\n-luxury and gorgeous splendour of his mode of life, he would suddenly\r\n-leave his guests and rush back to town to see that the door had not\r\n-been tampered with and that the picture was still there. What if it\r\n-should be stolen? The mere thought made him cold with horror. Surely\r\n-the world would know his secret then. Perhaps the world already\r\n-suspected it.\r\n-\r\n-For, while he fascinated many, there were not a few who distrusted him.\r\n-He was very nearly blackballed at a West End club of which his birth\r\n-and social position fully entitled him to become a member, and it was\r\n-said that on one occasion, when he was brought by a friend into the\r\n-smoking-room of the Churchill, the Duke of Berwick and another\r\n-gentleman got up in a marked manner and went out. Curious stories\r\n-became current about him after he had passed his twenty-fifth year. It\r\n-was rumoured that he had been seen brawling with foreign sailors in a\r\n-low den in the distant parts of Whitechapel, and that he consorted with\r\n-thieves and coiners and knew the mysteries of their trade. His\r\n-extraordinary absences became notorious, and, when he used to reappear\r\n-again in society, men would whisper to each other in corners, or pass\r\n-him with a sneer, or look at him with cold searching eyes, as though\r\n-they were determined to discover his secret.\r\n-\r\n-Of such insolences and attempted slights he, of course, took no notice,\r\n-and in the opinion of most people his frank debonair manner, his\r\n-charming boyish smile, and the infinite grace of that wonderful youth\r\n-that seemed never to leave him, were in themselves a sufficient answer\r\n-to the calumnies, for so they termed them, that were circulated about\r\n-him. It was remarked, however, that some of those who had been most\r\n-intimate with him appeared, after a time, to shun him. Women who had\r\n-wildly adored him, and for his sake had braved all social censure and\r\n-set convention at defiance, were seen to grow pallid with shame or\r\n-horror if Dorian Gray entered the room.\r\n-\r\n-Yet these whispered scandals only increased in the eyes of many his\r\n-strange and dangerous charm. His great wealth was a certain element of\r\n-security. Society--civilized society, at least--is never very ready to\r\n-believe anything to the detriment of those who are both rich and\r\n-fascinating. It feels instinctively that manners are of more\r\n-importance than morals, and, in its opinion, the highest respectability\r\n-is of much less value than the possession of a good _chef_. And, after\r\n-all, it is a very poor consolation to be told that the man who has\r\n-given one a bad dinner, or poor wine, is irreproachable in his private\r\n-life. Even the cardinal virtues cannot atone for half-cold _entrees_, as\r\n-Lord Henry remarked once, in a discussion on the subject, and there is\r\n-possibly a good deal to be said for his view. For the canons of good\r\n-society are, or should be, the same as the canons of art. Form is\r\n-absolutely essential to it. It should have the dignity of a ceremony,\r\n-as well as its unreality, and should combine the insincere character of\r\n-a romantic play with the wit and beauty that make such plays delightful\r\n-to us. Is insincerity such a terrible thing? I think not. It is\r\n-merely a method by which we can multiply our personalities.\r\n-\r\n-Such, at any rate, was Dorian Gray's opinion. He used to wonder at the\r\n-shallow psychology of those who conceive the ego in man as a thing\r\n-simple, permanent, reliable, and of one essence. To him, man was a\r\n-being with myriad lives and myriad sensations, a complex multiform\r\n-creature that bore within itself strange legacies of thought and\r\n-passion, and whose very flesh was tainted with the monstrous maladies\r\n-of the dead. He loved to stroll through the gaunt cold picture-gallery\r\n-of his country house and look at the various portraits of those whose\r\n-blood flowed in his veins. Here was Philip Herbert, described by\r\n-Francis Osborne, in his Memoires on the Reigns of Queen Elizabeth and\r\n-King James, as one who was \u0022caressed by the Court for his handsome\r\n-face, which kept him not long company.\u0022 Was it young Herbert's life\r\n-that he sometimes led? Had some strange poisonous germ crept from body\r\n-to body till it had reached his own? Was it some dim sense of that\r\n-ruined grace that had made him so suddenly, and almost without cause,\r\n-give utterance, in Basil Hallward's studio, to the mad prayer that had\r\n-so changed his life? Here, in gold-embroidered red doublet, jewelled\r\n-surcoat, and gilt-edged ruff and wristbands, stood Sir Anthony Sherard,\r\n-with his silver-and-black armour piled at his feet. What had this\r\n-man's legacy been? Had the lover of Giovanna of Naples bequeathed him\r\n-some inheritance of sin and shame? Were his own actions merely the\r\n-dreams that the dead man had not dared to realize? Here, from the\r\n-fading canvas, smiled Lady Elizabeth Devereux, in her gauze hood, pearl\r\n-stomacher, and pink slashed sleeves. A flower was in her right hand,\r\n-and her left clasped an enamelled collar of white and damask roses. On\r\n-a table by her side lay a mandolin and an apple. There were large\r\n-green rosettes upon her little pointed shoes. He knew her life, and\r\n-the strange stories that were told about her lovers. Had he something\r\n-of her temperament in him? These oval, heavy-lidded eyes seemed to\r\n-look curiously at him. What of George Willoughby, with his powdered\r\n-hair and fantastic patches? How evil he looked! The face was\r\n-saturnine and swarthy, and the sensual lips seemed to be twisted with\r\n-disdain. Delicate lace ruffles fell over the lean yellow hands that\r\n-were so overladen with rings. He had been a macaroni of the eighteenth\r\n-century, and the friend, in his youth, of Lord Ferrars. What of the\r\n-second Lord Beckenham, the companion of the Prince Regent in his\r\n-wildest days, and one of the witnesses at the secret marriage with Mrs.\r\n-Fitzherbert? How proud and handsome he was, with his chestnut curls\r\n-and insolent pose! What passions had he bequeathed? The world had\r\n-looked upon him as infamous. He had led the orgies at Carlton House.\r\n-The star of the Garter glittered upon his breast. Beside him hung the\r\n-portrait of his wife, a pallid, thin-lipped woman in black. Her blood,\r\n-also, stirred within him. How curious it all seemed! And his mother\r\n-with her Lady Hamilton face and her moist, wine-dashed lips--he knew\r\n-what he had got from her. He had got from her his beauty, and his\r\n-passion for the beauty of others. She laughed at him in her loose\r\n-Bacchante dress. There were vine leaves in her hair. The purple\r\n-spilled from the cup she was holding. The carnations of the painting\r\n-had withered, but the eyes were still wonderful in their depth and\r\n-brilliancy of colour. They seemed to follow him wherever he went.\r\n-\r\n-Yet one had ancestors in literature as well as in one's own race,\r\n-nearer perhaps in type and temperament, many of them, and certainly\r\n-with an influence of which one was more absolutely conscious. There\r\n-were times when it appeared to Dorian Gray that the whole of history\r\n-was merely the record of his own life, not as he had lived it in act\r\n-and circumstance, but as his imagination had created it for him, as it\r\n-had been in his brain and in his passions. He felt that he had known\r\n-them all, those strange terrible figures that had passed across the\r\n-stage of the world and made sin so marvellous and evil so full of\r\n-subtlety. It seemed to him that in some mysterious way their lives had\r\n-been his own.\r\n-\r\n-The hero of the wonderful novel that had so influenced his life had\r\n-himself known this curious fancy. In the seventh chapter he tells how,\r\n-crowned with laurel, lest lightning might strike him, he had sat, as\r\n-Tiberius, in a garden at Capri, reading the shameful books of\r\n-Elephantis, while dwarfs and peacocks strutted round him and the\r\n-flute-player mocked the swinger of the censer; and, as Caligula, had\r\n-caroused with the green-shirted jockeys in their stables and supped in\r\n-an ivory manger with a jewel-frontleted horse; and, as Domitian, had\r\n-wandered through a corridor lined with marble mirrors, looking round\r\n-with haggard eyes for the reflection of the dagger that was to end his\r\n-days, and sick with that ennui, that terrible _taedium vitae_, that comes\r\n-on those to whom life denies nothing; and had peered through a clear\r\n-emerald at the red shambles of the circus and then, in a litter of\r\n-pearl and purple drawn by silver-shod mules, been carried through the\r\n-Street of Pomegranates to a House of Gold and heard men cry on Nero\r\n-Caesar as he passed by; and, as Elagabalus, had painted his face with\r\n-colours, and plied the distaff among the women, and brought the Moon\r\n-from Carthage and given her in mystic marriage to the Sun.\r\n-\r\n-Over and over again Dorian used to read this fantastic chapter, and the\r\n-two chapters immediately following, in which, as in some curious\r\n-tapestries or cunningly wrought enamels, were pictured the awful and\r\n-beautiful forms of those whom vice and blood and weariness had made\r\n-monstrous or mad: Filippo, Duke of Milan, who slew his wife and\r\n-painted her lips with a scarlet poison that her lover might suck death\r\n-from the dead thing he fondled; Pietro Barbi, the Venetian, known as\r\n-Paul the Second, who sought in his vanity to assume the title of\r\n-Formosus, and whose tiara, valued at two hundred thousand florins, was\r\n-bought at the price of a terrible sin; Gian Maria Visconti, who used\r\n-hounds to chase living men and whose murdered body was covered with\r\n-roses by a harlot who had loved him; the Borgia on his white horse,\r\n-with Fratricide riding beside him and his mantle stained with the blood\r\n-of Perotto; Pietro Riario, the young Cardinal Archbishop of Florence,\r\n-child and minion of Sixtus IV, whose beauty was equalled only by his\r\n-debauchery, and who received Leonora of Aragon in a pavilion of white\r\n-and crimson silk, filled with nymphs and centaurs, and gilded a boy\r\n-that he might serve at the feast as Ganymede or Hylas; Ezzelin, whose\r\n-melancholy could be cured only by the spectacle of death, and who had a\r\n-passion for red blood, as other men have for red wine--the son of the\r\n-Fiend, as was reported, and one who had cheated his father at dice when\r\n-gambling with him for his own soul; Giambattista Cibo, who in mockery\r\n-took the name of Innocent and into whose torpid veins the blood of\r\n-three lads was infused by a Jewish doctor; Sigismondo Malatesta, the\r\n-lover of Isotta and the lord of Rimini, whose effigy was burned at Rome\r\n-as the enemy of God and man, who strangled Polyssena with a napkin, and\r\n-gave poison to Ginevra d'Este in a cup of emerald, and in honour of a\r\n-shameful passion built a pagan church for Christian worship; Charles\r\n-VI, who had so wildly adored his brother's wife that a leper had warned\r\n-him of the insanity that was coming on him, and who, when his brain had\r\n-sickened and grown strange, could only be soothed by Saracen cards\r\n-painted with the images of love and death and madness; and, in his\r\n-trimmed jerkin and jewelled cap and acanthuslike curls, Grifonetto\r\n-Baglioni, who slew Astorre with his bride, and Simonetto with his page,\r\n-and whose comeliness was such that, as he lay dying in the yellow\r\n-piazza of Perugia, those who had hated him could not choose but weep,\r\n-and Atalanta, who had cursed him, blessed him.\r\n-\r\n-There was a horrible fascination in them all. He saw them at night,\r\n-and they troubled his imagination in the day. The Renaissance knew of\r\n-strange manners of poisoning--poisoning by a helmet and a lighted\r\n-torch, by an embroidered glove and a jewelled fan, by a gilded pomander\r\n-and by an amber chain. Dorian Gray had been poisoned by a book. There\r\n-were moments when he looked on evil simply as a mode through which he\r\n-could realize his conception of the beautiful.\r\n-\r\n-\r\n-\r\n-CHAPTER 12\r\n-\r\n-It was on the ninth of November, the eve of his own thirty-eighth\r\n-birthday, as he often remembered afterwards.\r\n-\r\n-He was walking home about eleven o'clock from Lord Henry's, where he\r\n-had been dining, and was wrapped in heavy furs, as the night was cold\r\n-and foggy. At the corner of Grosvenor Square and South Audley Street,\r\n-a man passed him in the mist, walking very fast and with the collar of\r\n-his grey ulster turned up. He had a bag in his hand. Dorian\r\n-recognized him. It was Basil Hallward. A strange sense of fear, for\r\n-which he could not account, came over him. He made no sign of\r\n-recognition and went on quickly in the direction of his own house.\r\n-\r\n-But Hallward had seen him. Dorian heard him first stopping on the\r\n-pavement and then hurrying after him. In a few moments, his hand was\r\n-on his arm.\r\n-\r\n-\u0022Dorian! What an extraordinary piece of luck! I have been waiting for\r\n-you in your library ever since nine o'clock. Finally I took pity on\r\n-your tired servant and told him to go to bed, as he let me out. I am\r\n-off to Paris by the midnight train, and I particularly wanted to see\r\n-you before I left. I thought it was you, or rather your fur coat, as\r\n-you passed me. But I wasn't quite sure. Didn't you recognize me?\u0022\r\n-\r\n-\u0022In this fog, my dear Basil? Why, I can't even recognize Grosvenor\r\n-Square. I believe my house is somewhere about here, but I don't feel\r\n-at all certain about it. I am sorry you are going away, as I have not\r\n-seen you for ages. But I suppose you will be back soon?\u0022\r\n-\r\n-\u0022No: I am going to be out of England for six months. I intend to take\r\n-a studio in Paris and shut myself up till I have finished a great\r\n-picture I have in my head. However, it wasn't about myself I wanted to\r\n-talk. Here we are at your door. Let me come in for a moment. I have\r\n-something to say to you.\u0022\r\n-\r\n-\u0022I shall be charmed. But won't you miss your train?\u0022 said Dorian Gray\r\n-languidly as he passed up the steps and opened the door with his\r\n-latch-key.\r\n-\r\n-The lamplight struggled out through the fog, and Hallward looked at his\r\n-watch. \u0022I have heaps of time,\u0022 he answered. \u0022The train doesn't go\r\n-till twelve-fifteen, and it is only just eleven. In fact, I was on my\r\n-way to the club to look for you, when I met you. You see, I shan't\r\n-have any delay about luggage, as I have sent on my heavy things. All I\r\n-have with me is in this bag, and I can easily get to Victoria in twenty\r\n-minutes.\u0022\r\n-\r\n-Dorian looked at him and smiled. \u0022What a way for a fashionable painter\r\n-to travel! A Gladstone bag and an ulster! Come in, or the fog will\r\n-get into the house. And mind you don't talk about anything serious.\r\n-Nothing is serious nowadays. At least nothing should be.\u0022\r\n-\r\n-Hallward shook his head, as he entered, and followed Dorian into the\r\n-library. There was a bright wood fire blazing in the large open\r\n-hearth. The lamps were lit, and an open Dutch silver spirit-case\r\n-stood, with some siphons of soda-water and large cut-glass tumblers, on\r\n-a little marqueterie table.\r\n-\r\n-\u0022You see your servant made me quite at home, Dorian. He gave me\r\n-everything I wanted, including your best gold-tipped cigarettes. He is\r\n-a most hospitable creature. I like him much better than the Frenchman\r\n-you used to have. What has become of the Frenchman, by the bye?\u0022\r\n-\r\n-Dorian shrugged his shoulders. \u0022I believe he married Lady Radley's\r\n-maid, and has established her in Paris as an English dressmaker.\r\n-Anglomania is very fashionable over there now, I hear. It seems silly\r\n-of the French, doesn't it? But--do you know?--he was not at all a bad\r\n-servant. I never liked him, but I had nothing to complain about. One\r\n-often imagines things that are quite absurd. He was really very\r\n-devoted to me and seemed quite sorry when he went away. Have another\r\n-brandy-and-soda? Or would you like hock-and-seltzer? I always take\r\n-hock-and-seltzer myself. There is sure to be some in the next room.\u0022\r\n-\r\n-\u0022Thanks, I won't have anything more,\u0022 said the painter, taking his cap\r\n-and coat off and throwing them on the bag that he had placed in the\r\n-corner. \u0022And now, my dear fellow, I want to speak to you seriously.\r\n-Don't frown like that. You make it so much more difficult for me.\u0022\r\n-\r\n-\u0022What is it all about?\u0022 cried Dorian in his petulant way, flinging\r\n-himself down on the sofa. \u0022I hope it is not about myself. I am tired\r\n-of myself to-night. I should like to be somebody else.\u0022\r\n-\r\n-\u0022It is about yourself,\u0022 answered Hallward in his grave deep voice, \u0022and\r\n-I must say it to you. I shall only keep you half an hour.\u0022\r\n-\r\n-Dorian sighed and lit a cigarette. \u0022Half an hour!\u0022 he murmured.\r\n-\r\n-\u0022It is not much to ask of you, Dorian, and it is entirely for your own\r\n-sake that I am speaking. I think it right that you should know that\r\n-the most dreadful things are being said against you in London.\u0022\r\n-\r\n-\u0022I don't wish to know anything about them. I love scandals about other\r\n-people, but scandals about myself don't interest me. They have not got\r\n-the charm of novelty.\u0022\r\n-\r\n-\u0022They must interest you, Dorian. Every gentleman is interested in his\r\n-good name. You don't want people to talk of you as something vile and\r\n-degraded. Of course, you have your position, and your wealth, and all\r\n-that kind of thing. But position and wealth are not everything. Mind\r\n-you, I don't believe these rumours at all. At least, I can't believe\r\n-them when I see you. Sin is a thing that writes itself across a man's\r\n-face. It cannot be concealed. People talk sometimes of secret vices.\r\n-There are no such things. If a wretched man has a vice, it shows\r\n-itself in the lines of his mouth, the droop of his eyelids, the\r\n-moulding of his hands even. Somebody--I won't mention his name, but\r\n-you know him--came to me last year to have his portrait done. I had\r\n-never seen him before, and had never heard anything about him at the\r\n-time, though I have heard a good deal since. He offered an extravagant\r\n-price. I refused him. There was something in the shape of his fingers\r\n-that I hated. I know now that I was quite right in what I fancied\r\n-about him. His life is dreadful. But you, Dorian, with your pure,\r\n-bright, innocent face, and your marvellous untroubled youth--I can't\r\n-believe anything against you. And yet I see you very seldom, and you\r\n-never come down to the studio now, and when I am away from you, and I\r\n-hear all these hideous things that people are whispering about you, I\r\n-don't know what to say. Why is it, Dorian, that a man like the Duke of\r\n-Berwick leaves the room of a club when you enter it? Why is it that so\r\n-many gentlemen in London will neither go to your house or invite you to\r\n-theirs? You used to be a friend of Lord Staveley. I met him at dinner\r\n-last week. Your name happened to come up in conversation, in\r\n-connection with the miniatures you have lent to the exhibition at the\r\n-Dudley. Staveley curled his lip and said that you might have the most\r\n-artistic tastes, but that you were a man whom no pure-minded girl\r\n-should be allowed to know, and whom no chaste woman should sit in the\r\n-same room with. I reminded him that I was a friend of yours, and asked\r\n-him what he meant. He told me. He told me right out before everybody.\r\n-It was horrible! Why is your friendship so fatal to young men? There\r\n-was that wretched boy in the Guards who committed suicide. You were\r\n-his great friend. There was Sir Henry Ashton, who had to leave England\r\n-with a tarnished name. You and he were inseparable. What about Adrian\r\n-Singleton and his dreadful end? What about Lord Kent's only son and\r\n-his career? I met his father yesterday in St. James's Street. He\r\n-seemed broken with shame and sorrow. What about the young Duke of\r\n-Perth? What sort of life has he got now? What gentleman would\r\n-associate with him?\u0022\r\n-\r\n-\u0022Stop, Basil. You are talking about things of which you know nothing,\u0022\r\n-said Dorian Gray, biting his lip, and with a note of infinite contempt\r\n-in his voice. \u0022You ask me why Berwick leaves a room when I enter it.\r\n-It is because I know everything about his life, not because he knows\r\n-anything about mine. With such blood as he has in his veins, how could\r\n-his record be clean? You ask me about Henry Ashton and young Perth.\r\n-Did I teach the one his vices, and the other his debauchery? If Kent's\r\n-silly son takes his wife from the streets, what is that to me? If\r\n-Adrian Singleton writes his friend's name across a bill, am I his\r\n-keeper? I know how people chatter in England. The middle classes air\r\n-their moral prejudices over their gross dinner-tables, and whisper\r\n-about what they call the profligacies of their betters in order to try\r\n-and pretend that they are in smart society and on intimate terms with\r\n-the people they slander. In this country, it is enough for a man to\r\n-have distinction and brains for every common tongue to wag against him.\r\n-And what sort of lives do these people, who pose as being moral, lead\r\n-themselves? My dear fellow, you forget that we are in the native land\r\n-of the hypocrite.\u0022\r\n-\r\n-\u0022Dorian,\u0022 cried Hallward, \u0022that is not the question. England is bad\r\n-enough I know, and English society is all wrong. That is the reason\r\n-why I want you to be fine. You have not been fine. One has a right to\r\n-judge of a man by the effect he has over his friends. Yours seem to\r\n-lose all sense of honour, of goodness, of purity. You have filled them\r\n-with a madness for pleasure. They have gone down into the depths. You\r\n-led them there. Yes: you led them there, and yet you can smile, as\r\n-you are smiling now. And there is worse behind. I know you and Harry\r\n-are inseparable. Surely for that reason, if for none other, you should\r\n-not have made his sister's name a by-word.\u0022\r\n-\r\n-\u0022Take care, Basil. You go too far.\u0022\r\n-\r\n-\u0022I must speak, and you must listen. You shall listen. When you met\r\n-Lady Gwendolen, not a breath of scandal had ever touched her. Is there\r\n-a single decent woman in London now who would drive with her in the\r\n-park? Why, even her children are not allowed to live with her. Then\r\n-there are other stories--stories that you have been seen creeping at\r\n-dawn out of dreadful houses and slinking in disguise into the foulest\r\n-dens in London. Are they true? Can they be true? When I first heard\r\n-them, I laughed. I hear them now, and they make me shudder. What\r\n-about your country-house and the life that is led there? Dorian, you\r\n-don't know what is said about you. I won't tell you that I don't want\r\n-to preach to you. I remember Harry saying once that every man who\r\n-turned himself into an amateur curate for the moment always began by\r\n-saying that, and then proceeded to break his word. I do want to preach\r\n-to you. I want you to lead such a life as will make the world respect\r\n-you. I want you to have a clean name and a fair record. I want you to\r\n-get rid of the dreadful people you associate with. Don't shrug your\r\n-shoulders like that. Don't be so indifferent. You have a wonderful\r\n-influence. Let it be for good, not for evil. They say that you\r\n-corrupt every one with whom you become intimate, and that it is quite\r\n-sufficient for you to enter a house for shame of some kind to follow\r\n-after. I don't know whether it is so or not. How should I know? But\r\n-it is said of you. I am told things that it seems impossible to doubt.\r\n-Lord Gloucester was one of my greatest friends at Oxford. He showed me\r\n-a letter that his wife had written to him when she was dying alone in\r\n-her villa at Mentone. Your name was implicated in the most terrible\r\n-confession I ever read. I told him that it was absurd--that I knew you\r\n-thoroughly and that you were incapable of anything of the kind. Know\r\n-you? I wonder do I know you? Before I could answer that, I should\r\n-have to see your soul.\u0022\r\n-\r\n-\u0022To see my soul!\u0022 muttered Dorian Gray, starting up from the sofa and\r\n-turning almost white from fear.\r\n-\r\n-\u0022Yes,\u0022 answered Hallward gravely, and with deep-toned sorrow in his\r\n-voice, \u0022to see your soul. But only God can do that.\u0022\r\n-\r\n-A bitter laugh of mockery broke from the lips of the younger man. \u0022You\r\n-shall see it yourself, to-night!\u0022 he cried, seizing a lamp from the\r\n-table. \u0022Come: it is your own handiwork. Why shouldn't you look at\r\n-it? You can tell the world all about it afterwards, if you choose.\r\n-Nobody would believe you. If they did believe you, they would like me\r\n-all the better for it. I know the age better than you do, though you\r\n-will prate about it so tediously. Come, I tell you. You have\r\n-chattered enough about corruption. Now you shall look on it face to\r\n-face.\u0022\r\n-\r\n-There was the madness of pride in every word he uttered. He stamped\r\n-his foot upon the ground in his boyish insolent manner. He felt a\r\n-terrible joy at the thought that some one else was to share his secret,\r\n-and that the man who had painted the portrait that was the origin of\r\n-all his shame was to be burdened for the rest of his life with the\r\n-hideous memory of what he had done.\r\n-\r\n-\u0022Yes,\u0022 he continued, coming closer to him and looking steadfastly into\r\n-his stern eyes, \u0022I shall show you my soul. You shall see the thing\r\n-that you fancy only God can see.\u0022\r\n-\r\n-Hallward started back. \u0022This is blasphemy, Dorian!\u0022 he cried. \u0022You\r\n-must not say things like that. They are horrible, and they don't mean\r\n-anything.\u0022\r\n-\r\n-\u0022You think so?\u0022 He laughed again.\r\n-\r\n-\u0022I know so. As for what I said to you to-night, I said it for your\r\n-good. You know I have been always a stanch friend to you.\u0022\r\n-\r\n-\u0022Don't touch me. Finish what you have to say.\u0022\r\n-\r\n-A twisted flash of pain shot across the painter's face. He paused for\r\n-a moment, and a wild feeling of pity came over him. After all, what\r\n-right had he to pry into the life of Dorian Gray? If he had done a\r\n-tithe of what was rumoured about him, how much he must have suffered!\r\n-Then he straightened himself up, and walked over to the fire-place, and\r\n-stood there, looking at the burning logs with their frostlike ashes and\r\n-their throbbing cores of flame.\r\n-\r\n-\u0022I am waiting, Basil,\u0022 said the young man in a hard clear voice.\r\n-\r\n-He turned round. \u0022What I have to say is this,\u0022 he cried. \u0022You must\r\n-give me some answer to these horrible charges that are made against\r\n-you. If you tell me that they are absolutely untrue from beginning to\r\n-end, I shall believe you. Deny them, Dorian, deny them! Can't you see\r\n-what I am going through? My God! don't tell me that you are bad, and\r\n-corrupt, and shameful.\u0022\r\n-\r\n-Dorian Gray smiled. There was a curl of contempt in his lips. \u0022Come\r\n-upstairs, Basil,\u0022 he said quietly. \u0022I keep a diary of my life from day\r\n-to day, and it never leaves the room in which it is written. I shall\r\n-show it to you if you come with me.\u0022\r\n-\r\n-\u0022I shall come with you, Dorian, if you wish it. I see I have missed my\r\n-train. That makes no matter. I can go to-morrow. But don't ask me to\r\n-read anything to-night. All I want is a plain answer to my question.\u0022\r\n-\r\n-\u0022That shall be given to you upstairs. I could not give it here. You\r\n-will not have to read long.\u0022\r\n-\r\n-\r\n-\r\n-CHAPTER 13\r\n-\r\n-He passed out of the room and began the ascent, Basil Hallward\r\n-following close behind. They walked softly, as men do instinctively at\r\n-night. The lamp cast fantastic shadows on the wall and staircase. A\r\n-rising wind made some of the windows rattle.\r\n-\r\n-When they reached the top landing, Dorian set the lamp down on the\r\n-floor, and taking out the key, turned it in the lock. \u0022You insist on\r\n-knowing, Basil?\u0022 he asked in a low voice.\r\n-\r\n-\u0022Yes.\u0022\r\n-\r\n-\u0022I am delighted,\u0022 he answered, smiling. Then he added, somewhat\r\n-harshly, \u0022You are the one man in the world who is entitled to know\r\n-everything about me. You have had more to do with my life than you\r\n-think\u0022; and, taking up the lamp, he opened the door and went in. A\r\n-cold current of air passed them, and the light shot up for a moment in\r\n-a flame of murky orange. He shuddered. \u0022Shut the door behind you,\u0022 he\r\n-whispered, as he placed the lamp on the table.\r\n-\r\n-Hallward glanced round him with a puzzled expression. The room looked\r\n-as if it had not been lived in for years. A faded Flemish tapestry, a\r\n-curtained picture, an old Italian _cassone_, and an almost empty\r\n-book-case--that was all that it seemed to contain, besides a chair and\r\n-a table. As Dorian Gray was lighting a half-burned candle that was\r\n-standing on the mantelshelf, he saw that the whole place was covered\r\n-with dust and that the carpet was in holes. A mouse ran scuffling\r\n-behind the wainscoting. There was a damp odour of mildew.\r\n-\r\n-\u0022So you think that it is only God who sees the soul, Basil? Draw that\r\n-curtain back, and you will see mine.\u0022\r\n-\r\n-The voice that spoke was cold and cruel. \u0022You are mad, Dorian, or\r\n-playing a part,\u0022 muttered Hallward, frowning.\r\n-\r\n-\u0022You won't? Then I must do it myself,\u0022 said the young man, and he tore\r\n-the curtain from its rod and flung it on the ground.\r\n-\r\n-An exclamation of horror broke from the painter's lips as he saw in the\r\n-dim light the hideous face on the canvas grinning at him. There was\r\n-something in its expression that filled him with disgust and loathing.\r\n-Good heavens! it was Dorian Gray's own face that he was looking at!\r\n-The horror, whatever it was, had not yet entirely spoiled that\r\n-marvellous beauty. There was still some gold in the thinning hair and\r\n-some scarlet on the sensual mouth. The sodden eyes had kept something\r\n-of the loveliness of their blue, the noble curves had not yet\r\n-completely passed away from chiselled nostrils and from plastic throat.\r\n-Yes, it was Dorian himself. But who had done it? He seemed to\r\n-recognize his own brushwork, and the frame was his own design. The\r\n-idea was monstrous, yet he felt afraid. He seized the lighted candle,\r\n-and held it to the picture. In the left-hand corner was his own name,\r\n-traced in long letters of bright vermilion.\r\n-\r\n-It was some foul parody, some infamous ignoble satire. He had never\r\n-done that. Still, it was his own picture. He knew it, and he felt as\r\n-if his blood had changed in a moment from fire to sluggish ice. His\r\n-own picture! What did it mean? Why had it altered? He turned and\r\n-looked at Dorian Gray with the eyes of a sick man. His mouth twitched,\r\n-and his parched tongue seemed unable to articulate. He passed his hand\r\n-across his forehead. It was dank with clammy sweat.\r\n-\r\n-The young man was leaning against the mantelshelf, watching him with\r\n-that strange expression that one sees on the faces of those who are\r\n-absorbed in a play when some great artist is acting. There was neither\r\n-real sorrow in it nor real joy. There was simply the passion of the\r\n-spectator, with perhaps a flicker of triumph in his eyes. He had taken\r\n-the flower out of his coat, and was smelling it, or pretending to do so.\r\n-\r\n-\u0022What does this mean?\u0022 cried Hallward, at last. His own voice sounded\r\n-shrill and curious in his ears.\r\n-\r\n-\u0022Years ago, when I was a boy,\u0022 said Dorian Gray, crushing the flower in\r\n-his hand, \u0022you met me, flattered me, and taught me to be vain of my\r\n-good looks. One day you introduced me to a friend of yours, who\r\n-explained to me the wonder of youth, and you finished a portrait of me\r\n-that revealed to me the wonder of beauty. In a mad moment that, even\r\n-now, I don't know whether I regret or not, I made a wish, perhaps you\r\n-would call it a prayer....\u0022\r\n-\r\n-\u0022I remember it! Oh, how well I remember it! No! the thing is\r\n-impossible. The room is damp. Mildew has got into the canvas. The\r\n-paints I used had some wretched mineral poison in them. I tell you the\r\n-thing is impossible.\u0022\r\n-\r\n-\u0022Ah, what is impossible?\u0022 murmured the young man, going over to the\r\n-window and leaning his forehead against the cold, mist-stained glass.\r\n-\r\n-\u0022You told me you had destroyed it.\u0022\r\n-\r\n-\u0022I was wrong. It has destroyed me.\u0022\r\n-\r\n-\u0022I don't believe it is my picture.\u0022\r\n-\r\n-\u0022Can't you see your ideal in it?\u0022 said Dorian bitterly.\r\n-\r\n-\u0022My ideal, as you call it...\u0022\r\n-\r\n-\u0022As you called it.\u0022\r\n-\r\n-\u0022There was nothing evil in it, nothing shameful. You were to me such\r\n-an ideal as I shall never meet again. This is the face of a satyr.\u0022\r\n-\r\n-\u0022It is the face of my soul.\u0022\r\n-\r\n-\u0022Christ! what a thing I must have worshipped! It has the eyes of a\r\n-devil.\u0022\r\n-\r\n-\u0022Each of us has heaven and hell in him, Basil,\u0022 cried Dorian with a\r\n-wild gesture of despair.\r\n-\r\n-Hallward turned again to the portrait and gazed at it. \u0022My God! If it\r\n-is true,\u0022 he exclaimed, \u0022and this is what you have done with your life,\r\n-why, you must be worse even than those who talk against you fancy you\r\n-to be!\u0022 He held the light up again to the canvas and examined it. The\r\n-surface seemed to be quite undisturbed and as he had left it. It was\r\n-from within, apparently, that the foulness and horror had come.\r\n-Through some strange quickening of inner life the leprosies of sin were\r\n-slowly eating the thing away. The rotting of a corpse in a watery\r\n-grave was not so fearful.\r\n-\r\n-His hand shook, and the candle fell from its socket on the floor and\r\n-lay there sputtering. He placed his foot on it and put it out. Then\r\n-he flung himself into the rickety chair that was standing by the table\r\n-and buried his face in his hands.\r\n-\r\n-\u0022Good God, Dorian, what a lesson! What an awful lesson!\u0022 There was no\r\n-answer, but he could hear the young man sobbing at the window. \u0022Pray,\r\n-Dorian, pray,\u0022 he murmured. \u0022What is it that one was taught to say in\r\n-one's boyhood? 'Lead us not into temptation. Forgive us our sins.\r\n-Wash away our iniquities.' Let us say that together. The prayer of\r\n-your pride has been answered. The prayer of your repentance will be\r\n-answered also. I worshipped you too much. I am punished for it. You\r\n-worshipped yourself too much. We are both punished.\u0022\r\n-\r\n-Dorian Gray turned slowly around and looked at him with tear-dimmed\r\n-eyes. \u0022It is too late, Basil,\u0022 he faltered.\r\n-\r\n-\u0022It is never too late, Dorian. Let us kneel down and try if we cannot\r\n-remember a prayer. Isn't there a verse somewhere, 'Though your sins be\r\n-as scarlet, yet I will make them as white as snow'?\u0022\r\n-\r\n-\u0022Those words mean nothing to me now.\u0022\r\n-\r\n-\u0022Hush! Don't say that. You have done enough evil in your life. My\r\n-God! Don't you see that accursed thing leering at us?\u0022\r\n-\r\n-Dorian Gray glanced at the picture, and suddenly an uncontrollable\r\n-feeling of hatred for Basil Hallward came over him, as though it had\r\n-been suggested to him by the image on the canvas, whispered into his\r\n-ear by those grinning lips. The mad passions of a hunted animal\r\n-stirred within him, and he loathed the man who was seated at the table,\r\n-more than in his whole life he had ever loathed anything. He glanced\r\n-wildly around. Something glimmered on the top of the painted chest\r\n-that faced him. His eye fell on it. He knew what it was. It was a\r\n-knife that he had brought up, some days before, to cut a piece of cord,\r\n-and had forgotten to take away with him. He moved slowly towards it,\r\n-passing Hallward as he did so. As soon as he got behind him, he seized\r\n-it and turned round. Hallward stirred in his chair as if he was going\r\n-to rise. He rushed at him and dug the knife into the great vein that\r\n-is behind the ear, crushing the man's head down on the table and\r\n-stabbing again and again.\r\n-\r\n-There was a stifled groan and the horrible sound of some one choking\r\n-with blood. Three times the outstretched arms shot up convulsively,\r\n-waving grotesque, stiff-fingered hands in the air. He stabbed him\r\n-twice more, but the man did not move. Something began to trickle on\r\n-the floor. He waited for a moment, still pressing the head down. Then\r\n-he threw the knife on the table, and listened.\r\n-\r\n-He could hear nothing, but the drip, drip on the threadbare carpet. He\r\n-opened the door and went out on the landing. The house was absolutely\r\n-quiet. No one was about. For a few seconds he stood bending over the\r\n-balustrade and peering down into the black seething well of darkness.\r\n-Then he took out the key and returned to the room, locking himself in\r\n-as he did so.\r\n-\r\n-The thing was still seated in the chair, straining over the table with\r\n-bowed head, and humped back, and long fantastic arms. Had it not been\r\n-for the red jagged tear in the neck and the clotted black pool that was\r\n-slowly widening on the table, one would have said that the man was\r\n-simply asleep.\r\n-\r\n-How quickly it had all been done! He felt strangely calm, and walking\r\n-over to the window, opened it and stepped out on the balcony. The wind\r\n-had blown the fog away, and the sky was like a monstrous peacock's\r\n-tail, starred with myriads of golden eyes. He looked down and saw the\r\n-policeman going his rounds and flashing the long beam of his lantern on\r\n-the doors of the silent houses. The crimson spot of a prowling hansom\r\n-gleamed at the corner and then vanished. A woman in a fluttering shawl\r\n-was creeping slowly by the railings, staggering as she went. Now and\r\n-then she stopped and peered back. Once, she began to sing in a hoarse\r\n-voice. The policeman strolled over and said something to her. She\r\n-stumbled away, laughing. A bitter blast swept across the square. The\r\n-gas-lamps flickered and became blue, and the leafless trees shook their\r\n-black iron branches to and fro. He shivered and went back, closing the\r\n-window behind him.\r\n-\r\n-Having reached the door, he turned the key and opened it. He did not\r\n-even glance at the murdered man. He felt that the secret of the whole\r\n-thing was not to realize the situation. The friend who had painted the\r\n-fatal portrait to which all his misery had been due had gone out of his\r\n-life. That was enough.\r\n-\r\n-Then he remembered the lamp. It was a rather curious one of Moorish\r\n-workmanship, made of dull silver inlaid with arabesques of burnished\r\n-steel, and studded with coarse turquoises. Perhaps it might be missed\r\n-by his servant, and questions would be asked. He hesitated for a\r\n-moment, then he turned back and took it from the table. He could not\r\n-help seeing the dead thing. How still it was! How horribly white the\r\n-long hands looked! It was like a dreadful wax image.\r\n-\r\n-Having locked the door behind him, he crept quietly downstairs. The\r\n-woodwork creaked and seemed to cry out as if in pain. He stopped\r\n-several times and waited. No: everything was still. It was merely\r\n-the sound of his own footsteps.\r\n-\r\n-When he reached the library, he saw the bag and coat in the corner.\r\n-They must be hidden away somewhere. He unlocked a secret press that\r\n-was in the wainscoting, a press in which he kept his own curious\r\n-disguises, and put them into it. He could easily burn them afterwards.\r\n-Then he pulled out his watch. It was twenty minutes to two.\r\n-\r\n-He sat down and began to think. Every year--every month, almost--men\r\n-were strangled in England for what he had done. There had been a\r\n-madness of murder in the air. Some red star had come too close to the\r\n-earth.... And yet, what evidence was there against him? Basil Hallward\r\n-had left the house at eleven. No one had seen him come in again. Most\r\n-of the servants were at Selby Royal. His valet had gone to bed....\r\n-Paris! Yes. It was to Paris that Basil had gone, and by the midnight\r\n-train, as he had intended. With his curious reserved habits, it would\r\n-be months before any suspicions would be roused. Months! Everything\r\n-could be destroyed long before then.\r\n-\r\n-A sudden thought struck him. He put on his fur coat and hat and went\r\n-out into the hall. There he paused, hearing the slow heavy tread of\r\n-the policeman on the pavement outside and seeing the flash of the\r\n-bull's-eye reflected in the window. He waited and held his breath.\r\n-\r\n-After a few moments he drew back the latch and slipped out, shutting\r\n-the door very gently behind him. Then he began ringing the bell. In\r\n-about five minutes his valet appeared, half-dressed and looking very\r\n-drowsy.\r\n-\r\n-\u0022I am sorry to have had to wake you up, Francis,\u0022 he said, stepping in;\r\n-\u0022but I had forgotten my latch-key. What time is it?\u0022\r\n-\r\n-\u0022Ten minutes past two, sir,\u0022 answered the man, looking at the clock and\r\n-blinking.\r\n-\r\n-\u0022Ten minutes past two? How horribly late! You must wake me at nine\r\n-to-morrow. I have some work to do.\u0022\r\n-\r\n-\u0022All right, sir.\u0022\r\n-\r\n-\u0022Did any one call this evening?\u0022\r\n-\r\n-\u0022Mr. Hallward, sir. He stayed here till eleven, and then he went away\r\n-to catch his train.\u0022\r\n-\r\n-\u0022Oh! I am sorry I didn't see him. Did he leave any message?\u0022\r\n-\r\n-\u0022No, sir, except that he would write to you from Paris, if he did not\r\n-find you at the club.\u0022\r\n-\r\n-\u0022That will do, Francis. Don't forget to call me at nine to-morrow.\u0022\r\n-\r\n-\u0022No, sir.\u0022\r\n-\r\n-The man shambled down the passage in his slippers.\r\n-\r\n-Dorian Gray threw his hat and coat upon the table and passed into the\r\n-library. For a quarter of an hour he walked up and down the room,\r\n-biting his lip and thinking. Then he took down the Blue Book from one\r\n-of the shelves and began to turn over the leaves. \u0022Alan Campbell, 152,\r\n-Hertford Street, Mayfair.\u0022 Yes; that was the man he wanted.\r\n-\r\n-\r\n-\r\n-CHAPTER 14\r\n-\r\n-At nine o'clock the next morning his servant came in with a cup of\r\n-chocolate on a tray and opened the shutters. Dorian was sleeping quite\r\n-peacefully, lying on his right side, with one hand underneath his\r\n-cheek. He looked like a boy who had been tired out with play, or study.\r\n-\r\n-The man had to touch him twice on the shoulder before he woke, and as\r\n-he opened his eyes a faint smile passed across his lips, as though he\r\n-had been lost in some delightful dream. Yet he had not dreamed at all.\r\n-His night had been untroubled by any images of pleasure or of pain.\r\n-But youth smiles without any reason. It is one of its chiefest charms.\r\n-\r\n-He turned round, and leaning upon his elbow, began to sip his\r\n-chocolate. The mellow November sun came streaming into the room. The\r\n-sky was bright, and there was a genial warmth in the air. It was\r\n-almost like a morning in May.\r\n-\r\n-Gradually the events of the preceding night crept with silent,\r\n-blood-stained feet into his brain and reconstructed themselves there\r\n-with terrible distinctness. He winced at the memory of all that he had\r\n-suffered, and for a moment the same curious feeling of loathing for\r\n-Basil Hallward that had made him kill him as he sat in the chair came\r\n-back to him, and he grew cold with passion. The dead man was still\r\n-sitting there, too, and in the sunlight now. How horrible that was!\r\n-Such hideous things were for the darkness, not for the day.\r\n-\r\n-He felt that if he brooded on what he had gone through he would sicken\r\n-or grow mad. There were sins whose fascination was more in the memory\r\n-than in the doing of them, strange triumphs that gratified the pride\r\n-more than the passions, and gave to the intellect a quickened sense of\r\n-joy, greater than any joy they brought, or could ever bring, to the\r\n-senses. But this was not one of them. It was a thing to be driven out\r\n-of the mind, to be drugged with poppies, to be strangled lest it might\r\n-strangle one itself.\r\n-\r\n-When the half-hour struck, he passed his hand across his forehead, and\r\n-then got up hastily and dressed himself with even more than his usual\r\n-care, giving a good deal of attention to the choice of his necktie and\r\n-scarf-pin and changing his rings more than once. He spent a long time\r\n-also over breakfast, tasting the various dishes, talking to his valet\r\n-about some new liveries that he was thinking of getting made for the\r\n-servants at Selby, and going through his correspondence. At some of\r\n-the letters, he smiled. Three of them bored him. One he read several\r\n-times over and then tore up with a slight look of annoyance in his\r\n-face. \u0022That awful thing, a woman's memory!\u0022 as Lord Henry had once\r\n-said.\r\n-\r\n-After he had drunk his cup of black coffee, he wiped his lips slowly\r\n-with a napkin, motioned to his servant to wait, and going over to the\r\n-table, sat down and wrote two letters. One he put in his pocket, the\r\n-other he handed to the valet.\r\n-\r\n-\u0022Take this round to 152, Hertford Street, Francis, and if Mr. Campbell\r\n-is out of town, get his address.\u0022\r\n-\r\n-As soon as he was alone, he lit a cigarette and began sketching upon a\r\n-piece of paper, drawing first flowers and bits of architecture, and\r\n-then human faces. Suddenly he remarked that every face that he drew\r\n-seemed to have a fantastic likeness to Basil Hallward. He frowned, and\r\n-getting up, went over to the book-case and took out a volume at hazard.\r\n-He was determined that he would not think about what had happened until\r\n-it became absolutely necessary that he should do so.\r\n-\r\n-When he had stretched himself on the sofa, he looked at the title-page\r\n-of the book. It was Gautier's Emaux et Camees, Charpentier's\r\n-Japanese-paper edition, with the Jacquemart etching. The binding was\r\n-of citron-green leather, with a design of gilt trellis-work and dotted\r\n-pomegranates. It had been given to him by Adrian Singleton. As he\r\n-turned over the pages, his eye fell on the poem about the hand of\r\n-Lacenaire, the cold yellow hand \u0022_du supplice encore mal lavee_,\u0022 with\r\n-its downy red hairs and its \u0022_doigts de faune_.\u0022 He glanced at his own\r\n-white taper fingers, shuddering slightly in spite of himself, and\r\n-passed on, till he came to those lovely stanzas upon Venice:\r\n-\r\n- Sur une gamme chromatique,\r\n- Le sein de perles ruisselant,\r\n- La Venus de l'Adriatique\r\n- Sort de l'eau son corps rose et blanc.\r\n-\r\n- Les domes, sur l'azur des ondes\r\n- Suivant la phrase au pur contour,\r\n- S'enflent comme des gorges rondes\r\n- Que souleve un soupir d'amour.\r\n-\r\n- L'esquif aborde et me depose,\r\n- Jetant son amarre au pilier,\r\n- Devant une facade rose,\r\n- Sur le marbre d'un escalier.\r\n-\r\n-\r\n-How exquisite they were! As one read them, one seemed to be floating\r\n-down the green water-ways of the pink and pearl city, seated in a black\r\n-gondola with silver prow and trailing curtains. The mere lines looked\r\n-to him like those straight lines of turquoise-blue that follow one as\r\n-one pushes out to the Lido. The sudden flashes of colour reminded him\r\n-of the gleam of the opal-and-iris-throated birds that flutter round the\r\n-tall honeycombed Campanile, or stalk, with such stately grace, through\r\n-the dim, dust-stained arcades. Leaning back with half-closed eyes, he\r\n-kept saying over and over to himself:\r\n-\r\n- \u0022Devant une facade rose,\r\n- Sur le marbre d'un escalier.\u0022\r\n-\r\n-The whole of Venice was in those two lines. He remembered the autumn\r\n-that he had passed there, and a wonderful love that had stirred him to\r\n-mad delightful follies. There was romance in every place. But Venice,\r\n-like Oxford, had kept the background for romance, and, to the true\r\n-romantic, background was everything, or almost everything. Basil had\r\n-been with him part of the time, and had gone wild over Tintoret. Poor\r\n-Basil! What a horrible way for a man to die!\r\n-\r\n-He sighed, and took up the volume again, and tried to forget. He read\r\n-of the swallows that fly in and out of the little _cafe_ at Smyrna where\r\n-the Hadjis sit counting their amber beads and the turbaned merchants\r\n-smoke their long tasselled pipes and talk gravely to each other; he\r\n-read of the Obelisk in the Place de la Concorde that weeps tears of\r\n-granite in its lonely sunless exile and longs to be back by the hot,\r\n-lotus-covered Nile, where there are Sphinxes, and rose-red ibises, and\r\n-white vultures with gilded claws, and crocodiles with small beryl eyes\r\n-that crawl over the green steaming mud; he began to brood over those\r\n-verses which, drawing music from kiss-stained marble, tell of that\r\n-curious statue that Gautier compares to a contralto voice, the \u0022_monstre\r\n-charmant_\u0022 that couches in the porphyry-room of the Louvre. But after a\r\n-time the book fell from his hand. He grew nervous, and a horrible fit\r\n-of terror came over him. What if Alan Campbell should be out of\r\n-England? Days would elapse before he could come back. Perhaps he\r\n-might refuse to come. What could he do then? Every moment was of\r\n-vital importance.\r\n-\r\n-They had been great friends once, five years before--almost\r\n-inseparable, indeed. Then the intimacy had come suddenly to an end.\r\n-When they met in society now, it was only Dorian Gray who smiled: Alan\r\n-Campbell never did.\r\n-\r\n-He was an extremely clever young man, though he had no real\r\n-appreciation of the visible arts, and whatever little sense of the\r\n-beauty of poetry he possessed he had gained entirely from Dorian. His\r\n-dominant intellectual passion was for science. At Cambridge he had\r\n-spent a great deal of his time working in the laboratory, and had taken\r\n-a good class in the Natural Science Tripos of his year. Indeed, he was\r\n-still devoted to the study of chemistry, and had a laboratory of his\r\n-own in which he used to shut himself up all day long, greatly to the\r\n-annoyance of his mother, who had set her heart on his standing for\r\n-Parliament and had a vague idea that a chemist was a person who made up\r\n-prescriptions. He was an excellent musician, however, as well, and\r\n-played both the violin and the piano better than most amateurs. In\r\n-fact, it was music that had first brought him and Dorian Gray\r\n-together--music and that indefinable attraction that Dorian seemed to\r\n-be able to exercise whenever he wished--and, indeed, exercised often\r\n-without being conscious of it. They had met at Lady Berkshire's the\r\n-night that Rubinstein played there, and after that used to be always\r\n-seen together at the opera and wherever good music was going on. For\r\n-eighteen months their intimacy lasted. Campbell was always either at\r\n-Selby Royal or in Grosvenor Square. To him, as to many others, Dorian\r\n-Gray was the type of everything that is wonderful and fascinating in\r\n-life. Whether or not a quarrel had taken place between them no one\r\n-ever knew. But suddenly people remarked that they scarcely spoke when\r\n-they met and that Campbell seemed always to go away early from any\r\n-party at which Dorian Gray was present. He had changed, too--was\r\n-strangely melancholy at times, appeared almost to dislike hearing\r\n-music, and would never himself play, giving as his excuse, when he was\r\n-called upon, that he was so absorbed in science that he had no time\r\n-left in which to practise. And this was certainly true. Every day he\r\n-seemed to become more interested in biology, and his name appeared once\r\n-or twice in some of the scientific reviews in connection with certain\r\n-curious experiments.\r\n-\r\n-This was the man Dorian Gray was waiting for. Every second he kept\r\n-glancing at the clock. As the minutes went by he became horribly\r\n-agitated. At last he got up and began to pace up and down the room,\r\n-looking like a beautiful caged thing. He took long stealthy strides.\r\n-His hands were curiously cold.\r\n-\r\n-The suspense became unbearable. Time seemed to him to be crawling with\r\n-feet of lead, while he by monstrous winds was being swept towards the\r\n-jagged edge of some black cleft of precipice. He knew what was waiting\r\n-for him there; saw it, indeed, and, shuddering, crushed with dank hands\r\n-his burning lids as though he would have robbed the very brain of sight\r\n-and driven the eyeballs back into their cave. It was useless. The\r\n-brain had its own food on which it battened, and the imagination, made\r\n-grotesque by terror, twisted and distorted as a living thing by pain,\r\n-danced like some foul puppet on a stand and grinned through moving\r\n-masks. Then, suddenly, time stopped for him. Yes: that blind,\r\n-slow-breathing thing crawled no more, and horrible thoughts, time being\r\n-dead, raced nimbly on in front, and dragged a hideous future from its\r\n-grave, and showed it to him. He stared at it. Its very horror made\r\n-him stone.\r\n-\r\n-At last the door opened and his servant entered. He turned glazed eyes\r\n-upon him.\r\n-\r\n-\u0022Mr. Campbell, sir,\u0022 said the man.\r\n-\r\n-A sigh of relief broke from his parched lips, and the colour came back\r\n-to his cheeks.\r\n-\r\n-\u0022Ask him to come in at once, Francis.\u0022 He felt that he was himself\r\n-again. His mood of cowardice had passed away.\r\n-\r\n-The man bowed and retired. In a few moments, Alan Campbell walked in,\r\n-looking very stern and rather pale, his pallor being intensified by his\r\n-coal-black hair and dark eyebrows.\r\n-\r\n-\u0022Alan! This is kind of you. I thank you for coming.\u0022\r\n-\r\n-\u0022I had intended never to enter your house again, Gray. But you said it\r\n-was a matter of life and death.\u0022 His voice was hard and cold. He\r\n-spoke with slow deliberation. There was a look of contempt in the\r\n-steady searching gaze that he turned on Dorian. He kept his hands in\r\n-the pockets of his Astrakhan coat, and seemed not to have noticed the\r\n-gesture with which he had been greeted.\r\n-\r\n-\u0022Yes: it is a matter of life and death, Alan, and to more than one\r\n-person. Sit down.\u0022\r\n-\r\n-Campbell took a chair by the table, and Dorian sat opposite to him.\r\n-The two men's eyes met. In Dorian's there was infinite pity. He knew\r\n-that what he was going to do was dreadful.\r\n-\r\n-After a strained moment of silence, he leaned across and said, very\r\n-quietly, but watching the effect of each word upon the face of him he\r\n-had sent for, \u0022Alan, in a locked room at the top of this house, a room\r\n-to which nobody but myself has access, a dead man is seated at a table.\r\n-He has been dead ten hours now. Don't stir, and don't look at me like\r\n-that. Who the man is, why he died, how he died, are matters that do\r\n-not concern you. What you have to do is this--\u0022\r\n-\r\n-\u0022Stop, Gray. I don't want to know anything further. Whether what you\r\n-have told me is true or not true doesn't concern me. I entirely\r\n-decline to be mixed up in your life. Keep your horrible secrets to\r\n-yourself. They don't interest me any more.\u0022\r\n-\r\n-\u0022Alan, they will have to interest you. This one will have to interest\r\n-you. I am awfully sorry for you, Alan. But I can't help myself. You\r\n-are the one man who is able to save me. I am forced to bring you into\r\n-the matter. I have no option. Alan, you are scientific. You know\r\n-about chemistry and things of that kind. You have made experiments.\r\n-What you have got to do is to destroy the thing that is upstairs--to\r\n-destroy it so that not a vestige of it will be left. Nobody saw this\r\n-person come into the house. Indeed, at the present moment he is\r\n-supposed to be in Paris. He will not be missed for months. When he is\r\n-missed, there must be no trace of him found here. You, Alan, you must\r\n-change him, and everything that belongs to him, into a handful of ashes\r\n-that I may scatter in the air.\u0022\r\n-\r\n-\u0022You are mad, Dorian.\u0022\r\n-\r\n-\u0022Ah! I was waiting for you to call me Dorian.\u0022\r\n-\r\n-\u0022You are mad, I tell you--mad to imagine that I would raise a finger to\r\n-help you, mad to make this monstrous confession. I will have nothing\r\n-to do with this matter, whatever it is. Do you think I am going to\r\n-peril my reputation for you? What is it to me what devil's work you\r\n-are up to?\u0022\r\n-\r\n-\u0022It was suicide, Alan.\u0022\r\n-\r\n-\u0022I am glad of that. But who drove him to it? You, I should fancy.\u0022\r\n-\r\n-\u0022Do you still refuse to do this for me?\u0022\r\n-\r\n-\u0022Of course I refuse. I will have absolutely nothing to do with it. I\r\n-don't care what shame comes on you. You deserve it all. I should not\r\n-be sorry to see you disgraced, publicly disgraced. How dare you ask\r\n-me, of all men in the world, to mix myself up in this horror? I should\r\n-have thought you knew more about people's characters. Your friend Lord\r\n-Henry Wotton can't have taught you much about psychology, whatever else\r\n-he has taught you. Nothing will induce me to stir a step to help you.\r\n-You have come to the wrong man. Go to some of your friends. Don't\r\n-come to me.\u0022\r\n-\r\n-\u0022Alan, it was murder. I killed him. You don't know what he had made\r\n-me suffer. Whatever my life is, he had more to do with the making or\r\n-the marring of it than poor Harry has had. He may not have intended\r\n-it, the result was the same.\u0022\r\n-\r\n-\u0022Murder! Good God, Dorian, is that what you have come to? I shall not\r\n-inform upon you. It is not my business. Besides, without my stirring\r\n-in the matter, you are certain to be arrested. Nobody ever commits a\r\n-crime without doing something stupid. But I will have nothing to do\r\n-with it.\u0022\r\n-\r\n-\u0022You must have something to do with it. Wait, wait a moment; listen to\r\n-me. Only listen, Alan. All I ask of you is to perform a certain\r\n-scientific experiment. You go to hospitals and dead-houses, and the\r\n-horrors that you do there don't affect you. If in some hideous\r\n-dissecting-room or fetid laboratory you found this man lying on a\r\n-leaden table with red gutters scooped out in it for the blood to flow\r\n-through, you would simply look upon him as an admirable subject. You\r\n-would not turn a hair. You would not believe that you were doing\r\n-anything wrong. On the contrary, you would probably feel that you were\r\n-benefiting the human race, or increasing the sum of knowledge in the\r\n-world, or gratifying intellectual curiosity, or something of that kind.\r\n-What I want you to do is merely what you have often done before.\r\n-Indeed, to destroy a body must be far less horrible than what you are\r\n-accustomed to work at. And, remember, it is the only piece of evidence\r\n-against me. If it is discovered, I am lost; and it is sure to be\r\n-discovered unless you help me.\u0022\r\n-\r\n-\u0022I have no desire to help you. You forget that. I am simply\r\n-indifferent to the whole thing. It has nothing to do with me.\u0022\r\n-\r\n-\u0022Alan, I entreat you. Think of the position I am in. Just before you\r\n-came I almost fainted with terror. You may know terror yourself some\r\n-day. No! don't think of that. Look at the matter purely from the\r\n-scientific point of view. You don't inquire where the dead things on\r\n-which you experiment come from. Don't inquire now. I have told you\r\n-too much as it is. But I beg of you to do this. We were friends once,\r\n-Alan.\u0022\r\n-\r\n-\u0022Don't speak about those days, Dorian--they are dead.\u0022\r\n-\r\n-\u0022The dead linger sometimes. The man upstairs will not go away. He is\r\n-sitting at the table with bowed head and outstretched arms. Alan!\r\n-Alan! If you don't come to my assistance, I am ruined. Why, they will\r\n-hang me, Alan! Don't you understand? They will hang me for what I\r\n-have done.\u0022\r\n-\r\n-\u0022There is no good in prolonging this scene. I absolutely refuse to do\r\n-anything in the matter. It is insane of you to ask me.\u0022\r\n-\r\n-\u0022You refuse?\u0022\r\n-\r\n-\u0022Yes.\u0022\r\n-\r\n-\u0022I entreat you, Alan.\u0022\r\n-\r\n-\u0022It is useless.\u0022\r\n-\r\n-The same look of pity came into Dorian Gray's eyes. Then he stretched\r\n-out his hand, took a piece of paper, and wrote something on it. He\r\n-read it over twice, folded it carefully, and pushed it across the\r\n-table. Having done this, he got up and went over to the window.\r\n-\r\n-Campbell looked at him in surprise, and then took up the paper, and\r\n-opened it. As he read it, his face became ghastly pale and he fell\r\n-back in his chair. A horrible sense of sickness came over him. He\r\n-felt as if his heart was beating itself to death in some empty hollow.\r\n-\r\n-After two or three minutes of terrible silence, Dorian turned round and\r\n-came and stood behind him, putting his hand upon his shoulder.\r\n-\r\n-\u0022I am so sorry for you, Alan,\u0022 he murmured, \u0022but you leave me no\r\n-alternative. I have a letter written already. Here it is. You see\r\n-the address. If you don't help me, I must send it. If you don't help\r\n-me, I will send it. You know what the result will be. But you are\r\n-going to help me. It is impossible for you to refuse now. I tried to\r\n-spare you. You will do me the justice to admit that. You were stern,\r\n-harsh, offensive. You treated me as no man has ever dared to treat\r\n-me--no living man, at any rate. I bore it all. Now it is for me to\r\n-dictate terms.\u0022\r\n-\r\n-Campbell buried his face in his hands, and a shudder passed through him.\r\n-\r\n-\u0022Yes, it is my turn to dictate terms, Alan. You know what they are.\r\n-The thing is quite simple. Come, don't work yourself into this fever.\r\n-The thing has to be done. Face it, and do it.\u0022\r\n-\r\n-A groan broke from Campbell's lips and he shivered all over. The\r\n-ticking of the clock on the mantelpiece seemed to him to be dividing\r\n-time into separate atoms of agony, each of which was too terrible to be\r\n-borne. He felt as if an iron ring was being slowly tightened round his\r\n-forehead, as if the disgrace with which he was threatened had already\r\n-come upon him. The hand upon his shoulder weighed like a hand of lead.\r\n-It was intolerable. It seemed to crush him.\r\n-\r\n-\u0022Come, Alan, you must decide at once.\u0022\r\n-\r\n-\u0022I cannot do it,\u0022 he said, mechanically, as though words could alter\r\n-things.\r\n-\r\n-\u0022You must. You have no choice. Don't delay.\u0022\r\n-\r\n-He hesitated a moment. \u0022Is there a fire in the room upstairs?\u0022\r\n-\r\n-\u0022Yes, there is a gas-fire with asbestos.\u0022\r\n-\r\n-\u0022I shall have to go home and get some things from the laboratory.\u0022\r\n-\r\n-\u0022No, Alan, you must not leave the house. Write out on a sheet of\r\n-notepaper what you want and my servant will take a cab and bring the\r\n-things back to you.\u0022\r\n-\r\n-Campbell scrawled a few lines, blotted them, and addressed an envelope\r\n-to his assistant. Dorian took the note up and read it carefully. Then\r\n-he rang the bell and gave it to his valet, with orders to return as\r\n-soon as possible and to bring the things with him.\r\n-\r\n-As the hall door shut, Campbell started nervously, and having got up\r\n-from the chair, went over to the chimney-piece. He was shivering with a\r\n-kind of ague. For nearly twenty minutes, neither of the men spoke. A\r\n-fly buzzed noisily about the room, and the ticking of the clock was\r\n-like the beat of a hammer.\r\n-\r\n-As the chime struck one, Campbell turned round, and looking at Dorian\r\n-Gray, saw that his eyes were filled with tears. There was something in\r\n-the purity and refinement of that sad face that seemed to enrage him.\r\n-\u0022You are infamous, absolutely infamous!\u0022 he muttered.\r\n-\r\n-\u0022Hush, Alan. You have saved my life,\u0022 said Dorian.\r\n-\r\n-\u0022Your life? Good heavens! what a life that is! You have gone from\r\n-corruption to corruption, and now you have culminated in crime. In\r\n-doing what I am going to do--what you force me to do--it is not of your\r\n-life that I am thinking.\u0022\r\n-\r\n-\u0022Ah, Alan,\u0022 murmured Dorian with a sigh, \u0022I wish you had a thousandth\r\n-part of the pity for me that I have for you.\u0022 He turned away as he\r\n-spoke and stood looking out at the garden. Campbell made no answer.\r\n-\r\n-After about ten minutes a knock came to the door, and the servant\r\n-entered, carrying a large mahogany chest of chemicals, with a long coil\r\n-of steel and platinum wire and two rather curiously shaped iron clamps.\r\n-\r\n-\u0022Shall I leave the things here, sir?\u0022 he asked Campbell.\r\n-\r\n-\u0022Yes,\u0022 said Dorian. \u0022And I am afraid, Francis, that I have another\r\n-errand for you. What is the name of the man at Richmond who supplies\r\n-Selby with orchids?\u0022\r\n-\r\n-\u0022Harden, sir.\u0022\r\n-\r\n-\u0022Yes--Harden. You must go down to Richmond at once, see Harden\r\n-personally, and tell him to send twice as many orchids as I ordered,\r\n-and to have as few white ones as possible. In fact, I don't want any\r\n-white ones. It is a lovely day, Francis, and Richmond is a very pretty\r\n-place--otherwise I wouldn't bother you about it.\u0022\r\n-\r\n-\u0022No trouble, sir. At what time shall I be back?\u0022\r\n-\r\n-Dorian looked at Campbell. \u0022How long will your experiment take, Alan?\u0022\r\n-he said in a calm indifferent voice. The presence of a third person in\r\n-the room seemed to give him extraordinary courage.\r\n-\r\n-Campbell frowned and bit his lip. \u0022It will take about five hours,\u0022 he\r\n-answered.\r\n-\r\n-\u0022It will be time enough, then, if you are back at half-past seven,\r\n-Francis. Or stay: just leave my things out for dressing. You can\r\n-have the evening to yourself. I am not dining at home, so I shall not\r\n-want you.\u0022\r\n-\r\n-\u0022Thank you, sir,\u0022 said the man, leaving the room.\r\n-\r\n-\u0022Now, Alan, there is not a moment to be lost. How heavy this chest is!\r\n-I'll take it for you. You bring the other things.\u0022 He spoke rapidly\r\n-and in an authoritative manner. Campbell felt dominated by him. They\r\n-left the room together.\r\n-\r\n-When they reached the top landing, Dorian took out the key and turned\r\n-it in the lock. Then he stopped, and a troubled look came into his\r\n-eyes. He shuddered. \u0022I don't think I can go in, Alan,\u0022 he murmured.\r\n-\r\n-\u0022It is nothing to me. I don't require you,\u0022 said Campbell coldly.\r\n-\r\n-Dorian half opened the door. As he did so, he saw the face of his\r\n-portrait leering in the sunlight. On the floor in front of it the torn\r\n-curtain was lying. He remembered that the night before he had\r\n-forgotten, for the first time in his life, to hide the fatal canvas,\r\n-and was about to rush forward, when he drew back with a shudder.\r\n-\r\n-What was that loathsome red dew that gleamed, wet and glistening, on\r\n-one of the hands, as though the canvas had sweated blood? How horrible\r\n-it was!--more horrible, it seemed to him for the moment, than the\r\n-silent thing that he knew was stretched across the table, the thing\r\n-whose grotesque misshapen shadow on the spotted carpet showed him that\r\n-it had not stirred, but was still there, as he had left it.\r\n-\r\n-He heaved a deep breath, opened the door a little wider, and with\r\n-half-closed eyes and averted head, walked quickly in, determined that\r\n-he would not look even once upon the dead man. Then, stooping down and\r\n-taking up the gold-and-purple hanging, he flung it right over the\r\n-picture.\r\n-\r\n-There he stopped, feeling afraid to turn round, and his eyes fixed\r\n-themselves on the intricacies of the pattern before him. He heard\r\n-Campbell bringing in the heavy chest, and the irons, and the other\r\n-things that he had required for his dreadful work. He began to wonder\r\n-if he and Basil Hallward had ever met, and, if so, what they had\r\n-thought of each other.\r\n-\r\n-\u0022Leave me now,\u0022 said a stern voice behind him.\r\n-\r\n-He turned and hurried out, just conscious that the dead man had been\r\n-thrust back into the chair and that Campbell was gazing into a\r\n-glistening yellow face. As he was going downstairs, he heard the key\r\n-being turned in the lock.\r\n-\r\n-It was long after seven when Campbell came back into the library. He\r\n-was pale, but absolutely calm. \u0022I have done what you asked me to do,\u0022\r\n-he muttered. \u0022And now, good-bye. Let us never see each other again.\u0022\r\n-\r\n-\u0022You have saved me from ruin, Alan. I cannot forget that,\u0022 said Dorian\r\n-simply.\r\n-\r\n-As soon as Campbell had left, he went upstairs. There was a horrible\r\n-smell of nitric acid in the room. But the thing that had been sitting\r\n-at the table was gone.\r\n-\r\n-\r\n-\r\n-CHAPTER 15\r\n-\r\n-That evening, at eight-thirty, exquisitely dressed and wearing a large\r\n-button-hole of Parma violets, Dorian Gray was ushered into Lady\r\n-Narborough's drawing-room by bowing servants. His forehead was\r\n-throbbing with maddened nerves, and he felt wildly excited, but his\r\n-manner as he bent over his hostess's hand was as easy and graceful as\r\n-ever. Perhaps one never seems so much at one's ease as when one has to\r\n-play a part. Certainly no one looking at Dorian Gray that night could\r\n-have believed that he had passed through a tragedy as horrible as any\r\n-tragedy of our age. Those finely shaped fingers could never have\r\n-clutched a knife for sin, nor those smiling lips have cried out on God\r\n-and goodness. He himself could not help wondering at the calm of his\r\n-demeanour, and for a moment felt keenly the terrible pleasure of a\r\n-double life.\r\n-\r\n-It was a small party, got up rather in a hurry by Lady Narborough, who\r\n-was a very clever woman with what Lord Henry used to describe as the\r\n-remains of really remarkable ugliness. She had proved an excellent\r\n-wife to one of our most tedious ambassadors, and having buried her\r\n-husband properly in a marble mausoleum, which she had herself designed,\r\n-and married off her daughters to some rich, rather elderly men, she\r\n-devoted herself now to the pleasures of French fiction, French cookery,\r\n-and French _esprit_ when she could get it.\r\n-\r\n-Dorian was one of her especial favourites, and she always told him that\r\n-she was extremely glad she had not met him in early life. \u0022I know, my\r\n-dear, I should have fallen madly in love with you,\u0022 she used to say,\r\n-\u0022and thrown my bonnet right over the mills for your sake. It is most\r\n-fortunate that you were not thought of at the time. As it was, our\r\n-bonnets were so unbecoming, and the mills were so occupied in trying to\r\n-raise the wind, that I never had even a flirtation with anybody.\r\n-However, that was all Narborough's fault. He was dreadfully\r\n-short-sighted, and there is no pleasure in taking in a husband who\r\n-never sees anything.\u0022\r\n-\r\n-Her guests this evening were rather tedious. The fact was, as she\r\n-explained to Dorian, behind a very shabby fan, one of her married\r\n-daughters had come up quite suddenly to stay with her, and, to make\r\n-matters worse, had actually brought her husband with her. \u0022I think it\r\n-is most unkind of her, my dear,\u0022 she whispered. \u0022Of course I go and\r\n-stay with them every summer after I come from Homburg, but then an old\r\n-woman like me must have fresh air sometimes, and besides, I really wake\r\n-them up. You don't know what an existence they lead down there. It is\r\n-pure unadulterated country life. They get up early, because they have\r\n-so much to do, and go to bed early, because they have so little to\r\n-think about. There has not been a scandal in the neighbourhood since\r\n-the time of Queen Elizabeth, and consequently they all fall asleep\r\n-after dinner. You shan't sit next either of them. You shall sit by me\r\n-and amuse me.\u0022\r\n-\r\n-Dorian murmured a graceful compliment and looked round the room. Yes:\r\n-it was certainly a tedious party. Two of the people he had never seen\r\n-before, and the others consisted of Ernest Harrowden, one of those\r\n-middle-aged mediocrities so common in London clubs who have no enemies,\r\n-but are thoroughly disliked by their friends; Lady Ruxton, an\r\n-overdressed woman of forty-seven, with a hooked nose, who was always\r\n-trying to get herself compromised, but was so peculiarly plain that to\r\n-her great disappointment no one would ever believe anything against\r\n-her; Mrs. Erlynne, a pushing nobody, with a delightful lisp and\r\n-Venetian-red hair; Lady Alice Chapman, his hostess's daughter, a dowdy\r\n-dull girl, with one of those characteristic British faces that, once\r\n-seen, are never remembered; and her husband, a red-cheeked,\r\n-white-whiskered creature who, like so many of his class, was under the\r\n-impression that inordinate joviality can atone for an entire lack of\r\n-ideas.\r\n-\r\n-He was rather sorry he had come, till Lady Narborough, looking at the\r\n-great ormolu gilt clock that sprawled in gaudy curves on the\r\n-mauve-draped mantelshelf, exclaimed: \u0022How horrid of Henry Wotton to be\r\n-so late! I sent round to him this morning on chance and he promised\r\n-faithfully not to disappoint me.\u0022\r\n-\r\n-It was some consolation that Harry was to be there, and when the door\r\n-opened and he heard his slow musical voice lending charm to some\r\n-insincere apology, he ceased to feel bored.\r\n-\r\n-But at dinner he could not eat anything. Plate after plate went away\r\n-untasted. Lady Narborough kept scolding him for what she called \u0022an\r\n-insult to poor Adolphe, who invented the _menu_ specially for you,\u0022 and\r\n-now and then Lord Henry looked across at him, wondering at his silence\r\n-and abstracted manner. From time to time the butler filled his glass\r\n-with champagne. He drank eagerly, and his thirst seemed to increase.\r\n-\r\n-\u0022Dorian,\u0022 said Lord Henry at last, as the _chaud-froid_ was being handed\r\n-round, \u0022what is the matter with you to-night? You are quite out of\r\n-sorts.\u0022\r\n-\r\n-\u0022I believe he is in love,\u0022 cried Lady Narborough, \u0022and that he is\r\n-afraid to tell me for fear I should be jealous. He is quite right. I\r\n-certainly should.\u0022\r\n-\r\n-\u0022Dear Lady Narborough,\u0022 murmured Dorian, smiling, \u0022I have not been in\r\n-love for a whole week--not, in fact, since Madame de Ferrol left town.\u0022\r\n-\r\n-\u0022How you men can fall in love with that woman!\u0022 exclaimed the old lady.\r\n-\u0022I really cannot understand it.\u0022\r\n-\r\n-\u0022It is simply because she remembers you when you were a little girl,\r\n-Lady Narborough,\u0022 said Lord Henry. \u0022She is the one link between us and\r\n-your short frocks.\u0022\r\n-\r\n-\u0022She does not remember my short frocks at all, Lord Henry. But I\r\n-remember her very well at Vienna thirty years ago, and how _decolletee_\r\n-she was then.\u0022\r\n-\r\n-\u0022She is still _decolletee_,\u0022 he answered, taking an olive in his long\r\n-fingers; \u0022and when she is in a very smart gown she looks like an\r\n-_edition de luxe_ of a bad French novel. She is really wonderful, and\r\n-full of surprises. Her capacity for family affection is extraordinary.\r\n-When her third husband died, her hair turned quite gold from grief.\u0022\r\n-\r\n-\u0022How can you, Harry!\u0022 cried Dorian.\r\n-\r\n-\u0022It is a most romantic explanation,\u0022 laughed the hostess. \u0022But her\r\n-third husband, Lord Henry! You don't mean to say Ferrol is the fourth?\u0022\r\n-\r\n-\u0022Certainly, Lady Narborough.\u0022\r\n-\r\n-\u0022I don't believe a word of it.\u0022\r\n-\r\n-\u0022Well, ask Mr. Gray. He is one of her most intimate friends.\u0022\r\n-\r\n-\u0022Is it true, Mr. Gray?\u0022\r\n-\r\n-\u0022She assures me so, Lady Narborough,\u0022 said Dorian. \u0022I asked her\r\n-whether, like Marguerite de Navarre, she had their hearts embalmed and\r\n-hung at her girdle. She told me she didn't, because none of them had\r\n-had any hearts at all.\u0022\r\n-\r\n-\u0022Four husbands! Upon my word that is _trop de zele_.\u0022\r\n-\r\n-\u0022_Trop d'audace_, I tell her,\u0022 said Dorian.\r\n-\r\n-\u0022Oh! she is audacious enough for anything, my dear. And what is Ferrol\r\n-like? I don't know him.\u0022\r\n-\r\n-\u0022The husbands of very beautiful women belong to the criminal classes,\u0022\r\n-said Lord Henry, sipping his wine.\r\n-\r\n-Lady Narborough hit him with her fan. \u0022Lord Henry, I am not at all\r\n-surprised that the world says that you are extremely wicked.\u0022\r\n-\r\n-\u0022But what world says that?\u0022 asked Lord Henry, elevating his eyebrows.\r\n-\u0022It can only be the next world. This world and I are on excellent\r\n-terms.\u0022\r\n-\r\n-\u0022Everybody I know says you are very wicked,\u0022 cried the old lady,\r\n-shaking her head.\r\n-\r\n-Lord Henry looked serious for some moments. \u0022It is perfectly\r\n-monstrous,\u0022 he said, at last, \u0022the way people go about nowadays saying\r\n-things against one behind one's back that are absolutely and entirely\r\n-true.\u0022\r\n-\r\n-\u0022Isn't he incorrigible?\u0022 cried Dorian, leaning forward in his chair.\r\n-\r\n-\u0022I hope so,\u0022 said his hostess, laughing. \u0022But really, if you all\r\n-worship Madame de Ferrol in this ridiculous way, I shall have to marry\r\n-again so as to be in the fashion.\u0022\r\n-\r\n-\u0022You will never marry again, Lady Narborough,\u0022 broke in Lord Henry.\r\n-\u0022You were far too happy. When a woman marries again, it is because she\r\n-detested her first husband. When a man marries again, it is because he\r\n-adored his first wife. Women try their luck; men risk theirs.\u0022\r\n-\r\n-\u0022Narborough wasn't perfect,\u0022 cried the old lady.\r\n-\r\n-\u0022If he had been, you would not have loved him, my dear lady,\u0022 was the\r\n-rejoinder. \u0022Women love us for our defects. If we have enough of them,\r\n-they will forgive us everything, even our intellects. You will never\r\n-ask me to dinner again after saying this, I am afraid, Lady Narborough,\r\n-but it is quite true.\u0022\r\n-\r\n-\u0022Of course it is true, Lord Henry. If we women did not love you for\r\n-your defects, where would you all be? Not one of you would ever be\r\n-married. You would be a set of unfortunate bachelors. Not, however,\r\n-that that would alter you much. Nowadays all the married men live like\r\n-bachelors, and all the bachelors like married men.\u0022\r\n-\r\n-\u0022_Fin de siecle_,\u0022 murmured Lord Henry.\r\n-\r\n-\u0022_Fin du globe_,\u0022 answered his hostess.\r\n-\r\n-\u0022I wish it were _fin du globe_,\u0022 said Dorian with a sigh. \u0022Life is a\r\n-great disappointment.\u0022\r\n-\r\n-\u0022Ah, my dear,\u0022 cried Lady Narborough, putting on her gloves, \u0022don't\r\n-tell me that you have exhausted life. When a man says that one knows\r\n-that life has exhausted him. Lord Henry is very wicked, and I\r\n-sometimes wish that I had been; but you are made to be good--you look\r\n-so good. I must find you a nice wife. Lord Henry, don't you think\r\n-that Mr. Gray should get married?\u0022\r\n-\r\n-\u0022I am always telling him so, Lady Narborough,\u0022 said Lord Henry with a\r\n-bow.\r\n-\r\n-\u0022Well, we must look out for a suitable match for him. I shall go\r\n-through Debrett carefully to-night and draw out a list of all the\r\n-eligible young ladies.\u0022\r\n-\r\n-\u0022With their ages, Lady Narborough?\u0022 asked Dorian.\r\n-\r\n-\u0022Of course, with their ages, slightly edited. But nothing must be done\r\n-in a hurry. I want it to be what _The Morning Post_ calls a suitable\r\n-alliance, and I want you both to be happy.\u0022\r\n-\r\n-\u0022What nonsense people talk about happy marriages!\u0022 exclaimed Lord\r\n-Henry. \u0022A man can be happy with any woman, as long as he does not love\r\n-her.\u0022\r\n-\r\n-\u0022Ah! what a cynic you are!\u0022 cried the old lady, pushing back her chair\r\n-and nodding to Lady Ruxton. \u0022You must come and dine with me soon\r\n-again. You are really an admirable tonic, much better than what Sir\r\n-Andrew prescribes for me. You must tell me what people you would like\r\n-to meet, though. I want it to be a delightful gathering.\u0022\r\n-\r\n-\u0022I like men who have a future and women who have a past,\u0022 he answered.\r\n-\u0022Or do you think that would make it a petticoat party?\u0022\r\n-\r\n-\u0022I fear so,\u0022 she said, laughing, as she stood up. \u0022A thousand pardons,\r\n-my dear Lady Ruxton,\u0022 she added, \u0022I didn't see you hadn't finished your\r\n-cigarette.\u0022\r\n-\r\n-\u0022Never mind, Lady Narborough. I smoke a great deal too much. I am\r\n-going to limit myself, for the future.\u0022\r\n-\r\n-\u0022Pray don't, Lady Ruxton,\u0022 said Lord Henry. \u0022Moderation is a fatal\r\n-thing. Enough is as bad as a meal. More than enough is as good as a\r\n-feast.\u0022\r\n-\r\n-Lady Ruxton glanced at him curiously. \u0022You must come and explain that\r\n-to me some afternoon, Lord Henry. It sounds a fascinating theory,\u0022 she\r\n-murmured, as she swept out of the room.\r\n-\r\n-\u0022Now, mind you don't stay too long over your politics and scandal,\u0022\r\n-cried Lady Narborough from the door. \u0022If you do, we are sure to\r\n-squabble upstairs.\u0022\r\n-\r\n-The men laughed, and Mr. Chapman got up solemnly from the foot of the\r\n-table and came up to the top. Dorian Gray changed his seat and went\r\n-and sat by Lord Henry. Mr. Chapman began to talk in a loud voice about\r\n-the situation in the House of Commons. He guffawed at his adversaries.\r\n-The word _doctrinaire_--word full of terror to the British\r\n-mind--reappeared from time to time between his explosions. An\r\n-alliterative prefix served as an ornament of oratory. He hoisted the\r\n-Union Jack on the pinnacles of thought. The inherited stupidity of the\r\n-race--sound English common sense he jovially termed it--was shown to be\r\n-the proper bulwark for society.\r\n-\r\n-A smile curved Lord Henry's lips, and he turned round and looked at\r\n-Dorian.\r\n-\r\n-\u0022Are you better, my dear fellow?\u0022 he asked. \u0022You seemed rather out of\r\n-sorts at dinner.\u0022\r\n-\r\n-\u0022I am quite well, Harry. I am tired. That is all.\u0022\r\n-\r\n-\u0022You were charming last night. The little duchess is quite devoted to\r\n-you. She tells me she is going down to Selby.\u0022\r\n-\r\n-\u0022She has promised to come on the twentieth.\u0022\r\n-\r\n-\u0022Is Monmouth to be there, too?\u0022\r\n-\r\n-\u0022Oh, yes, Harry.\u0022\r\n-\r\n-\u0022He bores me dreadfully, almost as much as he bores her. She is very\r\n-clever, too clever for a woman. She lacks the indefinable charm of\r\n-weakness. It is the feet of clay that make the gold of the image\r\n-precious. Her feet are very pretty, but they are not feet of clay.\r\n-White porcelain feet, if you like. They have been through the fire,\r\n-and what fire does not destroy, it hardens. She has had experiences.\u0022\r\n-\r\n-\u0022How long has she been married?\u0022 asked Dorian.\r\n-\r\n-\u0022An eternity, she tells me. I believe, according to the peerage, it is\r\n-ten years, but ten years with Monmouth must have been like eternity,\r\n-with time thrown in. Who else is coming?\u0022\r\n-\r\n-\u0022Oh, the Willoughbys, Lord Rugby and his wife, our hostess, Geoffrey\r\n-Clouston, the usual set. I have asked Lord Grotrian.\u0022\r\n-\r\n-\u0022I like him,\u0022 said Lord Henry. \u0022A great many people don't, but I find\r\n-him charming. He atones for being occasionally somewhat overdressed by\r\n-being always absolutely over-educated. He is a very modern type.\u0022\r\n-\r\n-\u0022I don't know if he will be able to come, Harry. He may have to go to\r\n-Monte Carlo with his father.\u0022\r\n-\r\n-\u0022Ah! what a nuisance people's people are! Try and make him come. By\r\n-the way, Dorian, you ran off very early last night. You left before\r\n-eleven. What did you do afterwards? Did you go straight home?\u0022\r\n-\r\n-Dorian glanced at him hurriedly and frowned.\r\n-\r\n-\u0022No, Harry,\u0022 he said at last, \u0022I did not get home till nearly three.\u0022\r\n-\r\n-\u0022Did you go to the club?\u0022\r\n-\r\n-\u0022Yes,\u0022 he answered. Then he bit his lip. \u0022No, I don't mean that. I\r\n-didn't go to the club. I walked about. I forget what I did.... How\r\n-inquisitive you are, Harry! You always want to know what one has been\r\n-doing. I always want to forget what I have been doing. I came in at\r\n-half-past two, if you wish to know the exact time. I had left my\r\n-latch-key at home, and my servant had to let me in. If you want any\r\n-corroborative evidence on the subject, you can ask him.\u0022\r\n-\r\n-Lord Henry shrugged his shoulders. \u0022My dear fellow, as if I cared!\r\n-Let us go up to the drawing-room. No sherry, thank you, Mr. Chapman.\r\n-Something has happened to you, Dorian. Tell me what it is. You are\r\n-not yourself to-night.\u0022\r\n-\r\n-\u0022Don't mind me, Harry. I am irritable, and out of temper. I shall\r\n-come round and see you to-morrow, or next day. Make my excuses to Lady\r\n-Narborough. I shan't go upstairs. I shall go home. I must go home.\u0022\r\n-\r\n-\u0022All right, Dorian. I dare say I shall see you to-morrow at tea-time.\r\n-The duchess is coming.\u0022\r\n-\r\n-\u0022I will try to be there, Harry,\u0022 he said, leaving the room. As he\r\n-drove back to his own house, he was conscious that the sense of terror\r\n-he thought he had strangled had come back to him. Lord Henry's casual\r\n-questioning had made him lose his nerve for the moment, and he wanted\r\n-his nerve still. Things that were dangerous had to be destroyed. He\r\n-winced. He hated the idea of even touching them.\r\n-\r\n-Yet it had to be done. He realized that, and when he had locked the\r\n-door of his library, he opened the secret press into which he had\r\n-thrust Basil Hallward's coat and bag. A huge fire was blazing. He\r\n-piled another log on it. The smell of the singeing clothes and burning\r\n-leather was horrible. It took him three-quarters of an hour to consume\r\n-everything. At the end he felt faint and sick, and having lit some\r\n-Algerian pastilles in a pierced copper brazier, he bathed his hands and\r\n-forehead with a cool musk-scented vinegar.\r\n-\r\n-Suddenly he started. His eyes grew strangely bright, and he gnawed\r\n-nervously at his underlip. Between two of the windows stood a large\r\n-Florentine cabinet, made out of ebony and inlaid with ivory and blue\r\n-lapis. He watched it as though it were a thing that could fascinate\r\n-and make afraid, as though it held something that he longed for and yet\r\n-almost loathed. His breath quickened. A mad craving came over him.\r\n-He lit a cigarette and then threw it away. His eyelids drooped till\r\n-the long fringed lashes almost touched his cheek. But he still watched\r\n-the cabinet. At last he got up from the sofa on which he had been\r\n-lying, went over to it, and having unlocked it, touched some hidden\r\n-spring. A triangular drawer passed slowly out. His fingers moved\r\n-instinctively towards it, dipped in, and closed on something. It was a\r\n-small Chinese box of black and gold-dust lacquer, elaborately wrought,\r\n-the sides patterned with curved waves, and the silken cords hung with\r\n-round crystals and tasselled in plaited metal threads. He opened it.\r\n-Inside was a green paste, waxy in lustre, the odour curiously heavy and\r\n-persistent.\r\n-\r\n-He hesitated for some moments, with a strangely immobile smile upon his\r\n-face. Then shivering, though the atmosphere of the room was terribly\r\n-hot, he drew himself up and glanced at the clock. It was twenty\r\n-minutes to twelve. He put the box back, shutting the cabinet doors as\r\n-he did so, and went into his bedroom.\r\n-\r\n-As midnight was striking bronze blows upon the dusky air, Dorian Gray,\r\n-dressed commonly, and with a muffler wrapped round his throat, crept\r\n-quietly out of his house. In Bond Street he found a hansom with a good\r\n-horse. He hailed it and in a low voice gave the driver an address.\r\n-\r\n-The man shook his head. \u0022It is too far for me,\u0022 he muttered.\r\n-\r\n-\u0022Here is a sovereign for you,\u0022 said Dorian. \u0022You shall have another if\r\n-you drive fast.\u0022\r\n-\r\n-\u0022All right, sir,\u0022 answered the man, \u0022you will be there in an hour,\u0022 and\r\n-after his fare had got in he turned his horse round and drove rapidly\r\n-towards the river.\r\n-\r\n-\r\n-\r\n-CHAPTER 16\r\n-\r\n-A cold rain began to fall, and the blurred street-lamps looked ghastly\r\n-in the dripping mist. The public-houses were just closing, and dim men\r\n-and women were clustering in broken groups round their doors. From\r\n-some of the bars came the sound of horrible laughter. In others,\r\n-drunkards brawled and screamed.\r\n-\r\n-Lying back in the hansom, with his hat pulled over his forehead, Dorian\r\n-Gray watched with listless eyes the sordid shame of the great city, and\r\n-now and then he repeated to himself the words that Lord Henry had said\r\n-to him on the first day they had met, \u0022To cure the soul by means of the\r\n-senses, and the senses by means of the soul.\u0022 Yes, that was the\r\n-secret. He had often tried it, and would try it again now. There were\r\n-opium dens where one could buy oblivion, dens of horror where the\r\n-memory of old sins could be destroyed by the madness of sins that were\r\n-new.\r\n-\r\n-The moon hung low in the sky like a yellow skull. From time to time a\r\n-huge misshapen cloud stretched a long arm across and hid it. The\r\n-gas-lamps grew fewer, and the streets more narrow and gloomy. Once the\r\n-man lost his way and had to drive back half a mile. A steam rose from\r\n-the horse as it splashed up the puddles. The sidewindows of the hansom\r\n-were clogged with a grey-flannel mist.\r\n-\r\n-\u0022To cure the soul by means of the senses, and the senses by means of\r\n-the soul!\u0022 How the words rang in his ears! His soul, certainly, was\r\n-sick to death. Was it true that the senses could cure it? Innocent\r\n-blood had been spilled. What could atone for that? Ah! for that there\r\n-was no atonement; but though forgiveness was impossible, forgetfulness\r\n-was possible still, and he was determined to forget, to stamp the thing\r\n-out, to crush it as one would crush the adder that had stung one.\r\n-Indeed, what right had Basil to have spoken to him as he had done? Who\r\n-had made him a judge over others? He had said things that were\r\n-dreadful, horrible, not to be endured.\r\n-\r\n-On and on plodded the hansom, going slower, it seemed to him, at each\r\n-step. He thrust up the trap and called to the man to drive faster.\r\n-The hideous hunger for opium began to gnaw at him. His throat burned\r\n-and his delicate hands twitched nervously together. He struck at the\r\n-horse madly with his stick. The driver laughed and whipped up. He\r\n-laughed in answer, and the man was silent.\r\n-\r\n-The way seemed interminable, and the streets like the black web of some\r\n-sprawling spider. The monotony became unbearable, and as the mist\r\n-thickened, he felt afraid.\r\n-\r\n-Then they passed by lonely brickfields. The fog was lighter here, and\r\n-he could see the strange, bottle-shaped kilns with their orange,\r\n-fanlike tongues of fire. A dog barked as they went by, and far away in\r\n-the darkness some wandering sea-gull screamed. The horse stumbled in a\r\n-rut, then swerved aside and broke into a gallop.\r\n-\r\n-After some time they left the clay road and rattled again over\r\n-rough-paven streets. Most of the windows were dark, but now and then\r\n-fantastic shadows were silhouetted against some lamplit blind. He\r\n-watched them curiously. They moved like monstrous marionettes and made\r\n-gestures like live things. He hated them. A dull rage was in his\r\n-heart. As they turned a corner, a woman yelled something at them from\r\n-an open door, and two men ran after the hansom for about a hundred\r\n-yards. The driver beat at them with his whip.\r\n-\r\n-It is said that passion makes one think in a circle. Certainly with\r\n-hideous iteration the bitten lips of Dorian Gray shaped and reshaped\r\n-those subtle words that dealt with soul and sense, till he had found in\r\n-them the full expression, as it were, of his mood, and justified, by\r\n-intellectual approval, passions that without such justification would\r\n-still have dominated his temper. From cell to cell of his brain crept\r\n-the one thought; and the wild desire to live, most terrible of all\r\n-man's appetites, quickened into force each trembling nerve and fibre.\r\n-Ugliness that had once been hateful to him because it made things real,\r\n-became dear to him now for that very reason. Ugliness was the one\r\n-reality. The coarse brawl, the loathsome den, the crude violence of\r\n-disordered life, the very vileness of thief and outcast, were more\r\n-vivid, in their intense actuality of impression, than all the gracious\r\n-shapes of art, the dreamy shadows of song. They were what he needed\r\n-for forgetfulness. In three days he would be free.\r\n-\r\n-Suddenly the man drew up with a jerk at the top of a dark lane. Over\r\n-the low roofs and jagged chimney-stacks of the houses rose the black\r\n-masts of ships. Wreaths of white mist clung like ghostly sails to the\r\n-yards.\r\n-\r\n-\u0022Somewhere about here, sir, ain't it?\u0022 he asked huskily through the\r\n-trap.\r\n-\r\n-Dorian started and peered round. \u0022This will do,\u0022 he answered, and\r\n-having got out hastily and given the driver the extra fare he had\r\n-promised him, he walked quickly in the direction of the quay. Here and\r\n-there a lantern gleamed at the stern of some huge merchantman. The\r\n-light shook and splintered in the puddles. A red glare came from an\r\n-outward-bound steamer that was coaling. The slimy pavement looked like\r\n-a wet mackintosh.\r\n-\r\n-He hurried on towards the left, glancing back now and then to see if he\r\n-was being followed. In about seven or eight minutes he reached a small\r\n-shabby house that was wedged in between two gaunt factories. In one of\r\n-the top-windows stood a lamp. He stopped and gave a peculiar knock.\r\n-\r\n-After a little time he heard steps in the passage and the chain being\r\n-unhooked. The door opened quietly, and he went in without saying a\r\n-word to the squat misshapen figure that flattened itself into the\r\n-shadow as he passed. At the end of the hall hung a tattered green\r\n-curtain that swayed and shook in the gusty wind which had followed him\r\n-in from the street. He dragged it aside and entered a long low room\r\n-which looked as if it had once been a third-rate dancing-saloon. Shrill\r\n-flaring gas-jets, dulled and distorted in the fly-blown mirrors that\r\n-faced them, were ranged round the walls. Greasy reflectors of ribbed\r\n-tin backed them, making quivering disks of light. The floor was\r\n-covered with ochre-coloured sawdust, trampled here and there into mud,\r\n-and stained with dark rings of spilled liquor. Some Malays were\r\n-crouching by a little charcoal stove, playing with bone counters and\r\n-showing their white teeth as they chattered. In one corner, with his\r\n-head buried in his arms, a sailor sprawled over a table, and by the\r\n-tawdrily painted bar that ran across one complete side stood two\r\n-haggard women, mocking an old man who was brushing the sleeves of his\r\n-coat with an expression of disgust. \u0022He thinks he's got red ants on\r\n-him,\u0022 laughed one of them, as Dorian passed by. The man looked at her\r\n-in terror and began to whimper.\r\n-\r\n-At the end of the room there was a little staircase, leading to a\r\n-darkened chamber. As Dorian hurried up its three rickety steps, the\r\n-heavy odour of opium met him. He heaved a deep breath, and his\r\n-nostrils quivered with pleasure. When he entered, a young man with\r\n-smooth yellow hair, who was bending over a lamp lighting a long thin\r\n-pipe, looked up at him and nodded in a hesitating manner.\r\n-\r\n-\u0022You here, Adrian?\u0022 muttered Dorian.\r\n-\r\n-\u0022Where else should I be?\u0022 he answered, listlessly. \u0022None of the chaps\r\n-will speak to me now.\u0022\r\n-\r\n-\u0022I thought you had left England.\u0022\r\n-\r\n-\u0022Darlington is not going to do anything. My brother paid the bill at\r\n-last. George doesn't speak to me either.... I don't care,\u0022 he added\r\n-with a sigh. \u0022As long as one has this stuff, one doesn't want friends.\r\n-I think I have had too many friends.\u0022\r\n-\r\n-Dorian winced and looked round at the grotesque things that lay in such\r\n-fantastic postures on the ragged mattresses. The twisted limbs, the\r\n-gaping mouths, the staring lustreless eyes, fascinated him. He knew in\r\n-what strange heavens they were suffering, and what dull hells were\r\n-teaching them the secret of some new joy. They were better off than he\r\n-was. He was prisoned in thought. Memory, like a horrible malady, was\r\n-eating his soul away. From time to time he seemed to see the eyes of\r\n-Basil Hallward looking at him. Yet he felt he could not stay. The\r\n-presence of Adrian Singleton troubled him. He wanted to be where no\r\n-one would know who he was. He wanted to escape from himself.\r\n-\r\n-\u0022I am going on to the other place,\u0022 he said after a pause.\r\n-\r\n-\u0022On the wharf?\u0022\r\n-\r\n-\u0022Yes.\u0022\r\n-\r\n-\u0022That mad-cat is sure to be there. They won't have her in this place\r\n-now.\u0022\r\n-\r\n-Dorian shrugged his shoulders. \u0022I am sick of women who love one.\r\n-Women who hate one are much more interesting. Besides, the stuff is\r\n-better.\u0022\r\n-\r\n-\u0022Much the same.\u0022\r\n-\r\n-\u0022I like it better. Come and have something to drink. I must have\r\n-something.\u0022\r\n-\r\n-\u0022I don't want anything,\u0022 murmured the young man.\r\n-\r\n-\u0022Never mind.\u0022\r\n-\r\n-Adrian Singleton rose up wearily and followed Dorian to the bar. A\r\n-half-caste, in a ragged turban and a shabby ulster, grinned a hideous\r\n-greeting as he thrust a bottle of brandy and two tumblers in front of\r\n-them. The women sidled up and began to chatter. Dorian turned his\r\n-back on them and said something in a low voice to Adrian Singleton.\r\n-\r\n-A crooked smile, like a Malay crease, writhed across the face of one of\r\n-the women. \u0022We are very proud to-night,\u0022 she sneered.\r\n-\r\n-\u0022For God's sake don't talk to me,\u0022 cried Dorian, stamping his foot on\r\n-the ground. \u0022What do you want? Money? Here it is. Don't ever talk\r\n-to me again.\u0022\r\n-\r\n-Two red sparks flashed for a moment in the woman's sodden eyes, then\r\n-flickered out and left them dull and glazed. She tossed her head and\r\n-raked the coins off the counter with greedy fingers. Her companion\r\n-watched her enviously.\r\n-\r\n-\u0022It's no use,\u0022 sighed Adrian Singleton. \u0022I don't care to go back.\r\n-What does it matter? I am quite happy here.\u0022\r\n-\r\n-\u0022You will write to me if you want anything, won't you?\u0022 said Dorian,\r\n-after a pause.\r\n-\r\n-\u0022Perhaps.\u0022\r\n-\r\n-\u0022Good night, then.\u0022\r\n-\r\n-\u0022Good night,\u0022 answered the young man, passing up the steps and wiping\r\n-his parched mouth with a handkerchief.\r\n-\r\n-Dorian walked to the door with a look of pain in his face. As he drew\r\n-the curtain aside, a hideous laugh broke from the painted lips of the\r\n-woman who had taken his money. \u0022There goes the devil's bargain!\u0022 she\r\n-hiccoughed, in a hoarse voice.\r\n-\r\n-\u0022Curse you!\u0022 he answered, \u0022don't call me that.\u0022\r\n-\r\n-She snapped her fingers. \u0022Prince Charming is what you like to be\r\n-called, ain't it?\u0022 she yelled after him.\r\n-\r\n-The drowsy sailor leaped to his feet as she spoke, and looked wildly\r\n-round. The sound of the shutting of the hall door fell on his ear. He\r\n-rushed out as if in pursuit.\r\n-\r\n-Dorian Gray hurried along the quay through the drizzling rain. His\r\n-meeting with Adrian Singleton had strangely moved him, and he wondered\r\n-if the ruin of that young life was really to be laid at his door, as\r\n-Basil Hallward had said to him with such infamy of insult. He bit his\r\n-lip, and for a few seconds his eyes grew sad. Yet, after all, what did\r\n-it matter to him? One's days were too brief to take the burden of\r\n-another's errors on one's shoulders. Each man lived his own life and\r\n-paid his own price for living it. The only pity was one had to pay so\r\n-often for a single fault. One had to pay over and over again, indeed.\r\n-In her dealings with man, destiny never closed her accounts.\r\n-\r\n-There are moments, psychologists tell us, when the passion for sin, or\r\n-for what the world calls sin, so dominates a nature that every fibre of\r\n-the body, as every cell of the brain, seems to be instinct with fearful\r\n-impulses. Men and women at such moments lose the freedom of their\r\n-will. They move to their terrible end as automatons move. Choice is\r\n-taken from them, and conscience is either killed, or, if it lives at\r\n-all, lives but to give rebellion its fascination and disobedience its\r\n-charm. For all sins, as theologians weary not of reminding us, are\r\n-sins of disobedience. When that high spirit, that morning star of\r\n-evil, fell from heaven, it was as a rebel that he fell.\r\n-\r\n-Callous, concentrated on evil, with stained mind, and soul hungry for\r\n-rebellion, Dorian Gray hastened on, quickening his step as he went, but\r\n-as he darted aside into a dim archway, that had served him often as a\r\n-short cut to the ill-famed place where he was going, he felt himself\r\n-suddenly seized from behind, and before he had time to defend himself,\r\n-he was thrust back against the wall, with a brutal hand round his\r\n-throat.\r\n-\r\n-He struggled madly for life, and by a terrible effort wrenched the\r\n-tightening fingers away. In a second he heard the click of a revolver,\r\n-and saw the gleam of a polished barrel, pointing straight at his head,\r\n-and the dusky form of a short, thick-set man facing him.\r\n-\r\n-\u0022What do you want?\u0022 he gasped.\r\n-\r\n-\u0022Keep quiet,\u0022 said the man. \u0022If you stir, I shoot you.\u0022\r\n-\r\n-\u0022You are mad. What have I done to you?\u0022\r\n-\r\n-\u0022You wrecked the life of Sibyl Vane,\u0022 was the answer, \u0022and Sibyl Vane\r\n-was my sister. She killed herself. I know it. Her death is at your\r\n-door. I swore I would kill you in return. For years I have sought\r\n-you. I had no clue, no trace. The two people who could have described\r\n-you were dead. I knew nothing of you but the pet name she used to call\r\n-you. I heard it to-night by chance. Make your peace with God, for\r\n-to-night you are going to die.\u0022\r\n-\r\n-Dorian Gray grew sick with fear. \u0022I never knew her,\u0022 he stammered. \u0022I\r\n-never heard of her. You are mad.\u0022\r\n-\r\n-\u0022You had better confess your sin, for as sure as I am James Vane, you\r\n-are going to die.\u0022 There was a horrible moment. Dorian did not know\r\n-what to say or do. \u0022Down on your knees!\u0022 growled the man. \u0022I give you\r\n-one minute to make your peace--no more. I go on board to-night for\r\n-India, and I must do my job first. One minute. That's all.\u0022\r\n-\r\n-Dorian's arms fell to his side. Paralysed with terror, he did not know\r\n-what to do. Suddenly a wild hope flashed across his brain. \u0022Stop,\u0022 he\r\n-cried. \u0022How long ago is it since your sister died? Quick, tell me!\u0022\r\n-\r\n-\u0022Eighteen years,\u0022 said the man. \u0022Why do you ask me? What do years\r\n-matter?\u0022\r\n-\r\n-\u0022Eighteen years,\u0022 laughed Dorian Gray, with a touch of triumph in his\r\n-voice. \u0022Eighteen years! Set me under the lamp and look at my face!\u0022\r\n-\r\n-James Vane hesitated for a moment, not understanding what was meant.\r\n-Then he seized Dorian Gray and dragged him from the archway.\r\n-\r\n-Dim and wavering as was the wind-blown light, yet it served to show him\r\n-the hideous error, as it seemed, into which he had fallen, for the face\r\n-of the man he had sought to kill had all the bloom of boyhood, all the\r\n-unstained purity of youth. He seemed little more than a lad of twenty\r\n-summers, hardly older, if older indeed at all, than his sister had been\r\n-when they had parted so many years ago. It was obvious that this was\r\n-not the man who had destroyed her life.\r\n-\r\n-He loosened his hold and reeled back. \u0022My God! my God!\u0022 he cried, \u0022and\r\n-I would have murdered you!\u0022\r\n-\r\n-Dorian Gray drew a long breath. \u0022You have been on the brink of\r\n-committing a terrible crime, my man,\u0022 he said, looking at him sternly.\r\n-\u0022Let this be a warning to you not to take vengeance into your own\r\n-hands.\u0022\r\n-\r\n-\u0022Forgive me, sir,\u0022 muttered James Vane. \u0022I was deceived. A chance\r\n-word I heard in that damned den set me on the wrong track.\u0022\r\n-\r\n-\u0022You had better go home and put that pistol away, or you may get into\r\n-trouble,\u0022 said Dorian, turning on his heel and going slowly down the\r\n-street.\r\n-\r\n-James Vane stood on the pavement in horror. He was trembling from head\r\n-to foot. After a little while, a black shadow that had been creeping\r\n-along the dripping wall moved out into the light and came close to him\r\n-with stealthy footsteps. He felt a hand laid on his arm and looked\r\n-round with a start. It was one of the women who had been drinking at\r\n-the bar.\r\n-\r\n-\u0022Why didn't you kill him?\u0022 she hissed out, putting haggard face quite\r\n-close to his. \u0022I knew you were following him when you rushed out from\r\n-Daly's. You fool! You should have killed him. He has lots of money,\r\n-and he's as bad as bad.\u0022\r\n-\r\n-\u0022He is not the man I am looking for,\u0022 he answered, \u0022and I want no man's\r\n-money. I want a man's life. The man whose life I want must be nearly\r\n-forty now. This one is little more than a boy. Thank God, I have not\r\n-got his blood upon my hands.\u0022\r\n-\r\n-The woman gave a bitter laugh. \u0022Little more than a boy!\u0022 she sneered.\r\n-\u0022Why, man, it's nigh on eighteen years since Prince Charming made me\r\n-what I am.\u0022\r\n-\r\n-\u0022You lie!\u0022 cried James Vane.\r\n-\r\n-She raised her hand up to heaven. \u0022Before God I am telling the truth,\u0022\r\n-she cried.\r\n-\r\n-\u0022Before God?\u0022\r\n-\r\n-\u0022Strike me dumb if it ain't so. He is the worst one that comes here.\r\n-They say he has sold himself to the devil for a pretty face. It's nigh\r\n-on eighteen years since I met him. He hasn't changed much since then.\r\n-I have, though,\u0022 she added, with a sickly leer.\r\n-\r\n-\u0022You swear this?\u0022\r\n-\r\n-\u0022I swear it,\u0022 came in hoarse echo from her flat mouth. \u0022But don't give\r\n-me away to him,\u0022 she whined; \u0022I am afraid of him. Let me have some\r\n-money for my night's lodging.\u0022\r\n-\r\n-He broke from her with an oath and rushed to the corner of the street,\r\n-but Dorian Gray had disappeared. When he looked back, the woman had\r\n-vanished also.\r\n-\r\n-\r\n-\r\n-CHAPTER 17\r\n-\r\n-A week later Dorian Gray was sitting in the conservatory at Selby\r\n-Royal, talking to the pretty Duchess of Monmouth, who with her husband,\r\n-a jaded-looking man of sixty, was amongst his guests. It was tea-time,\r\n-and the mellow light of the huge, lace-covered lamp that stood on the\r\n-table lit up the delicate china and hammered silver of the service at\r\n-which the duchess was presiding. Her white hands were moving daintily\r\n-among the cups, and her full red lips were smiling at something that\r\n-Dorian had whispered to her. Lord Henry was lying back in a\r\n-silk-draped wicker chair, looking at them. On a peach-coloured divan\r\n-sat Lady Narborough, pretending to listen to the duke's description of\r\n-the last Brazilian beetle that he had added to his collection. Three\r\n-young men in elaborate smoking-suits were handing tea-cakes to some of\r\n-the women. The house-party consisted of twelve people, and there were\r\n-more expected to arrive on the next day.\r\n-\r\n-\u0022What are you two talking about?\u0022 said Lord Henry, strolling over to\r\n-the table and putting his cup down. \u0022I hope Dorian has told you about\r\n-my plan for rechristening everything, Gladys. It is a delightful idea.\u0022\r\n-\r\n-\u0022But I don't want to be rechristened, Harry,\u0022 rejoined the duchess,\r\n-looking up at him with her wonderful eyes. \u0022I am quite satisfied with\r\n-my own name, and I am sure Mr. Gray should be satisfied with his.\u0022\r\n-\r\n-\u0022My dear Gladys, I would not alter either name for the world. They are\r\n-both perfect. I was thinking chiefly of flowers. Yesterday I cut an\r\n-orchid, for my button-hole. It was a marvellous spotted thing, as\r\n-effective as the seven deadly sins. In a thoughtless moment I asked\r\n-one of the gardeners what it was called. He told me it was a fine\r\n-specimen of _Robinsoniana_, or something dreadful of that kind. It is a\r\n-sad truth, but we have lost the faculty of giving lovely names to\r\n-things. Names are everything. I never quarrel with actions. My one\r\n-quarrel is with words. That is the reason I hate vulgar realism in\r\n-literature. The man who could call a spade a spade should be compelled\r\n-to use one. It is the only thing he is fit for.\u0022\r\n-\r\n-\u0022Then what should we call you, Harry?\u0022 she asked.\r\n-\r\n-\u0022His name is Prince Paradox,\u0022 said Dorian.\r\n-\r\n-\u0022I recognize him in a flash,\u0022 exclaimed the duchess.\r\n-\r\n-\u0022I won't hear of it,\u0022 laughed Lord Henry, sinking into a chair. \u0022From\r\n-a label there is no escape! I refuse the title.\u0022\r\n-\r\n-\u0022Royalties may not abdicate,\u0022 fell as a warning from pretty lips.\r\n-\r\n-\u0022You wish me to defend my throne, then?\u0022\r\n-\r\n-\u0022Yes.\u0022\r\n-\r\n-\u0022I give the truths of to-morrow.\u0022\r\n-\r\n-\u0022I prefer the mistakes of to-day,\u0022 she answered.\r\n-\r\n-\u0022You disarm me, Gladys,\u0022 he cried, catching the wilfulness of her mood.\r\n-\r\n-\u0022Of your shield, Harry, not of your spear.\u0022\r\n-\r\n-\u0022I never tilt against beauty,\u0022 he said, with a wave of his hand.\r\n-\r\n-\u0022That is your error, Harry, believe me. You value beauty far too much.\u0022\r\n-\r\n-\u0022How can you say that? I admit that I think that it is better to be\r\n-beautiful than to be good. But on the other hand, no one is more ready\r\n-than I am to acknowledge that it is better to be good than to be ugly.\u0022\r\n-\r\n-\u0022Ugliness is one of the seven deadly sins, then?\u0022 cried the duchess.\r\n-\u0022What becomes of your simile about the orchid?\u0022\r\n-\r\n-\u0022Ugliness is one of the seven deadly virtues, Gladys. You, as a good\r\n-Tory, must not underrate them. Beer, the Bible, and the seven deadly\r\n-virtues have made our England what she is.\u0022\r\n-\r\n-\u0022You don't like your country, then?\u0022 she asked.\r\n-\r\n-\u0022I live in it.\u0022\r\n-\r\n-\u0022That you may censure it the better.\u0022\r\n-\r\n-\u0022Would you have me take the verdict of Europe on it?\u0022 he inquired.\r\n-\r\n-\u0022What do they say of us?\u0022\r\n-\r\n-\u0022That Tartuffe has emigrated to England and opened a shop.\u0022\r\n-\r\n-\u0022Is that yours, Harry?\u0022\r\n-\r\n-\u0022I give it to you.\u0022\r\n-\r\n-\u0022I could not use it. It is too true.\u0022\r\n-\r\n-\u0022You need not be afraid. Our countrymen never recognize a description.\u0022\r\n-\r\n-\u0022They are practical.\u0022\r\n-\r\n-\u0022They are more cunning than practical. When they make up their ledger,\r\n-they balance stupidity by wealth, and vice by hypocrisy.\u0022\r\n-\r\n-\u0022Still, we have done great things.\u0022\r\n-\r\n-\u0022Great things have been thrust on us, Gladys.\u0022\r\n-\r\n-\u0022We have carried their burden.\u0022\r\n-\r\n-\u0022Only as far as the Stock Exchange.\u0022\r\n-\r\n-She shook her head. \u0022I believe in the race,\u0022 she cried.\r\n-\r\n-\u0022It represents the survival of the pushing.\u0022\r\n-\r\n-\u0022It has development.\u0022\r\n-\r\n-\u0022Decay fascinates me more.\u0022\r\n-\r\n-\u0022What of art?\u0022 she asked.\r\n-\r\n-\u0022It is a malady.\u0022\r\n-\r\n-\u0022Love?\u0022\r\n-\r\n-\u0022An illusion.\u0022\r\n-\r\n-\u0022Religion?\u0022\r\n-\r\n-\u0022The fashionable substitute for belief.\u0022\r\n-\r\n-\u0022You are a sceptic.\u0022\r\n-\r\n-\u0022Never! Scepticism is the beginning of faith.\u0022\r\n-\r\n-\u0022What are you?\u0022\r\n-\r\n-\u0022To define is to limit.\u0022\r\n-\r\n-\u0022Give me a clue.\u0022\r\n-\r\n-\u0022Threads snap. You would lose your way in the labyrinth.\u0022\r\n-\r\n-\u0022You bewilder me. Let us talk of some one else.\u0022\r\n-\r\n-\u0022Our host is a delightful topic. Years ago he was christened Prince\r\n-Charming.\u0022\r\n-\r\n-\u0022Ah! don't remind me of that,\u0022 cried Dorian Gray.\r\n-\r\n-\u0022Our host is rather horrid this evening,\u0022 answered the duchess,\r\n-colouring. \u0022I believe he thinks that Monmouth married me on purely\r\n-scientific principles as the best specimen he could find of a modern\r\n-butterfly.\u0022\r\n-\r\n-\u0022Well, I hope he won't stick pins into you, Duchess,\u0022 laughed Dorian.\r\n-\r\n-\u0022Oh! my maid does that already, Mr. Gray, when she is annoyed with me.\u0022\r\n-\r\n-\u0022And what does she get annoyed with you about, Duchess?\u0022\r\n-\r\n-\u0022For the most trivial things, Mr. Gray, I assure you. Usually because\r\n-I come in at ten minutes to nine and tell her that I must be dressed by\r\n-half-past eight.\u0022\r\n-\r\n-\u0022How unreasonable of her! You should give her warning.\u0022\r\n-\r\n-\u0022I daren't, Mr. Gray. Why, she invents hats for me. You remember the\r\n-one I wore at Lady Hilstone's garden-party? You don't, but it is nice\r\n-of you to pretend that you do. Well, she made it out of nothing. All\r\n-good hats are made out of nothing.\u0022\r\n-\r\n-\u0022Like all good reputations, Gladys,\u0022 interrupted Lord Henry. \u0022Every\r\n-effect that one produces gives one an enemy. To be popular one must be\r\n-a mediocrity.\u0022\r\n-\r\n-\u0022Not with women,\u0022 said the duchess, shaking her head; \u0022and women rule\r\n-the world. I assure you we can't bear mediocrities. We women, as some\r\n-one says, love with our ears, just as you men love with your eyes, if\r\n-you ever love at all.\u0022\r\n-\r\n-\u0022It seems to me that we never do anything else,\u0022 murmured Dorian.\r\n-\r\n-\u0022Ah! then, you never really love, Mr. Gray,\u0022 answered the duchess with\r\n-mock sadness.\r\n-\r\n-\u0022My dear Gladys!\u0022 cried Lord Henry. \u0022How can you say that? Romance\r\n-lives by repetition, and repetition converts an appetite into an art.\r\n-Besides, each time that one loves is the only time one has ever loved.\r\n-Difference of object does not alter singleness of passion. It merely\r\n-intensifies it. We can have in life but one great experience at best,\r\n-and the secret of life is to reproduce that experience as often as\r\n-possible.\u0022\r\n-\r\n-\u0022Even when one has been wounded by it, Harry?\u0022 asked the duchess after\r\n-a pause.\r\n-\r\n-\u0022Especially when one has been wounded by it,\u0022 answered Lord Henry.\r\n-\r\n-The duchess turned and looked at Dorian Gray with a curious expression\r\n-in her eyes. \u0022What do you say to that, Mr. Gray?\u0022 she inquired.\r\n-\r\n-Dorian hesitated for a moment. Then he threw his head back and\r\n-laughed. \u0022I always agree with Harry, Duchess.\u0022\r\n-\r\n-\u0022Even when he is wrong?\u0022\r\n-\r\n-\u0022Harry is never wrong, Duchess.\u0022\r\n-\r\n-\u0022And does his philosophy make you happy?\u0022\r\n-\r\n-\u0022I have never searched for happiness. Who wants happiness? I have\r\n-searched for pleasure.\u0022\r\n-\r\n-\u0022And found it, Mr. Gray?\u0022\r\n-\r\n-\u0022Often. Too often.\u0022\r\n-\r\n-The duchess sighed. \u0022I am searching for peace,\u0022 she said, \u0022and if I\r\n-don't go and dress, I shall have none this evening.\u0022\r\n-\r\n-\u0022Let me get you some orchids, Duchess,\u0022 cried Dorian, starting to his\r\n-feet and walking down the conservatory.\r\n-\r\n-\u0022You are flirting disgracefully with him,\u0022 said Lord Henry to his\r\n-cousin. \u0022You had better take care. He is very fascinating.\u0022\r\n-\r\n-\u0022If he were not, there would be no battle.\u0022\r\n-\r\n-\u0022Greek meets Greek, then?\u0022\r\n-\r\n-\u0022I am on the side of the Trojans. They fought for a woman.\u0022\r\n-\r\n-\u0022They were defeated.\u0022\r\n-\r\n-\u0022There are worse things than capture,\u0022 she answered.\r\n-\r\n-\u0022You gallop with a loose rein.\u0022\r\n-\r\n-\u0022Pace gives life,\u0022 was the _riposte_.\r\n-\r\n-\u0022I shall write it in my diary to-night.\u0022\r\n-\r\n-\u0022What?\u0022\r\n-\r\n-\u0022That a burnt child loves the fire.\u0022\r\n-\r\n-\u0022I am not even singed. My wings are untouched.\u0022\r\n-\r\n-\u0022You use them for everything, except flight.\u0022\r\n-\r\n-\u0022Courage has passed from men to women. It is a new experience for us.\u0022\r\n-\r\n-\u0022You have a rival.\u0022\r\n-\r\n-\u0022Who?\u0022\r\n-\r\n-He laughed. \u0022Lady Narborough,\u0022 he whispered. \u0022She perfectly adores\r\n-him.\u0022\r\n-\r\n-\u0022You fill me with apprehension. The appeal to antiquity is fatal to us\r\n-who are romanticists.\u0022\r\n-\r\n-\u0022Romanticists! You have all the methods of science.\u0022\r\n-\r\n-\u0022Men have educated us.\u0022\r\n-\r\n-\u0022But not explained you.\u0022\r\n-\r\n-\u0022Describe us as a sex,\u0022 was her challenge.\r\n-\r\n-\u0022Sphinxes without secrets.\u0022\r\n-\r\n-She looked at him, smiling. \u0022How long Mr. Gray is!\u0022 she said. \u0022Let us\r\n-go and help him. I have not yet told him the colour of my frock.\u0022\r\n-\r\n-\u0022Ah! you must suit your frock to his flowers, Gladys.\u0022\r\n-\r\n-\u0022That would be a premature surrender.\u0022\r\n-\r\n-\u0022Romantic art begins with its climax.\u0022\r\n-\r\n-\u0022I must keep an opportunity for retreat.\u0022\r\n-\r\n-\u0022In the Parthian manner?\u0022\r\n-\r\n-\u0022They found safety in the desert. I could not do that.\u0022\r\n-\r\n-\u0022Women are not always allowed a choice,\u0022 he answered, but hardly had he\r\n-finished the sentence before from the far end of the conservatory came\r\n-a stifled groan, followed by the dull sound of a heavy fall. Everybody\r\n-started up. The duchess stood motionless in horror. And with fear in\r\n-his eyes, Lord Henry rushed through the flapping palms to find Dorian\r\n-Gray lying face downwards on the tiled floor in a deathlike swoon.\r\n-\r\n-He was carried at once into the blue drawing-room and laid upon one of\r\n-the sofas. After a short time, he came to himself and looked round\r\n-with a dazed expression.\r\n-\r\n-\u0022What has happened?\u0022 he asked. \u0022Oh! I remember. Am I safe here,\r\n-Harry?\u0022 He began to tremble.\r\n-\r\n-\u0022My dear Dorian,\u0022 answered Lord Henry, \u0022you merely fainted. That was\r\n-all. You must have overtired yourself. You had better not come down\r\n-to dinner. I will take your place.\u0022\r\n-\r\n-\u0022No, I will come down,\u0022 he said, struggling to his feet. \u0022I would\r\n-rather come down. I must not be alone.\u0022\r\n-\r\n-He went to his room and dressed. There was a wild recklessness of\r\n-gaiety in his manner as he sat at table, but now and then a thrill of\r\n-terror ran through him when he remembered that, pressed against the\r\n-window of the conservatory, like a white handkerchief, he had seen the\r\n-face of James Vane watching him.\r\n-\r\n-\r\n-\r\n-CHAPTER 18\r\n-\r\n-The next day he did not leave the house, and, indeed, spent most of the\r\n-time in his own room, sick with a wild terror of dying, and yet\r\n-indifferent to life itself. The consciousness of being hunted, snared,\r\n-tracked down, had begun to dominate him. If the tapestry did but\r\n-tremble in the wind, he shook. The dead leaves that were blown against\r\n-the leaded panes seemed to him like his own wasted resolutions and wild\r\n-regrets. When he closed his eyes, he saw again the sailor's face\r\n-peering through the mist-stained glass, and horror seemed once more to\r\n-lay its hand upon his heart.\r\n-\r\n-But perhaps it had been only his fancy that had called vengeance out of\r\n-the night and set the hideous shapes of punishment before him. Actual\r\n-life was chaos, but there was something terribly logical in the\r\n-imagination. It was the imagination that set remorse to dog the feet\r\n-of sin. It was the imagination that made each crime bear its misshapen\r\n-brood. In the common world of fact the wicked were not punished, nor\r\n-the good rewarded. Success was given to the strong, failure thrust\r\n-upon the weak. That was all. Besides, had any stranger been prowling\r\n-round the house, he would have been seen by the servants or the\r\n-keepers. Had any foot-marks been found on the flower-beds, the\r\n-gardeners would have reported it. Yes, it had been merely fancy.\r\n-Sibyl Vane's brother had not come back to kill him. He had sailed away\r\n-in his ship to founder in some winter sea. From him, at any rate, he\r\n-was safe. Why, the man did not know who he was, could not know who he\r\n-was. The mask of youth had saved him.\r\n-\r\n-And yet if it had been merely an illusion, how terrible it was to think\r\n-that conscience could raise such fearful phantoms, and give them\r\n-visible form, and make them move before one! What sort of life would\r\n-his be if, day and night, shadows of his crime were to peer at him from\r\n-silent corners, to mock him from secret places, to whisper in his ear\r\n-as he sat at the feast, to wake him with icy fingers as he lay asleep!\r\n-As the thought crept through his brain, he grew pale with terror, and\r\n-the air seemed to him to have become suddenly colder. Oh! in what a\r\n-wild hour of madness he had killed his friend! How ghastly the mere\r\n-memory of the scene! He saw it all again. Each hideous detail came\r\n-back to him with added horror. Out of the black cave of time, terrible\r\n-and swathed in scarlet, rose the image of his sin. When Lord Henry\r\n-came in at six o'clock, he found him crying as one whose heart will\r\n-break.\r\n-\r\n-It was not till the third day that he ventured to go out. There was\r\n-something in the clear, pine-scented air of that winter morning that\r\n-seemed to bring him back his joyousness and his ardour for life. But\r\n-it was not merely the physical conditions of environment that had\r\n-caused the change. His own nature had revolted against the excess of\r\n-anguish that had sought to maim and mar the perfection of its calm.\r\n-With subtle and finely wrought temperaments it is always so. Their\r\n-strong passions must either bruise or bend. They either slay the man,\r\n-or themselves die. Shallow sorrows and shallow loves live on. The\r\n-loves and sorrows that are great are destroyed by their own plenitude.\r\n-Besides, he had convinced himself that he had been the victim of a\r\n-terror-stricken imagination, and looked back now on his fears with\r\n-something of pity and not a little of contempt.\r\n-\r\n-After breakfast, he walked with the duchess for an hour in the garden\r\n-and then drove across the park to join the shooting-party. The crisp\r\n-frost lay like salt upon the grass. The sky was an inverted cup of\r\n-blue metal. A thin film of ice bordered the flat, reed-grown lake.\r\n-\r\n-At the corner of the pine-wood he caught sight of Sir Geoffrey\r\n-Clouston, the duchess's brother, jerking two spent cartridges out of\r\n-his gun. He jumped from the cart, and having told the groom to take\r\n-the mare home, made his way towards his guest through the withered\r\n-bracken and rough undergrowth.\r\n-\r\n-\u0022Have you had good sport, Geoffrey?\u0022 he asked.\r\n-\r\n-\u0022Not very good, Dorian. I think most of the birds have gone to the\r\n-open. I dare say it will be better after lunch, when we get to new\r\n-ground.\u0022\r\n-\r\n-Dorian strolled along by his side. The keen aromatic air, the brown\r\n-and red lights that glimmered in the wood, the hoarse cries of the\r\n-beaters ringing out from time to time, and the sharp snaps of the guns\r\n-that followed, fascinated him and filled him with a sense of delightful\r\n-freedom. He was dominated by the carelessness of happiness, by the\r\n-high indifference of joy.\r\n-\r\n-Suddenly from a lumpy tussock of old grass some twenty yards in front\r\n-of them, with black-tipped ears erect and long hinder limbs throwing it\r\n-forward, started a hare. It bolted for a thicket of alders. Sir\r\n-Geoffrey put his gun to his shoulder, but there was something in the\r\n-animal's grace of movement that strangely charmed Dorian Gray, and he\r\n-cried out at once, \u0022Don't shoot it, Geoffrey. Let it live.\u0022\r\n-\r\n-\u0022What nonsense, Dorian!\u0022 laughed his companion, and as the hare bounded\r\n-into the thicket, he fired. There were two cries heard, the cry of a\r\n-hare in pain, which is dreadful, the cry of a man in agony, which is\r\n-worse.\r\n-\r\n-\u0022Good heavens! I have hit a beater!\u0022 exclaimed Sir Geoffrey. \u0022What an\r\n-ass the man was to get in front of the guns! Stop shooting there!\u0022 he\r\n-called out at the top of his voice. \u0022A man is hurt.\u0022\r\n-\r\n-The head-keeper came running up with a stick in his hand.\r\n-\r\n-\u0022Where, sir? Where is he?\u0022 he shouted. At the same time, the firing\r\n-ceased along the line.\r\n-\r\n-\u0022Here,\u0022 answered Sir Geoffrey angrily, hurrying towards the thicket.\r\n-\u0022Why on earth don't you keep your men back? Spoiled my shooting for\r\n-the day.\u0022\r\n-\r\n-Dorian watched them as they plunged into the alder-clump, brushing the\r\n-lithe swinging branches aside. In a few moments they emerged, dragging\r\n-a body after them into the sunlight. He turned away in horror. It\r\n-seemed to him that misfortune followed wherever he went. He heard Sir\r\n-Geoffrey ask if the man was really dead, and the affirmative answer of\r\n-the keeper. The wood seemed to him to have become suddenly alive with\r\n-faces. There was the trampling of myriad feet and the low buzz of\r\n-voices. A great copper-breasted pheasant came beating through the\r\n-boughs overhead.\r\n-\r\n-After a few moments--that were to him, in his perturbed state, like\r\n-endless hours of pain--he felt a hand laid on his shoulder. He started\r\n-and looked round.\r\n-\r\n-\u0022Dorian,\u0022 said Lord Henry, \u0022I had better tell them that the shooting is\r\n-stopped for to-day. It would not look well to go on.\u0022\r\n-\r\n-\u0022I wish it were stopped for ever, Harry,\u0022 he answered bitterly. \u0022The\r\n-whole thing is hideous and cruel. Is the man ...?\u0022\r\n-\r\n-He could not finish the sentence.\r\n-\r\n-\u0022I am afraid so,\u0022 rejoined Lord Henry. \u0022He got the whole charge of\r\n-shot in his chest. He must have died almost instantaneously. Come;\r\n-let us go home.\u0022\r\n-\r\n-They walked side by side in the direction of the avenue for nearly\r\n-fifty yards without speaking. Then Dorian looked at Lord Henry and\r\n-said, with a heavy sigh, \u0022It is a bad omen, Harry, a very bad omen.\u0022\r\n-\r\n-\u0022What is?\u0022 asked Lord Henry. \u0022Oh! this accident, I suppose. My dear\r\n-fellow, it can't be helped. It was the man's own fault. Why did he\r\n-get in front of the guns? Besides, it is nothing to us. It is rather\r\n-awkward for Geoffrey, of course. It does not do to pepper beaters. It\r\n-makes people think that one is a wild shot. And Geoffrey is not; he\r\n-shoots very straight. But there is no use talking about the matter.\u0022\r\n-\r\n-Dorian shook his head. \u0022It is a bad omen, Harry. I feel as if\r\n-something horrible were going to happen to some of us. To myself,\r\n-perhaps,\u0022 he added, passing his hand over his eyes, with a gesture of\r\n-pain.\r\n-\r\n-The elder man laughed. \u0022The only horrible thing in the world is _ennui_,\r\n-Dorian. That is the one sin for which there is no forgiveness. But we\r\n-are not likely to suffer from it unless these fellows keep chattering\r\n-about this thing at dinner. I must tell them that the subject is to be\r\n-tabooed. As for omens, there is no such thing as an omen. Destiny\r\n-does not send us heralds. She is too wise or too cruel for that.\r\n-Besides, what on earth could happen to you, Dorian? You have\r\n-everything in the world that a man can want. There is no one who would\r\n-not be delighted to change places with you.\u0022\r\n-\r\n-\u0022There is no one with whom I would not change places, Harry. Don't\r\n-laugh like that. I am telling you the truth. The wretched peasant who\r\n-has just died is better off than I am. I have no terror of death. It\r\n-is the coming of death that terrifies me. Its monstrous wings seem to\r\n-wheel in the leaden air around me. Good heavens! don't you see a man\r\n-moving behind the trees there, watching me, waiting for me?\u0022\r\n-\r\n-Lord Henry looked in the direction in which the trembling gloved hand\r\n-was pointing. \u0022Yes,\u0022 he said, smiling, \u0022I see the gardener waiting for\r\n-you. I suppose he wants to ask you what flowers you wish to have on\r\n-the table to-night. How absurdly nervous you are, my dear fellow! You\r\n-must come and see my doctor, when we get back to town.\u0022\r\n-\r\n-Dorian heaved a sigh of relief as he saw the gardener approaching. The\r\n-man touched his hat, glanced for a moment at Lord Henry in a hesitating\r\n-manner, and then produced a letter, which he handed to his master.\r\n-\u0022Her Grace told me to wait for an answer,\u0022 he murmured.\r\n-\r\n-Dorian put the letter into his pocket. \u0022Tell her Grace that I am\r\n-coming in,\u0022 he said, coldly. The man turned round and went rapidly in\r\n-the direction of the house.\r\n-\r\n-\u0022How fond women are of doing dangerous things!\u0022 laughed Lord Henry.\r\n-\u0022It is one of the qualities in them that I admire most. A woman will\r\n-flirt with anybody in the world as long as other people are looking on.\u0022\r\n-\r\n-\u0022How fond you are of saying dangerous things, Harry! In the present\r\n-instance, you are quite astray. I like the duchess very much, but I\r\n-don't love her.\u0022\r\n-\r\n-\u0022And the duchess loves you very much, but she likes you less, so you\r\n-are excellently matched.\u0022\r\n-\r\n-\u0022You are talking scandal, Harry, and there is never any basis for\r\n-scandal.\u0022\r\n-\r\n-\u0022The basis of every scandal is an immoral certainty,\u0022 said Lord Henry,\r\n-lighting a cigarette.\r\n-\r\n-\u0022You would sacrifice anybody, Harry, for the sake of an epigram.\u0022\r\n-\r\n-\u0022The world goes to the altar of its own accord,\u0022 was the answer.\r\n-\r\n-\u0022I wish I could love,\u0022 cried Dorian Gray with a deep note of pathos in\r\n-his voice. \u0022But I seem to have lost the passion and forgotten the\r\n-desire. I am too much concentrated on myself. My own personality has\r\n-become a burden to me. I want to escape, to go away, to forget. It\r\n-was silly of me to come down here at all. I think I shall send a wire\r\n-to Harvey to have the yacht got ready. On a yacht one is safe.\u0022\r\n-\r\n-\u0022Safe from what, Dorian? You are in some trouble. Why not tell me\r\n-what it is? You know I would help you.\u0022\r\n-\r\n-\u0022I can't tell you, Harry,\u0022 he answered sadly. \u0022And I dare say it is\r\n-only a fancy of mine. This unfortunate accident has upset me. I have\r\n-a horrible presentiment that something of the kind may happen to me.\u0022\r\n-\r\n-\u0022What nonsense!\u0022\r\n-\r\n-\u0022I hope it is, but I can't help feeling it. Ah! here is the duchess,\r\n-looking like Artemis in a tailor-made gown. You see we have come back,\r\n-Duchess.\u0022\r\n-\r\n-\u0022I have heard all about it, Mr. Gray,\u0022 she answered. \u0022Poor Geoffrey is\r\n-terribly upset. And it seems that you asked him not to shoot the hare.\r\n-How curious!\u0022\r\n-\r\n-\u0022Yes, it was very curious. I don't know what made me say it. Some\r\n-whim, I suppose. It looked the loveliest of little live things. But I\r\n-am sorry they told you about the man. It is a hideous subject.\u0022\r\n-\r\n-\u0022It is an annoying subject,\u0022 broke in Lord Henry. \u0022It has no\r\n-psychological value at all. Now if Geoffrey had done the thing on\r\n-purpose, how interesting he would be! I should like to know some one\r\n-who had committed a real murder.\u0022\r\n-\r\n-\u0022How horrid of you, Harry!\u0022 cried the duchess. \u0022Isn't it, Mr. Gray?\r\n-Harry, Mr. Gray is ill again. He is going to faint.\u0022\r\n-\r\n-Dorian drew himself up with an effort and smiled. \u0022It is nothing,\r\n-Duchess,\u0022 he murmured; \u0022my nerves are dreadfully out of order. That is\r\n-all. I am afraid I walked too far this morning. I didn't hear what\r\n-Harry said. Was it very bad? You must tell me some other time. I\r\n-think I must go and lie down. You will excuse me, won't you?\u0022\r\n-\r\n-They had reached the great flight of steps that led from the\r\n-conservatory on to the terrace. As the glass door closed behind\r\n-Dorian, Lord Henry turned and looked at the duchess with his slumberous\r\n-eyes. \u0022Are you very much in love with him?\u0022 he asked.\r\n-\r\n-She did not answer for some time, but stood gazing at the landscape.\r\n-\u0022I wish I knew,\u0022 she said at last.\r\n-\r\n-He shook his head. \u0022Knowledge would be fatal. It is the uncertainty\r\n-that charms one. A mist makes things wonderful.\u0022\r\n-\r\n-\u0022One may lose one's way.\u0022\r\n-\r\n-\u0022All ways end at the same point, my dear Gladys.\u0022\r\n-\r\n-\u0022What is that?\u0022\r\n-\r\n-\u0022Disillusion.\u0022\r\n-\r\n-\u0022It was my _debut_ in life,\u0022 she sighed.\r\n-\r\n-\u0022It came to you crowned.\u0022\r\n-\r\n-\u0022I am tired of strawberry leaves.\u0022\r\n-\r\n-\u0022They become you.\u0022\r\n-\r\n-\u0022Only in public.\u0022\r\n-\r\n-\u0022You would miss them,\u0022 said Lord Henry.\r\n-\r\n-\u0022I will not part with a petal.\u0022\r\n-\r\n-\u0022Monmouth has ears.\u0022\r\n-\r\n-\u0022Old age is dull of hearing.\u0022\r\n-\r\n-\u0022Has he never been jealous?\u0022\r\n-\r\n-\u0022I wish he had been.\u0022\r\n-\r\n-He glanced about as if in search of something. \u0022What are you looking\r\n-for?\u0022 she inquired.\r\n-\r\n-\u0022The button from your foil,\u0022 he answered. \u0022You have dropped it.\u0022\r\n-\r\n-She laughed. \u0022I have still the mask.\u0022\r\n-\r\n-\u0022It makes your eyes lovelier,\u0022 was his reply.\r\n-\r\n-She laughed again. Her teeth showed like white seeds in a scarlet\r\n-fruit.\r\n-\r\n-Upstairs, in his own room, Dorian Gray was lying on a sofa, with terror\r\n-in every tingling fibre of his body. Life had suddenly become too\r\n-hideous a burden for him to bear. The dreadful death of the unlucky\r\n-beater, shot in the thicket like a wild animal, had seemed to him to\r\n-pre-figure death for himself also. He had nearly swooned at what Lord\r\n-Henry had said in a chance mood of cynical jesting.\r\n-\r\n-At five o'clock he rang his bell for his servant and gave him orders to\r\n-pack his things for the night-express to town, and to have the brougham\r\n-at the door by eight-thirty. He was determined not to sleep another\r\n-night at Selby Royal. It was an ill-omened place. Death walked there\r\n-in the sunlight. The grass of the forest had been spotted with blood.\r\n-\r\n-Then he wrote a note to Lord Henry, telling him that he was going up to\r\n-town to consult his doctor and asking him to entertain his guests in\r\n-his absence. As he was putting it into the envelope, a knock came to\r\n-the door, and his valet informed him that the head-keeper wished to see\r\n-him. He frowned and bit his lip. \u0022Send him in,\u0022 he muttered, after\r\n-some moments' hesitation.\r\n-\r\n-As soon as the man entered, Dorian pulled his chequebook out of a\r\n-drawer and spread it out before him.\r\n-\r\n-\u0022I suppose you have come about the unfortunate accident of this\r\n-morning, Thornton?\u0022 he said, taking up a pen.\r\n-\r\n-\u0022Yes, sir,\u0022 answered the gamekeeper.\r\n-\r\n-\u0022Was the poor fellow married? Had he any people dependent on him?\u0022\r\n-asked Dorian, looking bored. \u0022If so, I should not like them to be left\r\n-in want, and will send them any sum of money you may think necessary.\u0022\r\n-\r\n-\u0022We don't know who he is, sir. That is what I took the liberty of\r\n-coming to you about.\u0022\r\n-\r\n-\u0022Don't know who he is?\u0022 said Dorian, listlessly. \u0022What do you mean?\r\n-Wasn't he one of your men?\u0022\r\n-\r\n-\u0022No, sir. Never saw him before. Seems like a sailor, sir.\u0022\r\n-\r\n-The pen dropped from Dorian Gray's hand, and he felt as if his heart\r\n-had suddenly stopped beating. \u0022A sailor?\u0022 he cried out. \u0022Did you say\r\n-a sailor?\u0022\r\n-\r\n-\u0022Yes, sir. He looks as if he had been a sort of sailor; tattooed on\r\n-both arms, and that kind of thing.\u0022\r\n-\r\n-\u0022Was there anything found on him?\u0022 said Dorian, leaning forward and\r\n-looking at the man with startled eyes. \u0022Anything that would tell his\r\n-name?\u0022\r\n-\r\n-\u0022Some money, sir--not much, and a six-shooter. There was no name of any\r\n-kind. A decent-looking man, sir, but rough-like. A sort of sailor we\r\n-think.\u0022\r\n-\r\n-Dorian started to his feet. A terrible hope fluttered past him. He\r\n-clutched at it madly. \u0022Where is the body?\u0022 he exclaimed. \u0022Quick! I\r\n-must see it at once.\u0022\r\n-\r\n-\u0022It is in an empty stable in the Home Farm, sir. The folk don't like\r\n-to have that sort of thing in their houses. They say a corpse brings\r\n-bad luck.\u0022\r\n-\r\n-\u0022The Home Farm! Go there at once and meet me. Tell one of the grooms\r\n-to bring my horse round. No. Never mind. I'll go to the stables\r\n-myself. It will save time.\u0022\r\n-\r\n-In less than a quarter of an hour, Dorian Gray was galloping down the\r\n-long avenue as hard as he could go. The trees seemed to sweep past him\r\n-in spectral procession, and wild shadows to fling themselves across his\r\n-path. Once the mare swerved at a white gate-post and nearly threw him.\r\n-He lashed her across the neck with his crop. She cleft the dusky air\r\n-like an arrow. The stones flew from her hoofs.\r\n-\r\n-At last he reached the Home Farm. Two men were loitering in the yard.\r\n-He leaped from the saddle and threw the reins to one of them. In the\r\n-farthest stable a light was glimmering. Something seemed to tell him\r\n-that the body was there, and he hurried to the door and put his hand\r\n-upon the latch.\r\n-\r\n-There he paused for a moment, feeling that he was on the brink of a\r\n-discovery that would either make or mar his life. Then he thrust the\r\n-door open and entered.\r\n-\r\n-On a heap of sacking in the far corner was lying the dead body of a man\r\n-dressed in a coarse shirt and a pair of blue trousers. A spotted\r\n-handkerchief had been placed over the face. A coarse candle, stuck in\r\n-a bottle, sputtered beside it.\r\n-\r\n-Dorian Gray shuddered. He felt that his could not be the hand to take\r\n-the handkerchief away, and called out to one of the farm-servants to\r\n-come to him.\r\n-\r\n-\u0022Take that thing off the face. I wish to see it,\u0022 he said, clutching\r\n-at the door-post for support.\r\n-\r\n-When the farm-servant had done so, he stepped forward. A cry of joy\r\n-broke from his lips. The man who had been shot in the thicket was\r\n-James Vane.\r\n-\r\n-He stood there for some minutes looking at the dead body. As he rode\r\n-home, his eyes were full of tears, for he knew he was safe.\r\n-\r\n-\r\n-\r\n-CHAPTER 19\r\n-\r\n-\u0022There is no use your telling me that you are going to be good,\u0022 cried\r\n-Lord Henry, dipping his white fingers into a red copper bowl filled\r\n-with rose-water. \u0022You are quite perfect. Pray, don't change.\u0022\r\n-\r\n-Dorian Gray shook his head. \u0022No, Harry, I have done too many dreadful\r\n-things in my life. I am not going to do any more. I began my good\r\n-actions yesterday.\u0022\r\n-\r\n-\u0022Where were you yesterday?\u0022\r\n-\r\n-\u0022In the country, Harry. I was staying at a little inn by myself.\u0022\r\n-\r\n-\u0022My dear boy,\u0022 said Lord Henry, smiling, \u0022anybody can be good in the\r\n-country. There are no temptations there. That is the reason why\r\n-people who live out of town are so absolutely uncivilized.\r\n-Civilization is not by any means an easy thing to attain to. There are\r\n-only two ways by which man can reach it. One is by being cultured, the\r\n-other by being corrupt. Country people have no opportunity of being\r\n-either, so they stagnate.\u0022\r\n-\r\n-\u0022Culture and corruption,\u0022 echoed Dorian. \u0022I have known something of\r\n-both. It seems terrible to me now that they should ever be found\r\n-together. For I have a new ideal, Harry. I am going to alter. I\r\n-think I have altered.\u0022\r\n-\r\n-\u0022You have not yet told me what your good action was. Or did you say\r\n-you had done more than one?\u0022 asked his companion as he spilled into his\r\n-plate a little crimson pyramid of seeded strawberries and, through a\r\n-perforated, shell-shaped spoon, snowed white sugar upon them.\r\n-\r\n-\u0022I can tell you, Harry. It is not a story I could tell to any one\r\n-else. I spared somebody. It sounds vain, but you understand what I\r\n-mean. She was quite beautiful and wonderfully like Sibyl Vane. I\r\n-think it was that which first attracted me to her. You remember Sibyl,\r\n-don't you? How long ago that seems! Well, Hetty was not one of our\r\n-own class, of course. She was simply a girl in a village. But I\r\n-really loved her. I am quite sure that I loved her. All during this\r\n-wonderful May that we have been having, I used to run down and see her\r\n-two or three times a week. Yesterday she met me in a little orchard.\r\n-The apple-blossoms kept tumbling down on her hair, and she was\r\n-laughing. We were to have gone away together this morning at dawn.\r\n-Suddenly I determined to leave her as flowerlike as I had found her.\u0022\r\n-\r\n-\u0022I should think the novelty of the emotion must have given you a thrill\r\n-of real pleasure, Dorian,\u0022 interrupted Lord Henry. \u0022But I can finish\r\n-your idyll for you. You gave her good advice and broke her heart.\r\n-That was the beginning of your reformation.\u0022\r\n-\r\n-\u0022Harry, you are horrible! You mustn't say these dreadful things.\r\n-Hetty's heart is not broken. Of course, she cried and all that. But\r\n-there is no disgrace upon her. She can live, like Perdita, in her\r\n-garden of mint and marigold.\u0022\r\n-\r\n-\u0022And weep over a faithless Florizel,\u0022 said Lord Henry, laughing, as he\r\n-leaned back in his chair. \u0022My dear Dorian, you have the most curiously\r\n-boyish moods. Do you think this girl will ever be really content now\r\n-with any one of her own rank? I suppose she will be married some day\r\n-to a rough carter or a grinning ploughman. Well, the fact of having\r\n-met you, and loved you, will teach her to despise her husband, and she\r\n-will be wretched. From a moral point of view, I cannot say that I\r\n-think much of your great renunciation. Even as a beginning, it is\r\n-poor. Besides, how do you know that Hetty isn't floating at the\r\n-present moment in some starlit mill-pond, with lovely water-lilies\r\n-round her, like Ophelia?\u0022\r\n-\r\n-\u0022I can't bear this, Harry! You mock at everything, and then suggest\r\n-the most serious tragedies. I am sorry I told you now. I don't care\r\n-what you say to me. I know I was right in acting as I did. Poor\r\n-Hetty! As I rode past the farm this morning, I saw her white face at\r\n-the window, like a spray of jasmine. Don't let us talk about it any\r\n-more, and don't try to persuade me that the first good action I have\r\n-done for years, the first little bit of self-sacrifice I have ever\r\n-known, is really a sort of sin. I want to be better. I am going to be\r\n-better. Tell me something about yourself. What is going on in town?\r\n-I have not been to the club for days.\u0022\r\n-\r\n-\u0022The people are still discussing poor Basil's disappearance.\u0022\r\n-\r\n-\u0022I should have thought they had got tired of that by this time,\u0022 said\r\n-Dorian, pouring himself out some wine and frowning slightly.\r\n-\r\n-\u0022My dear boy, they have only been talking about it for six weeks, and\r\n-the British public are really not equal to the mental strain of having\r\n-more than one topic every three months. They have been very fortunate\r\n-lately, however. They have had my own divorce-case and Alan Campbell's\r\n-suicide. Now they have got the mysterious disappearance of an artist.\r\n-Scotland Yard still insists that the man in the grey ulster who left\r\n-for Paris by the midnight train on the ninth of November was poor\r\n-Basil, and the French police declare that Basil never arrived in Paris\r\n-at all. I suppose in about a fortnight we shall be told that he has\r\n-been seen in San Francisco. It is an odd thing, but every one who\r\n-disappears is said to be seen at San Francisco. It must be a\r\n-delightful city, and possess all the attractions of the next world.\u0022\r\n-\r\n-\u0022What do you think has happened to Basil?\u0022 asked Dorian, holding up his\r\n-Burgundy against the light and wondering how it was that he could\r\n-discuss the matter so calmly.\r\n-\r\n-\u0022I have not the slightest idea. If Basil chooses to hide himself, it\r\n-is no business of mine. If he is dead, I don't want to think about\r\n-him. Death is the only thing that ever terrifies me. I hate it.\u0022\r\n-\r\n-\u0022Why?\u0022 said the younger man wearily.\r\n-\r\n-\u0022Because,\u0022 said Lord Henry, passing beneath his nostrils the gilt\r\n-trellis of an open vinaigrette box, \u0022one can survive everything\r\n-nowadays except that. Death and vulgarity are the only two facts in\r\n-the nineteenth century that one cannot explain away. Let us have our\r\n-coffee in the music-room, Dorian. You must play Chopin to me. The man\r\n-with whom my wife ran away played Chopin exquisitely. Poor Victoria!\r\n-I was very fond of her. The house is rather lonely without her. Of\r\n-course, married life is merely a habit, a bad habit. But then one\r\n-regrets the loss even of one's worst habits. Perhaps one regrets them\r\n-the most. They are such an essential part of one's personality.\u0022\r\n-\r\n-Dorian said nothing, but rose from the table, and passing into the next\r\n-room, sat down to the piano and let his fingers stray across the white\r\n-and black ivory of the keys. After the coffee had been brought in, he\r\n-stopped, and looking over at Lord Henry, said, \u0022Harry, did it ever\r\n-occur to you that Basil was murdered?\u0022\r\n-\r\n-Lord Henry yawned. \u0022Basil was very popular, and always wore a\r\n-Waterbury watch. Why should he have been murdered? He was not clever\r\n-enough to have enemies. Of course, he had a wonderful genius for\r\n-painting. But a man can paint like Velasquez and yet be as dull as\r\n-possible. Basil was really rather dull. He only interested me once,\r\n-and that was when he told me, years ago, that he had a wild adoration\r\n-for you and that you were the dominant motive of his art.\u0022\r\n-\r\n-\u0022I was very fond of Basil,\u0022 said Dorian with a note of sadness in his\r\n-voice. \u0022But don't people say that he was murdered?\u0022\r\n-\r\n-\u0022Oh, some of the papers do. It does not seem to me to be at all\r\n-probable. I know there are dreadful places in Paris, but Basil was not\r\n-the sort of man to have gone to them. He had no curiosity. It was his\r\n-chief defect.\u0022\r\n-\r\n-\u0022What would you say, Harry, if I told you that I had murdered Basil?\u0022\r\n-said the younger man. He watched him intently after he had spoken.\r\n-\r\n-\u0022I would say, my dear fellow, that you were posing for a character that\r\n-doesn't suit you. All crime is vulgar, just as all vulgarity is crime.\r\n-It is not in you, Dorian, to commit a murder. I am sorry if I hurt\r\n-your vanity by saying so, but I assure you it is true. Crime belongs\r\n-exclusively to the lower orders. I don't blame them in the smallest\r\n-degree. I should fancy that crime was to them what art is to us,\r\n-simply a method of procuring extraordinary sensations.\u0022\r\n-\r\n-\u0022A method of procuring sensations? Do you think, then, that a man who\r\n-has once committed a murder could possibly do the same crime again?\r\n-Don't tell me that.\u0022\r\n-\r\n-\u0022Oh! anything becomes a pleasure if one does it too often,\u0022 cried Lord\r\n-Henry, laughing. \u0022That is one of the most important secrets of life.\r\n-I should fancy, however, that murder is always a mistake. One should\r\n-never do anything that one cannot talk about after dinner. But let us\r\n-pass from poor Basil. I wish I could believe that he had come to such\r\n-a really romantic end as you suggest, but I can't. I dare say he fell\r\n-into the Seine off an omnibus and that the conductor hushed up the\r\n-scandal. Yes: I should fancy that was his end. I see him lying now\r\n-on his back under those dull-green waters, with the heavy barges\r\n-floating over him and long weeds catching in his hair. Do you know, I\r\n-don't think he would have done much more good work. During the last\r\n-ten years his painting had gone off very much.\u0022\r\n-\r\n-Dorian heaved a sigh, and Lord Henry strolled across the room and began\r\n-to stroke the head of a curious Java parrot, a large, grey-plumaged\r\n-bird with pink crest and tail, that was balancing itself upon a bamboo\r\n-perch. As his pointed fingers touched it, it dropped the white scurf\r\n-of crinkled lids over black, glasslike eyes and began to sway backwards\r\n-and forwards.\r\n-\r\n-\u0022Yes,\u0022 he continued, turning round and taking his handkerchief out of\r\n-his pocket; \u0022his painting had quite gone off. It seemed to me to have\r\n-lost something. It had lost an ideal. When you and he ceased to be\r\n-great friends, he ceased to be a great artist. What was it separated\r\n-you? I suppose he bored you. If so, he never forgave you. It's a\r\n-habit bores have. By the way, what has become of that wonderful\r\n-portrait he did of you? I don't think I have ever seen it since he\r\n-finished it. Oh! I remember your telling me years ago that you had\r\n-sent it down to Selby, and that it had got mislaid or stolen on the\r\n-way. You never got it back? What a pity! it was really a\r\n-masterpiece. I remember I wanted to buy it. I wish I had now. It\r\n-belonged to Basil's best period. Since then, his work was that curious\r\n-mixture of bad painting and good intentions that always entitles a man\r\n-to be called a representative British artist. Did you advertise for\r\n-it? You should.\u0022\r\n-\r\n-\u0022I forget,\u0022 said Dorian. \u0022I suppose I did. But I never really liked\r\n-it. I am sorry I sat for it. The memory of the thing is hateful to\r\n-me. Why do you talk of it? It used to remind me of those curious\r\n-lines in some play--Hamlet, I think--how do they run?--\r\n-\r\n- \u0022Like the painting of a sorrow,\r\n- A face without a heart.\u0022\r\n-\r\n-Yes: that is what it was like.\u0022\r\n-\r\n-Lord Henry laughed. \u0022If a man treats life artistically, his brain is\r\n-his heart,\u0022 he answered, sinking into an arm-chair.\r\n-\r\n-Dorian Gray shook his head and struck some soft chords on the piano.\r\n-\u0022'Like the painting of a sorrow,'\u0022 he repeated, \u0022'a face without a\r\n-heart.'\u0022\r\n-\r\n-The elder man lay back and looked at him with half-closed eyes. \u0022By\r\n-the way, Dorian,\u0022 he said after a pause, \u0022'what does it profit a man if\r\n-he gain the whole world and lose--how does the quotation run?--his own\r\n-soul'?\u0022\r\n-\r\n-The music jarred, and Dorian Gray started and stared at his friend.\r\n-\u0022Why do you ask me that, Harry?\u0022\r\n-\r\n-\u0022My dear fellow,\u0022 said Lord Henry, elevating his eyebrows in surprise,\r\n-\u0022I asked you because I thought you might be able to give me an answer.\r\n-That is all. I was going through the park last Sunday, and close by\r\n-the Marble Arch there stood a little crowd of shabby-looking people\r\n-listening to some vulgar street-preacher. As I passed by, I heard the\r\n-man yelling out that question to his audience. It struck me as being\r\n-rather dramatic. London is very rich in curious effects of that kind.\r\n-A wet Sunday, an uncouth Christian in a mackintosh, a ring of sickly\r\n-white faces under a broken roof of dripping umbrellas, and a wonderful\r\n-phrase flung into the air by shrill hysterical lips--it was really very\r\n-good in its way, quite a suggestion. I thought of telling the prophet\r\n-that art had a soul, but that man had not. I am afraid, however, he\r\n-would not have understood me.\u0022\r\n-\r\n-\u0022Don't, Harry. The soul is a terrible reality. It can be bought, and\r\n-sold, and bartered away. It can be poisoned, or made perfect. There\r\n-is a soul in each one of us. I know it.\u0022\r\n-\r\n-\u0022Do you feel quite sure of that, Dorian?\u0022\r\n-\r\n-\u0022Quite sure.\u0022\r\n-\r\n-\u0022Ah! then it must be an illusion. The things one feels absolutely\r\n-certain about are never true. That is the fatality of faith, and the\r\n-lesson of romance. How grave you are! Don't be so serious. What have\r\n-you or I to do with the superstitions of our age? No: we have given\r\n-up our belief in the soul. Play me something. Play me a nocturne,\r\n-Dorian, and, as you play, tell me, in a low voice, how you have kept\r\n-your youth. You must have some secret. I am only ten years older than\r\n-you are, and I am wrinkled, and worn, and yellow. You are really\r\n-wonderful, Dorian. You have never looked more charming than you do\r\n-to-night. You remind me of the day I saw you first. You were rather\r\n-cheeky, very shy, and absolutely extraordinary. You have changed, of\r\n-course, but not in appearance. I wish you would tell me your secret.\r\n-To get back my youth I would do anything in the world, except take\r\n-exercise, get up early, or be respectable. Youth! There is nothing\r\n-like it. It's absurd to talk of the ignorance of youth. The only\r\n-people to whose opinions I listen now with any respect are people much\r\n-younger than myself. They seem in front of me. Life has revealed to\r\n-them her latest wonder. As for the aged, I always contradict the aged.\r\n-I do it on principle. If you ask them their opinion on something that\r\n-happened yesterday, they solemnly give you the opinions current in\r\n-1820, when people wore high stocks, believed in everything, and knew\r\n-absolutely nothing. How lovely that thing you are playing is! I\r\n-wonder, did Chopin write it at Majorca, with the sea weeping round the\r\n-villa and the salt spray dashing against the panes? It is marvellously\r\n-romantic. What a blessing it is that there is one art left to us that\r\n-is not imitative! Don't stop. I want music to-night. It seems to me\r\n-that you are the young Apollo and that I am Marsyas listening to you.\r\n-I have sorrows, Dorian, of my own, that even you know nothing of. The\r\n-tragedy of old age is not that one is old, but that one is young. I am\r\n-amazed sometimes at my own sincerity. Ah, Dorian, how happy you are!\r\n-What an exquisite life you have had! You have drunk deeply of\r\n-everything. You have crushed the grapes against your palate. Nothing\r\n-has been hidden from you. And it has all been to you no more than the\r\n-sound of music. It has not marred you. You are still the same.\u0022\r\n-\r\n-\u0022I am not the same, Harry.\u0022\r\n-\r\n-\u0022Yes, you are the same. I wonder what the rest of your life will be.\r\n-Don't spoil it by renunciations. At present you are a perfect type.\r\n-Don't make yourself incomplete. You are quite flawless now. You need\r\n-not shake your head: you know you are. Besides, Dorian, don't deceive\r\n-yourself. Life is not governed by will or intention. Life is a\r\n-question of nerves, and fibres, and slowly built-up cells in which\r\n-thought hides itself and passion has its dreams. You may fancy\r\n-yourself safe and think yourself strong. But a chance tone of colour\r\n-in a room or a morning sky, a particular perfume that you had once\r\n-loved and that brings subtle memories with it, a line from a forgotten\r\n-poem that you had come across again, a cadence from a piece of music\r\n-that you had ceased to play--I tell you, Dorian, that it is on things\r\n-like these that our lives depend. Browning writes about that\r\n-somewhere; but our own senses will imagine them for us. There are\r\n-moments when the odour of _lilas blanc_ passes suddenly across me, and I\r\n-have to live the strangest month of my life over again. I wish I could\r\n-change places with you, Dorian. The world has cried out against us\r\n-both, but it has always worshipped you. It always will worship you.\r\n-You are the type of what the age is searching for, and what it is\r\n-afraid it has found. I am so glad that you have never done anything,\r\n-never carved a statue, or painted a picture, or produced anything\r\n-outside of yourself! Life has been your art. You have set yourself to\r\n-music. Your days are your sonnets.\u0022\r\n-\r\n-Dorian rose up from the piano and passed his hand through his hair.\r\n-\u0022Yes, life has been exquisite,\u0022 he murmured, \u0022but I am not going to\r\n-have the same life, Harry. And you must not say these extravagant\r\n-things to me. You don't know everything about me. I think that if you\r\n-did, even you would turn from me. You laugh. Don't laugh.\u0022\r\n-\r\n-\u0022Why have you stopped playing, Dorian? Go back and give me the\r\n-nocturne over again. Look at that great, honey-coloured moon that\r\n-hangs in the dusky air. She is waiting for you to charm her, and if\r\n-you play she will come closer to the earth. You won't? Let us go to\r\n-the club, then. It has been a charming evening, and we must end it\r\n-charmingly. There is some one at White's who wants immensely to know\r\n-you--young Lord Poole, Bournemouth's eldest son. He has already copied\r\n-your neckties, and has begged me to introduce him to you. He is quite\r\n-delightful and rather reminds me of you.\u0022\r\n-\r\n-\u0022I hope not,\u0022 said Dorian with a sad look in his eyes. \u0022But I am tired\r\n-to-night, Harry. I shan't go to the club. It is nearly eleven, and I\r\n-want to go to bed early.\u0022\r\n-\r\n-\u0022Do stay. You have never played so well as to-night. There was\r\n-something in your touch that was wonderful. It had more expression\r\n-than I had ever heard from it before.\u0022\r\n-\r\n-\u0022It is because I am going to be good,\u0022 he answered, smiling. \u0022I am a\r\n-little changed already.\u0022\r\n-\r\n-\u0022You cannot change to me, Dorian,\u0022 said Lord Henry. \u0022You and I will\r\n-always be friends.\u0022\r\n-\r\n-\u0022Yet you poisoned me with a book once. I should not forgive that.\r\n-Harry, promise me that you will never lend that book to any one. It\r\n-does harm.\u0022\r\n-\r\n-\u0022My dear boy, you are really beginning to moralize. You will soon be\r\n-going about like the converted, and the revivalist, warning people\r\n-against all the sins of which you have grown tired. You are much too\r\n-delightful to do that. Besides, it is no use. You and I are what we\r\n-are, and will be what we will be. As for being poisoned by a book,\r\n-there is no such thing as that. Art has no influence upon action. It\r\n-annihilates the desire to act. It is superbly sterile. The books that\r\n-the world calls immoral are books that show the world its own shame.\r\n-That is all. But we won't discuss literature. Come round to-morrow. I\r\n-am going to ride at eleven. We might go together, and I will take you\r\n-to lunch afterwards with Lady Branksome. She is a charming woman, and\r\n-wants to consult you about some tapestries she is thinking of buying.\r\n-Mind you come. Or shall we lunch with our little duchess? She says\r\n-she never sees you now. Perhaps you are tired of Gladys? I thought\r\n-you would be. Her clever tongue gets on one's nerves. Well, in any\r\n-case, be here at eleven.\u0022\r\n-\r\n-\u0022Must I really come, Harry?\u0022\r\n-\r\n-\u0022Certainly. The park is quite lovely now. I don't think there have\r\n-been such lilacs since the year I met you.\u0022\r\n-\r\n-\u0022Very well. I shall be here at eleven,\u0022 said Dorian. \u0022Good night,\r\n-Harry.\u0022 As he reached the door, he hesitated for a moment, as if he\r\n-had something more to say. Then he sighed and went out.\r\n-\r\n-\r\n-\r\n-CHAPTER 20\r\n-\r\n-It was a lovely night, so warm that he threw his coat over his arm and\r\n-did not even put his silk scarf round his throat. As he strolled home,\r\n-smoking his cigarette, two young men in evening dress passed him. He\r\n-heard one of them whisper to the other, \u0022That is Dorian Gray.\u0022 He\r\n-remembered how pleased he used to be when he was pointed out, or stared\r\n-at, or talked about. He was tired of hearing his own name now. Half\r\n-the charm of the little village where he had been so often lately was\r\n-that no one knew who he was. He had often told the girl whom he had\r\n-lured to love him that he was poor, and she had believed him. He had\r\n-told her once that he was wicked, and she had laughed at him and\r\n-answered that wicked people were always very old and very ugly. What a\r\n-laugh she had!--just like a thrush singing. And how pretty she had\r\n-been in her cotton dresses and her large hats! She knew nothing, but\r\n-she had everything that he had lost.\r\n-\r\n-When he reached home, he found his servant waiting up for him. He sent\r\n-him to bed, and threw himself down on the sofa in the library, and\r\n-began to think over some of the things that Lord Henry had said to him.\r\n-\r\n-Was it really true that one could never change? He felt a wild longing\r\n-for the unstained purity of his boyhood--his rose-white boyhood, as\r\n-Lord Henry had once called it. He knew that he had tarnished himself,\r\n-filled his mind with corruption and given horror to his fancy; that he\r\n-had been an evil influence to others, and had experienced a terrible\r\n-joy in being so; and that of the lives that had crossed his own, it had\r\n-been the fairest and the most full of promise that he had brought to\r\n-shame. But was it all irretrievable? Was there no hope for him?\r\n-\r\n-Ah! in what a monstrous moment of pride and passion he had prayed that\r\n-the portrait should bear the burden of his days, and he keep the\r\n-unsullied splendour of eternal youth! All his failure had been due to\r\n-that. Better for him that each sin of his life had brought its sure\r\n-swift penalty along with it. There was purification in punishment.\r\n-Not \u0022Forgive us our sins\u0022 but \u0022Smite us for our iniquities\u0022 should be\r\n-the prayer of man to a most just God.\r\n-\r\n-The curiously carved mirror that Lord Henry had given to him, so many\r\n-years ago now, was standing on the table, and the white-limbed Cupids\r\n-laughed round it as of old. He took it up, as he had done on that\r\n-night of horror when he had first noted the change in the fatal\r\n-picture, and with wild, tear-dimmed eyes looked into its polished\r\n-shield. Once, some one who had terribly loved him had written to him a\r\n-mad letter, ending with these idolatrous words: \u0022The world is changed\r\n-because you are made of ivory and gold. The curves of your lips\r\n-rewrite history.\u0022 The phrases came back to his memory, and he repeated\r\n-them over and over to himself. Then he loathed his own beauty, and\r\n-flinging the mirror on the floor, crushed it into silver splinters\r\n-beneath his heel. It was his beauty that had ruined him, his beauty\r\n-and the youth that he had prayed for. But for those two things, his\r\n-life might have been free from stain. His beauty had been to him but a\r\n-mask, his youth but a mockery. What was youth at best? A green, an\r\n-unripe time, a time of shallow moods, and sickly thoughts. Why had he\r\n-worn its livery? Youth had spoiled him.\r\n-\r\n-It was better not to think of the past. Nothing could alter that. It\r\n-was of himself, and of his own future, that he had to think. James\r\n-Vane was hidden in a nameless grave in Selby churchyard. Alan Campbell\r\n-had shot himself one night in his laboratory, but had not revealed the\r\n-secret that he had been forced to know. The excitement, such as it\r\n-was, over Basil Hallward's disappearance would soon pass away. It was\r\n-already waning. He was perfectly safe there. Nor, indeed, was it the\r\n-death of Basil Hallward that weighed most upon his mind. It was the\r\n-living death of his own soul that troubled him. Basil had painted the\r\n-portrait that had marred his life. He could not forgive him that. It\r\n-was the portrait that had done everything. Basil had said things to\r\n-him that were unbearable, and that he had yet borne with patience. The\r\n-murder had been simply the madness of a moment. As for Alan Campbell,\r\n-his suicide had been his own act. He had chosen to do it. It was\r\n-nothing to him.\r\n-\r\n-A new life! That was what he wanted. That was what he was waiting\r\n-for. Surely he had begun it already. He had spared one innocent\r\n-thing, at any rate. He would never again tempt innocence. He would be\r\n-good.\r\n-\r\n-As he thought of Hetty Merton, he began to wonder if the portrait in\r\n-the locked room had changed. Surely it was not still so horrible as it\r\n-had been? Perhaps if his life became pure, he would be able to expel\r\n-every sign of evil passion from the face. Perhaps the signs of evil\r\n-had already gone away. He would go and look.\r\n-\r\n-He took the lamp from the table and crept upstairs. As he unbarred the\r\n-door, a smile of joy flitted across his strangely young-looking face\r\n-and lingered for a moment about his lips. Yes, he would be good, and\r\n-the hideous thing that he had hidden away would no longer be a terror\r\n-to him. He felt as if the load had been lifted from him already.\r\n-\r\n-He went in quietly, locking the door behind him, as was his custom, and\r\n-dragged the purple hanging from the portrait. A cry of pain and\r\n-indignation broke from him. He could see no change, save that in the\r\n-eyes there was a look of cunning and in the mouth the curved wrinkle of\r\n-the hypocrite. The thing was still loathsome--more loathsome, if\r\n-possible, than before--and the scarlet dew that spotted the hand seemed\r\n-brighter, and more like blood newly spilled. Then he trembled. Had it\r\n-been merely vanity that had made him do his one good deed? Or the\r\n-desire for a new sensation, as Lord Henry had hinted, with his mocking\r\n-laugh? Or that passion to act a part that sometimes makes us do things\r\n-finer than we are ourselves? Or, perhaps, all these? And why was the\r\n-red stain larger than it had been? It seemed to have crept like a\r\n-horrible disease over the wrinkled fingers. There was blood on the\r\n-painted feet, as though the thing had dripped--blood even on the hand\r\n-that had not held the knife. Confess? Did it mean that he was to\r\n-confess? To give himself up and be put to death? He laughed. He felt\r\n-that the idea was monstrous. Besides, even if he did confess, who\r\n-would believe him? There was no trace of the murdered man anywhere.\r\n-Everything belonging to him had been destroyed. He himself had burned\r\n-what had been below-stairs. The world would simply say that he was mad.\r\n-They would shut him up if he persisted in his story.... Yet it was\r\n-his duty to confess, to suffer public shame, and to make public\r\n-atonement. There was a God who called upon men to tell their sins to\r\n-earth as well as to heaven. Nothing that he could do would cleanse him\r\n-till he had told his own sin. His sin? He shrugged his shoulders.\r\n-The death of Basil Hallward seemed very little to him. He was thinking\r\n-of Hetty Merton. For it was an unjust mirror, this mirror of his soul\r\n-that he was looking at. Vanity? Curiosity? Hypocrisy? Had there\r\n-been nothing more in his renunciation than that? There had been\r\n-something more. At least he thought so. But who could tell? ... No.\r\n-There had been nothing more. Through vanity he had spared her. In\r\n-hypocrisy he had worn the mask of goodness. For curiosity's sake he\r\n-had tried the denial of self. He recognized that now.\r\n-\r\n-But this murder--was it to dog him all his life? Was he always to be\r\n-burdened by his past? Was he really to confess? Never. There was\r\n-only one bit of evidence left against him. The picture itself--that\r\n-was evidence. He would destroy it. Why had he kept it so long? Once\r\n-it had given him pleasure to watch it changing and growing old. Of\r\n-late he had felt no such pleasure. It had kept him awake at night.\r\n-When he had been away, he had been filled with terror lest other eyes\r\n-should look upon it. It had brought melancholy across his passions.\r\n-Its mere memory had marred many moments of joy. It had been like\r\n-conscience to him. Yes, it had been conscience. He would destroy it.\r\n-\r\n-He looked round and saw the knife that had stabbed Basil Hallward. He\r\n-had cleaned it many times, till there was no stain left upon it. It\r\n-was bright, and glistened. As it had killed the painter, so it would\r\n-kill the painter's work, and all that that meant. It would kill the\r\n-past, and when that was dead, he would be free. It would kill this\r\n-monstrous soul-life, and without its hideous warnings, he would be at\r\n-peace. He seized the thing, and stabbed the picture with it.\r\n-\r\n-There was a cry heard, and a crash. The cry was so horrible in its\r\n-agony that the frightened servants woke and crept out of their rooms.\r\n-Two gentlemen, who were passing in the square below, stopped and looked\r\n-up at the great house. They walked on till they met a policeman and\r\n-brought him back. The man rang the bell several times, but there was\r\n-no answer. Except for a light in one of the top windows, the house was\r\n-all dark. After a time, he went away and stood in an adjoining portico\r\n-and watched.\r\n-\r\n-\u0022Whose house is that, Constable?\u0022 asked the elder of the two gentlemen.\r\n-\r\n-\u0022Mr. Dorian Gray's, sir,\u0022 answered the policeman.\r\n-\r\n-They looked at each other, as they walked away, and sneered. One of\r\n-them was Sir Henry Ashton's uncle.\r\n-\r\n-Inside, in the servants' part of the house, the half-clad domestics\r\n-were talking in low whispers to each other. Old Mrs. Leaf was crying\r\n-and wringing her hands. Francis was as pale as death.\r\n-\r\n-After about a quarter of an hour, he got the coachman and one of the\r\n-footmen and crept upstairs. They knocked, but there was no reply.\r\n-They called out. Everything was still. Finally, after vainly trying\r\n-to force the door, they got on the roof and dropped down on to the\r\n-balcony. The windows yielded easily--their bolts were old.\r\n-\r\n-When they entered, they found hanging upon the wall a splendid portrait\r\n-of their master as they had last seen him, in all the wonder of his\r\n-exquisite youth and beauty. Lying on the floor was a dead man, in\r\n-evening dress, with a knife in his heart. He was withered, wrinkled,\r\n-and loathsome of visage. It was not till they had examined the rings\r\n-that they recognized who it was.\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-\r\n-End of Project Gutenberg's The Picture of Dorian Gray, by Oscar Wilde\r\n-\r\n-*** END OF THIS PROJECT GUTENBERG EBOOK THE PICTURE OF DORIAN GRAY ***\r\n-\r\n-***** This file should be named 174.txt or 174.zip *****\r\n-This and all associated files of various formats will be found in:\r\n- http://www.gutenberg.org/1/7/174/\r\n-\r\n-Produced by Judith Boss. HTML version by Al Haines.\r\n-\r\n-Updated editions will replace the previous one--the old editions\r\n-will be renamed.\r\n-\r\n-Creating the works from public domain print editions means that no\r\n-one owns a United States copyright in these works, so the Foundation\r\n-(and you!) can copy and distribute it in the United States without\r\n-permission and without paying copyright royalties. Special rules,\r\n-set forth in the General Terms of Use part of this license, apply to\r\n-copying and distributing Project Gutenberg-tm electronic works to\r\n-protect the PROJECT GUTENBERG-tm concept and trademark. Project\r\n-Gutenberg is a registered trademark, and may not be used if you\r\n-charge for the eBooks, unless you receive specific permission. If you\r\n-do not charge anything for copies of this eBook, complying with the\r\n-rules is very easy. You may use this eBook for nearly any purpose\r\n-such as creation of derivative works, reports, performances and\r\n-research. They may be modified and printed and given away--you may do\r\n-practically ANYTHING with public domain eBooks. Redistribution is\r\n-subject to the trademark license, especially commercial\r\n-redistribution.\r\n-\r\n-\r\n-\r\n-*** START: FULL LICENSE ***\r\n-\r\n-THE FULL PROJECT GUTENBERG LICENSE\r\n-PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK\r\n-\r\n-To protect the Project Gutenberg-tm mission of promoting the free\r\n-distribution of electronic works, by using or distributing this work\r\n-(or any other work associated in any way with the phrase \u0022Project\r\n-Gutenberg\u0022), you agree to comply with all the terms of the Full Project\r\n-Gutenberg-tm License (available with this file or online at\r\n-http://gutenberg.net/license).\r\n-\r\n-\r\n-Section 1. General Terms of Use and Redistributing Project Gutenberg-tm\r\n-electronic works\r\n-\r\n-1.A. By reading or using any part of this Project Gutenberg-tm\r\n-electronic work, you indicate that you have read, understand, agree to\r\n-and accept all the terms of this license and intellectual property\r\n-(trademark/copyright) agreement. If you do not agree to abide by all\r\n-the terms of this agreement, you must cease using and return or destroy\r\n-all copies of Project Gutenberg-tm electronic works in your possession.\r\n-If you paid a fee for obtaining a copy of or access to a Project\r\n-Gutenberg-tm electronic work and you do not agree to be bound by the\r\n-terms of this agreement, you may obtain a refund from the person or\r\n-entity to whom you paid the fee as set forth in paragraph 1.E.8.\r\n-\r\n-1.B. \u0022Project Gutenberg\u0022 is a registered trademark. It may only be\r\n-used on or associated in any way with an electronic work by people who\r\n-agree to be bound by the terms of this agreement. There are a few\r\n-things that you can do with most Project Gutenberg-tm electronic works\r\n-even without complying with the full terms of this agreement. See\r\n-paragraph 1.C below. There are a lot of things you can do with Project\r\n-Gutenberg-tm electronic works if you follow the terms of this agreement\r\n-and help preserve free future access to Project Gutenberg-tm electronic\r\n-works. See paragraph 1.E below.\r\n-\r\n-1.C. The Project Gutenberg Literary Archive Foundation (\u0022the Foundation\u0022\r\n-or PGLAF), owns a compilation copyright in the collection of Project\r\n-Gutenberg-tm electronic works. Nearly all the individual works in the\r\n-collection are in the public domain in the United States. If an\r\n-individual work is in the public domain in the United States and you are\r\n-located in the United States, we do not claim a right to prevent you from\r\n-copying, distributing, performing, displaying or creating derivative\r\n-works based on the work as long as all references to Project Gutenberg\r\n-are removed. Of course, we hope that you will support the Project\r\n-Gutenberg-tm mission of promoting free access to electronic works by\r\n-freely sharing Project Gutenberg-tm works in compliance with the terms of\r\n-this agreement for keeping the Project Gutenberg-tm name associated with\r\n-the work. You can easily comply with the terms of this agreement by\r\n-keeping this work in the same format with its attached full Project\r\n-Gutenberg-tm License when you share it without charge with others.\r\n-\r\n-1.D. The copyright laws of the place where you are located also govern\r\n-what you can do with this work. Copyright laws in most countries are in\r\n-a constant state of change. If you are outside the United States, check\r\n-the laws of your country in addition to the terms of this agreement\r\n-before downloading, copying, displaying, performing, distributing or\r\n-creating derivative works based on this work or any other Project\r\n-Gutenberg-tm work. The Foundation makes no representations concerning\r\n-the copyright status of any work in any country outside the United\r\n-States.\r\n-\r\n-1.E. Unless you have removed all references to Project Gutenberg:\r\n-\r\n-1.E.1. The following sentence, with active links to, or other immediate\r\n-access to, the full Project Gutenberg-tm License must appear prominently\r\n-whenever any copy of a Project Gutenberg-tm work (any work on which the\r\n-phrase \u0022Project Gutenberg\u0022 appears, or with which the phrase \u0022Project\r\n-Gutenberg\u0022 is associated) is accessed, displayed, performed, viewed,\r\n-copied or distributed:\r\n-\r\n-This eBook is for the use of anyone anywhere at no cost and with\r\n-almost no restrictions whatsoever. You may copy it, give it away or\r\n-re-use it under the terms of the Project Gutenberg License included\r\n-with this eBook or online at www.gutenberg.net\r\n-\r\n-1.E.2. If an individual Project Gutenberg-tm electronic work is derived\r\n-from the public domain (does not contain a notice indicating that it is\r\n-posted with permission of the copyright holder), the work can be copied\r\n-and distributed to anyone in the United States without paying any fees\r\n-or charges. If you are redistributing or providing access to a work\r\n-with the phrase \u0022Project Gutenberg\u0022 associated with or appearing on the\r\n-work, you must comply either with the requirements of paragraphs 1.E.1\r\n-through 1.E.7 or obtain permission for the use of the work and the\r\n-Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or\r\n-1.E.9.\r\n-\r\n-1.E.3. If an individual Project Gutenberg-tm electronic work is posted\r\n-with the permission of the copyright holder, your use and distribution\r\n-must comply with both paragraphs 1.E.1 through 1.E.7 and any additional\r\n-terms imposed by the copyright holder. Additional terms will be linked\r\n-to the Project Gutenberg-tm License for all works posted with the\r\n-permission of the copyright holder found at the beginning of this work.\r\n-\r\n-1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm\r\n-License terms from this work, or any files containing a part of this\r\n-work or any other work associated with Project Gutenberg-tm.\r\n-\r\n-1.E.5. Do not copy, display, perform, distribute or redistribute this\r\n-electronic work, or any part of this electronic work, without\r\n-prominently displaying the sentence set forth in paragraph 1.E.1 with\r\n-active links or immediate access to the full terms of the Project\r\n-Gutenberg-tm License.\r\n-\r\n-1.E.6. You may convert to and distribute this work in any binary,\r\n-compressed, marked up, nonproprietary or proprietary form, including any\r\n-word processing or hypertext form. However, if you provide access to or\r\n-distribute copies of a Project Gutenberg-tm work in a format other than\r\n-\u0022Plain Vanilla ASCII\u0022 or other format used in the official version\r\n-posted on the official Project Gutenberg-tm web site (www.gutenberg.net),\r\n-you must, at no additional cost, fee or expense to the user, provide a\r\n-copy, a means of exporting a copy, or a means of obtaining a copy upon\r\n-request, of the work in its original \u0022Plain Vanilla ASCII\u0022 or other\r\n-form. Any alternate format must include the full Project Gutenberg-tm\r\n-License as specified in paragraph 1.E.1.\r\n-\r\n-1.E.7. Do not charge a fee for access to, viewing, displaying,\r\n-performing, copying or distributing any Project Gutenberg-tm works\r\n-unless you comply with paragraph 1.E.8 or 1.E.9.\r\n-\r\n-1.E.8. You may charge a reasonable fee for copies of or providing\r\n-access to or distributing Project Gutenberg-tm electronic works provided\r\n-that\r\n-\r\n-- You pay a royalty fee of 20% of the gross profits you derive from\r\n- the use of Project Gutenberg-tm works calculated using the method\r\n- you already use to calculate your applicable taxes. The fee is\r\n- owed to the owner of the Project Gutenberg-tm trademark, but he\r\n- has agreed to donate royalties under this paragraph to the\r\n- Project Gutenberg Literary Archive Foundation. Royalty payments\r\n- must be paid within 60 days following each date on which you\r\n- prepare (or are legally required to prepare) your periodic tax\r\n- returns. Royalty payments should be clearly marked as such and\r\n- sent to the Project Gutenberg Literary Archive Foundation at the\r\n- address specified in Section 4, \u0022Information about donations to\r\n- the Project Gutenberg Literary Archive Foundation.\u0022\r\n-\r\n-- You provide a full refund of any money paid by a user who notifies\r\n- you in writing (or by e-mail) within 30 days of receipt that s/he\r\n- does not agree to the terms of the full Project Gutenberg-tm\r\n- License. You must require such a user to return or\r\n- destroy all copies of the works possessed in a physical medium\r\n- and discontinue all use of and all access to other copies of\r\n- Project Gutenberg-tm works.\r\n-\r\n-- You provide, in accordance with paragraph 1.F.3, a full refund of any\r\n- money paid for a work or a replacement copy, if a defect in the\r\n- electronic work is discovered and reported to you within 90 days\r\n- of receipt of the work.\r\n-\r\n-- You comply with all other terms of this agreement for free\r\n- distribution of Project Gutenberg-tm works.\r\n-\r\n-1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm\r\n-electronic work or group of works on different terms than are set\r\n-forth in this agreement, you must obtain permission in writing from\r\n-both the Project Gutenberg Literary Archive Foundation and Michael\r\n-Hart, the owner of the Project Gutenberg-tm trademark. Contact the\r\n-Foundation as set forth in Section 3 below.\r\n-\r\n-1.F.\r\n-\r\n-1.F.1. Project Gutenberg volunteers and employees expend considerable\r\n-effort to identify, do copyright research on, transcribe and proofread\r\n-public domain works in creating the Project Gutenberg-tm\r\n-collection. Despite these efforts, Project Gutenberg-tm electronic\r\n-works, and the medium on which they may be stored, may contain\r\n-\u0022Defects,\u0022 such as, but not limited to, incomplete, inaccurate or\r\n-corrupt data, transcription errors, a copyright or other intellectual\r\n-property infringement, a defective or damaged disk or other medium, a\r\n-computer virus, or computer codes that damage or cannot be read by\r\n-your equipment.\r\n-\r\n-1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the \u0022Right\r\n-of Replacement or Refund\u0022 described in paragraph 1.F.3, the Project\r\n-Gutenberg Literary Archive Foundation, the owner of the Project\r\n-Gutenberg-tm trademark, and any other party distributing a Project\r\n-Gutenberg-tm electronic work under this agreement, disclaim all\r\n-liability to you for damages, costs and expenses, including legal\r\n-fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT\r\n-LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE\r\n-PROVIDED IN PARAGRAPH F3. YOU AGREE THAT THE FOUNDATION, THE\r\n-TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE\r\n-LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR\r\n-INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH\r\n-DAMAGE.\r\n-\r\n-1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a\r\n-defect in this electronic work within 90 days of receiving it, you can\r\n-receive a refund of the money (if any) you paid for it by sending a\r\n-written explanation to the person you received the work from. If you\r\n-received the work on a physical medium, you must return the medium with\r\n-your written explanation. The person or entity that provided you with\r\n-the defective work may elect to provide a replacement copy in lieu of a\r\n-refund. If you received the work electronically, the person or entity\r\n-providing it to you may choose to give you a second opportunity to\r\n-receive the work electronically in lieu of a refund. If the second copy\r\n-is also defective, you may demand a refund in writing without further\r\n-opportunities to fix the problem.\r\n-\r\n-1.F.4. Except for the limited right of replacement or refund set forth\r\n-in paragraph 1.F.3, this work is provided to you 'AS-IS' WITH NO OTHER\r\n-WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\r\n-WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE.\r\n-\r\n-1.F.5. Some states do not allow disclaimers of certain implied\r\n-warranties or the exclusion or limitation of certain types of damages.\r\n-If any disclaimer or limitation set forth in this agreement violates the\r\n-law of the state applicable to this agreement, the agreement shall be\r\n-interpreted to make the maximum disclaimer or limitation permitted by\r\n-the applicable state law. The invalidity or unenforceability of any\r\n-provision of this agreement shall not void the remaining provisions.\r\n-\r\n-1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the\r\n-trademark owner, any agent or employee of the Foundation, anyone\r\n-providing copies of Project Gutenberg-tm electronic works in accordance\r\n-with this agreement, and any volunteers associated with the production,\r\n-promotion and distribution of Project Gutenberg-tm electronic works,\r\n-harmless from all liability, costs and expenses, including legal fees,\r\n-that arise directly or indirectly from any of the following which you do\r\n-or cause to occur: (a) distribution of this or any Project Gutenberg-tm\r\n-work, (b) alteration, modification, or additions or deletions to any\r\n-Project Gutenberg-tm work, and (c) any Defect you cause.\r\n-\r\n-\r\n-Section 2. Information about the Mission of Project Gutenberg-tm\r\n-\r\n-Project Gutenberg-tm is synonymous with the free distribution of\r\n-electronic works in formats readable by the widest variety of computers\r\n-including obsolete, old, middle-aged and new computers. It exists\r\n-because of the efforts of hundreds of volunteers and donations from\r\n-people in all walks of life.\r\n-\r\n-Volunteers and financial support to provide volunteers with the\r\n-assistance they need, is critical to reaching Project Gutenberg-tm's\r\n-goals and ensuring that the Project Gutenberg-tm collection will\r\n-remain freely available for generations to come. In 2001, the Project\r\n-Gutenberg Literary Archive Foundation was created to provide a secure\r\n-and permanent future for Project Gutenberg-tm and future generations.\r\n-To learn more about the Project Gutenberg Literary Archive Foundation\r\n-and how your efforts and donations can help, see Sections 3 and 4\r\n-and the Foundation web page at http://www.pglaf.org.\r\n-\r\n-\r\n-Section 3. Information about the Project Gutenberg Literary Archive\r\n-Foundation\r\n-\r\n-The Project Gutenberg Literary Archive Foundation is a non profit\r\n-501(c)(3) educational corporation organized under the laws of the\r\n-state of Mississippi and granted tax exempt status by the Internal\r\n-Revenue Service. The Foundation's EIN or federal tax identification\r\n-number is 64-6221541. Its 501(c)(3) letter is posted at\r\n-http://pglaf.org/fundraising. Contributions to the Project Gutenberg\r\n-Literary Archive Foundation are tax deductible to the full extent\r\n-permitted by U.S. federal laws and your state's laws.\r\n-\r\n-The Foundation's principal office is located at 4557 Melan Dr. S.\r\n-Fairbanks, AK, 99712., but its volunteers and employees are scattered\r\n-throughout numerous locations. Its business office is located at\r\n-809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email\r\n-business@pglaf.org. Email contact links and up to date contact\r\n-information can be found at the Foundation's web site and official\r\n-page at http://pglaf.org\r\n-\r\n-For additional contact information:\r\n- Dr. Gregory B. Newby\r\n- Chief Executive and Director\r\n- gbnewby@pglaf.org\r\n-\r\n-\r\n-Section 4. Information about Donations to the Project Gutenberg\r\n-Literary Archive Foundation\r\n-\r\n-Project Gutenberg-tm depends upon and cannot survive without wide\r\n-spread public support and donations to carry out its mission of\r\n-increasing the number of public domain and licensed works that can be\r\n-freely distributed in machine readable form accessible by the widest\r\n-array of equipment including outdated equipment. Many small donations\r\n-($1 to $5,000) are particularly important to maintaining tax exempt\r\n-status with the IRS.\r\n-\r\n-The Foundation is committed to complying with the laws regulating\r\n-charities and charitable donations in all 50 states of the United\r\n-States. Compliance requirements are not uniform and it takes a\r\n-considerable effort, much paperwork and many fees to meet and keep up\r\n-with these requirements. We do not solicit donations in locations\r\n-where we have not received written confirmation of compliance. To\r\n-SEND DONATIONS or determine the status of compliance for any\r\n-particular state visit http://pglaf.org\r\n-\r\n-While we cannot and do not solicit contributions from states where we\r\n-have not met the solicitation requirements, we know of no prohibition\r\n-against accepting unsolicited donations from donors in such states who\r\n-approach us with offers to donate.\r\n-\r\n-International donations are gratefully accepted, but we cannot make\r\n-any statements concerning tax treatment of donations received from\r\n-outside the United States. U.S. laws alone swamp our small staff.\r\n-\r\n-Please check the Project Gutenberg Web pages for current donation\r\n-methods and addresses. Donations are accepted in a number of other\r\n-ways including including checks, online payments and credit card\r\n-donations. To donate, please visit: http://pglaf.org/donate\r\n-\r\n-\r\n-Section 5. General Information About Project Gutenberg-tm electronic\r\n-works.\r\n-\r\n-Professor Michael S. Hart is the originator of the Project Gutenberg-tm\r\n-concept of a library of electronic works that could be freely shared\r\n-with anyone. For thirty years, he produced and distributed Project\r\n-Gutenberg-tm eBooks with only a loose network of volunteer support.\r\n-\r\n-\r\n-Project Gutenberg-tm eBooks are often created from several printed\r\n-editions, all of which are confirmed as Public Domain in the U.S.\r\n-unless a copyright notice is included. Thus, we do not necessarily\r\n-keep eBooks in compliance with any particular paper edition.\r\n-\r\n-\r\n-Most people start at our Web site which has the main PG search facility:\r\n-\r\n- http://www.gutenberg.net\r\n-\r\n-This Web site includes information about Project Gutenberg-tm,\r\n-including how to make donations to the Project Gutenberg Literary\r\n-Archive Foundation, how to help produce our new eBooks, and how to\r\n-subscribe to our email newsletter to hear about new eBooks.\r\ndiff --git a/minimal-examples/api-tests/api-test-gencrypto/CMakeLists.txt b/minimal-examples/api-tests/api-test-gencrypto/CMakeLists.txt\ndeleted file mode 100644\nindex a3678d5..0000000\n--- a/minimal-examples/api-tests/api-test-gencrypto/CMakeLists.txt\n+++ /dev/null\n@@ -1,28 +0,0 @@\n-project(lws-api-test-gencrypto C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-gencrypto)\n-set(SRCS main.c lws-genaes.c lws-genec.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_GENCRYPTO 1 requirements)\n-require_lws_config(LWS_WITH_JOSE 1 requirements)\n-require_lws_config(USE_WOLFSSL 0 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\tadd_test(NAME api-test-gencrypto COMMAND lws-api-test-gencrypto)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\n-\ndiff --git a/minimal-examples/api-tests/api-test-gencrypto/README.md b/minimal-examples/api-tests/api-test-gencrypto/README.md\ndeleted file mode 100644\nindex ab8ff0b..0000000\n--- a/minimal-examples/api-tests/api-test-gencrypto/README.md\n+++ /dev/null\n@@ -1,26 +0,0 @@\n-# lws api test gencrypto\n-\n-Demonstrates how to use and performs selftests for Generic Crypto,\n-which works the same whether the tls backend is OpenSSL or mbedTLS\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-gencrypto\n-[2018/12/05 08:30:27:1342] USER: LWS gencrypto apis tests\n-[2018/12/05 08:30:27:1343] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n-[2018/12/05 08:30:27:1343] NOTICE: created client ssl context for default\n-[2018/12/05 08:30:27:1344] NOTICE: test_genaes: selftest OK\n-[2018/12/05 08:30:27:1344] USER: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-gencrypto/lws-genaes.c b/minimal-examples/api-tests/api-test-gencrypto/lws-genaes.c\ndeleted file mode 100644\nindex e7f2aa2..0000000\n--- a/minimal-examples/api-tests/api-test-gencrypto/lws-genaes.c\n+++ /dev/null\n@@ -1,825 +0,0 @@\n-/*\n- * lws-api-test-gencrypto - lws-genaes\n- *\n- * Written in 2010-2018 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CBC))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cbc))\n-\n-static const uint8_t\n-\t/*\n-\t * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n-\t *\n-\t * openssl enc -aes256 \u005c\n-\t * -K \u00220123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210\u0022 \u005c\n-\t * -iv \u00220123456789abcdeffedcba9876543210\u0022\n-\t * -in plaintext.txt -out out.enc\n-\t *\n-\t */\n-\t*cbc256\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n-\tcbc256_enc[] \u003d {\n-\t\t0x2b, 0x5d, 0xb2, 0xa8, 0x5a, 0x5a, 0xf4, 0x2e,\n-\t\t0xf7, 0xf9, 0xc5, 0x3c, 0x73, 0xef, 0x40, 0x88,\n-\t}, cbc256_iv[] \u003d {\n-\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-\t}, cbc256_key[] \u003d {\n-\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-\t}\n-;\n-\n-static int\n-test_genaes_cbc(void)\n-{\n-\tstruct lws_genaes_ctx ctx;\n-\tstruct lws_gencrypto_keyelem e;\n-\tuint8_t res[32], res1[32];\n-\n-\t/*\n-\t * As part of a jwk, these are allocated. But here we just use one as\n-\t * a wrapper on a static binary key.\n-\t */\n-\te.buf \u003d (uint8_t *)cbc256_key;\n-\te.len \u003d sizeof(cbc256_key);\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_CBC, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, cbc256, 16, res, (uint8_t *)cbc256_iv,\n-\t\t\t NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy enc failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(cbc256_enc, res, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CBC, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, (uint8_t *)cbc256_iv,\n-\t\t\t NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy dec failed\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res1, 16);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(cbc256, res1, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n-\n-\treturn -1;\n-}\n-#endif\n-\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cfb128))\n-static const uint8_t\n-/*\n- * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n- *\n- * openssl enc -aes-128-cfb \u005c\n- * -K \u00220123456789abcdeffedcba9876543210\u0022 \u005c\n- * -iv \u00220123456789abcdeffedcba9876543210\u0022\n- * -in plaintext.txt -out out.enc\n- *\n- */\n-*cfb128\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n-cfb128_enc[] \u003d {\n-\t0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,\n-\t0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71\n-}, cfb128_iv[] \u003d {\n-\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-}, cfb128_key[] \u003d {\n-\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-};\n-\n-static int\n-test_genaes_cfb128(void)\n-{\n-\tstruct lws_genaes_ctx ctx;\n-\tstruct lws_gencrypto_keyelem e;\n-\tuint8_t res[32], res1[32];\n-\tsize_t iv_off \u003d 0;\n-\n-\te.buf \u003d (uint8_t *)cfb128_key;\n-\te.len \u003d sizeof(cfb128_key);\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_CFB128, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, cfb128, 16, res, (uint8_t *)cfb128_iv,\n-\t\t\t NULL, \u0026iv_off, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(cfb128_enc, res, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\tiv_off \u003d 0;\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CFB128, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, (uint8_t *)cfb128_iv,\n-\t\t\t NULL, \u0026iv_off, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(cfb128, res1, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res1, 16);\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n-\n-\treturn -1;\n-}\n-#endif\n-\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cfb8))\n-\n-static const uint8_t\n-/*\n- * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n- *\n- * openssl enc -aes-128-cfb8 \u005c\n- * -K \u00220123456789abcdeffedcba9876543210\u0022 \u005c\n- * -iv \u00220123456789abcdeffedcba9876543210\u0022\n- * -in plaintext.txt -out out.enc\n- *\n- */\n-*cfb8\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n-cfb8_enc[] \u003d {\n-\t0xd2, 0x91, 0x06, 0x2d, 0x1b, 0x1e, 0x9b, 0x39,\n-\t0xa6, 0x65, 0x8e, 0xbe, 0x68, 0x32, 0x3d, 0xab\n-}, cfb8_iv[] \u003d {\n-\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-}, cfb8_key[] \u003d {\n-\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-};\n-\n-static int\n-test_genaes_cfb8(void)\n-{\n-\tstruct lws_genaes_ctx ctx;\n-\tstruct lws_gencrypto_keyelem e;\n-\tuint8_t res[32], res1[32];\n-\n-\te.buf \u003d (uint8_t *)cfb8_key;\n-\te.len \u003d sizeof(cfb8_key);\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_CFB8, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, cfb8, 16, res, (uint8_t *)cfb8_iv,\n-\t\t\t NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(cfb8_enc, res, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CFB8, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, (uint8_t *)cfb8_iv,\n-\t\t\t NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(cfb8, res1, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res1, 16);\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n-\n-\treturn -1;\n-}\n-#endif\n-\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CTR))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ctr))\n-static const uint8_t\n-/*\n- * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n- *\n- * openssl enc -aes-128-ctr \u005c\n- * -K \u00220123456789abcdeffedcba9876543210\u0022 \u005c\n- * -iv \u00220123456789abcdeffedcba9876543210\u0022\n- * -in plaintext.txt -out out.enc\n- *\n- */\n-*ctr\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n-ctr_enc[] \u003d {\n-\t0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,\n-\t0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71\n-}, ctr_iv[] \u003d {\n-\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-}, ctr_key[] \u003d {\n-\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-};\n-\n-static int\n-test_genaes_ctr(void)\n-{\n-\tuint8_t nonce_counter[16], sb[16];\n-\tstruct lws_genaes_ctx ctx;\n-\tstruct lws_gencrypto_keyelem e;\n-\tuint8_t res[32], res1[32];\n-\tsize_t nc_off \u003d 0;\n-\n-\te.buf \u003d (uint8_t *)ctr_key;\n-\te.len \u003d sizeof(ctr_key);\n-\n-\tmemset(sb, 0, sizeof(nonce_counter));\n-\tmemcpy(nonce_counter, ctr_iv, sizeof(ctr_iv));\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_CTR, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, ctr, 16, res, nonce_counter, sb, \u0026nc_off, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(ctr_enc, res, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\tnc_off \u003d 0;\n-\tmemset(sb , 0, sizeof(nonce_counter));\n-\tmemcpy(nonce_counter, ctr_iv, sizeof(ctr_iv));\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CTR, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, nonce_counter, sb, \u0026nc_off, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(ctr, res1, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res1, 16);\n-\t\treturn -1;\n-\t}\n-\n-\tlws_explicit_bzero(sb, sizeof(sb));\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n-\n-\treturn -1;\n-}\n-#endif\n-\n-#if (defined(LWS_WITH_MBEDTLS)) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ecb))\n-static const uint8_t\n-/*\n- * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n- *\n- * openssl enc -aes-128-ecb \u005c\n- * -K \u00220123456789abcdeffedcba9876543210\u0022 \u005c\n- * -in plaintext.txt -out out.enc\n- *\n- */\n-*ecb\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n-ecb_enc[] \u003d {\n-\t0xf3, 0xe5, 0x6c, 0x80, 0x3a, 0xf1, 0xc4, 0xa0,\n-\t0x7e, 0xdf, 0x86, 0x0f, 0x6d, 0xca, 0x5d, 0x36,\n-\t0x17, 0x22, 0x37, 0x42, 0x47, 0x41, 0x67, 0x7d,\n-\t0x99, 0x25, 0x02, 0x6b, 0x6b, 0x8f, 0x9c, 0x7f\n-}, ecb_key[] \u003d {\n-\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-};\n-\n-static int\n-test_genaes_ecb(void)\n-{\n-\tstruct lws_genaes_ctx ctx;\n-\tstruct lws_gencrypto_keyelem e;\n-\tuint8_t res[32], res1[32];\n-\n-\t/*\n-\t * As part of a jwk, these are allocated. But here we just use one as\n-\t * a wrapper on a static binary key.\n-\t */\n-\te.buf \u003d (uint8_t *)ecb_key;\n-\te.len \u003d sizeof(ecb_key);\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_ECB, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, ecb, 16, res, NULL, NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(ecb_enc, res, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_ECB, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, NULL, NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(ecb, res1, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n-\n-\treturn -1;\n-}\n-#endif\n-\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_OFB))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ofb))\n-static const uint8_t\n-\t/*\n-\t * produced with (plaintext.txt contains \u0022test plaintext\u005c0\u005c0\u0022)\n-\t *\n-\t * openssl enc -aes-128-ofb \u005c\n-\t * -K \u00220123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210\u0022 \u005c\n-\t * -iv \u00220123456789abcdeffedcba9876543210\u0022\n-\t * -in plaintext.txt -out out.enc\n-\t *\n-\t */\n-\t*ofb\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n-\tofb_enc[] \u003d {\n-\t\t/* !!! ugh... openssl app produces this... */\n-\t\t// 0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04,\n-\t\t// 0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71,\n-\t\t/* but both OpenSSL and mbedTLS produce this */\n-\t\t0x11, 0x33, 0x6D, 0xFC, 0x88, 0x4C, 0x28, 0xBA,\n-\t\t0xD0, 0xF2, 0x6C, 0xBC, 0xDE, 0x4A, 0x56, 0x20\n-\t}, ofb_iv[] \u003d {\n-\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-\t}, ofb_key[] \u003d {\n-\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-\t\t0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n-\t\t0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n-\t}\n-;\n-static int\n-test_genaes_ofb(void)\n-{\n-\tstruct lws_genaes_ctx ctx;\n-\tstruct lws_gencrypto_keyelem e;\n-\tuint8_t res[32], res1[32];\n-\tsize_t iv_off \u003d 0;\n-\n-\te.buf \u003d (uint8_t *)ofb_key;\n-\te.len \u003d sizeof(ofb_key);\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_OFB, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, ofb, 16, res, (uint8_t *)ofb_iv, NULL,\n-\t\t\t \u0026iv_off, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(ofb_enc, res, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\tiv_off \u003d 0;\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_OFB, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, (uint8_t *)ofb_iv, NULL,\n-\t\t\t \u0026iv_off, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(ofb, res1, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n-\n-\treturn -1;\n-}\n-\n-#endif\n-\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_XTS))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_xts))\n-\n-static const uint8_t\n-\t/*\n-\t * Fedora openssl tool doesn't support xts... this data produced\n-\t * by testing on mbedtls + OpenSSL and getting the same result\n-\t *\n-\t * NOTICE that xts requires a double-length key... OpenSSL now checks\n-\t * the key for duplication so we use a random key\n-\t */\n-\t*xts\t\u003d (uint8_t *)\u0022test plaintext\u005c0\u005c0\u0022,\n-\txts_enc[] \u003d {\n-\t\t0x87, 0x83, 0x20, 0x8B, 0x15, 0x89, 0xA1, 0x13,\n-\t\t0xDC, 0xEA, 0x82, 0xB6, 0xFF, 0x8D, 0x76, 0x3A\n-\t}, xts_key[] \u003d {\n-\t\t0xa4, 0xd6, 0xa2, 0x1a, 0x3b, 0x34, 0x34, 0x43,\n-\t\t0x9a, 0xe2, 0x6a, 0x01, 0x1c, 0x73, 0x80, 0x3b,\n-\t\t0xdd, 0xf6, 0xd4, 0x37, 0x5e, 0x0e, 0x1c, 0x72,\n-\t\t0x8e, 0xe5, 0x18, 0x69, 0xfd, 0x08, 0x40, 0x2b,\n-\t\t0x98, 0xf9, 0x75, 0xa8, 0x36, 0xd5, 0x0f, 0xa2,\n-\t\t0x20, 0x04, 0x43, 0xa7, 0x3a, 0xa6, 0x4a, 0xdc,\n-\t\t0xe9, 0x54, 0x50, 0xfa, 0x38, 0xad, 0x6d, 0x96,\n-\t\t0x5f, 0x31, 0x9e, 0xcd, 0x33, 0x08, 0xa0, 0x44\n-\t}\n-;\n-static int\n-test_genaes_xts(void)\n-{\n-\n-\tstruct lws_genaes_ctx ctx;\n-\tstruct lws_gencrypto_keyelem e;\n-\tuint8_t res[32], res1[32], data_unit[16];\n-\n-\tmemset(data_unit, 0, sizeof(data_unit));\n-\n-\te.buf \u003d (uint8_t *)xts_key;\n-\te.len \u003d sizeof(xts_key);\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_XTS, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, xts, 16, res, data_unit, NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(xts_enc, res, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_XTS, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, res, 16, res1, data_unit, NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt dec failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(xts, res1, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n-\n-\treturn -1;\n-}\n-#endif\n-\n-static const uint8_t\n-\t/*\n-\t * https://csrc.nist.gov/CSRC/media/Projects/\n-\t * Cryptographic-Algorithm-Validation-Program/\n-\t * documents/mac/gcmtestvectors.zip\n-\t */\n-\n-\tgcm_ct[] \u003d {\n-\t\t0xf7, 0x26, 0x44, 0x13, 0xa8, 0x4c, 0x0e, 0x7c,\n-\t\t0xd5, 0x36, 0x86, 0x7e, 0xb9, 0xf2, 0x17, 0x36\n-\t}, gcm_iv[] \u003d {\n-\t\t0x99, 0xaa, 0x3e, 0x68, 0xed, 0x81, 0x73, 0xa0,\n-\t\t0xee, 0xd0, 0x66, 0x84\n-\t}, gcm_key[] \u003d {\n-\t\t0xee, 0xbc, 0x1f, 0x57, 0x48, 0x7f, 0x51, 0x92,\n-\t\t0x1c, 0x04, 0x65, 0x66, 0x5f, 0x8a, 0xe6, 0xd1,\n-\t\t0x65, 0x8b, 0xb2, 0x6d, 0xe6, 0xf8, 0xa0, 0x69,\n-\t\t0xa3, 0x52, 0x02, 0x93, 0xa5, 0x72, 0x07, 0x8f\n-\t}, gcm_pt[] \u003d {\n-\t\t0xf5, 0x6e, 0x87, 0x05, 0x5b, 0xc3, 0x2d, 0x0e,\n-\t\t0xeb, 0x31, 0xb2, 0xea, 0xcc, 0x2b, 0xf2, 0xa5\n-\t}, gcm_aad[] \u003d {\n-\t\t0x4d, 0x23, 0xc3, 0xce, 0xc3, 0x34, 0xb4, 0x9b,\n-\t\t0xdb, 0x37, 0x0c, 0x43, 0x7f, 0xec, 0x78, 0xde\n-\t}, gcm_tag[] \u003d {\n-\t\t0x67, 0xba, 0x05, 0x10, 0x26, 0x2a, 0xe4, 0x87,\n-\t\t0xd7, 0x37, 0xee, 0x62, 0x98, 0xf7, 0x7e, 0x0c\n-\t};\n-\n-static int\n-test_genaes_gcm(void)\n-{\n-\tuint8_t res[sizeof(gcm_ct)], tag[sizeof(gcm_tag)];\n-\tstruct lws_genaes_ctx ctx;\n-\tstruct lws_gencrypto_keyelem e;\n-\tsize_t iv_off \u003d 0;\n-\n-\te.buf \u003d (uint8_t *)gcm_key;\n-\te.len \u003d sizeof(gcm_key);\n-\n-\t/* Encrypt */\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_ENC, LWS_GAESM_GCM, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\t/* first we set the iv and aad */\n-\n-\tiv_off \u003d sizeof(gcm_iv);\n-\tif (lws_genaes_crypt(\u0026ctx, gcm_aad, sizeof(gcm_aad), NULL,\n-\t\t\t (uint8_t *)gcm_iv, (uint8_t *)gcm_tag,\n-\t\t\t \u0026iv_off, sizeof(gcm_tag))) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt 1 failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, gcm_pt, sizeof(gcm_pt), res,\n-\t\t\t NULL, NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt 2 failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, tag, sizeof(tag))) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy enc failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(gcm_ct, res, sizeof(gcm_ct))) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, sizeof(gcm_ct));\n-\t\treturn -1;\n-\t}\n-\n-\n-\t/* Decrypt */\n-\n-\tif (lws_genaes_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_GCM, \u0026e, 0, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_create failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tiv_off \u003d sizeof(gcm_iv); /* initial call sets iv + aad + tag */\n-\tif (lws_genaes_crypt(\u0026ctx, gcm_aad, sizeof(gcm_aad), NULL,\n-\t\t\t (uint8_t *)gcm_iv, (uint8_t *)gcm_tag,\n-\t\t\t \u0026iv_off, sizeof(gcm_tag))) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt 1 failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_crypt(\u0026ctx, gcm_ct, sizeof(gcm_ct), res,\n-\t\t\t NULL, NULL, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt 2 failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_genaes_destroy(\u0026ctx, tag, sizeof(tag))) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_destroy dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(gcm_pt, res, sizeof(gcm_pt))) {\n-\t\tlwsl_err(\u0022%s: lws_genaes_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, sizeof(gcm_ct));\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_genaes_destroy(\u0026ctx, NULL, 0);\n-\n-\treturn -1;\n-}\n-\n-int\n-test_genaes(struct lws_context *context)\n-{\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CBC))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cbc))\n-\tif (test_genaes_cbc())\n-\t\tgoto bail;\n-#endif\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cfb128))\n-\tif (test_genaes_cfb128())\n-\t\tgoto bail;\n-#endif\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_cfb8))\n-\tif (test_genaes_cfb8())\n-\t\tgoto bail;\n-#endif\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CTR))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ctr))\n-\tif (test_genaes_ctr())\n-\t\tgoto bail;\n-#endif\n-#if (defined(LWS_WITH_MBEDTLS)) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ecb))\n-\tif (test_genaes_ecb())\n-\t\tgoto bail;\n-#endif\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_OFB))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_ofb))\n-\tif (test_genaes_ofb())\n-\t\tgoto bail;\n-#endif\n-#if (defined(LWS_WITH_MBEDTLS) \u0026\u0026 (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_XTS))) || \u005c\n- (!defined(LWS_WITH_MBEDTLS) \u0026\u0026 defined(LWS_HAVE_EVP_aes_128_xts))\n-\tif (test_genaes_xts())\n-\t\tgoto bail;\n-#endif\n-\n-\tif (test_genaes_gcm())\n-\t\tgoto bail;\n-\n-\t/* end */\n-\n-\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-gencrypto/lws-genec.c b/minimal-examples/api-tests/api-test-gencrypto/lws-genec.c\ndeleted file mode 100644\nindex 57ab78b..0000000\n--- a/minimal-examples/api-tests/api-test-gencrypto/lws-genec.c\n+++ /dev/null\n@@ -1,132 +0,0 @@\n-/*\n- * lws-api-test-gencrypto - lws-genec\n- *\n- * Written in 2010-2018 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-static const uint8_t\n-\t*jwk_ec1 \u003d (uint8_t *)\n-\t\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u00224Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022use\u005c\u0022:\u005c\u0022enc\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u0022rfc7517-A.2-example private key\u005c\u0022}\u0022\n-;\n-\n-static int\n-test_genec1(struct lws_context *context)\n-{\n-\tstruct lws_genec_ctx ctx;\n-\tstruct lws_jwk jwk;\n-\tstruct lws_gencrypto_keyelem el[LWS_GENCRYPTO_EC_KEYEL_COUNT];\n-\t//uint8_t res[32], res1[32];\n-\tint n;\n-\n-\tmemset(el, 0, sizeof(el));\n-\n-\tif (lws_genecdh_create(\u0026ctx, context, NULL))\n-\t\treturn 1;\n-\n-\t/* let's create a new key */\n-\n-\tif (lws_genecdh_new_keypair(\u0026ctx, LDHS_OURS, \u0022P-256\u0022, el)) {\n-\t\tlwsl_err(\u0022%s: lws_genec_new_keypair failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tlws_genec_dump(el);\n-\tlws_genec_destroy_elements(el);\n-\n-\tlws_genec_destroy(\u0026ctx);\n-\n-\tif (lws_jwk_import(\u0026jwk, NULL, NULL, (char *)jwk_ec1,\n-\t\t\t strlen((char *)jwk_ec1)) \u003c 0) {\n-\t\tlwsl_notice(\u0022Failed to decode JWK test key\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tlws_jwk_dump(\u0026jwk);\n-\n-\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_EC) {\n-\t\tlws_jwk_destroy(\u0026jwk);\n-\t\tlwsl_err(\u0022%s: jwk is not an EC key\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_genecdh_create(\u0026ctx, context, NULL))\n-\t\treturn 1;\n-\n-\tn \u003d lws_genecdh_set_key(\u0026ctx, jwk.e, LDHS_OURS);\n-\tif (n) {\n-\t\tlws_jwk_destroy(\u0026jwk);\n-\t\tlwsl_err(\u0022%s: lws_genec_create failed: %d\u005cn\u0022, __func__, n);\n-\t\treturn 1;\n-\t}\n-#if 0\n-\tif (lws_genec_crypt(\u0026ctx, cbc256, 16, res, (uint8_t *)cbc256_iv,\n-\t\t\t NULL, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genec_crypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(cbc256_enc, res, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genec_crypt encoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_genec_destroy(\u0026ctx);\n-\n-\tif (lws_genec_create(\u0026ctx, LWS_GAESO_DEC, LWS_GAESM_CBC, \u0026e, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genec_create dec failed\u005cn\u0022, __func__);\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_genec_crypt(\u0026ctx, res, 16, res1, (uint8_t *)cbc256_iv,\n-\t\t\t NULL, NULL)) {\n-\t\tlwsl_err(\u0022%s: lws_genec_crypt dec failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_timingsafe_bcmp(cbc256, res1, 16)) {\n-\t\tlwsl_err(\u0022%s: lws_genec_crypt decoding mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(res, 16);\n-\t\tgoto bail;\n-\t}\n-#endif\n-\tlws_genec_destroy(\u0026ctx);\n-\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\treturn 0;\n-\n-//bail:\n-//\tlws_genec_destroy(\u0026ctx);\n-\n-//\treturn -1;\n-}\n-\n-int\n-test_genec(struct lws_context *context)\n-{\n-\tif (test_genec1(context))\n-\t\tgoto bail;\n-\n-\t/* end */\n-\n-\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-gencrypto/main.c b/minimal-examples/api-tests/api-test-gencrypto/main.c\ndeleted file mode 100644\nindex 8203190..0000000\n--- a/minimal-examples/api-tests/api-test-gencrypto/main.c\n+++ /dev/null\n@@ -1,50 +0,0 @@\n-/*\n- * lws-api-test-gencrypto\n- *\n- * Written in 2010-2018 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-int\n-test_genaes(struct lws_context *context);\n-int\n-test_genec(struct lws_context *context);\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tconst char *p;\n-\tint result \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS gencrypto apis tests\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tresult |\u003d test_genaes(context);\n-\tresult |\u003d test_genec(context);\n-\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, result ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-jose/CMakeLists.txt b/minimal-examples/api-tests/api-test-jose/CMakeLists.txt\ndeleted file mode 100644\nindex 3a53382..0000000\n--- a/minimal-examples/api-tests/api-test-jose/CMakeLists.txt\n+++ /dev/null\n@@ -1,28 +0,0 @@\n-project(lws-api-test-jose C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-jose)\n-set(SRCS main.c jwk.c jws.c jwe.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_JOSE 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (NOT (LWS_WITH_MBEDTLS AND NOT LWS_HAVE_mbedtls_internal_aes_encrypt))\n-\t\tadd_test(NAME api-test-jose COMMAND lws-api-test-jose)\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-jose/README.md b/minimal-examples/api-tests/api-test-jose/README.md\ndeleted file mode 100644\nindex 74034c7..0000000\n--- a/minimal-examples/api-tests/api-test-jose/README.md\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-# lws api test lwsac\n-\n-Demonstrates how to use and performs selftests for lwsac\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-lwsac\n-[2018/10/09 09:14:17:4834] USER: LWS API selftest: lwsac\n-[2018/10/09 09:14:17:4835] USER: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-jose/jwe.c b/minimal-examples/api-tests/api-test-jose/jwe.c\ndeleted file mode 100644\nindex e403b2d..0000000\n--- a/minimal-examples/api-tests/api-test-jose/jwe.c\n+++ /dev/null\n@@ -1,2297 +0,0 @@\n-/*\n- * lws-api-test-jose - RFC7516 jwe tests\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-/*\n- * These are the inputs and outputs from the worked example in RFC7516\n- * Appendix A.1 {\u0022alg\u0022:\u0022RSA-OAEP\u0022,\u0022enc\u0022:\u0022A256GCM\u0022}\n- */\n-\n-\n-static char\n-\n-*ex_a1_ptext \u003d\n-\t\u0022The true sign of intelligence is not knowledge but imagination.\u0022,\n-\n-*ex_a1_compact \u003d\n-\t\u0022eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.\u0022\n-\t\u0022OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe\u0022\n-\t\u0022ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb\u0022\n-\t\u0022Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV\u0022\n-\t\u0022mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8\u0022\n-\t\u00221860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi\u0022\n-\t\u00226UklfCpIMfIjf7iGdXKHzg.\u0022\n-\t\u002248V1_ALb6US04U3b.\u0022\n-\t\u00225eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji\u0022\n-\t\u0022SdiwkIr3ajwQzaBtQD_A.\u0022\n-\t\u0022XFBoMYUZodetZdvTiFvSkQ\u0022,\n-\n-\t*ex_a1_jwk_json \u003d\n-\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u0022oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUW\u0022\n-\t\t\u0022cJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3S\u0022\n-\t\t\u0022psk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2a\u0022\n-\t\t\u0022sbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMS\u0022\n-\t\t\u0022tPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2dj\u0022\n-\t\t\u0022YgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-WY5N\u0022\n-\t\t\u0022WV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD9\u0022\n-\t\t\u00223Dt62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghk\u0022\n-\t\t\u0022qDp0Vqj3kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vl\u0022\n-\t\t\u0022t3UVe4WO3JkJOzlpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-VFs3VSnd\u0022\n-\t\t\u0022VTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022p\u005c\u0022:\u005c\u00221r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ-\u0022\n-\t\t\u0022SWxkbkmoEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lf\u0022\n-\t\t\u0022fNn03IXqWF5MDFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022q\u005c\u0022:\u005c\u0022wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBm\u0022\n-\t\t\u0022UDdaDYVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aX\u0022\n-\t\t\u0022IWxKwd4gvxFImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022ZK-YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KL\u0022\n-\t\t\u0022hMXvo-uz-KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827\u0022\n-\t\t\u0022rnpZzAJKpdhWAgqrXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCj\u0022\n-\t\t\u0022ywcMlYYg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDB\u0022\n-\t\t\u0022UfCAiJVeESOjJDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7\u0022\n-\t\t\u0022AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3\u0022\n-\t\t\u0022eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY\u005c\u0022\u0022\n-\t\u0022}\u0022\n-;\n-\n-static int\n-test_jwe_a1(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[2048], compact[2048];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, ex_a1_jwk_json,\n-\t\t\t strlen(ex_a1_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* converts a compact serialization to jws b64 + decoded maps */\n-\tif (lws_jws_compact_decode(ex_a1_compact, (int)strlen(ex_a1_compact),\n-\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64, temp,\n-\t\t\t\t \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c strlen(ex_a1_ptext) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a1_ptext,\n-\t\t\t (uint32_t)strlen(ex_a1_ptext))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ex_a1_ptext, strlen(ex_a1_ptext));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * Canned decrypt worked properly... let's also try encoding the\n-\t * plaintext ourselves and decoding that...\n-\t */\n-\tlws_jwe_destroy(\u0026jwe);\n-\ttemp_len \u003d sizeof(temp);\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, ex_a1_jwk_json,\n-\t\t\t strlen(ex_a1_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_gencrypto_jwe_alg_to_definition(\u0022RSA-OAEP\u0022, \u0026jwe.jose.alg)) {\n-\t\tlwsl_err(\u0022Unknown cipher alg \u005c\u0022RSA-OAEP\u005c\u0022\u005cn\u0022);\n-\t\tgoto bail;\n-\t}\n-\tif (lws_gencrypto_jwe_enc_to_definition(\u0022A256GCM\u0022, \u0026jwe.jose.enc_alg)) {\n-\t\tlwsl_err(\u0022Unknown payload enc alg \u005c\u0022A256GCM\u005c\u0022\u005cn\u0022);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* we require a JOSE-formatted header to do the encryption */\n-\n-\tjwe.jws.map.buf[LJWS_JOSE] \u003d temp;\n-\tjwe.jws.map.len[LJWS_JOSE] \u003d (uint32_t)lws_snprintf(temp, (unsigned int)temp_len,\n-\t\t\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022%s\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022, \u0022RSA-OAEP\u0022, \u0022A256GCM\u0022);\n-\ttemp_len -\u003d (int)jwe.jws.map.len[LJWS_JOSE];\n-\n-\t/*\n-\t * dup the plaintext into the ciphertext element, it will be\n-\t * encrypted in-place to a ciphertext of the same length\n-\t */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tex_a1_ptext, strlen(ex_a1_ptext), 0)) {\n-\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* CEK size is determined by hash / hmac size */\n-\n-\tn \u003d lws_gencrypto_bits_to_bytes(jwe.jose.enc_alg-\u003ekeybits_fixed);\n-\tif (lws_jws_randomize_element(context, \u0026jwe.jws.map, LJWE_EKEY,\n-\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len, (unsigned int)n,\n-\t\t\t\t LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n-\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022,\n-\t\t\t __func__, n);\n-\t\tgoto bail;\n-\t}\n-\n-\t// puts(compact);\n-\n-\t/*\n-\t * Okay... what happens when we try to decode what we created?\n-\t */\n-\n-\tlws_jwe_destroy(\u0026jwe);\n-\tlws_jwe_init(\u0026jwe, context);\n-\ttemp_len \u003d sizeof(temp);\n-\n-\t/* converts a compact serialization to jws b64 + decoded maps */\n-\tif (lws_jws_compact_decode(compact, (int)strlen(compact), \u0026jwe.jws.map,\n-\t\t\t\t \u0026jwe.jws.map_b64, temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, ex_a1_jwk_json,\n-\t\t\t strlen(ex_a1_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: generated lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-\n-/* A.2. Example JWE using RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256\n- *\n- * This example encrypts the plaintext \u0022Live long and prosper.\u0022 to the\n- * recipient using RSAES-PKCS1-v1_5 for key encryption and\n- * AES_128_CBC_HMAC_SHA_256 for content encryption.\n- */\n-\n-/* \u0022Live long and prosper.\u0022 */\n-static uint8_t\n-\n-ex_a2_ptext[] \u003d {\n-\t76, 105, 118, 101, 32, 108, 111, 110,\n-\t103, 32, 97, 110, 100, 32, 112, 114,\n-\t111, 115, 112, 101, 114, 46\n-}, *lws_jwe_ex_a2_jwk_json \u003d (uint8_t *)\n-\t\u0022{\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u0022sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1Wl\u0022\n-\t\t \u0022UzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDpre\u0022\n-\t\t \u0022cbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_\u0022\n-\t\t \u00227svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBI\u0022\n-\t\t \u0022Y2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU\u0022\n-\t\t \u00227-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022VFCWOqXr8nvZNyaaJLXdnNPXZKRaWCjkU5Q2egQQpTBMwhprMzWzpR8Sxq\u0022\n-\t\t \u00221OPThh_J6MUD8Z35wky9b8eEO0pwNS8xlh1lOFRRBoNqDIKVOku0aZb-ry\u0022\n-\t\t \u0022nq8cxjDTLZQ6Fz7jSjR1Klop-YKaUHc9GsEofQqYruPhzSA-QgajZGPbE_\u0022\n-\t\t \u00220ZaVDJHfyd7UUBUKunFMScbflYAAOYJqVIVwaYR5zWEEceUjNnTNo_CVSj\u0022\n-\t\t \u0022-VvXLO5VZfCUAVLgW4dpf1SrtZjSt34YLsRarSb127reG_DUwg9Ch-Kyvj\u0022\n-\t\t \u0022T1SkHgUWRVGcyly7uvVGRSDwsXypdrNinPA4jlhoNdizK2zF2CWQ\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022p\u005c\u0022:\u005c\u00229gY2w6I6S6L0juEKsbeDAwpd9WMfgqFoeA9vEyEUuk4kLwBKcoe1x4HG68\u0022\n-\t\t \u0022ik918hdDSE9vDQSccA3xXHOAFOPJ8R9EeIAbTi1VwBYnbTp87X-xcPWlEP\u0022\n-\t\t \u0022krdoUKW60tgs1aNd_Nnc9LEVVPMS390zbFxt8TN_biaBgelNgbC95sM\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022q\u005c\u0022:\u005c\u0022uKlCKvKv_ZJMVcdIs5vVSU_6cPtYI1ljWytExV_skstvRSNi9r66jdd9-y\u0022\n-\t\t \u0022BhVfuG4shsp2j7rGnIio901RBeHo6TPKWVVykPu1iYhQXw1jIABfw-MVsN\u0022\n-\t\t \u0022-3bQ76WLdt2SDxsHs7q7zPyUyHXmps7ycZ5c72wGkUwNOjYelmkiNS0\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022w0kZbV63cVRvVX6yk3C8cMxo2qCM4Y8nsq1lmMSYhG4EcL6FWbX5h9yuv\u0022\n-\t\t \u0022ngs4iLEFk6eALoUS4vIWEwcL4txw9LsWH_zKI-hwoReoP77cOdSL4AVcra\u0022\n-\t\t \u0022Hawlkpyd2TWjE5evgbhWtOxnZee3cXJBkAi64Ik6jZxbvk-RR3pEhnCs\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022o_8V14SezckO6CNLKs_btPdFiO9_kC1DsuUTd2LAfIIVeMZ7jn1Gus_Ff\u0022\n-\t\t \u00227B7IVx3p5KuBGOVF8L-qifLb6nQnLysgHDh132NDioZkhH7mI7hPG-PYE_\u0022\n-\t\t \u0022odApKdnqECHWw0J-F0JWnUd6D2B_1TvF9mXA2Qx-iGYn8OVV1Bsmp6qU\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlC\u0022\n-\t\t \u0022tUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZ\u0022\n-\t\t \u0022B9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-\n-*ex_a2_compact \u003d (uint8_t *)\n-\t\u0022eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0\u0022\n-\t\u0022.\u0022\n-\t\u0022UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm\u0022\n-\t\u00221NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7Pc\u0022\n-\t\u0022HALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIF\u0022\n-\t\u0022NPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8\u0022\n-\t\u0022rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv\u0022\n-\t\u0022-B3oWh2TbqmScqXMR4gp_A\u0022\n-\t\u0022.\u0022\n-\t\u0022AxY8DCtDaGlsbGljb3RoZQ\u0022\n-\t\u0022.\u0022\n-\t\u0022KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY\u0022\n-\t\u0022.\u0022\n-\t\u00229hH0vgRfYgPnAHOd8stkvw\u0022\n-;\n-\n-static int\n-test_jwe_a2(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[2048];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,\n-\t\t\t strlen((char *)lws_jwe_ex_a2_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* converts a compact serialization to jws b64 + decoded maps */\n-\tif (lws_jws_compact_decode((const char *)ex_a2_compact,\n-\t\t\t\t (int)strlen((char *)ex_a2_compact),\n-\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n-\t\t\t\t (char *)temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ex_a2_ptext) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a2_ptext,\n-\t\t\t sizeof(ex_a2_ptext))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ex_a2_ptext, sizeof(ex_a2_ptext));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-/* JWE creation using RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256\n- *\n- * This example encrypts a different, larger plaintext using the jwk key from\n- * the test above, and AES_128_CBC_HMAC_SHA_256 for content encryption.\n- */\n-\n-static const char *rsa256a128_jose \u003d\n-\t\t\u0022{ \u005c\u0022alg\u005c\u0022:\u005c\u0022RSA1_5\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A128CBC-HS256\u005c\u0022}\u0022;\n-\n-static uint8_t\n-\n-\t/* plaintext is 1024 bytes from /dev/urandom */\n-\n-ra_ptext_1024[] \u003d {\n-\t\t0xfe, 0xc6, 0x4f, 0x3e, 0x4a, 0x19, 0xe9, 0xd7,\n-\t\t0xc2, 0x13, 0xe7, 0xc5, 0x78, 0x6e, 0x71, 0xf6,\n-\t\t0x6e, 0xdd, 0x04, 0xaf, 0xaa, 0x4e, 0xa8, 0xad,\n-\t\t0xd8, 0xe0, 0xb3, 0x32, 0x97, 0x43, 0x7c, 0xd8,\n-\t\t0xd1, 0x5f, 0x56, 0xac, 0x70, 0xaf, 0x7d, 0x0b,\n-\t\t0x40, 0xa1, 0x96, 0x71, 0x7c, 0xc4, 0x4a, 0x37,\n-\t\t0x0b, 0xa6, 0x06, 0xb3, 0x8c, 0x87, 0xee, 0xb6,\n-\t\t0x15, 0xfe, 0xaa, 0x60, 0x7e, 0x7f, 0xdc, 0xb0,\n-\t\t0xff, 0x96, 0x4b, 0x30, 0x60, 0xcf, 0xc6, 0x5d,\n-\t\t0x09, 0x6a, 0x6f, 0x66, 0x0c, 0x5f, 0xb0, 0x6f,\n-\t\t0x61, 0xa6, 0x26, 0x02, 0xbd, 0x46, 0xda, 0xa3,\n-\t\t0x73, 0x19, 0x17, 0xff, 0xe0, 0x5f, 0x30, 0x72,\n-\t\t0x7d, 0x17, 0xd8, 0xb2, 0xbe, 0x84, 0x3e, 0x4d,\n-\t\t0x76, 0xbd, 0x62, 0x5d, 0x63, 0xfe, 0x11, 0x32,\n-\t\t0x11, 0x41, 0xdc, 0xed, 0x96, 0xfd, 0x31, 0x38,\n-\t\t0x6a, 0x84, 0x55, 0x7a, 0x33, 0x3f, 0x37, 0xc3,\n-\t\t0x37, 0x7b, 0xc1, 0xb7, 0x89, 0x00, 0x39, 0xa6,\n-\t\t0x94, 0x91, 0xb7, 0x19, 0x6b, 0x1d, 0x99, 0xeb,\n-\t\t0xf6, 0x10, 0xb9, 0xd2, 0xcd, 0x15, 0x0d, 0xbc,\n-\t\t0x24, 0x34, 0x9a, 0x52, 0x64, 0x21, 0x72, 0x1e,\n-\t\t0x9a, 0x00, 0xf2, 0xcf, 0xf1, 0x7d, 0x1a, 0x12,\n-\t\t0x8d, 0x39, 0xbc, 0xf9, 0x09, 0xfd, 0xd9, 0x22,\n-\t\t0x27, 0x28, 0xe1, 0x3a, 0x0b, 0x82, 0xba, 0x9a,\n-\t\t0xe5, 0x9d, 0xa8, 0x12, 0x6e, 0xf5, 0x4b, 0xc7,\n-\t\t0x2b, 0x9c, 0xdc, 0xfe, 0xf3, 0xe8, 0x74, 0x65,\n-\t\t0x3d, 0xe0, 0xaa, 0x64, 0xf3, 0x43, 0xa4, 0x88,\n-\t\t0xa8, 0xbe, 0x60, 0xdb, 0xfd, 0x2d, 0x3b, 0x84,\n-\t\t0x82, 0x8f, 0x4d, 0xbb, 0xe4, 0xa9, 0x59, 0xe3,\n-\t\t0x6c, 0x52, 0x45, 0xe4, 0x34, 0xdb, 0x28, 0x0e,\n-\t\t0x4a, 0x44, 0xb6, 0x9a, 0x25, 0x9b, 0x3b, 0xae,\n-\t\t0xe1, 0x12, 0x1d, 0x1c, 0x66, 0x7d, 0xb9, 0x5b,\n-\t\t0x5f, 0xc2, 0x4a, 0xaa, 0xd2, 0xe9, 0x65, 0xe2,\n-\t\t0x85, 0x6f, 0xf6, 0x67, 0x66, 0x8e, 0x0b, 0xd2,\n-\t\t0x60, 0xf8, 0x43, 0x60, 0x04, 0x9b, 0xa9, 0x3a,\n-\t\t0x6a, 0x3c, 0x02, 0x3c, 0x08, 0x9d, 0x60, 0x1c,\n-\t\t0xc4, 0x27, 0x3e, 0xff, 0xd0, 0x70, 0x94, 0x43,\n-\t\t0x3e, 0x9e, 0x69, 0x19, 0x22, 0xf0, 0xec, 0x26,\n-\t\t0x2d, 0xa5, 0x71, 0xf3, 0x92, 0x61, 0x95, 0xce,\n-\t\t0xc3, 0xc0, 0xa0, 0xc3, 0x98, 0x22, 0xdd, 0x32,\n-\t\t0x3c, 0x48, 0xcb, 0xd1, 0x61, 0xa0, 0xaa, 0x9a,\n-\t\t0x7e, 0x5a, 0xfa, 0x26, 0x46, 0x49, 0xfc, 0x9c,\n-\t\t0xaa, 0x21, 0x06, 0x45, 0xf1, 0xa0, 0xc9, 0xef,\n-\t\t0x6b, 0x89, 0xf2, 0x01, 0x20, 0x54, 0xfa, 0x0a,\n-\t\t0x23, 0xff, 0xbd, 0x64, 0x35, 0x94, 0xfd, 0x35,\n-\t\t0x70, 0x52, 0x94, 0x66, 0xc5, 0xd0, 0x27, 0xc1,\n-\t\t0x8f, 0x6d, 0xc4, 0xa3, 0x34, 0xc2, 0xea, 0xf0,\n-\t\t0xb3, 0x0d, 0x6c, 0x13, 0xb5, 0xc9, 0x6e, 0x5c,\n-\t\t0xeb, 0x8b, 0x7b, 0xf5, 0x21, 0x4c, 0xe3, 0xb7,\n-\t\t0x73, 0x6d, 0x07, 0xaa, 0x44, 0xc4, 0xba, 0xc5,\n-\t\t0xa5, 0x0e, 0x75, 0x28, 0xb7, 0x50, 0x22, 0x54,\n-\t\t0xa7, 0xe1, 0x2e, 0xfd, 0x20, 0xcd, 0xa4, 0x31,\n-\t\t0xa3, 0xb2, 0x73, 0x98, 0x7c, 0x3c, 0x8f, 0xa3,\n-\t\t0x40, 0x8a, 0xaf, 0x31, 0xfa, 0xf9, 0x70, 0x4d,\n-\t\t0x83, 0x10, 0xc4, 0xa0, 0x9c, 0xd6, 0xa3, 0xd5,\n-\t\t0x07, 0xaf, 0xaf, 0x35, 0x15, 0xd0, 0x84, 0x09,\n-\t\t0x20, 0x36, 0x88, 0xac, 0x6f, 0x16, 0x5e, 0x03,\n-\t\t0xa9, 0xfc, 0xb3, 0x2d, 0x01, 0x57, 0xb3, 0xed,\n-\t\t0x4b, 0x55, 0x2b, 0xbc, 0x92, 0x87, 0x3e, 0x27,\n-\t\t0xc4, 0x2c, 0x44, 0xac, 0x05, 0x5f, 0x26, 0xe7,\n-\t\t0xe9, 0xb0, 0x2d, 0x6b, 0x3c, 0x8c, 0xd2, 0xb4,\n-\t\t0x3c, 0xb4, 0x86, 0xfe, 0x68, 0x99, 0x2a, 0x42,\n-\t\t0xac, 0xa4, 0xb3, 0x89, 0x61, 0xb3, 0xd1, 0xdf,\n-\t\t0x9b, 0x58, 0xc7, 0x81, 0x62, 0x87, 0x26, 0x52,\n-\t\t0x51, 0xe7, 0x7d, 0x7c, 0x37, 0x14, 0xe5, 0x19,\n-\t\t0x28, 0x34, 0x3e, 0x95, 0x17, 0x36, 0x12, 0xf9,\n-\t\t0x5e, 0xc1, 0x3c, 0x9c, 0x28, 0x70, 0x06, 0xdf,\n-\t\t0xc4, 0x6d, 0x25, 0x04, 0x46, 0xe0, 0x95, 0xf0,\n-\t\t0xc8, 0x57, 0x48, 0x27, 0x26, 0xf3, 0xf7, 0x19,\n-\t\t0xbe, 0xea, 0xb4, 0xd4, 0x64, 0xaf, 0x67, 0x7c,\n-\t\t0xf5, 0xa9, 0xfb, 0x85, 0x4a, 0x43, 0x9c, 0x62,\n-\t\t0x06, 0x5e, 0x28, 0x2a, 0x7b, 0x1e, 0xb3, 0x07,\n-\t\t0xe7, 0x19, 0x32, 0xa4, 0x4e, 0xb4, 0xce, 0xe0,\n-\t\t0x92, 0x56, 0xf5, 0x10, 0xcb, 0x56, 0x34, 0x4b,\n-\t\t0x0d, 0xe1, 0xd3, 0x6d, 0xfe, 0xf0, 0x44, 0xf7,\n-\t\t0x22, 0x1d, 0x5e, 0x6b, 0xa7, 0xa5, 0x83, 0x2e,\n-\t\t0xeb, 0x14, 0xf2, 0xd7, 0x27, 0x5a, 0x2a, 0xd2,\n-\t\t0x55, 0x35, 0xe6, 0x7e, 0xd9, 0x3b, 0xac, 0x4e,\n-\t\t0x5a, 0x22, 0x46, 0xd5, 0x7b, 0x57, 0x9c, 0x58,\n-\t\t0xfe, 0xd0, 0xda, 0xbf, 0x7d, 0xe9, 0x8c, 0xb7,\n-\t\t0xba, 0x88, 0xf1, 0xc3, 0x82, 0x53, 0xc3, 0x66,\n-\t\t0x20, 0x51, 0x12, 0xd3, 0xf9, 0xaf, 0xe9, 0xcb,\n-\t\t0xc1, 0x7a, 0xe6, 0x22, 0x44, 0xa5, 0xdf, 0x18,\n-\t\t0xb3, 0x6e, 0x6c, 0xba, 0xf3, 0xc6, 0x24, 0x5a,\n-\t\t0x1c, 0x67, 0xa6, 0xa5, 0xb4, 0xb1, 0x35, 0xdf,\n-\t\t0x5a, 0x60, 0x5c, 0x0b, 0x66, 0xd3, 0x1f, 0x4e,\n-\t\t0x7c, 0xcb, 0x93, 0x7e, 0x2f, 0x6d, 0xbd, 0xce,\n-\t\t0x26, 0x52, 0x44, 0xee, 0xbb, 0xd8, 0x8f, 0xf2,\n-\t\t0x67, 0x38, 0x0d, 0x3b, 0xaa, 0x21, 0x73, 0xf8,\n-\t\t0x3b, 0x54, 0x9d, 0x4e, 0x5e, 0xf1, 0xa2, 0x18,\n-\t\t0x5a, 0xf1, 0x6c, 0x32, 0xbf, 0x0a, 0x73, 0x14,\n-\t\t0x48, 0x4f, 0x56, 0xc0, 0x87, 0x6d, 0x3b, 0x16,\n-\t\t0xcc, 0x3f, 0x44, 0x19, 0x85, 0x22, 0x43, 0x5f,\n-\t\t0x8c, 0x29, 0xbd, 0xa0, 0xce, 0x84, 0xd9, 0x4a,\n-\t\t0xcf, 0x00, 0x6b, 0x37, 0x35, 0xe0, 0xb3, 0xc9,\n-\t\t0xd1, 0x58, 0xd1, 0x1b, 0xc3, 0x6f, 0xe3, 0x50,\n-\t\t0xdb, 0xa6, 0x5e, 0x03, 0x18, 0xe5, 0xe2, 0xc1,\n-\t\t0x97, 0xd5, 0xf8, 0x42, 0x6f, 0xe6, 0x61, 0x80,\n-\t\t0xc9, 0x7c, 0xc6, 0x83, 0xf0, 0xad, 0x70, 0x13,\n-\t\t0x0e, 0x26, 0x75, 0xc0, 0x12, 0x23, 0x14, 0xef,\n-\t\t0x1f, 0xdf, 0xfd, 0x47, 0x99, 0x9f, 0x22, 0xf3,\n-\t\t0x57, 0x21, 0xdc, 0x38, 0xe4, 0x79, 0x87, 0x5b,\n-\t\t0x67, 0x66, 0xdd, 0x0b, 0xe0, 0xae, 0xb5, 0x97,\n-\t\t0xd8, 0xa6, 0x5d, 0x02, 0xcf, 0x6b, 0x84, 0x19,\n-\t\t0xc1, 0xbb, 0x25, 0xd2, 0x10, 0xb9, 0x63, 0xeb,\n-\t\t0x4b, 0x27, 0x8d, 0x05, 0x31, 0xce, 0x3b, 0x0c,\n-\t\t0x5f, 0xd4, 0x83, 0x47, 0xa4, 0x8b, 0xc4, 0x76,\n-\t\t0x33, 0x74, 0x1a, 0x07, 0xf8, 0x18, 0x82, 0x1c,\n-\t\t0x8e, 0x01, 0x75, 0x78, 0xea, 0xd9, 0x72, 0x61,\n-\t\t0x71, 0xa9, 0x09, 0x44, 0x7b, 0x0f, 0x12, 0xcf,\n-\t\t0x4c, 0x76, 0x7b, 0x69, 0xc8, 0x64, 0x98, 0x60,\n-\t\t0x45, 0xb6, 0xc7, 0x6b, 0xd8, 0x43, 0x99, 0x08,\n-\t\t0xc9, 0xd3, 0x6f, 0x01, 0x4f, 0x57, 0x6f, 0x49,\n-\t\t0x4f, 0x4f, 0x72, 0xa4, 0xa2, 0x45, 0xe1, 0x0e,\n-\t\t0xf2, 0x08, 0x3e, 0x67, 0xc3, 0x83, 0x5b, 0xb1,\n-\t\t0x24, 0xc0, 0xe0, 0x3a, 0xf5, 0x1f, 0xf2, 0x06,\n-\t\t0x4b, 0xa7, 0x6f, 0xd2, 0xb2, 0x81, 0x96, 0x91,\n-\t\t0x42, 0xb1, 0x53, 0x65, 0x3a, 0x12, 0xcd, 0x33,\n-\t\t0xb3, 0x7e, 0x79, 0xc0, 0x46, 0xf6, 0xd8, 0x4a,\n-\t\t0x22, 0x35, 0xb8, 0x3f, 0xe4, 0x08, 0x88, 0x49,\n-\t\t0x3c, 0x73, 0x9a, 0x44, 0xe3, 0x3b, 0xcc, 0xc4,\n-\t\t0xae, 0x7c, 0xbe, 0xfd, 0xa6, 0x4a, 0xd4, 0x26,\n-\t\t0x52, 0x58, 0x81, 0x30, 0x66, 0x44, 0x54, 0xc8,\n-\t\t0xe4, 0x7c, 0x5b, 0x63, 0x06, 0x60, 0x94, 0x62,\n-\t\t0xe5, 0x47, 0x45, 0xfb, 0x58, 0xf5, 0x6a, 0x7c,\n-\t\t0xb2, 0x35, 0x08, 0x03, 0x15, 0x68, 0xb3, 0x13,\n-\t\t0xa5, 0xbd, 0xf2, 0x1e, 0x2e, 0x1c, 0x8f, 0xc6,\n-\t\t0xc7, 0xd1, 0xa9, 0x64, 0x37, 0x2b, 0x23, 0xfa,\n-\t\t0x7e, 0x56, 0x22, 0xf0, 0x8a, 0xbd, 0xeb, 0x04\n-},\n-\n-r256a128_cek[] \u003d {\n-\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n-\t\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n-\t\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n-\t\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f\n-}\n-;\n-\n-static int\n-test_jwe_ra_ptext_1024(struct lws_context *context, char *jwk_txt, int jwk_len)\n-{\n-\tchar temp[4096], compact[4096];\n-\tstruct lws_jwe jwe;\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\t/* reuse the rsa private key from the JWE Appendix 2 test above */\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* dup the plaintext, it will be replaced in-situ by the ciphertext */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tra_ptext_1024, sizeof(ra_ptext_1024),\n-\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n-\t\t\t\t\t\t sizeof(ra_ptext_1024)))) {\n-\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* dup the cek, since it will be replaced by the encrypted key */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_EKEY,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tr256a128_cek, sizeof(r256a128_cek),\n-\t\t\t\tLWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n-\t\tlwsl_notice(\u0022%s: Not enough temp space for EKEY\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tjwe.jws.map.buf[LJWE_JOSE] \u003d rsa256a128_jose;\n-\tjwe.jws.map.len[LJWE_JOSE] \u003d (uint32_t)strlen(rsa256a128_jose);\n-\n-\tn \u003d lws_jwe_parse_jose(\u0026jwe.jose, jwe.jws.map.buf[LJWE_JOSE],\n-\t\t\t (int)jwe.jws.map.len[LJWE_JOSE],\n-\t\t\t lws_concat_temp(temp, temp_len), \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022, __func__, n);\n-\t\tgoto bail;\n-\t}\n-\n-\t// puts(compact);\n-\n-\tlws_jwe_destroy(\u0026jwe);\n-\tlws_jwe_init(\u0026jwe, context);\n-\ttemp_len \u003d sizeof(temp);\n-\n-\t/* now we created the encrypted version, see if we can decrypt it */\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_jws_compact_decode(compact, n, \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n-\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: failed to parse generated compact\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n-\t\t\t sizeof(ra_ptext_1024))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-static const char *rsa256a192_jose \u003d\n-\t\t\u0022{ \u005c\u0022alg\u005c\u0022:\u005c\u0022RSA1_5\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A192CBC-HS384\u005c\u0022}\u0022;\n-\n-static const uint8_t r256a192_cek[] \u003d {\n-\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n-\t\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n-\t\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n-\t\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\n-\t\t0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n-\t\t0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f\n-}\n-;\n-\n-static int\n-test_jwe_r256a192_ptext(struct lws_context *context, char *jwk_txt, int jwk_len)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[4096], compact[4096];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\t/* reuse the rsa private key from the JWE Appendix 2 test above */\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * dup the plaintext into the ciphertext element, it will be\n-\t * encrypted in-place to a ciphertext of the same length + padding\n-\t */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tra_ptext_1024, sizeof(ra_ptext_1024),\n-\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n-\t\t\t\t\t\t sizeof(ra_ptext_1024)))) {\n-\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* copy the cek, since it will be replaced by the encrypted key */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_EKEY,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tr256a192_cek, sizeof(r256a192_cek),\n-\t\t\t\tLWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n-\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n-\t\tgoto bail;\n-\t}\n-\n-\tjwe.jws.map.buf[LJWE_JOSE] \u003d rsa256a192_jose;\n-\tjwe.jws.map.len[LJWE_JOSE] \u003d (uint32_t)strlen(rsa256a192_jose);\n-\n-\tn \u003d lws_jwe_parse_jose(\u0026jwe.jose, jwe.jws.map.buf[LJWE_JOSE],\n-\t\t\t (int)jwe.jws.map.len[LJWE_JOSE],\n-\t\t\t lws_concat_temp(temp, temp_len), \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022, __func__, n);\n-\t\tgoto bail;\n-\t}\n-\n-\t// puts(compact);\n-\n-\t/* now we created the encrypted version, see if we can decrypt it */\n-\n-\tlws_jwe_destroy(\u0026jwe);\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_jws_compact_decode(compact, n, \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n-\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: failed to parse generated compact\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n-\t\t\t sizeof(ra_ptext_1024))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-\n-static const char *rsa256a256_jose \u003d\n-\t\t\u0022{ \u005c\u0022alg\u005c\u0022:\u005c\u0022RSA1_5\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A256CBC-HS512\u005c\u0022}\u0022;\n-\n-static const uint8_t r256a256_cek[] \u003d {\n-\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n-\t\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n-\t\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n-\t\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\n-\t\t0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n-\t\t0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n-\t\t0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,\n-\t\t0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f\n-}\n-;\n-\n-static int\n-test_jwe_r256a256_ptext(struct lws_context *context, char *jwk_txt, int jwk_len)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[4096], compact[4096];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\t/* reuse the rsa private key from the JWE Appendix 2 test above */\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * dup the plaintext into the ciphertext element, it will be\n-\t * encrypted in-place to a ciphertext of the same length + padding\n-\t */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tra_ptext_1024, sizeof(ra_ptext_1024),\n-\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n-\t\t\t\t\t\t sizeof(ra_ptext_1024)))) {\n-\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* copy the cek, since it will be replaced by the encrypted key */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_EKEY,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tr256a256_cek, sizeof(r256a256_cek),\n-\t\t\t\tLWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n-\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n-\t\tgoto bail;\n-\t}\n-\n-\tjwe.jws.map.buf[LJWE_JOSE] \u003d rsa256a256_jose;\n-\tjwe.jws.map.len[LJWE_JOSE] \u003d (uint32_t)strlen(rsa256a256_jose);\n-\n-\tn \u003d lws_jwe_parse_jose(\u0026jwe.jose, rsa256a256_jose,\n-\t\t\t (int)strlen(rsa256a256_jose),\n-\t\t\t lws_concat_temp(temp, temp_len), \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022, __func__, n);\n-\t\tgoto bail;\n-\t}\n-\n-\t// puts(compact);\n-\n-\t/* now we created the encrypted version, see if we can decrypt it */\n-\n-\tlws_jwe_destroy(\u0026jwe);\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, jwk_txt, (unsigned int)jwk_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_jws_compact_decode(compact, n, \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n-\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: failed to parse generated compact\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n-\t\t\t sizeof(ra_ptext_1024))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-/* produced by running the minimal example `lws-crypto-jwk -t RSA -b 2048 -c` */\n-\n-static const char *rsa_key_2048 \u003d\n-\t\u0022{\u0022\n-\t\t\u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022n\u005c\u0022:\u005c\u0022lBJdvUq-9_8hlcduIWuBjRb0tGzzAvS4foqoNCO7g-rOXMdeAcmq\u0022\n-\t\t \u0022aSzWTbkaGIc3L1I4-Q3TOZtxn2UhuDlShZRIhM6JCQuUVNVAF3TD7oXxHtZ\u0022\n-\t\t \u0022LJ7y_BqCUlrAmW31lu-nVmhY2G3xW26yXWUsDbCxz0hfLbVnXRSvVKLzYWm\u0022\n-\t\t \u0022_yyrFyEWfxB8peDocvKGh879z_aPCKE3PDOEl2AsgzYfpnWCLytkgnrTeL6\u0022\n-\t\t \u0022qY8HXxvvV-Jw-XMaRiwH0VldpIjs4DaoN35Kj1Ex7QOZznTkbYtMIqse8bR\u0022\n-\t\t \u0022LoR8Irkxbc5ncUAuX1KSV6lpPtelsA3RtEjJ4NHV-5eEABiYh8_CFQ\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022DDpguQ9RVQFMoJC5z2hlkvq91kvsXPv2Y9Dcki256xYlg55H7Pre\u0022\n-\t\t \u0022p__hahrABR2Jg6QVJhArt5ABjUnDQ_JL69HH6VvLD6RVVBTQ-FRBZ_3HYKY\u0022\n-\t\t \u0022Oynx5BA7tJm1BRatF5FkBCvq27i8nAc4vfjAb22o9CFvEW3FLaKAgOCncQ3\u0022\n-\t\t \u0022Tnbz9CddH89n7DXw4kBFI8q5ugF_aRIg5-i42W_hQinLaBhZ_zhAuE-nvlt\u0022\n-\t\t \u0022ZnhDal8cX3T60lNoUrDOlirqEOXKO3gXCHpm3csZ6nabHYD1UCyHOmi2RsR\u0022\n-\t\t \u0022pzjaiqjXdPbwPzQoh2DcYpavNrf1mtHiqTwLZDTJIRHWHufJzHf-sw\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u0022ySeC3FtvzduDEL-FX4JqbRN06PdBhUmosCkymmbBjriuLNpkGkG-\u0022\n-\t\t \u00221ex7r-M8neUBZbctmDdih6cpLZ8hjZv3eEDZ4b5Z2LqZnja4QvVoWLUs4Fb\u0022\n-\t\t \u0022NN_PxJCR5H28uUfT6ThxqT0Nb2enb8Dyp0Qxvd7eJUeYz6jOt7pEK-ErTB4\u0022\n-\t\t \u0022M\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u0022vHG2Pd6QUH7vFZjJtXwmlVnrz5tdJvUPQvz7ggeM69cqhf4vLajz\u0022\n-\t\t \u0022sqP9GhJr7bEkp6vKVdZGmfEdiFRD8cssIZq651oAO5Wr7zZd2mR_hG9jZx7\u0022\n-\t\t \u00228Davfuxr4SZNN-bmoxO6dbDi-X2c7fvMI2YeJwL4groNKyiosdUYILTrYRI\u0022\n-\t\t \u0022c\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022h5Gqf2rcokgEQGBjuigCJDtNuskRjoxDNV6-rRL99nt_X9lcR9n\u0022\n-\t\t \u0022xjOnRvowOyXeTBoN7JjCFpllBxm6ORYtNMO28KomIsimo6NmGPBJ7XfXVJe\u0022\n-\t\t \u0022k6bDBrX-l4_HeJJ1FM9SHvgDYsjGQxh-rKpIqWAYBf-yOD758e5T85vndnX\u0022\n-\t\t \u0022JM\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022K9LiB-dfdmjenw4mMp-JtYfw8Bn4gtvQzcpZjzbETgB-8iRXwm2\u0022\n-\t\t \u0022dJvk-HjcUhHWCyb-I0YeAacKKFK9MEconHDWIq87haPn4vyvMjcJ7aUgiPN\u0022\n-\t\t \u0022QW1_MVl8TA4xNvudi0Z__5-jYEB9nRG0fX0gbUQU-19_-uf-9o4WkE88fQj\u0022\n-\t\t \u0022bc\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022LEkTRqmomn9UiASeRfAKw-Z5q7cye9CSL4luSexFvA3Du7Oin-s\u0022\n-\t\t \u0022L9a7F3nJN4CuYzhtNMxQ0hM7k6ExzhDhXDlNRHxnNEDt81-CFRV98v7GVWV\u0022\n-\t\t \u0022SH1KnaKf9wgegxSSm-x536ki2SI8EN4k4qkqRF0iLVHZK7CgnWMbtt6tnpp\u0022\n-\t\t \u00223k\u005c\u0022\u0022\n-\t\u0022}\u0022;\n-/* produced by running the minimal example `lws-crypto-jwk -t RSA -b 4096 -c` */\n-\n-static const char *rsa_key_4096 \u003d\n-\t\u0022{\u0022\n-\t\t\u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022n\u005c\u0022:\u005c\u0022uiLBz1SUgd4eQ0okg6tlPdk9QUhTsqXmiJXygWVFgzT45E5_Rfkq\u0022\n-\t\t \u0022vZ2fwAqQ8DvxkDTUWiKpeXMpPRNWG5GxuBuq9n7xdA1vn1eQi8LoekB28dg\u0022\n-\t\t \u00223MwMfozVSKCzyxG1f81xPE5x3EMVhCcx6hshhlMEHkzNNhE07d-oRO87ZC0\u0022\n-\t\t \u0022z_5L3Vh03uJBXaDKVlsgHAazoHLhn6G4odqv-ro54T6Nx1eEtyTnMmFY5ND\u0022\n-\t\t \u0022V4rN0SjQvSefbZZtsrtby8Z0JmeyvynmDwOINj7FpmPmpFLoWGXntc2yxPP\u0022\n-\t\t \u00228SHnqfT9ESh94fxCMxRhDNohgpegRHyiYwj3M5ZYY6reCZYfOQONSWmc8yp\u0022\n-\t\t \u0022NBMJqj4LuJ2bTMGAFS17ZP4ZZWm5RP9ax100Dgk0yxP1UrybG5dCfJRQvHC\u0022\n-\t\t \u0022ncxG_aL6cSQu2o4fXqlJsNHxk3FjHtV_CMZ3tqvGTvwrs4yxvKwKv6r3fRh\u0022\n-\t\t \u0022KL01bGOePzp9THkHW2-lzVj6kUwnxBdHGZE6fcAnczOdp8ZIEdV1w6ThimC\u0022\n-\t\t \u0022m3Bw_TIyl3tkuxRWXpc_d6Q4iiSVKGKCvUvfAlESpTA4tIhQkij-T9FEoj2\u0022\n-\t\t \u0022WE2H1D35AKmjcfLCh6yszu8cmDNedn862pwnawE2RvRFAyuI113fLQeCbCz\u0022\n-\t\t \u0022tQ1JHuD8cnQt0hpGzReTa5UJ8OEOGIlyXNdWZyTpk\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022G2ZW582AT-6xvz-IiP5fuJ9EMloygeuEeEo0aMJO3X3cfoUknJkN\u0022\n-\t\t \u0022ZtyvYa5cgBSe3la8hKkyD9_5K9WvGP9VLTAbdk4g_m-k5QyXiU9PeAGJ0Nd\u0022\n-\t\t \u0022-Zqq4y0Zj2eil8u7Tz0fhFxay-zvG6VGZnsIcBTD2C7_jUwyoaqJA17A_CH\u0022\n-\t\t \u0022gU-ifMqS56VgMGdlKZmf7Cg7ZGzM1DoS6vZ9bbfgoczaw4OZVHlg9Cxa0NI\u0022\n-\t\t \u0022CDi1S-sJcTLGN_RLISKN5H0J54ZfzF6fUEn5kNykLTZrAvj2XV7g4UUOogn\u0022\n-\t\t \u00221cvjJYRcBVzTzQKcfxbqo2DvymDGFZbQM6pj80rYJ5HFPh2EapjggPN8hXp\u0022\n-\t\t \u0022NlTNDEvC84QFv0lo2E-0nVWQqcyHtXd431O1JH2h5X822zKjXxkaztQSCj9\u0022\n-\t\t \u0022YP7AdAeoxIaWOa3aO1vcwURH2WWaNV-_KXVkPJNzfo9-bGYwblMw_RIqIkN\u0022\n-\t\t \u0022BDayTb8rBuQHTCE_tSEHgoSnkityGpr8j_vgA-Fa-SqmdqUlbklVpwA_Mq_\u0022\n-\t\t \u0022UH7RCaqe91dWxRhS_7c85tFMRFCKOcaRXkwxEpP2LD1AYe8yvVQlr0Se8_d\u0022\n-\t\t \u0022RefuQcC-BECwMW-TCgR3VxAuL7ExNTYe4bhBD8WYXsHP7wDXWX2Q4v7IRzj\u0022\n-\t\t \u0022cfVIdpTNYuWEd69PvXBCuy75hmDniSmS3Xps3ItGU\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u0022961BtLSIZkHO7Vu1KfaA3urcwGpISKJiTSB5Nh6npxJr9mSjzv_f\u0022\n-\t\t \u0022e8VoxCX6CWGY0SEeQNUQ6ceTnAAxkSHtZJQGed598jBtxIexAWEE7oc9s9d\u0022\n-\t\t \u0022b0cWu4QWIVZYXrcOTEWmK1kWN4PXmnnQknrWQF49adn81BaOXqoL-tahe7f\u0022\n-\t\t \u0022faXzXe0RXuohK543ZKbuuHQ2TxqFG7CZpXiH_qn1Syao32u0V3iDFpmmCUV\u0022\n-\t\t \u0022h9O2JCzfo8sAosTrnQwC0pXz3Nvr_9Cnk6bMluJoMrwB1Ywg_DPQ1WvpYHO\u0022\n-\t\t \u0022URezEOqVC8Y3zrko199TMX2COKGNFgutVpnzxs2_h0PyINUmwrY4zQ\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u0022wGQRaxy_gBafbrVJy4f32O0a2FQHzmS--WgHhoteDoF6ZAajLcV0\u0022\n-\t\t \u0022GEvb-AVmFER1Wii62BFaFJOYQIegELvnBFFzD6oHJRX7bM4m36G8J_TC1o9\u0022\n-\t\t \u0022T1IFnxOpaoFDf4JWf2k7DCXClGg_zueyOD8fj8F6j2nqpOfytuLmikHcWMc\u0022\n-\t\t \u0022dGTHTCRtQmvOk3pm0uk2qR0cQb5L3Ocv45tCKr55tMc6Zx3DKkMt1kmUwd2\u0022\n-\t\t \u0022HFfk_0WM6R7q4LNGIjwl8dwiERppLKA8xao9i3jOOdFEfAD-Zqv8H-32cyH\u0022\n-\t\t \u0022Mg6Guo4tPNAYSzcsz8nbEYPtKVVm-PDuM2cx0iaKnS8BIK2XTbzc_Q\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022ZXLWIwp_hEMYWyjhP9r0VlqlKTtfeEDrOuQ-Qei0iz6EclwurK8\u0022\n-\t\t \u0022p_yyRCSb1D7qmOaLzHWMollllINUDeIsJDdWEAY8cz4L-sy1RV1tCBeHnaC\u0022\n-\t\t \u00226iMX5jb1Aw072y3T3qk4tDjxjWUHroh6bTCR8dckkJqNfaBAFKMlGNuyLIH\u0022\n-\t\t \u00223kSPUV3ivUM1d4NvhnJyz02HmjOgz9W-Uv65rJei_zJR9P2aCbAG00CEHXW\u0022\n-\t\t \u0022zJ_uT86VdxV11WTaHu8Abt94sER8Tv6jbuyLrUjJSs9VGew32xNcEhya4ZQ\u0022\n-\t\t \u0022VyimG8zri6fu7CDXXgPS8wtzB5ihl_c2ypnJQ4_GKrgEqwEAOrFqvUQ\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022uzlmngcm8R6S3qi7fL7_2fG7uyPjSN5P3uR21l8QFCu6kFbJO8S\u0022\n-\t\t \u00224muBP20hds4F_dlLGqXgRYo7TjpCtmztQsKoWv_ql41hGCfeAawa41WViqm\u0022\n-\t\t \u0022xmlxmrgzzRHsw1YhgZrNgTAz_E290EQT3Mbd0HnCZtbDMMNisIYAj_A3lwd\u0022\n-\t\t \u0022tbHOaYyXb0dSZ_nkSUVO05tQ2aGAo8Xtl5ih0NqaQR_XNhwW2pI0lsTB__D\u0022\n-\t\t \u002215tU-O5FSdJaq2ip8KNrBzmF8IYrDKTNykKWAKRdSEX_uFoLdD8t0mxn3SM\u0022\n-\t\t \u0022luffa8vdjXJfh3GiASmHUt3HcPOooQEAufoWBPVJWeGqCvWtRH8yYfQ\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022h-e9es5J49OUF48gSXUI8cynZ8ydv5cThXc1deV3mil_7_7Hg8E\u0022\n-\t\t \u0022jV3gAErO4l-irHJplFmHFZvU1ud4zs1gtBt5TA-EeeepYOHMSssWDvDK3WI\u0022\n-\t\t \u0022zsM6C3vcNTSkT-ihaSFmPWHCVwJ1R3auWfeI2In3at0jd4t-OK-cCcGZXb7\u0022\n-\t\t \u002290-EnyyDcdFTU9WfwVSOJffRGjoUYX8DexavClv7CBzPhpdUzGoeyarNaG4\u0022\n-\t\t \u0022z9MI8Q8txHyHgc_D70lZUum1cj0bZwgEj6yDzOPzSgUmICFJiLDDj93oPaI\u0022\n-\t\t \u0022v-5CQ_Ckju7icexc_kuuYTKBOLTj_vfaURnV3KCHul2UljUYOxkfeNQ\u005c\u0022\u0022\n-\t\u0022}\u0022;\n-\n-static const char *rsa_key_4096_no_optional \u003d\n-\t\u0022{\u0022\n-\t\t\u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022n\u005c\u0022:\u005c\u0022uiLBz1SUgd4eQ0okg6tlPdk9QUhTsqXmiJXygWVFgzT45E5_Rfkq\u0022\n-\t\t \u0022vZ2fwAqQ8DvxkDTUWiKpeXMpPRNWG5GxuBuq9n7xdA1vn1eQi8LoekB28dg\u0022\n-\t\t \u00223MwMfozVSKCzyxG1f81xPE5x3EMVhCcx6hshhlMEHkzNNhE07d-oRO87ZC0\u0022\n-\t\t \u0022z_5L3Vh03uJBXaDKVlsgHAazoHLhn6G4odqv-ro54T6Nx1eEtyTnMmFY5ND\u0022\n-\t\t \u0022V4rN0SjQvSefbZZtsrtby8Z0JmeyvynmDwOINj7FpmPmpFLoWGXntc2yxPP\u0022\n-\t\t \u00228SHnqfT9ESh94fxCMxRhDNohgpegRHyiYwj3M5ZYY6reCZYfOQONSWmc8yp\u0022\n-\t\t \u0022NBMJqj4LuJ2bTMGAFS17ZP4ZZWm5RP9ax100Dgk0yxP1UrybG5dCfJRQvHC\u0022\n-\t\t \u0022ncxG_aL6cSQu2o4fXqlJsNHxk3FjHtV_CMZ3tqvGTvwrs4yxvKwKv6r3fRh\u0022\n-\t\t \u0022KL01bGOePzp9THkHW2-lzVj6kUwnxBdHGZE6fcAnczOdp8ZIEdV1w6ThimC\u0022\n-\t\t \u0022m3Bw_TIyl3tkuxRWXpc_d6Q4iiSVKGKCvUvfAlESpTA4tIhQkij-T9FEoj2\u0022\n-\t\t \u0022WE2H1D35AKmjcfLCh6yszu8cmDNedn862pwnawE2RvRFAyuI113fLQeCbCz\u0022\n-\t\t \u0022tQ1JHuD8cnQt0hpGzReTa5UJ8OEOGIlyXNdWZyTpk\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022G2ZW582AT-6xvz-IiP5fuJ9EMloygeuEeEo0aMJO3X3cfoUknJkN\u0022\n-\t\t \u0022ZtyvYa5cgBSe3la8hKkyD9_5K9WvGP9VLTAbdk4g_m-k5QyXiU9PeAGJ0Nd\u0022\n-\t\t \u0022-Zqq4y0Zj2eil8u7Tz0fhFxay-zvG6VGZnsIcBTD2C7_jUwyoaqJA17A_CH\u0022\n-\t\t \u0022gU-ifMqS56VgMGdlKZmf7Cg7ZGzM1DoS6vZ9bbfgoczaw4OZVHlg9Cxa0NI\u0022\n-\t\t \u0022CDi1S-sJcTLGN_RLISKN5H0J54ZfzF6fUEn5kNykLTZrAvj2XV7g4UUOogn\u0022\n-\t\t \u00221cvjJYRcBVzTzQKcfxbqo2DvymDGFZbQM6pj80rYJ5HFPh2EapjggPN8hXp\u0022\n-\t\t \u0022NlTNDEvC84QFv0lo2E-0nVWQqcyHtXd431O1JH2h5X822zKjXxkaztQSCj9\u0022\n-\t\t \u0022YP7AdAeoxIaWOa3aO1vcwURH2WWaNV-_KXVkPJNzfo9-bGYwblMw_RIqIkN\u0022\n-\t\t \u0022BDayTb8rBuQHTCE_tSEHgoSnkityGpr8j_vgA-Fa-SqmdqUlbklVpwA_Mq_\u0022\n-\t\t \u0022UH7RCaqe91dWxRhS_7c85tFMRFCKOcaRXkwxEpP2LD1AYe8yvVQlr0Se8_d\u0022\n-\t\t \u0022RefuQcC-BECwMW-TCgR3VxAuL7ExNTYe4bhBD8WYXsHP7wDXWX2Q4v7IRzj\u0022\n-\t\t \u0022cfVIdpTNYuWEd69PvXBCuy75hmDniSmS3Xps3ItGU\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u0022961BtLSIZkHO7Vu1KfaA3urcwGpISKJiTSB5Nh6npxJr9mSjzv_f\u0022\n-\t\t \u0022e8VoxCX6CWGY0SEeQNUQ6ceTnAAxkSHtZJQGed598jBtxIexAWEE7oc9s9d\u0022\n-\t\t \u0022b0cWu4QWIVZYXrcOTEWmK1kWN4PXmnnQknrWQF49adn81BaOXqoL-tahe7f\u0022\n-\t\t \u0022faXzXe0RXuohK543ZKbuuHQ2TxqFG7CZpXiH_qn1Syao32u0V3iDFpmmCUV\u0022\n-\t\t \u0022h9O2JCzfo8sAosTrnQwC0pXz3Nvr_9Cnk6bMluJoMrwB1Ywg_DPQ1WvpYHO\u0022\n-\t\t \u0022URezEOqVC8Y3zrko199TMX2COKGNFgutVpnzxs2_h0PyINUmwrY4zQ\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u0022wGQRaxy_gBafbrVJy4f32O0a2FQHzmS--WgHhoteDoF6ZAajLcV0\u0022\n-\t\t \u0022GEvb-AVmFER1Wii62BFaFJOYQIegELvnBFFzD6oHJRX7bM4m36G8J_TC1o9\u0022\n-\t\t \u0022T1IFnxOpaoFDf4JWf2k7DCXClGg_zueyOD8fj8F6j2nqpOfytuLmikHcWMc\u0022\n-\t\t \u0022dGTHTCRtQmvOk3pm0uk2qR0cQb5L3Ocv45tCKr55tMc6Zx3DKkMt1kmUwd2\u0022\n-\t\t \u0022HFfk_0WM6R7q4LNGIjwl8dwiERppLKA8xao9i3jOOdFEfAD-Zqv8H-32cyH\u0022\n-\t\t \u0022Mg6Guo4tPNAYSzcsz8nbEYPtKVVm-PDuM2cx0iaKnS8BIK2XTbzc_Q\u005c\u0022\u0022\n-\t\u0022}\u0022;\n-\n-/* This is a compact JWE containing the plaintext ra_ptext_1024 for the key\n- * lws_jwe_ex_a2_jwk_json... produced by test test above running on OpenSSL.\n- */\n-\n-static char *jwe_compact_rsa_cbc_openssl \u003d\n- \u0022eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.\u0022\n- \u0022HgQBfAg2IUpExcs74-gtuSOciw6rxh2cc4x9MVRWDZKSvMqoBYKAxl6ebSxGTReHhbvhv2Rm8stKq\u0022\n- \u0022OIROhWzTNGTQPnSRMzAm9x6ms39hAIGh1KCEZ47MRYkCN7hElfDVtczOCX3ZRsG9_qYEmzcY1aJ-4\u0022\n- \u0022_LS3yeP0HfqKBmcfvjVLw-KqcUuHp5YXsZEvt28nA9uBlCN0ROWy_2Fs-zlQj8pDMWo5pZrffKTUX\u0022\n- \u0022gUh_UJ9eC3qNyXtQSqUH-5vDeHPhxNnIJOsmJ5ZUAjxXPm-RJZRC9THg0DzGRZn9IqfP9qcanbcZ8\u0022\n- \u0022iow7gjFh1EPp3MKlpZqDKbLLei1WZvz2_A.\u0022\n- \u0022q4STtyu4yxZfH1HNDYlYcA.\u0022\n- \u0022_uRfuwWO22_auSqXHORw_e_Q6PmbpC0sv0tefVKsj3Zqnh2qUBlj10kiWBMWoMMjqsClBO0nUoup4\u0022\n- \u0022c7i1YSqxlCHliXru3athv_EYtg5qvC-z2co9NiFABHCHmBDrhj7CuKN5gqFDt1EbYMLwWtU3gOnQy\u0022\n- \u0022dvnzfFcQs4_jKi6tRpQzbobrkkZ2p7Y_ltjA1Wmwqrp9O8DGSRnvcomqzGHcshuyxTkjLDzD8TSMR\u0022\n- \u0022S1kp-miy5eDGAcp-ymWiUKN7gswy5FPjPQYzgs7Vc0n0R1ljepRHJiHaP61z_DKWXrCE6RqAVqnaw\u0022\n- \u0022TjjVOXXKKF9pz9W7pZL8diLZ0Ueev6xk8wzRRsUChM5toQNzFLXsnzSDQSzfSKpRnLjYvosiEegyx\u0022\n- \u0022RrwtQwEcNCXRj0aGxG6e_W79JdUJoi4blpTtrAVn_pk7SgRiU3aly1vso5tV_0kvMOcS6Hn38mqRQ\u0022\n- \u0022PQxbdIpohi8C7FFabluZqGoiji8ZTM3v-2ib2vrBFj1YvoyPG1HXJsABINzo0xOkrMFNfN_oQrCSM\u0022\n- \u0022Ij49N86GXmYOnu5jtZeSMXZIR2BAXnu0upXMsvtSjU8D-LJJChy0XNYoyuJar5P3YhDStdTfmn0z-\u0022\n- \u0022XLwaIHWc1L9-rmW9CZey3HxCLKEnr7-FjXsXqzAArsFqn1X_sVR5HRHng5ioc7sUaRoC1S_k0XPVC\u0022\n- \u0022qCjZvkbRry2cp2313DNwjl8SK-iZA0fVUZVPM7_eZfpEgB3bBTyamtAaqQeES6lcVEtpg176Mlh64\u0022\n- \u00223JCAjroJPP4eqAA3JHnDgwlO-XhlLPTNNQ5FMLBC_dp41A-H3HFlbQUR6jX3k_H4Ggqtit50EIye3\u0022\n- \u0022nnKb3emFn9KVyeZCYaBecYbicEIMKW7sWLbcE_cDGqkHZcMGTOQKRiLp-xwyEu89oDGAcGBYpmC_f\u0022\n- \u0022iQ2qyFfe6tQK_5nPZbtW2mudiYZ-d0YIURSTp58S_n6w3wLDUEcuZtv-nhCaFVy8oUbAztkBIK6pu\u0022\n- \u0022VamKhHVLkCtOGIdNJYbLKAedhK1lQVPbrvfcSDPPkhxSx9AjKqhKA3ZPMA_UXQb6p9c33tgi_MdZX\u0022\n- \u0022-jRGXwGKWBCrv4UjttFLV-a5U7NgxQIIjwfAoutXtYardFw2d5nTJRqBrw06PSqaLzQi616_b-U0g\u0022\n- \u00226bWxrFObIWrKODkGfQcXPXIQxW_4Vh6gR2GaHSi_A_5SGH0zsBtYxisbKXLK2HiZJOXBew4-am6c0\u0022\n- \u0022R1jBh7QtOWpwrYWt0d_xxrWtKezeEp3FkrFkwWCgY9dT1uV8tKUuxeeGqshkrXifT4axttpkbi-qA\u0022\n- \u0022eG_C6J-H29CPqScclD-A5LIg7k-KmA9hsWrXttAvoCSawNj1tv9JHq0jgP1yZytDW1DkWdCBY0au5\u0022\n- \u00224.\u0022\n- \u0022qqYQEaGx-lUHoO43fOXvKQ\u0022\n-;\n-\n-\n-static int\n-test_jwe_r256a128_jwe_openssl(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[2048];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,\n-\t\t\t strlen((char *)lws_jwe_ex_a2_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* converts a compact serialization to jws b64 + decoded maps */\n-\tif (lws_jws_compact_decode((const char *)jwe_compact_rsa_cbc_openssl,\n-\t\t\t\t (int)strlen((char *)jwe_compact_rsa_cbc_openssl),\n-\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n-\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n-\t\t\t sizeof(ra_ptext_1024))) {\n-\t\tlwsl_err(\u0022%s: plaintext RSA/AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-\n-/* This is a compact JWE containing the plaintext ra_ptext_1024 for the key\n- * lws_jwe_ex_a2_jwk_json... produced by test test above running on mbedTLS.\n- */\n-\n-static char\n-*jwe_compact_rsa_cbc_mbedtls \u003d\n-\t\u0022eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.Ptg-RZjEhY1dWg7T\u0022\n-\t\u0022v72rqRoHXBeory9ePCC5cfASTz8BH7IdSLQcPeBWHQsmd13TXPjo-dxnmkWkx9AyKdvy\u0022\n-\t\u0022K0A6oCnsP7KfbGzPwTy5eadpaaDZ3UyXIGmusLgiXGgDZ4d13voirbRQV9nQTPsagG_k\u0022\n-\t\u0022FGRI5dKzenG2WcbUhKG-uCmypzYqjNM3LqUzdH42jjjHFOBkmK_sWSZL7Uxqq8s08hkO\u0022\n-\t\u0022aXeUQyeM7Z8wm1bsZAvIfGri5LMcBS8P70AyENchlchZpTeACIOWk19ddLPUt-ruEcm0\u0022\n-\t\u0022zZV7Gjap7uG06a0m3VyR3vMpKkXnBHQxko-RICU2PDmELVXg0pZWTw.-VaaDaUiynH_t\u0022\n-\t\u0022sh2HqKISQ.vVE8j1TQinb4anJk0ArV9ccYdlUIO20vnMa7b-JGfQ7CFi_WVt6xNaqytB\u0022\n-\t\u0022QqiTHLtAxBDIV4m9Kwid-8Kcx7BmRqu-memxHztBSvBNOYWVPTxy5I2ORGLNEbPVrFYp\u0022\n-\t\u0022c2nm3TnHfr-_2fuw6_HEnyqv_c6ZyzU0-lHZ1pE5Cs-lrjnj4ibNcK6XHhrO3nxUjPMZ\u0022\n-\t\u0022rO-2B_tZwCxzKsFAqD_XGROvNGWXEgxgIr09MyuwKJnw2oZ0xOF_d3FVYjK5XMONgWPo\u0022\n-\t\u0022lyDmbP_XLSIUXbHmLxpDB5NPLN8SKRHbMV3_qw5rFRlak2C_XlR58P-Im1PQ8gMg7lgE\u0022\n-\t\u0022IFz2DrqF4sJA5TYbQG5KCdas0SfONlP1V692dufH5D30RGsiWNSrhiyDmUNC0SeB8VqA\u0022\n-\t\u0022bmc02pPGgzZHxa5-_xIHKm4h6fmnZFScjliBQ5W6smxQ6m2Kby0MkOdqlRYFn8qLYLmF\u0022\n-\t\u0022vmVNe_Q5-iLNobx-hyyeeExRXfzNOY0HHEKw67ipBWwqA0JGIggCWAFa0fpA-Wt7sNl_\u0022\n-\t\u0022gPy96nbwuXIuRoC3wuboUlDp9k2F1vC7VY6R9jdRk1VXT_O3liBIiUIRhZiqZZ75H2RV\u0022\n-\t\u0022pLYXGrvL5G9THdRcbsg3XUt-kF4vvGQAdNmPdRmuIG1DfGDmOZnXfrG8ckTvxoKBXdQZ\u0022\n-\t\u0022gfwfAQFgeHjltiWZTCSBV4464sn2qLZ1MP3Ku9bOjb72RCpIF60Cqssb8gTQyXQf48ZR\u0022\n-\t\u0022OBd242Q7Ae6PePmb_TcnG3jOguNUgmhj8iTU7QUz0uJWpJjMRPJ8vK8SnYEguGHer4qT\u0022\n-\t\u0022EocdMzRTTZB-Pr4-Ey0Hm0zeiFvjU0Qy6crjna6SKrgms4VAJT9LiicTYFPsmFBFQ0L1\u0022\n-\t\u0022BVDiZ3NTBIv_ajvzRpBNZ0IxEH5t6W3OY0223xUF3cq8c9HhwIxMf9a2-PmZ3mVWIRnU\u0022\n-\t\u0022nGegoVkzd2l6el8aw57v5KKYas4-EkovHntCZZ_hkZ1uHtezKq0EvjnT5xGWjPFjOZnh\u0022\n-\t\u0022veiozAsaMSSyTny6mcI-hjvcgd--7qlqWpt_BEkp9XVkP2k7eHLM9v4rL6hhk_n6yK3w\u0022\n-\t\u0022qKi0xDboxU5xjuBiGKb-E8um1MUEjuLqZanKSBsgU-Vwvw0gx1r-MG6BSlrgUlT2if5k\u0022\n-\t\u0022-Wfs6iVdpK7x1zZSsetp3NEjT4DUrfmp_E_CTXhOEP0AgzpQ4Ukx5bFN3gm5gyBZw1E8\u0022\n-\t\u0022q20Hs01OBcMJ9wenLEQVMvO_IEIkRNBMWEgoZ148As14LNOgdh1UBrF6W4pAUjYvA3WG\u0022\n-\t\u0022Zp7uG9ooDB1RF2aaeBqoLJflqIegsvsfaNNBDJ-U6i_jLG1FSlttEhJVdXll0gMSYlXD\u0022\n-\t\u0022O3BBil4eiUPfiksfOmsbwoIxc-3yPTivU3DPM.O_IaktJRbdV66zfhD0LQmw\u0022\n-;\n-\n-static int\n-test_jwe_r256a128_jwe_mbedtls(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[2048];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)lws_jwe_ex_a2_jwk_json,\n-\t\t\t strlen((char *)lws_jwe_ex_a2_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* converts a compact serialization to jws b64 + decoded maps */\n-\tif (lws_jws_compact_decode((const char *)jwe_compact_rsa_cbc_mbedtls,\n-\t\t\t\t (int)strlen((char *)jwe_compact_rsa_cbc_mbedtls),\n-\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n-\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ra_ptext_1024) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ra_ptext_1024,\n-\t\t\t sizeof(ra_ptext_1024))) {\n-\t\tlwsl_err(\u0022%s: plaintext RSA/AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ra_ptext_1024, sizeof(ra_ptext_1024));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-\n-\n-/* A.3. Example JWE Using AES Key Wrap and AES_128_CBC_HMAC_SHA_256\n- *\n- * This example encrypts the plaintext \u0022Live long and prosper.\u0022 to the\n- * recipient using AES Key Wrap for key encryption and\n- * AES_128_CBC_HMAC_SHA_256 for content encryption.\n- */\n-\n-/* \u0022Live long and prosper.\u0022 */\n-static uint8_t\n-\n-ex_a3_ptext[] \u003d {\n-\t76, 105, 118, 101, 32, 108, 111, 110,\n-\t103, 32, 97, 110, 100, 32, 112, 114,\n-\t111, 115, 112, 101, 114, 46\n-},\n-\n-*ex_a3_compact \u003d (uint8_t *)\n-\t\u0022eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0\u0022\n-\t\u0022.\u0022\n-\t\u00226KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ\u0022\n-\t\u0022.\u0022\n-\t\u0022AxY8DCtDaGlsbGljb3RoZQ\u0022\n-\t\u0022.\u0022\n-\t\u0022KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY\u0022\n-\t\u0022.\u0022\n-\t\u0022U0m_YmjN04DJvceFICbCVQ\u0022,\n-\n-*ex_a3_key \u003d (uint8_t *)\n-\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022k\u005c\u0022:\u005c\u0022GawgguFyGrWKav7AX4VKUg\u005c\u0022\u0022\n-\t\u0022}\u0022\n-;\n-\n-static int\n-test_jwe_a3(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[2048];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)ex_a3_key,\n-\t\t\t strlen((char *)ex_a3_key)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* converts a compact serialization to jws b64 + decoded maps */\n-\tif (lws_jws_compact_decode((const char *)ex_a3_compact,\n-\t\t\t\t (int)strlen((char *)ex_a3_compact),\n-\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64, temp,\n-\t\t\t\t \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(ex_a3_ptext) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], ex_a3_ptext,\n-\t\t\t sizeof(ex_a3_ptext))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ex_a3_ptext, sizeof(ex_a3_ptext));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-/* JWA B.2. Test Cases for AES_192_CBC_HMAC_SHA_384\n- *\n- * Unfortunately JWA just gives this test case as hex literals, not\n- * inside a JWE. So we have to prepare the inputs \u0022by hand\u0022.\n- */\n-\n-static uint8_t\n-\n-jwa_b2_ptext[] \u003d {\n-\t0x41, 0x20, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72,\n-\t0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,\n-\t0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,\n-\t0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,\n-\t0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,\n-\t0x62, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65,\n-\t0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69,\n-\t0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,\n-\t0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74,\n-\t0x6f, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69,\n-\t0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,\n-\t0x68, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66,\n-\t0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x65,\n-\t0x6d, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,\n-\t0x75, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e,\n-\t0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65\n-},\n-\n-jwa_b2_rawkey[] \u003d {\n-\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n-\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n-\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n-\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\n-\t0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n-\t0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n-},\n-\n-jwa_b2_iv[] \u003d {\n-\t0x1a, 0xf3, 0x8c, 0x2d, 0xc2, 0xb9, 0x6f, 0xfd,\n-\t0xd8, 0x66, 0x94, 0x09, 0x23, 0x41, 0xbc, 0x04\n-},\n-\n-jwa_b2_e[] \u003d {\n-\t0xea, 0x65, 0xda, 0x6b, 0x59, 0xe6, 0x1e, 0xdb,\n-\t0x41, 0x9b, 0xe6, 0x2d, 0x19, 0x71, 0x2a, 0xe5,\n-\t0xd3, 0x03, 0xee, 0xb5, 0x00, 0x52, 0xd0, 0xdf,\n-\t0xd6, 0x69, 0x7f, 0x77, 0x22, 0x4c, 0x8e, 0xdb,\n-\t0x00, 0x0d, 0x27, 0x9b, 0xdc, 0x14, 0xc1, 0x07,\n-\t0x26, 0x54, 0xbd, 0x30, 0x94, 0x42, 0x30, 0xc6,\n-\t0x57, 0xbe, 0xd4, 0xca, 0x0c, 0x9f, 0x4a, 0x84,\n-\t0x66, 0xf2, 0x2b, 0x22, 0x6d, 0x17, 0x46, 0x21,\n-\t0x4b, 0xf8, 0xcf, 0xc2, 0x40, 0x0a, 0xdd, 0x9f,\n-\t0x51, 0x26, 0xe4, 0x79, 0x66, 0x3f, 0xc9, 0x0b,\n-\t0x3b, 0xed, 0x78, 0x7a, 0x2f, 0x0f, 0xfc, 0xbf,\n-\t0x39, 0x04, 0xbe, 0x2a, 0x64, 0x1d, 0x5c, 0x21,\n-\t0x05, 0xbf, 0xe5, 0x91, 0xba, 0xe2, 0x3b, 0x1d,\n-\t0x74, 0x49, 0xe5, 0x32, 0xee, 0xf6, 0x0a, 0x9a,\n-\t0xc8, 0xbb, 0x6c, 0x6b, 0x01, 0xd3, 0x5d, 0x49,\n-\t0x78, 0x7b, 0xcd, 0x57, 0xef, 0x48, 0x49, 0x27,\n-\t0xf2, 0x80, 0xad, 0xc9, 0x1a, 0xc0, 0xc4, 0xe7,\n-\t0x9c, 0x7b, 0x11, 0xef, 0xc6, 0x00, 0x54, 0xe3\n-},\n-\n-jwa_b2_a[] \u003d { /* \u0022The second principle of Auguste Kerckhoffs\u0022 */\n-\t0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f,\n-\t0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63,\n-\t0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20,\n-\t0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x65, 0x20,\n-\t0x4b, 0x65, 0x72, 0x63, 0x6b, 0x68, 0x6f, 0x66,\n-\t0x66, 0x73\n-},\n-\n-jwa_b2_tag[] \u003d {\n-\t0x84, 0x90, 0xac, 0x0e, 0x58, 0x94, 0x9b, 0xfe,\n-\t0x51, 0x87, 0x5d, 0x73, 0x3f, 0x93, 0xac, 0x20,\n-\t0x75, 0x16, 0x80, 0x39, 0xcc, 0xc7, 0x33, 0xd7\n-\n-}\n-;\n-\n-static int\n-test_jwa_b2(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tint n, ret \u003d -1;\n-\tchar buf[2048];\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\t/*\n-\t * normally all this is interpreted from the JWE blob. But we don't\n-\t * have JWE test vectors for AES_256_CBC_HMAC_SHA_512, just a standalone\n-\t * one. So we have to create it all by hand.\n-\t *\n-\t * See test_jwe_a3 above for a more normal usage pattern.\n-\t */\n-\n-\tlws_jwk_dup_oct(\u0026jwe.jwk, jwa_b2_rawkey, sizeof(jwa_b2_rawkey));\n-\n-\tmemcpy(buf, jwa_b2_e, sizeof(jwa_b2_e));\n-\n-\tjwe.jws.map.buf[LJWE_IV] \u003d (char *)jwa_b2_iv;\n-\tjwe.jws.map.len[LJWE_IV] \u003d sizeof(jwa_b2_iv);\n-\n-\tjwe.jws.map.buf[LJWE_CTXT] \u003d buf;\n-\tjwe.jws.map.len[LJWE_CTXT] \u003d sizeof(jwa_b2_e);\n-\n-\tjwe.jws.map.buf[LJWE_ATAG] \u003d (char *)jwa_b2_tag;\n-\tjwe.jws.map.len[LJWE_ATAG] \u003d sizeof(jwa_b2_tag);\n-\n-\t/*\n-\t * Normally this comes from the JOSE header. But this test vector\n-\t * doesn't have one... so...\n-\t */\n-\n-\tif (lws_gencrypto_jwe_alg_to_definition(\u0022A128KW\u0022, \u0026jwe.jose.alg))\n-\t\tgoto bail;\n-\tif (lws_gencrypto_jwe_enc_to_definition(\u0022A192CBC-HS384\u0022,\n-\t\t\t\t\t\t\u0026jwe.jose.enc_alg))\n-\t\tgoto bail;\n-\n-\tn \u003d lws_jwe_auth_and_decrypt_cbc_hs(\u0026jwe, jwa_b2_rawkey,\n-\t\t\t\t\t\t jwa_b2_a, sizeof(jwa_b2_a));\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_a_cbc_hs_decrypt failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(jwa_b2_ptext) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT],jwa_b2_ptext,\n-\t\t\t sizeof(jwa_b2_ptext))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(jwa_b2_ptext, sizeof(jwa_b2_ptext));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-\n-\n-/* JWA B.3. Test Cases for AES_256_CBC_HMAC_SHA_512\n- *\n- * Unfortunately JWA just gives this test case as hex literals, not\n- * inside a JWE. So we have to prepare the inputs \u0022by hand\u0022.\n- */\n-\n-static uint8_t\n-\n-jwa_b3_ptext[] \u003d {\n-\t0x41, 0x20, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72,\n-\t0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,\n-\t0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,\n-\t0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,\n-\t0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,\n-\t0x62, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65,\n-\t0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69,\n-\t0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,\n-\t0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74,\n-\t0x6f, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69,\n-\t0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,\n-\t0x68, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66,\n-\t0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x65,\n-\t0x6d, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,\n-\t0x75, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e,\n-\t0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65\n-},\n-\n-\n-jwa_b3_rawkey[] \u003d {\n-\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n-\t0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n-\t0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n-\t0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\n-\t0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n-\t0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n-\t0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,\n-\t0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f\n-},\n-\n-jwa_b3_iv[] \u003d {\n-\t0x1a, 0xf3, 0x8c, 0x2d, 0xc2, 0xb9, 0x6f, 0xfd,\n-\t0xd8, 0x66, 0x94, 0x09, 0x23, 0x41, 0xbc, 0x04\n-},\n-\n-jwa_b3_e[] \u003d {\n-\t0x4a, 0xff, 0xaa, 0xad, 0xb7, 0x8c, 0x31, 0xc5,\n-\t0xda, 0x4b, 0x1b, 0x59, 0x0d, 0x10, 0xff, 0xbd,\n-\t0x3d, 0xd8, 0xd5, 0xd3, 0x02, 0x42, 0x35, 0x26,\n-\t0x91, 0x2d, 0xa0, 0x37, 0xec, 0xbc, 0xc7, 0xbd,\n-\t0x82, 0x2c, 0x30, 0x1d, 0xd6, 0x7c, 0x37, 0x3b,\n-\t0xcc, 0xb5, 0x84, 0xad, 0x3e, 0x92, 0x79, 0xc2,\n-\t0xe6, 0xd1, 0x2a, 0x13, 0x74, 0xb7, 0x7f, 0x07,\n-\t0x75, 0x53, 0xdf, 0x82, 0x94, 0x10, 0x44, 0x6b,\n-\t0x36, 0xeb, 0xd9, 0x70, 0x66, 0x29, 0x6a, 0xe6,\n-\t0x42, 0x7e, 0xa7, 0x5c, 0x2e, 0x08, 0x46, 0xa1,\n-\t0x1a, 0x09, 0xcc, 0xf5, 0x37, 0x0d, 0xc8, 0x0b,\n-\t0xfe, 0xcb, 0xad, 0x28, 0xc7, 0x3f, 0x09, 0xb3,\n-\t0xa3, 0xb7, 0x5e, 0x66, 0x2a, 0x25, 0x94, 0x41,\n-\t0x0a, 0xe4, 0x96, 0xb2, 0xe2, 0xe6, 0x60, 0x9e,\n-\t0x31, 0xe6, 0xe0, 0x2c, 0xc8, 0x37, 0xf0, 0x53,\n-\t0xd2, 0x1f, 0x37, 0xff, 0x4f, 0x51, 0x95, 0x0b,\n-\t0xbe, 0x26, 0x38, 0xd0, 0x9d, 0xd7, 0xa4, 0x93,\n-\t0x09, 0x30, 0x80, 0x6d, 0x07, 0x03, 0xb1, 0xf6,\n-},\n-\n-jwa_b3_a[] \u003d { /* \u0022The second principle of Auguste Kerckhoffs\u0022 */\n-\t0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f,\n-\t0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63,\n-\t0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20,\n-\t0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x65, 0x20,\n-\t0x4b, 0x65, 0x72, 0x63, 0x6b, 0x68, 0x6f, 0x66,\n-\t0x66, 0x73\n-},\n-\n-jws_b3_tag[] \u003d {\n-\t0x4d, 0xd3, 0xb4, 0xc0, 0x88, 0xa7, 0xf4, 0x5c,\n-\t0x21, 0x68, 0x39, 0x64, 0x5b, 0x20, 0x12, 0xbf,\n-\t0x2e, 0x62, 0x69, 0xa8, 0xc5, 0x6a, 0x81, 0x6d,\n-\t0xbc, 0x1b, 0x26, 0x77, 0x61, 0x95, 0x5b, 0xc5\n-}\n-;\n-\n-static int\n-test_jwa_b3(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar buf[2048];\n-\tint n, ret \u003d -1;\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\t/*\n-\t * normally all this is interpreted from the JWE blob. But we don't\n-\t * have JWE test vectors for AES_256_CBC_HMAC_SHA_512, just a standalone\n-\t * one. So we have to create it all by hand.\n-\t *\n-\t * See test_jwe_a3 above for a more normal usage pattern.\n-\t */\n-\n-\tlws_jwk_dup_oct(\u0026jwe.jwk, jwa_b3_rawkey, sizeof(jwa_b3_rawkey));\n-\n-\tmemcpy(buf, jwa_b3_e, sizeof(jwa_b3_e));\n-\n-\tjwe.jws.map.buf[LJWE_IV] \u003d (char *)jwa_b3_iv;\n-\tjwe.jws.map.len[LJWE_IV] \u003d sizeof(jwa_b3_iv);\n-\n-\tjwe.jws.map.buf[LJWE_CTXT] \u003d buf;\n-\tjwe.jws.map.len[LJWE_CTXT] \u003d sizeof(jwa_b3_e);\n-\n-\tjwe.jws.map.buf[LJWE_ATAG] \u003d (char *)jws_b3_tag;\n-\tjwe.jws.map.len[LJWE_ATAG] \u003d sizeof(jws_b3_tag);\n-\n-\t/*\n-\t * Normally this comes from the JOSE header. But this test vector\n-\t * doesn't feature one...\n-\t */\n-\n-\tif (lws_gencrypto_jwe_alg_to_definition(\u0022A128KW\u0022, \u0026jwe.jose.alg))\n-\t\tgoto bail;\n-\tif (lws_gencrypto_jwe_enc_to_definition(\u0022A256CBC-HS512\u0022,\n-\t\t\t\t\t\t\u0026jwe.jose.enc_alg))\n-\t\tgoto bail;\n-\n-\tn \u003d lws_jwe_auth_and_decrypt_cbc_hs(\u0026jwe, jwa_b3_rawkey,\n-\t\t\t\t\t\t jwa_b3_a, sizeof(jwa_b3_a));\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_a_cbc_hs_decrypt failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c sizeof(jwa_b3_ptext) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT],jwa_b3_ptext,\n-\t\t\t sizeof(jwa_b3_ptext))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(jwa_b3_ptext, sizeof(jwa_b3_ptext));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-/* JWA C. Example ECDH-ES Key Agreement Computation\n- *\n- * This example uses ECDH-ES Key Agreement and the Concat KDF to derive\n- * the CEK in the manner described in Section 4.6. In this example, the\n- * ECDH-ES Direct Key Agreement mode (\u0022alg\u0022 value \u0022ECDH-ES\u0022) is used to\n- * produce an agreed-upon key for AES GCM with a 128-bit key (\u0022enc\u0022\n- * value \u0022A128GCM\u0022).\n- *\n- * In this example, a producer Alice is encrypting content to a consumer\n- * Bob. The producer (Alice) generates an ephemeral key for the key\n- * agreement computation.\n- *\n- * JWA Appendix C where this comes from ONLY goes as far as to confirm the\n- * direct derived key, it doesn't do any AES128-GCM.\n- */\n-\n-static const char\n-\n-*ex_jwa_c_jose \u003d\n-\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022enc\u005c\u0022:\u005c\u0022A128GCM\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022apu\u005c\u0022:\u005c\u0022QWxpY2U\u005c\u0022,\u0022\t/* b64u(\u0022Alice\u0022) */\n-\t \u0022\u005c\u0022apv\u005c\u0022:\u005c\u0022Qm9i\u005c\u0022,\u0022\t/* b64u(\u0022Bob\u0022) */\n-\t \u0022\u005c\u0022epk\u005c\u0022:\u0022 /* public part of A's ephemeral key */\n-\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps\u005c\u0022\u0022\n-\t \u0022}\u0022\n-\t\u0022}\u0022\n-;\n-\n-static uint8_t\n-ex_jwa_c_z[] \u003d {\n-\t158, 86, 217, 29, 129, 113, 53, 211,\n-\t114, 131, 66, 131, 191, 132, 38, 156,\n-\t251, 49, 110, 163, 218, 128, 106, 72,\n-\t246, 218, 167, 121, 140, 254, 144, 196\n-},\n-ex_jwa_c_derived_key[] \u003d {\n-\t 86, 170, 141, 234, 248, 35, 109, 32,\n-\t 92, 34, 40, 205, 113, 167, 16, 26\n-};\n-\n-\n-static int\n-test_jwa_c(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[2048], *p;\n-\tint ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\t/*\n-\t * again the JWA Appendix C test vectors are not in the form of a\n-\t * complete JWE, but just the JWE JOSE header, so we must fake up the\n-\t * pieces and perform just the (normally internal) key agreement step\n-\t * for this test.\n-\t *\n-\t * See test_jwe_a3 above for a more normal usage pattern.\n-\t */\n-\n-\tif (lws_jwe_parse_jose(\u0026jwe.jose, ex_jwa_c_jose, (int)strlen(ex_jwa_c_jose),\n-\t\t\t temp, \u0026temp_len) \u003c 0) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * The ephemeral key has been parsed into a jwk \u0022jwe.jose.jwk_ephemeral\u0022\n-\t *\n-\t * In this example, the ECDH-ES Direct Key Agreement mode (\u0022alg\u0022 value\n-\t * \u0022ECDH-ES\u0022) is used to produce an agreed-upon key for AES GCM with a\n-\t * 128-bit key (\u0022enc\u0022 value \u0022A128GCM\u0022).\n-\t */\n-\n-\tp \u003d lws_concat_temp(temp, temp_len);\n-\n-\tif (lws_jwa_concat_kdf(\u0026jwe, 1, (uint8_t *)p,\n-\t\t\t ex_jwa_c_z, sizeof(ex_jwa_c_z))) {\n-\t\tlwsl_err(\u0022%s: lws_jwa_concat_kdf failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (lws_timingsafe_bcmp(p, ex_jwa_c_derived_key,\n-\t\t\t sizeof(ex_jwa_c_derived_key))) {\n-\t\tlwsl_err(\u0022%s: ECDH-ES direct derived key wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ex_jwa_c_derived_key,\n-\t\t\t\t sizeof(ex_jwa_c_derived_key));\n-\t\tlwsl_hexdump_notice(p, sizeof(ex_jwa_c_derived_key));\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-\n-/*\n- * ECDH-ES Homebrew Encryption test\n- */\n-\n-static const char\n-\n-\t/* peer key */\n-\n-*ecdhes_t1_peer_p256_public_key \u003d /* as below but with d removed */\n-\t\u0022{\u0022\n-\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022ySlIGttmXG80WPjDO01QaXg7oAzW3NE-a-GF0NDGk_E\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022i08k5z4ppqgtnLK8lh5qw4qp2FhxPdGjovgilajluuw\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-\n-*ecdhes_t1_peer_p256_private_key \u003d /* created by ./lws-crypto-jwk -t EC */\n-\t\u0022{\u0022\n-\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022ldszv0_cGFMkjxaPspGCP6X0NAaVCVeK48oH4RzT2T0\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022ySlIGttmXG80WPjDO01QaXg7oAzW3NE-a-GF0NDGk_E\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022i08k5z4ppqgtnLK8lh5qw4qp2FhxPdGjovgilajluuw\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-\n-*ecdhes_t1_peer_p384_public_key \u003d /* as below but with d removed */\n-\t\u0022{\u005c\u0022crv\u005c\u0022:\u005c\u0022P-384\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022injKcygDoG1AuP044ct88r_2DNinHr1CGqy4q2Sy5yo034Y\u0022\n-\t\t \u00227yQ5_NT-lEUXrzlIW\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022y52QaJLhVm-ts8xa1jL8GkmwGm_dX6xV1PSq4s3pbwx2Hu9\u0022\n-\t\t \u0022X29z5WYcTPFOCPtwJ\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_peer_p384_private_key \u003d /* created by ./lws-crypto-jwk -t EC -v \u0022P-384\u0022 */\n-\t\u0022{\u005c\u0022crv\u005c\u0022:\u005c\u0022P-384\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022jYGze6ZwZxrflVx_I2lYWNf9GkfbeQNRwQCdtZhBlb85lk-\u0022\n-\t\t \u0022SAvaZuNiRUs_eWmPQ\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022injKcygDoG1AuP044ct88r_2DNinHr1CGqy4q2Sy5yo034Y\u0022\n-\t\t \u00227yQ5_NT-lEUXrzlIW\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022y52QaJLhVm-ts8xa1jL8GkmwGm_dX6xV1PSq4s3pbwx2Hu9\u0022\n-\t\t \u0022X29z5WYcTPFOCPtwJ\u005c\u0022}\u0022,\n-\n- *ecdhes_t1_peer_p521_public_key \u003d /* as below but with d removed */\n-\t\u0022{\u005c\u0022crv\u005c\u0022:\u005c\u0022P-521\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022AYe0gAkPzzjeQW5Ek9tVrWdfi0u6k7LVUru-b2x7V9EM3d\u0022\n-\t\t \u0022L4SbQiS1p2j2gmZ2a6aDoKDRU_2E4u9EQrlswlty-g\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022AEAIIRkVL0WhtDlDSM7dciBtL1dOo5UPiW7ixIOv5K75Mo\u0022\n-\t\t \u0022uFNWO7cFmcxaCOn9459ex0giVyptmX_956C_DWabG6\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_peer_p521_private_key \u003d /* created by ./lws-crypto-jwk -t EC -v \u0022P-521\u0022 */\n-\t\u0022{\u005c\u0022crv\u005c\u0022:\u005c\u0022P-521\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022AUer7_-qJtQtDWN6CMeGB20rzTa648kpsfidTOu3lnn6__\u0022\n-\t\t \u0022yOXkMj1yTYUBjVOnUjGHiTU1rCGsw4CyF-1nDRe7SM\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022AYe0gAkPzzjeQW5Ek9tVrWdfi0u6k7LVUru-b2x7V9EM3d\u0022\n-\t\t \u0022L4SbQiS1p2j2gmZ2a6aDoKDRU_2E4u9EQrlswlty-g\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022AEAIIRkVL0WhtDlDSM7dciBtL1dOo5UPiW7ixIOv5K75Mo\u0022\n-\t\t \u0022uFNWO7cFmcxaCOn9459ex0giVyptmX_956C_DWabG6\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_jose_hdr_es_128 \u003d\n-\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A128CBC-HS256\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_jose_hdr_es_192 \u003d\n-\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A192CBC-HS384\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_jose_hdr_es_256 \u003d\n-\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A256CBC-HS512\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_jose_hdr_esakw128_128 \u003d\n-\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES+A128KW\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A128CBC-HS256\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_jose_hdr_esakw192_192 \u003d\n-\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES+A192KW\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A192CBC-HS384\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_jose_hdr_esakw256_256 \u003d\n-\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ECDH-ES+A256KW\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022A256CBC-HS512\u005c\u0022}\u0022,\n-\n-*ecdhes_t1_plaintext \u003d\n-\t\u0022This test plaintext is exactly 64 bytes long when unencrypted...\u0022\n-;\n-\n-static int\n-test_ecdhes_t1(struct lws_context *context, const char *jose_hdr,\n-\t const char *peer_pubkey, const char *peer_privkey)\n-{\n-\tchar temp[3072], compact[2048];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\tstruct lws_jwe jwe;\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\t/* read and interpret our canned JOSE header, setting the algorithm */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWS_JOSE,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tjose_hdr, strlen(jose_hdr), 0))\n-\t\tgoto bail;\n-\n-\tif (lws_jwe_parse_jose(\u0026jwe.jose, jose_hdr, (int)strlen(jose_hdr),\n-\t\t\t temp, \u0026temp_len) \u003c 0) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\t/* for ecdh-es encryption, we need the peer's pubkey */\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)peer_pubkey,\n-\t\t\t strlen((char *)peer_pubkey)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * dup the plaintext into the ciphertext element, it will be\n-\t * encrypted in-place to a ciphertext of the same length + padding\n-\t */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\tecdhes_t1_plaintext,\n-\t\t\t\tstrlen(ecdhes_t1_plaintext),\n-\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n-\t\t\t\t\t\tstrlen(ecdhes_t1_plaintext)))) {\n-\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * perform the actual encryption\n-\t */\n-\n-\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len), \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * format for output\n-\t */\n-\n-\tn \u003d lws_jwe_render_flattened(\u0026jwe, compact, sizeof(compact));\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022,\n-\t\t\t __func__, n);\n-\t\tgoto bail;\n-\t}\n-\n-\t// puts(compact);\n-\n-\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, sizeof(compact));\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022,\n-\t\t\t __func__, n);\n-\t\tgoto bail;\n-\t}\n-\n-\t// puts(compact);\n-\n-\t/* okay, let's try to decrypt the whole thing, as the recipient\n-\t * getting the compact. jws-\u003ejwk needs to be our private key. */\n-\n-\tlws_jwe_destroy(\u0026jwe);\n-\ttemp_len \u003d sizeof(temp);\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, (char *)peer_privkey,\n-\t\t\t strlen((char *)peer_privkey)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* converts a compact serialization to jws b64 + decoded maps */\n-\tif (lws_jws_compact_decode(compact, (int)strlen(compact), \u0026jwe.jws.map,\n-\t\t\t\t \u0026jwe.jws.map_b64, temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: %s selftest failed +++++++++++++++++++\u005cn\u0022,\n-\t\t\t __func__, jose_hdr);\n-\telse\n-\t\tlwsl_notice(\u0022%s: %s selftest OK\u005cn\u0022, __func__, jose_hdr);\n-\n-\treturn ret;\n-}\n-\n-/* AES Key Wrap and AES_XXX_CBC_HMAC_SHA_YYY variations\n- *\n- * These were created using the node-jose node.js package\n- */\n-static const char\n-\t*akw_ptext \u003d \u0022plaintext0123456\u0022,\n-\t*akw_ct_128_128 \u003d \u0022eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii\u0022\n-\t\u0022wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC\u0022\n-\t\u0022J9.h6oNSEgz3LwIMndEkPEa8H7_5zy0hh8TaU_1yWoNtu4Dh_WJpEgx9g.j7TYjj8wB0\u0022\n-\t\u0022RS6rclTWYmqw.zm3tPzuWhXoD7IsAWbA0xz-AJXvE9gydWPRBTaO40sQ.Okf7ttWDLPM\u0022\n-\t\u0022wIj1kUyUO_A\u0022,\n-\t*akw_ct_128_192 \u003d \u0022eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii\u0022\n-\t\u0022wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC\u0022\n-\t\u0022J9.XkRTu4nP3b0KZxXjkjdHEnbf6AWZUmFvpsqZLuLxKcrONqDUsnYasnVuo6U0QKRUm\u0022\n-\t\u0022cyBRtSPGW4.MzNxxoOp8JR2AHoLNve-vw.rdxgo6InRAxk3afG02_75l58u5m6KYHd3h\u0022\n-\t\u0022LH16ksnZE.v7BLKaRZIwhUPhhBRTd8yPwH0xa1fOft\u0022,\n-\t*akw_ct_128_256 \u003d \u0022eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi\u0022\n-\t\u0022wia2lkIjoiLTRXTEpQNWNrYUxBUFFFNXkwYXhLT0JUSTlFTngxUXBCa0toNkdOY2loOC\u0022\n-\t\u0022J9.mueR-8XzXs2RyvzzvghpIpGS1mGl7vkSjJDF5zqhH8-ektBpCXSd7R7MS5nh2-Xf_\u0022\n-\t\u00228XDym1gn1QEQh5bDI3GPESnSN1TJR-h.g6plL_5L2BD8wcjZS7X79A.UTndfTFhGFaVZ\u0022\n-\t\u0022vWqPkV7dN00gckesd_7UylosVDqjwU.-rgi0jkYuCZDMwUVLxN6e6x8fXw2U0u4-vL8u\u0022\n-\t\u0022Kb__S8\u0022,\n-\t*akw_ct_192_128 \u003d \u0022eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii\u0022\n-\t\u0022wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS\u0022\n-\t\u0022J9.mEURnj2NvPa3TU0uR8mcm2cMd33Y6iYYZ_LFrYS_Gz49gcdxZpdk1Q.v3csq81X9o\u0022\n-\t\u0022mI-bcp6i-FTQ.EgroRqmqNfeH7XC9msLap1IGcqvc09SlnI4PO6RQqS0.hDi57mXD3vX\u0022\n-\t\u0022dx2r4Kwnv9w\u0022,\n-\t*akw_ct_192_192 \u003d \u0022eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii\u0022\n-\t\u0022wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS\u0022\n-\t\u0022J9.QHgtusQdP7Zvw9tsCZNkJyEmzg6KUaaIyTb2BXB0ng9mxSUIQ7y_6oqasYKBUJgBn\u0022\n-\t\u0022Koru-3CXOE.ZZXcGY35mmlAb4-IgA5XlQ.AuG2GRPeYJ80_4XoYAUgXbVY65ZQ689Grn\u0022\n-\t\u0022x8RCNQdfc.UjfgDr4z3PGQBdftWT2gqx1Egfd9PUR4\u0022,\n-\t*akw_ct_192_256 \u003d \u0022eyJhbGciOiJBMTkyS1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi\u0022\n-\t\u0022wia2lkIjoiai10RWp2Q2JyNVlUZWtKUXlES3kyQXh5cjBWeUlUWXk4S3IycjB0cy1USS\u0022\n-\t\u0022J9.G6DziymYyU3-6unIa-Oz-0lksH05OJFDZKkFuShMuoazEMZ5ZH2S_65qD-pjpf8aN\u0022\n-\t\u00222thOVOYT0mdtgFM0ARUfx8ZLhRFCcn1.yEKK4eARZIo9WtGVcQmgDQ.ovan2NXDmt_Ka\u0022\n-\t\u0022SsVJmhIMQqVz6meqz1oExfVcY8vdzA.R3T4lQIKX5cc2Ktv42e9u5PR--v_w2uK7F4Wp\u0022\n-\t\u0022Sr5SQ8\u0022,\n-\t*akw_ct_256_128 \u003d \u0022eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii\u0022\n-\t\u0022wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy\u0022\n-\t\u0022J9.ZLWrz5CE7Iav2db37VL9ZABeaRVrV9af-7-46Loc9M2D0SPSNtsxpg.ktk-VU8-5b\u0022\n-\t\u0022XRvW_A6IqDjQ.xZVIglOhadDBHUYuxPx6Wr_YzOo0qCDH24xVe58qP9Q.pO_tME930wO\u0022\n-\t\u0022u5fNJ8ubGrw\u0022,\n-\t*akw_ct_256_192 \u003d \u0022eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMTkyQ0JDLUhTMzg0Ii\u0022\n-\t\u0022wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy\u0022\n-\t\u0022J9.fcblAVZ7VOXtyhymqxDBr-zgvId18p3AURNbhH5FmAvKNuUVU37xPkz6BrFopLP0J\u0022\n-\t\u0022jqXaTyyg1s.fprTe2e0esH2w7EnLEgBZQ.g1BI0U1aKSM_JBEp9jC4BxBaFXVG5BW4nl\u0022\n-\t\u0022bhX1MDeLo.XOLanrIkitLLDRONnfM05avahl_lJ_UY\u0022,\n-\t*akw_ct_256_256 \u003d \u0022eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIi\u0022\n-\t\u0022wia2lkIjoiSDVwSzRRUU81U0tHbDA3UXhIdk9YMzVqS2FJbzA2NXVLdWRubVZFZVpJYy\u0022\n-\t\u0022J9.SpizfgtzQLJCCnYnUmNfiMMTyL8iIDi8OyUDrO00KJtfwJdNAcs-NuYQkLKx6PlDJ\u0022\n-\t\u0022IGjucT4-IuA8k_Oc752kq1BzTHMZ-Mo.go-e8xpQoCmLD5RBQw7ruA.WqkEdM6T1_z5F\u0022\n-\t\u0022C-8eGQfGjos7cHPy1ecZk1Ep-TYgXo.bZVHhIpe2PbjguQlK_afkYDlVmEtRAe3LUJUX\u0022\n-\t\u00224STOtU\u0022,\n-\t*akw_key_128 \u003d \u0022{\u005c\u0022k\u005c\u0022:\u005c\u0022JjVJVh8JsXvKf9qgHHWWBA\u005c\u0022,\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022}\u0022,\n-\t*akw_key_192 \u003d \u0022{\u005c\u0022k\u005c\u0022:\u005c\u0022BYF6urCMDRMKFXXRxXrDSVtW71AUZghj\u005c\u0022,\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022}\u0022,\n-\t*akw_key_256 \u003d \u0022{\u005c\u0022k\u005c\u0022:\u005c\u0022cSHyZXGEfnlgKud21cM6tAxRyXnK6xbWRTsyLUegTMk\u005c\u0022,\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022}\u0022\n-;\n-\n-static int\n-test_akw_decrypt(struct lws_context *context, const char *test_name,\n-\t\t const char *ciphertext, const char *key)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[2048];\n-\tint n, ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, key, strlen(key)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* converts a compact serialization to jws b64 + decoded maps */\n-\tif (lws_jws_compact_decode(ciphertext, (int)strlen(ciphertext),\n-\t\t\t\t \u0026jwe.jws.map, \u0026jwe.jws.map_b64,\n-\t\t\t\t temp, \u0026temp_len) !\u003d 5) {\n-\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe, lws_concat_temp(temp, temp_len), \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* allowing for trailing padding, confirm the plaintext */\n-\tif (jwe.jws.map.len[LJWE_CTXT] \u003c strlen(akw_ptext) ||\n-\t lws_timingsafe_bcmp(jwe.jws.map.buf[LJWE_CTXT], akw_ptext,\n-\t\t\t (uint32_t)strlen(akw_ptext))) {\n-\t\tlwsl_err(\u0022%s: plaintext AES decrypt wrong\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(akw_ptext, strlen(akw_ptext));\n-\t\tlwsl_hexdump_notice(jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t\t jwe.jws.map.len[LJWE_CTXT]);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest %s failed +++++++++++++++++++\u005cn\u0022,\n-\t\t\t__func__, test_name);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest %s OK\u005cn\u0022, __func__, test_name);\n-\n-\treturn ret;\n-}\n-\n-static int\n-test_akw_encrypt(struct lws_context *context, const char *test_name,\n-\t\t const char *alg, const char *enc, const char *ciphertext,\n-\t\t const char *key, char *compact, int compact_len)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[4096];\n-\tint ret \u003d -1, n, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwk_import(\u0026jwe.jwk, NULL, NULL, key, strlen(key)) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: Failed to decode JWK test key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_gencrypto_jwe_alg_to_definition(alg, \u0026jwe.jose.alg)) {\n-\t\tlwsl_err(\u0022Unknown cipher alg %s\u005cn\u0022, alg);\n-\t\tgoto bail;\n-\t}\n-\tif (lws_gencrypto_jwe_enc_to_definition(enc, \u0026jwe.jose.enc_alg)) {\n-\t\tlwsl_err(\u0022Unknown payload enc alg %s\u005cn\u0022, enc);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* we require a JOSE-formatted header to do the encryption */\n-\n-\tjwe.jws.map.buf[LJWS_JOSE] \u003d temp;\n-\tjwe.jws.map.len[LJWS_JOSE] \u003d (uint32_t)lws_snprintf(temp, (unsigned int)temp_len,\n-\t\t\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022%s\u005c\u0022, \u005c\u0022enc\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022, alg, enc);\n-\ttemp_len -\u003d (int)jwe.jws.map.len[LJWS_JOSE];\n-\n-\t/*\n-\t * dup the plaintext into the ciphertext element, it will be\n-\t * encrypted in-place to a ciphertext of the same length + padding\n-\t */\n-\n-\tif (lws_jws_dup_element(\u0026jwe.jws.map, LJWE_CTXT,\n-\t\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len,\n-\t\t\t\takw_ptext, strlen(akw_ptext),\n-\t\t\t\tlws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN,\n-\t\t\t\t\t\t\t strlen(akw_ptext)))) {\n-\t\tlwsl_notice(\u0022%s: Not enough temp space for ptext\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* CEK size is determined by hash / hmac size */\n-\n-\tn \u003d lws_gencrypto_bits_to_bytes(jwe.jose.enc_alg-\u003ekeybits_fixed);\n-\tif (lws_jws_randomize_element(context, \u0026jwe.jws.map, LJWE_EKEY,\n-\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len, (unsigned int)n,\n-\t\t\t\t LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n-\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t \u0026temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tn \u003d lws_jwe_render_compact(\u0026jwe, compact, (unsigned int)compact_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: lws_jwe_render_compact failed: %d\u005cn\u0022,\n-\t\t\t __func__, n);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest %s failed +++++++++++++++++++\u005cn\u0022,\n-\t\t\t__func__, test_name);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest %s OK\u005cn\u0022, __func__, test_name);\n-\n-\treturn ret;\n-}\n-\n-/*\n- * Check we can handle multi-recipient JWE\n- */\n-\n-static char *complete \u003d\n- \u0022{\u0022\n- \u0022\u005c\u0022protected\u005c\u0022:\u0022\n- \u0022\u005c\u0022eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0\u005c\u0022,\u0022\n- \u0022\u005c\u0022unprotected\u005c\u0022:\u0022\n- \u0022{\u005c\u0022jku\u005c\u0022:\u005c\u0022https://server.example.com/keys.jwks\u005c\u0022},\u0022\n- \u0022\u005c\u0022recipients\u005c\u0022:[\u0022\n-\n-\t\u0022{\u005c\u0022header\u005c\u0022:\u0022\n- \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022RSA1_5\u005c\u0022,\u005c\u0022kid\u005c\u0022:\u005c\u00222011-04-29\u005c\u0022},\u0022\n- \u0022\u005c\u0022encrypted_key\u005c\u0022:\u0022\n- \u0022\u005c\u0022UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-\u0022\n- \u0022kFm1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKx\u0022\n- \u0022GHZ7PcHALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3\u0022\n- \u0022YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPh\u0022\n- \u0022cCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPg\u0022\n- \u0022wCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A\u005c\u0022},\u0022\n-\n- \u0022{\u005c\u0022header\u005c\u0022:\u0022\n- \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022A128KW\u005c\u0022,\u005c\u0022kid\u005c\u0022:\u005c\u00227\u005c\u0022},\u0022\n- \u0022\u005c\u0022encrypted_key\u005c\u0022:\u0022\n- \u0022\u005c\u00226KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ\u005c\u0022}],\u0022\n-\n- \u0022\u005c\u0022iv\u005c\u0022:\u0022\n- \u0022\u005c\u0022AxY8DCtDaGlsbGljb3RoZQ\u005c\u0022,\u0022\n- \u0022\u005c\u0022ciphertext\u005c\u0022:\u0022\n- \u0022\u005c\u0022KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY\u005c\u0022,\u0022\n- \u0022\u005c\u0022tag\u005c\u0022:\u0022\n- \u0022\u005c\u0022Mz-VPPyU4RlcuYv1IwIvzw\u005c\u0022\u0022\n- \u0022}\u005c\u0022\u0022\n-;\n-\n-static int\n-test_jwe_json_complete(struct lws_context *context)\n-{\n-\tstruct lws_jwe jwe;\n-\tchar temp[4096];\n-\tint ret \u003d -1, temp_len \u003d sizeof(temp);\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\tif (lws_jwe_parse_jose(\u0026jwe.jose, complete, (int)strlen(complete),\n-\t\t\t temp, \u0026temp_len) \u003c 0) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (jwe.jose.recipients !\u003d 2) {\n-\t\tlwsl_err(\u0022%s: wrong recipients count %d\u005cn\u0022, __func__,\n-\t\t\t jwe.jose.recipients);\n-\t\tgoto bail;\n-\t}\n-\n-\tret \u003d 0;\n-bail:\n-\tlws_jwe_destroy(\u0026jwe);\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed +++++++++++++++++++\u005cn\u0022,\n-\t\t\t__func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-int\n-test_jwe(struct lws_context *context)\n-{\n-\tchar compact[4096];\n-\tint n \u003d 0;\n-\n-\tn |\u003d test_jwe_json_complete(context);\n-\n-\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_128,\n-\t\t\t ecdhes_t1_peer_p256_public_key,\n-\t\t\t ecdhes_t1_peer_p256_private_key);\n-\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_192,\n-\t\t\t ecdhes_t1_peer_p384_public_key,\n-\t\t\t ecdhes_t1_peer_p384_private_key);\n-\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_es_256,\n-\t\t\t ecdhes_t1_peer_p521_public_key,\n-\t\t\t ecdhes_t1_peer_p521_private_key);\n-\n-\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw128_128,\n-\t\t\t ecdhes_t1_peer_p256_public_key,\n-\t\t\t ecdhes_t1_peer_p256_private_key);\n-\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw192_192,\n-\t\t\t ecdhes_t1_peer_p384_public_key,\n-\t\t\t ecdhes_t1_peer_p384_private_key);\n-\tn |\u003d test_ecdhes_t1(context, ecdhes_t1_jose_hdr_esakw256_256,\n-\t\t\t ecdhes_t1_peer_p521_public_key,\n-\t\t\t ecdhes_t1_peer_p521_private_key);\n-\n-\tn |\u003d test_jwe_a1(context);\n-\n-\tn |\u003d test_jwe_a2(context);\n-\n-\tn |\u003d test_jwe_ra_ptext_1024(context, (char *)lws_jwe_ex_a2_jwk_json,\n-\t\t\t\t (int)strlen((char *)lws_jwe_ex_a2_jwk_json));\n-\tn |\u003d test_jwe_r256a192_ptext(context, (char *)lws_jwe_ex_a2_jwk_json,\n-\t\t\t(int)strlen((char *)lws_jwe_ex_a2_jwk_json));\n-\tn |\u003d test_jwe_r256a256_ptext(context, (char *)lws_jwe_ex_a2_jwk_json,\n-\t\t\t(int)strlen((char *)lws_jwe_ex_a2_jwk_json));\n-\tn |\u003d test_jwe_ra_ptext_1024(context, (char *)rsa_key_2048,\n-\t\t\t(int)strlen((char *)rsa_key_2048));\n-\tn |\u003d test_jwe_r256a192_ptext(context, (char *)rsa_key_2048,\n-\t\t\t(int)strlen((char *)rsa_key_2048));\n-\tn |\u003d test_jwe_r256a256_ptext(context, (char *)rsa_key_2048,\n-\t\t\t(int)strlen((char *)rsa_key_2048));\n-\tn |\u003d test_jwe_ra_ptext_1024(context, (char *)rsa_key_4096,\n-\t\t\t(int)strlen((char *)rsa_key_4096));\n-\tn |\u003d test_jwe_r256a192_ptext(context, (char *)rsa_key_4096,\n-\t\t\t(int)strlen((char *)rsa_key_4096));\n-\tn |\u003d test_jwe_r256a256_ptext(context, (char *)rsa_key_4096,\n-\t\t\t(int)strlen((char *)rsa_key_4096));\n-\tn |\u003d test_jwe_ra_ptext_1024(context, (char *)rsa_key_4096_no_optional,\n-\t\t\t(int)strlen((char *)rsa_key_4096_no_optional));\n-\tn |\u003d test_jwe_r256a192_ptext(context, (char *)rsa_key_4096_no_optional,\n-\t\t\t(int)strlen((char *)rsa_key_4096_no_optional));\n-\tn |\u003d test_jwe_r256a256_ptext(context, (char *)rsa_key_4096_no_optional,\n-\t\t\t(int)strlen((char *)rsa_key_4096_no_optional));\n-\n-\t/* AESKW decrypt all variations */\n-\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a128kw_128\u0022, akw_ct_128_128, akw_key_128);\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a128kw_192\u0022, akw_ct_128_192, akw_key_128);\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a128kw_256\u0022, akw_ct_128_256, akw_key_128);\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a192kw_128\u0022, akw_ct_192_128, akw_key_192);\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a192kw_192\u0022, akw_ct_192_192, akw_key_192);\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a192kw_256\u0022, akw_ct_192_256, akw_key_192);\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a256kw_128\u0022, akw_ct_256_128, akw_key_256);\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a256kw_192\u0022, akw_ct_256_192, akw_key_256);\n-\tn |\u003d test_akw_decrypt(context, \u0022d-a256kw_256\u0022, akw_ct_256_256, akw_key_256);\n-\n-\t/* AESKW encrypt then confirm decrypt */\n-\n-\tif (!test_akw_encrypt(context, \u0022ed-128kw_128\u0022, \u0022A128KW\u0022, \u0022A128CBC-HS256\u0022,\n-\t\t\takw_ptext, akw_key_128, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-128kw_128\u0022, compact, akw_key_128);\n-\telse\n-\t\tn \u003d -1;\n-\tif (!test_akw_encrypt(context, \u0022ed-128kw_192\u0022, \u0022A128KW\u0022, \u0022A192CBC-HS384\u0022,\n-\t\t\takw_ptext, akw_key_128, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-128kw_192\u0022, compact, akw_key_128);\n-\telse\n-\t\tn \u003d -1;\n-\tif (!test_akw_encrypt(context, \u0022ed-128kw_256\u0022, \u0022A128KW\u0022, \u0022A256CBC-HS512\u0022,\n-\t\t\takw_ptext, akw_key_128, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-128kw_256\u0022, compact, akw_key_128);\n-\telse\n-\t\tn \u003d -1;\n-\n-\tif (!test_akw_encrypt(context, \u0022ed-192kw_128\u0022, \u0022A192KW\u0022, \u0022A128CBC-HS256\u0022,\n-\t\t\takw_ptext, akw_key_192, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-192kw_128\u0022, compact, akw_key_192);\n-\telse\n-\t\tn \u003d -1;\n-\tif (!test_akw_encrypt(context, \u0022ed-192kw_192\u0022, \u0022A192KW\u0022, \u0022A192CBC-HS384\u0022,\n-\t\t\takw_ptext, akw_key_192, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-192kw_192\u0022, compact, akw_key_192);\n-\telse\n-\t\tn \u003d -1;\n-\tif (!test_akw_encrypt(context, \u0022ed-192kw_256\u0022, \u0022A192KW\u0022, \u0022A256CBC-HS512\u0022,\n-\t\t\takw_ptext, akw_key_192, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-192kw_256\u0022, compact, akw_key_192);\n-\telse\n-\t\tn \u003d -1;\n-\n-\tif (!test_akw_encrypt(context, \u0022ed-256kw_128\u0022, \u0022A256KW\u0022, \u0022A128CBC-HS256\u0022,\n-\t\t\takw_ptext, akw_key_256, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-256kw_128\u0022, compact, akw_key_256);\n-\telse\n-\t\tn \u003d -1;\n-\tif (!test_akw_encrypt(context, \u0022ed-256kw_192\u0022, \u0022A256KW\u0022, \u0022A192CBC-HS384\u0022,\n-\t\t\takw_ptext, akw_key_256, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-256kw_192\u0022, compact, akw_key_256);\n-\telse\n-\t\tn \u003d -1;\n-\tif (!test_akw_encrypt(context, \u0022ed-256kw_256\u0022, \u0022A256KW\u0022, \u0022A256CBC-HS512\u0022,\n-\t\t\takw_ptext, akw_key_256, compact, sizeof(compact)))\n-\t\tn |\u003d test_akw_decrypt(context, \u0022ed-256kw_256\u0022, compact, akw_key_256);\n-\telse\n-\t\tn \u003d -1;\n-\n-\tn |\u003d test_jwe_r256a128_jwe_openssl(context);\n-\tn |\u003d test_jwe_r256a128_jwe_mbedtls(context);\n-\tn |\u003d test_jwe_a3(context);\n-\tn |\u003d test_jwa_b2(context);\n-\tn |\u003d test_jwa_b3(context);\n-\tn |\u003d test_jwa_c(context);\n-\n-\treturn n;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-jose/jwk.c b/minimal-examples/api-tests/api-test-jose/jwk.c\ndeleted file mode 100644\nindex 2f88ff5..0000000\n--- a/minimal-examples/api-tests/api-test-jose/jwk.c\n+++ /dev/null\n@@ -1,350 +0,0 @@\n-/*\n- * lws-api-test-jose - RFC7517 jwk tests\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-static\n-uint8_t *lws_jwe_ex_a1_jwk_json \u003d (uint8_t *) /* EC + RSA public keys */\n-\t\u0022{\u005c\u0022keys\u005c\u0022:\u0022\n-\t \u0022[\u0022\n-\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u00224Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022use\u005c\u0022:\u005c\u0022enc\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u00221\u005c\u0022},\u0022\n-\n-\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022n\u005c\u0022: \u005c\u00220vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx\u0022\n-\t\u00224cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs\u0022\n-\t\u0022tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2\u0022\n-\t\u0022QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI\u0022\n-\t\u0022SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb\u0022\n-\t\u0022w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022alg\u005c\u0022:\u005c\u0022RS256\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u00222011-04-29\u005c\u0022}\u0022\n-\t \u0022]\u0022\n-\t\u0022}\u0022,\n-\n-*lws_jwe_ex_a2_jwk_json \u003d (uint8_t *) /* EC + RSA private keys */\n-\t\u0022{\u005c\u0022keys\u005c\u0022:\u0022\n-\t \u0022[\u0022\n-\t\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022x\u005c\u0022:\u005c\u0022MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022y\u005c\u0022:\u005c\u00224Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022use\u005c\u0022:\u005c\u0022enc\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022kid\u005c\u0022:\u005c\u00221\u005c\u0022},\u0022\n-\n-\t\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u00220vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4\u0022\n-\t \u0022cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMst\u0022\n-\t \u0022n64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2Q\u0022\n-\t \u0022vzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbIS\u0022\n-\t \u0022D08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw\u0022\n-\t \u00220Ls1jF44-csFCur-kEgU8awapJzKnqDKgw\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022X4cTteJY_gn4FYPsXB8rdXix5vwsg1FLN5E3EaG6RJoVH-HLLKD9\u0022\n-\t \u0022M7dx5oo7GURknchnrRweUkC7hT5fJLM0WbFAKNLWY2vv7B6NqXSzUvxT0_YSfqij\u0022\n-\t \u0022wp3RTzlBaCxWp4doFk5N2o8Gy_nHNKroADIkJ46pRUohsXywbReAdYaMwFs9tv8d\u0022\n-\t \u0022_cPVY3i07a3t8MN6TNwm0dSawm9v47UiCl3Sk5ZiG7xojPLu4sbg1U2jx4IBTNBz\u0022\n-\t \u0022nbJSzFHK66jT8bgkuqsk0GjskDJk19Z4qwjwbsnn4j2WBii3RL-Us2lGVkY8fkFz\u0022\n-\t \u0022me1z0HbIkfz0Y6mqnOYtqc0X4jfcKoAC8Q\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u002283i-7IvMGXoMXCskv73TKr8637FiO7Z27zv8oj6pbWUQyLPQBQxtPV\u0022\n-\t \u0022nwD20R-60eTDmD2ujnMt5PoqMrm8RfmNhVWDtjjMmCMjOpSXicFHj7XOuVIYQyqV\u0022\n-\t \u0022WlWEh6dN36GVZYk93N8Bc9vY41xy8B9RzzOGVQzXvNEvn7O0nVbfs\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u00223dfOR9cuYq-0S-mkFLzgItgMEfFzB2q3hWehMuG0oCuqnb3vobLyum\u0022\n-\t \u0022qjVZQO1dIrdwgTnCdpYzBcOfW5r370AFXjiWft_NGEiovonizhKpo9VVS78TzFgx\u0022\n-\t \u0022kIdrecRezsZ-1kYd_s1qDbxtkDEgfAITAG9LUnADun4vIcb6yelxk\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022G4sPXkc6Ya9y8oJW9_ILj4xuppu0lzi_H7VTkS8xj5SdX3coE0oim\u0022\n-\t \u0022YwxIi2emTAue0UOa5dpgFGyBJ4c8tQ2VF402XRugKDTP8akYhFo5tAA77Qe_Nmtu\u0022\n-\t \u0022YZc3C3m3I24G2GvR5sSDxUyAN2zq8Lfn9EUms6rY3Ob8YeiKkTiBj0\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022s9lAH9fggBsoFR8Oac2R_E2gw282rT2kGOAhvIllETE1efrA6huUU\u0022\n-\t \u0022vMfBcMpn8lqeW6vzznYY5SSQF7pMdC_agI3nG8Ibp1BUb0JUiraRNqUfLhcQb_d9\u0022\n-\t \u0022GF4Dh7e74WbRsobRonujTYN1xCaP6TO61jvWrX-L18txXw494Q_cgk\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022GyM_p6JrXySiz1toFgKbWV-JdI3jQ4ypu9rbMWx3rQJBfmt0FoYzg\u0022\n-\t \u0022UIZEVFEcOqwemRN81zoDAaa-Bk0KWNGDjJHZDdDmFhW3AN7lI-puxk_mHZGJ11rx\u0022\n-\t \u0022yR8O55XLSe3SPmRfKwZI6yU24ZxvQKFYItdldUKGzO6Ia6zTKhAVRU\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022alg\u005c\u0022:\u005c\u0022RS256\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022kid\u005c\u0022:\u005c\u00222011-04-29\u005c\u0022}\u0022\n-\t \u0022]\u0022\n-\t \u0022}\u0022,\n-*lws_jwe_ex_a3_jwk_json \u003d (uint8_t *) /* oct symmetric keys */\n-\t \u0022{\u005c\u0022keys\u005c\u0022:\u0022\n-\t \u0022[\u0022\n-\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022alg\u005c\u0022:\u005c\u0022A128KW\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022k\u005c\u0022:\u005c\u0022GawgguFyGrWKav7AX4VKUg\u005c\u0022},\u0022\n-\n-\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022k\u005c\u0022:\u005c\u0022AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75\u0022\n-\t\t\t\u0022aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u0022HMAC key used in JWS spec Appendix A.1 example\u005c\u0022}\u0022\n-\t \u0022]\u0022\n-\t \u0022}\u0022,\n-\n-*lws_jwe_ex_b_jwk_json \u003d (uint8_t *) /* x5c example (no parent JSON) */\n-\t \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022use\u005c\u0022:\u005c\u0022sig\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u00221b94c\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u0022vrjOfz9Ccdgx5nQudyhdoR17V-IubWMeOZCwX_jj0hgAsz2J_pqYW08\u0022\n-\t \u0022PLbK_PdiVGKPrqzmDIsLI7sA25VEnHU1uCLNwBuUiCO11_-7dYbsr4iJmG0Q\u0022\n-\t \u0022u2j8DsVyT1azpJC_NG84Ty5KKthuCaPod7iI7w0LK9orSMhBEwwZDCxTWq4a\u0022\n-\t \u0022YWAchc8t-emd9qOvWtVMDC2BXksRngh6X5bUYLy6AyHKvj-nUy1wgzjYQDwH\u0022\n-\t \u0022MTplCoLtU-o-8SNnZ1tmRoGE9uJkBLdh5gFENabWnU5m1ZqZPdwS-qo-meMv\u0022\n-\t \u0022VfJb6jJVWRpl2SUtCnYG2C32qvbWbjZ_jBPD5eunqsIo1vQ\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x5c\u005c\u0022:\u0022\n-\t \u0022[\u005c\u0022MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJB\u0022\n-\t \u0022gNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYD\u0022\n-\t \u0022VQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1\u0022\n-\t \u0022wYmVsbDAeFw0xMzAyMjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBg\u0022\n-\t \u0022NVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDV\u0022\n-\t \u0022QQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1w\u0022\n-\t \u0022YmVsbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64zn8/QnH\u0022\n-\t \u0022YMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9if6amFtPDy2yvz3YlRij66\u0022\n-\t \u0022s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+IiZhtELto/A7Fck9Ws6\u0022\n-\t \u0022SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quGmFgHIXPLfnpn\u0022\n-\t \u0022fajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6ZQqC7VPq\u0022\n-\t \u0022PvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyVVk\u0022\n-\t \u0022aZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BA\u0022\n-\t \u0022QUFAAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL\u0022\n-\t \u0022+9gGlqCz5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1\u0022\n-\t \u0022zFo+Owb1zxtp3PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL\u0022\n-\t \u00222Bo3UPGrpsHzUoaGpDftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo\u0022\n-\t \u00224tpzd5rFXhjRbg4zW9C+2qok+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTq\u0022\n-\t \u0022gawR+N5MDtdPTEQ0XfIBc2cJEUyMTY5MPvACWpkA6SdS4xSvdXK3IVfOWA\u003d\u003d\u005c\u0022]\u0022\n-\t \u0022}\u0022,\n-*lws_jwe_ex_c1_jwk_json \u003d (uint8_t *) /* RSA enc private key (no parent JSON) */\n-\t \u0022{\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022kid\u005c\u0022:\u005c\u0022juliet@capulet.lit\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022use\u005c\u0022:\u005c\u0022enc\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022n\u005c\u0022:\u005c\u0022t6Q8PWSi1dkJj9hTP8hNYFlvadM7DflW9mWepOJhJ66w7nyoK1gPNqFMSQRy\u0022\n-\t \u0022O125Gp-TEkodhWr0iujjHVx7BcV0llS4w5ACGgPrcAd6ZcSR0-Iqom-QFcNP\u0022\n-\t \u00228Sjg086MwoqQU_LYywlAGZ21WSdS_PERyGFiNnj3QQlO8Yns5jCtLCRwLHL0\u0022\n-\t \u0022Pb1fEv45AuRIuUfVcPySBWYnDyGxvjYGDSM-AqWS9zIQ2ZilgT-GqUmipg0X\u0022\n-\t \u0022OC0Cc20rgLe2ymLHjpHciCKVAbY5-L32-lSeZO-Os6U15_aXrk9Gw8cPUaX1\u0022\n-\t \u0022_I8sLGuSiVdt3C_Fn2PZ3Z8i744FPFGGcG1qs2Wz-Q\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022GRtbIQmhOZtyszfgKdg4u_N-R_mZGU_9k7JQ_jn1DnfTuMdSNprTeaSTyWfS\u0022\n-\t \u0022NkuaAwnOEbIQVy1IQbWVV25NY3ybc_IhUJtfri7bAXYEReWaCl3hdlPKXy9U\u0022\n-\t \u0022vqPYGR0kIXTQRqns-dVJ7jahlI7LyckrpTmrM8dWBo4_PMaenNnPiQgO0xnu\u0022\n-\t \u0022ToxutRZJfJvG4Ox4ka3GORQd9CsCZ2vsUDmsXOfUENOyMqADC6p1M3h33tsu\u0022\n-\t \u0022rY15k9qMSpG9OX_IJAXmxzAh_tWiZOwk2K4yxH9tS3Lq1yX8C1EWmeRDkK2a\u0022\n-\t \u0022hecG85-oLKQt5VEpWHKmjOi_gJSdSgqcN96X52esAQ\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022p\u005c\u0022:\u005c\u00222rnSOV4hKSN8sS4CgcQHFbs08XboFDqKum3sc4h3GRxrTmQdl1ZK9uw-PIHf\u0022\n-\t \u0022QP0FkxXVrx-WE-ZEbrqivH_2iCLUS7wAl6XvARt1KkIaUxPPSYB9yk31s0Q8\u0022\n-\t \u0022UK96E3_OrADAYtAJs-M3JxCLfNgqh56HDnETTQhH3rCT5T3yJws\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022q\u005c\u0022:\u005c\u00221u_RiFDP7LBYh3N4GXLT9OpSKYP0uQZyiaZwBtOCBNJgQxaj10RWjsZu0c6I\u0022\n-\t \u0022edis4S7B_coSKB0Kj9PaPaBzg-IySRvvcQuPamQu66riMhjVtG6TlV8CLCYK\u0022\n-\t \u0022rYl52ziqK0E_ym2QnkwsUX7eYTB7LbAHRK9GqocDE5B0f808I4s\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022KkMTWqBUefVwZ2_Dbj1pPQqyHSHjj90L5x_MOzqYAJMcLMZtbUtwKqvVDq3\u0022\n-\t \u0022tbEo3ZIcohbDtt6SbfmWzggabpQxNxuBpoOOf_a_HgMXK_lhqigI4y_kqS1w\u0022\n-\t \u0022Y52IwjUn5rgRrJ-yYo1h41KR-vz2pYhEAeYrhttWtxVqLCRViD6c\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022AvfS0-gRxvn0bwJoMSnFxYcK1WnuEjQFluMGfwGitQBWtfZ1Er7t1xDkbN9\u0022\n-\t \u0022GQTB9yqpDoYaN06H7CFtrkxhJIBQaj6nkF5KKS3TQtQ5qCzkOkmxIe3KRbBy\u0022\n-\t \u0022mXxkb5qwUpX5ELD5xFc6FeiafWYY63TmmEAu_lRFCOJ3xDea-ots\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022lSQi-w9CpyUReMErP1RsBLk7wNtOvs5EQpPqmuMvqW57NBUczScEoPwmUqq\u0022\n-\t \u0022abu9V0-Py4dQ57_bapoKRu1R90bvuFnU63SHWEFglZQvJDMeAvmj4sm-Fp0o\u0022\n-\t \u0022Yu_neotgQ0hzbI5gry7ajdYy9-2lNx_76aBZoOUu9HCJ-UsfSOI8\u005c\u0022\u0022\n-\t \u0022}\u0022 /*,\n-lws_jwe_ex_c1_plaintext[] \u003d {\n-\t123, 34, 107, 116, 121, 34, 58, 34, 82, 83, 65, 34, 44, 34, 107,\n-\t105, 100, 34, 58, 34, 106, 117, 108, 105, 101, 116, 64, 99, 97, 112,\n-\t117, 108, 101, 116, 46, 108, 105, 116, 34, 44, 34, 117, 115, 101, 34,\n-\t58, 34, 101, 110, 99, 34, 44, 34, 110, 34, 58, 34, 116, 54, 81, 56,\n-\t80, 87, 83, 105, 49, 100, 107, 74, 106, 57, 104, 84, 80, 56, 104, 78,\n-\t89, 70, 108, 118, 97, 100, 77, 55, 68, 102, 108, 87, 57, 109, 87,\n-\t101, 112, 79, 74, 104, 74, 54, 54, 119, 55, 110, 121, 111, 75, 49,\n-\t103, 80, 78, 113, 70, 77, 83, 81, 82, 121, 79, 49, 50, 53, 71, 112,\n-\t45, 84, 69, 107, 111, 100, 104, 87, 114, 48, 105, 117, 106, 106, 72,\n-\t86, 120, 55, 66, 99, 86, 48, 108, 108, 83, 52, 119, 53, 65, 67, 71,\n-\t103, 80, 114, 99, 65, 100, 54, 90, 99, 83, 82, 48, 45, 73, 113, 111,\n-\t109, 45, 81, 70, 99, 78, 80, 56, 83, 106, 103, 48, 56, 54, 77, 119,\n-\t111, 113, 81, 85, 95, 76, 89, 121, 119, 108, 65, 71, 90, 50, 49, 87,\n-\t83, 100, 83, 95, 80, 69, 82, 121, 71, 70, 105, 78, 110, 106, 51, 81,\n-\t81, 108, 79, 56, 89, 110, 115, 53, 106, 67, 116, 76, 67, 82, 119, 76,\n-\t72, 76, 48, 80, 98, 49, 102, 69, 118, 52, 53, 65, 117, 82, 73, 117,\n-\t85, 102, 86, 99, 80, 121, 83, 66, 87, 89, 110, 68, 121, 71, 120, 118,\n-\t106, 89, 71, 68, 83, 77, 45, 65, 113, 87, 83, 57, 122, 73, 81, 50,\n-\t90, 105, 108, 103, 84, 45, 71, 113, 85, 109, 105, 112, 103, 48, 88,\n-\t79, 67, 48, 67, 99, 50, 48, 114, 103, 76, 101, 50, 121, 109, 76, 72,\n-\t106, 112, 72, 99, 105, 67, 75, 86, 65, 98, 89, 53, 45, 76, 51, 50,\n-\t45, 108, 83, 101, 90, 79, 45, 79, 115, 54, 85, 49, 53, 95, 97, 88,\n-\t114, 107, 57, 71, 119, 56, 99, 80, 85, 97, 88, 49, 95, 73, 56, 115,\n-\t76, 71, 117, 83, 105, 86, 100, 116, 51, 67, 95, 70, 110, 50, 80, 90,\n-\t51, 90, 56, 105, 55, 52, 52, 70, 80, 70, 71, 71, 99, 71, 49, 113,\n-\t115, 50, 87, 122, 45, 81, 34, 44, 34, 101, 34, 58, 34, 65, 81, 65,\n-\t66, 34, 44, 34, 100, 34, 58, 34, 71, 82, 116, 98, 73, 81, 109, 104,\n-\t79, 90, 116, 121, 115, 122, 102, 103, 75, 100, 103, 52, 117, 95, 78,\n-\t45, 82, 95, 109, 90, 71, 85, 95, 57, 107, 55, 74, 81, 95, 106, 110,\n-\t49, 68, 110, 102, 84, 117, 77, 100, 83, 78, 112, 114, 84, 101, 97,\n-\t83, 84, 121, 87, 102, 83, 78, 107, 117, 97, 65, 119, 110, 79, 69, 98,\n-\t73, 81, 86, 121, 49, 73, 81, 98, 87, 86, 86, 50, 53, 78, 89, 51, 121,\n-\t98, 99, 95, 73, 104, 85, 74, 116, 102, 114, 105, 55, 98, 65, 88, 89,\n-\t69, 82, 101, 87, 97, 67, 108, 51, 104, 100, 108, 80, 75, 88, 121, 57,\n-\t85, 118, 113, 80, 89, 71, 82, 48, 107, 73, 88, 84, 81, 82, 113, 110,\n-\t115, 45, 100, 86, 74, 55, 106, 97, 104, 108, 73, 55, 76, 121, 99,\n-\t107, 114, 112, 84, 109, 114, 77, 56, 100, 87, 66, 111, 52, 95, 80,\n-\t77, 97, 101, 110, 78, 110, 80, 105, 81, 103, 79, 48, 120, 110, 117,\n-\t84, 111, 120, 117, 116, 82, 90, 74, 102, 74, 118, 71, 52, 79, 120,\n-\t52, 107, 97, 51, 71, 79, 82, 81, 100, 57, 67, 115, 67, 90, 50, 118,\n-\t115, 85, 68, 109, 115, 88, 79, 102, 85, 69, 78, 79, 121, 77, 113, 65,\n-\t68, 67, 54, 112, 49, 77, 51, 104, 51, 51, 116, 115, 117, 114, 89, 49,\n-\t53, 107, 57, 113, 77, 83, 112, 71, 57, 79, 88, 95, 73, 74, 65, 88,\n-\t109, 120, 122, 65, 104, 95, 116, 87, 105, 90, 79, 119, 107, 50, 75,\n-\t52, 121, 120, 72, 57, 116, 83, 51, 76, 113, 49, 121, 88, 56, 67, 49,\n-\t69, 87, 109, 101, 82, 68, 107, 75, 50, 97, 104, 101, 99, 71, 56, 53,\n-\t45, 111, 76, 75, 81, 116, 53, 86, 69, 112, 87, 72, 75, 109, 106, 79,\n-\t105, 95, 103, 74, 83, 100, 83, 103, 113, 99, 78, 57, 54, 88, 53, 50,\n-\t101, 115, 65, 81, 34, 44, 34, 112, 34, 58, 34, 50, 114, 110, 83, 79,\n-\t86, 52, 104, 75, 83, 78, 56, 115, 83, 52, 67, 103, 99, 81, 72, 70,\n-\t98, 115, 48, 56, 88, 98, 111, 70, 68, 113, 75, 117, 109, 51, 115, 99,\n-\t52, 104, 51, 71, 82, 120, 114, 84, 109, 81, 100, 108, 49, 90, 75, 57,\n-\t117, 119, 45, 80, 73, 72, 102, 81, 80, 48, 70, 107, 120, 88, 86, 114,\n-\t120, 45, 87, 69, 45, 90, 69, 98, 114, 113, 105, 118, 72, 95, 50, 105,\n-\t67, 76, 85, 83, 55, 119, 65, 108, 54, 88, 118, 65, 82, 116, 49, 75,\n-\t107, 73, 97, 85, 120, 80, 80, 83, 89, 66, 57, 121, 107, 51, 49, 115,\n-\t48, 81, 56, 85, 75, 57, 54, 69, 51, 95, 79, 114, 65, 68, 65, 89, 116,\n-\t65, 74, 115, 45, 77, 51, 74, 120, 67, 76, 102, 78, 103, 113, 104, 53,\n-\t54, 72, 68, 110, 69, 84, 84, 81, 104, 72, 51, 114, 67, 84, 53, 84,\n-\t51, 121, 74, 119, 115, 34, 44, 34, 113, 34, 58, 34, 49, 117, 95, 82,\n-\t105, 70, 68, 80, 55, 76, 66, 89, 104, 51, 78, 52, 71, 88, 76, 84, 57,\n-\t79, 112, 83, 75, 89, 80, 48, 117, 81, 90, 121, 105, 97, 90, 119, 66,\n-\t116, 79, 67, 66, 78, 74, 103, 81, 120, 97, 106, 49, 48, 82, 87, 106,\n-\t115, 90, 117, 48, 99, 54, 73, 101, 100, 105, 115, 52, 83, 55, 66, 95,\n-\t99, 111, 83, 75, 66, 48, 75, 106, 57, 80, 97, 80, 97, 66, 122, 103,\n-\t45, 73, 121, 83, 82, 118, 118, 99, 81, 117, 80, 97, 109, 81, 117, 54,\n-\t54, 114, 105, 77, 104, 106, 86, 116, 71, 54, 84, 108, 86, 56, 67, 76,\n-\t67, 89, 75, 114, 89, 108, 53, 50, 122, 105, 113, 75, 48, 69, 95, 121,\n-\t109, 50, 81, 110, 107, 119, 115, 85, 88, 55, 101, 89, 84, 66, 55, 76,\n-\t98, 65, 72, 82, 75, 57, 71, 113, 111, 99, 68, 69, 53, 66, 48, 102,\n-\t56, 48, 56, 73, 52, 115, 34, 44, 34, 100, 112, 34, 58, 34, 75, 107,\n-\t77, 84, 87, 113, 66, 85, 101, 102, 86, 119, 90, 50, 95, 68, 98, 106,\n-\t49, 112, 80, 81, 113, 121, 72, 83, 72, 106, 106, 57, 48, 76, 53, 120,\n-\t95, 77, 79, 122, 113, 89, 65, 74, 77, 99, 76, 77, 90, 116, 98, 85,\n-\t116, 119, 75, 113, 118, 86, 68, 113, 51, 116, 98, 69, 111, 51, 90,\n-\t73, 99, 111, 104, 98, 68, 116, 116, 54, 83, 98, 102, 109, 87, 122,\n-\t103, 103, 97, 98, 112, 81, 120, 78, 120, 117, 66, 112, 111, 79, 79,\n-\t102, 95, 97, 95, 72, 103, 77, 88, 75, 95, 108, 104, 113, 105, 103,\n-\t73, 52, 121, 95, 107, 113, 83, 49, 119, 89, 53, 50, 73, 119, 106, 85,\n-\t110, 53, 114, 103, 82, 114, 74, 45, 121, 89, 111, 49, 104, 52, 49,\n-\t75, 82, 45, 118, 122, 50, 112, 89, 104, 69, 65, 101, 89, 114, 104,\n-\t116, 116, 87, 116, 120, 86, 113, 76, 67, 82, 86, 105, 68, 54, 99, 34,\n-\t44, 34, 100, 113, 34, 58, 34, 65, 118, 102, 83, 48, 45, 103, 82, 120,\n-\t118, 110, 48, 98, 119, 74, 111, 77, 83, 110, 70, 120, 89, 99, 75, 49,\n-\t87, 110, 117, 69, 106, 81, 70, 108, 117, 77, 71, 102, 119, 71, 105,\n-\t116, 81, 66, 87, 116, 102, 90, 49, 69, 114, 55, 116, 49, 120, 68,\n-\t107, 98, 78, 57, 71, 81, 84, 66, 57, 121, 113, 112, 68, 111, 89, 97,\n-\t78, 48, 54, 72, 55, 67, 70, 116, 114, 107, 120, 104, 74, 73, 66, 81,\n-\t97, 106, 54, 110, 107, 70, 53, 75, 75, 83, 51, 84, 81, 116, 81, 53,\n-\t113, 67, 122, 107, 79, 107, 109, 120, 73, 101, 51, 75, 82, 98, 66,\n-\t121, 109, 88, 120, 107, 98, 53, 113, 119, 85, 112, 88, 53, 69, 76,\n-\t68, 53, 120, 70, 99, 54, 70, 101, 105, 97, 102, 87, 89, 89, 54, 51,\n-\t84, 109, 109, 69, 65, 117, 95, 108, 82, 70, 67, 79, 74, 51, 120, 68,\n-\t101, 97, 45, 111, 116, 115, 34, 44, 34, 113, 105, 34, 58, 34, 108,\n-\t83, 81, 105, 45, 119, 57, 67, 112, 121, 85, 82, 101, 77, 69, 114, 80,\n-\t49, 82, 115, 66, 76, 107, 55, 119, 78, 116, 79, 118, 115, 53, 69, 81,\n-\t112, 80, 113, 109, 117, 77, 118, 113, 87, 53, 55, 78, 66, 85, 99,\n-\t122, 83, 99, 69, 111, 80, 119, 109, 85, 113, 113, 97, 98, 117, 57,\n-\t86, 48, 45, 80, 121, 52, 100, 81, 53, 55, 95, 98, 97, 112, 111, 75,\n-\t82, 117, 49, 82, 57, 48, 98, 118, 117, 70, 110, 85, 54, 51, 83, 72,\n-\t87, 69, 70, 103, 108, 90, 81, 118, 74, 68, 77, 101, 65, 118, 109,\n-\t106, 52, 115, 109, 45, 70, 112, 48, 111, 89, 117, 95, 110, 101, 111,\n-\t116, 103, 81, 48, 104, 122, 98, 73, 53, 103, 114, 121, 55, 97, 106,\n-\t100, 89, 121, 57, 45, 50, 108, 78, 120, 95, 55, 54, 97, 66, 90, 111,\n-\t79, 85, 117, 57, 72, 67, 74, 45, 85, 115, 102, 83, 79, 73, 56, 34,\n-\t125 } */\n-;\n-\n-static int\n-key_import_callback(struct lws_jwk *s, void *user)\n-{\n-\tlwsl_notice(\u0022%s: key type %d\u005cn\u0022, __func__, s-\u003ekty);\n-\n-\treturn 0;\n-}\n-\n-\n-int\n-test_jwk(struct lws_context *context)\n-{\n-\tstruct lws_jwk jwk;\n-\n-\t/* Test 1: A.1: Example public keys */\n-\n-\tif (lws_jwk_import(\u0026jwk, key_import_callback, NULL,\n-\t\t\t (char *)lws_jwe_ex_a1_jwk_json,\n-\t\t\t strlen((char *)lws_jwe_ex_a1_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022Failed to decode JWK test key\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\t/* Test 1: A.2: Example private keys */\n-\n-\tif (lws_jwk_import(\u0026jwk, key_import_callback, NULL,\n-\t\t\t (char *)lws_jwe_ex_a2_jwk_json,\n-\t\t\t strlen((char *)lws_jwe_ex_a2_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022Failed at A.2\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\t/* Test 1: A.3: Example symmetric keys */\n-\n-\tif (lws_jwk_import(\u0026jwk, key_import_callback, NULL,\n-\t\t\t (char *)lws_jwe_ex_a3_jwk_json,\n-\t\t\t strlen((char *)lws_jwe_ex_a3_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022Failed at A.3\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\t/* Test 1: B: Example x509 cert chain (no parent JSON) */\n-\n-\tif (lws_jwk_import(\u0026jwk, NULL, NULL, (char *)lws_jwe_ex_b_jwk_json,\n-\t\t\t strlen((char *)lws_jwe_ex_b_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022Failed at B\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\t/* Test 1: C.1: Example private key (no parent JSON) */\n-\n-\tif (lws_jwk_import(\u0026jwk, NULL, NULL,\n-\t\t\t (char *)lws_jwe_ex_c1_jwk_json,\n-\t\t\t strlen((char *)lws_jwe_ex_c1_jwk_json)) \u003c 0) {\n-\t\tlwsl_notice(\u0022Failed at B\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\t/* end */\n-\n-\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn 0;\n-\n-//bail:\n-//\tlws_jwk_destroy(\u0026jwk);\n-bail1:\n-\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n-\n-\treturn 1;\n-\n-}\ndiff --git a/minimal-examples/api-tests/api-test-jose/jws.c b/minimal-examples/api-tests/api-test-jose/jws.c\ndeleted file mode 100644\nindex b6f8e69..0000000\n--- a/minimal-examples/api-tests/api-test-jose/jws.c\n+++ /dev/null\n@@ -1,962 +0,0 @@\n-/*\n- * lws-api-test-jose - RFC7515 jws tests\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-/*\n- * JSON Web Signature is defined in RFC7515\n- *\n- * https://tools.ietf.org/html/rfc7515\n- *\n- * It's basically a way to wrap some JSON with a JSON \u0022header\u0022 describing the\n- * crypto, and a signature, all in a BASE64 wrapper with elided terminating '\u003d'.\n- *\n- * The signature stays with the content, it serves a different purpose than eg\n- * a TLS tunnel to transfer it.\n- *\n- */\n-\n-/* for none, the compact serialization format is b64u(jose hdr).b64u(payload) */\n-\n-static const char *none_cser \u003d\n-\t \u0022eyJhbGciOiJub25lIn0\u0022\n-\t \u0022.\u0022\n-\t \u0022eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt\u0022\n-\t \u0022cGxlLmNvbS9pc19yb290Ijp0cnVlfQ\u0022,\n-\t *none_jose \u003d \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022none\u005c\u0022}\u0022,\n-\t *none_payload\t\u003d \u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022joe\u005c\u0022,\u005cr\u005cn \u005c\u0022exp\u005c\u0022:1300819380,\u005cr\u005cn\u0022\n-\t\t\t \u0022 \u005c\u0022http://example.com/is_root\u005c\u0022:true}\u0022;\n-\n-int\n-test_jws_none(struct lws_context *context)\n-{\n-\tstruct lws_jws_map map;\n-\tstruct lws_jose jose;\n-\tchar temp[2048];\n-\tint n, temp_len \u003d sizeof(temp), ret \u003d -1;\n-\n-\tlws_jose_init(\u0026jose);\n-\n-\t/* A.5 Unsecured JSON \u0022none\u0022 RFC7515 worked example */\n-\n-\t/* decode the b64.b64[.b64] compact serialization blocks */\n-\tn \u003d lws_jws_compact_decode(none_cser, (int)strlen(none_cser), \u0026map, NULL,\n-\t\t\t\t temp, \u0026temp_len);\n-\tif (n !\u003d 2) {\n-\t\tlwsl_err(\u0022%s: concat_map failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* confirm the decoded JOSE header is exactly what we expect */\n-\t\tif (strncmp(none_jose, map.buf[LJWS_JOSE], map.len[LJWS_JOSE])) {\n-\t\t\tlwsl_err(\u0022%s: jose b64 decode wrong\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t/* parse the JOSE header */\n-\tif (lws_jws_parse_jose(\u0026jose, map.buf[LJWS_JOSE],\n-\t\t\t (int)map.len[LJWS_JOSE],\n-\t\t\t (char *)lws_concat_temp(temp, temp_len),\n-\t\t\t \u0026temp_len) \u003c 0 || !jose.alg) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* confirm we used the \u0022none\u0022 alg as expected from JOSE hdr */\n-\t\tif (strcmp(jose.alg-\u003ealg, \u0022none\u0022)) {\n-\t\t\tlwsl_err(\u0022%s: JOSE header has wrong alg\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t\t/* confirm the payload is literally what we expect */\n-\t\tif (strncmp(none_payload, map.buf[LJWS_PYLD],\n-\t\t\t\t\t map.len[LJWS_PYLD])) {\n-\t\t\tlwsl_err(\u0022%s: payload b64 decode wrong\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t/* end */\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tlws_jose_destroy(\u0026jose);\n-\n-\tif (ret)\n-\t\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-\n-\n-static const char\n-\t *test1\t\u003d \u0022{\u005c\u0022typ\u005c\u0022:\u005c\u0022JWT\u005c\u0022,\u005cr\u005cn \u005c\u0022alg\u005c\u0022:\u005c\u0022HS256\u005c\u0022}\u0022,\n-\t *test1_enc\t\u003d \u0022eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9\u0022,\n-\t *test2\t\u003d \u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022joe\u005c\u0022,\u005cr\u005cn \u005c\u0022exp\u005c\u0022:1300819380,\u005cr\u005cn\u0022\n-\t\t\t \u0022 \u005c\u0022http://example.com/is_root\u005c\u0022:true}\u0022,\n-\t *test2_enc\t\u003d \u0022eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQ\u0022\n-\t\t\t \u0022ogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ\u0022,\n-\t *key_jwk\t\u003d \u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022oct\u005c\u0022,\u005cr\u005cn\u0022\n-\t\t\t \u0022 \u005c\u0022k\u005c\u0022:\u005c\u0022AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQ\u0022\n-\t\t\t \u0022Lr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\u005c\u0022}\u0022,\n-\t *hash_enc\t\u003d \u0022dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk\u0022\n-;\n-\n-int\n-test_jws_HS256(struct lws_context *context)\n-{\n-\tchar buf[2048], temp[256], *p \u003d buf, *end \u003d buf + sizeof(buf) - 1, *enc_ptr;\n-\tuint8_t digest[LWS_GENHASH_LARGEST];\n-\tstruct lws_jws_map map;\n-\tint temp_len \u003d sizeof(temp);\n-\tstruct lws_genhmac_ctx ctx;\n-\tstruct lws_jose jose;\n-\tstruct lws_jwk jwk;\n-\tstruct lws_jws jws;\n-\tint n;\n-\n-\tlws_jose_init(\u0026jose);\n-\tlws_jws_init(\u0026jws, \u0026jwk, context);\n-\n-\t/* Test 1: SHA256 on RFC7515 worked example */\n-\n-\t/* parse the JOSE header */\n-\n-\tif (lws_jws_parse_jose(\u0026jose, test1, (int)strlen(test1), temp,\n-\t\t\t \u0026temp_len) \u003c 0 || !jose.alg) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* confirm we used the \u0022none\u0022 alg as expected from JOSE hdr */\n-\t\tif (strcmp(jose.alg-\u003ealg, \u0022HS256\u0022)) {\n-\t\t\tlwsl_err(\u0022%s: JOSE header has wrong alg\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t/* 1.1: import the JWK oct key */\n-\n-\tif (lws_jwk_import(\u0026jwk, NULL, NULL, key_jwk, strlen(key_jwk)) \u003c 0) {\n-\t\tlwsl_notice(\u0022Failed to decode JWK test key\u005cn\u0022);\n-\t\treturn -1;\n-\t}\n-\t\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_OCT) {\n-\t\t\tlwsl_err(\u0022%s: unexpected kty %d\u005cn\u0022, __func__, jwk.kty);\n-\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t/* 1.2: create JWS known hdr + known payload */\n-\n-\tn \u003d lws_jws_encode_section(test1, strlen(test1), 1, \u0026p, end);\n-\tif (n \u003c 0) {\n-\t\tgoto bail;\n-\t}\n-\n-\t\tif (strcmp(buf, test1_enc))\n-\t\t\tgoto bail;\n-\n-\tenc_ptr \u003d p + 1; /* + 1 skips the . */\n-\tn \u003d lws_jws_encode_section(test2, strlen(test2), 0, \u0026p, end);\n-\tif (n \u003c 0) {\n-\t\tgoto bail;\n-\t}\n-\n-\t\tif (strcmp(enc_ptr, test2_enc))\n-\t\t\tgoto bail;\n-\n-\t/* 1.3: use HMAC SHA-256 with known key on the hdr . payload */\n-\n-\tif (lws_genhmac_init(\u0026ctx, jose.alg-\u003ehmac_type,\n-\t\t\t jwk.e[LWS_GENCRYPTO_OCT_KEYEL_K].buf,\n-\t\t\t jwk.e[LWS_GENCRYPTO_OCT_KEYEL_K].len))\n-\t\tgoto bail;\n-\tif (lws_genhmac_update(\u0026ctx, (uint8_t *)buf, lws_ptr_diff_size_t(p, buf)))\n-\t\tgoto bail_destroy_hmac;\n-\tlws_genhmac_destroy(\u0026ctx, digest);\n-\n-\t/* 1.4: append a base64 encode of the computed HMAC digest */\n-\n-\tenc_ptr \u003d p + 1; /* + 1 skips the . */\n-\tn \u003d lws_jws_encode_section((const char *)digest, 32, 0, \u0026p, end);\n-\tif (n \u003c 0)\n-\t\tgoto bail;\n-\tif (strcmp(enc_ptr, hash_enc)) { /* check against known B64URL hash */\n-\t\tlwsl_err(\u0022%s: b64 enc of computed HMAC mismatches '%s' '%s'\u005cn\u0022,\n-\t\t\t __func__, enc_ptr, hash_enc);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* 1.5: Check we can agree the signature matches the payload */\n-\n-\tif (lws_jws_sig_confirm_compact_b64(buf, lws_ptr_diff_size_t(p, buf), \u0026map, \u0026jwk, context,\n-\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: confirm sig failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_jws_destroy(\u0026jws);\n-\tlws_jwk_destroy(\u0026jwk);\n-\tlws_jose_destroy(\u0026jose);\n-\n-\t/* end */\n-\n-\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn 0;\n-\n-bail_destroy_hmac:\n-\tlws_genhmac_destroy(\u0026ctx, NULL);\n-\n-bail:\n-\tlws_jws_destroy(\u0026jws);\n-\tlws_jwk_destroy(\u0026jwk);\n-\tlws_jose_destroy(\u0026jose);\n-\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n-\n-\treturn 1;\n-}\n-\n-\n-static const char\n-\t/* the key from worked example in RFC7515 A-2, as a JWK */\n-\t*rfc7515_rsa_key \u003d\n-\t\u0022{\u005c\u0022kty\u005c\u0022:\u005c\u0022RSA\u005c\u0022,\u0022\n-\t\u0022 \u005c\u0022n\u005c\u0022:\u005c\u0022ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddx\u0022\n-\t\t \u0022HmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMs\u0022\n-\t\t \u0022D1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSH\u0022\n-\t\t \u0022SXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdV\u0022\n-\t\t \u0022MTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8\u0022\n-\t\t \u0022NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022e\u005c\u0022:\u005c\u0022AQAB\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97I\u0022\n-\t\t\u0022jlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0\u0022\n-\t\t\u0022BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn\u0022\n-\t\t\u0022439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYT\u0022\n-\t\t\u0022CBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLh\u0022\n-\t\t\u0022BOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022p\u005c\u0022:\u005c\u00224BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdi\u0022\n-\t\t\u0022YrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPG\u0022\n-\t\t\u0022BY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022q\u005c\u0022:\u005c\u0022uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxa\u0022\n-\t\t\u0022ewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA\u0022\n-\t\t\u0022-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022dp\u005c\u0022:\u005c\u0022BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3Q\u0022\n-\t\t\u0022CLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb\u0022\n-\t\t\u002234MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022dq\u005c\u0022:\u005c\u0022h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa\u0022\n-\t\t\u00227I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-ky\u0022\n-\t\t\u0022NlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022qi\u005c\u0022:\u005c\u0022IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2o\u0022\n-\t\t\u0022y26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLU\u0022\n-\t\t\u0022W0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-\t*rfc7515_rsa_a1 \u003d /* the signed worked example in RFC7515 A-1 */\n-\t\u0022eyJhbGciOiJSUzI1NiJ9\u0022\n-\t\u0022.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt\u0022\n-\t\u0022cGxlLmNvbS9pc19yb290Ijp0cnVlfQ\u0022\n-\t\u0022.cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7\u0022\n-\t\u0022AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4\u0022\n-\t\u0022BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K\u0022\n-\t\u00220GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqv\u0022\n-\t\u0022hJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrB\u0022\n-\t\u0022p0igcN_IoypGlUPQGe77Rw\u0022\n-;\n-\n-int\n-test_jws_RS256(struct lws_context *context)\n-{\n-\tstruct lws_jws_map map;\n-\tstruct lws_jose jose;\n-\tstruct lws_jwk jwk;\n-\tstruct lws_jws jws;\n-\tchar temp[2048], *in;\n-\tint n, l, temp_len \u003d sizeof(temp);\n-\n-\tlws_jose_init(\u0026jose);\n-\tlws_jws_init(\u0026jws, \u0026jwk, context);\n-\n-\t/* Test 2: RS256 on RFC7515 worked example */\n-\n-\tif (lws_gencrypto_jws_alg_to_definition(\u0022RS256\u0022, \u0026jose.alg)) {\n-\t\tlwsl_err(\u0022%s: RS256 not supported\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* 2.1: import the jwk */\n-\n-\tif (lws_jwk_import(\u0026jwk, NULL, NULL,\n-\t\t\t rfc7515_rsa_key, strlen(rfc7515_rsa_key))) {\n-\t\tlwsl_notice(\u0022%s: 2.2: Failed to read JWK key\u005cn\u0022, __func__);\n-\t\tgoto bail2;\n-\t}\n-\n-\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_RSA) {\n-\t\tlwsl_err(\u0022%s: 2.2: kty: %d instead of RSA\u005cn\u0022, __func__, jwk.kty);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* 2.2: check the signature on the test packet from RFC7515 A-1 */\n-\n-\tif (lws_jws_sig_confirm_compact_b64(rfc7515_rsa_a1,\n-\t\t\t\t\t strlen(rfc7515_rsa_a1), \u0026map,\n-\t\t\t\t\t \u0026jwk, context, temp, \u0026temp_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: 2.2: confirm rsa sig failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_jws_b64_compact_map(rfc7515_rsa_a1, (int)strlen(rfc7515_rsa_a1),\n-\t\t\t\t \u0026jws.map_b64) !\u003d 3) {\n-\t\tlwsl_notice(\u0022%s: lws_jws_b64_compact_map failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* 2.3: generate our own signature for a copy of the test packet */\n-\n-\tin \u003d lws_concat_temp(temp, temp_len);\n-\tl \u003d (int)strlen(rfc7515_rsa_a1);\n-\tif (temp_len \u003c l + 1)\n-\t\tgoto bail;\n-\tmemcpy(in, rfc7515_rsa_a1, (unsigned int)l + 1);\n-\ttemp_len -\u003d l + 1;\n-\n-\tif (lws_jws_b64_compact_map(in, l, \u0026jws.map_b64) !\u003d 3) {\n-\t\tlwsl_notice(\u0022%s: lws_jws_b64_compact_map failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* overwrite the copy of the known b64 sig (it's all placed inside temp) */\n-\tn \u003d lws_jws_sign_from_b64(\u0026jose, \u0026jws,\n-\t\t\t\t (char *)jws.map_b64.buf[LJWS_SIG],\n-\t\t\t\t jws.map_b64.len[LJWS_SIG] + 8);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: failed signing test packet\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\tjws.map_b64.len[LJWS_SIG] \u003d (unsigned int)n;\n-\n-\t/* 2.4: confirm our signature can be verified */\n-\n-\tin[l] \u003d '\u005c0';\n-\tif (lws_jws_sig_confirm_compact_b64(in, (unsigned int)l, \u0026map, \u0026jwk,\n-\t\t\tcontext, lws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: 2.2: confirm rsa sig failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\t/* end */\n-\n-\tlwsl_notice(\u0022%s: selftest OK\u005cn\u0022, __func__);\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_jwk_destroy(\u0026jwk);\n-bail2:\n-\tlws_jws_destroy(\u0026jws);\n-\tlwsl_err(\u0022%s: selftest failed ++++++++++++++++++++\u005cn\u0022, __func__);\n-\n-\treturn 1;\n-}\n-\n-static const char\n-\t*es256_jose \u003d \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ES256\u005c\u0022}\u0022,\n-\t*es256_payload\t\u003d \u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022joe\u005c\u0022,\u005cr\u005cn \u005c\u0022exp\u005c\u0022:1300819380,\u005cr\u005cn\u0022\n-\t\t\t \u0022 \u005c\u0022http://example.com/is_root\u005c\u0022:true}\u0022,\n-\t*es256_cser \u003d\n-\t \u0022eyJhbGciOiJFUzI1NiJ9\u0022\n-\t \u0022.\u0022\n-\t \u0022eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt\u0022\n-\t \u0022cGxlLmNvbS9pc19yb290Ijp0cnVlfQ\u0022\n-\t \u0022.\u0022\n-\t \u0022DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSA\u0022\n-\t \u0022pmWQxfKTUJqPP3-Kg6NU1Q\u0022,\n-\t*es256_jwk \u003d\n-\t\u0022{\u0022\n-\t\t\u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-256\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022x\u005c\u0022:\u005c\u0022f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022y\u005c\u0022:\u005c\u0022x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022d\u005c\u0022:\u005c\u0022jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI\u005c\u0022\u0022\n-\t\u0022}\u0022\n-#if 0\n-\t\t\t,\n-\trfc7515_ec_a3_R[] \u003d {\n-\t\t 14, 209, 33, 83, 121, 99, 108, 72, 60, 47, 127, 21, 88,\n-\t\t 7, 212, 2, 163, 178, 40, 3, 58, 249, 124, 126, 23, 129,\n-\t\t154, 195, 22, 158, 166, 101\n-\t},\n-\trfc7515_ec_a3_S[] \u003d {\n-\t\t197, 10, 7, 211, 140, 60, 112, 229, 216, 241, 45, 175,\n-\t\t 8, 74, 84, 128, 166, 101, 144, 197, 242, 147, 80, 154,\n-\t\t143, 63, 127, 138, 131, 163, 84, 213\n-\t}\n-#endif\n-;\n-\n-int\n-test_jws_ES256(struct lws_context *context)\n-{\n-\tuint8_t digest[LWS_GENHASH_LARGEST];\n-\tstruct lws_genhash_ctx hash_ctx;\n-\tstruct lws_jws_map map;\n-\tstruct lws_jose jose;\n-\tstruct lws_jwk jwk;\n-\tstruct lws_jws jws;\n-\tchar temp[2048], *p;\n-\tint ret \u003d -1, l, n, temp_len \u003d sizeof(temp);\n-\n-\t/* A.3 \u0022ES256\u0022 RFC7515 worked example - verify */\n-\n-\tlws_jose_init(\u0026jose);\n-\n-\t/* decode the b64.b64[.b64] compact serialization blocks */\n-\tif (lws_jws_compact_decode(es256_cser, (int)strlen(es256_cser),\n-\t\t\t\t \u0026jws.map, \u0026jws.map_b64,\n-\t\t\t\t temp, \u0026temp_len) !\u003d 3) {\n-\t\tlwsl_err(\u0022%s: concat_map failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* confirm the decoded JOSE header is exactly what we expect */\n-\t\tif (jws.map.len[LJWS_JOSE] !\u003d strlen(es256_jose) ||\n-\t\t strncmp(es256_jose, jws.map.buf[LJWS_JOSE],\n-\t\t\t\t jws.map.len[LJWS_JOSE])) {\n-\t\t\tlwsl_err(\u0022%s: jose b64 decode wrong\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t\t/* confirm the decoded payload is exactly what we expect */\n-\t\tif (jws.map.len[LJWS_PYLD] !\u003d strlen(es256_payload) ||\n-\t\t strncmp(es256_payload, jws.map.buf[LJWS_PYLD],\n-\t\t\t\t\t jws.map.len[LJWS_PYLD])) {\n-\t\t\tlwsl_err(\u0022%s: payload b64 decode wrong\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t/* parse the JOSE header */\n-\tif (lws_jws_parse_jose(\u0026jose, jws.map.buf[LJWS_JOSE],\n-\t\t\t (int)jws.map.len[LJWS_JOSE],\n-\t\t\t (char *)lws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* confirm we used \u0022ES256\u0022 alg we expect from the JOSE hdr */\n-\t\tif (strcmp(jose.alg-\u003ealg, \u0022ES256\u0022)) {\n-\t\t\tlwsl_err(\u0022%s: JOSE header has wrong alg\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\tjws.jwk \u003d \u0026jwk;\n-\tjws.context \u003d context;\n-\n-\t/* import the ES256 jwk */\n-\tif (lws_jwk_import(\u0026jwk, NULL, NULL, es256_jwk, strlen(es256_jwk))) {\n-\t\tlwsl_notice(\u0022%s: Failed to read JWK key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* sanity */\n-\t\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_EC) {\n-\t\t\tlwsl_err(\u0022%s: kty: %d instead of EC\u005cn\u0022,\n-\t\t\t\t\t__func__, jwk.kty);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\tif (lws_jws_sig_confirm(\u0026jws.map_b64, \u0026jws.map, \u0026jwk, context) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: confirm EC sig failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* A.3 \u0022ES256\u0022 RFC7515 worked example - sign */\n-\n-\tl \u003d (int)strlen(es256_cser);\n-\tif (temp_len \u003c l + 1)\n-\t\tgoto bail1;\n-\tp \u003d lws_concat_temp(temp, temp_len);\n-\tmemcpy(p, es256_cser, (unsigned int)l + 1);\n-\ttemp_len -\u003d l + 1;\n-\n-\t/* scan the b64 compact serialization string to map the blocks */\n-\tif (lws_jws_b64_compact_map(p, l, \u0026jws.map_b64) !\u003d 3)\n-\t\tgoto bail1;\n-\n-\t/* create the hash of the protected b64 part */\n-\tif (lws_genhash_init(\u0026hash_ctx, jose.alg-\u003ehash_type) ||\n-\t lws_genhash_update(\u0026hash_ctx, jws.map_b64.buf[LJWS_JOSE],\n-\t\t\t jws.map_b64.len[LJWS_JOSE]) ||\n-\t lws_genhash_update(\u0026hash_ctx, \u0022.\u0022, 1) ||\n-\t lws_genhash_update(\u0026hash_ctx, jws.map_b64.buf[LJWS_PYLD],\n-\t\t\t jws.map_b64.len[LJWS_PYLD]) ||\n-\t lws_genhash_destroy(\u0026hash_ctx, digest)) {\n-\t\tlws_genhash_destroy(\u0026hash_ctx, NULL);\n-\n-\t\tgoto bail1;\n-\t}\n-\n-\tlwsl_hexdump(jws.map_b64.buf[LJWS_SIG], jws.map_b64.len[LJWS_SIG]);\n-\n-\t/* overwrite the copy of the known b64 sig (it's placed inside buf) */\n-\tn \u003d lws_jws_sign_from_b64(\u0026jose, \u0026jws,\n-\t\t\t\t (char *)jws.map_b64.buf[LJWS_SIG],\n-\t\t\t\t jws.map_b64.len[LJWS_SIG] + 8);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: failed signing test packet\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\tjws.map_b64.len[LJWS_SIG] \u003d (unsigned int)n;\n-\n-\tlwsl_hexdump(jws.map_b64.buf[LJWS_SIG], jws.map_b64.len[LJWS_SIG]);\n-\n-\t/* 2.4: confirm our generated signature can be verified */\n-\n-//\tlwsl_err(\u0022p %p, l %d\u005cn\u0022, p, (int)l);\n-\tp[l] \u003d '\u005c0';\n-\tif (lws_jws_sig_confirm_compact_b64(p, (unsigned int)l, \u0026map, \u0026jwk,\n-\t\t\tcontext, lws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: confirm our EC sig failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* end */\n-\tret \u003d 0;\n-\n-bail1:\n-\tlws_jwk_destroy(\u0026jwk);\n-\tlws_jose_destroy(\u0026jose);\n-\n-bail:\n-\tlwsl_notice(\u0022%s: selftest %s\u005cn\u0022, __func__, ret ? \u0022FAIL\u0022 : \u0022OK\u0022);\n-\n-\treturn ret;\n-}\n-\n-static const char\n-\t*es512_jose \u003d \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022ES512\u005c\u0022}\u0022,\n-\t*es512_payload\t\u003d \u0022Payload\u0022,\n-\t*es512_cser \u003d\n-\t \u0022eyJhbGciOiJFUzUxMiJ9\u0022\n-\t \u0022.\u0022\n-\t \u0022UGF5bG9hZA\u0022\n-\t \u0022.\u0022\n-\t \u0022AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZq\u0022\n-\t \u0022wqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8Kp\u0022\n-\t \u0022EHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn\u0022,\n-\t*es512_jwk \u003d\n-\t \u0022{\u0022\n-\t \u0022\u005c\u0022kty\u005c\u0022:\u005c\u0022EC\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022crv\u005c\u0022:\u005c\u0022P-521\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022x\u005c\u0022:\u005c\u0022AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_\u0022\n-\t \u0022NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022y\u005c\u0022:\u005c\u0022ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDl\u0022\n-\t \u0022y79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022d\u005c\u0022:\u005c\u0022AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPA\u0022\n-\t \u0022xerEzgdRhajnu0ferB0d53vM9mE15j2C\u005c\u0022\u0022\n-\t \u0022}\u0022\n-;\n-\n-int\n-test_jws_ES512(struct lws_context *context)\n-{\n-\tuint8_t digest[LWS_GENHASH_LARGEST];\n-\tstruct lws_genhash_ctx hash_ctx;\n-\tstruct lws_jws_map map;\n-\tstruct lws_jose jose;\n-\tstruct lws_jwk jwk;\n-\tstruct lws_jws jws;\n-\tchar temp[2048], *p;\n-\tint ret \u003d -1, l, n, temp_len \u003d sizeof(temp);\n-\n-\t/* A.4 \u0022ES512\u0022 RFC7515 worked example - verify */\n-\n-\tlws_jose_init(\u0026jose);\n-\n-\t/* decode the b64.b64[.b64] compact serialization blocks */\n-\tif (lws_jws_compact_decode(es512_cser, (int)strlen(es512_cser),\n-\t\t\t\t \u0026jws.map, \u0026jws.map_b64, temp,\n-\t\t\t\t \u0026temp_len) !\u003d 3) {\n-\t\tlwsl_err(\u0022%s: concat_map failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* confirm the decoded JOSE header is exactly what we expect */\n-\t\tif (jws.map.len[LJWS_JOSE] !\u003d strlen(es512_jose) ||\n-\t\t strncmp(es512_jose, jws.map.buf[LJWS_JOSE],\n-\t\t\t\t jws.map.len[LJWS_JOSE])) {\n-\t\t\tlwsl_err(\u0022%s: jose b64 decode wrong\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t\t/* confirm the decoded payload is exactly what we expect */\n-\t\tif (jws.map.len[LJWS_PYLD] !\u003d strlen(es512_payload) ||\n-\t\t strncmp(es512_payload, jws.map.buf[LJWS_PYLD],\n-\t\t\t\t\t jws.map.len[LJWS_PYLD])) {\n-\t\t\tlwsl_err(\u0022%s: payload b64 decode wrong\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t/* parse the JOSE header */\n-\tif (lws_jws_parse_jose(\u0026jose, jws.map.buf[LJWS_JOSE],\n-\t\t\t (int)jws.map.len[LJWS_JOSE],\n-\t\t\t lws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n-\t\tlwsl_err(\u0022%s: JOSE parse failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* confirm we used \u0022es512\u0022 alg we expect from the JOSE hdr */\n-\t\tif (strcmp(jose.alg-\u003ealg, \u0022ES512\u0022)) {\n-\t\t\tlwsl_err(\u0022%s: JOSE header has wrong alg\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\tjws.jwk \u003d \u0026jwk;\n-\tjws.context \u003d context;\n-\n-\t/* import the es512 jwk */\n-\tif (lws_jwk_import(\u0026jwk, NULL, NULL, es512_jwk, strlen(es512_jwk))) {\n-\t\tlwsl_notice(\u0022%s: Failed to read JWK key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t\t/* sanity */\n-\t\tif (jwk.kty !\u003d LWS_GENCRYPTO_KTY_EC) {\n-\t\t\tlwsl_err(\u0022%s: kty: %d instead of EC\u005cn\u0022,\n-\t\t\t\t\t__func__, jwk.kty);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\tif (lws_jws_sig_confirm(\u0026jws.map_b64, \u0026jws.map, \u0026jwk, context) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: confirm EC sig failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* A.3 \u0022es512\u0022 RFC7515 worked example - sign */\n-\n-\tl \u003d (int)strlen(es512_cser);\n-\tif (temp_len \u003c l)\n-\t\tgoto bail1;\n-\tp \u003d lws_concat_temp(temp, temp_len);\n-\tmemcpy(p, es512_cser, (unsigned int)l + 1);\n-\ttemp_len -\u003d (l + 1);\n-\n-\t/* scan the b64 compact serialization string to map the blocks */\n-\tif (lws_jws_b64_compact_map(p, l, \u0026jws.map_b64) !\u003d 3)\n-\t\tgoto bail1;\n-\n-\t/* create the hash of the protected b64 part */\n-\tif (lws_genhash_init(\u0026hash_ctx, jose.alg-\u003ehash_type) ||\n-\t lws_genhash_update(\u0026hash_ctx, jws.map_b64.buf[LJWS_JOSE],\n-\t\t\t jws.map_b64.len[LJWS_JOSE]) ||\n-\t lws_genhash_update(\u0026hash_ctx, \u0022.\u0022, 1) ||\n-\t lws_genhash_update(\u0026hash_ctx, jws.map_b64.buf[LJWS_PYLD],\n-\t\t\t jws.map_b64.len[LJWS_PYLD]) ||\n-\t lws_genhash_destroy(\u0026hash_ctx, digest)) {\n-\t\tlws_genhash_destroy(\u0026hash_ctx, NULL);\n-\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* overwrite the copy of the known b64 sig (it's placed inside buf) */\n-\tn \u003d lws_jws_sign_from_b64(\u0026jose, \u0026jws,\n-\t\t\t\t (char *)jws.map_b64.buf[LJWS_SIG], 1024);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: failed signing test packet\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\tjws.map_b64.len[LJWS_SIG] \u003d (unsigned int)n;\n-\n-\t/* 2.4: confirm our generated signature can be verified */\n-\n-\tp[l] \u003d '\u005c0';\n-\n-\tif (lws_jws_sig_confirm_compact_b64(p, (unsigned int)l, \u0026map, \u0026jwk, context,\n-\t\t\tlws_concat_temp(temp, temp_len), \u0026temp_len) \u003c 0) {\n-\t\tlwsl_notice(\u0022%s: confirm our ECDSA sig failed\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* jwt test */\n-\n-\t{\n-\t\tunsigned long long ull \u003d lws_now_secs();\n-\t\tchar buf[8192];\n-\t\tsize_t cml \u003d 2048, cml2 \u003d 2048;\n-\n-\t\tif (lws_jwt_sign_compact(context, \u0026jwk, \u0022ES512\u0022,\n-\t\t\t\t\t(char *)buf, \u0026cml2,\n-\t\t\t\t\t(char *)buf + 2048, 4096,\n-\t\t\t\t\t\u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022warmcat.com\u005c\u0022,\u005c\u0022aud\u005c\u0022:\u0022\n-\t\t\t\t\t\u0022\u005c\u0022https://libwebsockets.org/sai\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022iat\u005c\u0022:%llu,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022nbf\u005c\u0022:%llu,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022exp\u005c\u0022:%llu,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022sub\u005c\u0022:\u005c\u0022manage\u005c\u0022}\u0022, ull,\n-\t\t\t\t\tull - 60, ull + (30 * 24 * 3600)\n-\t\t\t\t )) {\n-\t\t\tlwsl_err(\u0022%s: failed to create JWT\u005cn\u0022, __func__);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\tlwsl_notice(\u0022%s: jwt test '%s'\u005cn\u0022, __func__, buf);\n-\n-\t\tif (lws_jwt_signed_validate(context, \u0026jwk, \u0022ES512\u0022,\n-\t\t\t\t\t (const char *)buf, cml2,\n-\t\t\t\t\t (char *)buf + 2048, 2048,\n-\t\t\t\t\t (char *)buf + 4096, \u0026cml)) {\n-\t\t\tlwsl_err(\u0022%s: failed to parse JWT\u005cn\u0022, __func__);\n-\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\tlwsl_notice(\u0022%s: jwt valid, payload '%s'\u005cn\u0022,\n-\t\t\t\t__func__, buf + 4096);\n-\t}\n-\n-\t/* end */\n-\tret \u003d 0;\n-\n-bail1:\n-\tlws_jwk_destroy(\u0026jwk);\n-\tlws_jose_destroy(\u0026jose);\n-\n-bail:\n-\tlwsl_notice(\u0022%s: selftest %s\u005cn\u0022, __func__, ret ? \u0022FAIL\u0022 : \u0022OK\u0022);\n-\n-\treturn ret;\n-}\n-\n-static char\n-\trsa_cert[] \u003d \u0022-----BEGIN CERTIFICATE-----\u005cn\u0022\n-\t \u0022MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD\u005cn\u0022\n-\t \u0022VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb\u005cn\u0022\n-\t \u0022MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx\u005cn\u0022\n-\t \u0022HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3\u005cn\u0022\n-\t \u0022WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl\u005cn\u0022\n-\t \u0022d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0\u005cn\u0022\n-\t \u0022cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA\u005cn\u0022\n-\t \u0022aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW\u005cn\u0022\n-\t \u0022aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8\u005cn\u0022\n-\t \u0022Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek\u005cn\u0022\n-\t \u0022LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH\u005cn\u0022\n-\t \u0022KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6\u005cn\u0022\n-\t \u0022jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ\u005cn\u0022\n-\t \u0022Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz\u005cn\u0022\n-\t \u0022TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK\u005cn\u0022\n-\t \u0022Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0\u005cn\u0022\n-\t \u0022nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo\u005cn\u0022\n-\t \u0022GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p\u005cn\u0022\n-\t \u0022sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU\u005cn\u0022\n-\t \u00229mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar\u005cn\u0022\n-\t \u0022jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow\u005cn\u0022\n-\t \u0022YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA\u005cn\u0022\n-\t \u0022xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P\u005cn\u0022\n-\t \u0022wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34\u005cn\u0022\n-\t \u0022H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv\u005cn\u0022\n-\t \u0022xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk\u005cn\u0022\n-\t \u0022ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g\u005cn\u0022\n-\t \u00221WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA\u005cn\u0022\n-\t \u0022AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg\u005cn\u0022\n-\t \u0022mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s\u005cn\u0022\n-\t \u00228sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX\u005cn\u0022\n-\t \u0022e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE\u003d\u005cn\u0022\n-\t \u0022-----END CERTIFICATE-----\u005cn\u0022,\n-\trsa_key[] \u003d \u0022-----BEGIN PRIVATE KEY-----\u005cn\u0022\n-\t \u0022MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ\u005cn\u0022\n-\t \u0022PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK\u005cn\u0022\n-\t \u0022nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ\u005cn\u0022\n-\t \u0022toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU\u005cn\u0022\n-\t \u00220xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT\u005cn\u0022\n-\t \u0022J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS\u005cn\u0022\n-\t \u0022Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN\u005cn\u0022\n-\t \u0022uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9\u005cn\u0022\n-\t \u0022fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn\u005cn\u0022\n-\t \u0022zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au\u005cn\u0022\n-\t \u0022ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB\u005cn\u0022\n-\t \u0022QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f\u005cn\u0022\n-\t \u0022qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+\u005cn\u0022\n-\t \u0022vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9\u005cn\u0022\n-\t \u0022fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A\u005cn\u0022\n-\t \u0022Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT\u005cn\u0022\n-\t \u0022G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/\u005cn\u0022\n-\t \u0022HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8\u005cn\u0022\n-\t \u0022YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl\u005cn\u0022\n-\t \u0022xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs\u005cn\u0022\n-\t \u0022esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw\u005cn\u0022\n-\t \u0022zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz\u005cn\u0022\n-\t \u0022mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw\u005cn\u0022\n-\t \u0022au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77\u005cn\u0022\n-\t \u002240QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5\u005cn\u0022\n-\t \u0022YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH\u005cn\u0022\n-\t \u0022PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj\u005cn\u0022\n-\t \u0022W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR\u005cn\u0022\n-\t \u0022naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6\u005cn\u0022\n-\t \u00222ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m\u005cn\u0022\n-\t \u002239I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79\u005cn\u0022\n-\t \u0022J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC\u005cn\u0022\n-\t \u0022R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp\u005cn\u0022\n-\t \u0022Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh\u005cn\u0022\n-\t \u0022BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE\u005cn\u0022\n-\t \u0022fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ\u005cn\u0022\n-\t \u0022x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI\u005cn\u0022\n-\t \u0022UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM\u005cn\u0022\n-\t \u0022OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L\u005cn\u0022\n-\t \u002265uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A\u005cn\u0022\n-\t \u0022aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5\u005cn\u0022\n-\t \u0022SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S\u005cn\u0022\n-\t \u0022me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I\u005cn\u0022\n-\t \u0022G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK\u005cn\u0022\n-\t \u0022TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY\u005cn\u0022\n-\t \u002256s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2\u005cn\u0022\n-\t \u0022gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr\u005cn\u0022\n-\t \u0022Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E\u005cn\u0022\n-\t \u0022NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs\u005cn\u0022\n-\t \u0022fBrpEY1IATtPq1taBZZogRqI3rOkkPk\u003d\u005cn\u0022\n-\t \u0022-----END PRIVATE KEY-----\u005cn\u0022;\n-\n-int\n-test_jwt_RS256(struct lws_context *context)\n-{\n-\tstruct lws_jwk jwk;\n-\tstruct lws_x509_cert *pub \u003d NULL;\n-\tint ret \u003d -1;\n-\tint ret_encode;\n-\tchar sha1_fingerprint[30];\n-\tuint8_t sha1sum[20];\n-\tchar der_buf[LWS_ARRAY_SIZE(rsa_cert)];\n-\tunion lws_tls_cert_info_results *der_info \u003d\n-\t\t\t(union lws_tls_cert_info_results *)der_buf;\n-\n-\tif (lws_x509_create(\u0026pub)) {\n-\t\tlwsl_err(\u0022%s: failed to create x509 public key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_x509_parse_from_pem(pub, rsa_cert, LWS_ARRAY_SIZE(rsa_cert))) {\n-\t\tlwsl_err(\u0022%s: failed to parse x509 public key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_x509_public_to_jwk(\u0026jwk, pub, NULL, 2048)) {\n-\t\tlwsl_err(\u0022%s: failed to copy public key to jwk\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_x509_jwk_privkey_pem(context, \u0026jwk, (char *)rsa_key,\n-\t\t\t\t LWS_ARRAY_SIZE(rsa_key), NULL)) {\n-\t\tlwsl_err(\u0022%s: failed to copy private key to jwk\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_x509_info(pub, LWS_TLS_CERT_INFO_DER_RAW, der_info,\n-\t\t\t LWS_ARRAY_SIZE(der_buf) - sizeof(*der_info) +\n-\t\t\t sizeof(der_info-\u003ens.name)) ||\n-\t der_info-\u003ens.len \u003c\u003d 0) {\n-\t\tlwsl_err(\u0022%s: failed to parse x509 public key\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (!lws_SHA1((unsigned char *)der_info-\u003ens.name,\n-\t\t (size_t)der_info-\u003ens.len, sha1sum)) {\n-\t\tlwsl_err(\u0022%s: sha1sum of public key failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tret_encode \u003d lws_b64_encode_string_url((char *)sha1sum,\n-\t\t\t\tLWS_ARRAY_SIZE(sha1sum), sha1_fingerprint,\n-\t\t\t\tLWS_ARRAY_SIZE(sha1_fingerprint));\n-\tif (ret_encode \u003c 0) {\n-\t\tlwsl_err(\u0022%s: failed to encode sha1sum to base64url\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\twhile (sha1_fingerprint[--ret_encode] \u003d\u003d '\u003d')\n-\t\tsha1_fingerprint[ret_encode] \u003d '\u005c0';\n-\n-\tlwsl_notice(\u0022%s: cert fingerprint '%s'\u005cn\u0022, __func__, sha1_fingerprint);\n-\n-\t/* now produce jwt with some additional header fields */\n-\t{\n-\t\tunsigned long long ull \u003d lws_now_secs();\n-\t\tchar buf[8192];\n-\t\tsize_t cml \u003d 2048, cml2 \u003d 2048;\n-\t\tconst char hdr_fmt[] \u003d \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022RS256\u005c\u0022, \u005c\u0022typ\u005c\u0022:\u005c\u0022JWT\u005c\u0022, \u005c\u0022x5t\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022;\n-\t\tchar jose_hdr[LWS_ARRAY_SIZE(hdr_fmt) + LWS_ARRAY_SIZE(sha1_fingerprint)];\n-\n-\t\tstruct lws_jwt_sign_info info \u003d {\n-\t\t\t.alg \u003d NULL,\n-\t\t\t.jose_hdr \u003d jose_hdr,\n-\t\t\t.jose_hdr_len \u003d (size_t)lws_snprintf(jose_hdr, LWS_ARRAY_SIZE(jose_hdr), hdr_fmt, sha1_fingerprint),\n-\t\t\t.out \u003d buf,\n-\t\t\t.out_len \u003d \u0026cml2,\n-\t\t\t.temp \u003d buf + cml2,\n-\t\t\t.tl \u003d 4096\n-\t\t};\n-\n-\t\tlwsl_notice(\u0022%s: jose_hdr of len %zu: '%s'\u005cn\u0022, __func__, info.jose_hdr_len, info.jose_hdr);\n-\t\tif (lws_jwt_sign_via_info(context, \u0026jwk, \u0026info,\n-\t\t\t\t\t\u0022{\u005c\u0022iss\u005c\u0022:\u005c\u0022warmcat.com\u005c\u0022,\u005c\u0022aud\u005c\u0022:\u0022\n-\t\t\t\t\t\u0022\u005c\u0022https://libwebsockets.org/sai\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022iat\u005c\u0022:%llu,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022nbf\u005c\u0022:%llu,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022exp\u005c\u0022:%llu,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022sub\u005c\u0022:\u005c\u0022manage\u005c\u0022}\u0022, ull,\n-\t\t\t\t\tull - 60, ull + (30 * 24 * 3600)\n-\t\t\t\t\t\t )) {\n-\t\t\tlwsl_err(\u0022%s: failed to create JWT\u005cn\u0022, __func__);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\tlwsl_notice(\u0022%s: jwt test '%s'\u005cn\u0022, __func__, buf);\n-\n-\t\tif (lws_jwt_signed_validate(context, \u0026jwk, \u0022RS256\u0022,\n-\t\t\t\t\t\t\t (const char *)buf, cml2,\n-\t\t\t\t\t\t\t (char *)buf + 2048, 2048,\n-\t\t\t\t\t\t\t (char *)buf + 4096, \u0026cml)) {\n-\t\t\tlwsl_err(\u0022%s: failed to parse JWT\u005cn\u0022, __func__);\n-\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\tlwsl_notice(\u0022%s: jwt valid, payload '%s'\u005cn\u0022,\n-\t\t\t\t__func__, buf + 4096);\n-\t}\n-\n-\t/* end */\n-\tret \u003d\t0;\n-\n-bail1:\n-\tlws_jwk_destroy(\u0026jwk);\n-\tlws_x509_destroy(\u0026pub);\n-\n-bail:\n-\tlwsl_notice(\u0022%s: selftest %s\u005cn\u0022, __func__, ret ? \u0022FAIL\u0022 : \u0022OK\u0022);\n-\n-\treturn ret;\n-}\n-\n-int\n-test_jws(struct lws_context *context)\n-{\n-\tint n \u003d 0;\n-\n-\tn |\u003d test_jws_none(context);\n-\tn |\u003d test_jws_HS256(context);\n-\tn |\u003d test_jws_RS256(context);\n-\tn |\u003d test_jws_ES256(context);\n-\tn |\u003d test_jws_ES512(context);\n-\tn |\u003d test_jwt_RS256(context);\n-\n-\treturn n;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-jose/main.c b/minimal-examples/api-tests/api-test-jose/main.c\ndeleted file mode 100644\nindex 2d636cd..0000000\n--- a/minimal-examples/api-tests/api-test-jose/main.c\n+++ /dev/null\n@@ -1,56 +0,0 @@\n-/*\n- * lws-api-test-jose\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-int\n-test_jwk(struct lws_context *context);\n-int\n-test_jws(struct lws_context *context);\n-int\n-test_jwe(struct lws_context *context);\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tconst char *p;\n-\tint result \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS JOSE api tests\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\tinfo.options \u003d 0;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tresult |\u003d test_jwk(context);\n-\tlwsl_notice(\u0022%d\u005cn\u0022, result);\n-\tresult |\u003d test_jws(context);\n-\tlwsl_notice(\u0022%d\u005cn\u0022, result);\n-\tresult |\u003d test_jwe(context);\n-\tlwsl_notice(\u0022%d\u005cn\u0022, result);\n-\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, result ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lecp/CMakeLists.txt b/minimal-examples/api-tests/api-test-lecp/CMakeLists.txt\ndeleted file mode 100644\nindex b09ee02..0000000\n--- a/minimal-examples/api-tests/api-test-lecp/CMakeLists.txt\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-project(lws-api-test-lecp C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_CBOR 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${PROJECT_NAME} main.c)\n-\tadd_test(NAME api-test-lecp COMMAND lws-api-test-lecp)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lecp/README.md b/minimal-examples/api-tests/api-test-lecp/README.md\ndeleted file mode 100644\nindex ebe930d..0000000\n--- a/minimal-examples/api-tests/api-test-lecp/README.md\n+++ /dev/null\n@@ -1,56 +0,0 @@\n-# lws api test lws_struct JSON\n-\n-Demonstrates how to use and performs selftests for lws_struct\n-JSON serialization and deserialization\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-lws_struct-json\n-[2019/03/30 22:09:09:2529] USER: LWS API selftest: lws_struct JSON\n-[2019/03/30 22:09:09:2625] NOTICE: main: ++++++++++++++++ test 1\n-[2019/03/30 22:09:09:2812] NOTICE: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (2)\n-[2019/03/30 22:09:09:2822] NOTICE: target.name 'target1' (target 0x543a830)\n-[2019/03/30 22:09:09:2824] NOTICE: target.name 'target2' (target 0x543a860)\n-[2019/03/30 22:09:09:2826] NOTICE: main: .... strarting serialization of test 1\n-[2019/03/30 22:09:09:2899] NOTICE: ser says 1\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022},{\u0022name\u0022:\u0022target2\u0022}]}\n-[2019/03/30 22:09:09:2929] NOTICE: main: ++++++++++++++++ test 2\n-[2019/03/30 22:09:09:2932] NOTICE: builder.hostname \u003d 'learn', timeout \u003d 0, targets (3)\n-[2019/03/30 22:09:09:2932] NOTICE: target.name 'target1' (target 0x543b060)\n-[2019/03/30 22:09:09:2933] NOTICE: target.name 'target2' (target 0x543b090)\n-[2019/03/30 22:09:09:2933] NOTICE: target.name 'target3' (target 0x543b0c0)\n-[2019/03/30 22:09:09:2934] NOTICE: main: .... strarting serialization of test 2\n-[2019/03/30 22:09:09:2935] NOTICE: ser says 1\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:0,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022},{\u0022name\u0022:\u0022target2\u0022},{\u0022name\u0022:\u0022target3\u0022}]}\n-[2019/03/30 22:09:09:2940] NOTICE: main: ++++++++++++++++ test 3\n-[2019/03/30 22:09:09:2959] NOTICE: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (2)\n-[2019/03/30 22:09:09:2960] NOTICE: target.name 'target1' (target 0x543b450)\n-[2019/03/30 22:09:09:2961] NOTICE: child 0x543b480, target.child.somename 'abc'\n-[2019/03/30 22:09:09:2961] NOTICE: target.name 'target2' (target 0x543b490)\n-[2019/03/30 22:09:09:2962] NOTICE: main: .... strarting serialization of test 3\n-[2019/03/30 22:09:09:2969] NOTICE: ser says 1\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022,\u0022child\u0022:{\u0022somename\u0022:\u0022abc\u0022}},{\u0022name\u0022:\u0022target2\u0022}]}\n-[2019/03/30 22:09:09:2970] NOTICE: main: ++++++++++++++++ test 4\n-[2019/03/30 22:09:09:2971] NOTICE: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (0)\n-[2019/03/30 22:09:09:2971] NOTICE: main: .... strarting serialization of test 4\n-[2019/03/30 22:09:09:2973] NOTICE: ser says 1\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800}\n-[2019/03/30 22:09:09:2974] NOTICE: main: ++++++++++++++++ test 5\n-[2019/03/30 22:09:09:2978] NOTICE: builder.hostname \u003d '', timeout \u003d 0, targets (0)\n-[2019/03/30 22:09:09:2979] NOTICE: main: .... strarting serialization of test 5\n-[2019/03/30 22:09:09:2980] NOTICE: ser says 1\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022\u0022,\u0022nspawn_timeout\u0022:0}\n-[2019/03/30 22:09:09:2982] USER: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-lecp/main.c b/minimal-examples/api-tests/api-test-lecp/main.c\ndeleted file mode 100644\nindex 89133d7..0000000\n--- a/minimal-examples/api-tests/api-test-lecp/main.c\n+++ /dev/null\n@@ -1,5020 +0,0 @@\n-/*\n- * lws-api-test-lecp\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * unit tests for lecp\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-#include \u003cmath.h\u003e\n-#endif\n-\n-#define VERBOSE\n-\n-#if defined(VERBOSE)\n-static const char * const reason_names[] \u003d {\n-\t\u0022LECPCB_CONSTRUCTED\u0022,\n-\t\u0022LECPCB_DESTRUCTED\u0022,\n-\t\u0022LECPCB_START\u0022,\n-\t\u0022LECPCB_COMPLETE\u0022,\n-\t\u0022LECPCB_FAILED\u0022,\n-\t\u0022LECPCB_PAIR_NAME\u0022,\n-\t\u0022LECPCB_VAL_TRUE\u0022,\n-\t\u0022LECPCB_VAL_FALSE\u0022,\n-\t\u0022LECPCB_VAL_NULL\u0022,\n-\t\u0022LECPCB_VAL_NUM_INT\u0022,\n-\t\u0022LECPCB_VAL_RESERVED\u0022, /* float in lejp */\n-\t\u0022LECPCB_VAL_STR_START\u0022,\n-\t\u0022LECPCB_VAL_STR_CHUNK\u0022,\n-\t\u0022LECPCB_VAL_STR_END\u0022,\n-\t\u0022LECPCB_ARRAY_START\u0022,\n-\t\u0022LECPCB_ARRAY_END\u0022,\n-\t\u0022LECPCB_OBJECT_START\u0022,\n-\t\u0022LECPCB_OBJECT_END\u0022,\n-\t\u0022LECPCB_TAG_START\u0022,\n-\t\u0022LECPCB_TAG_END\u0022,\n-\t\u0022LECPCB_VAL_NUM_UINT\u0022,\n-\t\u0022LECPCB_VAL_UNDEFINED\u0022,\n-\t\u0022LECPCB_VAL_FLOAT16\u0022,\n-\t\u0022LECPCB_VAL_FLOAT32\u0022,\n-\t\u0022LECPCB_VAL_FLOAT64\u0022,\n-\t\u0022LECPCB_VAL_SIMPLE\u0022,\n-\t\u0022LECPCB_VAL_BLOB_START\u0022,\n-\t\u0022LECPCB_VAL_BLOB_CHUNK\u0022,\n-\t\u0022LECPCB_VAL_BLOB_END\u0022,\n-\t\u0022LECPCB_ARRAY_ITEM_START\u0022,\n-\t\u0022LECPCB_ARRAY_ITEM_END\u0022,\n-\t\u0022LECPCB_LITERAL_CBOR\u0022\n-};\n-#endif\n-\n-/*\n- * Based on the official CBOR test vectors from here\n- *\n- * https://github.com/cbor/test-vectors/blob/master/appendix_a.json\n- */\n-\n-static const uint8_t\n-\ttest1[]\t\t\u003d { 0x00 },\n-\ttest2[]\t\t\u003d { 0x01 },\n-\ttest3[]\t\t\u003d { 0x0a },\n-\ttest4[]\t\t\u003d { 0x17 },\n-\ttest5[]\t\t\u003d { 0x18, 0x18 },\n-\ttest6[]\t\t\u003d { 0x18, 0x19 },\n-\ttest7[]\t\t\u003d { 0x18, 0x64 },\n-\ttest8[]\t\t\u003d { 0x19, 0x03, 0xe8 },\n-\ttest9[]\t\t\u003d { 0x1a, 0x00, 0x0f, 0x42, 0x40 },\n-\ttest10[]\t\u003d { 0x1b, 0x00, 0x00, 0x00,\n-\t\t\t 0xe8, 0xd4, 0xa5, 0x10, 0x00 },\n-\ttest11[]\t\u003d { 0x1b, 0xff, 0xff, 0xff, 0xff,\n-\t\t\t 0xff, 0xff, 0xff, 0xff },\n-\ttest12[]\t\u003d { 0xc2, 0x49, 0x01, 0x00, 0x00,\n-\t\t\t 0x00, 0x00, 0x00, 0x00, 0x00,\n-\t\t\t 0x00 },\n-\ttest13[]\t\u003d { 0x3b, 0xff, 0xff, 0xff, 0xff,\n-\t\t\t 0xff, 0xff, 0xff, 0xff },\n-\ttest14[]\t\u003d { 0xc3, 0x49, 0x01, 0x00, 0x00,\n-\t\t\t 0x00, 0x00, 0x00, 0x00, 0x00,\n-\t\t\t 0x00 },\n-\ttest15[]\t\u003d { 0x20 },\n-\ttest16[]\t\u003d { 0x29 },\n-\ttest17[]\t\u003d { 0x38, 0x63 },\n-\ttest18[]\t\u003d { 0x39, 0x03, 0xe7 },\n-\ttest19[]\t\u003d { 0xf9, 0x00, 0x00 },\n-\ttest20[]\t\u003d { 0xf9, 0x80, 0x00 },\n-\ttest21[]\t\u003d { 0xf9, 0x3c, 0x00 },\n-\ttest22[]\t\u003d { 0xfb, 0x3f, 0xf1, 0x99, 0x99,\n-\t\t\t 0x99, 0x99, 0x99, 0x9a },\n-\ttest23[]\t\u003d { 0xf9, 0x3e, 0x00 },\n-\ttest24[]\t\u003d { 0xf9, 0x7b, 0xff },\n-\ttest25[]\t\u003d { 0xfa, 0x47, 0xc3, 0x50, 0x00 },\n-\ttest26[]\t\u003d { 0xfa, 0x7f, 0x7f, 0xff, 0xff },\n-\ttest27[]\t\u003d { 0xfb, 0x7e, 0x37, 0xe4, 0x3c,\n-\t\t\t 0x88, 0x00, 0x75, 0x9c },\n-\ttest28[]\t\u003d { 0xf9, 0x00, 0x01 },\n-\ttest29[]\t\u003d { 0xf9, 0x04, 0x00 },\n-\ttest30[]\t\u003d { 0xf9, 0xc4, 0x00 },\n-\ttest31[]\t\u003d { 0xfb, 0xc0, 0x10, 0x66, 0x66,\n-\t\t\t 0x66, 0x66, 0x66, 0x66 },\n-\ttest32[]\t\u003d { 0xf9, 0x7c, 0x00 },\n-\ttest33[]\t\u003d { 0xf9, 0x7e, 0x00 },\n-\ttest34[]\t\u003d { 0xf9, 0xfc, 0x00 },\n-\ttest35[]\t\u003d { 0xfa, 0x7f, 0x80, 0x00, 0x00 },\n-\ttest36[]\t\u003d { 0xfa, 0x7f, 0xc0, 0x00, 0x00 },\n-\ttest37[]\t\u003d { 0xfa, 0xff, 0x80, 0x00, 0x00 },\n-\ttest38[]\t\u003d { 0xfb, 0x7f, 0xf0, 0x00, 0x00,\n-\t\t\t 0x00, 0x00, 0x00, 0x00 },\n-\ttest39[]\t\u003d { 0xfb, 0x7f, 0xf8, 0x00, 0x00,\n-\t\t\t 0x00, 0x00, 0x00, 0x00 },\n-\ttest40[]\t\u003d { 0xfb, 0xff, 0xf0, 0x00, 0x00,\n-\t\t\t 0x00, 0x00, 0x00, 0x00 },\n-\ttest41[]\t\u003d { 0xf4 },\n-\ttest42[]\t\u003d { 0xf5 },\n-\ttest43[]\t\u003d { 0xf6 },\n-\ttest44[]\t\u003d { 0xf7 },\n-\ttest45[]\t\u003d { 0xf0 },\n-\ttest46[]\t\u003d { 0xf8, 0x18 },\n-\ttest47[]\t\u003d { 0xf8, 0xff },\n-\ttest48[]\t\u003d { 0xc0, 0x74, 0x32, 0x30, 0x31,\n-\t\t\t 0x33, 0x2d, 0x30, 0x33, 0x2d,\n-\t\t\t 0x32, 0x31, 0x54, 0x32, 0x30,\n-\t\t\t 0x3a, 0x30, 0x34, 0x3a, 0x30,\n-\t\t\t 0x30, 0x5a },\n-\ttest49[]\t\u003d { 0xc1, 0x1a, 0x51, 0x4b, 0x67,\n-\t\t\t 0xb0 },\n-\ttest50[]\t\u003d { 0xc1, 0xfb, 0x41, 0xd4, 0x52,\n-\t\t\t 0xd9, 0xec, 0x20, 0x00, 0x00 },\n-\ttest51[]\t\u003d { 0xd7, 0x44, 0x01, 0x02, 0x03,\n-\t\t\t 0x04 },\n-\ttest52[]\t\u003d { 0xd8, 0x18, 0x45, 0x64, 0x49,\n-\t\t\t 0x45, 0x54, 0x46 },\n-\ttest53[]\t\u003d { 0xd8, 0x20, 0x76, 0x68, 0x74,\n-\t\t\t 0x74, 0x70, 0x3a, 0x2f, 0x2f,\n-\t\t\t 0x77, 0x77, 0x77, 0x2e, 0x65,\n-\t\t\t 0x78, 0x61, 0x6d, 0x70, 0x6c,\n-\t\t\t 0x65, 0x2e, 0x63, 0x6f, 0x6d },\n-\ttest54[]\t\u003d { 0x40 },\n-\ttest55[]\t\u003d { 0x44, 0x01, 0x02, 0x03, 0x04 },\n-\ttest56[]\t\u003d { 0x60 },\n-\ttest57[]\t\u003d { 0x61, 0x61 },\n-\ttest58[]\t\u003d { 0x64, 0x49, 0x45, 0x54, 0x46 },\n-\ttest59[]\t\u003d { 0x62, 0x22, 0x5c },\n-\ttest60[]\t\u003d { 0x62, 0xc3, 0xbc },\n-\ttest61[]\t\u003d { 0x63, 0xe6, 0xb0, 0xb4 },\n-\ttest62[]\t\u003d { 0x64, 0xf0, 0x90, 0x85, 0x91 },\n-\ttest63[]\t\u003d { 0x80 },\n-\ttest64[]\t\u003d { 0x83, 0x01, 0x02, 0x03 },\n-\ttest65[]\t\u003d { 0x83, 0x01, 0x82, 0x02, 0x03,\n-\t\t\t 0x82, 0x04, 0x05 },\n-\ttest66[]\t\u003d { 0x98, 0x19, 0x01, 0x02, 0x03,\n-\t\t\t 0x04, 0x05, 0x06, 0x07, 0x08,\n-\t\t\t 0x09, 0x0a, 0x0b, 0x0c, 0x0d,\n-\t\t\t 0x0e, 0x0f, 0x10, 0x11, 0x12,\n-\t\t\t 0x13, 0x14, 0x15, 0x16, 0x17,\n-\t\t\t 0x18, 0x18, 0x18, 0x19 },\n-\ttest67[]\t\u003d { 0xa0 },\n-\ttest68[]\t\u003d { 0xa2, 0x01, 0x02, 0x03, 0x04 },\n-\ttest69[]\t\u003d { 0xa2, 0x61, 0x61, 0x01, 0x61,\n-\t\t\t 0x62, 0x82, 0x02, 0x03 },\n-\ttest70[]\t\u003d { 0x82, 0x61, 0x61, 0xa1, 0x61,\n-\t\t\t 0x62, 0x61, 0x63 },\n-\ttest71[]\t\u003d { 0xa5, 0x61, 0x61, 0x61, 0x41,\n-\t\t\t 0x61, 0x62, 0x61, 0x42, 0x61,\n-\t\t\t 0x63, 0x61, 0x43, 0x61, 0x64,\n-\t\t\t 0x61, 0x44, 0x61, 0x65, 0x61,\n-\t\t\t 0x45 },\n-\ttest72[]\t\u003d { 0x5f, 0x42, 0x01, 0x02, 0x43,\n-\t\t\t 0x03, 0x04, 0x05, 0xff },\n-\ttest73[]\t\u003d { 0x7f, 0x65, 0x73, 0x74, 0x72,\n-\t\t\t 0x65, 0x61, 0x64, 0x6d, 0x69,\n-\t\t\t 0x6e, 0x67, 0xff },\n-\ttest74[]\t\u003d { 0x9f, 0xff },\n-\ttest75[]\t\u003d { 0x9f, 0x01, 0x82, 0x02, 0x03,\n-\t\t\t 0x9f, 0x04, 0x05, 0xff, 0xff },\n-\ttest76[]\t\u003d { 0x9f, 0x01, 0x82, 0x02, 0x03,\n-\t\t\t 0x82, 0x04, 0x05, 0xff },\n-\ttest77[]\t\u003d { 0x83, 0x01, 0x82, 0x02, 0x03,\n-\t\t\t 0x9f, 0x04, 0x05, 0xff },\n-\ttest78[]\t\u003d { 0x83, 0x01, 0x9f, 0x02, 0x03,\n-\t\t\t 0xff, 0x82, 0x04, 0x05 },\n-\ttest79[]\t\u003d { 0x9f, 0x01, 0x02, 0x03, 0x04,\n-\t\t\t 0x05, 0x06, 0x07, 0x08, 0x09,\n-\t\t\t 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,\n-\t\t\t 0x0f, 0x10, 0x11, 0x12, 0x13,\n-\t\t\t 0x14, 0x15, 0x16, 0x17, 0x18,\n-\t\t\t 0x18, 0x18, 0x19, 0xff },\n-\ttest80[]\t\u003d { 0xbf, 0x61, 0x61, 0x01, 0x61,\n-\t\t\t 0x62, 0x9f, 0x02, 0x03, 0xff,\n-\t\t\t 0xff },\n-\ttest81[]\t\u003d { 0x82, 0x61, 0x61, 0xbf, 0x61,\n-\t\t\t 0x62, 0x61, 0x63, 0xff },\n-\ttest82[]\t\u003d { 0xbf, 0x63, 0x46, 0x75, 0x6e,\n-\t\t\t 0xf5, 0x63, 0x41, 0x6d, 0x74,\n-\t\t\t 0x21, 0xff },\n-\n-\t/* some random COSE examples\n-\t *\n-\t * COSE hmac-01 test vector\n-\t */\n-\n-\ttest83[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n-\t\t\t 0x01, 0x05, 0xA0, 0x54, 0x54,\n-\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n-\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x58,\n-\t\t\t 0x20, 0x2B, 0xDC, 0xC8, 0x9F,\n-\t\t\t 0x05, 0x82, 0x16, 0xB8, 0xA2,\n-\t\t\t 0x08, 0xDD, 0xC6, 0xD8, 0xB5,\n-\t\t\t 0x4A, 0xA9, 0x1F, 0x48, 0xBD,\n-\t\t\t 0x63, 0x48, 0x49, 0x86, 0x56,\n-\t\t\t 0x51, 0x05, 0xC9, 0xAD, 0x5A,\n-\t\t\t 0x66, 0x82, 0xF6, 0x81, 0x83,\n-\t\t\t 0x40, 0xA2, 0x01, 0x25, 0x04,\n-\t\t\t 0x4A, 0x6F, 0x75, 0x72, 0x2D,\n-\t\t\t 0x73, 0x65, 0x63, 0x72, 0x65,\n-\t\t\t 0x74, 0x40 },\n-\t /*\n-\t * COSE hmac-02 test vector\n-\t */\n-\ttest84[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n-\t\t\t 0x01, 0x06, 0xA0, 0x54, 0x54,\n-\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n-\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x58,\n-\t\t\t 0x30, 0xB3, 0x09, 0x7F, 0x70,\n-\t\t\t 0x00, 0x9A, 0x11, 0x50, 0x74,\n-\t\t\t 0x09, 0x59, 0x8A, 0x83, 0xE1,\n-\t\t\t 0x5B, 0xBB, 0xBF, 0x19, 0x82,\n-\t\t\t 0xDC, 0xE2, 0x8E, 0x5A, 0xB6,\n-\t\t\t 0xD5, 0xA6, 0xAF, 0xF6, 0x89,\n-\t\t\t 0x7B, 0xD2, 0x4B, 0xB8, 0xB7,\n-\t\t\t 0x47, 0x96, 0x22, 0xC9, 0x40,\n-\t\t\t 0x1B, 0x24, 0x09, 0x0D, 0x45,\n-\t\t\t 0x82, 0x06, 0xD5, 0x87, 0x81,\n-\t\t\t 0x83, 0x40, 0xA2, 0x01, 0x25,\n-\t\t\t 0x04, 0x46, 0x73, 0x65, 0x63,\n-\t\t\t 0x2D, 0x34, 0x38, 0x40 },\n-\ttest85[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n-\t\t\t 0x01, 0x07, 0xA0, 0x54, 0x54,\n-\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n-\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x58,\n-\t\t\t 0x40, 0xCD, 0x28, 0xA6, 0xB3,\n-\t\t\t 0xCF, 0xBB, 0xBF, 0x21, 0x48,\n-\t\t\t 0x51, 0xB9, 0x06, 0xE0, 0x50,\n-\t\t\t 0x05, 0x6C, 0xB4, 0x38, 0xA8,\n-\t\t\t 0xB8, 0x89, 0x05, 0xB8, 0xB7,\n-\t\t\t 0x46, 0x19, 0x77, 0x02, 0x27,\n-\t\t\t 0x11, 0xA9, 0xD8, 0xAC, 0x5D,\n-\t\t\t 0xBC, 0x54, 0xE2, 0x9A, 0x56,\n-\t\t\t 0xD9, 0x26, 0x04, 0x6B, 0x40,\n-\t\t\t 0xFC, 0x26, 0x07, 0xC2, 0x5B,\n-\t\t\t 0x34, 0x44, 0x54, 0xAA, 0x5F,\n-\t\t\t 0x68, 0xDE, 0x09, 0xA3, 0xE5,\n-\t\t\t 0x25, 0xD3, 0x86, 0x5A, 0x05,\n-\t\t\t 0x81, 0x83, 0x40, 0xA2, 0x01,\n-\t\t\t 0x25, 0x04, 0x46, 0x73, 0x65,\n-\t\t\t 0x63, 0x2D, 0x36, 0x34, 0x40 },\n-\ttest86[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n-\t\t\t 0x01, 0x05, 0xA0, 0x54, 0x54,\n-\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n-\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x58,\n-\t\t\t 0x20, 0x2B, 0xDC, 0xC8, 0x9F,\n-\t\t\t 0x05, 0x82, 0x16, 0xB8, 0xA2,\n-\t\t\t 0x08, 0xDD, 0xC6, 0xD8, 0xB5,\n-\t\t\t 0x4A, 0xA9, 0x1F, 0x48, 0xBD,\n-\t\t\t 0x63, 0x48, 0x49, 0x86, 0x56,\n-\t\t\t 0x51, 0x05, 0xC9, 0xAD, 0x5A,\n-\t\t\t 0x66, 0x82, 0xF7, 0x81, 0x83,\n-\t\t\t 0x40, 0xA2, 0x01, 0x25, 0x04,\n-\t\t\t 0x4A, 0x6F, 0x75, 0x72, 0x2D,\n-\t\t\t 0x73, 0x65, 0x63, 0x72, 0x65,\n-\t\t\t 0x74, 0x40 },\n-\ttest87[]\t\u003d { 0xD8, 0x61, 0x85, 0x43, 0xA1,\n-\t\t\t 0x01, 0x04, 0xA0, 0x54, 0x54,\n-\t\t\t 0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t\t 0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t\t 0x20, 0x63, 0x6F, 0x6E, 0x74,\n-\t\t\t 0x65, 0x6E, 0x74, 0x2E, 0x48,\n-\t\t\t 0x6F, 0x35, 0xCA, 0xB7, 0x79,\n-\t\t\t 0xF7, 0x78, 0x33, 0x81, 0x83,\n-\t\t\t 0x40, 0xA2, 0x01, 0x25, 0x04,\n-\t\t\t 0x4A, 0x6F, 0x75, 0x72, 0x2D,\n-\t\t\t 0x73, 0x65, 0x63, 0x72, 0x65,\n-\t\t\t 0x74, 0x40\n-\n-\t\t\t /* COSE HMAX Enc 01 vector */\n-\n-\t}, test88[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n-\t\t\t 0x05, 0xA0, 0x54, 0x54, 0x68,\n-\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n-\t\t\t 0x6E, 0x74, 0x2E, 0x58, 0x20,\n-\t\t\t 0xA1, 0xA8, 0x48, 0xD3, 0x47,\n-\t\t\t 0x1F, 0x9D, 0x61, 0xEE, 0x49,\n-\t\t\t 0x01, 0x8D, 0x24, 0x4C, 0x82,\n-\t\t\t 0x47, 0x72, 0xF2, 0x23, 0xAD,\n-\t\t\t 0x4F, 0x93, 0x52, 0x93, 0xF1,\n-\t\t\t 0x78, 0x9F, 0xC3, 0xA0, 0x8D,\n-\t\t\t 0x8C, 0x58\n-\t}, test89[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n-\t\t\t 0x06, 0xA0, 0x54, 0x54, 0x68,\n-\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n-\t\t\t 0x6E, 0x74, 0x2E, 0x58, 0x30,\n-\t\t\t 0x99, 0x8D, 0x26, 0xC6, 0x45,\n-\t\t\t 0x9A, 0xAE, 0xEC, 0xF4, 0x4E,\n-\t\t\t 0xD2, 0x0C, 0xE0, 0x0C, 0x8C,\n-\t\t\t 0xCE, 0xDF, 0x0A, 0x1F, 0x3D,\n-\t\t\t 0x22, 0xA9, 0x2F, 0xC0, 0x5D,\n-\t\t\t 0xB0, 0x8C, 0x5A, 0xEB, 0x1C,\n-\t\t\t 0xB5, 0x94, 0xCA, 0xAF, 0x5A,\n-\t\t\t 0x5C, 0x5E, 0x2E, 0x9D, 0x01,\n-\t\t\t 0xCC, 0xE7, 0xE7, 0x7A, 0x93,\n-\t\t\t 0xAA, 0x8C, 0x62\n-\t}, test90[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n-\t\t\t 0x07, 0xA0, 0x54, 0x54, 0x68,\n-\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n-\t\t\t 0x6E, 0x74, 0x2E, 0x58, 0x40,\n-\t\t\t 0x4A, 0x55, 0x5B, 0xF9, 0x71,\n-\t\t\t 0xF7, 0xC1, 0x89, 0x1D, 0x9D,\n-\t\t\t 0xDF, 0x30, 0x4A, 0x1A, 0x13,\n-\t\t\t 0x2E, 0x2D, 0x6F, 0x81, 0x74,\n-\t\t\t 0x49, 0x47, 0x4D, 0x81, 0x3E,\n-\t\t\t 0x6D, 0x04, 0xD6, 0x59, 0x62,\n-\t\t\t 0xBE, 0xD8, 0xBB, 0xA7, 0x0C,\n-\t\t\t 0x17, 0xE1, 0xF5, 0x30, 0x8F,\n-\t\t\t 0xA3, 0x99, 0x62, 0x95, 0x9A,\n-\t\t\t 0x4B, 0x9B, 0x8D, 0x7D, 0xA8,\n-\t\t\t 0xE6, 0xD8, 0x49, 0xB2, 0x09,\n-\t\t\t 0xDC, 0xD3, 0xE9, 0x8C, 0xC0,\n-\t\t\t 0xF1, 0x1E, 0xDD, 0xF2\n-\n-\t}, test91[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n-\t\t\t 0x05, 0xA0, 0x54, 0x54, 0x68,\n-\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n-\t\t\t 0x6E, 0x74, 0x2E, 0x58, 0x20,\n-\t\t\t 0xA1, 0xA8, 0x48, 0xD3, 0x47,\n-\t\t\t 0x1F, 0x9D, 0x61, 0xEE, 0x49,\n-\t\t\t 0x01, 0x8D, 0x24, 0x4C, 0x82,\n-\t\t\t 0x47, 0x72, 0xF2, 0x23, 0xAD,\n-\t\t\t 0x4F, 0x93, 0x52, 0x93, 0xF1,\n-\t\t\t 0x78, 0x9F, 0xC3, 0xA0, 0x8D,\n-\t\t\t 0x8C, 0x59\n-\n-\t}, test92[]\t\u003d { 0xD1, 0x84, 0x43, 0xA1, 0x01,\n-\t\t\t 0x04, 0xA0, 0x54, 0x54, 0x68,\n-\t\t\t 0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t\t 0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t\t 0x63, 0x6F, 0x6E, 0x74, 0x65,\n-\t\t\t 0x6E, 0x74, 0x2E, 0x48, 0x11,\n-\t\t\t 0xF9, 0xE3, 0x57, 0x97, 0x5F,\n-\t\t\t 0xB8, 0x49\n-\n-\t\t\t /*\n-\t\t\t * COSE countersign encrypt-01\n-\t\t\t */\n-\n-\t}, test93[]\t\u003d {\n-\t\t\t 0xd0, 0x83, 0x43, 0xa1, 0x01,\n-\t\t\t 0x01, 0xa2, 0x05, 0x4c, 0x02,\n-\t\t\t 0xd1, 0xf7, 0xe6, 0xf2, 0x6c,\n-\t\t\t 0x43, 0xd4, 0x86, 0x8d, 0x87,\n-\t\t\t 0xce, 0x07, 0x83, 0x43, 0xa1,\n-\t\t\t 0x01, 0x27, 0xa1, 0x04, 0x42,\n-\t\t\t 0x31, 0x31, 0x58, 0x40, 0xe1,\n-\t\t\t 0x04, 0x39, 0x15, 0x4c, 0xc7,\n-\t\t\t 0x5c, 0x7a, 0x3a, 0x53, 0x91,\n-\t\t\t 0x49, 0x1f, 0x88, 0x65, 0x1e,\n-\t\t\t 0x02, 0x92, 0xfd, 0x0f, 0xe0,\n-\t\t\t 0xe0, 0x2c, 0xf7, 0x40, 0x54,\n-\t\t\t 0x7e, 0xaf, 0x66, 0x77, 0xb4,\n-\t\t\t 0xa4, 0x04, 0x0b, 0x8e, 0xca,\n-\t\t\t 0x16, 0xdb, 0x59, 0x28, 0x81,\n-\t\t\t 0x26, 0x2f, 0x77, 0xb1, 0x4c,\n-\t\t\t 0x1a, 0x08, 0x6c, 0x02, 0x26,\n-\t\t\t 0x8b, 0x17, 0x17, 0x1c, 0xa1,\n-\t\t\t 0x6b, 0xe4, 0xb8, 0x59, 0x5f,\n-\t\t\t 0x8c, 0x0a, 0x08, 0x58, 0x24,\n-\t\t\t 0x60, 0x97, 0x3a, 0x94, 0xbb,\n-\t\t\t 0x28, 0x98, 0x00, 0x9e, 0xe5,\n-\t\t\t 0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n-\t\t\t 0xd2, 0x58, 0x67, 0x37, 0x4b,\n-\t\t\t 0x16, 0x2e, 0x2c, 0x03, 0x56,\n-\t\t\t 0x8b, 0x41, 0xf5, 0x7c, 0x3c,\n-\t\t\t 0xc1, 0x6f, 0x91, 0x66, 0x25,\n-\t\t\t 0x0a\n-\t\t\t /*\n-\t\t\t * COSE countersign encrypt-02\n-\t\t\t */\n-\t\t}, test94[]\t\u003d {\n-\t\t\t0xd0, 0x83, 0x43, 0xa1, 0x01,\n-\t\t\t0x01, 0xa2, 0x05, 0x4c, 0x02,\n-\t\t\t0xd1, 0xf7, 0xe6, 0xf2, 0x6c,\n-\t\t\t0x43, 0xd4, 0x86, 0x8d, 0x87,\n-\t\t\t0xce, 0x07, 0x82, 0x83, 0x43,\n-\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n-\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n-\t\t\t0xe1, 0x04, 0x39, 0x15, 0x4c,\n-\t\t\t0xc7, 0x5c, 0x7a, 0x3a, 0x53,\n-\t\t\t0x91, 0x49, 0x1f, 0x88, 0x65,\n-\t\t\t0x1e, 0x02, 0x92, 0xfd, 0x0f,\n-\t\t\t0xe0, 0xe0, 0x2c, 0xf7, 0x40,\n-\t\t\t0x54, 0x7e, 0xaf, 0x66, 0x77,\n-\t\t\t0xb4, 0xa4, 0x04, 0x0b, 0x8e,\n-\t\t\t0xca, 0x16, 0xdb, 0x59, 0x28,\n-\t\t\t0x81, 0x26, 0x2f, 0x77, 0xb1,\n-\t\t\t0x4c, 0x1a, 0x08, 0x6c, 0x02,\n-\t\t\t0x26, 0x8b, 0x17, 0x17, 0x1c,\n-\t\t\t0xa1, 0x6b, 0xe4, 0xb8, 0x59,\n-\t\t\t0x5f, 0x8c, 0x0a, 0x08, 0x83,\n-\t\t\t0x43, 0xa1, 0x01, 0x26, 0xa1,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0xfc, 0xa9, 0x8e, 0xca,\n-\t\t\t0xc8, 0x0b, 0x5f, 0xeb, 0x3a,\n-\t\t\t0xc7, 0xc1, 0x08, 0xb2, 0xb7,\n-\t\t\t0x91, 0x10, 0xde, 0x88, 0x86,\n-\t\t\t0x7b, 0xc0, 0x42, 0x6f, 0xc8,\n-\t\t\t0x3c, 0x53, 0xcc, 0xd6, 0x78,\n-\t\t\t0x96, 0x94, 0xed, 0xc5, 0xfe,\n-\t\t\t0xe3, 0xc4, 0x0d, 0xe8, 0xe7,\n-\t\t\t0xb4, 0x4f, 0xe8, 0xaa, 0xd3,\n-\t\t\t0x67, 0xe0, 0x95, 0xc8, 0xfc,\n-\t\t\t0x31, 0xb7, 0x9e, 0xe6, 0x66,\n-\t\t\t0xdf, 0x9c, 0xf9, 0x09, 0x06,\n-\t\t\t0xeb, 0x43, 0x75, 0x6c, 0x73,\n-\t\t\t0x58, 0x24, 0x60, 0x97, 0x3a,\n-\t\t\t0x94, 0xbb, 0x28, 0x98, 0x00,\n-\t\t\t0x9e, 0xe5, 0x2e, 0xcf, 0xd9,\n-\t\t\t0xab, 0x1d, 0xd2, 0x58, 0x67,\n-\t\t\t0x37, 0x4b, 0x16, 0x2e, 0x2c,\n-\t\t\t0x03, 0x56, 0x8b, 0x41, 0xf5,\n-\t\t\t0x7c, 0x3c, 0xc1, 0x6f, 0x91,\n-\t\t\t0x66, 0x25, 0x0a\n-\n-\t\t\t /*\n-\t\t\t * COSE countersign enveloped-01\n-\t\t\t */\n-\t}, test95[]\t\u003d {\n-\t\t\t0xd8, 0x60, 0x84, 0x43, 0xa1,\n-\t\t\t0x01, 0x01, 0xa2, 0x05, 0x4c,\n-\t\t\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t\t\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t\t\t0x87, 0xce, 0x07, 0x83, 0x43,\n-\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n-\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n-\t\t\t0x9a, 0x8e, 0xed, 0xe3, 0xb3,\n-\t\t\t0xcb, 0x83, 0x7b, 0xa0, 0x0d,\n-\t\t\t0xf0, 0x8f, 0xa2, 0x1b, 0x12,\n-\t\t\t0x8b, 0x2d, 0x6d, 0x91, 0x62,\n-\t\t\t0xa4, 0x29, 0x0a, 0x58, 0x2d,\n-\t\t\t0x9f, 0x19, 0xbd, 0x0f, 0xb5,\n-\t\t\t0x02, 0xf0, 0xf9, 0x2b, 0x9b,\n-\t\t\t0xf4, 0x53, 0xa4, 0x05, 0x40,\n-\t\t\t0x1f, 0x8b, 0x70, 0x55, 0xef,\n-\t\t\t0x4e, 0x95, 0x8d, 0xf7, 0xf4,\n-\t\t\t0xfb, 0xd7, 0xcf, 0xb4, 0xa0,\n-\t\t\t0xc9, 0x71, 0x60, 0xf9, 0x47,\n-\t\t\t0x2b, 0x0a, 0xa1, 0x04, 0x58,\n-\t\t\t0x24, 0x60, 0x97, 0x3a, 0x94,\n-\t\t\t0xbb, 0x28, 0x98, 0x00, 0x9e,\n-\t\t\t0xe5, 0x2e, 0xcf, 0xd9, 0xab,\n-\t\t\t0x1d, 0xd2, 0x58, 0x67, 0x37,\n-\t\t\t0x4b, 0x35, 0x81, 0xf2, 0xc8,\n-\t\t\t0x00, 0x39, 0x82, 0x63, 0x50,\n-\t\t\t0xb9, 0x7a, 0xe2, 0x30, 0x0e,\n-\t\t\t0x42, 0xfc, 0x81, 0x83, 0x40,\n-\t\t\t0xa2, 0x01, 0x25, 0x04, 0x4a,\n-\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n-\t\t\t0x40\n-\t}, test96[]\t\u003d {\n-\t\t\t0xd8, 0x60, 0x84, 0x43, 0xa1,\n-\t\t\t0x01, 0x01, 0xa2, 0x05, 0x4c,\n-\t\t\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t\t\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t\t\t0x87, 0xce, 0x07, 0x82, 0x83,\n-\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0x9a, 0x8e, 0xed, 0xe3,\n-\t\t\t0xb3, 0xcb, 0x83, 0x7b, 0xa0,\n-\t\t\t0x0d, 0xf0, 0x8f, 0xa2, 0x1b,\n-\t\t\t0x12, 0x8b, 0x2d, 0x6d, 0x91,\n-\t\t\t0x62, 0xa4, 0x29, 0x0a, 0x58,\n-\t\t\t0x2d, 0x9f, 0x19, 0xbd, 0x0f,\n-\t\t\t0xb5, 0x02, 0xf0, 0xf9, 0x2b,\n-\t\t\t0x9b, 0xf4, 0x53, 0xa4, 0x05,\n-\t\t\t0x40, 0x1f, 0x8b, 0x70, 0x55,\n-\t\t\t0xef, 0x4e, 0x95, 0x8d, 0xf7,\n-\t\t\t0xf4, 0xfb, 0xd7, 0xcf, 0xb4,\n-\t\t\t0xa0, 0xc9, 0x71, 0x60, 0xf9,\n-\t\t\t0x47, 0x2b, 0x0a, 0xa1, 0x04,\n-\t\t\t0x83, 0x43, 0xa1, 0x01, 0x26,\n-\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n-\t\t\t0x58, 0x40, 0x24, 0x27, 0xcb,\n-\t\t\t0x37, 0x56, 0x85, 0x0f, 0xbb,\n-\t\t\t0x79, 0x05, 0x18, 0x07, 0xc8,\n-\t\t\t0xb2, 0x3d, 0x2e, 0x6d, 0x16,\n-\t\t\t0xa3, 0x22, 0x4f, 0x99, 0x01,\n-\t\t\t0xb4, 0x73, 0x99, 0xcf, 0xc7,\n-\t\t\t0xe3, 0xfa, 0xc4, 0xcc, 0x62,\n-\t\t\t0x1d, 0xbb, 0xeb, 0x02, 0x02,\n-\t\t\t0xa6, 0xd8, 0xbb, 0x25, 0x69,\n-\t\t\t0x5c, 0x9d, 0xcc, 0x9c, 0x47,\n-\t\t\t0x49, 0x20, 0xff, 0x57, 0x60,\n-\t\t\t0x6d, 0x76, 0x4d, 0xea, 0x19,\n-\t\t\t0x2f, 0xc8, 0x67, 0x41, 0x16,\n-\t\t\t0xf2, 0x58, 0x24, 0x60, 0x97,\n-\t\t\t0x3a, 0x94, 0xbb, 0x28, 0x98,\n-\t\t\t0x00, 0x9e, 0xe5, 0x2e, 0xcf,\n-\t\t\t0xd9, 0xab, 0x1d, 0xd2, 0x58,\n-\t\t\t0x67, 0x37, 0x4b, 0x35, 0x81,\n-\t\t\t0xf2, 0xc8, 0x00, 0x39, 0x82,\n-\t\t\t0x63, 0x50, 0xb9, 0x7a, 0xe2,\n-\t\t\t0x30, 0x0e, 0x42, 0xfc, 0x81,\n-\t\t\t0x83, 0x40, 0xa2, 0x01, 0x25,\n-\t\t\t0x04, 0x4a, 0x6f, 0x75, 0x72,\n-\t\t\t0x2d, 0x73, 0x65, 0x63, 0x72,\n-\t\t\t0x65, 0x74, 0x40\n-\n-\t}, test97[]\t\u003d {\n-\t\t\t0xd8, 0x60, 0x84, 0x43, 0xa1,\n-\t\t\t0x01, 0x01, 0xa1, 0x05, 0x4c,\n-\t\t\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t\t\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t\t\t0x87, 0xce, 0x58, 0x24, 0x60,\n-\t\t\t0x97, 0x3a, 0x94, 0xbb, 0x28,\n-\t\t\t0x98, 0x00, 0x9e, 0xe5, 0x2e,\n-\t\t\t0xcf, 0xd9, 0xab, 0x1d, 0xd2,\n-\t\t\t0x58, 0x67, 0x37, 0x4b, 0x35,\n-\t\t\t0x81, 0xf2, 0xc8, 0x00, 0x39,\n-\t\t\t0x82, 0x63, 0x50, 0xb9, 0x7a,\n-\t\t\t0xe2, 0x30, 0x0e, 0x42, 0xfc,\n-\t\t\t0x81, 0x83, 0x40, 0xa3, 0x01,\n-\t\t\t0x25, 0x04, 0x4a, 0x6f, 0x75,\n-\t\t\t0x72, 0x2d, 0x73, 0x65, 0x63,\n-\t\t\t0x72, 0x65, 0x74, 0x07, 0x83,\n-\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0xcc, 0xb1, 0xf3, 0xfe,\n-\t\t\t0xdf, 0xce, 0xa7, 0x2b, 0x9c,\n-\t\t\t0x86, 0x79, 0x63, 0xe2, 0x52,\n-\t\t\t0xb6, 0x65, 0x8a, 0xd0, 0x7f,\n-\t\t\t0x3f, 0x5f, 0x15, 0xa3, 0x26,\n-\t\t\t0xa3, 0xf5, 0x72, 0x54, 0xcc,\n-\t\t\t0xb8, 0xd4, 0x8d, 0x60, 0x02,\n-\t\t\t0x1d, 0x2f, 0x1f, 0x8a, 0x80,\n-\t\t\t0x3b, 0x84, 0x4b, 0x78, 0x72,\n-\t\t\t0x16, 0x6c, 0x6d, 0x45, 0x90,\n-\t\t\t0x25, 0xd2, 0x1c, 0x8c, 0x84,\n-\t\t\t0x62, 0xa2, 0x44, 0xba, 0x19,\n-\t\t\t0x60, 0x4e, 0xc4, 0xd5, 0x0b,\n-\t\t\t0x40\n-\t}, test98[]\t\u003d {\n-\t\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n-\t\t\t0x01, 0x05, 0xa1, 0x07, 0x83,\n-\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0xb4, 0x92, 0x4b, 0x18,\n-\t\t\t0xeb, 0x4e, 0x04, 0x73, 0x13,\n-\t\t\t0xc7, 0x07, 0xb0, 0xed, 0xa4,\n-\t\t\t0xab, 0x84, 0x43, 0x45, 0xf2,\n-\t\t\t0xc4, 0x49, 0x87, 0xd6, 0xf9,\n-\t\t\t0xeb, 0xcc, 0x77, 0x7e, 0xfd,\n-\t\t\t0x40, 0x78, 0xcc, 0x0f, 0x4c,\n-\t\t\t0x10, 0x8d, 0xef, 0x95, 0x9f,\n-\t\t\t0x78, 0xf1, 0xed, 0xb2, 0x76,\n-\t\t\t0x54, 0x25, 0x78, 0x5f, 0xcd,\n-\t\t\t0x17, 0xd5, 0x12, 0xbe, 0x31,\n-\t\t\t0xee, 0xb6, 0x6b, 0xef, 0xf1,\n-\t\t\t0xe8, 0xfc, 0x27, 0x47, 0x07,\n-\t\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t\t0x2e, 0x58, 0x20, 0x2b, 0xdc,\n-\t\t\t0xc8, 0x9f, 0x05, 0x82, 0x16,\n-\t\t\t0xb8, 0xa2, 0x08, 0xdd, 0xc6,\n-\t\t\t0xd8, 0xb5, 0x4a, 0xa9, 0x1f,\n-\t\t\t0x48, 0xbd, 0x63, 0x48, 0x49,\n-\t\t\t0x86, 0x56, 0x51, 0x05, 0xc9,\n-\t\t\t0xad, 0x5a, 0x66, 0x82, 0xf6,\n-\t\t\t0x81, 0x83, 0x40, 0xa2, 0x01,\n-\t\t\t0x25, 0x04, 0x4a, 0x6f, 0x75,\n-\t\t\t0x72, 0x2d, 0x73, 0x65, 0x63,\n-\t\t\t0x72, 0x65, 0x74, 0x40\n-\t}, test99[]\t\u003d {\n-\t\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n-\t\t\t0x01, 0x05, 0xa1, 0x07, 0x82,\n-\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n-\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n-\t\t\t0x58, 0x40, 0xb4, 0x92, 0x4b,\n-\t\t\t0x18, 0xeb, 0x4e, 0x04, 0x73,\n-\t\t\t0x13, 0xc7, 0x07, 0xb0, 0xed,\n-\t\t\t0xa4, 0xab, 0x84, 0x43, 0x45,\n-\t\t\t0xf2, 0xc4, 0x49, 0x87, 0xd6,\n-\t\t\t0xf9, 0xeb, 0xcc, 0x77, 0x7e,\n-\t\t\t0xfd, 0x40, 0x78, 0xcc, 0x0f,\n-\t\t\t0x4c, 0x10, 0x8d, 0xef, 0x95,\n-\t\t\t0x9f, 0x78, 0xf1, 0xed, 0xb2,\n-\t\t\t0x76, 0x54, 0x25, 0x78, 0x5f,\n-\t\t\t0xcd, 0x17, 0xd5, 0x12, 0xbe,\n-\t\t\t0x31, 0xee, 0xb6, 0x6b, 0xef,\n-\t\t\t0xf1, 0xe8, 0xfc, 0x27, 0x47,\n-\t\t\t0x07, 0x83, 0x43, 0xa1, 0x01,\n-\t\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n-\t\t\t0x31, 0x58, 0x40, 0x6a, 0xcd,\n-\t\t\t0x94, 0xd3, 0xcc, 0xf7, 0x1d,\n-\t\t\t0x19, 0x2e, 0x85, 0x28, 0x36,\n-\t\t\t0x0b, 0xa7, 0xe3, 0x46, 0xda,\n-\t\t\t0xc4, 0x64, 0xe9, 0xed, 0xca,\n-\t\t\t0x4c, 0xfe, 0xb6, 0xce, 0xb6,\n-\t\t\t0xbd, 0xe7, 0xba, 0xec, 0x9f,\n-\t\t\t0xf2, 0x6c, 0xa6, 0xbd, 0xf7,\n-\t\t\t0x3d, 0x0b, 0xe4, 0x1e, 0x36,\n-\t\t\t0x12, 0x9d, 0xcf, 0xf7, 0x51,\n-\t\t\t0xdd, 0x2b, 0x5a, 0xd5, 0xce,\n-\t\t\t0x11, 0x6e, 0x8a, 0x96, 0x3a,\n-\t\t\t0x27, 0x38, 0xa2, 0x99, 0x47,\n-\t\t\t0x7a, 0x68, 0x54, 0x54, 0x68,\n-\t\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n-\t\t\t0x6e, 0x74, 0x2e, 0x58, 0x20,\n-\t\t\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n-\t\t\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n-\t\t\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n-\t\t\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n-\t\t\t0x48, 0x49, 0x86, 0x56, 0x51,\n-\t\t\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n-\t\t\t0x82, 0xf6, 0x81, 0x83, 0x40,\n-\t\t\t0xa2, 0x01, 0x25, 0x04, 0x4a,\n-\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n-\t\t\t0x40\n-\t}, test100[]\t\u003d {\n-\t\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n-\t\t\t0x05, 0xa1, 0x07, 0x83, 0x43,\n-\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n-\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n-\t\t\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n-\t\t\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n-\t\t\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n-\t\t\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n-\t\t\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n-\t\t\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n-\t\t\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n-\t\t\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n-\t\t\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n-\t\t\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n-\t\t\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n-\t\t\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n-\t\t\t0xfc, 0x27, 0x47, 0x07, 0x54,\n-\t\t\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t\t\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t\t\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t\t\t0x74, 0x65, 0x6e, 0x74, 0x2e,\n-\t\t\t0x58, 0x20, 0xa1, 0xa8, 0x48,\n-\t\t\t0xd3, 0x47, 0x1f, 0x9d, 0x61,\n-\t\t\t0xee, 0x49, 0x01, 0x8d, 0x24,\n-\t\t\t0x4c, 0x82, 0x47, 0x72, 0xf2,\n-\t\t\t0x23, 0xad, 0x4f, 0x93, 0x52,\n-\t\t\t0x93, 0xf1, 0x78, 0x9f, 0xc3,\n-\t\t\t0xa0, 0x8d, 0x8c, 0x58\n-\t}, test101[]\t\u003d { /* mac-02 */\n-\t\t\t0xd8, 0x61, 0x85, 0x43, 0xa1,\n-\t\t\t0x01, 0x05, 0xa1, 0x07, 0x82,\n-\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n-\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n-\t\t\t0x58, 0x40, 0xb4, 0x92, 0x4b,\n-\t\t\t0x18, 0xeb, 0x4e, 0x04, 0x73,\n-\t\t\t0x13, 0xc7, 0x07, 0xb0, 0xed,\n-\t\t\t0xa4, 0xab, 0x84, 0x43, 0x45,\n-\t\t\t0xf2, 0xc4, 0x49, 0x87, 0xd6,\n-\t\t\t0xf9, 0xeb, 0xcc, 0x77, 0x7e,\n-\t\t\t0xfd, 0x40, 0x78, 0xcc, 0x0f,\n-\t\t\t0x4c, 0x10, 0x8d, 0xef, 0x95,\n-\t\t\t0x9f, 0x78, 0xf1, 0xed, 0xb2,\n-\t\t\t0x76, 0x54, 0x25, 0x78, 0x5f,\n-\t\t\t0xcd, 0x17, 0xd5, 0x12, 0xbe,\n-\t\t\t0x31, 0xee, 0xb6, 0x6b, 0xef,\n-\t\t\t0xf1, 0xe8, 0xfc, 0x27, 0x47,\n-\t\t\t0x07, 0x83, 0x43, 0xa1, 0x01,\n-\t\t\t0x26, 0xa1, 0x04, 0x42, 0x31,\n-\t\t\t0x31, 0x58, 0x40, 0x6a, 0xcd,\n-\t\t\t0x94, 0xd3, 0xcc, 0xf7, 0x1d,\n-\t\t\t0x19, 0x2e, 0x85, 0x28, 0x36,\n-\t\t\t0x0b, 0xa7, 0xe3, 0x46, 0xda,\n-\t\t\t0xc4, 0x64, 0xe9, 0xed, 0xca,\n-\t\t\t0x4c, 0xfe, 0xb6, 0xce, 0xb6,\n-\t\t\t0xbd, 0xe7, 0xba, 0xec, 0x9f,\n-\t\t\t0xf2, 0x6c, 0xa6, 0xbd, 0xf7,\n-\t\t\t0x3d, 0x0b, 0xe4, 0x1e, 0x36,\n-\t\t\t0x12, 0x9d, 0xcf, 0xf7, 0x51,\n-\t\t\t0xdd, 0x2b, 0x5a, 0xd5, 0xce,\n-\t\t\t0x11, 0x6e, 0x8a, 0x96, 0x3a,\n-\t\t\t0x27, 0x38, 0xa2, 0x99, 0x47,\n-\t\t\t0x7a, 0x68, 0x54, 0x54, 0x68,\n-\t\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n-\t\t\t0x6e, 0x74, 0x2e, 0x58, 0x20,\n-\t\t\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n-\t\t\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n-\t\t\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n-\t\t\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n-\t\t\t0x48, 0x49, 0x86, 0x56, 0x51,\n-\t\t\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n-\t\t\t0x82, 0xf6, 0x81, 0x83, 0x40,\n-\t\t\t0xa2, 0x01, 0x25, 0x04, 0x4a,\n-\t\t\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t\t\t0x65, 0x63, 0x72, 0x65, 0x74,\n-\t\t\t0x40\n-\t}, test102[] \u003d { /* mac0-01 */\n-\t\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n-\t\t\t0x05, 0xa1, 0x07, 0x83, 0x43,\n-\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n-\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n-\t\t\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n-\t\t\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n-\t\t\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n-\t\t\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n-\t\t\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n-\t\t\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n-\t\t\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n-\t\t\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n-\t\t\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n-\t\t\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n-\t\t\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n-\t\t\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n-\t\t\t0xfc, 0x27, 0x47, 0x07, 0x54,\n-\t\t\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t\t\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t\t\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t\t\t0x74, 0x65, 0x6e, 0x74, 0x2e,\n-\t\t\t0x58, 0x20, 0xa1, 0xa8, 0x48,\n-\t\t\t0xd3, 0x47, 0x1f, 0x9d, 0x61,\n-\t\t\t0xee, 0x49, 0x01, 0x8d, 0x24,\n-\t\t\t0x4c, 0x82, 0x47, 0x72, 0xf2,\n-\t\t\t0x23, 0xad, 0x4f, 0x93, 0x52,\n-\t\t\t0x93, 0xf1, 0x78, 0x9f, 0xc3,\n-\t\t\t0xa0, 0x8d, 0x8c, 0x58\n-\t}, test103[] \u003d { /* mac0-02 */\n-\t\t\t0xd1, 0x84, 0x43, 0xa1, 0x01,\n-\t\t\t0x05, 0xa1, 0x07, 0x82, 0x83,\n-\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0xb4, 0x92, 0x4b, 0x18,\n-\t\t\t0xeb, 0x4e, 0x04, 0x73, 0x13,\n-\t\t\t0xc7, 0x07, 0xb0, 0xed, 0xa4,\n-\t\t\t0xab, 0x84, 0x43, 0x45, 0xf2,\n-\t\t\t0xc4, 0x49, 0x87, 0xd6, 0xf9,\n-\t\t\t0xeb, 0xcc, 0x77, 0x7e, 0xfd,\n-\t\t\t0x40, 0x78, 0xcc, 0x0f, 0x4c,\n-\t\t\t0x10, 0x8d, 0xef, 0x95, 0x9f,\n-\t\t\t0x78, 0xf1, 0xed, 0xb2, 0x76,\n-\t\t\t0x54, 0x25, 0x78, 0x5f, 0xcd,\n-\t\t\t0x17, 0xd5, 0x12, 0xbe, 0x31,\n-\t\t\t0xee, 0xb6, 0x6b, 0xef, 0xf1,\n-\t\t\t0xe8, 0xfc, 0x27, 0x47, 0x07,\n-\t\t\t0x83, 0x43, 0xa1, 0x01, 0x26,\n-\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n-\t\t\t0x58, 0x40, 0x6a, 0xcd, 0x94,\n-\t\t\t0xd3, 0xcc, 0xf7, 0x1d, 0x19,\n-\t\t\t0x2e, 0x85, 0x28, 0x36, 0x0b,\n-\t\t\t0xa7, 0xe3, 0x46, 0xda, 0xc4,\n-\t\t\t0x64, 0xe9, 0xed, 0xca, 0x4c,\n-\t\t\t0xfe, 0xb6, 0xce, 0xb6, 0xbd,\n-\t\t\t0xe7, 0xba, 0xec, 0x9f, 0xf2,\n-\t\t\t0x6c, 0xa6, 0xbd, 0xf7, 0x3d,\n-\t\t\t0x0b, 0xe4, 0x1e, 0x36, 0x12,\n-\t\t\t0x9d, 0xcf, 0xf7, 0x51, 0xdd,\n-\t\t\t0x2b, 0x5a, 0xd5, 0xce, 0x11,\n-\t\t\t0x6e, 0x8a, 0x96, 0x3a, 0x27,\n-\t\t\t0x38, 0xa2, 0x99, 0x47, 0x7a,\n-\t\t\t0x68, 0x54, 0x54, 0x68, 0x69,\n-\t\t\t0x73, 0x20, 0x69, 0x73, 0x20,\n-\t\t\t0x74, 0x68, 0x65, 0x20, 0x63,\n-\t\t\t0x6f, 0x6e, 0x74, 0x65, 0x6e,\n-\t\t\t0x74, 0x2e, 0x58, 0x20, 0xa1,\n-\t\t\t0xa8, 0x48, 0xd3, 0x47, 0x1f,\n-\t\t\t0x9d, 0x61, 0xee, 0x49, 0x01,\n-\t\t\t0x8d, 0x24, 0x4c, 0x82, 0x47,\n-\t\t\t0x72, 0xf2, 0x23, 0xad, 0x4f,\n-\t\t\t0x93, 0x52, 0x93, 0xf1, 0x78,\n-\t\t\t0x9f, 0xc3, 0xa0, 0x8d, 0x8c,\n-\t\t\t0x58\n-\t}, test104[] \u003d { /* signed-01 */\n-\t\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n-\t\t\t0x03, 0x00, 0xa0, 0x54, 0x54,\n-\t\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n-\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n-\t\t\t0xa2, 0x07, 0x83, 0x43, 0xa1,\n-\t\t\t0x01, 0x27, 0xa1, 0x04, 0x42,\n-\t\t\t0x31, 0x31, 0x58, 0x40, 0x8e,\n-\t\t\t0x1b, 0xe2, 0xf9, 0x45, 0x3d,\n-\t\t\t0x26, 0x48, 0x12, 0xe5, 0x90,\n-\t\t\t0x49, 0x91, 0x32, 0xbe, 0xf3,\n-\t\t\t0xfb, 0xf9, 0xee, 0x9d, 0xb2,\n-\t\t\t0x7c, 0x2c, 0x16, 0x87, 0x88,\n-\t\t\t0xe3, 0xb7, 0xeb, 0xe5, 0x06,\n-\t\t\t0xc0, 0x4f, 0xd3, 0xd1, 0x9f,\n-\t\t\t0xaa, 0x9f, 0x51, 0x23, 0x2a,\n-\t\t\t0xf5, 0xc9, 0x59, 0xe4, 0xef,\n-\t\t\t0x47, 0x92, 0x88, 0x34, 0x64,\n-\t\t\t0x7f, 0x56, 0xdf, 0xbe, 0x93,\n-\t\t\t0x91, 0x12, 0x88, 0x4d, 0x08,\n-\t\t\t0xef, 0x25, 0x05, 0x04, 0x42,\n-\t\t\t0x31, 0x31, 0x58, 0x40, 0x77,\n-\t\t\t0xf3, 0xea, 0xcd, 0x11, 0x85,\n-\t\t\t0x2c, 0x4b, 0xf9, 0xcb, 0x1d,\n-\t\t\t0x72, 0xfa, 0xbe, 0x6b, 0x26,\n-\t\t\t0xfb, 0xa1, 0xd7, 0x60, 0x92,\n-\t\t\t0xb2, 0xb5, 0xb7, 0xec, 0x83,\n-\t\t\t0xb8, 0x35, 0x57, 0x65, 0x22,\n-\t\t\t0x64, 0xe6, 0x96, 0x90, 0xdb,\n-\t\t\t0xc1, 0x17, 0x2d, 0xdc, 0x0b,\n-\t\t\t0xf8, 0x84, 0x11, 0xc0, 0xd2,\n-\t\t\t0x5a, 0x50, 0x7f, 0xdb, 0x24,\n-\t\t\t0x7a, 0x20, 0xc4, 0x0d, 0x5e,\n-\t\t\t0x24, 0x5f, 0xab, 0xd3, 0xfc,\n-\t\t\t0x9e, 0xc1, 0x06\n-\t}, test105[] \u003d { /* signed-02 */\n-\t\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n-\t\t\t0x03, 0x00, 0xa0, 0x54, 0x54,\n-\t\t\t0x68, 0x69, 0x73, 0x20, 0x69,\n-\t\t\t0x73, 0x20, 0x74, 0x68, 0x65,\n-\t\t\t0x20, 0x63, 0x6f, 0x6e, 0x74,\n-\t\t\t0x65, 0x6e, 0x74, 0x2e, 0x81,\n-\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n-\t\t\t0xa2, 0x07, 0x82, 0x83, 0x43,\n-\t\t\t0xa1, 0x01, 0x27, 0xa1, 0x04,\n-\t\t\t0x42, 0x31, 0x31, 0x58, 0x40,\n-\t\t\t0x8e, 0x1b, 0xe2, 0xf9, 0x45,\n-\t\t\t0x3d, 0x26, 0x48, 0x12, 0xe5,\n-\t\t\t0x90, 0x49, 0x91, 0x32, 0xbe,\n-\t\t\t0xf3, 0xfb, 0xf9, 0xee, 0x9d,\n-\t\t\t0xb2, 0x7c, 0x2c, 0x16, 0x87,\n-\t\t\t0x88, 0xe3, 0xb7, 0xeb, 0xe5,\n-\t\t\t0x06, 0xc0, 0x4f, 0xd3, 0xd1,\n-\t\t\t0x9f, 0xaa, 0x9f, 0x51, 0x23,\n-\t\t\t0x2a, 0xf5, 0xc9, 0x59, 0xe4,\n-\t\t\t0xef, 0x47, 0x92, 0x88, 0x34,\n-\t\t\t0x64, 0x7f, 0x56, 0xdf, 0xbe,\n-\t\t\t0x93, 0x91, 0x12, 0x88, 0x4d,\n-\t\t\t0x08, 0xef, 0x25, 0x05, 0x83,\n-\t\t\t0x43, 0xa1, 0x01, 0x26, 0xa1,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0xaf, 0x04, 0x9b, 0x80,\n-\t\t\t0xd5, 0x2c, 0x36, 0x69, 0xb2,\n-\t\t\t0x99, 0x70, 0xc1, 0x33, 0x54,\n-\t\t\t0x37, 0x54, 0xf9, 0xcc, 0x60,\n-\t\t\t0x8c, 0xe4, 0x11, 0x23, 0xae,\n-\t\t\t0x1c, 0x82, 0x7e, 0x36, 0xb3,\n-\t\t\t0x8c, 0xb8, 0x25, 0x98, 0x7f,\n-\t\t\t0x01, 0xf2, 0x2b, 0xb8, 0xab,\n-\t\t\t0x13, 0xe9, 0xc6, 0x62, 0x26,\n-\t\t\t0xee, 0x23, 0x17, 0x8f, 0xfa,\n-\t\t\t0x00, 0xa4, 0xfc, 0x22, 0x05,\n-\t\t\t0x93, 0xb6, 0xe5, 0xac, 0x38,\n-\t\t\t0x96, 0x00, 0x71, 0xc9, 0xc8,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0x77, 0xf3, 0xea, 0xcd,\n-\t\t\t0x11, 0x85, 0x2c, 0x4b, 0xf9,\n-\t\t\t0xcb, 0x1d, 0x72, 0xfa, 0xbe,\n-\t\t\t0x6b, 0x26, 0xfb, 0xa1, 0xd7,\n-\t\t\t0x60, 0x92, 0xb2, 0xb5, 0xb7,\n-\t\t\t0xec, 0x83, 0xb8, 0x35, 0x57,\n-\t\t\t0x65, 0x22, 0x64, 0xe6, 0x96,\n-\t\t\t0x90, 0xdb, 0xc1, 0x17, 0x2d,\n-\t\t\t0xdc, 0x0b, 0xf8, 0x84, 0x11,\n-\t\t\t0xc0, 0xd2, 0x5a, 0x50, 0x7f,\n-\t\t\t0xdb, 0x24, 0x7a, 0x20, 0xc4,\n-\t\t\t0x0d, 0x5e, 0x24, 0x5f, 0xab,\n-\t\t\t0xd3, 0xfc, 0x9e, 0xc1, 0x06\n-\t}, test106[] \u003d { /* signed-03 */\n-\t\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n-\t\t\t0x03, 0x00, 0xa1, 0x07, 0x83,\n-\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0xb7, 0xca, 0xcb, 0xa2,\n-\t\t\t0x85, 0xc4, 0xcd, 0x3e, 0xd2,\n-\t\t\t0xf0, 0x14, 0x6f, 0x41, 0x98,\n-\t\t\t0x86, 0x14, 0x4c, 0xa6, 0x38,\n-\t\t\t0xd0, 0x87, 0xde, 0x12, 0x3d,\n-\t\t\t0x40, 0x01, 0x67, 0x30, 0x8a,\n-\t\t\t0xce, 0xab, 0xc4, 0xb5, 0xe5,\n-\t\t\t0xc6, 0xa4, 0x0c, 0x0d, 0xe0,\n-\t\t\t0xb7, 0x11, 0x67, 0xa3, 0x91,\n-\t\t\t0x75, 0xea, 0x56, 0xc1, 0xfe,\n-\t\t\t0x96, 0xc8, 0x9e, 0x5e, 0x7d,\n-\t\t\t0x30, 0xda, 0xf2, 0x43, 0x8a,\n-\t\t\t0x45, 0x61, 0x59, 0xa2, 0x0a,\n-\t\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t\t0x2e, 0x81, 0x83, 0x43, 0xa1,\n-\t\t\t0x01, 0x27, 0xa1, 0x04, 0x42,\n-\t\t\t0x31, 0x31, 0x58, 0x40, 0x77,\n-\t\t\t0xf3, 0xea, 0xcd, 0x11, 0x85,\n-\t\t\t0x2c, 0x4b, 0xf9, 0xcb, 0x1d,\n-\t\t\t0x72, 0xfa, 0xbe, 0x6b, 0x26,\n-\t\t\t0xfb, 0xa1, 0xd7, 0x60, 0x92,\n-\t\t\t0xb2, 0xb5, 0xb7, 0xec, 0x83,\n-\t\t\t0xb8, 0x35, 0x57, 0x65, 0x22,\n-\t\t\t0x64, 0xe6, 0x96, 0x90, 0xdb,\n-\t\t\t0xc1, 0x17, 0x2d, 0xdc, 0x0b,\n-\t\t\t0xf8, 0x84, 0x11, 0xc0, 0xd2,\n-\t\t\t0x5a, 0x50, 0x7f, 0xdb, 0x24,\n-\t\t\t0x7a, 0x20, 0xc4, 0x0d, 0x5e,\n-\t\t\t0x24, 0x5f, 0xab, 0xd3, 0xfc,\n-\t\t\t0x9e, 0xc1, 0x06\n-\t}, test107[] \u003d { /* signed1-01 */\n-\t\t\t0xd2, 0x84, 0x45, 0xa2, 0x01,\n-\t\t\t0x27, 0x03, 0x00, 0xa2, 0x07,\n-\t\t\t0x83, 0x43, 0xa1, 0x01, 0x27,\n-\t\t\t0xa1, 0x04, 0x42, 0x31, 0x31,\n-\t\t\t0x58, 0x40, 0x6d, 0xae, 0xd1,\n-\t\t\t0x58, 0xaf, 0xe4, 0x03, 0x2e,\n-\t\t\t0x8d, 0xd4, 0x77, 0xd3, 0xd2,\n-\t\t\t0xb7, 0xf6, 0x67, 0xe7, 0x95,\n-\t\t\t0x7a, 0xa8, 0x30, 0x2b, 0xb5,\n-\t\t\t0xe5, 0x68, 0xb4, 0xdc, 0xbc,\n-\t\t\t0xce, 0x3c, 0xf0, 0xed, 0x5a,\n-\t\t\t0x90, 0xf8, 0x31, 0x35, 0x1c,\n-\t\t\t0x85, 0xd6, 0x15, 0x5a, 0x42,\n-\t\t\t0xa1, 0x7c, 0xa1, 0xf2, 0x5f,\n-\t\t\t0x50, 0x1c, 0xc1, 0x3f, 0x67,\n-\t\t\t0x10, 0x8a, 0xe5, 0x3b, 0xda,\n-\t\t\t0x92, 0xdb, 0x88, 0x27, 0x2e,\n-\t\t\t0x00, 0x04, 0x42, 0x31, 0x31,\n-\t\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t\t0x2e, 0x58, 0x40, 0x71, 0x42,\n-\t\t\t0xfd, 0x2f, 0xf9, 0x6d, 0x56,\n-\t\t\t0xdb, 0x85, 0xbe, 0xe9, 0x05,\n-\t\t\t0xa7, 0x6b, 0xa1, 0xd0, 0xb7,\n-\t\t\t0x32, 0x1a, 0x95, 0xc8, 0xc4,\n-\t\t\t0xd3, 0x60, 0x7c, 0x57, 0x81,\n-\t\t\t0x93, 0x2b, 0x7a, 0xfb, 0x87,\n-\t\t\t0x11, 0x49, 0x7d, 0xfa, 0x75,\n-\t\t\t0x1b, 0xf4, 0x0b, 0x58, 0xb3,\n-\t\t\t0xbc, 0xc3, 0x23, 0x00, 0xb1,\n-\t\t\t0x48, 0x7f, 0x3d, 0xb3, 0x40,\n-\t\t\t0x85, 0xee, 0xf0, 0x13, 0xbf,\n-\t\t\t0x08, 0xf4, 0xa4, 0x4d, 0x6f,\n-\t\t\t0xef, 0x0d\n-\t}, test108[] \u003d { /* signed1-02 */\n-\t\t\t0xd2, 0x84, 0x45, 0xa2, 0x01,\n-\t\t\t0x27, 0x03, 0x00, 0xa2, 0x07,\n-\t\t\t0x82, 0x83, 0x43, 0xa1, 0x01,\n-\t\t\t0x27, 0xa1, 0x04, 0x42, 0x31,\n-\t\t\t0x31, 0x58, 0x40, 0x6d, 0xae,\n-\t\t\t0xd1, 0x58, 0xaf, 0xe4, 0x03,\n-\t\t\t0x2e, 0x8d, 0xd4, 0x77, 0xd3,\n-\t\t\t0xd2, 0xb7, 0xf6, 0x67, 0xe7,\n-\t\t\t0x95, 0x7a, 0xa8, 0x30, 0x2b,\n-\t\t\t0xb5, 0xe5, 0x68, 0xb4, 0xdc,\n-\t\t\t0xbc, 0xce, 0x3c, 0xf0, 0xed,\n-\t\t\t0x5a, 0x90, 0xf8, 0x31, 0x35,\n-\t\t\t0x1c, 0x85, 0xd6, 0x15, 0x5a,\n-\t\t\t0x42, 0xa1, 0x7c, 0xa1, 0xf2,\n-\t\t\t0x5f, 0x50, 0x1c, 0xc1, 0x3f,\n-\t\t\t0x67, 0x10, 0x8a, 0xe5, 0x3b,\n-\t\t\t0xda, 0x92, 0xdb, 0x88, 0x27,\n-\t\t\t0x2e, 0x00, 0x83, 0x43, 0xa1,\n-\t\t\t0x01, 0x26, 0xa1, 0x04, 0x42,\n-\t\t\t0x31, 0x31, 0x58, 0x40, 0x93,\n-\t\t\t0x48, 0x7d, 0x09, 0x25, 0x6a,\n-\t\t\t0x3e, 0xf4, 0x96, 0x37, 0x19,\n-\t\t\t0xba, 0x5c, 0xf1, 0x01, 0xac,\n-\t\t\t0xe2, 0xfc, 0x13, 0xd6, 0x31,\n-\t\t\t0x4b, 0x49, 0x58, 0x21, 0x71,\n-\t\t\t0xff, 0xa4, 0xa1, 0x31, 0x4d,\n-\t\t\t0xc9, 0x3e, 0x4a, 0x4a, 0xdf,\n-\t\t\t0xa4, 0x2a, 0x79, 0xe3, 0x1b,\n-\t\t\t0x35, 0xd7, 0x30, 0x43, 0x58,\n-\t\t\t0x58, 0x5b, 0x41, 0x79, 0x96,\n-\t\t\t0x78, 0xce, 0x00, 0xca, 0x47,\n-\t\t\t0xc3, 0xe0, 0x23, 0x86, 0x39,\n-\t\t\t0x23, 0xf8, 0xc8, 0x04, 0x42,\n-\t\t\t0x31, 0x31, 0x54, 0x54, 0x68,\n-\t\t\t0x69, 0x73, 0x20, 0x69, 0x73,\n-\t\t\t0x20, 0x74, 0x68, 0x65, 0x20,\n-\t\t\t0x63, 0x6f, 0x6e, 0x74, 0x65,\n-\t\t\t0x6e, 0x74, 0x2e, 0x58, 0x40,\n-\t\t\t0x71, 0x42, 0xfd, 0x2f, 0xf9,\n-\t\t\t0x6d, 0x56, 0xdb, 0x85, 0xbe,\n-\t\t\t0xe9, 0x05, 0xa7, 0x6b, 0xa1,\n-\t\t\t0xd0, 0xb7, 0x32, 0x1a, 0x95,\n-\t\t\t0xc8, 0xc4, 0xd3, 0x60, 0x7c,\n-\t\t\t0x57, 0x81, 0x93, 0x2b, 0x7a,\n-\t\t\t0xfb, 0x87, 0x11, 0x49, 0x7d,\n-\t\t\t0xfa, 0x75, 0x1b, 0xf4, 0x0b,\n-\t\t\t0x58, 0xb3, 0xbc, 0xc3, 0x23,\n-\t\t\t0x00, 0xb1, 0x48, 0x7f, 0x3d,\n-\t\t\t0xb3, 0x40, 0x85, 0xee, 0xf0,\n-\t\t\t0x13, 0xbf, 0x08, 0xf4, 0xa4,\n-\t\t\t0x4d, 0x6f, 0xef, 0x0d\n-\t};\n-;\n-\n-struct seq {\n-\tchar\t\t\treason;\n-\tstruct lecp_item\titem;\n-\tconst uint8_t\t\t*buf;\n-\tsize_t\t\t\tbuf_len;\n-};\n-\n-static const uint8_t bm12[] \u003d {\n-\t0x01, 0x00, 0x00, 0x00,\n-\t0x00, 0x00, 0x00, 0x00,\n-\t0x00\n-}, bm48[] \u003d {\n-\t0x32, 0x30, 0x31, 0x33,\n-\t0x2D, 0x30, 0x33, 0x2D,\n-\t0x32, 0x31, 0x54, 0x32,\n-\t0x30, 0x3A, 0x30, 0x34,\n-\t0x3A, 0x30, 0x30, 0x5A\n-}, bm51[] \u003d {\n-\t0x01, 0x02, 0x03, 0x04\n-}, bm52[] \u003d {\n-\t0x64, 0x49, 0x45, 0x54,\n-\t0x46\n-}, bm53[] \u003d {\n-\t0x68, 0x74, 0x74, 0x70,\n-\t0x3A, 0x2F, 0x2F, 0x77,\n-\t0x77, 0x77, 0x2E, 0x65,\n-\t0x78, 0x61, 0x6D, 0x70,\n-\t0x6C, 0x65, 0x2E, 0x63,\n-\t0x6F, 0x6D\n-}, bm57[] \u003d {\n-\t0x61\n-}, bm58[] \u003d {\n-\t0x49, 0x45, 0x54, 0x46\n-}, bm59[] \u003d {\n-\t0x22, 0x5C\n-}, bm60[] \u003d {\n-\t0xc3, 0xbc\n-}, bm61[] \u003d {\n-\t0xe6, 0xb0, 0xb4\n-}, bm62[] \u003d {\n-\t0xF0, 0x90, 0x85, 0x91\n-}, bm72a[] \u003d {\n-\t0x01, 0x02\n-}, bm72b[] \u003d {\n-\t0x03, 0x04, 0x05\n-}, bm83a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm83b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm83c[] \u003d {\n-\t0x2B, 0xDC, 0xC8, 0x9F,\n-\t0x05, 0x82, 0x16, 0xB8,\n-\t0xA2, 0x08, 0xDD, 0xC6,\n-\t0xD8, 0xB5, 0x4A, 0xA9,\n-\t0x1F, 0x48, 0xBD, 0x63,\n-\t0x48, 0x49, 0x86, 0x56,\n-\t0x51, 0x05, 0xC9, 0xAD,\n-\t0x5A, 0x66, 0x82, 0xF6\n-}, bm83d[] \u003d {\n-\t0x6F, 0x75, 0x72, 0x2D,\n-\t0x73, 0x65, 0x63, 0x72,\n-\t0x65, 0x74\n-}, bm84a[] \u003d {\n-\t0xa1, 0x01, 0x06\n-}, bm84b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm84c[] \u003d {\n-\t0xB3, 0x09, 0x7F, 0x70,\n-\t0x00, 0x9A, 0x11, 0x50,\n-\t0x74, 0x09, 0x59, 0x8A,\n-\t0x83, 0xE1, 0x5B, 0xBB,\n-\t0xBF, 0x19, 0x82, 0xDC,\n-\t0xE2, 0x8E, 0x5A, 0xB6,\n-\t0xD5, 0xA6, 0xAF, 0xF6,\n-\t0x89, 0x7B, 0xD2, 0x4B,\n-\t0xB8, 0xB7, 0x47, 0x96,\n-\t0x22, 0xC9, 0x40, 0x1B,\n-\t0x24, 0x09, 0x0D, 0x45,\n-\t0x82, 0x06, 0xD5, 0x87\n-}, bm84d[] \u003d {\n-\t0x73, 0x65, 0x63, 0x2D,\n-\t0x34, 0x38\n-}, bm85a[] \u003d {\n-\t0xa1, 0x01, 0x07\n-}, bm85b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm85c[] \u003d {\n-\t0xCD, 0x28, 0xA6, 0xB3,\n-\t0xCF, 0xBB, 0xBF, 0x21,\n-\t0x48, 0x51, 0xB9, 0x06,\n-\t0xE0, 0x50, 0x05, 0x6C,\n-\t0xB4, 0x38, 0xA8, 0xB8,\n-\t0x89, 0x05, 0xB8, 0xB7,\n-\t0x46, 0x19, 0x77, 0x02,\n-\t0x27, 0x11, 0xA9, 0xD8,\n-\t0xAC, 0x5D, 0xBC, 0x54,\n-\t0xE2, 0x9A, 0x56, 0xD9,\n-\t0x26, 0x04, 0x6B, 0x40,\n-\t0xFC, 0x26, 0x07, 0xC2,\n-\t0x5B, 0x34, 0x44, 0x54,\n-\t0xAA, 0x5F, 0x68, 0xDE,\n-\t0x09, 0xA3, 0xE5, 0x25,\n-\t0xD3, 0x86, 0x5A, 0x05\n-}, bm85d[] \u003d {\n-\t0x73, 0x65, 0x63, 0x2D,\n-\t0x36, 0x34\n-}, bm86a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm86b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm86c[] \u003d {\n-\t0x2B, 0xDC, 0xC8, 0x9F,\n-\t0x05, 0x82, 0x16, 0xB8,\n-\t0xA2, 0x08, 0xDD, 0xC6,\n-\t0xD8, 0xB5, 0x4A, 0xA9,\n-\t0x1F, 0x48, 0xBD, 0x63,\n-\t0x48, 0x49, 0x86, 0x56,\n-\t0x51, 0x05, 0xC9, 0xAD,\n-\t0x5A, 0x66, 0x82, 0xF7\n-}, bm86d[] \u003d {\n-\t0x6F, 0x75, 0x72, 0x2D,\n-\t0x73, 0x65, 0x63, 0x72,\n-\t0x65, 0x74\n-}, bm87a[] \u003d {\n-\t0xa1, 0x01, 0x04\n-}, bm87b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm87c[] \u003d {\n-\t0x6F, 0x35, 0xCA, 0xB7,\n-\t0x79, 0xF7, 0x78, 0x33\n-}, bm87d[] \u003d {\n-\t0x6F, 0x75, 0x72, 0x2D,\n-\t0x73, 0x65, 0x63, 0x72,\n-\t0x65, 0x74\n-}, bm88a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm88b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm88c[] \u003d {\n-\t0xA1, 0xA8, 0x48, 0xD3,\n-\t0x47, 0x1F, 0x9D, 0x61,\n-\t0xEE, 0x49, 0x01, 0x8D,\n-\t0x24, 0x4C, 0x82, 0x47,\n-\t0x72, 0xF2, 0x23, 0xAD,\n-\t0x4F, 0x93, 0x52, 0x93,\n-\t0xF1, 0x78, 0x9F, 0xC3,\n-\t0xA0, 0x8D, 0x8C, 0x58\n-}, bm89a[] \u003d {\n-\t0xa1, 0x01, 0x06\n-}, bm89b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm89c[] \u003d {\n-\t0x99, 0x8D, 0x26, 0xC6,\n-\t0x45, 0x9A, 0xAE, 0xEC,\n-\t0xF4, 0x4E, 0xD2, 0x0C,\n-\t0xE0, 0x0C, 0x8C, 0xCE,\n-\t0xDF, 0x0A, 0x1F, 0x3D,\n-\t0x22, 0xA9, 0x2F, 0xC0,\n-\t0x5D, 0xB0, 0x8C, 0x5A,\n-\t0xEB, 0x1C, 0xB5, 0x94,\n-\t0xCA, 0xAF, 0x5A, 0x5C,\n-\t0x5E, 0x2E, 0x9D, 0x01,\n-\t0xCC, 0xE7, 0xE7, 0x7A,\n-\t0x93, 0xAA, 0x8C, 0x62\n-}, bm90a[] \u003d {\n-\t0xa1, 0x01, 0x07\n-}, bm90b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm90c[] \u003d {\n-\t0x4A, 0x55, 0x5B, 0xF9,\n-\t0x71, 0xF7, 0xC1, 0x89,\n-\t0x1D, 0x9D, 0xDF, 0x30,\n-\t0x4A, 0x1A, 0x13, 0x2E,\n-\t0x2D, 0x6F, 0x81, 0x74,\n-\t0x49, 0x47, 0x4D, 0x81,\n-\t0x3E, 0x6D, 0x04, 0xD6,\n-\t0x59, 0x62, 0xBE, 0xD8,\n-\t0xBB, 0xA7, 0x0C, 0x17,\n-\t0xE1, 0xF5, 0x30, 0x8F,\n-\t0xA3, 0x99, 0x62, 0x95,\n-\t0x9A, 0x4B, 0x9B, 0x8D,\n-\t0x7D, 0xA8, 0xE6, 0xD8,\n-\t0x49, 0xB2, 0x09, 0xDC,\n-\t0xD3, 0xE9, 0x8C, 0xC0,\n-\t0xF1, 0x1E, 0xDD, 0xF2\n-}, bm91a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm91b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm91c[] \u003d {\n-\t0xA1, 0xA8, 0x48, 0xD3,\n-\t0x47, 0x1F, 0x9D, 0x61,\n-\t0xEE, 0x49, 0x01, 0x8D,\n-\t0x24, 0x4C, 0x82, 0x47,\n-\t0x72, 0xF2, 0x23, 0xAD,\n-\t0x4F, 0x93, 0x52, 0x93,\n-\t0xF1, 0x78, 0x9F, 0xC3,\n-\t0xA0, 0x8D, 0x8C, 0x59\n-}, bm92a[] \u003d {\n-\t0xa1, 0x01, 0x04\n-}, bm92b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73,\n-\t0x20, 0x69, 0x73, 0x20,\n-\t0x74, 0x68, 0x65, 0x20,\n-\t0x63, 0x6F, 0x6E, 0x74,\n-\t0x65, 0x6E, 0x74, 0x2E\n-}, bm92c[] \u003d {\n-\t0x11, 0xF9, 0xE3, 0x57,\n-\t0x97, 0x5F, 0xB8, 0x49\n-}, bm93a[] \u003d {\n-\t0xa1, 0x01, 0x01\n-}, bm93b[] \u003d {\n-\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t0x87, 0xce\n-}, bm93c[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm93d[] \u003d {\n-\t0x31, 0x31\n-}, bm93e[] \u003d {\n-\t0xe1, 0x04, 0x39, 0x15, 0x4c,\n-\t0xc7, 0x5c, 0x7a, 0x3a, 0x53,\n-\t0x91, 0x49, 0x1f, 0x88, 0x65,\n-\t0x1e, 0x02, 0x92, 0xfd, 0x0f,\n-\t0xe0, 0xe0, 0x2c, 0xf7, 0x40,\n-\t0x54, 0x7e, 0xaf, 0x66, 0x77,\n-\t0xb4, 0xa4, 0x04, 0x0b, 0x8e,\n-\t0xca, 0x16, 0xdb, 0x59, 0x28,\n-\t0x81, 0x26, 0x2f, 0x77, 0xb1,\n-\t0x4c, 0x1a, 0x08, 0x6c, 0x02,\n-\t0x26, 0x8b, 0x17, 0x17, 0x1c,\n-\t0xa1, 0x6b, 0xe4, 0xb8, 0x59,\n-\t0x5f, 0x8c, 0x0a, 0x08\n-}, bm93f[] \u003d {\n-\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n-\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n-\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n-\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n-\t0x16, 0x2e, 0x2c, 0x03, 0x56,\n-\t0x8b, 0x41, 0xf5, 0x7c, 0x3c,\n-\t0xc1, 0x6f, 0x91, 0x66, 0x25,\n-\t0x0a\n-\n-}, bm94a[] \u003d {\n-\t0xa1, 0x01, 0x01\n-}, bm94b[] \u003d {\n-\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t0x87, 0xce\n-}, bm94c[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm94d[] \u003d {\n-\t0x31, 0x31\n-}, bm94e[] \u003d {\n-\t0xe1, 0x04, 0x39, 0x15, 0x4c,\n-\t0xc7, 0x5c, 0x7a, 0x3a, 0x53,\n-\t0x91, 0x49, 0x1f, 0x88, 0x65,\n-\t0x1e, 0x02, 0x92, 0xfd, 0x0f,\n-\t0xe0, 0xe0, 0x2c, 0xf7, 0x40,\n-\t0x54, 0x7e, 0xaf, 0x66, 0x77,\n-\t0xb4, 0xa4, 0x04, 0x0b, 0x8e,\n-\t0xca, 0x16, 0xdb, 0x59, 0x28,\n-\t0x81, 0x26, 0x2f, 0x77, 0xb1,\n-\t0x4c, 0x1a, 0x08, 0x6c, 0x02,\n-\t0x26, 0x8b, 0x17, 0x17, 0x1c,\n-\t0xa1, 0x6b, 0xe4, 0xb8, 0x59,\n-\t0x5f, 0x8c, 0x0a, 0x08\n-}, bm94f[] \u003d {\n-\t0xa1, 0x01, 0x26\n-}, bm94g[] \u003d {\n-\t0x31, 0x31\n-}, bm94h[] \u003d {\n-\t0xfc, 0xa9, 0x8e, 0xca, 0xc8,\n-\t0x0b, 0x5f, 0xeb, 0x3a, 0xc7,\n-\t0xc1, 0x08, 0xb2, 0xb7, 0x91,\n-\t0x10, 0xde, 0x88, 0x86, 0x7b,\n-\t0xc0, 0x42, 0x6f, 0xc8, 0x3c,\n-\t0x53, 0xcc, 0xd6, 0x78, 0x96,\n-\t0x94, 0xed, 0xc5, 0xfe, 0xe3,\n-\t0xc4, 0x0d, 0xe8, 0xe7, 0xb4,\n-\t0x4f, 0xe8, 0xaa, 0xd3, 0x67,\n-\t0xe0, 0x95, 0xc8, 0xfc, 0x31,\n-\t0xb7, 0x9e, 0xe6, 0x66, 0xdf,\n-\t0x9c, 0xf9, 0x09, 0x06, 0xeb,\n-\t0x43, 0x75, 0x6c, 0x73\n-}, bm94i[] \u003d {\n-\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n-\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n-\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n-\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n-\t0x16, 0x2e, 0x2c, 0x03, 0x56,\n-\t0x8b, 0x41, 0xf5, 0x7c, 0x3c,\n-\t0xc1, 0x6f, 0x91, 0x66, 0x25,\n-\t0x0a\n-\n-}, bm95a[] \u003d {\n-\t0xa1, 0x01, 0x01\n-}, bm95b[] \u003d {\n-\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t0x87, 0xce\n-}, bm95c[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm95d[] \u003d {\n-\t0x31, 0x31\n-}, bm95e[] \u003d {\n-\t0x9a, 0x8e, 0xed, 0xe3, 0xb3,\n-\t0xcb, 0x83, 0x7b, 0xa0, 0x0d,\n-\t0xf0, 0x8f, 0xa2, 0x1b, 0x12,\n-\t0x8b, 0x2d, 0x6d, 0x91, 0x62,\n-\t0xa4, 0x29, 0x0a, 0x58, 0x2d,\n-\t0x9f, 0x19, 0xbd, 0x0f, 0xb5,\n-\t0x02, 0xf0, 0xf9, 0x2b, 0x9b,\n-\t0xf4, 0x53, 0xa4, 0x05, 0x40,\n-\t0x1f, 0x8b, 0x70, 0x55, 0xef,\n-\t0x4e, 0x95, 0x8d, 0xf7, 0xf4,\n-\t0xfb, 0xd7, 0xcf, 0xb4, 0xa0,\n-\t0xc9, 0x71, 0x60, 0xf9, 0x47,\n-\t0x2b, 0x0a, 0xa1, 0x04\n-}, bm95f[] \u003d {\n-\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n-\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n-\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n-\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n-\t0x35, 0x81, 0xf2, 0xc8, 0x00,\n-\t0x39, 0x82, 0x63, 0x50, 0xb9,\n-\t0x7a, 0xe2, 0x30, 0x0E, 0x42,\n-\t0xFC\n-}, bm95g[] \u003d {\n-\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t0x65, 0x63, 0x72, 0x65, 0x74\n-\n-}, bm96a[] \u003d {\n-\t0xa1, 0x01, 0x01\n-}, bm96b[] \u003d {\n-\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t0x87, 0xce\n-}, bm96c[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm96d[] \u003d {\n-\t0x31, 0x31\n-}, bm96e[] \u003d {\n-\t0x9a, 0x8e, 0xed, 0xe3, 0xb3,\n-\t0xcb, 0x83, 0x7b, 0xa0, 0x0d,\n-\t0xf0, 0x8f, 0xa2, 0x1b, 0x12,\n-\t0x8b, 0x2d, 0x6d, 0x91, 0x62,\n-\t0xa4, 0x29, 0x0a, 0x58, 0x2d,\n-\t0x9f, 0x19, 0xbd, 0x0f, 0xb5,\n-\t0x02, 0xf0, 0xf9, 0x2b, 0x9b,\n-\t0xf4, 0x53, 0xa4, 0x05, 0x40,\n-\t0x1f, 0x8b, 0x70, 0x55, 0xef,\n-\t0x4e, 0x95, 0x8d, 0xf7, 0xf4,\n-\t0xfb, 0xd7, 0xcf, 0xb4, 0xa0,\n-\t0xc9, 0x71, 0x60, 0xf9, 0x47,\n-\t0x2b, 0x0a, 0xa1, 0x04\n-}, bm96f[] \u003d {\n-\t0xa1, 0x01, 0x26\n-}, bm96g[] \u003d {\n-\t0x31, 0x31\n-}, bm96h[] \u003d {\n-\t0x24, 0x27, 0xcb, 0x37, 0x56,\n-\t0x85, 0x0f, 0xbb, 0x79, 0x05,\n-\t0x18, 0x07, 0xc8, 0xb2, 0x3d,\n-\t0x2e, 0x6d, 0x16, 0xa3, 0x22,\n-\t0x4f, 0x99, 0x01, 0xb4, 0x73,\n-\t0x99, 0xcf, 0xc7, 0xe3, 0xfa,\n-\t0xc4, 0xcc, 0x62, 0x1d, 0xbb,\n-\t0xeb, 0x02, 0x02, 0xa6, 0xd8,\n-\t0xbb, 0x25, 0x69, 0x5c, 0x9d,\n-\t0xcc, 0x9c, 0x47, 0x49, 0x20,\n-\t0xff, 0x57, 0x60, 0x6d, 0x76,\n-\t0x4d, 0xea, 0x19, 0x2f, 0xc8,\n-\t0x67, 0x41, 0x16, 0xf2\n-}, bm96i[] \u003d {\n-\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n-\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n-\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n-\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n-\t0x35, 0x81, 0xf2, 0xc8, 0x00,\n-\t0x39, 0x82, 0x63, 0x50, 0xb9,\n-\t0x7a, 0xe2, 0x30, 0x0e, 0x42,\n-\t0xfc\n-}, bm96j[] \u003d {\n-\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t0x65, 0x63, 0x72, 0x65, 0x74\n-\n-}, bm97a[] \u003d {\n-\t0xa1, 0x01, 0x01\n-}, bm97b[] \u003d {\n-\t0x02, 0xd1, 0xf7, 0xe6, 0xf2,\n-\t0x6c, 0x43, 0xd4, 0x86, 0x8d,\n-\t0x87, 0xce\n-}, bm97c[] \u003d {\n-\t0x60, 0x97, 0x3a, 0x94, 0xbb,\n-\t0x28, 0x98, 0x00, 0x9e, 0xe5,\n-\t0x2e, 0xcf, 0xd9, 0xab, 0x1d,\n-\t0xd2, 0x58, 0x67, 0x37, 0x4b,\n-\t0x35, 0x81, 0xf2, 0xc8, 0x00,\n-\t0x39, 0x82, 0x63, 0x50, 0xb9,\n-\t0x7a, 0xe2, 0x30, 0x0e, 0x42,\n-\t0xfc\n-}, bm97d[] \u003d {\n-\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t0x65, 0x63, 0x72, 0x65, 0x74\n-}, bm97e[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm97f[] \u003d {\n-\t0x31, 0x31\n-}, bm97g[] \u003d {\n-\t0xcc, 0xb1, 0xf3, 0xfe, 0xdf,\n-\t0xce, 0xa7, 0x2b, 0x9c, 0x86,\n-\t0x79, 0x63, 0xe2, 0x52, 0xb6,\n-\t0x65, 0x8a, 0xd0, 0x7f, 0x3f,\n-\t0x5f, 0x15, 0xa3, 0x26, 0xa3,\n-\t0xf5, 0x72, 0x54, 0xcc, 0xb8,\n-\t0xd4, 0x8d, 0x60, 0x02, 0x1d,\n-\t0x2f, 0x1f, 0x8a, 0x80, 0x3b,\n-\t0x84, 0x4b, 0x78, 0x72, 0x16,\n-\t0x6c, 0x6d, 0x45, 0x90, 0x25,\n-\t0xd2, 0x1c, 0x8c, 0x84, 0x62,\n-\t0xa2, 0x44, 0xba, 0x19, 0x60,\n-\t0x4e, 0xc4, 0xd5, 0x0b\n-\n-}, bm98a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm98b[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm98c[] \u003d {\n-\t0x31, 0x31\n-}, bm98d[] \u003d {\n-\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n-\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n-\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n-\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n-\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n-\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n-\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n-\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n-\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n-\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n-\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n-\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n-\t0xfc, 0x27, 0x47, 0x07\n-}, bm98e[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm98f[] \u003d {\n-\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n-\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n-\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n-\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n-\t0x48, 0x49, 0x86, 0x56, 0x51,\n-\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n-\t0x82, 0xf6\n-}, bm98g[] \u003d {\n-\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t0x65, 0x63, 0x72, 0x65, 0x74\n-\n-}, bm99a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm99b[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm99c[] \u003d {\n-\t0x31, 0x31\n-}, bm99d[] \u003d {\n-\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n-\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n-\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n-\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n-\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n-\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n-\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n-\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n-\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n-\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n-\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n-\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n-\t0xfc, 0x27, 0x47, 0x07\n-}, bm99e[] \u003d {\n-\t0xa1, 0x01, 0x26\n-}, bm99f[] \u003d {\n-\t0x31, 0x31\n-}, bm99g[] \u003d {\n-\t0x6a, 0xcd, 0x94, 0xd3, 0xcc,\n-\t0xf7, 0x1d, 0x19, 0x2e, 0x85,\n-\t0x28, 0x36, 0x0b, 0xa7, 0xe3,\n-\t0x46, 0xda, 0xc4, 0x64, 0xe9,\n-\t0xed, 0xca, 0x4c, 0xfe, 0xb6,\n-\t0xce, 0xb6, 0xbd, 0xe7, 0xba,\n-\t0xec, 0x9f, 0xf2, 0x6c, 0xa6,\n-\t0xbd, 0xf7, 0x3d, 0x0b, 0xe4,\n-\t0x1e, 0x36, 0x12, 0x9d, 0xcf,\n-\t0xf7, 0x51, 0xdd, 0x2b, 0x5a,\n-\t0xd5, 0xce, 0x11, 0x6e, 0x8a,\n-\t0x96, 0x3a, 0x27, 0x38, 0xa2,\n-\t0x99, 0x47, 0x7a, 0x68\n-}, bm99h[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm99i[] \u003d {\n-\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n-\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n-\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n-\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n-\t0x48, 0x49, 0x86, 0x56, 0x51,\n-\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n-\t0x82, 0xf6\n-}, bm99j[] \u003d {\n-\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t0x65, 0x63, 0x72, 0x65, 0x74\n-\n-}, bm100a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm100b[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm100c[] \u003d {\n-\t0x31, 0x31\n-}, bm100d[] \u003d {\n-\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n-\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n-\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n-\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n-\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n-\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n-\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n-\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n-\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n-\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n-\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n-\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n-\t0xfc, 0x27, 0x47, 0x07\n-}, bm100e[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm100f[] \u003d {\n-\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n-\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n-\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n-\t0x47, 0x72, 0xf2, 0x23, 0xad,\n-\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n-\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n-\t0x8c, 0x58\n-\n-\n-}, bm101a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm101b[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm101c[] \u003d {\n-\t0x31, 0x31\n-}, bm101d[] \u003d {\n-\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n-\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n-\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n-\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n-\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n-\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n-\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n-\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n-\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n-\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n-\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n-\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n-\t0xfc, 0x27, 0x47, 0x07\n-}, bm101e[] \u003d {\n-\t0xa1, 0x01, 0x26\n-}, bm101f[] \u003d {\n-\t0x31, 0x31\n-}, bm101g[] \u003d {\n-\t0x6a, 0xcd, 0x94, 0xd3, 0xcc,\n-\t0xf7, 0x1d, 0x19, 0x2e, 0x85,\n-\t0x28, 0x36, 0x0b, 0xa7, 0xe3,\n-\t0x46, 0xda, 0xc4, 0x64, 0xe9,\n-\t0xed, 0xca, 0x4c, 0xfe, 0xb6,\n-\t0xce, 0xb6, 0xbd, 0xe7, 0xba,\n-\t0xec, 0x9f, 0xf2, 0x6c, 0xa6,\n-\t0xbd, 0xf7, 0x3d, 0x0b, 0xe4,\n-\t0x1e, 0x36, 0x12, 0x9d, 0xcf,\n-\t0xf7, 0x51, 0xdd, 0x2b, 0x5a,\n-\t0xd5, 0xce, 0x11, 0x6e, 0x8a,\n-\t0x96, 0x3a, 0x27, 0x38, 0xa2,\n-\t0x99, 0x47, 0x7a, 0x68\n-}, bm101h[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm101i[] \u003d {\n-\t0x2b, 0xdc, 0xc8, 0x9f, 0x05,\n-\t0x82, 0x16, 0xb8, 0xa2, 0x08,\n-\t0xdd, 0xc6, 0xd8, 0xb5, 0x4a,\n-\t0xa9, 0x1f, 0x48, 0xbd, 0x63,\n-\t0x48, 0x49, 0x86, 0x56, 0x51,\n-\t0x05, 0xc9, 0xad, 0x5a, 0x66,\n-\t0x82, 0xf6\n-}, bm101j[] \u003d {\n-\t0x6f, 0x75, 0x72, 0x2d, 0x73,\n-\t0x65, 0x63, 0x72, 0x65, 0x74\n-\n-}, bm102a[] \u003d { /* mac0-01 */\n-\t0xa1, 0x01, 0x05\n-}, bm102b[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm102c[] \u003d {\n-\t0x31, 0x31\n-}, bm102d[] \u003d {\n-\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n-\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n-\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n-\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n-\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n-\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n-\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n-\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n-\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n-\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n-\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n-\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n-\t0xfc, 0x27, 0x47, 0x07\n-}, bm102e[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm102f[] \u003d {\n-\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n-\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n-\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n-\t0x47, 0x72, 0xf2, 0x23, 0xad,\n-\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n-\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n-\t0x8c, 0x58\n-\n-}, bm103a[] \u003d {\n-\t0xa1, 0x01, 0x05\n-}, bm103b[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm103c[] \u003d {\n-\t0x31, 0x31\n-}, bm103d[] \u003d {\n-\t0xb4, 0x92, 0x4b, 0x18, 0xeb,\n-\t0x4e, 0x04, 0x73, 0x13, 0xc7,\n-\t0x07, 0xb0, 0xed, 0xa4, 0xab,\n-\t0x84, 0x43, 0x45, 0xf2, 0xc4,\n-\t0x49, 0x87, 0xd6, 0xf9, 0xeb,\n-\t0xcc, 0x77, 0x7e, 0xfd, 0x40,\n-\t0x78, 0xcc, 0x0f, 0x4c, 0x10,\n-\t0x8d, 0xef, 0x95, 0x9f, 0x78,\n-\t0xf1, 0xed, 0xb2, 0x76, 0x54,\n-\t0x25, 0x78, 0x5f, 0xcd, 0x17,\n-\t0xd5, 0x12, 0xbe, 0x31, 0xee,\n-\t0xb6, 0x6b, 0xef, 0xf1, 0xe8,\n-\t0xfc, 0x27, 0x47, 0x07\n-}, bm103e[] \u003d {\n-\t0xa1, 0x01, 0x26\n-}, bm103f[] \u003d {\n-\t0x31, 0x31\n-}, bm103g[] \u003d {\n-\t0x6a, 0xcd, 0x94, 0xd3, 0xcc,\n-\t0xf7, 0x1d, 0x19, 0x2e, 0x85,\n-\t0x28, 0x36, 0x0b, 0xa7, 0xe3,\n-\t0x46, 0xda, 0xc4, 0x64, 0xe9,\n-\t0xed, 0xca, 0x4c, 0xfe, 0xb6,\n-\t0xce, 0xb6, 0xbd, 0xe7, 0xba,\n-\t0xec, 0x9f, 0xf2, 0x6c, 0xa6,\n-\t0xbd, 0xf7, 0x3d, 0x0b, 0xe4,\n-\t0x1e, 0x36, 0x12, 0x9d, 0xcf,\n-\t0xf7, 0x51, 0xdd, 0x2b, 0x5a,\n-\t0xd5, 0xce, 0x11, 0x6e, 0x8a,\n-\t0x96, 0x3a, 0x27, 0x38, 0xa2,\n-\t0x99, 0x47, 0x7a, 0x68\n-}, bm103h[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm103i[] \u003d {\n-\t0xa1, 0xa8, 0x48, 0xd3, 0x47,\n-\t0x1f, 0x9d, 0x61, 0xee, 0x49,\n-\t0x01, 0x8d, 0x24, 0x4c, 0x82,\n-\t0x47, 0x72, 0xf2, 0x23, 0xad,\n-\t0x4f, 0x93, 0x52, 0x93, 0xf1,\n-\t0x78, 0x9f, 0xc3, 0xa0, 0x8d,\n-\t0x8c, 0x58\n-\n-}, bm104a[] \u003d {\n-\t0xa1, 0x03, 0x00\n-}, bm104b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm104c[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm104d[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm104e[] \u003d {\n-\t0x31, 0x31\n-}, bm104f[] \u003d {\n-\t0x8e, 0x1b, 0xe2, 0xf9, 0x45,\n-\t0x3d, 0x26, 0x48, 0x12, 0xe5,\n-\t0x90, 0x49, 0x91, 0x32, 0xbe,\n-\t0xf3, 0xfb, 0xf9, 0xee, 0x9d,\n-\t0xb2, 0x7c, 0x2c, 0x16, 0x87,\n-\t0x88, 0xe3, 0xb7, 0xeb, 0xe5,\n-\t0x06, 0xc0, 0x4f, 0xd3, 0xd1,\n-\t0x9f, 0xaa, 0x9f, 0x51, 0x23,\n-\t0x2a, 0xf5, 0xc9, 0x59, 0xe4,\n-\t0xef, 0x47, 0x92, 0x88, 0x34,\n-\t0x64, 0x7f, 0x56, 0xdf, 0xbe,\n-\t0x93, 0x91, 0x12, 0x88, 0x4d,\n-\t0x08, 0xef, 0x25, 0x05\n-}, bm104g[] \u003d {\n-\t0x31, 0x31\n-}, bm104h[] \u003d {\n-\t0x77, 0xf3, 0xea, 0xcd, 0x11,\n-\t0x85, 0x2c, 0x4b, 0xf9, 0xcb,\n-\t0x1d, 0x72, 0xfa, 0xbe, 0x6b,\n-\t0x26, 0xfb, 0xa1, 0xd7, 0x60,\n-\t0x92, 0xb2, 0xb5, 0xb7, 0xec,\n-\t0x83, 0xb8, 0x35, 0x57, 0x65,\n-\t0x22, 0x64, 0xe6, 0x96, 0x90,\n-\t0xdb, 0xc1, 0x17, 0x2d, 0xdc,\n-\t0x0b, 0xf8, 0x84, 0x11, 0xc0,\n-\t0xd2, 0x5a, 0x50, 0x7f, 0xdb,\n-\t0x24, 0x7a, 0x20, 0xc4, 0x0d,\n-\t0x5e, 0x24, 0x5f, 0xab, 0xd3,\n-\t0xfc, 0x9e, 0xc1, 0x06\n-\n-}, bm105a[] \u003d {\n-\t0xa1, 0x03, 0x00\n-}, bm105b[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm105c[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm105d[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm105e[] \u003d {\n-\t0x31, 0x31\n-}, bm105f[] \u003d {\n-\t\t0x8e, 0x1b, 0xe2, 0xf9, 0x45,\n-\t\t0x3d, 0x26, 0x48, 0x12, 0xe5,\n-\t\t0x90, 0x49, 0x91, 0x32, 0xbe,\n-\t\t0xf3, 0xfb, 0xf9, 0xee, 0x9d,\n-\t\t0xb2, 0x7c, 0x2c, 0x16, 0x87,\n-\t\t0x88, 0xe3, 0xb7, 0xeb, 0xe5,\n-\t\t0x06, 0xc0, 0x4f, 0xd3, 0xd1,\n-\t\t0x9f, 0xaa, 0x9f, 0x51, 0x23,\n-\t\t0x2a, 0xf5, 0xc9, 0x59, 0xe4,\n-\t\t0xef, 0x47, 0x92, 0x88, 0x34,\n-\t\t0x64, 0x7f, 0x56, 0xdf, 0xbe,\n-\t\t0x93, 0x91, 0x12, 0x88, 0x4d,\n-\t\t0x08, 0xef, 0x25, 0x05\n-}, bm105g[] \u003d {\n-\t0xa1, 0x01, 0x26\n-}, bm105h[] \u003d {\n-\t0x31, 0x31\n-}, bm105i[] \u003d {\n-\t\t0xaf, 0x04, 0x9b, 0x80, 0xd5,\n-\t\t0x2c, 0x36, 0x69, 0xb2, 0x99,\n-\t\t0x70, 0xc1, 0x33, 0x54, 0x37,\n-\t\t0x54, 0xf9, 0xcc, 0x60, 0x8c,\n-\t\t0xe4, 0x11, 0x23, 0xae, 0x1c,\n-\t\t0x82, 0x7e, 0x36, 0xb3, 0x8c,\n-\t\t0xb8, 0x25, 0x98, 0x7f, 0x01,\n-\t\t0xf2, 0x2b, 0xb8, 0xab, 0x13,\n-\t\t0xe9, 0xc6, 0x62, 0x26, 0xee,\n-\t\t0x23, 0x17, 0x8f, 0xfa, 0x00,\n-\t\t0xa4, 0xfc, 0x22, 0x05, 0x93,\n-\t\t0xb6, 0xe5, 0xac, 0x38, 0x96,\n-\t\t0x00, 0x71, 0xc9, 0xc8\n-}, bm105j[] \u003d {\n-\t0x31, 0x31\n-}, bm105k[] \u003d {\n-\t\t0x77, 0xf3, 0xea, 0xcd, 0x11,\n-\t\t0x85, 0x2c, 0x4b, 0xf9, 0xcb,\n-\t\t0x1d, 0x72, 0xfa, 0xbe, 0x6b,\n-\t\t0x26, 0xfb, 0xa1, 0xd7, 0x60,\n-\t\t0x92, 0xb2, 0xb5, 0xb7, 0xec,\n-\t\t0x83, 0xb8, 0x35, 0x57, 0x65,\n-\t\t0x22, 0x64, 0xe6, 0x96, 0x90,\n-\t\t0xdb, 0xc1, 0x17, 0x2d, 0xdc,\n-\t\t0x0b, 0xf8, 0x84, 0x11, 0xc0,\n-\t\t0xd2, 0x5a, 0x50, 0x7f, 0xdb,\n-\t\t0x24, 0x7a, 0x20, 0xc4, 0x0d,\n-\t\t0x5e, 0x24, 0x5f, 0xab, 0xd3,\n-\t\t0xfc, 0x9e, 0xc1, 0x06\n-\n-}, bm106a[] \u003d {\n-\t0xa1, 0x03, 0x00\n-}, bm106b[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm106c[] \u003d {\n-\t0x31, 0x31\n-}, bm106d[] \u003d {\n-\t\t0xb7, 0xca, 0xcb, 0xa2, 0x85,\n-\t\t0xc4, 0xcd, 0x3e, 0xd2, 0xf0,\n-\t\t0x14, 0x6f, 0x41, 0x98, 0x86,\n-\t\t0x14, 0x4c, 0xa6, 0x38, 0xd0,\n-\t\t0x87, 0xde, 0x12, 0x3d, 0x40,\n-\t\t0x01, 0x67, 0x30, 0x8a, 0xce,\n-\t\t0xab, 0xc4, 0xb5, 0xe5, 0xc6,\n-\t\t0xa4, 0x0c, 0x0d, 0xe0, 0xb7,\n-\t\t0x11, 0x67, 0xa3, 0x91, 0x75,\n-\t\t0xea, 0x56, 0xc1, 0xfe, 0x96,\n-\t\t0xc8, 0x9e, 0x5e, 0x7d, 0x30,\n-\t\t0xda, 0xf2, 0x43, 0x8a, 0x45,\n-\t\t0x61, 0x59, 0xa2, 0x0a\n-}, bm106e[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm106f[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm106g[] \u003d {\n-\t0x31, 0x31\n-}, bm106h[] \u003d {\n-\t\t0x77, 0xf3, 0xea, 0xcd, 0x11,\n-\t\t0x85, 0x2c, 0x4b, 0xf9, 0xcb,\n-\t\t0x1d, 0x72, 0xfa, 0xbe, 0x6b,\n-\t\t0x26, 0xfb, 0xa1, 0xd7, 0x60,\n-\t\t0x92, 0xb2, 0xb5, 0xb7, 0xec,\n-\t\t0x83, 0xb8, 0x35, 0x57, 0x65,\n-\t\t0x22, 0x64, 0xe6, 0x96, 0x90,\n-\t\t0xdb, 0xc1, 0x17, 0x2d, 0xdc,\n-\t\t0x0b, 0xf8, 0x84, 0x11, 0xc0,\n-\t\t0xd2, 0x5a, 0x50, 0x7f, 0xdb,\n-\t\t0x24, 0x7a, 0x20, 0xc4, 0x0d,\n-\t\t0x5e, 0x24, 0x5f, 0xab, 0xd3,\n-\t\t0xfc, 0x9e, 0xc1, 0x06\n-\n-}, bm107a[] \u003d {\n-\t0xa2, 0x01, 0x27, 0x03, 0x00\n-}, bm107b[] \u003d {\n-\t0xa1, 0x01, 0x27,\n-}, bm107c[] \u003d {\n-\t0x31, 0x31\n-}, bm107d[] \u003d {\n-\t0x6d, 0xae, 0xd1, 0x58, 0xaf,\n-\t0xe4, 0x03, 0x2e, 0x8d, 0xd4,\n-\t0x77, 0xd3, 0xd2, 0xb7, 0xf6,\n-\t0x67, 0xe7, 0x95, 0x7a, 0xa8,\n-\t0x30, 0x2b, 0xb5, 0xe5, 0x68,\n-\t0xb4, 0xdc, 0xbc, 0xce, 0x3c,\n-\t0xf0, 0xed, 0x5a, 0x90, 0xf8,\n-\t0x31, 0x35, 0x1c, 0x85, 0xd6,\n-\t0x15, 0x5a, 0x42, 0xa1, 0x7c,\n-\t0xa1, 0xf2, 0x5f, 0x50, 0x1c,\n-\t0xc1, 0x3f, 0x67, 0x10, 0x8a,\n-\t0xe5, 0x3b, 0xda, 0x92, 0xdb,\n-\t0x88, 0x27, 0x2e, 0x00\n-}, bm107e[] \u003d {\n-\t0x31, 0x31\n-}, bm107f[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm107g[] \u003d {\n-\t0x71, 0x42, 0xfd, 0x2f, 0xf9,\n-\t0x6d, 0x56, 0xdb, 0x85, 0xbe,\n-\t0xe9, 0x05, 0xa7, 0x6b, 0xa1,\n-\t0xd0, 0xb7, 0x32, 0x1a, 0x95,\n-\t0xc8, 0xc4, 0xd3, 0x60, 0x7c,\n-\t0x57, 0x81, 0x93, 0x2b, 0x7a,\n-\t0xfb, 0x87, 0x11, 0x49, 0x7d,\n-\t0xfa, 0x75, 0x1b, 0xf4, 0x0b,\n-\t0x58, 0xb3, 0xbc, 0xc3, 0x23,\n-\t0x00, 0xb1, 0x48, 0x7f, 0x3d,\n-\t0xb3, 0x40, 0x85, 0xee, 0xf0,\n-\t0x13, 0xbf, 0x08, 0xf4, 0xa4,\n-\t0x4d, 0x6f, 0xef, 0x0d\n-\n-}, bm108a[] \u003d {\n-\t0xa2, 0x01, 0x27, 0x03, 0x00\n-}, bm108b[] \u003d {\n-\t0xa1, 0x01, 0x27\n-}, bm108c[] \u003d {\n-\t0x31, 0x31\n-}, bm108d[] \u003d {\n-\t0x6d, 0xae, 0xd1, 0x58, 0xaf,\n-\t0xe4, 0x03, 0x2e, 0x8d, 0xd4,\n-\t0x77, 0xd3, 0xd2, 0xb7, 0xf6,\n-\t0x67, 0xe7, 0x95, 0x7a, 0xa8,\n-\t0x30, 0x2b, 0xb5, 0xe5, 0x68,\n-\t0xb4, 0xdc, 0xbc, 0xce, 0x3c,\n-\t0xf0, 0xed, 0x5a, 0x90, 0xf8,\n-\t0x31, 0x35, 0x1c, 0x85, 0xd6,\n-\t0x15, 0x5a, 0x42, 0xa1, 0x7c,\n-\t0xa1, 0xf2, 0x5f, 0x50, 0x1c,\n-\t0xc1, 0x3f, 0x67, 0x10, 0x8a,\n-\t0xe5, 0x3b, 0xda, 0x92, 0xdb,\n-\t0x88, 0x27, 0x2e, 0x00\n-}, bm108e[] \u003d {\n-\t0xa1, 0x01, 0x26\n-}, bm108f[] \u003d {\n-\t0x31, 0x31\n-}, bm108g[] \u003d {\n-\t0x93, 0x48, 0x7d, 0x09, 0x25,\n-\t0x6a, 0x3e, 0xf4, 0x96, 0x37,\n-\t0x19, 0xba, 0x5c, 0xf1, 0x01,\n-\t0xac, 0xe2, 0xfc, 0x13, 0xd6,\n-\t0x31, 0x4b, 0x49, 0x58, 0x21,\n-\t0x71, 0xff, 0xa4, 0xa1, 0x31,\n-\t0x4d, 0xc9, 0x3e, 0x4a, 0x4a,\n-\t0xdf, 0xa4, 0x2a, 0x79, 0xe3,\n-\t0x1b, 0x35, 0xd7, 0x30, 0x43,\n-\t0x58, 0x58, 0x5b, 0x41, 0x79,\n-\t0x96, 0x78, 0xce, 0x00, 0xca,\n-\t0x47, 0xc3, 0xe0, 0x23, 0x86,\n-\t0x39, 0x23, 0xf8, 0xc8\n-}, bm108h[] \u003d {\n-\t0x31, 0x31\n-}, bm108i[] \u003d {\n-\t0x54, 0x68, 0x69, 0x73, 0x20,\n-\t0x69, 0x73, 0x20, 0x74, 0x68,\n-\t0x65, 0x20, 0x63, 0x6f, 0x6e,\n-\t0x74, 0x65, 0x6e, 0x74, 0x2e\n-}, bm108j[] \u003d {\n-\t0x71, 0x42, 0xfd, 0x2f, 0xf9,\n-\t0x6d, 0x56, 0xdb, 0x85, 0xbe,\n-\t0xe9, 0x05, 0xa7, 0x6b, 0xa1,\n-\t0xd0, 0xb7, 0x32, 0x1a, 0x95,\n-\t0xc8, 0xc4, 0xd3, 0x60, 0x7c,\n-\t0x57, 0x81, 0x93, 0x2b, 0x7a,\n-\t0xfb, 0x87, 0x11, 0x49, 0x7d,\n-\t0xfa, 0x75, 0x1b, 0xf4, 0x0b,\n-\t0x58, 0xb3, 0xbc, 0xc3, 0x23,\n-\t0x00, 0xb1, 0x48, 0x7f, 0x3d,\n-\t0xb3, 0x40, 0x85, 0xee, 0xf0,\n-\t0x13, 0xbf, 0x08, 0xf4, 0xa4,\n-\t0x4d, 0x6f, 0xef, 0x0d\n-};\n-\n-static const struct seq\n-seq1[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 0 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq2[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq3[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 10 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq4[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 23 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq5[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 24 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq6[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 25 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq7[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 100 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq8[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1000 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq9[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1000000 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq10[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1000000000000 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq11[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 18446744073709551615ull } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq12[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 0 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm12, .buf_len \u003d sizeof(bm12)},\n-\t{ .reason \u003d LECPCB_TAG_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq13[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d 0ull } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq14[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm12, .buf_len \u003d sizeof(bm12)},\n-\t{ .reason \u003d LECPCB_TAG_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq15[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -1ll } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq16[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -10ll } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq17[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -100ll } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq18[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -1000ll } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq19[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq20[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x8000 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq21[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x3c00 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq22[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.d \u003d 1.1 } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x3ff199999999999aull } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq23[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x3e00 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq24[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x7bff } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq25[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 100000.0 } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0x47c35000 } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq26[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 3.4028234663852886e+38 } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0x7f7fffff } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq27[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7e37e43c8800759cull } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq28[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x0001 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq29[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x0400 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq30[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0xc400 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq31[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0xc010666666666666ull } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq32[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x7c00 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq33[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0x7e00 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq34[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT16, .item \u003d { .u.hf \u003d 0xfc00 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq35[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.u32 \u003d 0x7f800000 } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0x7f800000 } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq36[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d NAN } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0x7fc00000 } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq37[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.u32 \u003d 0xff800000 } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT32, .item \u003d { .u.f \u003d 0xff800000 } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq38[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7ff0000000000000ull } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7ff0000000000000ull } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq39[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7ff8000000000000ull } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x7ff8000000000000ull } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq40[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0xfff0000000000000ull } },\n-#else\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0xfff0000000000000ull } },\n-#endif\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq41[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_FALSE },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq42[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_TRUE },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq43[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_NULL },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq44[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_UNDEFINED },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq45[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_SIMPLE, .item \u003d { .u.u64 \u003d 16 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq46[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_FAILED }, /* example disallowed by RFC! */\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq47[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_SIMPLE, .item \u003d { .u.u64 \u003d 255 } },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq48[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 0 } },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm48, .buf_len \u003d sizeof(bm48)},\n-\t{ .reason \u003d LECPCB_TAG_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq49[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1363896240 } },\n-\t{ .reason \u003d LECPCB_TAG_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq50[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_FLOAT64, .item \u003d { .u.u64 \u003d 0x41d452d9ec200000ull } },\n-\t{ .reason \u003d LECPCB_TAG_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq51[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 23 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm51, .buf_len \u003d sizeof(bm51)},\n-\t{ .reason \u003d LECPCB_TAG_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq52[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 24 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm52, .buf_len \u003d sizeof(bm52)},\n-\t{ .reason \u003d LECPCB_TAG_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq53[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 32 } },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm53, .buf_len \u003d sizeof(bm53)},\n-\t{ .reason \u003d LECPCB_TAG_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq54[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm53, .buf_len \u003d 0},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq55[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm51, .buf_len \u003d sizeof(bm51)},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq56[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm53, .buf_len \u003d 0},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq57[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm57, .buf_len \u003d sizeof(bm57)},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq58[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm58, .buf_len \u003d sizeof(bm58)},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq59[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm59, .buf_len \u003d sizeof(bm59)},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq60[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm60, .buf_len \u003d sizeof(bm60)},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq61[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm61, .buf_len \u003d sizeof(bm61)},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq62[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d bm62, .buf_len \u003d sizeof(bm62)},\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq63[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq64[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq65[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq66[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 6 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 8 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 9 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 10 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 11 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 12 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 13 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 14 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 15 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 16 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 17 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 18 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 19 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 20 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 21 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 22 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 23 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 24 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 25 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq67[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq68[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq69[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq70[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022c\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq71[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022A\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022B\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022c\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022C\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022d\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022D\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022e\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022E\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq72[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_CHUNK, .buf \u003d bm72a, .buf_len \u003d sizeof(bm72a)},\n-\t{ .reason \u003d LECPCB_VAL_BLOB_CHUNK, .buf \u003d bm72b, .buf_len \u003d sizeof(bm72b)},\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq73[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_CHUNK, .buf \u003d (const uint8_t *)\u0022stream\u0022, .buf_len \u003d 5},\n-\t{ .reason \u003d LECPCB_VAL_STR_CHUNK, .buf \u003d (const uint8_t *)\u0022ming\u0022, .buf_len \u003d 4},\n-\t{ .reason \u003d LECPCB_VAL_STR_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq74[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq75[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq76[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq77[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq78[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq79[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 6 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 8 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 9 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 10 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 11 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 12 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 13 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 14 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 15 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 16 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 17 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 18 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 19 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 20 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 21 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 22 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 23 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 24 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 25 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq80[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 2 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 3 } },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq81[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022a\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022b\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022c\u0022, .buf_len \u003d 1},\n-\t{ .reason \u003d LECPCB_OBJECT_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq82[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022Fun\u0022, .buf_len \u003d 3},\n-\t{ .reason \u003d LECPCB_VAL_TRUE },\n-\t{ .reason \u003d LECPCB_VAL_STR_START, },\n-\t{ .reason \u003d LECPCB_VAL_STR_END, .buf \u003d (const uint8_t *)\u0022Amt\u0022, .buf_len \u003d 3},\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d (int64_t)-2ll } },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-\n-}, seq83[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83a, .buf_len \u003d sizeof(bm83a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83b, .buf_len \u003d sizeof(bm83b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83c, .buf_len \u003d sizeof(bm83c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83d, .buf_len \u003d sizeof(bm83d) },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm83a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-\n-}, seq84[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84a, .buf_len \u003d sizeof(bm84a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84b, .buf_len \u003d sizeof(bm84b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84c, .buf_len \u003d sizeof(bm84c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84d, .buf_len \u003d sizeof(bm84d) },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm84a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-\n-}, seq85[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85a, .buf_len \u003d sizeof(bm85a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85b, .buf_len \u003d sizeof(bm85b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85c, .buf_len \u003d sizeof(bm85c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85d, .buf_len \u003d sizeof(bm85d) },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm85a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-\n-}, seq86[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86a, .buf_len \u003d sizeof(bm86a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86b, .buf_len \u003d sizeof(bm86b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86c, .buf_len \u003d sizeof(bm86c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86d, .buf_len \u003d sizeof(bm86d) },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm86a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq87[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87a, .buf_len \u003d sizeof(bm87a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87b, .buf_len \u003d sizeof(bm87b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87c, .buf_len \u003d sizeof(bm87c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87d, .buf_len \u003d sizeof(bm87d) },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm87a, .buf_len \u003d 0 },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq88[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm88a, .buf_len \u003d sizeof(bm88a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm88b, .buf_len \u003d sizeof(bm88b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm88c, .buf_len \u003d sizeof(bm88c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq89[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm89a, .buf_len \u003d sizeof(bm89a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm89b, .buf_len \u003d sizeof(bm89b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm89c, .buf_len \u003d sizeof(bm89c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq90[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm90a, .buf_len \u003d sizeof(bm90a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm90b, .buf_len \u003d sizeof(bm90b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm90c, .buf_len \u003d sizeof(bm90c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq91[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm91a, .buf_len \u003d sizeof(bm91a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm91b, .buf_len \u003d sizeof(bm91b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm91c, .buf_len \u003d sizeof(bm91c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq92[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm92a, .buf_len \u003d sizeof(bm92a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm92b, .buf_len \u003d sizeof(bm92b) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm92c, .buf_len \u003d sizeof(bm92c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq93[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 16 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93a, .buf_len \u003d sizeof(bm93a) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93b, .buf_len \u003d sizeof(bm93b) },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t{ .reason \u003d LECPCB_ARRAY_START, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93c, .buf_len \u003d sizeof(bm93c) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_OBJECT_START, },\n-\t{ .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93d, .buf_len \u003d sizeof(bm93d) },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93e, .buf_len \u003d sizeof(bm93e) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_OBJECT_END },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm93f, .buf_len \u003d sizeof(bm93f) },\n-\t{ .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t{ .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq94[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 16 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94a, .buf_len \u003d sizeof(bm94a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94b, .buf_len \u003d sizeof(bm94b) },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94c, .buf_len \u003d sizeof(bm94c) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94d, .buf_len \u003d sizeof(bm94d) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94e, .buf_len \u003d sizeof(bm94e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94f, .buf_len \u003d sizeof(bm94f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94g, .buf_len \u003d sizeof(bm94g) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94h, .buf_len \u003d sizeof(bm94h) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm94i, .buf_len \u003d sizeof(bm94i) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq95[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 96 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95a, .buf_len \u003d sizeof(bm95a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95b, .buf_len \u003d sizeof(bm95b) },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95c, .buf_len \u003d sizeof(bm95c) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95d, .buf_len \u003d sizeof(bm95d) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95e, .buf_len \u003d sizeof(bm95e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95f, .buf_len \u003d sizeof(bm95f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95f, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95g, .buf_len \u003d sizeof(bm95g) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm95f, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq96[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 96 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96a, .buf_len \u003d sizeof(bm96a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96b, .buf_len \u003d sizeof(bm96b) },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96c, .buf_len \u003d sizeof(bm96c) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96d, .buf_len \u003d sizeof(bm96d) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96e, .buf_len \u003d sizeof(bm96e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96f, .buf_len \u003d sizeof(bm96f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96g, .buf_len \u003d sizeof(bm96g) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96h, .buf_len \u003d sizeof(bm96h) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96i, .buf_len \u003d sizeof(bm96i) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96f, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96j, .buf_len \u003d sizeof(bm96j) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm96f, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq97[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 96 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97a, .buf_len \u003d sizeof(bm97a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 5 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97b, .buf_len \u003d sizeof(bm97b) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97c, .buf_len \u003d sizeof(bm97c) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97f, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97d, .buf_len \u003d sizeof(bm97d) },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97e, .buf_len \u003d sizeof(bm97e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97f, .buf_len \u003d sizeof(bm97f) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97g, .buf_len \u003d sizeof(bm97g) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n- { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm97e, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq98[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98a, .buf_len \u003d sizeof(bm98a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98b, .buf_len \u003d sizeof(bm98b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98c, .buf_len \u003d sizeof(bm98c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98d, .buf_len \u003d sizeof(bm98d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98e, .buf_len \u003d sizeof(bm98e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98f, .buf_len \u003d sizeof(bm98f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98e, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98g, .buf_len \u003d sizeof(bm98g) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98e, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-\n-}, seq99[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 97 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99a, .buf_len \u003d sizeof(bm99a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99b, .buf_len \u003d sizeof(bm99b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99c, .buf_len \u003d sizeof(bm99c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99d, .buf_len \u003d sizeof(bm99d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99e, .buf_len \u003d sizeof(bm99e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99f, .buf_len \u003d sizeof(bm99f) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99g, .buf_len \u003d sizeof(bm99g) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99h, .buf_len \u003d sizeof(bm99h) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99i, .buf_len \u003d sizeof(bm99i) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99a, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm99j, .buf_len \u003d sizeof(bm99j) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm98e, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-\n-}, seq100[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100a, .buf_len \u003d sizeof(bm100a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100b, .buf_len \u003d sizeof(bm100b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100c, .buf_len \u003d sizeof(bm100c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100d, .buf_len \u003d sizeof(bm100d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100e, .buf_len \u003d sizeof(bm100e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm100f, .buf_len \u003d sizeof(bm100f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-\n-}, seq101[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101a, .buf_len \u003d sizeof(bm101a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101b, .buf_len \u003d sizeof(bm101b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101c, .buf_len \u003d sizeof(bm101c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101d, .buf_len \u003d sizeof(bm101d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101e, .buf_len \u003d sizeof(bm101e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101f, .buf_len \u003d sizeof(bm101f) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101g, .buf_len \u003d sizeof(bm101g) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101h, .buf_len \u003d sizeof(bm101h) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101i, .buf_len \u003d sizeof(bm101i) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101j, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 1 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_INT, .item \u003d { .u.i64 \u003d -6 } },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101j, .buf_len \u003d sizeof(bm101j) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm101j, .buf_len \u003d 0 },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq102[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102a, .buf_len \u003d sizeof(bm102a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102b, .buf_len \u003d sizeof(bm102b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102c, .buf_len \u003d sizeof(bm102c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102d, .buf_len \u003d sizeof(bm102d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102e, .buf_len \u003d sizeof(bm102e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm102f, .buf_len \u003d sizeof(bm102f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq103[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103a, .buf_len \u003d sizeof(bm103a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103b, .buf_len \u003d sizeof(bm103b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103c, .buf_len \u003d sizeof(bm103c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103d, .buf_len \u003d sizeof(bm103d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103e, .buf_len \u003d sizeof(bm103e) },\n-\t\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t\t\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t\t\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103f, .buf_len \u003d sizeof(bm103f) },\n-\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103g, .buf_len \u003d sizeof(bm103g) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103h, .buf_len \u003d sizeof(bm103h) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm103i, .buf_len \u003d sizeof(bm103i) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-\n-}, seq104[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 98 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104a, .buf_len \u003d sizeof(bm104a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104b, .buf_len \u003d sizeof(bm104b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104c, .buf_len \u003d sizeof(bm104c) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104d, .buf_len \u003d sizeof(bm104d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104e, .buf_len \u003d sizeof(bm104e) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104f, .buf_len \u003d sizeof(bm104f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104g, .buf_len \u003d sizeof(bm104g) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm104h, .buf_len \u003d sizeof(bm104h) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq105[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 98 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105a, .buf_len \u003d sizeof(bm105a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_OBJECT_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105b, .buf_len \u003d sizeof(bm105b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105c, .buf_len \u003d sizeof(bm105c) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105d, .buf_len \u003d sizeof(bm105d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105e, .buf_len \u003d sizeof(bm105e) },\n-\t { .reason \u003d LECPCB_OBJECT_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105f, .buf_len \u003d sizeof(bm105f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105g, .buf_len \u003d sizeof(bm105g) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t\t{ .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105h, .buf_len \u003d sizeof(bm105h) },\n-\t { .reason \u003d LECPCB_OBJECT_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105i, .buf_len \u003d sizeof(bm105i) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105j, .buf_len \u003d sizeof(bm105j) },\n-\t { .reason \u003d LECPCB_OBJECT_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm105k, .buf_len \u003d sizeof(bm105k) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq106[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 98 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106a, .buf_len \u003d sizeof(bm106a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106b, .buf_len \u003d sizeof(bm106b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106c, .buf_len \u003d sizeof(bm106c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106d, .buf_len \u003d sizeof(bm106d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106e, .buf_len \u003d sizeof(bm106e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106f, .buf_len \u003d sizeof(bm106f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106g, .buf_len \u003d sizeof(bm106g) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm106h, .buf_len \u003d sizeof(bm106h) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq107[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 17 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107a, .buf_len \u003d sizeof(bm107a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107b, .buf_len \u003d sizeof(bm107b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107c, .buf_len \u003d sizeof(bm107c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107d, .buf_len \u003d sizeof(bm107d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107e, .buf_len \u003d sizeof(bm107e) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107f, .buf_len \u003d sizeof(bm107f) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm107g, .buf_len \u003d sizeof(bm107g) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-}, seq108[] \u003d {\n-\t{ .reason \u003d LECPCB_CONSTRUCTED },\n-\t{ .reason \u003d LECPCB_TAG_START, .item \u003d { .u.u64 \u003d 18 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108a, .buf_len \u003d sizeof(bm108a) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 7 } },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108b, .buf_len \u003d sizeof(bm108b) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108c, .buf_len \u003d sizeof(bm108c) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108d, .buf_len \u003d sizeof(bm108d) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_ARRAY_START, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108e, .buf_len \u003d sizeof(bm108e) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_OBJECT_START, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108f, .buf_len \u003d sizeof(bm108f) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108g, .buf_len \u003d sizeof(bm108g) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t { .reason \u003d LECPCB_VAL_NUM_UINT, .item \u003d { .u.u64 \u003d 4 } },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108h, .buf_len \u003d sizeof(bm108h) },\n-\t { .reason \u003d LECPCB_OBJECT_END },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108i, .buf_len \u003d sizeof(bm108i) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_START, },\n-\t { .reason \u003d LECPCB_VAL_BLOB_END, .buf \u003d bm108j, .buf_len \u003d sizeof(bm108j) },\n-\t { .reason \u003d LECPCB_ARRAY_ITEM_END, },\n-\t { .reason \u003d LECPCB_ARRAY_END, },\n-\t{ .reason \u003d LECPCB_TAG_END, },\n-\t{ .reason \u003d LECPCB_DESTRUCTED },\n-};\n-\n-\n-struct cbort {\n-\tconst uint8_t\t\t*b;\n-\tsize_t\t\t\tblen;\n-\tconst struct seq\t*seq;\n-\tsize_t\t\t\tseq_size;\n-};\n-\n-static const struct cbort cbor_tests[] \u003d {\n-\t{ .b \u003d test1, .blen \u003d sizeof(test1),\n-\t\t\t.seq \u003d seq1, .seq_size \u003d LWS_ARRAY_SIZE(seq1) },\n-\t{ .b \u003d test2, .blen \u003d sizeof(test2),\n-\t\t\t.seq \u003d seq2, .seq_size \u003d LWS_ARRAY_SIZE(seq2) },\n-\t{ .b \u003d test3, .blen \u003d sizeof(test3),\n-\t\t\t.seq \u003d seq3, .seq_size \u003d LWS_ARRAY_SIZE(seq3) },\n-\t{ .b \u003d test4, .blen \u003d sizeof(test4),\n-\t\t\t.seq \u003d seq4, .seq_size \u003d LWS_ARRAY_SIZE(seq4) },\n-\t{ .b \u003d test5, .blen \u003d sizeof(test5),\n-\t\t\t.seq \u003d seq5, .seq_size \u003d LWS_ARRAY_SIZE(seq5) },\n-\t{ .b \u003d test6, .blen \u003d sizeof(test6),\n-\t\t\t.seq \u003d seq6, .seq_size \u003d LWS_ARRAY_SIZE(seq6) },\n-\t{ .b \u003d test7, .blen \u003d sizeof(test7),\n-\t\t\t.seq \u003d seq7, .seq_size \u003d LWS_ARRAY_SIZE(seq7) },\n-\t{ .b \u003d test8, .blen \u003d sizeof(test8),\n-\t\t\t.seq \u003d seq8, .seq_size \u003d LWS_ARRAY_SIZE(seq8) },\n-\t{ .b \u003d test9, .blen \u003d sizeof(test9),\n-\t\t\t.seq \u003d seq9, .seq_size \u003d LWS_ARRAY_SIZE(seq9) },\n-\t{ .b \u003d test10, .blen \u003d sizeof(test10),\n-\t\t\t.seq \u003d seq10, .seq_size \u003d LWS_ARRAY_SIZE(seq10) },\n-\t{ .b \u003d test11, .blen \u003d sizeof(test11),\n-\t\t\t.seq \u003d seq11, .seq_size \u003d LWS_ARRAY_SIZE(seq11) },\n-\t{ .b \u003d test12, .blen \u003d sizeof(test12),\n-\t\t\t.seq \u003d seq12, .seq_size \u003d LWS_ARRAY_SIZE(seq12) },\n-\t{ .b \u003d test13, .blen \u003d sizeof(test13),\n-\t\t\t.seq \u003d seq13, .seq_size \u003d LWS_ARRAY_SIZE(seq13) },\n-\t{ .b \u003d test14, .blen \u003d sizeof(test14),\n-\t\t\t.seq \u003d seq14, .seq_size \u003d LWS_ARRAY_SIZE(seq14) },\n-\t{ .b \u003d test15, .blen \u003d sizeof(test15),\n-\t\t\t.seq \u003d seq15, .seq_size \u003d LWS_ARRAY_SIZE(seq15) },\n-\t{ .b \u003d test16, .blen \u003d sizeof(test16),\n-\t\t\t.seq \u003d seq16, .seq_size \u003d LWS_ARRAY_SIZE(seq16) },\n-\t{ .b \u003d test17, .blen \u003d sizeof(test17),\n-\t\t\t.seq \u003d seq17, .seq_size \u003d LWS_ARRAY_SIZE(seq17) },\n-\t{ .b \u003d test18, .blen \u003d sizeof(test18),\n-\t\t\t.seq \u003d seq18, .seq_size \u003d LWS_ARRAY_SIZE(seq18) },\n-\t{ .b \u003d test19, .blen \u003d sizeof(test19),\n-\t\t\t.seq \u003d seq19, .seq_size \u003d LWS_ARRAY_SIZE(seq19) },\n-\t{ .b \u003d test20, .blen \u003d sizeof(test20),\n-\t\t\t.seq \u003d seq20, .seq_size \u003d LWS_ARRAY_SIZE(seq20) },\n-\t{ .b \u003d test21, .blen \u003d sizeof(test21),\n-\t\t\t.seq \u003d seq21, .seq_size \u003d LWS_ARRAY_SIZE(seq21) },\n-\t{ .b \u003d test22, .blen \u003d sizeof(test22),\n-\t\t\t.seq \u003d seq22, .seq_size \u003d LWS_ARRAY_SIZE(seq22) },\n-\t{ .b \u003d test23, .blen \u003d sizeof(test23),\n-\t\t\t.seq \u003d seq23, .seq_size \u003d LWS_ARRAY_SIZE(seq23) },\n-\t{ .b \u003d test24, .blen \u003d sizeof(test24),\n-\t\t\t.seq \u003d seq24, .seq_size \u003d LWS_ARRAY_SIZE(seq24) },\n-\t{ .b \u003d test25, .blen \u003d sizeof(test25),\n-\t\t\t.seq \u003d seq25, .seq_size \u003d LWS_ARRAY_SIZE(seq25) },\n-\t{ .b \u003d test26, .blen \u003d sizeof(test26),\n-\t\t\t.seq \u003d seq26, .seq_size \u003d LWS_ARRAY_SIZE(seq26) },\n-\t{ .b \u003d test27, .blen \u003d sizeof(test27),\n-\t\t\t.seq \u003d seq27, .seq_size \u003d LWS_ARRAY_SIZE(seq27) },\n-\t{ .b \u003d test28, .blen \u003d sizeof(test28),\n-\t\t\t.seq \u003d seq28, .seq_size \u003d LWS_ARRAY_SIZE(seq28) },\n-\t{ .b \u003d test29, .blen \u003d sizeof(test29),\n-\t\t\t.seq \u003d seq29, .seq_size \u003d LWS_ARRAY_SIZE(seq29) },\n-\t{ .b \u003d test30, .blen \u003d sizeof(test30),\n-\t\t\t.seq \u003d seq30, .seq_size \u003d LWS_ARRAY_SIZE(seq30) },\n-\t{ .b \u003d test31, .blen \u003d sizeof(test31),\n-\t\t\t.seq \u003d seq31, .seq_size \u003d LWS_ARRAY_SIZE(seq31) },\n-\t{ .b \u003d test32, .blen \u003d sizeof(test32),\n-\t\t\t.seq \u003d seq32, .seq_size \u003d LWS_ARRAY_SIZE(seq32) },\n-\t{ .b \u003d test33, .blen \u003d sizeof(test33),\n-\t\t\t.seq \u003d seq33, .seq_size \u003d LWS_ARRAY_SIZE(seq33) },\n-\t{ .b \u003d test34, .blen \u003d sizeof(test34),\n-\t\t\t.seq \u003d seq34, .seq_size \u003d LWS_ARRAY_SIZE(seq34) },\n-\t{ .b \u003d test35, .blen \u003d sizeof(test35),\n-\t\t\t.seq \u003d seq35, .seq_size \u003d LWS_ARRAY_SIZE(seq35) },\n-\t{ .b \u003d test36, .blen \u003d sizeof(test36),\n-\t\t\t.seq \u003d seq36, .seq_size \u003d LWS_ARRAY_SIZE(seq36) },\n-\t{ .b \u003d test37, .blen \u003d sizeof(test37),\n-\t\t\t.seq \u003d seq37, .seq_size \u003d LWS_ARRAY_SIZE(seq37) },\n-\t{ .b \u003d test38, .blen \u003d sizeof(test38),\n-\t\t\t.seq \u003d seq38, .seq_size \u003d LWS_ARRAY_SIZE(seq38) },\n-\t{ .b \u003d test39, .blen \u003d sizeof(test39),\n-\t\t\t.seq \u003d seq39, .seq_size \u003d LWS_ARRAY_SIZE(seq39) },\n-\t{ .b \u003d test40, .blen \u003d sizeof(test40),\n-\t\t\t.seq \u003d seq40, .seq_size \u003d LWS_ARRAY_SIZE(seq40) },\n-\t{ .b \u003d test41, .blen \u003d sizeof(test41),\n-\t\t\t.seq \u003d seq41, .seq_size \u003d LWS_ARRAY_SIZE(seq41) },\n-\t{ .b \u003d test42, .blen \u003d sizeof(test42),\n-\t\t\t.seq \u003d seq42, .seq_size \u003d LWS_ARRAY_SIZE(seq42) },\n-\t{ .b \u003d test43, .blen \u003d sizeof(test43),\n-\t\t\t.seq \u003d seq43, .seq_size \u003d LWS_ARRAY_SIZE(seq43) },\n-\t{ .b \u003d test44, .blen \u003d sizeof(test44),\n-\t\t\t.seq \u003d seq44, .seq_size \u003d LWS_ARRAY_SIZE(seq44) },\n-\t{ .b \u003d test45, .blen \u003d sizeof(test45),\n-\t\t\t.seq \u003d seq45, .seq_size \u003d LWS_ARRAY_SIZE(seq45) },\n-\t{ .b \u003d test46, .blen \u003d sizeof(test46),\n-\t\t\t.seq \u003d seq46, .seq_size \u003d LWS_ARRAY_SIZE(seq46) },\n-\t{ .b \u003d test47, .blen \u003d sizeof(test47),\n-\t\t\t.seq \u003d seq47, .seq_size \u003d LWS_ARRAY_SIZE(seq47) },\n-\t{ .b \u003d test48, .blen \u003d sizeof(test48),\n-\t\t\t.seq \u003d seq48, .seq_size \u003d LWS_ARRAY_SIZE(seq48) },\n-\t{ .b \u003d test49, .blen \u003d sizeof(test49),\n-\t\t\t.seq \u003d seq49, .seq_size \u003d LWS_ARRAY_SIZE(seq49) },\n-\t{ .b \u003d test50, .blen \u003d sizeof(test50),\n-\t\t\t.seq \u003d seq50, .seq_size \u003d LWS_ARRAY_SIZE(seq50) },\n-\t{ .b \u003d test51, .blen \u003d sizeof(test51),\n-\t\t\t.seq \u003d seq51, .seq_size \u003d LWS_ARRAY_SIZE(seq51) },\n-\t{ .b \u003d test52, .blen \u003d sizeof(test52),\n-\t\t\t.seq \u003d seq52, .seq_size \u003d LWS_ARRAY_SIZE(seq52) },\n-\t{ .b \u003d test53, .blen \u003d sizeof(test53),\n-\t\t\t.seq \u003d seq53, .seq_size \u003d LWS_ARRAY_SIZE(seq53) },\n-\t{ .b \u003d test54, .blen \u003d sizeof(test54),\n-\t\t\t.seq \u003d seq54, .seq_size \u003d LWS_ARRAY_SIZE(seq54) },\n-\t{ .b \u003d test55, .blen \u003d sizeof(test55),\n-\t\t\t.seq \u003d seq55, .seq_size \u003d LWS_ARRAY_SIZE(seq55) },\n-\t{ .b \u003d test56, .blen \u003d sizeof(test56),\n-\t\t\t.seq \u003d seq56, .seq_size \u003d LWS_ARRAY_SIZE(seq56) },\n-\t{ .b \u003d test57, .blen \u003d sizeof(test57),\n-\t\t\t.seq \u003d seq57, .seq_size \u003d LWS_ARRAY_SIZE(seq57) },\n-\t{ .b \u003d test58, .blen \u003d sizeof(test58),\n-\t\t\t.seq \u003d seq58, .seq_size \u003d LWS_ARRAY_SIZE(seq58) },\n-\t{ .b \u003d test59, .blen \u003d sizeof(test59),\n-\t\t\t.seq \u003d seq59, .seq_size \u003d LWS_ARRAY_SIZE(seq59) },\n-\t{ .b \u003d test60, .blen \u003d sizeof(test60),\n-\t\t\t.seq \u003d seq60, .seq_size \u003d LWS_ARRAY_SIZE(seq60) },\n-\t{ .b \u003d test61, .blen \u003d sizeof(test61),\n-\t\t\t.seq \u003d seq61, .seq_size \u003d LWS_ARRAY_SIZE(seq61) },\n-\t{ .b \u003d test62, .blen \u003d sizeof(test62),\n-\t\t\t.seq \u003d seq62, .seq_size \u003d LWS_ARRAY_SIZE(seq62) },\n-\t{ .b \u003d test63, .blen \u003d sizeof(test63),\n-\t\t\t.seq \u003d seq63, .seq_size \u003d LWS_ARRAY_SIZE(seq63) },\n-\t{ .b \u003d test64, .blen \u003d sizeof(test64),\n-\t\t\t.seq \u003d seq64, .seq_size \u003d LWS_ARRAY_SIZE(seq64) },\n-\t{ .b \u003d test65, .blen \u003d sizeof(test65),\n-\t\t\t.seq \u003d seq65, .seq_size \u003d LWS_ARRAY_SIZE(seq65) },\n-\t{ .b \u003d test66, .blen \u003d sizeof(test66),\n-\t\t\t.seq \u003d seq66, .seq_size \u003d LWS_ARRAY_SIZE(seq66) },\n-\t{ .b \u003d test67, .blen \u003d sizeof(test67),\n-\t\t\t.seq \u003d seq67, .seq_size \u003d LWS_ARRAY_SIZE(seq67) },\n-\t{ .b \u003d test68, .blen \u003d sizeof(test68),\n-\t\t\t.seq \u003d seq68, .seq_size \u003d LWS_ARRAY_SIZE(seq68) },\n-\t{ .b \u003d test69, .blen \u003d sizeof(test69),\n-\t\t\t.seq \u003d seq69, .seq_size \u003d LWS_ARRAY_SIZE(seq69) },\n-\t{ .b \u003d test70, .blen \u003d sizeof(test70),\n-\t\t\t.seq \u003d seq70, .seq_size \u003d LWS_ARRAY_SIZE(seq70) },\n-\t{ .b \u003d test71, .blen \u003d sizeof(test71),\n-\t\t\t.seq \u003d seq71, .seq_size \u003d LWS_ARRAY_SIZE(seq71) },\n-\t{ .b \u003d test72, .blen \u003d sizeof(test72),\n-\t\t\t.seq \u003d seq72, .seq_size \u003d LWS_ARRAY_SIZE(seq72) },\n-\t{ .b \u003d test73, .blen \u003d sizeof(test73),\n-\t\t\t.seq \u003d seq73, .seq_size \u003d LWS_ARRAY_SIZE(seq73) },\n-\t{ .b \u003d test74, .blen \u003d sizeof(test74),\n-\t\t\t.seq \u003d seq74, .seq_size \u003d LWS_ARRAY_SIZE(seq74) },\n-\t{ .b \u003d test75, .blen \u003d sizeof(test75),\n-\t\t\t.seq \u003d seq75, .seq_size \u003d LWS_ARRAY_SIZE(seq75) },\n-\t{ .b \u003d test76, .blen \u003d sizeof(test76),\n-\t\t\t.seq \u003d seq76, .seq_size \u003d LWS_ARRAY_SIZE(seq76) },\n-\t{ .b \u003d test77, .blen \u003d sizeof(test77),\n-\t\t\t.seq \u003d seq77, .seq_size \u003d LWS_ARRAY_SIZE(seq77) },\n-\t{ .b \u003d test78, .blen \u003d sizeof(test78),\n-\t\t\t.seq \u003d seq78, .seq_size \u003d LWS_ARRAY_SIZE(seq78) },\n-\t{ .b \u003d test79, .blen \u003d sizeof(test79),\n-\t\t\t.seq \u003d seq79, .seq_size \u003d LWS_ARRAY_SIZE(seq79) },\n-\t{ .b \u003d test80, .blen \u003d sizeof(test80),\n-\t\t\t.seq \u003d seq80, .seq_size \u003d LWS_ARRAY_SIZE(seq80) },\n-\t{ .b \u003d test81, .blen \u003d sizeof(test81),\n-\t\t\t.seq \u003d seq81, .seq_size \u003d LWS_ARRAY_SIZE(seq81) },\n-\t{ .b \u003d test82, .blen \u003d sizeof(test82),\n-\t\t\t.seq \u003d seq82, .seq_size \u003d LWS_ARRAY_SIZE(seq82) },\n-\n-\t/* COSE-dervied test vectors */\n-\n-\t{ .b \u003d test83, .blen \u003d sizeof(test83),\n-\t\t\t.seq \u003d seq83, .seq_size \u003d LWS_ARRAY_SIZE(seq83) },\n-\t{ .b \u003d test84, .blen \u003d sizeof(test84),\n-\t\t\t.seq \u003d seq84, .seq_size \u003d LWS_ARRAY_SIZE(seq84) },\n-\t{ .b \u003d test85, .blen \u003d sizeof(test85),\n-\t\t\t.seq \u003d seq85, .seq_size \u003d LWS_ARRAY_SIZE(seq85) },\n-\t{ .b \u003d test86, .blen \u003d sizeof(test86),\n-\t\t\t.seq \u003d seq86, .seq_size \u003d LWS_ARRAY_SIZE(seq86) },\n-\t{ .b \u003d test87, .blen \u003d sizeof(test87),\n-\t\t\t.seq \u003d seq87, .seq_size \u003d LWS_ARRAY_SIZE(seq87) },\n-\t{ .b \u003d test88, .blen \u003d sizeof(test88),\n-\t\t\t.seq \u003d seq88, .seq_size \u003d LWS_ARRAY_SIZE(seq88) },\n-\t{ .b \u003d test89, .blen \u003d sizeof(test89),\n-\t\t\t.seq \u003d seq89, .seq_size \u003d LWS_ARRAY_SIZE(seq89) },\n-\t{ .b \u003d test90, .blen \u003d sizeof(test90),\n-\t\t\t.seq \u003d seq90, .seq_size \u003d LWS_ARRAY_SIZE(seq90) },\n-\t{ .b \u003d test91, .blen \u003d sizeof(test91),\n-\t\t\t.seq \u003d seq91, .seq_size \u003d LWS_ARRAY_SIZE(seq91) },\n-\t{ .b \u003d test92, .blen \u003d sizeof(test92),\n-\t\t\t.seq \u003d seq92, .seq_size \u003d LWS_ARRAY_SIZE(seq92) },\n-\t{ .b \u003d test93, .blen \u003d sizeof(test93),\n-\t\t\t.seq \u003d seq93, .seq_size \u003d LWS_ARRAY_SIZE(seq93) },\n-\t{ .b \u003d test94, .blen \u003d sizeof(test94),\n-\t\t\t.seq \u003d seq94, .seq_size \u003d LWS_ARRAY_SIZE(seq94) },\n-\t{ .b \u003d test95, .blen \u003d sizeof(test95),\n-\t\t\t.seq \u003d seq95, .seq_size \u003d LWS_ARRAY_SIZE(seq95) },\n-\t{ .b \u003d test96, .blen \u003d sizeof(test96),\n-\t\t\t.seq \u003d seq96, .seq_size \u003d LWS_ARRAY_SIZE(seq96) },\n-\t{ .b \u003d test97, .blen \u003d sizeof(test97),\n-\t\t\t.seq \u003d seq97, .seq_size \u003d LWS_ARRAY_SIZE(seq97) },\n-\t{ .b \u003d test98, .blen \u003d sizeof(test98),\n-\t\t\t.seq \u003d seq98, .seq_size \u003d LWS_ARRAY_SIZE(seq98) },\n-\t{ .b \u003d test99, .blen \u003d sizeof(test99),\n-\t\t\t.seq \u003d seq99, .seq_size \u003d LWS_ARRAY_SIZE(seq99) },\n-\t{ .b \u003d test100, .blen \u003d sizeof(test100),\n-\t\t\t.seq \u003d seq100, .seq_size \u003d LWS_ARRAY_SIZE(seq100) },\n-\t{ .b \u003d test101, .blen \u003d sizeof(test101),\n-\t\t\t.seq \u003d seq101, .seq_size \u003d LWS_ARRAY_SIZE(seq101) },\n-\t{ .b \u003d test102, .blen \u003d sizeof(test102),\n-\t\t\t.seq \u003d seq102, .seq_size \u003d LWS_ARRAY_SIZE(seq102) },\n-\t{ .b \u003d test103, .blen \u003d sizeof(test103),\n-\t\t\t.seq \u003d seq103, .seq_size \u003d LWS_ARRAY_SIZE(seq103) },\n-\t{ .b \u003d test104, .blen \u003d sizeof(test104),\n-\t\t\t.seq \u003d seq104, .seq_size \u003d LWS_ARRAY_SIZE(seq104) },\n-\t{ .b \u003d test105, .blen \u003d sizeof(test105),\n-\t\t\t.seq \u003d seq105, .seq_size \u003d LWS_ARRAY_SIZE(seq105) },\n-\t{ .b \u003d test106, .blen \u003d sizeof(test106),\n-\t\t\t.seq \u003d seq106, .seq_size \u003d LWS_ARRAY_SIZE(seq106) },\n-\t{ .b \u003d test107, .blen \u003d sizeof(test107),\n-\t\t\t.seq \u003d seq107, .seq_size \u003d LWS_ARRAY_SIZE(seq107) },\n-\t{ .b \u003d test108, .blen \u003d sizeof(test108),\n-\t\t\t.seq \u003d seq108, .seq_size \u003d LWS_ARRAY_SIZE(seq108) },\n-};\n-\n-static const uint8_t\n-\tw1[] \u003d { 0x65, 0x68, 0x65, 0x6C,\n-\t\t 0x6C, 0x6F },\n-\tw2[] \u003d { 0xc2 },\n-\tw3[] \u003d { 0x82, 0x63, 0x61, 0x62,\n-\t\t 0x63, 0x63, 0x64, 0x65,\n-\t\t 0x66 },\n-\tw4[] \u003d { 0xA2, 0x63, 0x67, 0x68,\n-\t\t 0x69, 0x01, 0x63, 0x6A,\n-\t\t 0x6B, 0x6C, 0x02 },\n-\tw5[] \u003d { 0xD8, 0x7B, 0xA2, 0x63,\n-\t\t 0x67, 0x68, 0x69, 0x01,\n-\t\t 0x63, 0x6A, 0x6B, 0x6C,\n-\t\t 0x02 },\n-\tw6[] \u003d { 0xCC, 0xA2, 0x63, 0x67,\n-\t\t 0x68, 0x69, 0x01, 0x63,\n-\t\t 0x6A, 0x6B, 0x6C, 0x82,\n-\t\t 0x61, 0x61, 0x61, 0x62 },\n-\tw7[] \u003d { 0x20, },\n-\tw8[] \u003d { 0x0c, },\n-\tw13[] \u003d { 0x18, 0x34 },\n-\tw14[] \u003d { 0x19, 0x12, 0x34 },\n-\tw15[] \u003d { 0x1a, 0x12, 0x34, 0x56, 0x78 },\n-\tw16[] \u003d { 0x1b, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 },\n-\tw17[] \u003d { 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F },\n-\tw18[] \u003d { 0x25 },\n-\tw19[] \u003d {\n-\t\t\t0xd8, 0x7b, 0x58, 0xb7,\n-\t\t\t0xd8, 0x62, 0x84, 0x43, 0xa1,\n-\t\t\t0x03, 0x00, 0xa1, 0x07, 0x83,\n-\t\t\t0x43, 0xa1, 0x01, 0x27, 0xa1,\n-\t\t\t0x04, 0x42, 0x31, 0x31, 0x58,\n-\t\t\t0x40, 0xb7, 0xca, 0xcb, 0xa2,\n-\t\t\t0x85, 0xc4, 0xcd, 0x3e, 0xd2,\n-\t\t\t0xf0, 0x14, 0x6f, 0x41, 0x98,\n-\t\t\t0x86, 0x14, 0x4c, 0xa6, 0x38,\n-\t\t\t0xd0, 0x87, 0xde, 0x12, 0x3d,\n-\t\t\t0x40, 0x01, 0x67, 0x30, 0x8a,\n-\t\t\t0xce, 0xab, 0xc4, 0xb5, 0xe5,\n-\t\t\t0xc6, 0xa4, 0x0c, 0x0d, 0xe0,\n-\t\t\t},\n-\tw19a[] \u003d {\n-\t\t\t0xb7, 0x11, 0x67, 0xa3, 0x91,\n-\t\t\t0x75, 0xea, 0x56, 0xc1, 0xfe,\n-\t\t\t0x96, 0xc8, 0x9e, 0x5e, 0x7d,\n-\t\t\t0x30, 0xda, 0xf2, 0x43, 0x8a,\n-\t\t\t0x45, 0x61, 0x59, 0xa2, 0x0a,\n-\t\t\t0x54, 0x54, 0x68, 0x69, 0x73,\n-\t\t\t0x20, 0x69, 0x73, 0x20, 0x74,\n-\t\t\t0x68, 0x65, 0x20, 0x63, 0x6f,\n-\t\t\t0x6e, 0x74, 0x65, 0x6e, 0x74,\n-\t\t\t0x2e, 0x81, 0x83, 0x43, 0xa1,\n-\t\t\t0x01, 0x27, 0xa1, 0x04, 0x42,\n-\t\t\t0x31, 0x31, 0x58, 0x40, 0x77,\n-\t\t\t0xf3, 0xea, 0xcd, 0x11,},\n-\tw19b[] \u003d {\n-\t\t\t0x85, 0x2c, 0x4b, 0xf9, 0xcb, 0x1d,\n-\t\t\t0x72, 0xfa, 0xbe, 0x6b, 0x26,\n-\t\t\t0xfb, 0xa1, 0xd7, 0x60, 0x92,\n-\t\t\t0xb2, 0xb5, 0xb7, 0xec, 0x83,\n-\t\t\t0xb8, 0x35, 0x57, 0x65, 0x22,\n-\t\t\t0x64, 0xe6, 0x96, 0x90, 0xdb,\n-\t\t\t0xc1, 0x17, 0x2d, 0xdc, 0x0b,\n-\t\t\t0xf8, 0x84, 0x11, 0xc0, 0xd2,\n-\t\t\t0x5a, 0x50, 0x7f, 0xdb, 0x24,\n-\t\t\t0x7a, 0x20, 0xc4, 0x0d, 0x5e,\n-\t\t\t0x24, 0x5f, 0xab, 0xd3, 0xfc,\n-\t\t\t0x9e, 0xc1, 0x06 },\n-\tw22[] \u003d { 0xD8, 0x7B, 0x19, 0x01, 0xC8 },\n-\tw24[] \u003d { 0xDB, 0x12, 0x34, 0x56, 0x78, 0x9A,\n-\t\t\t0xBC, 0xED, 0xF0, 0x19, 0x01, 0xC8},\n-\tw25[] \u003d { 0xF9, 0x3C, 0x00 },\n-\tw26[] \u003d { 0xF9, 0x3E, 0x00 },\n-\tw27[] \u003d { 0xFB, 0x3F, 0xF1, 0xF7, 0xCE, 0xD9, 0x16, 0x87, 0x2B },\n-\tw28[] \u003d { 0xA2, 0x61, 0x61, 0x01, 0x61, 0x62, 0x82, 0x02, 0x03 },\n-\tw29[] \u003d { 0x7F, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0xFF\n-}\n-;\n-\n-static const char * const tok[] \u003d {\n-\t\u0022something\u0022,\n-};\n-\n-struct priv {\n-\tconst struct cbort *cbt;\n-\tsize_t idx;\n-};\n-\n-static int pass;\n-\n-static signed char\n-test_cb(struct lecp_ctx *ctx, char reason)\n-{\n-\tstruct priv *priv \u003d (struct priv *)ctx-\u003euser;\n-\tsize_t i \u003d priv-\u003eidx++;\n-\n-#if defined(VERBOSE)\n-\t lwsl_notice(\u0022%s: %s, ctx-\u003epath %s\u005cn\u0022, __func__,\n-\t\t\t reason_names[(int)reason \u0026 0x1f], ctx-\u003epath);\n-#endif\n-\n-\t// if (ctx-\u003enpos)\n-\t//\tlwsl_hexdump_notice(ctx-\u003ebuf, ctx-\u003enpos);\n-\n-\tif (!priv-\u003ecbt-\u003eseq)\n-\t\treturn 0;\n-\n-\tif (i \u003e\u003d priv-\u003ecbt-\u003eseq_size) {\n-\t\tlwsl_warn(\u0022%s: unexpected parse states\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (priv-\u003ecbt-\u003eseq[i].reason !\u003d reason) {\n-\t\tlwsl_warn(\u0022%s: reason mismatch\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tif (priv-\u003ecbt-\u003eseq[i].buf \u0026\u0026\n-\t (priv-\u003ecbt-\u003eseq[i].buf_len !\u003d ctx-\u003enpos ||\n-\t memcmp(priv-\u003ecbt-\u003eseq[i].buf, ctx-\u003ebuf, ctx-\u003enpos))) {\n-\t\tlwsl_warn(\u0022%s: buf mismatch\u005cn\u0022, __func__);\n-\t\tlwsl_hexdump_notice(ctx-\u003ebuf, (size_t)ctx-\u003enpos);\n-\t\treturn 1;\n-\t}\n-\n-\tswitch (reason) {\n-\tcase LECPCB_VAL_SIMPLE:\n-\tcase LECPCB_VAL_NUM_UINT:\n-\tcase LECPCB_VAL_NUM_INT:\n-\t\tif (ctx-\u003eitem.u.u64 !\u003d priv-\u003ecbt-\u003eseq[i].item.u.u64) {\n-\t\t\tlwsl_warn(\u0022%s: number mismatch %llu %llu\u005cn\u0022, __func__,\n-\t\t\t\t(unsigned long long)ctx-\u003eitem.u.u64,\n-\t\t\t\t(unsigned long long)priv-\u003ecbt-\u003eseq[i].item.u.u64);\n-\t\t\treturn 1;\n-\t\t}\n-\t\tbreak;\n-\n-\tcase LECPCB_VAL_FLOAT16:\n-\t\tif (ctx-\u003eitem.u.hf !\u003d priv-\u003ecbt-\u003eseq[i].item.u.hf) {\n-\t\t\tlwsl_warn(\u0022%s: number mismatch %llu %llu\u005cn\u0022, __func__,\n-\t\t\t\t(unsigned long long)ctx-\u003eitem.u.hf,\n-\t\t\t\t(unsigned long long)priv-\u003ecbt-\u003eseq[i].item.u.hf);\n-\t\t\treturn 1;\n-\t\t}\n-\t\tbreak;\n-\tcase LECPCB_VAL_FLOAT32:\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t\tif (!isfinite(ctx-\u003eitem.u.f) \u0026\u0026\n-\t\t !isfinite(priv-\u003ecbt-\u003eseq[i].item.u.f))\n-\t\t\tbreak;\n-\t\tif (isnan(ctx-\u003eitem.u.f) \u0026\u0026\n-\t\t isnan(priv-\u003ecbt-\u003eseq[i].item.u.f))\n-\t\t\tbreak;\n-#endif\n-\t\tif (ctx-\u003eitem.u.f !\u003d priv-\u003ecbt-\u003eseq[i].item.u.f) {\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t\t\tlwsl_warn(\u0022%s: number mismatch %f %f\u005cn\u0022, __func__,\n-\t\t\t\tctx-\u003eitem.u.f,\n-\t\t\t\tpriv-\u003ecbt-\u003eseq[i].item.u.f);\n-#else\n-\t\t\tlwsl_warn(\u0022%s: f32 number mismatch %llu %llu\u005cn\u0022, __func__,\n-\t\t\t\t(unsigned long long)ctx-\u003eitem.u.f,\n-\t\t\t\t(unsigned long long)priv-\u003ecbt-\u003eseq[i].item.u.f);\n-#endif\n-\t\t\treturn 1;\n-\t\t}\n-\t\tbreak;\n-\tcase LECPCB_VAL_FLOAT64:\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t\tif (!isfinite(ctx-\u003eitem.u.d) \u0026\u0026\n-\t\t !isfinite(priv-\u003ecbt-\u003eseq[i].item.u.d))\n-\t\t\tbreak;\n-\t\tif (isnan(ctx-\u003eitem.u.d) \u0026\u0026\n-\t\t isnan(priv-\u003ecbt-\u003eseq[i].item.u.d))\n-\t\t\tbreak;\n-#endif\n-\t\tif (ctx-\u003eitem.u.d !\u003d priv-\u003ecbt-\u003eseq[i].item.u.d) {\n-#if defined(LWS_WITH_CBOR_FLOAT)\n-\t\t\tlwsl_warn(\u0022%s: f64 number mismatch %f %f\u005cn\u0022, __func__,\n-\t\t\t\tctx-\u003eitem.u.d,\n-\t\t\t\tpriv-\u003ecbt-\u003eseq[i].item.u.d);\n-#else\n-\t\t\tlwsl_warn(\u0022%s: number mismatch %llu %llu\u005cn\u0022, __func__,\n-\t\t\t\t(unsigned long long)ctx-\u003eitem.u.d,\n-\t\t\t\t(unsigned long long)priv-\u003ecbt-\u003eseq[i].item.u.d);\n-#endif\n-\t\t\treturn 1;\n-\t\t}\n-\t\tbreak;\n-\n-\tcase LECPCB_DESTRUCTED:\n-\t\tpass++;\n-\t\tbreak;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n, m, e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE,\n-\t\t\texpected \u003d (int)LWS_ARRAY_SIZE(cbor_tests) +\n-\t\t\t\t\t29 /* \u003c-- how many write tests */;\n-\tstruct lecp_ctx ctx;\n-\tconst char *p;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: LECP CBOR parser\u005cn\u0022);\n-\n-\tfor (m \u003d 0; m \u003c (int)LWS_ARRAY_SIZE(cbor_tests); m++) {\n-\n-\t\tstruct priv priv;\n-\n-\t\tpriv.cbt \u003d \u0026cbor_tests[m];\n-\t\tpriv.idx \u003d 0;\n-\n-\t\tlwsl_notice(\u0022%s: ++++++++++++++++ test %d\u005cn\u0022, __func__, m + 1);\n-\n-\t\tlecp_construct(\u0026ctx, test_cb, \u0026priv, tok, LWS_ARRAY_SIZE(tok));\n-\n-\t\tlwsl_hexdump_info(cbor_tests[m].b, cbor_tests[m].blen);\n-\n-#if 0\n-\t\t{\n-\t\t\tchar fn[128];\n-\t\t\tint fd;\n-\n-\t\t\tlws_snprintf(fn, sizeof(fn), \u0022/tmp/cbor-%d\u0022, m + 1);\n-\t\t\tfd \u003d open(fn, LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);\n-\t\t\tif (fd !\u003d -1) {\n-\t\t\t\twrite(fd, cbor_tests[m].b,\n-\t\t\t\t\t cbor_tests[m].blen);\n-\t\t\t\tclose(fd);\n-\t\t\t}\n-\t\t}\n-#endif\n-\n-\t\tn \u003d lecp_parse(\u0026ctx, cbor_tests[m].b,\n-\t\t\t\t cbor_tests[m].blen);\n-\n-\t\tlecp_destruct(\u0026ctx);\n-\n-\t\tif (n \u003c 0 \u0026\u0026 m + 1 !\u003d 46 /* expected to fail */) {\n-\t\t\tlwsl_err(\u0022%s: test %d: CBOR decode failed %d '%s'\u005cn\u0022,\n-\t\t\t\t\t__func__, m + 1, n,\n-\t\t\t\t\tlecp_error_to_string(n));\n-\t\t\te++;\n-\t\t}\n-\t}\n-\n-\t{\n-\t\tlws_lec_pctx_t ctx;\n-\t\tuint8_t buf[64];\n-\n-\t\tlws_lec_init(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022'hello'\u0022) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w1) || memcmp(w1, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u00222()\u0022) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w2) || memcmp(w2, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022['abc','def']\u0022) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w3) || memcmp(w3, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test4\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022{'ghi':1,'jkl':2}\u0022) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w4) || memcmp(w4, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test5\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022123({'ghi':1,'jkl':2})\u0022) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w5) || memcmp(w5, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test6\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u002212({'ghi':1,'jkl':['a', 'b']})\u0022) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w6) || memcmp(w6, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test7\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%d\u0022, -1) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w7) || memcmp(w7, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test8\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%ld\u0022, -1l) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w7) || memcmp(w7, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test9\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%lld\u0022, -1ll) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w7) || memcmp(w7, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test10\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%u\u0022, 12) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w8) || memcmp(w8, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test11\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%ld\u0022, 12l) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w8) || memcmp(w8, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test12\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%lld\u0022, 12ll) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w8) || memcmp(w8, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test13\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%u\u0022, 0x34u) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w13) || memcmp(w13, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test14\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%ld\u0022, 0x1234ul) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w14) || memcmp(w14, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test15\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%lld\u0022, 0x12345678ull) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w15) || memcmp(w15, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test16\u005cn\u0022, __func__);\n-\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%lld\u0022, 0x123456789abcdef0ull) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w16) || memcmp(w16, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test17\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%s\u0022, \u0022hello\u0022) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w17) || memcmp(w17, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test18\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022-6\u0022) !\u003d\n-\t\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w18) || memcmp(w18, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\t/*\n-\t\t * A big binary blob is going to get emitted in 3 output\n-\t\t * buffers, by calling it two more times while still handling\n-\t\t * the same format object, format objects before that which\n-\t\t * were completed are skipped on the subsequent calls\n-\t\t */\n-\n-\t\tlwsl_user(\u0022%s: test19\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022123(%.*b)\u0022, (int)sizeof(test106), test106) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_AGAIN ||\n-\t\t ctx.used !\u003d sizeof(w19) || memcmp(w19, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test20\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022123(%.*b)\u0022, (int)sizeof(test106), test106) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_AGAIN ||\n-\t\t ctx.used !\u003d sizeof(w19a) || memcmp(w19a, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test21\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022123(%.*b)\u0022, (int)sizeof(test106), test106) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w19b) || memcmp(w19b, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test22\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%t(456)\u0022, 123) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w22) || memcmp(w22, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test23\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%lt(456)\u0022, 123ul) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w22) || memcmp(w22, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test24\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%llt(456)\u0022, 0x123456789abcedf0ull) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w24) || memcmp(w24, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test25\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%f\u0022, 1.0) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w25) || memcmp(w25, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test26\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%f\u0022, 1.5) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w26) || memcmp(w26, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\tlwsl_user(\u0022%s: test27\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022%f\u0022, 1.123) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w27) || memcmp(w27, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\n-\t\t{\n-\t\t\tint args[3] \u003d { 1, 2, 3 };\n-\n-\t\t\tlwsl_user(\u0022%s: test28\u005cn\u0022, __func__);\n-\t\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\t\tif (lws_lec_printf(\u0026ctx, \u0022{'a':%d,'b':[%d,%d]}\u0022,\n-\t\t\t\t\t\targs[0], args[1], args[2]) !\u003d\n-\t\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t\t ctx.used !\u003d sizeof(w28) ||\n-\t\t\t memcmp(w28, buf, ctx.used)) {\n-\t\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\t\te++;\n-\t\t\t} else\n-\t\t\t\tpass++;\n-\t\t}\n-\n-\t\tlwsl_user(\u0022%s: test29\u005cn\u0022, __func__);\n-\t\tlws_lec_setbuf(\u0026ctx, buf, sizeof(buf));\n-\n-\t\tif (lws_lec_printf(\u0026ctx, \u0022\u003ct'hello'\u003e\u0022) !\u003d\n-\t\t\t\tLWS_LECPCTX_RET_FINISHED ||\n-\t\t ctx.used !\u003d sizeof(w29) || memcmp(w29, buf, ctx.used)) {\n-\t\t\tlwsl_hexdump_notice(ctx.start, ctx.used);\n-\t\t\te++;\n-\t\t} else\n-\t\t\tpass++;\n-\t}\n-\n-\tif (e)\n-\t\tgoto bail;\n-\n-\tif (pass !\u003d expected)\n-\t\tgoto bail;\n-\n-\tlwsl_user(\u0022Completed: PASS %d / %d\u005cn\u0022, pass, expected);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_user(\u0022Completed: FAIL, passed %d / %d (e %d)\u005cn\u0022, pass,\n-\t\t\t\texpected, e);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lejp/CMakeLists.txt b/minimal-examples/api-tests/api-test-lejp/CMakeLists.txt\ndeleted file mode 100644\nindex ccdb9b5..0000000\n--- a/minimal-examples/api-tests/api-test-lejp/CMakeLists.txt\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-project(lws-api-test-lejp C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_LEJP 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${PROJECT_NAME} main.c)\n-\tadd_test(NAME api-test-lejp COMMAND lws-api-test-lejp)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lejp/main.c b/minimal-examples/api-tests/api-test-lejp/main.c\ndeleted file mode 100644\nindex 352181b..0000000\n--- a/minimal-examples/api-tests/api-test-lejp/main.c\n+++ /dev/null\n@@ -1,219 +0,0 @@\n-/*\n- * lws-api-test-lejp\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * sanity tests for lejp\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-/*\n- * in this example, the JSON is for one \u0022builder\u0022 object, which may specify\n- * a child list \u0022targets\u0022 of zero or more \u0022target\u0022 objects.\n- */\n-\n-static const char * const json_tests[] \u003d {\n-\t\u0022{\u0022 /* test 1 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u0022\n-\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:true\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:false\u0022\n-\t\t\t\u0022}\u0022\n-\t\t\u0022]\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 2 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target3\u005c\u0022\u0022\n-\t\t\t\u0022}\u0022\n-\t\t\u0022]\u0022\n-\t\u0022}\u0022, \u0022{\u0022 /* test 3 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u0022\n-\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022unrecognized\u005c\u0022:\u005c\u0022xyz\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022child\u005c\u0022: {\u0022\n-\t\t\t\t\t\u0022\u005c\u0022somename\u005c\u0022: \u005c\u0022abc\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022junk\u005c\u0022: { \u005c\u0022x\u005c\u0022: \u005c\u0022y\u005c\u0022 }\u0022\n-\t\t\t\t\u0022}\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022\u0022\n-\t\t\t\u0022}\u0022\n-\t\t\u0022]\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 4 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 5 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 6 ... check huge strings into smaller fixed char array */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022\u0022\n-\t\t\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A\u0022\n-\t\t\u0022zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/\u0022\n-\t\t\u0022CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5\u0022\n-\t\t\u00223FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV\u0022\n-\t\t\u00228sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n-\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG\u0022\n-\t\t\u0022JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG\u0022\n-\t\t\u0022LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW\u0022\n-\t\t\u0022v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9\u0022\n-\t\t\u0022eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY\u0022\n-\t\t\u0022VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/\u0022\n-\t\t\u0022uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu\u0022\n-\t\t\u0022yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx\u0022\n-\t\t\u0022+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 7 ... check huge strings into char * */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022\u0022\n-\t\t\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A\u0022\n-\t\t\u0022zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/\u0022\n-\t\t\u0022CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5\u0022\n-\t\t\u00223FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV\u0022\n-\t\t\u00228sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n-\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG\u0022\n-\t\t\u0022JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG\u0022\n-\t\t\u0022LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW\u0022\n-\t\t\u0022v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9\u0022\n-\t\t\u0022eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY\u0022\n-\t\t\u0022VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/\u0022\n-\t\t\u0022uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu\u0022\n-\t\t\u0022yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx\u0022\n-\t\t\u0022+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022}]}\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 8 the \u0022other\u0022 schema */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-logs\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022task_uuid\u005c\u0022:\u005c\u002297fc90052506af8b3eb43b87aaa6fb76feab32bc128ede479a8a6b961e801f06\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022timestamp\u005c\u0022: 170366786103,\u005c\u0022channel\u005c\u0022:3, \u005c\u0022len\u005c\u0022:20, \u0022\n-\t\t\u0022\u005c\u0022log\u005c\u0022: \u005c\u0022PnNhaWI+IE5TU1RBVEVfSU5JVAo\u003d\u005c\u0022}\u005cx0a\u0022\n-\t\t\u0022ntu-xenial-amd64\u005c\u0022},{\u005c\u0022name\u005c\u0022:\u005c\u0022linux-ubuntu-bionic-amd64\u005c\u0022},{\u005c\u0022name\u005c\u0022:\u005c\u0022linux-fedora-32-x86_64\u005c\u0022}]}\u005c\u0022,\u0022,\n-\n-\t\u0022{\u0022 /* test 9, empty object */\n-\t\t\u0022\u005c\u0022a\u005c\u0022:123,\u005c\u0022b\u005c\u0022:{}\u0022\n-\t\u0022}\u0022,\n-\n-\t\u0022{\u0022 /* SHOULD_FAIL: test 10, missing open */\n-\t\t\u0022\u005c\u0022a\u005c\u0022:123,\u005c\u0022b\u005c\u0022:}\u0022\n-\t\u0022}\u0022\n-};\n-\n-static const char * const tok[] \u003d {\n-\t\u0022something\u0022,\n-};\n-\n-static signed char\n-test_cb(struct lejp_ctx *ctx, char reason)\n-{\n-\tlwsl_info(\u0022%s: ctx-\u003epath %s, buf %s\u005cn\u0022, __func__, ctx-\u003epath, ctx-\u003ebuf);\n-\treturn 0;\n-}\n-\n-/* authz JSON parsing */\n-\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n, m, e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lejp_ctx ctx;\n-\tconst char *p;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lws_struct JSON\u005cn\u0022);\n-\n-\tfor (m \u003d 0; m \u003c (int)LWS_ARRAY_SIZE(json_tests); m++) {\n-\n-\t\tlwsl_info(\u0022%s: ++++++++++++++++ test %d\u005cn\u0022, __func__, m + 1);\n-\n-\t\tlejp_construct(\u0026ctx, test_cb, NULL, tok, LWS_ARRAY_SIZE(tok));\n-\n-\t\tlwsl_hexdump_info(json_tests[m], strlen(json_tests[m]));\n-\n-\t\tif (m \u003d\u003d 7)\n-\t\t\tn \u003d lejp_parse(\u0026ctx, (uint8_t *)json_tests[m],\n-\t\t\t\t\t\t\t 0xc8);\n-\t\telse\n-\t\t\tn \u003d lejp_parse(\u0026ctx, (uint8_t *)json_tests[m],\n-\t\t\t\t\t\t (int)strlen(json_tests[m]));\n-\n-\t\tlwsl_info(\u0022n \u003d %d\u005cn\u0022, n);\n-\t\tif (n \u003c 0 \u0026\u0026 m !\u003d 9) {\n-\t\t\tlwsl_err(\u0022%s: test %d: JSON decode failed '%s'\u005cn\u0022,\n-\t\t\t\t\t__func__, m + 1, lejp_error_to_string(n));\n-\t\t\te++;\n-\t\t}\n-\t\tif (n \u003e\u003d 0 \u0026\u0026 m \u003d\u003d 9) {\n-\t\t\tlwsl_err(\u0022%s: test %d: JSON decode should have failed '%s'\u005cn\u0022,\n-\t\t\t\t\t__func__, m + 1, lejp_error_to_string(n));\n-\t\t\te++;\n-\t\t}\n-\t}\n-\n-\t{\n-\t\tconst char *cs;\n-\t\tsize_t cslen;\n-\t\tcs \u003d lws_json_simple_find(\u0022{\u005c\u0022blah\u005c\u0022:123,\u005c\u0022ext\u005c\u0022:{\u005c\u0022authorized\u005c\u0022:1}}\u0022, 35,\n-\t\t\t\t\t \u0022\u005c\u0022ext\u005c\u0022:\u0022, \u0026cslen);\n-\t\tif (!cs) {\n-\t\t\tlwsl_err(\u0022%s: simple_find failed\u005cn\u0022, __func__);\n-\t\t\te++;\n-\t\t} else {\n-\t\t\tif (lws_json_simple_strcmp(cs, cslen,\n-\t\t\t\t\t\u0022\u005c\u0022authorized\u005c\u0022:\u0022, \u00221\u0022))\n-\t\t\t\te++;\n-\t\t}\n-\t\tcs \u003d lws_json_simple_find(\u0022{\u005c\u0022blah\u005c\u0022:123,\u005c\u0022auth_user\u005c\u0022:\u005c\u0022andy@warmcat.com\u005c\u0022,\u005c\u0022thing\u005c\u0022:\u005c\u0022yeah\u005c\u0022}\u0022, 57,\n-\t\t\t\t\t \u0022\u005c\u0022auth_user\u005c\u0022:\u0022, \u0026cslen);\n-\t\tif (cslen !\u003d 16) {\n-\t\t\tlwsl_err(\u0022%s: wrong string len %d isolated\u005cn\u0022, __func__, (int)cslen);\n-\t\t\te++;\n-\t\t}\n-\t}\n-\n-\tif (e)\n-\t\tgoto bail;\n-\n-\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_user(\u0022Completed: FAIL\u005cn\u0022);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_cache/CMakeLists.txt b/minimal-examples/api-tests/api-test-lws_cache/CMakeLists.txt\ndeleted file mode 100644\nindex 72ae86a..0000000\n--- a/minimal-examples/api-tests/api-test-lws_cache/CMakeLists.txt\n+++ /dev/null\n@@ -1,19 +0,0 @@\n-project(lws-api-test-lws_cache C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-lws_cache)\n-set(SRCS main.c)\n-\n-add_executable(${SAMP} ${SRCS})\n-add_test(NAME api-test-lws_cache COMMAND lws-api-test-lws_cache)\n-\n-if (websockets_shared)\n-\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\tadd_dependencies(${SAMP} websockets_shared)\n-else()\n-\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lws_cache/README.md b/minimal-examples/api-tests/api-test-lws_cache/README.md\ndeleted file mode 100644\nindex 74034c7..0000000\n--- a/minimal-examples/api-tests/api-test-lws_cache/README.md\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-# lws api test lwsac\n-\n-Demonstrates how to use and performs selftests for lwsac\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-lwsac\n-[2018/10/09 09:14:17:4834] USER: LWS API selftest: lwsac\n-[2018/10/09 09:14:17:4835] USER: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-lws_cache/main.c b/minimal-examples/api-tests/api-test-lws_cache/main.c\ndeleted file mode 100644\nindex 64835ff..0000000\n--- a/minimal-examples/api-tests/api-test-lws_cache/main.c\n+++ /dev/null\n@@ -1,512 +0,0 @@\n-/*\n- * lws-api-test-lws_cache\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-static struct lws_context *cx;\n-static int tests, fail;\n-\n-static int\n-test_just_l1(void)\n-{\n-\tstruct lws_cache_creation_info ci;\n-\tstruct lws_cache_ttl_lru *l1;\n-\tint ret \u003d 1;\n-\tsize_t size;\n-\tchar *po;\n-\n-\tlwsl_user(\u0022%s\u005cn\u0022, __func__);\n-\n-\ttests++;\n-\n-\t/* just create a heap cache \u0022L1\u0022 */\n-\n-\tmemset(\u0026ci, 0, sizeof(ci));\n-\tci.cx \u003d cx;\n-\tci.ops \u003d \u0026lws_cache_ops_heap;\n-\tci.name \u003d \u0022L1\u0022;\n-\n-\tl1 \u003d lws_cache_create(\u0026ci);\n-\tif (!l1)\n-\t\tgoto cdone;\n-\n-\t/* add two items, a has 1s expiry and b has 2s */\n-\n-\tif (lws_cache_write_through(l1, \u0022a\u0022, (const uint8_t *)\u0022is_a\u0022, 5,\n-\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC, NULL))\n-\t\tgoto cdone;\n-\n-\tif (lws_cache_write_through(l1, \u0022b\u0022, (const uint8_t *)\u0022is_b\u0022, 5,\n-\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL))\n-\t\tgoto cdone;\n-\n-\t/* check they exist as intended */\n-\n-\tif (lws_cache_item_get(l1, \u0022a\u0022, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d 5 || strcmp(po, \u0022is_a\u0022))\n-\t\tgoto cdone;\n-\n-\tif (lws_cache_item_get(l1, \u0022b\u0022, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d 5 || strcmp(po, \u0022is_b\u0022))\n-\t\tgoto cdone;\n-\n-\t/* wait for 1.2s to pass, working the event loop by hand */\n-\n-\tlws_cancel_service(cx);\n-\tif (lws_service(cx, 0) \u003c 0)\n-\t\tgoto cdone;\n-#if defined(WIN32)\n-\tSleep(1200);\n-#else\n-\t/* netbsd cares about \u003c 1M */\n-\tusleep(999999);\n-\tusleep(200001);\n-#endif\n-\tlws_cancel_service(cx);\n-\tif (lws_service(cx, 0) \u003c 0)\n-\t\tgoto cdone;\n-\n-\tlws_cancel_service(cx);\n-\tif (lws_service(cx, 0) \u003c 0)\n-\t\tgoto cdone;\n-\n-\t/* a only had 1s lifetime, he should be gone */\n-\n-\tif (!lws_cache_item_get(l1, \u0022a\u0022, (const void **)\u0026po, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: cache: a still exists after expiry\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t\tgoto cdone;\n-\t}\n-\n-\t/* that's ok then */\n-\n-\tret \u003d 0;\n-\n-cdone:\n-\tlws_cache_destroy(\u0026l1);\n-\n-\tif (ret)\n-\t\tlwsl_warn(\u0022%s: fail\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-static int\n-test_just_l1_limits(void)\n-{\n-\tstruct lws_cache_creation_info ci;\n-\tstruct lws_cache_ttl_lru *l1;\n-\tint ret \u003d 1;\n-\tsize_t size;\n-\tchar *po;\n-\n-\tlwsl_user(\u0022%s\u005cn\u0022, __func__);\n-\ttests++;\n-\n-\t/* just create a heap cache \u0022L1\u0022 */\n-\n-\tmemset(\u0026ci, 0, sizeof(ci));\n-\tci.cx \u003d cx;\n-\tci.ops \u003d \u0026lws_cache_ops_heap;\n-\tci.name \u003d \u0022L1_lim\u0022;\n-\tci.max_items \u003d 1; /* ie, adding a second item destroys the first */\n-\n-\tl1 \u003d lws_cache_create(\u0026ci);\n-\tif (!l1)\n-\t\tgoto cdone;\n-\n-\t/* add two items, a has 1s expiry and b has 2s */\n-\n-\tif (lws_cache_write_through(l1, \u0022a\u0022, (const uint8_t *)\u0022is_a\u0022, 5,\n-\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC, NULL))\n-\t\tgoto cdone;\n-\n-\tif (lws_cache_write_through(l1, \u0022b\u0022, (const uint8_t *)\u0022is_b\u0022, 5,\n-\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL))\n-\t\tgoto cdone;\n-\n-\t/* only b should exit, since we limit to cache to just one entry */\n-\n-\tif (!lws_cache_item_get(l1, \u0022a\u0022, (const void **)\u0026po, \u0026size))\n-\t\tgoto cdone;\n-\n-\tif (lws_cache_item_get(l1, \u0022b\u0022, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d 5 || strcmp(po, \u0022is_b\u0022))\n-\t\tgoto cdone;\n-\n-\t/* that's ok then */\n-\n-\tret \u003d 0;\n-\n-cdone:\n-\tlws_cache_destroy(\u0026l1);\n-\n-\tif (ret)\n-\t\tlwsl_warn(\u0022%s: fail\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-\n-#if defined(LWS_WITH_CACHE_NSCOOKIEJAR)\n-\n-static const char\n-\t*cookie1 \u003d \u0022host.com\u005ctFALSE\u005ct/\u005ctTRUE\u005ct4000000000\u005ctmycookie\u005ctmycookievalue\u0022,\n-\t*tag_cookie1 \u003d \u0022host.com|/|mycookie\u0022,\n-\t*cookie2 \u003d \u0022host.com\u005ctFALSE\u005ct/xxx\u005ctTRUE\u005ct4000000000\u005ctmycookie\u005ctmyxxxcookievalue\u0022,\n-\t*tag_cookie2 \u003d \u0022host.com|/xxx|mycookie\u0022,\n-\t*cookie3 \u003d \u0022host.com\u005ctFALSE\u005ct/\u005ctTRUE\u005ct4000000000\u005ctextra\u005ctcookie3value\u0022,\n-\t*tag_cookie3 \u003d \u0022host.com|/|extra\u0022,\n-\t*cookie4 \u003d \u0022host.com\u005ctFALSE\u005ct/yyy\u005ctTRUE\u005ct4000000000\u005ctnewcookie\u005ctnewcookievalue\u0022,\n-\t*tag_cookie4 \u003d \u0022host.com|/yyy|newcookie\u0022\n-;\n-\n-static int\n-test_nsc1(void)\n-{\n-\tstruct lws_cache_creation_info ci;\n-\tstruct lws_cache_ttl_lru *l1 \u003d NULL, *nsc;\n-\tlws_cache_results_t cr;\n-\tint n, ret \u003d 1;\n-\tsize_t size;\n-\tchar *po;\n-\n-\tlwsl_user(\u0022%s\u005cn\u0022, __func__);\n-\ttests++;\n-\n-\t/* First create a netscape cookie cache object */\n-\n-\tmemset(\u0026ci, 0, sizeof(ci));\n-\tci.cx \u003d cx;\n-\tci.ops \u003d \u0026lws_cache_ops_nscookiejar;\n-\tci.name \u003d \u0022NSC\u0022;\n-\tci.u.nscookiejar.filepath \u003d \u0022./cookies.txt\u0022;\n-\n-\tnsc \u003d lws_cache_create(\u0026ci);\n-\tif (!nsc)\n-\t\tgoto cdone;\n-\n-\t/* Then a heap cache \u0022L1\u0022 as a child of nsc */\n-\n-\tci.ops \u003d \u0026lws_cache_ops_heap;\n-\tci.name \u003d \u0022L1\u0022;\n-\tci.parent \u003d nsc;\n-\n-\tl1 \u003d lws_cache_create(\u0026ci);\n-\tif (!l1)\n-\t\tgoto cdone;\n-\n-\tlws_cache_debug_dump(nsc);\n-\tlws_cache_debug_dump(l1);\n-\n-\tlwsl_user(\u0022%s: add cookies to L1\u005cn\u0022, __func__);\n-\n-\t/* add three cookies */\n-\n-\tif (lws_cache_write_through(l1, tag_cookie1,\n-\t\t\t\t (const uint8_t *)cookie1, strlen(cookie1),\n-\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC, NULL)) {\n-\t\tlwsl_err(\u0022%s: write1 failed\u005cn\u0022, __func__);\n-\t\tgoto cdone;\n-\t}\n-\n-\tlws_cache_debug_dump(nsc);\n-\tlws_cache_debug_dump(l1);\n-\n-\tif (lws_cache_write_through(l1, tag_cookie2,\n-\t\t\t\t (const uint8_t *)cookie2, strlen(cookie2),\n-\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {\n-\t\tlwsl_err(\u0022%s: write2 failed\u005cn\u0022, __func__);\n-\t\tgoto cdone;\n-\t}\n-\n-\tlws_cache_debug_dump(nsc);\n-\tlws_cache_debug_dump(l1);\n-\n-\tif (lws_cache_write_through(l1, tag_cookie3,\n-\t\t\t\t (const uint8_t *)cookie3, strlen(cookie3),\n-\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {\n-\t\tlwsl_err(\u0022%s: write3 failed\u005cn\u0022, __func__);\n-\t\tgoto cdone;\n-\t}\n-\n-\tlws_cache_debug_dump(nsc);\n-\tlws_cache_debug_dump(l1);\n-\n-\tlwsl_user(\u0022%s: check cookies in L1\u005cn\u0022, __func__);\n-\n-\t/* confirm that the cookies are individually in L1 */\n-\n-\tif (lws_cache_item_get(l1, tag_cookie1, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d strlen(cookie1) || memcmp(po, cookie1, size)) {\n-\t\tlwsl_err(\u0022%s: L1 '%s' missing, size %llu, po %s\u005cn\u0022, __func__,\n-\t\t\t tag_cookie1, (unsigned long long)size, po);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (lws_cache_item_get(l1, tag_cookie2, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d strlen(cookie2) || memcmp(po, cookie2, size)) {\n-\t\tlwsl_err(\u0022%s: L1 '%s' missing\u005cn\u0022, __func__, tag_cookie2);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (lws_cache_item_get(l1, tag_cookie3, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d strlen(cookie3) || memcmp(po, cookie3, size)) {\n-\t\tlwsl_err(\u0022%s: L1 '%s' missing\u005cn\u0022, __func__, tag_cookie3);\n-\t\tgoto cdone;\n-\t}\n-\n-\t/* confirm that the cookies are individually in L2 / NSC... normally\n-\t * we don't do this but check via L1 so we can get it from there if\n-\t * present. But as a unit test, we want to make sure it's in L2 / NSC\n-\t */\n-\n-\tlwsl_user(\u0022%s: check cookies written thru to NSC\u005cn\u0022, __func__);\n-\n-\tif (lws_cache_item_get(nsc, tag_cookie1, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d strlen(cookie1) || memcmp(po, cookie1, size)) {\n-\t\tlwsl_err(\u0022%s: NSC '%s' missing, size %llu, po %s\u005cn\u0022, __func__,\n-\t\t\t tag_cookie1, (unsigned long long)size, po);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (lws_cache_item_get(nsc, tag_cookie2, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d strlen(cookie2) || memcmp(po, cookie2, size)) {\n-\t\tlwsl_err(\u0022%s: NSC '%s' missing\u005cn\u0022, __func__, tag_cookie2);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (lws_cache_item_get(nsc, tag_cookie3, (const void **)\u0026po, \u0026size) ||\n-\t size !\u003d strlen(cookie3) || memcmp(po, cookie3, size)) {\n-\t\tlwsl_err(\u0022%s: NSC '%s' missing\u005cn\u0022, __func__, tag_cookie3);\n-\t\tgoto cdone;\n-\t}\n-\n-\t/* let's do a lookup with no results */\n-\n-\tlwsl_user(\u0022%s: nonexistant get must not pass\u005cn\u0022, __func__);\n-\n-\tif (!lws_cache_item_get(l1, \u0022x.com|y|z\u0022, (const void **)\u0026po, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: nonexistant found size %llu, po %s\u005cn\u0022, __func__,\n-\t\t\t (unsigned long long)size, po);\n-\t\tgoto cdone;\n-\t}\n-\n-\t/*\n-\t * let's try some url paths and check we get the right results set...\n-\t * for / and any cookie, we expect only c1 and c3 to be listed\n-\t */\n-\n-\tlwsl_user(\u0022%s: wildcard lookup 1\u005cn\u0022, __func__);\n-\n-\tn \u003d lws_cache_lookup(l1, \u0022host.com|/|*\u0022,\n-\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n-\tif (n) {\n-\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n-\t\tgoto cdone;\n-\t}\n-\tlwsl_hexdump_notice(cr.ptr, size);\n-\n-\tif (cr.size !\u003d 53)\n-\t\tgoto cdone;\n-\n-\twhile (!lws_cache_results_walk(\u0026cr))\n-\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n-\t\t\t\t\t (int)cr.payload_len);\n-\n-\t/*\n-\t * for /xxx and any cookie, we expect all 3 listed\n-\t */\n-\n-\tlwsl_user(\u0022%s: wildcard lookup 2\u005cn\u0022, __func__);\n-\n-\tn \u003d lws_cache_lookup(l1, \u0022host.com|/xxx|*\u0022,\n-\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n-\tif (n) {\n-\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (cr.size !\u003d 84)\n-\t\tgoto cdone;\n-\n-\twhile (!lws_cache_results_walk(\u0026cr))\n-\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n-\t\t\t\t\t (int)cr.payload_len);\n-\n-\t/*\n-\t * for /yyyy and any cookie, we expect only c1 and c3\n-\t */\n-\n-\tlwsl_user(\u0022%s: wildcard lookup 3\u005cn\u0022, __func__);\n-\n-\tn \u003d lws_cache_lookup(l1, \u0022host.com|/yyyy|*\u0022,\n-\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n-\tif (n) {\n-\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (cr.size !\u003d 53)\n-\t\tgoto cdone;\n-\n-\twhile (!lws_cache_results_walk(\u0026cr))\n-\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n-\t\t\t\t\t (int)cr.payload_len);\n-\n-\t/*\n-\t * repeat the above test, results should come from cache\n-\t */\n-\n-\tlwsl_user(\u0022%s: wildcard lookup 4\u005cn\u0022, __func__);\n-\n-\tn \u003d lws_cache_lookup(l1, \u0022host.com|/yyyy|*\u0022,\n-\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n-\tif (n) {\n-\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (cr.size !\u003d 53)\n-\t\tgoto cdone;\n-\n-\twhile (!lws_cache_results_walk(\u0026cr))\n-\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n-\t\t\t\t\t (int)cr.payload_len);\n-\n-\t/* now let's try deleting cookie 1 */\n-\n-\tif (lws_cache_item_remove(l1, tag_cookie1))\n-\t\tgoto cdone;\n-\n-\tlws_cache_debug_dump(nsc);\n-\tlws_cache_debug_dump(l1);\n-\n-\t/* with c1 gone, we should only get c3 */\n-\n-\tlwsl_user(\u0022%s: wildcard lookup 5\u005cn\u0022, __func__);\n-\n-\tn \u003d lws_cache_lookup(l1, \u0022host.com|/|*\u0022,\n-\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n-\tif (n) {\n-\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (cr.size !\u003d 25)\n-\t\tgoto cdone;\n-\n-\twhile (!lws_cache_results_walk(\u0026cr))\n-\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n-\t\t\t\t\t (int)cr.payload_len);\n-\n-\t/*\n-\t * let's add a fourth cookie (third in cache now we deleted one)\n-\t */\n-\n-\tif (lws_cache_write_through(l1, tag_cookie4,\n-\t\t\t\t (const uint8_t *)cookie4, strlen(cookie4),\n-\t\t\t\t lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {\n-\t\tlwsl_err(\u0022%s: write4 failed\u005cn\u0022, __func__);\n-\t\tgoto cdone;\n-\t}\n-\n-\t/*\n-\t * for /yy and any cookie, we expect only c3\n-\t */\n-\n-\tlwsl_user(\u0022%s: wildcard lookup 6\u005cn\u0022, __func__);\n-\n-\tn \u003d lws_cache_lookup(l1, \u0022host.com|/yy|*\u0022,\n-\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n-\tif (n) {\n-\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (cr.size !\u003d 25)\n-\t\tgoto cdone;\n-\n-\twhile (!lws_cache_results_walk(\u0026cr))\n-\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n-\t\t\t\t\t (int)cr.payload_len);\n-\n-\t/*\n-\t * for /yyy and any cookie, we expect c3 and c4\n-\t */\n-\n-\tlwsl_user(\u0022%s: wildcard lookup 7\u005cn\u0022, __func__);\n-\n-\tn \u003d lws_cache_lookup(l1, \u0022host.com|/yyy|*\u0022,\n-\t\t\t (const void **)\u0026cr.ptr, \u0026cr.size);\n-\tif (n) {\n-\t\tlwsl_err(\u0022%s: lookup failed %d\u005cn\u0022, __func__, n);\n-\t\tgoto cdone;\n-\t}\n-\n-\tif (cr.size !\u003d 57)\n-\t\tgoto cdone;\n-\n-\twhile (!lws_cache_results_walk(\u0026cr))\n-\t\tlwsl_notice(\u0022 %s (%d)\u005cn\u0022, (const char *)cr.tag,\n-\t\t\t\t\t (int)cr.payload_len);\n-\n-\t/* that's ok then */\n-\n-\tlwsl_user(\u0022%s: done\u005cn\u0022, __func__);\n-\n-\tret \u003d 0;\n-\n-cdone:\n-\tlws_cache_destroy(\u0026nsc);\n-\tlws_cache_destroy(\u0026l1);\n-\n-\tif (ret)\n-\t\tlwsl_warn(\u0022%s: fail\u005cn\u0022, __func__);\n-\n-\treturn ret;\n-}\n-#endif\n-\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\n-\tmemset(\u0026info, 0, sizeof info);\n-\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n-\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\n-\tlwsl_user(\u0022LWS API selftest: lws_cache\u005cn\u0022);\n-\n-\tcx \u003d lws_create_context(\u0026info);\n-\tif (!cx) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tif (test_just_l1())\n-\t\tfail++;\n-\tif (test_just_l1_limits())\n-\t\tfail++;\n-\n-#if defined(LWS_WITH_CACHE_NSCOOKIEJAR)\n-\tif (test_nsc1())\n-\t\tfail++;\n-#endif\n-\n-\tlws_context_destroy(cx);\n-\n-\tif (tests \u0026\u0026 !fail)\n-\t\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n-\telse\n-\t\tlwsl_err(\u0022Completed: FAIL %d / %d\u005cn\u0022, fail, tests);\n-\n-\treturn 0;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_cache/text1.txt b/minimal-examples/api-tests/api-test-lws_cache/text1.txt\ndeleted file mode 100644\nindex c4079a2..0000000\n--- a/minimal-examples/api-tests/api-test-lws_cache/text1.txt\n+++ /dev/null\n@@ -1,3 +0,0 @@\n-# Netscape HTTP Cookie File\n-host.com\tFALSE\t/\tFALSE\t1234\tmycookie\tvalue\n-host.com\tFALSE\t/xxx\tFALSE\t1234\tmycookie\tvaluexxx\ndiff --git a/minimal-examples/api-tests/api-test-lws_dsh/CMakeLists.txt b/minimal-examples/api-tests/api-test-lws_dsh/CMakeLists.txt\ndeleted file mode 100644\nindex 59d08cd..0000000\n--- a/minimal-examples/api-tests/api-test-lws_dsh/CMakeLists.txt\n+++ /dev/null\n@@ -1,26 +0,0 @@\n-project(lws-api-test-lws_dsh C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-lws_dsh)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_NETWORK 1 requirements)\n-require_lws_config(LWS_WITH_LWS_DSH 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\tadd_test(NAME api-test-lws_dsh COMMAND lws-api-test-lws_dsh)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lws_dsh/README.md b/minimal-examples/api-tests/api-test-lws_dsh/README.md\ndeleted file mode 100644\nindex f62a45a..0000000\n--- a/minimal-examples/api-tests/api-test-lws_dsh/README.md\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-# lws api test lws_dsh\n-\n-Demonstrates how to use and performs selftests for lws_dsh\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-lws_dsh\n-[2018/10/09 09:14:17:4834] USER: LWS API selftest: lws_dsh\n-[2018/10/09 09:14:17:4835] USER: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-lws_dsh/main.c b/minimal-examples/api-tests/api-test-lws_dsh/main.c\ndeleted file mode 100644\nindex 3e938b2..0000000\n--- a/minimal-examples/api-tests/api-test-lws_dsh/main.c\n+++ /dev/null\n@@ -1,457 +0,0 @@\n-/*\n- * lws-api-test-lws_dsh\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-int\n-test1(void)\n-{\n-\tstruct lws_dsh *dsh;\n-\tsize_t size;\n-\tvoid *a1;\n-\n-\t/*\n-\t * test 1: single dsh, alloc 2 kinds and free everything back to a\n-\t * single free obj\n-\t */\n-\n-\tdsh \u003d lws_dsh_create(NULL, 16384, 2);\n-\tif (!dsh) {\n-\t\tlwsl_err(\u0022%s: Failed to create dsh\u005cn\u0022, __func__);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello\u0022, 5, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 1\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 1, \u0022some other string\u0022, 17, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 2\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello again\u0022, 11, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 3\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_get_head(dsh, 1, \u0026a1, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: no head 1\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tif (size !\u003d 17 || memcmp(a1, \u0022some other string\u0022, 17)) {\n-\t\tlwsl_err(\u0022%s: test 1 mismatch\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tlws_dsh_free(\u0026a1);\n-\n-\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: no head 2\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tif (size !\u003d 5 || memcmp(a1, \u0022hello\u0022, 5)) {\n-\t\tlwsl_err(\u0022%s: test 2 mismatch\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tlws_dsh_free(\u0026a1);\n-\n-\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: no head 3\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tif (size !\u003d 11 || memcmp(a1, \u0022hello again\u0022, 11)) {\n-\t\tlwsl_err(\u0022%s: test 3 mismatch\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tlws_dsh_free(\u0026a1);\n-\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 0;\n-bail:\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 1;\n-}\n-\n-int\n-test3(void)\n-{\n-\tstruct lws_dsh *dsh, *dsh2;\n-\tlws_dll2_owner_t owner;\n-\tuint8_t blob[4096];\n-\n-\tmemset(blob, 0, sizeof(blob));\n-\n-\t/*\n-\t * test 3: multiple dsh, umeetable allocation request\n-\t */\n-\n-\tlws_dll2_owner_clear(\u0026owner);\n-\n-\tdsh \u003d lws_dsh_create(\u0026owner, 4096, 2);\n-\tif (!dsh) {\n-\t\tlwsl_err(\u0022%s: Failed to create dsh1\u005cn\u0022, __func__);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tdsh2 \u003d lws_dsh_create(\u0026owner, 4096, 2);\n-\tif (!dsh2) {\n-\t\tlwsl_err(\u0022%s: Failed to create dsh2\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 0, blob, 4000, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 1\u005cn\u0022, __func__);\n-\n-\t\tgoto bail2;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh2, 0, \u0022hello\u0022, 5, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 2\u005cn\u0022, __func__);\n-\n-\t\tgoto bail2;\n-\t}\n-\n-\t/*\n-\t * There's just no room for this, we expect it to fail\n-\t */\n-\n-\tif (!lws_dsh_alloc_tail(dsh, 0, blob, 5000, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Didn't fail to alloc as expected\u005cn\u0022, __func__);\n-\n-\t\tgoto bail2;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh2, 0, \u0022hello again\u0022, 11, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 4\u005cn\u0022, __func__);\n-\n-\t\tgoto bail2;\n-\t}\n-\n-\tlws_dsh_destroy(\u0026dsh2);\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 0;\n-\n-bail2:\n-\tlws_dsh_destroy(\u0026dsh2);\n-\n-bail:\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 1;\n-}\n-\n-int\n-test4(void)\n-{\n-\tuint8_t blob[4096];\n-\tstruct lws_dsh *dsh;\n-\tsize_t size;\n-\tvoid *a1;\n-\n-\tmemset(blob, 0, sizeof(blob));\n-\n-\t/*\n-\t * test 4: use up whole free list, then recover and alloc something\n-\t *\t else\n-\t */\n-\n-\tdsh \u003d lws_dsh_create(NULL, 4096, 2);\n-\tif (!dsh) {\n-\t\tlwsl_err(\u0022%s: Failed to create dsh\u005cn\u0022, __func__);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 0, blob, 4000, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 1\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: no head 1\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tif (size !\u003d 4000) {\n-\t\tlwsl_err(\u0022%s: test 1 mismatch %d\u005cn\u0022, __func__, (int)size);\n-\n-\t\tgoto bail;\n-\t}\n-\tlws_dsh_free(\u0026a1);\n-\n-\tif (lws_dsh_alloc_tail(dsh, 0, \u0022some other string\u0022, 17, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 2\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello again\u0022, 11, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 3\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: no head 4\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tif (size !\u003d 17 || memcmp(a1, \u0022some other string\u0022, 17)) {\n-\t\t/* it may (should...) coalesce */\n-\t\tif (size !\u003d 28 || memcmp(a1, \u0022some other stringhello again\u0022, 28)) {\n-\t\t\tlwsl_err(\u0022%s: test 4 mismatch %d\u005cn\u0022, __func__, (int)size);\n-\n-\t\t\tgoto bail;\n-\t\t}\n-\t}\n-\tlws_dsh_free(\u0026a1);\n-\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 0;\n-bail:\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 1;\n-}\n-\n-int\n-test5(void)\n-{\n-\tstruct lws_dsh *dsh;\n-\tunsigned int budget;\n-\tuint8_t blob[4096];\n-\tlws_xos_t xos;\n-\tsize_t size;\n-\tvoid *a1;\n-\n-\tmemset(blob, 0, sizeof(blob));\n-\tlws_xos_init(\u0026xos, 0x123456789abcdef0ull);\n-\n-\tbudget \u003d (unsigned int)(lws_xos(\u0026xos) % 4000) + 4000;\n-\n-\tlwsl_notice(\u0022%s: budget %u\u005cn\u0022, __func__, budget);\n-\n-\n-\t/*\n-\t * test 5: PRNG-based spamming and erratic bidi draining\n-\t */\n-\n-\tdsh \u003d lws_dsh_create(NULL, 409600, 2);\n-\tif (!dsh) {\n-\t\tlwsl_err(\u0022%s: Failed to create dsh\u005cn\u0022, __func__);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tdo {\n-\n-\t\tif (lws_xos_percent(\u0026xos, 60)) {\n-\t\t\t/* kind 0 is going to try to write */\n-\n-\t\t\tsize \u003d (size_t)((lws_xos(\u0026xos) \u0026 127) + 1);\n-\n-\t\t\tif (!lws_dsh_alloc_tail(dsh, 0, blob, size, NULL, 0))\n-\t\t\t\tlwsl_notice(\u0022%s: kind 0 alloc %d\u005cn\u0022, __func__, (int)size);\n-\t\t}\n-\n-\t\tif (lws_xos_percent(\u0026xos, 80)) {\n-\t\t\t/* kind 1 is going to try to write */\n-\n-\t\t\tsize \u003d (size_t)((lws_xos(\u0026xos) \u0026 127) + 1);\n-\n-\t\t\tif (!lws_dsh_alloc_tail(dsh, 1, blob, size, NULL, 0))\n-\t\t\t\tlwsl_notice(\u0022%s: kind 1 alloc %d\u005cn\u0022, __func__, (int)size);\n-\t\t}\n-\n-\t\tif (lws_xos_percent(\u0026xos, 40)) {\n-\t\t\t/* kind 0 is going to try to read */\n-\n-\t\t\twhile (!lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n-\t\t\t\tlwsl_notice(\u0022%s: kind 0 read %d\u005cn\u0022, __func__, (int)size);\n-\t\t\t\tlws_dsh_free(\u0026a1);\n-\t\t\t}\n-\t\t}\n-\n-\t\tif (lws_xos_percent(\u0026xos, 30)) {\n-\t\t\t/* kind 1 is going to try to read */\n-\n-\t\t\twhile (!lws_dsh_get_head(dsh, 1, \u0026a1, \u0026size)) {\n-\t\t\t\tlwsl_notice(\u0022%s: kind 1 read %d\u005cn\u0022, __func__, (int)size);\n-\t\t\t\tlws_dsh_free(\u0026a1);\n-\t\t\t}\n-\t\t}\n-\n-\t} while (budget--);\n-\n-\twhile (!lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n-\t\tlwsl_notice(\u0022%s: kind 0 read %d\u005cn\u0022, __func__, (int)size);\n-\t\tlws_dsh_free(\u0026a1);\n-\t}\n-\n-\twhile (!lws_dsh_get_head(dsh, 1, \u0026a1, \u0026size)) {\n-\t\tlwsl_notice(\u0022%s: kind 1 read %d\u005cn\u0022, __func__, (int)size);\n-\t\tlws_dsh_free(\u0026a1);\n-\t}\n-\n-#if defined(_DEBUG)\n-\tlws_dsh_describe(dsh, \u0022test dsh end state\u0022);\n-#endif\n-\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 0;\n-}\n-\n-int\n-test6(void)\n-{\n-\tstruct lws_dsh *dsh;\n-\tsize_t size;\n-\tvoid *a1;\n-\n-\t/*\n-\t * test 6: confirm sequential coalescing\n-\t */\n-\n-\tdsh \u003d lws_dsh_create(NULL, 16384, 2);\n-\tif (!dsh) {\n-\t\tlwsl_err(\u0022%s: Failed to create dsh\u005cn\u0022, __func__);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello\u0022, 5, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 1\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 1, \u0022some other string\u0022, 17, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 2\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_alloc_tail(dsh, 0, \u0022hello again\u0022, 11, NULL, 0)) {\n-\t\tlwsl_err(\u0022%s: Failed to alloc 3\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tif (lws_dsh_get_head(dsh, 1, \u0026a1, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: no head 1\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tif (size !\u003d 17 || memcmp(a1, \u0022some other string\u0022, 17)) {\n-\t\tlwsl_err(\u0022%s: test 1 mismatch\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tlws_dsh_free(\u0026a1);\n-\n-\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: no head 2\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tif (size !\u003d 5 || memcmp(a1, \u0022hello\u0022, 5)) {\n-\t\tlwsl_err(\u0022%s: test 2 mismatch\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tlws_dsh_free(\u0026a1);\n-\n-\tif (lws_dsh_get_head(dsh, 0, \u0026a1, \u0026size)) {\n-\t\tlwsl_err(\u0022%s: no head 3\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tif (size !\u003d 11 || memcmp(a1, \u0022hello again\u0022, 11)) {\n-\t\tlwsl_err(\u0022%s: test 3 mismatch\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\tlws_dsh_free(\u0026a1);\n-\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 0;\n-bail:\n-#if defined(_DEBUG)\n-\tlws_dsh_describe(dsh, \u0022test6 fail\u0022);\n-#endif\n-\tlws_dsh_destroy(\u0026dsh);\n-\n-\treturn 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tint ret \u003d 0, n;\n-\tconst char *p;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lws_dsh\u005cn\u0022);\n-\n-\tn \u003d test1();\n-\tlwsl_user(\u0022%s: test1: %d\u005cn\u0022, __func__, n);\n-\tret |\u003d n;\n-\tif (ret)\n-\t\tgoto bail;\n-\n-\tn \u003d test3();\n-\tlwsl_user(\u0022%s: test3: %d\u005cn\u0022, __func__, n);\n-\tret |\u003d n;\n-\tif (ret)\n-\t\tgoto bail;\n-\n-\tn \u003d test4();\n-\tlwsl_user(\u0022%s: test4: %d\u005cn\u0022, __func__, n);\n-\tret |\u003d n;\n-\tif (ret)\n-\t\tgoto bail;\n-\n-\tn \u003d test5();\n-\tlwsl_user(\u0022%s: test5: %d\u005cn\u0022, __func__, n);\n-\tret |\u003d n;\n-\tif (ret)\n-\t\tgoto bail;\n-\n-\tn \u003d test6();\n-\tlwsl_user(\u0022%s: test6: %d\u005cn\u0022, __func__, n);\n-\tret |\u003d n;\n-\n-bail:\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, ret ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n-\n-\treturn ret;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_map/CMakeLists.txt b/minimal-examples/api-tests/api-test-lws_map/CMakeLists.txt\ndeleted file mode 100644\nindex 897042c..0000000\n--- a/minimal-examples/api-tests/api-test-lws_map/CMakeLists.txt\n+++ /dev/null\n@@ -1,17 +0,0 @@\n-project(lws-api-test-lws_map C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-\n-\n-\tadd_executable(${PROJECT_NAME} main.c)\n-\tadd_test(NAME api-test-lws_map COMMAND lws-api-test-lws_map)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-\ndiff --git a/minimal-examples/api-tests/api-test-lws_map/main.c b/minimal-examples/api-tests/api-test-lws_map/main.c\ndeleted file mode 100644\nindex 022c98a..0000000\n--- a/minimal-examples/api-tests/api-test-lws_map/main.c\n+++ /dev/null\n@@ -1,264 +0,0 @@\n-/*\n- * lws-api-test-lws_map\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * unit tests for lws_map\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-/* custom key and comparator for test 3 */\n-\n-typedef struct mykey {\n-\tint\t\t\tkey;\n-} mykey_t;\n-\n-static int\n-compare_mykey_t(const lws_map_key_t key1, size_t kl1,\n-\t\tconst lws_map_value_t key2, size_t kl2)\n-{\n-\tconst mykey_t *m1 \u003d (mykey_t *)key1, *m2 \u003d (mykey_t *)key2;\n-\n-\treturn m1-\u003ekey !\u003d m2-\u003ekey;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tint e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE,\n-\t\t\texpected \u003d 4, pass \u003d 0;\n-\tmykey_t k1 \u003d { .key \u003d 123 }, k2 \u003d { .key \u003d 234 }, k3 \u003d { .key \u003d 999 };\n-\tstruct lwsac *ac \u003d NULL;\n-\tlws_map_item_t *item;\n-\tlws_map_info_t info;\n-\tlws_map_t *map;\n-\tconst char *p;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lws_map\u005cn\u0022);\n-\n-\t/* Test 1: string keys */\n-\n-\tlwsl_user(\u0022%s: test1\u005cn\u0022, __func__);\n-\tmemset(\u0026info, 0, sizeof(info));\n-\tmap \u003d lws_map_create(\u0026info);\n-\tif (!map) {\n-\t\te++;\n-\t\tgoto end_t1;\n-\t}\n-\tif (!lws_map_item_create_ks(map, \u0022abc\u0022, (lws_map_value_t)\u0022def\u0022, 3)) {\n-\t\te++;\n-\t\tgoto end_t1;\n-\t}\n-\tif (!lws_map_item_create_ks(map, \u0022123\u0022, (lws_map_value_t)\u00224567\u0022, 4)) {\n-\t\te++;\n-\t\tgoto end_t1;\n-\t}\n-\titem \u003d lws_map_item_lookup_ks(map, \u0022abc\u0022);\n-\tif (!item) {\n-\t\te++;\n-\t\tgoto end_t1;\n-\t}\n-\n-\tif (lws_map_item_value_len(item) !\u003d 3 ||\n-\t memcmp(lws_map_item_value(item), \u0022def\u0022, 3)) {\n-\t\te++;\n-\t\tgoto end_t1;\n-\t}\n-\n-\titem \u003d lws_map_item_lookup_ks(map, \u0022123\u0022);\n-\tif (!item) {\n-\t\te++;\n-\t\tgoto end_t1;\n-\t}\n-\n-\tif (lws_map_item_value_len(item) !\u003d 4 ||\n-\t memcmp(lws_map_item_value(item), \u00224567\u0022, 4)) {\n-\t\te++;\n-\t\tgoto end_t1;\n-\t}\n-\n-\titem \u003d lws_map_item_lookup_ks(map, \u0022nope\u0022);\n-\tif (item) {\n-\t\te++;\n-\t\tgoto end_t1;\n-\t}\n-\n-\tpass++;\n-\n-end_t1:\n-\tlws_map_destroy(\u0026map);\n-\n-\t/* Test 2: Use lwsac item allocators */\n-\n-\tlwsl_user(\u0022%s: test2\u005cn\u0022, __func__);\n-\tmemset(\u0026info, 0, sizeof(info));\n-\tinfo._alloc \u003d lws_map_alloc_lwsac;\n-\tinfo._free \u003d lws_map_free_lwsac;\n-\tinfo.opaque \u003d (void *)\u0026ac;\n-\n-\tmap \u003d lws_map_create(\u0026info);\n-\tif (!map) {\n-\t\te++;\n-\t\tgoto end_t2;\n-\t}\n-\tif (!lws_map_item_create_ks(map, \u0022abc\u0022, \u0022def\u0022, 3)) {\n-\t\te++;\n-\t\tgoto end_t2;\n-\t}\n-\tif (!lws_map_item_create_ks(map, \u0022123\u0022, \u00224567\u0022, 4)) {\n-\t\te++;\n-\t\tgoto end_t2;\n-\t}\n-\titem \u003d lws_map_item_lookup_ks(map, \u0022abc\u0022);\n-\tif (!item) {\n-\t\te++;\n-\t\tgoto end_t2;\n-\t}\n-\n-\tif (lws_map_item_value_len(item) !\u003d 3 ||\n-\t memcmp(lws_map_item_value(item), \u0022def\u0022, 3)) {\n-\t\te++;\n-\t\tgoto end_t2;\n-\t}\n-\n-\titem \u003d lws_map_item_lookup_ks(map, \u0022123\u0022);\n-\tif (!item) {\n-\t\te++;\n-\t\tgoto end_t2;\n-\t}\n-\n-\tif (lws_map_item_value_len(item) !\u003d 4 ||\n-\t memcmp(lws_map_item_value(item), \u00224567\u0022, 4)) {\n-\t\te++;\n-\t\tgoto end_t2;\n-\t}\n-\n-\titem \u003d lws_map_item_lookup_ks(map, \u0022nope\u0022);\n-\tif (item) {\n-\t\te++;\n-\t\tgoto end_t2;\n-\t}\n-\n-\tpass++;\n-\n-end_t2:\n-\tlws_map_destroy(\u0026map);\n-\tlwsac_free(\u0026ac);\n-\n-\t/* Test 3: custom key object and comparator */\n-\n-\tlwsl_user(\u0022%s: test3\u005cn\u0022, __func__);\n-\tmemset(\u0026info, 0, sizeof(info));\n-\tinfo._compare \u003d compare_mykey_t;\n-\n-\tmap \u003d lws_map_create(\u0026info);\n-\tif (!map) {\n-\t\te++;\n-\t\tgoto end_t3;\n-\t}\n-\tif (!lws_map_item_create(map, (lws_map_key_t)\u0026k1, sizeof(k1),\n-\t\t\t\t (lws_map_value_t)\u0022def\u0022, 3)) {\n-\t\tlwsl_err(\u0022%s: t3; a\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto end_t3;\n-\t}\n-\tif (!lws_map_item_create(map, (lws_map_key_t)\u0026k2, sizeof(k2),\n-\t\t\t\t (lws_map_value_t)\u00224567\u0022, 4)) {\n-\t\tlwsl_err(\u0022%s: t3; b\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto end_t3;\n-\t}\n-\titem \u003d lws_map_item_lookup(map, (lws_map_key_t)\u0026k1, sizeof(k1));\n-\tif (!item) {\n-\t\tlwsl_err(\u0022%s: t3; c\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto end_t3;\n-\t}\n-\n-\tif (lws_map_item_value_len(item) !\u003d 3 ||\n-\t memcmp(lws_map_item_value(item), \u0022def\u0022, 3)) {\n-\t\tlwsl_err(\u0022%s: t3; d\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto end_t3;\n-\t}\n-\n-\titem \u003d lws_map_item_lookup(map, (lws_map_key_t)\u0026k2, sizeof(k2));\n-\tif (!item) {\n-\t\tlwsl_err(\u0022%s: t3; e\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto end_t3;\n-\t}\n-\n-\tif (lws_map_item_value_len(item) !\u003d 4 ||\n-\t memcmp(lws_map_item_value(item), \u00224567\u0022, 4)) {\n-\t\tlwsl_err(\u0022%s: t3; f\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto end_t3;\n-\t}\n-\n-\titem \u003d lws_map_item_lookup(map, (lws_map_key_t)\u0026k3, sizeof(k3));\n-\tif (item) {\n-\t\tlwsl_err(\u0022%s: t3; g\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto end_t3;\n-\t}\n-\n-\tpass++;\n-\n-end_t3:\n-\tlws_map_destroy(\u0026map);\n-\n-\t/* Test 4: same key items */\n-\n-\tlwsl_user(\u0022%s: test4\u005cn\u0022, __func__);\n-\tmemset(\u0026info, 0, sizeof(info));\n-\tmap \u003d lws_map_create(\u0026info);\n-\tif (!map) {\n-\t\te++;\n-\t\tgoto end_t4;\n-\t}\n-\tif (!lws_map_item_create_ks(map, \u0022abc\u0022, (lws_map_value_t)\u0022def\u0022, 3)) {\n-\t\te++;\n-\t\tgoto end_t4;\n-\t}\n-\tif (!lws_map_item_create_ks(map, \u0022abc\u0022, (lws_map_value_t)\u00224567\u0022, 4)) {\n-\t\te++;\n-\t\tgoto end_t4;\n-\t}\n-\titem \u003d lws_map_item_lookup_ks(map, \u0022abc\u0022);\n-\tif (!item) {\n-\t\te++;\n-\t\tgoto end_t4;\n-\t}\n-\n-\tif (lws_map_item_value_len(item) !\u003d 4 ||\n-\t memcmp(lws_map_item_value(item), \u00224567\u0022, 4)) {\n-\t\te++;\n-\t\tgoto end_t4;\n-\t}\n-\n-\tpass++;\n-\n-end_t4:\n-\tlws_map_destroy(\u0026map);\n-\n-\tif (e)\n-\t\tgoto bail;\n-\n-\tlwsl_user(\u0022Completed: PASS %d / %d\u005cn\u0022, pass, expected);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_user(\u0022Completed: FAIL, passed %d / %d (e %d)\u005cn\u0022, pass,\n-\t\t\t\texpected, e);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_sequencer/CMakeLists.txt b/minimal-examples/api-tests/api-test-lws_sequencer/CMakeLists.txt\ndeleted file mode 100644\nindex 59333d8..0000000\n--- a/minimal-examples/api-tests/api-test-lws_sequencer/CMakeLists.txt\n+++ /dev/null\n@@ -1,25 +0,0 @@\n-project(lws-api-test-lws_sequencer C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-lws_sequencer)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-require_lws_config(LWS_WITH_SEQUENCER 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lws_sequencer/libwebsockets.org.cer b/minimal-examples/api-tests/api-test-lws_sequencer/libwebsockets.org.cer\ndeleted file mode 100644\nindex 01ad0dc..0000000\n--- a/minimal-examples/api-tests/api-test-lws_sequencer/libwebsockets.org.cer\n+++ /dev/null\n@@ -1,32 +0,0 @@\n------BEGIN CERTIFICATE-----\n-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n------END CERTIFICATE-----\n-\ndiff --git a/minimal-examples/api-tests/api-test-lws_sequencer/main.c b/minimal-examples/api-tests/api-test-lws_sequencer/main.c\ndeleted file mode 100644\nindex 0db7f40..0000000\n--- a/minimal-examples/api-tests/api-test-lws_sequencer/main.c\n+++ /dev/null\n@@ -1,399 +0,0 @@\n-/*\n- * lws-api-test-lws_sequencer\n- *\n- * Written in 2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This api test uses the lws_sequencer api to make five http client requests\n- * to libwebsockets.org in sequence, from inside the event loop. The fourth\n- * fourth http client request is directed to port 22 where it stalls\n- * triggering the lws_sequencer timeout flow. The fifth is given a nonexistant\n- * dns name and is expected to fail.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, test_good \u003d 0;\n-\n-enum {\n-\tSEQ1,\n-\tSEQ2,\n-\tSEQ3_404,\n-\tSEQ4_TIMEOUT,\t\t/* we expect to timeout */\n-\tSEQ5_BAD_ADDRESS\t/* we expect the connection to fail */\n-};\n-\n-/*\n- * This is the user defined struct whose space is allocated along with the\n- * sequencer when that is created.\n- *\n- * You'd put everything your sequencer needs to do its job in here.\n- */\n-\n-struct myseq {\n-\tstruct lws_vhost\t*vhost;\n-\tstruct lws\t\t*cwsi;\t/* client wsi for current step if any */\n-\n-\tint\t\t\tstate;\t/* which test we're on */\n-\tint\t\t\thttp_resp;\n-};\n-\n-/* sequencer messages specific to this sequencer */\n-\n-enum {\n-\tSEQ_MSG_CLIENT_FAILED \u003d LWSSEQ_USER_BASE,\n-\tSEQ_MSG_CLIENT_DONE,\n-};\n-\n-/* this is the sequence of GETs we will do */\n-\n-static const char *url_paths[] \u003d {\n-\t\u0022https://libwebsockets.org/index.html\u0022,\n-\t\u0022https://libwebsockets.org/lws.css\u0022,\n-\t\u0022https://libwebsockets.org/404.html\u0022,\n-\t\u0022https://libwebsockets.org:22\u0022,\t\t/* this causes us to time out */\n-\t\u0022https://doesntexist.invalid/\u0022\t\t/* fail early in connect */\n-};\n-\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-/*\n- * This is the sequencer-aware http protocol handler. It monitors the client\n- * http action and queues messages for the sequencer when something definitive\n- * happens.\n- */\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user,\n-\t void *in, size_t len)\n-{\n-\tstruct myseq *s \u003d (struct myseq *)user;\n-\tint seq_msg \u003d SEQ_MSG_CLIENT_FAILED;\n-\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_notice(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tgoto notify;\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\tif (!s)\n-\t\t\treturn 1;\n-\t\ts-\u003ehttp_resp \u003d (int)lws_http_client_http_response(wsi);\n-\t\tlwsl_info(\u0022Connected with server response: %d\u005cn\u0022, s-\u003ehttp_resp);\n-\t\tbreak;\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_info(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-#if 0 /* enable to dump the html */\n-\t\t{\n-\t\t\tconst char *p \u003d in;\n-\n-\t\t\twhile (len--)\n-\t\t\t\tif (*p \u003c 0x7f)\n-\t\t\t\t\tputchar(*p++);\n-\t\t\t\telse\n-\t\t\t\t\tputchar('.');\n-\t\t}\n-#endif\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tlwsl_notice(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP: wsi %p\u005cn\u0022,\n-\t\t\t wsi);\n-\t\tif (!s)\n-\t\t\treturn 1;\n-\t\t/*\n-\t\t * We got a definitive transaction completion\n-\t\t */\n-\t\tseq_msg \u003d SEQ_MSG_CLIENT_DONE;\n-\t\tgoto notify;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tlwsl_info(\u0022LWS_CALLBACK_CLOSED_CLIENT_HTTP\u005cn\u0022);\n-\t\tif (!s)\n-\t\t\treturn 1;\n-\n-\t\tlwsl_user(\u0022%s: wsi %p: seq failed at CLOSED_CLIENT_HTTP\u005cn\u0022,\n-\t\t\t __func__, wsi);\n-\t\tgoto notify;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-\n-notify:\n-\t/*\n-\t * We only inform the sequencer of a definitive outcome for our step.\n-\t *\n-\t * So once we have informed it, we detach ourselves from the sequencer\n-\t * and the sequencer from ourselves. Wsi may want to live on but after\n-\t * we got our result and moved on to the next test or completed, the\n-\t * sequencer doesn't want to hear from it again.\n-\t */\n-\tif (!s)\n-\t\treturn 1;\n-\n-\tlws_set_wsi_user(wsi, NULL);\n-\ts-\u003ecwsi \u003d NULL;\n-\tlws_seq_queue_event(lws_seq_from_user(s), seq_msg,\n-\t\t\t\t NULL, NULL);\n-\n-\treturn 0;\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{ \u0022seq-test-http\u0022, callback_http, 0, 0, 0, NULL, 0 },\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-\n-static int\n-sequencer_start_client(struct myseq *s)\n-{\n-\tstruct lws_client_connect_info i;\n-\tconst char *prot, *path1;\n-\tchar uri[128], path[128];\n-\tint n;\n-\n-\tlws_strncpy(uri, url_paths[s-\u003estate], sizeof(uri));\n-\n-\tmemset(\u0026i, 0, sizeof i);\n-\ti.context \u003d lws_seq_get_context(lws_seq_from_user(s));\n-\n-\tif (lws_parse_uri(uri, \u0026prot, \u0026i.address, \u0026i.port, \u0026path1)) {\n-\t\tlwsl_err(\u0022%s: uri error %s\u005cn\u0022, __func__, uri);\n-\t}\n-\n-\tif (!strcmp(prot, \u0022https\u0022))\n-\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n-\n-\tpath[0] \u003d '/';\n-\tn \u003d 1;\n-\tif (path1[0] \u003d\u003d '/')\n-\t\tn \u003d 0;\n-\tlws_strncpy(\u0026path[n], path1, sizeof(path) - 1);\n-\n-\ti.path \u003d path;\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\ti.method \u003d \u0022GET\u0022;\n-\ti.vhost \u003d s-\u003evhost;\n-\ti.userdata \u003d s;\n-\n-\ti.protocol \u003d protocols[0].name;\n-\ti.local_protocol_name \u003d protocols[0].name;\n-\ti.pwsi \u003d \u0026s-\u003ecwsi;\n-\n-\tif (!lws_client_connect_via_info(\u0026i)) {\n-\t\tlwsl_notice(\u0022%s: connecting to %s://%s:%d%s failed\u005cn\u0022,\n-\t\t\t __func__, prot, i.address, i.port, path);\n-\n-\t\t/* we couldn't even get started with the client connection */\n-\n-\t\tlws_seq_queue_event(lws_seq_from_user(s),\n-\t\t\t\t (lws_seq_events_t)SEQ_MSG_CLIENT_FAILED, NULL, NULL);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tlws_seq_timeout_us(lws_seq_from_user(s), 3 * LWS_US_PER_SEC);\n-\n-\tlwsl_notice(\u0022%s: wsi %p: connecting to %s://%s:%d%s\u005cn\u0022, __func__,\n-\t\t s-\u003ecwsi, prot, i.address, i.port, path);\n-\n-\treturn 0;\n-}\n-\n-/*\n- * The sequencer callback handles queued sequencer messages in the order they\n- * were queued. The messages are presented from the event loop thread context\n- * even if they were queued from a different thread.\n- */\n-\n-static lws_seq_cb_return_t\n-sequencer_cb(struct lws_sequencer *seq, void *user, int event,\n-\t void *data, void *aux)\n-{\n-\tstruct myseq *s \u003d (struct myseq *)user;\n-\n-\tswitch ((int)event) {\n-\tcase LWSSEQ_CREATED: /* our sequencer just got started */\n-\t\ts-\u003estate \u003d SEQ1; /* first thing we'll do is the first url */\n-\t\tgoto step;\n-\n-\tcase LWSSEQ_DESTROYED:\n-\t\t/*\n-\t\t * This sequencer is about to be destroyed. If we have any\n-\t\t * other assets in play, detach them from us.\n-\t\t */\n-\t\tif (s-\u003ecwsi)\n-\t\t\tlws_set_wsi_user(s-\u003ecwsi, NULL);\n-\n-\t\tinterrupted \u003d 1;\n-\t\tbreak;\n-\n-\tcase LWSSEQ_TIMED_OUT: /* current step timed out */\n-\t\tif (s-\u003estate \u003d\u003d SEQ4_TIMEOUT) {\n-\t\t\tlwsl_user(\u0022%s: test %d got expected timeout\u005cn\u0022,\n-\t\t\t\t __func__, s-\u003estate);\n-\t\t\tgoto done;\n-\t\t}\n-\t\tlwsl_user(\u0022%s: seq timed out at step %d\u005cn\u0022, __func__, s-\u003estate);\n-\t\treturn LWSSEQ_RET_DESTROY;\n-\n-\tcase SEQ_MSG_CLIENT_FAILED:\n-\t\tif (s-\u003estate \u003d\u003d SEQ5_BAD_ADDRESS) {\n-\t\t\t/*\n-\t\t\t * in this specific case, we expect to fail\n-\t\t\t */\n-\t\t\tlwsl_user(\u0022%s: test %d failed as expected\u005cn\u0022,\n-\t\t\t\t __func__, s-\u003estate);\n-\t\t\tgoto done;\n-\t\t}\n-\n-\t\tlwsl_user(\u0022%s: seq failed at step %d\u005cn\u0022, __func__, s-\u003estate);\n-\n-\t\treturn LWSSEQ_RET_DESTROY;\n-\n-\tcase SEQ_MSG_CLIENT_DONE:\n-\t\tif (s-\u003estate \u003e\u003d SEQ4_TIMEOUT) {\n-\t\t\t/*\n-\t\t\t * In these specific cases, done would be a failure,\n-\t\t\t * we expected to timeout or fail\n-\t\t\t */\n-\t\t\tlwsl_user(\u0022%s: seq failed at step %d\u005cn\u0022, __func__,\n-\t\t\t\t s-\u003estate);\n-\n-\t\t\treturn LWSSEQ_RET_DESTROY;\n-\t\t}\n-\t\tlwsl_user(\u0022%s: seq done step %d (resp %d)\u005cn\u0022, __func__,\n-\t\t\t s-\u003estate, s-\u003ehttp_resp);\n-\n-done:\n-\t\tlws_seq_timeout_us(lws_seq_from_user(s), LWSSEQTO_NONE);\n-\t\ts-\u003estate++;\n-\t\tif (s-\u003estate \u003d\u003d LWS_ARRAY_SIZE(url_paths)) {\n-\t\t\t/* the sequence has completed */\n-\t\t\tlwsl_user(\u0022%s: sequence completed OK\u005cn\u0022, __func__);\n-\n-\t\t\ttest_good \u003d 1;\n-\n-\t\t\treturn LWSSEQ_RET_DESTROY;\n-\t\t}\n-\n-step:\n-\t\tsequencer_start_client(s);\n-\t\tbreak;\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn LWSSEQ_RET_CONTINUE;\n-}\n-\n-int\n-main(int argc, const char **argv)\n-{\n-\tint n \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tstruct lws_sequencer *seq;\n-\tstruct lws_vhost *vh;\n-\tlws_seq_info_t i;\n-\tstruct myseq *s;\n-\tconst char *p;\n-\n-\t/* the normal lws init */\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lws_sequencer\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n-\t\t LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n-\tinfo.protocols \u003d protocols;\n-\n-#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n-\t/*\n-\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n-\t * CA to trust explicitly.\n-\t */\n-\tinfo.client_ssl_ca_filepath \u003d \u0022./libwebsockets.org.cer\u0022;\n-#endif\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tvh \u003d lws_create_vhost(context, \u0026info);\n-\tif (!vh) {\n-\t\tlwsl_err(\u0022Failed to create first vhost\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/*\n-\t * Create the sequencer... when the event loop starts, it will\n-\t * receive the LWSSEQ_CREATED callback\n-\t */\n-\n-\tmemset(\u0026i, 0, sizeof(i));\n-\ti.context \u003d context;\n-\ti.user_size \u003d sizeof(struct myseq);\n-\ti.puser \u003d (void **)\u0026s;\n-\ti.cb \u003d sequencer_cb;\n-\ti.name \u003d \u0022seq\u0022;\n-\n-\tseq \u003d lws_seq_create(\u0026i);\n-\tif (!seq) {\n-\t\tlwsl_err(\u0022%s: unable to create sequencer\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\ts-\u003evhost \u003d vh;\n-\n-\t/* the usual lws event loop */\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-bail1:\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, !test_good ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn !test_good;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_smd/CMakeLists.txt b/minimal-examples/api-tests/api-test-lws_smd/CMakeLists.txt\ndeleted file mode 100644\nindex e282706..0000000\n--- a/minimal-examples/api-tests/api-test-lws_smd/CMakeLists.txt\n+++ /dev/null\n@@ -1,28 +0,0 @@\n-project(lws-api-test-lws_smd C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(requirements 1)\n-require_pthreads(requirements)\n-require_lws_config(LWS_WITH_SYS_SMD 1 requirements)\n-require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${PROJECT_NAME} main.c)\n-\tadd_test(NAME api-test-lws_smd COMMAND lws-api-test-lws_smd -d1151)\n-\tset_tests_properties(api-test-lws_smd\n-\t\t\t PROPERTIES\n-\t\t\t RUN_SERIAL TRUE\n-\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/api-tests/api-test-lws_smd\n-\t\t\t TIMEOUT 60)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lws_smd/main.c b/minimal-examples/api-tests/api-test-lws_smd/main.c\ndeleted file mode 100644\nindex b3f8bd5..0000000\n--- a/minimal-examples/api-tests/api-test-lws_smd/main.c\n+++ /dev/null\n@@ -1,313 +0,0 @@\n-/*\n- * lws-api-test-lws_smd\n- *\n- * Written in 2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This api test confirms lws_smd System Message Distribution\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#define HAVE_STRUCT_TIMESPEC\n-#include \u003cpthread.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, ok, fail, _exp \u003d 111;\n-static unsigned int how_many_msg \u003d 100, usec_interval \u003d 1000;\n-static lws_sorted_usec_list_t sul, sul_initial_drain;\n-struct lws_context *context;\n-static pthread_t thread_spam;\n-\n-static void\n-timeout_cb(lws_sorted_usec_list_t *sul)\n-{\n-\t/* We should have completed the test before this fires */\n-\tlwsl_notice(\u0022%s: test period finished\u005cn\u0022, __func__);\n-\tinterrupted \u003d 1;\n-\tlws_cancel_service(context);\n-}\n-\n-static int\n-smd_cb1int(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,\n-\t void *buf, size_t len)\n-{\n-#if 0\n-\tlwsl_notice(\u0022%s: ts %llu, len %d\u005cn\u0022, __func__,\n-\t\t (unsigned long long)timestamp, (int)len);\n-\tlwsl_hexdump_notice(buf, len);\n-#endif\n-\tok++;\n-\n-\treturn 0;\n-}\n-\n-static int\n-smd_cb2int(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,\n-\t void *buf, size_t len)\n-{\n-#if 0\n-\tlwsl_notice(\u0022%s: ts %llu, len %d\u005cn\u0022, __func__,\n-\t\t (unsigned long long)timestamp, (int)len);\n-\tlwsl_hexdump_notice(buf, len);\n-#endif\n-\tok++;\n-\n-\treturn 0;\n-}\n-\n-/*\n- * This is used in an smd participant that is deregistered before the message\n- * can be delivered, it should never see any message\n- */\n-\n-static int\n-smd_cb3int(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,\n-\t void *buf, size_t len)\n-{\n-\tlwsl_err(\u0022%s: Countermanded ts %llu, len %d\u005cn\u0022, __func__,\n-\t\t (unsigned long long)timestamp, (int)len);\n-\tlwsl_hexdump_err(buf, len);\n-\n-\tfail++;\n-\n-\treturn 0;\n-}\n-\n-static void *\n-_thread_spam(void *d)\n-{\n-#if defined(WIN32)\n-\tunsigned int mypid \u003d 0;\n-#else\n-\tunsigned int mypid \u003d (unsigned int)getpid();\n-#endif\n-\tunsigned int n \u003d 0, atm \u003d 0;\n-\n-\twhile (n++ \u003c how_many_msg) {\n-\n-\t\tatm++;\n-\t\tif (lws_smd_msg_printf(context, LWSSMDCL_SYSTEM_STATE,\n-\t\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022state\u005c\u0022,\u0022\n-\t\t\t\t\t\t\u0022\u005c\u0022pid\u005c\u0022:%u,\u0022\n-\t\t\t\t\t\t\u0022\u005c\u0022msg\u005c\u0022:%d}\u0022,\n-\t\t\t\t\t mypid, (unsigned int)n)) {\n-\t\t\tlwsl_err(\u0022%s: send attempt %d failed\u005cn\u0022, __func__, atm);\n-\t\t\tn--;\n-\t\t\tfail++;\n-\t\t\tif (fail \u003e\u003d 3) {\n-\t\t\t\tinterrupted \u003d 1;\n-\t\t\t\tlws_cancel_service(context);\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t}\n-#if defined(WIN32)\n-\t\tSleep(3);\n-#else\n-\t\tusleep(usec_interval);\n-#endif\n-\t}\n-#if !defined(WIN32)\n-\tpthread_exit(NULL);\n-#endif\n-\n-\treturn NULL;\n-}\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-static void\n-drained_cb(lws_sorted_usec_list_t *sul)\n-{\n-\t/*\n-\t * spawn the test thread, it's going to spam 100 messages at 3ms\n-\t * intervals... check we got everything\n-\t */\n-\n-\tif (pthread_create(\u0026thread_spam, NULL, _thread_spam, NULL))\n-\t\tlwsl_err(\u0022%s: failed to create the spamming thread\u005cn\u0022, __func__);\n-}\n-\n-static int\n-system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n-\t\t int current, int target)\n-{\n-\t// struct lws_context *context \u003d mgr-\u003eparent;\n-\tint n;\n-\n-\tif (current !\u003d LWS_SYSTATE_OPERATIONAL || target !\u003d LWS_SYSTATE_OPERATIONAL)\n-\t\treturn 0;\n-\n-\t/*\n-\t * Overflow the message queue too see if it handles it well, both\n-\t * as overflowing and in recovery. These are all still going into the\n-\t * smd buffer dll2, since we don't break for the event loop to have a\n-\t * chance to deliver them.\n-\t */\n-\n-\tn \u003d 0;\n-\twhile (n++ \u003c 100)\n-\t\tif (lws_smd_msg_printf(context, LWSSMDCL_SYSTEM_STATE,\n-\t\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022state\u005c\u0022,\u005c\u0022test\u005c\u0022:\u005c\u0022overflow\u005c\u0022}\u0022))\n-\t\t\tbreak;\n-\n-\tlwsl_notice(\u0022%s: overflow test added %d messages\u005cn\u0022, __func__, n);\n-\tif (n \u003d\u003d 100) {\n-\t\tlwsl_err(\u0022%s: didn't overflow\u005cn\u0022, __func__);\n-\t\tinterrupted \u003d 1;\n-\t\treturn 1;\n-\t}\n-\n-\t/*\n-\t * So we have some normal messages from earlier and now the rest of the\n-\t * smd buffer filled with junk overflow messages. Before we start the\n-\t * actual spamming test from another thread, we need to return to the\n-\t * event loop so these can be cleared first.\n-\t */\n-\n-\tlws_sul_schedule(context, 0, \u0026sul_initial_drain, drained_cb,\n-\t\t\t 5 * LWS_US_PER_MS);\n-\n-\n-\tlwsl_info(\u0022%s: operational\u005cn\u0022, __func__);\n-\n-\treturn 0;\n-}\n-\n-int\n-main(int argc, const char **argv)\n-{\n-\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n-\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n-\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n-\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_smd_peer *userreg;\n-\tconst char *p;\n-\tvoid *retval;\n-\n-\t/* the normal lws init */\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--count\u0022)))\n-\t\thow_many_msg \u003d (unsigned int)atol(p);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--interval\u0022)))\n-\t\tusec_interval \u003d (unsigned int)atol(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lws_smd: %u msgs at %uus interval\u005cn\u0022,\n-\t\t\thow_many_msg, usec_interval);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\tinfo.register_notifier_list \u003d na;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\t/* game over after this long */\n-\n-\tlws_sul_schedule(context, 0, \u0026sul, timeout_cb,\n-\t\t\t (how_many_msg * (usec_interval + 1000)) + (4 * LWS_US_PER_SEC));\n-\n-\t/* register a messaging participant to hear INTERACTION class */\n-\n-\tif (!lws_smd_register(context, NULL, 0, LWSSMDCL_INTERACTION,\n-\t\t\t smd_cb1int)) {\n-\t\tlwsl_err(\u0022%s: smd register 1 failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* register a messaging participant to hear SYSTEM_STATE class */\n-\n-\tif (!lws_smd_register(context, NULL, 0, LWSSMDCL_SYSTEM_STATE,\n-\t\t\t smd_cb2int)) {\n-\t\tlwsl_err(\u0022%s: smd register 2 failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* temporarily register a messaging participant to hear a user class */\n-\n-\tuserreg \u003d lws_smd_register(context, NULL, 0, 1 \u003c\u003c LWSSMDCL_USER_BASE_BITNUM,\n-\t\t\t smd_cb3int);\n-\tif (!userreg) {\n-\t\tlwsl_err(\u0022%s: smd register userclass failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * The event loop isn't started yet, so these smd messages are getting\n-\t * buffered. Later we will deliberately overrun the buffer and wait\n-\t * for that to be cleared before the spam thread test.\n-\t */\n-\n-\t/* generate an INTERACTION class message */\n-\n-\tif (lws_smd_msg_printf(context, LWSSMDCL_INTERACTION,\n-\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022interaction\u005c\u0022}\u0022)) {\n-\t\tlwsl_err(\u0022%s: problem sending smd\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* generate a SYSTEM_STATE class message */\n-\n-\tif (lws_smd_msg_printf(context, LWSSMDCL_SYSTEM_STATE,\n-\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022state\u005c\u0022}\u0022)) {\n-\t\tlwsl_err(\u0022%s: problem sending smd\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* no participant listens for this class, so it should be skipped */\n-\n-\tif (lws_smd_msg_printf(context, LWSSMDCL_NETWORK, \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022network\u005c\u0022}\u0022)) {\n-\t\tlwsl_err(\u0022%s: problem sending smd\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* generate a user class message... */\n-\n-\tif (lws_smd_msg_printf(context, 1 \u003c\u003c LWSSMDCL_USER_BASE_BITNUM,\n-\t\t\t \u0022{\u005c\u0022s\u005c\u0022:\u005c\u0022userclass\u005c\u0022}\u0022)) {\n-\t\tlwsl_err(\u0022%s: problem sending smd\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * ... and screw that user class message up by deregistering the only\n-\t * handler before it can deliver it... it should not get delivered\n-\t * and cleanly discarded\n-\t */\n-\n-\tlws_smd_unregister(userreg);\n-\n-\t/* the usual lws event loop */\n-\n-\twhile (!interrupted \u0026\u0026 lws_service(context, 0) \u003e\u003d 0)\n-\t\t;\n-\n-\tpthread_join(thread_spam, \u0026retval);\n-\n-bail:\n-\tlws_context_destroy(context);\n-\n-\tif (fail || ok \u003e\u003d _exp)\n-\t\tlwsl_user(\u0022Completed: PASS: %d / %d, FAIL: %d\u005cn\u0022, ok, _exp,\n-\t\t\t\tfail);\n-\telse\n-\t\tlwsl_user(\u0022Completed: ALL PASS: %d / %d\u005cn\u0022, ok, _exp);\n-\n-\treturn !(ok \u003e\u003d _exp \u0026\u0026 !fail);\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_struct-json/CMakeLists.txt b/minimal-examples/api-tests/api-test-lws_struct-json/CMakeLists.txt\ndeleted file mode 100644\nindex 9068028..0000000\n--- a/minimal-examples/api-tests/api-test-lws_struct-json/CMakeLists.txt\n+++ /dev/null\n@@ -1,25 +0,0 @@\n-project(lws-api-test-lws_struct-json C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-lws_struct-json)\n-set(SRCS main.c test2.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_STRUCT_JSON 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\tadd_test(NAME api-test-lws_struct-json COMMAND lws-api-test-lws_struct-json)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lws_struct-json/README.md b/minimal-examples/api-tests/api-test-lws_struct-json/README.md\ndeleted file mode 100644\nindex f21ba78..0000000\n--- a/minimal-examples/api-tests/api-test-lws_struct-json/README.md\n+++ /dev/null\n@@ -1,108 +0,0 @@\n-# lws api test lws_struct JSON\n-\n-Demonstrates how to use and performs selftests for lws_struct\n-JSON serialization and deserialization\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-lws_struct-json\n-[2020/05/21 16:36:57:0808] U: LWS API selftest: lws_struct JSON\n-[2020/05/21 16:36:57:1188] N: main: ++++++++++++++++ test 1\n-[2020/05/21 16:36:57:1291] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1387] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n-[2020/05/21 16:36:57:1429] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n-[2020/05/21 16:36:57:1467] N: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (2)\n-[2020/05/21 16:36:57:1490] N: target.name 'target1' (target 0x509fe30)\n-[2020/05/21 16:36:57:1495] N: target.name 'target2' (target 0x509fe68)\n-[2020/05/21 16:36:57:1500] N: main: .... strarting serialization of test 1\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022,\u0022someflag\u0022:true},{\u0022name\u0022:\u0022target2\u0022,\u0022someflag\u0022:false}]}\n-[2020/05/21 16:36:57:1648] N: main: ++++++++++++++++ test 2\n-[2020/05/21 16:36:57:1649] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1650] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n-[2020/05/21 16:36:57:1651] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n-[2020/05/21 16:36:57:1652] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n-[2020/05/21 16:36:57:1653] N: builder.hostname \u003d 'learn', timeout \u003d 0, targets (3)\n-[2020/05/21 16:36:57:1653] N: target.name 'target1' (target 0x50a0660)\n-[2020/05/21 16:36:57:1654] N: target.name 'target2' (target 0x50a0698)\n-[2020/05/21 16:36:57:1655] N: target.name 'target3' (target 0x50a06d0)\n-[2020/05/21 16:36:57:1655] N: main: .... strarting serialization of test 2\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:0,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022,\u0022someflag\u0022:false},{\u0022name\u0022:\u0022target2\u0022,\u0022someflag\u0022:false},{\u0022name\u0022:\u0022target3\u0022,\u0022someflag\u0022:false}]}\n-[2020/05/21 16:36:57:1662] N: main: ++++++++++++++++ test 3\n-[2020/05/21 16:36:57:1663] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1664] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n-[2020/05/21 16:36:57:1671] N: lws_struct_default_lejp_cb: created 'child' object size 8\n-[2020/05/21 16:36:57:1685] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n-[2020/05/21 16:36:57:1685] N: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (2)\n-[2020/05/21 16:36:57:1686] N: target.name 'target1' (target 0x50a0a50)\n-[2020/05/21 16:36:57:1687] N: child 0x50a0a88, target.child.somename 'abc'\n-[2020/05/21 16:36:57:1688] N: target.name 'target2' (target 0x50a0a98)\n-[2020/05/21 16:36:57:1688] N: main: .... strarting serialization of test 3\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800,\u0022targets\u0022:[{\u0022name\u0022:\u0022target1\u0022,\u0022someflag\u0022:false,\u0022child\u0022:{\u0022somename\u0022:\u0022abc\u0022}},{\u0022name\u0022:\u0022target2\u0022,\u0022someflag\u0022:false}]}\n-[2020/05/21 16:36:57:1697] N: main: ++++++++++++++++ test 4\n-[2020/05/21 16:36:57:1698] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1699] N: builder.hostname \u003d 'learn', timeout \u003d 1800, targets (0)\n-[2020/05/21 16:36:57:1699] N: main: .... strarting serialization of test 4\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022learn\u0022,\u0022nspawn_timeout\u0022:1800}\n-[2020/05/21 16:36:57:1701] N: main: ++++++++++++++++ test 5\n-[2020/05/21 16:36:57:1702] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1707] N: builder.hostname \u003d '', timeout \u003d 0, targets (0)\n-[2020/05/21 16:36:57:1708] N: main: .... strarting serialization of test 5\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022\u0022,\u0022nspawn_timeout\u0022:0}\n-[2020/05/21 16:36:57:1709] N: main: ++++++++++++++++ test 6\n-[2020/05/21 16:36:57:1710] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1730] N: builder.hostname \u003d 'PYvtan6kqppjnS0KpYTCaiOLsJkc7Xe', timeout \u003d 0, targets (0)\n-[2020/05/21 16:36:57:1731] N: main: .... strarting serialization of test 6\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7Xe\u0022,\u0022nspawn_timeout\u0022:0}\n-[2020/05/21 16:36:57:1732] N: main: ++++++++++++++++ test 7\n-[2020/05/21 16:36:57:1732] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1733] N: lws_struct_default_lejp_cb: created 'targets' object size 48\n-[2020/05/21 16:36:57:1739] N: builder.hostname \u003d '', timeout \u003d 0, targets (1)\n-[2020/05/21 16:36:57:1751] N: target.name 'PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6AzefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr53FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV8sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIGJYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkGLUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MWv+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsYVkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yuyJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx+z3f+jTFM/aon5...\n-[2020/05/21 16:36:57:1752] N: main: .... strarting serialization of test 7\n-{\u0022schema\u0022:\u0022com-warmcat-sai-builder\u0022,\u0022hostname\u0022:\u0022\u0022,\u0022nspawn_timeout\u0022:0,\u0022targets\u0022:[{\u0022name\u0022:\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6AzefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr53FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV8sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIGJYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkGLUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MWv+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsYVkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yuyJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u0022,\u0022someflag\u0022:false}]}\n-[2020/05/21 16:36:57:1756] N: main: ++++++++++++++++ test 8\n-[2020/05/21 16:36:57:1758] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1761] N: other.name \u003d 'somename'\n-[2020/05/21 16:36:57:1763] N: main: .... strarting serialization of test 8\n-{\u0022schema\u0022:\u0022com-warmcat-sai-other\u0022,\u0022name\u0022:\u0022somename\u0022}\n-{\u0022schema\u0022:\u0022meta.schema\u0022,\u0022t\u0022:{\u0022name\u0022:\u0022mytargetname\u0022,\u0022someflag\u0022:false},\u0022e\u0022:{\u0022hostname\u0022:\u0022myhostname\u0022,\u0022nspawn_timeout\u0022:0}}\n-[2020/05/21 16:36:57:1785] N: Test set 2\n-[2020/05/21 16:36:57:1791] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1795] N: Test set 2: 6: 071ab46ab4296e5de674c628fec17c55088254679f7714ad991f8c4873dca\n-[2020/05/21 16:36:57:1801] N: test2: start \n-[2020/05/21 16:36:57:1811] N: lws_struct_schema_only_lejp_cb: child map ofs_clist 0\n-[2020/05/21 16:36:57:1815] N: lws_struct_default_lejp_cb: created 'config' object size 80\n-[2020/05/21 16:36:57:1819] N: lws_struct_default_lejp_cb: created 'creds' object size 16\n-[2020/05/21 16:36:57:1833] N: lws_struct_default_lejp_cb: created 'config' object size 80\n-[2020/05/21 16:36:57:1834] N: lws_struct_default_lejp_cb: created 'creds' object size 16\n-[2020/05/21 16:36:57:1837] N: test2: lejp_parse 0\n-[2020/05/21 16:36:57:1841] N: t2_configs_dump: number of configs: 2\n-[2020/05/21 16:36:57:1844] N: t2_config_dump: id1 '(null)'\n-[2020/05/21 16:36:57:1846] N: t2_config_dump: arg1 'val1'\n-[2020/05/21 16:36:57:1848] N: t2_config_dump: ssid '\u0022nw2\u0022'\n-[2020/05/21 16:36:57:1850] N: t2_config_dump: freq 0\n-[2020/05/21 16:36:57:1852] N: t2_config_dump: arg2 0\n-[2020/05/21 16:36:57:1854] N: t2_config_dump: priority 1\n-[2020/05/21 16:36:57:1856] N: t2_config_dump: key1: \u0022xxxxxxxxx\u0022, key2: (null)\n-[2020/05/21 16:36:57:1857] N: t2_config_dump: id1 '(null)'\n-[2020/05/21 16:36:57:1858] N: t2_config_dump: arg1 'val2'\n-[2020/05/21 16:36:57:1858] N: t2_config_dump: ssid '\u0022nw1\u0022'\n-[2020/05/21 16:36:57:1859] N: t2_config_dump: freq 11\n-[2020/05/21 16:36:57:1859] N: t2_config_dump: arg2 1420887242594\n-[2020/05/21 16:36:57:1860] N: t2_config_dump: priority 3\n-[2020/05/21 16:36:57:1860] N: t2_config_dump: key1: \u0022xxxxxxxxxxxxx\u0022, key2: (null)\n-{\u0022config\u0022:[{\u0022creds\u0022:{\u0022key1\u0022:\u0022\u005cu0022xxxxxxxxx\u005cu0022\u0022},\u0022arg1\u0022:\u0022val1\u0022,\u0022ssid\u0022:\u0022\u005cu0022nw2\u005cu0022\u0022,\u0022frequency\u0022:0,\u0022arg2\u0022:0,\u0022priority\u0022:1},{\u0022creds\u0022:{\u0022key1\u0022:\u0022\u005cu0022xxxxxxxxxxxxx\u005cu0022\u0022},\u0022arg1\u0022:\u0022val2\u0022,\u0022ssid\u0022:\u0022\u005cu0022nw1\u005cu0022\u0022,\u0022frequency\u0022:11,\u0022arg2\u0022:1420887242594,\u0022priority\u0022:3}]}\n-[2020/05/21 16:36:57:1880] U: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-lws_struct-json/main.c b/minimal-examples/api-tests/api-test-lws_struct-json/main.c\ndeleted file mode 100644\nindex 0aae74c..0000000\n--- a/minimal-examples/api-tests/api-test-lws_struct-json/main.c\n+++ /dev/null\n@@ -1,801 +0,0 @@\n-/*\n- * lws-api-test-lws_struct-json\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * lws_struct apis are used to serialize and deserialize your C structs and\n- * linked-lists in a standardized way that's very modest on memory but\n- * convenient and easy to maintain.\n- *\n- * The API test shows how to serialize and deserialize a struct with a linked-\n- * list of child structs in JSON using lws_struct APIs.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-typedef struct {\n-\tlws_dll2_t\t\tlist;\n-\n-\tstruct gpiod_line\t*line;\n-\n-\tconst char\t\t*name;\n-\tconst char\t\t*wire;\n-\n-\tint\t\t\tchip_idx;\n-\tint\t\t\toffset;\n-\tint\t\t\tsafe;\n-} sai_jig_gpio_t;\n-\n-typedef struct {\n-\tlws_dll2_t\t\tlist;\n-\tsai_jig_gpio_t\t\t*gpio; /* null \u003d wait ms */\n-\tconst char\t\t*gpio_name;\n-\tint\t\t\tvalue;\n-} sai_jig_seq_item_t;\n-\n-typedef struct {\n-\tlws_dll2_t\t\tlist;\n-\tlws_dll2_owner_t\tseq_owner;\n-\tconst char\t\t*name;\n-} sai_jig_sequence_t;\n-\n-typedef struct {\n-\tlws_dll2_t\t\tlist;\n-\tlws_dll2_owner_t\tgpio_owner;\n-\tlws_dll2_owner_t\tseq_owner;\n-\n-\tlws_sorted_usec_list_t\tsul;\t\t/* next step in ongoing seq */\n-\tsai_jig_seq_item_t\t*current;\t/* next seq step */\n-\n-\tconst char\t\t*name;\n-\n-\tstruct lws\t\t*wsi;\n-} sai_jig_target_t;\n-\n-typedef struct {\n-\tlws_dll2_owner_t\ttarget_owner;\n-\tstruct gpiod_chip\t*chip[16];\n-\tstruct lwsac\t\t*ac_conf;\n-\tint\t\t\tport;\n-\tconst char\t\t*iface;\n-\tstruct lws_context\t*ctx;\n-} sai_jig_t;\n-\n-/*\n- * We read the JSON config using lws_struct... instrument the related structures\n- */\n-\n-static const lws_struct_map_t lsm_sai_jig_gpio[] \u003d {\n-\tLSM_UNSIGNED\t(sai_jig_gpio_t, chip_idx,\t\t\u0022chip_idx\u0022),\n-\tLSM_UNSIGNED\t(sai_jig_gpio_t, offset,\t\t\u0022offset\u0022),\n-\tLSM_UNSIGNED\t(sai_jig_gpio_t, safe,\t\t\t\u0022safe\u0022),\n-\tLSM_STRING_PTR\t(sai_jig_gpio_t, name,\t\t\t\u0022name\u0022),\n-\tLSM_STRING_PTR\t(sai_jig_gpio_t, wire,\t\t\t\u0022wire\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_sai_jig_seq_item[] \u003d {\n-\tLSM_STRING_PTR\t(sai_jig_seq_item_t, gpio_name,\t\t\u0022gpio_name\u0022),\n-\tLSM_UNSIGNED\t(sai_jig_seq_item_t, value,\t\t\u0022value\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_sai_jig_sequence[] \u003d {\n-\tLSM_STRING_PTR\t(sai_jig_sequence_t, name,\t\t\u0022name\u0022),\n-\tLSM_LIST\t(sai_jig_sequence_t, seq_owner,\n-\t\t\t sai_jig_seq_item_t, list,\n-\t\t\t NULL, lsm_sai_jig_seq_item,\t\t\u0022seq\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_sai_jig_target[] \u003d {\n-\tLSM_STRING_PTR\t(sai_jig_target_t, name,\t\t\u0022name\u0022),\n-\tLSM_LIST\t(sai_jig_target_t, gpio_owner, sai_jig_gpio_t, list,\n-\t\t\t NULL, lsm_sai_jig_gpio,\t\t\u0022gpios\u0022),\n-\tLSM_LIST\t(sai_jig_target_t, seq_owner, sai_jig_sequence_t, list,\n-\t\t\t NULL, lsm_sai_jig_sequence,\t\t\u0022sequences\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_sai_jig[] \u003d {\n-\tLSM_STRING_PTR\t(sai_jig_t, iface,\t\t\t\u0022iface\u0022),\n-\tLSM_UNSIGNED\t(sai_jig_t, port,\t\t\t\u0022port\u0022),\n-\tLSM_LIST\t(sai_jig_t, target_owner, sai_jig_target_t, list,\n-\t\t\t NULL, lsm_sai_jig_target,\t\t\u0022targets\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_jig_schema[] \u003d {\n- LSM_SCHEMA (sai_jig_t, NULL, lsm_sai_jig,\t\t\u0022sai-jig\u0022),\n-};\n-\n-static const char * const jig_conf \u003d\n-\u0022{\u0022\n-\t\u0022\u005c\u0022schema\u005c\u0022:\t\u005c\u0022sai-jig\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022port\u005c\u0022:\t\t44000,\u0022\n-\t\u0022\u005c\u0022targets\u005c\u0022:\t[\u0022\n-\t\t\u0022{\u0022\n-\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022linkit-7697-1\u005c\u0022,\u0022\n- \t\u0022\u005c\u0022gpios\u005c\u0022: [\u0022\n- \t \u0022{\u0022\n-\t\t\t\t\t\u0022\u005c\u0022chip_index\u005c\u0022:\t0,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\t\t\u005c\u0022nReset\u005c\u0022,\u0022\n- \t\u0022\u005c\u0022offset\u005c\u0022:\t17,\u0022\n- \t\u0022\u005c\u0022wire\u005c\u0022:\t\t\u005c\u0022RST\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022safe\u005c\u0022:\t\t0\u0022\n-\t \u0022}, {\u0022\n-\t\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\t\t\u005c\u0022usr\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022chip_index\u005c\u0022:\t0,\u0022\n- \t\u0022\u005c\u0022offset\u005c\u0022:\t22,\u0022\n- \t\u0022\u005c\u0022wire\u005c\u0022:\t\t\u005c\u0022P6\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022safe\u005c\u0022:\t\t0\u0022\n-\t\t\t\t\u0022}\u0022\n- \u0022], \u005c\u0022sequences\u005c\u0022: [\u0022\n- \t\u0022{\u0022\n-\t\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\t\t\u005c\u0022reset\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022seq\u005c\u0022: [\u0022\n-\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022nReset\u005c\u0022, \t\u005c\u0022value\u005c\u0022: 0 },\u0022\n-\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022usr\u005c\u0022,\t\t\u005c\u0022value\u005c\u0022: 0 },\u0022\n-\t \t \u0022{\t\t\t\t\u005c\u0022value\u005c\u0022: 300 },\u0022\n-\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022nReset\u005c\u0022,\t\u005c\u0022value\u005c\u0022: 1 }\u0022\n-\t\t\t\t\t\u0022]\u0022\n- \t\u0022}, {\u0022\n-\t\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\t\t\u005c\u0022flash\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022seq\u005c\u0022: [\u0022\n-\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022nReset\u005c\u0022,\t\u005c\u0022value\u005c\u0022: 0 },\u0022\n-\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022usr\u005c\u0022,\t\t\u005c\u0022value\u005c\u0022: 1 },\u0022\n-\t \t \u0022{\t\t\t\t\u005c\u0022value\u005c\u0022: 300 },\u0022\n-\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022nReset\u005c\u0022,\t\u005c\u0022value\u005c\u0022: 1 },\u0022\n-\t \t \u0022{\t\t\t\t\u005c\u0022value\u005c\u0022: 100 },\u0022\n-\t\t \u0022{ \u005c\u0022gpio_name\u005c\u0022: \u005c\u0022usr\u005c\u0022,\t\t\u005c\u0022value\u005c\u0022: 0 }\u0022\n-\t\t\t\t\t\u0022]\u0022\n- \t\u0022}\u0022\n- \t\u0022]\u0022\n-\t\t\u0022}\u0022\n-\t\u0022]\u0022\n-\u0022}\u0022;\n-\n-\n-\n-extern int test2(void);\n-\n-/*\n- * in this example, the JSON is for one \u0022builder\u0022 object, which may specify\n- * a child list \u0022targets\u0022 of zero or more \u0022target\u0022 objects.\n- */\n-\n-static const char * const json_tests[] \u003d {\n-\t\u0022{\u0022 /* test 1 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u0022\n-\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:true\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:false\u0022\n-\t\t\t\u0022}\u0022\n-\t\t\u0022]\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 2 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target3\u005c\u0022\u0022\n-\t\t\t\u0022}\u0022\n-\t\t\u0022]\u0022\n-\t\u0022}\u0022, \u0022{\u0022 /* test 3 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u0022\n-\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022unrecognized\u005c\u0022:\u005c\u0022xyz\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022child\u005c\u0022: {\u0022\n-\t\t\t\t\t\u0022\u005c\u0022somename\u005c\u0022: \u005c\u0022abc\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022junk\u005c\u0022: { \u005c\u0022x\u005c\u0022: \u005c\u0022y\u005c\u0022 }\u0022\n-\t\t\t\t\u0022}\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022\u0022\n-\t\t\t\u0022}\u0022\n-\t\t\u0022]\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 4 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 5 */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 6 ... check huge strings into smaller fixed char array */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022\u0022\n-\t\t\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A\u0022\n-\t\t\u0022zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/\u0022\n-\t\t\u0022CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5\u0022\n-\t\t\u00223FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV\u0022\n-\t\t\u00228sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n-\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG\u0022\n-\t\t\u0022JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG\u0022\n-\t\t\u0022LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW\u0022\n-\t\t\u0022v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9\u0022\n-\t\t\u0022eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY\u0022\n-\t\t\u0022VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/\u0022\n-\t\t\u0022uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu\u0022\n-\t\t\u0022yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx\u0022\n-\t\t\u0022+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 7 ... check huge strings into char * */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022targets\u005c\u0022:[\u0022\n-\t\t\t\u0022{\u0022\n-\t\t\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022\u0022\n-\t\t\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A\u0022\n-\t\t\u0022zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/\u0022\n-\t\t\u0022CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5\u0022\n-\t\t\u00223FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV\u0022\n-\t\t\u00228sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n-\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG\u0022\n-\t\t\u0022JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG\u0022\n-\t\t\u0022LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW\u0022\n-\t\t\u0022v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9\u0022\n-\t\t\u0022eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY\u0022\n-\t\t\u0022VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/\u0022\n-\t\t\u0022uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu\u0022\n-\t\t\u0022yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx\u0022\n-\t\t\u0022+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022}]}\u0022\n-\t\u0022}\u0022,\n-\t\u0022{\u0022 /* test 8 the \u0022other\u0022 schema */\n-\t\t\u0022\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-other\u005c\u0022,\u0022\n-\t\t\u0022\u005c\u0022name\u005c\u0022:\u005c\u0022somename\u005c\u0022\u0022\n-\t\u0022}\u0022,\n-};\n-\n-/*\n- * These are the expected outputs for each test, without pretty formatting.\n- *\n- * There are some differences to do with missing elements being rendered with\n- * default values.\n- */\n-\n-static const char * const json_expected[] \u003d {\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u005c\u0022targets\u005c\u0022:[{\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u005c\u0022someflag\u005c\u0022:true},\u0022\n-\t \u0022{\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false}]}\u0022,\n-\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022nspawn_timeout\u005c\u0022:0,\u005c\u0022targets\u005c\u0022:[{\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false},\u0022\n-\t \u0022{\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false},{\u005c\u0022name\u005c\u0022:\u005c\u0022target3\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false}]}\u0022,\n-\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:1800,\u005c\u0022targets\u005c\u0022:[{\u005c\u0022name\u005c\u0022:\u005c\u0022target1\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false,\u0022\n-\t \u0022\u005c\u0022child\u005c\u0022:{\u005c\u0022somename\u005c\u0022:\u005c\u0022abc\u005c\u0022}},{\u005c\u0022name\u005c\u0022:\u005c\u0022target2\u005c\u0022,\u005c\u0022someflag\u005c\u0022:false}]}\u0022,\n-\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022hostname\u005c\u0022:\u005c\u0022learn\u005c\u0022,\u005c\u0022nspawn_timeout\u005c\u0022:1800}\u0022,\n-\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:0}\u0022,\n-\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u0022\n-\t\t\u0022\u005c\u0022PYvtan6kqppjnS0KpYTCaiOLsJkc7Xe\u005c\u0022,\u0022\n-\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:0}\u0022,\n-\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-builder\u005c\u0022,\u005c\u0022hostname\u005c\u0022:\u005c\u0022\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022nspawn_timeout\u005c\u0022:0,\u005c\u0022targets\u005c\u0022:[{\u005c\u0022name\u005c\u0022:\u005c\u0022PYvtan6kqppjnS0KpYTC\u0022\n-\t\t\u0022aiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6Azefz\u0022\n-\t\t\u0022oWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9\u0022\n-\t\t\u0022D1QKIWqg5RJ/CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6\u0022\n-\t\t\u0022bzhA+A/xAsFzSBnb3MHYWzGMprr53FAP1ISo5Ec9i+2ehV40sG6Q470sH3PG\u0022\n-\t\t\u0022QZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV8sq3ZgcxKNB7tNfN\u0022\n-\t\t\u00227idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1\u0022\n-\t\t\u0022NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEh\u0022\n-\t\t\u0022dZgxky2+g5hhlSIGJYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/\u0022\n-\t\t\u0022RrfOV+oV4R26IDq+KqUiJBENeo8/GXkGLUH/87iPyzXKEMavr6fkrK0vTGto\u0022\n-\t\t\u00228yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MWv+B/t1eZZ+1e\u0022\n-\t\t\u0022uLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZv\u0022\n-\t\t\u0022stK9eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6\u0022\n-\t\t\u0022O/grHnvJZm2vBkxuXgsYVkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0Wa\u0022\n-\t\t\u0022CqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/uZjjEGGLhJR1jPqA9D1Ej3Ch\u0022\n-\t\t\u0022V+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yuyJln+v4R\u0022\n-\t\t\u0022IWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5v\u0022\n-\t\t\u0022METteZlx+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\u005c\u0022\u0022\n-\t\t\t\u0022,\u005c\u0022someflag\u005c\u0022:false}]}\u0022,\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com-warmcat-sai-other\u005c\u0022,\u005c\u0022name\u005c\u0022:\u005c\u0022somename\u005c\u0022}\u0022\n-};\n-\n-/*\n- * These annotate the members in the struct that will be serialized and\n- * deserialized with type and size information, as well as the name to use\n- * in the serialization format.\n- *\n- * Struct members that aren't annotated like this won't be serialized and\n- * when the struct is created during deserialiation, the will be set to 0\n- * or NULL.\n- */\n-\n-/* child object */\n-\n-typedef struct sai_child {\n-\tconst char *\tsomename;\n-} sai_child_t;\n-\n-lws_struct_map_t lsm_child[] \u003d { /* describes serializable members */\n-\tLSM_STRING_PTR\t(sai_child_t, somename,\t\t\t\u0022somename\u0022),\n-};\n-\n-/* target object */\n-\n-typedef struct sai_target {\n-\tstruct lws_dll2 target_list;\n-\tsai_child_t *\t\tchild;\n-\n-\tconst char *\t\tname;\n-\tchar\t\t\tsomeflag;\n-} sai_target_t;\n-\n-static const lws_struct_map_t lsm_target[] \u003d {\n-\tLSM_STRING_PTR\t(sai_target_t, name,\t\t\t\u0022name\u0022),\n-\tLSM_BOOLEAN\t(sai_target_t, someflag,\t\t\u0022someflag\u0022),\n-\tLSM_CHILD_PTR\t(sai_target_t, child, sai_child_t,\n-\t\t\t NULL, lsm_child,\t\t\t\u0022child\u0022),\n-};\n-\n-/* the first kind of struct / schema we can receive */\n-\n-/* builder object */\n-\n-typedef struct sai_builder {\n-\tstruct lws_dll2_owner\ttargets;\n-\n-\tchar \t\t\thostname[32];\n-\tunsigned int \t\tnspawn_timeout;\n-} sai_builder_t;\n-\n-static const lws_struct_map_t lsm_builder[] \u003d {\n-\tLSM_CARRAY\t(sai_builder_t, hostname,\t\t\u0022hostname\u0022),\n-\tLSM_UNSIGNED\t(sai_builder_t, nspawn_timeout,\t\t\u0022nspawn_timeout\u0022),\n-\tLSM_LIST\t(sai_builder_t, targets,\n-\t\t\t sai_target_t, target_list,\n-\t\t\t NULL, lsm_target,\t\t\t\u0022targets\u0022),\n-};\n-\n-/*\n- * the second kind of struct / schema we can receive\n- */\n-\n-typedef struct sai_other {\n-\tchar \t\t\tname[32];\n-} sai_other_t;\n-\n-static const lws_struct_map_t lsm_other[] \u003d {\n-\tLSM_CARRAY\t(sai_other_t, name,\t\t\u0022name\u0022),\n-};\n-\n-/*\n- * meta composed pointers test\n- *\n- * We serialize a struct that consists of members that point to other objects,\n- * we expect this kind of thing\n- *\n- * {\n- * \u0022schema\u0022: \u0022meta\u0022,\n- * \u0022t\u0022: { ... },\n- * \u0022e\u0022: { ...}\n- * }\n- */\n-\n-typedef struct meta {\n-\tsai_target_t\t*t;\n-\tsai_builder_t\t*b;\n-} meta_t;\n-\n-static const lws_struct_map_t lsm_meta[] \u003d {\n-\tLSM_CHILD_PTR\t(meta_t, t, sai_target_t, NULL, lsm_target, \u0022t\u0022),\n-\tLSM_CHILD_PTR\t(meta_t, b, sai_child_t, NULL, lsm_builder, \u0022e\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_schema_meta[] \u003d {\n-\tLSM_SCHEMA\t(meta_t, NULL, lsm_meta, \u0022meta.schema\u0022),\n-};\n-\n-/*\n- * Schema table\n- *\n- * Before we can understand the serialization top level format, we must read\n- * the schema, use the table below to create the right toplevel object for the\n- * schema name, and select the correct map tables to interpret the rest of the\n- * serialization.\n- *\n- * In this example there are two completely separate structs / schemas possible\n- * to receive, and we disambiguate and create the correct one using the schema\n- * JSON node.\n- *\n- * Therefore the schema table below is the starting point for the JSON\n- * deserialization.\n- */\n-\n-static const lws_struct_map_t lsm_schema_map[] \u003d {\n-\tLSM_SCHEMA\t(sai_builder_t, NULL,\n-\t\t\t lsm_builder,\t\t\u0022com-warmcat-sai-builder\u0022),\n-\tLSM_SCHEMA\t(sai_other_t, NULL,\n-\t\t\t lsm_other,\t\t\u0022com-warmcat-sai-other\u0022),\n-};\n-\n-typedef struct sai_cancel {\n-\tchar task_uuid[65];\n-} sai_cancel_t;\n-\n-const lws_struct_map_t lsm_task_cancel[] \u003d {\n-\tLSM_CARRAY\t(sai_cancel_t, task_uuid,\t \u0022uuid\u0022),\n-};\n-\n-static const lws_struct_map_t t2_map[] \u003d {\n-\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n-\t\t\t\t\t \u0022com.warmcat.sai.taskinfo\u0022),\n-\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n-\t\t\t\t\t \u0022com.warmcat.sai.eventinfo\u0022),\n-\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n-\t\t\t/* shares struct */ \u0022com.warmcat.sai.taskreset\u0022),\n-\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n-\t\t\t/* shares struct */ \u0022com.warmcat.sai.eventreset\u0022),\n-\tLSM_SCHEMA\t(sai_cancel_t, NULL, lsm_task_cancel,\n-\t\t\t/* shares struct */ \u0022com.warmcat.sai.eventdelete\u0022),\n-\tLSM_SCHEMA\t(sai_cancel_t,\t\t NULL, lsm_task_cancel,\n-\t\t\t\t\t \u0022com.warmcat.sai.taskcan\u0022),\n-};\n-\n-static const char *t2 \u003d\n-\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com.warmcat.sai.taskcan\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022uuid\u005c\u0022: \u005c\u0022071ab46ab4296e5de674c628fec17c55088254679f7714ad991f8c4873dca\u005c\u0022}\u005cx01\u005cx02\u005cxff\u005cxff\u005cxff\u005cxff\u0022;\n-\n-typedef struct xlws_wifi_creds {\n-\tlws_dll2_t\tlist;\n-\tchar \t\tssid[33];\n-\tchar\t\tpassphrase[64];\n-\tint\t\talg;\n-\tchar\t\tbssid[6];\n-} xlws_wifi_creds_t;\n-\n-typedef struct xlws_netdevs {\n-\tlws_dll2_owner_t\towner_creds;\n-} xlws_netdevs_t;\n-\n-static const lws_struct_map_t lsm_wifi_creds[] \u003d {\n-\tLSM_CARRAY\t(xlws_wifi_creds_t, ssid,\t\t\u0022ssid\u0022),\n-\tLSM_CARRAY\t(xlws_wifi_creds_t, passphrase,\t\t\u0022passphrase\u0022),\n-\tLSM_UNSIGNED\t(xlws_wifi_creds_t, alg,\t\t\t\u0022alg\u0022),\n-\tLSM_STRING_PTR\t(xlws_wifi_creds_t, bssid,\t\t\u0022bssid\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_netdev_credentials[] \u003d {\n-\tLSM_LIST\t(xlws_netdevs_t, owner_creds, xlws_wifi_creds_t, list,\n-\t\t\t NULL, lsm_wifi_creds,\t\t\t\u0022credentials\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_netdev_schema[] \u003d {\n-\tLSM_SCHEMA\t(xlws_netdevs_t, NULL, lsm_netdev_credentials,\n-\t\t\t\t\t \u0022com.warmcat.sai.taskinfo\u0022),\n-};\n-\n-\n-static int\n-show_target(struct lws_dll2 *d, void *user)\n-{\n-\tsai_target_t *t \u003d lws_container_of(d, sai_target_t, target_list);\n-\n-\tlwsl_notice(\u0022 target.name '%s' (target %p)\u005cn\u0022, t-\u003ename, t);\n-\n-\tif (t-\u003echild)\n-\t\tlwsl_notice(\u0022 child %p, target.child.somename '%s'\u005cn\u0022,\n-\t\t\t t-\u003echild, t-\u003echild-\u003esomename);\n-\n-\treturn 0;\n-}\n-\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n, m, e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-#if 1\n-\tlws_struct_serialize_t *ser;\n-\tuint8_t buf[4096];\n-\tsize_t written;\n-#endif\n-\tstruct lejp_ctx ctx;\n-\tlws_struct_args_t a;\n-\tsai_builder_t *b, mb;\n-\tsai_target_t mt;\n-\tsai_other_t *o;\n-\tconst char *p;\n-\tmeta_t meta;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lws_struct JSON\u005cn\u0022);\n-\n-\tfor (m \u003d 0; m \u003c (int)LWS_ARRAY_SIZE(json_tests); m++) {\n-\n-\t\t/* 1. deserialize the canned JSON into structs */\n-\n-\t\tlwsl_notice(\u0022%s: ++++++++++++++++ test %d\u005cn\u0022, __func__, m + 1);\n-\n-\t\tmemset(\u0026a, 0, sizeof(a));\n-\t\ta.map_st[0] \u003d lsm_schema_map;\n-\t\ta.map_entries_st[0] \u003d LWS_ARRAY_SIZE(lsm_schema_map);\n-\t\ta.ac_block_size \u003d 512;\n-\n-\t\tlws_struct_json_init_parse(\u0026ctx, NULL, \u0026a);\n-\t\tn \u003d lejp_parse(\u0026ctx, (uint8_t *)json_tests[m],\n-\t\t\t\t\t\t (int)strlen(json_tests[m]));\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: notification JSON decode failed '%s'\u005cn\u0022,\n-\t\t\t\t\t__func__, lejp_error_to_string(n));\n-\t\t\te++;\n-\t\t\tgoto done;\n-\t\t}\n-\t\tlwsac_info(a.ac);\n-\n-\t\tif (m + 1 !\u003d 8) {\n-\t\t\tb \u003d a.dest;\n-\t\t\tif (!b) {\n-\t\t\t\tlwsl_err(\u0022%s: didn't produce any output\u005cn\u0022, __func__);\n-\t\t\t\te++;\n-\t\t\t\tgoto done;\n-\t\t\t}\n-\n-\t\t\tif (a.top_schema_index) {\n-\t\t\t\tlwsl_err(\u0022%s: wrong top_schema_index\u005cn\u0022, __func__);\n-\t\t\t\te++;\n-\t\t\t\tgoto done;\n-\t\t\t}\n-\n-\t\t\tlwsl_notice(\u0022builder.hostname \u003d '%s', timeout \u003d %d, targets (%d)\u005cn\u0022,\n-\t\t\t\t b-\u003ehostname, b-\u003enspawn_timeout,\n-\t\t\t\t b-\u003etargets.count);\n-\n-\t\t\tlws_dll2_foreach_safe(\u0026b-\u003etargets, NULL, show_target);\n-\t\t} else {\n-\t\t\to \u003d a.dest;\n-\t\t\tif (!o) {\n-\t\t\t\tlwsl_err(\u0022%s: didn't produce any output\u005cn\u0022, __func__);\n-\t\t\t\te++;\n-\t\t\t\tgoto done;\n-\t\t\t}\n-\n-\t\t\tif (a.top_schema_index !\u003d 1) {\n-\t\t\t\tlwsl_err(\u0022%s: wrong top_schema_index\u005cn\u0022, __func__);\n-\t\t\t\te++;\n-\t\t\t\tgoto done;\n-\t\t\t}\n-\n-\t\t\tlwsl_notice(\u0022other.name \u003d '%s'\u005cn\u0022, o-\u003ename);\n-\t\t}\n-\n-\t\t/* 2. serialize the structs into JSON and confirm */\n-\n-\t\tlwsl_notice(\u0022%s: .... strarting serialization of test %d\u005cn\u0022,\n-\t\t\t\t__func__, m + 1);\n-\n-\t\tif (m + 1 !\u003d 8) {\n-\t\t\tser \u003d lws_struct_json_serialize_create(lsm_schema_map,\n-\t\t\t\t\t\tLWS_ARRAY_SIZE(lsm_schema_map),\n-\t\t\t\t\t\t 0//LSSERJ_FLAG_PRETTY\n-\t\t\t\t\t\t , b);\n-\t\t} else {\n-\t\t\tser \u003d lws_struct_json_serialize_create(\u0026lsm_schema_map[1],\n-\t\t\t\t\t\t1,\n-\t\t\t\t\t\t 0//LSSERJ_FLAG_PRETTY\n-\t\t\t\t\t\t , o);\n-\t\t}\n-\t\tif (!ser) {\n-\t\t\tlwsl_err(\u0022%s: unable to init serialization\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t\tdo {\n-\t\t\tn \u003d (int)lws_struct_json_serialize(ser, buf, sizeof(buf),\n-\t\t\t\t\t\t \u0026written);\n-\t\t\tswitch (n) {\n-\t\t\tcase LSJS_RESULT_FINISH:\n-\t\t\t\tputs((const char *)buf);\n-\t\t\t\tbreak;\n-\t\t\tcase LSJS_RESULT_CONTINUE:\n-\t\t\tcase LSJS_RESULT_ERROR:\n-\t\t\t\tgoto bail;\n-\t\t\t}\n-\t\t} while(n \u003d\u003d LSJS_RESULT_CONTINUE);\n-\n-\t\tif (strcmp(json_expected[m], (char *)buf)) {\n-\t\t\tlwsl_err(\u0022%s: test %d: expected %s\u005cn\u0022, __func__, m + 1,\n-\t\t\t\t\tjson_expected[m]);\n-\t\t\te++;\n-\t\t\tgoto done;\n-\t\t}\n-\n-\t\tlws_struct_json_serialize_destroy(\u0026ser);\n-\n-done:\n-\t\tlwsac_free(\u0026a.ac);\n-\t}\n-\n-\tif (e)\n-\t\tgoto bail;\n-\n-\t/* ad-hoc tests */\n-\n-\tmemset(\u0026meta, 0, sizeof(meta));\n-\tmemset(\u0026mb, 0, sizeof(mb));\n-\tmemset(\u0026mt, 0, sizeof(mt));\n-\n-\tmeta.t \u003d \u0026mt;\n-\tmeta.b \u003d \u0026mb;\n-\n-\tmeta.t-\u003ename \u003d \u0022mytargetname\u0022;\n-\tlws_strncpy(meta.b-\u003ehostname, \u0022myhostname\u0022, sizeof(meta.b-\u003ehostname));\n-\tser \u003d lws_struct_json_serialize_create(lsm_schema_meta, 1, 0,\n-\t\t\t\t\t \u0026meta);\n-\tif (!ser) {\n-\t\tlwsl_err(\u0022%s: failed to create json\u005cn\u0022, __func__);\n-\n-\n-\t}\n-\tdo {\n-\t\tn \u003d (int)lws_struct_json_serialize(ser, buf, sizeof(buf), \u0026written);\n-\t\tswitch (n) {\n-\t\tcase LSJS_RESULT_CONTINUE:\n-\t\tcase LSJS_RESULT_FINISH:\n-\t\t\tputs((const char *)buf);\n-\t\t\tif (strcmp((const char *)buf,\n-\t\t\t\t\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022meta.schema\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022t\u005c\u0022:{\u005c\u0022name\u005c\u0022:\u005c\u0022mytargetname\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022someflag\u005c\u0022:false},\u0022\n-\t\t\t\t\u0022\u005c\u0022e\u005c\u0022:{\u005c\u0022hostname\u005c\u0022:\u005c\u0022myhostname\u005c\u0022,\u0022\n-\t\t\t\t\t\u0022\u005c\u0022nspawn_timeout\u005c\u0022:0}}\u0022)) {\n-\t\t\t\tlwsl_err(\u0022%s: meta test fail\u005cn\u0022, __func__);\n-\t\t\t\tgoto bail;\n-\t\t\t}\n-\t\t\tbreak;\n-\t\tcase LSJS_RESULT_ERROR:\n-\t\t\tgoto bail;\n-\t\t}\n-\t} while(n \u003d\u003d LSJS_RESULT_CONTINUE);\n-\n-\tlws_struct_json_serialize_destroy(\u0026ser);\n-\n-\tlwsl_notice(\u0022Test set 2\u005cn\u0022);\n-\n-\tmemset(\u0026a, 0, sizeof(a));\n-\ta.map_st[0] \u003d t2_map;\n-\ta.map_entries_st[0] \u003d LWS_ARRAY_SIZE(t2_map);\n-\ta.ac_block_size \u003d 128;\n-\n-\tlws_struct_json_init_parse(\u0026ctx, NULL, \u0026a);\n-\tm \u003d lejp_parse(\u0026ctx, (uint8_t *)t2, (int)strlen(t2));\n-\tif (m \u003c 0 || !a.dest) {\n-\t\tlwsl_notice(\u0022%s: notification JSON decode failed '%s'\u005cn\u0022,\n-\t\t\t\t__func__, lejp_error_to_string(m));\n-\t\tgoto bail;\n-\t}\n-\n-\tlwsl_notice(\u0022Test set 2: %d: %s\u005cn\u0022, m,\n-\t\t\t((sai_cancel_t *)a.dest)-\u003etask_uuid);\n-\n-\tlwsac_free(\u0026a.ac);\n-\n-\tif (test2())\n-\t\tgoto bail;\n-\n-\t{\n-\t\tlws_struct_serialize_t *js;\n-\t\txlws_wifi_creds_t creds;\n-\t\txlws_netdevs_t netdevs;\n-\t\tunsigned char *buf;\n-\t\tsize_t w;\n-\t\tint n;\n-\n-\t\tmemset(\u0026creds, 0, sizeof(creds));\n-\t\tmemset(\u0026netdevs, 0, sizeof(netdevs));\n-\n-\t\tlws_strncpy(creds.ssid, \u0022xxx\u0022, sizeof(creds.ssid));\n-\t\tlws_strncpy(creds.passphrase, \u0022yyy\u0022, sizeof(creds.passphrase));\n-\t\tlws_dll2_add_tail(\u0026creds.list, \u0026netdevs.owner_creds);\n-\n-\t\tbuf \u003d malloc(2048); /* length should be computed */\n-\n-\t\tjs \u003d lws_struct_json_serialize_create(lsm_netdev_schema,\n-\t\t\tLWS_ARRAY_SIZE(lsm_netdev_schema), 0, \u0026netdevs);\n-\t\tif (!js)\n-\t\t\tgoto bail;\n-\n-\t\tn \u003d (int)lws_struct_json_serialize(js, buf, 2048, \u0026w);\n-\t\tlws_struct_json_serialize_destroy(\u0026js);\n-\t\tif (n !\u003d LSJS_RESULT_FINISH)\n-\t\t\tgoto bail;\n-\t\tif (strcmp(\u0022{\u005c\u0022schema\u005c\u0022:\u005c\u0022com.warmcat.sai.taskinfo\u005c\u0022,\u005c\u0022credentials\u005c\u0022:[{\u005c\u0022ssid\u005c\u0022:\u005c\u0022xxx\u005c\u0022,\u005c\u0022passphrase\u005c\u0022:\u005c\u0022yyy\u005c\u0022,\u005c\u0022alg\u005c\u0022:0}]}\u0022, (const char *)buf)) {\n-\t\t\tputs((const char *)buf);\n-\t\t\tgoto bail;\n-\t\t}\n-\t\tfree(buf);\n-\t}\n-\n-\t{\n-\t\tstruct x { lws_dll2_t list; const char *sz; };\n-\t\tstruct x x1, x2, *xp;\n-\t\tlws_dll2_owner_t o;\n-\n-\t\tlws_dll2_owner_clear(\u0026o);\n-\t\tmemset(\u0026x1, 0, sizeof(x1));\n-\t\tmemset(\u0026x2, 0, sizeof(x2));\n-\n-\t\tx1.sz \u003d \u0022nope\u0022;\n-\t\tx2.sz \u003d \u0022yes\u0022;\n-\n-\t\tlws_dll2_add_tail(\u0026x1.list, \u0026o);\n-\t\tlws_dll2_add_tail(\u0026x2.list, \u0026o);\n-\n-\t\txp \u003d lws_dll2_search_sz_pl(\u0026o, \u0022yes\u0022, 3, struct x, list, sz);\n-\t\tif (xp !\u003d \u0026x2) {\n-\t\t\tlwsl_err(\u0022%s: 1 xp %p\u005cn\u0022, __func__, xp);\n-\t\t\tgoto bail;\n-\t\t}\n-\t\txp \u003d lws_dll2_search_sz_pl(\u0026o, \u0022nope\u0022, 4, struct x, list, sz);\n-\t\tif (xp !\u003d \u0026x1) {\n-\t\t\tlwsl_err(\u0022%s: 2 xp %p\u005cn\u0022, __func__, xp);\n-\t\t\tgoto bail;\n-\t\t}\n-\t\txp \u003d lws_dll2_search_sz_pl(\u0026o, \u0022wrong\u0022, 4, struct x, list, sz);\n-\t\tif (xp) {\n-\t\t\tlwsl_err(\u0022%s: 3 xp %p\u005cn\u0022, __func__, xp);\n-\t\t\tgoto bail;\n-\t\t}\n-\t}\n-\n-\t{\n-\t\tlws_struct_args_t a;\n-\t\tstruct lejp_ctx ctx;\n-\t\tint m;\n-\n-\t\tmemset(\u0026a, 0, sizeof(a));\n-\t\ta.map_st[0] \u003d lsm_jig_schema;\n-\t\ta.map_entries_st[0] \u003d LWS_ARRAY_SIZE(lsm_jig_schema);\n-\t\ta.ac_block_size \u003d 512;\n-\n-\t\tlws_struct_json_init_parse(\u0026ctx, NULL, \u0026a);\n-\n-\t\tm \u003d lejp_parse(\u0026ctx, (uint8_t *)jig_conf, (int)strlen(jig_conf));\n-\n-\t\tif (m \u003c 0 || !a.dest) {\n-\t\t\tlwsl_err(\u0022%s: line %d: JSON decode failed '%s'\u005cn\u0022,\n-\t\t\t\t __func__, ctx.line, lejp_error_to_string(m));\n-\t\t\tgoto bail;\n-\t\t}\n-\t}\n-\n-\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n-\n-\treturn 0;\n-\n-bail:\n-\n-\tlwsl_user(\u0022Completed: FAIL\u005cn\u0022);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_struct-json/test2.c b/minimal-examples/api-tests/api-test-lws_struct-json/test2.c\ndeleted file mode 100644\nindex 4afa5a0..0000000\n--- a/minimal-examples/api-tests/api-test-lws_struct-json/test2.c\n+++ /dev/null\n@@ -1,236 +0,0 @@\n-/*\n- * lws-api-test-lws_struct-json\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * lws_struct apis are used to serialize and deserialize your C structs and\n- * linked-lists in a standardized way that's very modest on memory but\n- * convenient and easy to maintain.\n- *\n- * This second test file shows a worked example for how to express a schema\n- * and both consume JSON -\u003e struct and struct -\u003e JSON for it.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-static const char * const test2_json \u003d\n-\u0022{\u0022\n-\t\u0022\u005c\u0022config\u005c\u0022:[\u0022\n-\t\t\u0022{\u0022\n-\t\t\t\u0022\u005c\u0022id1\u005c\u0022:\u0022\t\t\u0022null,\u0022\n-\t\t\t\u0022\u005c\u0022creds\u005c\u0022:{\u0022\n-\t\t\t\t\u0022\u005c\u0022key1\u005c\u0022:\u0022\t\u0022\u005c\u0022\u005c\u005c\u005c\u0022xxxxxxxxx\u005c\u005c\u005c\u0022\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022key2\u005c\u0022:\u0022\t\u0022null\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022\u005c\u0022frequency\u005c\u0022:\u0022\t\u00220,\u0022\n-\t\t\t\u0022\u005c\u0022arg1\u005c\u0022:\u0022\t\t\u0022\u005c\u0022val1\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022arg2\u005c\u0022:\u0022\t\t\u00220,\u0022\n-\t\t\t\u0022\u005c\u0022priority\u005c\u0022:\u0022\t\t\u00221,\u0022\n-\t\t\t\u0022\u005c\u0022ssid\u005c\u0022:\u0022\t\t\u0022\u005c\u0022\u005c\u005c\u005c\u0022nw2\u005c\u005c\u005c\u0022\u005c\u0022\u0022\n-\t\t\u0022}, {\u0022\n-\t\t\t\u0022\u005c\u0022id2\u005c\u0022:\u0022\t\t\u0022null,\u0022\n-\t\t\t\u0022\u005c\u0022creds\u005c\u0022: {\u0022\n-\t\t\t\t\u0022\u005c\u0022key1\u005c\u0022:\u0022\t\u0022\u005c\u0022\u005c\u005c\u005c\u0022xxxxxxxxxxxxx\u005c\u005c\u005c\u0022\u005c\u0022,\u0022\n-\t\t\t\t\u0022\u005c\u0022key2\u005c\u0022:\u0022\t\u0022null\u0022\n-\t\t\t\u0022},\u0022\n-\t\t\t\u0022\u005c\u0022frequency\u005c\u0022:\u0022\t\u002211,\u0022\n-\t\t\t\u0022\u005c\u0022arg1\u005c\u0022:\u0022\t\t\u0022\u005c\u0022val2\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022arg2\u005c\u0022:\u0022\t\t\u00221420887242594,\u0022\n-\t\t\t\u0022\u005c\u0022priority\u005c\u0022:\u0022\t\t\u00223,\u0022\n-\t\t\t\u0022\u005c\u0022ssid\u005c\u0022:\u0022\t\t\u0022\u005c\u0022\u005c\u005c\u005c\u0022nw1\u005c\u005c\u005c\u0022\u005c\u0022\u0022\n-\t\t\u0022}\u0022\n-\t\u0022]\u0022\n-\u0022}\u0022;\n-\n-static const char * const test2_json_expected \u003d\n-\t\u0022{\u005c\u0022config\u005c\u0022:[{\u005c\u0022creds\u005c\u0022:{\u005c\u0022key1\u005c\u0022:\u005c\u0022\u005c\u005cu0022xxxxxxxxx\u005c\u005cu0022\u005c\u0022},\u0022\n-\t \u0022\u005c\u0022arg1\u005c\u0022:\u005c\u0022val1\u005c\u0022,\u005c\u0022ssid\u005c\u0022:\u005c\u0022\u005c\u005cu0022nw2\u005c\u005cu0022\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022frequency\u005c\u0022:0,\u005c\u0022arg2\u005c\u0022:0,\u005c\u0022priority\u005c\u0022:1},\u0022\n-\t \u0022{\u005c\u0022creds\u005c\u0022:{\u005c\u0022key1\u005c\u0022:\u005c\u0022\u005c\u005cu0022xxxxxxxxxxxxx\u005c\u005cu0022\u005c\u0022},\u0022\n-\t \u0022\u005c\u0022arg1\u005c\u0022:\u005c\u0022val2\u005c\u0022,\u005c\u0022ssid\u005c\u0022:\u005c\u0022\u005c\u005cu0022nw1\u005c\u005cu0022\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022frequency\u005c\u0022:11,\u005c\u0022arg2\u005c\u0022:1420887242594,\u005c\u0022priority\u005c\u0022:3}]}\u0022\n-;\n-\n-/*\n- * level 3: Credentials object\n- */\n-\n-typedef struct t2_cred {\n-\tconst char\t\t\t\t*key1;\n-\tconst char\t\t\t\t*key2;\n-} t2_cred_t;\n-\n-static const lws_struct_map_t lsm_t2_cred[] \u003d {\n-\tLSM_STRING_PTR\t(t2_cred_t, key1, \u0022key1\u0022),\n-\tLSM_STRING_PTR\t(t2_cred_t, key2, \u0022key2\u0022),\n-};\n-\n-/*\n- * level 2: Configuration object, containing a child credentials object\n- */\n-\n-typedef struct t2_config {\n-\tlws_dll2_t\t\t\t\tlist;\n-\tt2_cred_t \t\t\t\t*creds;\n-\tconst char\t\t\t\t*id1;\n-\tconst char\t\t\t\t*arg1;\n-\tconst char\t\t\t\t*ssid;\n-\tunsigned int\t\t\t\tfrequency;\n-\tunsigned long long\t\t\targ2;\n-\tunsigned int\t\t\t\tpriority;\n-} t2_config_t;\n-\n-static const lws_struct_map_t lsm_t2_config[] \u003d {\n-\tLSM_CHILD_PTR\t(t2_config_t,\n-\t\t\t creds,\t\t\t/* the child pointer member */\n-\t\t\t t2_cred_t,\t\t/* the child type */\n-\t\t\t NULL, lsm_t2_cred,\t/* map object for item type */\n-\t\t\t \u0022creds\u0022),\t\t/* outer json object name */\n-\tLSM_STRING_PTR\t(t2_config_t, id1, \t \u0022id1\u0022),\n-\tLSM_STRING_PTR\t(t2_config_t, arg1,\t \u0022arg1\u0022),\n-\tLSM_STRING_PTR\t(t2_config_t, ssid,\t \u0022ssid\u0022),\n-\n-\tLSM_UNSIGNED\t(t2_config_t, frequency, \u0022frequency\u0022),\n-\tLSM_UNSIGNED\t(t2_config_t, arg2,\t \u0022arg2\u0022),\n-\tLSM_UNSIGNED\t(t2_config_t, priority,\t \u0022priority\u0022),\n-};\n-\n-/*\n- * level 1: list-of-configurations object\n- */\n-\n-typedef struct t2_configs {\n-\tlws_dll2_owner_t \t\t\tconfigs;\n-} t2_configs_t;\n-\n-static const lws_struct_map_t lsm_t2_configs[] \u003d {\n-\tLSM_LIST\t(t2_configs_t, configs, /* the list owner type/member */\n-\t\t\t t2_config_t, list,\t/* the list item type/member */\n-\t\t\t NULL, lsm_t2_config,\t/* map object for item type */\n-\t\t\t \u0022config\u0022),\t\t/* outer json object name */\n-};\n-\n-/*\n- * For parsing, this lists the kind of object we expect to parse so the struct\n- * can be allocated polymorphically.\n- *\n- * Lws uses an explicit \u0022schema\u0022 member so the type is known unambiguously. If\n- * in the incoming JSON the first member is not \u0022schema\u0022, it will scan the\n- * maps listed here and instantiate the first object that has a member of that\n- * name.\n- */\n-\n-static const lws_struct_map_t lsm_schema[] \u003d {\n-\tLSM_SCHEMA\t(t2_configs_t, NULL, lsm_t2_configs, \u0022t2\u0022),\n-\t/* other schemata that might need parsing... */\n-};\n-\n-\n-\n-static int\n-t2_config_dump(struct lws_dll2 *d, void *user)\n-{\n-#if !defined(LWS_WITH_NO_LOGS)\n-\tt2_config_t *c \u003d lws_container_of(d, t2_config_t, list);\n-\n-\tlwsl_notice(\u0022%s: id1 '%s'\u005cn\u0022, __func__, c-\u003eid1);\n-\tlwsl_notice(\u0022%s: arg1 '%s'\u005cn\u0022, __func__, c-\u003earg1);\n-\tlwsl_notice(\u0022%s: ssid '%s'\u005cn\u0022, __func__, c-\u003essid);\n-\n-\tlwsl_notice(\u0022%s: freq %d\u005cn\u0022, __func__, c-\u003efrequency);\n-\tlwsl_notice(\u0022%s: arg2 %llu\u005cn\u0022, __func__, c-\u003earg2);\n-\tlwsl_notice(\u0022%s: priority %d\u005cn\u0022, __func__, c-\u003epriority);\n-\n-\tlwsl_notice(\u0022%s: key1: %s, key2: %s\u005cn\u0022, __func__,\n-\t\t\t c-\u003ecreds-\u003ekey1, c-\u003ecreds-\u003ekey2);\n-#endif\n-\n-\treturn 0;\n-}\n-\n-static int\n-t2_configs_dump(t2_configs_t *t2cs)\n-{\n-\tlwsl_notice(\u0022%s: number of configs: %d\u005cn\u0022, __func__,\n-\t\t t2cs-\u003econfigs.count);\n-\n-\tlws_dll2_foreach_safe(\u0026t2cs-\u003econfigs, NULL, t2_config_dump);\n-\n-\treturn 0;\n-}\n-\n-\n-int\n-test2(void)\n-{\n-\tlws_struct_serialize_t *ser;\n-\tstruct lejp_ctx ctx;\n-\tlws_struct_args_t a;\n-\tt2_configs_t *top;\n-\tuint8_t buf[4096];\n-\tsize_t written;\n-\tint n, bad \u003d 1;\n-\n-\tlwsl_notice(\u0022%s: start \u005cn\u0022, __func__);\n-\n-\tmemset(\u0026a, 0, sizeof(a));\n-\ta.map_st[0] \u003d lsm_schema;\n-\ta.map_entries_st[0] \u003d LWS_ARRAY_SIZE(lsm_schema);\n-\ta.ac_block_size \u003d 512;\n-\tlws_struct_json_init_parse(\u0026ctx, NULL, \u0026a);\n-\n-\tn \u003d lejp_parse(\u0026ctx, (uint8_t *)test2_json, (int)strlen(test2_json));\n-\tlwsl_notice(\u0022%s: lejp_parse %d\u005cn\u0022, __func__, n);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022%s: test2 JSON decode failed '%s'\u005cn\u0022,\n-\t\t\t\t__func__, lejp_error_to_string(n));\n-\t\tgoto bail;\n-\t}\n-\tlwsac_info(a.ac);\n-\n-\ttop \u003d (t2_configs_t *)a.dest; /* the top level object */\n-\n-\tif (!top) {\n-\t\tlwsl_err(\u0022%s: no top level object\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\tt2_configs_dump(top);\n-\n-\t/* 2. Let's reserialize the top level object and see what comes out */\n-\n-\tser \u003d lws_struct_json_serialize_create(\u0026lsm_schema[0], 1,\n-\t\t\t\t\t LSSERJ_FLAG_OMIT_SCHEMA, top);\n-\tif (!ser) {\n-\t\tlwsl_err(\u0022%s: unable to init serialization\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tdo {\n-\t\tn \u003d (int)lws_struct_json_serialize(ser, buf, sizeof(buf), \u0026written);\n-\t\tswitch (n) {\n-\t\tcase LSJS_RESULT_FINISH:\n-\t\t\tputs((const char *)buf);\n-\t\t\tbreak;\n-\t\tcase LSJS_RESULT_CONTINUE:\n-\t\tcase LSJS_RESULT_ERROR:\n-\t\t\tgoto bail;\n-\t\t}\n-\t} while (n \u003d\u003d LSJS_RESULT_CONTINUE);\n-\n-\tif (strcmp(test2_json_expected, (char *)buf)) {\n-\t\tlwsl_err(\u0022%s: expected %s\u005cn\u0022, __func__, test2_json_expected);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_struct_json_serialize_destroy(\u0026ser);\n-\n-\tbad \u003d 0;\n-\n-bail:\n-\tlwsac_free(\u0026a.ac);\n-\n-\treturn bad;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt b/minimal-examples/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt\ndeleted file mode 100644\nindex ac8b161..0000000\n--- a/minimal-examples/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt\n+++ /dev/null\n@@ -1,25 +0,0 @@\n-project(lws-api-test-lws_struct-sqlite C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-lws_struct-sqlite)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_STRUCT_SQLITE3 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\tadd_test(NAME api-test-lws_struct_sqlite COMMAND lws-api-test-lws_struct-sqlite)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared sqlite3 ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets sqlite3 ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lws_struct_sqlite/README.md b/minimal-examples/api-tests/api-test-lws_struct_sqlite/README.md\ndeleted file mode 100644\nindex aa2b6a8..0000000\n--- a/minimal-examples/api-tests/api-test-lws_struct_sqlite/README.md\n+++ /dev/null\n@@ -1,25 +0,0 @@\n-# lws api test lws_struct SQLITE\n-\n-Demonstrates how to use and performs selftests for lws_struct\n-SQLITE serialization and deserialization\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-lws_struct-sqlite\n-[2020/02/22 09:55:05:4335] U: LWS API selftest: lws_struct SQLite\n-[2020/02/22 09:55:05:5579] N: lws_struct_sq3_open: created _lws_apitest.sq3 owned by 0:0 mode 0600\n-[2020/02/22 09:55:05:9206] U: Completed: PASS\n-\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-lws_struct_sqlite/main.c b/minimal-examples/api-tests/api-test-lws_struct_sqlite/main.c\ndeleted file mode 100644\nindex f7c1d38..0000000\n--- a/minimal-examples/api-tests/api-test-lws_struct_sqlite/main.c\n+++ /dev/null\n@@ -1,204 +0,0 @@\n-/*\n- * lws-api-test-lws_struct-sqlite\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * lws_struct apis are used to serialize and deserialize your C structs and\n- * linked-lists in a standardized way that's very modest on memory but\n- * convenient and easy to maintain.\n- *\n- * The API test shows how to serialize and deserialize a struct with a linked-\n- * list of child structs in JSON using lws_struct APIs.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-typedef struct teststruct {\n-\tlws_dll2_t\t\tlist; /* not directly serialized */\n-\n-\tchar \t\t\tstr1[32];\n-\tconst char\t\t*str2;\n-\tuint8_t\t\t\tu8;\n-\tuint16_t\t\tu16;\n-\tuint32_t\t\tu32;\n-\tuint64_t\t\tu64;\n-\tint32_t\t\t\ts32;\n-} teststruct_t;\n-\n-/*\n- * These are the members that we will serialize and deserialize, not every\n- * member in the struct (eg, the dll2 list member)\n- */\n-\n-static const lws_struct_map_t lsm_teststruct[] \u003d {\n-\tLSM_CARRAY\t(teststruct_t, str1,\t\t\u0022str1\u0022),\n-\tLSM_STRING_PTR (teststruct_t, str2,\t\t\u0022str2\u0022),\n-\tLSM_UNSIGNED\t(teststruct_t, u8,\t\t\u0022u8\u0022),\n-\tLSM_UNSIGNED\t(teststruct_t, u16,\t\t\u0022u16\u0022),\n-\tLSM_UNSIGNED\t(teststruct_t, u32,\t\t\u0022u32\u0022),\n-\tLSM_UNSIGNED\t(teststruct_t, u64,\t\t\u0022u64\u0022),\n-\tLSM_SIGNED\t(teststruct_t, s32,\t\t\u0022s32\u0022),\n-};\n-\n-static const lws_struct_map_t lsm_schema_apitest[] \u003d {\n-\tLSM_SCHEMA_DLL2\t(teststruct_t, list, NULL, lsm_teststruct, \u0022apitest\u0022)\n-};\n-\n-static const char *test_string \u003d\n-\t\u0022No one would have believed in the last years of the nineteenth \u0022\n-\t\u0022century that this world was being watched keenly and closely by \u0022\n-\t\u0022intelligences greater than man's and yet as mortal as his own; that as \u0022\n-\t\u0022men busied themselves about their various concerns they were \u0022\n-\t\u0022scrutinised and studied, perhaps almost as narrowly as a man with a \u0022\n-\t\u0022microscope might scrutinise the transient creatures that swarm and \u0022\n-\t\u0022multiply in a drop of water. With infinite complacency men went to \u0022\n-\t\u0022and fro over this globe about their little affairs, serene in their \u0022\n-\t\u0022assurance of their empire over matter. It is possible that the \u0022\n-\t\u0022infusoria under the microscope do the same. No one gave a thought to \u0022\n-\t\u0022the older worlds of space as sources of human danger, or thought of \u0022\n-\t\u0022them only to dismiss the idea of life upon them as impossible or \u0022\n-\t\u0022improbable. It is curious to recall some of the mental habits of \u0022\n-\t\u0022those departed days. At most terrestrial men fancied there might be \u0022\n-\t\u0022other men upon Mars, perhaps inferior to themselves and ready to \u0022\n-\t\u0022welcome a missionary enterprise. Yet across the gulf of space, minds \u0022\n-\t\u0022that are to our minds as ours are to those of the beasts that perish, \u0022\n-\t\u0022intellects vast and cool and unsympathetic, regarded this earth with \u0022\n-\t\u0022envious eyes, and slowly and surely drew their plans against us. And \u0022\n-\t\u0022early in the twentieth century came the great disillusionment. \u0022;\n-\n-int main(int argc, const char **argv)\n-{\n-\tint e \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tstruct lwsac *ac \u003d NULL;\n-\tlws_dll2_owner_t resown;\n-\tteststruct_t ts, *pts;\n-\tconst char *p;\n-\tsqlite3 *db;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lws_struct SQLite\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\n-\tunlink(\u0022_lws_apitest.sq3\u0022);\n-\n-\tif (lws_struct_sq3_open(context, \u0022_lws_apitest.sq3\u0022, 1, \u0026db)) {\n-\t\tlwsl_err(\u0022%s: failed to open table\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* 1. populate the struct */\n-\n-\tmemset(\u0026ts, 0, sizeof(ts));\n-\n-\tlws_strncpy(ts.str1, \u0022hello\u0022, sizeof(ts.str1));\n-\tts.str2 \u003d test_string;\n-\tts.u8 \u003d 1;\n-\tts.u16 \u003d 512,\n-\tts.u32 \u003d 0x55aa1234; /* 1437209140, */\n-\tts.u64 \u003d 0x34abcdef01ull;\n-\tts.s32 \u003d -1;\n-\n-\t/* add our struct to the dll2 owner list */\n-\n-\tlws_dll2_owner_clear(\u0026resown);\n-\tlws_dll2_add_head(\u0026ts.list, \u0026resown);\n-\n-\t/* gratuitously create the table */\n-\n-\tif (lws_struct_sq3_create_table(db, lsm_schema_apitest)) {\n-\t\tlwsl_err(\u0022%s: Create table failed\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto done;\n-\t}\n-\n-\t/* serialize the items on the dll2 owner */\n-\n-\tif (lws_struct_sq3_serialize(db, lsm_schema_apitest, \u0026resown, 0)) {\n-\t\tlwsl_err(\u0022%s: Serialize failed\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto done;\n-\t}\n-\n-\t/* resown should be cleared by deserialize, ac is already NULL */\n-\n-\tlws_dll2_owner_clear(\u0026resown); /* make sure old resown data is gone */\n-\n-\tif (lws_struct_sq3_deserialize(db, NULL, NULL, lsm_schema_apitest,\n-\t\t\t\t \u0026resown, \u0026ac, 0, 1)) {\n-\t\tlwsl_err(\u0022%s: Deserialize failed\u005cn\u0022, __func__);\n-\t\te++;\n-\t\tgoto done;\n-\t}\n-\n-\t/* we should have 1 entry in resown now (created into the ac) */\n-\n-\tif (resown.count !\u003d 1) {\n-\t\tlwsl_err(\u0022%s: Expected 1 result got %d\u005cn\u0022, __func__,\n-\t\t\t\tresown.count);\n-\t\te++;\n-\t\tgoto done;\n-\t}\n-\n-\t/*\n-\t * Convert the pointer to the embedded lws_dll2 into a pointer\n-\t * to the actual struct with the correct type\n-\t */\n-\n-\tpts \u003d lws_container_of(lws_dll2_get_head(\u0026resown),\n-\t\t\t teststruct_t, list);\n-\n-\tif (strcmp(pts-\u003estr1, \u0022hello\u0022) ||\n-\t strcmp(pts-\u003estr2, test_string) ||\n-\t pts-\u003eu8 !\u003d 1 ||\n-\t pts-\u003eu16 !\u003d 512 ||\n-\t pts-\u003eu32 !\u003d 0x55aa1234 ||\n-\t pts-\u003eu64 !\u003d 0x34abcdef01ull ||\n-\t pts-\u003es32 !\u003d -1) {\n-\t\tlwsl_err(\u0022%s: unexpected deser values: %s\u005cn\u0022, __func__, pts-\u003estr1);\n-\t\tlwsl_err(\u0022%s: %s\u005cn\u0022, __func__, pts-\u003estr2);\n-\t\tlwsl_err(\u0022%s: %u %u %u 0x%llx %d\u005cn\u0022, __func__, pts-\u003eu8, pts-\u003eu16,\n-\t\t\t pts-\u003eu32, (unsigned long long)pts-\u003eu64, pts-\u003es32);\n-\n-\t\te++;\n-\t\tgoto done;\n-\t}\n-\n-done:\n-\tlwsac_free(\u0026ac);\n-\tlws_struct_sq3_close(\u0026db);\n-\n-\n-\tif (e)\n-\t\tgoto bail;\n-\n-\tlws_context_destroy(context);\n-\n-\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n-\n-\treturn 0;\n-\n-bail:\n-\tlws_context_destroy(context);\n-\n-\tlwsl_user(\u0022Completed: FAIL\u005cn\u0022);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lws_tokenize/CMakeLists.txt b/minimal-examples/api-tests/api-test-lws_tokenize/CMakeLists.txt\ndeleted file mode 100644\nindex 503f25d..0000000\n--- a/minimal-examples/api-tests/api-test-lws_tokenize/CMakeLists.txt\n+++ /dev/null\n@@ -1,19 +0,0 @@\n-project(lws-api-test-lws_tokenize C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-lws_tokenize)\n-set(SRCS main.c)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\tadd_test(NAME api-test-lws_tokenize COMMAND lws-api-test-lws_tokenize)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\ndiff --git a/minimal-examples/api-tests/api-test-lws_tokenize/README.md b/minimal-examples/api-tests/api-test-lws_tokenize/README.md\ndeleted file mode 100644\nindex a6b75ec..0000000\n--- a/minimal-examples/api-tests/api-test-lws_tokenize/README.md\n+++ /dev/null\n@@ -1,37 +0,0 @@\n-# lws api test lws_tokenize\n-\n-Performs selftests for lws_tokenize\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--s \u0022input string\u0022|String to tokenize\n--f 15|LWS_TOKENIZE_F_ flag values to apply to processing of -s \n-\n-```\n- $ ./lws-api-test-lws_tokenize\n-[2018/10/09 09:14:17:4834] USER: LWS API selftest: lws_tokenize\n-[2018/10/09 09:14:17:4835] USER: Completed: PASS: 6, FAIL: 0\n-```\n-\n-If the `-s string` option is given, the string is tokenized on stdout in\n-the format used to produce the tests in the sources\n-\n-```\n- $ ./lws-api-test-lws_tokenize -s \u0022hello: 1234,256\u0022\n-[2018/10/09 09:14:17:4834] USER: LWS API selftest: lws_tokenize\n-{ LWS_TOKZE_TOKEN_NAME_COLON, \u0022hello\u0022, 5 }\n-{ LWS_TOKZE_INTEGER, \u00221234\u0022, 4 }\n-{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 }\n-{ LWS_TOKZE_INTEGER, \u0022256\u0022, 3 }\n-{ LWS_TOKZE_ENDED, \u0022\u0022, 0 }\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-lws_tokenize/main.c b/minimal-examples/api-tests/api-test-lws_tokenize/main.c\ndeleted file mode 100644\nindex b9bbcea..0000000\n--- a/minimal-examples/api-tests/api-test-lws_tokenize/main.c\n+++ /dev/null\n@@ -1,779 +0,0 @@\n-/*\n- * lws-api-test-lws_tokenize\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates the most minimal http server you can make with lws.\n- *\n- * To keep it simple, it serves stuff from the subdirectory \n- * \u0022./mount-origin\u0022 of the directory it was started in.\n- * You can change that by changing mount.origin below.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003cstdio.h\u003e\n-\n-struct expected {\n-\tlws_tokenize_elem e;\n-\tconst char *value;\n-\tsize_t len;\n-};\n-\n-struct tests {\n-\tconst char *string;\n-\tstruct expected *exp;\n-\tint count;\n-\tint flags;\n-};\n-\n-struct expected expected1[] \u003d {\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022protocol-1\u0022, 10 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1},\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022protocol_2\u0022, 10 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1},\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022protocol3\u0022, 9 },\n-\t\t{ LWS_TOKZE_ENDED, NULL, 0 },\n-\t},\n-\texpected2[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN_NAME_COLON,\t\t\u0022Accept-Language\u0022, 15 },\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022fr-CH\u0022, 5 },\n-\t\t{ LWS_TOKZE_DELIMITER,\t\t\t\u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022fr\u0022, 2 },\n-\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022;\u0022, 1},\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022q\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_FLOAT,\t\t\u00220.9\u0022, 3 },\n-\t\t{ LWS_TOKZE_DELIMITER,\t\t\t\u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022en\u0022, 2 },\n-\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022;\u0022, 1},\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022q\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_FLOAT,\t\t\u00220.8\u0022, 3 },\n-\t\t{ LWS_TOKZE_DELIMITER,\t\t\t\u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022de\u0022, 2 },\n-\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022;\u0022, 1},\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022q\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_FLOAT,\t\t\u00220.7\u0022, 3 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022*\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_DELIMITER,\t\t\u0022;\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022q\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_FLOAT,\t\t\u00220.5\u0022, 3 },\n-\t\t{ LWS_TOKZE_ENDED, NULL, 0 },\n-\t},\n-\texpected3[] \u003d {\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS,\t\u0022quoted\u0022, 6 },\n-\t\t\t{ LWS_TOKZE_QUOTED_STRING,\t\u0022things:\u0022, 7 },\n-\t\t{ LWS_TOKZE_DELIMITER,\t\t\t\u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_INTEGER,\t\t\u00221234\u0022, 4 },\n-\t\t{ LWS_TOKZE_ENDED, NULL, 0 },\n-\t},\n-\texpected4[] \u003d {\n-\t\t{ LWS_TOKZE_ERR_COMMA_LIST,\t\t\u0022,\u0022, 1 },\n-\t},\n-\texpected5[] \u003d {\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022brokenlist2\u0022, 11 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t{ LWS_TOKZE_ERR_COMMA_LIST,\t\t\u0022,\u0022, 1 },\n-\t},\n-\texpected6[] \u003d {\n-\t\t\t{ LWS_TOKZE_TOKEN,\t\t\u0022brokenlist3\u0022, 11 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t{ LWS_TOKZE_ERR_COMMA_LIST,\t\t\u0022,\u0022, 1 },\n-\n-\t},\n-\texpected7[] \u003d {\n-\t\t\t{ LWS_TOKZE_TOKEN, \u0022fr\u0022, 2 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022-\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN, \u0022CH\u0022, 2 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN, \u0022fr\u0022, 2 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022;\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022q\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_FLOAT, \u00220.9\u0022, 3 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN, \u0022en\u0022, 2 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022;\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022q\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_FLOAT, \u00220.8\u0022, 3 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN, \u0022de\u0022, 2 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022;\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022q\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_FLOAT, \u00220.7\u0022, 3 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN, \u0022*\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_DELIMITER, \u0022;\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022q\u0022, 1 },\n-\t\t\t{ LWS_TOKZE_FLOAT, \u00220.5\u0022, 3 },\n-\t\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected8[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN, \u0022Οá½Ï‡á½¶\u0022, 10 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022ταá½Ï„á½°\u0022, 12 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022παÏίσταταί\u0022, 22 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022μοι\u0022, 6 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022γιγνώσκειν\u0022, 21 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022ὦ\u0022, 3 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022ἄνδÏες\u0022, 13 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022᾿Αθηναῖοι\u0022, 20 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022greek\u0022, 5 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected9[] \u003d {\n-\t\t/*\n-\t\t * because the tokenizer scans ahead for \u003d aggregation,\n-\t\t * it finds the broken utf8 before reporting the token\n-\t\t */\n-\t\t{ LWS_TOKZE_ERR_BROKEN_UTF8, \u0022\u0022, 0 },\n-\t},\n-\texpected10[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN, \u0022badutf8-2\u0022, 9 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022퟿\u0022, 3 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t{ LWS_TOKZE_ERR_BROKEN_UTF8, \u0022\u0022, 0 },\n-\t},\n-\texpected11[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN, \u00221.myserver\u0022, 10 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022.\u0022, 1 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022com\u0022, 3 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected12[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN, \u00221.myserver.com\u0022, 14 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected13[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN, \u00221.myserver.com\u0022, 14 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected14[] \u003d {\n-\t\t{ LWS_TOKZE_INTEGER, \u00221\u0022, 1 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022.\u0022, 1 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022myserver\u0022, 8 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022.\u0022, 1 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022com\u0022, 3 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected15[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN, \u0022close\u0022, 5 },\n-\t\t{ LWS_TOKZE_DELIMITER, \u0022,\u0022, 1 },\n-\t\t{ LWS_TOKZE_TOKEN, \u0022Upgrade\u0022, 7 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected16[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN_NAME_EQUALS, \u0022a\u0022, 1 },\n-\t\t{ LWS_TOKZE_TOKEN, \u00225\u0022, 1 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected17[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN, \u0022hello\u0022, 5 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t},\n-\texpected18[] \u003d {\n-\t\t{ LWS_TOKZE_TOKEN, \u0022x\u003dy\u0022, 3 },\n-\t\t{ LWS_TOKZE_ENDED, \u0022\u0022, 0 },\n-\t}\n-;\n-\n-struct tests tests[] \u003d {\n-\t{\n-\t\t\u0022 protocol-1, protocol_2\u005ct,\u005ctprotocol3\u005cn\u0022,\n-\t\texpected1, LWS_ARRAY_SIZE(expected1),\n-\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON\n-\t}, {\n-\t\t\u0022Accept-Language: fr-CH, fr;q\u003d0.9, en;q\u003d0.8, de;q\u003d0.7, *;q\u003d0.5\u0022,\n-\t\texpected2, LWS_ARRAY_SIZE(expected2),\n-\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON\n-\t}, {\n-\t\t\u0022quoted \u003d \u005c\u0022things:\u005c\u0022, 1234\u0022,\n-\t\texpected3, LWS_ARRAY_SIZE(expected3),\n-\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON\n-\t}, {\n-\t\t\u0022, brokenlist1\u0022,\n-\t\texpected4, LWS_ARRAY_SIZE(expected4),\n-\t\tLWS_TOKENIZE_F_COMMA_SEP_LIST\n-\t}, {\n-\t\t\u0022brokenlist2,,\u0022,\n-\t\texpected5, LWS_ARRAY_SIZE(expected5),\n-\t\tLWS_TOKENIZE_F_COMMA_SEP_LIST\n-\t}, {\n-\t\t\u0022brokenlist3,\u0022,\n-\t\texpected6, LWS_ARRAY_SIZE(expected6),\n-\t\tLWS_TOKENIZE_F_COMMA_SEP_LIST\n-\t}, {\n-\t\t\u0022fr-CH, fr;q\u003d0.9, en;q\u003d0.8, de;q\u003d0.7, *;q\u003d0.5\u0022,\n-\t\texpected7, LWS_ARRAY_SIZE(expected7),\n-\t\tLWS_TOKENIZE_F_ASTERISK_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS\n-\t},\n-\t{\n-\t\t\u0022 Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, greek\u0022,\n-\t\texpected8, LWS_ARRAY_SIZE(expected8),\n-\t\tLWS_TOKENIZE_F_RFC7230_DELIMS\n-\t},\n-\t{\n-\t\t\u0022badutf8-1 \u005cx80...\u0022,\n-\t\texpected9, LWS_ARRAY_SIZE(expected9),\n-\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS\n-\t},\n-\t{\n-\t\t\u0022badutf8-2 \u005cxed\u005cx9f\u005cxbf,\u005cx80...\u0022,\n-\t\texpected10, LWS_ARRAY_SIZE(expected10),\n-\t\tLWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS\n-\t},\n-\t{\n-\t\t\u00221.myserver.com\u0022,\n-\t\texpected11, LWS_ARRAY_SIZE(expected11),\n-\t\t0\n-\t},\n-\t{\n-\t\t\u00221.myserver.com\u0022,\n-\t\texpected12, LWS_ARRAY_SIZE(expected12),\n-\t\tLWS_TOKENIZE_F_DOT_NONTERM\n-\t},\n-\t{\n-\t\t\u00221.myserver.com\u0022,\n-\t\texpected13, LWS_ARRAY_SIZE(expected13),\n-\t\tLWS_TOKENIZE_F_DOT_NONTERM | LWS_TOKENIZE_F_NO_FLOATS\n-\t},\n-\t{\n-\t\t\u00221.myserver.com\u0022,\n-\t\texpected14, LWS_ARRAY_SIZE(expected14),\n-\t\tLWS_TOKENIZE_F_NO_FLOATS\n-\t},\n-\t{\n-\t\t\u0022close, Upgrade\u0022,\n-\t\texpected15, LWS_ARRAY_SIZE(expected15),\n-\t\tLWS_TOKENIZE_F_COMMA_SEP_LIST\n-\t},\n-\t{\n-\t\t\u0022a\u003d5\u0022, expected16, LWS_ARRAY_SIZE(expected16),\n-\t\tLWS_TOKENIZE_F_NO_INTEGERS\n-\t},\n-\t{\n-\t\t\u0022# comment1\u005cr\u005cnhello #comment2\u005cr\u005cn#comment3\u0022, expected17,\n-\t\tLWS_ARRAY_SIZE(expected17), LWS_TOKENIZE_F_HASH_COMMENT\n-\t},\n-\t{\n-\t\t\u0022x\u003dy\u0022, expected18,\n-\t\tLWS_ARRAY_SIZE(expected18), LWS_TOKENIZE_F_EQUALS_NONTERM\n-\t}\n-};\n-\n-/*\n- * add LWS_TOKZE_ERRS to the element index (which may be negative by that\n- * amount) to index this array\n- */\n-\n-static const char *element_names[] \u003d {\n-\t\u0022LWS_TOKZE_ERR_BROKEN_UTF8\u0022,\n-\t\u0022LWS_TOKZE_ERR_UNTERM_STRING\u0022,\n-\t\u0022LWS_TOKZE_ERR_MALFORMED_FLOAT\u0022,\n-\t\u0022LWS_TOKZE_ERR_NUM_ON_LHS\u0022,\n-\t\u0022LWS_TOKZE_ERR_COMMA_LIST\u0022,\n-\t\u0022LWS_TOKZE_ENDED\u0022,\n-\t\u0022LWS_TOKZE_DELIMITER\u0022,\n-\t\u0022LWS_TOKZE_TOKEN\u0022,\n-\t\u0022LWS_TOKZE_INTEGER\u0022,\n-\t\u0022LWS_TOKZE_FLOAT\u0022,\n-\t\u0022LWS_TOKZE_TOKEN_NAME_EQUALS\u0022,\n-\t\u0022LWS_TOKZE_TOKEN_NAME_COLON\u0022,\n-\t\u0022LWS_TOKZE_QUOTED_STRING\u0022,\n-};\n-\n-\n-int\n-exp_cb1(void *priv, const char *name, char *out, size_t *pos, size_t olen,\n-\tsize_t *exp_ofs)\n-{\n-\tconst char *replace \u003d NULL;\n-\tsize_t total, budget;\n-\n-\tif (!strcmp(name, \u0022test\u0022)) {\n-\t\treplace \u003d \u0022replacement_string\u0022;\n-\t\ttotal \u003d strlen(replace);\n-\t\tgoto expand;\n-\t}\n-\n-\treturn LSTRX_FATAL_NAME_UNKNOWN;\n-\n-expand:\n-\tbudget \u003d olen - *pos;\n-\ttotal -\u003d *exp_ofs;\n-\tif (total \u003c budget)\n-\t\tbudget \u003d total;\n-\n-\tif (out)\n-\t\tmemcpy(out + *pos, replace + (*exp_ofs), budget);\n-\t*exp_ofs +\u003d budget;\n-\t*pos +\u003d budget;\n-\n-\tif (budget \u003d\u003d total)\n-\t\treturn LSTRX_DONE;\n-\n-\treturn LSTRX_FILLED_OUT;\n-}\n-\n-static const char *exp_inp1 \u003d \u0022this-is-a-${test}-for-strexp\u0022;\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *cx;\n-\tstruct lws_tokenize ts;\n-\tlws_tokenize_elem e;\n-\tconst char *p;\n-\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n-\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n-\t\t\t * lws must have been configured and built with\n-\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n-\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n-\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n-\t\t\t/* | LLL_DEBUG */;\n-\tint fail \u003d 0, ok \u003d 0, flags \u003d 0;\n-\tchar dotstar[512];\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lws_tokenize\u005cn\u0022);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-f\u0022)))\n-\t\tflags \u003d atoi(p);\n-\n-\n-\tmemset(\u0026info, 0, sizeof info);\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n-\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;\n-\n-\t/*\n-\t * since we know this lws context is only ever going to be used with\n-\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n-\t * have to use the default allocations for fd tables up to ulimit -n.\n-\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n-\t * will use.\n-\t */\n-\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n-\n-#if 0\n-#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n-\t/*\n-\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n-\t * CA to trust explicitly.\n-\t */\n-\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n-#endif\n-#endif\n-#if 0\n-\tn \u003d open(\u0022./warmcat.com.cer\u0022, O_RDONLY);\n-\tif (n \u003e\u003d 0) {\n-\t\tinfo.client_ssl_ca_mem_len \u003d read(n, memcert, sizeof(memcert));\n-\t\tinfo.client_ssl_ca_mem \u003d memcert;\n-\t\tclose(n);\n-\t\tn \u003d 0;\n-\t\tmemcert[info.client_ssl_ca_mem_len++] \u003d '\u005c0';\n-\t}\n-#endif\n-\tcx \u003d lws_create_context(\u0026info);\n-\n-\t/* lws_strexp */\n-\n-\t{\n-\t\tsize_t in_len, used_in, used_out;\n-\t\tlws_strexp_t exp;\n-\t\tchar obuf[128];\n-\t\tconst char *p;\n-\n-\t\tobuf[0] \u003d '\u005c0';\n-\t\tlws_strexp_init(\u0026exp, NULL, exp_cb1, obuf, sizeof(obuf));\n-\t\tn \u003d lws_strexp_expand(\u0026exp, exp_inp1, 28, \u0026used_in, \u0026used_out);\n-\t\tif (n !\u003d LSTRX_DONE || used_in !\u003d 28 ||\n-\t\t strcmp(obuf, \u0022this-is-a-replacement_string-for-strexp\u0022)) {\n-\t\t\tlwsl_notice(\u0022%s: obuf %s\u005cn\u0022, __func__, obuf);\n-\t\t\tlwsl_err(\u0022%s: lws_strexp test 1 failed: %d\u005cn\u0022, __func__, n);\n-\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\t/* as above, but don't generate output, just find the length */\n-\n-\t\tlws_strexp_init(\u0026exp, NULL, exp_cb1, NULL, (size_t)-1);\n-\t\tn \u003d lws_strexp_expand(\u0026exp, exp_inp1, 28, \u0026used_in, \u0026used_out);\n-\t\tif (n !\u003d LSTRX_DONE || used_in !\u003d 28 || used_out !\u003d 39) {\n-\t\t\tlwsl_err(\u0022%s: lws_strexp test 2 failed: %d, used_out: %d\u005cn\u0022,\n-\t\t\t\t\t__func__, n, (int)used_out);\n-\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tp \u003d exp_inp1;\n-\t\tin_len \u003d strlen(p);\n-\t\tmemset(obuf, 0, sizeof(obuf));\n-\t\tlws_strexp_init(\u0026exp, NULL, exp_cb1, obuf, 16);\n-\t\tn \u003d lws_strexp_expand(\u0026exp, p, in_len, \u0026used_in, \u0026used_out);\n-\t\tif (n !\u003d LSTRX_FILLED_OUT || used_in !\u003d 16 || used_out !\u003d 16) {\n-\t\t\tlwsl_err(\u0022a\u005cn\u0022);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tp +\u003d used_in;\n-\t\tin_len -\u003d used_in;\n-\n-\t\tmemset(obuf, 0, sizeof(obuf));\n-\t\tlws_strexp_reset_out(\u0026exp, obuf, 16);\n-\n-\t\tn \u003d lws_strexp_expand(\u0026exp, p, in_len, \u0026used_in, \u0026used_out);\n-\t\tif (n !\u003d LSTRX_FILLED_OUT || used_in !\u003d 5 || used_out !\u003d 16) {\n-\t\t\tlwsl_err(\u0022b: n %d, used_in %d, used_out %d\u005cn\u0022, n,\n-\t\t\t\t\t(int)used_in, (int)used_out);\n-\t\t\treturn 2;\n-\t\t}\n-\n-\t\tp +\u003d used_in;\n-\t\tin_len -\u003d used_in;\n-\n-\t\tmemset(obuf, 0, sizeof(obuf));\n-\t\tlws_strexp_reset_out(\u0026exp, obuf, 16);\n-\n-\t\tn \u003d lws_strexp_expand(\u0026exp, p, in_len, \u0026used_in, \u0026used_out);\n-\t\tif (n !\u003d LSTRX_DONE || used_in !\u003d 7 || used_out !\u003d 7) {\n-\t\t\tlwsl_err(\u0022c: n %d, used_in %d, used_out %d\u005cn\u0022, n, (int)used_in, (int)used_out);\n-\t\t\treturn 2;\n-\t\t}\n-\t}\n-\n-\t/* sanity check lws_strnncpy() */\n-\n-\tlws_strnncpy(dotstar, \u002212345678\u0022, 4, sizeof(dotstar));\n-\tif (strcmp(dotstar, \u00221234\u0022)) {\n-\t\tlwsl_err(\u0022%s: lws_strnncpy check failed\u005cn\u0022, __func__);\n-\n-\t\treturn 1;\n-\t}\n-\tlws_strnncpy(dotstar, \u002212345678\u0022, 8, 6);\n-\tif (strcmp(dotstar, \u002212345\u0022)) {\n-\t\tlwsl_err(\u0022%s: lws_strnncpy check failed\u005cn\u0022, __func__);\n-\n-\t\treturn 1;\n-\t}\n-\n-\t/* sanity check lws_nstrstr() */\n-\n-\t{\n-\t\tstatic const char *t1 \u003d \u0022abc123456\u0022;\n-\t\tconst char *mcp;\n-\n-\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u0022abc\u0022, 3);\n-\t\tif (mcp !\u003d t1) {\n-\t\t\tlwsl_err(\u0022%s: lws_nstrstr 1 failed\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u0022def\u0022, 3);\n-\t\tif (mcp !\u003d NULL) {\n-\t\t\tlwsl_err(\u0022%s: lws_nstrstr 2 failed\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u0022456\u0022, 3);\n-\t\tif (mcp !\u003d t1 + 6) {\n-\t\t\tlwsl_err(\u0022%s: lws_nstrstr 3 failed: %p\u005cn\u0022, __func__, mcp);\n-\t\t\treturn 1;\n-\t\t}\n-\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u00221\u0022, 1);\n-\t\tif (mcp !\u003d t1 + 3) {\n-\t\t\tlwsl_err(\u0022%s: lws_nstrstr 4 failed\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\t\tmcp \u003d lws_nstrstr(t1, strlen(t1), \u0022abc1234567\u0022, 10);\n-\t\tif (mcp !\u003d NULL) {\n-\t\t\tlwsl_err(\u0022%s: lws_nstrstr 5 failed\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\t}\n-\n-\t/* sanity check lws_json_simple_find() */\n-\n-\t{\n-\t\tstatic const char *t1 \u003d \u0022{\u005c\u0022myname1\u005c\u0022:true,\u0022\n-\t\t\t\t\t \u0022\u005c\u0022myname2\u005c\u0022:\u005c\u0022string\u005c\u0022, \u0022\n-\t\t\t\t\t \u0022\u005c\u0022myname3\u005c\u0022: 123}\u0022;\n-\t\tsize_t alen;\n-\t\tconst char *mcp;\n-\n-\t\tmcp \u003d lws_json_simple_find(t1, strlen(t1), \u0022\u005c\u0022myname1\u005c\u0022:\u0022, \u0026alen);\n-\t\tif (mcp !\u003d t1 + 11 || alen !\u003d 4) {\n-\t\t\tlwsl_err(\u0022%s: lws_json_simple_find 1 failed: (%d) %s\u005cn\u0022,\n-\t\t\t\t __func__, (int)alen, mcp);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tmcp \u003d lws_json_simple_find(t1, strlen(t1), \u0022\u005c\u0022myname2\u005c\u0022:\u0022, \u0026alen);\n-\t\tif (mcp !\u003d t1 + 27 || alen !\u003d 6) {\n-\t\t\tlwsl_err(\u0022%s: lws_json_simple_find 2 failed\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tmcp \u003d lws_json_simple_find(t1, strlen(t1), \u0022\u005c\u0022myname3\u005c\u0022:\u0022, \u0026alen);\n-\t\tif (mcp !\u003d t1 + 47 || alen !\u003d 3) {\n-\t\t\tlwsl_err(\u0022%s: lws_json_simple_find 3 failed\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tmcp \u003d lws_json_simple_find(t1, strlen(t1), \u0022\u005c\u0022nope\u005c\u0022:\u0022, \u0026alen);\n-\t\tif (mcp !\u003d NULL) {\n-\t\t\tlwsl_err(\u0022%s: lws_json_simple_find 4 failed\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\t}\n-\n-\tp \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022);\n-\n-\tfor (n \u003d 0; n \u003c (int)LWS_ARRAY_SIZE(tests); n++) {\n-\t\tint m \u003d 0, in_fail \u003d fail;\n-\t\tstruct expected *exp \u003d tests[n].exp;\n-\n-\t\tmemset(\u0026ts, 0, sizeof(ts));\n-\t\tts.start \u003d tests[n].string;\n-\t\tts.len \u003d strlen(ts.start);\n-\t\tts.flags \u003d (uint16_t)tests[n].flags;\n-\n-\t\tdo {\n-\t\t\te \u003d lws_tokenize(\u0026ts);\n-\n-\t\t\tlws_strnncpy(dotstar, ts.token, ts.token_len,\n-\t\t\t\t sizeof(dotstar));\n-\t\t\tlwsl_info(\u0022{ %s, \u005c\u0022%s\u005c\u0022, %d }\u005cn\u0022,\n-\t\t\t\t element_names[e + LWS_TOKZE_ERRS], dotstar,\n-\t\t\t\t (int)ts.token_len);\n-\n-\t\t\tif (m \u003d\u003d (int)tests[n].count) {\n-\t\t\t\tlwsl_notice(\u0022fail: expected end earlier\u005cn\u0022);\n-\t\t\t\tfail++;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\n-\t\t\tif (e !\u003d exp-\u003ee) {\n-\t\t\t\tlwsl_notice(\u0022fail... tok %s vs expected %s\u005cn\u0022,\n-\t\t\t\t\telement_names[e + LWS_TOKZE_ERRS],\n-\t\t\t\t\telement_names[exp-\u003ee + LWS_TOKZE_ERRS]);\n-\t\t\t\tfail++;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\n-\t\t\tif (e \u003e 0 \u0026\u0026\n-\t\t\t (ts.token_len !\u003d exp-\u003elen ||\n-\t\t\t memcmp(exp-\u003evalue, ts.token, exp-\u003elen))) {\n-\t\t\t\tlws_strnncpy(dotstar, ts.token, ts.token_len,\n-\t\t\t\t\t sizeof(dotstar));\n-\t\t\t\tlwsl_notice(\u0022fail token mismatch %d %d %s\u005cn\u0022,\n-\t\t\t\t\t (int)ts.token_len, (int)exp-\u003elen,\n-\t\t\t\t\t dotstar);\n-\t\t\t\tfail++;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\n-\t\t\tm++;\n-\t\t\texp++;\n-\n-\t\t} while (e \u003e 0);\n-\n-\t\tif (fail \u003d\u003d in_fail)\n-\t\t\tok++;\n-\t}\n-\n-\tif (p) {\n-\t\tts.start \u003d p;\n-\t\tts.len \u003d strlen(p);\n-\t\tts.flags \u003d (uint16_t)flags;\n-\n-\t\tprintf(\u0022\u005ct{\u005cn\u005ct\u005ct\u005c\u0022%s\u005c\u0022,\u005cn\u0022\n-\t\t \u0022\u005ct\u005ctexpected%d, LWS_ARRAY_SIZE(expected%d),\u005cn\u005ct\u005ct\u0022,\n-\t\t p, (int)LWS_ARRAY_SIZE(tests) + 1,\n-\t\t (int)LWS_ARRAY_SIZE(tests) + 1);\n-\n-\t\tif (!flags)\n-\t\t\tprintf(\u00220\u005cn\u005ct},\u005cn\u0022);\n-\t\telse {\n-\t\t\tif (flags \u0026 LWS_TOKENIZE_F_MINUS_NONTERM)\n-\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_MINUS_NONTERM\u0022);\n-\t\t\tif (flags \u0026 LWS_TOKENIZE_F_AGG_COLON) {\n-\t\t\t\tif (flags \u0026 1)\n-\t\t\t\t\tprintf(\u0022 | \u0022);\n-\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_AGG_COLON\u0022);\n-\t\t\t}\n-\t\t\tif (flags \u0026 LWS_TOKENIZE_F_COMMA_SEP_LIST) {\n-\t\t\t\tif (flags \u0026 3)\n-\t\t\t\t\tprintf(\u0022 | \u0022);\n-\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_COMMA_SEP_LIST\u0022);\n-\t\t\t}\n-\t\t\tif (flags \u0026 LWS_TOKENIZE_F_RFC7230_DELIMS) {\n-\t\t\t\tif (flags \u0026 7)\n-\t\t\t\t\tprintf(\u0022 | \u0022);\n-\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_RFC7230_DELIMS\u0022);\n-\t\t\t}\n-\t\t\tif (flags \u0026 LWS_TOKENIZE_F_DOT_NONTERM) {\n-\t\t\t\tif (flags \u0026 15)\n-\t\t\t\t\tprintf(\u0022 | \u0022);\n-\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_DOT_NONTERM\u0022);\n-\t\t\t}\n-\t\t\tif (flags \u0026 LWS_TOKENIZE_F_NO_FLOATS) {\n-\t\t\t\tif (flags \u0026 31)\n-\t\t\t\t\tprintf(\u0022 | \u0022);\n-\t\t\t\tprintf(\u0022LWS_TOKENIZE_F_NO_FLOATS\u0022);\n-\t\t\t}\n-\t\t\tprintf(\u0022\u005cn\u005ct},\u005cn\u0022);\n-\t\t}\n-\n-\t\tprintf(\u0022\u005ctexpected%d[] \u003d {\u005cn\u0022, (int)LWS_ARRAY_SIZE(tests) + 1);\n-\n-\t\tdo {\n-\t\t\te \u003d lws_tokenize(\u0026ts);\n-\n-\t\t\tlws_strnncpy(dotstar, ts.token, ts.token_len,\n-\t\t\t\t sizeof(dotstar));\n-\n-\t\t\tprintf(\u0022\u005ct\u005ct{ %s, \u005c\u0022%s\u005c\u0022, %d },\u005cn\u0022,\n-\t\t\t\t element_names[e + LWS_TOKZE_ERRS],\n-\t\t\t\t dotstar, (int)ts.token_len);\n-\n-\t\t} while (e \u003e 0);\n-\n-\t\tprintf(\u0022\u005ct}\u005cn\u0022);\n-\t}\n-\n-#if defined(LWS_ROLE_H1) || defined(LWS_ROLE_H2)\n-\t{\n-\t\ttime_t t;\n-\n-\t\tif (lws_http_date_parse_unix(\u0022Tue, 15 Nov 1994 08:12:31 GMT\u0022, 29, \u0026t)) {\n-\t\t\tlwsl_err(\u0022%s: date parse failed\u005cn\u0022, __func__);\n-\t\t\tfail++;\n-\t\t} else {\n-\t\t\t/* lwsl_notice(\u0022%s: %llu\u005cn\u0022, __func__, (unsigned long long)t); */\n-\t\t\tif (t !\u003d (time_t)784887151) {\n-\t\t\t\tlwsl_err(\u0022%s: date parse wrong\u005cn\u0022, __func__);\n-\t\t\t\tfail++;\n-\t\t\t} else {\n-\t\t\t\tchar s[30];\n-\n-\t\t\t\tif (lws_http_date_render_from_unix(s, sizeof(s), \u0026t)) {\n-\t\t\t\t\tlwsl_err(\u0022%s: failed date render\u005cn\u0022, __func__);\n-\t\t\t\t\tfail++;\n-\t\t\t\t} else {\n-\t\t\t\t\tif (!strcmp(s, \u0022Tue, 15 Nov 1994 08:12:31 GMT\u0022)) {\n-\t\t\t\t\t\tlwsl_err(\u0022%s: date render wrong\u005cn\u0022, __func__);\n-\t\t\t\t\t\tfail++;\n-\t\t\t\t\t}\n-\t\t\t\t}\n-\t\t\t}\n-\t\t}\n-\t}\n-#endif\n-\n-\t{\n-\t\tchar buf[24];\n-\t\tint m;\n-\n-\t\tm \u003d lws_humanize(buf, sizeof(buf), 0, humanize_schema_si);\n-\t\tif (m !\u003d 1 || strcmp(buf, \u00220\u0022)) {\n-\t\t\tlwsl_user(\u0022%s: humanize 1 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n-\t\t\tfail++;\n-\t\t}\n-\t\tm \u003d lws_humanize(buf, sizeof(buf), 2, humanize_schema_si);\n-\t\tif (m !\u003d 1 || strcmp(buf, \u00222\u0022)) {\n-\t\t\tlwsl_user(\u0022%s: humanize 2 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n-\t\t\tfail++;\n-\t\t}\n-\t\tm \u003d lws_humanize(buf, sizeof(buf), 999, humanize_schema_si);\n-\t\tif (m !\u003d 3 || strcmp(buf, \u0022999\u0022)) {\n-\t\t\tlwsl_user(\u0022%s: humanize 3 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n-\t\t\tfail++;\n-\t\t}\n-\t\tm \u003d lws_humanize(buf, sizeof(buf), 1000, humanize_schema_si);\n-\t\tif (m !\u003d 4 || strcmp(buf, \u00221000\u0022)) {\n-\t\t\tlwsl_user(\u0022%s: humanize 4 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n-\t\t\tfail++;\n-\t\t}\n-\t\tm \u003d lws_humanize(buf, sizeof(buf), 1024, humanize_schema_si);\n-\t\tif (m !\u003d 7 || strcmp(buf, \u00221.000Ki\u0022)) {\n-\t\t\tlwsl_user(\u0022%s: humanize 5 fail '%s' (%d)\u005cn\u0022, __func__, buf, m);\n-\t\t\tfail++;\n-\t\t}\n-\t}\n-\n-\tif (lws_strcmp_wildcard(\u0022allied\u0022, 6, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 1 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022a*\u0022, 2, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 2 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022all*\u0022, 4, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 3 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022all*d\u0022, 5, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 4 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (!lws_strcmp_wildcard(\u0022b*\u0022, 2, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 5 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (!lws_strcmp_wildcard(\u0022b*ed\u0022, 4, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 6 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (!lws_strcmp_wildcard(\u0022allie\u0022, 5, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 7 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022allie*\u0022, 6, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 8 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022*llie*\u0022, 6, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 9 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022*llied\u0022, 6, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 10 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (!lws_strcmp_wildcard(\u0022*llie\u0022, 5, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 11 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (!lws_strcmp_wildcard(\u0022*nope\u0022, 5, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 12 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022*li*\u0022, 4, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 13 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022*\u0022, 1, \u0022allied\u0022, 6)) {\n-\t\tlwsl_user(\u0022%s: wc 14 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022*abc*d\u0022, 6, \u0022xxabyyabcdd\u0022, 11)) {\n-\t\tlwsl_user(\u0022%s: wc 15 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\tif (lws_strcmp_wildcard(\u0022ssproxy.n.cn.*\u0022, 14,\n-\t\t\t\t\u0022ssproxy.n.cn.failures\u0022, 21)) {\n-\t\tlwsl_user(\u0022%s: wc 16 fail\u005cn\u0022, __func__);\n-\t\tfail++;\n-\t}\n-\n-\tlwsl_user(\u0022Completed: PASS: %d, FAIL: %d\u005cn\u0022, ok, fail);\n-\n-\tlws_context_destroy(cx);\n-\n-\treturn !(ok \u0026\u0026 !fail);\n-}\ndiff --git a/minimal-examples/api-tests/api-test-lwsac/CMakeLists.txt b/minimal-examples/api-tests/api-test-lwsac/CMakeLists.txt\ndeleted file mode 100644\nindex f7d0aaf..0000000\n--- a/minimal-examples/api-tests/api-test-lwsac/CMakeLists.txt\n+++ /dev/null\n@@ -1,19 +0,0 @@\n-project(lws-api-test-lwsac C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-api-test-lwsac)\n-set(SRCS main.c)\n-\n-add_executable(${SAMP} ${SRCS})\n-add_test(NAME api-test-lwsac COMMAND lws-api-test-lwsac)\n-\n-if (websockets_shared)\n-\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\tadd_dependencies(${SAMP} websockets_shared)\n-else()\n-\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-lwsac/README.md b/minimal-examples/api-tests/api-test-lwsac/README.md\ndeleted file mode 100644\nindex 74034c7..0000000\n--- a/minimal-examples/api-tests/api-test-lwsac/README.md\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-# lws api test lwsac\n-\n-Demonstrates how to use and performs selftests for lwsac\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-lwsac\n-[2018/10/09 09:14:17:4834] USER: LWS API selftest: lwsac\n-[2018/10/09 09:14:17:4835] USER: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-lwsac/main.c b/minimal-examples/api-tests/api-test-lwsac/main.c\ndeleted file mode 100644\nindex 0ea0aa4..0000000\n--- a/minimal-examples/api-tests/api-test-lwsac/main.c\n+++ /dev/null\n@@ -1,83 +0,0 @@\n-/*\n- * lws-api-test-lwsac\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-struct mytest {\n-\tint payload;\n-\t/* notice doesn't have to be at start of struct */\n-\tlws_list_ptr list_next;\n-\t/* a struct can appear on multiple lists too... */\n-};\n-\n-/* converts a ptr to struct mytest .list_next to a ptr to struct mytest */\n-#define list_to_mytest(p) lws_list_ptr_container(p, struct mytest, list_next)\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, acc;\n-\tlws_list_ptr list_head \u003d NULL, iter;\n-\tstruct lwsac *lwsac \u003d NULL;\n-\tstruct mytest *m;\n-\tconst char *p;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: lwsac\u005cn\u0022);\n-\n-\t/*\n-\t * 1) allocate and create 1000 struct mytest in a linked-list\n-\t */\n-\n-\tfor (n \u003d 0; n \u003c 1000; n++) {\n-\t\tm \u003d lwsac_use(\u0026lwsac, sizeof(*m), 0);\n-\t\tif (!m)\n-\t\t\treturn -1;\n-\t\tm-\u003epayload \u003d n;\n-\n-\t\tlws_list_ptr_insert(\u0026list_head, \u0026m-\u003elist_next, NULL);\n-\t}\n-\n-\t/*\n-\t * 2) report some debug info about the lwsac state... those 1000\n-\t * allocations actually only required 4 mallocs\n-\t */\n-\n-\tlwsac_info(lwsac);\n-\n-\t/* 3) iterate the list, accumulating the payloads */\n-\n-\tacc \u003d 0;\n-\titer \u003d list_head;\n-\twhile (iter) {\n-\t\tm \u003d list_to_mytest(iter);\n-\t\tacc +\u003d m-\u003epayload;\n-\n-\t\tlws_list_ptr_advance(iter);\n-\t}\n-\n-\tif (acc !\u003d 499500) {\n-\t\tlwsl_err(\u0022%s: FAIL acc %d\u005cn\u0022, __func__, acc);\n-\n-\t\treturn 1;\n-\t}\n-\n-\t/*\n-\t * 4) deallocate everything (lwsac is also set to NULL). It just\n-\t * deallocates the 4 mallocs, everything in there is gone accordingly\n-\t */\n-\n-\tlwsac_free(\u0026lwsac);\n-\n-\tlwsl_user(\u0022Completed: PASS\u005cn\u0022);\n-\n-\treturn 0;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-secure-streams/CMakeLists.txt b/minimal-examples/api-tests/api-test-secure-streams/CMakeLists.txt\ndeleted file mode 100644\nindex b4f39ca..0000000\n--- a/minimal-examples/api-tests/api-test-secure-streams/CMakeLists.txt\n+++ /dev/null\n@@ -1,31 +0,0 @@\n-project(lws-api-test-secure-streams C)\n-cmake_minimum_required(VERSION 2.8.12)\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n-require_lws_config(LWS_WITH_TLS 1 requirements)\n-require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n-require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${PROJECT_NAME} main.c)\n-\t\n-\tif (LWS_CTEST_INTERNET_AVAILABLE)\n-\t\tadd_test(NAME api-test-secure-streams COMMAND ${PROJECT_NAME})\n-\t\tset_tests_properties(api-test-secure-streams\n-\t\t\t\t PROPERTIES\n-\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/api-tests/api-test-secure-streams\n-\t\t\t\t TIMEOUT 20)\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-secure-streams/README.md b/minimal-examples/api-tests/api-test-secure-streams/README.md\ndeleted file mode 100644\nindex a5a220a..0000000\n--- a/minimal-examples/api-tests/api-test-secure-streams/README.md\n+++ /dev/null\n@@ -1,21 +0,0 @@\n-# lws api test Secure Streams\n-\n-Performs some tests against httpbin.org server\n-to check Secure Streams client performance\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-```\n- $ ./lws-api-test-secure-streams\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-secure-streams/main.c b/minimal-examples/api-tests/api-test-secure-streams/main.c\ndeleted file mode 100644\nindex 841cd1a..0000000\n--- a/minimal-examples/api-tests/api-test-secure-streams/main.c\n+++ /dev/null\n@@ -1,387 +0,0 @@\n-/*\n- * lws-api-test-secure-streams\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * Let's exercise some basic SS / h1 functionality against httpbin.org\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, bad \u003d 1;\n-static lws_state_notify_link_t nl;\n-static struct lws_context *context;\n-\n-static const char * const default_ss_policy \u003d\n-\t\u0022{\u0022\n-\t \u0022\u005c\u0022release\u005c\u0022:\u0022\t\t\t\u0022\u005c\u002201234567\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022product\u005c\u0022:\u0022\t\t\t\u0022\u005c\u0022myproduct\u005c\u0022,\u0022\n-\t \u0022\u005c\u0022schema-version\u005c\u0022:\u0022\t\t\t\u00221,\u0022\n-#if defined(VIA_LOCALHOST_SOCKS)\n-\t \u0022\u005c\u0022via-socks5\u005c\u0022:\u0022 \u0022\u005c\u0022127.0.0.1:1080\u005c\u0022,\u0022\n-#endif\n-\n-\t \u0022\u005c\u0022retry\u005c\u0022: [\u0022\t/* named backoff / retry strategies */\n-\t\t\u0022{\u005c\u0022default\u005c\u0022: {\u0022\n-\t\t\t\u0022\u005c\u0022backoff\u005c\u0022: [\u0022\t \u00221000,\u0022\n-\t\t\t\t\t\t \u00222000,\u0022\n-\t\t\t\t\t\t \u00223000,\u0022\n-\t\t\t\t\t\t \u00225000,\u0022\n-\t\t\t\t\t\t\u002210000\u0022\n-\t\t\t\t\u0022],\u0022\n-\t\t\t\u0022\u005c\u0022conceal\u005c\u0022:\u0022\t\t\u00225,\u0022\n-\t\t\t\u0022\u005c\u0022jitterpc\u005c\u0022:\u0022\t\t\u002220,\u0022\n-\t\t\t\u0022\u005c\u0022svalidping\u005c\u0022:\u0022\t\u002230,\u0022\n-\t\t\t\u0022\u005c\u0022svalidhup\u005c\u0022:\u0022\t\u002235\u0022\n-\t\t\u0022}}\u0022\n-\t \u0022],\u0022\n-\t \u0022\u005c\u0022certs\u005c\u0022: [\u0022 /* named individual certificates in BASE64 DER */\n-\t\t/*\n-\t\t * Let's Encrypt certs for warmcat.com / libwebsockets.org\n-\t\t *\n-\t\t * We fetch the real policy from there using SS and switch to\n-\t\t * using that.\n-\t\t */\n-\n-\t\t\u0022{\u005c\u0022amz_root_ca1\u005c\u0022: \u005c\u0022\u0022\n-\t\u0022MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\u0022\n-\t\u0022ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\u0022\n-\t\u0022b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\u0022\n-\t\u0022MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\u0022\n-\t\u0022b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\u0022\n-\t\u0022ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\u0022\n-\t\u00229O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\u0022\n-\t\u0022IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\u0022\n-\t\u0022VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\u0022\n-\t\u002293FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\u0022\n-\t\u0022jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\u0022\n-\t\u0022AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\u0022\n-\t\u0022A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\u0022\n-\t\u0022U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\u0022\n-\t\u0022N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\u0022\n-\t\u0022o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\u0022\n-\t\u00225MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\u0022\n-\t\u0022rqXRfboQnoZsG4q5WTP468SQvvG5\u0022\n-\t\t\u0022\u005c\u0022}\u0022\n-\t \u0022],\u0022\n-\t \u0022\u005c\u0022trust_stores\u005c\u0022: [\u0022 /* named cert chains */\n-\t\t\u0022{\u0022\n-\t\t\t\u0022\u005c\u0022name\u005c\u0022: \u005c\u0022amz\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022stack\u005c\u0022: [\u0022\n-\t\t\t\t\u0022\u005c\u0022amz_root_ca1\u005c\u0022\u0022\n-\t\t\t\u0022]\u0022\n-\t\t\u0022}\u0022\n-\t \u0022],\u0022\n-\t \u0022\u005c\u0022s\u005c\u0022: [\u0022\n-\t \t/*\n-\t\t * \u0022fetch_policy\u0022 decides from where the real policy\n-\t\t * will be fetched, if present. Otherwise the initial\n-\t\t * policy is treated as the whole, hardcoded, policy.\n-\t\t */\n-\t\t\u0022{\u005c\u0022httpbin_get\u005c\u0022: {\u0022\n-\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022httpbin.org\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n-\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022/get\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n-\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n-\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022amz\u005c\u0022\u0022\n-\t\t\u0022}},\u0022\n-\t\t\u0022{\u005c\u0022httpbin_get404\u005c\u0022: {\u0022\n-\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022httpbin.org\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n-\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022GET\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022/status/404\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n-\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n-\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022amz\u005c\u0022\u0022\n-\t\t\u0022}},\u0022\n-\t\t\u0022{\u005c\u0022httpbin_post\u005c\u0022: {\u0022\n-\t\t\t\u0022\u005c\u0022endpoint\u005c\u0022:\u0022\t\t\u0022\u005c\u0022httpbin.org\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022port\u005c\u0022:\u0022\t\t\u0022443,\u0022\n-\t\t\t\u0022\u005c\u0022protocol\u005c\u0022:\u0022\t\t\u0022\u005c\u0022h1\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022http_method\u005c\u0022:\u0022\t\u0022\u005c\u0022POST\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022http_url\u005c\u0022:\u0022\t\t\u0022\u005c\u0022/post\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022tls\u005c\u0022:\u0022\t\t\u0022true,\u0022\n-\t\t\t\u0022\u005c\u0022opportunistic\u005c\u0022:\u0022\t\u0022true,\u0022\n-\t\t\t\u0022\u005c\u0022retry\u005c\u0022:\u0022\t\t\u0022\u005c\u0022default\u005c\u0022,\u0022\n-\t\t\t\u0022\u005c\u0022tls_trust_store\u005c\u0022:\u0022\t\u0022\u005c\u0022amz\u005c\u0022\u0022\n-\t\t\t\u0022}}\u0022\n- \u0022}\u0022\n-\t\u0022]}\u0022\n-;\n-\n-typedef struct atss {\n-\tconst lws_ss_info_t\t\t*ssi;\n-\tsize_t\t\t\t\tsend;\n-\tchar\t\t\t\texpect_nack;\n-} atss_t;\n-\n-static const atss_t *next_test;\n-\n-typedef struct myss {\n-\tstruct lws_ss_handle \t\t*ss;\n-\tvoid\t\t\t\t*opaque_data;\n-\t/* ... application specific state ... */\n-\tlws_sorted_usec_list_t\t\tsul;\n-\tsize_t\t\t\t\tpayload;\n-\tsize_t\t\t\t\tsent;\n-\tchar\t\t\t\tseen_eom;\n-\tchar\t\t\t\tended_well;\n-} myss_t;\n-\n-/* secure streams payload interface */\n-\n-static lws_ss_state_return_t\n-myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)\n-{\n-\tmyss_t *m \u003d (myss_t *)userobj;\n-\n-\tlwsl_hexdump_info(buf, len);\n-\n-\tm-\u003epayload +\u003d len;\n-\n-\tif (!(flags \u0026 LWSSS_FLAG_EOM))\n-\t\tm-\u003eseen_eom \u003d 1;\n-\n-\treturn 0;\n-}\n-\n-static lws_ss_state_return_t\n-myss_tx_get(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n-\t int *flags)\n-{\n-\treturn 1; /* nothing to send */\n-}\n-\n-static lws_ss_state_return_t\n-myss_tx_post(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n-\t int *flags)\n-{\n-\tmyss_t *m \u003d (myss_t *)userobj;\n-\tsize_t budget \u003d (next_test-\u003esend - m-\u003esent);\n-\n-\tif (!budget)\n-\t\treturn 1;\n-\n-\tif (*len \u003c budget)\n-\t\tbudget \u003d *len;\n-\n-\tif (!m-\u003esent)\n-\t\t*flags |\u003d LWSSS_FLAG_SOM;\n-\n-\tmemset(buf, 0x55, budget);\n-\t*len \u003d budget;\n-\tm-\u003esent +\u003d budget;\n-\tif (m-\u003esent !\u003d next_test-\u003esend)\n-\t\treturn lws_ss_request_tx(m-\u003ess);\n-\n-\t*flags |\u003d LWSSS_FLAG_EOM;\n-\n-\treturn LWSSSSRET_OK;\n-}\n-\n-static lws_ss_state_return_t\n-myss_state(void *userobj, void *sh, lws_ss_constate_t state,\n-\t lws_ss_tx_ordinal_t ack)\n-{\n-\tmyss_t *m \u003d (myss_t *)userobj;\n-\tlws_ss_state_return_t r;\n-\n-\tlwsl_notice(\u0022%s: %s, ord 0x%x\u005cn\u0022, __func__, lws_ss_state_name((int)state),\n-\t\t (unsigned int)ack);\n-\n-\tswitch (state) {\n-\tcase LWSSSCS_CREATING:\n-\t\tr \u003d lws_ss_client_connect(m-\u003ess);\n-\t\tif (r)\n-\t\t\treturn r;\n-\t\tif (next_test-\u003esend)\n-\t\t\treturn lws_ss_request_tx_len(m-\u003ess, (unsigned long)next_test-\u003esend);\n-\t\tbreak;\n-\tcase LWSSSCS_ALL_RETRIES_FAILED:\n-\t\tlwsl_notice(\u0022%s: Connection failed\u005cn\u0022, __func__);\n-\t\tinterrupted \u003d 1;\n-\t\tbreak;\n-\tcase LWSSSCS_QOS_NACK_REMOTE:\n-\t\tif (next_test-\u003eexpect_nack)\n-\t\t\tgoto happy;\n-\t\tlwsl_notice(\u0022%s: remote NACK\u005cn\u0022, __func__);\n-\t\tinterrupted \u003d 1;\n-\t\tbreak;\n-\tcase LWSSSCS_QOS_ACK_REMOTE:\n-\t\t/*\n-\t\t * To be satisfied, we want to see the ACK_REMOTE indicating\n-\t\t * that the transaction went through; that we had the payload\n-\t\t * EOM; and that we saw at least 200 + posted bytes response\n-\t\t */\n-\n-\t\tif (!m-\u003eseen_eom || m-\u003epayload \u003c 200 + next_test-\u003esend) {\n-\t\t\tlwsl_warn(\u0022%s: ACK_REMOTE but eom %d, payload %d\u005cn\u0022,\n-\t\t\t\t __func__, m-\u003eseen_eom, (int)m-\u003epayload);\n-\t\t\tinterrupted \u003d 1;\n-\t\t\treturn -1;\n-\t\t}\n-\n-happy:\n-\t\t/* when we disconnect, we can go happily */\n-\t\tm-\u003eended_well \u003d 1;\n-\n-\t\tif (!(++next_test)-\u003essi) {\n-\t\t\tlwsl_notice(\u0022%s: completed all tests\u005cn\u0022, __func__);\n-\t\t\tbad \u003d 0;\n-\t\t\tinterrupted \u003d 1;\n-\t\t\tbreak;\n-\t\t}\n-\t\tif (lws_ss_create(context, 0, next_test-\u003essi,\n-\t\t\t\t NULL, NULL, NULL, NULL)) {\n-\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n-\t\t\t\t __func__);\n-\t\t\treturn -1;\n-\t\t}\n-\t\tbreak;\n-\n-\tcase LWSSSCS_DISCONNECTED:\n-\t\tif (!m-\u003eended_well) {\n-\t\t\tlwsl_warn(\u0022%s: DISCONNECTED without good end\u005cn\u0022,\n-\t\t\t\t __func__);\n-\t\t\tinterrupted \u003d 1;\n-\t\t}\n-\t\tbreak;\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn LWSSSSRET_OK;\n-}\n-\n-static const lws_ss_info_t ssi_get \u003d {\n-\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n-\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n-\t.rx\t\t\t\t\u003d myss_rx,\n-\t.tx\t\t\t\t\u003d myss_tx_get,\n-\t.state\t\t\t\t\u003d myss_state,\n-\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n-\t.streamtype\t\t\t\u003d \u0022httpbin_get\u0022\n-}, ssi_get404 \u003d {\n-\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n-\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n-\t.rx\t\t\t\t\u003d myss_rx,\n-\t.tx\t\t\t\t\u003d myss_tx_get,\n-\t.state\t\t\t\t\u003d myss_state,\n-\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n-\t.streamtype\t\t\t\u003d \u0022httpbin_get404\u0022\n-}, ssi_post \u003d {\n-\t.handle_offset\t\t\t\u003d offsetof(myss_t, ss),\n-\t.opaque_user_data_offset\t\u003d offsetof(myss_t, opaque_data),\n-\t.rx\t\t\t\t\u003d myss_rx,\n-\t.tx\t\t\t\t\u003d myss_tx_post,\n-\t.state\t\t\t\t\u003d myss_state,\n-\t.user_alloc\t\t\t\u003d sizeof(myss_t),\n-\t.streamtype\t\t\t\u003d \u0022httpbin_post\u0022\n-};\n-\n-static const atss_t test_list[] \u003d {\n-\t\t{ .ssi \u003d \u0026ssi_get },\n-\t\t{ .ssi \u003d \u0026ssi_get404, .expect_nack \u003d 1 },\n-\t\t{ .ssi \u003d \u0026ssi_post, .send \u003d 4096 },\n-\t\t{ .ssi \u003d NULL }\n-};\n-\n-\n-static int\n-app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n-\t\t int current, int target)\n-{\n-\tstruct lws_context *context \u003d lws_system_context_from_system_mgr(mgr);\n-\n-\t/*\n-\t * For the things we care about, let's notice if we are trying to get\n-\t * past them when we haven't solved them yet, and make the system\n-\t * state wait while we trigger the dependent action.\n-\t */\n-\tswitch (target) {\n-\n-\tcase LWS_SYSTATE_OPERATIONAL:\n-\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n-\n-\t\t\tnext_test \u003d \u0026test_list[0];\n-\n-\t\t\tif (lws_ss_create(context, 0, next_test-\u003essi,\n-\t\t\t\t\t NULL, NULL, NULL, NULL)) {\n-\t\t\t\tlwsl_err(\u0022%s: failed to create secure stream\u005cn\u0022,\n-\t\t\t\t\t __func__);\n-\t\t\t\treturn -1;\n-\t\t\t}\n-\t\t}\n-\t\tbreak;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n-\t\u0026nl, NULL\n-};\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tint n \u003d 0;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tmemset(\u0026info, 0, sizeof info);\n-\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n-\n-\tlwsl_user(\u0022LWS secure streams test client [-d\u003cverb\u003e]\u005cn\u0022);\n-\n-\t/* these options are mutually exclusive if given */\n-\n-\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.pss_policies_json \u003d default_ss_policy;\n-\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS |\n-\t\t LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n-\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;\n-\n-\t/* integrate us with lws system state management when context created */\n-\n-\tnl.name \u003d \u0022app\u0022;\n-\tnl.notify_cb \u003d app_system_state_nf;\n-\tinfo.register_notifier_list \u003d app_notifier_list;\n-\n-\t/* create the context */\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\t/* the event loop */\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n-\n-\treturn bad;\n-}\ndiff --git a/minimal-examples/api-tests/api-test-smtp_client/CMakeLists.txt b/minimal-examples/api-tests/api-test-smtp_client/CMakeLists.txt\ndeleted file mode 100644\nindex 49e67ff..0000000\n--- a/minimal-examples/api-tests/api-test-smtp_client/CMakeLists.txt\n+++ /dev/null\n@@ -1,23 +0,0 @@\n-project(lws-unit-tests-smtp-client C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-unit-tests-smtp-client)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_SMTP 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/api-tests/api-test-smtp_client/README.md b/minimal-examples/api-tests/api-test-smtp_client/README.md\ndeleted file mode 100644\nindex 4c2052d..0000000\n--- a/minimal-examples/api-tests/api-test-smtp_client/README.md\n+++ /dev/null\n@@ -1,41 +0,0 @@\n-# lws api test smtp client\n-\n-Performs unit tests on the lws SMTP client abstract protocol\n-implementation.\n-\n-The first test \u0022sends mail to a server\u0022 (actually is prompted by\n-test vectors that look like a server) and the second test\n-confirm it can handle rejection by the \u0022server\u0022 cleanly.\n-\n-## build\n-\n-Requires lws was built with `-DLWS_WITH_SMTP\u003d1` at cmake.\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--r \u003crecipient@whatever.com\u003e|Send the test email to this email address\n-\n-\n-```\n- $ ./lws-api-test-smtp_client\n-[2019/06/28 21:56:41:0711] USER: LWS API selftest: SMTP client unit tests\n-[2019/06/28 21:56:41:1114] NOTICE: test_sequencer_cb: test-seq: created\n-[2019/06/28 21:56:41:1259] NOTICE: unit_test_sequencer_cb: unit-test-seq: created\n-[2019/06/28 21:56:41:1272] NOTICE: lws_atcut_client_conn: smtp: test 'sending': start\n-[2019/06/28 21:56:41:1441] NOTICE: unit_test_sequencer_cb: unit-test-seq: created\n-[2019/06/28 21:56:41:1442] NOTICE: lws_atcut_client_conn: smtp: test 'rejected': start\n-[2019/06/28 21:56:41:1453] NOTICE: lws_smtp_client_abs_rx: bad response from server: 500 (state 4) 500 Service Unavailable\n-[2019/06/28 21:56:41:1467] USER: test_sequencer_cb: sequence completed OK\n-[2019/06/28 21:56:41:1474] USER: main: 2 tests 0 fail\n-[2019/06/28 21:56:41:1476] USER: test 0: PASS\n-[2019/06/28 21:56:41:1478] USER: test 1: PASS\n-[2019/06/28 21:56:41:1480] USER: Completed: PASS\n-```\n-\ndiff --git a/minimal-examples/api-tests/api-test-smtp_client/main.c b/minimal-examples/api-tests/api-test-smtp_client/main.c\ndeleted file mode 100644\nindex c32e5ac..0000000\n--- a/minimal-examples/api-tests/api-test-smtp_client/main.c\n+++ /dev/null\n@@ -1,261 +0,0 @@\n-/*\n- * lws-unit-tests-smtp-client\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This performs unit tests for the SMTP client abstract protocol\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, results[10], count_tests, count_passes;\n-\n-static int\n-email_sent_or_failed(struct lws_smtp_email *email, void *buf, size_t len)\n-{\n-\tfree(email);\n-\n-\treturn 0;\n-}\n-\n-/*\n- * The test helper calls this on the instance it created to prepare it for\n- * the test. In our case, we need to queue up a test email to send on the\n- * smtp client abstract protocol.\n- */\n-\n-static int\n-smtp_test_instance_init(lws_abs_t *instance)\n-{\n-\tlws_smtp_email_t *email \u003d (lws_smtp_email_t *)\n-\t\t\t\t\tmalloc(sizeof(*email) + 2048);\n-\n-\tif (!email)\n-\t\treturn 1;\n-\n-\t/* attach an email to it */\n-\n-\tmemset(email, 0, sizeof(*email));\n-\temail-\u003edata \u003d NULL /* email specific user data */;\n-\temail-\u003eemail_from \u003d \u0022noreply@warmcat.com\u0022;\n-\temail-\u003eemail_to \u003d \u0022andy@warmcat.com\u0022;\n-\temail-\u003epayload \u003d (void *)\u0026email[1];\n-\n-\tlws_snprintf((char *)email-\u003epayload, 2048,\n-\t\t\t\u0022From: noreply@example.com\u005cn\u0022\n-\t\t\t\u0022To: %s\u005cn\u0022\n-\t\t\t\u0022Subject: Test email for lws smtp-client\u005cn\u0022\n-\t\t\t\u0022\u005cn\u0022\n-\t\t\t\u0022Hello this was an api test for lws smtp-client\u005cn\u0022\n-\t\t\t\u0022\u005cr\u005cn.\u005cr\u005cn\u0022, \u0022andy@warmcat.com\u0022);\n-\temail-\u003edone \u003d email_sent_or_failed;\n-\n-\tif (lws_smtpc_add_email(instance, email)) {\n-\t\tlwsl_err(\u0022%s: failed to add email\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-/*\n- * from https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol\n- *\n- *\t\ttest vector sent to protocol\n- *\t\t\t\ttest vector received from protocol\n- */\n-\n-static lws_unit_test_packet_t test_send1[] \u003d {\n-\t{\n-\t\t\u0022220 smtp.example.com ESMTP Postfix\u0022,\n-\t\tsmtp_test_instance_init, 34, LWS_AUT_EXPECT_RX\n-\t}, {\n-\t\t\t\t\u0022HELO lws-test-client\u005cx0a\u0022,\n-\t\tNULL, 21, LWS_AUT_EXPECT_TX\n-\t}, {\n-\t\t\u0022250 smtp.example.com, I am glad to meet you\u0022,\n-\t\tNULL, 43, LWS_AUT_EXPECT_RX\n-\t}, {\n-\t\t\t\t\u0022MAIL FROM: \u003cnoreply@warmcat.com\u003e\u005cx0a\u0022,\n-\t\tNULL, 33, LWS_AUT_EXPECT_TX\n-\t}, {\n-\t\t\u0022250 Ok\u0022,\n-\t\tNULL, 6, LWS_AUT_EXPECT_RX\n-\t}, {\n-\t\t\t\t\u0022RCPT TO: \u003candy@warmcat.com\u003e\u005cx0a\u0022,\n-\t\tNULL, 28, LWS_AUT_EXPECT_TX\n-\t}, {\n-\t\t\u0022250 Ok\u0022,\n-\t\tNULL, 6, LWS_AUT_EXPECT_RX\n-\t}, {\n-\t\t\t\t\u0022DATA\u005cx0a\u0022,\n-\t\tNULL, 5, LWS_AUT_EXPECT_TX\n-\t}, {\n-\t\t\u0022354 End data with \u003cCR\u003e\u003cLF\u003e.\u003cCR\u003e\u003cLF\u003e\u005cx0a\u0022,\n-\t\tNULL, 35, LWS_AUT_EXPECT_RX\n-\t}, {\n-\t\t\t\t\u0022From: noreply@example.com\u005cn\u0022\n-\t\t\t\t\u0022To: andy@warmcat.com\u005cn\u0022\n-\t\t\t\t\u0022Subject: Test email for lws smtp-client\u005cn\u0022\n-\t\t\t\t\u0022\u005cn\u0022\n-\t\t\t\t\u0022Hello this was an api test for lws smtp-client\u005cn\u0022\n-\t\t\t\t\u0022\u005cr\u005cn.\u005cr\u005cn\u0022,\n-\t\tNULL, 27 + 21 + 39 + 1 + 47 + 5, LWS_AUT_EXPECT_TX\n-\t}, {\n-\t\t\u0022250 Ok: queued as 12345\u005cx0a\u0022,\n-\t\tNULL, 23, LWS_AUT_EXPECT_RX\n-\t}, {\n-\t\t\t\t\u0022quit\u005cx0a\u0022,\n-\t\tNULL, 5, LWS_AUT_EXPECT_TX\n-\t}, {\n-\t\t\u0022221 Bye\u005cx0a\u0022,\n-\t\tNULL, 7, LWS_AUT_EXPECT_RX |\n-\t\t LWS_AUT_EXPECT_LOCAL_CLOSE |\n-\t\t LWS_AUT_EXPECT_DO_REMOTE_CLOSE |\n-\t\t LWS_AUT_EXPECT_TEST_END\n-\t}, { \t/* sentinel */\n-\n-\t}\n-};\n-\n-\n-static lws_unit_test_packet_t test_send2[] \u003d {\n-\t{\n-\t\t\u0022220 smtp.example.com ESMTP Postfix\u0022,\n-\t\tsmtp_test_instance_init, 34, LWS_AUT_EXPECT_RX\n-\t}, {\n-\t\t\t\t\u0022HELO lws-test-client\u005cx0a\u0022,\n-\t\tNULL, 21, LWS_AUT_EXPECT_TX\n-\t}, {\n-\t\t\u0022250 smtp.example.com, I am glad to meet you\u0022,\n-\t\tNULL, 43, LWS_AUT_EXPECT_RX\n-\t}, {\n-\t\t\t\t\u0022MAIL FROM: \u003cnoreply@warmcat.com\u003e\u005cx0a\u0022,\n-\t\tNULL, 33, LWS_AUT_EXPECT_TX\n-\t}, {\n-\t\t\u0022500 Service Unavailable\u0022,\n-\t\tNULL, 23, LWS_AUT_EXPECT_RX |\n-\t\t LWS_AUT_EXPECT_DO_REMOTE_CLOSE |\n-\t\t LWS_AUT_EXPECT_TEST_END\n-\t}, { \t/* sentinel */\n-\n-\t}\n-};\n-\n-static lws_unit_test_t tests[] \u003d {\n-\t{ \u0022sending\u0022, test_send1, 3 },\n-\t{ \u0022rejected\u0022, test_send2, 3 },\n-\t{ }\t/* sentinel */\n-};\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-/*\n- * set the HELO our SMTP client will use\n- */\n-\n-static const lws_token_map_t smtp_ap_tokens[] \u003d {\n- {\n-\t.u \u003d { .value \u003d \u0022lws-test-client\u0022 },\n-\t.name_index \u003d LTMI_PSMTP_V_HELO,\n- }, {\t/* sentinel */\n- }\n-};\n-\n-void\n-tests_completion_cb(const void *cb_user)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_context_creation_info info;\n-\tlws_test_sequencer_args_t args;\n-\tstruct lws_context *context;\n-\tlws_abs_t *abs \u003d NULL;\n-\tstruct lws_vhost *vh;\n-\tconst char *p;\n-\n-\t/* the normal lws init */\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS API selftest: SMTP client unit tests\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tvh \u003d lws_create_vhost(context, \u0026info);\n-\tif (!vh) {\n-\t\tlwsl_err(\u0022Failed to create first vhost\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* create the abs used to create connections */\n-\n-\tabs \u003d lws_abstract_alloc(vh, NULL, \u0022smtp.unit_test\u0022,\n-\t\t\t\t \u0026smtp_ap_tokens[0], NULL);\n-\tif (!abs)\n-\t\tgoto bail1;\n-\n-\t/* configure the test sequencer */\n-\n-\targs.abs \u003d abs;\n-\targs.tests \u003d tests;\n-\targs.results \u003d results;\n-\targs.results_max \u003d LWS_ARRAY_SIZE(results);\n-\targs.count_tests \u003d \u0026count_tests;\n-\targs.count_passes \u003d \u0026count_passes;\n-\targs.cb \u003d tests_completion_cb;\n-\targs.cb_user \u003d NULL;\n-\n-\tif (lws_abs_unit_test_sequencer(\u0026args)) {\n-\t\tlwsl_err(\u0022%s: failed to create test sequencer\u005cn\u0022, __func__);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/* the usual lws event loop */\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\t/* describe the overall test results */\n-\n-\tlwsl_user(\u0022%s: %d tests %d fail\u005cn\u0022, __func__, count_tests,\n-\t\t\tcount_tests - count_passes);\n-\tfor (n \u003d 0; n \u003c count_tests; n++)\n-\t\tlwsl_user(\u0022 test %d: %s\u005cn\u0022, n,\n-\t\t\t lws_unit_test_result_name(results[n]));\n-\n-bail1:\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022,\n-\t\t !count_tests || count_passes !\u003d count_tests ? \u0022FAIL\u0022 : \u0022PASS\u0022);\n-\n-\tlws_context_destroy(context);\n-\n-\tlws_abstract_free(\u0026abs);\n-\n-\treturn !count_tests || count_passes !\u003d count_tests;\n-}\ndiff --git a/minimal-examples/client-server/README.md b/minimal-examples/client-server/README.md\ndeleted file mode 100644\nindex 7339c61..0000000\n--- a/minimal-examples/client-server/README.md\n+++ /dev/null\n@@ -1,3 +0,0 @@\n-|name|demonstrates|\n----|---\n-minimal-ws-proxy|Serves an index.html over http that connects back to the ws server, and maintains a ws client connection of its own at the same time to https://libwebsockets.org dumb-increment-protocol to feed a ringbuffer that is sent to all connected browsers.\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt b/minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt\ndeleted file mode 100644\nindex 65a01b6..0000000\n--- a/minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt\n+++ /dev/null\n@@ -1,25 +0,0 @@\n-project(lws-minimal-ws-proxy C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-ws-proxy)\n-set(SRCS minimal-ws-proxy.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_WS 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-require_lws_config(LWS_WITH_SERVER 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\n\u005c No newline at end of file\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/README.md b/minimal-examples/client-server/minimal-ws-proxy/README.md\ndeleted file mode 100644\nindex 5c65500..0000000\n--- a/minimal-examples/client-server/minimal-ws-proxy/README.md\n+++ /dev/null\n@@ -1,38 +0,0 @@\n-# lws minimal ws proxy\n-\n-## Build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## Description\n-\n-This is the same as minimal-ws-server-ring, but with the\n-inclusion of a ws client connection to https://libwebsockets.org\n-using the dumb-increment protocol feeding the ringbuffer.\n-\n-Each client that connect to this server receives the content that\n-had arrived on the client connection feeding the ringbuffer proxied\n-to their browser window over a ws connection.\n-\n-## Usage\n-\n-```\n- $ ./lws-minimal-ws-proxy \n-[2018/03/14 17:50:10:6938] USER: LWS minimal ws proxy | visit http://localhost:7681\n-[2018/03/14 17:50:10:6955] NOTICE: Creating Vhost 'default' port 7681, 2 protocols, IPv6 off\n-[2018/03/14 17:50:10:6955] NOTICE: Using non-SSL mode\n-[2018/03/14 17:50:10:7035] NOTICE: created client ssl context for default\n-[2018/03/14 17:50:11:7047] NOTICE: binding to lws-minimal-proxy\n-[2018/03/14 17:50:11:7047] NOTICE: lws_client_connect_2: 0x872e60: address libwebsockets.org\n-[2018/03/14 17:50:12:3282] NOTICE: lws_client_connect_2: 0x872e60: address libwebsockets.org\n-[2018/03/14 17:50:13:8195] USER: callback_minimal: established\n-```\n-\n-Visit http://localhost:7681 on multiple browser windows\n-\n-Data received on the remote wss connection is copied to all open browser windows.\n-\n-A ringbuffer holds up to 8 lines of text in the server, and the browser shows\n-the last 20 lines of received text.\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/minimal-ws-proxy.c b/minimal-examples/client-server/minimal-ws-proxy/minimal-ws-proxy.c\ndeleted file mode 100644\nindex e304c61..0000000\n--- a/minimal-examples/client-server/minimal-ws-proxy/minimal-ws-proxy.c\n+++ /dev/null\n@@ -1,100 +0,0 @@\n-/*\n- * lws-minimal-ws-proxy\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates the most minimal http server you can make with lws,\n- * with an added websocket proxy distributing what is received on a\n- * dumb-increment wss connection to https://libwebsockets.org to all\n- * browsers connected to this server.\n- *\n- * To keep it simple, it serves stuff in the subdirectory \u0022./mount-origin\u0022 of\n- * the directory it was started in.\n- * You can change that by changing mount.origin.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-\n-#define LWS_PLUGIN_STATIC\n-#include \u0022protocol_lws_minimal.c\u0022\n-\n-static struct lws_protocols protocols[] \u003d {\n-\t{ \u0022http\u0022, lws_callback_http_dummy, 0, 0, 0, NULL, 0},\n-\tLWS_PLUGIN_PROTOCOL_MINIMAL,\n-\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-static int interrupted;\n-\n-static const struct lws_http_mount mount \u003d {\n-\t/* .mount_next */\t\tNULL,\t\t/* linked-list \u0022next\u0022 */\n-\t/* .mountpoint */\t\t\u0022/\u0022,\t\t/* mountpoint URL */\n-\t/* .origin */\t\t\t\u0022./mount-origin\u0022, /* serve from dir */\n-\t/* .def */\t\t\t\u0022index.html\u0022,\t/* default filename */\n-\t/* .protocol */\t\t\tNULL,\n-\t/* .cgienv */\t\t\tNULL,\n-\t/* .extra_mimetypes */\t\tNULL,\n-\t/* .interpret */\t\tNULL,\n-\t/* .cgi_timeout */\t\t0,\n-\t/* .cache_max_age */\t\t0,\n-\t/* .auth_mask */\t\t0,\n-\t/* .cache_reusable */\t\t0,\n-\t/* .cache_revalidate */\t\t0,\n-\t/* .cache_intermediaries */\t0,\n-\t/* .origin_protocol */\t\tLWSMPRO_FILE,\t/* files in a dir */\n-\t/* .mountpoint_len */\t\t1,\t\t/* char count */\n-\t/* .basic_auth_login_file */\tNULL,\n-};\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tconst char *p;\n-\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n-\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n-\t\t\t * lws must have been configured and built with\n-\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n-\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n-\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n-\t\t\t/* | LLL_DEBUG */;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS minimal ws proxy | visit http://localhost:7681\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n-\t\t LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n-\tinfo.port \u003d 7681;\n-\tinfo.mounts \u003d \u0026mount;\n-\tinfo.protocols \u003d protocols;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn 0;\n-}\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/example.js b/minimal-examples/client-server/minimal-ws-proxy/mount-origin/example.js\ndeleted file mode 100644\nindex e483922..0000000\n--- a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/example.js\n+++ /dev/null\n@@ -1,67 +0,0 @@\n-var head \u003d 0, tail \u003d 0, ring \u003d new Array();\n-\n-function get_appropriate_ws_url(extra_url)\n-{\n-\tvar pcol;\n-\tvar u \u003d document.URL;\n-\n-\t/*\n-\t * We open the websocket encrypted if this page came on an\n-\t * https:// url itself, otherwise unencrypted\n-\t */\n-\n-\tif (u.substring(0, 5) \u003d\u003d\u003d \u0022https\u0022) {\n-\t\tpcol \u003d \u0022wss://\u0022;\n-\t\tu \u003d u.substr(8);\n-\t} else {\n-\t\tpcol \u003d \u0022ws://\u0022;\n-\t\tif (u.substring(0, 4) \u003d\u003d\u003d \u0022http\u0022)\n-\t\t\tu \u003d u.substr(7);\n-\t}\n-\n-\tu \u003d u.split(\u0022/\u0022);\n-\n-\t/* + \u0022/xxx\u0022 bit is for IE10 workaround */\n-\n-\treturn pcol + u[0] + \u0022/\u0022 + extra_url;\n-}\n-\n-function new_ws(urlpath, protocol)\n-{\n-\treturn new WebSocket(urlpath, protocol);\n-}\n-\n-document.addEventListener(\u0022DOMContentLoaded\u0022, function() {\n-\n-\tvar ws \u003d new_ws(get_appropriate_ws_url(\u0022\u0022), \u0022lws-minimal-proxy\u0022);\n-\ttry {\n-\t\tws.onopen \u003d function() {\n-\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 0;\n-\t\t};\n-\t\n-\t\tws.onmessage \u003dfunction got_packet(msg) {\n-\t\t\tvar n, s \u003d \u0022\u0022;\n-\t\n-\t\t\tring[head] \u003d msg.data + \u0022\u005cn\u0022;\n-\t\t\thead \u003d (head + 1) % 20;\n-\t\t\tif (tail \u003d\u003d\u003d head)\n-\t\t\t\ttail \u003d (tail + 1) % 20;\n-\t\n-\t\t\tn \u003d tail;\n-\t\t\tdo {\n-\t\t\t\ts \u003d s + ring[n];\n-\t\t\t\tn \u003d (n + 1) % 20;\n-\t\t\t} while (n !\u003d\u003d head);\n-\t\n-\t\t\tdocument.getElementById(\u0022r\u0022).value \u003d s; \n-\t\t\tdocument.getElementById(\u0022r\u0022).scrollTop \u003d\n-\t\t\t\tdocument.getElementById(\u0022r\u0022).scrollHeight;\n-\t\t};\n-\t\n-\t\tws.onclose \u003d function(){\n-\t\t\tdocument.getElementById(\u0022r\u0022).disabled \u003d 1;\n-\t\t};\n-\t} catch(exception) {\n-\t\talert(\u0022\u003cp\u003eError \u0022 + exception); \n-\t}\n-}, false);\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/favicon.ico b/minimal-examples/client-server/minimal-ws-proxy/mount-origin/favicon.ico\ndeleted file mode 100644\nindex c0cc2e3..0000000\nBinary files a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/favicon.ico and /dev/null differ\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/index.html b/minimal-examples/client-server/minimal-ws-proxy/mount-origin/index.html\ndeleted file mode 100644\nindex 9df7cf8..0000000\n--- a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/index.html\n+++ /dev/null\n@@ -1,19 +0,0 @@\n-\u003chtml\u003e\n- \u003chead\u003e\n- \u003cmeta charset\u003dutf-8 http-equiv\u003d\u0022Content-Language\u0022 content\u003d\u0022en\u0022/\u003e\n- \u003cscript src\u003d\u0022/example.js\u0022\u003e\u003c/script\u003e\n- \u003c/head\u003e\n-\t\u003cbody\u003e\n-\t\t\u003cimg src\u003d\u0022libwebsockets.org-logo.svg\u0022\u003e\n-\t\t\u003cimg src\u003d\u0022strict-csp.svg\u0022\u003e\u003cbr\u003e\n-\t\n-\t\t\u003cb\u003eMinimal ws server proxy example\u003c/b\u003e.\u003cbr\u003e\n-\t\tThe server makes a dumb-increment-protocol wss connection\u003cbr\u003e\n-\t\tto libwebsockets.org. It proxies what it was sent to\u003cbr\u003e\n-\t\tall browsers open on this page.\u003cbr\u003e\n-\t\tThe textarea show the last 20 lines received.\n-\t\t\u003cbr\u003e\n-\t\t\u003cbr\u003e\n-\t\t\u003ctextarea id\u003dr readonly cols\u003d40 rows\u003d20\u003e\u003c/textarea\u003e\u003cbr\u003e\n-\t\u003c/body\u003e\n-\u003c/html\u003e\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg b/minimal-examples/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg\ndeleted file mode 100644\nindex ef241b3..0000000\n--- a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg\n+++ /dev/null\n@@ -1,66 +0,0 @@\n-\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n-\u003csvg width\u003d\u0022117.26mm\u0022 height\u003d\u002219.676mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 117.26 19.677\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:cc\u003d\u0022http://creativecommons.org/ns#\u0022 xmlns:dc\u003d\u0022http://purl.org/dc/elements/1.1/\u0022 xmlns:rdf\u003d\u0022http://www.w3.org/1999/02/22-rdf-syntax-ns#\u0022\u003e\n-\u003cmetadata\u003e\n-\u003crdf:RDF\u003e\n-\u003ccc:Work rdf:about\u003d\u0022\u0022\u003e\n-\u003cdc:format\u003eimage/svg+xml\u003c/dc:format\u003e\n-\u003cdc:type rdf:resource\u003d\u0022http://purl.org/dc/dcmitype/StillImage\u0022/\u003e\n-\u003cdc:title/\u003e\n-\u003c/cc:Work\u003e\n-\u003c/rdf:RDF\u003e\n-\u003c/metadata\u003e\n-\u003cpath d\u003d\u0022m0-2.6715e-4h117.26v19.677h-117.26z\u0022 fill\u003d\u0022none\u0022/\u003e\n-\u003cg transform\u003d\u0022matrix(.63895 0 0 .63895 2.5477 3.6562)\u0022\u003e\n-\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 3.2398 -93.904)\u0022\u003e\n-\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003c/g\u003e\n-\u003cpath d\u003d\u0022m12.174 13.987a1.2015 1.2015 0 0 1-1.2024 1.2024 1.2015 1.2015 0 0 1-1.2006-1.2024 1.2015 1.2015 0 0 1 1.2006-1.2005 1.2015 1.2015 0 0 1 1.2024 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n-\u003cpath d\u003d\u0022m8.2754 5.0474h2.468v5.6755h-2.468z\u0022/\u003e\n-\u003cpath d\u003d\u0022m16.25 13.965a1.2015 1.2015 0 0 1-1.2027 1.2005 1.2015 1.2015 0 0 1-1.2004-1.2005 1.2015 1.2015 0 0 1 1.2004-1.2025 1.2015 1.2015 0 0 1 1.2027 1.2025\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n-\u003cpath d\u003d\u0022m19.545 13.928a1.2015 1.2015 0 0 1-1.2025 1.2026 1.2015 1.2015 0 0 1-1.2003-1.2026 1.2015 1.2015 0 0 1 1.2003-1.2005 1.2015 1.2015 0 0 1 1.2025 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n-\u003cpath d\u003d\u0022m23.75 13.902a1.2015 1.2015 0 0 1-1.2005 1.2024 1.2015 1.2015 0 0 1-1.2025-1.2024 1.2015 1.2015 0 0 1 1.2025-1.2005 1.2015 1.2015 0 0 1 1.2005 1.2005\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n-\u003cpath d\u003d\u0022m26.249 5.0292a1.2015 1.2015 0 0 1-1.2027 1.2004 1.2015 1.2015 0 0 1-1.2004-1.2004 1.2015 1.2015 0 0 1 1.2004-1.2026 1.2015 1.2015 0 0 1 1.2027 1.2026\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n-\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 6.3252 -93.961)\u0022\u003e\n-\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003c/g\u003e\n-\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 9.3806 -93.988)\u0022\u003e\n-\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003c/g\u003e\n-\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 13.506 -94.006)\u0022\u003e\n-\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003c/g\u003e\n-\u003cg transform\u003d\u0022matrix(.9517 0 0 .9517 -.82062 -93.74)\u0022\u003e\n-\u003cpath d\u003d\u0022m9.5909 107.4h2.5567v2.649h-2.5567z\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.12 107.36a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003cpath d\u003d\u0022m12.127 110.05a1.2625 1.2625 0 0 1-1.2625 1.262 1.2625 1.2625 0 0 1-1.2625-1.262 1.2625 1.2625 0 0 1 1.2625-1.262 1.2625 1.2625 0 0 1 1.2625 1.262\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.0365\u0022/\u003e\n-\u003c/g\u003e\n-\u003cpath d\u003d\u0022m10.703 5.0413a1.2015 1.2015 0 0 1-1.2006 1.2025 1.2015 1.2015 0 0 1-1.2025-1.2025 1.2015 1.2015 0 0 1 1.2025-1.2004 1.2015 1.2015 0 0 1 1.2006 1.2004\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u0022.98647\u0022/\u003e\n-\u003c/g\u003e\n-\u003cg transform\u003d\u0022matrix(2.6825 0 0 2.6825 -289.72 -275.57)\u0022 dominant-baseline\u003d\u0022auto\u0022 stroke-width\u003d\u0022.29098\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\u0022 aria-label\u003d\u0022libwebsockets.org\u0022\u003e\n-\u003cpath d\u003d\u0022m117.05 105.01v2.752h0.224v-2.752z\u0022/\u003e\n-\u003cpath d\u003d\u0022m117.95 105.71v2.057h0.223v-2.057zm-0.04-0.695v0.318h0.297v-0.318z\u0022/\u003e\n-\u003cpath d\u003d\u0022m118.8 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.594 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.15-0.855 0.625-0.855z\u0022/\u003e\n-\u003cpath d\u003d\u0022m120.79 105.71 0.555 2.057h0.314l0.479-1.858 0.482 1.858h0.314l0.551-2.057h-0.23l-0.482 1.879-0.482-1.879h-0.303l-0.486 1.879-0.478-1.879z\u0022/\u003e\n-\u003cpath d\u003d\u0022m125.54 106.8v-0.157c0-0.433-0.06-0.964-0.869-0.964-0.824 0-0.891 0.566-0.891 1.079 0 0.688 0.196 1.034 0.926 1.034 0.495 0 0.792-0.178 0.831-0.663h-0.224c-0.01 0.377-0.262 0.464-0.628 0.464-0.611 0-0.688-0.314-0.685-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.493 0 0.653 0.21 0.65 0.727z\u0022/\u003e\n-\u003cpath d\u003d\u0022m126.04 105.01v2.752h0.203l0.02-0.251c0.101 0.157 0.244 0.279 0.649 0.279 0.601 0 0.81-0.307 0.81-1.083 0-0.541-0.09-1.03-0.81-1.03-0.468 0-0.593 0.196-0.649 0.283v-0.95zm0.845 0.87c0.552 0 0.618 0.339 0.618 0.855 0 0.486-0.05 0.852-0.611 0.852-0.426 0-0.632-0.181-0.632-0.852 0-0.597 0.151-0.855 0.625-0.855z\u0022/\u003e\n-\u003cpath d\u003d\u0022m129.86 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.273 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n-\u003cpath d\u003d\u0022m130.35 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.584 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n-\u003cpath d\u003d\u0022m134.12 107.03c0 0.471-0.22 0.565-0.656 0.565-0.496 0-0.667-0.181-0.667-0.838 0-0.782 0.272-0.869 0.677-0.869 0.283 0 0.625 0.06 0.625 0.531h0.22c0.01-0.734-0.639-0.734-0.845-0.734-0.632 0-0.897 0.245-0.897 1.058 0 0.793 0.248 1.055 0.908 1.055 0.468 0 0.834-0.115 0.859-0.768z\u0022/\u003e\n-\u003cpath d\u003d\u0022m135.05 106.64v-1.624h-0.22v2.752h0.22v-1.072l1.076 1.072h0.321l-1.149-1.1 1.041-0.957h-0.318z\u0022/\u003e\n-\u003cpath d\u003d\u0022m138.48 106.8v-0.157c0-0.433-0.06-0.964-0.87-0.964-0.824 0-0.89 0.566-0.89 1.079 0 0.688 0.195 1.034 0.925 1.034 0.496 0 0.793-0.178 0.831-0.663h-0.223c-0.01 0.377-0.262 0.464-0.629 0.464-0.611 0-0.688-0.314-0.684-0.793zm-1.54-0.195c0.02-0.374 0.08-0.727 0.667-0.727 0.492 0 0.653 0.21 0.649 0.727z\u0022/\u003e\n-\u003cpath d\u003d\u0022m139.29 105.71h-0.457v0.206h0.457v1.348c0 0.335 0.07 0.531 0.664 0.531 0.09 0 0.139 0 0.181-0.01v-0.209c-0.06 0-0.136 0.01-0.251 0.01-0.374 0-0.374-0.129-0.374-0.381v-1.292h0.541v-0.206h-0.541v-0.488h-0.22z\u0022/\u003e\n-\u003cpath d\u003d\u0022m142.15 106.28c0-0.24-0.06-0.604-0.799-0.604-0.426 0-0.814 0.109-0.814 0.601 0 0.381 0.241 0.471 0.489 0.503l0.576 0.08c0.272 0.04 0.381 0.08 0.381 0.338 0 0.315-0.224 0.391-0.618 0.391-0.646 0-0.646-0.223-0.646-0.481h-0.224c0 0.279 0.04 0.684 0.852 0.684 0.37 0 0.856-0.05 0.856-0.608 0-0.415-0.294-0.492-0.486-0.516l-0.607-0.08c-0.234-0.03-0.356-0.07-0.356-0.297 0-0.192 0.06-0.408 0.593-0.408 0.583 0 0.58 0.237 0.58 0.401z\u0022/\u003e\n-\u003cpath d\u003d\u0022m142.76 107.44v0.321h0.293v-0.321z\u0022/\u003e\n-\u003cpath d\u003d\u0022m143.54 106.74c0 0.594 0.06 1.058 0.908 1.058 0.883 0 0.904-0.51 0.904-1.103 0-0.601-0.108-1.01-0.904-1.01-0.852 0-0.908 0.475-0.908 1.055zm0.908-0.852c0.569 0 0.684 0.213 0.684 0.803 0 0.636-0.05 0.904-0.684 0.904-0.583 0-0.688-0.223-0.688-0.824 0-0.6 0.04-0.883 0.688-0.883z\u0022/\u003e\n-\u003cpath d\u003d\u0022m145.81 105.71v2.057h0.22v-1.337c0-0.542 0.419-0.542 0.569-0.542h0.206v-0.213c-0.37 0-0.576 0-0.775 0.259l-0.01-0.231z\u0022/\u003e\n-\u003cpath d\u003d\u0022m149.11 105.62c-0.331 0.01-0.391 0.136-0.429 0.217-0.143-0.14-0.44-0.158-0.646-0.158-0.503 0-0.821 0.14-0.821 0.601 0 0.119 0.02 0.272 0.126 0.398-0.175 0.02-0.265 0.157-0.265 0.325 0 0.1 0.04 0.258 0.22 0.311-0.07 0.03-0.245 0.132-0.245 0.408 0 0.412 0.374 0.51 1.006 0.51 0.593 0 0.971-0.09 0.971-0.541 0-0.297-0.175-0.465-0.601-0.489l-0.922-0.06c-0.105 0-0.223-0.05-0.223-0.182 0-0.08 0.04-0.132 0.153-0.195 0.123 0.09 0.322 0.126 0.629 0.126 0.384 0 0.82-0.05 0.82-0.625 0-0.172-0.04-0.227-0.08-0.297 0.06-0.112 0.108-0.133 0.307-0.143zm-1.065 0.258c0.535 0 0.622 0.182 0.622 0.388 0 0.339-0.178 0.426-0.611 0.426-0.423 0-0.622-0.07-0.622-0.384 0-0.356 0.192-0.43 0.611-0.43zm0.206 1.512c0.36 0.02 0.556 0.06 0.556 0.308 0 0.216-0.147 0.331-0.751 0.331-0.674 0-0.8-0.1-0.8-0.345 0-0.304 0.318-0.336 0.328-0.336z\u0022/\u003e\n-\u003c/g\u003e\n-\u003c/svg\u003e\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg b/minimal-examples/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg\ndeleted file mode 100644\nindex cd128f1..0000000\n--- a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg\n+++ /dev/null\n@@ -1,53 +0,0 @@\n-\u003c?xml version\u003d\u00221.0\u0022 encoding\u003d\u0022UTF-8\u0022?\u003e\n-\u003csvg width\u003d\u002224.78mm\u0022 height\u003d\u002224.78mm\u0022 version\u003d\u00221.1\u0022 viewBox\u003d\u00220 0 24.780247 24.780247\u0022 xmlns\u003d\u0022http://www.w3.org/2000/svg\u0022 xmlns:xlink\u003d\u0022http://www.w3.org/1999/xlink\u0022\u003e\n- \u003cdefs\u003e\n- \u003clinearGradient id\u003d\u0022linearGradient955\u0022 x1\u003d\u002266.618\u0022 x2\u003d\u002282.588\u0022 y1\u003d\u002281.176\u0022 y2\u003d\u002264.828\u0022 gradientTransform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 gradientUnits\u003d\u0022userSpaceOnUse\u0022\u003e\n- \u003cstop stop-color\u003d\u0022#0aa70b\u0022 offset\u003d\u00220\u0022/\u003e\n- \u003cstop stop-color\u003d\u0022#3bff39\u0022 offset\u003d\u00221\u0022/\u003e\n- \u003c/linearGradient\u003e\n- \u003cfilter id\u003d\u0022filter945\u0022 x\u003d\u0022-.0516\u0022 y\u003d\u0022-.0516\u0022 width\u003d\u00221.1032\u0022 height\u003d\u00221.1032\u0022 color-interpolation-filters\u003d\u0022sRGB\u0022\u003e\n- \u003cfeGaussianBlur stdDeviation\u003d\u00220.58510713\u0022/\u003e\n- \u003c/filter\u003e\n- \u003c/defs\u003e\n- \u003cg transform\u003d\u0022translate(342.15 43.638)\u0022\u003e\n- \u003ccircle transform\u003d\u0022matrix(.82538 0 0 .82538 -392 -92.399)\u0022 cx\u003d\u002275.406\u0022 cy\u003d\u002274.089\u0022 r\u003d\u002213.607\u0022 filter\u003d\u0022url(#filter945)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.565\u0022/\u003e\n- \u003ccircle cx\u003d\u0022-330.23\u0022 cy\u003d\u0022-31.716\u0022 r\u003d\u002211.231\u0022 fill\u003d\u0022url(#linearGradient955)\u0022 stroke\u003d\u0022#000\u0022 stroke-linecap\u003d\u0022round\u0022 stroke-width\u003d\u00221.2917\u0022/\u003e\n- \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.51676px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Strict\u0022\u003e\n- \u003cpath d\u003d\u0022m-330.78-33.775q0 0.73996-0.53676 1.154-0.53676 0.41407-1.4569 0.41407-0.99684 0-1.5336-0.25688v-0.62878q0.34506 0.14569 0.75147 0.23004 0.4064 0.08435 0.80514 0.08435 0.65177 0 0.9815-0.24538 0.32972-0.24921 0.32972-0.69012 0-0.29138-0.11885-0.47542-0.11502-0.18787-0.39107-0.34506-0.27221-0.15719-0.83198-0.35656-0.78213-0.27988-1.1195-0.66328-0.33356-0.3834-0.33356-1.0007 0-0.64794 0.48692-1.0313 0.48691-0.3834 1.2882-0.3834 0.83581 0 1.5374 0.30672l-0.2032 0.56743q-0.69395-0.29138-1.3496-0.29138-0.51759 0-0.80897 0.22237t-0.29138 0.61727q0 0.29138 0.10735 0.47925 0.10735 0.18403 0.36039 0.34123 0.25688 0.15336 0.78214 0.34122 0.88182 0.31439 1.2115 0.67478 0.33356 0.3604 0.33356 0.93549z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-328.37-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36807v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.18019 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-325.04-36.562q0.27989 0 0.50226 0.04601l-0.0882 0.59044q-0.26072-0.05751-0.46008-0.05751-0.50993 0-0.87415 0.41407-0.3604 0.41407-0.3604 1.0313v2.2544h-0.63644v-4.2021h0.52525l0.0729 0.7783h0.0307q0.23388-0.41024 0.5636-0.63261 0.32972-0.22237 0.72462-0.22237z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-323.11-32.284h-0.63644v-4.2021h0.63644zm-0.69012-5.3408q0-0.21854 0.10735-0.31822 0.10735-0.10352 0.26838-0.10352 0.15336 0 0.26455 0.10352 0.11118 0.10352 0.11118 0.31822 0 0.2147-0.11118 0.32206-0.11119 0.10352-0.26455 0.10352-0.16103 0-0.26838-0.10352-0.10735-0.10735-0.10735-0.32206z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-320.07-32.207q-0.91249 0-1.4147-0.55976-0.49842-0.5636-0.49842-1.5911 0-1.0543 0.50609-1.6294 0.50992-0.5751 1.4492-0.5751 0.30288 0 0.60577 0.06518 0.30288 0.06518 0.47541 0.15336l-0.19553 0.54059q-0.21087-0.08435-0.46008-0.13802-0.24921-0.05751-0.44091-0.05751-1.2806 0-1.2806 1.6333 0 0.77447 0.31055 1.1885 0.31439 0.41407 0.92783 0.41407 0.52526 0 1.0774-0.22621v0.5636q-0.42174 0.21854-1.062 0.21854z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-316.65-32.732q0.16869 0 0.32589-0.023 0.15719-0.02684 0.24921-0.05368v0.48692q-0.10352 0.04984-0.30672 0.08051-0.19937 0.03451-0.3604 0.03451-1.2192 0-1.2192-1.2844v-2.4998h-0.60194v-0.30672l0.60194-0.26455 0.26838-0.89716h0.36806v0.97384h1.2192v0.49458h-1.2192v2.4729q0 0.37957 0.1802 0.58277 0.1802 0.2032 0.49459 0.2032z\u0022/\u003e\n- \u003c/g\u003e\n- \u003cg fill\u003d\u0022#fff\u0022\u003e\n- \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.3317px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Content\u0022\u003e\n- \u003cpath d\u003d\u0022m-332.67-30.173q-0.5931 0-0.93764 0.39622-0.34208 0.39376-0.34208 1.0804 0 0.70631 0.32977 1.0927 0.33224 0.38392 0.94503 0.38392 0.37653 0 0.85889-0.13536v0.36669q-0.37407 0.14028-0.92288 0.14028-0.7949 0-1.228-0.48236-0.43067-0.48236-0.43067-1.3708 0-0.55619 0.20672-0.97456 0.20919-0.41837 0.60049-0.64478 0.39376-0.22641 0.92533-0.22641 0.56603 0 0.98933 0.20672l-0.1772 0.35931q-0.40852-0.19196-0.81705-0.19196z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-328.77-28.248q0 0.65955-0.33224 1.0312-0.33223 0.36915-0.91795 0.36915-0.36177 0-0.64233-0.16981-0.28055-0.16981-0.43313-0.48728-0.15259-0.31747-0.15259-0.74322 0-0.65955 0.32978-1.0262 0.32977-0.36915 0.91549-0.36915 0.56603 0 0.89827 0.37653 0.3347 0.37653 0.3347 1.0189zm-2.0549 0q0 0.51681 0.20672 0.78752 0.20673 0.27071 0.60787 0.27071t0.60787-0.26825q0.20918-0.27071 0.20918-0.78998 0-0.51435-0.20918-0.78014-0.20673-0.26825-0.61279-0.26825-0.40115 0-0.60541 0.26333-0.20426 0.26333-0.20426 0.78506z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-326.21-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15012-0.16243-0.47005-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33223l0.0664 0.36915h0.0197q0.12551-0.19934 0.35192-0.30762 0.22642-0.11075 0.50451-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-324.09-27.185q0.10828 0 0.20918-0.01477 0.1009-0.01723 0.15997-0.03445v0.31255q-0.0665 0.03199-0.19688 0.05168-0.12797 0.02215-0.23134 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38637v-0.19688l0.38637-0.16981 0.17227-0.57588h0.23626v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11566 0.13043 0.31747 0.13043z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-322.04-26.848q-0.59802 0-0.94502-0.36423-0.34454-0.36423-0.34454-1.0115 0-0.65217 0.31993-1.0361 0.32239-0.38392 0.86381-0.38392 0.50697 0 0.80229 0.3347 0.29532 0.33224 0.29532 0.87858v0.25841h-1.8581q0.0123 0.47497 0.23872 0.72107 0.22887 0.2461 0.64232 0.2461 0.4356 0 0.86135-0.18212v0.36423q-0.21657 0.09352-0.41099 0.13289-0.19195 0.04184-0.46513 0.04184zm-0.11074-2.4536q-0.32485 0-0.51927 0.21165-0.19196 0.21165-0.22642 0.58572h1.4102q0-0.38638-0.17227-0.59064-0.17227-0.20672-0.4922-0.20672z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-318.51-26.897v-1.7449q0-0.32978-0.15012-0.4922-0.15013-0.16243-0.47006-0.16243-0.42329 0-0.62017 0.22887-0.19688 0.22887-0.19688 0.75553v1.4151h-0.40853v-2.6973h0.33224l0.0664 0.36915h0.0197q0.12552-0.19934 0.35193-0.30762 0.22641-0.11075 0.5045-0.11075 0.48728 0 0.73338 0.23626 0.2461 0.2338 0.2461 0.75061v1.7596z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-316.4-27.185q0.10829 0 0.20919-0.01477 0.1009-0.01723 0.15996-0.03445v0.31255q-0.0664 0.03199-0.19688 0.05168-0.12797 0.02215-0.23133 0.02215-0.7826 0-0.7826-0.82444v-1.6046h-0.38638v-0.19688l0.38638-0.16981 0.17227-0.57588h0.23625v0.6251h0.7826v0.31747h-0.7826v1.5873q0 0.24364 0.11567 0.37407 0.11567 0.13043 0.31747 0.13043z\u0022/\u003e\n- \u003c/g\u003e\n- \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32428px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Security\u0022\u003e\n- \u003cpath d\u003d\u0022m-332.03-22.859q0 0.46434-0.33683 0.72417-0.33682 0.25984-0.91423 0.25984-0.62553 0-0.96236-0.1612v-0.39456q0.21653 0.09142 0.47155 0.14435 0.25503 0.05293 0.50524 0.05293 0.409 0 0.61591-0.15398 0.20691-0.15638 0.20691-0.43306 0-0.18285-0.0746-0.29833-0.0722-0.11789-0.2454-0.21653-0.17082-0.09864-0.52208-0.22375-0.4908-0.17563-0.70252-0.41622-0.20931-0.24059-0.20931-0.62794 0-0.4066 0.30555-0.64718t0.80838-0.24059q0.52448 0 0.96476 0.19247l-0.12751 0.35607q-0.43547-0.18285-0.84687-0.18285-0.3248 0-0.50765 0.13954-0.18284 0.13954-0.18284 0.38735 0 0.18285 0.0674 0.30074 0.0674 0.11548 0.22615 0.21412 0.1612 0.09624 0.4908 0.21412 0.55336 0.19728 0.76027 0.42344 0.20931 0.22615 0.20931 0.58704z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-330.26-21.875q-0.58463 0-0.92386-0.35607-0.33683-0.35607-0.33683-0.98882 0-0.63756 0.31277-1.0129 0.31517-0.37532 0.84446-0.37532 0.49562 0 0.78432 0.3272 0.28871 0.3248 0.28871 0.8589v0.25262h-1.8164q0.012 0.46434 0.23338 0.70492 0.22374 0.24059 0.62793 0.24059 0.42584 0 0.84206-0.17804v0.35607q-0.21171 0.09142-0.40178 0.12992-0.18766 0.0409-0.45471 0.0409zm-0.10827-2.3987q-0.31757 0-0.50764 0.20691-0.18766 0.20691-0.22134 0.5726h1.3786q0-0.37772-0.16841-0.57741-0.16841-0.2021-0.48118-0.2021z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-327.56-21.875q-0.5726 0-0.88777-0.35126-0.31277-0.35366-0.31277-0.99844 0-0.66162 0.31758-1.0225 0.31998-0.36088 0.90942-0.36088 0.19007 0 0.38013 0.0409 0.19007 0.0409 0.29833 0.09624l-0.1227 0.33923q-0.13232-0.05293-0.2887-0.08661-0.15639-0.03609-0.27668-0.03609-0.80357 0-0.80357 1.0249 0 0.48599 0.19488 0.74582 0.19728 0.25984 0.58223 0.25984 0.3296 0 0.67605-0.14195v0.35366q-0.26465 0.13714-0.66643 0.13714z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-325.89-24.56v1.7106q0 0.32239 0.14676 0.48118 0.14675 0.15879 0.45952 0.15879 0.41381 0 0.60388-0.22615 0.19247-0.22615 0.19247-0.73861v-1.3858h0.39938v2.6369h-0.32961l-0.0577-0.35367h-0.0217q-0.1227 0.19488-0.34163 0.29833-0.21653 0.10345-0.49561 0.10345-0.48118 0-0.72177-0.22856-0.23818-0.22856-0.23818-0.73139v-1.725z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-322.04-24.608q0.17563 0 0.31517 0.02887l-0.0553 0.37051q-0.1636-0.03609-0.2887-0.03609-0.31999 0-0.54855 0.25984-0.22615 0.25984-0.22615 0.64718v1.4147h-0.39938v-2.6369h0.32961l0.0457 0.4884h0.0192q0.14676-0.25743 0.35366-0.39697 0.20691-0.13954 0.45472-0.13954z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-320.83-21.923h-0.39938v-2.6369h0.39938zm-0.43306-3.3514q0-0.13714 0.0674-0.19969 0.0674-0.06496 0.16841-0.06496 0.0962 0 0.16601 0.06496 0.0698 0.06496 0.0698 0.19969 0 0.13473-0.0698 0.2021-0.0698 0.06496-0.16601 0.06496-0.10105 0-0.16841-0.06496-0.0674-0.06736-0.0674-0.2021z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-319.13-22.205q0.10586 0 0.2045-0.01443 0.0986-0.01684 0.15638-0.03368v0.30555q-0.065 0.03128-0.19247 0.05052-0.1251 0.02165-0.22615 0.02165-0.76507 0-0.76507-0.80597v-1.5686h-0.37773v-0.19247l0.37773-0.16601 0.16841-0.56298h0.23096v0.6111h0.76508v0.31036h-0.76508v1.5518q0 0.23818 0.11308 0.3657t0.31036 0.12751z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-318.66-24.56h0.42825l0.57742 1.5037q0.19006 0.51486 0.23577 0.74342h0.0192q0.0313-0.1227 0.12992-0.41862 0.10105-0.29833 0.6544-1.8285h0.42825l-1.1332 3.0025q-0.16841 0.44509-0.39456 0.63034-0.22375 0.18766-0.55095 0.18766-0.18285 0-0.36088-0.0409v-0.31998q0.13232 0.02887 0.29592 0.02887 0.41141 0 0.58704-0.46193l0.14676-0.37532z\u0022/\u003e\n- \u003c/g\u003e\n- \u003cg transform\u003d\u0022matrix(.70929 0 0 .70929 -99.465 -12.686)\u0022 stroke-width\u003d\u0022.32334px\u0022 style\u003d\u0022font-feature-settings:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal\u0022 aria-label\u003d\u0022Policy\u0022\u003e\n- \u003cpath d\u003d\u0022m-329.37-19.254q0 0.53256-0.36464 0.82043-0.36224 0.28547-1.0387 0.28547h-0.41261v1.3794h-0.40782v-3.5072h0.90919q1.3146 0 1.3146 1.0219zm-1.816 0.75566h0.36703q0.54215 0 0.78445-0.17512 0.24229-0.17512 0.24229-0.56135 0-0.34784-0.2279-0.51817t-0.71008-0.17032h-0.45579z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-326.43-18.086q0 0.64291-0.32386 1.0051-0.32385 0.35984-0.89479 0.35984-0.35264 0-0.62612-0.16552t-0.42221-0.47498q-0.14873-0.30946-0.14873-0.72447 0-0.64291 0.32145-1.0003 0.32146-0.35984 0.8924-0.35984 0.55175 0 0.8756 0.36703 0.32626 0.36704 0.32626 0.99315zm-2.0031 0q0 0.50377 0.20151 0.76765t0.59253 0.26388q0.39103 0 0.59254-0.26148 0.2039-0.26388 0.2039-0.77005 0-0.50137-0.2039-0.76046-0.20151-0.26148-0.59733-0.26148-0.39103 0-0.59014 0.25668-0.19911 0.25668-0.19911 0.76525z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-325.33-16.769h-0.39822v-3.7327h0.39822z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-324.09-16.769h-0.39822v-2.6292h0.39822zm-0.43181-3.3417q0-0.13674 0.0672-0.19911 0.0672-0.06477 0.16793-0.06477 0.0959 0 0.16552 0.06477 0.0696 0.06477 0.0696 0.19911t-0.0696 0.20151q-0.0696 0.06477-0.16552 0.06477-0.10076 0-0.16793-0.06477-0.0672-0.06717-0.0672-0.20151z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-322.19-16.721q-0.57094 0-0.8852-0.35024-0.31186-0.35264-0.31186-0.99555 0-0.6597 0.31666-1.0195 0.31906-0.35984 0.90679-0.35984 0.18951 0 0.37903 0.04078 0.18951 0.04078 0.29746 0.09596l-0.12234 0.33825q-0.13194-0.05278-0.28787-0.08636-0.15593-0.03598-0.27588-0.03598-0.80123 0-0.80123 1.0219 0 0.48458 0.19431 0.74366 0.19671 0.25908 0.58054 0.25908 0.32865 0 0.67409-0.14154v0.35264q-0.26388 0.13674-0.6645 0.13674z\u0022/\u003e\n- \u003cpath d\u003d\u0022m-321.31-19.398h0.427l0.57574 1.4993q0.18952 0.51337 0.2351 0.74127h0.0192q0.0312-0.12234 0.12954-0.41741 0.10076-0.29747 0.65251-1.8232h0.427l-1.1299 2.9938q-0.16792 0.4438-0.39342 0.62852-0.2231 0.18712-0.54935 0.18712-0.18232 0-0.35984-0.04078v-0.31906q0.13194 0.02879 0.29507 0.02879 0.41021 0 0.58533-0.46059l0.14634-0.37423z\u0022/\u003e\n- \u003c/g\u003e\n- \u003c/g\u003e\n- \u003c/g\u003e\n-\u003c/svg\u003e\ndiff --git a/minimal-examples/client-server/minimal-ws-proxy/protocol_lws_minimal.c b/minimal-examples/client-server/minimal-ws-proxy/protocol_lws_minimal.c\ndeleted file mode 100644\nindex 428a27d..0000000\n--- a/minimal-examples/client-server/minimal-ws-proxy/protocol_lws_minimal.c\n+++ /dev/null\n@@ -1,240 +0,0 @@\n-/*\n- * ws protocol handler plugin for \u0022lws-minimal\u0022\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This version uses an lws_ring ringbuffer to cache up to 8 messages at a time,\n- * so it's not so easy to lose messages.\n- */\n-\n-#if !defined (LWS_PLUGIN_STATIC)\n-#define LWS_DLL\n-#define LWS_INTERNAL\n-#include \u003clibwebsockets.h\u003e\n-#endif\n-\n-#include \u003cstring.h\u003e\n-#include \u003cstdlib.h\u003e\n-\n-/* one of these created for each message */\n-\n-struct msg {\n-\tvoid *payload; /* is malloc'd */\n-\tsize_t len;\n-};\n-\n-/* one of these is created for each client connecting to us */\n-\n-struct per_session_data__minimal {\n-\tstruct per_session_data__minimal *pss_list;\n-\tstruct lws *wsi;\n-\tuint32_t tail;\n-};\n-\n-/* one of these is created for each vhost our protocol is used with */\n-\n-struct per_vhost_data__minimal {\n-\tstruct lws_context *context;\n-\tstruct lws_vhost *vhost;\n-\tconst struct lws_protocols *protocol;\n-\n-\tlws_sorted_usec_list_t sul;\n-\n-\tstruct per_session_data__minimal *pss_list; /* linked-list of live pss*/\n-\n-\tstruct lws_ring *ring; /* ringbuffer holding unsent messages */\n-\tstruct lws_client_connect_info i;\n-\tstruct lws *client_wsi;\n-};\n-\n-/* destroys the message when everyone has had a copy of it */\n-\n-static void\n-__minimal_destroy_message(void *_msg)\n-{\n-\tstruct msg *msg \u003d _msg;\n-\n-\tfree(msg-\u003epayload);\n-\tmsg-\u003epayload \u003d NULL;\n-\tmsg-\u003elen \u003d 0;\n-}\n-\n-static void\n-sul_connect_attempt(struct lws_sorted_usec_list *sul)\n-{\n-\tstruct per_vhost_data__minimal *vhd \u003d\n-\t\tlws_container_of(sul, struct per_vhost_data__minimal, sul);\n-\n-\tvhd-\u003ei.context \u003d vhd-\u003econtext;\n-\tvhd-\u003ei.port \u003d 443;\n-\tvhd-\u003ei.address \u003d \u0022libwebsockets.org\u0022;\n-\tvhd-\u003ei.path \u003d \u0022/\u0022;\n-\tvhd-\u003ei.host \u003d vhd-\u003ei.address;\n-\tvhd-\u003ei.origin \u003d vhd-\u003ei.address;\n-\tvhd-\u003ei.ssl_connection \u003d 1;\n-\n-\tvhd-\u003ei.protocol \u003d \u0022dumb-increment-protocol\u0022;\n-\tvhd-\u003ei.local_protocol_name \u003d \u0022lws-minimal-proxy\u0022;\n-\tvhd-\u003ei.pwsi \u003d \u0026vhd-\u003eclient_wsi;\n-\n-\tif (!lws_client_connect_via_info(\u0026vhd-\u003ei))\n-\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n-\t\t\t\t sul_connect_attempt, 10 * LWS_US_PER_SEC);\n-}\n-\n-static int\n-callback_minimal(struct lws *wsi, enum lws_callback_reasons reason,\n-\t\t\tvoid *user, void *in, size_t len)\n-{\n-\tstruct per_session_data__minimal *pss \u003d\n-\t\t\t(struct per_session_data__minimal *)user;\n-\tstruct per_vhost_data__minimal *vhd \u003d\n-\t\t\t(struct per_vhost_data__minimal *)\n-\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n-\t\t\t\t\tlws_get_protocol(wsi));\n-\tconst struct msg *pmsg;\n-\tstruct msg amsg;\n-\tint m;\n-\n-\tswitch (reason) {\n-\n-\t/* --- protocol lifecycle callbacks --- */\n-\n-\tcase LWS_CALLBACK_PROTOCOL_INIT:\n-\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n-\t\t\t\tlws_get_protocol(wsi),\n-\t\t\t\tsizeof(struct per_vhost_data__minimal));\n-\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n-\t\tvhd-\u003eprotocol \u003d lws_get_protocol(wsi);\n-\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n-\n-\t\tvhd-\u003ering \u003d lws_ring_create(sizeof(struct msg), 8,\n-\t\t\t\t\t __minimal_destroy_message);\n-\t\tif (!vhd-\u003ering)\n-\t\t\treturn 1;\n-\n-\t\tsul_connect_attempt(\u0026vhd-\u003esul);\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n-\t\tlws_ring_destroy(vhd-\u003ering);\n-\t\tlws_sul_cancel(\u0026vhd-\u003esul);\n-\t\tbreak;\n-\n-\t/* --- serving callbacks --- */\n-\n-\tcase LWS_CALLBACK_ESTABLISHED:\n-\t\t/* add ourselves to the list of live pss held in the vhd */\n-\t\tlws_ll_fwd_insert(pss, pss_list, vhd-\u003epss_list);\n-\t\tpss-\u003etail \u003d lws_ring_get_oldest_tail(vhd-\u003ering);\n-\t\tpss-\u003ewsi \u003d wsi;\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED:\n-\t\t/* remove our closing pss from the list of live pss */\n-\t\tlws_ll_fwd_remove(struct per_session_data__minimal, pss_list,\n-\t\t\t\t pss, vhd-\u003epss_list);\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_SERVER_WRITEABLE:\n-\t\tpmsg \u003d lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail);\n-\t\tif (!pmsg)\n-\t\t\tbreak;\n-\n-\t\t/* notice we allowed for LWS_PRE in the payload already */\n-\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) + LWS_PRE,\n-\t\t\t pmsg-\u003elen, LWS_WRITE_TEXT);\n-\t\tif (m \u003c (int)pmsg-\u003elen) {\n-\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t\tlws_ring_consume_and_update_oldest_tail(\n-\t\t\tvhd-\u003ering,\t/* lws_ring object */\n-\t\t\tstruct per_session_data__minimal, /* type of objects with tails */\n-\t\t\t\u0026pss-\u003etail,\t/* tail of guy doing the consuming */\n-\t\t\t1,\t\t/* number of payload objects being consumed */\n-\t\t\tvhd-\u003epss_list,\t/* head of list of objects with tails */\n-\t\t\ttail,\t\t/* member name of tail in objects with tails */\n-\t\t\tpss_list\t/* member name of next object in objects with tails */\n-\t\t);\n-\n-\t\t/* more to do? */\n-\t\tif (lws_ring_get_element(vhd-\u003ering, \u0026pss-\u003etail))\n-\t\t\t/* come back as soon as we can write more */\n-\t\t\tlws_callback_on_writable(pss-\u003ewsi);\n-\t\tbreak;\n-\n-\t/* --- client callbacks --- */\n-\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tvhd-\u003eclient_wsi \u003d NULL;\n-\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n-\t\t\t\t sul_connect_attempt, LWS_US_PER_SEC);\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n-\t\tlwsl_user(\u0022%s: established\u005cn\u0022, __func__);\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n-\t\t/* if no clients, just drop incoming */\n-\t\tif (!vhd-\u003epss_list)\n-\t\t\tbreak;\n-\n-\t\tif (!lws_ring_get_count_free_elements(vhd-\u003ering)) {\n-\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\tamsg.len \u003d len;\n-\t\t/* notice we over-allocate by LWS_PRE */\n-\t\tamsg.payload \u003d malloc(LWS_PRE + len);\n-\t\tif (!amsg.payload) {\n-\t\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\tmemcpy((char *)amsg.payload + LWS_PRE, in, len);\n-\t\tif (!lws_ring_insert(vhd-\u003ering, \u0026amsg, 1)) {\n-\t\t\t__minimal_destroy_message(\u0026amsg);\n-\t\t\tlwsl_user(\u0022dropping!\u005cn\u0022);\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\t/*\n-\t\t * let everybody know we want to write something on them\n-\t\t * as soon as they are ready\n-\t\t */\n-\t\tlws_start_foreach_llp(struct per_session_data__minimal **,\n-\t\t\t\t ppss, vhd-\u003epss_list) {\n-\t\t\tlws_callback_on_writable((*ppss)-\u003ewsi);\n-\t\t} lws_end_foreach_llp(ppss, pss_list);\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_CLOSED:\n-\t\tvhd-\u003eclient_wsi \u003d NULL;\n-\t\tlws_sul_schedule(vhd-\u003econtext, 0, \u0026vhd-\u003esul,\n-\t\t\t\t sul_connect_attempt, LWS_US_PER_SEC);\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-#define LWS_PLUGIN_PROTOCOL_MINIMAL \u005c\n-\t{ \u005c\n-\t\t\u0022lws-minimal-proxy\u0022, \u005c\n-\t\tcallback_minimal, \u005c\n-\t\tsizeof(struct per_session_data__minimal), \u005c\n-\t\t128, \u005c\n-\t\t0, NULL, 0 \u005c\n-\t}\ndiff --git a/minimal-examples/client/binance/CMakeLists.txt b/minimal-examples/client/binance/CMakeLists.txt\nnew file mode 100644\nindex 0000000..d9897a1\n--- /dev/null\n+++ b/minimal-examples/client/binance/CMakeLists.txt\n@@ -0,0 +1,53 @@\n+project(lws-minimal-ss-binance C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckIncludeFile)\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(SRCS main.c binance-ss.c)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_WS 1 requirements)\n+require_lws_config(LWS_WITH_CLIENT 1 requirements)\n+require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+\n+require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy)\n+\n+if (requirements)\n+\tadd_executable(${PROJECT_NAME} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME}\n+\t\t\t\t\twebsockets_shared\n+\t\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME}\n+\t\t\t\t\twebsockets\n+\t\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR\n+\t LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\t\tadd_executable(${PROJECT_NAME}-client ${SRCS})\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client\n+\t\t\t\t\t\twebsockets_shared\n+\t\t\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${PROJECT_NAME}-client\n+\t\t\t\t\t\twebsockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client\n+\t\t\t\t\t\twebsockets\n+\t\t\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+\n+endif()\ndiff --git a/minimal-examples/client/binance/README.md b/minimal-examples/client/binance/README.md\nnew file mode 100644\nindex 0000000..5155ddd\n--- /dev/null\n+++ b/minimal-examples/client/binance/README.md\n@@ -0,0 +1,56 @@\n+# lws minimal secure streams binance\n+\n+This is a Secure Streams version of minimal-ws-client-binance.\n+\n+\u0022policy.json\u0022 contains all the information about endpoints, protocols and\n+connection validation, tagged by streamtype name.\n+\n+The example tries to load it from the cwd, it lives in\n+./minimal-examples/secure-streams/minimal-secure-streams-binance dir, so\n+either run it from there, or copy the policy.json to your cwd. It's also\n+possible to put the policy json in the code as a string and pass that at\n+context creation time.\n+\n+The secure stream object represents a nailed-up connection that outlives any\n+single socket connection, and can manage reconnections / retries according to\n+the policy to keep the connection nailed up automatically.\n+\n+Secure Streams provides the same simplified communication api without any\n+protocol dependencies.\n+\n+## build\n+\n+Lws must have been built with `LWS_ROLE_WS\u003d1`, `LWS_WITH_SECURE_STREAMS\u003d1`, and\n+`LWS_WITHOUT_EXTENSIONS\u003d0`\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## Commandline Options\n+\n+Option|Meaning\n+---|---\n+-d|Set logging verbosity\n+\n+## usage\n+\n+```\n+$ ./bin/lws-minimal-ws-client-binance \n+[2021/08/15 06:42:40:8409] U: LWS minimal Secure Streams binance client\n+[2021/08/15 06:42:40:8410] N: LWS: 4.2.99-v4.2.0-156-g8f352f65e8, NET CLI SRV H1 H2 WS SS-JSON-POL SSPROX ConMon FLTINJ IPV6-on\n+[2021/08/15 06:42:40:8410] N: ++ [495958|wsi|0|pipe] (1)\n+[2021/08/15 06:42:40:8411] N: ++ [495958|vh|0|netlink] (1)\n+[2021/08/15 06:42:40:8433] N: ++ [495958|vh|1|digicert||-1] (2)\n+[2021/08/15 06:42:40:8471] N: ++ [495958|wsiSScli|0|binance] (1)\n+[2021/08/15 06:42:40:8471] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: (unset) -\u003e LWSSSCS_CREATING\n+[2021/08/15 06:42:40:8472] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: LWSSSCS_CREATING -\u003e LWSSSCS_CONNECTING\n+[2021/08/15 06:42:40:8472] N: ++ [495958|wsicli|0|WS/h1/fstream.binance.com/([495958|wsiSScli|0|binance])] (1)\n+[2021/08/15 06:42:41:8802] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTING -\u003e LWSSSCS_CONNECTED\n+[2021/08/15 06:42:42:8803] N: sul_hz_cb: price: min: 4669185¢, max: 4672159¢, avg: 4670061¢, (53 prices/s)\n+[2021/08/15 06:42:42:8803] N: sul_hz_cb: elatency: min: 131ms, max: 292ms, avg: 154ms, (53 msg/s)\n+[2021/08/15 06:42:43:8803] N: sul_hz_cb: price: min: 4669646¢, max: 4672159¢, avg: 4669953¢, (34 prices/s)\n+[2021/08/15 06:42:43:8803] N: sul_hz_cb: elatency: min: 130ms, max: 149ms, avg: 133ms, (34 msg/s)\n+[2021/08/15 06:42:44:8804] N: sul_hz_cb: price: min: 4669455¢, max: 4672159¢, avg: 4669904¢, (26 prices/s)\n+...\n+```\ndiff --git a/minimal-examples/client/binance/binance-ss.c b/minimal-examples/client/binance/binance-ss.c\nnew file mode 100644\nindex 0000000..e428d04\n--- /dev/null\n+++ b/minimal-examples/client/binance/binance-ss.c\n@@ -0,0 +1,203 @@\n+/*\n+ * lws-minimal-secure-streams-binance\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ * Kutoga \u003ckutoga@user.github.invalid\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a Secure Streams implementation of a client that connects\n+ * to binance ws server efficiently.\n+ *\n+ * Build lws with -DLWS_WITH_SECURE_STREAMS\u003d1 -DLWS_WITHOUT_EXTENSIONS\u003d0\n+ *\n+ * \u0022policy.json\u0022 contains all the information about endpoints, protocols and\n+ * connection validation, tagged by streamtype name.\n+ *\n+ * The example tries to load it from the cwd, it lives\n+ * in ./minimal-examples/secure-streams/minimal-secure-streams-binance dir, so\n+ * either run it from there, or copy the policy.json to your cwd. It's also\n+ * possible to put the policy json in the code as a string and pass that at\n+ * context creation time.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+#include \u003cctype.h\u003e\n+\n+extern int test_result;\n+\n+typedef struct range {\n+\tuint64_t\t\tsum;\n+\tuint64_t\t\tlowest;\n+\tuint64_t\t\thighest;\n+\n+\tunsigned int\t\tsamples;\n+} range_t;\n+\n+LWS_SS_USER_TYPEDEF\n+\tlws_sorted_usec_list_t\tsul_hz;\t /* 1hz summary dump */\n+\n+\trange_t\t\t\te_lat_range;\n+\trange_t\t\t\tprice_range;\n+} binance_t;\n+\n+\n+static void\n+range_reset(range_t *r)\n+{\n+\tr-\u003esum \u003d r-\u003ehighest \u003d 0;\n+\tr-\u003elowest \u003d 999999999999ull;\n+\tr-\u003esamples \u003d 0;\n+}\n+\n+static uint64_t\n+get_us_timeofday(void)\n+{\n+\tstruct timeval tv;\n+\n+\tgettimeofday(\u0026tv, NULL);\n+\n+\treturn (uint64_t)((lws_usec_t)tv.tv_sec * LWS_US_PER_SEC) +\n+\t\t\t (uint64_t)tv.tv_usec;\n+}\n+\n+static uint64_t\n+pennies(const char *s)\n+{\n+\tuint64_t price \u003d (uint64_t)atoll(s) * 100;\n+\n+\ts \u003d strchr(s, '.');\n+\n+\tif (s \u0026\u0026 isdigit(s[1]) \u0026\u0026 isdigit(s[2]))\n+\t\tprice \u003d price + (uint64_t)((10 * (s[1] - '0')) + (s[2] - '0'));\n+\n+\treturn price;\n+}\n+\n+static void\n+sul_hz_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tbinance_t *bin \u003d lws_container_of(sul, binance_t, sul_hz);\n+\n+\t/*\n+\t * We are called once a second to dump statistics on the connection\n+\t */\n+\n+\tlws_sul_schedule(lws_ss_get_context(bin-\u003ess), 0, \u0026bin-\u003esul_hz,\n+\t\t\t sul_hz_cb, LWS_US_PER_SEC);\n+\n+\tif (bin-\u003eprice_range.samples)\n+\t\tlwsl_ss_user(lws_ss_from_user(bin),\n+\t\t\t \u0022price: min: %llu¢, max: %llu¢, avg: %llu¢, \u0022\n+\t\t\t \u0022(%d prices/s)\u0022,\n+\t\t\t (unsigned long long)bin-\u003eprice_range.lowest,\n+\t\t\t (unsigned long long)bin-\u003eprice_range.highest,\n+\t\t\t (unsigned long long)(bin-\u003eprice_range.sum /\n+\t\t\t\t\t\t bin-\u003eprice_range.samples),\n+\t\t\t bin-\u003eprice_range.samples);\n+\tif (bin-\u003ee_lat_range.samples)\n+\t\tlwsl_ss_user(lws_ss_from_user(bin),\n+\t\t\t \u0022elatency: min: %llums, max: %llums, \u0022\n+\t\t\t \u0022avg: %llums, (%d msg/s)\u0022,\n+\t\t\t (unsigned long long)bin-\u003ee_lat_range.lowest / 1000,\n+\t\t\t (unsigned long long)bin-\u003ee_lat_range.highest / 1000,\n+\t\t\t (unsigned long long)(bin-\u003ee_lat_range.sum /\n+\t\t\t\t\t bin-\u003ee_lat_range.samples) / 1000,\n+\t\t\t bin-\u003ee_lat_range.samples);\n+\n+\trange_reset(\u0026bin-\u003ee_lat_range);\n+\trange_reset(\u0026bin-\u003eprice_range);\n+\n+\ttest_result \u003d 0;\n+}\n+\n+\n+static lws_ss_state_return_t\n+binance_rx(void *userobj, const uint8_t *in, size_t len, int flags)\n+{\n+\tbinance_t *bin \u003d (binance_t *)userobj;\n+\tuint64_t latency_us, now_us;\n+\tchar numbuf[16];\n+\tuint64_t price;\n+\tconst char *p;\n+\tsize_t alen;\n+\n+\tnow_us \u003d (uint64_t)get_us_timeofday();\n+\n+\tp \u003d lws_json_simple_find((const char *)in, len, \u0022\u005c\u0022depthUpdate\u005c\u0022\u0022,\n+\t\t\t\t \u0026alen);\n+\tif (!p)\n+\t\treturn LWSSSSRET_OK;\n+\n+\tp \u003d lws_json_simple_find((const char *)in, len, \u0022\u005c\u0022E\u005c\u0022:\u0022, \u0026alen);\n+\tif (!p) {\n+\t\tlwsl_err(\u0022%s: no E JSON\u005cn\u0022, __func__);\n+\t\treturn LWSSSSRET_OK;\n+\t}\n+\n+\tlws_strnncpy(numbuf, p, alen, sizeof(numbuf));\n+\tlatency_us \u003d now_us - ((uint64_t)atoll(numbuf) * LWS_US_PER_MS);\n+\n+\tif (latency_us \u003c bin-\u003ee_lat_range.lowest)\n+\t\tbin-\u003ee_lat_range.lowest \u003d latency_us;\n+\tif (latency_us \u003e bin-\u003ee_lat_range.highest)\n+\t\tbin-\u003ee_lat_range.highest \u003d latency_us;\n+\n+\tbin-\u003ee_lat_range.sum +\u003d latency_us;\n+\tbin-\u003ee_lat_range.samples++;\n+\n+\tp \u003d lws_json_simple_find((const char *)in, len, \u0022\u005c\u0022a\u005c\u0022:[[\u005c\u0022\u0022, \u0026alen);\n+\tif (!p)\n+\t\treturn LWSSSSRET_OK;\n+\n+\tlws_strnncpy(numbuf, p, alen, sizeof(numbuf));\n+\tprice \u003d pennies(numbuf);\n+\n+\tif (price \u003c bin-\u003eprice_range.lowest)\n+\t\tbin-\u003eprice_range.lowest \u003d price;\n+\tif (price \u003e bin-\u003eprice_range.highest)\n+\t\tbin-\u003eprice_range.highest \u003d price;\n+\n+\tbin-\u003eprice_range.sum +\u003d price;\n+\tbin-\u003eprice_range.samples++;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+binance_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t lws_ss_tx_ordinal_t ack)\n+{\n+\tbinance_t *bin \u003d (binance_t *)userobj;\n+\n+\tlwsl_ss_info(bin-\u003ess, \u0022%s (%d), ord 0x%x\u0022,\n+\t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n+\n+\tswitch (state) {\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\tlws_sul_schedule(lws_ss_get_context(bin-\u003ess), 0, \u0026bin-\u003esul_hz,\n+\t\t\t\t sul_hz_cb, LWS_US_PER_SEC);\n+\t\trange_reset(\u0026bin-\u003ee_lat_range);\n+\t\trange_reset(\u0026bin-\u003eprice_range);\n+\n+\t\treturn LWSSSSRET_OK;\n+\n+\tcase LWSSSCS_DISCONNECTED:\n+\t\tlws_sul_cancel(\u0026bin-\u003esul_hz);\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+LWS_SS_INFO(\u0022binance\u0022, binance_t)\n+\t.rx\t\t\t \u003d binance_rx,\n+\t.state\t\t\t \u003d binance_state,\n+};\ndiff --git a/minimal-examples/client/binance/example-policy.json b/minimal-examples/client/binance/example-policy.json\nnew file mode 100644\nindex 0000000..1ff4e04\n--- /dev/null\n+++ b/minimal-examples/client/binance/example-policy.json\n@@ -0,0 +1,38 @@\n+{\n+\t\u0022release\u0022: \u002201234567\u0022,\n+\t\u0022product\u0022: \u0022myproduct\u0022,\n+\t\u0022schema-version\u0022: 1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022: [1000, 2000, 3000, 4000, 5000],\n+\t\t\t\u0022conceal\u0022: 65535,\n+\t\t\t\u0022jitterpc\u0022: 20,\n+\t\t\t\u0022svalidping\u0022: 30,\n+\t\t\t\u0022svalidhup\u0022: 35\n+\t\t}\n+\t}],\n+\t\u0022certs\u0022: [{\n+\t\t\u0022digicert_global_root\u0022: \u0022MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQkCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4\u003d\u0022\n+ }\n+\t],\n+\t\t\u0022trust_stores\u0022: [{\n+\t\t\t\u0022name\u0022: \u0022digicert\u0022,\n+\t\t\t\u0022stack\u0022: [\u0022digicert_global_root\u0022]\n+\t\t}\n+\t],\n+\t\u0022s\u0022: [\n+\t\t{ \u0022binance\u0022: {\n+\t\t\t\u0022endpoint\u0022:\t\t\u0022fstream.binance.com\u0022,\n+\t\t\t\u0022port\u0022:\t\t\t443,\n+\t\t\t\u0022protocol\u0022:\t\t\u0022ws\u0022,\n+\t\t\t\u0022http_url\u0022:\t\t\u0022/stream?streams\u003dbtcusdt@depth@0ms/btcusdt@bookTicker/btcusdt@aggTrade\u0022,\n+\t\t\t\u0022nailed_up\u0022: \ttrue,\n+\t\t\t\u0022ws_prioritize_reads\u0022:\ttrue,\n+\t\t\t\u0022tls\u0022:\t\t\ttrue,\n+\t\t\t\u0022tls_trust_store\u0022:\t\u0022digicert\u0022,\n+\t\t\t\u0022retry\u0022:\t\t\u0022default\u0022\n+\t\t\t}\n+\t\t}\n+\t]\n+}\n+\ndiff --git a/minimal-examples/client/binance/main.c b/minimal-examples/client/binance/main.c\nnew file mode 100644\nindex 0000000..fad9a59\n--- /dev/null\n+++ b/minimal-examples/client/binance/main.c\n@@ -0,0 +1,79 @@\n+/*\n+ * lws-minimal-secure-streams-binance\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ * Kutoga \u003ckutoga@user.github.invalid\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates a Secure Streams implementation of a client that connects\n+ * to binance ws server efficiently.\n+ *\n+ * Build lws with -DLWS_WITH_SECURE_STREAMS\u003d1 -DLWS_WITHOUT_EXTENSIONS\u003d0\n+ *\n+ * \u0022example-policy.json\u0022 contains all the information about endpoints, protocols\n+ * and connection validation, tagged by streamtype name.\n+ *\n+ * The example tries to load it from the cwd, it lives\n+ * in ./minimal-examples/client/binance dir, so either run it from there, or\n+ * copy the example-policy.json to your cwd. It's also possible to put the\n+ * policy json in the code as a string and pass that at context creation time.\n+ *\n+ * When built to use the SSPC proxy, the local policy is not used since the\n+ * proxy takes care of that.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static struct lws_context *cx;\n+static int interrupted;\n+int test_result \u003d 1;\n+\n+extern const lws_ss_info_t ssi_binance_t;\n+\n+static const struct lws_extension extensions[] \u003d {\n+\t{\n+\t\t\u0022permessage-deflate\u0022, lws_extension_callback_pm_deflate,\n+\t\t\u0022permessage-deflate\u0022 \u0022; client_no_context_takeover\u0022\n+\t\t \u0022; client_max_window_bits\u0022\n+\t},\n+\t{ NULL, NULL, NULL /* terminator */ }\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tlws_default_loop_exit(cx);\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\n+\tlws_context_info_defaults(\u0026info, \u0022example-policy.json\u0022);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tlwsl_user(\u0022LWS minimal Secure Streams binance client\u005cn\u0022);\n+\n+\tinfo.extensions \u003d extensions;\n+\n+\tcx \u003d lws_create_context(\u0026info);\n+\tif (!cx) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_ss_create(cx, 0, \u0026ssi_binance_t, NULL, NULL, NULL, NULL)) {\n+\t\tlwsl_cx_err(cx, \u0022failed to create secure stream\u0022);\n+\t\tinterrupted \u003d 1;\n+\t}\n+\n+\tlws_context_default_loop_run_destroy(cx);\n+\n+\t/* process ret 0 if actual is as expected (0, or--expected-exit 123) */\n+\n+\treturn lws_cmdline_passfail(argc, argv, test_result);\n+}\ndiff --git a/minimal-examples/client/hello_world/CMakeLists.txt b/minimal-examples/client/hello_world/CMakeLists.txt\nnew file mode 100644\nindex 0000000..6321172\n--- /dev/null\n+++ b/minimal-examples/client/hello_world/CMakeLists.txt\n@@ -0,0 +1,193 @@\n+project(lws-minimal-ss-hello_world C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy)\n+require_lws_config(LWS_WITH_SYS_STATE 1 has_sys_state)\n+\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+if (requirements)\n+\n+\tadd_executable(lws-minimal-ss-hello_world\n+\t\t\tmain.c\n+\t\t\thello_world-ss.c)\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME}\n+\t\t\twebsockets_shared\n+\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME}\n+\t\t\twebsockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME}\n+\t\t\twebsockets\n+\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\t### --- this section related to also building example with SSPC / Proxy ---\u003e\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR\n+\t LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${PROJECT_NAME}-client\n+\t\t\t\tmain.c\n+\t\t\t\thello_world-ss.c)\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client\n+\t\t\t\twebsockets_shared\n+\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${PROJECT_NAME}-client\n+\t\t\t\twebsockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client\n+\t\t\t\twebsockets\n+\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+\t### \u003c--- this section related to building with SSPC / Proxy END\n+\n+\n+\n+\t### ---everything else related to ctest / CI -----\u003e\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\n+\t\t#\n+\t\t# When running in CI, wait for a lease on the resources\n+\t\t# before starting this test, so the server does not get\n+\t\t# thousands of simultaneous tls connection attempts\n+\t\t#\n+\t\t# sai-resource holds the lease on the resources until\n+\t\t# the time given in seconds or the sai-resource instance\n+\t\t# exits, whichever happens first\n+\t\t#\n+\t\t# If running under Sai, creates a lock test called \u0022res_sspcmin\u0022 \n+\t\t#\n+\t\t\n+\t\tsai_resource(warmcat_conns 1 40 sspcmin-hello-world)\n+\t\t\n+\t\t#\n+\t\t# simple test not via proxy\n+\t\t#\n+\t\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME mss-warmcat COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME mss-warmcat COMMAND ${PROJECT_NAME})\n+\t\tendif()\n+\n+\t\tset_tests_properties(mss-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/hello_world\n+\t\t\t\t TIMEOUT 40)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(mss-warmcat PROPERTIES FIXTURES_REQUIRED \u0022res_msspcmin\u0022)\t\t \n+\t\tendif()\n+\n+\t\tif (has_fault_injection)\n+\t\t\tif (VALGRIND)\n+\t\t\t\tadd_test(NAME mss-warmcat-fi1 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e\n+\t\t\t\t\t--fault-injection \u0022ss/ss_create_destroy_me\u0022\n+\t\t\t\t\t--expected-exit 1)\n+\t\t\t\tadd_test(NAME mss-warmcat-fi2 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e\n+\t\t\t\t\t--fault-injection \u0022ss/ss_no_streamtype_policy\u0022\n+\t\t\t\t\t--expected-exit 1)\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME mss-warmcat-fi1 COMMAND lws-minimal-secure-streams\n+\t\t\t\t\t --fault-injection \u0022ss/ss_create_destroy_me\u0022\n+\t\t\t\t\t --expected-exit 1)\n+\t\t\t\tadd_test(NAME mss-warmcat-fi2 COMMAND lws-minimal-secure-streams\n+\t\t\t\t\t --fault-injection \u0022ss/ss_no_streamtype_policy\u0022\n+\t\t\t\t\t --expected-exit 1)\n+ \t\t\t endif()\n+\n+\t\t\tset_tests_properties(mss-warmcat-fi1\n+\t\t\t\t\t mss-warmcat-fi2\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/hello_world\n+\t\t\t\t TIMEOUT 5)\n+\n+\t\tendif()\n+\n+\n+\t\tif (has_sys_state AND\n+\t\t (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API))\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-mssp-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-mssp-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_mssproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tmssproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_mssproxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP mssproxy TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_mssproxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tmssproxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_mssproxy PROPERTIES FIXTURES_CLEANUP mssproxy)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\t\tadd_test(NAME msspc-minimal COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}-client\u003e --ssproxy-iface +${CTEST_SOCKET_PATH})\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME msspc-minimal COMMAND ${PROJECT_NAME}-client --ssproxy-iface +${CTEST_SOCKET_PATH})\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset(fixlist \u0022mssproxy\u0022)\n+\t\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\t\tlist(APPEND fixlist \u0022res_mssproxy\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset_tests_properties(msspc-minimal PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/hello_world\n+\t\t\t\tFIXTURES_REQUIRED \u0022${fixlist}\u0022\n+\t\t\t\tTIMEOUT 40)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\t### \u003c--- related to ctest / CI END\n+\n+endif()\n+\ndiff --git a/minimal-examples/client/hello_world/README.md b/minimal-examples/client/hello_world/README.md\nnew file mode 100644\nindex 0000000..d1fdc52\n--- /dev/null\n+++ b/minimal-examples/client/hello_world/README.md\n@@ -0,0 +1,45 @@\n+# SS Example \u0022hello_world\u0022\n+\n+This is the simplest example, showing how to do an https\n+transaction using Secure Streams (SS).\n+\n+SS' approach is to segregate \u0022policy\u0022 (where and how to connect and authenticate\n+for particular kinds of connection) from payloads that are transferred on the\n+connection. In this case, all the information about the example's policy is in\n+`example-policy.json`.\n+\n+|Source|Purpose|\n+|---|---|\n+|main.c|boilerplate to create the lws_context and event loop|\n+|hello_world-ss.c|the secure stream user code|\n+|example-policy.json|the example policy|\n+\n+## Build\n+\n+You should build and install lws itself first. Then with this directory as the\n+cwd, you can use `cmake . \u0026\u0026 make` to build the example. This produces\n+`./lws-minimal-ss-hello_world`.\n+\n+If lws was configured to support SS Proxying with\n+`-DLWS_WITH_SECURE_STREAMS_PROXY_API\u003d1`, then a second executable is also\n+produced `./lws-minimal-ss-hello_world-client`. This does not try to do its own\n+networking, but instead wants to connect to an SS Proxy process that will fulfil\n+connections itself using its own policy.\n+\n+## Running\n+\n+You should be able to run `./lws-minimal-ss-hello_world` directly and see it\n+fetch a webpage (just the start and end of each chunk are logged).\n+\n+To go via the SS Proxy, run `./lws-minimal-ss-hello_world-client` and an SS\n+Proxy, eg, the example one found in `./minimal-examples/ssproxy/ssproxy-socket`.\n+\n+## Options\n+\n+|Commandline option|Meaning|\n+|---|---|\n+|-d \u005c\u003cbitmap\u005c\u003e|Enable logging levels (default 1031 (USER, ERR, WARN, NOTICE), 1039 \u003d +INFO, 1151 \u003d +INFO, DEBUG), `-DCMAKE_BUILD_TYPE\u003dDEBUG` needed for logs more verbose that NOTICE\n+|--ssproxy-port \u005c\u003cport\u005c\u003e|If going via an SS Proxy, default is Unix Domain Socket @proxy.ss.lws, you can force a different proxy's TCP port with this|\n+|--ssproxy-ads \u005c\u003cads\u005c\u003e|Set non-default hostname or IP address proxy is on|\n+|--ssproxy-iface \u005c\u003ciface\u005c\u003e|Set non-default UDS path if starts with +, else interface to bind TCP connection to for proxy|\n+\ndiff --git a/minimal-examples/client/hello_world/example-policy.json b/minimal-examples/client/hello_world/example-policy.json\nnew file mode 100644\nindex 0000000..fd3afea\n--- /dev/null\n+++ b/minimal-examples/client/hello_world/example-policy.json\n@@ -0,0 +1,39 @@\n+{\n+\t\u0022release\u0022: \u00221\u0022,\n+\t\u0022product\u0022: \u0022sx-hello_world\u0022,\n+\t\u0022schema-version\u0022: 1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022: [1000, 2000, 3000, 5000, 10000],\n+\t\t\t\u0022conceal\u0022: 5,\n+\t\t\t\u0022jitterpc\u0022: 20,\n+\t\t\t\u0022svalidping\u0022: 30,\n+\t\t\t\u0022svalidhup\u0022: 35\n+\t\t}\n+\t}],\n+\t\u0022certs\u0022: [{\n+\t\u0022dst_root_x3\u0022: \u0022MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\u0022\n+\t}\n+\t],\n+\t\u0022trust_stores\u0022: [{\n+\t\t\u0022name\u0022: \u0022le_via_dst\u0022,\n+\t\t\u0022stack\u0022: [ \u0022dst_root_x3\u0022 ]\n+\t}],\n+\t\u0022s\u0022: [\n+\t\t{\n+\t\t\t\u0022sx-hello_world\u0022: {\n+\t\t\t\t\u0022endpoint\u0022: \u0022warmcat.com\u0022,\n+\t\t\t\t\u0022port\u0022: 443,\n+\t\t\t\t\u0022protocol\u0022: \u0022h2\u0022,\n+\t\t\t\t\u0022http_method\u0022: \u0022GET\u0022,\n+\t\t\t\t\u0022http_url\u0022: \u0022index.html\u0022,\n+\t\t\t\t\u0022tls\u0022: true,\n+\t\t\t\t\u0022opportunistic\u0022: true,\n+\t\t\t\t\u0022retry\u0022: \u0022default\u0022,\n+\t\t\t\t\u0022timeout_ms\u0022: 2000,\n+\t\t\t\t\u0022tls_trust_store\u0022: \u0022le_via_dst\u0022\n+\t\t\t}\n+\t\t}\t\n+\t]\n+}\n+\ndiff --git a/minimal-examples/client/hello_world/hello_world-ss.c b/minimal-examples/client/hello_world/hello_world-ss.c\nnew file mode 100644\nindex 0000000..58321ec\n--- /dev/null\n+++ b/minimal-examples/client/hello_world/hello_world-ss.c\n@@ -0,0 +1,71 @@\n+/*\n+ * hello_world example\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Demonstrates the simplest example using the LWS high-level SS apis.\n+ *\n+ * - main.c: boilerplate to create the lws_context and event loop\n+ * - hello_world-ss.c: (this file) the secure stream user code\n+ * - example-policy.json: the example policy\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+extern int test_result;\n+\n+LWS_SS_USER_TYPEDEF\n+\t/* Your per-stream instantiation members go here */\n+} hello_world_t;\n+\n+static lws_ss_state_return_t\n+hello_world_rx(void *userobj, const uint8_t *in, size_t len, int flags)\n+{\n+\thello_world_t *g \u003d (hello_world_t *)userobj;\n+\n+\tlwsl_ss_user(lws_ss_from_user(g), \u0022RX %zu, flags 0x%x\u0022, len,\n+\t\t\t\t\t (unsigned int)flags);\n+\n+\tif (len) { /* log the first 16 and last 16 bytes of the chunk */\n+\t\tlwsl_hexdump_notice(in, len \u003e\u003d 16 ? 16 : len);\n+\t\tif (len \u003e\u003d 16)\n+\t\t\tlwsl_hexdump_notice(in + len - 16, 16);\n+\t}\n+\n+\tif ((flags \u0026 LWSSS_FLAG_EOM) \u003d\u003d LWSSS_FLAG_EOM)\n+\t\t/* We received the whole message */\n+\t\ttest_result \u0026\u003d ~2;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+hello_world_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t\t lws_ss_tx_ordinal_t ack)\n+{\n+\thello_world_t *g \u003d (hello_world_t *)userobj;\n+\n+\tswitch ((int)state) {\n+\tcase LWSSSCS_CREATING: /* start the transaction as soon as we exist */\n+\t\treturn lws_ss_request_tx(lws_ss_from_user(g));\n+\n+\tcase LWSSSCS_QOS_ACK_REMOTE: /* server liked our request */\n+\t\ttest_result \u0026\u003d ~1;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_DISCONNECTED: /* for our example, disconnect \u003d done */\n+\t\tlws_default_loop_exit(lws_ss_cx_from_user(g));\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+LWS_SS_INFO(\u0022sx-hello_world\u0022, hello_world_t)\n+\t.rx\t\t\u003d hello_world_rx,\n+\t.state\t\t\u003d hello_world_state,\n+};\ndiff --git a/minimal-examples/client/hello_world/main.c b/minimal-examples/client/hello_world/main.c\nnew file mode 100644\nindex 0000000..739a811\n--- /dev/null\n+++ b/minimal-examples/client/hello_world/main.c\n@@ -0,0 +1,60 @@\n+/*\n+ * hello_world example\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Demonstrates the simplest example using the LWS high-level SS apis.\n+ *\n+ * - main.c: (this file) boilerplate to create the lws_context\n+ *\t\t\t and event loop\n+ * - hello_world-ss.c: the secure stream user code\n+ * - example-policy.json: the example policy\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/* b0: clr when peer ACKed request, b1: clr when recieved whole response */\n+int test_result \u003d 3;\n+\n+extern const lws_ss_info_t ssi_hello_world_t; /* from hello_world-ss.c */\n+\n+static struct lws_context *cx; /* so the SIGINT handler below can access it */\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tlws_default_loop_exit(cx);\n+}\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\n+\tlws_context_info_defaults(\u0026info, \u0022example-policy.json\u0022);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tlwsl_user(\u0022LWS hello_world example [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tif (!(cx \u003d lws_create_context(\u0026info))) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_ss_create(cx, 0, \u0026ssi_hello_world_t, NULL, NULL, NULL, NULL)) {\n+\t\tlwsl_cx_err(cx, \u0022failed to create get secure stream\u0022);\n+\t\tlws_context_destroy(cx);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_context_default_loop_run_destroy(cx);\n+\n+\t/* process ret 0 if actual is as expected (0, or--expected-exit 123) */\n+\n+\treturn lws_cmdline_passfail(argc, argv, test_result);\n+}\ndiff --git a/minimal-examples/client/http-post/CMakeLists.txt b/minimal-examples/client/http-post/CMakeLists.txt\nnew file mode 100644\nindex 0000000..6a4a47a\n--- /dev/null\n+++ b/minimal-examples/client/http-post/CMakeLists.txt\n@@ -0,0 +1,198 @@\n+project(lws-minimal-ss-http-post C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy)\n+require_lws_config(LWS_WITH_SYS_STATE 1 has_sys_state)\n+\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+if (requirements)\n+\n+\tset(SRCS main.c http-post-ss.c)\n+\n+\tadd_executable(${PROJECT_NAME} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME}\n+\t\t\twebsockets_shared\n+\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME}\n+\t\t\twebsockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME}\n+\t\t\twebsockets\n+\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\t### --- this section related to also building example with SSPC / Proxy ---\u003e\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR\n+\t LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${PROJECT_NAME}-client ${SRCS})\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client\n+\t\t\t\twebsockets_shared\n+\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${PROJECT_NAME}-client\n+\t\t\t\twebsockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client\n+\t\t\t\twebsockets\n+\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+\t### \u003c--- this section related to building with SSPC / Proxy END\n+\n+\n+\n+\t### ---everything else related to ctest / CI -----\u003e\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\n+\t\t#\n+\t\t# When running in CI, wait for a lease on the resources\n+\t\t# before starting this test, so the server does not get\n+\t\t# thousands of simultaneous tls connection attempts\n+\t\t#\n+\t\t# sai-resource holds the lease on the resources until\n+\t\t# the time given in seconds or the sai-resource instance\n+\t\t# exits, whichever happens first\n+\t\t#\n+\t\t# If running under Sai, creates a lock test called \u0022res_sspcmin\u0022 \n+\t\t#\n+\t\t\n+\t\tsai_resource(warmcat_conns 1 40 sspcmin-http-post)\n+\t\t\n+\t\t#\n+\t\t# simple test not via proxy\n+\t\t#\n+\t\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME msshttp-post-warmcat COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME msshttp-post-warmcat COMMAND ${PROJECT_NAME})\n+\t\tendif()\n+\n+\t\tset_tests_properties(msshttp-post-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/http-post\n+\t\t\t\t TIMEOUT 40)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(msshttp-post-warmcat PROPERTIES FIXTURES_REQUIRED \u0022res_msspcmin\u0022)\t\t \n+\t\tendif()\n+\n+\t\tif (has_fault_injection)\n+\t\t\tif (VALGRIND)\n+\t\t\t\tadd_test(NAME msshttp-post-warmcat-fi1 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e\n+\t\t\t\t\t--fault-injection \u0022ss/ss_create_destroy_me\u0022\n+\t\t\t\t\t--expected-exit 1)\n+\t\t\t\tadd_test(NAME msshttp-post-warmcat-fi2 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e\n+\t\t\t\t\t--fault-injection \u0022ss/ss_no_streamtype_policy\u0022\n+\t\t\t\t\t--expected-exit 1)\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME msshttp-post-warmcat-fi1 COMMAND lws-minimal-secure-streams\n+\t\t\t\t\t --fault-injection \u0022ss/ss_create_destroy_me\u0022\n+\t\t\t\t\t --expected-exit 1)\n+\t\t\t\tadd_test(NAME msshttp-post-warmcat-fi2 COMMAND lws-minimal-secure-streams\n+\t\t\t\t\t --fault-injection \u0022ss/ss_no_streamtype_policy\u0022\n+\t\t\t\t\t --expected-exit 1)\n+ \t\t\t endif()\n+\n+\t\t\tset_tests_properties(msshttp-post-warmcat-fi1\n+\t\t\t\t\t msshttp-post-warmcat-fi2\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/http-post\n+\t\t\t\t TIMEOUT 5)\n+\n+\t\tendif()\n+\n+\n+\t\tif (has_sys_state AND (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR\n+\t\t\tLWS_WITH_SECURE_STREAMS_PROXY_API))\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-mssphttp-post--$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-mssphttp-post-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_msshttp-post-proxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tmsshttp-post-proxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_msshttp-post-proxy PROPERTIES\n+\t\t\t\t\t\tWORKING_DIRECTORY .\n+\t\t\t\t\t\tFIXTURES_SETUP msshttp-post-proxy\n+\t\t\t\t\t\tTIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_msshttp-post-proxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tmsshttp-post-proxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_msshttp-post-proxy PROPERTIES\n+\t\t\t\t\t\tFIXTURES_CLEANUP msshttp-post-proxy)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\t\tadd_test(NAME msspc-http-post-minimal COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}-client\u003e\n+\t\t\t\t\t--ssproxy-iface +${CTEST_SOCKET_PATH})\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME msspc-http-post-minimal COMMAND\n+\t\t\t\t\t ${PROJECT_NAME}-client\n+\t\t\t\t\t --ssproxy-iface +${CTEST_SOCKET_PATH})\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset(fixlist \u0022msshttp-post-proxy\u0022)\n+\t\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\t\tlist(APPEND fixlist \u0022res_msshttp-post-proxy\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset_tests_properties(msspc-http-post-minimal PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/http-post\n+\t\t\t\tFIXTURES_REQUIRED \u0022${fixlist}\u0022\n+\t\t\t\tTIMEOUT 40)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\t### \u003c--- related to ctest / CI END\n+\n+endif()\n+\ndiff --git a/minimal-examples/client/http-post/README.md b/minimal-examples/client/http-post/README.md\nnew file mode 100644\nindex 0000000..d1fdc52\n--- /dev/null\n+++ b/minimal-examples/client/http-post/README.md\n@@ -0,0 +1,45 @@\n+# SS Example \u0022hello_world\u0022\n+\n+This is the simplest example, showing how to do an https\n+transaction using Secure Streams (SS).\n+\n+SS' approach is to segregate \u0022policy\u0022 (where and how to connect and authenticate\n+for particular kinds of connection) from payloads that are transferred on the\n+connection. In this case, all the information about the example's policy is in\n+`example-policy.json`.\n+\n+|Source|Purpose|\n+|---|---|\n+|main.c|boilerplate to create the lws_context and event loop|\n+|hello_world-ss.c|the secure stream user code|\n+|example-policy.json|the example policy|\n+\n+## Build\n+\n+You should build and install lws itself first. Then with this directory as the\n+cwd, you can use `cmake . \u0026\u0026 make` to build the example. This produces\n+`./lws-minimal-ss-hello_world`.\n+\n+If lws was configured to support SS Proxying with\n+`-DLWS_WITH_SECURE_STREAMS_PROXY_API\u003d1`, then a second executable is also\n+produced `./lws-minimal-ss-hello_world-client`. This does not try to do its own\n+networking, but instead wants to connect to an SS Proxy process that will fulfil\n+connections itself using its own policy.\n+\n+## Running\n+\n+You should be able to run `./lws-minimal-ss-hello_world` directly and see it\n+fetch a webpage (just the start and end of each chunk are logged).\n+\n+To go via the SS Proxy, run `./lws-minimal-ss-hello_world-client` and an SS\n+Proxy, eg, the example one found in `./minimal-examples/ssproxy/ssproxy-socket`.\n+\n+## Options\n+\n+|Commandline option|Meaning|\n+|---|---|\n+|-d \u005c\u003cbitmap\u005c\u003e|Enable logging levels (default 1031 (USER, ERR, WARN, NOTICE), 1039 \u003d +INFO, 1151 \u003d +INFO, DEBUG), `-DCMAKE_BUILD_TYPE\u003dDEBUG` needed for logs more verbose that NOTICE\n+|--ssproxy-port \u005c\u003cport\u005c\u003e|If going via an SS Proxy, default is Unix Domain Socket @proxy.ss.lws, you can force a different proxy's TCP port with this|\n+|--ssproxy-ads \u005c\u003cads\u005c\u003e|Set non-default hostname or IP address proxy is on|\n+|--ssproxy-iface \u005c\u003ciface\u005c\u003e|Set non-default UDS path if starts with +, else interface to bind TCP connection to for proxy|\n+\ndiff --git a/minimal-examples/client/http-post/example-policy.json b/minimal-examples/client/http-post/example-policy.json\nnew file mode 100644\nindex 0000000..2e1698c\n--- /dev/null\n+++ b/minimal-examples/client/http-post/example-policy.json\n@@ -0,0 +1,42 @@\n+{\n+\t\u0022release\u0022:\t\t\u00221\u0022,\n+\t\u0022product\u0022:\t\t\u0022sx-http-post\u0022,\n+\t\u0022schema-version\u0022:\t1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022:\t[1000, 2000, 3000, 5000, 10000],\n+\t\t\t\u0022conceal\u0022:\t5,\n+\t\t\t\u0022jitterpc\u0022:\t20,\n+\t\t\t\u0022svalidping\u0022:\t30,\n+\t\t\t\u0022svalidhup\u0022:\t35\n+\t\t}\n+\t}],\n+\t\u0022certs\u0022: [{\n+\t\t\u0022dst_root_x3\u0022: \u0022MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\u0022\n+\t}\n+\t],\n+\t\u0022trust_stores\u0022: [{\n+\t\t\u0022name\u0022: \u0022le_via_dst\u0022,\n+\t\t\u0022stack\u0022: [ \u0022dst_root_x3\u0022 ]\n+\t}],\n+\t\u0022s\u0022: [\n+\t\t{\n+ \u0022minpost\u0022: {\n+ \u0022endpoint\u0022:\t\t\u0022libwebsockets.org\u0022,\n+ \u0022port\u0022:\t\t\t443,\n+ \u0022protocol\u0022:\t\t\u0022h1\u0022,\n+ \u0022http_method\u0022:\t\t\u0022POST\u0022,\n+ \u0022http_url\u0022:\t\t\u0022testserver/formtest\u0022,\n+ \u0022metadata\u0022: [\n+ { \u0022ctype\u0022:\t\t\u0022Content-Type:\u0022 }\n+ ],\n+ \u0022tls\u0022:\t\t\ttrue,\n+ \u0022opportunistic\u0022:\ttrue,\n+ \u0022allow_redirects\u0022:\ttrue,\n+ \u0022retry\u0022:\t\t\u0022default\u0022,\n+ \u0022tls_trust_store\u0022:\t\u0022le_via_dst\u0022\n+\t\t\t}\n+\t\t}\t\n+\t]\n+}\n+\ndiff --git a/minimal-examples/client/http-post/http-post-ss.c b/minimal-examples/client/http-post/http-post-ss.c\nnew file mode 100644\nindex 0000000..814772f\n--- /dev/null\n+++ b/minimal-examples/client/http-post/http-post-ss.c\n@@ -0,0 +1,214 @@\n+/*\n+ * SS http-post example\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Demonstrates http post using the LWS high-level SS apis.\n+ *\n+ * - main.c: boilerplate to create the lws_context and event loop\n+ * - http-post-ss.c: (this file) the secure stream user code\n+ * - example-policy.json: the example policy\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+extern int test_result;\n+\n+static const char * const postbody \u003d\n+\t\u0022--boundary\u005cr\u005cn\u0022\n+\t\u0022Content-Disposition: form-data; name\u003d\u005c\u0022text\u005c\u0022\u005cr\u005cn\u0022\n+\t\u0022\u005cr\u005cn\u0022\n+\t\u0022value1\u005cr\u005cn\u0022\n+\t\u0022--boundary\u005cr\u005cn\u0022\n+\t\u0022Content-Disposition: form-data; \u0022\n+\t\t\u0022name\u003d\u005c\u0022field2\u005c\u0022; filename\u003d\u005c\u0022example.txt\u005c\u0022\u005cr\u005cn\u0022\n+\t\u0022\u005cr\u005cn\u0022\n+\t\u0022value2\u005cr\u005cn\u0022\n+\t\u002200-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002201-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002202-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002203-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002204-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002205-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002206-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002207-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002208-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002209-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00220f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002210-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002211-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002212-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002213-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002214-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002215-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002216-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002217-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002218-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002219-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00221f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002220-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002221-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002222-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002223-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002224-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002225-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002226-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002227-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002228-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002229-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00222f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002230-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002231-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002232-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002233-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002234-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002235-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002236-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002237-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002238-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002239-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00223f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002240-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002241-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002242-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002243-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002244-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002245-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002246-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002247-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002248-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002249-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u00224f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002250-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002251-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002252-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u002253-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\u005cr\u005cn\u0022\n+\t\u0022--boundary--\u005cr\u005cn\u0022;\n+\n+LWS_SS_USER_TYPEDEF\n+\tconst char\t\t*payload;\n+\tsize_t\t\t\tsize;\n+\tsize_t\t\t\tpos;\n+} http_post_t;\n+\n+static lws_ss_state_return_t\n+http_post_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\t int *flags)\n+{\n+\thttp_post_t *g \u003d (http_post_t *)userobj;\n+\tlws_ss_state_return_t r \u003d LWSSSSRET_OK;\n+\n+\tif (g-\u003esize \u003d\u003d g-\u003epos)\n+\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+\tif (*len \u003e g-\u003esize - g-\u003epos)\n+\t\t*len \u003d g-\u003esize - g-\u003epos;\n+\n+\tif (!g-\u003epos)\n+\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\tmemcpy(buf, g-\u003epayload + g-\u003epos, *len);\n+\tg-\u003epos +\u003d *len;\n+\n+\tif (g-\u003epos !\u003d g-\u003esize)\n+\t\t/* more to do */\n+\t\tr \u003d lws_ss_request_tx(lws_ss_from_user(g));\n+\telse\n+\t\t*flags |\u003d LWSSS_FLAG_EOM;\n+\n+\tlwsl_ss_user(lws_ss_from_user(g), \u0022TX %zu, flags 0x%x, r %d\u0022, *len,\n+\t\t\t\t\t (unsigned int)*flags, (int)r);\n+\n+\treturn r;\n+}\n+\n+static lws_ss_state_return_t\n+http_post_rx(void *userobj, const uint8_t *in, size_t len, int flags)\n+{\n+\thttp_post_t *g \u003d (http_post_t *)userobj;\n+\n+\tlwsl_ss_user(lws_ss_from_user(g), \u0022RX %zu, flags 0x%x\u0022, len,\n+\t\t\t\t\t (unsigned int)flags);\n+\n+\tlwsl_hexdump_notice(in, len);\n+\n+\tif ((flags \u0026 LWSSS_FLAG_EOM) \u003d\u003d LWSSS_FLAG_EOM)\n+\t\t/* We received the whole response */\n+\t\ttest_result \u0026\u003d ~2;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static lws_ss_state_return_t\n+http_post_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t\tlws_ss_tx_ordinal_t ack)\n+{\n+\thttp_post_t *g \u003d (http_post_t *)userobj;\n+\n+\tswitch ((int)state) {\n+\tcase LWSSSCS_CREATING:\n+\t\tif (lws_ss_set_metadata(lws_ss_from_user(g), \u0022ctype\u0022,\n+\t\t\t\t \u0022multipart/form-data;boundary\u003d\u005c\u0022boundary\u005c\u0022\u0022,\n+\t\t\t\t 39))\n+\t\t\treturn LWSSSSRET_DISCONNECT_ME;\n+\n+\t\t/* provide a hint about the payload size */\n+\t\tg-\u003epos \u003d 0;\n+\t\tg-\u003epayload \u003d postbody;\n+\t\tg-\u003esize \u003d strlen(g-\u003epayload);\n+\n+\t\tlwsl_ss_user(lws_ss_from_user(g), \u0022Preparing to send %zu\u0022,\n+\t\t\t\t\t\t g-\u003esize);\n+\n+\t\treturn lws_ss_request_tx_len(lws_ss_from_user(g),\n+\t\t\t\t\t\t(unsigned long)g-\u003esize);\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\treturn lws_ss_request_tx(lws_ss_from_user(g));\n+\n+\tcase LWSSSCS_QOS_ACK_REMOTE: /* server liked our request */\n+\t\ttest_result \u0026\u003d ~1;\n+\t\tbreak;\n+\n+\tcase LWSSSCS_DISCONNECTED: /* for our example, disconnect \u003d done */\n+\t\tlws_default_loop_exit(lws_ss_cx_from_user(g));\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+LWS_SS_INFO(\u0022minpost\u0022, http_post_t)\n+\t.tx\t\t\u003d http_post_tx,\n+\t.rx\t\t\u003d http_post_rx,\n+\t.state\t\t\u003d http_post_state,\n+};\ndiff --git a/minimal-examples/client/http-post/main.c b/minimal-examples/client/http-post/main.c\nnew file mode 100644\nindex 0000000..402a15c\n--- /dev/null\n+++ b/minimal-examples/client/http-post/main.c\n@@ -0,0 +1,60 @@\n+/*\n+ * http post example\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Demonstrates http post using the LWS high-level SS apis.\n+ *\n+ * - main.c: (this file) boilerplate to create the lws_context\n+ *\t\t\t and event loop\n+ * - http-post-ss.c: the secure stream user code\n+ * - example-policy.json: the example policy\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/* b0: clr when peer ACKed request, b1: clr when recieved whole response */\n+int test_result \u003d 3;\n+\n+extern const lws_ss_info_t ssi_http_post_t; /* from hello_world-ss.c */\n+\n+static struct lws_context *cx; /* so the SIGINT handler below can access it */\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tlws_default_loop_exit(cx);\n+}\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\n+\tlws_context_info_defaults(\u0026info, \u0022example-policy.json\u0022);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tlwsl_user(\u0022LWS SS http-post example [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tif (!(cx \u003d lws_create_context(\u0026info))) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_ss_create(cx, 0, \u0026ssi_http_post_t, NULL, NULL, NULL, NULL)) {\n+\t\tlwsl_cx_err(cx, \u0022failed to create get secure stream\u0022);\n+\t\tlws_context_destroy(cx);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_context_default_loop_run_destroy(cx);\n+\n+\t/* process ret 0 if actual is as expected (0, or--expected-exit 123) */\n+\n+\treturn lws_cmdline_passfail(argc, argv, test_result);\n+}\ndiff --git a/minimal-examples/client/ws-echo/CMakeLists.txt b/minimal-examples/client/ws-echo/CMakeLists.txt\nnew file mode 100644\nindex 0000000..86759e4\n--- /dev/null\n+++ b/minimal-examples/client/ws-echo/CMakeLists.txt\n@@ -0,0 +1,194 @@\n+project(lws-minimal-ss-ws-echo C)\n+cmake_minimum_required(VERSION 2.8.12)\n+find_package(libwebsockets CONFIG REQUIRED)\n+list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n+include(CheckCSourceCompiles)\n+include(LwsCheckRequirements)\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements)\n+\n+require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection)\n+require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy)\n+require_lws_config(LWS_WITH_SYS_STATE 1 has_sys_state)\n+\n+CHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\u005cn return 0;\u005cn #else\u005cn fail\u005cn #endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\n+if (requirements)\n+\n+\tset(SRCS main.c ws-echo-ss.c)\n+\n+\tadd_executable(${PROJECT_NAME} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${PROJECT_NAME}\n+\t\t\twebsockets_shared\n+\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tadd_dependencies(${PROJECT_NAME}\n+\t\t\twebsockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${PROJECT_NAME}\n+\t\t\twebsockets\n+\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\tendif()\n+\n+\t### --- this section related to also building example with SSPC / Proxy ---\u003e\n+\n+\tif (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR\n+\t LWS_WITH_SECURE_STREAMS_PROXY_API)\n+\t\tadd_compile_options(-DLWS_SS_USE_SSPC)\n+\n+\t\tadd_executable(${PROJECT_NAME}-client ${SRCS})\n+\n+\t\tif (websockets_shared)\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client\n+\t\t\t\twebsockets_shared\n+\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\t\tadd_dependencies(${PROJECT_NAME}-client\n+\t\t\t\twebsockets_shared)\n+\t\telse()\n+\t\t\ttarget_link_libraries(${PROJECT_NAME}-client\n+\t\t\t\twebsockets\n+\t\t\t\t${LIBWEBSOCKETS_DEP_LIBS})\n+\t\tendif()\n+\tendif()\n+\n+\t### \u003c--- this section related to building with SSPC / Proxy END\n+\n+\n+\n+\t### ---everything else related to ctest / CI -----\u003e\n+\n+\tfind_program(VALGRIND \u0022valgrind\u0022)\n+\n+\tif (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32)\n+\t\n+\t\t#\n+\t\t# When running in CI, wait for a lease on the resources\n+\t\t# before starting this test, so the server does not get\n+\t\t# thousands of simultaneous tls connection attempts\n+\t\t#\n+\t\t# sai-resource holds the lease on the resources until\n+\t\t# the time given in seconds or the sai-resource instance\n+\t\t# exits, whichever happens first\n+\t\t#\n+\t\t# If running under Sai, creates a lock test called \u0022res_sspcmin\u0022 \n+\t\t#\n+\t\t\n+\t\tsai_resource(warmcat_conns 1 40 sspcmin-ws-echo)\n+\t\t\n+\t\t#\n+\t\t# simple test not via proxy\n+\t\t#\n+\t\n+\t\tif (VALGRIND)\n+\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\tadd_test(NAME mssws_echo-warmcat COMMAND\n+\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e)\n+\t\telse()\n+\t\t\tadd_test(NAME mssws_echo-warmcat COMMAND ${PROJECT_NAME})\n+\t\tendif()\n+\n+\t\tset_tests_properties(mssws_echo-warmcat\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/ws-echo\n+\t\t\t\t TIMEOUT 40)\n+\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\tset_tests_properties(mssws_echo-warmcat PROPERTIES FIXTURES_REQUIRED \u0022res_msspcmin\u0022)\t\t \n+\t\tendif()\n+\n+\t\tif (has_fault_injection)\n+\t\t\tif (VALGRIND)\n+\t\t\t\tadd_test(NAME mssws_echo-warmcat-fi1 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e\n+\t\t\t\t\t--fault-injection \u0022ss/ss_create_destroy_me\u0022\n+\t\t\t\t\t--expected-exit 1)\n+\t\t\t\tadd_test(NAME mssws_echo-warmcat-fi2 COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}\u003e\n+\t\t\t\t\t--fault-injection \u0022ss/ss_no_streamtype_policy\u0022\n+\t\t\t\t\t--expected-exit 1)\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME mssws_echo-warmcat-fi1 COMMAND lws-minimal-secure-streams\n+\t\t\t\t\t --fault-injection \u0022ss/ss_create_destroy_me\u0022\n+\t\t\t\t\t --expected-exit 1)\n+\t\t\t\tadd_test(NAME mssws_echo-warmcat-fi2 COMMAND lws-minimal-secure-streams\n+\t\t\t\t\t --fault-injection \u0022ss/ss_no_streamtype_policy\u0022\n+\t\t\t\t\t --expected-exit 1)\n+ \t\t\t endif()\n+\n+\t\t\tset_tests_properties(mssws_echo-warmcat-fi1\n+\t\t\t\t\t mssws_echo-warmcat-fi2\n+\t\t\t\t PROPERTIES\n+\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/ws-echo\n+\t\t\t\t TIMEOUT 5)\n+\n+\t\tendif()\n+\n+\n+\t\tif (has_sys_state AND (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR\n+\t\t LWS_WITH_SECURE_STREAMS_PROXY_API))\n+\n+\t\t\t#\n+\t\t\t# Define test dep to bring up and take down the test\n+\t\t\t# proxy\n+\t\t\t#\n+\n+\t\t\tif (${CMAKE_SYSTEM_NAME} MATCHES \u0022Linux\u0022)\n+\t\t\t\t# uds abstract namespace for linux\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022@ctest-msspws_echo--$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\telse()\n+\t\t\t\t# filesystem socket for others\n+\t\t\t\tset(CTEST_SOCKET_PATH \u0022/tmp/ctest-msspws_echo-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}\u0022)\n+\t\t\tendif()\n+\t\t\tadd_test(NAME st_mssws_echo-proxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh\n+\t\t\t\tmssws_echo-proxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH} )\n+\t\t\tset_tests_properties(st_mssws_echo-proxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP mssws_echo-proxy TIMEOUT 800)\n+\n+\t\t\tadd_test(NAME ki_mssws_echo-proxy COMMAND\n+\t\t\t\t${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh\n+\t\t\t\tmssws_echo-proxy $\u003cTARGET_FILE:lws-minimal-secure-streams-proxy\u003e\n+\t\t\t\t-i ${CTEST_SOCKET_PATH})\n+\t\t\tset_tests_properties(ki_mssws_echo-proxy PROPERTIES FIXTURES_CLEANUP mssws_echo-proxy)\n+\n+\t\t\t#\n+\t\t\t# the client part that will connect to the proxy\n+\t\t\t#\n+\n+\t\t\tif (VALGRIND)\n+\t\t\t\tmessage(\u0022testing via valgrind\u0022)\n+\t\t\t\tadd_test(NAME msspcws-echo-minimal COMMAND\n+\t\t\t\t\t${VALGRIND} --tool\u003dmemcheck --leak-check\u003dyes --num-callers\u003d20\n+\t\t\t\t\t$\u003cTARGET_FILE:${PROJECT_NAME}-client\u003e\n+\t\t\t\t\t--ssproxy-iface +${CTEST_SOCKET_PATH})\n+\t\t\telse()\n+\t\t\t\tadd_test(NAME msspcws-echo-minimal COMMAND\n+\t\t\t\t\t ${PROJECT_NAME}-client\n+\t\t\t\t\t --ssproxy-iface +${CTEST_SOCKET_PATH})\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset(fixlist \u0022mssws_echo-proxy\u0022)\n+\t\t\tif (DEFINED ENV{SAI_OVN})\n+\t\t\t\tlist(APPEND fixlist \u0022res_mssws_echo-proxy\u0022)\n+\t\t\tendif()\n+\t\t\t\n+\t\t\tset_tests_properties(msspcws-echo-minimal PROPERTIES\n+\t\t\t\tWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/ws-echo\n+\t\t\t\tFIXTURES_REQUIRED \u0022${fixlist}\u0022\n+\t\t\t\tTIMEOUT 40)\n+\n+\t\tendif()\n+\n+\tendif()\n+\n+\t### \u003c--- related to ctest / CI END\n+\n+endif()\n+\ndiff --git a/minimal-examples/client/ws-echo/README.md b/minimal-examples/client/ws-echo/README.md\nnew file mode 100644\nindex 0000000..9ea8d4c\n--- /dev/null\n+++ b/minimal-examples/client/ws-echo/README.md\n@@ -0,0 +1,44 @@\n+# SS Example \u0022ws-echo\u0022\n+\n+This shows a client doing ws echo, using Secure Streams.\n+\n+SS' approach is to segregate \u0022policy\u0022 (where and how to connect and authenticate\n+for particular kinds of connection) from payloads that are transferred on the\n+connection. In this case, all the information about the example's policy is in\n+`example-policy.json`.\n+\n+|Source|Purpose|\n+|---|---|\n+|main.c|boilerplate to create the lws_context and event loop|\n+|ws-echo-ss.c|the secure stream user code|\n+|example-policy.json|the example policy|\n+\n+## Build\n+\n+You should build and install lws itself first. Then with this directory as the\n+cwd, you can use `cmake . \u0026\u0026 make` to build the example. This produces\n+`./lws-minimal-ss-ws-echo`.\n+\n+If lws was configured to support SS Proxying with\n+`-DLWS_WITH_SECURE_STREAMS_PROXY_API\u003d1`, then a second executable is also\n+produced `./lws-minimal-ss-ws-echo-client`. This does not try to do its own\n+networking, but instead wants to connect to an SS Proxy process that will fulfil\n+connections itself using its own policy.\n+\n+## Running\n+\n+You should be able to run the example directly and see it start to send ws\n+messages every 500ms, and receive them back from the lws mirror server.\n+\n+To go via the SS Proxy, run `./lws-minimal-ss-ws-echo-client` and an SS\n+Proxy, eg, the example one found in `./minimal-examples/ssproxy/ssproxy-socket`.\n+\n+## Options\n+\n+|Commandline option|Meaning|\n+|---|---|\n+|-d \u005c\u003cbitmap\u005c\u003e|Enable logging levels (default 1031 (USER, ERR, WARN, NOTICE), 1039 \u003d +INFO, 1151 \u003d +INFO, DEBUG), `-DCMAKE_BUILD_TYPE\u003dDEBUG` needed for logs more verbose that NOTICE\n+|--ssproxy-port \u005c\u003cport\u005c\u003e|If going via an SS Proxy, default is Unix Domain Socket @proxy.ss.lws, you can force a different proxy's TCP port with this|\n+|--ssproxy-ads \u005c\u003cads\u005c\u003e|Set non-default hostname or IP address proxy is on|\n+|--ssproxy-iface \u005c\u003ciface\u005c\u003e|Set non-default UDS path if starts with +, else interface to bind TCP connection to for proxy|\n+\ndiff --git a/minimal-examples/client/ws-echo/example-policy.json b/minimal-examples/client/ws-echo/example-policy.json\nnew file mode 100644\nindex 0000000..fa8c5bc\n--- /dev/null\n+++ b/minimal-examples/client/ws-echo/example-policy.json\n@@ -0,0 +1,40 @@\n+{\n+\t\u0022release\u0022:\t\t\u00221\u0022,\n+\t\u0022product\u0022:\t\t\u0022sx-http-post\u0022,\n+\t\u0022schema-version\u0022:\t1,\n+\t\u0022retry\u0022: [{\n+\t\t\u0022default\u0022: {\n+\t\t\t\u0022backoff\u0022:\t[1000, 2000, 3000, 5000, 10000],\n+\t\t\t\u0022conceal\u0022:\t5,\n+\t\t\t\u0022jitterpc\u0022:\t20,\n+\t\t\t\u0022svalidping\u0022:\t30,\n+\t\t\t\u0022svalidhup\u0022:\t35\n+\t\t}\n+\t}],\n+\t\u0022certs\u0022: [{\n+\t\t\u0022dst_root_x3\u0022: \u0022MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\u0022\n+\t}\n+\t],\n+\t\u0022trust_stores\u0022: [{\n+\t\t\u0022name\u0022: \u0022le_via_dst\u0022,\n+\t\t\u0022stack\u0022: [ \u0022dst_root_x3\u0022 ]\n+\t}],\n+\t\u0022s\u0022: [\n+\t\t{\n+ \u0022sx_ws_echo\u0022: {\n+ \u0022endpoint\u0022:\t\t\u0022libwebsockets.org\u0022,\n+ \u0022port\u0022:\t\t\t443,\n+ \u0022protocol\u0022:\t\t\u0022ws\u0022,\n+ \u0022ws_subprotocol\u0022:\t\u0022lws-mirror-protocol\u0022,\n+ \u0022http_url\u0022:\t\t\u0022\u0022,\n+ \u0022tls\u0022:\t\t\ttrue,\n+ \u0022nailed_up\u0022:\t\ttrue,\n+ \u0022ws_binary\u0022: true,\n+ \u0022allow_redirects\u0022:\ttrue,\n+ \u0022retry\u0022:\t\t\u0022default\u0022,\n+ \u0022tls_trust_store\u0022:\t\u0022le_via_dst\u0022\n+\t\t\t}\n+\t\t}\t\n+\t]\n+}\n+\ndiff --git a/minimal-examples/client/ws-echo/main.c b/minimal-examples/client/ws-echo/main.c\nnew file mode 100644\nindex 0000000..2b5f95b\n--- /dev/null\n+++ b/minimal-examples/client/ws-echo/main.c\n@@ -0,0 +1,60 @@\n+/*\n+ * ws-echo example\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Demonstrates http post using the LWS high-level SS apis.\n+ *\n+ * - main.c: (this file) boilerplate to create the lws_context\n+ *\t\t\t and event loop\n+ * - ws-echo-ss.c: the secure stream user code\n+ * - example-policy.json: the example policy\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+/* b0: clr when peer ACKed request, b1: clr when recieved whole response */\n+int test_result \u003d 3;\n+\n+extern const lws_ss_info_t ssi_ws_echo_t; /* from hello_world-ss.c */\n+\n+static struct lws_context *cx; /* so the SIGINT handler below can access it */\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tlws_default_loop_exit(cx);\n+}\n+\n+int\n+main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\n+\tlws_context_info_defaults(\u0026info, \u0022example-policy.json\u0022);\n+\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tlwsl_user(\u0022LWS SS ws-echo example [-d\u003cverb\u003e]\u005cn\u0022);\n+\n+\tif (!(cx \u003d lws_create_context(\u0026info))) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tif (lws_ss_create(cx, 0, \u0026ssi_ws_echo_t, NULL, NULL, NULL, NULL)) {\n+\t\tlwsl_cx_err(cx, \u0022failed to create get secure stream\u0022);\n+\t\tlws_context_destroy(cx);\n+\t\treturn 1;\n+\t}\n+\n+\tlws_context_default_loop_run_destroy(cx);\n+\n+\t/* process ret 0 if actual is as expected (0, or--expected-exit 123) */\n+\n+\treturn lws_cmdline_passfail(argc, argv, test_result);\n+}\ndiff --git a/minimal-examples/client/ws-echo/ws-echo-ss.c b/minimal-examples/client/ws-echo/ws-echo-ss.c\nnew file mode 100644\nindex 0000000..85f241f\n--- /dev/null\n+++ b/minimal-examples/client/ws-echo/ws-echo-ss.c\n@@ -0,0 +1,134 @@\n+/*\n+ * SS ws-echo example\n+ *\n+ * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * Demonstrates http post using the LWS high-level SS apis.\n+ *\n+ * - main.c: boilerplate to create the lws_context and event loop\n+ * - ws-echo-ss.c: (this file) the secure stream user code\n+ * - example-policy.json: the example policy\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003csignal.h\u003e\n+\n+extern int test_result;\n+\n+LWS_SS_USER_TYPEDEF\n+\tlws_sorted_usec_list_t\tsul;\n+\tchar\t\t\tmsg[64];\n+\tconst char\t\t*payload;\n+\tsize_t\t\t\tsize;\n+\tsize_t\t\t\tpos;\n+\n+\tint\t\t\tcount;\n+} ws_echo_t;\n+\n+static lws_ss_state_return_t\n+ws_echo_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,\n+\t int *flags)\n+{\n+\tws_echo_t *g \u003d (ws_echo_t *)userobj;\n+\tlws_ss_state_return_t r \u003d LWSSSSRET_OK;\n+\n+\tif (g-\u003esize \u003d\u003d g-\u003epos)\n+\t\treturn LWSSSSRET_TX_DONT_SEND;\n+\n+\tif (*len \u003e g-\u003esize - g-\u003epos)\n+\t\t*len \u003d g-\u003esize - g-\u003epos;\n+\n+\tif (!g-\u003epos)\n+\t\t*flags |\u003d LWSSS_FLAG_SOM;\n+\n+\tmemcpy(buf, g-\u003epayload + g-\u003epos, *len);\n+\tg-\u003epos +\u003d *len;\n+\n+\tif (g-\u003epos !\u003d g-\u003esize)\n+\t\t/* more to do */\n+\t\tr \u003d lws_ss_request_tx(lws_ss_from_user(g));\n+\telse\n+\t\t*flags |\u003d LWSSS_FLAG_EOM;\n+\n+\tlwsl_ss_user(lws_ss_from_user(g), \u0022TX %zu, flags 0x%x, r %d\u0022, *len,\n+\t\t\t\t\t (unsigned int)*flags, (int)r);\n+\n+\treturn r;\n+}\n+\n+static lws_ss_state_return_t\n+ws_echo_rx(void *userobj, const uint8_t *in, size_t len, int flags)\n+{\n+\tws_echo_t *g \u003d (ws_echo_t *)userobj;\n+\n+\tlwsl_ss_user(lws_ss_from_user(g), \u0022RX %zu, flags 0x%x\u0022, len,\n+\t\t\t\t\t (unsigned int)flags);\n+\n+\tlwsl_hexdump_notice(in, len);\n+\n+\tif ((flags \u0026 LWSSS_FLAG_EOM) \u003d\u003d LWSSS_FLAG_EOM)\n+\t\t/* We received the whole response */\n+\t\ttest_result \u0026\u003d ~2;\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+static void\n+sul_cb(lws_sorted_usec_list_t *sul)\n+{\n+\tws_echo_t *g \u003d (ws_echo_t *)lws_container_of(sul, ws_echo_t, sul);\n+\n+\t/* provide a hint about the payload size */\n+\tg-\u003epos \u003d 0;\n+\tg-\u003epayload \u003d g-\u003emsg;\n+\tg-\u003esize \u003d (size_t)lws_snprintf(g-\u003emsg, sizeof(g-\u003emsg),\n+\t\t\t\t\t\u0022hello %d\u0022, g-\u003ecount++);\n+\n+\tif (lws_ss_request_tx_len(lws_ss_from_user(g), (unsigned long)g-\u003esize))\n+\t\tlwsl_notice(\u0022%s: req failed\u005cn\u0022, __func__);\n+\n+\tlws_sul_schedule(lws_ss_cx_from_user(g), 0, \u0026g-\u003esul, sul_cb,\n+\t\t\t LWS_US_PER_SEC / 2);\n+}\n+\n+static lws_ss_state_return_t\n+ws_echo_state(void *userobj, void *h_src, lws_ss_constate_t state,\n+\t\tlws_ss_tx_ordinal_t ack)\n+{\n+\tws_echo_t *g \u003d (ws_echo_t *)userobj;\n+\n+\tswitch ((int)state) {\n+\tcase LWSSSCS_CREATING:\n+\t\t/* run for 5s then exit */\n+\t\tlws_ss_start_timeout(lws_ss_from_user(g), 5000);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_CONNECTED:\n+\t\ttest_result \u0026\u003d ~1;\n+\t\tlws_sul_schedule(lws_ss_cx_from_user(g), 0, \u0026g-\u003esul, sul_cb,\n+\t\t\t\t LWS_US_PER_SEC / 2);\n+\t\tbreak;\n+\n+\tcase LWSSSCS_TIMEOUT:\n+\t\t/* for this test, when our 5s are up, we exit the process */\n+\t\tlws_sul_cancel(\u0026g-\u003esul);\n+\t\tlws_default_loop_exit(lws_ss_cx_from_user(g));\n+\t\tbreak;\n+\n+\tcase LWSSSCS_DISCONNECTED: /* for our example, disconnect \u003d done */\n+\t\tlws_sul_cancel(\u0026g-\u003esul);\n+\t\tlws_default_loop_exit(lws_ss_cx_from_user(g));\n+\t\tbreak;\n+\t}\n+\n+\treturn LWSSSSRET_OK;\n+}\n+\n+LWS_SS_INFO(\u0022sx_ws_echo\u0022, ws_echo_t)\n+\t.tx\t\t\u003d ws_echo_tx,\n+\t.rx\t\t\u003d ws_echo_rx,\n+\t.state\t\t\u003d ws_echo_state,\n+};\ndiff --git a/minimal-examples/crypto/README.md b/minimal-examples/crypto/README.md\ndeleted file mode 100644\nindex 1c95c13..0000000\n--- a/minimal-examples/crypto/README.md\n+++ /dev/null\n@@ -1,7 +0,0 @@\n-|name|tests|\n----|---\n-minimal-crypto-jwe|Examples for lws RFC7516 JWE apis\n-minimal-crypto-jwk|Examples for lws RFC7517 JWK apis\n-minimal-crypto-jws|Examples for lws RFC7515 JWS apis\n-minimal-crypto-x509|Examples for lws X.509 apis\n-\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/CMakeLists.txt b/minimal-examples/crypto/minimal-crypto-cose-key/CMakeLists.txt\ndeleted file mode 100644\nindex 6ee78ae..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-key/CMakeLists.txt\n+++ /dev/null\n@@ -1,55 +0,0 @@\n-project(lws-crypto-cose-key C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-crypto-cose-key)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_COSE 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\t\n-\tadd_test(NAME crypto-cose-key-1\n-\t\t COMMAND lws-crypto-cose-key --stdin set1.cks )\n-\tadd_test(NAME crypto-cose-key-2\n-\t\t COMMAND lws-crypto-cose-key --kty EC2 --curve P-256 --kid ctest-256 --stdout ctest-ec-256.key)\n-\tadd_test(NAME crypto-cose-key-3\n-\t\t COMMAND lws-crypto-cose-key --kty EC2 --curve P-384 --kid ctest-384 --stdout ctest-ec-384.key)\n-\tadd_test(NAME crypto-cose-key-4\n-\t\t COMMAND lws-crypto-cose-key --kty EC2 --curve P-521 --kid ctest-512 --stdout ctest-ec-512.key)\n-\tadd_test(NAME crypto-cose-key-5\n-\t\t COMMAND lws-crypto-cose-key --kty SYMMETRIC --bits 256 --stdout ctest-sym-256.key)\n-\tadd_test(NAME crypto-cose-key-6\n-\t\t COMMAND lws-crypto-cose-key --kty RSA --bits 2048 --stdout ctest-rsa-2048.key)\n-\tadd_test(NAME crypto-cose-key-7\n-\t\t COMMAND lws-crypto-cose-key --stdin ctest-rsa-2048.key)\n-\n-\tset_tests_properties(crypto-cose-key-1\n-\t\t\t crypto-cose-key-2\n-\t\t\t crypto-cose-key-3\n-\t\t\t crypto-cose-key-4\n-\t\t\t crypto-cose-key-5\n-\t\t\t crypto-cose-key-6\n-\t\t\t crypto-cose-key-7\n-\t\t\t PROPERTIES\n-\t\t \t\tWORKING_DIRECTORY\n-\t\t \t\t\t${CMAKE_SOURCE_DIR}/minimal-examples/crypto/minimal-crypto-cose-key\n-\t\t \t\tTIMEOUT 5)\n-\t\t \t\t\n-\tset_tests_properties(crypto-cose-key-7\n-\t\t\t PROPERTIES\n-\t\t \t\tDEPENDS crypto-cose-key-6)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/README.md b/minimal-examples/crypto/minimal-crypto-cose-key/README.md\ndeleted file mode 100644\nindex f6be13d..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-key/README.md\n+++ /dev/null\n@@ -1,132 +0,0 @@\n-# lws minimal example for cose_key\n-\n-Demonstrates how to create and dump cose_keys.\n-\n-## Dump key or key_set\n-\n-Pipe a cose_key or cose_key_set into stdin to get a textual dump of all the keys\n-inside. You can optionally use --kid kid or --kid-hex HEXSTRING to dump one key\n-from a set.\n-\n-```\n-$ cat set1.cks | ./bin/lws-crypto-cose-key\n-$ cat set1.cks | ./bin/lws-crypto-cose-key --kid 11\n-```\n-\n-## Create keys\n-\n-Stdin is not used, give parameters for the kty and kid etc to create a\n-new key on stdout (which can be redirected to a file).\n-\n-```\n-$ ./bin/lws-crypto-cose-key --kty EC2 --curve P-521 --kid sec512 \u003eec512.key\n-```\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-|Option|Meaning|\n-|---|---|\n-|--kty type|Key type, one of OKP, EC2, RSA or SYMMETRIC|\n-|-k \u005c\u003ckeyset filepath\u005c\u003e|One or a set of cose_keys|\n-|--kid string|Specifies the key ID to use as a string|\n-|--kid-hex HEXSTRING|Specifies the key ID to use as a hex blob|\n-|--curve curve|For EC type key creation, specify the curve|\n-|--stdin filepath|Makes tool fetch from filepath instead of stdin (useful for CI)|\n-|--stdout filepath|Makes tool write to filepath instead of stdout (useful for CI)|\n-\n-\n-HEXSTRING above means a string like `1a2b3c`\n-\n-## Examples\n-\n-### cose_key dumping\n-\n-```\n-$ cat set1.cks | ./bin/lws-crypto-cose-key\n-[2021/07/30 10:14:31:0420] U: LWS cose-key example tool -k keyset [-s alg-name kid ]\n-[2021/07/30 10:14:31:0780] N: lws_create_context: LWS: 4.2.99-v4.2.0-134-g8433c8b459, NET CLI SRV H1 H2 WS ConMon IPV6-on\n-[2021/07/30 10:14:31:0892] N: ++ [wsi|0|pipe] (1)\n-[2021/07/30 10:14:31:0926] N: ++ [vh|0|netlink] (1)\n-[2021/07/30 10:14:31:0977] N: ++ [vh|1|default||-1] (2)\n-[2021/07/30 10:14:31:1057] N: main: importing\n-Cose key #1\n- kty: EC2\n- kid: 11\n- kty: P-256\n- x: bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a09eff\n- d: 57c92077664146e876760c9520d054aa93c3afb04e306705db6090308507b4d3\n- y: 20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbfc117e\n-Cose key #2\n- kty: EC2\n- kid: meriadoc.brandybuck@buckland.example\n- kty: P-256\n- x: 65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c08551d\n- d: aff907c99f9ad3aae6c4cdf21122bce2bd68b5283e6907154ad911840fa208cf\n- y: 1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd0084d19c\n-Cose key #3\n- kty: SYMMETRIC\n- kid: our-secret\n- k: 849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c427188\n-Cose key #4\n- kty: EC2\n- kid: bilbo.baggins@hobbiton.example\n- kty: P-521\n- x: 0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8f42ad\n- d: 00085138ddabf5ca975f5860f91a08e91d6d5f9a76ad4018766a476680b55cd339e8ab6c72b5facdb2a2a50ac25bd086647dd3e2e6e99e84ca2c3609fdf177feb26d\n- y: 01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1d9475\n-Cose key #5\n- kty: SYMMETRIC\n- kid: our-secret2\n- k: 849b5786457c1491be3a76dcea6c4271\n-Cose key #6\n- kty: EC2\n- kid: peregrin.took@tuckborough.example\n- kty: P-256\n- x: 98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91d6280\n- d: 02d1f7e6f26c43d4868d87ceb2353161740aacf1f7163647984b522a848df1c3\n- y: f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf822bb\n-Cose key #7\n- kty: SYMMETRIC\n- kid: 018c0ae5-4d9b-471b-bfd6-eef314bc7037\n- use: 849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c427188\n-Cose key #8\n- kty: SYMMETRIC\n- kid: sec-48\n- k: 849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c42718800112233778899aa2122232425262728\n-Cose key #9\n- kty: SYMMETRIC\n- kid: sec-64\n- k: 849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c42718800112233778899aa2122232425262728aabbccddeeffa5a6a7a8a9a0b1b2b3b4\n-Cose key #10\n- kty: EC2\n- kid: sec384\n- kty: P-384\n- x: ea2866349fe3a2f9ad4d6bfe7c30c527436e901c5fb22210b67b2150574ffcd0b1dd8c43d5d1e3d5cb849ecec202117c\n- d: 4d46a58480d43d5454307edcf501e098ef7c0186cc6b56b41dfd13fe4b9b1ab1425851cf5b23e6636ed18f5bbdde1896\n- y: 4c3d245515a688ef25ff68034089ca4f10a01bef51cc57309f12919c3d484142368795c6f2a5d30af650b4e12d0133e4\n-Cose key #11\n- kty: EC2\n- kid: sec512\n- kty: P-521\n- x: 003b81ed66d8a2194b42f29ecb2c9ae48199be695924804a8407194ed0e172f39693f870f32463e2d36950034a21901487c5a0c43a1713a818fb89fa8a5b3b2dc181\n- d: 013e0f06ce394ac14a3df3953fc560679ad0dee14779ef0d475787451fca71e3b4b827b6f7cedcf00e23c716fb829b5419234ba5c92c33e0bc94351fe97be21f2b82\n- y: 004b9b6b0adf41913b5d700cf43bfe0ee8b79eb58fc308509e574fcb910b3fd5a2ad585affc6776f7fc9d4ff48f5923fe900660ecc6e3720f89c1363eecfffb38b5b\n-[2021/07/30 10:14:31:1430] N: -- [wsi|0|pipe] (0) 52.763ms\n-[2021/07/30 10:14:31:1441] N: -- [vh|0|netlink] (1) 51.437ms\n-[2021/07/30 10:14:31:1491] N: -- [vh|1|default||-1] (0) 51.591ms\n-[2021/07/30 10:14:31:1536] N: main: PASS\n-\n-```\n-\n-### cose_key creation\n-\n-```\n-$ ./bin/lws-crypto-cose-key --kty EC2 --curve P-521 --kid sec512 \u003eec512.key\n-```\n-\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/main.c b/minimal-examples/crypto/minimal-crypto-cose-key/main.c\ndeleted file mode 100644\nindex 5a19e2c..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-key/main.c\n+++ /dev/null\n@@ -1,313 +0,0 @@\n-/*\n- * lws-minimal-crypto-cose-key\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003csys/select.h\u003e\n-#include \u003csys/types.h\u003e\n-#include \u003cstdlib.h\u003e\n-#include \u003cfcntl.h\u003e\n-\n-static int fdin \u003d 0, fdout \u003d 1;\n-\n-static const char *meta_names[] \u003d {\n-\t\u0022kty\u0022, \u0022kid\u0022, \u0022use\u0022, \u0022key_ops\u0022, \u0022base_iv\u0022, \u0022alg\u0022\n-};\n-\n-static const char *oct_names[] \u003d {\n-\t\u0022k\u0022\n-};\n-\n-static const char *rsa_names[] \u003d {\n-\t\u0022e\u0022, \u0022n\u0022, \u0022d\u0022, \u0022p\u0022, \u0022q\u0022, \u0022dp\u0022, \u0022dq\u0022, \u0022qi\u0022, \u0022other\u0022, \u0022ri\u0022, \u0022di\u0022, \u0022ti\u0022\n-};\n-\n-static const char *ec_names[] \u003d {\n-\t\u0022crv\u0022, \u0022x\u0022, \u0022d\u0022, \u0022y\u0022,\n-};\n-\n-static void\n-cose_key_dump(const struct lws_cose_key *ck)\n-{\n-\tconst char **enames;\n-\tchar hex[2048], dump[3072];\n-\tint elems;\n-\tsize_t l;\n-\tint n;\n-\n-\t(void)enames;\n-\t(void)meta_names;\n-\n-\tswitch (ck-\u003egencrypto_kty) {\n-\n-\tcase LWS_GENCRYPTO_KTY_OCT:\n-\t\telems \u003d LWS_GENCRYPTO_OCT_KEYEL_COUNT;\n-\t\tenames \u003d oct_names;\n-\t\tbreak;\n-\tcase LWS_GENCRYPTO_KTY_RSA:\n-\t\telems \u003d LWS_GENCRYPTO_RSA_KEYEL_COUNT;\n-\t\tenames \u003d rsa_names;\n-\t\tbreak;\n-\tcase LWS_GENCRYPTO_KTY_EC:\n-\t\telems \u003d LWS_GENCRYPTO_EC_KEYEL_COUNT;\n-\t\tenames \u003d ec_names;\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tlwsl_err(\u0022%s: jwk %p: unknown type\u005cn\u0022, __func__, ck);\n-\n-\t\treturn;\n-\t}\n-\n-\tfor (n \u003d 0; n \u003c LWS_COUNT_COSE_KEY_ELEMENTS; n++) {\n-\t\tif (ck-\u003emeta[n].buf) {\n-\t\t\tif (n \u003c 2) {\n-\t\t\t\tl \u003d (size_t)lws_snprintf(dump, sizeof(dump),\n-\t\t\t\t\t\t \u0022 %s: %.*s\u005cn\u0022, meta_names[n],\n-\t\t\t\t\t\t (int)ck-\u003emeta[n].len,\n-\t\t\t\t\t\t ck-\u003emeta[n].buf);\n-\t\t\t\twrite(fdout, dump, l);\n-\t\t\t} else {\n-\t\t\t\tl \u003d (size_t)lws_snprintf(dump, sizeof(dump),\n-\t\t\t\t\t\t \u0022 %s: \u0022, meta_names[n]);\n-\t\t\t\twrite(fdout, dump, l);\n-\t\t\t\tlws_hex_from_byte_array(ck-\u003emeta[n].buf,\n-\t\t\t\t\t\t\tck-\u003emeta[n].len,\n-\t\t\t\t\t\t\thex, sizeof(hex));\n-\t\t\t\twrite(fdout, hex, strlen(hex));\n-\t\t\t\twrite(fdout, \u0022\u005cn\u0022, 1);\n-\t\t\t}\n-\t\t}\n-\t}\n-\n-\tfor (n \u003d 0; n \u003c elems; n++) {\n-\t\tif (ck-\u003ee[n].buf) {\n-\t\t\tif (!n \u0026\u0026 ck-\u003egencrypto_kty \u003d\u003d LWS_GENCRYPTO_KTY_EC) {\n-\t\t\t\tl \u003d (size_t)lws_snprintf(dump, sizeof(dump),\n-\t\t\t\t\t\t \u0022 %s: %.*s\u005cn\u0022, enames[n],\n-\t\t\t\t\t\t (int)ck-\u003ee[n].len,\n-\t\t\t\t\t\t ck-\u003ee[n].buf);\n-\t\t\t\twrite(fdout, dump, l);\n-\t\t\t} else {\n-\t\t\t\tl \u003d (size_t)lws_snprintf(dump, sizeof(dump),\n-\t\t\t\t\t\t \u0022 %s: \u0022, enames[n]);\n-\t\t\t\twrite(fdout, dump, l);\n-\t\t\t\tlws_hex_from_byte_array(ck-\u003ee[n].buf,\n-\t\t\t\t\t\t\tck-\u003ee[n].len,\n-\t\t\t\t\t\t\thex, sizeof(hex));\n-\t\t\t\twrite(fdout, hex, strlen(hex));\n-\t\t\t\twrite(fdout, \u0022\u005cn\u0022, 1);\n-\t\t\t}\n-\t\t}\n-\t}\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tuint8_t *kid \u003d NULL, ktmp[4096], set_temp[32 * 1024], temp[256];\n-\tint result \u003d 1, bits \u003d 0,\n-\t logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_context_creation_info info;\n-\tsize_t kid_len \u003d 0, stp \u003d 0;\n-\tstruct lws_context *context;\n-\tlws_cose_key_t *ck \u003d NULL;\n-\tcose_param_t cose_kty \u003d 0;\n-\tlws_dll2_owner_t set;\n-\tconst char *p, *crv;\n-\tlws_lec_pctx_t lec;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\n-\tlwsl_user(\u0022LWS cose-key example tool -k keyset [-s alg-name kid ]\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--stdin\u0022))) {\n-\t\tfdin \u003d open(p, LWS_O_RDONLY, 0);\n-\t\tif (fdin \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: unable to open stdin file\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--stdout\u0022))) {\n-\t\tfdout \u003d open(p, LWS_O_WRONLY | LWS_O_CREAT | LWS_O_TRUNC, 0600);\n-\t\tif (fdout \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: unable to open stdout file\u005cn\u0022, __func__);\n-\t\t\tgoto bail_early;\n-\t\t}\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid\u0022))) {\n-\t\tkid \u003d (uint8_t *)p;\n-\t\tkid_len \u003d strlen(p);\n-\t\t//lwsl_hexdump_notice(kid, kid_len);\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid-hex\u0022))) {\n-\t\tkid_len \u003d (size_t)lws_hex_to_byte_array(p, ktmp, sizeof(ktmp));\n-\t\tkid \u003d (uint8_t *)ktmp;\n-\t}\n-\n-\t/*\n-\t * If we have some stdin queued up, we understand we are dumping\n-\t * an existing cose_key or key_set from stdin\n-\t */\n-\n-\tif (!fdin) {\n-\t\tstruct timeval\ttimeout;\n-\t\tfd_set\tfds;\n-\n-\t\tFD_ZERO(\u0026fds);\n-\t\tFD_SET(0, \u0026fds);\n-\n-\t\ttimeout.tv_sec \u003d 0;\n-\t\ttimeout.tv_usec \u003d 1000;\n-\n-\t\tif (select(fdin + 1, \u0026fds, NULL, NULL, \u0026timeout) \u003c 0)\n-\t\t\tgoto no_stdin;\n-\n-\t\tif (!FD_ISSET(0, \u0026fds))\n-\t\t\tgoto no_stdin;\n-\t}\n-\n-\tdo {\n-\t\tint n \u003d (int)read(fdin, temp, sizeof(temp));\n-\n-\t\tif (n \u003c 0)\n-\t\t\tgoto bail;\n-\t\tif (!n) {\n-\t\t\tint kc \u003d 0;\n-\n-\t\t\tif (!stp)\n-\t\t\t\t/* there was no stdin */\n-\t\t\t\tbreak;\n-\n-\t\t\tlwsl_notice(\u0022%s: importing\u005cn\u0022, __func__);\n-\n-\t\t\tlws_dll2_owner_clear(\u0026set);\n-\t\t\tck \u003d lws_cose_key_import(\u0026set, NULL, NULL, set_temp, stp);\n-\t\t\tif (!ck) {\n-\t\t\t\tlwsl_err(\u0022%s: import failed\u005cn\u0022, __func__);\n-\t\t\t\tgoto bail;\n-\t\t\t}\n-\n-\t\t\tlws_start_foreach_dll(struct lws_dll2 *, p,\n-\t\t\t\t\t\tlws_dll2_get_head(\u0026set)) {\n-\t\t\t\tlws_cose_key_t *ck \u003d lws_container_of(p,\n-\t\t\t\t\t\t\tlws_cose_key_t, list);\n-\t\t\t\tstruct lws_gencrypto_keyelem *ke \u003d\n-\t\t\t\t\t\t\u0026ck-\u003emeta[COSEKEY_META_KID];\n-\n-\t\t\t\tkc++;\n-\n-\t\t\t\tif (!kid_len || (ke-\u003elen \u0026\u0026\n-\t\t\t\t ke-\u003elen \u003d\u003d (uint32_t)kid_len \u0026\u0026\n-\t\t\t\t !memcmp(ke-\u003ebuf, kid, kid_len))) {\n-\t\t\t\t\t printf(\u0022Cose key #%d\u005cn\u0022, kc);\n-\t\t\t\t\t cose_key_dump(ck);\n-\t\t\t\t}\n-\n-\t\t\t} lws_end_foreach_dll(p);\n-\n-\t\t\tlws_cose_key_set_destroy(\u0026set);\n-\t\t\tresult \u003d 0;\n-\t\t\tgoto bail;\n-\n-\t\t}\n-\n-\t\tif (stp + (size_t)n \u003e sizeof(set_temp)) {\n-\t\t\tlwsl_err(\u0022%s: stdin bigger than our buffer\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\t\tmemcpy(set_temp + stp, temp, (size_t)n);\n-\t\tstp +\u003d (size_t)n;\n-\t} while (1);\n-\n-no_stdin:\n-\n-\t/*\n-\t *\n-\t */\n-\n-\tp \u003d lws_cmdline_option(argc, argv, \u0022--kty\u0022);\n-\tif (!p) {\n-\t\tlwsl_err(\u0022%s: use --kty OKP|EC2|RSA|SYMMETRIC\u005cn\u0022,\n-\t\t\t\t\t__func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (!strcmp(p, \u0022OKP\u0022))\n-\t\tcose_kty \u003d LWSCOSE_WKKTV_OKP;\n-\tif (!strcmp(p, \u0022EC2\u0022))\n-\t\tcose_kty \u003d LWSCOSE_WKKTV_EC2;\n-\tif (!strcmp(p, \u0022RSA\u0022))\n-\t\tcose_kty \u003d LWSCOSE_WKKTV_RSA;\n-\tif (!strcmp(p, \u0022SYMMETRIC\u0022) || !strcmp(p, \u0022SYM\u0022))\n-\t\tcose_kty \u003d LWSCOSE_WKKTV_SYMMETRIC;\n-\n-\tif (!cose_kty) {\n-\t\tlwsl_err(\u0022%s: use --kty OKP|EC2|RSA|SYMMETRIC\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tcrv \u003d NULL;\n-\tif (cose_kty \u003d\u003d LWSCOSE_WKKTV_OKP ||\n-\t cose_kty \u003d\u003d LWSCOSE_WKKTV_EC2) {\n-\t\tcrv \u003d lws_cmdline_option(argc, argv, \u0022--curve\u0022);\n-\t\tif (!crv) {\n-\t\t\tlwsl_err(\u0022%s: use --curve P-256 etc\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\t}\n-\n-\tp \u003d lws_cmdline_option(argc, argv, \u0022--bits\u0022);\n-\tif (p)\n-\t\tbits \u003d atoi(p);\n-\n-\tck \u003d lws_cose_key_generate(context, cose_kty, 0, bits, crv,\n-\t\t\t\t kid, kid_len);\n-\tif (!ck)\n-\t\tgoto bail;\n-\n-\tlws_lec_init(\u0026lec, ktmp, sizeof(ktmp));\n-\tlws_cose_key_export(ck, \u0026lec, LWSJWKF_EXPORT_PRIVATE);\n-\twrite(fdout, ktmp, lec.used);\n-\n-\tlws_cose_key_destroy(\u0026ck);\n-\tresult \u003d 0;\n-\n-bail:\n-\tlws_context_destroy(context);\n-\n-\tif (result)\n-\t\tlwsl_err(\u0022%s: FAIL: %d\u005cn\u0022, __func__, result);\n-\telse\n-\t\tlwsl_notice(\u0022%s: PASS\u005cn\u0022, __func__);\n-\n-bail_early:\n-\tif (fdin \u003e 0)\n-\t\tclose(fdin);\n-\tif (fdout !\u003d 1 \u0026\u0026 fdout \u003e\u003d 0)\n-\t\tclose(fdout);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/set1.cks b/minimal-examples/crypto/minimal-crypto-cose-key/set1.cks\ndeleted file mode 100644\nindex e5eca18..0000000\nBinary files a/minimal-examples/crypto/minimal-crypto-cose-key/set1.cks and /dev/null differ\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass01.sig b/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass01.sig\ndeleted file mode 100644\nindex d78767e..0000000\nBinary files a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass01.sig and /dev/null differ\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass02.sig b/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass02.sig\ndeleted file mode 100644\nindex 2b53930..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass02.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-Ò„C¡\u0001\u0026¡\u0004B11TThis is the content.X@\u0010rœ×\u0011Ë8\u0013ØØéD¨Úq\u0011ç²XɽÊa5÷®\u001aÛî•\t‰\u0012gƒ~\u001e3½6ÁP2jæ'UƽŽT\u000c\u003e’×Ò%èÛr¸‚\u000b\n\u005c No newline at end of file\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass03.sig b/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass03.sig\ndeleted file mode 100644\nindex a10fc96..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass03.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-„C¡\u0001\u0026¡\u0004B11TThis is the content.X@޳\u003eL£\u001d\u001cFZ°Z¬4Ìk#Õï\u005c\u00081\u0006ÄÒZ‘®ð°\u0011~*ù¢‘ª2áJ¸4ÜVí*\u00224DT~\u0001ñ\u001d;\t\u0016å¤ÃEÊË6\n\u005c No newline at end of file\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass01.sig b/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass01.sig\ndeleted file mode 100644\nindex 268b086..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass01.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-Øb„A TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@⮯Ô\riÑþnR\u0007|]ôä\u0008(,¾û]\u0006Ëô\u0014¯.\u0019Ù‚¬E¬˜¸TL‹E\u0007Þ\u001e·\u0017ÃÓH\u0016þ’j+˜õ:ý/ ó\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass02.sig b/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass02.sig\ndeleted file mode 100644\nindex b80f7a2..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass02.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-Øb„@ TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@˸ÚÙ¾¯¸á¤\u0014\u0012M‹ûÂkíò©OËZˆ$2¿öÖ\u003e\u0015õtQØ?¢Ëö\u0026rëôÇÙ“°ôÂDvGØ1ºW̨k“\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass03.sig b/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass03.sig\ndeleted file mode 100644\nindex 60d8f03..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass03.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-„@ TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@⮯Ô\riÑþnR\u0007|]ôä\u0008(,¾û]\u0006Ëô\u0014¯.\u0019Ù‚¬E¬˜¸TL‹E\u0007Þ\u001e·\u0017ÃÓH\u0016þ’j+˜õ:ý/ ó\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/CMakeLists.txt b/minimal-examples/crypto/minimal-crypto-cose-sign/CMakeLists.txt\ndeleted file mode 100644\nindex b49b417..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/CMakeLists.txt\n+++ /dev/null\n@@ -1,219 +0,0 @@\n-project(lws-crypto-cose-sign C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-crypto-cose-sign)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_COSE 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\t# EC signing\n-\t\n-\tadd_test(NAME crypto-cose-sign-1\n-\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid 11\n-\t\t \t--alg ES256 --cose-sign\n-\t\t \t--stdin payload.txt\n-\t\t \t--stdout ctest-sig-es256.sig)\n-\tadd_test(NAME crypto-cose-sign-2\n-\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec384\n-\t\t \t--alg ES384 --cose-sign\n-\t\t \t--stdin payload.txt\n-\t\t \t--stdout ctest-sig-es384.sig)\n-\tadd_test(NAME crypto-cose-sign-3\n-\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec512\n-\t\t \t--alg ES512 --cose-sign\n-\t\t \t--stdin payload.txt\n-\t\t \t--stdout ctest-sig-es512.sig)\n-\n-\t# EC validation\n-\t\t \t\t\n-\tadd_test(NAME crypto-cose-sign-4\n-\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-\t\t \t--stdout r1.txt\n-\t\t \t--stdin ctest-sig-es256.sig)\n-\tset_tests_properties(crypto-cose-sign-4\tPROPERTIES\n-\t\t\t\t\t\tDEPENDS crypto-cose-sign-1)\n-\t\t \t\n-\tadd_test(NAME crypto-cose-sign-5\n-\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-\t\t \t--stdout r2.txt\n-\t\t \t--stdin ctest-sig-es384.sig)\n-\tset_tests_properties(crypto-cose-sign-5\tPROPERTIES\n-\t\t\t\t\t\tDEPENDS crypto-cose-sign-2)\n-\t\t \t\n-\tadd_test(NAME crypto-cose-sign-6\n-\t\t COMMAND lws-crypto-cose-sign -k set1.cks --cose-sign\n-\t\t \t--stdout r3.txt\n-\t\t \t--stdin ctest-sig-es512.sig)\n-\tset_tests_properties(crypto-cose-sign-6\tPROPERTIES\n-\t\t\t\t\t\tDEPENDS crypto-cose-sign-3)\n-\n-\t# RSA 4096 signing\n-\t\n-\tadd_test(NAME crypto-cose-sign-7\n-\t COMMAND lws-crypto-cose-sign -s -k rsa-4096.ck\n-\t \t--alg RS512 --cose-sign\n-\t \t--stdin payload.txt\n-\t \t--stdout ctest-sig-rs512.sig)\n-\t \t\n-\t # RSA 4096 validation\n-\n-\tadd_test(NAME crypto-cose-sign-8\n-\t\t COMMAND lws-crypto-cose-sign -k rsa-4096.ck --cose-sign\n-\t\t \t--stdout r8.txt\n-\t\t \t--stdin ctest-sig-rs512.sig)\n-\tset_tests_properties(crypto-cose-sign-8\tPROPERTIES\n-\t\t\t\t\t\tDEPENDS crypto-cose-sign-7)\n-\t\t\t\t\t\t\n-\t# HMAC signing, cose-mac\n-\n-#\tadd_test(NAME crypto-cose-sign-9\n-#\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid our-secret\n-#\t\t \t--alg HS256 --cose-mac\n-#\t\t \t--stdin payload.txt\n-#\t\t \t--stdout ctest-sig-hmac256.sig)\n-#\tadd_test(NAME crypto-cose-sign-10\n-#\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec-48\n-#\t\t \t--alg HS384 --cose-mac\n-#\t\t \t--stdin payload.txt\n-#\t\t \t--stdout ctest-sig-hmac384.sig)\n-#\tadd_test(NAME crypto-cose-sign-11\n-#\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec-64\n-#\t\t \t--alg HS512 --cose-mac\n-#\t\t \t--stdin payload.txt\n-#\t\t \t--stdout ctest-sig-hmac512.sig)\n-#\tadd_test(NAME crypto-cose-sign-12\n-#\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid our-secret\n-#\t\t \t--alg HS256_64 --cose-mac\n-#\t\t \t--stdin payload.txt\n-#\t\t \t--stdout ctest-sig-hmac256_64.sig)\n-\n-\t# HMAC validation, cose-mac\n-\t\n-#\tadd_test(NAME crypto-cose-sign-13\n-#\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-#\t\t \t--stdout r1.txt\n-#\t\t \t--stdin ctest-sig-hmac256.sig)\n-#\tset_tests_properties(crypto-cose-sign-13\n-#\t\t\t PROPERTIES DEPENDS crypto-cose-sign-9)\n-#\t\t \t\n-#\tadd_test(NAME crypto-cose-sign-14\n-#\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-#\t\t \t--stdout r2.txt\n-#\t\t \t--stdin ctest-sig-hmac384.sig)\n-#\tset_tests_properties(crypto-cose-sign-14\n-#\t\t\t PROPERTIES DEPENDS crypto-cose-sign-10)\n-#\t\t \t\n-#\tadd_test(NAME crypto-cose-sign-15\n-#\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-#\t\t \t--stdout r3.txt\n-#\t\t \t--stdin ctest-sig-hmac512.sig)\n-#\tset_tests_properties(crypto-cose-sign-15\n-#\t\t\t PROPERTIES DEPENDS crypto-cose-sign-11)\n-#\t\t\t \n-#\tadd_test(NAME crypto-cose-sign-16\n-#\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-#\t\t \t--stdout r4.txt\n-#\t\t \t--stdin ctest-sig-hmac256_64.sig)\n-#\tset_tests_properties(crypto-cose-sign-16\n-#\t\t\t PROPERTIES DEPENDS crypto-cose-sign-12)\n-\t\t\t \n-\t# HMAC signing, cose-mac0\n-\n-\tadd_test(NAME crypto-cose-sign-17\n-\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid our-secret\n-\t\t \t--alg HS256 --cose-mac0\n-\t\t \t--stdin payload.txt\n-\t\t \t--stdout ctest-sig-hmac0256.sig)\n-\tadd_test(NAME crypto-cose-sign-18\n-\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec-48\n-\t\t \t--alg HS384 --cose-mac0\n-\t\t \t--stdin payload.txt\n-\t\t \t--stdout ctest-sig-hmac0384.sig)\n-\tadd_test(NAME crypto-cose-sign-19\n-\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid sec-64\n-\t\t \t--alg HS512 --cose-mac0\n-\t\t \t--stdin payload.txt\n-\t\t \t--stdout ctest-sig-hmac0512.sig)\n-\tadd_test(NAME crypto-cose-sign-20\n-\t\t COMMAND lws-crypto-cose-sign -s -k set1.cks --kid our-secret\n-\t\t \t--alg HS256_64 --cose-mac0\n-\t\t \t--stdin payload.txt\n-\t\t \t--stdout ctest-sig-hmac0256_64.sig)\n-\n-\t# HMAC validation, cose-mac0\n-\t\n-\tadd_test(NAME crypto-cose-sign-21\n-\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-\t\t \t--stdout r1.txt\n-\t\t \t--stdin ctest-sig-hmac0256.sig)\n-\tset_tests_properties(crypto-cose-sign-21\n-\t\t\t PROPERTIES DEPENDS crypto-cose-sign-17)\n-\t\t \t\n-\tadd_test(NAME crypto-cose-sign-22\n-\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-\t\t \t--stdout r2.txt\n-\t\t \t--stdin ctest-sig-hmac0384.sig)\n-\tset_tests_properties(crypto-cose-sign-22\n-\t\t\t PROPERTIES DEPENDS crypto-cose-sign-18)\n-\t\t \t\n-\tadd_test(NAME crypto-cose-sign-23\n-\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-\t\t \t--stdout r3.txt\n-\t\t \t--stdin ctest-sig-hmac0512.sig)\n-\tset_tests_properties(crypto-cose-sign-23\n-\t\t\t PROPERTIES DEPENDS crypto-cose-sign-19)\n-\t\t\t \n-\tadd_test(NAME crypto-cose-sign-24\n-\t\t COMMAND lws-crypto-cose-sign -k set1.cks\n-\t\t \t--stdout r4.txt\n-\t\t \t--stdin ctest-sig-hmac0256_64.sig)\n-\tset_tests_properties(crypto-cose-sign-24\n-\t\t\t PROPERTIES DEPENDS crypto-cose-sign-20)\n-\n-\n-\tset_tests_properties(crypto-cose-sign-1\n-\t\t\t crypto-cose-sign-2\n-\t\t\t crypto-cose-sign-3\n-\t\t\t crypto-cose-sign-4\n- \t\t\t crypto-cose-sign-5\n-\t\t\t crypto-cose-sign-6\n-\t\t\t crypto-cose-sign-7\n-\t\t\t crypto-cose-sign-8\n-# \t\t\t crypto-cose-sign-9\n-# \t\t crypto-cose-sign-10\n-#\t\t\t crypto-cose-sign-11\n-#\t\t\t crypto-cose-sign-12\n-#\t\t\t crypto-cose-sign-13\n-#\t\t\t crypto-cose-sign-14\n-#\t\t\t crypto-cose-sign-15\n-#\t\t\t crypto-cose-sign-16\n-\t\t\t crypto-cose-sign-17\n-\t\t\t crypto-cose-sign-18\n-\t\t\t crypto-cose-sign-19\n-\t\t\t crypto-cose-sign-20\n-\t\t\t crypto-cose-sign-21\n-\t\t\t crypto-cose-sign-22\n-\t\t\t crypto-cose-sign-23\n-\t\t\t crypto-cose-sign-24\n-\n-\t\t\t PROPERTIES\n-\t\t \t\tWORKING_DIRECTORY\n-\t\t \t\t\t${CMAKE_SOURCE_DIR}/minimal-examples/crypto/minimal-crypto-cose-sign\n-\t\t \t\tTIMEOUT 5)\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/README.md b/minimal-examples/crypto/minimal-crypto-cose-sign/README.md\ndeleted file mode 100644\nindex f241d75..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/README.md\n+++ /dev/null\n@@ -1,105 +0,0 @@\n-# lws minimal example for cose_sign\n-\n-Demonstrates how to sign and verify using cose_sign and cose_key, providing a\n-commandline tool for signing and verifying stdin.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-|Option|Sig|Val|Meaning|\n-|---|---|---|---|\n-|-s|o|||Select signing mode (stdin is payload)|\n-|-k \u003ckeyset filepath\u003e|o|o|One or a set of cose_keys|\n-|--kid string|o|mac0|Specifies the key ID to use as a string|\n-|--kid-hex HEXSTRING|o|mac0|Specifies the key ID to use as a hex blob|\n-|--cose-sign|o|if no tag|Sets cose-sign mode|\n-|--cose-sign1|o|if no tag|Sets cose-sign1 mode|\n-|--cose-mac|o|if no tag|Sets cose-sign1 mode|\n-|--cose-mac0|o|if no tag|Sets cose-sign1 mode|\n-|--extra HEXSTRING|o|o|Optional extra payload data|\n-\n-HEXSTRING above means a string like `1a2b3c`\n-\n-Stdin is either the plaintext (if signing) or cose_sign (if verifying).\n-\n-For convenience, a keyset from the COSE RFC is provided in\n-`minimal-examples/crypto/minimal-crypto-cose-sign/set1.cks`. Six example\n-cose_sign1 and cose_sign are also provided in that directory signed with keys\n-from the provided keyset.\n-\n-## Examples\n-\n-### Validation\n-\n-The RFC8152 sign1_pass01.sig is a cose_sign1 that contains the ES256 alg\n-parameter along with a kid hint that it was signed with the key with kid \u002211\u0022\n-from the RFC8152 key set. So we just need to provide the signature and the key\n-set and lws can sort it out.\n-\n-```\n-$ cat sign1_pass01.sig | ./lws-crypto-cose-sign -k set1.cks\n-[2021/07/26 05:41:29:1663] N: lws_create_context: LWS: 4.2.99-v4.2.0-133-g300f3f3250, NET CLI SRV H1 H2 WS ConMon IPV6-on\n-[2021/07/26 05:41:29:3892] N: results count 1\n-[2021/07/26 05:41:29:3901] N: result: 0 (alg ES256, kid 3131)\n-[2021/07/26 05:41:29:4168] N: main: PASS\n-```\n-\n-Notice how the validation just delivers a results list and leaves it to the user\n-code to iterate it, and confirm that it's happy with the result, the alg used,\n-and the kid that was used.\n-\n-RFC8152 sign1_pass02.sig is similar but contains extra application data in the\n-signature, that must be given at validation too.\n-\n-```\n-$cat sign1_pass02.sig | ./lws-crypto-cose-sign -k set1.cks --extra 11aa22bb33cc44dd55006699\n-[2021/07/26 05:55:50:9103] N: lws_create_context: LWS: 4.2.99-v4.2.0-133-g300f3f3250, NET CLI SRV H1 H2 WS ConMon IPV6-on\n-[2021/07/26 05:55:50:9381] N: 12\n-[2021/07/26 05:55:51:0924] N: \n-[2021/07/26 05:55:51:0939] N: 0000: 11 AA 22 BB 33 CC 44 DD 55 00 66 99 ..\u0022.3.D.U.f. \n-[2021/07/26 05:55:51:0943] N: \n-[2021/07/26 05:55:51:1368] N: results count 1\n-[2021/07/26 05:55:51:1377] N: result: 0 (alg ES256, kid 3131)\n-[2021/07/26 05:55:51:1657] N: main: PASS\n-```\n-\n-### Signing\n-\n-Generate a cose-sign1 using ES256 and the key set key with id \u002211\u0022 for the\n-payload given on stdin\n-\n-```\n-$ echo -n \u0022This is the content.\u0022 |\u005c\n- ./bin/lws-crypto-cose-sign -s -k set1.cks \u005c\n- --kid 11 --alg ES256 \u003e ./test.sig\n-\n-00000000 d2 84 43 a1 01 26 a1 04 42 31 31 54 54 68 69 73 |..C..\u0026..B11TThis|\n-00000010 20 69 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e | is the content.|\n-00000020 58 40 b9 a8 85 09 17 7f 01 f6 78 5d 39 62 d0 44 |X@........x]9b.D|\n-00000030 08 0b fa b4 b4 5b 17 80 c2 e3 ba a3 af 33 6f e6 |.....[.......3o.|\n-00000040 44 09 13 1f cf 4f 17 5c 62 9f 8d 29 29 1c ab 28 |D....O.\u005cb..))..(|\n-00000050 b2 f4 e6 af f9 62 ea 69 52 90 07 0e 2c 40 72 d3 |.....b.iR...,@r.|\n-00000060 12 cf |..|\n-\n-```\n-\n-Same as above, but force it to use cose-sign layout\n-\n-```\n-$ echo -n \u0022This is the content.\u0022 |\u005c\n- ./bin/lws-crypto-cose-sign -s -k set1.cks \u005c\n- --kid 11 --alg ES256 --cose-sign \u003e ./test.sig\n-\n-00000000 d8 62 84 40 40 54 54 68 69 73 20 69 73 20 74 68 |.b.@@TThis is th|\n-00000010 65 20 63 6f 6e 74 65 6e 74 2e 81 83 a1 01 26 a1 |e content.....\u0026.|\n-00000020 04 42 31 31 58 40 37 5d 93 48 20 b0 d0 75 16 41 |.B11X@7].H ..u.A|\n-00000030 db 95 95 5b 39 7d 6d 92 6e 52 c9 78 96 d8 a2 9b |...[9}m.nR.x....|\n-00000040 62 62 89 9e e5 26 31 63 4b 90 d1 37 86 ca 82 a2 |bb...\u00261cK..7....|\n-00000050 28 9a d2 82 a7 6d 24 23 cd de 58 91 47 98 bb 11 |(....m$#..X.G...|\n-00000060 e4 b9 08 18 48 65 |....He|\n-```\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/main.c b/minimal-examples/crypto/minimal-crypto-cose-sign/main.c\ndeleted file mode 100644\nindex c1e8e58..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/main.c\n+++ /dev/null\n@@ -1,406 +0,0 @@\n-/*\n- * lws-minimal-crypto-cose-sign\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003csys/types.h\u003e\n-#include \u003cfcntl.h\u003e\n-\n-static int fdin \u003d 0, fdout \u003d 1;\n-static uint8_t extra[4096];\n-static size_t ext_len;\n-\n-int\n-_alloc_file(struct lws_context *context, const char *filename, uint8_t **buf,\n-\t\tsize_t *amount)\n-{\n-\tFILE *f;\n-\tsize_t s;\n-\tssize_t m;\n-\tint n \u003d 0;\n-\n-\tf \u003d fopen(filename, \u0022rb\u0022);\n-\tif (f \u003d\u003d NULL) {\n-\t\tn \u003d 1;\n-\t\tgoto bail;\n-\t}\n-\n-\tif (fseek(f, 0, SEEK_END) !\u003d 0) {\n-\t\tn \u003d 1;\n-\t\tgoto bail;\n-\t}\n-\n-\tm \u003d ftell(f);\n-\tif (m \u003d\u003d -1l) {\n-\t\tn \u003d 1;\n-\t\tgoto bail;\n-\t}\n-\ts \u003d (size_t)m;\n-\n-\tif (fseek(f, 0, SEEK_SET) !\u003d 0) {\n-\t\tn \u003d 1;\n-\t\tgoto bail;\n-\t}\n-\n-\t*buf \u003d malloc(s + 1);\n-\tif (!*buf) {\n-\t\tn \u003d 2;\n-\t\tgoto bail;\n-\t}\n-\n-\tif (fread(*buf, s, 1, f) !\u003d 1) {\n-\t\tfree(*buf);\n-\t\tn \u003d 1;\n-\t\tgoto bail;\n-\t}\n-\n-\t*amount \u003d s;\n-\n-bail:\n-\tif (f)\n-\t\tfclose(f);\n-\n-\treturn n;\n-\n-}\n-\n-static int\n-extra_cb(lws_cose_sig_ext_pay_t *x)\n-{\n-\tx-\u003eext \u003d extra;\n-\tx-\u003exl \u003d ext_len;\n-\n-\t// lwsl_hexdump_notice(extra, ext_len);\n-\n-\treturn 0;\n-}\n-\n-int\n-pay_cb(struct lws_cose_validate_context *cps, void *opaque,\n- const uint8_t *paychunk, size_t paychunk_len)\n-{\n-\twrite(fdout, paychunk, paychunk_len);\n-\n-\treturn 0;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tuint8_t *ks, temp[256], *kid \u003d NULL, ktmp[4096], sbuf[512];\n-\tint n, m, sign \u003d 0, result \u003d 1,\n-\t logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tenum lws_cose_sig_types sigtype \u003d SIGTYPE_UNKNOWN;\n-\tstruct lws_cose_validate_context *cps \u003d NULL;\n-\tstruct lws_cose_sign_context *csc \u003d NULL;\n-\tconst struct lws_gencrypto_keyelem *ke;\n-\tstruct lws_context_creation_info info;\n-\tlws_cose_validate_create_info_t vi;\n-\tstruct lws_buflist *paybuf \u003d NULL;\n-\tlws_cose_sign_create_info_t i;\n-\tstruct lws_context *context;\n-\tsize_t ks_len, kid_len \u003d 0;\n-\tlws_cose_key_t *ck \u003d NULL;\n-\tlws_dll2_owner_t *o, set;\n-\tlws_lec_pctx_t lec;\n-\tcose_param_t alg;\n-\tconst char *p;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\n-\tlwsl_user(\u0022LWS cose-sign example tool -k keyset [-s alg-name kid ]\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--stdin\u0022))) {\n-\t\tfdin \u003d open(p, LWS_O_RDONLY, 0);\n-\t\tif (fdin \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: unable to open stdin file\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--stdout\u0022))) {\n-\t\tfdout \u003d open(p, LWS_O_WRONLY | LWS_O_CREAT | LWS_O_TRUNC, 0600);\n-\t\tif (fdout \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: unable to open stdout file\u005cn\u0022, __func__);\n-\t\t\tgoto bail_early;\n-\t\t}\n-\t}\n-\n-\t/*\n-\t * If no tag, you can tell it the signature type, otherwise it will\n-\t * use the tag to select the right type without these\n-\t */\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022--cose-sign\u0022))\n-\t\tsigtype \u003d SIGTYPE_MULTI;\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022--cose-sign1\u0022))\n-\t\tsigtype \u003d SIGTYPE_SINGLE;\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022--cose-mac\u0022))\n-\t\tsigtype \u003d SIGTYPE_MAC;\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022--cose-mac0\u0022))\n-\t\tsigtype \u003d SIGTYPE_MAC0;\n-\n-\t/* if signing, set the ciphers */\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022-s\u0022))\n-\t\tsign \u003d 1;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid\u0022))) {\n-\t\tkid \u003d (uint8_t *)p;\n-\t\tkid_len \u003d strlen(p);\n-\t\t//lwsl_hexdump_notice(kid, kid_len);\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid-hex\u0022))) {\n-\t\tkid_len \u003d (size_t)lws_hex_to_byte_array(p, ktmp, sizeof(ktmp));\n-\t\tkid \u003d (uint8_t *)ktmp;\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--extra\u0022))) {\n-\t\text_len \u003d (size_t)lws_hex_to_byte_array(p, extra, sizeof(extra));\n-\t\tlwsl_notice(\u0022%llu\u005cn\u0022, (unsigned long long)ext_len);\n-\t\tif (ext_len \u003d\u003d (size_t)-1ll)\n-\t\t\text_len \u003d 0;\n-\t}\n-\n-\t/* grab the key */\n-\n-\tif (!(p \u003d lws_cmdline_option(argc, argv, \u0022-k\u0022))) {\n-\t\tlwsl_err(\u0022-k \u003ckey set file\u003e is required\u005cn\u0022);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (_alloc_file(context, p, \u0026ks, \u0026ks_len)) {\n-\t\tlwsl_err(\u0022%s: unable to load %s\u005cn\u0022, __func__, p);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_dll2_owner_clear(\u0026set);\n-\tif (!lws_cose_key_import(\u0026set, NULL, NULL, ks, ks_len)) {\n-\t\tlwsl_notice(\u0022%s: key import fail\u005cn\u0022, __func__);\n-\t\tfree(ks);\n-\t\tgoto bail2;\n-\t}\n-\n-\tfree(ks);\n-\n-\tif (!fdin) {\n-\t\tstruct timeval\ttimeout;\n-\t\tfd_set\tfds;\n-\n-\t\tFD_ZERO(\u0026fds);\n-\t\tFD_SET(0, \u0026fds);\n-\n-\t\ttimeout.tv_sec \u003d 0;\n-\t\ttimeout.tv_usec \u003d 1000;\n-\n-\t\tif (select(fdin + 1, \u0026fds, NULL, NULL, \u0026timeout) \u003c 0 ||\n-\t\t !FD_ISSET(0, \u0026fds)) {\n-\t\t\tlwsl_err(\u0022%s: pass cose_sign or plaintext \u0022\n-\t\t\t\t \u0022on stdin or --stdin\u005cn\u0022, __func__);\n-\t\t\tgoto bail2;\n-\t\t}\n-\t}\n-\n-\tif (sign) {\n-\t\tuint8_t *ppay;\n-\t\tsize_t s;\n-\n-\t\tp \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022);\n-\t\tif (!p) {\n-\t\t\tlwsl_err(\u0022%s: need to specify alg (eg, ES256) \u0022\n-\t\t\t\t \u0022when signing\u005cn\u0022, __func__);\n-\t\t\tgoto bail2;\n-\t\t}\n-\t\talg \u003d lws_cose_name_to_alg(p);\n-\n-\t\tlws_lec_init(\u0026lec, sbuf, sizeof(sbuf));\n-\t\tmemset(\u0026i, 0, sizeof(i));\n-\t\ti.cx\t\t\u003d context;\n-\t\ti.keyset\t\u003d \u0026set;\n-\t\ti.lec\t\t\u003d \u0026lec;\n-\t\ti.flags\t\t\u003d LCSC_FL_ADD_CBOR_TAG |\n-\t\t\t\t LCSC_FL_ADD_CBOR_PREFER_MAC0;\n-\t\ti.sigtype\t\u003d sigtype;\n-\n-\t\t/*\n-\t\t * Unfortunately, with COSE we must know the payload length\n-\t\t * before we have seen the payload. It's illegal to use\n-\t\t * indeterminite lengths inside COSE objects.\n-\t\t */\n-\n-\t\tdo {\n-\t\t\tn \u003d (int)read(fdin, temp, sizeof(temp));\n-\t\t\tif (n \u003c 0)\n-\t\t\t\tgoto bail3;\n-\t\t\tif (!n)\n-\t\t\t\tbreak;\n-\n-\t\t\ts \u003d (size_t)n;\n-\n-\t\t\tif (lws_buflist_append_segment(\u0026paybuf, temp, s) \u003c 0)\n-\t\t\t\tgoto bail3;\n-\t\t\ti.inline_payload_len +\u003d s;\n-\n-\t\t} while (1);\n-\n-\t//\tlwsl_notice(\u0022%s: inline_payload_len %llu\u005cn\u0022, __func__,\n-\t//\t\t\t(unsigned long long)i.inline_payload_len);\n-\n-\t\tcsc \u003d lws_cose_sign_create(\u0026i);\n-\t\tif (!csc)\n-\t\t\tgoto bail2;\n-\t\tck \u003d lws_cose_key_from_set(\u0026set, kid, kid_len);\n-\t\tif (!ck)\n-\t\t\tgoto bail2;\n-\n-\t\tif (lws_cose_sign_add(csc, alg, ck))\n-\t\t\tgoto bail2;\n-\n-\t\tdo {\n-\t\t\ts \u003d lws_buflist_next_segment_len(\u0026paybuf, \u0026ppay);\n-\t\t\tif (!s)\n-\t\t\t\tbreak;\n-\n-\t\t\tdo {\n-\t\t\t\tm \u003d (int)lws_cose_sign_payload_chunk(csc,\n-\t\t\t\t\t\t\t\t ppay, s);\n-\t\t\t\tif (lec.used) {\n-\t\t\t\t\t// lwsl_hexdump_err(sbuf, lec.used);\n-\t\t\t\t\twrite(fdout, sbuf, lec.used);\n-\t\t\t\t\tlws_lec_setbuf(\u0026lec, sbuf, sizeof(sbuf));\n-\t\t\t\t}\n-\t\t\t} while (m \u003d\u003d LCOSESIGEXTCB_RET_AGAIN);\n-\n-\t\t\tif (m \u003d\u003d LWS_LECPCTX_RET_FAIL)\n-\t\t\t\tgoto bail2;\n-\n-\t\t\tif (lec.used) {\n-\t\t\t\twrite(fdout, sbuf, lec.used);\n-\t\t\t\tlws_lec_setbuf(\u0026lec, sbuf, sizeof(sbuf));\n-\t\t\t}\n-\n-\t\t\tlws_buflist_use_segment(\u0026paybuf, s);\n-\t\t} while(1);\n-\n-\t} else {\n-\t\tmemset(\u0026vi, 0, sizeof(vi));\n-\n-\t\tvi.cx\t\t\u003d context;\n-\t\tvi.keyset\t\u003d \u0026set;\n-\t\tvi.sigtype\t\u003d sigtype;\n-\t\tvi.ext_cb\t\u003d extra_cb;\n-\t\tvi.ext_opaque\t\u003d extra;\n-\t\tvi.ext_len\t\u003d ext_len;\n-\t\tvi.pay_cb\t\u003d pay_cb;\n-\n-\t\tcps \u003d lws_cose_validate_create(\u0026vi);\n-\t\tif (!cps) {\n-\t\t\tlwsl_notice(\u0022%s: sign_val_create fail\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\n-\t\tdo {\n-\t\t\tn \u003d (int)read(fdin, temp, sizeof(temp));\n-\t\t\tif (n \u003c 0)\n-\t\t\t\tgoto bail3;\n-\t\t\tif (!n)\n-\t\t\t\tbreak;\n-\n-\t\t\tn \u003d lws_cose_validate_chunk(cps, temp, (size_t)n, NULL);\n-\t\t\tif (n \u0026\u0026 n !\u003d LECP_CONTINUE) {\n-\t\t\t\tlwsl_err(\u0022%s: chunk validation failed: %d\u005cn\u0022,\n-\t\t\t\t\t\t__func__, n);\n-\t\t\t\tgoto bail2;\n-\t\t\t}\n-\t\t} while (1);\n-\t}\n-\n-bail3:\n-\n-\tresult \u003d 0;\n-\n-\tif (!sign) {\n-\t\tchar buf[2048];\n-\t\tint os;\n-\n-\t\to \u003d lws_cose_validate_results(cps);\n-\t\tif (!o)\n-\t\t\tresult \u003d 1;\n-\t\telse {\n-\t\t\tos \u003d lws_snprintf(buf, sizeof(buf),\n-\t\t\t\t\t \u0022\u005cnresults count %d\u005cn\u0022, o-\u003ecount);\n-\t\t\twrite(fdout, buf, (size_t)os);\n-\n-\t\t\tif (!o-\u003ecount)\n-\t\t\t\tresult \u003d 1;\n-\t\t}\n-\n-\t\tlws_start_foreach_dll_safe(struct lws_dll2 *, p, tp,\n-\t\t\t\t\t lws_dll2_get_head(o)) {\n-\t\t\tlws_cose_validate_res_t *res \u003d lws_container_of(p,\n-\t\t\t\t\t\tlws_cose_validate_res_t, list);\n-\t\t\tchar khr[256];\n-\n-\t\t\tkhr[0] \u003d '\u005c0';\n-\t\t\tif (res-\u003ecose_key) {\n-\t\t\t\tke \u003d \u0026res-\u003ecose_key-\u003emeta[COSEKEY_META_KID];\n-\t\t\t\tif (ke \u0026\u0026 ke-\u003ebuf)\n-\t\t\t\t\tlws_hex_from_byte_array(ke-\u003ebuf, ke-\u003elen,\n-\t\t\t\t\t\t\tkhr, sizeof(khr));\n-\t\t\t}\n-\t\t\tos \u003d lws_snprintf(buf, sizeof(buf),\n-\t\t\t\t \u0022 result: %d (alg %s, kid %s)\u005cn\u0022,\n-\t\t\t\t res-\u003eresult,\n-\t\t\t\t lws_cose_alg_to_name(res-\u003ecose_alg), khr);\n-\t\t\twrite(fdout, buf, (size_t)os);\n-\t\t\tresult |\u003d res-\u003eresult;\n-\t\t} lws_end_foreach_dll_safe(p, tp);\n-\t}\n-\n-bail2:\n-\tif (!sign)\n-\t\tlws_cose_validate_destroy(\u0026cps);\n-\telse {\n-\t\tlws_buflist_destroy_all_segments(\u0026paybuf);\n-\t\tlws_cose_sign_destroy(\u0026csc);\n-\t}\n-//bail1:\n-\tlws_cose_key_set_destroy(\u0026set);\n-bail:\n-\tlws_context_destroy(context);\n-\n-\tif (result)\n-\t\tlwsl_err(\u0022%s: FAIL: %d\u005cn\u0022, __func__, result);\n-\telse\n-\t\tlwsl_notice(\u0022%s: PASS\u005cn\u0022, __func__);\n-\n-bail_early:\n-\tif (fdin \u003e 0)\n-\t\tclose(fdin);\n-\tif (fdout !\u003d 1 \u0026\u0026 fdout \u003e\u003d 0)\n-\t\tclose(fdout);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/payload.txt b/minimal-examples/crypto/minimal-crypto-cose-sign/payload.txt\ndeleted file mode 100644\nindex 402bd7c..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/payload.txt\n+++ /dev/null\n@@ -1 +0,0 @@\n-The Test Payload\n\u005c No newline at end of file\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/rsa-4096.ck b/minimal-examples/crypto/minimal-crypto-cose-sign/rsa-4096.ck\ndeleted file mode 100644\nindex 8b3fddb..0000000\nBinary files a/minimal-examples/crypto/minimal-crypto-cose-sign/rsa-4096.ck and /dev/null differ\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/set1.cks b/minimal-examples/crypto/minimal-crypto-cose-sign/set1.cks\ndeleted file mode 100644\nindex e5eca18..0000000\nBinary files a/minimal-examples/crypto/minimal-crypto-cose-sign/set1.cks and /dev/null differ\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig b/minimal-examples/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig\ndeleted file mode 100644\nindex a233d68..0000000\nBinary files a/minimal-examples/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig and /dev/null differ\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass01.sig b/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass01.sig\ndeleted file mode 100644\nindex d78767e..0000000\nBinary files a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass01.sig and /dev/null differ\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass02.sig b/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass02.sig\ndeleted file mode 100644\nindex 2b53930..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass02.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-Ò„C¡\u0001\u0026¡\u0004B11TThis is the content.X@\u0010rœ×\u0011Ë8\u0013ØØéD¨Úq\u0011ç²XɽÊa5÷®\u001aÛî•\t‰\u0012gƒ~\u001e3½6ÁP2jæ'UƽŽT\u000c\u003e’×Ò%èÛr¸‚\u000b\n\u005c No newline at end of file\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass03.sig b/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass03.sig\ndeleted file mode 100644\nindex a10fc96..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass03.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-„C¡\u0001\u0026¡\u0004B11TThis is the content.X@޳\u003eL£\u001d\u001cFZ°Z¬4Ìk#Õï\u005c\u00081\u0006ÄÒZ‘®ð°\u0011~*ù¢‘ª2áJ¸4ÜVí*\u00224DT~\u0001ñ\u001d;\t\u0016å¤ÃEÊË6\n\u005c No newline at end of file\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass01.sig b/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass01.sig\ndeleted file mode 100644\nindex 268b086..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass01.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-Øb„A TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@⮯Ô\riÑþnR\u0007|]ôä\u0008(,¾û]\u0006Ëô\u0014¯.\u0019Ù‚¬E¬˜¸TL‹E\u0007Þ\u001e·\u0017ÃÓH\u0016þ’j+˜õ:ý/ ó\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass02.sig b/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass02.sig\ndeleted file mode 100644\nindex b80f7a2..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass02.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-Øb„@ TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@˸ÚÙ¾¯¸á¤\u0014\u0012M‹ûÂkíò©OËZˆ$2¿öÖ\u003e\u0015õtQØ?¢Ëö\u0026rëôÇÙ“°ôÂDvGØ1ºW̨k“\ndiff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass03.sig b/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass03.sig\ndeleted file mode 100644\nindex 60d8f03..0000000\n--- a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass03.sig\n+++ /dev/null\n@@ -1 +0,0 @@\n-„@ TThis is the content.ƒC¡\u0001\u0026¡\u0004B11X@⮯Ô\riÑþnR\u0007|]ôä\u0008(,¾û]\u0006Ëô\u0014¯.\u0019Ù‚¬E¬˜¸TL‹E\u0007Þ\u001e·\u0017ÃÓH\u0016þ’j+˜õ:ý/ ó\ndiff --git a/minimal-examples/crypto/minimal-crypto-jwe/CMakeLists.txt b/minimal-examples/crypto/minimal-crypto-jwe/CMakeLists.txt\ndeleted file mode 100644\nindex 4896dfc..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jwe/CMakeLists.txt\n+++ /dev/null\n@@ -1,23 +0,0 @@\n-project(lws-crypto-jwe C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-crypto-jwe)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_JOSE 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/crypto/minimal-crypto-jwe/README.md b/minimal-examples/crypto/minimal-crypto-jwe/README.md\ndeleted file mode 100644\nindex f7ddc7a..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jwe/README.md\n+++ /dev/null\n@@ -1,70 +0,0 @@\n-# lws minimal example for JWE\n-\n-Demonstrates how to encrypt and decrypt using JWE and JWK, providing a\n-commandline tool for creating encrypted JWE and decoding them.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Stdin is either the plaintext (if encrypting) or JWE (if decrypting).\n-\n-Stdout is either the JWE (if encrypting) or plaintext (if decrypting).\n-\n-You must pass a private or public key JWK file in the -k option if encrypting,\n-and must pass a private key JWK file in the -k option if decrypting. To be\n-clear, for asymmetric keys the public part of the key is required to encrypt,\n-and the private part required to decrypt.\n-\n-For convenience, a pair of public and private keys are provided,\n-`key-rsa-4096.private` and `key-rsa-4096.pub`, these were produced with just\n-\n-```\n- $ lws-crypto-jwk -t RSA -b 4096 --public key-rsa-4096.pub \u003ekey-rsa-4096.private\n-```\n-\n-Similar keys for EC modes may be produced with\n-\n-```\n- $ lws-crypto-jwk -t EC -v P-256 --public key-ecdh-p-256.pub \u003ekey-ecdh-p-256.private\n-```\n-\n-and for AES (\u0022octet\u0022) symmetric keys\n-\n-```\n- $ lws-crypto-jwk -t OCT -b 128 \u003ekey-aes-128.private\n-```\n-\n-JWEs produced with openssl and mbedtls backends are completely interchangeable.\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--e \u0022\u003ccek cipher alg\u003e \u003cpayload enc alg\u003e\u0022|Encrypt (default is decrypt), eg, -e \u0022RSA1_5 A128CBC-HS256\u0022. For decrypt, the cipher information comes from the input JWE.\n--k \u003cjwk file\u003e|JWK file to encrypt or decrypt with\n--c|Format the JWE as a linebroken C string\n--f|Output flattened representation (instead of compact by default)\n-\n-```\n- $ echo -n \u0022plaintext0123456\u0022 | ./lws-crypto-jwe -k key-rsa-4096.private -e \u0022RSA1_5 A128CBC-HS256\u0022\n-[2018/12/19 16:20:25:6519] USER: LWS JWE example tool\n-[2018/12/19 16:20:25:6749] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n-eyJhbGciOiJSU0ExXzUiLCAiZW5jIjoiQTEyOENCQy1IUzI1NiJ9.ivFr7qzx-pQ4V_edbjpdvR9OwWL9KmojPE2rXQM52oLtW0BtnxZu2_ezqhsAelyIcaworgfobs3u4bslXHMFbeJJjPb5xD0fBDe64OYXZH1NpUGTMJh9Ka4CrJ2B3xhxe7EByGAuGqmluqE0Yezj7rhSw7vlr5JAwuOJ8FaGa8aZ8ldki5G5h_S2Furlbjdcw3Rrxk7mCoMHcLoqzfZtggMPwGAMFogCqcwUo7oSLbBeGaa6hpMbfSysugseWdr8TzObQKPM52k6iVAlGwRaOg_qdLMgZiYRhHA6nFKTQd7XBbNY6qAS8sPuj7Zz344tF3RSfJ0zX_telG71sOtVv5fMpeDU-eCdpOWlCBfu6J6FQfAFu6SJryM4ajGOif09CwFI5qUQ33SOfQfS_M3nqSyd6Vu5M4lsDrb5wK7_XX5gqUwvI9wicf_8WWR-CQomRF-JvEASnA2SIf8QqYfa8R2rP9q6Md4vwO4EZrtxIsMDPsH-4ZEFu7vDjyy09QfIWWsnEb8-UgpVXensgt2m_2bZ76r1VB8-0nZLMwMyEhaH2wra9vX2FWao5UkmNJ7ht300f4_V6QzMFoePpwCvsufWBW6jcQLB-frCWe6uitWaZHEB4LxmNPKzQSz4QwwTKhpF1jNn8Xh1-w1m-2h0gj-oe-S8QBwPveqhPI1p2fI.snuhUTXHNu5mJ6dEPQqg6g.yl36qC4o0GE4nrquQ2YyCg.Vf0MoT7_kUrZdCNWXhq1DQ\n-```\n-\n-Notice the logging is on stderr, and the output alone on stdout.\n-\n-You can also pipe the output of the encrypt action directly into the decrypt\n-action, eg\n-\n-```\n- $ echo -n \u0022plaintext0123456\u0022 | \u005c\n- ./lws-crypto-jwe -k key-rsa-4096.pub -e \u0022RSA1_5 A128CBC-HS256\u0022 | \u005c\n- ./lws-crypto-jwe -k key-rsa-4096.private\n-```\n-\n-prints the plaintext on stdout.\ndiff --git a/minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.private b/minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.private\ndeleted file mode 100644\nindex 1084143..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.private\n+++ /dev/null\n@@ -1 +0,0 @@\n-{\u0022d\u0022:\u0022XcSl3ulvs4OGomu9thRPVQGOstim0PY7CibP_bnCmzjvmGmzb8J4q5AUmJCnZT5TesOzXuXhyG95CxQWsakd9GWHSAinV1QQSLsahaezPULRG1qmo37JqKb9noKkvXguh5XU5np8HjeoeeEkF_XqtCdEo0wHijEjTL9RZar98jmyAmlizoHIY9NnECavs4DZB27onU61B61vGpw-y4xhC9jlZSIwRqIMDzeTcSv8fRKcVYR80ozm2_KwWMpue27rS2EfTQUtsMXuYmnvMAf_DHqA0tNWyD1gpUWYHvlyBh5xnYrWPuXxQBRNesImQdRQl5VMMsuvdtY-uZfIVUdN5CcsB0acronx4UsmVg-Qz-jd1NVW4koZQM9uA4oWiMZg4FEUTQ-UWelHCldg-PYLAazsItmaHPF9LcAPkLkI8jaVS33v-DhSeXHW3Pg3sibtnPhouiSvD84zMtzu1gjFT7vtapMynBeZouqeWYT-BFeu2wzppJcW1YxTQ_Ai80VJSFY__Huw-9r1MOHmDRcEW7x9W97UezWDjrh5Shhh4C6SMYbaf7ouACzFu1i_r8Q06JqKA7aY8i5izKlKA0We9tQKlTF8Fgsneu9gpxFglvZsd1ersiA-MkuP9qTBQpyAf3kJ6HS9GrQUju6r3DExdWDjdvM5Grt8QD7Zkv-qXeE\u0022,\u0022dp\u0022:\u0022M-LFs3T2GI1JxD5LJt2GgV4cMDKbiPKBddLukfG0duUxNp0-6x2LZ0ptxrlHrhxBMMmvCg4GEaujrZdaYWCar6xCnlnkVlOELz4yZ3JBSpS86thJw03xuE7lyeR7usFY4CpSqUQGI_YveITuFeoh4YjwdKDuqPhOpDI-34ptgU93dlBRS9nnQFTiVoUdP4bhGTKOpULTiLgPXHQxQR5rfiGVD9AIwqHvMdBQ0hxQBKEt37PbRWK_eTzMslHZGWNfbg8ipwJxisvHyUn0c1X3Uelw8BRyvNVCNovNDeCj-R7kFkMvriMd_sqGVy1Go46WZ2wMkUJHkvmYk0gDlhnTGQ\u0022,\u0022dq\u0022:\u0022qO89nQEJfdkaDtGGyD-sQE2Mm8p_PIPSpCmgMfpl8zgSOb4P9iqXBgpHyS7w10uY_UHt8KW6pY7ozy0y4Gu_f4Wk_rcXiYYdbuIhlFl0_nLI2mfFPGxr1xC64zfjjEaBr4zIJr_YzhvTpjZFtIdSAH5VG5Tv-2yUtCC2DnKnU2kzEkgUeSI6LHOEVhXqup7C0Kjiv9FJsLR0hiqwH4oLziqH7EVqVDvJI3yL1lhqoLKjAu1ogTDgH7hzSrqVhttnpwL8rDcgbtY6Q8C2csdN3Jt1ucgtGy-Yzgqf_QIULP3CRlqzDTvHrMe2A9cNAQ4dNsCbNAjW_MxxGKKWuWXAMQ\u0022,\u0022e\u0022:\u0022AQAB\u0022,\u0022kid\u0022:\u0022my kid\u0022,\u0022kty\u0022:\u0022RSA\u0022,\u0022n\u0022:\u00222_YjG_D1sOWJxs6cohikupHf5WJfWSFfSCrnNZ7WR7AyTLnKZAF4VKyimMeJTLYYwCAXMDD5XmkF8VluI4O-hASUIJ7F9eDg3vO7nPwtkWa9lkqt-QyQZ_PjiOGpwetBLzrsaXsC9PvdVzrKXnjeNPsmmbC_Fx2cUn4H_9H_WfXi01VR75XFTBtxTrDY7hmpZHuFCFUOMCW9siTZRk9339Y6ORBznBs4jFbkGI1Pmc3op0o5f8S1gus9L81W5uyUrxfd-CkmJ6eWE8I36cfzI6irN2bhVhR_NXERUtS0QOEeJYlRJXqfYkxTMVlsXPl6zbYt__ZYLC6ZiUTCc6K2KmfGh7fihWbao4dyQW3Mq4kClhpIT0O01Y0r7sR1j4jTnFNqbmtPSl9lEMrfiUHfOLqRJo3qizQ-b6HLCDty1otFz8Q8gg0rD3copQ_zFrcTGwJGAv2Absraj7kp9EJXBqneCJ3dlRO8rzx7KB9Dsj-ygh3kZaubkPCeT1v4l_VUY2iGnK4vzIGKM7j56DQ97ZAi1Bb0y6GYSbrWB2_z0DKJu0fiU-NscbKplR68vgppUM6_iogrk48JEZg_kkTymniqbT3g7J_WeoZSx1Uu8ZHI3ysIFfUtFscOa2SJGlj1ds-lfk6Oqac_I8ahRqQeyVAEisZPmYIGSJajbJopJ4s\u0022,\u0022p\u0022:\u0022_V4CwEjRd8Hv9-ncqGdB_vtReTIuHSWQzSx4al15J3VxvPFI2kxicNeQKyq3OAVT2kmCmUP3ETgCdwuKIgw_QbEc8qNxtS_KpM_KsuTe9a5jrQKpt8ctYhzELZfr_sy9UzUGJzr8glLjJ1IDX4x6_JAqYB_NhttP6bzgu5Dt-DKtRPNO1qZtfhrLIgmltpC2M6-AlAv-dyHSHck2VJIL84Hwk4FulozEYxop0dKuZdfM5Z1dZM8-ICo62O0zUKzoWxKmQcB9_gDZsxYaO6xZ9BLmaW6-WcPSEI6YDnPk8ptnk_Kbyc4kPW4Z3ASczxjaewBmfl2_lwkqkndFVptAeQ\u0022,\u0022q\u0022:\u00223j9DR6ZpKC3WrshSrxXFYAuT19Rlf6qQ_9uD_Fq7dIpTjCZdl01695Qx7UmujKoetutL3RMCpeRdZR-gCLVh8aMxpMuIc5fHC6HbhsdF-I7GoqO0DEJ6coS3n5Ey4EXL5uoLh4C3l67wBKfLmPW28bxxG2QAP59jncWXkrBQm_qbS5Qon8r7wj0tejG_tGdsPjhsFc9KdnkkBucT6MiEVpzpdwDlsn7bHpMsyPlNyc0fj5qYmRB-DN7rv5varaisBaVT0mLQdwKjBDVqNVnU2m5azPhY-2txvihHaI5_cLIsLLaqKMbB17UxGumuT_o8S03_h8-1syO3Ay87y9pPIw\u0022,\u0022qi\u0022:\u0022JY2uUek6wPrp4fPcInX_5WdNlhyghcGVEvlqxs9iOEUeCtUc6d42n9tgiImMu605dQaigvNaH5y1pwDpLlmxUk0nOUVxqo9mv0Uw8WNXB88FyDb0fPbewLpn4Fskb8Umv6_OymJ1W814DRG-jq3sI5DsB7AjtqJQ22nP2Vs1bIrx5fUxuScwrMsWSrrjAx4Kr8-5eeSDqE-_c7DPZ_zSPYDoHaMeR2pZfNAq3mEbxp8jMukzh77rYZ3ffQEA6AyxFSCSCrxVozhP4ypQ0jAkXVWOlj4nuV6briIqlL3ZboydwsIolRwaPSgH6-bw03XS6Hb9DA0KHJKLun94N9n5kw\u0022,\u0022use\u0022:\u0022enc\u0022}\ndiff --git a/minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.pub b/minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.pub\ndeleted file mode 100644\nindex e2bd85c..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.pub\n+++ /dev/null\n@@ -1 +0,0 @@\n-{\u0022e\u0022:\u0022AQAB\u0022,\u0022kid\u0022:\u0022my kid\u0022,\u0022kty\u0022:\u0022RSA\u0022,\u0022n\u0022:\u00222_YjG_D1sOWJxs6cohikupHf5WJfWSFfSCrnNZ7WR7AyTLnKZAF4VKyimMeJTLYYwCAXMDD5XmkF8VluI4O-hASUIJ7F9eDg3vO7nPwtkWa9lkqt-QyQZ_PjiOGpwetBLzrsaXsC9PvdVzrKXnjeNPsmmbC_Fx2cUn4H_9H_WfXi01VR75XFTBtxTrDY7hmpZHuFCFUOMCW9siTZRk9339Y6ORBznBs4jFbkGI1Pmc3op0o5f8S1gus9L81W5uyUrxfd-CkmJ6eWE8I36cfzI6irN2bhVhR_NXERUtS0QOEeJYlRJXqfYkxTMVlsXPl6zbYt__ZYLC6ZiUTCc6K2KmfGh7fihWbao4dyQW3Mq4kClhpIT0O01Y0r7sR1j4jTnFNqbmtPSl9lEMrfiUHfOLqRJo3qizQ-b6HLCDty1otFz8Q8gg0rD3copQ_zFrcTGwJGAv2Absraj7kp9EJXBqneCJ3dlRO8rzx7KB9Dsj-ygh3kZaubkPCeT1v4l_VUY2iGnK4vzIGKM7j56DQ97ZAi1Bb0y6GYSbrWB2_z0DKJu0fiU-NscbKplR68vgppUM6_iogrk48JEZg_kkTymniqbT3g7J_WeoZSx1Uu8ZHI3ysIFfUtFscOa2SJGlj1ds-lfk6Oqac_I8ahRqQeyVAEisZPmYIGSJajbJopJ4s\u0022}\ndiff --git a/minimal-examples/crypto/minimal-crypto-jwe/main.c b/minimal-examples/crypto/minimal-crypto-jwe/main.c\ndeleted file mode 100644\nindex 883f0b6..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jwe/main.c\n+++ /dev/null\n@@ -1,288 +0,0 @@\n-/*\n- * lws-crypto-jwe\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003csys/types.h\u003e\n-#include \u003cfcntl.h\u003e\n-\n-/*\n- * handles escapes and line wrapping suitable for use\n- * defining a C char array ( -c option )\n- */\n-\n-static void\n-format_c(const char *key)\n-{\n-\tconst char *k \u003d key;\n-\tint seq \u003d 0;\n-\n-\twhile (*k) {\n-\t\tif (*k \u003d\u003d '{') {\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tputchar('{');\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tputchar('\u005cn');\n-\t\t\tputchar('\u005ct');\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tk++;\n-\t\t\tseq \u003d 0;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tif (*k \u003d\u003d '}') {\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tputchar('\u005cn');\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tputchar('}');\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tputchar('\u005cn');\n-\t\t\tk++;\n-\t\t\tseq \u003d 0;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tif (*k \u003d\u003d '\u005c\u0022') {\n-\t\t\tputchar('\u005c\u005c');\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tseq +\u003d 2;\n-\t\t\tk++;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tif (*k \u003d\u003d ',') {\n-\t\t\tputchar(',');\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tputchar('\u005cn');\n-\t\t\tputchar('\u005ct');\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tk++;\n-\t\t\tseq \u003d 0;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tputchar(*k);\n-\t\tseq++;\n-\t\tif (seq \u003e\u003d 60) {\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tputchar('\u005cn');\n-\t\t\tputchar('\u005ct');\n-\t\t\tputchar(' ');\n-\t\t\tputchar('\u005c\u0022');\n-\t\t\tseq \u003d 1;\n-\t\t}\n-\t\tk++;\n-\t}\n-}\n-\n-#define MAX_SIZE (4 * 1024 * 1024)\n-\tchar temp[MAX_SIZE], compact[MAX_SIZE];\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n, enc \u003d 0, result \u003d 0,\n-\t logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tchar *in;\n-\tstruct lws_context_creation_info info;\n-\tint temp_len \u003d sizeof(temp);\n-\tstruct lws_context *context;\n-\tstruct lws_jwe jwe;\n-\tconst char *p;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS JWE example tool\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\tinfo.options \u003d 0;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tlws_jwe_init(\u0026jwe, context);\n-\n-\t/* if encrypting, set the ciphers */\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-e\u0022))) {\n-\t\tchar *sp \u003d strchr(p, ' ');\n-\n-\t\tif (!sp) {\n-\t\t\tlwsl_err(\u0022format: -e \u005c\u0022\u003ccek cipher alg\u003e \u0022\n-\t\t\t\t \u0022\u003cpayload enc alg\u003e\u005c\u0022, eg, \u0022\n-\t\t\t\t \u0022-e \u005c\u0022RSA1_5 A128CBC-HS256\u005c\u0022\u005cn\u0022);\n-\n-\t\t\treturn 1;\n-\t\t}\n-\t\t*sp \u003d '\u005c0';\n-\t\tif (lws_gencrypto_jwe_alg_to_definition(p, \u0026jwe.jose.alg)) {\n-\t\t\tlwsl_err(\u0022Unknown cipher alg %s\u005cn\u0022, p);\n-\t\t\treturn 1;\n-\t\t}\n-\t\tif (lws_gencrypto_jwe_enc_to_definition(sp + 1, \u0026jwe.jose.enc_alg)) {\n-\t\t\tlwsl_err(\u0022Unknown payload enc alg %s\u005cn\u0022, sp + 1);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\t/* create JOSE header, also needed for output */\n-\n-\t\tif (lws_jws_alloc_element(\u0026jwe.jws.map, LJWS_JOSE,\n-\t\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t\t \u0026temp_len, strlen(p) +\n-\t\t\t\t\t strlen(sp + 1) + 32, 0)) {\n-\t\t\tlwsl_err(\u0022%s: temp space too small\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tjwe.jws.map.len[LJWS_JOSE] \u003d (uint32_t)lws_snprintf(\n-\t\t\t\t(char *)jwe.jws.map.buf[LJWS_JOSE], (unsigned int)temp_len,\n-\t\t\t\t\u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022%s\u005c\u0022,\u005c\u0022enc\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022, p, sp + 1);\n-\n-\t\tenc \u003d 1;\n-\t}\n-\n-\tin \u003d lws_concat_temp(temp, temp_len);\n-\tn \u003d (int)read(0, in, (unsigned int)temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022Problem reading from stdin\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\t/* account for padding as well */\n-\n-\ttemp_len -\u003d (int)lws_gencrypto_padded_length(LWS_AES_CBC_BLOCKLEN, (unsigned int)n);\n-\n-\t/* grab the key */\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-k\u0022))) {\n-\t\tif (lws_jwk_load(\u0026jwe.jwk, p, NULL, NULL)) {\n-\t\t\tlwsl_err(\u0022%s: problem loading JWK %s\u005cn\u0022, __func__, p);\n-\n-\t\t\treturn 1;\n-\t\t}\n-\t} else {\n-\t\tlwsl_err(\u0022-k \u003cjwk file\u003e is required\u005cn\u0022);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tif (enc) {\n-\n-\t\t/* point CTXT to the plaintext we read from stdin */\n-\n-\t\tjwe.jws.map.buf[LJWE_CTXT] \u003d in;\n-\t\tjwe.jws.map.len[LJWE_CTXT] \u003d (uint32_t)n;\n-\n-\t\t/*\n-\t\t * Create a random CEK and set EKEY to it\n-\t\t * CEK size is determined by hash / hmac size\n-\t\t */\n-\n-\t\tn \u003d lws_gencrypto_bits_to_bytes(jwe.jose.enc_alg-\u003ekeybits_fixed);\n-\t\tif (lws_jws_randomize_element(context, \u0026jwe.jws.map, LJWE_EKEY,\n-\t\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t\t \u0026temp_len, (unsigned int)n,\n-\t\t\t\t\t LWS_JWE_LIMIT_KEY_ELEMENT_BYTES)) {\n-\t\t\tlwsl_err(\u0022Problem getting random\u005cn\u0022);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\t/* perform the encryption of the CEK and the plaintext */\n-\n-\t\tn \u003d lws_jwe_encrypt(\u0026jwe, lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len);\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: lws_jwe_encrypt failed\u005cn\u0022, __func__);\n-\t\t\tgoto bail1;\n-\t\t}\n-\t\tif (lws_cmdline_option(argc, argv, \u0022-f\u0022))\n-\t\t\t/* output the JWE in flattened form */\n-\t\t\tn \u003d lws_jwe_render_flattened(\u0026jwe, compact,\n-\t\t\t\t\t\t sizeof(compact));\n-\t\telse\n-\t\t\t/* output the JWE in compact form */\n-\t\t\tn \u003d lws_jwe_render_compact(\u0026jwe, compact,\n-\t\t\t\t\t\t sizeof(compact));\n-\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: lws_jwe_render failed: %d\u005cn\u0022,\n-\t\t\t\t __func__, n);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\tif (lws_cmdline_option(argc, argv, \u0022-c\u0022))\n-\t\t\tformat_c(compact);\n-\t\telse\n-\t\t\tif (write(1, compact,\n-#if defined(WIN32)\n-\t\t\t\t\t(unsigned int)\n-#endif\n-\t\t\t\t\tstrlen(compact)) \u003c 0) {\n-\t\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n-\t\t\t\tgoto bail1;\n-\t\t\t}\n-\t} else {\n-\t\tif (lws_cmdline_option(argc, argv, \u0022-f\u0022)) {\n-\t\t\tif (lws_jwe_json_parse(\u0026jwe, (uint8_t *)in, n,\n-\t\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t\t \u0026temp_len)) {\n-\t\t\t\tlwsl_err(\u0022%s: lws_jwe_json_parse failed\u005cn\u0022,\n-\t\t\t\t\t\t\t\t __func__);\n-\t\t\t\tgoto bail1;\n-\t\t\t}\n-\t\t} else\n-\t\t\t/*\n-\t\t\t * converts a compact serialization to b64 + decoded maps\n-\t\t\t * held in jws\n-\t\t\t */\n-\t\t\tif (lws_jws_compact_decode(in, n, \u0026jwe.jws.map,\n-\t\t\t\t\t\t \u0026jwe.jws.map_b64,\n-\t\t\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t\t\t \u0026temp_len) !\u003d 5) {\n-\t\t\t\tlwsl_err(\u0022%s: lws_jws_compact_decode failed\u005cn\u0022,\n-\t\t\t\t\t __func__);\n-\t\t\t\tgoto bail1;\n-\t\t\t}\n-\n-\t\t/*\n-\t\t * Do the crypto according to what we parsed into the jose\n-\t\t * (information on the ciphers) and the jws (plaintext and\n-\t\t * signature info)\n-\t\t */\n-\n-\t\tn \u003d lws_jwe_auth_and_decrypt(\u0026jwe,\n-\t\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t\t \u0026temp_len);\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: lws_jwe_auth_and_decrypt failed\u005cn\u0022,\n-\t\t\t\t __func__);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\t/* if it's valid, dump the plaintext and return 0 */\n-\n-\t\tif (write(1, jwe.jws.map.buf[LJWE_CTXT],\n-\t\t\t jwe.jws.map.len[LJWE_CTXT]) \u003c 0) {\n-\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n-\t\t\tgoto bail1;\n-\t\t}\n-\t}\n-\n-\tresult \u003d 0;\n-\n-bail1:\n-\n-\tlws_jwe_destroy(\u0026jwe);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/crypto/minimal-crypto-jwk/CMakeLists.txt b/minimal-examples/crypto/minimal-crypto-jwk/CMakeLists.txt\ndeleted file mode 100644\nindex a5b2d07..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jwk/CMakeLists.txt\n+++ /dev/null\n@@ -1,23 +0,0 @@\n-project(lws-crypto-jwk C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-crypto-jwk)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_JOSE 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/crypto/minimal-crypto-jwk/README.md b/minimal-examples/crypto/minimal-crypto-jwk/README.md\ndeleted file mode 100644\nindex eea687d..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jwk/README.md\n+++ /dev/null\n@@ -1,52 +0,0 @@\n-# lws minimal example for JWK\n-\n-Demonstrates how to generate and format any kind of supported new random JWK keys.\n-\n-The full private key is output to stdout, a version of the key with the private\n-part removed and some metadata adapted can be saved to a file at the same time\n-using `--public \u003cfile\u003e`. In the public form, `key_ops` and `use` elements are\n-adjusted to remove activities that require a private key.\n-\n-Key elements are output in strict RFC7638 lexicographic order as required by\n-some applications.\n-\n-Keys produced with openssl and mbedtls backends are completely interchangeable.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--t \u003ctype\u003e|RSA, OCT or EC\n--b \u003cbits\u003e|For RSA and OCT, key size in bits\n--v \u003ccurve\u003e|For EC keys, the curve, eg, \u0022P-384\u0022... this implies the key bits\n---kid \u0022ID string\u0022|Key identity string\n---use \u0022use[ use]\u0022|Key use restriction (mutually exclusive with --key-ops): sig, enc\n---alg \u003calg\u003e|Specify the algorithm the key is designed for, eg \u0022RSA1_5\u0022\n---key-ops \u0022op[ op]\u0022|Key valid operations (mutually exclusive with --use): sign, verify, encrypt, decrypt, wrapKey, unwrapKey, deriveKey, deriveBits\n--c|Format the jwk as a linebroken C string\n---public \u003cfilepath\u003e|Only output the full, private key, not the public version first\n-\n-For legibility the example uses -c, however this\n-\n-```\n- $ ./lws-crypto-jwk -t EC -v P-256 --key-ops \u0022sign verify\u0022 --public mykey.pub\n-[2018/12/18 20:19:29:6972] USER: LWS JWK example\n-[2018/12/18 20:19:29:7200] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n-[2018/12/18 20:19:29:7251] NOTICE: lws_jwk_generate: generating ECDSA key on curve P-256\n-{\u0022crv\u0022:\u0022P-256\u0022,\u0022d\u0022:\u0022eMKM_S4BTL2aiebZLqvxglufV2YX4b3_32DesgEUOaM\u0022,\u0022key_ops\u0022:[\u0022sign\u0022,\u0022verify\u0022],\u0022kty\u0022:\u0022EC\u0022,\u0022x\u0022:\u0022OWauiGGtJ60ZegtqlwETQlmO1exTZdWbT2VbUs4a1hg\u0022,\u0022y\u0022:\u0022g_eNOlqPecbguVQArL6Fd4T5xZthBgipNCBypXubPos\u0022}\n-```\n-\n-The output in `mykey.pub` is:\n-\n-```\n-{\u0022crv\u0022:\u0022P-256\u0022,\u0022key_ops\u0022:[\u0022verify\u0022],\u0022kty\u0022:\u0022EC\u0022,\u0022x\u0022:\u0022OWauiGGtJ60ZegtqlwETQlmO1exTZdWbT2VbUs4a1hg\u0022,\u0022y\u0022:\u0022g_eNOlqPecbguVQArL6Fd4T5xZthBgipNCBypXubPos\u0022}\n-```\n-\n-Notice the logging goes out on stderr, the key data goes on stdout.\ndiff --git a/minimal-examples/crypto/minimal-crypto-jwk/main.c b/minimal-examples/crypto/minimal-crypto-jwk/main.c\ndeleted file mode 100644\nindex db62457..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jwk/main.c\n+++ /dev/null\n@@ -1,200 +0,0 @@\n-/*\n- * lws-crypto-jwk\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003csys/types.h\u003e\n-#include \u003cfcntl.h\u003e\n-\n-/*\n- * handles escapes and line wrapping suitable for use\n- * defining a C char array ( -c option )\n- */\n-\n-static int\n-format_c(int fd, const char *key)\n-{\n-\tconst char *k \u003d key;\n-\tint seq \u003d 0;\n-\n-\twhile (*k) {\n-\t\tif (*k \u003d\u003d '{') {\n-\t\t\tif (write(fd, \u0022\u005c\u0022{\u005c\u0022\u005cn\u005ct\u005c\u0022\u0022, 6) \u003c 6)\n-\t\t\t\treturn -1;\n-\t\t\tk++;\n-\t\t\tseq \u003d 0;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tif (*k \u003d\u003d '}') {\n-\t\t\tif (write(fd, \u0022\u005c\u0022\u005cn\u005c\u0022}\u005c\u0022\u005cn\u0022, 6) \u003c 6)\n-\t\t\t\treturn -1;\n-\t\t\tk++;\n-\t\t\tseq \u003d 0;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tif (*k \u003d\u003d '\u005c\u0022') {\n-\t\t\tif (write(fd, \u0022\u005c\u005c\u005c\u0022\u0022, 2) \u003c 2)\n-\t\t\t\treturn -1;\n-\t\t\tseq +\u003d 2;\n-\t\t\tk++;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tif (*k \u003d\u003d ',') {\n-\t\t\tif (write(fd, \u0022,\u005c\u0022\u005cn\u005ct\u005c\u0022\u0022, 5) \u003c 5)\n-\t\t\t\treturn -1;\n-\t\t\tk++;\n-\t\t\tseq \u003d 0;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tif (write(fd, k, 1) \u003c 1)\n-\t\t\treturn -1;\n-\t\tseq++;\n-\t\tif (seq \u003e\u003d 60) {\n-\t\t\tif (write(fd, \u0022\u005c\u0022\u005cn\u005ct \u005c\u0022\u0022, 5) \u003c 5)\n-\t\t\t\treturn -1;\n-\t\t\tseq \u003d 1;\n-\t\t}\n-\t\tk++;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tint result \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tenum lws_gencrypto_kty kty \u003d LWS_GENCRYPTO_KTY_RSA;\n-\tstruct lws_context_creation_info info;\n-\tconst char *curve \u003d \u0022P-256\u0022, *p;\n-\tstruct lws_context *context;\n-\tstruct lws_jwk jwk;\n-\tint bits \u003d 4096;\n-\tchar key[32768];\n-\tint vl \u003d sizeof(key);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS JWK example\u005cn\u0022);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-b\u0022)))\n-\t\tbits \u003d atoi(p);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-t\u0022))) {\n-\t\tif (!strcmp(p, \u0022RSA\u0022))\n-\t\t\tkty \u003d LWS_GENCRYPTO_KTY_RSA;\n-\t\telse\n-\t\t\tif (!strcmp(p, \u0022OCT\u0022))\n-\t\t\t\tkty \u003d LWS_GENCRYPTO_KTY_OCT;\n-\t\t\telse\n-\t\t\t\tif (!strcmp(p, \u0022EC\u0022))\n-\t\t\t\t\tkty \u003d LWS_GENCRYPTO_KTY_EC;\n-\t\t\t\telse {\n-\t\t\t\t\tlwsl_err(\u0022Unknown key type (must be \u0022\n-\t\t\t\t\t\t \u0022OCT, RSA or EC)\u005cn\u0022);\n-\n-\t\t\t\t\treturn 1;\n-\t\t\t\t}\n-\t}\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\tinfo.options \u003d 0;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-v\u0022)))\n-\t\tcurve \u003d p;\n-\n-\tif (lws_jwk_generate(context, \u0026jwk, kty, bits, curve)) {\n-\t\tlwsl_err(\u0022lws_jwk_generate failed\u005cn\u0022);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--kid\u0022)))\n-\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_KID, p, (int)strlen(p));\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--use\u0022)))\n-\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_USE, p, (int)strlen(p));\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022)))\n-\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_ALG, p, (int)strlen(p));\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--key-ops\u0022)))\n-\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_KEY_OPS, p, (int)strlen(p));\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--public\u0022)) \u0026\u0026\n-\t kty !\u003d LWS_GENCRYPTO_KTY_OCT) {\n-\n-\t\tint fd;\n-\n-\t\t/* public version */\n-\n-\t\tif (lws_jwk_export(\u0026jwk, 0, key, \u0026vl) \u003c 0) {\n-\t\t\tlwsl_err(\u0022lws_jwk_export failed\u005cn\u0022);\n-\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tfd \u003d open(p, LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);\n-\t\tif (fd \u003c 0) {\n-\t\t\tlwsl_err(\u0022Can't open public key file %s\u005cn\u0022, p);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tif (lws_cmdline_option(argc, argv, \u0022-c\u0022))\n-\t\t\tformat_c(fd, key);\n-\t\telse {\n-\t\t\tif (write(fd, key,\n-#if defined(WIN32)\n-\t\t\t\t\t(unsigned int)\n-#endif\n-\t\t\t\t\tstrlen(key)) \u003c 0) {\n-\t\t\t\tlwsl_err(\u0022Write public failed\u005cn\u0022);\n-\t\t\t\treturn 1;\n-\t\t\t}\n-\t\t}\n-\n-\t\tclose(fd);\n-\t}\n-\n-\t/* private version */\n-\n-\tif (lws_jwk_export(\u0026jwk, LWSJWKF_EXPORT_PRIVATE, key, \u0026vl) \u003c 0) {\n-\t\tlwsl_err(\u0022lws_jwk_export failed\u005cn\u0022);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022-c\u0022)) {\n-\t\tif (format_c(1, key) \u003c 0)\n-\t\t\treturn 1;\n-\t} else\n-\t\tif (write(1, key,\n-#if defined(WIN32)\n-\t\t\t\t(unsigned int)\n-#endif\n-\t\t\t\tstrlen(key)) \u003c 0) {\n-\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/crypto/minimal-crypto-jws/CMakeLists.txt b/minimal-examples/crypto/minimal-crypto-jws/CMakeLists.txt\ndeleted file mode 100644\nindex b566fb2..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jws/CMakeLists.txt\n+++ /dev/null\n@@ -1,24 +0,0 @@\n-project(lws-crypto-jws C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-crypto-jws)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_JOSE 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/crypto/minimal-crypto-jws/README.md b/minimal-examples/crypto/minimal-crypto-jws/README.md\ndeleted file mode 100644\nindex 97cbf00..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jws/README.md\n+++ /dev/null\n@@ -1,60 +0,0 @@\n-# lws minimal example for JWS\n-\n-Demonstrates how to sign and verify using compact JWS and JWK, providing a\n-commandline tool for signing and verifying stdin.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Stdin is either the plaintext (if signing) or compact JWS (if verifying).\n-\n-Stdout is either the JWE (if encrypting) or plaintext (if decrypting).\n-\n-You must pass a private or public key JWK file in the -k option if encrypting,\n-and must pass a private key JWK file in the -k option if decrypting. To be\n-clear, for asymmetric keys the public part of the key is required to encrypt,\n-and the private part required to decrypt.\n-\n-For convenience, a pair of public and private keys are provided,\n-`key-rsa-4096.private` and `key-rsa-4096.pub`, these were produced with just\n-\n-```\n- $ lws-crypto-jwk -t RSA -b 4096 --public key-rsa-4096.pub \u003ekey-rsa-4096.private\n-```\n-\n-Similar keys for EC modes may be produced with\n-\n-```\n- $ lws-crypto-jwk -t EC -v P-256 --public key-ecdh-p-256.pub \u003ekey-ecdh-p-256.private\n-```\n-\n-JWSs produced with openssl and mbedtls backends are completely interchangeable.\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--s \u0022\u003csignature alg\u003e\u0022|Sign (default is verify), eg, -e \u0022ES256\u0022. For verify, the cipher information comes from the input JWS.\n--k \u003cjwk file\u003e|JWK file to sign or verify with... sign requires the key has its private part\n--c|Format the JWE as a linebroken C string\n--f|Output flattened representation (instead of compact by default)\n-\n-```\n- $ echo -n \u0022plaintext0123456\u0022 | ./lws-crypto-jws -s \u0022ES256\u0022 -k ec-p256.private\n-[2018/12/19 16:20:25:6519] USER: LWS JWE example tool\n-[2018/12/19 16:20:25:6749] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n-eyJhbGciOiJSU0ExXzUiLCAiZW5jIjoiQTEyOENCQy1IUzI1NiJ9.ivFr7qzx-pQ4V_edbjpdvR9OwWL9KmojPE2rXQM52oLtW0BtnxZu2_ezqhsAelyIcaworgfobs3u4bslXHMFbeJJjPb5xD0fBDe64OYXZH1NpUGTMJh9Ka4CrJ2B3xhxe7EByGAuGqmluqE0Yezj7rhSw7vlr5JAwuOJ8FaGa8aZ8ldki5G5h_S2Furlbjdcw3Rrxk7mCoMHcLoqzfZtggMPwGAMFogCqcwUo7oSLbBeGaa6hpMbfSysugseWdr8TzObQKPM52k6iVAlGwRaOg_qdLMgZiYRhHA6nFKTQd7XBbNY6qAS8sPuj7Zz344tF3RSfJ0zX_telG71sOtVv5fMpeDU-eCdpOWlCBfu6J6FQfAFu6SJryM4ajGOif09CwFI5qUQ33SOfQfS_M3nqSyd6Vu5M4lsDrb5wK7_XX5gqUwvI9wicf_8WWR-CQomRF-JvEASnA2SIf8QqYfa8R2rP9q6Md4vwO4EZrtxIsMDPsH-4ZEFu7vDjyy09QfIWWsnEb8-UgpVXensgt2m_2bZ76r1VB8-0nZLMwMyEhaH2wra9vX2FWao5UkmNJ7ht300f4_V6QzMFoePpwCvsufWBW6jcQLB-frCWe6uitWaZHEB4LxmNPKzQSz4QwwTKhpF1jNn8Xh1-w1m-2h0gj-oe-S8QBwPveqhPI1p2fI.snuhUTXHNu5mJ6dEPQqg6g.yl36qC4o0GE4nrquQ2YyCg.Vf0MoT7_kUrZdCNWXhq1DQ\n-```\n-\n-Notice the logging is on stderr, and the output alone on stdout.\n-\n-When signing, the compact representation of the JWS is output on stdout.\n-\n-When verifying, if the signature is valid the plaintext is output on stdout\n-and the tool exits with a 0 exit code. Otherwise nothing is output on stdout\n-and it exits with a nonzero exit code.\n-\ndiff --git a/minimal-examples/crypto/minimal-crypto-jws/main.c b/minimal-examples/crypto/minimal-crypto-jws/main.c\ndeleted file mode 100644\nindex d579aab..0000000\n--- a/minimal-examples/crypto/minimal-crypto-jws/main.c\n+++ /dev/null\n@@ -1,215 +0,0 @@\n-/*\n- * lws-crypto-jws\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003csys/types.h\u003e\n-#include \u003cfcntl.h\u003e\n-\n-#define MAX_SIZE (4 * 1024 * 1024)\n-char temp[MAX_SIZE], compact[MAX_SIZE];\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n, sign \u003d 0, result \u003d 0,\n-\t logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tchar *in;\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_jws_map map;\n-\tint temp_len \u003d sizeof(temp);\n-\tstruct lws_context *context;\n-\tstruct lws_jose jose;\n-\tstruct lws_jwk jwk;\n-\tstruct lws_jws jws;\n-\tconst char *p;\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS JWS example tool\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\tinfo.options \u003d 0;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tlws_jose_init(\u0026jose);\n-\tlws_jws_init(\u0026jws, \u0026jwk, context);\n-\n-\t/* if signing, set the ciphers */\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022))) {\n-\n-\t\tif (lws_gencrypto_jws_alg_to_definition(p, \u0026jose.alg)) {\n-\t\t\tlwsl_err(\u0022format: -s \u005c\u0022\u003cjws cipher alg\u003e\u005c\u0022, eg, \u0022\n-\t\t\t\t \u0022-e \u005c\u0022RS256\u005c\u0022\u005cn\u0022);\n-\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\t/* create JOSE header, also needed for output */\n-\n-\t\tif (lws_jws_alloc_element(\u0026jws.map, LJWS_JOSE,\n-\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len, strlen(p) + 10, 0)) {\n-\t\t\tlwsl_err(\u0022%s: temp space too small\u005cn\u0022, __func__);\n-\t\t\treturn 1;\n-\t\t}\n-\n-\t\tjws.map.len[LJWS_JOSE] \u003d (uint32_t)\n-\t\t\t\tlws_snprintf((char *)jws.map.buf[LJWS_JOSE],\n-\t\t\t\t\t (unsigned int)temp_len, \u0022{\u005c\u0022alg\u005c\u0022:\u005c\u0022%s\u005c\u0022}\u0022, p);\n-\t\tsign \u003d 1;\n-\t}\n-\n-\tin \u003d lws_concat_temp(temp, temp_len);\n-\tn \u003d (int)read(0, in, (unsigned int)temp_len);\n-\tif (n \u003c 0) {\n-\t\tlwsl_err(\u0022Problem reading from stdin\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\ttemp_len -\u003d n;\n-\n-\t/* grab the key */\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-k\u0022))) {\n-\t\tif (lws_jwk_load(\u0026jwk, p, NULL, NULL)) {\n-\t\t\tlwsl_err(\u0022%s: problem loading JWK %s\u005cn\u0022, __func__, p);\n-\n-\t\t\treturn 1;\n-\t\t}\n-\t} else {\n-\t\tlwsl_err(\u0022-k \u003cjwk file\u003e is required\u005cn\u0022);\n-\n-\t\treturn 1;\n-\t}\n-\tif (sign) {\n-\n-\t\t/* add the plaintext from stdin to the map and a b64 version */\n-\n-\t\tjws.map.buf[LJWS_PYLD] \u003d in;\n-\t\tjws.map.len[LJWS_PYLD] \u003d (unsigned int)n;\n-\n-\t\tif (lws_jws_encode_b64_element(\u0026jws.map_b64, LJWS_PYLD,\n-\t\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t\t \u0026temp_len, jws.map.buf[LJWS_PYLD],\n-\t\t\t\t\t jws.map.len[LJWS_PYLD]))\n-\t\t\tgoto bail1;\n-\n-\t\t/* add the b64 JOSE header to the b64 map */\n-\n-\t\tif (lws_jws_encode_b64_element(\u0026jws.map_b64, LJWS_JOSE,\n-\t\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t\t \u0026temp_len, jws.map.buf[LJWS_JOSE],\n-\t\t\t\t\t jws.map.len[LJWS_JOSE]))\n-\t\t\tgoto bail1;\n-\n-\t\t/* prepare the space for the b64 signature in the map */\n-\n-\t\tif (lws_jws_alloc_element(\u0026jws.map_b64, LJWS_SIG,\n-\t\t\t\t lws_concat_temp(temp, temp_len),\n-\t\t\t\t \u0026temp_len, (unsigned int)lws_base64_size(\n-\t\t\t\t\t LWS_JWE_LIMIT_KEY_ELEMENT_BYTES), 0)) {\n-\t\t\tlwsl_err(\u0022%s: temp space too small\u005cn\u0022, __func__);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\n-\n-\t\t/* sign the plaintext */\n-\n-\t\tn \u003d lws_jws_sign_from_b64(\u0026jose, \u0026jws,\n-\t\t\t\t\t (char *)jws.map_b64.buf[LJWS_SIG],\n-\t\t\t\t\t jws.map_b64.len[LJWS_SIG]);\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: failed signing test packet\u005cn\u0022, __func__);\n-\t\t\tgoto bail1;\n-\t\t}\n-\t\t/* set the actual b64 signature size */\n-\t\tjws.map_b64.len[LJWS_SIG] \u003d (uint32_t)n;\n-\n-\t\tif (lws_cmdline_option(argc, argv, \u0022-f\u0022))\n-\t\t\t/* create the flattened representation */\n-\t\t\tn \u003d lws_jws_write_flattened_json(\u0026jws, compact, sizeof(compact));\n-\t\telse\n-\t\t\t/* create the compact JWS representation */\n-\t\t\tn \u003d lws_jws_write_compact(\u0026jws, compact, sizeof(compact));\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_notice(\u0022%s: write_compact failed\u005cn\u0022, __func__);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\t/* dump the compact JWS representation on stdout */\n-\n-\t\tif (write(1, compact,\n-#if defined(WIN32)\n-\t\t\t\t(unsigned int)\n-#endif\n-\t\t\t\tstrlen(compact)) \u003c 0) {\n-\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t} else {\n-\t\t/* perform the verify directly on the compact representation */\n-\n-\t\tif (lws_cmdline_option(argc, argv, \u0022-f\u0022)) {\n-\t\t\tif (lws_jws_sig_confirm_json(in, (unsigned int)n, \u0026jws, \u0026jwk, context,\n-\t\t\t\t\tlws_concat_temp(temp, temp_len),\n-\t\t\t\t\t\u0026temp_len) \u003c 0) {\n-\t\t\t\tlwsl_notice(\u0022%s: confirm rsa sig failed\u005cn\u0022,\n-\t\t\t\t\t __func__);\n-\t\t\t\tlwsl_hexdump_notice(jws.map.buf[LJWS_JOSE], jws.map.len[LJWS_JOSE]);\n-\t\t\t\tlwsl_hexdump_notice(jws.map.buf[LJWS_PYLD], jws.map.len[LJWS_PYLD]);\n-\t\t\t\tlwsl_hexdump_notice(jws.map.buf[LJWS_SIG], jws.map.len[LJWS_SIG]);\n-\n-\t\t\t\tlwsl_hexdump_notice(jws.map_b64.buf[LJWS_JOSE], jws.map_b64.len[LJWS_JOSE]);\n-\t\t\t\tlwsl_hexdump_notice(jws.map_b64.buf[LJWS_PYLD], jws.map_b64.len[LJWS_PYLD]);\n-\t\t\t\tlwsl_hexdump_notice(jws.map_b64.buf[LJWS_SIG], jws.map_b64.len[LJWS_SIG]);\n-\t\t\t\tgoto bail1;\n-\t\t\t}\n-\t\t} else {\n-\t\t\tif (lws_jws_sig_confirm_compact_b64(in,\n-\t\t\t\t\tlws_concat_used(temp, (unsigned int)temp_len),\n-\t\t\t\t\t\u0026map, \u0026jwk, context,\n-\t\t\t\t\tlws_concat_temp(temp, temp_len),\n-\t\t\t\t\t\u0026temp_len) \u003c 0) {\n-\t\t\t\tlwsl_notice(\u0022%s: confirm rsa sig failed\u005cn\u0022,\n-\t\t\t\t\t __func__);\n-\t\t\t\tgoto bail1;\n-\t\t\t}\n-\t\t}\n-\n-\t\tlwsl_notice(\u0022VALID\u005cn\u0022);\n-\n-\t\t/* dump the verifed plaintext and return 0 */\n-\n-\t\tif (write(1, jws.map.buf[LJWS_PYLD], jws.map.len[LJWS_PYLD]) \u003c 0) {\n-\t\t\tlwsl_err(\u0022Write stdout failed\u005cn\u0022);\n-\t\t\tgoto bail1;\n-\t\t}\n-\t}\n-\n-\tresult \u003d 0;\n-\n-bail1:\n-\tlws_jws_destroy(\u0026jws);\n-\tlws_jwk_destroy(\u0026jwk);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/crypto/minimal-crypto-x509/CMakeLists.txt b/minimal-examples/crypto/minimal-crypto-x509/CMakeLists.txt\ndeleted file mode 100644\nindex 74d7732..0000000\n--- a/minimal-examples/crypto/minimal-crypto-x509/CMakeLists.txt\n+++ /dev/null\n@@ -1,24 +0,0 @@\n-project(lws-crypto-x509 C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-crypto-x509)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_WITH_JOSE 1 requirements)\n-\n-if (requirements)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/crypto/minimal-crypto-x509/README.md b/minimal-examples/crypto/minimal-crypto-x509/README.md\ndeleted file mode 100644\nindex b0d641e..0000000\n--- a/minimal-examples/crypto/minimal-crypto-x509/README.md\n+++ /dev/null\n@@ -1,59 +0,0 @@\n-# lws minimal example for X509\n-\n-The example shows how to:\n-\n- - confirm one PEM cert or chain (-c) was signed by a trusted PEM cert (-t)\n- - convert a certificate public key to JWK\n- - convert a certificate public key and its private key PEM to a private JWK\n-\n-The examples work for EC and RSA certs and on mbedtls and OpenSSL the same.\n-\n-Notice the logging is on stderr, and only the JWK is output on stdout.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--c \u003cPEM certificate path\u003e|Required PEM Certificate(s) to operate on... may be multiple concatednated PEM\n--t \u003cPEM certificate path\u003e|Single PEM trusted certificate\n--p \u003cPEM private key path\u003e|Optional private key matching certificate given in -c. If given, only the private JWK is printed to stdout\n-\n-Example for confirming trust relationship. Notice the PEM in -c must contain not only\n-the final certificate but also the certificates for any intermediate CAs.\n-\n-```\n- $ ./lws-crypto-x509 -c ec-cert.pem -t ca-cert.pem\n-[2019/01/02 20:31:13:2031] USER: LWS X509 api example\n-[2019/01/02 20:31:13:2032] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n-[2019/01/02 20:31:13:2043] NOTICE: main: certs loaded OK\n-[2019/01/02 20:31:13:2043] NOTICE: main: verified OK \u003c\u003c\u003c\u003c\u003d\u003d\u003d\u003d\u003d\u003d\n-[2019/01/02 20:31:13:2045] NOTICE: Cert Public JWK\n-{\u0022crv\u0022:\u0022P-521\u0022,\u0022kty\u0022:\u0022EC\u0022,\u0022x\u0022:\u0022_uRNBbIbm0zhk8v6ujvQX9924264ZkqJhit0qamAoCegzuJbLf434kN7_aFEt6u-QWUu6-N1R8t6OlvrLo2jrNY\u0022,\u0022y\u0022:\u0022AU-29XpNyB7e5e3s5t0ylzGEnF601A8A7Tx8m8xxngARZX_bn22itGJ3Y57BTcclPMoG80KjWAMnRVtrKqrD_aGD\u0022}\n-\n-[2019/01/02 20:31:13:2045] NOTICE: main: OK\n-```\n-\n-Example creating JWKs for public and public + private cert + PEM keys:\n-\n-```\n- $ ./lws-crypto-x509 -c ec-cert.pem -p ec-key.pem\n-[2019/01/02 20:14:43:4966] USER: LWS X509 api example\n-[2019/01/02 20:14:43:5225] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n-[2019/01/02 20:14:43:5707] NOTICE: lws_x509_public_to_jwk: EC key\n-[2019/01/02 20:24:59:9514] USER: LWS X509 api example\n-[2019/01/02 20:24:59:9741] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 off\n-[2019/01/02 20:25:00:1261] NOTICE: lws_x509_public_to_jwk: key type 408 \u0022id-ecPublicKey\u0022\n-[2019/01/02 20:25:00:1269] NOTICE: lws_x509_public_to_jwk: EC key\n-[2019/01/02 20:25:00:2097] NOTICE: Cert + Key Private JWK\n-{\u0022crv\u0022:\u0022P-521\u0022,\u0022d\u0022:\u0022AU3iQSKfPskMTW4ZncrYLhipUYzLYty2XhemTQ_nSuUB1vB76jHmOYUTRXFBLkVCW8cQYyMa5dMa3Bvv-cdvH0IB\u0022,\u0022kty\u0022:\u0022EC\u0022,\u0022x\u0022:\u0022_uRNBbIbm0zhk8v6ujvQX9924264ZkqJhit0qamAoCegzuJbLf434kN7_aFEt6u-QWUu6-N1R8t6OlvrLo2jrNY\u0022,\u0022y\u0022:\u0022AU-29XpNyB7e5e3s5t0ylzGEnF601A8A7Tx8m8xxngARZX_bn22itGJ3Y57BTcclPMoG80KjWAMnRVtrKqrD_aGD\u0022}\n-\n-[2019/01/02 20:25:00:2207] NOTICE: main: OK\n-```\n-\ndiff --git a/minimal-examples/crypto/minimal-crypto-x509/main.c b/minimal-examples/crypto/minimal-crypto-x509/main.c\ndeleted file mode 100644\nindex 7a3bc3b..0000000\n--- a/minimal-examples/crypto/minimal-crypto-x509/main.c\n+++ /dev/null\n@@ -1,205 +0,0 @@\n-/*\n- * lws-crypto-x509\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003csys/types.h\u003e\n-#include \u003cfcntl.h\u003e\n-#include \u003cerrno.h\u003e\n-\n-static int\n-read_pem(const char *filename, char *pembuf, int pembuf_len)\n-{\n-\tint n, fd \u003d open(filename, LWS_O_RDONLY);\n-\tif (fd \u003d\u003d -1)\n-\t\treturn -1;\n-\n-\tn \u003d (int)read(fd, pembuf, (unsigned int)pembuf_len - 1);\n-\tclose(fd);\n-\n-\tpembuf[n++] \u003d '\u005c0';\n-\n-\treturn n;\n-}\n-\n-static int\n-read_pem_c509_cert(struct lws_x509_cert **x509, const char *filename,\n-\t\t char *pembuf, int pembuf_len)\n-{\n-\tint n;\n-\n-\tn \u003d read_pem(filename, pembuf, pembuf_len);\n-\tif (n \u003c 0)\n-\t\treturn -1;\n-\n-\tif (lws_x509_create(x509)) {\n-\t\tlwsl_err(\u0022%s: failed to create x509\u005cn\u0022, __func__);\n-\n-\t\treturn -1;\n-\t}\n-\n-\tif (lws_x509_parse_from_pem(*x509, pembuf, (unsigned int)n) \u003c 0) {\n-\t\tlwsl_err(\u0022%s: unable to parse PEM %s\u005cn\u0022, __func__, filename);\n-\t\tlws_x509_destroy(x509);\n-\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n, result \u003d 1, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_x509_cert *x509 \u003d NULL, *x509_trusted \u003d NULL;\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tstruct lws_jwk jwk;\n-\tchar pembuf[6144];\n-\tconst char *p;\n-\n-\tmemset(\u0026jwk, 0, sizeof(jwk));\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS X509 api example\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-#if defined(LWS_WITH_NETWORK)\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-#endif\n-\tinfo.options \u003d 0;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\n-\tp \u003d lws_cmdline_option(argc, argv, \u0022-c\u0022);\n-\tif (!p) {\n-\t\tlwsl_err(\u0022%s: missing -c \u003ccert pem file\u003e\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\tif (read_pem_c509_cert(\u0026x509, p, pembuf, sizeof(pembuf))) {\n-\t\tlwsl_err(\u0022%s: unable to read \u005c\u0022%s\u005c\u0022: errno %d\u005cn\u0022,\n-\t\t\t __func__, p, errno);\n-\t\tgoto bail;\n-\t}\n-\n-\tp \u003d lws_cmdline_option(argc, argv, \u0022-t\u0022);\n-\tif (p) {\n-\n-\t\tif (read_pem_c509_cert(\u0026x509_trusted, p, pembuf,\n-\t\t\t\t sizeof(pembuf))) {\n-\t\t\tlwsl_err(\u0022%s: unable to read \u005c\u0022%s\u005c\u0022: errno %d\u005cn\u0022,\n-\t\t\t\t __func__, p, errno);\n-\t\t\tgoto bail1;\n-\t\t}\n-\n-\t\tlwsl_notice(\u0022%s: certs loaded OK\u005cn\u0022, __func__);\n-\n-\t\tif (lws_x509_verify(x509, x509_trusted, NULL)) {\n-\t\t\tlwsl_err(\u0022%s: verify failed\u005cn\u0022, __func__);\n-\t\t\tgoto bail2;\n-\t\t}\n-\n-\t\tlwsl_notice(\u0022%s: verified OK\u005cn\u0022, __func__);\n-\t}\n-\n-\tif (x509_trusted) {\n-\n-\t\t/* show the trusted cert public key as a JWK */\n-\n-\t\tif (lws_x509_public_to_jwk(\u0026jwk, x509_trusted,\n-\t\t\t\t\t \u0022P-256,P-384,P-521\u0022, 4096)) {\n-\t\t\tlwsl_err(\u0022%s: unable to get trusted cert pubkey as JWK\u005cn\u0022,\n-\t\t\t\t __func__);\n-\n-\t\t\tgoto bail2;\n-\t\t}\n-\n-\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022)))\n-\t\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_ALG, p, (int)strlen(p));\n-\n-\t\tlwsl_info(\u0022JWK version of trusted cert:\u005cn\u0022);\n-\t\tlws_jwk_dump(\u0026jwk);\n-\t\tlws_jwk_destroy(\u0026jwk);\n-\t}\n-\n-\t/* get the cert public key as a JWK */\n-\n-\tif (lws_x509_public_to_jwk(\u0026jwk, x509, \u0022P-256,P-384,P-521\u0022, 4096)) {\n-\t\tlwsl_err(\u0022%s: unable to get cert pubkey as JWK\u005cn\u0022, __func__);\n-\n-\t\tgoto bail3;\n-\t}\n-\tlwsl_info(\u0022JWK version of cert:\u005cn\u0022);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022)))\n-\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_ALG, p, (int)strlen(p));\n-\n-\tlws_jwk_dump(\u0026jwk);\n-\t/* only print public if he doesn't provide private */\n-\tif (!lws_cmdline_option(argc, argv, \u0022-p\u0022)) {\n-\t\tlwsl_notice(\u0022Issuing Cert Public JWK on stdout\u005cn\u0022);\n-\t\tn \u003d sizeof(pembuf);\n-\t\tif (lws_jwk_export(\u0026jwk, 0, pembuf, \u0026n))\n-\t\t\tputs(pembuf);\n-\t}\n-\n-\t/* if we know where the cert private key is, add that to the cert JWK */\n-\n-\tp \u003d lws_cmdline_option(argc, argv, \u0022-p\u0022);\n-\tif (p) {\n-\t\tn \u003d read_pem(p, pembuf, sizeof(pembuf));\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_err(\u0022%s: unable read privkey %s\u005cn\u0022, __func__, p);\n-\n-\t\t\tgoto bail3;\n-\t\t}\n-\t\tif (lws_x509_jwk_privkey_pem(context, \u0026jwk, pembuf,\n-\t\t\t\t\t\t(unsigned int)n, NULL)) {\n-\t\t\tlwsl_err(\u0022%s: unable to parse privkey %s\u005cn\u0022,\n-\t\t\t\t\t__func__, p);\n-\n-\t\t\tgoto bail3;\n-\t\t}\n-\n-\t\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--alg\u0022)))\n-\t\t\tlws_jwk_strdup_meta(\u0026jwk, JWK_META_ALG, p, (int)strlen(p));\n-\n-\t\tlwsl_info(\u0022JWK version of cert + privkey:\u005cn\u0022);\n-\t\tlws_jwk_dump(\u0026jwk);\n-\t\tlwsl_notice(\u0022Issuing Cert + Private JWK on stdout\u005cn\u0022);\n-\t\tn \u003d sizeof(pembuf);\n-\t\tif (lws_jwk_export(\u0026jwk, LWSJWKF_EXPORT_PRIVATE, pembuf, \u0026n))\n-\t\t\tputs(pembuf);\n-\t}\n-\n-\tresult \u003d 0;\n-\n-bail3:\n-\tlws_jwk_destroy(\u0026jwk);\n-bail2:\n-\tlws_x509_destroy(\u0026x509_trusted);\n-bail1:\n-\tlws_x509_destroy(\u0026x509);\n-bail:\n-\tlws_context_destroy(context);\n-\n-\tif (result)\n-\t\tlwsl_err(\u0022%s: failed\u005cn\u0022, __func__);\n-\telse\n-\t\tlwsl_notice(\u0022%s: OK\u005cn\u0022, __func__);\n-\n-\treturn result;\n-}\ndiff --git a/minimal-examples/dbus-client/README.md b/minimal-examples/dbus-client/README.md\ndeleted file mode 100644\nindex ecde9d1..0000000\n--- a/minimal-examples/dbus-client/README.md\n+++ /dev/null\n@@ -1,4 +0,0 @@\n-|Example|Demonstrates|\n----|---\n-minimal-dbus-client|Shows how to connect to a DBusServer dbus server like minimal-dbus-server\n-minimal-dbus-ws-proxy-testclient|A test client for use with minimal-dbus-ws-proxy\ndiff --git a/minimal-examples/dbus-client/minimal-dbus-client/CMakeLists.txt b/minimal-examples/dbus-client/minimal-dbus-client/CMakeLists.txt\ndeleted file mode 100644\nindex 6496e17..0000000\n--- a/minimal-examples/dbus-client/minimal-dbus-client/CMakeLists.txt\n+++ /dev/null\n@@ -1,36 +0,0 @@\n-project(lws-minimal-dbus-client C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(CheckLibraryExists)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-dbus-client)\n-set(SRCS minimal-dbus-client.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_DBUS 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-\n-if (NOT MSVC AND NOT WIN32 AND requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (NOT LWS_PLAT_FREERTOS)\n-\t\tfind_package(PkgConfig QUIET)\n-\t\tpkg_check_modules(PC_DBUS1 dbus-1 QUIET)\n-\t\tlist(APPEND LWS_DBUS_INCLUDE1 ${PC_DBUS1_INCLUDE_DIRS})\n-\t\tlist(APPEND LWS_DBUS_LIB \u0022${PC_DBUS1_LIBRARIES};dl\u0022)\n-\tendif()\n-\n-\tif (LWS_DBUS_INCLUDE1)\n-\t\tinclude_directories(\u0022${LWS_DBUS_INCLUDE1}\u0022)\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared ${LWS_DBUS_LIB})\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LWS_DBUS_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/dbus-client/minimal-dbus-client/README.md b/minimal-examples/dbus-client/minimal-dbus-client/README.md\ndeleted file mode 100644\nindex 42563c6..0000000\n--- a/minimal-examples/dbus-client/minimal-dbus-client/README.md\n+++ /dev/null\n@@ -1,49 +0,0 @@\n-# lws minimal dbus client\n-\n-This demonstrates nonblocking, asynchronous dbus method calls as the client.\n-\n-## build\n-\n-Using libdbus requires additional non-default include paths setting, same as\n-is necessary for lws build described in ./lib/roles/dbus/README.md\n-\n-CMake can guess one path and the library name usually, see the README above\n-for details of how to override for custom libdbus and cross build.\n-\n-Fedora example:\n-```\n-$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib64/dbus-1.0/include\u0022\n-$ make\n-```\n-\n-Ubuntu example:\n-```\n-$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib/x86_64-linux-gnu/dbus-1.0/include\u0022\n-$ make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-The minimal client connects to the minimal dbus server example, which is\n-expected to be listening on its default abstract unix domain socket path.\n-\n-It call the server Echo method with \u0022Hello!\u0022 and returns to the event loop.\n-When the reply comes, it prints the returned message.\n-\n-Afterwards it just sits there receiving unsolicited messages from the server\n-example, until closed by the user.\n-\n-```\n- $ ./lws-minimal-dbus-client\n-ctx\n-[2018/10/05 06:08:31:4901] NOTICE: pending_call_notify\n-[2018/10/05 06:08:31:4929] USER: pending_call_notify: received 'Hello!'\n-^C[2018/10/05 06:09:22:4409] NOTICE: destroy_dbus_client_conn\n-[2018/10/05 06:09:22:4691] NOTICE: Exiting cleanly\n-...\n-```\n-\ndiff --git a/minimal-examples/dbus-client/minimal-dbus-client/minimal-dbus-client.c b/minimal-examples/dbus-client/minimal-dbus-client/minimal-dbus-client.c\ndeleted file mode 100644\nindex 43b48a1..0000000\n--- a/minimal-examples/dbus-client/minimal-dbus-client/minimal-dbus-client.c\n+++ /dev/null\n@@ -1,281 +0,0 @@\n-/*\n- * lws-minimal-dbus-client\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates a minimal session dbus server that uses the lws event loop,\n- * making it possible to integrate it with other lws features.\n- */\n-\n-#include \u003cstdbool.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003cstdio.h\u003e\n-#include \u003cstdlib.h\u003e\n-#include \u003cunistd.h\u003e\n-#include \u003csignal.h\u003e\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003clibwebsockets/lws-dbus.h\u003e\n-\n-static struct lws_dbus_ctx *dbus_ctx;\n-static struct lws_context *context;\n-static int interrupted;\n-\n-#define THIS_INTERFACE\t \u0022org.libwebsockets.test\u0022\n-#define THIS_OBJECT\t \u0022/org/libwebsockets/test\u0022\n-#define THIS_BUSNAME\t \u0022org.libwebsockets.test\u0022\n-\n-#define THIS_LISTEN_PATH \u0022unix:abstract\u003dorg.libwebsockets.test\u0022\n-\n-\n-static DBusHandlerResult\n-client_message_handler(DBusConnection *conn, DBusMessage *message, void *data)\n-{\n-\tconst char *str;\n-\n-\tlwsl_info(\u0022%s: Got D-Bus request: %s.%s on %s\u005cn\u0022, __func__,\n-\t\t dbus_message_get_interface(message),\n-\t\t dbus_message_get_member(message),\n-\t\t dbus_message_get_path(message));\n-\n-\tif (!dbus_message_get_args(message, NULL,\n-\t\t\t\t DBUS_TYPE_STRING, \u0026str,\n-\t\t\t\t DBUS_TYPE_INVALID))\n-\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-\n-\tlwsl_notice(\u0022%s: '%s'\u005cn\u0022, __func__, str);\n-\n-\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-}\n-\n-static void\n-destroy_dbus_client_conn(struct lws_dbus_ctx *ctx)\n-{\n-\tif (!ctx || !ctx-\u003econn)\n-\t\treturn;\n-\n-\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n-\n-\tdbus_connection_remove_filter(ctx-\u003econn, client_message_handler, ctx);\n-\tdbus_connection_close(ctx-\u003econn);\n-\tdbus_connection_unref(ctx-\u003econn);\n-\n-\tfree(ctx);\n-}\n-\n-/*\n- * This callback is coming when lws has noticed the fd took a POLLHUP. The\n- * ctx has effectively gone out of scope before this, and the connection can\n- * be cleaned up and the ctx freed.\n- */\n-\n-static void\n-cb_closing(struct lws_dbus_ctx *ctx)\n-{\n-\tlwsl_err(\u0022%s: closing\u005cn\u0022, __func__);\n-\n-\tif (ctx \u003d\u003d dbus_ctx)\n-\t\tdbus_ctx \u003d NULL;\n-\n-\tdestroy_dbus_client_conn(ctx);\n-}\n-\n-static struct lws_dbus_ctx *\n-create_dbus_client_conn(struct lws_vhost *vh, int tsi, const char *ads)\n-{\n-\tstruct lws_dbus_ctx *ctx;\n-\tDBusError err;\n-\n-\tctx \u003d malloc(sizeof(*ctx));\n-\tif (!ctx)\n-\t\treturn NULL;\n-\n-\tmemset(ctx, 0, sizeof(*ctx));\n-\n-\tctx-\u003evh \u003d vh;\n-\tctx-\u003etsi \u003d tsi;\n-\n- dbus_error_init(\u0026err);\n-\n-\t/* connect to the daemon bus */\n-\tctx-\u003econn \u003d dbus_connection_open_private(ads, \u0026err);\n-\tif (!ctx-\u003econn) {\n-\t\tlwsl_err(\u0022%s: Failed to connect: %s\u005cn\u0022,\n-\t\t\t __func__, err.message);\n-\t\tgoto fail;\n-\t}\n-\n-\tdbus_connection_set_exit_on_disconnect(ctx-\u003econn, 0);\n-\n-\tif (!dbus_connection_add_filter(ctx-\u003econn, client_message_handler,\n-\t\t\t\t\tctx, NULL)) {\n-\t\tlwsl_err(\u0022%s: Failed to add filter\u005cn\u0022, __func__);\n-\t\tgoto fail;\n-\t}\n-\n-\t/*\n-\t * This is the part that binds the connection to lws watcher and\n-\t * timeout handling provided by lws\n-\t */\n-\n-\tif (lws_dbus_connection_setup(ctx, ctx-\u003econn, cb_closing)) {\n-\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n-\t\tgoto fail;\n-\t}\n-\n-\tlwsl_notice(\u0022%s: created OK\u005cn\u0022, __func__);\n-\n-\treturn ctx;\n-\n-fail:\n-\tdbus_error_free(\u0026err);\n-\n-\tfree(ctx);\n-\n-\treturn NULL;\n-}\n-\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-/*\n- * This gets called if we timed out waiting for the server reply, or the\n- * reply arrived.\n- */\n-\n-static void\n-pending_call_notify(DBusPendingCall *pending, void *data)\n-{\n-\t// struct lws_dbus_ctx *ctx \u003d (struct lws_dbus_ctx *)data;\n-\tconst char *payload;\n-\tDBusMessage *msg;\n-\n-\tif (!dbus_pending_call_get_completed(pending)) {\n-\t\tlwsl_err(\u0022%s: timed out waiting for reply\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tmsg \u003d dbus_pending_call_steal_reply(pending);\n-\tif (!msg)\n-\t\tgoto bail;\n-\n-\tif (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, \u0026payload,\n-\t\t\t\t DBUS_TYPE_INVALID)) {\n-\t\tgoto bail1;\n-\t}\n-\n-\tlwsl_user(\u0022%s: received '%s'\u005cn\u0022, __func__, payload);\n-\n-bail1:\n-\tdbus_message_unref(msg);\n-bail:\n-\tdbus_pending_call_unref(pending);\n-}\n-\n-static int\n-remote_method_call(struct lws_dbus_ctx *ctx)\n-{\n-\tDBusMessage *msg;\n-\tconst char *payload \u003d \u0022Hello!\u0022;\n-\tint ret \u003d 1;\n-\n-\tmsg \u003d dbus_message_new_method_call(\n-\t\t\t/* dest */\t THIS_BUSNAME,\n-\t\t\t/* object-path */ THIS_OBJECT,\n-\t\t\t/* interface */ THIS_INTERFACE,\n-\t\t\t/* method */\t \u0022Echo\u0022);\n-\tif (!msg)\n-\t\treturn 1;\n-\n-\tif (!dbus_message_append_args(msg, DBUS_TYPE_STRING, \u0026payload,\n-\t\t\t\t DBUS_TYPE_INVALID))\n-\t\tgoto bail;\n-\n-\tif (!dbus_connection_send_with_reply(ctx-\u003econn, msg,\n-\t\t\t\t\t \u0026ctx-\u003epc,\n-\t\t\t\t\t DBUS_TIMEOUT_USE_DEFAULT)) {\n-\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tdbus_pending_call_set_notify(ctx-\u003epc, pending_call_notify, ctx, NULL);\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tdbus_message_unref(msg);\n-\n-\treturn ret;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_vhost *vh;\n-\tstruct lws_context_creation_info info;\n-\tconst char *p;\n-\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n-\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n-\t\t\t * lws must have been configured and built with\n-\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n-\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n-\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n-\t\t\t/* | LLL_DEBUG */ /* | LLL_THREAD */;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS minimal DBUS client\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tvh \u003d lws_create_vhost(context, \u0026info);\n-\tif (!vh)\n-\t\tgoto bail;\n-\n-\tdbus_ctx \u003d create_dbus_client_conn(vh, 0, THIS_LISTEN_PATH);\n-\tif (!dbus_ctx)\n-\t\tgoto bail1;\n-\n-\tif (remote_method_call(dbus_ctx))\n-\t\tgoto bail2;\n-\n-\t/* lws event loop (default poll one) */\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-bail2:\n-\tdestroy_dbus_client_conn(dbus_ctx);\n-\n-bail1:\n-\t/* this is required for valgrind-cleanliness */\n-\tdbus_shutdown();\n-\tlws_context_destroy(context);\n-\n-\tlwsl_notice(\u0022Exiting cleanly\u005cn\u0022);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_err(\u0022%s: failed to start\u005cn\u0022, __func__);\n-\tlws_context_destroy(context);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt b/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt\ndeleted file mode 100644\nindex 5c69398..0000000\n--- a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt\n+++ /dev/null\n@@ -1,33 +0,0 @@\n-project(lws-minimal-dbus-ws-proxy-testclient C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(CheckLibraryExists)\n-include(LwsCheckRequirements)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_DBUS 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-\n-if (NOT MSVC AND NOT WIN32 AND requirements)\n-\tadd_executable(${PROJECT_NAME} minimal-dbus-ws-proxy-testclient.c)\n-\n-\tif (NOT LWS_PLAT_FREERTOS)\n-\t\tfind_package(PkgConfig QUIET)\n-\t\tpkg_check_modules(PC_DBUS1 dbus-1 QUIET)\n-\t\tlist(APPEND LWS_DBUS_INCLUDE1 ${PC_DBUS1_INCLUDE_DIRS})\n-\t\tlist(APPEND LWS_DBUS_LIB \u0022${PC_DBUS1_LIBRARIES};dl\u0022)\n-\tendif()\n-\n-\tif (LWS_DBUS_INCLUDE1)\n-\t\tinclude_directories(\u0022${LWS_DBUS_INCLUDE1}\u0022)\n-\tendif()\n-\tmessage(\u0022project ${PROJECT_NAME}\u0022)\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${PROJECT_NAME} websockets_shared ${LWS_DBUS_LIB})\n-\telse()\n-\t\ttarget_link_libraries(${PROJECT_NAME} websockets ${LWS_DBUS_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/README.md b/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/README.md\ndeleted file mode 100644\nindex d583462..0000000\n--- a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/README.md\n+++ /dev/null\n@@ -1,52 +0,0 @@\n-# lws minimal dbus ws proxy testclient\n-\n-This is a test client used to test `./minimal-examples/dbus-server/minimal-dbus-ws-proxy`\n-\n-It asks the minimal dbus ws proxy application to connect to libwebsockets.org\n-over the mirror protocol. And it proxies back the ASCII packets used to\n-communicate the mirror sample drawing vectors over dbus to this test client\n-if you draw on the [mirror example app](https://libwebsockets.org/testserver/)\n-in a browser.\n-\n-## build\n-\n-Using libdbus requires additional non-default include paths setting, same as\n-is necessary for lws build described in ./lib/roles/dbus/README.md\n-\n-CMake can guess one path and the library name usually, see the README above\n-for details of how to override for custom libdbus and cross build.\n-\n-Fedora example:\n-```\n-$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib64/dbus-1.0/include\u0022\n-$ make\n-```\n-\n-Ubuntu example:\n-```\n-$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib/x86_64-linux-gnu/dbus-1.0/include\u0022\n-$ make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n-\n-This connects to the minimal-dbus-ws-proxy example running in another terminal.\n-\n-```\n- $ ./lws-minimal-dbus-ws-proxy-testclient\n-[2018/10/05 14:17:16:6286] USER: LWS minimal DBUS ws proxy testclient\n-[2018/10/05 14:17:16:6538] NOTICE: Creating Vhost 'default' port 0, 1 protocols, IPv6 off\n-[2018/10/05 14:17:16:6617] USER: create_dbus_client_conn: connecting to 'unix:abstract\u003dorg.libwebsockets.wsclientproxy'\n-[2018/10/05 14:17:16:7189] NOTICE: create_dbus_client_conn: created OK\n-[2018/10/05 14:17:16:7429] USER: remote_method_call: requesting proxy connection wss://libwebsockets.org/ lws-mirror-protocol\n-[2018/10/05 14:17:17:0387] USER: pending_call_notify: received 'Connecting'\n-[2018/10/05 14:17:18:7475] NOTICE: client_message_handler: (type 7) 'ws client connection established'\n-[2018/10/05 14:17:21:2028] NOTICE: client_message_handler: (type 6) 'd #000000 323 63 323 67;'\n-[2018/10/05 14:17:21:2197] NOTICE: client_message_handler: (type 6) 'd #000000 323 67 327 73;'\n-...\n-```\n-\ndiff --git a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c b/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c\ndeleted file mode 100644\nindex c3d92ee..0000000\n--- a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c\n+++ /dev/null\n@@ -1,436 +0,0 @@\n-/*\n- * lws-minimal-dbus-ws-proxy-testclient\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This acts as a test client over DBUS, opening a session with\n- * minimal-dbus-ws-proxy and sending and receiving data on the libwebsockets\n- * mirror demo page.\n- */\n-\n-#include \u003cstdbool.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003cstdio.h\u003e\n-#include \u003cstdlib.h\u003e\n-#include \u003cunistd.h\u003e\n-#include \u003csignal.h\u003e\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003clibwebsockets/lws-dbus.h\u003e\n-\n-/*\n- * These are the various states our connection can be in, both with regards\n- * to the direct connection to the proxy, and the state of the onward ws\n- * connection the proxy opens at our request.\n- */\n-\n-enum lws_dbus_client_state {\n-\tLDCS_NOTHING,\t\t /* no connection yet */\n-\tLDCS_CONN,\t\t /* conn to proxy */\n-\tLDCS_CONN_WAITING_ONWARD, /* conn to proxy, awaiting proxied conn */\n-\tLDCS_CONN_ONWARD,\t /* conn to proxy and onward conn OK */\n-\tLDCS_CONN_CLOSED,\t /* conn to proxy but onward conn closed */\n-\tLDCS_CLOSED,\t\t /* connection to proxy is closed */\n-};\n-\n-/*\n- * our expanded dbus context\n- */\n-\n-struct lws_dbus_ctx_wsproxy_client {\n-\tstruct lws_dbus_ctx ctx;\n-\n-\tlws_sorted_usec_list_t sul;\n-\n-\tenum lws_dbus_client_state state;\n-};\n-\n-static struct lws_dbus_ctx_wsproxy_client *dbus_ctx;\n-static struct lws_context *context;\n-static int interrupted, autoexit_budget \u003d -1, count_rx, count_tx;\n-\n-#define THIS_INTERFACE\t \u0022org.libwebsockets.wsclientproxy\u0022\n-#define THIS_OBJECT\t \u0022/org/libwebsockets/wsclientproxy\u0022\n-#define THIS_BUSNAME\t \u0022org.libwebsockets.wsclientproxy\u0022\n-\n-#define THIS_LISTEN_PATH \u0022unix:abstract\u003dorg.libwebsockets.wsclientproxy\u0022\n-\n-static void\n-state_transition(struct lws_dbus_ctx_wsproxy_client *dcwc,\n-\t\t enum lws_dbus_client_state state)\n-{\n-\tlwsl_notice(\u0022%s: %p: from state %d -\u003e %d\u005cn\u0022, __func__,\n-\t\t dcwc,dcwc-\u003estate, state);\n-\tdcwc-\u003estate \u003d state;\n-}\n-\n-static DBusHandlerResult\n-filter(DBusConnection *conn, DBusMessage *message, void *data)\n-{\n-\tstruct lws_dbus_ctx_wsproxy_client *dcwc \u003d\n-\t\t\t(struct lws_dbus_ctx_wsproxy_client *)data;\n-\tconst char *str;\n-\n-\tif (!dbus_message_get_args(message, NULL,\n-\t\t\t\t DBUS_TYPE_STRING, \u0026str,\n-\t\t\t\t DBUS_TYPE_INVALID))\n-\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-\n-\t/* received ws data */\n-\n-\tif (dbus_message_is_signal(message, THIS_INTERFACE, \u0022Receive\u0022)) {\n-\t\tlwsl_user(\u0022%s: Received '%s'\u005cn\u0022, __func__, str);\n-\t\tcount_rx++;\n-\t}\n-\n-\t/* proxy ws connection failed */\n-\n-\tif (dbus_message_is_signal(message, THIS_INTERFACE, \u0022Status\u0022) \u0026\u0026\n-\t !strcmp(str, \u0022ws client connection error\u0022))\n-\t\tstate_transition(dcwc, LDCS_CONN_CLOSED);\n-\n-\t/* proxy ws connection succeeded */\n-\n-\tif (dbus_message_is_signal(message, THIS_INTERFACE, \u0022Status\u0022) \u0026\u0026\n-\t !strcmp(str, \u0022ws client connection established\u0022))\n-\t\tstate_transition(dcwc, LDCS_CONN_ONWARD);\n-\n-\t/* proxy ws connection has closed */\n-\n-\tif (dbus_message_is_signal(message, THIS_INTERFACE, \u0022Status\u0022) \u0026\u0026\n-\t !strcmp(str, \u0022ws client connection closed\u0022))\n-\t\tstate_transition(dcwc, LDCS_CONN_CLOSED);\n-\n-\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-}\n-\n-static void\n-destroy_dbus_client_conn(struct lws_dbus_ctx_wsproxy_client **pdcwc)\n-{\n-\tstruct lws_dbus_ctx_wsproxy_client *dcwc \u003d *pdcwc;\n-\n-\tif (!dcwc || !dcwc-\u003ectx.conn)\n-\t\treturn;\n-\n-\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n-\n-\tdbus_connection_remove_filter(dcwc-\u003ectx.conn, filter, \u0026dcwc-\u003ectx);\n-\tdbus_connection_close(dcwc-\u003ectx.conn);\n-\tdbus_connection_unref(dcwc-\u003ectx.conn);\n-\n-\tfree(dcwc);\n-\n-\t*pdcwc \u003d NULL;\n-}\n-\n-/*\n- * This callback is coming when lws has noticed the fd took a POLLHUP. The\n- * ctx has effectively gone out of scope before this, and the connection can\n- * be cleaned up and the ctx freed.\n- */\n-\n-static void\n-cb_closing(struct lws_dbus_ctx *ctx)\n-{\n-\tstruct lws_dbus_ctx_wsproxy_client *dcwc \u003d\n-\t\t\t(struct lws_dbus_ctx_wsproxy_client *)ctx;\n-\n-\tlwsl_err(\u0022%s: closing\u005cn\u0022, __func__);\n-\n-\tif (dcwc \u003d\u003d dbus_ctx)\n-\t\tdbus_ctx \u003d NULL;\n-\n-\tdestroy_dbus_client_conn(\u0026dcwc);\n-\n-\tinterrupted \u003d 1;\n-}\n-\n-static struct lws_dbus_ctx_wsproxy_client *\n-create_dbus_client_conn(struct lws_vhost *vh, int tsi, const char *ads)\n-{\n-\tstruct lws_dbus_ctx_wsproxy_client *dcwc;\n-\tDBusError e;\n-\n-\tdcwc \u003d malloc(sizeof(*dcwc));\n-\tif (!dcwc)\n-\t\treturn NULL;\n-\n-\tmemset(dcwc, 0, sizeof(*dcwc));\n-\n-\tdcwc-\u003estate \u003d LDCS_NOTHING;\n-\tdcwc-\u003ectx.vh \u003d vh;\n-\tdcwc-\u003ectx.tsi \u003d tsi;\n-\n- dbus_error_init(\u0026e);\n-\n- lwsl_user(\u0022%s: connecting to '%s'\u005cn\u0022, __func__, ads);\n-#if 1\n-\t/* connect to our daemon bus */\n-\n- dcwc-\u003ectx.conn \u003d dbus_connection_open_private(ads, \u0026e);\n-\tif (!dcwc-\u003ectx.conn) {\n-\t\tlwsl_err(\u0022%s: Failed to connect: %s\u005cn\u0022,\n-\t\t\t __func__, e.message);\n-\t\tgoto fail;\n-\t}\n-#else\n-\t/* connect to the SYSTEM bus */\n-\n-\tdcwc-\u003ectx.conn \u003d dbus_bus_get(DBUS_BUS_SYSTEM, \u0026e);\n-\tif (!dcwc-\u003ectx.conn) {\n-\t\tlwsl_err(\u0022%s: Failed to get a session DBus connection: %s\u005cn\u0022,\n-\t\t\t __func__, e.message);\n-\t\tgoto fail;\n-\t}\n-#endif\n-\tdbus_connection_set_exit_on_disconnect(dcwc-\u003ectx.conn, 0);\n-\n-\tif (!dbus_connection_add_filter(dcwc-\u003ectx.conn, filter,\n-\t\t\t\t\t\u0026dcwc-\u003ectx, NULL)) {\n-\t\tlwsl_err(\u0022%s: Failed to add filter\u005cn\u0022, __func__);\n-\t\tgoto fail;\n-\t}\n-\n-\t/*\n-\t * This is the part that binds the connection to lws watcher and\n-\t * timeout handling provided by lws\n-\t */\n-\n-\tif (lws_dbus_connection_setup(\u0026dcwc-\u003ectx, dcwc-\u003ectx.conn, cb_closing)) {\n-\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n-\t\tgoto fail;\n-\t}\n-\n-\tstate_transition(dcwc, LDCS_CONN);\n-\n-\tlwsl_notice(\u0022%s: created OK\u005cn\u0022, __func__);\n-\n-\treturn dcwc;\n-\n-fail:\n-\tdbus_error_free(\u0026e);\n-\n-\tfree(dcwc);\n-\n-\treturn NULL;\n-}\n-\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-/*\n- * This gets called if we timed out waiting for the dbus server reply, or the\n- * reply arrived.\n- */\n-\n-static void\n-pending_call_notify(DBusPendingCall *pending, void *data)\n-{\n-\tconst char *payload;\n-\tDBusMessage *msg;\n-\n-\tif (!dbus_pending_call_get_completed(pending)) {\n-\t\tlwsl_err(\u0022%s: timed out waiting for reply\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tmsg \u003d dbus_pending_call_steal_reply(pending);\n-\tif (!msg)\n-\t\tgoto bail;\n-\n-\tif (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, \u0026payload,\n-\t\t\t\t\t DBUS_TYPE_INVALID)) {\n-\t\tgoto bail1;\n-\t}\n-\n-\tlwsl_user(\u0022%s: received '%s'\u005cn\u0022, __func__, payload);\n-\n-bail1:\n-\tdbus_message_unref(msg);\n-bail:\n-\tdbus_pending_call_unref(pending);\n-}\n-\n-static int\n-remote_method_call(struct lws_dbus_ctx_wsproxy_client *dcwc)\n-{\n-\tchar _uri[96];\n-\tconst char *subprotocol \u003d \u0022lws-mirror-protocol\u0022, *uri \u003d _uri;\n-\tDBusMessage *msg;\n-\tint ret \u003d 1;\n-\n-\t/*\n-\t * make our own private mirror session... because others may run this\n-\t * at the same time against libwebsockets.org... as happened 2019-03-14\n-\t * and broke travis tests :-)\n-\t */\n-\n-\tlws_snprintf(_uri, sizeof(_uri), \u0022wss://libwebsockets.org/?mirror\u003ddbt-%d\u0022,\n-\t\t\t(int)getpid());\n-\n-\tmsg \u003d dbus_message_new_method_call(\n-\t\t\t/* dest */\t THIS_BUSNAME,\n-\t\t\t/* object-path */ THIS_OBJECT,\n-\t\t\t/* interface */ THIS_INTERFACE,\n-\t\t\t/* method */\t \u0022Connect\u0022);\n-\tif (!msg)\n-\t\treturn 1;\n-\n-\tif (!dbus_message_append_args(msg, DBUS_TYPE_STRING, \u0026uri,\n-\t\t\t\t\t DBUS_TYPE_STRING, \u0026subprotocol,\n-\t\t\t\t\t DBUS_TYPE_INVALID))\n-\t\tgoto bail;\n-\n-\tlwsl_user(\u0022%s: requesting proxy connection %s %s\u005cn\u0022, __func__,\n-\t\t\turi, subprotocol);\n-\n-\tif (!dbus_connection_send_with_reply(dcwc-\u003ectx.conn, msg, \u0026dcwc-\u003ectx.pc,\n-\t\t\t\t\t DBUS_TIMEOUT_USE_DEFAULT)) {\n-\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n-\n-\t\tgoto bail;\n-\t}\n-\n-\tdbus_pending_call_set_notify(dcwc-\u003ectx.pc, pending_call_notify,\n-\t\t\t\t \u0026dcwc-\u003ectx, NULL);\n-\n-\tstate_transition(dcwc, LDCS_CONN_WAITING_ONWARD);\n-\n-\tret \u003d 0;\n-\n-bail:\n-\tdbus_message_unref(msg);\n-\n-\treturn ret;\n-}\n-\n-static void\n-sul_timer(struct lws_sorted_usec_list *sul)\n-{\n-\tchar payload[64];\n-\tconst char *ws_pkt \u003d payload;\n-\tDBusMessage *msg;\n-\n-\tif (!dbus_ctx || dbus_ctx-\u003estate !\u003d LDCS_CONN_ONWARD)\n-\t\tgoto again;\n-\n-\tif (autoexit_budget \u003e 0) {\n-\t\tif (!--autoexit_budget) {\n-\t\t\tlwsl_notice(\u0022reached autoexit budget\u005cn\u0022);\n-\t\t\tinterrupted \u003d 1;\n-\t\t\treturn;\n-\t\t}\n-\t}\n-\n-\tmsg \u003d dbus_message_new_method_call(THIS_BUSNAME, THIS_OBJECT,\n-\t\t\t\t\t THIS_INTERFACE, \u0022Send\u0022);\n-\tif (!msg)\n-\t\tgoto again;\n-\n-\tlws_snprintf(payload, sizeof(payload), \u0022d #%06X %d %d %d %d;\u0022,\n-\t\t rand() \u0026 0xffffff, rand() % 480, rand() % 300,\n-\t\t rand() % 480, rand() % 300);\n-\n-\tif (!dbus_message_append_args(msg, DBUS_TYPE_STRING, \u0026ws_pkt,\n-\t\t\t\t\t DBUS_TYPE_INVALID)) {\n-\t\tdbus_message_unref(msg);\n-\t\tgoto again;\n-\t}\n-\n-\tif (!dbus_connection_send_with_reply(dbus_ctx-\u003ectx.conn, msg,\n-\t\t\t\t\t \u0026dbus_ctx-\u003ectx.pc,\n-\t\t\t\t\t DBUS_TIMEOUT_USE_DEFAULT)) {\n-\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n-\t\tdbus_message_unref(msg);\n-\t\tgoto again;\n-\t}\n-\n-\tdbus_message_unref(msg);\n-\tdbus_pending_call_set_notify(dbus_ctx-\u003ectx.pc,\n-\t\t\t\t pending_call_notify,\n-\t\t\t\t \u0026dbus_ctx-\u003ectx, NULL);\n-\tcount_tx++;\n-\n-again:\n-\tlws_sul_schedule(context, 0, \u0026dbus_ctx-\u003esul, sul_timer, 2 * LWS_US_PER_SEC);\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_vhost *vh;\n-\tstruct lws_context_creation_info info;\n-\tconst char *p;\n-\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n-\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n-\t\t\t * lws must have been configured and built with\n-\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n-\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n-\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n-\t\t\t/* | LLL_DEBUG */ /* | LLL_THREAD */;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-x\u0022)))\n-\t\tautoexit_budget \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS minimal DBUS ws proxy testclient\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.options |\u003d\n-\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n-\n-\tvh \u003d lws_create_vhost(context, \u0026info);\n-\tif (!vh)\n-\t\tgoto bail;\n-\n-\tdbus_ctx \u003d create_dbus_client_conn(vh, 0, THIS_LISTEN_PATH);\n-\tif (!dbus_ctx)\n-\t\tgoto bail1;\n-\n-\tlws_sul_schedule(context, 0, \u0026dbus_ctx-\u003esul, sul_timer, LWS_US_PER_SEC);\n-\n-\n-\tif (remote_method_call(dbus_ctx))\n-\t\tgoto bail2;\n-\n-\t/* lws event loop (default poll one) */\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-bail2:\n-\tdestroy_dbus_client_conn(\u0026dbus_ctx);\n-\n-bail1:\n-\t/* this is required for valgrind-cleanliness */\n-\tdbus_shutdown();\n-\tlws_context_destroy(context);\n-\n-\tlwsl_notice(\u0022Exiting cleanly, rx: %d, tx: %d\u005cn\u0022, count_rx, count_tx);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_err(\u0022%s: failed to start\u005cn\u0022, __func__);\n-\tlws_context_destroy(context);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/dbus-server/README.md b/minimal-examples/dbus-server/README.md\ndeleted file mode 100644\nindex fc59bfb..0000000\n--- a/minimal-examples/dbus-server/README.md\n+++ /dev/null\n@@ -1,4 +0,0 @@\n-|Example|Demonstrates|\n----|---\n-minimal-dbus-server|Shows how to run a DBUS session server using lws event loop\n-minimal-dbus-ws-proxy|Control ws client connections via DBUS\ndiff --git a/minimal-examples/dbus-server/minimal-dbus-server/CMakeLists.txt b/minimal-examples/dbus-server/minimal-dbus-server/CMakeLists.txt\ndeleted file mode 100644\nindex 0c0b7cf..0000000\n--- a/minimal-examples/dbus-server/minimal-dbus-server/CMakeLists.txt\n+++ /dev/null\n@@ -1,36 +0,0 @@\n-project(lws-minimal-dbus-server C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(CheckLibraryExists)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-dbus-server)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_DBUS 1 requirements)\n-require_lws_config(LWS_WITH_SERVER 1 requirements)\n-\n-if (NOT MSVC AND NOT WIN32 AND requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (NOT LWS_PLAT_FREERTOS)\n-\t\tfind_package(PkgConfig QUIET)\n-\t\tpkg_check_modules(PC_DBUS1 dbus-1 QUIET)\n-\t\tlist(APPEND LWS_DBUS_INCLUDE1 ${PC_DBUS1_INCLUDE_DIRS})\n-\t\tlist(APPEND LWS_DBUS_LIB \u0022${PC_DBUS1_LIBRARIES};dl\u0022)\n-\tendif()\n-\n-\tif (LWS_DBUS_INCLUDE1)\n-\t\tinclude_directories(\u0022${LWS_DBUS_INCLUDE1}\u0022)\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared ${LWS_DBUS_LIB})\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LWS_DBUS_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/dbus-server/minimal-dbus-server/README.md b/minimal-examples/dbus-server/minimal-dbus-server/README.md\ndeleted file mode 100644\nindex 7b61eb1..0000000\n--- a/minimal-examples/dbus-server/minimal-dbus-server/README.md\n+++ /dev/null\n@@ -1,96 +0,0 @@\n-# lws minimal dbus server\n-\n-## build\n-\n-Using libdbus requires additional non-default include paths setting, same as\n-is necessary for lws build described in ./lib/roles/dbus/README.md\n-\n-CMake can guess one path and the library name usually, see the README above\n-for details of how to override for custom libdbus and cross build.\n-\n-Fedora example:\n-```\n-$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib64/dbus-1.0/include\u0022\n-$ make\n-```\n-\n-Ubuntu example:\n-```\n-$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib/x86_64-linux-gnu/dbus-1.0/include\u0022\n-$ make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n---session | Bind to session bus instead of creating private abstract unix socket\n-\n-By default the minimal server listens using its own abstract unix socket\n-at `unix:abstract\u003dorg.libwebsockets.test`.\n-\n-You can also run it instead as a participant on the session bus, without its own\n-unix socket, by giving `--session`.\n-\n-### Examples using the default private abstract unix socket\n-\n-```\n- $ ./lws-minimal-dbus-server\n-[2018/10/03 07:08:02:6448] USER: LWS minimal dbus server\n-[2018/10/03 07:08:02:6693] NOTICE: Creating Vhost 'default' port 0, 1 protocols, IPv6 off\n-...\n-```\n-\n-You can communicate with the dbus server over its private abstract socket using, eg\n-\n-```\n-$ gdbus introspect --address unix:abstract\u003dorg.libwebsockets.test --dest org.libwebsockets.test --object-path /org/libwebsockets/test\n-node /org/example/TestObject {\n- interface org.freedesktop.DBus.Introspectable {\n- methods:\n- Introspect(out s data);\n- signals:\n- properties:\n- };\n- interface org.freedesktop.DBus.Properties {\n- methods:\n- Get(in s interface,\n-...\n-```\n-\n-```\n-$ gdbus call --address unix:abstract\u003dorg.libwebsockets.test --dest org.libwebsockets.test --object-path /org/libwebsockets/test --method org.libwebsockets.test.Echo HELLO\n-('HELLO',)\n-```\n-\n-### Examples using the DBUS session bus\n-\n-```\n- $ ./lws-minimal-dbus-server --session\n-[2018/10/03 07:08:02:6448] USER: LWS minimal dbus server\n-[2018/10/03 07:08:02:6693] NOTICE: Creating Vhost 'default' port 0, 1 protocols, IPv6 off\n-...\n-```\n-\n-You can communicate with the dbus server over the session bus using, eg\n-\n-```\n-$ gdbus introspect --session --dest org.libwebsockets.test --object-path /org/libwebsockets/test\n-node /org/example/TestObject {\n- interface org.freedesktop.DBus.Introspectable {\n- methods:\n- Introspect(out s data);\n- signals:\n- properties:\n- };\n- interface org.freedesktop.DBus.Properties {\n- methods:\n- Get(in s interface,\n-...\n-```\n-\n-```\n-$ gdbus call --session --dest org.libwebsockets.test --object-path /org/libwebsockets/test --method org.libwebsockets.test.Echo HELLO\n-('HELLO',)\n-```\ndiff --git a/minimal-examples/dbus-server/minimal-dbus-server/main.c b/minimal-examples/dbus-server/minimal-dbus-server/main.c\ndeleted file mode 100644\nindex 0d74b9b..0000000\n--- a/minimal-examples/dbus-server/minimal-dbus-server/main.c\n+++ /dev/null\n@@ -1,535 +0,0 @@\n-/*\n- * lws-minimal-dbus-server\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates a minimal session dbus server that uses the lws event loop,\n- * making it possible to integrate it with other lws features.\n- *\n- * The dbus server parts are based on \u0022Sample code illustrating basic use of\n- * D-BUS\u0022 (presumed Public Domain) here:\n- *\n- * https://github.com/fbuihuu/samples-dbus/blob/master/dbus-server.c\n- */\n-\n-#include \u003cstdbool.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003cstdio.h\u003e\n-#include \u003cstdlib.h\u003e\n-#include \u003cunistd.h\u003e\n-#include \u003csignal.h\u003e\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003clibwebsockets/lws-dbus.h\u003e\n-\n-static struct lws_context *context;\n-static const char *version \u003d \u00220.1\u0022;\n-static int interrupted;\n-static struct lws_dbus_ctx dbus_ctx, ctx_listener;\n-static char session;\n-\n-#define THIS_INTERFACE\t \u0022org.libwebsockets.test\u0022\n-#define THIS_OBJECT\t \u0022/org/libwebsockets/test\u0022\n-#define THIS_BUSNAME\t \u0022org.libwebsockets.test\u0022\n-\n-#define THIS_LISTEN_PATH \u0022unix:abstract\u003dorg.libwebsockets.test\u0022\n-\n-static const char *\n-server_introspection_xml \u003d\n-\tDBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE\n-\t\u0022\u003cnode\u003e\u005cn\u0022\n-\t\u0022 \u003cinterface name\u003d'\u0022 DBUS_INTERFACE_INTROSPECTABLE \u0022'\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Introspect'\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'data' type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003c/interface\u003e\u005cn\u0022\n-\n-\t\u0022 \u003cinterface name\u003d'\u0022 DBUS_INTERFACE_PROPERTIES \u0022'\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Get'\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'interface' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'property' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'value' type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'GetAll'\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'interface' type\u003d's' direction\u003d'in'/\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'properties' type\u003d'a{sv}' direction\u003d'out'/\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003c/interface\u003e\u005cn\u0022\n-\n-\t\u0022 \u003cinterface name\u003d'\u0022THIS_INTERFACE\u0022'\u003e\u005cn\u0022\n-\t\u0022 \u003cproperty name\u003d'Version' type\u003d's' access\u003d'read' /\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Ping' \u003e\u005cn\u0022\n-\t\u0022 \u003carg type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Echo'\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'string' direction\u003d'in' type\u003d's'/\u003e\u005cn\u0022\n-\t\u0022 \u003carg type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'EmitSignal'\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Quit'\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003csignal name\u003d'OnEmitSignal'\u003e\u005cn\u0022\n-\t\u0022 \u003c/signal\u003e\u0022\n-\t\u0022 \u003c/interface\u003e\u005cn\u0022\n-\n-\t\u0022\u003c/node\u003e\u005cn\u0022;\n-\n-static DBusHandlerResult\n-dmh_introspect(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tdbus_message_append_args(*reply, DBUS_TYPE_STRING,\n-\t\t\t\t \u0026server_introspection_xml, DBUS_TYPE_INVALID);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_get(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tconst char *interface, *property;\n-\tDBusError err;\n-\n-\tdbus_error_init(\u0026err);\n-\n-\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING, \u0026interface,\n-\t\t\t\t\t DBUS_TYPE_STRING, \u0026property,\n-\t\t\t\t\t DBUS_TYPE_INVALID)) {\n-\t\tdbus_message_unref(*reply);\n-\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n-\t\tdbus_error_free(\u0026err);\n-\n-\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n-\t}\n-\n-\tif (strcmp(property, \u0022Version\u0022)) /* Unknown property */\n-\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-\n-\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, \u0026version,\n-\t\t\t\t DBUS_TYPE_INVALID);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_getall(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tDBusMessageIter arr, di, iter, va;\n-\tconst char *property \u003d \u0022Version\u0022;\n-\n-\tdbus_message_iter_init_append(*reply, \u0026iter);\n-\tdbus_message_iter_open_container(\u0026iter, DBUS_TYPE_ARRAY, \u0022{sv}\u0022, \u0026arr);\n-\n-\t/* Append all properties name/value pairs */\n-\tdbus_message_iter_open_container(\u0026arr, DBUS_TYPE_DICT_ENTRY, NULL, \u0026di);\n-\tdbus_message_iter_append_basic(\u0026di, DBUS_TYPE_STRING, \u0026property);\n-\tdbus_message_iter_open_container(\u0026di, DBUS_TYPE_VARIANT, \u0022s\u0022, \u0026va);\n-\tdbus_message_iter_append_basic(\u0026va, DBUS_TYPE_STRING, \u0026version);\n-\tdbus_message_iter_close_container(\u0026di, \u0026va);\n-\tdbus_message_iter_close_container(\u0026arr, \u0026di);\n-\n-\tdbus_message_iter_close_container(\u0026iter, \u0026arr);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_ping(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tconst char *pong \u003d \u0022Pong\u0022;\n-\n-\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, \u0026pong,\n-\t\t\t\t\t DBUS_TYPE_INVALID);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_echo(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tconst char *msg;\n-\tDBusError err;\n-\n-\tdbus_error_init(\u0026err);\n-\n-\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING,\n-\t\t\t\t \u0026msg, DBUS_TYPE_INVALID)) {\n-\t\tdbus_message_unref(*reply);\n-\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n-\t\tdbus_error_free(\u0026err);\n-\n-\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n-\t}\n-\n-\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, \u0026msg,\n-\t\t\t\t\t DBUS_TYPE_INVALID);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_emit_signal(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tDBusMessage *r \u003d dbus_message_new_signal(THIS_OBJECT, THIS_INTERFACE,\n-\t\t\t\t\t \u0022OnEmitSignal\u0022);\n-\n-\tif (!r)\n-\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-\n-\tif (!dbus_connection_send(c, r, NULL))\n-\t\treturn DBUS_HANDLER_RESULT_NEED_MEMORY;\n-\n-\t/* and send the original empty reply after */\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_emit_quit(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tinterrupted \u003d 1;\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-struct lws_dbus_methods {\n-\tconst char *inter;\n-\tconst char *call;\n-\tlws_dbus_message_handler handler;\n-} meths[] \u003d {\n-\t{ DBUS_INTERFACE_INTROSPECTABLE, \u0022Introspect\u0022,\tdmh_introspect\t},\n-\t{ DBUS_INTERFACE_PROPERTIES,\t \u0022Get\u0022,\t\tdmh_get\t\t},\n-\t{ DBUS_INTERFACE_PROPERTIES,\t \u0022GetAll\u0022,\tdmh_getall\t},\n-\t{ THIS_INTERFACE,\t\t \u0022Ping\u0022,\tdmh_ping\t},\n-\t{ THIS_INTERFACE,\t\t \u0022Echo\u0022,\tdmh_echo\t},\n-\t{ THIS_INTERFACE,\t\t \u0022EmitSignal\u0022,\tdmh_emit_signal },\n-\t{ THIS_INTERFACE,\t\t \u0022Quit\u0022,\tdmh_emit_quit\t},\n-};\n-\n-static DBusHandlerResult\n-server_message_handler(DBusConnection *conn, DBusMessage *message, void *data)\n-{\n-\tstruct lws_dbus_methods *mp \u003d meths;\n-\tDBusHandlerResult result;\n- DBusMessage *reply \u003d NULL;\n-\tsize_t n;\n-\n-\tlwsl_info(\u0022%s: Got D-Bus request: %s.%s on %s\u005cn\u0022, __func__,\n-\t\t dbus_message_get_interface(message),\n-\t\t dbus_message_get_member(message),\n-\t\t dbus_message_get_path(message));\n-\n-\tfor (n \u003d 0; n \u003c LWS_ARRAY_SIZE(meths); n++) {\n-\t\tif (dbus_message_is_method_call(message, mp-\u003einter, mp-\u003ecall)) {\n-\t\t\treply \u003d dbus_message_new_method_return(message);\n-\t\t\tif (!reply)\n-\t\t\t\treturn DBUS_HANDLER_RESULT_NEED_MEMORY;\n-\n-\t\t\tresult \u003d mp-\u003ehandler(conn, message, \u0026reply, data);\n-\n-\t\t\tif (result \u003d\u003d DBUS_HANDLER_RESULT_HANDLED \u0026\u0026\n-\t\t\t !dbus_connection_send(conn, reply, NULL))\n-\t\t\t\tresult \u003d DBUS_HANDLER_RESULT_NEED_MEMORY;\n-\n-\t\t\tdbus_message_unref(reply);\n-\n-\t\t\treturn result;\n-\t\t}\n-\n-\t\tmp++;\n-\t}\n-\n-\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-}\n-\n-static const DBusObjectPathVTable server_vtable \u003d {\n-\t.message_function \u003d server_message_handler\n-};\n-\n-static void\n-destroy_dbus_server_conn(struct lws_dbus_ctx *ctx)\n-{\n-\tif (!ctx-\u003econn)\n-\t\treturn;\n-\n-\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n-\n-\tdbus_connection_unregister_object_path(ctx-\u003econn, THIS_OBJECT);\n-\tlws_dll2_remove(\u0026ctx-\u003enext);\n-\tdbus_connection_unref(ctx-\u003econn);\n-}\n-\n-static void\n-cb_closing(struct lws_dbus_ctx *ctx)\n-{\n-\tlwsl_err(\u0022%s: closing\u005cn\u0022, __func__);\n-\tdestroy_dbus_server_conn(ctx);\n-\n-\tfree(ctx);\n-}\n-\n-\n-static void\n-new_conn(DBusServer *server, DBusConnection *conn, void *data)\n-{\n-\tstruct lws_dbus_ctx *conn_ctx, *ctx \u003d (struct lws_dbus_ctx *)data;\n-\n-\tlwsl_notice(\u0022%s: vh %s\u005cn\u0022, __func__, lws_get_vhost_name(ctx-\u003evh));\n-\n-\tconn_ctx \u003d malloc(sizeof(*conn_ctx));\n-\tif (!conn_ctx)\n-\t\treturn;\n-\n-\tmemset(conn_ctx, 0, sizeof(*conn_ctx));\n-\n-\tconn_ctx-\u003etsi \u003d ctx-\u003etsi;\n-\tconn_ctx-\u003evh \u003d ctx-\u003evh;\n-\tconn_ctx-\u003econn \u003d conn;\n-\n-\tif (lws_dbus_connection_setup(conn_ctx, conn, cb_closing)) {\n-\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (!dbus_connection_register_object_path(conn, THIS_OBJECT,\n-\t\t\t\t\t\t \u0026server_vtable, conn_ctx)) {\n-\t\tlwsl_err(\u0022%s: Failed to register object path\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_dll2_add_head(\u0026conn_ctx-\u003enext, \u0026ctx-\u003eowner);\n-\n-\t/* we take on responsibility for explicit close / unref with this... */\n-\tdbus_connection_ref(conn);\n-\n-\treturn;\n-\n-bail:\n-\tfree(conn_ctx);\n-}\n-\n-static int\n-create_dbus_listener(const char *ads)\n-{\n-\tDBusError e;\n-\n- dbus_error_init(\u0026e);\n-\n-\tif (!lws_dbus_server_listen(\u0026ctx_listener, ads, \u0026e, new_conn)) {\n-\t\tlwsl_err(\u0022%s: failed\u005cn\u0022, __func__);\n-\t\tdbus_error_free(\u0026e);\n-\n-\t\treturn 1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int\n-create_dbus_server_conn(struct lws_dbus_ctx *ctx, DBusBusType type)\n-{\n-\tDBusError err;\n-\tint rv;\n-\n- dbus_error_init(\u0026err);\n-\n-\t/* connect to the daemon bus */\n-\tctx-\u003econn \u003d dbus_bus_get(type, \u0026err);\n-\tif (!ctx-\u003econn) {\n-\t\tlwsl_err(\u0022%s: Failed to get a session DBus connection: %s\u005cn\u0022,\n-\t\t\t __func__, err.message);\n-\t\tgoto fail;\n-\t}\n-\n-\t/*\n-\t * by default dbus will call exit() when this connection closes...\n-\t * we have to shut down other things cleanly, so disable that\n-\t */\n-\tdbus_connection_set_exit_on_disconnect(ctx-\u003econn, 0);\n-\n-\trv \u003d dbus_bus_request_name(ctx-\u003econn, THIS_BUSNAME,\n-\t\t\t\t DBUS_NAME_FLAG_REPLACE_EXISTING, \u0026err);\n-\tif (rv !\u003d DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {\n-\t\tlwsl_err(\u0022%s: Failed to request name on bus: %s\u005cn\u0022,\n-\t\t\t __func__, err.message);\n-\t\tgoto fail;\n-\t}\n-\n-\tif (!dbus_connection_register_object_path(ctx-\u003econn, THIS_OBJECT,\n-\t\t\t\t\t\t \u0026server_vtable, NULL)) {\n-\t\tlwsl_err(\u0022%s: Failed to register object path for TestObject\u005cn\u0022,\n-\t\t\t __func__);\n-\t\tdbus_bus_release_name(ctx-\u003econn, THIS_BUSNAME, \u0026err);\n-\t\tgoto fail;\n-\t}\n-\n-\t/*\n-\t * This is the part that binds the connection to lws watcher and\n-\t * timeout handling provided by lws\n-\t */\n-\n-\tif (lws_dbus_connection_setup(ctx, ctx-\u003econn, cb_closing)) {\n-\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n-\t\tgoto fail;\n-\t}\n-\n-\tlwsl_notice(\u0022%s: created OK\u005cn\u0022, __func__);\n-\n-\treturn 0;\n-\n-fail:\n-\tdbus_error_free(\u0026err);\n-\n-\treturn 1;\n-}\n-\n-/*\n- * Cleanly release the connection\n- */\n-\n-static void\n-destroy_dbus_server_listener(struct lws_dbus_ctx *ctx)\n-{\n-\tdbus_server_disconnect(ctx-\u003edbs);\n-\n-\tlws_start_foreach_dll_safe(struct lws_dll2 *, rdt, nx,\n-\t\t\t\t ctx-\u003eowner.head) {\n-\t\tstruct lws_dbus_ctx *r \u003d\n-\t\t\tlws_container_of(rdt, struct lws_dbus_ctx, next);\n-\n-\t\tdbus_connection_close(r-\u003econn);\n-\t\tdbus_connection_unref(r-\u003econn);\n-\t\tfree(r);\n-\t} lws_end_foreach_dll_safe(rdt, nx);\n-\n-\tdbus_server_unref(ctx-\u003edbs);\n-}\n-\n-/*\n- * DBUS can send messages outside the usual client-initiated RPC concept.\n- *\n- * You can receive them using a message filter.\n- */\n-\n-static void\n-spam_connected_clients(struct lws_dbus_ctx *ctx)\n-{\n-\n-\t/* send connected clients an unsolicited message */\n-\n-\tlws_start_foreach_dll_safe(struct lws_dll2 *, rdt, nx,\n-\t\t\t\t ctx-\u003eowner.head) {\n-\t\tstruct lws_dbus_ctx *r \u003d\n-\t\t\tlws_container_of(rdt, struct lws_dbus_ctx, next);\n-\n-\n-\t\tDBusMessage *msg;\n-\t\tconst char *payload \u003d \u0022Unsolicited message\u0022;\n-\n-\t\tmsg \u003d dbus_message_new(DBUS_NUM_MESSAGE_TYPES + 1);\n-\t\tif (!msg) {\n-\t\t\tlwsl_err(\u0022%s: new message failed\u005cn\u0022, __func__);\n-\t\t}\n-\n-\t\tdbus_message_append_args(msg, DBUS_TYPE_STRING, \u0026payload,\n-\t\t\t\t\t\t DBUS_TYPE_INVALID);\n-\t\tif (!dbus_connection_send(r-\u003econn, msg, NULL)) {\n-\t\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n-\t\t}\n-\n-\t\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n-\n-\t\tdbus_message_unref(msg);\n-\n-\t} lws_end_foreach_dll_safe(rdt, nx);\n-\n-}\n-\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tconst char *p;\n-\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n-\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n-\t\t\t * lws must have been configured and built with\n-\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n-\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n-\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n-\t\t\t/* | LLL_DEBUG */ /* | LLL_THREAD */;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS minimal DBUS server\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.options \u003d LWS_SERVER_OPTION_EXPLICIT_VHOSTS;\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tinfo.options |\u003d\n-\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n-\n-\tdbus_ctx.tsi \u003d 0;\n-\tctx_listener.tsi \u003d 0;\n-\tctx_listener.vh \u003d dbus_ctx.vh \u003d lws_create_vhost(context, \u0026info);\n-\tif (!dbus_ctx.vh)\n-\t\tgoto bail;\n-\n-\tsession \u003d !!lws_cmdline_option(argc, argv, \u0022--session\u0022);\n-\n-\tif (session) {\n-\t\t/* create the dbus connection, loosely bound to our lws vhost */\n-\n-\t\tif (create_dbus_server_conn(\u0026dbus_ctx, DBUS_BUS_SESSION))\n-\t\t\tgoto bail;\n-\t} else {\n-\t\tif (create_dbus_listener(THIS_LISTEN_PATH)) {\n-\t\t\tlwsl_err(\u0022%s: create_dbus_listener failed\u005cn\u0022, __func__);\n-\t\t\tgoto bail;\n-\t\t}\n-\t}\n-\n-\t/* lws event loop (default poll one) */\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted) {\n-\t\tif (!session)\n-\t\t\tspam_connected_clients(\u0026ctx_listener);\n-\t\tn \u003d lws_service(context, 0);\n-\t}\n-\n-\tif (session)\n-\t\tdestroy_dbus_server_conn(\u0026dbus_ctx);\n-\telse\n-\t\tdestroy_dbus_server_listener(\u0026ctx_listener);\n-\n-\t/* this is required for valgrind-cleanliness */\n-\tdbus_shutdown();\n-\tlws_context_destroy(context);\n-\n-\tlwsl_notice(\u0022Exiting cleanly\u005cn\u0022);\n-\n-\treturn 0;\n-\n-bail:\n-\tlwsl_err(\u0022%s: failed to start\u005cn\u0022, __func__);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt b/minimal-examples/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt\ndeleted file mode 100644\nindex cd699a2..0000000\n--- a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt\n+++ /dev/null\n@@ -1,38 +0,0 @@\n-project(lws-minimal-dbus-ws-proxy C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(CheckLibraryExists)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-dbus-ws-proxy)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_DBUS 1 requirements)\n-require_lws_config(LWS_ROLE_WS 1 requirements)\n-require_lws_config(LWS_WITH_SERVER 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-\n-if (NOT MSVC AND NOT WIN32 AND requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (NOT LWS_PLAT_FREERTOS)\n-\t\tfind_package(PkgConfig QUIET)\n-\t\tpkg_check_modules(PC_DBUS1 dbus-1 QUIET)\n-\t\tlist(APPEND LWS_DBUS_INCLUDE1 ${PC_DBUS1_INCLUDE_DIRS})\n-\t\tlist(APPEND LWS_DBUS_LIB \u0022${PC_DBUS1_LIBRARIES};dl\u0022)\n-\tendif()\n-\n-\tif (LWS_DBUS_INCLUDE1)\n-\t\tinclude_directories(\u0022${LWS_DBUS_INCLUDE1}\u0022)\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared ${LWS_DBUS_LIB})\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LWS_DBUS_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/README.md b/minimal-examples/dbus-server/minimal-dbus-ws-proxy/README.md\ndeleted file mode 100644\nindex 7192854..0000000\n--- a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/README.md\n+++ /dev/null\n@@ -1,115 +0,0 @@\n-# lws minimal dbus ws proxy\n-\n-This is an application which presents a DBUS server on one side, and a\n-websocket client proxy on the other.\n-\n-You connect to it over DBUS, send a Connect method on its interface giving\n-a URI and a ws subprotocol name.\n-\n-It replies with a string \u0022Connecting\u0022 if all is well.\n-\n-Connection progress (including close) is then provided using type 7 messages\n-sent back to the dbus client.\n-\n-Payload from the ws connection is provided using type 6 messages sent back to\n-the dbus client.\n-\n-## build\n-\n-Using libdbus requires additional non-default include paths setting, same as\n-is necessary for lws build described in ./lib/roles/dbus/README.md\n-\n-CMake can guess one path and the library name usually, see the README above\n-for details of how to override for custom libdbus and cross build.\n-\n-Fedora example:\n-```\n-$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib64/dbus-1.0/include\u0022\n-$ make\n-```\n-\n-Ubuntu example:\n-```\n-$ cmake .. -DLWS_DBUS_INCLUDE2\u003d\u0022/usr/lib/x86_64-linux-gnu/dbus-1.0/include\u0022\n-$ make\n-```\n-\n-## Configuration\n-\n-The dbus-ws-proxy server tries to register its actual bus name with the SYSTEM\n-bus in DBUS. If it fails, eg because of insufficient permissions on the user,\n-then it continues without that and starts its own daemon normally.\n-\n-The main dbus daemon must be told how to accept these registrations if that's\n-what you want. A config file is provided that tells dbus to allow the\n-well-known busname for this daemon to be registered, but only by root.\n-\n-``` \n-$ sudo cp org.libwebsockets.wsclientproxy.conf /etc/dbus-1/system.d\n-$ sudo systemctl restart dbus\n-```\n-\n-## usage\n-\n-Run the dbus-ws-proxy server, then start lws-minimal-dbus-ws-proxy-testclient in\n-another terminal.\n-\n-This test app sends a random line drawing message to the mirror example on\n-https://libwebsockets.org/testserver every couple of seconds, and displays\n-any received messages (such as its own sends mirrored back, or anything\n-drawn in the canvas in a browser).\n-\n-```\n- $ sudo ./lws-minimal-dbus-ws-proxy-testclient\n-[2018/10/07 10:05:29:2084] USER: LWS minimal DBUS ws proxy testclient\n-[2018/10/07 10:05:29:2345] NOTICE: Creating Vhost 'default' port 0, 1 protocols, IPv6 off\n-[2018/10/07 10:05:29:2424] USER: create_dbus_client_conn: connecting to 'unix:abstract\u003dorg.libwebsockets.wsclientproxy'\n-[2018/10/07 10:05:29:2997] NOTICE: state_transition: 0x5679720: from state 0 -\u003e 1\n-[2018/10/07 10:05:29:2999] NOTICE: create_dbus_client_conn: created OK\n-[2018/10/07 10:05:29:3232] USER: remote_method_call: requesting proxy connection wss://libwebsockets.org/ lws-mirror-protocol\n-[2018/10/07 10:05:29:3450] NOTICE: state_transition: 0x5679720: from state 1 -\u003e 2\n-[2018/10/07 10:05:29:5972] USER: pending_call_notify: received 'Connecting'\n-[2018/10/07 10:05:31:3387] NOTICE: state_transition: 0x5679720: from state 2 -\u003e 3\n-[2018/10/07 10:05:33:6672] USER: filter: Received 'd #B0DC51 115 177 166 283;'\n-[2018/10/07 10:05:35:9723] USER: filter: Received 'd #E87CCD 9 192 106 235;'\n-[2018/10/07 10:05:38:2784] USER: filter: Received 'd #E2A9E3 379 290 427 62;'\n-[2018/10/07 10:05:39:5833] USER: filter: Received 'd #B127F8 52 126 60 226;'\n-[2018/10/07 10:05:41:8908] USER: filter: Received 'd #0E0F76 429 267 8 11;'\n-...\n-```\n-\n-## ws proxy DBUS details\n-\n-### Fixed details\n-\n-Item|Value\n----|---\n-Address|unix:abstract\u003dorg.libwebsockets.wsclientproxy\n-Interface|org.libwebsockets.wsclientproxy\n-Bus Name|org.libwebsockets.wsclientproxy\n-Object path|/org/libwebsockets/wsclientproxy\n-\n-### Interface Methods\n-\n-Method|Arguments|Returns\n----|---|---\n-Connect|s: ws URI, s: ws subprotocol name|\u0022Bad Uri\u0022, \u0022Connecting\u0022 or \u0022Failed\u0022\n-Send|s: payload|Empty message if no problem, or error message\n-\n-When Connecting, the actual connection happens asynchronously if the initial\n-connection attempt doesn't fail immediately. If it's continuing in the\n-background, the reply will have been \u0022Connecting\u0022.\n-\n-### Signals\n-\n-Signal Name|Argument|Meaning\n----|---|---\n-Receive|s: payload|Received data from the ws link\n-Status|s: status|See table below\n-\n-Status String|Meaning\n----|---\n-\u0022ws client connection error\u0022|The ws connection attempt ended with a fatal error\n-\u0022ws client connection established\u0022|The ws connection attempt succeeded\n-\u0022ws client connection closed\u0022|The ws connection has closed\n-\ndiff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/main.c b/minimal-examples/dbus-server/minimal-dbus-ws-proxy/main.c\ndeleted file mode 100644\nindex 353b159..0000000\n--- a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/main.c\n+++ /dev/null\n@@ -1,101 +0,0 @@\n-/*\n- * lws-minimal-dbus-ws-proxy\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates a minimal session dbus server that uses the lws event loop,\n- * and allows proxying ws client connections via DBUS.\n- */\n-\n-#include \u003cstdbool.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003cstdio.h\u003e\n-#include \u003cstdlib.h\u003e\n-#include \u003cunistd.h\u003e\n-#include \u003csignal.h\u003e\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003clibwebsockets/lws-dbus.h\u003e\n-\n-#define LWS_PLUGIN_STATIC\n-#include \u0022protocol_lws_minimal_dbus_ws_proxy.c\u0022\n-\n-static int interrupted;\n-static struct lws_protocols protocols[] \u003d {\n-\tLWS_PLUGIN_PROTOCOL_MINIMAL_DBUS_WSPROXY,\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-/*\n- * we pass the dbus address to connect to proxy with from outside the\n- * protocol plugin... eg if built as a plugin for lwsws, you would instead\n- * set this pvo in the lwsws JSON config.\n- */\n-\n-static const struct lws_protocol_vhost_options pvo_ads \u003d {\n-\tNULL,\n-\tNULL,\n-\t\u0022ads\u0022,\t\t\t\t/* pvo name */\n-\t(void *)\u0022unix:abstract\u003dorg.libwebsockets.wsclientproxy\u0022\t/* pvo value */\n-};\n-\n-static const struct lws_protocol_vhost_options pvo \u003d {\n-\tNULL,\t\t\t\t/* \u0022next\u0022 pvo linked-list */\n-\t\u0026pvo_ads,\t\t\t/* \u0022child\u0022 pvo linked-list */\n-\t\u0022lws-minimal-dbus-wsproxy\u0022,\t/* protocol name we belong to on this vhost */\n-\t\u0022\u0022\t\t\t\t/* ignored */\n-};\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstatic struct lws_context *context;\n-\tstruct lws_context_creation_info info;\n-\tconst char *p;\n-\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n-\t\t\t/* for LLL_ verbosity above NOTICE to be built into lws,\n-\t\t\t * lws must have been configured and built with\n-\t\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE */\n-\t\t\t/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */\n-\t\t\t/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */\n-\t\t\t/* | LLL_DEBUG */ /* | LLL_THREAD */;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS DBUS ws client proxy\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n-\t\tLWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.protocols \u003d protocols;\n-\tinfo.pvo \u003d \u0026pvo;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\t/* lws event loop (default poll one) */\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\n-\tlwsl_notice(\u0022Exiting cleanly\u005cn\u0022);\n-\n-\treturn 0;\n-}\ndiff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf b/minimal-examples/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf\ndeleted file mode 100644\nindex 49e430b..0000000\n--- a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf\n+++ /dev/null\n@@ -1,14 +0,0 @@\n-\u003c!DOCTYPE busconfig PUBLIC\n- \u0022-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN\u0022\n- \u0022http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd\u0022\u003e\n-\u003cbusconfig\u003e\n-\t\u003cpolicy user\u003d\u0022root\u0022\u003e\n-\t\t\u003callow own\u003d\u0022org.libwebsockets.wsclientproxy\u0022/\u003e\n-\t\t\u003callow send_destination\u003d\u0022org.libwebsockets.wsclientproxy\u0022/\u003e\n-\t\u003c/policy\u003e\n-\t\u003cpolicy context\u003d\u0022default\u0022\u003e\n- \u003cdeny own\u003d\u0022org.libwebsockets.wsclientproxy\u0022/\u003e\n- \u003cdeny send_destination\u003d\u0022org.libwebsockets.wsclientproxy\u0022/\u003e\n- \u003c/policy\u003e\n-\u003c/busconfig\u003e\n-\ndiff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c b/minimal-examples/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c\ndeleted file mode 100644\nindex 3db1c4e..0000000\n--- a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c\n+++ /dev/null\n@@ -1,795 +0,0 @@\n-/*\n- * ws protocol handler plugin for dbus ws proxy\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This proxies outgoing ws client connections on DBUS. So a DBUS client can\n- * reach out and get remote WS payloads in both directions.\n- *\n- * DEVELOPER NOTE\n- *\n- * Two worlds, dbus and ws, collide in this file.\n- *\n- * There main thing keeping it sane is both worlds are running in the same\n- * thread and on the same event loop. Although things may happen completely\n- * asynchronously in both worlds, the logical reaction to those events are\n- * serialized in a single event loop doing one thing at a time.\n- *\n- * So while you are servicing an event in the ws world, you can be certain the\n- * logical state of any related dbus thing cannot change underneath you, until\n- * you return back to the event loop, and vice versa. So other-world objects\n- * can't be freed, other-world handles can't close etc while you are servicing\n- * in your world.\n- *\n- * Since all bets are off what happens next, and in which world, after you\n- * return back to the event loop though, an additional rule is needed: worlds\n- * must not allocate in objects owned by the other world. They must generate\n- * their own objects in their world and use those for allocations and state.\n- *\n- * For example in the dbus-world there is a struct lws_dbus_ctx_wsproxy with\n- * various state, but he is subject to deletion by events in dbus-world. If\n- * the ws-world stored things there, they are subject to going out of scope\n- * at the whim of the dbus connection without the ws world hearing about it and\n- * cleanly deallocaing them. So the ws world must keep his own pss that remains\n- * in scope until the ws link closes for allocations from ws-world.\n- *\n- * In this application there's a point of contact between the worlds, a ring\n- * buffer allocated in ws world when the ws connection is established, and\n- * deallocated when the ws connection is closed. The DBUS world needs to put\n- * things in this ringbuffer. But the way lws_ring works, when the message\n- * allocated in DBUS world is queued on the ringbuffer, the ringbuffer itself\n- * takes responsibility for deallocation. So there is no problem.\n- */\n-\n-#if !defined (LWS_PLUGIN_STATIC)\n-#define LWS_DLL\n-#define LWS_INTERNAL\n-#include \u003clibwebsockets.h\u003e\n-#include \u003clibwebsockets/lws-dbus.h\u003e\n-#endif\n-\n-#include \u003cstring.h\u003e\n-#include \u003cassert.h\u003e\n-#include \u003csignal.h\u003e\n-\n-/*\n- * dbus accepted connections create these larger context structs that start\n- * with the lws dbus context\n- */\n-\n-struct vhd_dbus_proxy;\n-\n-struct msg {\n-\tvoid *payload; /* is malloc'd */\n-\tsize_t len;\n-\tchar binary;\n-\tchar first;\n-\tchar final;\n-};\n-\n-struct pss_dbus_proxy {\n-\tstruct lws_ring *ring_out;\n-\tuint32_t ring_out_tail;\n-};\n-\n-struct lws_dbus_ctx_wsproxy {\n-\tstruct lws_dbus_ctx ctx;\n-\n-\tstruct lws *cwsi;\n-\tstruct vhd_dbus_proxy *vhd;\n-\tstruct pss_dbus_proxy *pss;\n-};\n-\n-struct vhd_dbus_proxy {\n-\tstruct lws_context *context;\n-\tstruct lws_vhost *vhost;\n-\n-\t/*\n-\t * Because the listener ctx is composed in the vhd, we can always get a\n-\t * pointer to the outer vhd from a pointer to ctx_listener inside.\n-\t */\n-\tstruct lws_dbus_ctx ctx_listener;\n-\tstruct lws_dbus_ctx_wsproxy dctx;\n-\n-\tconst char *dbus_listen_ads;\n-};\n-\n-#define THIS_INTERFACE\t\u0022org.libwebsockets.wsclientproxy\u0022\n-#define THIS_OBJECT\t\u0022/org/libwebsockets/wsclientproxy\u0022\n-#define THIS_BUSNAME\t\u0022org.libwebsockets.wsclientproxy\u0022\n-static const char *version \u003d \u00220.1\u0022;\n-\n-static const char *server_introspection_xml \u003d\n-\tDBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE\n-\t\u0022\u003cnode\u003e\u005cn\u0022\n-\t\u0022 \u003cinterface name\u003d'\u0022 DBUS_INTERFACE_INTROSPECTABLE \u0022'\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Introspect'\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'data' type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003c/interface\u003e\u005cn\u0022\n-\n-\t\u0022 \u003cinterface name\u003d'\u0022 DBUS_INTERFACE_PROPERTIES \u0022'\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Get'\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'interface' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'property' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'value' type\u003d's' direction\u003d'out' /\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'GetAll'\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'interface' type\u003d's' direction\u003d'in'/\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'properties' type\u003d'a{sv}' direction\u003d'out'/\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003c/interface\u003e\u005cn\u0022\n-\n-\t\u0022 \u003cinterface name\u003d'\u0022THIS_INTERFACE\u0022'\u003e\u005cn\u0022\n-\t\u0022 \u003cproperty name\u003d'Version' type\u003d's' access\u003d'read' /\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Connect' \u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'url' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'subprotocol' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003cmethod name\u003d'Send'\u003e\u005cn\u0022\n-\t\u0022 \u003carg name\u003d'payload' type\u003d's' direction\u003d'in' /\u003e\u005cn\u0022\n-\t\u0022 \u003c/method\u003e\u005cn\u0022\n-\t\u0022 \u003csignal name\u003d'Receive'\u003e\u005cn\u0022\n-\t\u0022 \u003c/signal\u003e\u0022\n-\t\u0022 \u003csignal name\u003d'Status'\u003e\u005cn\u0022\n-\t\u0022 \u003c/signal\u003e\u0022\n-\t\u0022 \u003c/interface\u003e\u005cn\u0022\n-\n-\t\u0022\u003c/node\u003e\u005cn\u0022;\n-\n-static void\n-destroy_message(void *_msg)\n-{\n-\tstruct msg *msg \u003d _msg;\n-\n-\tfree(msg-\u003epayload);\n-\tmsg-\u003epayload \u003d NULL;\n-\tmsg-\u003elen \u003d 0;\n-}\n-\n-/*\n- * DBUS WORLD\n- */\n-\n-static DBusHandlerResult\n-dmh_introspect(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tdbus_message_append_args(*reply,\n-\t\t\t\t DBUS_TYPE_STRING, \u0026server_introspection_xml,\n-\t\t\t\t DBUS_TYPE_INVALID);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_get(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tconst char *interface, *property;\n-\tDBusError err;\n-\n-\tdbus_error_init(\u0026err);\n-\n-\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING, \u0026interface,\n-\t\t\t\t\t DBUS_TYPE_STRING, \u0026property,\n-\t\t\t\t\t DBUS_TYPE_INVALID)) {\n-\t\tdbus_message_unref(*reply);\n-\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n-\t\tdbus_error_free(\u0026err);\n-\n-\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n-\t}\n-\n-\tif (strcmp(property, \u0022Version\u0022)) /* Unknown property */\n-\t\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-\n-\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, \u0026version,\n-\t\t\t\t\t DBUS_TYPE_INVALID);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_getall(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tDBusMessageIter arr, di, iter, va;\n-\tconst char *property \u003d \u0022Version\u0022;\n-\n-\tdbus_message_iter_init_append(*reply, \u0026iter);\n-\tdbus_message_iter_open_container(\u0026iter, DBUS_TYPE_ARRAY, \u0022{sv}\u0022, \u0026arr);\n-\n-\t/* Append all properties name/value pairs */\n-\tdbus_message_iter_open_container(\u0026arr, DBUS_TYPE_DICT_ENTRY, NULL, \u0026di);\n-\tdbus_message_iter_append_basic(\u0026di, DBUS_TYPE_STRING, \u0026property);\n-\tdbus_message_iter_open_container(\u0026di, DBUS_TYPE_VARIANT, \u0022s\u0022, \u0026va);\n-\tdbus_message_iter_append_basic(\u0026va, DBUS_TYPE_STRING, \u0026version);\n-\tdbus_message_iter_close_container(\u0026di, \u0026va);\n-\tdbus_message_iter_close_container(\u0026arr, \u0026di);\n-\n-\tdbus_message_iter_close_container(\u0026iter, \u0026arr);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static DBusHandlerResult\n-dmh_connect(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tstruct lws_dbus_ctx_wsproxy *wspctx \u003d (struct lws_dbus_ctx_wsproxy *)d;\n-\tconst char *prot \u003d \u0022\u0022, *ads \u003d \u0022\u0022, *path \u003d \u0022\u0022, *baduri \u003d \u0022Bad Uri\u0022,\n-\t\t *connecting \u003d \u0022Connecting\u0022, *failed \u003d \u0022Failed\u0022, **pp;\n-\tstruct lws_client_connect_info i;\n-\tchar host[128], uri_copy[512];\n-\tconst char *uri, *subprotocol;\n-\tDBusError err;\n-\tint port \u003d 0;\n-\n-\tdbus_error_init(\u0026err);\n-\n-\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING, \u0026uri,\n-\t\t\t \t \t DBUS_TYPE_STRING, \u0026subprotocol,\n-\t\t\t\t\t DBUS_TYPE_INVALID)) {\n-\t\tdbus_message_unref(*reply);\n-\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n-\t\tdbus_error_free(\u0026err);\n-\n-\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n-\t}\n-\n-\tstrncpy(uri_copy, uri, sizeof(uri_copy) - 1);\n-\turi_copy[sizeof(uri_copy) - 1] \u003d '\u005c0';\n-\n-\tif (lws_parse_uri(uri_copy, \u0026prot, \u0026ads, \u0026port, \u0026path)) {\n-\t\tpp \u003d \u0026baduri;\n-\t\tgoto send_reply;\n-\t}\n-\n-\tlws_snprintf(host, sizeof(host), \u0022%s:%u\u0022, ads, port);\n-\n-\tmemset(\u0026i, 0, sizeof(i));\n-\n-\tassert(wspctx);\n-\tassert(wspctx-\u003evhd);\n-\n-\ti.context \u003d wspctx-\u003evhd-\u003econtext;\n-\ti.port \u003d port;\n-\ti.address \u003d ads;\n-\ti.path \u003d path;\n-\ti.host \u003d host;\n-\ti.origin \u003d host;\n-\ti.ssl_connection \u003d !strcmp(prot, \u0022https\u0022) || !strcmp(prot, \u0022wss\u0022);\n-\ti.vhost \u003d wspctx-\u003ectx.vh;\n-\ti.protocol \u003d subprotocol;\n-\ti.local_protocol_name \u003d \u0022lws-minimal-dbus-wsproxy\u0022;\n-\ti.pwsi \u003d \u0026wspctx-\u003ecwsi;\n-\n-\tlwsl_user(\u0022%s: connecting to %s://%s:%d%s\u005cn\u0022, __func__, prot,\n-\t\t\ti.address, i.port, i.path);\n-\n-\tif (!lws_client_connect_via_info(\u0026i)) {\n-\t\tlwsl_notice(\u0022%s: client connect failed\u005cn\u0022, __func__);\n-\t\tpp \u003d \u0026failed;\n-\t\tgoto send_reply;\n-\t}\n-\n-\tlws_set_opaque_parent_data(wspctx-\u003ecwsi, wspctx);\n-\tlwsl_notice(\u0022%s: client connecting...\u005cn\u0022, __func__);\n-\tpp \u003d \u0026connecting;\n-\n-send_reply:\n-\tdbus_message_append_args(*reply, DBUS_TYPE_STRING, pp,\n-\t\t\t\t\t DBUS_TYPE_INVALID);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-static int\n-issue_dbus_signal(struct lws *wsi, const char *signame, const char *string)\n-{\n-\tstruct lws_dbus_ctx_wsproxy *wspctx \u003d\n-\t\t\tlws_get_opaque_parent_data(wsi);\n-\tDBusMessage *m;\n-\n-\tif (!wspctx)\n-\t\treturn 1;\n-\n-\tm \u003d dbus_message_new_signal(THIS_OBJECT, THIS_INTERFACE, signame);\n-\tif (!m) {\n-\t\tlwsl_err(\u0022%s: new signal failed\u005cn\u0022, __func__);\n-\t\treturn 1;\n-\t}\n-\n-\tdbus_message_append_args(m, DBUS_TYPE_STRING, \u0026string,\n-\t\t\t\t DBUS_TYPE_INVALID);\n-\n-\tif (!dbus_connection_send(wspctx-\u003ectx.conn, m, NULL))\n-\t\tlwsl_err(\u0022%s: unable to send\u005cn\u0022, __func__);\n-\n-\tdbus_message_unref(m);\n-\n-\treturn 0;\n-}\n-\n-static DBusHandlerResult\n-dmh_send(DBusConnection *c, DBusMessage *m, DBusMessage **reply, void *d)\n-{\n-\tstruct lws_dbus_ctx_wsproxy *wspctx \u003d (struct lws_dbus_ctx_wsproxy *)d;\n-\tconst char *payload;\n-\tstruct msg amsg;\n-\tDBusError err;\n-\n-\tdbus_error_init(\u0026err);\n-\n-\tif (!wspctx-\u003ecwsi || !wspctx-\u003epss) {\n-\t\tdbus_message_unref(*reply);\n-\t\t*reply \u003d dbus_message_new_error(m, \u0022Send Fail\u0022, \u0022No ws conn\u0022);\n-\n-\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n-\t}\n-\n-\tif (!dbus_message_get_args(m, \u0026err, DBUS_TYPE_STRING, \u0026payload,\n-\t\t\t\t\t DBUS_TYPE_INVALID)) {\n-\t\tdbus_message_unref(*reply);\n-\t\t*reply \u003d dbus_message_new_error(m, err.name, err.message);\n-\t\tdbus_error_free(\u0026err);\n-\n-\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n-\t}\n-\n-\t/*\n-\t * we allocate on the ringbuffer in ws world, but responsibility for\n-\t * freeing it is understood by lws_ring.\n-\t */\n-\n-\tamsg.len \u003d strlen(payload);\n-\t/* notice we over-allocate by LWS_PRE */\n-\tamsg.payload \u003d malloc(LWS_PRE + amsg.len);\n-\tif (!amsg.payload) {\n-\t\tlwsl_user(\u0022OOM: dropping\u005cn\u0022);\n-\t\tdbus_message_unref(*reply);\n-\t\t*reply \u003d dbus_message_new_error(m, \u0022Send Fail\u0022, \u0022OOM\u0022);\n-\n-\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n-\t}\n-\tamsg.binary \u003d 0;\n-\tamsg.first \u003d 1;\n-\tamsg.final \u003d 1;\n-\n-\tmemcpy((char *)amsg.payload + LWS_PRE, payload, amsg.len);\n-\tif (!lws_ring_insert(wspctx-\u003epss-\u003ering_out, \u0026amsg, 1)) {\n-\t\tdestroy_message(\u0026amsg);\n-\t\tlwsl_user(\u0022Ring Full!\u005cn\u0022);\n-\t\tdbus_message_unref(*reply);\n-\t\t*reply \u003d dbus_message_new_error(m, \u0022Send Fail\u0022, \u0022Ring full\u0022);\n-\n-\t\treturn DBUS_HANDLER_RESULT_HANDLED;\n-\t}\n-\tif (wspctx-\u003ecwsi)\n-\t\tlws_callback_on_writable(wspctx-\u003ecwsi);\n-\n-\treturn DBUS_HANDLER_RESULT_HANDLED;\n-}\n-\n-struct lws_dbus_methods {\n-\tconst char *inter;\n-\tconst char *call;\n-\tlws_dbus_message_handler handler;\n-} meths[] \u003d {\n-\t{ DBUS_INTERFACE_INTROSPECTABLE, \u0022Introspect\u0022,\tdmh_introspect\t},\n-\t{ DBUS_INTERFACE_PROPERTIES,\t \u0022Get\u0022,\t\tdmh_get\t\t},\n-\t{ DBUS_INTERFACE_PROPERTIES,\t \u0022GetAll\u0022,\tdmh_getall\t},\n-\t{ THIS_INTERFACE,\t\t \u0022Connect\u0022,\tdmh_connect\t},\n-\t{ THIS_INTERFACE,\t\t \u0022Send\u0022,\tdmh_send\t},\n-};\n-\n-static DBusHandlerResult\n-server_message_handler(DBusConnection *conn, DBusMessage *message, void *data)\n-{\n-\tstruct lws_dbus_methods *mp \u003d meths;\n- DBusMessage *reply \u003d NULL;\n-\tDBusHandlerResult result;\n-\tsize_t n;\n-\n-\tassert(data);\n-\n-\tlwsl_info(\u0022%s: Got D-Bus request: %s.%s on %s\u005cn\u0022, __func__,\n-\t\tdbus_message_get_interface(message),\n-\t\tdbus_message_get_member(message),\n-\t\tdbus_message_get_path(message));\n-\n-\tfor (n \u003d 0; n \u003c LWS_ARRAY_SIZE(meths); n++) {\n-\t\tif (dbus_message_is_method_call(message, mp-\u003einter, mp-\u003ecall)) {\n-\t\t\treply \u003d dbus_message_new_method_return(message);\n-\t\t\tif (!reply)\n-\t\t\t\treturn DBUS_HANDLER_RESULT_NEED_MEMORY;\n-\n-\t\t\tresult \u003d mp-\u003ehandler(conn, message, \u0026reply, data);\n-\n-\t\t\tif (result \u003d\u003d DBUS_HANDLER_RESULT_HANDLED \u0026\u0026\n-\t\t\t !dbus_connection_send(conn, reply, NULL))\n-\t\t\t\tresult \u003d DBUS_HANDLER_RESULT_NEED_MEMORY;\n-\n-\t\t\tdbus_message_unref(reply);\n-\n-\t\t\treturn result;\n-\t\t}\n-\n-\t\tmp++;\n-\t}\n-\n-\treturn DBUS_HANDLER_RESULT_NOT_YET_HANDLED;\n-}\n-\n-static const DBusObjectPathVTable vtable \u003d {\n-\t.message_function \u003d server_message_handler\n-};\n-\n-static void\n-destroy_dbus_server_conn(struct lws_dbus_ctx_wsproxy *wsctx)\n-{\n-\tif (!wsctx-\u003ectx.conn)\n-\t\treturn;\n-\n-\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n-\n-\tdbus_connection_unregister_object_path(wsctx-\u003ectx.conn, THIS_OBJECT);\n-\tlws_dll2_remove(\u0026wsctx-\u003ectx.next);\n-\tdbus_connection_unref(wsctx-\u003ectx.conn);\n-}\n-\n-/*\n- * This is the client dbus side going away. We need to stop the associated\n- * client ws part and make sure it can't dereference us now we are gone.\n- */\n-\n-static void\n-cb_closing(struct lws_dbus_ctx *ctx)\n-{\n-\tstruct lws_dbus_ctx_wsproxy *wspctx \u003d\n-\t\t\t(struct lws_dbus_ctx_wsproxy *)ctx;\n-\tlwsl_err(\u0022%s: closing\u005cn\u0022, __func__);\n-\n-\t/*\n-\t * We have to take care that the associated proxy wsi knows our\n-\t * dbus ctx is going out of scope after we return from here.\n-\t *\n-\t * We do it by setting its pointer to our dbus ctx to NULL.\n-\t */\n-\n-\tif (wspctx-\u003ecwsi) {\n-\t\tlws_set_opaque_parent_data(wspctx-\u003ecwsi, NULL);\n-\t\tlws_set_timeout(wspctx-\u003ecwsi,\n-\t\t\t\tPENDING_TIMEOUT_KILLED_BY_PROXY_CLIENT_CLOSE,\n-\t\t\t\tLWS_TO_KILL_ASYNC);\n-\t}\n-\n-\tdestroy_dbus_server_conn(wspctx);\n-\n-\tfree(wspctx);\n-}\n-\n-static void\n-new_conn(DBusServer *server, DBusConnection *conn, void *d)\n-{\n-\tstruct lws_dbus_ctx_wsproxy *conn_wspctx, /* the new conn context */\n-\t\t\t\t /* the listener context */\n-\t\t\t\t *wspctx \u003d (struct lws_dbus_ctx_wsproxy *)d;\n-\tstruct vhd_dbus_proxy *vhd \u003d lws_container_of(d,\n-\t\t\t\t\tstruct vhd_dbus_proxy, ctx_listener);\n-\n-\tassert(vhd-\u003evhost \u003d\u003d wspctx-\u003ectx.vh);\n-\n-\tlwsl_notice(\u0022%s\u005cn\u0022, __func__);\n-\n-\tconn_wspctx \u003d malloc(sizeof(*conn_wspctx));\n-\tif (!conn_wspctx)\n-\t\treturn;\n-\n-\tmemset(conn_wspctx, 0, sizeof(*conn_wspctx));\n-\n-\tconn_wspctx-\u003ectx.tsi \u003d wspctx-\u003ectx.tsi;\n-\tconn_wspctx-\u003ectx.vh \u003d wspctx-\u003ectx.vh;\n-\tconn_wspctx-\u003ectx.conn \u003d conn;\n-\tconn_wspctx-\u003evhd \u003d vhd; /* let accepted connections also know the vhd */\n-\n-\tassert(conn_wspctx-\u003evhd);\n-\n-\tif (lws_dbus_connection_setup(\u0026conn_wspctx-\u003ectx, conn, cb_closing)) {\n-\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tif (!dbus_connection_register_object_path(conn, THIS_OBJECT, \u0026vtable,\n-\t\t\t\t\t\t conn_wspctx)) {\n-\t\tlwsl_err(\u0022%s: Failed to register object path\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\tlws_dll2_add_head(\u0026conn_wspctx-\u003ectx.next, \u0026wspctx-\u003ectx.owner);\n-\n-\t/* we take on responsibility for explicit close / unref with this... */\n-\tdbus_connection_ref(conn);\n-\n-\treturn;\n-\n-bail:\n-\tfree(conn_wspctx);\n-}\n-\n-static int\n-create_dbus_listener(struct vhd_dbus_proxy *vhd, int tsi)\n-{\n-\tDBusError e;\n-\n- dbus_error_init(\u0026e);\n-#if 0\n- vhd-\u003edctx.ctx.tsi \u003d tsi;\n- vhd-\u003edctx.ctx.vh \u003d vhd-\u003evhost;\n- vhd-\u003edctx.ctx.next.prev \u003d NULL;\n- vhd-\u003edctx.ctx.next.next \u003d NULL;\n- vhd-\u003edctx.vhd \u003d vhd;\n- vhd-\u003edctx.cwsi \u003d NULL;\n-\n-\t/* connect to the SYSTEM bus */\n-\n-\tvhd-\u003edctx.ctx.conn \u003d dbus_bus_get(DBUS_BUS_SYSTEM, \u0026e);\n-\tif (!vhd-\u003edctx.ctx.conn) {\n-\t\tlwsl_notice(\u0022%s: Failed to get a session DBus connection: '%s'\u0022\n-\t\t\t \u0022, continuing with daemon listener only\u005cn\u0022,\n-\t\t\t __func__, e.message);\n-\t\tdbus_error_free(\u0026e);\n-\t\tdbus_error_init(\u0026e);\n-\t\tgoto daemon;\n-\t}\n-\n-\t/*\n-\t * by default dbus will call exit() when this connection closes...\n-\t * we have to shut down other things cleanly, so disable that\n-\t */\n-\tdbus_connection_set_exit_on_disconnect(vhd-\u003edctx.ctx.conn, 0);\n-\n-\tif (dbus_bus_request_name(vhd-\u003edctx.ctx.conn, THIS_BUSNAME,\n-\t\t\t\t DBUS_NAME_FLAG_REPLACE_EXISTING, \u0026e) !\u003d\n-\t\t\t\t\tDBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {\n-\t\tlwsl_notice(\u0022%s: Failed to request name on bus: '%s',\u0022\n-\t\t\t \u0022 continuing with daemon listener only\u005cn\u0022,\n-\t\t\t __func__, e.message);\n-\t\tdbus_connection_unref(vhd-\u003edctx.ctx.conn);\n-\t\tvhd-\u003edctx.ctx.conn \u003d NULL;\n-\t\tdbus_error_free(\u0026e);\n-\t\tdbus_error_init(\u0026e);\n-\t\tgoto daemon;\n-\t}\n-\n-\tif (!dbus_connection_register_object_path(vhd-\u003edctx.ctx.conn,\n-\t\t\t\t\t\t THIS_OBJECT, \u0026vtable,\n-\t\t\t\t\t\t \u0026vhd-\u003edctx)) {\n-\t\tlwsl_err(\u0022%s: Failed to register object path\u005cn\u0022, __func__);\n-\t\tgoto fail;\n-\t}\n-\n-\t/*\n-\t * This is the part that binds the connection to lws watcher and\n-\t * timeout handling provided by lws\n-\t */\n-\n-\tif (lws_dbus_connection_setup(\u0026vhd-\u003edctx.ctx, vhd-\u003edctx.ctx.conn,\n-\t\t\t\t cb_closing)) {\n-\t\tlwsl_err(\u0022%s: connection bind to lws failed\u005cn\u0022, __func__);\n-\t\tgoto fail;\n-\t}\n-\n-daemon:\n-#endif\n- vhd-\u003ectx_listener.vh \u003d vhd-\u003evhost;\n- vhd-\u003ectx_listener.tsi \u003d tsi;\n-\n-\tif (!lws_dbus_server_listen(\u0026vhd-\u003ectx_listener, vhd-\u003edbus_listen_ads,\n-\t\t\t\t \u0026e, new_conn)) {\n-\t\tlwsl_err(\u0022%s: failed\u005cn\u0022, __func__);\n-\t\tdbus_error_free(\u0026e);\n-\n-\t\treturn 1;\n-\t}\n-\n-\tlwsl_notice(\u0022%s: created DBUS listener on %s\u005cn\u0022, __func__,\n-\t\t\tvhd-\u003edbus_listen_ads);\n-\n-\treturn 0;\n-#if 0\n-fail:\n-\tdbus_error_free(\u0026e);\n-\n-\treturn 1;\n-#endif\n-}\n-\n-static void\n-destroy_dbus_server_listener(struct vhd_dbus_proxy *vhd)\n-{\n-\tdbus_server_disconnect(vhd-\u003ectx_listener.dbs);\n-\n-\tlws_start_foreach_dll_safe(struct lws_dll2 *, rdt, nx,\n-\t\t\tvhd-\u003ectx_listener.owner.head) {\n-\t\tstruct lws_dbus_ctx *r \u003d lws_container_of(rdt,\n-\t\t\t\t\t\tstruct lws_dbus_ctx, next);\n-\n-\t\tdbus_connection_close(r-\u003econn);\n-\t\tdbus_connection_unref(r-\u003econn);\n-\t\tfree(r);\n-\t} lws_end_foreach_dll_safe(rdt, nx);\n-\n-\tif (vhd-\u003edctx.ctx.conn)\n-\t\tdbus_connection_unref(vhd-\u003edctx.ctx.conn);\n-\tdbus_server_unref(vhd-\u003ectx_listener.dbs);\n-}\n-\n-/*\n- * WS WORLD\n- */\n-\n-static int\n-callback_minimal_dbus_wsproxy(struct lws *wsi, enum lws_callback_reasons reason,\n-\t\t\t void *user, void *in, size_t len)\n-{\n-\tstruct pss_dbus_proxy *pss \u003d (struct pss_dbus_proxy *)user;\n-\tstruct vhd_dbus_proxy *vhd \u003d (struct vhd_dbus_proxy *)\n-\t\t\tlws_protocol_vh_priv_get(lws_get_vhost(wsi),\n-\t\t\t\t\t\t lws_get_protocol(wsi));\n-\tstruct lws_dbus_ctx_wsproxy *wspctx;\n-\tconst struct msg *pmsg;\n-\tint flags, m;\n-\n-\tswitch (reason) {\n-\n-\tcase LWS_CALLBACK_PROTOCOL_INIT:\n-\t\tvhd \u003d lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),\n-\t\t\t\t\tlws_get_protocol(wsi), sizeof(*vhd));\n-\t\tif (!vhd)\n-\t\t\treturn -1;\n-\n-\t\tvhd-\u003econtext \u003d lws_get_context(wsi);\n-\t\tvhd-\u003evhost \u003d lws_get_vhost(wsi);\n-\n-\t\tif (lws_pvo_get_str(in, \u0022ads\u0022, \u0026vhd-\u003edbus_listen_ads)) {\n-\t\t\tlwsl_err(\u0022%s: pvo 'ads' must be set\u005cn\u0022, __func__);\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t\tif (create_dbus_listener(vhd, 0)) {\n-\t\t\tlwsl_err(\u0022%s: create_dbus_listener failed\u005cn\u0022, __func__);\n-\t\t\treturn -1;\n-\t\t}\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_PROTOCOL_DESTROY:\n-\t\tdestroy_dbus_server_listener(vhd);\n-\t\t/* this is required for valgrind-cleanliness */\n-\t\tdbus_shutdown();\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_ESTABLISHED:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_ESTABLISHED\u005cn\u0022);\n-\n-\t\t/*\n-\t\t * create the send ringbuffer now the ws connection is\n-\t\t * established.\n-\t\t */\n-\n-\t\twspctx \u003d lws_get_opaque_parent_data(wsi);\n-\t\tif (!wspctx)\n-\t\t\tbreak;\n-\n-\t\twspctx-\u003epss \u003d pss;\n-\t\tpss-\u003ering_out_tail \u003d 0;\n-\t\tpss-\u003ering_out \u003d lws_ring_create(sizeof(struct msg), 8,\n-\t\t\t\t\t\t destroy_message);\n-\t\tif (!pss-\u003ering_out) {\n-\t\t\tlwsl_err(\u0022OOM\u005cn\u0022);\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t\tissue_dbus_signal(wsi, \u0022Status\u0022,\n-\t\t\t\t \u0022ws client connection established\u0022);\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_WRITEABLE:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_WRITEABLE:\u005cn\u0022);\n-\n-\t\tpmsg \u003d lws_ring_get_element(pss-\u003ering_out, \u0026pss-\u003ering_out_tail);\n-\t\tif (!pmsg) {\n-\t\t\tlwsl_user(\u0022 (nothing in ring)\u005cn\u0022);\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\tflags \u003d lws_write_ws_flags(\n-\t\t\t pmsg-\u003ebinary ? LWS_WRITE_BINARY : LWS_WRITE_TEXT,\n-\t\t\t pmsg-\u003efirst, pmsg-\u003efinal);\n-\n-\t\t/* notice we allowed for LWS_PRE in the payload already */\n-\t\tm \u003d lws_write(wsi, ((unsigned char *)pmsg-\u003epayload) + LWS_PRE,\n-\t\t\t pmsg-\u003elen, flags);\n-\t\tif (m \u003c (int)pmsg-\u003elen) {\n-\t\t\tlwsl_err(\u0022ERROR %d writing to ws socket\u005cn\u0022, m);\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t\tlwsl_user(\u0022 wrote %d: flags: 0x%x first: %d final %d\u005cn\u0022,\n-\t\t\t\tm, flags, pmsg-\u003efirst, pmsg-\u003efinal);\n-\n-\t\tlws_ring_consume_single_tail(pss-\u003ering_out,\n-\t\t\t\t\t \u0026pss-\u003ering_out_tail, 1);\n-\n-\t\t/* more to do for us? */\n-\t\tif (lws_ring_get_element(pss-\u003ering_out, \u0026pss-\u003ering_out_tail))\n-\t\t\t/* come back as soon as we can write more */\n-\t\t\tlws_callback_on_writable(wsi);\n-\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_RECEIVE:\n-\n-\t\tlwsl_user(\u0022LWS_CALLBACK_CLIENT_RECEIVE: %4d \u0022\n-\t\t\t \u0022(rpp %5d, first %d, last %d, bin %d)\u005cn\u0022,\n-\t\t\t (int)len, (int)lws_remaining_packet_payload(wsi),\n-\t\t\t lws_is_first_fragment(wsi),\n-\t\t\t lws_is_final_fragment(wsi),\n-\t\t\t lws_frame_is_binary(wsi));\n-\n-\t\t{\n-\t\t\tchar strbuf[256];\n-\t\t\tsize_t l \u003d len;\n-\n-\t\t\tif (l \u003e sizeof(strbuf) - 1u)\n-\t\t\t\tl \u003d sizeof(strbuf) - 1u;\n-\n-\t\t\tmemcpy(strbuf, in, l);\n-\t\t\tstrbuf[l] \u003d '\u005c0';\n-\n-\t\t\tissue_dbus_signal(wsi, \u0022Receive\u0022, strbuf);\n-\t\t}\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tissue_dbus_signal(wsi, \u0022Status\u0022, \u0022ws client connection error\u0022);\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_CLOSED:\n-\t\tlwsl_err(\u0022LWS_CALLBACK_CLIENT_CLOSED ()\u005cn\u0022);\n-\t\tissue_dbus_signal(wsi, \u0022Status\u0022, \u0022ws client connection closed\u0022);\n-\n-\t\t/* destroy any ringbuffer and pending messages */\n-\n-\t\tlws_ring_destroy(pss-\u003ering_out);\n-\n-\t\twspctx \u003d lws_get_opaque_parent_data(wsi);\n-\t\tif (!wspctx)\n-\t\t\tbreak;\n-\n-\t\t/*\n-\t\t * the wspctx cannot refer to its child wsi any longer, it is\n-\t\t * about to go out of scope.\n-\t\t */\n-\n-\t\twspctx-\u003ecwsi \u003d NULL;\n-\t\twspctx-\u003epss \u003d NULL;\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-#define LWS_PLUGIN_PROTOCOL_MINIMAL_DBUS_WSPROXY \u005c\n-\t{ \u005c\n-\t\t\u0022lws-minimal-dbus-wsproxy\u0022, \u005c\n-\t\tcallback_minimal_dbus_wsproxy, \u005c\n-\t\tsizeof(struct pss_dbus_proxy), \u005c\n-\t\t1024, \u005c\n-\t\t0, NULL, 0 \u005c\n-\t}\ndiff --git a/minimal-examples/embedded/pico/pico-sspc-binance/README.md b/minimal-examples/embedded/pico/pico-sspc-binance/README.md\nindex 3a10cf7..fcfa519 100644\n--- a/minimal-examples/embedded/pico/pico-sspc-binance/README.md\n+++ b/minimal-examples/embedded/pico/pico-sspc-binance/README.md\n@@ -55,7 +55,7 @@ keep up.\n ## Build\n \n This builds as a toplevel project using the pcio sdk, it builds\n-lws via a symlink, and links with liblws-sspc.a rather than libwebsockets.a\n+lws via a symlink, and links with libwebsockets.a built with `-DLWS_ONLY_SSPC`\n \n Adapt `PICO_SDK_PATH` below to where your pico sdk is installed\n \n@@ -70,8 +70,9 @@ unmount it.\n \n ## Running\n \n-On the PC, you need to build lws-minimal-secure-streams-custom-proxy-transport,\n-which needs lws built with `LWS_WITHOUT_EXTENSIONS\u003d0`. This connects to\n+On the PC, you need to build `lws-minimal-ssproxy-custom-transport-uart`, from\n+`./minimal-examples/ssproxy/ssproxy-custom-transport-uart`,\n+which needs lws built with `-DLWS_WITHOUT_EXTENSIONS\u003d0`. This connects to\n `/dev/ttyUSB0` and starts the mux + SS Proxy.\n \n On the Pico, you can monitor the serial console over USB to see logs via\ndiff --git a/minimal-examples/embedded/pico/pico-sspc-binance/binance-ss.c b/minimal-examples/embedded/pico/pico-sspc-binance/binance-ss.c\nindex 688c929..065e60d 100644\n--- a/minimal-examples/embedded/pico/pico-sspc-binance/binance-ss.c\n+++ b/minimal-examples/embedded/pico/pico-sspc-binance/binance-ss.c\n@@ -28,10 +28,7 @@ typedef struct range {\n \tunsigned int\t\tsamples;\n } range_t;\n \n-typedef struct binance {\n-\tstruct lws_ss_handle \t*ss;\n-\tvoid\t\t\t*opaque_data;\n-\n+LWS_SS_USER_TYPEDEF\n \tuint64_t\t\tdata_in;\n \tuint64_t\t\tdata_in_last_sec;\n \n@@ -99,7 +96,8 @@ sul_hz_cb(lws_sorted_usec_list_t *sul)\n \t\t\t (unsigned long)((bin-\u003ee_lat_range.sum /\n \t\t\t\t\t bin-\u003ee_lat_range.samples) / 1000),\n \t\t\t bin-\u003ee_lat_range.samples,\n-\t\t\t (unsigned long)((bin-\u003edata_in - bin-\u003edata_in_last_sec) / 1024));\n+\t\t\t (unsigned long)((bin-\u003edata_in -\n+\t\t\t\t\t bin-\u003edata_in_last_sec) / 1024));\n \n \trange_reset(\u0026bin-\u003ee_lat_range);\n \trange_reset(\u0026bin-\u003eprice_range);\n@@ -217,11 +215,7 @@ binance_state(void *userobj, void *h_src, lws_ss_constate_t state,\n \treturn LWSSSSRET_OK;\n }\n \n-const lws_ss_info_t ssi_binance \u003d {\n-\t.handle_offset\t\t \u003d offsetof(binance_t, ss),\n-\t.opaque_user_data_offset \u003d offsetof(binance_t, opaque_data),\n+LWS_SS_INFO(\u0022binance\u0022, binance_t)\n \t.rx\t\t\t \u003d binance_rx,\n \t.state\t\t\t \u003d binance_state,\n-\t.user_alloc\t\t \u003d sizeof(binance_t),\n-\t.streamtype\t\t \u003d \u0022binance\u0022, /* bind to corresponding policy */\n };\ndiff --git a/minimal-examples/embedded/pico/pico-sspc-binance/get-ss.c b/minimal-examples/embedded/pico/pico-sspc-binance/get-ss.c\nindex fc01451..1df4e82 100644\n--- a/minimal-examples/embedded/pico/pico-sspc-binance/get-ss.c\n+++ b/minimal-examples/embedded/pico/pico-sspc-binance/get-ss.c\n@@ -1,7 +1,7 @@\n /*\n * pico-sspc-binance\n *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n+ * Written in 2010 - 2021 by Andy Green \u003candy@warmcat.com\u003e\n *\n * This file is made available under the Creative Commons CC0 1.0\n * Universal Public Domain Dedication.\n@@ -12,10 +12,7 @@\n \n #include \u0022private.h\u0022\n \n-typedef struct {\n-\tstruct lws_ss_handle \t*ss;\n-\tvoid\t\t\t*opaque_data;\n-\n+LWS_SS_USER_TYPEDEF\n \tlws_sorted_usec_list_t\tsul5;\n } get_t;\n \n@@ -24,9 +21,8 @@ sul_start_get(lws_sorted_usec_list_t *sul)\n {\n \tget_t *g \u003d lws_container_of(sul, get_t, sul5);\n \n-\tlwsl_ss_notice(g-\u003ess, \u0022conn\u0022);\n-\tlws_ss_request_tx(g-\u003ess);\n-\tlws_sul_schedule(lws_ss_get_context(g-\u003ess), 0, sul, sul_start_get,\n+\tlws_ss_request_tx(lws_ss_from_user(g));\n+\tlws_sul_schedule(lws_ss_cx_from_user(g), 0, sul, sul_start_get,\n \t\t\t 5 * LWS_US_PER_SEC);\n }\n \n@@ -35,7 +31,7 @@ get_rx(void *userobj, const uint8_t *in, size_t len, int flags)\n {\n \tget_t *g \u003d (get_t *)userobj;\n \n-\tlwsl_ss_notice(g-\u003ess, \u0022RX %u, flags 0x%x\u0022,\n+\tlwsl_ss_notice(lws_ss_from_user(g), \u0022RX %u, flags 0x%x\u0022,\n \t\t (unsigned int)len, (unsigned int)flags);\n \n \tif (len) {\n@@ -53,18 +49,12 @@ get_state(void *userobj, void *h_src, lws_ss_constate_t state,\n {\n \tget_t *g \u003d (get_t *)userobj;\n \n-\tlwsl_ss_notice(g-\u003ess, \u0022%s (%d), ord 0x%x\u0022,\n+\tlwsl_ss_notice(lws_ss_from_user(g), \u0022%s (%d), ord 0x%x\u0022,\n \t\t lws_ss_state_name((int)state), state, (unsigned int)ack);\n \n \tswitch (state) {\n \tcase LWSSSCS_CREATING:\n-\t\t/*\n-\t\t * ... also let's start a sul that creates a second stream to\n-\t\t * GET from libwebsockets.org every 5s, showing we are running\n-\t\t * multiple SS on the transport successfully.\n-\t\t */\n-\n-\t\tlws_sul_schedule(lws_ss_get_context(g-\u003ess), 0, \u0026g-\u003esul5,\n+\t\tlws_sul_schedule(lws_ss_cx_from_user(g), 0, \u0026g-\u003esul5,\n \t\t\t\t sul_start_get, 5 * LWS_US_PER_SEC);\n \t\tbreak;\n \tcase LWSSSCS_DESTROYING:\n@@ -75,11 +65,7 @@ get_state(void *userobj, void *h_src, lws_ss_constate_t state,\n \treturn LWSSSSRET_OK;\n }\n \n-const lws_ss_info_t ssi_get \u003d {\n-\t.handle_offset\t\t \u003d offsetof(get_t, ss),\n-\t.opaque_user_data_offset \u003d offsetof(get_t, opaque_data),\n+LWS_SS_INFO(\u0022mintest-lws\u0022, get_t)\n \t.rx\t\t\t \u003d get_rx,\n \t.state\t\t\t \u003d get_state,\n-\t.user_alloc\t\t \u003d sizeof(get_t),\n-\t.streamtype\t\t \u003d \u0022mintest-lws\u0022, /* bind to this policy */\n };\ndiff --git a/minimal-examples/embedded/pico/pico-sspc-binance/main.c b/minimal-examples/embedded/pico/pico-sspc-binance/main.c\nindex b2e56da..864924a 100644\n--- a/minimal-examples/embedded/pico/pico-sspc-binance/main.c\n+++ b/minimal-examples/embedded/pico/pico-sspc-binance/main.c\n@@ -79,12 +79,12 @@ main(void)\n \t * mux -\u003e transport -\u003e proxy -\u003e binance wss\n \t */\n \n-\tif (lws_ss_create(\u0026cx, 0, \u0026ssi_binance, NULL, NULL, NULL, NULL)) {\n+\tif (lws_ss_create(\u0026cx, 0, \u0026ssi_binance_t, NULL, NULL, NULL, NULL)) {\n \t\tprintf(\u0022failed to create binance secure stream\u005cn\u0022);\n \t\treturn 1;\n \t}\n \n-\tif (lws_ss_create(\u0026cx, 0, \u0026ssi_get, NULL, NULL, NULL, NULL)) {\n+\tif (lws_ss_create(\u0026cx, 0, \u0026ssi_get_t, NULL, NULL, NULL, NULL)) {\n \t\tprintf(\u0022failed to create get secure stream\u005cn\u0022);\n \t\treturn 1;\n \t}\ndiff --git a/minimal-examples/embedded/pico/pico-sspc-binance/private.h b/minimal-examples/embedded/pico/pico-sspc-binance/private.h\nindex 11949b9..5d061d3 100644\n--- a/minimal-examples/embedded/pico/pico-sspc-binance/private.h\n+++ b/minimal-examples/embedded/pico/pico-sspc-binance/private.h\n@@ -40,5 +40,5 @@ void serial_handle_events(lws_transport_mux_t *tm);\n \n /* our SS bindings */\n \n-extern const lws_ss_info_t ssi_binance; /* binance-ss.c */\n-extern const lws_ss_info_t ssi_get;\t /* get-ss.c */\n+extern const lws_ss_info_t ssi_binance_t, /* binance-ss.c */\n+\t\t\t ssi_get_t;\t /* get-ss.c */\ndiff --git a/minimal-examples/gtk/minimal-gtk/CMakeLists.txt b/minimal-examples/gtk/minimal-gtk/CMakeLists.txt\ndeleted file mode 100644\nindex 27587f4..0000000\n--- a/minimal-examples/gtk/minimal-gtk/CMakeLists.txt\n+++ /dev/null\n@@ -1,47 +0,0 @@\n-project(lws-minimal-gtk C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-gtk)\n-set(SRCS main.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_SERVER 1 requirements)\n-require_lws_config(LWS_WITH_GLIB 1 requirements)\n-require_lws_config(LWS_WITH_GTK 1 requirements)\n-\n-if (requirements)\n-\n-# gtk pieces\n-\t\n-\tinclude (FindPkgConfig)\n-\t\n-\tset(LWS_GTK_INCLUDE_DIRS CACHE PATH \u0022Path to the gtk include directory\u0022)\n-\tset(LWS_GTK_LIBRARIES CACHE PATH \u0022Path to the gtk library\u0022)\n-\tPKG_SEARCH_MODULE(LWS_GTK2 gtk+-3.0)\n-\tif (LWS_GTK2_FOUND)\n-\t\tlist(APPEND LWS_GTK_INCLUDE_DIRS \u0022${LWS_GTK2_INCLUDE_DIRS}\u0022)\n-\t\tlist(APPEND LWS_GTK_LIBRARIES \u0022${LWS_GTK2_LIBRARIES}\u0022)\n-\tendif()\n-\tmessage(\u0022gtk include dir: ${LWS_GTK_INCLUDE_DIRS}\u0022)\n-\tmessage(\u0022gtk libraries: ${LWS_GTK_LIBRARIES}\u0022)\n-\tinclude_directories(\u0022${LWS_GTK_INCLUDE_DIRS}\u0022)\n-\tset(extralibs ${extralibs} ${LWS_GTK_LIBRARIES})\n-\t\n-\t\n-\t\n-\tmessage(\u0022Extra libs: ${extralibs}\u0022)\n-\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${extralibs} ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${extralibs} ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/gtk/minimal-gtk/README.md b/minimal-examples/gtk/minimal-gtk/README.md\ndeleted file mode 100644\nindex f85e594..0000000\n--- a/minimal-examples/gtk/minimal-gtk/README.md\n+++ /dev/null\n@@ -1,32 +0,0 @@\n-# lws minimal http client gtk\n-\n-The application goes to https://warmcat.com and receives the page data,\n-from inside a gtk app using gtk / glib main loop directly.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-\n-```\n-$\n-t1_main: started\n-[2020/02/08 18:04:07:6647] N: Loading client CA for verification ./warmcat.com.cer\n-[2020/02/08 18:04:07:7744] U: Connected to 46.105.127.147, http response: 200\n-[2020/02/08 18:04:07:7762] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2020/02/08 18:04:07:7762] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2020/02/08 18:04:07:7928] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2020/02/08 18:04:07:7929] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2020/02/08 18:04:07:7956] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2020/02/08 18:04:07:7956] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2020/02/08 18:04:07:7956] U: RECEIVE_CLIENT_HTTP_READ: read 1971\n-[2020/02/08 18:04:07:7956] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n-Hello World\n-$\n-```\n-\n-\ndiff --git a/minimal-examples/gtk/minimal-gtk/main.c b/minimal-examples/gtk/minimal-gtk/main.c\ndeleted file mode 100644\nindex 56f234c..0000000\n--- a/minimal-examples/gtk/minimal-gtk/main.c\n+++ /dev/null\n@@ -1,211 +0,0 @@\n-#include \u003cgtk/gtk.h\u003e\n-#include \u003clibwebsockets.h\u003e\n-\n-static int status \u003d 0;\n-\n-static void\n-print_hello(GtkWidget *widget, gpointer data)\n-{\n-\tg_print(\u0022Hello World\u005cn\u0022);\n-}\n-\n-static void\n-activate(GtkApplication *app, gpointer user_data)\n-{\n-\tGtkWidget *window;\n-\tGtkWidget *button, *bbox;\n-\n-\twindow \u003d gtk_application_window_new(app);\n-\tgtk_window_set_title(GTK_WINDOW(window), \u0022mywindow\u0022);\n-\tgtk_window_set_default_size(GTK_WINDOW(window), 200, 200);\n-\n-\tbbox \u003d gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);\n-\tgtk_container_add(GTK_CONTAINER(window), bbox);\n-\n-\tbutton \u003d gtk_button_new_with_label(\u0022Hello World\u0022);\n-\tg_signal_connect(button, \u0022clicked\u0022, G_CALLBACK(print_hello), NULL);\n-\tg_signal_connect_swapped(button, \u0022clicked\u0022,\n-\t\t\t\t G_CALLBACK(gtk_widget_destroy), window);\n-\tgtk_container_add(GTK_CONTAINER(bbox), button);\n-\n-\tgtk_widget_show_all(window);\n-}\n-\n-static int\n-system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n-\t\t int current, int target)\n-{\n-\tstruct lws_context *context \u003d mgr-\u003eparent;\n-\tstruct lws_client_connect_info i;\n-\n-\tif (current !\u003d LWS_SYSTATE_OPERATIONAL ||\n-\t target !\u003d LWS_SYSTATE_OPERATIONAL)\n-\t\treturn 0;\n-\n-\tlwsl_notice(\u0022%s: operational\u005cn\u0022, __func__);\n-\n-\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n-\ti.context \u003d context;\n-\ti.ssl_connection \u003d LCCSCF_USE_SSL | LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n-\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n-\ti.port \u003d 443;\n-\ti.address \u003d \u0022warmcat.com\u0022;\n-\ti.path \u003d \u0022/\u0022;\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\ti.method \u003d \u0022GET\u0022;\n-\n-\ti.protocol \u003d \u0022http\u0022;\n-\n-\treturn !lws_client_connect_via_info(\u0026i);\n-}\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t void *user, void *in, size_t len)\n-{\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buf[128];\n-\n-\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n-\t\t\tstatus \u003d lws_http_client_http_response(wsi);\n-\n-\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n-\t\t\t\t\tbuf, status);\n-\t\t}\n-\t\tbreak;\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{\n-\t\t\u0022http\u0022,\n-\t\tcallback_http,\n-\t\t0,\n-\t\t0,\n-\t},\n-\t{ NULL, NULL, 0, 0 }\n-};\n-\n-static gpointer\n-t1_main (gpointer user_data)\n-{\n-\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n-\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n-\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n-\tGMainContext *t1_mc \u003d (GMainContext *)user_data;\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tvoid *foreign_loops[1];\n-\tGMainLoop *ml;\n-\n-\tg_print(\u0022%s: started\u005cn\u0022, __func__);\n-\n-\tg_main_context_push_thread_default(t1_mc);\n-\n-\tml \u003d g_main_loop_new(t1_mc, FALSE);\n-\n-\t/* attach our lws activities to the main loop of this thread */\n-\n-\tlws_set_log_level(LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, NULL);\n-\tmemset(\u0026info, 0, sizeof info);\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n-\t\t LWS_SERVER_OPTION_GLIB;\n-\tinfo.protocols \u003d protocols;\n-\tforeign_loops[0] \u003d (void *)ml;\n-\tinfo.foreign_loops \u003d foreign_loops;\n-\tinfo.register_notifier_list \u003d na;\n-\n-#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n-\t/*\n-\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n-\t * CA to trust explicitly.\n-\t */\n-\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n-#endif\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn NULL;\n-\t}\n-\n-\t/*\n-\t * We created the lws_context and bound it to this thread's main loop,\n-\t * let's run the thread's main loop now...\n-\t */\n-\n-\tg_main_loop_run(ml);\n-\tg_main_loop_unref(ml);\n-\n-\tg_main_context_pop_thread_default(t1_mc);\n-\tg_main_context_unref(t1_mc);\n-\n-\tg_print(\u0022%s: ending\u005cn\u0022, __func__);\n-\n-\tlws_context_destroy(context);\n-\n-\treturn NULL;\n-}\n-\n-int\n-main(int argc, char **argv)\n-{\n-\tGMainContext *t1_mc \u003d g_main_context_new();\n-\tGtkApplication *app;\n-\tGThread *t1;\n-\tint status;\n-\n-\tt1 \u003d g_thread_new (\u0022t1\u0022, t1_main, g_main_context_ref (t1_mc));\n-\t(void)t1;\n-\n-\tapp \u003d gtk_application_new(\u0022org.gtk.example\u0022, G_APPLICATION_FLAGS_NONE);\n-\tg_signal_connect(app, \u0022activate\u0022, G_CALLBACK(activate), NULL);\n-\n-\tstatus \u003d g_application_run(G_APPLICATION(app), argc, argv);\n-\tg_object_unref(app);\n-\n-\treturn status;\n-}\n-\ndiff --git a/minimal-examples/gtk/minimal-gtk/warmcat.com.cer b/minimal-examples/gtk/minimal-gtk/warmcat.com.cer\ndeleted file mode 100644\nindex 01ad0dc..0000000\n--- a/minimal-examples/gtk/minimal-gtk/warmcat.com.cer\n+++ /dev/null\n@@ -1,32 +0,0 @@\n------BEGIN CERTIFICATE-----\n-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n------END CERTIFICATE-----\n-\ndiff --git a/minimal-examples/http-client/README.md b/minimal-examples/http-client/README.md\ndeleted file mode 100644\nindex fc56f6c..0000000\n--- a/minimal-examples/http-client/README.md\n+++ /dev/null\n@@ -1,8 +0,0 @@\n-|name|demonstrates|\n----|---\n-minimal-http-client-certinfo|Shows how to gain detailed information on the peer certificate\n-minimal-http-client-custom-headers|Shows how to send and receive custom headers (h1 only)\n-minimal-http-client-hugeurl|Sends a \u003e 2.5KB URL to warmcat.com\n-minimal-http-client-multi|Connects to and reads https://warmcat.com, 8 times concurrently\n-minimal-http-client-post|POSTs a form containing an uploaded file and a form variable, and captures the response\n-minimal-http-client|Connects to and reads https://warmcat.com\ndiff --git a/minimal-examples/http-client/minimal-http-client-attach/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client-attach/CMakeLists.txt\ndeleted file mode 100644\nindex 909efca..0000000\n--- a/minimal-examples/http-client/minimal-http-client-attach/CMakeLists.txt\n+++ /dev/null\n@@ -1,26 +0,0 @@\n-project(lws-minimal-http-client-attach C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckIncludeFile)\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-http-client-attach)\n-set(SRCS minimal-http-client-attach.c)\n-\n-set(requirements 1)\n-require_pthreads(requirements)\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-\n-if (requirements AND NOT WIN32)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${PTHREAD_LIB} ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/http-client/minimal-http-client-attach/README.md b/minimal-examples/http-client/minimal-http-client-attach/README.md\ndeleted file mode 100644\nindex 81d6310..0000000\n--- a/minimal-examples/http-client/minimal-http-client-attach/README.md\n+++ /dev/null\n@@ -1,35 +0,0 @@\n-# lws minimal http client attach\n-\n-This demonstrates how other threads can reach out to an existing lws_context\n-and join its event loop cleanly and safely.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-Pthreads is required on your system.\n-\n-## usage\n-\n-```\n- $ ./lws-minimal-http-client-attach\n-[2019/12/31 18:30:49:3495] U: main: main thread tid 0x503e1c0\n-[2019/12/31 18:30:50:3584] U: LWS minimal http client attach\n-[2019/12/31 18:30:50:4002] U: lws_create: tid 0x5c41700\n-[2019/12/31 18:30:50:5727] E: callback_ntpc: set up system ops for set_clock\n-[2019/12/31 18:30:50:2110] N: callback_ntpc: Unix time: 1577817053\n-[2019/12/31 18:30:50:2136] U: attach_callback: called from tid 0x5c41700\n-[2019/12/31 18:30:51:8733] U: Connected to 46.105.127.147, http response: 200\n-[2019/12/31 18:30:51:8818] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2019/12/31 18:30:51:8823] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2019/12/31 18:30:51:8846] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2019/12/31 18:30:51:8847] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2019/12/31 18:30:51:8855] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2019/12/31 18:30:51:8856] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2019/12/31 18:30:51:8860] U: RECEIVE_CLIENT_HTTP_READ: read 1971\n-[2019/12/31 18:30:51:8873] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n-[2019/12/31 18:30:51:9629] U: main: finished\n-```\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-attach/minimal-http-client-attach.c b/minimal-examples/http-client/minimal-http-client-attach/minimal-http-client-attach.c\ndeleted file mode 100644\nindex 460f946..0000000\n--- a/minimal-examples/http-client/minimal-http-client-attach/minimal-http-client-attach.c\n+++ /dev/null\n@@ -1,276 +0,0 @@\n-/*\n- * lws-minimal-http-client-attach\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates how to use the lws_system (*attach) api to allow a\n- * different thread to arrange to join an existing lws event loop safely. The\n- * attached stuff does an http client GET from the lws event loop, even though\n- * it was originally requested from a different thread than the lws event loop.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-#if defined(WIN32)\n-#define HAVE_STRUCT_TIMESPEC\n-#if defined(pid_t)\n-#undef pid_t\n-#endif\n-#endif\n-#include \u003cpthread.h\u003e\n-\n-static struct lws_context *context;\n-static pthread_t lws_thread;\n-static pthread_mutex_t lock;\n-static int interrupted, bad \u003d 1, status;\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t void *user, void *in, size_t len)\n-{\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tinterrupted \u003d 1;\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buf[128];\n-\n-\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n-\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n-\n-\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n-\t\t\t\t\tbuf, status);\n-\t\t}\n-\t\tbreak;\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-\n-#if 0 /* enable to dump the html */\n-\t\t{\n-\t\t\tconst char *p \u003d in;\n-\n-\t\t\twhile (len--)\n-\t\t\t\tif (*p \u003c 0x7f)\n-\t\t\t\t\tputchar(*p++);\n-\t\t\t\telse\n-\t\t\t\t\tputchar('.');\n-\t\t}\n-#endif\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{\n-\t\t\u0022http\u0022,\n-\t\tcallback_http,\n-\t\t0, 0, 0, NULL, 0\n-\t},\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-static void\n-attach_callback(struct lws_context *context, int tsi, void *opaque)\n-{\n-\tstruct lws_client_connect_info i;\n-\n-\t/*\n-\t * Even though it was asked for from a different thread, we are called\n-\t * back by lws from the lws event loop thread context\n-\t *\n-\t * We can set up our operations on the lws event loop and return so\n-\t * they can happen asynchronously\n-\t */\n-\n-\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n-\ti.context \u003d context;\n-\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n-\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n-\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n-\ti.port \u003d 443;\n-\ti.address \u003d \u0022warmcat.com\u0022;\n-\ti.path \u003d \u0022/\u0022;\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\ti.method \u003d \u0022GET\u0022;\n-\n-\ti.protocol \u003d protocols[0].name;\n-\n-\tlws_client_connect_via_info(\u0026i);\n-}\n-\n-\n-static int\n-lws_attach_with_pthreads_locking(struct lws_context *context, int tsi,\n-\t\t\t\t lws_attach_cb_t cb, lws_system_states_t state,\n-\t\t\t\t void *opaque, struct lws_attach_item **get)\n-{\n-\tint n;\n-\n-\tpthread_mutex_lock(\u0026lock);\n-\t/*\n-\t * We just provide system-specific locking around the lws non-threadsafe\n-\t * helper that adds and removes things from the pt list\n-\t */\n-\tn \u003d __lws_system_attach(context, tsi, cb, state, opaque, get);\n-\tpthread_mutex_unlock(\u0026lock);\n-\n-\treturn n;\n-}\n-\n-\n-lws_system_ops_t ops \u003d {\n-\t.attach \u003d lws_attach_with_pthreads_locking\n-};\n-\n-/*\n- * We made this into a different thread to model it being run from completely\n- * different codebase that's all linked together\n- */\n-\n-static void *\n-lws_create(void *d)\n-{\n-\tstruct lws_context_creation_info info;\n-\n- lwsl_user(\u0022%s: tid %p\u005cn\u0022, __func__, (void *)(intptr_t)pthread_self());\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\tinfo.system_ops \u003d \u0026ops;\n-\tinfo.protocols \u003d protocols;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\tgoto bail;\n-\t}\n-\n-\t/* start the event loop */\n-\n-\twhile (!interrupted)\n-\t\tif (lws_service(context, 0))\n-\t\t\tinterrupted \u003d 1;\n-\n-\tlws_context_destroy(context);\n-\n-bail:\n-\tpthread_exit(NULL);\n-\n-\treturn NULL;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tconst char *p;\n-\tvoid *retval;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS minimal http client attach\u005cn\u0022);\n-\n-\tpthread_mutex_init(\u0026lock, NULL);\n-\n-\t/*\n-\t * The idea of the example is we're going to split the lws context and\n-\t * event loop off to be created from its own thread... this is like it\n-\t * was actually started by some completely different code...\n-\t */\n-\n-\tif (pthread_create(\u0026lws_thread, NULL, lws_create, NULL)) {\n-\t\tlwsl_err(\u0022thread creation failed\u005cn\u0022);\n-\t\tgoto bail1;\n-\t}\n-\n-\t/*\n-\t * Now on the original / different thread representing a different\n-\t * codebase that wants to join this existing event loop, we'll ask to\n-\t * get a callback from the event loop context when the event loop\n-\t * thread is operational. We have to wait around a bit because we\n-\t * may run before the lws context was created.\n-\t */\n-\n-\twhile (!context \u0026\u0026 n++ \u003c 30)\n-\t\tusleep(10000);\n-\n-\tif (!context) {\n-\t\tlwsl_err(\u0022%s: context didn't start\u005cn\u0022, __func__);\n-\t\tgoto bail;\n-\t}\n-\n-\t/*\n-\t * From our different, non event loop thread, ask for our attach\n-\t * callback to get called when lws system state is OPERATIONAL\n-\t */\n-\n-\tlws_system_get_ops(context)-\u003eattach(context, 0, attach_callback,\n-\t\t\t\t\t LWS_SYSTATE_OPERATIONAL,\n-\t\t\t\t\t NULL, NULL);\n-\n-\t/*\n-\t * That's all we wanted to do with our thread. Just wait for the lws\n-\t * thread to exit as well.\n-\t */\n-\n-bail:\n-\tpthread_join(lws_thread, \u0026retval);\n-bail1:\n-\tpthread_mutex_destroy(\u0026lock);\n-\n-\tlwsl_user(\u0022%s: finished\u005cn\u0022, __func__);\n-\n-\treturn 0;\n-}\ndiff --git a/minimal-examples/http-client/minimal-http-client-captive-portal/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client-captive-portal/CMakeLists.txt\ndeleted file mode 100644\nindex e7be79a..0000000\n--- a/minimal-examples/http-client/minimal-http-client-captive-portal/CMakeLists.txt\n+++ /dev/null\n@@ -1,27 +0,0 @@\n-project(lws-minimal-http-client-captive-portal C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckIncludeFile)\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-http-client-captive-portal)\n-set(SRCS minimal-http-client-captive-portal.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_TLS 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n-\n-if (NOT WIN32 AND requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared pthread ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets pthread ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/http-client/minimal-http-client-captive-portal/README.md b/minimal-examples/http-client/minimal-http-client-captive-portal/README.md\ndeleted file mode 100644\nindex 8db2002..0000000\n--- a/minimal-examples/http-client/minimal-http-client-captive-portal/README.md\n+++ /dev/null\n@@ -1,45 +0,0 @@\n-# lws minimal http client captive portal detect\n-\n-This demonstrates how to perform captive portal detection integrated\n-with `lws_system` states.\n-\n-After reaching the `lws_system` DHCP state, the application tries to\n-connect through to `http://connectivitycheck.android.com/generate_204`\n-over http... if it succeeds, it will get a 204 response and set the\n-captive portal detection state to `LWS_CPD_INTERNET_OK` and perform\n-a GET from warmcat.com.\n-\n-If there is a problem detected, the captive portal detection state is\n-set accordingly and the app will respond by exiting without trying the\n-read from warmcat.com.\n-\n-The captive portal detection scheme is implemented in the user code\n-and can be modified according to the strategy that's desired for\n-captive portal detection.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-```\n-$ ./bin/lws-minimal-http-client-captive-portal\n-[2020/03/11 13:07:07:4519] U: LWS minimal http client captive portal detect\n-[2020/03/11 13:07:07:4519] N: lws_create_context: using ss proxy bind '(null)', port 0, ads '(null)'\n-[2020/03/11 13:07:07:5022] U: callback_cpd_http: established with resp 204\n-[2020/03/11 13:07:07:5023] U: app_system_state_nf: OPERATIONAL, cpd 1\n-[2020/03/11 13:07:07:5896] U: Connected to 46.105.127.147, http response: 200\n-[2020/03/11 13:07:07:5931] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2020/03/11 13:07:07:5931] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2020/03/11 13:07:07:6092] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2020/03/11 13:07:07:6092] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2020/03/11 13:07:07:6112] U: RECEIVE_CLIENT_HTTP_READ: read 4087\n-[2020/03/11 13:07:07:6113] U: RECEIVE_CLIENT_HTTP_READ: read 4096\n-[2020/03/11 13:07:07:6113] U: RECEIVE_CLIENT_HTTP_READ: read 2657\n-[2020/03/11 13:07:07:6113] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n-[2020/03/11 13:07:07:6119] U: main: finished OK\n-```\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c b/minimal-examples/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c\ndeleted file mode 100644\nindex d9a00bc..0000000\n--- a/minimal-examples/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c\n+++ /dev/null\n@@ -1,321 +0,0 @@\n-/*\n- * lws-minimal-http-client-captive-portal\n- *\n- * Written in 2010-2020 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates how to use the lws_system captive portal detect integration\n- *\n- * We check for a captive portal by doing a GET from\n- * http://connectivitycheck.android.com/generate_204, if we really are going\n- * out on the Internet he'll return with a 204 response code and we will\n- * understand there's no captive portal. If we get something else, we take it\n- * there is a captive portal.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static struct lws_context *context;\n-static int interrupted, bad \u003d 1, status;\n-static lws_state_notify_link_t nl;\n-\n-/*\n- * this is the user code http handler\n- */\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t void *user, void *in, size_t len)\n-{\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tinterrupted \u003d 1;\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buf[128];\n-\n-\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n-\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n-\n-\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n-\t\t\t\t\tbuf, status);\n-\t\t}\n-\t\tbreak;\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-\n-#if 0 /* enable to dump the html */\n-\t\t{\n-\t\t\tconst char *p \u003d in;\n-\n-\t\t\twhile (len--)\n-\t\t\t\tif (*p \u003c 0x7f)\n-\t\t\t\t\tputchar(*p++);\n-\t\t\t\telse\n-\t\t\t\t\tputchar('.');\n-\t\t}\n-#endif\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-/*\n- * This is the platform's custom captive portal detection handler\n- */\n-\n-static int\n-callback_cpd_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t\t void *user, void *in, size_t len)\n-{\n-\tint resp;\n-\n-\tswitch (reason) {\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\tresp \u003d (int)lws_http_client_http_response(wsi);\n-\t\tif (!resp)\n-\t\t\tbreak;\n-\t\tlwsl_user(\u0022%s: established with resp %d\u005cn\u0022, __func__, resp);\n-\t\tswitch (resp) {\n-\n-\t\tcase HTTP_STATUS_NO_CONTENT:\n-\t\t\t/*\n-\t\t\t * We got the 204 which is used to distinguish the real\n-\t\t\t * endpoint\n-\t\t\t */\n-\t\t\tlws_system_cpd_set(lws_get_context(wsi),\n-\t\t\t\t\t LWS_CPD_INTERNET_OK);\n-\t\t\treturn 0;\n-\n-\t\t/* also case HTTP_STATUS_OK: ... */\n-\t\tdefault:\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\t/* fallthru */\n-\n-\tcase LWS_CALLBACK_CLIENT_HTTP_REDIRECT:\n-\t\tlws_system_cpd_set(lws_get_context(wsi), LWS_CPD_CAPTIVE_PORTAL);\n-\t\t/* don't follow it, just report it */\n-\t\treturn 1;\n-\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\t/* only the first result counts */\n-\t\tlws_system_cpd_set(lws_get_context(wsi), LWS_CPD_NO_INTERNET);\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{\n-\t\t\u0022http\u0022,\n-\t\tcallback_http,\n-\t\t0, 0, 0, NULL, 0\n-\t}, {\n-\t\t\u0022lws-cpd-http\u0022,\n-\t\tcallback_cpd_http,\n-\t\t0, 0, 0, NULL, 0\n-\t},\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-void sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-/*\n- * This triggers our platform implementation of captive portal detection, the\n- * actual test can be whatever you need.\n- *\n- * In this example, we detect it using Android's\n- *\n- * http://connectivitycheck.android.com/generate_204\n- *\n- * and seeing if we get an http 204 back.\n- */\n-\n-static int\n-captive_portal_detect_request(struct lws_context *context)\n-{\n-\tstruct lws_client_connect_info i;\n-\n-\tmemset(\u0026i, 0, sizeof i);\n-\ti.context \u003d context;\n-\ti.port \u003d 80;\n-\ti.address \u003d \u0022connectivitycheck.android.com\u0022;\n-\ti.path \u003d \u0022/generate_204\u0022;\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\ti.method \u003d \u0022GET\u0022;\n-\n-\ti.protocol \u003d \u0022lws-cpd-http\u0022;\n-\n-\treturn !lws_client_connect_via_info(\u0026i);\n-}\n-\n-\n-lws_system_ops_t ops \u003d {\n-\t.captive_portal_detect_request \u003d captive_portal_detect_request\n-};\n-\n-\n-static int\n-app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n-\t\t int current, int target)\n-{\n-\tstruct lws_context *cx \u003d lws_system_context_from_system_mgr(mgr);\n-\n-\tswitch (target) {\n-\tcase LWS_SYSTATE_CPD_PRE_TIME:\n-\t\tif (lws_system_cpd_state_get(cx))\n-\t\t\treturn 0; /* allow it */\n-\n-\t\tlwsl_info(\u0022%s: LWS_SYSTATE_CPD_PRE_TIME\u005cn\u0022, __func__);\n-\t\tlws_system_cpd_start(cx);\n-\t\t/* we'll move the state on when we get a result */\n-\t\treturn 1;\n-\n-\tcase LWS_SYSTATE_OPERATIONAL:\n-\t\tif (current \u003d\u003d LWS_SYSTATE_OPERATIONAL) {\n-\t\t\tstruct lws_client_connect_info i;\n-\n-\t\t\tlwsl_user(\u0022%s: OPERATIONAL, cpd %d\u005cn\u0022, __func__,\n-\t\t\t\t\tlws_system_cpd_state_get(cx));\n-\n-\t\t\t/*\n-\t\t\t * When we reach the OPERATIONAL lws_system state, we\n-\t\t\t * can do our main job knowing we have DHCP, ntpclient,\n-\t\t\t * captive portal testing done.\n-\t\t\t */\n-\n-\t\t\tif (lws_system_cpd_state_get(cx) !\u003d LWS_CPD_INTERNET_OK) {\n-\t\t\t\tlwsl_warn(\u0022%s: There's no internet...\u005cn\u0022, __func__);\n-\t\t\t\tinterrupted \u003d 1;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\n-\t\t\tmemset(\u0026i, 0, sizeof i);\n-\t\t\ti.context \u003d context;\n-\t\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n-\t\t\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n-\t\t\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n-\t\t\ti.port \u003d 443;\n-\t\t\ti.address \u003d \u0022warmcat.com\u0022;\n-\t\t\ti.path \u003d \u0022/\u0022;\n-\t\t\ti.host \u003d i.address;\n-\t\t\ti.origin \u003d i.address;\n-\t\t\ti.method \u003d \u0022GET\u0022;\n-\n-\t\t\ti.protocol \u003d protocols[0].name;\n-\n-\t\t\tlws_client_connect_via_info(\u0026i);\n-\t\t\tbreak;\n-\t\t}\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static lws_state_notify_link_t * const app_notifier_list[] \u003d {\n-\t\u0026nl, NULL\n-};\n-\n-/*\n- * We made this into a different thread to model it being run from completely\n- * different codebase that's all linked together\n- */\n-\n-\n-int main(int argc, const char **argv)\n-{\n-\tint logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;\n-\tstruct lws_context_creation_info info;\n-\tconst char *p;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS minimal http client captive portal detect\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info);\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN;\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\tinfo.system_ops \u003d \u0026ops;\n-\tinfo.protocols \u003d protocols;\n-\n-\t/* integrate us with lws system state management when context created */\n-\n-\tnl.name \u003d \u0022app\u0022;\n-\tnl.notify_cb \u003d app_system_state_nf;\n-\tinfo.register_notifier_list \u003d app_notifier_list;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\twhile (!interrupted)\n-\t\tif (lws_service(context, 0))\n-\t\t\tinterrupted \u003d 1;\n-\n-\tlws_context_destroy(context);\n-\n-\tlwsl_user(\u0022%s: finished %s\u005cn\u0022, __func__, bad ? \u0022FAIL\u0022: \u0022OK\u0022);\n-\n-\treturn bad;\n-}\ndiff --git a/minimal-examples/http-client/minimal-http-client-certinfo/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client-certinfo/CMakeLists.txt\ndeleted file mode 100644\nindex 07ff4e2..0000000\n--- a/minimal-examples/http-client/minimal-http-client-certinfo/CMakeLists.txt\n+++ /dev/null\n@@ -1,25 +0,0 @@\n-project(lws-minimal-http-client-certinfo C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-http-client-certinfo)\n-set(SRCS minimal-http-client-certinfo.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-require_lws_config(LWS_WITH_TLS 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/http-client/minimal-http-client-certinfo/README.md b/minimal-examples/http-client/minimal-http-client-certinfo/README.md\ndeleted file mode 100644\nindex ff6ada4..0000000\n--- a/minimal-examples/http-client/minimal-http-client-certinfo/README.md\n+++ /dev/null\n@@ -1,77 +0,0 @@\n-# lws minimal http client certinfo\n-\n-This demonstrates how to dump information from the peer\n-certificate largely independent of the tls backend.\n-\n-The application goes to https://warmcat.com and receives the page data.\n-\n-Before receiving the page it dumps information on the server's cert.\n-\n-This works independently of the tls backend being OpenSSL or mbedTLS.\n-\n-However the public keys cannot be compared between the two tls\n-backends, since they produce different representations.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--l| Connect to https://localhost:7681 and accept selfsigned cert\n---h1|Specify http/1.1 only using ALPN, rejects h2 even if server supports it\n-\n-```\n- $ ./lws-minimal-http-client-certinfo\n-[2018/04/05 21:39:26:5882] USER: LWS minimal http client\n-[2018/04/05 21:39:26:5897] NOTICE: Creating Vhost 'default' (serving disabled), 1 protocols, IPv6 on\n-[2018/04/05 21:39:26:5955] NOTICE: created client ssl context for default\n-[2018/04/05 21:39:28:0824] NOTICE: lws_http_client_http_response 200\n-[2018/04/05 21:39:28:0824] NOTICE: Peer Cert CN : warmcat.com\n-[2018/04/05 21:39:28:0824] NOTICE: Peer Cert issuer : /C\u003dGB/ST\u003dGreater Manchester/L\u003dSalford/O\u003dCOMODO CA Limited\n-[2018/04/05 21:39:28:0825] NOTICE: Peer Cert Valid from: Mon Nov 3 00:00:00 2014\n-[2018/04/05 21:39:28:0825] NOTICE: Peer Cert Valid to : Sat Nov 2 23:59:59 2019\n-[2018/04/05 21:39:28:0825] NOTICE: Peer Cert usage bits: 0xa0\n-[2018/04/05 21:39:28:0825] NOTICE: Peer Cert public key:\n-[2018/04/05 21:39:28:0825] NOTICE: \n-[2018/04/05 21:39:28:0825] NOTICE: 0000: 30 82 01 22 30 0D 06 09 2A 86 48 86 F7 0D 01 01 0..\u00220...*.H.....\n-[2018/04/05 21:39:28:0825] NOTICE: 0010: 01 05 00 03 82 01 0F 00 30 82 01 0A 02 82 01 01 ........0.......\n-[2018/04/05 21:39:28:0825] NOTICE: 0020: 00 EC 39 C1 98 25 A8 99 AC 01 9B D2 16 C0 CA A3 ..9..%..........\n-[2018/04/05 21:39:28:0825] NOTICE: 0030: 0E 19 57 E5 3D 23 F3 79 7E 63 BF CD B8 88 D1 16 ..W.\u003d#.y~c......\n-[2018/04/05 21:39:28:0825] NOTICE: 0040: C6 F0 A6 ED 66 CB F3 C3 D6 7E A7 A3 AB 00 0A 3E ....f....~.....\u003e\n-[2018/04/05 21:39:28:0825] NOTICE: 0050: AD EF 20 44 85 5A 61 F0 71 20 BD E3 D1 4B B6 53 .. D.Za.q ...K.S\n-[2018/04/05 21:39:28:0825] NOTICE: 0060: 57 AA 81 E6 ED 74 36 40 E7 FC 62 24 AD E8 82 1D W....t6@..b$....\n-[2018/04/05 21:39:28:0826] NOTICE: 0070: 89 C4 3D 64 6C A8 34 4B DB FB DD 7D D2 2D FB 86 ..\u003ddl.4K...}.-..\n-[2018/04/05 21:39:28:0826] NOTICE: 0080: 97 EA 6B E2 C9 39 D6 19 DE A8 90 E7 86 8F CF 0A ..k..9..........\n-[2018/04/05 21:39:28:0826] NOTICE: 0090: CD 09 3C AF FB 0A FF 85 E8 93 D1 4B A0 C5 21 AD ..\u003c........K..!.\n-[2018/04/05 21:39:28:0826] NOTICE: 00A0: 58 52 30 0E 4B FE 4F C8 01 B9 BD 0F D4 E4 64 7B XR0.K.O.......d{\n-[2018/04/05 21:39:28:0826] NOTICE: 00B0: 04 B4 D2 68 69 8F F1 D5 FD B0 1A CE 55 43 08 B7 ...hi.......UC..\n-[2018/04/05 21:39:28:0826] NOTICE: 00C0: 9F 57 0D 4E E1 CA E8 5C B4 2A 6B AB 05 B5 57 67 .W.N...\u005c.*k...Wg\n-[2018/04/05 21:39:28:0826] NOTICE: 00D0: B8 FD 20 F4 4F 6B 0E 47 7C AD EB B4 99 2C 9B 53 .. .Ok.G|....,.S\n-[2018/04/05 21:39:28:0826] NOTICE: 00E0: DF EA 67 8D 8A 9D A7 17 01 F9 4E BD 56 43 50 53 ..g.......N.VCPS\n-[2018/04/05 21:39:28:0826] NOTICE: 00F0: 08 4E FE 6A 85 4A 4D 45 03 DA 01 00 96 7A C0 A9 .N.j.JME.....z..\n-[2018/04/05 21:39:28:0826] NOTICE: 0100: C2 32 5E 1A 9F 6F 7B E2 02 5E 70 12 D3 8E 76 6A .2^..o{..^p...vj\n-[2018/04/05 21:39:28:0826] NOTICE: 0110: 0B 59 A4 D7 31 9D C6 86 08 53 2E 02 8A 1E B1 FB .Y..1....S......\n-[2018/04/05 21:39:28:0826] NOTICE: 0120: 7B 02 03 01 00 01 {..... \n-[2018/04/05 21:39:28:0826] NOTICE: \n-[2018/04/05 21:39:28:0829] USER: RECEIVE_CLIENT_HTTP_READ: read 503\n-[2018/04/05 21:39:28:0829] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n-[2018/04/05 21:39:28:0829] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n-[2018/04/05 21:39:28:0829] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n-...\n-[2018/04/05 21:39:28:3777] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n-[2018/04/05 21:39:28:3777] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n-[2018/04/05 21:39:28:3778] USER: RECEIVE_CLIENT_HTTP_READ: read 503\n-[2018/04/05 21:39:28:3778] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n-[2018/04/05 21:39:28:3778] USER: RECEIVE_CLIENT_HTTP_READ: read 512\n-[2018/04/05 21:39:28:3778] USER: RECEIVE_CLIENT_HTTP_READ: read 471\n-[2018/04/05 21:39:28:3778] USER: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n-[2018/04/05 21:39:28:3787] USER: Completed\n-```\n-\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c b/minimal-examples/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c\ndeleted file mode 100644\nindex 9f3bf04..0000000\n--- a/minimal-examples/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c\n+++ /dev/null\n@@ -1,256 +0,0 @@\n-/*\n- * lws-minimal-http-client\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates the a minimal http client using lws.\n- *\n- * It visits https://warmcat.com/ and receives the html page there. You\n- * can dump the page data by changing the #if 0 below.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, bad \u003d 1, status;\n-static struct lws *client_wsi;\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t void *user, void *in, size_t len)\n-{\n-\tuint8_t buf[1280];\n-\tunion lws_tls_cert_info_results *ci \u003d\n-\t\t(union lws_tls_cert_info_results *)buf;\n-#if defined(LWS_HAVE_CTIME_R)\n-\tchar date[32];\n-#endif\n-\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tclient_wsi \u003d NULL;\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n-\t\tlwsl_notice(\u0022lws_http_client_http_response %d\u005cn\u0022, status);\n-\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_COMMON_NAME,\n-\t\t\t\t\t ci, sizeof(buf) - sizeof(*ci)))\n-\t\t\tlwsl_notice(\u0022 Peer Cert CN : %s\u005cn\u0022, ci-\u003ens.name);\n-\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_ISSUER_NAME,\n-\t\t\t\t\t ci, sizeof(ci-\u003ens.name)))\n-\t\t\tlwsl_notice(\u0022 Peer Cert issuer : %s\u005cn\u0022, ci-\u003ens.name);\n-\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_VALIDITY_FROM,\n-\t\t\t\t\t ci, 0))\n-#if defined(LWS_HAVE_CTIME_R)\n-\t\t\tlwsl_notice(\u0022 Peer Cert Valid from: %s\u0022, \n-\t\t\t\t\t\tctime_r(\u0026ci-\u003etime, date));\n-#else\n-\t\t\tlwsl_notice(\u0022 Peer Cert Valid from: %s\u0022, \n-\t\t\t\t\t\tctime(\u0026ci-\u003etime));\n-#endif\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_VALIDITY_TO,\n-\t\t\t\t\t ci, 0))\n-#if defined(LWS_HAVE_CTIME_R)\n-\t\t\tlwsl_notice(\u0022 Peer Cert Valid to : %s\u0022,\n-\t\t\t\t\t\tctime_r(\u0026ci-\u003etime, date));\n-#else\n-\t\t\tlwsl_notice(\u0022 Peer Cert Valid to : %s\u0022,\n-\t\t\t\t\t\tctime(\u0026ci-\u003etime));\n-#endif\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_USAGE,\n-\t\t\t\t\t ci, 0))\n-\t\t\tlwsl_notice(\u0022 Peer Cert usage bits: 0x%x\u005cn\u0022, ci-\u003eusage);\n-\t\tif (!lws_tls_peer_cert_info(wsi,\n-\t\t\t\t\t LWS_TLS_CERT_INFO_OPAQUE_PUBLIC_KEY,\n-\t\t\t\t\t ci, sizeof(buf) - sizeof(*ci))) {\n-\t\t\tlwsl_notice(\u0022 Peer Cert public key:\u005cn\u0022);\n-\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (unsigned int)ci-\u003ens.len);\n-\t\t}\n-\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID,\n-\t\t\t\t\t ci, 0)) {\n-\t\t\tlwsl_notice(\u0022 AUTHORITY_KEY_ID\u005cn\u0022);\n-\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (size_t)ci-\u003ens.len);\n-\t\t}\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID_ISSUER,\n-\t\t\t\t\t ci, 0)) {\n-\t\t\tlwsl_notice(\u0022 AUTHORITY_KEY_ID ISSUER\u005cn\u0022);\n-\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (size_t)ci-\u003ens.len);\n-\t\t}\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID_SERIAL,\n-\t\t\t\t\t ci, 0)) {\n-\t\t\tlwsl_notice(\u0022 AUTHORITY_KEY_ID SERIAL\u005cn\u0022);\n-\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (size_t)ci-\u003ens.len);\n-\t\t}\n-\t\tif (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_SUBJECT_KEY_ID,\n-\t\t\t\t\t ci, 0)) {\n-\t\t\tlwsl_notice(\u0022 AUTHORITY_KEY_ID SUBJECT_KEY_ID\u005cn\u0022);\n-\t\t\tlwsl_hexdump_notice(ci-\u003ens.name, (size_t)ci-\u003ens.len);\n-\t\t}\n-\n-\t\tbreak;\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-#if 0 /* enable to dump the html */\n-\t\t{\n-\t\t\tconst char *p \u003d in;\n-\n-\t\t\twhile (len--)\n-\t\t\t\tif (*p \u003c 0x7f)\n-\t\t\t\t\tputchar(*p++);\n-\t\t\t\telse\n-\t\t\t\t\tputchar('.');\n-\t\t}\n-#endif\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n-\t\tclient_wsi \u003d NULL;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tclient_wsi \u003d NULL;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{\n-\t\t\u0022http\u0022,\n-\t\tcallback_http,\n-\t\t0, 0, 0, NULL, 0\n-\t},\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_client_connect_info i;\n-\tstruct lws_context *context;\n-\tconst char *p;\n-\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n-\t\t /*\n-\t\t * For LLL_ verbosity above NOTICE to be built into lws,\n-\t\t * lws must have been configured and built with\n-\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE\n-\t\t *\n-\t\t * | LLL_INFO | LLL_PARSER | LLL_HEADER | LLL_EXT |\n-\t\t * LLL_CLIENT | LLL_LATENCY | LLL_DEBUG\n-\t\t */ ;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS minimal http client [\u003c-d \u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n-\tinfo.protocols \u003d protocols;\n-\t/*\n-\t * since we know this lws context is only ever going to be used with\n-\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n-\t * have to use the default allocations for fd tables up to ulimit -n.\n-\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n-\t * will use.\n-\t */\n-\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n-\n-#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n-\t/*\n-\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n-\t * CA to trust explicitly.\n-\t */\n-\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n-#endif\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n-\ti.context \u003d context;\n-\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n-\t\ti.port \u003d 7681;\n-\t\ti.address \u003d \u0022localhost\u0022;\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n-\t} else {\n-\t\ti.port \u003d 443;\n-\t\ti.address \u003d \u0022warmcat.com\u0022;\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-s\u0022)))\n-\t\ti.address \u003d p;\n-\n-\ti.path \u003d \u0022/\u0022;\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\n-\t/* force h1 even if h2 available */\n-\tif (lws_cmdline_option(argc, argv, \u0022--h1\u0022))\n-\t\ti.alpn \u003d \u0022http/1.1\u0022;\n-\n-\ti.method \u003d \u0022GET\u0022;\n-\n-\ti.protocol \u003d protocols[0].name;\n-\ti.pwsi \u003d \u0026client_wsi;\n-\tlws_client_connect_via_info(\u0026i);\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 client_wsi \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n-\n-\treturn bad;\n-}\ndiff --git a/minimal-examples/http-client/minimal-http-client-certinfo/warmcat.com.cer b/minimal-examples/http-client/minimal-http-client-certinfo/warmcat.com.cer\ndeleted file mode 100644\nindex 01ad0dc..0000000\n--- a/minimal-examples/http-client/minimal-http-client-certinfo/warmcat.com.cer\n+++ /dev/null\n@@ -1,32 +0,0 @@\n------BEGIN CERTIFICATE-----\n-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n------END CERTIFICATE-----\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client-custom-headers/CMakeLists.txt\ndeleted file mode 100644\nindex 0a69c0b..0000000\n--- a/minimal-examples/http-client/minimal-http-client-custom-headers/CMakeLists.txt\n+++ /dev/null\n@@ -1,24 +0,0 @@\n-project(lws-minimal-http-client-custom-headers C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-http-client-custom-headers)\n-set(SRCS minimal-http-client-custom-headers.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/README.md b/minimal-examples/http-client/minimal-http-client-custom-headers/README.md\ndeleted file mode 100644\nindex ac49a87..0000000\n--- a/minimal-examples/http-client/minimal-http-client-custom-headers/README.md\n+++ /dev/null\n@@ -1,45 +0,0 @@\n-# lws minimal http client custom headers\n-\n-This http client application shows how to send and receive custom headers.\n-\n-This currently only works on http 1, so the app forces that even if h2 enables.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--l| Connect to https://localhost:7681 and accept selfsigned cert\n--n|no TLS\n-\n-The app looks for a custom header \u0022test-custom-header\u0022 sent by warmcat.com.\n-\n-```\n- $ ./lws-minimal-http-client-custom-headers\n-[2019/03/11 05:46:45:7582] USER: LWS minimal http client Custom Headers [-d\u003cverbosity\u003e] [-l] [--h1]\n-[2019/03/11 05:46:45:7671] NOTICE: created client ssl context for default\n-[2019/03/11 05:46:46:7812] USER: Connected with server response: 200\n-[2019/03/11 05:46:46:7812] NOTICE: callback_http: custom header: 'hello'\n-[2019/03/11 05:46:46:7814] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-...\n-```\n-You can use the -n and -l to make this test app connect to localhost:7681 over http,\n-and confirm the \u0022dnt:1\u0022 header was sent either by tcpdump or by running the test\n-server on :7681 with -d1151\n-\n-```\n-[2019/03/11 05:48:53:6806] PARSER: WSI_TOKEN_NAME_PART 'd' 0x64 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d0\n-[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role\u003d0x20000000) wsi-\u003elextable_pos\u003d567\n-[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART 't' 0x74 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n-[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART ' ' 0x20 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n-[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART '1' 0x31 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n-' 0x0D (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1NAME_PART '\n-[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART '\n-```\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c b/minimal-examples/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c\ndeleted file mode 100644\nindex 6868371..0000000\n--- a/minimal-examples/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c\n+++ /dev/null\n@@ -1,227 +0,0 @@\n-/*\n- * lws-minimal-http-client\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates the a minimal http client using lws.\n- *\n- * It visits https://warmcat.com/ and receives the html page there. You\n- * can dump the page data by changing the #if 0 below.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, bad \u003d 1, status;\n-static struct lws *client_wsi;\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t void *user, void *in, size_t len)\n-{\n-\tchar val[32];\n-\tint n;\n-\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tclient_wsi \u003d NULL;\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:\n-\t{\n-\t\t unsigned char **p \u003d (unsigned char **)in, *end \u003d (*p) + len;\n-\n-\t\t /*\n-\t\t * How to send a custom header in the request to the server\n-\t\t */\n-\n-\t\t if (lws_add_http_header_by_name(wsi,\n-\t\t\t\t (const unsigned char *)\u0022dnt\u0022,\n-\t\t\t\t (const unsigned char *)\u00221\u0022, 1, p, end))\n-\t\t\t return -1;\n-\t\tbreak;\n-\t}\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n-\t\tlwsl_user(\u0022Connected with server response: %d\u005cn\u0022, status);\n-\n-\t\t/*\n-\t\t * How to query custom headers (http 1.x only at the momemnt)\n-\t\t *\n-\t\t * warmcat.com sends a custom header \u0022test-custom-header\u0022 for\n-\t\t * testing, it has the fixed value \u0022hello\u0022.\n-\t\t */\n-\n-\t\tn \u003d lws_hdr_custom_length(wsi, \u0022test-custom-header:\u0022, 19);\n-\t\tif (n \u003c 0)\n-\t\t\tlwsl_notice(\u0022%s: Can't find test-custom-header\u005cn\u0022,\n-\t\t\t\t __func__);\n-\t\telse {\n-\t\t\tif (lws_hdr_custom_copy(wsi, val, sizeof(val),\n-\t\t\t\t\t\t\u0022test-custom-header:\u0022, 19) \u003c 0)\n-\t\t\t\tlwsl_notice(\u0022%s: custom header too long\u005cn\u0022,\n-\t\t\t\t\t __func__);\n-\t\t\telse\n-\t\t\t\tlwsl_notice(\u0022%s: custom header: '%s'\u005cn\u0022,\n-\t\t\t\t\t\t__func__, val);\n-\t\t}\n-\t\tbreak;\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-#if 0 /* enable to dump the html */\n-\t\t{\n-\t\t\tconst char *p \u003d in;\n-\n-\t\t\twhile (len--)\n-\t\t\t\tif (*p \u003c 0x7f)\n-\t\t\t\t\tputchar(*p++);\n-\t\t\t\telse\n-\t\t\t\t\tputchar('.');\n-\t\t}\n-#endif\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n-\t\tclient_wsi \u003d NULL;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tclient_wsi \u003d NULL;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{\n-\t\t\u0022http\u0022,\n-\t\tcallback_http,\n-\t\t0, 0, 0, NULL, 0\n-\t},\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_client_connect_info i;\n-\tstruct lws_context *context;\n-\tconst char *p;\n-\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n-\t\t /*\n-\t\t * For LLL_ verbosity above NOTICE to be built into lws,\n-\t\t * lws must have been configured and built with\n-\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE\n-\t\t *\n-\t\t * | LLL_INFO | LLL_PARSER | LLL_HEADER | LLL_EXT |\n-\t\t * LLL_CLIENT | LLL_LATENCY | LLL_DEBUG\n-\t\t */ ;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n-\t\tlogs \u003d atoi(p);\n-\n-\tlws_set_log_level(logs, NULL);\n-\tlwsl_user(\u0022LWS minimal http client Custom Headers [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n-\tinfo.protocols \u003d protocols;\n-\t/*\n-\t * since we know this lws context is only ever going to be used with\n-\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n-\t * have to use the default allocations for fd tables up to ulimit -n.\n-\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n-\t * will use.\n-\t */\n-\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n-\n-#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n-\t/*\n-\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n-\t * CA to trust explicitly.\n-\t */\n-\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n-#endif\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n-\ti.context \u003d context;\n-\n-\tif (!lws_cmdline_option(argc, argv, \u0022-n\u0022))\n-\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n-\t\ti.port \u003d 7681;\n-\t\ti.address \u003d \u0022localhost\u0022;\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n-\t} else {\n-\t\ti.port \u003d 443;\n-\t\ti.address \u003d \u0022warmcat.com\u0022;\n-\t}\n-\n-\t/* currently custom headers receive only works with h1 */\n-\ti.alpn \u003d \u0022http/1.1\u0022;\n-\n-\ti.path \u003d \u0022/\u0022;\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\ti.method \u003d \u0022GET\u0022;\n-\n-\ti.protocol \u003d protocols[0].name;\n-\ti.pwsi \u003d \u0026client_wsi;\n-\tlws_client_connect_via_info(\u0026i);\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 client_wsi \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n-\n-\treturn bad;\n-}\ndiff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/warmcat.com.cer b/minimal-examples/http-client/minimal-http-client-custom-headers/warmcat.com.cer\ndeleted file mode 100644\nindex 01ad0dc..0000000\n--- a/minimal-examples/http-client/minimal-http-client-custom-headers/warmcat.com.cer\n+++ /dev/null\n@@ -1,32 +0,0 @@\n------BEGIN CERTIFICATE-----\n-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n------END CERTIFICATE-----\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt\ndeleted file mode 100644\nindex 9a2dc65..0000000\n--- a/minimal-examples/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt\n+++ /dev/null\n@@ -1,35 +0,0 @@\n-project(lws-minimal-http-client-h2-rxflow C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-http-client-h2-rxflow)\n-set(SRCS minimal-http-client.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_H2 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n-require_lws_config(LWS_WITH_TLS 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\tif (LWS_CTEST_INTERNET_AVAILABLE)\n-\t\tadd_test(NAME http-client-h2-rxflow-warmcat COMMAND lws-minimal-http-client-h2-rxflow)\n-\t\tadd_test(NAME http-client-h2-rxflow-warmcat-h1 COMMAND lws-minimal-http-client-h2-rxflow --h1)\n-\t\tset_tests_properties(http-client-h2-rxflow-warmcat\n-\t\t\t\t http-client-h2-rxflow-warmcat-h1\n-\t\t\t\t PROPERTIES\n-\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-h2-rxflow\n-\t\t\t\t TIMEOUT 30)\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/http-client/minimal-http-client-h2-rxflow/README.md b/minimal-examples/http-client/minimal-http-client-h2-rxflow/README.md\ndeleted file mode 100644\nindex 1593d26..0000000\n--- a/minimal-examples/http-client/minimal-http-client-h2-rxflow/README.md\n+++ /dev/null\n@@ -1,53 +0,0 @@\n-# lws minimal http client-h2-rxflow\n-\n-The application reads from a server with tightly controlled and rate-limited\n-receive flow control using h2 tx credit.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--l| Connect to https://localhost:7681 and accept selfsigned cert\n---server \u003cname\u003e|set server name to connect to\n---path \u003cpath\u003e|URL path to access on server\n--k|Apply tls option LCCSCF_ALLOW_INSECURE\n--j|Apply tls option LCCSCF_ALLOW_SELFSIGNED\n--m|Apply tls option LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK\n--e|Apply tls option LCCSCF_ALLOW_EXPIRED\n--v|Connection validity use 3s / 10s instead of default 5m / 5m10s\n---nossl| disable ssl connection\n--f \u003cinitial credit\u003e|Indicate we will manually manage tx credit and set a new connection-specific initial tx credit\n-\n-RX is constrained to 1024 bytes every 250ms\n-\n-```\n- $ ./lws-minimal-http-client-h2-rxflow --server phys.org --path \u0022/\u0022 -f 1024\n-[2019/12/26 13:32:59:6801] U: LWS minimal http client [-d\u003cverbosity\u003e] [-l] [--h1]\n-[2019/12/26 13:33:00:5087] N: system_notify_cb: manual peer tx credit 1024\n-[2019/12/26 13:33:01:7390] U: Connected to 72.251.236.55, http response: 200\n-[2019/12/26 13:33:01:7441] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:01:0855] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:02:3367] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:02:5858] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:02:8384] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:02:0886] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-...\n-[2019/12/26 13:33:46:1152] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:47:3650] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:47:6150] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:47:8666] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:47:1154] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:48:3656] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2019/12/26 13:33:48:6157] U: RECEIVE_CLIENT_HTTP_READ: read 380\n-[2019/12/26 13:33:48:6219] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n-[2019/12/26 13:33:48:7050] U: Completed: OK\n-\n-```\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c b/minimal-examples/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c\ndeleted file mode 100644\nindex dbd04b8..0000000\n--- a/minimal-examples/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c\n+++ /dev/null\n@@ -1,304 +0,0 @@\n-/*\n- * lws-minimal-http-client-h2-rxflow\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates the a minimal http client using lws.\n- *\n- * It visits https://warmcat.com/ and receives the html page there. You\n- * can dump the page data by changing the #if 0 below.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, bad \u003d 1, status, each \u003d 1024;\n-static struct lws *client_wsi;\n-\n-static const lws_retry_bo_t retry \u003d {\n-\t.secs_since_valid_ping \u003d 3,\n-\t.secs_since_valid_hangup \u003d 10,\n-};\n-\n-struct pss {\n-\tlws_sorted_usec_list_t sul;\n-\tstruct lws *wsi;\n-};\n-\n-/*\n- * Once we're established, we ask the server for another 1KB every 250ms\n- * until we have it all.\n- */\n-\n-static void\n-drain_cb(lws_sorted_usec_list_t *sul)\n-{\n-\tstruct pss *pss \u003d lws_container_of(sul, struct pss, sul);\n-\n-\tlws_wsi_tx_credit(pss-\u003ewsi, LWSTXCR_PEER_TO_US, each);\n-\n-\tlws_sul_schedule(lws_get_context(pss-\u003ewsi), 0, \u0026pss-\u003esul, drain_cb,\n-\t\t\t 250 * LWS_US_PER_MS);\n-}\n-\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t void *user, void *in, size_t len)\n-{\n-\tstruct pss *pss \u003d (struct pss *)user;\n-\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tinterrupted \u003d 1;\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buf[128];\n-\n-\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n-\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n-\n-\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n-\t\t\t\t\tbuf, status);\n-\t\t}\n-\t\tpss-\u003ewsi \u003d wsi;\n-\t\tlws_sul_schedule(lws_get_context(wsi), 0, \u0026pss-\u003esul, drain_cb,\n-\t\t\t\t 250 * LWS_US_PER_MS);\n-\t\tbreak;\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-\n-#if 0 /* enable to dump the html */\n-\t\t{\n-\t\t\tconst char *p \u003d in;\n-\n-\t\t\twhile (len--)\n-\t\t\t\tif (*p \u003c 0x7f)\n-\t\t\t\t\tputchar(*p++);\n-\t\t\t\telse\n-\t\t\t\t\tputchar('.');\n-\t\t}\n-#endif\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_sul_cancel(\u0026pss-\u003esul);\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{\n-\t\t\u0022http\u0022,\n-\t\tcallback_http,\n-\t\tsizeof(struct pss),\n-\t\t0, 0, NULL, 0\n-\t},\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-struct args {\n-\tint argc;\n-\tconst char **argv;\n-};\n-\n-static int\n-system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n-\t\t int current, int target)\n-{\n-\tstruct lws_context *context \u003d mgr-\u003eparent;\n-\tstruct lws_client_connect_info i;\n-\tstruct args *a \u003d lws_context_user(context);\n-\tconst char *p;\n-\n-\tif (current !\u003d LWS_SYSTATE_OPERATIONAL || target !\u003d LWS_SYSTATE_OPERATIONAL)\n-\t\treturn 0;\n-\n-\tlwsl_info(\u0022%s: operational\u005cn\u0022, __func__);\n-\n-\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n-\ti.context \u003d context;\n-\tif (!lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-n\u0022))\n-\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-l\u0022)) {\n-\t\ti.port \u003d 7681;\n-\t\ti.address \u003d \u0022localhost\u0022;\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n-\t} else {\n-\t\ti.port \u003d 443;\n-\t\ti.address \u003d \u0022warmcat.com\u0022;\n-\t}\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--nossl\u0022))\n-\t\ti.ssl_connection \u003d 0;\n-\n-\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n-\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM;\n-\n-\ti.alpn \u003d \u0022h2\u0022;\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--h1\u0022))\n-\t\ti.alpn \u003d \u0022http/1.1\u0022;\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-p\u0022)))\n-\t\ti.port \u003d atoi(p);\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-j\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-k\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_INSECURE;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-m\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-e\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_EXPIRED;\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-f\u0022))) {\n-\t\ti.ssl_connection |\u003d LCCSCF_H2_MANUAL_RXFLOW;\n-\t\ti.manual_initial_tx_credit \u003d atoi(p);\n-\t\tlwsl_notice(\u0022%s: manual peer tx credit %d\u005cn\u0022, __func__,\n-\t\t\t\ti.manual_initial_tx_credit);\n-\t}\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--each\u0022)))\n-\t\teach \u003d atoi(p);\n-\n-\t/* the default validity check is 5m / 5m10s... -v \u003d 3s / 10s */\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-v\u0022))\n-\t\ti.retry_and_idle_policy \u003d \u0026retry;\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--server\u0022)))\n-\t\ti.address \u003d p;\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--path\u0022)))\n-\t\ti.path \u003d p;\n-\telse\n-\t\ti.path \u003d \u0022/\u0022;\n-\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\ti.method \u003d \u0022GET\u0022;\n-\n-\ti.protocol \u003d protocols[0].name;\n-\ti.pwsi \u003d \u0026client_wsi;\n-\n-\treturn !lws_client_connect_via_info(\u0026i);\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n-\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n-\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tstruct args args;\n-\tint n \u003d 0;\n-\t// uint8_t memcert[4096];\n-\n-\targs.argc \u003d argc;\n-\targs.argv \u003d argv;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n-\n-\tlwsl_user(\u0022LWS minimal http client [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n-\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n-\tinfo.protocols \u003d protocols;\n-\tinfo.user \u003d \u0026args;\n-\tinfo.register_notifier_list \u003d na;\n-\tinfo.timeout_secs \u003d 10;\n-\tinfo.connect_timeout_secs \u003d 30;\n-\n-\t/*\n-\t * since we know this lws context is only ever going to be used with\n-\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n-\t * have to use the default allocations for fd tables up to ulimit -n.\n-\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n-\t * will use.\n-\t */\n-\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n-\n-#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n-\t/*\n-\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n-\t * CA to trust explicitly.\n-\t */\n-\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n-#endif\n-#if 0\n-\tn \u003d open(\u0022./warmcat.com.cer\u0022, O_RDONLY);\n-\tif (n \u003e\u003d 0) {\n-\t\tinfo.client_ssl_ca_mem_len \u003d read(n, memcert, sizeof(memcert));\n-\t\tinfo.client_ssl_ca_mem \u003d memcert;\n-\t\tclose(n);\n-\t\tn \u003d 0;\n-\t\tmemcert[info.client_ssl_ca_mem_len++] \u003d '\u005c0';\n-\t}\n-#endif\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n-\n-\treturn bad;\n-}\ndiff --git a/minimal-examples/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer b/minimal-examples/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer\ndeleted file mode 100644\nindex 01ad0dc..0000000\n--- a/minimal-examples/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer\n+++ /dev/null\n@@ -1,32 +0,0 @@\n------BEGIN CERTIFICATE-----\n-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n------END CERTIFICATE-----\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-hugeurl/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client-hugeurl/CMakeLists.txt\ndeleted file mode 100644\nindex cb42d1f..0000000\n--- a/minimal-examples/http-client/minimal-http-client-hugeurl/CMakeLists.txt\n+++ /dev/null\n@@ -1,49 +0,0 @@\n-project(lws-minimal-http-client-hugeurl C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-http-client-hugeurl)\n-set(SRCS minimal-http-client-hugeurl.c)\n-\n-set(requirements 1)\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-require_lws_config(LWS_WITH_TLS 1 requirements)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tif (LWS_CTEST_INTERNET_AVAILABLE)\n-\n-\t\t#\n-\t\t# creates a fixture res_hchugeurlw to get a lease on the\n-\t\t# server resources\n-\t\t#\n-\t\tsai_resource(warmcat_conns 1 40 hchugeurlw)\n-\t\n-\t\tadd_test(NAME http-client-hugeurl-warmcat COMMAND lws-minimal-http-client-hugeurl )\n-\t\tadd_test(NAME http-client-hugeurl-warmcat-h1 COMMAND lws-minimal-http-client-hugeurl --h1)\n-\t\tset_tests_properties(http-client-hugeurl-warmcat\n-\t\t\t\t http-client-hugeurl-warmcat-h1\n-\t\t\t\t PROPERTIES\n-\t\t\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-hugeurl\n-\t\t\t\t TIMEOUT 20)\n-\t\tif (DEFINED ENV{SAI_OVN})\n-\t\t\tset_tests_properties(http-client-hugeurl-warmcat\n-\t\t\t\t\t http-client-hugeurl-warmcat-h1\n-\t\t\t\t\t PROPERTIES\n-\t\t\t\t\t\tFIXTURES_REQUIRED \u0022res_hchugeurlw\u0022)\t\n-\t\tendif()\n-\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/http-client/minimal-http-client-hugeurl/README.md b/minimal-examples/http-client/minimal-http-client-hugeurl/README.md\ndeleted file mode 100644\nindex 6a7d06d..0000000\n--- a/minimal-examples/http-client/minimal-http-client-hugeurl/README.md\n+++ /dev/null\n@@ -1,52 +0,0 @@\n-# lws minimal http client hugeurl\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-The application goes to https://warmcat.com/?fakeparam\u003d\u003c2KB\u003e and receives the page data.\n-\n-```\n- $ ./lws-minimal-http-client\n-[2018/03/04 14:43:20:8562] USER: LWS minimal http client hugeurl\n-[2018/03/04 14:43:20:8571] NOTICE: Creating Vhost 'default' port -1, 1 protocols, IPv6 on\n-[2018/03/04 14:43:20:8616] NOTICE: created client ssl context for default\n-[2018/03/04 14:43:20:8617] NOTICE: lws_client_connect_2: 0x1814dc0: address warmcat.com\n-[2018/03/04 14:43:21:1496] NOTICE: lws_client_connect_2: 0x1814dc0: address warmcat.com\n-[2018/03/04 14:43:22:0154] NOTICE: lws_client_interpret_server_handshake: incoming content length 26520\n-[2018/03/04 14:43:22:0154] NOTICE: lws_client_interpret_server_handshake: client connection up\n-[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0169] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n-[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0174] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n-[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:0179] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n-[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3010] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n-[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3015] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n-[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3020] USER: RECEIVE_CLIENT_HTTP_READ: read 1015\n-[2018/03/04 14:43:22:3022] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2018/03/04 14:43:22:3022] USER: RECEIVE_CLIENT_HTTP_READ: read 974\n-[2018/03/04 14:43:22:3022] NOTICE: lws_http_client_read: transaction completed says -1\n-[2018/03/04 14:43:23:3042] USER: Completed\n-```\n-\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c b/minimal-examples/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c\ndeleted file mode 100644\nindex a3cda5d..0000000\n--- a/minimal-examples/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c\n+++ /dev/null\n@@ -1,221 +0,0 @@\n-/*\n- * lws-minimal-http-client hugeurl\n- *\n- * Written in 2010-2019 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates the a minimal http client using lws.\n- *\n- * It visits https://warmcat.com/?fakeparam\u003d\u003c2KB\u003e and receives the html\n- * page there. You can dump the page data by changing the #if 0 below.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, bad \u003d 1, status;\n-static struct lws *client_wsi;\n-\n-static const char * const uri \u003d\n-\t\u0022/?fakeparam\u003d\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022\n-\t\u002200000000000000000000000000000000000000000000000000\u0022 /* 500 */\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022\n-\t\u002211111111111111111111111111111111111111111111111111\u0022 /* 1000 */\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022\n-\t\u002222222222222222222222222222222222222222222222222222\u0022 /* 1500 */\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022\n-\t\u002233333333333333333333333333333333333333333333333333\u0022 /* 2000 */\n-;\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t void *user, void *in, size_t len)\n-{\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\t\tclient_wsi \u003d NULL;\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n-\t\tlwsl_user(\u0022Connected with server response: %d\u005cn\u0022, status);\n-\t\tbreak;\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-#if 0 /* enable to dump the html */\n-\t\t{\n-\t\t\tconst char *p \u003d in;\n-\n-\t\t\twhile (len--)\n-\t\t\t\tif (*p \u003c 0x7f)\n-\t\t\t\t\tputchar(*p++);\n-\t\t\t\telse\n-\t\t\t\t\tputchar('.');\n-\t\t}\n-#endif\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tclient_wsi \u003d NULL;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tclient_wsi \u003d NULL;\n-\t\tbad \u003d status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{\n-\t\t\u0022http\u0022,\n-\t\tcallback_http,\n-\t\t0, 0, 0, NULL, 0\n-\t},\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_client_connect_info i;\n-\tstruct lws_context *context;\n-\tint n \u003d 0;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n-\n-\tlwsl_user(\u0022LWS minimal http client hugeurl [-d \u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n-\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n-\tinfo.protocols \u003d protocols;\n-\tinfo.pt_serv_buf_size \u003d 8192;\n-\tinfo.timeout_secs \u003d 10;\n-\tinfo.connect_timeout_secs \u003d 30;\n-\t/*\n-\t * since we know this lws context is only ever going to be used with\n-\t * one client wsis / fds / sockets at a time, let lws know it doesn't\n-\t * have to use the default allocations for fd tables up to ulimit -n.\n-\t * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we\n-\t * will use.\n-\t */\n-\tinfo.fd_limit_per_thread \u003d 1 + 1 + 1;\n-\n-#if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)\n-\t/*\n-\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n-\t * CA to trust explicitly.\n-\t */\n-\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n-#endif\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\treturn 1;\n-\t}\n-\n-\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n-\ti.context \u003d context;\n-\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n-\t\ti.port \u003d 7681;\n-\t\ti.address \u003d \u0022localhost\u0022;\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n-\t} else {\n-\t\ti.port \u003d 443;\n-\t\ti.address \u003d \u0022warmcat.com\u0022;\n-\t}\n-\n-\tif (lws_cmdline_option(argc, argv, \u0022--h1\u0022))\n-\t\ti.alpn \u003d \u0022http/1.1\u0022;\n-\n-\ti.path \u003d uri;\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\ti.method \u003d \u0022GET\u0022;\n-\ti.protocol \u003d protocols[0].name;\n-\ti.pwsi \u003d \u0026client_wsi;\n-\n-\tlws_client_connect_via_info(\u0026i);\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 client_wsi \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlws_context_destroy(context);\n-\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad? \u0022failed\u0022: \u0022OK\u0022);\n-\n-\treturn bad;\n-}\ndiff --git a/minimal-examples/http-client/minimal-http-client-hugeurl/warmcat.com.cer b/minimal-examples/http-client/minimal-http-client-hugeurl/warmcat.com.cer\ndeleted file mode 100644\nindex 01ad0dc..0000000\n--- a/minimal-examples/http-client/minimal-http-client-hugeurl/warmcat.com.cer\n+++ /dev/null\n@@ -1,32 +0,0 @@\n------BEGIN CERTIFICATE-----\n-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc\u003d\n------END CERTIFICATE-----\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client-jit-trust/CMakeLists.txt\ndeleted file mode 100644\nindex eef5cd8..0000000\n--- a/minimal-examples/http-client/minimal-http-client-jit-trust/CMakeLists.txt\n+++ /dev/null\n@@ -1,157 +0,0 @@\n-project(lws-minimal-http-client-jit-trust C)\n-cmake_minimum_required(VERSION 2.8.12)\n-find_package(libwebsockets CONFIG REQUIRED)\n-list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})\n-include(CheckCSourceCompiles)\n-include(LwsCheckRequirements)\n-\n-set(SAMP lws-minimal-http-client-jit-trust)\n-set(SRCS minimal-http-client.c)\n-\n-set(has_fault_injection 1)\n-set(has_h2 1)\n-set(has_plugins 1)\n-set(has_ss_policy_parse 1)\n-set(has_no_system_vhost 1)\n-set(has_async_dns 1)\n-\n-set(requirements 1)\n-\n-require_lws_config(LWS_ROLE_H1 1 requirements)\n-require_lws_config(LWS_WITH_CLIENT 1 requirements)\n-require_lws_config(LWS_WITH_SYS_STATE 1 requirements)\n-require_lws_config(LWS_WITH_TLS_JIT_TRUST 1 requirements)\n-\n-require_lws_config(LWS_ROLE_H2 1 has_h2)\n-require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection)\n-require_lws_config(LWS_WITH_EVLIB_PLUGINS 1 has_plugins)\n-require_lws_config(LWS_WITH_EVENT_LIBS 1 has_plugins)\n-\n-require_lws_config(LWS_WITH_SECURE_STREAMS 1 has_ss_policy_parse)\n-require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 has_ss_policy_parse)\n-\n-require_lws_config(LWS_WITH_SYS_ASYNC_DNS 0 has_no_system_vhost)\n-require_lws_config(LWS_WITH_SYS_NTPCLIENT 0 has_no_system_vhost)\n-require_lws_config(LWS_WITH_SYS_DHCP_CLIENT 0 has_no_system_vhost)\n-\n-require_lws_config(LWS_WITH_SYS_ASYNC_DNS 1 has_async_dns)\n-\n-if (requirements)\n-\tadd_executable(${SAMP} ${SRCS})\n-\n-\tfind_program(VALGRIND \u0022valgrind\u0022)\n-\t\n-\tsai_resource(warmcat_conns 1 40 http_client_warmcat)\n-\n-\tif (LWS_CTEST_INTERNET_AVAILABLE)\n-\t\tset(mytests http-client-warmcat-h1)\n-\t\tif (has_h2)\n-\t\t\tadd_test(NAME http-client-warmcat COMMAND lws-minimal-http-client )\n-\t\t\tlist(APPEND mytests http-client-warmcat)\n-\t\tendif()\n-\n-\n-\t\tadd_test(NAME http-client-warmcat-h1 COMMAND lws-minimal-http-client --h1)\n-\t\t\t\t \n-\t\tif (has_fault_injection)\n-\t\t\n-\t\t\t# creation related faults\n-\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-ctx1)\n-\t\t\tadd_test(NAME http-client-fi-ctx1 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail1\u0022)\n-\t\t\t\n-\t\t\t# if (has_plugins)\n-\t\t\t# !!! need to actually select an available evlib plugin to trigger this\n-\t\t\t#\tlist(APPEND mytests http-client-fi-pi)\n-\t\t\t#\tadd_test(NAME http-client-fi-pi COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_plugin_init\u0022)\n-\t\t\t# endif()\n-\n-\t\t\tlist(APPEND mytests http-client-fi-ctx2)\n-\t\t\tadd_test(NAME http-client-fi-ctx2 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_sel\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-ctx3)\n-\t\t\tadd_test(NAME http-client-fi-ctx3 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_oom_ctx\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-ctx4)\n-\t\t\tadd_test(NAME http-client-fi-ctx4 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_privdrop\u0022)\n-\n-\t\t\tlist(APPEND mytests http-client-fi-ctx5)\n-\t\t\tadd_test(NAME http-client-fi-ctx5 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_maxfds\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-ctx6)\n-\t\t\tadd_test(NAME http-client-fi-ctx6 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_oom_fds\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-ctx7)\n-\t\t\tadd_test(NAME http-client-fi-ctx7 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_plat_init\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-ctx8)\n-\t\t\tadd_test(NAME http-client-fi-ctx8 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_init\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-ctx9)\n-\t\t\tadd_test(NAME http-client-fi-ctx9 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_evlib_pt\u0022)\n-\t\t\t\n-\t\t\tif (NOT has_no_system_vhost)\n-\t\t\t\n-\t\t\t\tlist(APPEND mytests http-client-fi-ctx10)\n-\t\t\t\tadd_test(NAME http-client-fi-ctx10 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_sys_vh\u0022)\n-\t\t\t\n-\t\t\t\tlist(APPEND mytests http-client-fi-ctx11)\n-\t\t\t\tadd_test(NAME http-client-fi-ctx11 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_sys_vh_init\u0022)\n-\t\t\t\t\n-\t\t\tendif()\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-ctx12)\n-\t\t\tadd_test(NAME http-client-fi-ctx12 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022ctx_createfail_def_vh\u0022)\n-\t\t\t\n-\n-\t\t\tlist(APPEND mytests http-client-fi-vh1)\n-\t\t\tadd_test(NAME http-client-fi-vh1 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_oom\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-vh2)\n-\t\t\tadd_test(NAME http-client-fi-vh2 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_pcols_oom\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-vh3)\n-\t\t\tadd_test(NAME http-client-fi-vh3 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_ssl_srv\u0022)\n-\n-\t\t\tlist(APPEND mytests http-client-fi-vh4)\n-\t\t\tadd_test(NAME http-client-fi-vh4 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_ssl_cli\u0022)\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-vh5)\n-\t\t\tadd_test(NAME http-client-fi-vh5 COMMAND lws-minimal-http-client --expected-exit 5 --fault-injection \u0022vh/vh_create_srv_init\u0022)\n-\n-\n-\t\t\tlist(APPEND mytests http-client-fi-dnsfail)\n-\t\t\tadd_test(NAME http-client-fi-dnsfail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection \u0022wsi\u003duser/dnsfail\u0022)\n-\t\t\t\n-\t\t\tif (has_async_dns)\n-\t\t\t\tlist(APPEND mytests http-client-fi-connfail)\n-\t\t\t\tadd_test(NAME http-client-fi-connfail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection \u0022wsi\u003duser/connfail\u0022)\n-\t\t\telse()\n-\t\t\t\tlist(APPEND mytests http-client-fi-connfail)\n-\t\t\t\tadd_test(NAME http-client-fi-connfail COMMAND lws-minimal-http-client --expected-exit 2 --fault-injection \u0022wsi\u003duser/connfail\u0022)\n-\t\t\tendif()\n-\t\t\t\n-\t\t\tlist(APPEND mytests http-client-fi-user-est-fail)\n-\t\t\tadd_test(NAME http-client-fi-user-est-fail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection \u0022wsi/user_reject_at_est\u0022)\t\n-\t\t\n-\t\t\t\n-\t\tendif()\n-\t\t\n-\t\tset_tests_properties(${mytests} PROPERTIES\n-\t\t WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client\n-\t\t TIMEOUT 20)\n-\t\t\t\t \n- \t\tif (DEFINED ENV{SAI_OVN})\n-\t\t\tset_tests_properties(${mytests} PROPERTIES\n-\t\t\t\t\t FIXTURES_REQUIRED \u0022res_http_client_warmcat\u0022)\n-\t\tendif()\t\t\n-\t\n-\tendif()\n-\n-\tif (websockets_shared)\n-\t\ttarget_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})\n-\t\tadd_dependencies(${SAMP} websockets_shared)\n-\telse()\n-\t\ttarget_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})\n-\tendif()\n-endif()\ndiff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/README.md b/minimal-examples/http-client/minimal-http-client-jit-trust/README.md\ndeleted file mode 100644\nindex 024f739..0000000\n--- a/minimal-examples/http-client/minimal-http-client-jit-trust/README.md\n+++ /dev/null\n@@ -1,96 +0,0 @@\n-# lws minimal http client JIT Trust\n-\n-This example turns off any existing trusted CAs and then tries to connect to a server, by default, warmcat.com.\n-\n-It validates the remote certificates using trusted CAs from a JIT Trust blob compiled into the code.\n-\n-## build\n-\n-```\n- $ cmake . \u0026\u0026 make\n-```\n-\n-## usage\n-\n-Commandline option|Meaning\n----|---\n--d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n--l| Connect to https://localhost:7681 and accept selfsigned cert\n---h1|Specify http/1.1 only using ALPN, rejects h2 even if server supports it\n---server \u003cname\u003e|set server name to connect to\n--k|Apply tls option LCCSCF_ALLOW_INSECURE\n--j|Apply tls option LCCSCF_ALLOW_SELFSIGNED\n--m|Apply tls option LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK\n--e|Apply tls option LCCSCF_ALLOW_EXPIRED\n--v|Connection validity use 3s / 10s instead of default 5m / 5m10s\n---nossl| disable ssl connection\n---user \u003cusername\u003e| Set Basic Auth username\n---password \u003cpassword\u003e | Set Basic Auth password\n-\n-```\n- $ ./bin/lws-minimal-http-client-jit-trust --h1 --server ebay.com --path /\n-\u003d\u003d1302866\u003d\u003d \n-[2021/06/17 14:33:54:7500] U: LWS minimal http client JIT Trust [-d\u003cverbosity\u003e] [-l] [--h1]\n-[2021/06/17 14:33:54:7956] N: LWS: 4.2.99-v4.2.0-70-g80e7e39bae, loglevel 1031\n-[2021/06/17 14:33:54:7960] N: NET CLI SRV H1 H2 WS MbedTLS ConMon IPv6-absent\n-[2021/06/17 14:33:54:8165] N: ++ [wsi|0|pipe] (1)\n-[2021/06/17 14:33:54:8227] N: ++ [vh|0|netlink] (1)\n-[2021/06/17 14:33:54:8319] N: ++ [vh|1|default||-1] (2)\n-[2021/06/17 14:33:55:0107] N: ++ [wsicli|0|GET/h1/ebay.com] (1)\n-[2021/06/17 14:33:56:0291] N: ++ [vh|2|jitt-7F69A044||-1] (3)\n-[2021/06/17 14:33:56:0355] E: CLIENT_CONNECTION_ERROR: server's cert didn't look good, invalidca (use_ssl 0x20000061) X509_V_ERR \u003d 24: CA is not trusted\n-\n-[2021/06/17 14:33:56:0376] N: ++ [wsicli|1|GET/h1/ebay.com] (2)\n-[2021/06/17 14:33:56:0746] N: -- [wsicli|0|GET/h1/ebay.com] (1) 1.061s\n-[2021/06/17 14:33:56:7555] N: lws_client_reset: REDIRECT www.ebay.com:443, path\u003d'/', ssl \u003d 1, alpn\u003d'http/1.1'\n-[2021/06/17 14:33:57:0205] N: ++ [vh|3|jitt-DFF2B5B4||-1] (4)\n-[2021/06/17 14:33:57:0208] E: CLIENT_CONNECTION_ERROR: server's cert didn't look good, invalidca (use_ssl 0x1) X509_V_ERR \u003d 24: CA is not trusted\n-\n-[2021/06/17 14:33:57:0210] N: ++ [wsicli|2|GET/h1/ebay.com] (2)\n-[2021/06/17 14:33:57:0288] N: -- [wsicli|1|GET/h1/ebay.com] (1) 991.119ms\n-[2021/06/17 14:33:57:7528] N: lws_client_reset: REDIRECT www.ebay.com:443, path\u003d'/', ssl \u003d 1, alpn\u003d'http/1.1'\n-[2021/06/17 14:33:58:1564] U: Connected to 195.95.193.127, http response: 200\n-[2021/06/17 14:33:58:1637] U: RECEIVE_CLIENT_HTTP_READ: read 209\n-[2021/06/17 14:33:58:1796] U: RECEIVE_CLIENT_HTTP_READ: read 197\n-[2021/06/17 14:33:58:1822] U: RECEIVE_CLIENT_HTTP_READ: read 1014\n-[2021/06/17 14:33:58:1847] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:1851] U: RECEIVE_CLIENT_HTTP_READ: read 1022\n-[2021/06/17 14:33:58:2748] U: RECEIVE_CLIENT_HTTP_READ: read 242\n-[2021/06/17 14:33:58:2782] U: RECEIVE_CLIENT_HTTP_READ: read 1014\n-[2021/06/17 14:33:58:2784] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:2785] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-...\n-[2021/06/17 14:33:58:4661] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4662] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4663] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4664] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4665] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4666] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4667] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4668] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4669] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4670] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4671] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4672] U: RECEIVE_CLIENT_HTTP_READ: read 1024\n-[2021/06/17 14:33:58:4673] U: RECEIVE_CLIENT_HTTP_READ: read 286\n-[2021/06/17 14:33:58:4690] U: LWS_CALLBACK_COMPLETED_CLIENT_HTTP\n-[2021/06/17 14:33:58:4712] E: main: destroying context, interrupted \u003d 1\n-[2021/06/17 14:33:58:4774] N: -- [wsi|0|pipe] (0) 3.661s\n-[2021/06/17 14:33:58:4780] N: callback_http: LWS_CALLBACK_CLOSED_CLIENT_HTTP\n-[2021/06/17 14:33:58:4829] N: -- [vh|3|jitt-DFF2B5B4||-1] (3) 1.462s\n-[2021/06/17 14:33:58:4833] N: -- [wsicli|2|GET/h1/ebay.com] (0) 1.462s\n-[2021/06/17 14:33:58:4834] N: -- [vh|0|netlink] (2) 3.660s\n-[2021/06/17 14:33:58:4858] N: -- [vh|1|default||-1] (1) 3.654s\n-[2021/06/17 14:33:58:4860] N: -- [vh|2|jitt-7F69A044||-1] (0) 2.456s\n-[2021/06/17 14:33:58:4974] U: Completed: OK (seen expected 0)\n-```\n-\n-You can also test the client Basic Auth support against the http-server/minimal-http-server-basicauth\n-example. In one console window run the server and in the other\n-\n-```\n-$ lws-minimal-http-client -l --nossl --path /secret/index.html --user user --password password\n-```\n-\n-The Basic Auth credentials for the test server are literally username \u0022user\u0022 and password \u0022password\u0022.\n-\ndiff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/minimal-http-client.c b/minimal-examples/http-client/minimal-http-client-jit-trust/minimal-http-client.c\ndeleted file mode 100644\nindex 92fd04e..0000000\n--- a/minimal-examples/http-client/minimal-http-client-jit-trust/minimal-http-client.c\n+++ /dev/null\n@@ -1,468 +0,0 @@\n-/*\n- * lws-minimal-http-client-jit-trust\n- *\n- * Written in 2010-2021 by Andy Green \u003candy@warmcat.com\u003e\n- *\n- * This file is made available under the Creative Commons CC0 1.0\n- * Universal Public Domain Dedication.\n- *\n- * This demonstrates the a minimal http client using lws.\n- *\n- * It visits https://warmcat.com/ and receives the html page there. You\n- * can dump the page data by changing the #if 0 below.\n- */\n-\n-#include \u003clibwebsockets.h\u003e\n-#include \u003cstring.h\u003e\n-#include \u003csignal.h\u003e\n-\n-static int interrupted, bad \u003d 1, status, conmon;\n-#if defined(LWS_WITH_HTTP2)\n-static int long_poll;\n-#endif\n-static struct lws *client_wsi;\n-static const char *ba_user, *ba_password;\n-static int budget \u003d 6;\n-\n-/*\n- * For this example, we import the C-formatted array version of the trust blob\n- * directly. This is produced by running scripts/mozilla-trust-gen.sh and can\n- * be found in ./_trust after that.\n- */\n-\n-static uint8_t jit_trust_blob[] \u003d {\n-#include \u0022./trust_blob.h\u0022\n-};\n-\n-static const lws_retry_bo_t retry \u003d {\n-\t.secs_since_valid_ping \u003d 3,\n-\t.secs_since_valid_hangup \u003d 10,\n-};\n-\n-#if defined(LWS_WITH_CONMON)\n-void\n-dump_conmon_data(struct lws *wsi)\n-{\n-\tconst struct addrinfo *ai;\n-\tstruct lws_conmon cm;\n-\tchar ads[48];\n-\n-\tlws_conmon_wsi_take(wsi, \u0026cm);\n-\n-\tlws_sa46_write_numeric_address(\u0026cm.peer46, ads, sizeof(ads));\n-\tlwsl_notice(\u0022%s: peer %s, dns: %uus, sockconn: %uus, \u0022\n-\t\t \u0022tls: %uus, txn_resp: %uus\u005cn\u0022,\n-\t\t __func__, ads,\n-\t\t (unsigned int)cm.ciu_dns,\n-\t\t (unsigned int)cm.ciu_sockconn,\n-\t\t (unsigned int)cm.ciu_tls,\n-\t\t (unsigned int)cm.ciu_txn_resp);\n-\n-\tai \u003d cm.dns_results_copy;\n-\twhile (ai) {\n-\t\tlws_sa46_write_numeric_address((lws_sockaddr46 *)ai-\u003eai_addr,\n-\t\t\t\t\t\tads, sizeof(ads));\n-\t\tlwsl_notice(\u0022%s: DNS %s\u005cn\u0022, __func__, ads);\n-\t\tai \u003d ai-\u003eai_next;\n-\t}\n-\n-\t/*\n-\t * This destroys the DNS list in the lws_conmon that we took\n-\t * responsibility for when we used lws_conmon_wsi_take()\n-\t */\n-\n-\tlws_conmon_release(\u0026cm);\n-}\n-#endif\n-\n-struct args {\n-\tint argc;\n-\tconst char **argv;\n-};\n-\n-static const struct lws_protocols protocols[];\n-\n-static int\n-try_connect(struct lws_context *cx)\n-{\n-\tstruct lws_client_connect_info i;\n-\tstruct args *a \u003d lws_context_user(cx);\n-\tconst char *p;\n-\n-\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n-\ti.context \u003d cx;\n-\tif (!lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-n\u0022)) {\n-\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n-#if defined(LWS_WITH_HTTP2)\n-\t\t/* requires h2 */\n-\t\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--long-poll\u0022)) {\n-\t\t\tlwsl_user(\u0022%s: long poll mode\u005cn\u0022, __func__);\n-\t\t\tlong_poll \u003d 1;\n-\t\t}\n-#endif\n-\t}\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-l\u0022)) {\n-\t\ti.port \u003d 7681;\n-\t\ti.address \u003d \u0022localhost\u0022;\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n-\t} else {\n-\t\ti.port \u003d 443;\n-\t\ti.address \u003d \u0022warmcat.com\u0022;\n-\t}\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--nossl\u0022))\n-\t\ti.ssl_connection \u003d 0;\n-\n-\ti.ssl_connection |\u003d LCCSCF_H2_QUIRK_OVERFLOWS_TXCR |\n-\t\t\t LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM |\n-\t\t\t LCCSCF_ACCEPT_TLS_DOWNGRADE_REDIRECTS;\n-\n-\ti.alpn \u003d \u0022h2,http/1.1\u0022;\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--h1\u0022))\n-\t\ti.alpn \u003d \u0022http/1.1\u0022;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--h2-prior-knowledge\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_H2_PRIOR_KNOWLEDGE;\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-p\u0022)))\n-\t\ti.port \u003d atoi(p);\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--user\u0022)))\n-\t\tba_user \u003d p;\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--password\u0022)))\n-\t\tba_password \u003d p;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-j\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-k\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_INSECURE;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-m\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-e\u0022))\n-\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_EXPIRED;\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-f\u0022))) {\n-\t\ti.ssl_connection |\u003d LCCSCF_H2_MANUAL_RXFLOW;\n-\t\ti.manual_initial_tx_credit \u003d atoi(p);\n-\t\tlwsl_notice(\u0022%s: manual peer tx credit %d\u005cn\u0022, __func__,\n-\t\t\t\ti.manual_initial_tx_credit);\n-\t}\n-\n-#if defined(LWS_WITH_CONMON)\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--conmon\u0022)) {\n-\t\ti.ssl_connection |\u003d LCCSCF_CONMON;\n-\t\tconmon \u003d 1;\n-\t}\n-#endif\n-\n-\t/* the default validity check is 5m / 5m10s... -v \u003d 3s / 10s */\n-\n-\tif (lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022-v\u0022))\n-\t\ti.retry_and_idle_policy \u003d \u0026retry;\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--server\u0022)))\n-\t\ti.address \u003d p;\n-\n-\tif ((p \u003d lws_cmdline_option(a-\u003eargc, a-\u003eargv, \u0022--path\u0022)))\n-\t\ti.path \u003d p;\n-\telse\n-\t\ti.path \u003d \u0022/\u0022;\n-\n-\ti.host \u003d i.address;\n-\ti.origin \u003d i.address;\n-\ti.method \u003d \u0022GET\u0022;\n-\n-\ti.protocol \u003d protocols[0].name;\n-\ti.pwsi \u003d \u0026client_wsi;\n-\ti.fi_wsi_name \u003d \u0022user\u0022;\n-\n-\tif (!lws_client_connect_via_info(\u0026i)) {\n-\t\tlwsl_err(\u0022Client creation failed\u005cn\u0022);\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d 2; /* could not even start client connection */\n-\t\tlws_cancel_service(cx);\n-\n-\t\treturn 1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static const char *ua \u003d \u0022Mozilla/5.0 (X11; Linux x86_64) \u0022\n-\t\t\t\u0022AppleWebKit/537.36 (KHTML, like Gecko) \u0022\n-\t\t\t\u0022Chrome/51.0.2704.103 Safari/537.36\u0022,\n-\t\t *acc \u003d \u0022*/*\u0022;\n-\n-static int\n-callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n-\t void *user, void *in, size_t len)\n-{\n-\tswitch (reason) {\n-\n-\t/* because we are protocols[0] ... */\n-\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n-\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n-\t\t\t in ? (char *)in : \u0022(null)\u0022);\n-\n-\t\tif (budget--) {\n-\t\t\ttry_connect(lws_get_context(wsi));\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d 3; /* connection failed before we could make connection */\n-\t\tlws_cancel_service(lws_get_context(wsi));\n-\n-#if defined(LWS_WITH_CONMON)\n-\tif (conmon)\n-\t\tdump_conmon_data(wsi);\n-#endif\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buf[128];\n-\n-\t\t\tlws_get_peer_simple(wsi, buf, sizeof(buf));\n-\t\t\tstatus \u003d (int)lws_http_client_http_response(wsi);\n-\n-\t\t\tlwsl_user(\u0022Connected to %s, http response: %d\u005cn\u0022,\n-\t\t\t\t\tbuf, status);\n-\t\t}\n-#if defined(LWS_WITH_HTTP2)\n-\t\tif (long_poll) {\n-\t\t\tlwsl_user(\u0022%s: Client entering long poll mode\u005cn\u0022, __func__);\n-\t\t\tlws_h2_client_stream_long_poll_rxonly(wsi);\n-\t\t}\n-#endif\n-\n-\t\tif (lws_fi_user_wsi_fi(wsi, \u0022user_reject_at_est\u0022))\n-\t\t\treturn -1;\n-\n-\t\tbreak;\n-\n-\n-\tcase LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:\n-\t{\n-\t\tunsigned char **p \u003d (unsigned char **)in, *end \u003d (*p) + len;\n-\n-\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_USER_AGENT,\n-\t\t\t\t(unsigned char *)ua, (int)strlen(ua), p, end))\n-\t\t\treturn -1;\n-\n-\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_ACCEPT,\n-\t\t\t\t(unsigned char *)acc, (int)strlen(acc), p, end))\n-\t\t\treturn -1;\n-\n-#if defined(LWS_WITH_HTTP_BASIC_AUTH)\n-\t\t{\n-\t\tchar b[128];\n-\n-\t/* you only need this if you need to do Basic Auth */\n-\n-\t\tif (!ba_user || !ba_password)\n-\t\t\tbreak;\n-\n-\t\tif (lws_http_basic_auth_gen(ba_user, ba_password, b, sizeof(b)))\n-\t\t\tbreak;\n-\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_AUTHORIZATION,\n-\t\t\t\t(unsigned char *)b, (int)strlen(b), p, end))\n-\t\t\treturn -1;\n-\t\t}\n-#endif\n-\n-\t\tbreak;\n-\t}\n-\n-\t/* chunks of chunked content, with header removed */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n-\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n-#if defined(LWS_WITH_HTTP2)\n-\t\tif (long_poll) {\n-\t\t\tchar dotstar[128];\n-\t\t\tlws_strnncpy(dotstar, (const char *)in, len,\n-\t\t\t\t sizeof(dotstar));\n-\t\t\tlwsl_notice(\u0022long poll rx: %d '%s'\u005cn\u0022, (int)len,\n-\t\t\t\t\tdotstar);\n-\t\t}\n-#endif\n-#if 0\n-\t\tlwsl_hexdump_notice(in, len);\n-#endif\n-\n-\t\treturn 0; /* don't passthru */\n-\n-\t/* uninterpreted http content */\n-\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n-\t\t{\n-\t\t\tchar buffer[1024 + LWS_PRE];\n-\t\t\tchar *px \u003d buffer + LWS_PRE;\n-\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n-\n-\t\t\tif (lws_fi_user_wsi_fi(wsi, \u0022user_reject_at_rx\u0022))\n-\t\t\t\treturn -1;\n-\n-\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n-\t\t\t\treturn -1;\n-\t\t}\n-\t\treturn 0; /* don't passthru */\n-\n-\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n-\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d 0; // we accept 403 or whatever for this test status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-\t\tbreak;\n-\n-\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n-\t\tlwsl_notice(\u0022%s: LWS_CALLBACK_CLOSED_CLIENT_HTTP\u005cn\u0022, __func__);\n-\t\tinterrupted \u003d 1;\n-\t\tbad \u003d 0; // status !\u003d 200;\n-\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n-#if defined(LWS_WITH_CONMON)\n-\t\tif (conmon)\n-\t\t\tdump_conmon_data(wsi);\n-#endif\n-\t\tbreak;\n-\n-\tdefault:\n-\t\tbreak;\n-\t}\n-\n-\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n-}\n-\n-static const struct lws_protocols protocols[] \u003d {\n-\t{\n-\t\t\u0022http\u0022,\n-\t\tcallback_http,\n-\t\t0, 0, 0, NULL, 0\n-\t},\n-\tLWS_PROTOCOL_LIST_TERM\n-};\n-\n-static void\n-sigint_handler(int sig)\n-{\n-\tinterrupted \u003d 1;\n-}\n-\n-static int\n-system_notify_cb(lws_state_manager_t *mgr, lws_state_notify_link_t *link,\n-\t\t int current, int target)\n-{\n-\tstruct lws_context *cx \u003d mgr-\u003eparent;\n-\n-\tif (current !\u003d LWS_SYSTATE_OPERATIONAL ||\n-\t target !\u003d LWS_SYSTATE_OPERATIONAL)\n-\t\treturn 0;\n-\n-\tlwsl_info(\u0022%s: operational\u005cn\u0022, __func__);\n-\n-\ttry_connect(cx);\n-\n-\treturn 0;\n-}\n-\n-static int\n-jit_trust_query(struct lws_context *cx, const uint8_t *skid,\n-\t\tsize_t skid_len, void *got_opaque)\n-{\n-\tconst uint8_t *der \u003d NULL;\n-\tsize_t der_len \u003d 0;\n-\n-\tlwsl_info(\u0022%s\u005cn\u0022, __func__);\n-\tlwsl_hexdump_info(skid, skid_len);\n-\n-\t/*\n-\t * For this example, we look up SKIDs using a trust table that's\n-\t * compiled in, synchronously. Lws provides the necessary helper.\n-\t *\n-\t * DER will remain NULL if no match.\n-\t */\n-\n-\tlws_tls_jit_trust_blob_queury_skid(jit_trust_blob,\n-\t\t\t\t\t sizeof(jit_trust_blob), skid,\n-\t\t\t\t\t skid_len, \u0026der, \u0026der_len);\n-\n-\tif (der)\n-\t\tlwsl_info(\u0022%s: found len %d\u005cn\u0022, __func__, (int)der_len);\n-\telse\n-\t\tlwsl_info(\u0022%s: not trusted\u005cn\u0022, __func__);\n-\n-\t/* Once we have a result, pass it to the completion helper */\n-\n-\treturn lws_tls_jit_trust_got_cert_cb(cx, got_opaque, skid, skid_len,\n-\t\t\t\t\t der, der_len);\n-}\n-\n-static lws_system_ops_t system_ops \u003d {\n-\t.jit_trust_query\t\t\u003d jit_trust_query\n-};\n-\n-int main(int argc, const char **argv)\n-{\n-\tlws_state_notify_link_t notifier \u003d { { NULL, NULL, NULL },\n-\t\t\t\t\t\tsystem_notify_cb, \u0022app\u0022 };\n-\tlws_state_notify_link_t *na[] \u003d { \u0026notifier, NULL };\n-\tstruct lws_context_creation_info info;\n-\tstruct lws_context *context;\n-\tint n \u003d 0, expected \u003d 0;\n-\tstruct args args;\n-\tconst char *p;\n-\n-\targs.argc \u003d argc;\n-\targs.argv \u003d argv;\n-\n-\tsignal(SIGINT, sigint_handler);\n-\n-\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n-\tlws_cmdline_option_handle_builtin(argc, argv, \u0026info);\n-\n-\tlwsl_user(\u0022LWS minimal http client JIT Trust [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n-\n-\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |\n-\t\t /* we start off not trusting anything */\n-\t\t LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS |\n-\t\t LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;\n-\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n-\tinfo.protocols \u003d protocols;\n-\tinfo.user \u003d \u0026args;\n-\tinfo.register_notifier_list \u003d na;\n-\tinfo.connect_timeout_secs \u003d 30;\n-\tinfo.system_ops \u003d \u0026system_ops;\n-\tinfo.fd_limit_per_thread \u003d 1 + 6 + 1;\n-\tinfo.max_http_header_data \u003d 8192;\n-\n-\tcontext \u003d lws_create_context(\u0026info);\n-\tif (!context) {\n-\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n-\t\tbad \u003d 5;\n-\t\tgoto bail;\n-\t}\n-\n-\twhile (n \u003e\u003d 0 \u0026\u0026 !interrupted)\n-\t\tn \u003d lws_service(context, 0);\n-\n-\tlwsl_err(\u0022%s: destroying context, interrupted \u003d %d\u005cn\u0022, __func__,\n-\t\t\tinterrupted);\n-\n-\tlws_context_destroy(context);\n-\n-bail:\n-\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022--expected-exit\u0022)))\n-\t\texpected \u003d atoi(p);\n-\n-\tif (bad \u003d\u003d expected) {\n-\t\tlwsl_user(\u0022Completed: OK (seen expected %d)\u005cn\u0022, expected);\n-\t\treturn 0;\n-\t}\n-\n-\tlwsl_err(\u0022Completed: failed: exit %d, expected %d\u005cn\u0022, bad, expected);\n-\n-\treturn 1;\n-}\ndiff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/trust_blob.h b/minimal-examples/http-client/minimal-http-client-jit-trust/trust_blob.h\ndeleted file mode 100644\nindex 615d1df..0000000\n--- a/minimal-examples/http-client/minimal-http-client-jit-trust/trust_blob.h\n+++ /dev/null\n@@ -1,8931 +0,0 @@\n-0x54, 0x42, 0x4c, 0x42, 0x00, 0x01, 0x00, 0x80, 0x60, 0xc6, 0xf3, 0x12, 0x00, 0x02, 0x22, 0xd8,\n-0x00, 0x02, 0x23, 0xd8, 0x00, 0x02, 0x24, 0x58, 0x00, 0x02, 0x2e, 0x30, 0x30, 0x82, 0x05, 0x82,\n-0x30, 0x82, 0x03, 0x6a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b, 0x5a, 0x4b, 0xbd, 0x5a, 0xfb,\n-0x4f, 0x8a, 0x5b, 0xfa, 0x65, 0xe5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n-0x13, 0x02, 0x41, 0x54, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1a, 0x65,\n-0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n-0x72, 0x69, 0x6e, 0x67, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x13, 0x10, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20,\n-0x32, 0x30, 0x32, 0x30, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x32, 0x31, 0x30, 0x30, 0x30,\n-0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x30, 0x36, 0x31, 0x30, 0x30, 0x30, 0x30,\n-0x30, 0x30, 0x30, 0x5a, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x41, 0x54, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1a, 0x65, 0x2d,\n-0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n-0x69, 0x6e, 0x67, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x13, 0x10, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x32,\n-0x30, 0x32, 0x30, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n-0x82, 0x02, 0x01, 0x00, 0xae, 0x2e, 0x56, 0xad, 0x1b, 0x1c, 0xef, 0xf6, 0x95, 0x8f, 0xa0, 0x77,\n-0x1b, 0x2b, 0xd3, 0x63, 0x8f, 0x84, 0x4d, 0x45, 0xa2, 0x0f, 0x9f, 0x5b, 0x45, 0xab, 0x59, 0x7b,\n-0x51, 0x34, 0xf9, 0xec, 0x8b, 0x8a, 0x78, 0xc5, 0xdd, 0x6b, 0xaf, 0xbd, 0xc4, 0xdf, 0x93, 0x45,\n-0x1e, 0xbf, 0x91, 0x38, 0x0b, 0xae, 0x0e, 0x16, 0xe7, 0x41, 0x73, 0xf8, 0xdb, 0xbb, 0xd1, 0xb8,\n-0x51, 0xe0, 0xcb, 0x83, 0x3b, 0x73, 0x38, 0x6e, 0x77, 0x8a, 0x0f, 0x59, 0x63, 0x26, 0xcd, 0xa7,\n-0x2a, 0xce, 0x54, 0xfb, 0xb8, 0xe2, 0xc0, 0x7c, 0x47, 0xce, 0x60, 0x7c, 0x3f, 0xb2, 0x73, 0xf2,\n-0xc0, 0x19, 0xb6, 0x8a, 0x92, 0x87, 0x35, 0x0d, 0x90, 0x28, 0xa2, 0xe4, 0x15, 0x04, 0x63, 0x3e,\n-0xba, 0xaf, 0xee, 0x7c, 0x5e, 0xcc, 0xa6, 0x8b, 0x50, 0xb2, 0x38, 0xf7, 0x41, 0x63, 0xca, 0xce,\n-0xff, 0x69, 0x8f, 0x68, 0x0e, 0x95, 0x36, 0xe5, 0xcc, 0xb9, 0x8c, 0x09, 0xca, 0x4b, 0xdd, 0x31,\n-0x90, 0x96, 0xc8, 0xcc, 0x1f, 0xfd, 0x56, 0x96, 0x34, 0xdb, 0x8e, 0x1c, 0xea, 0x2c, 0xbe, 0x85,\n-0x2e, 0x63, 0xdd, 0xaa, 0xa9, 0x95, 0xd3, 0xfd, 0x29, 0x95, 0x13, 0xf0, 0xc8, 0x98, 0x93, 0xd9,\n-0x2d, 0x16, 0x47, 0x90, 0x11, 0x83, 0xa2, 0x3a, 0x22, 0xa2, 0x28, 0x57, 0xa2, 0xeb, 0xfe, 0xc0,\n-0x8c, 0x28, 0xa0, 0xa6, 0x7d, 0xe7, 0x2a, 0x42, 0x3b, 0x82, 0x80, 0x63, 0xa5, 0x63, 0x1f, 0x19,\n-0xcc, 0x7c, 0xb2, 0x66, 0xa8, 0xc2, 0xd3, 0x6d, 0x37, 0x6f, 0xe2, 0x7e, 0x06, 0x51, 0xd9, 0x45,\n-0x84, 0x1f, 0x12, 0xce, 0x24, 0x52, 0x64, 0x85, 0x0b, 0x48, 0x80, 0x4e, 0x87, 0xb1, 0x22, 0x22,\n-0x30, 0xaa, 0xeb, 0xae, 0xbe, 0xe0, 0x02, 0xe0, 0x40, 0xe8, 0xb0, 0x42, 0x80, 0x03, 0x51, 0xaa,\n-0xb4, 0x7e, 0xaa, 0x44, 0xd7, 0x43, 0x61, 0xf3, 0xa2, 0x6b, 0x16, 0x89, 0x49, 0xa4, 0xa3, 0xa4,\n-0x2b, 0x8a, 0x02, 0xc4, 0x78, 0xf4, 0x68, 0x8a, 0xc1, 0xe4, 0x7a, 0x36, 0xb1, 0x6f, 0x1b, 0x96,\n-0x1b, 0x77, 0x49, 0x8d, 0xd4, 0xc9, 0x06, 0x72, 0x8f, 0xcf, 0x53, 0xe3, 0xdc, 0x17, 0x85, 0x20,\n-0x4a, 0xdc, 0x98, 0x27, 0xd3, 0x91, 0x26, 0x2b, 0x47, 0x1e, 0x69, 0x07, 0xaf, 0xde, 0xa2, 0xe4,\n-0xe4, 0xd4, 0x6b, 0x0b, 0xb3, 0x5e, 0x7c, 0xd4, 0x24, 0x80, 0x47, 0x29, 0x69, 0x3b, 0x6e, 0xe8,\n-0xac, 0xfd, 0x40, 0xeb, 0xd8, 0xed, 0x71, 0x71, 0x2b, 0xf2, 0xe8, 0x58, 0x1d, 0xeb, 0x41, 0x97,\n-0x22, 0xc5, 0x1f, 0xd4, 0x39, 0xd0, 0x27, 0x8f, 0x87, 0xe3, 0x18, 0xf4, 0xe0, 0xa9, 0x46, 0x0d,\n-0xf5, 0x74, 0x3a, 0x82, 0x2e, 0xd0, 0x6e, 0x2c, 0x91, 0xa3, 0x31, 0x5c, 0x3b, 0x46, 0xea, 0x7b,\n-0x04, 0x10, 0x56, 0x5e, 0x80, 0x1d, 0xf5, 0xa5, 0x65, 0xe8, 0x82, 0xfc, 0xe2, 0x07, 0x8c, 0x62,\n-0x45, 0xf5, 0x20, 0xde, 0x46, 0x70, 0x86, 0xa1, 0xbc, 0x93, 0xd3, 0x1e, 0x74, 0xa6, 0x6c, 0xb0,\n-0x2c, 0xf7, 0x03, 0x0c, 0x88, 0x0c, 0xcb, 0xd4, 0x72, 0x53, 0x86, 0xbc, 0x60, 0x46, 0xf3, 0x98,\n-0x6a, 0xc2, 0xf1, 0xbf, 0x43, 0xf9, 0x70, 0x20, 0x77, 0xca, 0x37, 0x41, 0x79, 0x55, 0x52, 0x63,\n-0x8d, 0x5b, 0x12, 0x9f, 0xc5, 0x68, 0xc4, 0x88, 0x9d, 0xac, 0xf2, 0x30, 0xab, 0xb7, 0xa3, 0x31,\n-0x97, 0x67, 0xad, 0x8f, 0x17, 0x0f, 0x6c, 0xc7, 0x73, 0xed, 0x24, 0x94, 0x6b, 0xc8, 0x83, 0x9a,\n-0xd0, 0x9a, 0x37, 0x49, 0x04, 0xab, 0xb1, 0x16, 0xc8, 0x6c, 0x49, 0x49, 0x2d, 0xab, 0xa1, 0xd0,\n-0x8c, 0x92, 0xf2, 0x41, 0x4a, 0x79, 0x21, 0x25, 0xdb, 0x63, 0xd7, 0xb6, 0x9c, 0xa7, 0x7e, 0x42,\n-0x69, 0xfb, 0x3a, 0x63, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06,\n-0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e,\n-0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d,\n-0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xdc, 0x2e, 0x1f, 0xd1, 0x61, 0x37, 0x79,\n-0xe4, 0xab, 0xd5, 0xd5, 0xb3, 0x12, 0x71, 0x68, 0x3d, 0x6a, 0x68, 0x9c, 0x22, 0x30, 0x1f, 0x06,\n-0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xdc, 0x2e, 0x1f, 0xd1, 0x61, 0x37,\n-0x79, 0xe4, 0xab, 0xd5, 0xd5, 0xb3, 0x12, 0x71, 0x68, 0x3d, 0x6a, 0x68, 0x9c, 0x22, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02,\n-0x01, 0x00, 0x91, 0xf0, 0x42, 0x02, 0x68, 0x40, 0xee, 0xc3, 0x68, 0xc0, 0x54, 0x2f, 0xdf, 0xec,\n-0x62, 0xc3, 0xc3, 0x9e, 0x8a, 0xa0, 0x31, 0x28, 0xaa, 0x83, 0x8e, 0xa4, 0x56, 0x96, 0x12, 0x10,\n-0x86, 0x56, 0xba, 0x97, 0x72, 0xd2, 0x54, 0x30, 0x7c, 0xad, 0x19, 0xd5, 0x1d, 0x68, 0x6f, 0xfb,\n-0x14, 0x42, 0xd8, 0x8d, 0x0e, 0xf3, 0xb5, 0xd1, 0xa5, 0xe3, 0x02, 0x42, 0x5e, 0xdc, 0xe8, 0x46,\n-0x58, 0x07, 0x35, 0x02, 0x30, 0xe0, 0xbc, 0x74, 0x4a, 0xc1, 0x43, 0x2a, 0xff, 0xdb, 0x1a, 0xd0,\n-0xb0, 0xaf, 0x6c, 0xc3, 0xfd, 0xcb, 0xb3, 0xf5, 0x7f, 0x6d, 0x03, 0x2e, 0x59, 0x56, 0x9d, 0x2d,\n-0x2d, 0x35, 0x8c, 0xb2, 0xd6, 0x43, 0x17, 0x2c, 0x92, 0x0a, 0xcb, 0x5d, 0xe8, 0x8c, 0x0f, 0x4b,\n-0x70, 0x43, 0xd0, 0x82, 0xff, 0xa8, 0xcc, 0xbf, 0xa4, 0x94, 0xc0, 0xbe, 0x87, 0xbd, 0x8a, 0xe3,\n-0x93, 0x7b, 0xc6, 0x8f, 0x9b, 0x16, 0x9d, 0x27, 0x65, 0xbc, 0x7a, 0xc5, 0x42, 0x82, 0x6c, 0x5c,\n-0x07, 0xd0, 0xa9, 0xc1, 0x88, 0x60, 0x44, 0xe9, 0x98, 0x85, 0x16, 0x5f, 0xf8, 0x8f, 0xca, 0x01,\n-0x10, 0xce, 0x25, 0xc3, 0xf9, 0x60, 0x1b, 0xa0, 0xc5, 0x97, 0xc3, 0xd3, 0x2c, 0x88, 0x31, 0xa2,\n-0xbd, 0x30, 0xec, 0xd0, 0xd0, 0xc0, 0x12, 0xf1, 0xc1, 0x39, 0xe3, 0xe5, 0xf5, 0xf8, 0xd6, 0x4a,\n-0xdd, 0x34, 0xcd, 0xfb, 0x6f, 0xc1, 0x4f, 0xe3, 0x00, 0x8b, 0x56, 0xe2, 0x92, 0xf7, 0x28, 0xb2,\n-0x42, 0x77, 0x72, 0x23, 0x67, 0xc7, 0x3f, 0x11, 0x15, 0xb2, 0xc4, 0x03, 0x05, 0xbe, 0xbb, 0x11,\n-0x7b, 0x0a, 0xbf, 0xa8, 0x6e, 0xe7, 0xff, 0x58, 0x43, 0xcf, 0x9b, 0x67, 0xa0, 0x80, 0x07, 0xb6,\n-0x1d, 0xca, 0xad, 0x6d, 0xea, 0x41, 0x11, 0x7e, 0x2d, 0x74, 0x93, 0xfb, 0xc2, 0xbc, 0xbe, 0x51,\n-0x44, 0xc5, 0xef, 0x68, 0x25, 0x27, 0x80, 0xe3, 0xc8, 0xa0, 0xd4, 0x12, 0xec, 0xd9, 0xa5, 0x37,\n-0x1d, 0x37, 0x7c, 0xb4, 0x91, 0xca, 0xda, 0xd4, 0xb1, 0x96, 0x81, 0xef, 0x68, 0x5c, 0x76, 0x10,\n-0x49, 0xaf, 0x7e, 0xa5, 0x37, 0x80, 0xb1, 0x1c, 0x52, 0xbd, 0x33, 0x81, 0x4c, 0x8f, 0xf9, 0xdd,\n-0x65, 0xd9, 0x14, 0xcd, 0x8a, 0x25, 0x58, 0xf4, 0xe2, 0xc5, 0x83, 0xa5, 0x09, 0x90, 0xd4, 0x6c,\n-0x14, 0x63, 0xb5, 0x40, 0xdf, 0xeb, 0xc0, 0xfc, 0xc4, 0x58, 0x7e, 0x0d, 0x14, 0x16, 0x87, 0x54,\n-0x27, 0x6e, 0x56, 0xe4, 0x70, 0x84, 0xb8, 0x6c, 0x32, 0x12, 0x7e, 0x82, 0x31, 0x43, 0xbe, 0xd7,\n-0xdd, 0x7c, 0xa1, 0xad, 0xae, 0xd6, 0xab, 0x20, 0x12, 0xef, 0x0a, 0xc3, 0x10, 0x8c, 0x49, 0x96,\n-0x35, 0xdc, 0x0b, 0x75, 0x5e, 0xb1, 0x4f, 0xd5, 0x4f, 0x34, 0x0e, 0x11, 0x20, 0x07, 0x75, 0x43,\n-0x45, 0xe9, 0xa3, 0x11, 0xda, 0xac, 0xa3, 0x99, 0xc2, 0xb6, 0x79, 0x27, 0xe2, 0xb9, 0xef, 0xc8,\n-0xe2, 0xf6, 0x35, 0x29, 0x7a, 0x74, 0xfa, 0xc5, 0x7f, 0x82, 0x05, 0x62, 0xa6, 0x0a, 0xea, 0x68,\n-0xb2, 0x79, 0x47, 0x06, 0x6e, 0xf2, 0x57, 0xa8, 0x15, 0x33, 0xc6, 0xf7, 0x78, 0x4a, 0x3d, 0x42,\n-0x7b, 0x6b, 0x7e, 0xfe, 0xf7, 0x46, 0xea, 0xd1, 0xeb, 0x8e, 0xef, 0x88, 0x68, 0x5b, 0xe8, 0xc1,\n-0xd9, 0x71, 0x7e, 0xfd, 0x64, 0xef, 0xff, 0x67, 0x47, 0x88, 0x58, 0x25, 0x2f, 0x3e, 0x86, 0x07,\n-0xbd, 0xfb, 0xa8, 0xe5, 0x82, 0xa8, 0xac, 0xa5, 0xd3, 0x69, 0x43, 0xcd, 0x31, 0x88, 0x49, 0x84,\n-0x53, 0x92, 0xc0, 0xb1, 0x39, 0x1b, 0x39, 0x83, 0x01, 0x30, 0xc4, 0xf2, 0xa9, 0xfa, 0xd0, 0x03,\n-0xbd, 0x72, 0x37, 0x60, 0x56, 0x1f, 0x36, 0x7c, 0xbd, 0x39, 0x91, 0xf5, 0x6d, 0x0d, 0xbf, 0x7b,\n-0xd7, 0x92, 0x30, 0x82, 0x02, 0x59, 0x30, 0x82, 0x01, 0xdf, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n-0x10, 0x66, 0xf2, 0x3d, 0xaf, 0x87, 0xde, 0x8b, 0xb1, 0x4a, 0xea, 0x0c, 0x57, 0x31, 0x01, 0xc2,\n-0xec, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x65, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,\n-0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x36, 0x30, 0x34,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,\n-0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n-0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20,\n-0x32, 0x30, 0x31, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x31, 0x32, 0x31, 0x38, 0x32, 0x33,\n-0x30, 0x36, 0x34, 0x35, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x37, 0x31, 0x38, 0x32, 0x33, 0x31,\n-0x36, 0x30, 0x34, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69,\n-0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,\n-0x69, 0x6f, 0x6e, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4d, 0x69,\n-0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n-0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74,\n-0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x37, 0x30, 0x76, 0x30, 0x10, 0x06,\n-0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03,\n-0x62, 0x00, 0x04, 0xd4, 0xbc, 0x3d, 0x02, 0x42, 0x75, 0x41, 0x13, 0x23, 0xcd, 0x80, 0x04, 0x86,\n-0x02, 0x51, 0x2f, 0x6a, 0xa8, 0x81, 0x62, 0x0b, 0x65, 0xcc, 0xf6, 0xca, 0x9d, 0x1e, 0x6f, 0x4a,\n-0x66, 0x51, 0xa2, 0x03, 0xd9, 0x9d, 0x91, 0xfa, 0xb6, 0x16, 0xb1, 0x8c, 0x6e, 0xde, 0x7c, 0xcd,\n-0xdb, 0x79, 0xa6, 0x2f, 0xce, 0xbb, 0xce, 0x71, 0x2f, 0xe5, 0xa5, 0xab, 0x28, 0xec, 0x63, 0x04,\n-0x66, 0x99, 0xf8, 0xfa, 0xf2, 0x93, 0x10, 0x05, 0xe1, 0x81, 0x28, 0x42, 0xe3, 0xc6, 0x68, 0xf4,\n-0xe6, 0x1b, 0x84, 0x60, 0x4a, 0x89, 0xaf, 0xed, 0x79, 0x0f, 0x3b, 0xce, 0xf1, 0xf6, 0x44, 0xf5,\n-0x01, 0x78, 0xc0, 0xa3, 0x54, 0x30, 0x52, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,\n-0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n-0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n-0x16, 0x04, 0x14, 0xc8, 0xcb, 0x99, 0x72, 0x70, 0x52, 0x0c, 0xf8, 0xe6, 0xbe, 0xb2, 0x04, 0x57,\n-0x29, 0x2a, 0xcf, 0x42, 0x10, 0xed, 0x35, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01,\n-0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n-0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x30, 0x58, 0xf2, 0x4d, 0xea,\n-0x0c, 0xf9, 0x5f, 0x5e, 0xee, 0x60, 0x29, 0xcb, 0x3a, 0xf2, 0xdb, 0xd6, 0x32, 0x84, 0x19, 0x3f,\n-0x7c, 0xd5, 0x2f, 0xc2, 0xb1, 0xcc, 0x93, 0xae, 0x50, 0xbb, 0x09, 0x32, 0xc6, 0xc6, 0xed, 0x7e,\n-0xc9, 0x36, 0x94, 0x12, 0xe4, 0x68, 0x85, 0x06, 0xa2, 0x1b, 0xd0, 0x2f, 0x02, 0x31, 0x00, 0x99,\n-0xe9, 0x16, 0xb4, 0x0e, 0xfa, 0x56, 0x48, 0xd4, 0xa4, 0x30, 0x16, 0x91, 0x78, 0xdb, 0x54, 0x8c,\n-0x65, 0x01, 0x8a, 0xe7, 0x50, 0x66, 0xc2, 0x31, 0xb7, 0x39, 0xba, 0xb8, 0x1a, 0x22, 0x07, 0x4e,\n-0xfc, 0x6b, 0x54, 0x16, 0x20, 0xff, 0x2b, 0xb5, 0xe7, 0x4c, 0x0c, 0x4d, 0xa6, 0x4f, 0x73, 0x30,\n-0x82, 0x05, 0xa8, 0x30, 0x82, 0x03, 0x90, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x1e, 0xd3,\n-0x97, 0x09, 0x5f, 0xd8, 0xb4, 0xb3, 0x47, 0x70, 0x1e, 0xaa, 0xbe, 0x7f, 0x45, 0xb3, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x65, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,\n-0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x36, 0x30, 0x34,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,\n-0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n-0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20,\n-0x32, 0x30, 0x31, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x31, 0x32, 0x31, 0x38, 0x32, 0x32,\n-0x35, 0x31, 0x32, 0x32, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x37, 0x31, 0x38, 0x32, 0x33, 0x30,\n-0x30, 0x32, 0x33, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69,\n-0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,\n-0x69, 0x6f, 0x6e, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4d, 0x69,\n-0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n-0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74,\n-0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x37, 0x30, 0x82, 0x02, 0x22, 0x30,\n-0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n-0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xca, 0x5b, 0xbe, 0x94,\n-0x33, 0x8c, 0x29, 0x95, 0x91, 0x16, 0x0a, 0x95, 0xbd, 0x47, 0x62, 0xc1, 0x89, 0xf3, 0x99, 0x36,\n-0xdf, 0x46, 0x90, 0xc9, 0xa5, 0xed, 0x78, 0x6a, 0x6f, 0x47, 0x91, 0x68, 0xf8, 0x27, 0x67, 0x50,\n-0x33, 0x1d, 0xa1, 0xa6, 0xfb, 0xe0, 0xe5, 0x43, 0xa3, 0x84, 0x02, 0x57, 0x01, 0x5d, 0x9c, 0x48,\n-0x40, 0x82, 0x53, 0x10, 0xbc, 0xbf, 0xc7, 0x3b, 0x68, 0x90, 0xb6, 0x82, 0x2d, 0xe5, 0xf4, 0x65,\n-0xd0, 0xcc, 0x6d, 0x19, 0xcc, 0x95, 0xf9, 0x7b, 0xac, 0x4a, 0x94, 0xad, 0x0e, 0xde, 0x4b, 0x43,\n-0x1d, 0x87, 0x07, 0x92, 0x13, 0x90, 0x80, 0x83, 0x64, 0x35, 0x39, 0x04, 0xfc, 0xe5, 0xe9, 0x6c,\n-0xb3, 0xb6, 0x1f, 0x50, 0x94, 0x38, 0x65, 0x50, 0x5c, 0x17, 0x46, 0xb9, 0xb6, 0x85, 0xb5, 0x1c,\n-0xb5, 0x17, 0xe8, 0xd6, 0x45, 0x9d, 0xd8, 0xb2, 0x26, 0xb0, 0xca, 0xc4, 0x70, 0x4a, 0xae, 0x60,\n-0xa4, 0xdd, 0xb3, 0xd9, 0xec, 0xfc, 0x3b, 0xd5, 0x57, 0x72, 0xbc, 0x3f, 0xc8, 0xc9, 0xb2, 0xde,\n-0x4b, 0x6b, 0xf8, 0x23, 0x6c, 0x03, 0xc0, 0x05, 0xbd, 0x95, 0xc7, 0xcd, 0x73, 0x3b, 0x66, 0x80,\n-0x64, 0xe3, 0x1a, 0xac, 0x2e, 0xf9, 0x47, 0x05, 0xf2, 0x06, 0xb6, 0x9b, 0x73, 0xf5, 0x78, 0x33,\n-0x5b, 0xc7, 0xa1, 0xfb, 0x27, 0x2a, 0xa1, 0xb4, 0x9a, 0x91, 0x8c, 0x91, 0xd3, 0x3a, 0x82, 0x3e,\n-0x76, 0x40, 0xb4, 0xcd, 0x52, 0x61, 0x51, 0x70, 0x28, 0x3f, 0xc5, 0xc5, 0x5a, 0xf2, 0xc9, 0x8c,\n-0x49, 0xbb, 0x14, 0x5b, 0x4d, 0xc8, 0xff, 0x67, 0x4d, 0x4c, 0x12, 0x96, 0xad, 0xf5, 0xfe, 0x78,\n-0xa8, 0x97, 0x87, 0xd7, 0xfd, 0x5e, 0x20, 0x80, 0xdc, 0xa1, 0x4b, 0x22, 0xfb, 0xd4, 0x89, 0xad,\n-0xba, 0xce, 0x47, 0x97, 0x47, 0x55, 0x7b, 0x8f, 0x45, 0xc8, 0x67, 0x28, 0x84, 0x95, 0x1c, 0x68,\n-0x30, 0xef, 0xef, 0x49, 0xe0, 0x35, 0x7b, 0x64, 0xe7, 0x98, 0xb0, 0x94, 0xda, 0x4d, 0x85, 0x3b,\n-0x3e, 0x55, 0xc4, 0x28, 0xaf, 0x57, 0xf3, 0x9e, 0x13, 0xdb, 0x46, 0x27, 0x9f, 0x1e, 0xa2, 0x5e,\n-0x44, 0x83, 0xa4, 0xa5, 0xca, 0xd5, 0x13, 0xb3, 0x4b, 0x3f, 0xc4, 0xe3, 0xc2, 0xe6, 0x86, 0x61,\n-0xa4, 0x52, 0x30, 0xb9, 0x7a, 0x20, 0x4f, 0x6f, 0x0f, 0x38, 0x53, 0xcb, 0x33, 0x0c, 0x13, 0x2b,\n-0x8f, 0xd6, 0x9a, 0xbd, 0x2a, 0xc8, 0x2d, 0xb1, 0x1c, 0x7d, 0x4b, 0x51, 0xca, 0x47, 0xd1, 0x48,\n-0x27, 0x72, 0x5d, 0x87, 0xeb, 0xd5, 0x45, 0xe6, 0x48, 0x65, 0x9d, 0xaf, 0x52, 0x90, 0xba, 0x5b,\n-0xa2, 0x18, 0x65, 0x57, 0x12, 0x9f, 0x68, 0xb9, 0xd4, 0x15, 0x6b, 0x94, 0xc4, 0x69, 0x22, 0x98,\n-0xf4, 0x33, 0xe0, 0xed, 0xf9, 0x51, 0x8e, 0x41, 0x50, 0xc9, 0x34, 0x4f, 0x76, 0x90, 0xac, 0xfc,\n-0x38, 0xc1, 0xd8, 0xe1, 0x7b, 0xb9, 0xe3, 0xe3, 0x94, 0xe1, 0x46, 0x69, 0xcb, 0x0e, 0x0a, 0x50,\n-0x6b, 0x13, 0xba, 0xac, 0x0f, 0x37, 0x5a, 0xb7, 0x12, 0xb5, 0x90, 0x81, 0x1e, 0x56, 0xae, 0x57,\n-0x22, 0x86, 0xd9, 0xc9, 0xd2, 0xd1, 0xd7, 0x51, 0xe3, 0xab, 0x3b, 0xc6, 0x55, 0xfd, 0x1e, 0x0e,\n-0xd3, 0x74, 0x0a, 0xd1, 0xda, 0xaa, 0xea, 0x69, 0xb8, 0x97, 0x28, 0x8f, 0x48, 0xc4, 0x07, 0xf8,\n-0x52, 0x43, 0x3a, 0xf4, 0xca, 0x55, 0x35, 0x2c, 0xb0, 0xa6, 0x6a, 0xc0, 0x9c, 0xf9, 0xf2, 0x81,\n-0xe1, 0x12, 0x6a, 0xc0, 0x45, 0xd9, 0x67, 0xb3, 0xce, 0xff, 0x23, 0xa2, 0x89, 0x0a, 0x54, 0xd4,\n-0x14, 0xb9, 0x2a, 0xa8, 0xd7, 0xec, 0xf9, 0xab, 0xcd, 0x25, 0x58, 0x32, 0x79, 0x8f, 0x90, 0x5b,\n-0x98, 0x39, 0xc4, 0x08, 0x06, 0xc1, 0xac, 0x7f, 0x0e, 0x3d, 0x00, 0xa5, 0x02, 0x03, 0x01, 0x00,\n-0x01, 0xa3, 0x54, 0x30, 0x52, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n-0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n-0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n-0x14, 0x09, 0xcb, 0x59, 0x7f, 0x86, 0xb2, 0x70, 0x8f, 0x1a, 0xc3, 0x39, 0xe3, 0xc0, 0xd9, 0xe9,\n-0xbf, 0xbb, 0x4d, 0xb2, 0x23, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37,\n-0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xac, 0xaf, 0x3e, 0x5d, 0xc2,\n-0x11, 0x96, 0x89, 0x8e, 0xa3, 0xe7, 0x92, 0xd6, 0x97, 0x15, 0xb8, 0x13, 0xa2, 0xa6, 0x42, 0x2e,\n-0x02, 0xcd, 0x16, 0x05, 0x59, 0x27, 0xca, 0x20, 0xe8, 0xba, 0xb8, 0xe8, 0x1a, 0xec, 0x4d, 0xa8,\n-0x97, 0x56, 0xae, 0x65, 0x43, 0xb1, 0x8f, 0x00, 0x9b, 0x52, 0xcd, 0x55, 0xcd, 0x53, 0x39, 0x6d,\n-0x62, 0x4c, 0x8b, 0x0d, 0x5b, 0x7c, 0x2e, 0x44, 0xbf, 0x83, 0x10, 0x8f, 0xf3, 0x53, 0x82, 0x80,\n-0xc3, 0x4f, 0x3a, 0xc7, 0x6e, 0x11, 0x3f, 0xe6, 0xe3, 0x16, 0x91, 0x84, 0xfb, 0x6d, 0x84, 0x7f,\n-0x34, 0x74, 0xad, 0x89, 0xa7, 0xce, 0xb9, 0xd7, 0xd7, 0x9f, 0x84, 0x64, 0x92, 0xbe, 0x95, 0xa1,\n-0xad, 0x09, 0x53, 0x33, 0xdd, 0xee, 0x0a, 0xea, 0x4a, 0x51, 0x8e, 0x6f, 0x55, 0xab, 0xba, 0xb5,\n-0x94, 0x46, 0xae, 0x8c, 0x7f, 0xd8, 0xa2, 0x50, 0x25, 0x65, 0x60, 0x80, 0x46, 0xdb, 0x33, 0x04,\n-0xae, 0x6c, 0xb5, 0x98, 0x74, 0x54, 0x25, 0xdc, 0x93, 0xe4, 0xf8, 0xe3, 0x55, 0x15, 0x3d, 0xb8,\n-0x6d, 0xc3, 0x0a, 0xa4, 0x12, 0xc1, 0x69, 0x85, 0x6e, 0xdf, 0x64, 0xf1, 0x53, 0x99, 0xe1, 0x4a,\n-0x75, 0x20, 0x9d, 0x95, 0x0f, 0xe4, 0xd6, 0xdc, 0x03, 0xf1, 0x59, 0x18, 0xe8, 0x47, 0x89, 0xb2,\n-0x57, 0x5a, 0x94, 0xb6, 0xa9, 0xd8, 0x17, 0x2b, 0x17, 0x49, 0xe5, 0x76, 0xcb, 0xc1, 0x56, 0x99,\n-0x3a, 0x37, 0xb1, 0xff, 0x69, 0x2c, 0x91, 0x91, 0x93, 0xe1, 0xdf, 0x4c, 0xa3, 0x37, 0x76, 0x4d,\n-0xa1, 0x9f, 0xf8, 0x6d, 0x1e, 0x1d, 0xd3, 0xfa, 0xec, 0xfb, 0xf4, 0x45, 0x1d, 0x13, 0x6d, 0xcf,\n-0xf7, 0x59, 0xe5, 0x22, 0x27, 0x72, 0x2b, 0x86, 0xf3, 0x57, 0xbb, 0x30, 0xed, 0x24, 0x4d, 0xdc,\n-0x7d, 0x56, 0xbb, 0xa3, 0xb3, 0xf8, 0x34, 0x79, 0x89, 0xc1, 0xe0, 0xf2, 0x02, 0x61, 0xf7, 0xa6,\n-0xfc, 0x0f, 0xbb, 0x1c, 0x17, 0x0b, 0xae, 0x41, 0xd9, 0x7c, 0xbd, 0x27, 0xa3, 0xfd, 0x2e, 0x3a,\n-0xd1, 0x93, 0x94, 0xb1, 0x73, 0x1d, 0x24, 0x8b, 0xaf, 0x5b, 0x20, 0x89, 0xad, 0xb7, 0x67, 0x66,\n-0x79, 0xf5, 0x3a, 0xc6, 0xa6, 0x96, 0x33, 0xfe, 0x53, 0x92, 0xc8, 0x46, 0xb1, 0x11, 0x91, 0xc6,\n-0x99, 0x7f, 0x8f, 0xc9, 0xd6, 0x66, 0x31, 0x20, 0x41, 0x10, 0x87, 0x2d, 0x0c, 0xd6, 0xc1, 0xaf,\n-0x34, 0x98, 0xca, 0x64, 0x83, 0xfb, 0x13, 0x57, 0xd1, 0xc1, 0xf0, 0x3c, 0x7a, 0x8c, 0xa5, 0xc1,\n-0xfd, 0x95, 0x21, 0xa0, 0x71, 0xc1, 0x93, 0x67, 0x71, 0x12, 0xea, 0x8f, 0x88, 0x0a, 0x69, 0x19,\n-0x64, 0x99, 0x23, 0x56, 0xfb, 0xac, 0x2a, 0x2e, 0x70, 0xbe, 0x66, 0xc4, 0x0c, 0x84, 0xef, 0xe5,\n-0x8b, 0xf3, 0x93, 0x01, 0xf8, 0x6a, 0x90, 0x93, 0x67, 0x4b, 0xb2, 0x68, 0xa3, 0xb5, 0x62, 0x8f,\n-0xe9, 0x3f, 0x8c, 0x7a, 0x3b, 0x5e, 0x0f, 0xe7, 0x8c, 0xb8, 0xc6, 0x7c, 0xef, 0x37, 0xfd, 0x74,\n-0xe2, 0xc8, 0x4f, 0x33, 0x72, 0xe1, 0x94, 0x39, 0x6d, 0xbd, 0x12, 0xaf, 0xbe, 0x0c, 0x4e, 0x70,\n-0x7c, 0x1b, 0x6f, 0x8d, 0xb3, 0x32, 0x93, 0x73, 0x44, 0x16, 0x6d, 0xe8, 0xf4, 0xf7, 0xe0, 0x95,\n-0x80, 0x8f, 0x96, 0x5d, 0x38, 0xa4, 0xf4, 0xab, 0xde, 0x0a, 0x30, 0x87, 0x93, 0xd8, 0x4d, 0x00,\n-0x71, 0x62, 0x45, 0x27, 0x4b, 0x3a, 0x42, 0x84, 0x5b, 0x7f, 0x65, 0xb7, 0x67, 0x34, 0x52, 0x2d,\n-0x9c, 0x16, 0x6b, 0xaa, 0xa8, 0xd8, 0x7b, 0xa3, 0x42, 0x4c, 0x71, 0xc7, 0x0c, 0xca, 0x3e, 0x83,\n-0xe4, 0xa6, 0xef, 0xb7, 0x01, 0x30, 0x5e, 0x51, 0xa3, 0x79, 0xf5, 0x70, 0x69, 0xa6, 0x41, 0x44,\n-0x0f, 0x86, 0xb0, 0x2c, 0x91, 0xc6, 0x3d, 0xea, 0xae, 0x0f, 0x84, 0x30, 0x82, 0x05, 0xef, 0x30,\n-0x82, 0x03, 0xd7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x0d, 0xd3, 0xe3, 0xbc, 0x6c, 0xf9,\n-0x6b, 0xb1, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n-0x00, 0x30, 0x81, 0x84, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x47,\n-0x36, 0x33, 0x32, 0x38, 0x37, 0x35, 0x31, 0x30, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n-0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e,\n-0x41, 0x4e, 0x46, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20, 0x64, 0x65,\n-0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x31, 0x14,\n-0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b, 0x41, 0x4e, 0x46, 0x20, 0x43, 0x41, 0x20,\n-0x52, 0x61, 0x69, 0x7a, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x41,\n-0x4e, 0x46, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,\n-0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x39,\n-0x30, 0x34, 0x31, 0x30, 0x30, 0x30, 0x33, 0x38, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x30, 0x38, 0x33,\n-0x30, 0x31, 0x30, 0x30, 0x30, 0x33, 0x38, 0x5a, 0x30, 0x81, 0x84, 0x31, 0x12, 0x30, 0x10, 0x06,\n-0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x47, 0x36, 0x33, 0x32, 0x38, 0x37, 0x35, 0x31, 0x30, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x27, 0x30, 0x25,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x41, 0x4e, 0x46, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x72,\n-0x69, 0x64, 0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n-0x61, 0x63, 0x69, 0x6f, 0x6e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b,\n-0x41, 0x4e, 0x46, 0x20, 0x43, 0x41, 0x20, 0x52, 0x61, 0x69, 0x7a, 0x31, 0x22, 0x30, 0x20, 0x06,\n-0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x41, 0x4e, 0x46, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65,\n-0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30,\n-0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n-0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00,\n-0xdb, 0xeb, 0x6b, 0x2b, 0xe6, 0x64, 0x54, 0x95, 0x82, 0x90, 0xa3, 0x72, 0xa4, 0x19, 0x01, 0x9d,\n-0x9c, 0x0b, 0x81, 0x5f, 0x73, 0x49, 0xba, 0xa7, 0xac, 0xf3, 0x04, 0x4e, 0x7b, 0x96, 0x0b, 0xec,\n-0x11, 0xe0, 0x5b, 0xa6, 0x1c, 0xce, 0x1b, 0xd2, 0x0d, 0x83, 0x1c, 0x2b, 0xb8, 0x9e, 0x1d, 0x7e,\n-0x45, 0x32, 0x60, 0x0f, 0x07, 0xe9, 0x77, 0x58, 0x7e, 0x9f, 0x6a, 0xc8, 0x61, 0x4e, 0xb6, 0x26,\n-0xc1, 0x4c, 0x8d, 0xff, 0x4c, 0xef, 0x34, 0xb2, 0x1f, 0x65, 0xd8, 0xb9, 0x78, 0xf5, 0xad, 0xa9,\n-0x71, 0xb9, 0xef, 0x4f, 0x58, 0x1d, 0xa5, 0xde, 0x74, 0x20, 0x97, 0xa1, 0xed, 0x68, 0x4c, 0xde,\n-0x92, 0x17, 0x4b, 0xbc, 0xab, 0xff, 0x65, 0x9a, 0x9e, 0xfb, 0x47, 0xd9, 0x57, 0x72, 0xf3, 0x09,\n-0xa1, 0xae, 0x76, 0x44, 0x13, 0x6e, 0x9c, 0x2d, 0x44, 0x39, 0xbc, 0xf9, 0xc7, 0x3b, 0xa4, 0x58,\n-0x3d, 0x41, 0xbd, 0xb4, 0xc2, 0x49, 0xa3, 0xc8, 0x0d, 0xd2, 0x97, 0x2f, 0x07, 0x65, 0x52, 0x00,\n-0xa7, 0x6e, 0xc8, 0xaf, 0x68, 0xec, 0xf4, 0x14, 0x96, 0xb6, 0x57, 0x1f, 0x56, 0xc3, 0x39, 0x9f,\n-0x2b, 0x6d, 0xe4, 0xf3, 0x3e, 0xf6, 0x35, 0x64, 0xda, 0x0c, 0x1c, 0xa1, 0x84, 0x4b, 0x2f, 0x4b,\n-0x4b, 0xe2, 0x2c, 0x24, 0x9d, 0x6d, 0x93, 0x40, 0xeb, 0xb5, 0x23, 0x8e, 0x32, 0xca, 0x6f, 0x45,\n-0xd3, 0xa8, 0x89, 0x7b, 0x1e, 0xcf, 0x1e, 0xfa, 0x5b, 0x43, 0x8b, 0xcd, 0xcd, 0xa8, 0x0f, 0x6a,\n-0xca, 0x0c, 0x5e, 0xb9, 0x9e, 0x47, 0x8f, 0xf0, 0xd9, 0xb6, 0x0a, 0x0b, 0x58, 0x65, 0x17, 0x33,\n-0xb9, 0x23, 0xe4, 0x77, 0x19, 0x7d, 0xcb, 0x4a, 0x2e, 0x92, 0x7b, 0x4f, 0x2f, 0x10, 0x77, 0xb1,\n-0x8d, 0x2f, 0x68, 0x9c, 0x62, 0xcc, 0xe0, 0x50, 0xf8, 0xec, 0x91, 0xa7, 0x54, 0x4c, 0x57, 0x09,\n-0xd5, 0x76, 0x63, 0xc5, 0xe8, 0x65, 0x1e, 0xee, 0x6d, 0x6a, 0xcf, 0x09, 0x9d, 0xfa, 0x7c, 0x4f,\n-0xad, 0x60, 0x08, 0xfd, 0x56, 0x99, 0x0f, 0x15, 0x2c, 0x7b, 0xa9, 0x80, 0xab, 0x8c, 0x61, 0x8f,\n-0x4a, 0x07, 0x76, 0x42, 0xde, 0x3d, 0xf4, 0xdd, 0xb2, 0x24, 0x33, 0x5b, 0xb8, 0xb5, 0xa3, 0x44,\n-0xc9, 0xac, 0x7f, 0x77, 0x3c, 0x1d, 0x23, 0xec, 0x82, 0xa9, 0xa6, 0xe2, 0xc8, 0x06, 0x4c, 0x02,\n-0xfe, 0xac, 0x5c, 0x99, 0x99, 0x0b, 0x2f, 0x10, 0x8a, 0xa6, 0xf4, 0x7f, 0xd5, 0x87, 0x74, 0x0d,\n-0x59, 0x49, 0x45, 0xf6, 0xf0, 0x71, 0x5c, 0x39, 0x29, 0xd6, 0xbf, 0x4a, 0x23, 0x8b, 0xf5, 0x5f,\n-0x01, 0x63, 0xd2, 0x87, 0x73, 0x28, 0xb5, 0x4b, 0x0a, 0xf5, 0xf8, 0xab, 0x82, 0x2c, 0x7e, 0x73,\n-0x25, 0x32, 0x1d, 0x0b, 0x63, 0x0a, 0x17, 0x81, 0x00, 0xff, 0xb6, 0x76, 0x5e, 0xe7, 0xb4, 0xb1,\n-0x40, 0xca, 0x21, 0xbb, 0xd5, 0x80, 0x51, 0xe5, 0x48, 0x52, 0x67, 0x2c, 0xd2, 0x61, 0x89, 0x07,\n-0x0d, 0x0f, 0xce, 0x42, 0x77, 0xc0, 0x44, 0x73, 0x9c, 0x44, 0x50, 0xa0, 0xdb, 0x10, 0x0a, 0x2d,\n-0x95, 0x1c, 0x81, 0xaf, 0xe4, 0x1c, 0xe5, 0x14, 0x1e, 0xf1, 0x36, 0x41, 0x01, 0x02, 0x2f, 0x7d,\n-0x73, 0xa7, 0xde, 0x42, 0xcc, 0x4c, 0xe9, 0x89, 0x0d, 0x56, 0xf7, 0x9f, 0x91, 0xd4, 0x03, 0xc6,\n-0x6c, 0xc9, 0x8f, 0xdb, 0xd8, 0x1c, 0xe0, 0x40, 0x98, 0x5d, 0x66, 0x99, 0x98, 0x80, 0x6e, 0x2d,\n-0xff, 0x01, 0xc5, 0xce, 0xcb, 0x46, 0x1f, 0xac, 0x02, 0xc6, 0x43, 0xe6, 0xae, 0xa2, 0x84, 0x3c,\n-0xc5, 0x4e, 0x1e, 0x3d, 0x6d, 0xc9, 0x14, 0x4c, 0xe3, 0x2e, 0x41, 0xbb, 0xca, 0x39, 0xbf, 0x36,\n-0x3c, 0x2a, 0x19, 0xaa, 0x41, 0x87, 0x4e, 0xa5, 0xce, 0x4b, 0x32, 0x79, 0xdd, 0x90, 0x49, 0x7f,\n-0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,\n-0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x9c, 0x5f, 0xd0, 0x6c, 0x63, 0xa3, 0x5f, 0x93, 0xca, 0x93,\n-0x98, 0x08, 0xad, 0x8c, 0x87, 0xa5, 0x2c, 0x5c, 0xc1, 0x37, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n-0x0e, 0x04, 0x16, 0x04, 0x14, 0x9c, 0x5f, 0xd0, 0x6c, 0x63, 0xa3, 0x5f, 0x93, 0xca, 0x93, 0x98,\n-0x08, 0xad, 0x8c, 0x87, 0xa5, 0x2c, 0x5c, 0xc1, 0x37, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f,\n-0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n-0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x4e, 0x1e,\n-0xb9, 0x8a, 0xc6, 0xa0, 0x98, 0x3f, 0x6e, 0xc3, 0x69, 0xc0, 0x6a, 0x5c, 0x49, 0x52, 0xac, 0xcb,\n-0x2b, 0x5d, 0x78, 0x38, 0xc1, 0xd5, 0x54, 0x84, 0x9f, 0x93, 0xf0, 0x87, 0x19, 0x3d, 0x2c, 0x66,\n-0x89, 0xeb, 0x0d, 0x42, 0xfc, 0xcc, 0xf0, 0x75, 0x85, 0x3f, 0x8b, 0xf4, 0x80, 0x5d, 0x79, 0xe5,\n-0x17, 0x67, 0xbd, 0x35, 0x82, 0xe2, 0xf2, 0x3c, 0x8e, 0x7d, 0x5b, 0x36, 0xcb, 0x5a, 0x80, 0x00,\n-0x29, 0xf2, 0xce, 0x2b, 0x2c, 0xf1, 0x8f, 0xaa, 0x6d, 0x05, 0x93, 0x6c, 0x72, 0xc7, 0x56, 0xeb,\n-0xdf, 0x50, 0x23, 0x28, 0xe5, 0x45, 0x10, 0x3d, 0xe8, 0x67, 0xa3, 0xaf, 0x0e, 0x55, 0x0f, 0x90,\n-0x09, 0x62, 0xef, 0x4b, 0x59, 0xa2, 0xf6, 0x53, 0xf1, 0xc0, 0x35, 0xe4, 0x2f, 0xc1, 0x24, 0xbd,\n-0x79, 0x2f, 0x4e, 0x20, 0x22, 0x3b, 0xfd, 0x1a, 0x20, 0xb0, 0xa4, 0x0e, 0x2c, 0x70, 0xed, 0x74,\n-0x3f, 0xb8, 0x13, 0x95, 0x06, 0x51, 0xc8, 0xe8, 0x87, 0x26, 0xca, 0xa4, 0x5b, 0x6a, 0x16, 0x21,\n-0x92, 0xdd, 0x73, 0x60, 0x9e, 0x10, 0x18, 0xde, 0x3c, 0x81, 0xea, 0xe8, 0x18, 0xc3, 0x7c, 0x89,\n-0xf2, 0x8b, 0x50, 0x3e, 0xbd, 0x11, 0xe2, 0x15, 0x03, 0xa8, 0x36, 0x7d, 0x33, 0x01, 0x6c, 0x48,\n-0x15, 0xd7, 0x88, 0x90, 0x99, 0x04, 0xc5, 0xcc, 0xe6, 0x07, 0xf4, 0xbc, 0xf4, 0x90, 0xed, 0x13,\n-0xe2, 0xea, 0x8b, 0xc3, 0x8f, 0xa3, 0x33, 0x0f, 0xc1, 0x29, 0x4c, 0x13, 0x4e, 0xda, 0x15, 0x56,\n-0x71, 0x73, 0x72, 0x82, 0x50, 0xf6, 0x9a, 0x33, 0x7c, 0xa2, 0xb1, 0xa8, 0x1a, 0x34, 0x74, 0x65,\n-0x5c, 0xce, 0xd1, 0xeb, 0xab, 0x53, 0xe0, 0x1a, 0x80, 0xd8, 0xea, 0x3a, 0x49, 0xe4, 0x26, 0x30,\n-0x9b, 0xe5, 0x1c, 0x8a, 0xa8, 0xa9, 0x15, 0x32, 0x86, 0x99, 0x92, 0x0a, 0x10, 0x23, 0x56, 0x12,\n-0xe0, 0xf6, 0xce, 0x4c, 0xe2, 0xbb, 0xbe, 0xdb, 0x8d, 0x92, 0x73, 0x01, 0x66, 0x2f, 0x62, 0x3e,\n-0xb2, 0x72, 0x27, 0x45, 0x36, 0xed, 0x4d, 0x56, 0xe3, 0x97, 0x99, 0xff, 0x3a, 0x35, 0x3e, 0xa5,\n-0x54, 0x4a, 0x52, 0x59, 0x4b, 0x60, 0xdb, 0xee, 0xfe, 0x78, 0x11, 0x7f, 0x4a, 0xdc, 0x14, 0x79,\n-0x60, 0xb6, 0x6b, 0x64, 0x03, 0xdb, 0x15, 0x83, 0xe1, 0xa2, 0xbe, 0xf6, 0x23, 0x97, 0x50, 0xf0,\n-0x09, 0x33, 0x36, 0xa7, 0x71, 0x96, 0x25, 0xf3, 0xb9, 0x42, 0x7d, 0xdb, 0x38, 0x3f, 0x2c, 0x58,\n-0xac, 0xe8, 0x42, 0xe1, 0x0e, 0xd8, 0xd3, 0x3b, 0x4c, 0x2e, 0x82, 0xe9, 0x83, 0x2e, 0x6b, 0x31,\n-0xd9, 0xdd, 0x47, 0x86, 0x4f, 0x6d, 0x97, 0x91, 0x2e, 0x4f, 0xe2, 0x28, 0x71, 0x35, 0x16, 0xd1,\n-0xf2, 0x73, 0xfe, 0x25, 0x2b, 0x07, 0x47, 0x24, 0x63, 0x27, 0xc8, 0xf8, 0xf6, 0xd9, 0x6b, 0xfc,\n-0x12, 0x31, 0x56, 0x08, 0xc0, 0x53, 0x42, 0xaf, 0x9c, 0xd0, 0x33, 0x7e, 0xfc, 0x06, 0xf0, 0x31,\n-0x44, 0x03, 0x14, 0xf1, 0x58, 0xea, 0xf2, 0x6a, 0x0d, 0xa9, 0x11, 0xb2, 0x83, 0xbe, 0xc5, 0x1a,\n-0xbf, 0x07, 0xea, 0x59, 0xdc, 0xa3, 0x88, 0x35, 0xef, 0x9c, 0x76, 0x32, 0x3c, 0x4d, 0x06, 0x22,\n-0xce, 0x15, 0xe5, 0xdd, 0x9e, 0xd8, 0x8f, 0xda, 0xde, 0xd2, 0xc4, 0x39, 0xe5, 0x17, 0x81, 0xcf,\n-0x38, 0x47, 0xeb, 0x7f, 0x88, 0x6d, 0x59, 0x1b, 0xdf, 0x9f, 0x42, 0x14, 0xae, 0x7e, 0xcf, 0xa8,\n-0xb0, 0x66, 0x65, 0xda, 0x37, 0xaf, 0x9f, 0xaa, 0x3d, 0xea, 0x28, 0xb6, 0xde, 0xd5, 0x31, 0x58,\n-0x16, 0x82, 0x5b, 0xea, 0xbb, 0x19, 0x75, 0x02, 0x73, 0x1a, 0xca, 0x48, 0x1a, 0x21, 0x93, 0x90,\n-0x0a, 0x8e, 0x93, 0x84, 0xa7, 0x7d, 0x3b, 0x23, 0x18, 0x92, 0x89, 0xa0, 0x8d, 0xac, 0x30, 0x82,\n-0x02, 0x65, 0x30, 0x82, 0x01, 0xeb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x78, 0x8f, 0x27,\n-0x5c, 0x81, 0x12, 0x52, 0x20, 0xa5, 0x04, 0xd0, 0x2d, 0xdd, 0xba, 0x73, 0xf4, 0x30, 0x0a, 0x06,\n-0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x74, 0x31, 0x0b, 0x30, 0x09, 0x06,\n-0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04,\n-0x0a, 0x13, 0x18, 0x41, 0x73, 0x73, 0x65, 0x63, 0x6f, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x53,\n-0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06,\n-0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72,\n-0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n-0x72, 0x69, 0x74, 0x79, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x43,\n-0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x45, 0x43, 0x2d, 0x33, 0x38, 0x34, 0x20, 0x43, 0x41, 0x30,\n-0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x33, 0x32, 0x36, 0x30, 0x37, 0x32, 0x34, 0x35, 0x34, 0x5a,\n-0x17, 0x0d, 0x34, 0x33, 0x30, 0x33, 0x32, 0x36, 0x30, 0x37, 0x32, 0x34, 0x35, 0x34, 0x5a, 0x30,\n-0x74, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x21,\n-0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x41, 0x73, 0x73, 0x65, 0x63, 0x6f, 0x20,\n-0x44, 0x61, 0x74, 0x61, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x41,\n-0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65, 0x72, 0x74,\n-0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n-0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03,\n-0x55, 0x04, 0x03, 0x13, 0x10, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x45, 0x43, 0x2d, 0x33,\n-0x38, 0x34, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n-0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xc4, 0x28, 0x8e,\n-0xab, 0x18, 0x5b, 0x6a, 0xbe, 0x6e, 0x64, 0x37, 0x63, 0xe4, 0xcd, 0xec, 0xab, 0x3a, 0xf7, 0xcc,\n-0xa1, 0xb8, 0x0e, 0x82, 0x49, 0xd7, 0x86, 0x29, 0x9f, 0xa1, 0x94, 0xf2, 0xe3, 0x60, 0x78, 0x98,\n-0x81, 0x78, 0x06, 0x4d, 0xf2, 0xec, 0x9a, 0x0e, 0x57, 0x60, 0x83, 0x9f, 0xb4, 0xe6, 0x17, 0x2f,\n-0x1a, 0xb3, 0x5d, 0x02, 0x5b, 0x89, 0x23, 0x3c, 0xc2, 0x11, 0x05, 0x2a, 0xa7, 0x88, 0x13, 0x18,\n-0xf3, 0x50, 0x84, 0xd7, 0xbd, 0x34, 0x2c, 0x27, 0x89, 0x55, 0xff, 0xce, 0x4c, 0xe7, 0xdf, 0xa6,\n-0x1f, 0x28, 0xc4, 0xf0, 0x54, 0xc3, 0xb9, 0x7c, 0xb7, 0x53, 0xad, 0xeb, 0xc2, 0xa3, 0x42, 0x30,\n-0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n-0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x8d, 0x06, 0x66,\n-0x74, 0x24, 0x76, 0x3a, 0xf3, 0x89, 0xf7, 0xbc, 0xd6, 0xbd, 0x47, 0x7d, 0x2f, 0xbc, 0x10, 0x5f,\n-0x4b, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n-0x06, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00,\n-0x30, 0x65, 0x02, 0x30, 0x03, 0x55, 0x2d, 0xa6, 0xe6, 0x18, 0xc4, 0x7c, 0xef, 0xc9, 0x50, 0x6e,\n-0xc1, 0x27, 0x0f, 0x9c, 0x87, 0xaf, 0x6e, 0xd5, 0x1b, 0x08, 0x18, 0xbd, 0x92, 0x29, 0xc1, 0xef,\n-0x94, 0x91, 0x78, 0xd2, 0x3a, 0x1c, 0x55, 0x89, 0x62, 0xe5, 0x1b, 0x09, 0x1e, 0xba, 0x64, 0x6b,\n-0xf1, 0x76, 0xb4, 0xd4, 0x02, 0x31, 0x00, 0xb4, 0x42, 0x84, 0x99, 0xff, 0xab, 0xe7, 0x9e, 0xfb,\n-0x91, 0x97, 0x27, 0x5d, 0xdc, 0xb0, 0x5b, 0x30, 0x71, 0xce, 0x5e, 0x38, 0x1a, 0x6a, 0xd9, 0x25,\n-0xe7, 0xea, 0xf7, 0x61, 0x92, 0x56, 0xf8, 0xea, 0xda, 0x36, 0xc2, 0x87, 0x65, 0x96, 0x2e, 0x72,\n-0x25, 0x2f, 0x7f, 0xdf, 0xc3, 0x13, 0xc9, 0x30, 0x82, 0x05, 0xc0, 0x30, 0x82, 0x03, 0xa8, 0xa0,\n-0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x1e, 0xbf, 0x59, 0x50, 0xb8, 0xc9, 0x80, 0x37, 0x4c, 0x06,\n-0xf7, 0xeb, 0x55, 0x4f, 0xb5, 0xed, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x0d, 0x05, 0x00, 0x30, 0x7a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n-0x13, 0x02, 0x50, 0x4c, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x41,\n-0x73, 0x73, 0x65, 0x63, 0x6f, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65,\n-0x6d, 0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b,\n-0x13, 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n-0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n-0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x43, 0x65, 0x72, 0x74, 0x75,\n-0x6d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43,\n-0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x33, 0x31, 0x36, 0x31, 0x32, 0x31, 0x30, 0x31,\n-0x33, 0x5a, 0x17, 0x0d, 0x34, 0x33, 0x30, 0x33, 0x31, 0x36, 0x31, 0x32, 0x31, 0x30, 0x31, 0x33,\n-0x5a, 0x30, 0x7a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c,\n-0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x41, 0x73, 0x73, 0x65, 0x63,\n-0x6f, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53,\n-0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65,\n-0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n-0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x1f, 0x30, 0x1d,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54, 0x72,\n-0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02,\n-0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,\n-0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd1, 0x2d,\n-0x8e, 0xbb, 0xb7, 0x36, 0xea, 0x6d, 0x37, 0x91, 0x9f, 0x4e, 0x93, 0xa7, 0x05, 0xe4, 0x29, 0x03,\n-0x25, 0xce, 0x1c, 0x82, 0xf7, 0x7c, 0x99, 0x9f, 0x41, 0x06, 0xcd, 0xed, 0xa3, 0xba, 0xc0, 0xdb,\n-0x09, 0x2c, 0xc1, 0x7c, 0xdf, 0x29, 0x7e, 0x4b, 0x65, 0x2f, 0x93, 0xa7, 0xd4, 0x01, 0x6b, 0x03,\n-0x28, 0x18, 0xa3, 0xd8, 0x9d, 0x05, 0xc1, 0x2a, 0xd8, 0x45, 0xf1, 0x91, 0xde, 0xdf, 0x3b, 0xd0,\n-0x80, 0x02, 0x8c, 0xcf, 0x38, 0x0f, 0xea, 0xa7, 0x5c, 0x78, 0x11, 0xa4, 0xc1, 0xc8, 0x85, 0x5c,\n-0x25, 0xd3, 0xd3, 0xb2, 0xe7, 0x25, 0xcf, 0x11, 0x54, 0x97, 0xab, 0x35, 0xc0, 0x1e, 0x76, 0x1c,\n-0xef, 0x00, 0x53, 0x9f, 0x39, 0xdc, 0x14, 0xa5, 0x2c, 0x22, 0x25, 0xb3, 0x72, 0x72, 0xfc, 0x8d,\n-0xb3, 0xe5, 0x3e, 0x08, 0x1e, 0x14, 0x2a, 0x37, 0x0b, 0x88, 0x3c, 0xca, 0xb0, 0xf4, 0xc8, 0xc2,\n-0xa1, 0xae, 0xbc, 0xc1, 0xbe, 0x29, 0x67, 0x55, 0xe2, 0xfc, 0xad, 0x59, 0x5c, 0xfe, 0xbd, 0x57,\n-0x2c, 0xb0, 0x90, 0x8d, 0xc2, 0xed, 0x37, 0xb6, 0x7c, 0x99, 0x88, 0xb5, 0xd5, 0x03, 0x9a, 0x3d,\n-0x15, 0x0d, 0x3d, 0x3a, 0xa8, 0xa8, 0x45, 0xf0, 0x95, 0x4e, 0x25, 0x59, 0x1d, 0xcd, 0x98, 0x69,\n-0xbb, 0xd3, 0xcc, 0x32, 0xc9, 0x8d, 0xef, 0x81, 0xfe, 0xad, 0x7d, 0x89, 0xbb, 0xba, 0x60, 0x13,\n-0xca, 0x65, 0x95, 0x67, 0xa0, 0xf3, 0x19, 0xf6, 0x03, 0x56, 0xd4, 0x6a, 0xd3, 0x27, 0xe2, 0xa1,\n-0xad, 0x83, 0xf0, 0x4a, 0x12, 0x22, 0x77, 0x1c, 0x05, 0x73, 0xe2, 0x19, 0x71, 0x42, 0xc0, 0xec,\n-0x75, 0x46, 0x9a, 0x90, 0x58, 0xe0, 0x6a, 0x8e, 0x2b, 0xa5, 0x46, 0x30, 0x04, 0x8e, 0x19, 0xb2,\n-0x17, 0xe3, 0xbe, 0xa9, 0xba, 0x7f, 0x56, 0xf1, 0x24, 0x03, 0xd7, 0xb2, 0x21, 0x28, 0x76, 0x0e,\n-0x36, 0x30, 0x4c, 0x79, 0xd5, 0x41, 0x9a, 0x9a, 0xa8, 0xb8, 0x35, 0xba, 0x0c, 0x3a, 0xf2, 0x44,\n-0x1b, 0x20, 0x88, 0xf7, 0xc5, 0x25, 0xd7, 0x3d, 0xc6, 0xe3, 0x3e, 0x43, 0xdd, 0x87, 0xfe, 0xc4,\n-0xea, 0xf5, 0x53, 0x3e, 0x4c, 0x65, 0xff, 0x3b, 0x4a, 0xcb, 0x78, 0x5a, 0x6b, 0x17, 0x5f, 0x0d,\n-0xc7, 0xc3, 0x4f, 0x4e, 0x9a, 0x2a, 0xa2, 0xed, 0x57, 0x4d, 0x22, 0xe2, 0x46, 0x9a, 0x3f, 0x0f,\n-0x91, 0x34, 0x24, 0x7d, 0x55, 0xe3, 0x8c, 0x95, 0x37, 0xd3, 0x1a, 0xf0, 0x09, 0x2b, 0x2c, 0xd2,\n-0xc9, 0x8d, 0xb4, 0x0d, 0x00, 0xab, 0x67, 0x29, 0x28, 0xd8, 0x01, 0xf5, 0x19, 0x04, 0xb6, 0x1d,\n-0xbe, 0x76, 0xfe, 0x72, 0x5c, 0xc4, 0x85, 0xca, 0xd2, 0x80, 0x41, 0xdf, 0x05, 0xa8, 0xa3, 0xd5,\n-0x84, 0x90, 0x4f, 0x0b, 0xf3, 0xe0, 0x3f, 0x9b, 0x19, 0xd2, 0x37, 0x89, 0x3f, 0xf2, 0x7b, 0x52,\n-0x1c, 0x8c, 0xf6, 0xe1, 0xf7, 0x3c, 0x07, 0x97, 0x8c, 0x0e, 0xa2, 0x59, 0x81, 0x0c, 0xb2, 0x90,\n-0x3d, 0xd3, 0xe3, 0x59, 0x46, 0xed, 0x0f, 0xa9, 0xa7, 0xde, 0x80, 0x6b, 0x5a, 0xaa, 0x07, 0xb6,\n-0x19, 0xcb, 0xbc, 0x57, 0xf3, 0x97, 0x21, 0x7a, 0x0c, 0xb1, 0x2b, 0x74, 0x3e, 0xeb, 0xda, 0xa7,\n-0x67, 0x2d, 0x4c, 0xc4, 0x98, 0x9e, 0x36, 0x09, 0x76, 0x66, 0x66, 0xfc, 0x1a, 0x3f, 0xea, 0x48,\n-0x54, 0x1c, 0xbe, 0x30, 0xbd, 0x80, 0x50, 0xbf, 0x7c, 0xb5, 0xce, 0x00, 0xf6, 0x0c, 0x61, 0xd9,\n-0xe7, 0x24, 0x03, 0xe0, 0xe3, 0x01, 0x81, 0x0e, 0xbd, 0xd8, 0x85, 0x34, 0x88, 0xbd, 0xb2, 0x36,\n-0xa8, 0x7b, 0x5c, 0x08, 0xe5, 0x44, 0x80, 0x8c, 0x6f, 0xf8, 0x2f, 0xd5, 0x21, 0xca, 0x1d, 0x1c,\n-0xd0, 0xfb, 0xc4, 0xb5, 0x87, 0xd1, 0x3a, 0x4e, 0xc7, 0x76, 0xb5, 0x35, 0x48, 0xb5, 0x02, 0x03,\n-0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n-0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n-0x16, 0x04, 0x14, 0x8c, 0xfb, 0x1c, 0x75, 0xbc, 0x02, 0xd3, 0x9f, 0x4e, 0x2e, 0x48, 0xd9, 0xf9,\n-0x60, 0x54, 0xaa, 0xc4, 0xb3, 0x4f, 0xfa, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,\n-0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x0d, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x48, 0xa2, 0xd5, 0x00, 0x0b,\n-0x2e, 0xd0, 0x3f, 0xbc, 0x1c, 0xd5, 0xb5, 0x54, 0x49, 0x1e, 0x5a, 0x6b, 0xf4, 0xe4, 0xf2, 0xe0,\n-0x40, 0x37, 0xe0, 0xcc, 0x14, 0x7b, 0xb9, 0xc9, 0xfa, 0x35, 0xb5, 0x75, 0x17, 0x93, 0x6a, 0x05,\n-0x69, 0x85, 0x9c, 0xcd, 0x4f, 0x19, 0x78, 0x5b, 0x19, 0x81, 0xf3, 0x63, 0x3e, 0xc3, 0xce, 0x5b,\n-0x8f, 0xf5, 0x2f, 0x5e, 0x01, 0x76, 0x13, 0x3f, 0x2c, 0x00, 0xb9, 0xcd, 0x96, 0x52, 0x39, 0x49,\n-0x6d, 0x04, 0x4e, 0xc5, 0xe9, 0x0f, 0x86, 0x0d, 0xe1, 0xfa, 0xb3, 0x5f, 0x82, 0x12, 0xf1, 0x3a,\n-0xce, 0x66, 0x06, 0x24, 0x34, 0x2b, 0xe8, 0xcc, 0xca, 0xe7, 0x69, 0xdc, 0x87, 0x9d, 0xc2, 0x34,\n-0xd7, 0x79, 0xd1, 0xd3, 0x77, 0xb8, 0xaa, 0x59, 0x58, 0xfe, 0x9d, 0x26, 0xfa, 0x38, 0x86, 0x3e,\n-0x9d, 0x8a, 0x87, 0x64, 0x57, 0xe5, 0x17, 0x3a, 0xe2, 0xf9, 0x8d, 0xb9, 0xe3, 0x33, 0x78, 0xc1,\n-0x90, 0xd8, 0xb8, 0xdd, 0xb7, 0x83, 0x51, 0xe4, 0xc4, 0xcc, 0x23, 0xd5, 0x06, 0x7c, 0xe6, 0x51,\n-0xd3, 0xcd, 0x34, 0x31, 0xc0, 0xf6, 0x46, 0xbb, 0x0b, 0xad, 0xfc, 0x3d, 0x10, 0x05, 0x2a, 0x3b,\n-0x4a, 0x91, 0x25, 0xee, 0x8c, 0xd4, 0x84, 0x87, 0x80, 0x2a, 0xbc, 0x09, 0x8c, 0xaa, 0x3a, 0x13,\n-0x5f, 0xe8, 0x34, 0x79, 0x50, 0xc1, 0x10, 0x19, 0xf9, 0xd3, 0x28, 0x1e, 0xd4, 0xd1, 0x51, 0x30,\n-0x29, 0xb3, 0xae, 0x90, 0x67, 0xd6, 0x1f, 0x0a, 0x63, 0xb1, 0xc5, 0xa9, 0xc6, 0x42, 0x31, 0x63,\n-0x17, 0x94, 0xef, 0x69, 0xcb, 0x2f, 0xfa, 0x8c, 0x14, 0x7d, 0xc4, 0x43, 0x18, 0x89, 0xd9, 0xf0,\n-0x32, 0x40, 0xe6, 0x80, 0xe2, 0x46, 0x5f, 0xe5, 0xe3, 0xc1, 0x00, 0x59, 0xa8, 0xf9, 0xe8, 0x20,\n-0xbc, 0x89, 0x2c, 0x0e, 0x47, 0x34, 0x0b, 0xea, 0x57, 0xc2, 0x53, 0x36, 0xfc, 0xa7, 0xd4, 0xaf,\n-0x31, 0xcd, 0xfe, 0x02, 0xe5, 0x75, 0xfa, 0xb9, 0x27, 0x09, 0xf9, 0xf3, 0xf5, 0x3b, 0xca, 0x7d,\n-0x9f, 0xa9, 0x22, 0xcb, 0x88, 0xc9, 0xaa, 0xd1, 0x47, 0x3d, 0x36, 0x77, 0xa8, 0x59, 0x64, 0x6b,\n-0x27, 0xcf, 0xef, 0x27, 0xc1, 0xe3, 0x24, 0xb5, 0x86, 0xf7, 0xae, 0x7e, 0x32, 0x4d, 0xb0, 0x79,\n-0x68, 0xd1, 0x39, 0xe8, 0x90, 0x58, 0xc3, 0x83, 0xbc, 0x0f, 0x2c, 0xd6, 0x97, 0xeb, 0xce, 0x0c,\n-0xe1, 0x20, 0xc7, 0xda, 0xb7, 0x3e, 0xc3, 0x3f, 0xbf, 0x2f, 0xdc, 0x34, 0xa4, 0xfb, 0x2b, 0x21,\n-0xcd, 0x67, 0x8f, 0x4b, 0xf4, 0xe3, 0xea, 0xd4, 0x3f, 0xe7, 0x4f, 0xba, 0xb9, 0xa5, 0x93, 0x45,\n-0x1c, 0x66, 0x1f, 0x21, 0xfa, 0x64, 0x5e, 0x6f, 0xe0, 0x76, 0x94, 0x32, 0xcb, 0x75, 0xf5, 0x6e,\n-0xe5, 0xf6, 0x8f, 0xc7, 0xb8, 0xa4, 0xcc, 0xa8, 0x96, 0x7d, 0x64, 0xfb, 0x24, 0x5a, 0x4a, 0x03,\n-0x6c, 0x6b, 0x38, 0xc6, 0xe8, 0x03, 0x43, 0x9a, 0xf7, 0x57, 0xb9, 0xb3, 0x29, 0x69, 0x93, 0x38,\n-0xf4, 0x03, 0xf2, 0xbb, 0xfb, 0x82, 0x6b, 0x07, 0x20, 0xd1, 0x52, 0x1f, 0x9a, 0x64, 0x02, 0x7b,\n-0x98, 0x66, 0xdb, 0x5c, 0x4d, 0x5a, 0x0f, 0xd0, 0x84, 0x95, 0xa0, 0x3c, 0x14, 0x43, 0x06, 0xca,\n-0xca, 0xdb, 0xb8, 0x41, 0x36, 0xda, 0x6a, 0x44, 0x67, 0x87, 0xaf, 0xaf, 0xe3, 0x45, 0x11, 0x15,\n-0x69, 0x08, 0xb2, 0xbe, 0x16, 0x39, 0x97, 0x24, 0x6f, 0x12, 0x45, 0xd1, 0x67, 0x5d, 0x09, 0xa8,\n-0xc9, 0x15, 0xda, 0xfa, 0xd2, 0xa6, 0x5f, 0x13, 0x61, 0x1f, 0xbf, 0x85, 0xac, 0xb4, 0xad, 0xad,\n-0x05, 0x94, 0x08, 0x83, 0x1e, 0x75, 0x17, 0xd3, 0x71, 0x3b, 0x93, 0x50, 0x23, 0x59, 0xa0, 0xed,\n-0x3c, 0x91, 0x54, 0x9d, 0x76, 0x00, 0xc5, 0xc3, 0xb8, 0x38, 0xdb, 0x30, 0x82, 0x05, 0xcf, 0x30,\n-0x82, 0x03, 0xb7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x08, 0x16, 0x5f, 0x8a, 0x4c, 0xa5,\n-0xec, 0x00, 0xc9, 0x93, 0x40, 0xdf, 0xc4, 0xc6, 0xae, 0x23, 0xb8, 0x1c, 0x5a, 0xa4, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x6f, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b, 0x31, 0x12, 0x30, 0x10,\n-0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x09, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67,\n-0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x48, 0x6f, 0x6e, 0x67, 0x20,\n-0x4b, 0x6f, 0x6e, 0x67, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x48,\n-0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20,\n-0x50, 0x6f, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x1e,\n-0x17, 0x0d, 0x31, 0x37, 0x30, 0x36, 0x30, 0x33, 0x30, 0x32, 0x32, 0x39, 0x34, 0x36, 0x5a, 0x17,\n-0x0d, 0x34, 0x32, 0x30, 0x36, 0x30, 0x33, 0x30, 0x32, 0x32, 0x39, 0x34, 0x36, 0x5a, 0x30, 0x6f,\n-0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b, 0x31, 0x12, 0x30,\n-0x10, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x09, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e,\n-0x67, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x48, 0x6f, 0x6e, 0x67,\n-0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d,\n-0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x31, 0x20, 0x30,\n-0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67,\n-0x20, 0x50, 0x6f, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30,\n-0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n-0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00,\n-0xb3, 0x88, 0xd7, 0xea, 0xce, 0x0f, 0x20, 0x4e, 0xbe, 0xe6, 0xd6, 0x03, 0x6d, 0xee, 0x59, 0xfc,\n-0xc2, 0x57, 0xdf, 0x29, 0x68, 0xa1, 0x83, 0x0e, 0x3e, 0x68, 0xc7, 0x68, 0x58, 0x9c, 0x1c, 0x60,\n-0x4b, 0x89, 0x43, 0x0c, 0xb9, 0xd4, 0x15, 0xb2, 0xee, 0xc1, 0x4e, 0x75, 0xe9, 0xb5, 0xa7, 0xef,\n-0xe5, 0xe9, 0x35, 0x99, 0xe4, 0xcc, 0x1c, 0xe7, 0x4b, 0x5f, 0x8d, 0x33, 0x30, 0x20, 0x33, 0x53,\n-0xd9, 0xa6, 0xbb, 0xd5, 0x3e, 0x13, 0x8e, 0xe9, 0x1f, 0x87, 0x49, 0xad, 0x50, 0x2d, 0x50, 0xca,\n-0x18, 0xbe, 0x01, 0x58, 0xa2, 0x13, 0x70, 0x96, 0xbb, 0x89, 0x88, 0x56, 0x80, 0x5c, 0xf8, 0xbd,\n-0x2c, 0x3c, 0xe1, 0x4c, 0x57, 0x88, 0xbb, 0xd3, 0xb9, 0x95, 0xef, 0xcb, 0xc7, 0xf6, 0xda, 0x31,\n-0x74, 0x28, 0xa6, 0xe6, 0x54, 0x89, 0xf5, 0x41, 0x31, 0xca, 0xe5, 0x26, 0x1a, 0xcd, 0x82, 0xe0,\n-0x70, 0xda, 0x3b, 0x29, 0xbb, 0xd5, 0x03, 0xf5, 0x99, 0xba, 0x55, 0xf5, 0x64, 0xd1, 0x60, 0x0e,\n-0xb3, 0x89, 0x49, 0xb8, 0x8a, 0x2f, 0x05, 0xd2, 0x84, 0x45, 0x28, 0x7c, 0x8f, 0x68, 0x50, 0x12,\n-0x78, 0xfc, 0x0b, 0xb5, 0x53, 0xcb, 0xc2, 0x98, 0x1c, 0x84, 0xa3, 0x9e, 0xb0, 0xbe, 0x23, 0xa4,\n-0xda, 0xdc, 0xc8, 0x2b, 0x1e, 0xda, 0x6e, 0x45, 0x1e, 0x89, 0x98, 0xda, 0xf9, 0x00, 0x2e, 0x06,\n-0xe9, 0x0c, 0x3b, 0x70, 0xd5, 0x50, 0x25, 0x88, 0x99, 0xcb, 0xcd, 0x73, 0x60, 0xf7, 0xd5, 0xff,\n-0x35, 0x67, 0xc5, 0xa1, 0xbc, 0x5e, 0xab, 0xcd, 0x4a, 0xb8, 0x45, 0xeb, 0xc8, 0x68, 0x1e, 0x0d,\n-0x0d, 0x14, 0x46, 0x12, 0xe3, 0xd2, 0x64, 0x62, 0x8a, 0x42, 0x98, 0xbc, 0xb4, 0xc6, 0x08, 0x08,\n-0xf8, 0xfd, 0xa8, 0x4c, 0x64, 0x9c, 0x76, 0x01, 0xbd, 0x2f, 0xa9, 0x6c, 0x33, 0x0f, 0xd8, 0x3f,\n-0x28, 0xb8, 0x3c, 0x69, 0x01, 0x42, 0x86, 0x7e, 0x69, 0xc1, 0xc9, 0x06, 0xca, 0xe5, 0x7a, 0x46,\n-0x65, 0xe9, 0xc2, 0xd6, 0x50, 0x41, 0x2e, 0x3f, 0xb7, 0xe4, 0xed, 0x6c, 0xd7, 0xbf, 0x26, 0x01,\n-0x11, 0xa2, 0x16, 0x29, 0x4a, 0x6b, 0x34, 0x06, 0x90, 0xec, 0x13, 0xd2, 0xb6, 0xfb, 0x6a, 0x76,\n-0xd2, 0x3c, 0xed, 0xf0, 0xd6, 0x2d, 0xdd, 0xe1, 0x15, 0xec, 0xa3, 0x9b, 0x2f, 0x2c, 0xc9, 0x3e,\n-0x2b, 0xe4, 0x69, 0x3b, 0xff, 0x72, 0x25, 0xb1, 0x36, 0x86, 0x5b, 0xc7, 0x7f, 0x6b, 0x8b, 0x55,\n-0x1b, 0x4a, 0xc5, 0x20, 0x61, 0x3d, 0xae, 0xcb, 0x50, 0xe1, 0x08, 0x3a, 0xbe, 0xb0, 0x8f, 0x63,\n-0x41, 0x53, 0x30, 0x08, 0x59, 0x3c, 0x98, 0x1d, 0x77, 0xba, 0x63, 0x91, 0x7a, 0xca, 0x10, 0x50,\n-0x60, 0xbf, 0xf0, 0xd7, 0xbc, 0x95, 0x87, 0x8f, 0x97, 0xc5, 0xfe, 0x97, 0x6a, 0x01, 0x94, 0xa3,\n-0x7c, 0x5b, 0x85, 0x1d, 0x2a, 0x39, 0x3a, 0xd0, 0x54, 0xa1, 0xd1, 0x39, 0x71, 0x9d, 0xfd, 0x21,\n-0xf9, 0xb5, 0x7b, 0xf0, 0xe2, 0xe0, 0x02, 0x8f, 0x6e, 0x96, 0x24, 0x25, 0x2c, 0xa0, 0x1e, 0x2c,\n-0xa8, 0xc4, 0x89, 0xa7, 0xef, 0xed, 0x99, 0x06, 0x2f, 0xb6, 0x0a, 0x4c, 0x4f, 0xdb, 0xa2, 0xcc,\n-0x37, 0x1a, 0xaf, 0x47, 0x85, 0x2d, 0x8a, 0x5f, 0xc4, 0x34, 0x34, 0x4c, 0x00, 0xfd, 0x18, 0x93,\n-0x67, 0x13, 0xd1, 0x37, 0xe6, 0x48, 0xb4, 0x8b, 0x06, 0xc5, 0x57, 0x7b, 0x19, 0x86, 0x0a, 0x79,\n-0xcb, 0x00, 0xc9, 0x52, 0xaf, 0x42, 0xff, 0x37, 0x8f, 0xe1, 0xa3, 0x1e, 0x7a, 0x3d, 0x50, 0xab,\n-0x63, 0x06, 0xe7, 0x15, 0xb5, 0x3f, 0xb6, 0x45, 0x37, 0x94, 0x37, 0xb1, 0x7e, 0xf2, 0x48, 0xc3,\n-0x7f, 0xc5, 0x75, 0xfe, 0x97, 0x8d, 0x45, 0x8f, 0x1a, 0xa7, 0x1a, 0x72, 0x28, 0x1a, 0x40, 0x0f,\n-0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n-0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n-0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,\n-0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x17, 0x9d, 0xcd, 0x1e, 0x8b, 0xd6, 0x39, 0x2b, 0x70,\n-0xd3, 0x5c, 0xd4, 0xa0, 0xb8, 0x1f, 0xb0, 0x00, 0xfc, 0xc5, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55,\n-0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x17, 0x9d, 0xcd, 0x1e, 0x8b, 0xd6, 0x39, 0x2b, 0x70, 0xd3,\n-0x5c, 0xd4, 0xa0, 0xb8, 0x1f, 0xb0, 0x00, 0xfc, 0xc5, 0x61, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x56, 0xd5,\n-0x7b, 0x6e, 0xe6, 0x22, 0x01, 0xd2, 0x42, 0x9b, 0x18, 0xd5, 0x0e, 0xd7, 0x66, 0x23, 0x5c, 0xe3,\n-0xfe, 0xa0, 0xc7, 0x92, 0xd2, 0xe9, 0x94, 0xad, 0x4b, 0xa2, 0xc6, 0xec, 0x12, 0x7c, 0x74, 0xd5,\n-0x48, 0xd2, 0x59, 0x14, 0x99, 0xc0, 0xeb, 0xb9, 0xd1, 0xeb, 0xf4, 0x48, 0x30, 0x5b, 0xad, 0xa7,\n-0x57, 0x73, 0x99, 0xa9, 0xd3, 0xe5, 0xb7, 0xd1, 0x2e, 0x59, 0x24, 0x58, 0xdc, 0x68, 0x2e, 0x2e,\n-0x62, 0xd8, 0x6a, 0xe4, 0x70, 0x0b, 0x2d, 0x20, 0x50, 0x20, 0xa4, 0x32, 0x95, 0xd1, 0x00, 0x98,\n-0xbb, 0xd3, 0xfd, 0xf7, 0x32, 0xf2, 0x49, 0xae, 0xc6, 0x7a, 0xe0, 0x47, 0xbe, 0x6e, 0xce, 0xcb,\n-0xa3, 0x72, 0x3a, 0x2d, 0x69, 0x5d, 0xcb, 0xc8, 0xe8, 0x45, 0x39, 0xd4, 0xfa, 0x42, 0xc1, 0x11,\n-0x4c, 0x77, 0x5d, 0x92, 0xfb, 0x6a, 0xff, 0x58, 0x44, 0xe5, 0xeb, 0x81, 0x9e, 0xaf, 0xa0, 0x99,\n-0xad, 0xbe, 0xa9, 0x01, 0x66, 0xcb, 0x38, 0x1d, 0x3c, 0xdf, 0x43, 0x1f, 0xf4, 0x4d, 0x6e, 0xb4,\n-0xba, 0x17, 0x46, 0xfc, 0x7d, 0xfd, 0x87, 0x81, 0x79, 0x6a, 0x0d, 0x33, 0x0f, 0xfa, 0x2f, 0xf8,\n-0x14, 0xb9, 0x80, 0xb3, 0x5d, 0x4d, 0xaa, 0x97, 0xe1, 0xf9, 0xe4, 0x18, 0xc5, 0xf8, 0xd5, 0x38,\n-0x8c, 0x26, 0x3c, 0xfd, 0xf2, 0x28, 0xe2, 0xee, 0x5a, 0x49, 0x88, 0x2c, 0xdf, 0x79, 0x3d, 0x8e,\n-0x9e, 0x90, 0x3c, 0xbd, 0x41, 0x4a, 0x3a, 0xdd, 0x5b, 0xf6, 0x9a, 0xb4, 0xce, 0x3f, 0x25, 0x30,\n-0x7f, 0x32, 0x7d, 0xa2, 0x03, 0x94, 0xd0, 0xdc, 0x7a, 0xa1, 0x52, 0xde, 0x6e, 0x93, 0x8d, 0x18,\n-0x26, 0xfd, 0x55, 0xac, 0xbd, 0x8f, 0x9b, 0xd2, 0xcf, 0xaf, 0xe7, 0x86, 0x2c, 0xcb, 0x1f, 0x09,\n-0x6f, 0xa3, 0x6f, 0xa9, 0x84, 0xd4, 0x73, 0xbf, 0x4d, 0xa1, 0x74, 0x1b, 0x4e, 0x23, 0x60, 0xf2,\n-0xcc, 0x0e, 0xaa, 0x7f, 0xa4, 0x9c, 0x4c, 0x25, 0xa8, 0xb2, 0x66, 0x3b, 0x38, 0xff, 0xd9, 0x94,\n-0x30, 0xf6, 0x72, 0x84, 0xbe, 0x68, 0x55, 0x10, 0x0f, 0xc6, 0x73, 0x2c, 0x16, 0x69, 0x93, 0x07,\n-0xfe, 0xb1, 0x45, 0xed, 0xbb, 0xa2, 0x55, 0x6a, 0xb0, 0xda, 0xb5, 0x4a, 0x02, 0x25, 0x27, 0x85,\n-0xd7, 0xb7, 0xb7, 0x86, 0x44, 0x16, 0x89, 0x6c, 0x80, 0x2b, 0x3e, 0x97, 0xa9, 0x9c, 0xd5, 0x7e,\n-0x55, 0x4c, 0xc6, 0xde, 0x45, 0x10, 0x1c, 0xea, 0xe9, 0x3b, 0x9f, 0x03, 0x53, 0xee, 0xee, 0x7a,\n-0x01, 0x02, 0x16, 0x78, 0xd4, 0xe8, 0xc2, 0xbe, 0x46, 0x76, 0x88, 0x13, 0x3f, 0x22, 0xbb, 0x48,\n-0x12, 0x1d, 0x52, 0x00, 0xb4, 0x02, 0x7e, 0x21, 0x1a, 0x1e, 0x9c, 0x25, 0xf4, 0xf3, 0x3d, 0x5e,\n-0x1e, 0xd2, 0x1c, 0xf9, 0xb3, 0x2d, 0xb6, 0xf7, 0x37, 0x5c, 0xc6, 0xcb, 0x21, 0x4e, 0xb0, 0xf7,\n-0x99, 0x47, 0x18, 0x85, 0xc1, 0x2b, 0xba, 0x55, 0xae, 0x06, 0xea, 0xd0, 0x07, 0xb2, 0xdc, 0xab,\n-0xd0, 0x82, 0x96, 0x75, 0xce, 0xd2, 0x50, 0xfe, 0x99, 0xe7, 0xcf, 0x2f, 0x9f, 0xe7, 0x76, 0xd1,\n-0x61, 0x2a, 0xfb, 0x21, 0xbb, 0x31, 0xd0, 0xaa, 0x9f, 0x47, 0xa4, 0xb2, 0x22, 0xca, 0x16, 0x3a,\n-0x50, 0x57, 0xc4, 0x5b, 0x43, 0x67, 0xc5, 0x65, 0x62, 0x03, 0x49, 0x01, 0xeb, 0x43, 0xd9, 0xd8,\n-0xf8, 0x9e, 0xad, 0xcf, 0xb1, 0x63, 0x0e, 0x45, 0xf4, 0xa0, 0x5a, 0x2c, 0x9b, 0x2d, 0xc5, 0xa6,\n-0xc0, 0xad, 0xa8, 0x47, 0xf4, 0x27, 0x4c, 0x38, 0x0d, 0x2e, 0x1b, 0x49, 0x3b, 0x52, 0xf4, 0xe8,\n-0x88, 0x83, 0x2b, 0x54, 0x28, 0xd4, 0xf2, 0x35, 0x52, 0xb4, 0x32, 0x83, 0x62, 0x69, 0x64, 0x0c,\n-0x91, 0x9c, 0x9f, 0x97, 0xea, 0x74, 0x16, 0xfd, 0x1f, 0x11, 0x06, 0x9a, 0x9b, 0xf4, 0x30, 0x82,\n-0x05, 0xeb, 0x30, 0x82, 0x03, 0xd3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x56, 0xb6, 0x29,\n-0xcd, 0x34, 0xbc, 0x78, 0xf6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n-0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54,\n-0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48,\n-0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,\n-0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n-0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x53, 0x53, 0x4c, 0x2e, 0x63,\n-0x6f, 0x6d, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n-0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,\n-0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30,\n-0x35, 0x33, 0x31, 0x31, 0x38, 0x31, 0x34, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x35,\n-0x33, 0x30, 0x31, 0x38, 0x31, 0x34, 0x33, 0x37, 0x5a, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09,\n-0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55,\n-0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,\n-0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72,\n-0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e,\n-0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n-0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75,\n-0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x32, 0x30, 0x82,\n-0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n-0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x8f,\n-0x36, 0x65, 0x40, 0xe1, 0xd6, 0x4d, 0xc0, 0xd7, 0xb4, 0xe9, 0x46, 0xda, 0x6b, 0xea, 0x33, 0x47,\n-0xcd, 0x4c, 0xf9, 0x7d, 0x7d, 0xbe, 0xbd, 0x2d, 0x3d, 0xf0, 0xdb, 0x78, 0xe1, 0x86, 0xa5, 0xd9,\n-0xba, 0x09, 0x57, 0x68, 0xed, 0x57, 0x3e, 0xa0, 0xd0, 0x08, 0x41, 0x83, 0xe7, 0x28, 0x41, 0x24,\n-0x1f, 0xe3, 0x72, 0x15, 0xd0, 0x01, 0x1a, 0xfb, 0x5e, 0x70, 0x23, 0xb2, 0xcb, 0x9f, 0x39, 0xe3,\n-0xcf, 0xc5, 0x4e, 0xc6, 0x92, 0x6d, 0x26, 0xc6, 0x7b, 0xbb, 0xb3, 0xda, 0x27, 0x9d, 0x0a, 0x86,\n-0xe9, 0x81, 0x37, 0x05, 0xfe, 0xf0, 0x71, 0x71, 0xec, 0xc3, 0x1c, 0xe9, 0x63, 0xa2, 0x17, 0x14,\n-0x9d, 0xef, 0x1b, 0x67, 0xd3, 0x85, 0x55, 0x02, 0x02, 0xd6, 0x49, 0xc9, 0xcc, 0x5a, 0xe1, 0xb1,\n-0xf7, 0x6f, 0x32, 0x9f, 0xc9, 0xd4, 0x3b, 0x88, 0x41, 0xa8, 0x9c, 0xbd, 0xcb, 0xab, 0xdb, 0x6d,\n-0x7b, 0x09, 0x1f, 0xa2, 0x4c, 0x72, 0x90, 0xda, 0x2b, 0x08, 0xfc, 0xcf, 0x3c, 0x54, 0xce, 0x67,\n-0x0f, 0xa8, 0xcf, 0x5d, 0x96, 0x19, 0x0b, 0xc4, 0xe3, 0x72, 0xeb, 0xad, 0xd1, 0x7d, 0x1d, 0x27,\n-0xef, 0x92, 0xeb, 0x10, 0xbf, 0x5b, 0xeb, 0x3b, 0xaf, 0xcf, 0x80, 0xdd, 0xc1, 0xd2, 0x96, 0x04,\n-0x5b, 0x7a, 0x7e, 0xa4, 0xa9, 0x3c, 0x38, 0x76, 0xa4, 0x62, 0x8e, 0xa0, 0x39, 0x5e, 0xea, 0x77,\n-0xcf, 0x5d, 0x00, 0x59, 0x8f, 0x66, 0x2c, 0x3e, 0x07, 0xa2, 0xa3, 0x05, 0x26, 0x11, 0x69, 0x97,\n-0xea, 0x85, 0xb7, 0x0f, 0x96, 0x0b, 0x4b, 0xc8, 0x40, 0xe1, 0x50, 0xba, 0x2e, 0x8a, 0xcb, 0xf7,\n-0x0f, 0x9a, 0x22, 0xe7, 0x7f, 0x9a, 0x37, 0x13, 0xcd, 0xf2, 0x4d, 0x13, 0x6b, 0x21, 0xd1, 0xc0,\n-0xcc, 0x22, 0xf2, 0xa1, 0x46, 0xf6, 0x44, 0x69, 0x9c, 0xca, 0x61, 0x35, 0x07, 0x00, 0x6f, 0xd6,\n-0x61, 0x08, 0x11, 0xea, 0xba, 0xb8, 0xf6, 0xe9, 0xb3, 0x60, 0xe5, 0x4d, 0xb9, 0xec, 0x9f, 0x14,\n-0x66, 0xc9, 0x57, 0x58, 0xdb, 0xcd, 0x87, 0x69, 0xf8, 0x8a, 0x86, 0x12, 0x03, 0x47, 0xbf, 0x66,\n-0x13, 0x76, 0xac, 0x77, 0x7d, 0x34, 0x24, 0x85, 0x83, 0xcd, 0xd7, 0xaa, 0x9c, 0x90, 0x1a, 0x9f,\n-0x21, 0x2c, 0x7f, 0x78, 0xb7, 0x64, 0xb8, 0xd8, 0xe8, 0xa6, 0xf4, 0x78, 0xb3, 0x55, 0xcb, 0x84,\n-0xd2, 0x32, 0xc4, 0x78, 0xae, 0xa3, 0x8f, 0x61, 0xdd, 0xce, 0x08, 0x53, 0xad, 0xec, 0x88, 0xfc,\n-0x15, 0xe4, 0x9a, 0x0d, 0xe6, 0x9f, 0x1a, 0x77, 0xce, 0x4c, 0x8f, 0xb8, 0x14, 0x15, 0x3d, 0x62,\n-0x9c, 0x86, 0x38, 0x06, 0x00, 0x66, 0x12, 0xe4, 0x59, 0x76, 0x5a, 0x53, 0xc0, 0x02, 0x98, 0xa2,\n-0x10, 0x2b, 0x68, 0x44, 0x7b, 0x8e, 0x79, 0xce, 0x33, 0x4a, 0x76, 0xaa, 0x5b, 0x81, 0x16, 0x1b,\n-0xb5, 0x8a, 0xd8, 0xd0, 0x00, 0x7b, 0x5e, 0x62, 0xb4, 0x09, 0xd6, 0x86, 0x63, 0x0e, 0xa6, 0x05,\n-0x95, 0x49, 0xba, 0x28, 0x8b, 0x88, 0x93, 0xb2, 0x34, 0x1c, 0xd8, 0xa4, 0x55, 0x6e, 0xb7, 0x1c,\n-0xd0, 0xde, 0x99, 0x55, 0x3b, 0x23, 0xf4, 0x22, 0xe0, 0xf9, 0x29, 0x66, 0x26, 0xec, 0x20, 0x50,\n-0x77, 0xdb, 0x4a, 0x0b, 0x8f, 0xbe, 0xe5, 0x02, 0x60, 0x70, 0x41, 0x5e, 0xd4, 0xae, 0x50, 0x39,\n-0x22, 0x14, 0x26, 0xcb, 0xb2, 0x3b, 0x73, 0x74, 0x55, 0x47, 0x07, 0x79, 0x81, 0x39, 0xa8, 0x30,\n-0x13, 0x44, 0xe5, 0x04, 0x8a, 0xae, 0x96, 0x13, 0x25, 0x42, 0x0f, 0xb9, 0x53, 0xc4, 0x9b, 0xfc,\n-0xcd, 0xe4, 0x1c, 0xde, 0x3c, 0xfa, 0xab, 0xd6, 0x06, 0x4a, 0x1f, 0x67, 0xa6, 0x98, 0x30, 0x1c,\n-0xdd, 0x2c, 0xdb, 0xdc, 0x18, 0x95, 0x57, 0x66, 0xc6, 0xff, 0x5c, 0x8b, 0x56, 0xf5, 0x77, 0x02,\n-0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,\n-0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,\n-0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xf9, 0x60, 0xbb, 0xd4, 0xe3, 0xd5, 0x34, 0xf6, 0xb8, 0xf5,\n-0x06, 0x80, 0x25, 0xa7, 0x73, 0xdb, 0x46, 0x69, 0xa8, 0x9e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n-0x0e, 0x04, 0x16, 0x04, 0x14, 0xf9, 0x60, 0xbb, 0xd4, 0xe3, 0xd5, 0x34, 0xf6, 0xb8, 0xf5, 0x06,\n-0x80, 0x25, 0xa7, 0x73, 0xdb, 0x46, 0x69, 0xa8, 0x9e, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f,\n-0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n-0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x56, 0xb3, 0x8e,\n-0xcb, 0x0a, 0x9d, 0x49, 0x8e, 0xbf, 0xa4, 0xc4, 0x91, 0xbb, 0x66, 0x17, 0x05, 0x51, 0x98, 0x75,\n-0xfb, 0xe5, 0x50, 0x2c, 0x7a, 0x9e, 0xf1, 0x14, 0xfa, 0xab, 0xd3, 0x8a, 0x3e, 0xff, 0x91, 0x29,\n-0x8f, 0x63, 0x8b, 0xd8, 0xb4, 0xa9, 0x54, 0x01, 0x0d, 0xbe, 0x93, 0x86, 0x2f, 0xf9, 0x4a, 0x6d,\n-0xc7, 0x5e, 0xf5, 0x57, 0xf9, 0xca, 0x55, 0x1c, 0x12, 0xbe, 0x47, 0x0f, 0x36, 0xc5, 0xdf, 0x6a,\n-0xb7, 0xdb, 0x75, 0xc2, 0x47, 0x25, 0x7f, 0xb9, 0xf1, 0x63, 0xf8, 0x68, 0x2d, 0x55, 0x04, 0xd1,\n-0xf2, 0x8d, 0xb0, 0xa4, 0xcf, 0xbc, 0x3c, 0x5e, 0x1f, 0x78, 0xe7, 0xa5, 0xa0, 0x20, 0x70, 0xb0,\n-0x04, 0xc5, 0xb7, 0xf7, 0x72, 0xa7, 0xde, 0x22, 0x0d, 0xbd, 0x33, 0x25, 0x46, 0x8c, 0x64, 0x92,\n-0x26, 0xe3, 0x3e, 0x2e, 0x63, 0x96, 0xda, 0x9b, 0x8c, 0x3d, 0xf8, 0x18, 0x09, 0xd7, 0x03, 0xcc,\n-0x7d, 0x86, 0x82, 0xe0, 0xca, 0x04, 0x07, 0x51, 0x50, 0xd7, 0xff, 0x92, 0xd5, 0x0c, 0xef, 0xda,\n-0x86, 0x9f, 0x99, 0xd7, 0xeb, 0xb7, 0xaf, 0x68, 0xe2, 0x39, 0x26, 0x94, 0xba, 0x68, 0xb7, 0xbf,\n-0x83, 0xd3, 0xea, 0x7a, 0x67, 0x3d, 0x62, 0x67, 0xae, 0x25, 0xe5, 0x72, 0xe8, 0xe2, 0xe4, 0xec,\n-0xae, 0x12, 0xf6, 0x4b, 0x2b, 0x3c, 0x9f, 0xe9, 0xb0, 0x40, 0xf3, 0x38, 0x54, 0xb3, 0xfd, 0xb7,\n-0x68, 0xc8, 0xda, 0xc6, 0x8f, 0x51, 0x3c, 0xb2, 0xfb, 0x91, 0xdc, 0x1c, 0xe7, 0x9b, 0x9d, 0xe1,\n-0xb7, 0x0d, 0x72, 0x8f, 0xe2, 0xa4, 0xc4, 0xa9, 0x78, 0xf9, 0xeb, 0x14, 0xac, 0xc6, 0x43, 0x05,\n-0xc2, 0x65, 0x39, 0x28, 0x18, 0x02, 0xc3, 0x82, 0xb2, 0x9d, 0x05, 0xbe, 0x65, 0xed, 0x96, 0x5f,\n-0x65, 0x74, 0x3c, 0xfb, 0x09, 0x35, 0x2e, 0x7b, 0x9c, 0x13, 0xfd, 0x1b, 0x0f, 0x5d, 0xc7, 0x6d,\n-0x81, 0x3a, 0x56, 0x0f, 0xcc, 0x3b, 0xe1, 0xaf, 0x02, 0x2f, 0x22, 0xac, 0x46, 0xca, 0x46, 0x3c,\n-0xa0, 0x1c, 0x4c, 0xd6, 0x44, 0xb4, 0x5e, 0x2e, 0x5c, 0x15, 0x66, 0x09, 0xe1, 0x26, 0x29, 0xfe,\n-0xc6, 0x52, 0x61, 0xba, 0xb1, 0x73, 0xff, 0xc3, 0x0c, 0x9c, 0xe5, 0x6c, 0x6a, 0x94, 0x3f, 0x14,\n-0xca, 0x40, 0x16, 0x95, 0x84, 0xf3, 0x59, 0xa9, 0xac, 0x5f, 0x4c, 0x61, 0x93, 0x6d, 0xd1, 0x3b,\n-0xcc, 0xa2, 0x95, 0x0c, 0x22, 0xa6, 0x67, 0x67, 0x44, 0x2e, 0xb9, 0xd9, 0xd2, 0x8a, 0x41, 0xb3,\n-0x66, 0x0b, 0x5a, 0xfb, 0x7d, 0x23, 0xa5, 0xf2, 0x1a, 0xb0, 0xff, 0xde, 0x9b, 0x83, 0x94, 0x2e,\n-0xd1, 0x3f, 0xdf, 0x92, 0xb7, 0x91, 0xaf, 0x05, 0x3b, 0x65, 0xc7, 0xa0, 0x6c, 0xb1, 0xcd, 0x62,\n-0x12, 0xc3, 0x90, 0x1b, 0xe3, 0x25, 0xce, 0x34, 0xbc, 0x6f, 0x77, 0x76, 0xb1, 0x10, 0xc3, 0xf7,\n-0x05, 0x1a, 0xc0, 0xd6, 0xaf, 0x74, 0x62, 0x48, 0x17, 0x77, 0x92, 0x69, 0x90, 0x61, 0x1c, 0xde,\n-0x95, 0x80, 0x74, 0x54, 0x8f, 0x18, 0x1c, 0xc3, 0xf3, 0x03, 0xd0, 0xbf, 0xa4, 0x43, 0x75, 0x86,\n-0x53, 0x18, 0x7a, 0x0a, 0x2e, 0x09, 0x1c, 0x36, 0x9f, 0x91, 0xfd, 0x82, 0x8a, 0x22, 0x4b, 0xd1,\n-0x0e, 0x50, 0x25, 0xdd, 0xcb, 0x03, 0x0c, 0x17, 0xc9, 0x83, 0x00, 0x08, 0x4e, 0x35, 0x4d, 0x8a,\n-0x8b, 0xed, 0xf0, 0x02, 0x94, 0x66, 0x2c, 0x44, 0x7f, 0xcb, 0x95, 0x27, 0x96, 0x17, 0xad, 0x09,\n-0x30, 0xac, 0xb6, 0x71, 0x17, 0x6e, 0x8b, 0x17, 0xf6, 0x1c, 0x09, 0xd4, 0x2d, 0x3b, 0x98, 0xa5,\n-0x71, 0xd3, 0x54, 0x13, 0xd9, 0x60, 0xf3, 0xf5, 0x4b, 0x66, 0x4f, 0xfa, 0xf1, 0xee, 0x20, 0x12,\n-0x8d, 0xb4, 0xac, 0x57, 0xb1, 0x45, 0x63, 0xa1, 0xac, 0x76, 0xa9, 0xc2, 0xfb, 0x30, 0x82, 0x05,\n-0x47, 0x30, 0x82, 0x03, 0x2f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x11, 0x00, 0x34, 0xb6,\n-0x4e, 0xc6, 0x36, 0x2d, 0x36, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x0b, 0x05, 0x00, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x52, 0x4f, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x43, 0x45,\n-0x52, 0x54, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x53, 0x41, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55,\n-0x04, 0x0b, 0x13, 0x13, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x52, 0x4f, 0x4f,\n-0x54, 0x20, 0x43, 0x41, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x32, 0x30,\n-0x36, 0x30, 0x39, 0x32, 0x37, 0x33, 0x35, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x32, 0x30, 0x36,\n-0x30, 0x39, 0x32, 0x37, 0x33, 0x35, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n-0x04, 0x06, 0x13, 0x02, 0x52, 0x4f, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n-0x0b, 0x43, 0x45, 0x52, 0x54, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x53, 0x41, 0x31, 0x1c, 0x30, 0x1a,\n-0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x13, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x20,\n-0x52, 0x4f, 0x4f, 0x54, 0x20, 0x43, 0x41, 0x20, 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02,\n-0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc0, 0xc5, 0x75, 0x19, 0x91,\n-0x7d, 0x44, 0x74, 0x74, 0x87, 0xfe, 0x0e, 0x3b, 0x96, 0xdc, 0xd8, 0x01, 0x16, 0xcc, 0xee, 0x63,\n-0x91, 0xe7, 0x0b, 0x6f, 0xce, 0x3b, 0x0a, 0x69, 0x1a, 0x7c, 0xc2, 0xe3, 0xaf, 0x82, 0x8e, 0x86,\n-0xd7, 0x5e, 0x8f, 0x57, 0xeb, 0xd3, 0x21, 0x59, 0xfd, 0x39, 0x37, 0x42, 0x30, 0xbe, 0x50, 0xea,\n-0xb6, 0x0f, 0xa9, 0x88, 0xd8, 0x2e, 0x2d, 0x69, 0x21, 0xe7, 0xd1, 0x37, 0x18, 0x4e, 0x7d, 0x91,\n-0xd5, 0x16, 0x5f, 0x6b, 0x5b, 0x00, 0xc2, 0x39, 0x43, 0x0d, 0x36, 0x85, 0x52, 0xb9, 0x53, 0x65,\n-0x0f, 0x1d, 0x42, 0xe5, 0x8f, 0xcf, 0x05, 0xd3, 0xee, 0xdc, 0x0c, 0x1a, 0xd9, 0xb8, 0x8b, 0x78,\n-0x22, 0x67, 0xe4, 0x69, 0xb0, 0x68, 0xc5, 0x3c, 0xe4, 0x6c, 0x5a, 0x46, 0xe7, 0xcd, 0xc7, 0xfa,\n-0xef, 0xc4, 0xec, 0x4b, 0xbd, 0x6a, 0xa4, 0xac, 0xfd, 0xcc, 0x28, 0x51, 0xef, 0x92, 0xb4, 0x29,\n-0xab, 0xab, 0x35, 0x9a, 0x4c, 0xe4, 0xc4, 0x08, 0xc6, 0x26, 0xcc, 0xf8, 0x69, 0x9f, 0xe4, 0x9c,\n-0xf0, 0x29, 0xd3, 0x5c, 0xf9, 0xc6, 0x16, 0x25, 0x9e, 0x23, 0xc3, 0x20, 0xc1, 0x3d, 0x0f, 0x3f,\n-0x38, 0x40, 0xb0, 0xfe, 0x82, 0x44, 0x38, 0xaa, 0x5a, 0x1a, 0x8a, 0x6b, 0x63, 0x58, 0x38, 0xb4,\n-0x15, 0xd3, 0xb6, 0x11, 0x69, 0x7b, 0x1e, 0x54, 0xee, 0x8c, 0x1a, 0x22, 0xac, 0x72, 0x97, 0x3f,\n-0x23, 0x59, 0x9b, 0xc9, 0x22, 0x84, 0xc1, 0x07, 0x4f, 0xcc, 0x7f, 0xe2, 0x57, 0xca, 0x12, 0x70,\n-0xbb, 0xa6, 0x65, 0xf3, 0x69, 0x75, 0x63, 0xbd, 0x95, 0xfb, 0x1b, 0x97, 0xcd, 0xe4, 0xa8, 0xaf,\n-0xf6, 0xd1, 0x4e, 0xa8, 0xd9, 0x8a, 0x71, 0x24, 0xcd, 0x36, 0x3d, 0xbc, 0x96, 0xc4, 0xf1, 0x6c,\n-0xa9, 0xae, 0xe5, 0xcf, 0x0d, 0x6e, 0x28, 0x0d, 0xb0, 0x0e, 0xb5, 0xca, 0x51, 0x7b, 0x78, 0x14,\n-0xc3, 0x20, 0x2f, 0x7f, 0xfb, 0x14, 0x55, 0xe1, 0x11, 0x99, 0xfd, 0xd5, 0x0a, 0xa1, 0x9e, 0x02,\n-0xe3, 0x62, 0x5f, 0xeb, 0x35, 0x4b, 0x2c, 0xb8, 0x72, 0xe8, 0x3e, 0x3d, 0x4f, 0xac, 0x2c, 0xbb,\n-0x2e, 0x86, 0xe2, 0xa3, 0x76, 0x8f, 0xe5, 0x93, 0x2a, 0xcf, 0xa5, 0xab, 0xc8, 0x5c, 0x8d, 0x4b,\n-0x06, 0xff, 0x12, 0x46, 0xac, 0x78, 0xcb, 0x14, 0x07, 0x35, 0xe0, 0xa9, 0xdf, 0x8b, 0xe9, 0xaf,\n-0x15, 0x4f, 0x16, 0x89, 0x5b, 0xbd, 0xf6, 0x8d, 0xc6, 0x59, 0xae, 0x88, 0x85, 0x0e, 0xc1, 0x89,\n-0xeb, 0x1f, 0x67, 0xc5, 0x45, 0x8e, 0xff, 0x6d, 0x37, 0x36, 0x2b, 0x78, 0x66, 0x83, 0x91, 0x51,\n-0x2b, 0x3d, 0xff, 0x51, 0x77, 0x76, 0x62, 0xa1, 0xec, 0x67, 0x3e, 0x3e, 0x81, 0x83, 0xe0, 0x56,\n-0xa9, 0x50, 0x1f, 0x1f, 0x7a, 0x99, 0xab, 0x63, 0xbf, 0x84, 0x17, 0x77, 0xf1, 0x0d, 0x3b, 0xdf,\n-0xf7, 0x9c, 0x61, 0xb3, 0x35, 0x98, 0x8a, 0x3a, 0xb2, 0xec, 0x3c, 0x1a, 0x37, 0x3f, 0x7e, 0x8f,\n-0x92, 0xcf, 0xd9, 0x12, 0x14, 0x64, 0xda, 0x10, 0x02, 0x15, 0x41, 0xff, 0x4f, 0xc4, 0xeb, 0x1c,\n-0xa3, 0xc9, 0xfa, 0x99, 0xf7, 0x46, 0xe9, 0xe1, 0x18, 0xd9, 0xb1, 0xb8, 0x32, 0x2d, 0xcb, 0x14,\n-0x0c, 0x50, 0xd8, 0x83, 0x65, 0x83, 0xee, 0xb9, 0x5c, 0xcf, 0xcb, 0x05, 0x5a, 0x4c, 0xfa, 0x19,\n-0x97, 0x6b, 0xd6, 0x5d, 0x13, 0xd3, 0xc2, 0x5c, 0x54, 0xbc, 0x32, 0x73, 0xa0, 0x78, 0xf5, 0xf1,\n-0x6d, 0x1e, 0xcb, 0x9f, 0xa5, 0xa6, 0x9f, 0x22, 0xdc, 0xd1, 0x51, 0x9e, 0x82, 0x79, 0x64, 0x60,\n-0x29, 0x13, 0x3e, 0xa3, 0xfd, 0x4f, 0x72, 0x6a, 0xab, 0xe2, 0xd4, 0xe5, 0xb8, 0x24, 0x55, 0x2c,\n-0x44, 0x4b, 0x8a, 0x88, 0x44, 0x9c, 0xca, 0x84, 0xd3, 0x2a, 0x3b, 0x02, 0x03, 0x01, 0x00, 0x01,\n-0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n-0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n-0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n-0x82, 0x21, 0x2d, 0x66, 0xc6, 0xd7, 0xa0, 0xe0, 0x15, 0xeb, 0xce, 0x4c, 0x09, 0x77, 0xc4, 0x60,\n-0x9e, 0x54, 0x6e, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n-0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x60, 0xde, 0x1a, 0xb8, 0xe7, 0xf2, 0x60, 0x82,\n-0xd5, 0x03, 0x33, 0x81, 0xcb, 0x06, 0x8a, 0xf1, 0x22, 0x49, 0xe9, 0xe8, 0xea, 0x91, 0x7f, 0xc6,\n-0x33, 0x5e, 0x68, 0x19, 0x03, 0x86, 0x3b, 0x43, 0x01, 0xcf, 0x07, 0x70, 0xe4, 0x08, 0x1e, 0x65,\n-0x85, 0x91, 0xe6, 0x11, 0x22, 0xb7, 0xf5, 0x02, 0x23, 0x8e, 0xae, 0xb9, 0x1e, 0x7d, 0x1f, 0x7e,\n-0x6c, 0xe6, 0xbd, 0x25, 0xd5, 0x95, 0x1a, 0xf2, 0x05, 0xa6, 0xaf, 0x85, 0x02, 0x6f, 0xae, 0xf8,\n-0xd6, 0x31, 0xff, 0x25, 0xc9, 0x4a, 0xc8, 0xc7, 0x8a, 0xa9, 0xd9, 0x9f, 0x4b, 0x49, 0x9b, 0x11,\n-0x57, 0x99, 0x92, 0x43, 0x11, 0xde, 0xb6, 0x33, 0xa4, 0xcc, 0xd7, 0x8d, 0x64, 0x7d, 0xd4, 0xcd,\n-0x3c, 0x28, 0x2c, 0xb4, 0x9a, 0x96, 0xea, 0x4d, 0xf5, 0xc4, 0x44, 0xc4, 0x25, 0xaa, 0x20, 0x80,\n-0xd8, 0x29, 0x55, 0xf7, 0xe0, 0x41, 0xfc, 0x06, 0x26, 0xff, 0xb9, 0x36, 0xf5, 0x43, 0x14, 0x03,\n-0x66, 0x78, 0xe1, 0x11, 0xb1, 0xda, 0x20, 0x5f, 0x46, 0x00, 0x78, 0x00, 0x21, 0xa5, 0x1e, 0x00,\n-0x28, 0x61, 0x78, 0x6f, 0xa8, 0x01, 0x01, 0x8f, 0x9d, 0x34, 0x9a, 0xff, 0xf4, 0x38, 0x90, 0xfb,\n-0xb8, 0xd1, 0xb3, 0x72, 0x06, 0xc9, 0x71, 0xe6, 0x81, 0xc5, 0x79, 0xed, 0x0b, 0xa6, 0x79, 0xf2,\n-0x13, 0x0b, 0x9c, 0xf7, 0x5d, 0x0e, 0x7b, 0x24, 0x93, 0xb4, 0x48, 0xdb, 0x86, 0x5f, 0xde, 0x50,\n-0x86, 0x78, 0xe7, 0x40, 0xe6, 0x31, 0xa8, 0x90, 0x76, 0x70, 0x61, 0xaf, 0x9c, 0x37, 0x2c, 0x11,\n-0xb5, 0x82, 0xb7, 0xaa, 0xae, 0x24, 0x34, 0x5b, 0x72, 0x0c, 0x69, 0x0d, 0xcd, 0x59, 0x9f, 0xf6,\n-0x71, 0xaf, 0x9c, 0x0b, 0xd1, 0x0a, 0x38, 0xf9, 0x06, 0x22, 0x83, 0x53, 0x25, 0x0c, 0xfc, 0x51,\n-0xc4, 0xe6, 0xbe, 0xe2, 0x39, 0x95, 0x0b, 0x24, 0xad, 0xaf, 0xd1, 0x95, 0xe4, 0x96, 0xd7, 0x74,\n-0x64, 0x6b, 0x71, 0x4e, 0x02, 0x3c, 0xaa, 0x85, 0xf3, 0x20, 0xa3, 0x43, 0x39, 0x76, 0x5b, 0x6c,\n-0x50, 0xfe, 0x9a, 0x9c, 0x14, 0x1e, 0x65, 0x14, 0x8a, 0x15, 0xbd, 0xa3, 0x82, 0x45, 0x5a, 0x49,\n-0x56, 0x6a, 0xd2, 0x9c, 0xb1, 0x63, 0x32, 0xe5, 0x61, 0xe0, 0x53, 0x22, 0x0e, 0xa7, 0x0a, 0x49,\n-0xea, 0xcb, 0x7e, 0x1f, 0xa8, 0xe2, 0x62, 0x80, 0xf6, 0x10, 0x45, 0x52, 0x98, 0x06, 0x18, 0xde,\n-0xa5, 0xcd, 0x2f, 0x7f, 0xaa, 0xd4, 0xe9, 0x3e, 0x08, 0x72, 0xec, 0x23, 0x03, 0x02, 0x3c, 0xa6,\n-0xaa, 0xd8, 0xbc, 0x67, 0x74, 0x3d, 0x14, 0x17, 0xfb, 0x54, 0x4b, 0x17, 0xe3, 0xd3, 0x79, 0x3d,\n-0x6d, 0x6b, 0x49, 0xc9, 0x28, 0x0e, 0x2e, 0x74, 0x50, 0xbf, 0x0c, 0xd9, 0x46, 0x3a, 0x10, 0x86,\n-0xc9, 0xa7, 0x3f, 0xe9, 0xa0, 0xec, 0x7f, 0xeb, 0xa5, 0x77, 0x58, 0x69, 0x71, 0xe6, 0x83, 0x0a,\n-0x37, 0xf2, 0x86, 0x49, 0x6a, 0xbe, 0x79, 0x08, 0x90, 0xf6, 0x02, 0x16, 0x64, 0x3e, 0xe5, 0xda,\n-0x4c, 0x7e, 0x0c, 0x34, 0xc9, 0xf9, 0x5f, 0xb6, 0xb3, 0x28, 0x51, 0xa7, 0xa7, 0x2b, 0xaa, 0x49,\n-0xfa, 0x8d, 0x65, 0x29, 0x4e, 0xe3, 0x6b, 0x13, 0xa7, 0x94, 0xa3, 0x2d, 0x51, 0x6d, 0x78, 0x0c,\n-0x44, 0xcb, 0xdf, 0xde, 0x08, 0x6f, 0xce, 0xa3, 0x64, 0xab, 0xd3, 0x95, 0x84, 0xd4, 0xb9, 0x52,\n-0x54, 0x72, 0x7b, 0x96, 0x25, 0xcc, 0xbc, 0x69, 0xe3, 0x48, 0x6e, 0x0d, 0xd0, 0xc7, 0x9d, 0x27,\n-0x9a, 0xaa, 0xf8, 0x13, 0x92, 0xdd, 0x1e, 0xdf, 0x63, 0x9f, 0x35, 0xa9, 0x16, 0x36, 0xec, 0x8c,\n-0xb8, 0x83, 0xf4, 0x3d, 0x89, 0x8f, 0xcd, 0xb4, 0x17, 0x5e, 0xd7, 0xb3, 0x17, 0x41, 0x10, 0x5d,\n-0x27, 0x73, 0x60, 0x85, 0x57, 0x49, 0x22, 0x07, 0x30, 0x82, 0x02, 0x69, 0x30, 0x82, 0x01, 0xef,\n-0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x21, 0x2a, 0x56, 0x0c, 0xae, 0xda, 0x0c, 0xab, 0x40,\n-0x45, 0xbf, 0x2b, 0xa2, 0x2d, 0x3a, 0xea, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n-0x04, 0x03, 0x03, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x43, 0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53,\n-0x65, 0x4b, 0x65, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f,\n-0x49, 0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n-0x45, 0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79,\n-0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x43, 0x20,\n-0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x35, 0x30, 0x39, 0x30, 0x39, 0x34, 0x38,\n-0x33, 0x34, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x35, 0x30, 0x39, 0x30, 0x39, 0x35, 0x38, 0x33,\n-0x33, 0x5a, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43,\n-0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53, 0x65,\n-0x4b, 0x65, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f, 0x49,\n-0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45,\n-0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x20,\n-0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x43, 0x20, 0x43,\n-0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05,\n-0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x4c, 0xe9, 0x50, 0xc0, 0xc6, 0x0f, 0x72,\n-0x18, 0xbc, 0xd8, 0xf1, 0xba, 0xb3, 0x89, 0xe2, 0x79, 0x4a, 0xa3, 0x16, 0xa7, 0x6b, 0x54, 0x24,\n-0xdb, 0x51, 0xff, 0xea, 0xf4, 0x09, 0x24, 0xc3, 0x0b, 0x22, 0x9f, 0xcb, 0x6a, 0x27, 0x82, 0x81,\n-0x0d, 0xd2, 0xc0, 0xaf, 0x31, 0xe4, 0x74, 0x82, 0x6e, 0xca, 0x25, 0xd9, 0x8c, 0x75, 0x9d, 0xf1,\n-0xdb, 0xd0, 0x9a, 0xa2, 0x4b, 0x21, 0x7e, 0x16, 0xa7, 0x63, 0x90, 0xd2, 0x39, 0xd4, 0xb1, 0x87,\n-0x78, 0x5f, 0x18, 0x96, 0x0f, 0x50, 0x1b, 0x35, 0x37, 0x0f, 0x6a, 0xc6, 0xdc, 0xd9, 0x13, 0x4d,\n-0xa4, 0x8e, 0x90, 0x37, 0xe6, 0xbd, 0x5b, 0x31, 0x91, 0xa3, 0x54, 0x30, 0x52, 0x30, 0x0e, 0x06,\n-0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06,\n-0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d,\n-0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48, 0x87, 0x14, 0xac, 0xe3, 0xc3, 0x9e,\n-0x90, 0x60, 0x3a, 0xd7, 0xca, 0x89, 0xee, 0xd3, 0xad, 0x8c, 0xb4, 0x50, 0x66, 0x30, 0x10, 0x06,\n-0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30,\n-0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65,\n-0x02, 0x30, 0x26, 0xc7, 0x69, 0x5b, 0xdc, 0xd5, 0xe7, 0xb2, 0xe7, 0xc8, 0x0c, 0x8c, 0x8c, 0xc3,\n-0xdd, 0x79, 0x8c, 0x1b, 0x63, 0xd5, 0xc9, 0x52, 0x94, 0x4e, 0x4d, 0x82, 0x4a, 0x73, 0x1e, 0xb2,\n-0x80, 0x84, 0xa9, 0x25, 0xc0, 0x4c, 0x5a, 0x6d, 0x49, 0x29, 0x60, 0x78, 0x13, 0xe2, 0x7e, 0x48,\n-0xeb, 0x64, 0x02, 0x31, 0x00, 0xdb, 0x34, 0x20, 0x32, 0x08, 0xff, 0x9a, 0x49, 0x02, 0xb6, 0x88,\n-0xde, 0x14, 0xaf, 0x5d, 0x6c, 0x99, 0x71, 0x8d, 0x1a, 0x3f, 0x8b, 0xd7, 0xe0, 0xa2, 0x36, 0x86,\n-0x1c, 0x07, 0x82, 0x3a, 0x76, 0x53, 0xfd, 0xc2, 0xa2, 0xed, 0xef, 0x7b, 0xb0, 0x80, 0x4f, 0x58,\n-0x0f, 0x4b, 0x53, 0x39, 0xbd, 0x30, 0x82, 0x03, 0xb5, 0x30, 0x82, 0x02, 0x9d, 0xa0, 0x03, 0x02,\n-0x01, 0x02, 0x02, 0x10, 0x76, 0xb1, 0x20, 0x52, 0x74, 0xf0, 0x85, 0x87, 0x46, 0xb3, 0xf8, 0x23,\n-0x1a, 0xf6, 0xc2, 0xc0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n-0x0b, 0x05, 0x00, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x43, 0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53,\n-0x65, 0x4b, 0x65, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f,\n-0x49, 0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n-0x45, 0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79,\n-0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x42, 0x20,\n-0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x32, 0x30, 0x31, 0x31, 0x35, 0x30, 0x30,\n-0x33, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x31, 0x32, 0x30, 0x31, 0x31, 0x35, 0x31, 0x30, 0x33,\n-0x31, 0x5a, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43,\n-0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53, 0x65,\n-0x4b, 0x65, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f, 0x49,\n-0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45,\n-0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x20,\n-0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x42, 0x20, 0x43,\n-0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01,\n-0x01, 0x00, 0xd8, 0x17, 0xb7, 0x1c, 0x4a, 0x24, 0x2a, 0xd6, 0x97, 0xb1, 0xca, 0xe2, 0x1e, 0xfb,\n-0x7d, 0x38, 0xef, 0x98, 0xf5, 0xb2, 0x39, 0x98, 0x4e, 0x27, 0xb8, 0x11, 0x5d, 0x7b, 0xd2, 0x25,\n-0x94, 0x88, 0x82, 0x15, 0x26, 0x6a, 0x1b, 0x31, 0xbb, 0xa8, 0x5b, 0x21, 0x21, 0x2b, 0xd8, 0x0f,\n-0x4e, 0x9f, 0x5a, 0xf1, 0xb1, 0x5a, 0xe4, 0x79, 0xd6, 0x32, 0x23, 0x2b, 0xe1, 0x53, 0xcc, 0x99,\n-0x45, 0x5c, 0x7b, 0x4f, 0xad, 0xbc, 0xbf, 0x87, 0x4a, 0x0b, 0x4b, 0x97, 0x5a, 0xa8, 0xf6, 0x48,\n-0xec, 0x7d, 0x7b, 0x0d, 0xcd, 0x21, 0x06, 0xdf, 0x9e, 0x15, 0xfd, 0x41, 0x8a, 0x48, 0xb7, 0x20,\n-0xf4, 0xa1, 0x7a, 0x1b, 0x57, 0xd4, 0x5d, 0x50, 0xff, 0xba, 0x67, 0xd8, 0x23, 0x99, 0x1f, 0xc8,\n-0x3f, 0xe3, 0xde, 0xff, 0x6f, 0x5b, 0x77, 0xb1, 0x6b, 0x6e, 0xb8, 0xc9, 0x64, 0xf7, 0xe1, 0xca,\n-0x41, 0x46, 0x0e, 0x29, 0x71, 0xd0, 0xb9, 0x23, 0xfc, 0xc9, 0x81, 0x5f, 0x4e, 0xf7, 0x6f, 0xdf,\n-0xbf, 0x84, 0xad, 0x73, 0x64, 0xbb, 0xb7, 0x42, 0x8e, 0x69, 0xf6, 0xd4, 0x76, 0x1d, 0x7e, 0x9d,\n-0xa7, 0xb8, 0x57, 0x8a, 0x51, 0x67, 0x72, 0xd7, 0xd4, 0xa8, 0xb8, 0x95, 0x54, 0x40, 0x73, 0x03,\n-0xf6, 0xea, 0xf4, 0xeb, 0xfe, 0x28, 0x42, 0x77, 0x3f, 0x9d, 0x23, 0x1b, 0xb2, 0xb6, 0x3d, 0x80,\n-0x14, 0x07, 0x4c, 0x2e, 0x4f, 0xf7, 0xd5, 0x0a, 0x16, 0x0d, 0xbd, 0x66, 0x43, 0x37, 0x7e, 0x23,\n-0x43, 0x79, 0xc3, 0x40, 0x86, 0xf5, 0x4c, 0x29, 0xda, 0x8e, 0x9a, 0xad, 0x0d, 0xa5, 0x04, 0x87,\n-0x88, 0x1e, 0x85, 0xe3, 0xe9, 0x53, 0xd5, 0x9b, 0xc8, 0x8b, 0x03, 0x63, 0x78, 0xeb, 0xe0, 0x19,\n-0x4a, 0x6e, 0xbb, 0x2f, 0x6b, 0x33, 0x64, 0x58, 0x93, 0xad, 0x69, 0xbf, 0x8f, 0x1b, 0xef, 0x82,\n-0x48, 0xc7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x51, 0x30, 0x4f, 0x30, 0x0b, 0x06, 0x03, 0x55,\n-0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,\n-0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\n-0x04, 0x16, 0x04, 0x14, 0x35, 0x0f, 0xc8, 0x36, 0x63, 0x5e, 0xe2, 0xa3, 0xec, 0xf9, 0x3b, 0x66,\n-0x15, 0xce, 0x51, 0x52, 0xe3, 0x91, 0x9a, 0x3d, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04,\n-0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x40, 0x4c,\n-0xfb, 0x87, 0xb2, 0x99, 0x81, 0x90, 0x7e, 0x9d, 0xc5, 0xb0, 0xb0, 0x26, 0xcd, 0x88, 0x7b, 0x2b,\n-0x32, 0x8d, 0x6e, 0xb8, 0x21, 0x71, 0x58, 0x97, 0x7d, 0xae, 0x37, 0x14, 0xaf, 0x3e, 0xe7, 0xf7,\n-0x9a, 0xe2, 0x7d, 0xf6, 0x71, 0x98, 0x99, 0x04, 0xaa, 0x43, 0x74, 0x78, 0xa3, 0xe3, 0x49, 0x61,\n-0x3e, 0x73, 0x8c, 0x4d, 0x94, 0xe0, 0xf9, 0x71, 0xc4, 0xb6, 0x16, 0x0e, 0x53, 0x78, 0x1f, 0xd6,\n-0xa2, 0x87, 0x2f, 0x02, 0x39, 0x81, 0x29, 0x3c, 0xaf, 0x15, 0x98, 0x21, 0x30, 0xfe, 0x28, 0x90,\n-0x00, 0x8c, 0xd1, 0xe1, 0xcb, 0xfa, 0x5e, 0xc8, 0xfd, 0xf8, 0x10, 0x46, 0x3b, 0xa2, 0x78, 0x42,\n-0x91, 0x17, 0x74, 0x55, 0x0a, 0xde, 0x50, 0x67, 0x4d, 0x66, 0xd1, 0xa7, 0xff, 0xfd, 0xd9, 0xc0,\n-0xb5, 0xa8, 0xa3, 0x8a, 0xce, 0x66, 0xf5, 0x0f, 0x43, 0xcd, 0xa7, 0x2b, 0x57, 0x7b, 0x63, 0x46,\n-0x6a, 0xaa, 0x2e, 0x52, 0xd8, 0xf4, 0xed, 0xe1, 0x6d, 0xad, 0x29, 0x90, 0x78, 0x48, 0xba, 0xe1,\n-0x23, 0xaa, 0xa3, 0x89, 0xec, 0xb5, 0xab, 0x96, 0xc0, 0xb4, 0x4b, 0xa2, 0x1d, 0x97, 0x9e, 0x7a,\n-0xf2, 0x6e, 0x40, 0x71, 0xdf, 0x68, 0xf1, 0x65, 0x4d, 0xce, 0x7c, 0x05, 0xdf, 0x53, 0x65, 0xa9,\n-0xa5, 0xf0, 0xb1, 0x97, 0x04, 0x70, 0x15, 0x46, 0x03, 0x98, 0xd4, 0xd2, 0xbf, 0x54, 0xb4, 0xa0,\n-0x58, 0x7d, 0x52, 0x6f, 0xda, 0x56, 0x26, 0x62, 0xd4, 0xd8, 0xdb, 0x89, 0x31, 0x6f, 0x1c, 0xf0,\n-0x22, 0xc2, 0xd3, 0x62, 0x1c, 0x35, 0xcd, 0x4c, 0x69, 0x15, 0x54, 0x1a, 0x90, 0x98, 0xde, 0xeb,\n-0x1e, 0x5f, 0xca, 0x77, 0xc7, 0xcb, 0x8e, 0x3d, 0x43, 0x69, 0x9c, 0x9a, 0x58, 0xd0, 0x24, 0x3b,\n-0xdf, 0x1b, 0x40, 0x96, 0x7e, 0x35, 0xad, 0x81, 0xc7, 0x4e, 0x71, 0xba, 0x88, 0x13, 0x30, 0x82,\n-0x03, 0x72, 0x30, 0x82, 0x02, 0x5a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x3e, 0x8a, 0x5d,\n-0x07, 0xec, 0x55, 0xd2, 0x32, 0xd5, 0xb7, 0xe3, 0xb6, 0x5f, 0x01, 0xeb, 0x2d, 0xdc, 0xe4, 0xd6,\n-0xe4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n-0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31,\n-0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1f, 0x4b, 0x72, 0x61, 0x6a, 0x6f, 0x77,\n-0x61, 0x20, 0x49, 0x7a, 0x62, 0x61, 0x20, 0x52, 0x6f, 0x7a, 0x6c, 0x69, 0x63, 0x7a, 0x65, 0x6e,\n-0x69, 0x6f, 0x77, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x0c, 0x0f, 0x53, 0x5a, 0x41, 0x46, 0x49, 0x52, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x20,\n-0x43, 0x41, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x31, 0x30, 0x31, 0x39, 0x30, 0x37, 0x34,\n-0x33, 0x33, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x35, 0x31, 0x30, 0x31, 0x39, 0x30, 0x37, 0x34, 0x33,\n-0x33, 0x30, 0x5a, 0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x50, 0x4c, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1f, 0x4b, 0x72, 0x61,\n-0x6a, 0x6f, 0x77, 0x61, 0x20, 0x49, 0x7a, 0x62, 0x61, 0x20, 0x52, 0x6f, 0x7a, 0x6c, 0x69, 0x63,\n-0x7a, 0x65, 0x6e, 0x69, 0x6f, 0x77, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x18, 0x30, 0x16,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x53, 0x5a, 0x41, 0x46, 0x49, 0x52, 0x20, 0x52, 0x4f,\n-0x4f, 0x54, 0x20, 0x43, 0x41, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82,\n-0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0xbc, 0x3e, 0x50, 0xa8, 0x4b, 0xcd, 0x40, 0xb5,\n-0xce, 0x61, 0xe7, 0x96, 0xca, 0xb4, 0xa1, 0xda, 0x0c, 0x22, 0xb0, 0xfa, 0xb5, 0x7b, 0x76, 0x00,\n-0x77, 0x8c, 0x0b, 0xcf, 0x7d, 0xa8, 0x86, 0xcc, 0x26, 0x51, 0xe4, 0x20, 0x3d, 0x85, 0x0c, 0xd6,\n-0x58, 0xe3, 0xe7, 0xf4, 0x2a, 0x18, 0x9d, 0xda, 0xd1, 0xae, 0x26, 0xee, 0xeb, 0x53, 0xdc, 0xf4,\n-0x90, 0xd6, 0x13, 0x4a, 0x0c, 0x90, 0x3c, 0xc3, 0xf4, 0xda, 0xd2, 0x8e, 0x0d, 0x92, 0x3a, 0xdc,\n-0xb1, 0xb1, 0xff, 0x38, 0xde, 0xc3, 0xba, 0x2d, 0x5f, 0x80, 0xb9, 0x02, 0xbd, 0x4a, 0x9d, 0x1b,\n-0x0f, 0xb4, 0xc3, 0xc2, 0xc1, 0x67, 0x03, 0xdd, 0xdc, 0x1b, 0x9c, 0x3d, 0xb3, 0xb0, 0xde, 0x00,\n-0x1e, 0xa8, 0x34, 0x47, 0xbb, 0x9a, 0xeb, 0xfe, 0x0b, 0x14, 0xbd, 0x36, 0x84, 0xda, 0x0d, 0x20,\n-0xbf, 0xfa, 0x5b, 0xcb, 0xa9, 0x16, 0x20, 0xad, 0x39, 0x60, 0xee, 0x2f, 0x75, 0xb6, 0xe7, 0x97,\n-0x9c, 0xf9, 0x3e, 0xfd, 0x7e, 0x4d, 0x6f, 0x4d, 0x2f, 0xef, 0x88, 0x0d, 0x6a, 0xfa, 0xdd, 0xf1,\n-0x3d, 0x6e, 0x20, 0xa5, 0xa0, 0x12, 0xb4, 0x4d, 0x70, 0xb9, 0xce, 0xd7, 0x72, 0x3b, 0x89, 0x93,\n-0xa7, 0x80, 0x84, 0x1c, 0x27, 0x49, 0x72, 0x49, 0xb5, 0xff, 0x3b, 0x95, 0x9e, 0xc1, 0xcc, 0xc8,\n-0x01, 0xec, 0xe8, 0x0e, 0x8a, 0x0a, 0x96, 0xe7, 0xb3, 0xa6, 0x87, 0xe5, 0xd6, 0xf9, 0x05, 0x2b,\n-0x0d, 0x97, 0x40, 0x70, 0x3c, 0xba, 0xac, 0x75, 0x5a, 0x9c, 0xd5, 0x4d, 0x9d, 0x02, 0x0a, 0xd2,\n-0x4b, 0x9b, 0x66, 0x4b, 0x46, 0x07, 0x17, 0x65, 0xad, 0x9f, 0x6c, 0x88, 0x00, 0xdc, 0x22, 0x89,\n-0xe0, 0xe1, 0x64, 0xd4, 0x67, 0xbc, 0x31, 0x79, 0x61, 0x3c, 0xbb, 0xca, 0x41, 0xcd, 0x5c, 0x6a,\n-0x00, 0xc8, 0x3c, 0x38, 0x8e, 0x58, 0xaf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40,\n-0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n-0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n-0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x2e, 0x16, 0xa9, 0x4a,\n-0x18, 0xb5, 0xcb, 0xcc, 0xf5, 0x6f, 0x50, 0xf3, 0x23, 0x5f, 0xf8, 0x5d, 0xe7, 0xac, 0xf0, 0xc8,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03,\n-0x82, 0x01, 0x01, 0x00, 0xb5, 0x73, 0xf8, 0x03, 0xdc, 0x59, 0x5b, 0x1d, 0x76, 0xe9, 0xa3, 0x2a,\n-0x7b, 0x90, 0x28, 0xb2, 0x4d, 0xc0, 0x33, 0x4f, 0xaa, 0x9a, 0xb1, 0xd4, 0xb8, 0xe4, 0x27, 0xff,\n-0xa9, 0x96, 0x99, 0xce, 0x46, 0xe0, 0x6d, 0x7c, 0x4c, 0xa2, 0x38, 0xa4, 0x06, 0x70, 0xf0, 0xf4,\n-0x41, 0x11, 0xec, 0x3f, 0x47, 0x8d, 0x3f, 0x72, 0x87, 0xf9, 0x3b, 0xfd, 0xa4, 0x6f, 0x2b, 0x53,\n-0x00, 0xe0, 0xff, 0x39, 0xb9, 0x6a, 0x07, 0x0e, 0xeb, 0x1d, 0x1c, 0xf6, 0xa2, 0x72, 0x90, 0xcb,\n-0x82, 0x3d, 0x11, 0x82, 0x8b, 0xd2, 0xbb, 0x9f, 0x2a, 0xaf, 0x21, 0xe6, 0x63, 0x86, 0x9d, 0x79,\n-0x19, 0xef, 0xf7, 0xbb, 0x0c, 0x35, 0x90, 0xc3, 0x8a, 0xed, 0x4f, 0x0f, 0xf5, 0xcc, 0x12, 0xd9,\n-0xa4, 0x3e, 0xbb, 0xa0, 0xfc, 0x20, 0x95, 0x5f, 0x4f, 0x26, 0x2f, 0x11, 0x23, 0x83, 0x4e, 0x75,\n-0x07, 0x0f, 0xbf, 0x9b, 0xd1, 0xb4, 0x1d, 0xe9, 0x10, 0x04, 0xfe, 0xca, 0x60, 0x8f, 0xa2, 0x4c,\n-0xb8, 0xad, 0xcf, 0xe1, 0x90, 0x0f, 0xcd, 0xae, 0x0a, 0xc7, 0x5d, 0x7b, 0xb7, 0x50, 0xd2, 0xd4,\n-0x61, 0xfa, 0xd5, 0x15, 0xdb, 0xd7, 0x9f, 0x87, 0x51, 0x54, 0xeb, 0xa5, 0xe3, 0xeb, 0xc9, 0x85,\n-0xa0, 0x25, 0x20, 0x37, 0xfb, 0x8e, 0xce, 0x0c, 0x34, 0x84, 0xe1, 0x3c, 0x81, 0xb2, 0x77, 0x4e,\n-0x43, 0xa5, 0x88, 0x5f, 0x86, 0x67, 0xa1, 0x3d, 0xe6, 0xb4, 0x5c, 0x61, 0xb6, 0x3e, 0xdb, 0xfe,\n-0xb7, 0x28, 0xc5, 0xa2, 0x07, 0xae, 0xb5, 0xca, 0xca, 0x8d, 0x2a, 0x12, 0xef, 0x97, 0xed, 0xc2,\n-0x30, 0xa4, 0xc9, 0x2a, 0x7a, 0xfb, 0xf3, 0x4d, 0x23, 0x1b, 0x99, 0x33, 0x34, 0xa0, 0x2e, 0xf5,\n-0xa9, 0x0b, 0x3f, 0xd4, 0x5d, 0xe1, 0xcf, 0x84, 0x9f, 0xe2, 0x19, 0xc2, 0x5f, 0x8a, 0xd6, 0x20,\n-0x1e, 0xe3, 0x73, 0xb7, 0x30, 0x82, 0x05, 0xd2, 0x30, 0x82, 0x03, 0xba, 0xa0, 0x03, 0x02, 0x01,\n-0x02, 0x02, 0x10, 0x21, 0xd6, 0xd0, 0x4a, 0x4f, 0x25, 0x0f, 0xc9, 0x32, 0x37, 0xfc, 0xaa, 0x5e,\n-0x12, 0x8d, 0xe9, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0d,\n-0x05, 0x00, 0x30, 0x81, 0x80, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x50, 0x4c, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x55, 0x6e, 0x69,\n-0x7a, 0x65, 0x74, 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65,\n-0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,\n-0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n-0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31,\n-0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d,\n-0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,\n-0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x22, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30,\n-0x36, 0x30, 0x38, 0x33, 0x39, 0x35, 0x36, 0x5a, 0x18, 0x0f, 0x32, 0x30, 0x34, 0x36, 0x31, 0x30,\n-0x30, 0x36, 0x30, 0x38, 0x33, 0x39, 0x35, 0x36, 0x5a, 0x30, 0x81, 0x80, 0x31, 0x0b, 0x30, 0x09,\n-0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55,\n-0x04, 0x0a, 0x13, 0x19, 0x55, 0x6e, 0x69, 0x7a, 0x65, 0x74, 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68,\n-0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30,\n-0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43,\n-0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74,\n-0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n-0x1b, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20,\n-0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n-0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xbd, 0xf9, 0x78,\n-0xf8, 0xe6, 0xd5, 0x80, 0x0c, 0x64, 0x9d, 0x86, 0x1b, 0x96, 0x64, 0x67, 0x3f, 0x22, 0x3a, 0x1e,\n-0x75, 0x01, 0x7d, 0xef, 0xfb, 0x5c, 0x67, 0x8c, 0xc9, 0xcc, 0x5c, 0x6b, 0xa9, 0x91, 0xe6, 0xb9,\n-0x42, 0xe5, 0x20, 0x4b, 0x9b, 0xda, 0x9b, 0x7b, 0xb9, 0x99, 0x5d, 0xd9, 0x9b, 0x80, 0x4b, 0xd7,\n-0x84, 0x40, 0x2b, 0x27, 0xd3, 0xe8, 0xba, 0x30, 0xbb, 0x3e, 0x09, 0x1a, 0xa7, 0x49, 0x95, 0xef,\n-0x2b, 0x40, 0x24, 0xc2, 0x97, 0xc7, 0xa7, 0xee, 0x9b, 0x25, 0xef, 0xa8, 0x0a, 0x00, 0x97, 0x85,\n-0x5a, 0xaa, 0x9d, 0xdc, 0x29, 0xc9, 0xe2, 0x35, 0x07, 0xeb, 0x70, 0x4d, 0x4a, 0xd6, 0xc1, 0xb3,\n-0x56, 0xb8, 0xa1, 0x41, 0x38, 0x9b, 0xd1, 0xfb, 0x31, 0x7f, 0x8f, 0xe0, 0x5f, 0xe1, 0xb1, 0x3f,\n-0x0f, 0x8e, 0x16, 0x49, 0x60, 0xd7, 0x06, 0x8d, 0x18, 0xf9, 0xaa, 0x26, 0x10, 0xab, 0x2a, 0xd3,\n-0xd0, 0xd1, 0x67, 0x8d, 0x1b, 0x46, 0xbe, 0x47, 0x30, 0xd5, 0x2e, 0x72, 0xd1, 0xc5, 0x63, 0xda,\n-0xe7, 0x63, 0x79, 0x44, 0x7e, 0x4b, 0x63, 0x24, 0x89, 0x86, 0x2e, 0x34, 0x3f, 0x29, 0x4c, 0x52,\n-0x8b, 0x2a, 0xa7, 0xc0, 0xe2, 0x91, 0x28, 0x89, 0xb9, 0xc0, 0x5b, 0xf9, 0x1d, 0xd9, 0xe7, 0x27,\n-0xad, 0xff, 0x9a, 0x02, 0x97, 0xc1, 0xc6, 0x50, 0x92, 0x9b, 0x02, 0x2c, 0xbd, 0xa9, 0xb9, 0x34,\n-0x59, 0x0a, 0xbf, 0x84, 0x4a, 0xff, 0xdf, 0xfe, 0xb3, 0x9f, 0xeb, 0xd9, 0x9e, 0xe0, 0x98, 0x23,\n-0xec, 0xa6, 0x6b, 0x77, 0x16, 0x2a, 0xdb, 0xcc, 0xad, 0x3b, 0x1c, 0xa4, 0x87, 0xdc, 0x46, 0x73,\n-0x5e, 0x19, 0x62, 0x68, 0x45, 0x57, 0xe4, 0x90, 0x82, 0x42, 0xbb, 0x42, 0xd6, 0xf0, 0x61, 0xe0,\n-0xc1, 0xa3, 0x3d, 0x66, 0xa3, 0x5d, 0xf4, 0x18, 0xee, 0x88, 0xc9, 0x8d, 0x17, 0x45, 0x29, 0x99,\n-0x32, 0x75, 0x02, 0x31, 0xee, 0x29, 0x26, 0xc8, 0x6b, 0x02, 0xe6, 0xb5, 0x62, 0x45, 0x7f, 0x37,\n-0x15, 0x5a, 0x23, 0x68, 0x89, 0xd4, 0x3e, 0xde, 0x4e, 0x27, 0xb0, 0xf0, 0x40, 0x0c, 0xbc, 0x4d,\n-0x17, 0xcb, 0x4d, 0xa2, 0xb3, 0x1e, 0xd0, 0x06, 0x5a, 0xdd, 0xf6, 0x93, 0xcf, 0x57, 0x75, 0x99,\n-0xf5, 0xfa, 0x86, 0x1a, 0x67, 0x78, 0xb3, 0xbf, 0x96, 0xfe, 0x34, 0xdc, 0xbd, 0xe7, 0x52, 0x56,\n-0xe5, 0xb3, 0xe5, 0x75, 0x7b, 0xd7, 0x41, 0x91, 0x05, 0xdc, 0x5d, 0x69, 0xe3, 0x95, 0x0d, 0x43,\n-0xb9, 0xfc, 0x83, 0x96, 0x39, 0x95, 0x7b, 0x6c, 0x80, 0x5a, 0x4f, 0x13, 0x72, 0xc6, 0xd7, 0x7d,\n-0x29, 0x7a, 0x44, 0xba, 0x52, 0xa4, 0x2a, 0xd5, 0x41, 0x46, 0x09, 0x20, 0xfe, 0x22, 0xa0, 0xb6,\n-0x5b, 0x30, 0x8d, 0xbc, 0x89, 0x0c, 0xd5, 0xd7, 0x70, 0xf8, 0x87, 0x52, 0xfd, 0xda, 0xef, 0xac,\n-0x51, 0x2e, 0x07, 0xb3, 0x4e, 0xfe, 0xd0, 0x09, 0xda, 0x70, 0xef, 0x98, 0xfa, 0x56, 0xe6, 0x6d,\n-0xdb, 0xb5, 0x57, 0x4b, 0xdc, 0xe5, 0x2c, 0x25, 0x15, 0xc8, 0x9e, 0x2e, 0x78, 0x4e, 0xf8, 0xda,\n-0x9c, 0x9e, 0x86, 0x2c, 0xca, 0x57, 0xf3, 0x1a, 0xe5, 0xc8, 0x92, 0x8b, 0x1a, 0x82, 0x96, 0x7a,\n-0xc3, 0xbc, 0x50, 0x12, 0x69, 0xd8, 0x0e, 0x5a, 0x46, 0x8b, 0x3a, 0xeb, 0x26, 0xfa, 0x23, 0xc9,\n-0xb6, 0xb0, 0x81, 0xbe, 0x42, 0x00, 0xa4, 0xf8, 0xd6, 0xfe, 0x30, 0x2e, 0xc7, 0xd2, 0x46, 0xf6,\n-0xe5, 0x8e, 0x75, 0xfd, 0xf2, 0xcc, 0xb9, 0xd0, 0x87, 0x5b, 0xcc, 0x06, 0x10, 0x60, 0xbb, 0x83,\n-0x35, 0xb7, 0x5e, 0x67, 0xde, 0x47, 0xec, 0x99, 0x48, 0xf1, 0xa4, 0xa1, 0x15, 0xfe, 0xad, 0x8c,\n-0x62, 0x8e, 0x39, 0x55, 0x4f, 0x39, 0x16, 0xb9, 0xb1, 0x63, 0x9d, 0xff, 0xb7, 0x02, 0x03, 0x01,\n-0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n-0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n-0x04, 0x14, 0xb6, 0xa1, 0x54, 0x39, 0x02, 0xc3, 0xa0, 0x3f, 0x8e, 0x8a, 0xbc, 0xfa, 0xd4, 0xf8,\n-0x1c, 0xa6, 0xd1, 0x3a, 0x0e, 0xfd, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n-0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x0d, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x71, 0xa5, 0x0e, 0xce, 0xe4, 0xe9,\n-0xbf, 0x3f, 0x38, 0xd5, 0x89, 0x5a, 0xc4, 0x02, 0x61, 0xfb, 0x4c, 0xc5, 0x14, 0x17, 0x2d, 0x8b,\n-0x4f, 0x53, 0x6b, 0x10, 0x17, 0xfc, 0x65, 0x84, 0xc7, 0x10, 0x49, 0x90, 0xde, 0xdb, 0xc7, 0x26,\n-0x93, 0x88, 0x26, 0x6f, 0x70, 0xd6, 0x02, 0x5e, 0x39, 0xa0, 0xf7, 0x8f, 0xab, 0x96, 0xb5, 0xa5,\n-0x13, 0x5c, 0x81, 0x14, 0x6d, 0x0e, 0x81, 0x82, 0x11, 0x1b, 0x8a, 0x4e, 0xc6, 0x4f, 0xa5, 0xdd,\n-0x62, 0x1e, 0x44, 0xdf, 0x09, 0x59, 0xf4, 0x5b, 0x77, 0x0b, 0x37, 0xe9, 0x8b, 0x20, 0xc6, 0xf8,\n-0x0a, 0x4e, 0x2e, 0x58, 0x1c, 0xeb, 0x33, 0xd0, 0xcf, 0x86, 0x60, 0xc9, 0xda, 0xfb, 0x80, 0x2f,\n-0x9e, 0x4c, 0x60, 0x84, 0x78, 0x3d, 0x21, 0x64, 0xd6, 0xfb, 0x41, 0x1f, 0x18, 0x0f, 0xe7, 0xc9,\n-0x75, 0x71, 0xbd, 0xbd, 0x5c, 0xde, 0x34, 0x87, 0x3e, 0x41, 0xb0, 0x0e, 0xf6, 0xb9, 0xd6, 0x3f,\n-0x09, 0x13, 0x96, 0x14, 0x2f, 0xde, 0x9a, 0x1d, 0x5a, 0xb9, 0x56, 0xce, 0x35, 0x3a, 0xb0, 0x5f,\n-0x70, 0x4d, 0x5e, 0xe3, 0x29, 0xf1, 0x23, 0x28, 0x72, 0x59, 0xb6, 0xab, 0xc2, 0x8c, 0x66, 0x26,\n-0x1c, 0x77, 0x2c, 0x26, 0x76, 0x35, 0x8b, 0x28, 0xa7, 0x69, 0xa0, 0xf9, 0x3b, 0xf5, 0x23, 0xdd,\n-0x85, 0x10, 0x74, 0xc9, 0x90, 0x03, 0x56, 0x91, 0xe7, 0xaf, 0xba, 0x47, 0xd4, 0x12, 0x97, 0x11,\n-0x22, 0xe3, 0xa2, 0x49, 0x94, 0x6c, 0xe7, 0xb7, 0x94, 0x4b, 0xba, 0x2d, 0xa4, 0xda, 0x33, 0x8b,\n-0x4c, 0xa6, 0x44, 0xff, 0x5a, 0x3c, 0xc6, 0x1d, 0x64, 0xd8, 0xb5, 0x31, 0xe4, 0xa6, 0x3c, 0x7a,\n-0xa8, 0x57, 0x0b, 0xdb, 0xed, 0x61, 0x1a, 0xcb, 0xf1, 0xce, 0x73, 0x77, 0x63, 0xa4, 0x87, 0x6f,\n-0x4c, 0x51, 0x38, 0xd6, 0xe4, 0x5f, 0xc7, 0x9f, 0xb6, 0x81, 0x2a, 0xe4, 0x85, 0x48, 0x79, 0x58,\n-0x5e, 0x3b, 0xf8, 0xdb, 0x02, 0x82, 0x67, 0xc1, 0x39, 0xdb, 0xc3, 0x74, 0x4b, 0x3d, 0x36, 0x1e,\n-0xf9, 0x29, 0x93, 0x88, 0x68, 0x5b, 0xa8, 0x44, 0x19, 0x21, 0xf0, 0xa7, 0xe8, 0x81, 0x0d, 0x2c,\n-0xe8, 0x93, 0x36, 0xb4, 0x37, 0xb2, 0xca, 0xb0, 0x1b, 0x26, 0x7a, 0x9a, 0x25, 0x1f, 0x9a, 0x9a,\n-0x80, 0x9e, 0x4b, 0x2a, 0x3f, 0xfb, 0xa3, 0x9a, 0xfe, 0x73, 0x32, 0x71, 0xc2, 0x9e, 0xc6, 0x72,\n-0xe1, 0x8a, 0x68, 0x27, 0xf1, 0xe4, 0x0f, 0xb4, 0xc4, 0x4c, 0xa5, 0x61, 0x93, 0xf8, 0x97, 0x10,\n-0x07, 0x2a, 0x30, 0x25, 0xa9, 0xb9, 0xc8, 0x71, 0xb8, 0xef, 0x68, 0xcc, 0x2d, 0x7e, 0xf5, 0xe0,\n-0x7e, 0x0f, 0x82, 0xa8, 0x6f, 0xb6, 0xba, 0x6c, 0x83, 0x43, 0x77, 0xcd, 0x8a, 0x92, 0x17, 0xa1,\n-0x9e, 0x5b, 0x78, 0x16, 0x3d, 0x45, 0xe2, 0x33, 0x72, 0xdd, 0xe1, 0x66, 0xca, 0x99, 0xd3, 0xc9,\n-0xc5, 0x26, 0xfd, 0x0d, 0x68, 0x04, 0x46, 0xae, 0xb6, 0xd9, 0x9b, 0x8c, 0xbe, 0x19, 0xbe, 0xb1,\n-0xc6, 0xf2, 0x19, 0xe3, 0x5c, 0x02, 0xca, 0x2c, 0xd8, 0x6f, 0x4a, 0x07, 0xd9, 0xc9, 0x35, 0xda,\n-0x40, 0x75, 0xf2, 0xc4, 0xa7, 0x19, 0x6f, 0x9e, 0x42, 0x10, 0x98, 0x75, 0xe6, 0x95, 0x8b, 0x60,\n-0xbc, 0xed, 0xc5, 0x12, 0xd7, 0x8a, 0xce, 0xd5, 0x98, 0x5c, 0x56, 0x96, 0x03, 0xc5, 0xee, 0x77,\n-0x06, 0x35, 0xff, 0xcf, 0xe4, 0xee, 0x3f, 0x13, 0x61, 0xee, 0xdb, 0xda, 0x2d, 0x85, 0xf0, 0xcd,\n-0xae, 0x9d, 0xb2, 0x18, 0x09, 0x45, 0xc3, 0x92, 0xa1, 0x72, 0x17, 0xfc, 0x47, 0xb6, 0xa0, 0x0b,\n-0x2c, 0xf1, 0xc4, 0xde, 0x43, 0x68, 0x08, 0x6a, 0x5f, 0x3b, 0xf0, 0x76, 0x63, 0xfb, 0xcc, 0x06,\n-0x2c, 0xa6, 0xc6, 0xe2, 0x0e, 0xb5, 0xb9, 0xbe, 0x24, 0x8f, 0x30, 0x82, 0x02, 0x6e, 0x30, 0x82,\n-0x01, 0xf3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x62, 0xf6, 0x32, 0x6c, 0xe5, 0xc4, 0xe3,\n-0x68, 0x5c, 0x1b, 0x62, 0xdd, 0x9c, 0x2e, 0x9d, 0x95, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n-0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x78, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n-0x13, 0x02, 0x45, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x46,\n-0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x0b,\n-0x0c, 0x05, 0x43, 0x65, 0x72, 0x65, 0x73, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x61,\n-0x0c, 0x0f, 0x56, 0x41, 0x54, 0x45, 0x53, 0x2d, 0x51, 0x32, 0x38, 0x32, 0x36, 0x30, 0x30, 0x34,\n-0x4a, 0x31, 0x2c, 0x30, 0x2a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x23, 0x41, 0x43, 0x20, 0x52,\n-0x41, 0x49, 0x5a, 0x20, 0x46, 0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x20, 0x53, 0x45, 0x52,\n-0x56, 0x49, 0x44, 0x4f, 0x52, 0x45, 0x53, 0x20, 0x53, 0x45, 0x47, 0x55, 0x52, 0x4f, 0x53, 0x30,\n-0x1e, 0x17, 0x0d, 0x31, 0x38, 0x31, 0x32, 0x32, 0x30, 0x30, 0x39, 0x33, 0x37, 0x33, 0x33, 0x5a,\n-0x17, 0x0d, 0x34, 0x33, 0x31, 0x32, 0x32, 0x30, 0x30, 0x39, 0x33, 0x37, 0x33, 0x33, 0x5a, 0x30,\n-0x78, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x11,\n-0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x46, 0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43,\n-0x4d, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x05, 0x43, 0x65, 0x72, 0x65,\n-0x73, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x61, 0x0c, 0x0f, 0x56, 0x41, 0x54, 0x45,\n-0x53, 0x2d, 0x51, 0x32, 0x38, 0x32, 0x36, 0x30, 0x30, 0x34, 0x4a, 0x31, 0x2c, 0x30, 0x2a, 0x06,\n-0x03, 0x55, 0x04, 0x03, 0x0c, 0x23, 0x41, 0x43, 0x20, 0x52, 0x41, 0x49, 0x5a, 0x20, 0x46, 0x4e,\n-0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x44, 0x4f, 0x52, 0x45,\n-0x53, 0x20, 0x53, 0x45, 0x47, 0x55, 0x52, 0x4f, 0x53, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a,\n-0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00,\n-0x04, 0xf6, 0xba, 0x57, 0x53, 0xc8, 0xca, 0xab, 0xdf, 0x36, 0x4a, 0x52, 0x21, 0xe4, 0x97, 0xd2,\n-0x83, 0x67, 0x9e, 0xf0, 0x65, 0x51, 0xd0, 0x5e, 0x87, 0xc7, 0x47, 0xb1, 0x59, 0xf2, 0x57, 0x47,\n-0x9b, 0x00, 0x02, 0x93, 0x44, 0x17, 0x69, 0xdb, 0x42, 0xc7, 0xb1, 0xb2, 0x3a, 0x18, 0x0e, 0xb4,\n-0x5d, 0x8c, 0xb3, 0x66, 0x5d, 0xa1, 0x34, 0xf9, 0x36, 0x2c, 0x49, 0xdb, 0xf3, 0x46, 0xfc, 0xb3,\n-0x44, 0x69, 0x44, 0x13, 0x66, 0xfd, 0xd7, 0xc5, 0xfd, 0xaf, 0x36, 0x4d, 0xce, 0x03, 0x4d, 0x07,\n-0x71, 0xcf, 0xaf, 0x6a, 0x05, 0xd2, 0xa2, 0x43, 0x5a, 0x0a, 0x52, 0x6f, 0x01, 0x03, 0x4e, 0x8e,\n-0x8b, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n-0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n-0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n-0x14, 0x01, 0xb9, 0x2f, 0xef, 0xbf, 0x11, 0x86, 0x60, 0xf2, 0x4f, 0xd0, 0x41, 0x6e, 0xab, 0x73,\n-0x1f, 0xe7, 0xd2, 0x6e, 0x49, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03,\n-0x03, 0x03, 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xae, 0x4a, 0xe3, 0x2b, 0x40, 0xc3, 0x74,\n-0x11, 0xf2, 0x95, 0xad, 0x16, 0x23, 0xde, 0x4e, 0x0c, 0x1a, 0xe6, 0x5d, 0xa5, 0x24, 0x5e, 0x6b,\n-0x44, 0x7b, 0xfc, 0x38, 0xe2, 0x4f, 0xcb, 0x9c, 0x45, 0x17, 0x11, 0x4c, 0x14, 0x27, 0x26, 0x55,\n-0x39, 0x75, 0x4a, 0x03, 0xcc, 0x13, 0x90, 0x9f, 0x92, 0x02, 0x31, 0x00, 0xfa, 0x4a, 0x6c, 0x60,\n-0x88, 0x73, 0xf3, 0xee, 0xb8, 0x98, 0x62, 0xa9, 0xce, 0x2b, 0xc2, 0xd9, 0x8a, 0xa6, 0x70, 0x31,\n-0x1d, 0xaf, 0xb0, 0x94, 0x4c, 0xeb, 0x4f, 0xc6, 0xe3, 0xd1, 0xf3, 0x62, 0xa7, 0x3c, 0xff, 0x93,\n-0x2e, 0x07, 0x5c, 0x49, 0x01, 0x67, 0x69, 0x12, 0x02, 0x72, 0xbf, 0xe7, 0x30, 0x82, 0x05, 0x6b,\n-0x30, 0x82, 0x03, 0x53, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0x82, 0x10, 0xcf, 0xb0,\n-0xd2, 0x40, 0xe3, 0x59, 0x44, 0x63, 0xe0, 0xbb, 0x63, 0x82, 0x8b, 0x00, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4f, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x53, 0x65,\n-0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20,\n-0x47, 0x72, 0x6f, 0x75, 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0c,\n-0x49, 0x53, 0x52, 0x47, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x58, 0x31, 0x30, 0x1e, 0x17, 0x0d,\n-0x31, 0x35, 0x30, 0x36, 0x30, 0x34, 0x31, 0x31, 0x30, 0x34, 0x33, 0x38, 0x5a, 0x17, 0x0d, 0x33,\n-0x35, 0x30, 0x36, 0x30, 0x34, 0x31, 0x31, 0x30, 0x34, 0x33, 0x38, 0x5a, 0x30, 0x4f, 0x31, 0x0b,\n-0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x29, 0x30, 0x27, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x53,\n-0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,\n-0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n-0x0c, 0x49, 0x53, 0x52, 0x47, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x58, 0x31, 0x30, 0x82, 0x02,\n-0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,\n-0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xad, 0xe8,\n-0x24, 0x73, 0xf4, 0x14, 0x37, 0xf3, 0x9b, 0x9e, 0x2b, 0x57, 0x28, 0x1c, 0x87, 0xbe, 0xdc, 0xb7,\n-0xdf, 0x38, 0x90, 0x8c, 0x6e, 0x3c, 0xe6, 0x57, 0xa0, 0x78, 0xf7, 0x75, 0xc2, 0xa2, 0xfe, 0xf5,\n-0x6a, 0x6e, 0xf6, 0x00, 0x4f, 0x28, 0xdb, 0xde, 0x68, 0x86, 0x6c, 0x44, 0x93, 0xb6, 0xb1, 0x63,\n-0xfd, 0x14, 0x12, 0x6b, 0xbf, 0x1f, 0xd2, 0xea, 0x31, 0x9b, 0x21, 0x7e, 0xd1, 0x33, 0x3c, 0xba,\n-0x48, 0xf5, 0xdd, 0x79, 0xdf, 0xb3, 0xb8, 0xff, 0x12, 0xf1, 0x21, 0x9a, 0x4b, 0xc1, 0x8a, 0x86,\n-0x71, 0x69, 0x4a, 0x66, 0x66, 0x6c, 0x8f, 0x7e, 0x3c, 0x70, 0xbf, 0xad, 0x29, 0x22, 0x06, 0xf3,\n-0xe4, 0xc0, 0xe6, 0x80, 0xae, 0xe2, 0x4b, 0x8f, 0xb7, 0x99, 0x7e, 0x94, 0x03, 0x9f, 0xd3, 0x47,\n-0x97, 0x7c, 0x99, 0x48, 0x23, 0x53, 0xe8, 0x38, 0xae, 0x4f, 0x0a, 0x6f, 0x83, 0x2e, 0xd1, 0x49,\n-0x57, 0x8c, 0x80, 0x74, 0xb6, 0xda, 0x2f, 0xd0, 0x38, 0x8d, 0x7b, 0x03, 0x70, 0x21, 0x1b, 0x75,\n-0xf2, 0x30, 0x3c, 0xfa, 0x8f, 0xae, 0xdd, 0xda, 0x63, 0xab, 0xeb, 0x16, 0x4f, 0xc2, 0x8e, 0x11,\n-0x4b, 0x7e, 0xcf, 0x0b, 0xe8, 0xff, 0xb5, 0x77, 0x2e, 0xf4, 0xb2, 0x7b, 0x4a, 0xe0, 0x4c, 0x12,\n-0x25, 0x0c, 0x70, 0x8d, 0x03, 0x29, 0xa0, 0xe1, 0x53, 0x24, 0xec, 0x13, 0xd9, 0xee, 0x19, 0xbf,\n-0x10, 0xb3, 0x4a, 0x8c, 0x3f, 0x89, 0xa3, 0x61, 0x51, 0xde, 0xac, 0x87, 0x07, 0x94, 0xf4, 0x63,\n-0x71, 0xec, 0x2e, 0xe2, 0x6f, 0x5b, 0x98, 0x81, 0xe1, 0x89, 0x5c, 0x34, 0x79, 0x6c, 0x76, 0xef,\n-0x3b, 0x90, 0x62, 0x79, 0xe6, 0xdb, 0xa4, 0x9a, 0x2f, 0x26, 0xc5, 0xd0, 0x10, 0xe1, 0x0e, 0xde,\n-0xd9, 0x10, 0x8e, 0x16, 0xfb, 0xb7, 0xf7, 0xa8, 0xf7, 0xc7, 0xe5, 0x02, 0x07, 0x98, 0x8f, 0x36,\n-0x08, 0x95, 0xe7, 0xe2, 0x37, 0x96, 0x0d, 0x36, 0x75, 0x9e, 0xfb, 0x0e, 0x72, 0xb1, 0x1d, 0x9b,\n-0xbc, 0x03, 0xf9, 0x49, 0x05, 0xd8, 0x81, 0xdd, 0x05, 0xb4, 0x2a, 0xd6, 0x41, 0xe9, 0xac, 0x01,\n-0x76, 0x95, 0x0a, 0x0f, 0xd8, 0xdf, 0xd5, 0xbd, 0x12, 0x1f, 0x35, 0x2f, 0x28, 0x17, 0x6c, 0xd2,\n-0x98, 0xc1, 0xa8, 0x09, 0x64, 0x77, 0x6e, 0x47, 0x37, 0xba, 0xce, 0xac, 0x59, 0x5e, 0x68, 0x9d,\n-0x7f, 0x72, 0xd6, 0x89, 0xc5, 0x06, 0x41, 0x29, 0x3e, 0x59, 0x3e, 0xdd, 0x26, 0xf5, 0x24, 0xc9,\n-0x11, 0xa7, 0x5a, 0xa3, 0x4c, 0x40, 0x1f, 0x46, 0xa1, 0x99, 0xb5, 0xa7, 0x3a, 0x51, 0x6e, 0x86,\n-0x3b, 0x9e, 0x7d, 0x72, 0xa7, 0x12, 0x05, 0x78, 0x59, 0xed, 0x3e, 0x51, 0x78, 0x15, 0x0b, 0x03,\n-0x8f, 0x8d, 0xd0, 0x2f, 0x05, 0xb2, 0x3e, 0x7b, 0x4a, 0x1c, 0x4b, 0x73, 0x05, 0x12, 0xfc, 0xc6,\n-0xea, 0xe0, 0x50, 0x13, 0x7c, 0x43, 0x93, 0x74, 0xb3, 0xca, 0x74, 0xe7, 0x8e, 0x1f, 0x01, 0x08,\n-0xd0, 0x30, 0xd4, 0x5b, 0x71, 0x36, 0xb4, 0x07, 0xba, 0xc1, 0x30, 0x30, 0x5c, 0x48, 0xb7, 0x82,\n-0x3b, 0x98, 0xa6, 0x7d, 0x60, 0x8a, 0xa2, 0xa3, 0x29, 0x82, 0xcc, 0xba, 0xbd, 0x83, 0x04, 0x1b,\n-0xa2, 0x83, 0x03, 0x41, 0xa1, 0xd6, 0x05, 0xf1, 0x1b, 0xc2, 0xb6, 0xf0, 0xa8, 0x7c, 0x86, 0x3b,\n-0x46, 0xa8, 0x48, 0x2a, 0x88, 0xdc, 0x76, 0x9a, 0x76, 0xbf, 0x1f, 0x6a, 0xa5, 0x3d, 0x19, 0x8f,\n-0xeb, 0x38, 0xf3, 0x64, 0xde, 0xc8, 0x2b, 0x0d, 0x0a, 0x28, 0xff, 0xf7, 0xdb, 0xe2, 0x15, 0x42,\n-0xd4, 0x22, 0xd0, 0x27, 0x5d, 0xe1, 0x79, 0xfe, 0x18, 0xe7, 0x70, 0x88, 0xad, 0x4e, 0xe6, 0xd9,\n-0x8b, 0x3a, 0xc6, 0xdd, 0x27, 0x51, 0x6e, 0xff, 0xbc, 0x64, 0xf5, 0x33, 0x43, 0x4f, 0x02, 0x03,\n-0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,\n-0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n-0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n-0x16, 0x04, 0x14, 0x79, 0xb4, 0x59, 0xe6, 0x7b, 0xb6, 0xe5, 0xe4, 0x01, 0x73, 0x80, 0x08, 0x88,\n-0xc8, 0x1a, 0x58, 0xf6, 0xe9, 0x9b, 0x6e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x55, 0x1f, 0x58, 0xa9, 0xbc,\n-0xb2, 0xa8, 0x50, 0xd0, 0x0c, 0xb1, 0xd8, 0x1a, 0x69, 0x20, 0x27, 0x29, 0x08, 0xac, 0x61, 0x75,\n-0x5c, 0x8a, 0x6e, 0xf8, 0x82, 0xe5, 0x69, 0x2f, 0xd5, 0xf6, 0x56, 0x4b, 0xb9, 0xb8, 0x73, 0x10,\n-0x59, 0xd3, 0x21, 0x97, 0x7e, 0xe7, 0x4c, 0x71, 0xfb, 0xb2, 0xd2, 0x60, 0xad, 0x39, 0xa8, 0x0b,\n-0xea, 0x17, 0x21, 0x56, 0x85, 0xf1, 0x50, 0x0e, 0x59, 0xeb, 0xce, 0xe0, 0x59, 0xe9, 0xba, 0xc9,\n-0x15, 0xef, 0x86, 0x9d, 0x8f, 0x84, 0x80, 0xf6, 0xe4, 0xe9, 0x91, 0x90, 0xdc, 0x17, 0x9b, 0x62,\n-0x1b, 0x45, 0xf0, 0x66, 0x95, 0xd2, 0x7c, 0x6f, 0xc2, 0xea, 0x3b, 0xef, 0x1f, 0xcf, 0xcb, 0xd6,\n-0xae, 0x27, 0xf1, 0xa9, 0xb0, 0xc8, 0xae, 0xfd, 0x7d, 0x7e, 0x9a, 0xfa, 0x22, 0x04, 0xeb, 0xff,\n-0xd9, 0x7f, 0xea, 0x91, 0x2b, 0x22, 0xb1, 0x17, 0x0e, 0x8f, 0xf2, 0x8a, 0x34, 0x5b, 0x58, 0xd8,\n-0xfc, 0x01, 0xc9, 0x54, 0xb9, 0xb8, 0x26, 0xcc, 0x8a, 0x88, 0x33, 0x89, 0x4c, 0x2d, 0x84, 0x3c,\n-0x82, 0xdf, 0xee, 0x96, 0x57, 0x05, 0xba, 0x2c, 0xbb, 0xf7, 0xc4, 0xb7, 0xc7, 0x4e, 0x3b, 0x82,\n-0xbe, 0x31, 0xc8, 0x22, 0x73, 0x73, 0x92, 0xd1, 0xc2, 0x80, 0xa4, 0x39, 0x39, 0x10, 0x33, 0x23,\n-0x82, 0x4c, 0x3c, 0x9f, 0x86, 0xb2, 0x55, 0x98, 0x1d, 0xbe, 0x29, 0x86, 0x8c, 0x22, 0x9b, 0x9e,\n-0xe2, 0x6b, 0x3b, 0x57, 0x3a, 0x82, 0x70, 0x4d, 0xdc, 0x09, 0xc7, 0x89, 0xcb, 0x0a, 0x07, 0x4d,\n-0x6c, 0xe8, 0x5d, 0x8e, 0xc9, 0xef, 0xce, 0xab, 0xc7, 0xbb, 0xb5, 0x2b, 0x4e, 0x45, 0xd6, 0x4a,\n-0xd0, 0x26, 0xcc, 0xe5, 0x72, 0xca, 0x08, 0x6a, 0xa5, 0x95, 0xe3, 0x15, 0xa1, 0xf7, 0xa4, 0xed,\n-0xc9, 0x2c, 0x5f, 0xa5, 0xfb, 0xff, 0xac, 0x28, 0x02, 0x2e, 0xbe, 0xd7, 0x7b, 0xbb, 0xe3, 0x71,\n-0x7b, 0x90, 0x16, 0xd3, 0x07, 0x5e, 0x46, 0x53, 0x7c, 0x37, 0x07, 0x42, 0x8c, 0xd3, 0xc4, 0x96,\n-0x9c, 0xd5, 0x99, 0xb5, 0x2a, 0xe0, 0x95, 0x1a, 0x80, 0x48, 0xae, 0x4c, 0x39, 0x07, 0xce, 0xcc,\n-0x47, 0xa4, 0x52, 0x95, 0x2b, 0xba, 0xb8, 0xfb, 0xad, 0xd2, 0x33, 0x53, 0x7d, 0xe5, 0x1d, 0x4d,\n-0x6d, 0xd5, 0xa1, 0xb1, 0xc7, 0x42, 0x6f, 0xe6, 0x40, 0x27, 0x35, 0x5c, 0xa3, 0x28, 0xb7, 0x07,\n-0x8d, 0xe7, 0x8d, 0x33, 0x90, 0xe7, 0x23, 0x9f, 0xfb, 0x50, 0x9c, 0x79, 0x6c, 0x46, 0xd5, 0xb4,\n-0x15, 0xb3, 0x96, 0x6e, 0x7e, 0x9b, 0x0c, 0x96, 0x3a, 0xb8, 0x52, 0x2d, 0x3f, 0xd6, 0x5b, 0xe1,\n-0xfb, 0x08, 0xc2, 0x84, 0xfe, 0x24, 0xa8, 0xa3, 0x89, 0xda, 0xac, 0x6a, 0xe1, 0x18, 0x2a, 0xb1,\n-0xa8, 0x43, 0x61, 0x5b, 0xd3, 0x1f, 0xdc, 0x3b, 0x8d, 0x76, 0xf2, 0x2d, 0xe8, 0x8d, 0x75, 0xdf,\n-0x17, 0x33, 0x6c, 0x3d, 0x53, 0xfb, 0x7b, 0xcb, 0x41, 0x5f, 0xff, 0xdc, 0xa2, 0xd0, 0x61, 0x38,\n-0xe1, 0x96, 0xb8, 0xac, 0x5d, 0x8b, 0x37, 0xd7, 0x75, 0xd5, 0x33, 0xc0, 0x99, 0x11, 0xae, 0x9d,\n-0x41, 0xc1, 0x72, 0x75, 0x84, 0xbe, 0x02, 0x41, 0x42, 0x5f, 0x67, 0x24, 0x48, 0x94, 0xd1, 0x9b,\n-0x27, 0xbe, 0x07, 0x3f, 0xb9, 0xb8, 0x4f, 0x81, 0x74, 0x51, 0xe1, 0x7a, 0xb7, 0xed, 0x9d, 0x23,\n-0xe2, 0xbe, 0xe0, 0xd5, 0x28, 0x04, 0x13, 0x3c, 0x31, 0x03, 0x9e, 0xdd, 0x7a, 0x6c, 0x8f, 0xc6,\n-0x07, 0x18, 0xc6, 0x7f, 0xde, 0x47, 0x8e, 0x3f, 0x28, 0x9e, 0x04, 0x06, 0xcf, 0xa5, 0x54, 0x34,\n-0x77, 0xbd, 0xec, 0x89, 0x9b, 0xe9, 0x17, 0x43, 0xdf, 0x5b, 0xdb, 0x5f, 0xfe, 0x8e, 0x1e, 0x57,\n-0xa2, 0xcd, 0x40, 0x9d, 0x7e, 0x62, 0x22, 0xda, 0xde, 0x18, 0x27, 0x30, 0x82, 0x04, 0x63, 0x30,\n-0x82, 0x03, 0x4b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n-0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xd2, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,\n-0x55, 0x04, 0x07, 0x13, 0x0f, 0x47, 0x65, 0x62, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x4b, 0x6f, 0x63,\n-0x61, 0x65, 0x6c, 0x69, 0x31, 0x42, 0x30, 0x40, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x39, 0x54,\n-0x75, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0x6d, 0x73, 0x65, 0x6c, 0x20,\n-0x76, 0x65, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6b, 0x20, 0x41, 0x72,\n-0x61, 0x73, 0x74, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x75, 0x20, 0x2d,\n-0x20, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4b, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04,\n-0x0b, 0x13, 0x24, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b,\n-0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x72, 0x6b, 0x65, 0x7a, 0x69, 0x20, 0x2d, 0x20,\n-0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x4d, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x13, 0x2d, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4b, 0x20, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53,\n-0x4d, 0x20, 0x53, 0x53, 0x4c, 0x20, 0x4b, 0x6f, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66,\n-0x69, 0x6b, 0x61, 0x73, 0x69, 0x20, 0x2d, 0x20, 0x53, 0x75, 0x72, 0x75, 0x6d, 0x20, 0x31, 0x30,\n-0x1e, 0x17, 0x0d, 0x31, 0x33, 0x31, 0x31, 0x32, 0x35, 0x30, 0x38, 0x32, 0x35, 0x35, 0x35, 0x5a,\n-0x17, 0x0d, 0x34, 0x33, 0x31, 0x30, 0x32, 0x35, 0x30, 0x38, 0x32, 0x35, 0x35, 0x35, 0x5a, 0x30,\n-0x81, 0xd2, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31,\n-0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0f, 0x47, 0x65, 0x62, 0x7a, 0x65, 0x20,\n-0x2d, 0x20, 0x4b, 0x6f, 0x63, 0x61, 0x65, 0x6c, 0x69, 0x31, 0x42, 0x30, 0x40, 0x06, 0x03, 0x55,\n-0x04, 0x0a, 0x13, 0x39, 0x54, 0x75, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69,\n-0x6d, 0x73, 0x65, 0x6c, 0x20, 0x76, 0x65, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a,\n-0x69, 0x6b, 0x20, 0x41, 0x72, 0x61, 0x73, 0x74, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x4b, 0x75, 0x72,\n-0x75, 0x6d, 0x75, 0x20, 0x2d, 0x20, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4b, 0x31, 0x2d, 0x30,\n-0x2b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x24, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x65, 0x72,\n-0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x72, 0x6b, 0x65,\n-0x7a, 0x69, 0x20, 0x2d, 0x20, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x4d, 0x31, 0x36, 0x30, 0x34,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4b, 0x20, 0x4b,\n-0x61, 0x6d, 0x75, 0x20, 0x53, 0x4d, 0x20, 0x53, 0x53, 0x4c, 0x20, 0x4b, 0x6f, 0x6b, 0x20, 0x53,\n-0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, 0x69, 0x20, 0x2d, 0x20, 0x53, 0x75, 0x72,\n-0x75, 0x6d, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a,\n-0x02, 0x82, 0x01, 0x01, 0x00, 0xaf, 0x75, 0x30, 0x33, 0xaa, 0xbb, 0x6b, 0xd3, 0x99, 0x2c, 0x12,\n-0x37, 0x84, 0xd9, 0x8d, 0x7b, 0x97, 0x80, 0xd3, 0x6e, 0xe7, 0xff, 0x9b, 0x50, 0x95, 0x3e, 0x90,\n-0x95, 0x56, 0x42, 0xd7, 0x19, 0x7c, 0x26, 0x84, 0x8d, 0x92, 0xfa, 0x01, 0x1d, 0x3a, 0x0f, 0xe2,\n-0x64, 0x38, 0xb7, 0x8c, 0xbc, 0xe8, 0x88, 0xf9, 0x8b, 0x24, 0xab, 0x2e, 0xa3, 0xf5, 0x37, 0xe4,\n-0x40, 0x8e, 0x18, 0x25, 0x79, 0x83, 0x75, 0x1f, 0x3b, 0xff, 0x6c, 0xa8, 0xc5, 0xc6, 0x56, 0xf8,\n-0xb4, 0xed, 0x8a, 0x44, 0xa3, 0xab, 0x6c, 0x4c, 0xfc, 0x1d, 0xd0, 0xdc, 0xef, 0x68, 0xbd, 0xcf,\n-0xe4, 0xaa, 0xce, 0xf0, 0x55, 0xf7, 0xa2, 0x34, 0xd4, 0x83, 0x6b, 0x37, 0x7c, 0x1c, 0xc2, 0xfe,\n-0xb5, 0x03, 0xec, 0x57, 0xce, 0xbc, 0xb4, 0xb5, 0xc5, 0xed, 0x00, 0x0f, 0x53, 0x37, 0x2a, 0x4d,\n-0xf4, 0x4f, 0x0c, 0x83, 0xfb, 0x86, 0xcf, 0xcb, 0xfe, 0x8c, 0x4e, 0xbd, 0x87, 0xf9, 0xa7, 0x8b,\n-0x21, 0x57, 0x9c, 0x7a, 0xdf, 0x03, 0x67, 0x89, 0x2c, 0x9d, 0x97, 0x61, 0xa7, 0x10, 0xb8, 0x55,\n-0x90, 0x7f, 0x0e, 0x2d, 0x27, 0x38, 0x74, 0xdf, 0xe7, 0xfd, 0xda, 0x4e, 0x12, 0xe3, 0x4d, 0x15,\n-0x22, 0x02, 0xc8, 0xe0, 0xe0, 0xfc, 0x0f, 0xad, 0x8a, 0xd7, 0xc9, 0x54, 0x50, 0xcc, 0x3b, 0x0f,\n-0xca, 0x16, 0x80, 0x84, 0xd0, 0x51, 0x56, 0xc3, 0x8e, 0x56, 0x7f, 0x89, 0x22, 0x33, 0x2f, 0xe6,\n-0x85, 0x0a, 0xbd, 0xa5, 0xa8, 0x1b, 0x36, 0xde, 0xd3, 0xdc, 0x2c, 0x6d, 0x3b, 0xc7, 0x13, 0xbd,\n-0x59, 0x23, 0x2c, 0xe6, 0xe5, 0xa4, 0xf7, 0xd8, 0x0b, 0xed, 0xea, 0x90, 0x40, 0x44, 0xa8, 0x95,\n-0xbb, 0x93, 0xd5, 0xd0, 0x80, 0x34, 0xb6, 0x46, 0x78, 0x0e, 0x1f, 0x00, 0x93, 0x46, 0xe1, 0xee,\n-0xe9, 0xf9, 0xec, 0x4f, 0x17, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d,\n-0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x65, 0x3f, 0xc7, 0x8a, 0x86, 0xc6, 0x3c,\n-0xdd, 0x3c, 0x54, 0x5c, 0x35, 0xf8, 0x3a, 0xed, 0x52, 0x0c, 0x47, 0x57, 0xc8, 0x30, 0x0e, 0x06,\n-0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06,\n-0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01,\n-0x01, 0x00, 0x2a, 0x3f, 0xe1, 0xf1, 0x32, 0x8e, 0xae, 0xe1, 0x98, 0x5c, 0x4b, 0x5e, 0xcf, 0x6b,\n-0x1e, 0x6a, 0x09, 0xd2, 0x22, 0xa9, 0x12, 0xc7, 0x5e, 0x57, 0x7d, 0x73, 0x56, 0x64, 0x80, 0x84,\n-0x7a, 0x93, 0xe4, 0x09, 0xb9, 0x10, 0xcd, 0x9f, 0x2a, 0x27, 0xe1, 0x00, 0x77, 0xbe, 0x48, 0xc8,\n-0x35, 0xa8, 0x81, 0x9f, 0xe4, 0xb8, 0x2c, 0xc9, 0x7f, 0x0e, 0xb0, 0xd2, 0x4b, 0x37, 0x5d, 0xea,\n-0xb9, 0xd5, 0x0b, 0x5e, 0x34, 0xbd, 0xf4, 0x73, 0x29, 0xc3, 0xed, 0x26, 0x15, 0x9c, 0x7e, 0x08,\n-0x53, 0x8a, 0x58, 0x8d, 0xd0, 0x4b, 0x28, 0xdf, 0xc1, 0xb3, 0xdf, 0x20, 0xf3, 0xf9, 0xe3, 0xe3,\n-0x3a, 0xdf, 0xcc, 0x9c, 0x94, 0xd8, 0x4e, 0x4f, 0xc3, 0x6b, 0x17, 0xb7, 0xf7, 0x72, 0xe8, 0xad,\n-0x66, 0x33, 0xb5, 0x25, 0x53, 0xab, 0xe0, 0xf8, 0x4c, 0xa9, 0x9d, 0xfd, 0xf2, 0x0d, 0xba, 0xae,\n-0xb9, 0xd9, 0xaa, 0xc6, 0x6b, 0xf9, 0x93, 0xbb, 0xae, 0xab, 0xb8, 0x97, 0x3c, 0x03, 0x1a, 0xba,\n-0x43, 0xc6, 0x96, 0xb9, 0x45, 0x72, 0x38, 0xb3, 0xa7, 0xa1, 0x96, 0x3d, 0x91, 0x7b, 0x7e, 0xc0,\n-0x21, 0x53, 0x4c, 0x87, 0xed, 0xf2, 0x0b, 0x54, 0x95, 0x51, 0x93, 0xd5, 0x22, 0xa5, 0x0d, 0x8a,\n-0xf1, 0x93, 0x0e, 0x3e, 0x54, 0x0e, 0xb0, 0xd8, 0xc9, 0x4e, 0xdc, 0xf2, 0x31, 0x32, 0x56, 0xea,\n-0x64, 0xf9, 0xea, 0xb5, 0x9d, 0x16, 0x66, 0x42, 0x72, 0xf3, 0x7f, 0xd3, 0xb1, 0x31, 0x43, 0xfc,\n-0xa4, 0x8e, 0x17, 0xf1, 0x6d, 0x23, 0xab, 0x94, 0x66, 0xf8, 0xad, 0xfb, 0x0f, 0x08, 0x6e, 0x26,\n-0x2d, 0x7f, 0x17, 0x07, 0x09, 0xb2, 0x8c, 0xfb, 0x50, 0xc0, 0x9f, 0x96, 0x8d, 0xcf, 0xb6, 0xfd,\n-0x00, 0x9d, 0x5a, 0x14, 0x9a, 0xbf, 0x02, 0x44, 0xf5, 0xc1, 0xc2, 0x9f, 0x22, 0x5e, 0xa2, 0x0f,\n-0xa1, 0xe3, 0x30, 0x82, 0x01, 0xb6, 0x30, 0x82, 0x01, 0x5b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n-0x13, 0x06, 0x6c, 0x9f, 0xd5, 0x74, 0x97, 0x36, 0x66, 0x3f, 0x3b, 0x0b, 0x9a, 0xd9, 0xe8, 0x9e,\n-0x76, 0x03, 0xf2, 0x4a, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,\n-0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n-0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e,\n-0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f,\n-0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n-0x35, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30,\n-0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x39, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06,\n-0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f,\n-0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce,\n-0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00,\n-0x04, 0x29, 0x97, 0xa7, 0xc6, 0x41, 0x7f, 0xc0, 0x0d, 0x9b, 0xe8, 0x01, 0x1b, 0x56, 0xc6, 0xf2,\n-0x52, 0xa5, 0xba, 0x2d, 0xb2, 0x12, 0xe8, 0xd2, 0x2e, 0xd7, 0xfa, 0xc9, 0xc5, 0xd8, 0xaa, 0x6d,\n-0x1f, 0x73, 0x81, 0x3b, 0x3b, 0x98, 0x6b, 0x39, 0x7c, 0x33, 0xa5, 0xc5, 0x4e, 0x86, 0x8e, 0x80,\n-0x17, 0x68, 0x62, 0x45, 0x57, 0x7d, 0x44, 0x58, 0x1d, 0xb3, 0x37, 0xe5, 0x67, 0x08, 0xeb, 0x66,\n-0xde, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n-0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n-0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n-0x14, 0xab, 0xb6, 0xdb, 0xd7, 0x06, 0x9e, 0x37, 0xac, 0x30, 0x86, 0x07, 0x91, 0x70, 0xc7, 0x9c,\n-0xc4, 0x19, 0xb1, 0x78, 0xc0, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03,\n-0x02, 0x03, 0x49, 0x00, 0x30, 0x46, 0x02, 0x21, 0x00, 0xe0, 0x85, 0x92, 0xa3, 0x17, 0xb7, 0x8d,\n-0xf9, 0x2b, 0x06, 0xa5, 0x93, 0xac, 0x1a, 0x98, 0x68, 0x61, 0x72, 0xfa, 0xe1, 0xa1, 0xd0, 0xfb,\n-0x1c, 0x78, 0x60, 0xa6, 0x43, 0x99, 0xc5, 0xb8, 0xc4, 0x02, 0x21, 0x00, 0x9c, 0x02, 0xef, 0xf1,\n-0x94, 0x9c, 0xb3, 0x96, 0xf9, 0xeb, 0xc6, 0x2a, 0xf8, 0xb6, 0x2c, 0xfe, 0x3a, 0x90, 0x14, 0x16,\n-0xd7, 0x8c, 0x63, 0x24, 0x48, 0x1c, 0xdf, 0x30, 0x7d, 0xd5, 0x68, 0x3b, 0x30, 0x82, 0x05, 0x88,\n-0x30, 0x82, 0x03, 0x70, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x7d, 0x09, 0x97, 0xfe, 0xf0,\n-0x47, 0xea, 0x7a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n-0x05, 0x00, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43,\n-0x4e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x29, 0x47, 0x55, 0x41, 0x4e,\n-0x47, 0x20, 0x44, 0x4f, 0x4e, 0x47, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41,\n-0x54, 0x45, 0x20, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x20, 0x43, 0x4f, 0x2e,\n-0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16,\n-0x47, 0x44, 0x43, 0x41, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, 0x55, 0x54, 0x48, 0x20, 0x52,\n-0x35, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x31, 0x32, 0x36,\n-0x30, 0x35, 0x31, 0x33, 0x31, 0x35, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31,\n-0x35, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n-0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x29,\n-0x47, 0x55, 0x41, 0x4e, 0x47, 0x20, 0x44, 0x4f, 0x4e, 0x47, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49,\n-0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x20, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59,\n-0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x0c, 0x16, 0x47, 0x44, 0x43, 0x41, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, 0x55,\n-0x54, 0x48, 0x20, 0x52, 0x35, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02,\n-0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd9, 0xa3, 0x16, 0xf0, 0xc8,\n-0x74, 0x74, 0x77, 0x9b, 0xef, 0x33, 0x0d, 0x3b, 0x06, 0x7e, 0x55, 0xfc, 0xb5, 0x60, 0x8f, 0x76,\n-0x86, 0x12, 0x42, 0x7d, 0x56, 0x66, 0x3e, 0x88, 0x82, 0xed, 0x72, 0x63, 0x0e, 0x9e, 0x8b, 0xdd,\n-0x34, 0x2c, 0x02, 0x51, 0x51, 0xc3, 0x19, 0xfd, 0x59, 0x54, 0x84, 0xc9, 0xf1, 0x6b, 0xb3, 0x4c,\n-0xb0, 0xe9, 0xe8, 0x46, 0x5d, 0x38, 0xc6, 0xa2, 0xa7, 0x2e, 0x11, 0x57, 0xba, 0x82, 0x15, 0xa2,\n-0x9c, 0x8f, 0x6d, 0xb0, 0x99, 0x4a, 0x0a, 0xf2, 0xeb, 0x89, 0x70, 0x63, 0x4e, 0x79, 0xc4, 0xb7,\n-0x5b, 0xbd, 0xa2, 0x5d, 0xb1, 0xf2, 0x41, 0x02, 0x2b, 0xad, 0xa9, 0x3a, 0xa3, 0xec, 0x79, 0x0a,\n-0xec, 0x5f, 0x3a, 0xe3, 0xfd, 0xef, 0x80, 0x3c, 0xad, 0x34, 0x9b, 0x1a, 0xab, 0x88, 0x26, 0x7b,\n-0x56, 0xa2, 0x82, 0x86, 0x1f, 0xeb, 0x35, 0x89, 0x83, 0x7f, 0x5f, 0xae, 0x29, 0x4e, 0x3d, 0xb6,\n-0x6e, 0xec, 0xae, 0xc1, 0xf0, 0x27, 0x9b, 0xae, 0xe3, 0xf4, 0xec, 0xef, 0xae, 0x7f, 0xf7, 0x86,\n-0x3d, 0x72, 0x7a, 0xeb, 0xa5, 0xfb, 0x59, 0x4e, 0xa7, 0xeb, 0x95, 0x8c, 0x22, 0x39, 0x79, 0xe1,\n-0x2d, 0x08, 0x8f, 0xcc, 0xbc, 0x91, 0xb8, 0x41, 0xf7, 0x14, 0xc1, 0x23, 0xa9, 0xc3, 0xad, 0x9a,\n-0x45, 0x44, 0xb3, 0xb2, 0xd7, 0x2c, 0xcd, 0xc6, 0x29, 0xe2, 0x50, 0x10, 0xae, 0x5c, 0xcb, 0x82,\n-0x8e, 0x17, 0x18, 0x36, 0x7d, 0x97, 0xe6, 0x88, 0x9a, 0xb0, 0x4d, 0x34, 0x09, 0xf4, 0x2c, 0xb9,\n-0x5a, 0x66, 0x2a, 0xb0, 0x17, 0x9b, 0x9e, 0x1e, 0x76, 0x9d, 0x4a, 0x66, 0x31, 0x41, 0xdf, 0x3f,\n-0xfb, 0xc5, 0x06, 0xef, 0x1b, 0xb6, 0x7e, 0x1a, 0x46, 0x36, 0xf7, 0x64, 0x63, 0x3b, 0xe3, 0x39,\n-0x18, 0x23, 0xe7, 0x67, 0x75, 0x14, 0xd5, 0x75, 0x57, 0x92, 0x37, 0xbd, 0xbe, 0x6a, 0x1b, 0x26,\n-0x50, 0xf2, 0x36, 0x26, 0x06, 0x90, 0xc5, 0x70, 0x01, 0x64, 0x6d, 0x76, 0x66, 0xe1, 0x91, 0xdb,\n-0x6e, 0x07, 0xc0, 0x61, 0x80, 0x2e, 0xb2, 0x2e, 0x2f, 0x8c, 0x70, 0xa7, 0xd1, 0x3b, 0x3c, 0xb3,\n-0x91, 0xe4, 0x6e, 0xb6, 0xc4, 0x3b, 0x70, 0xf2, 0x6c, 0x92, 0x97, 0x09, 0xcd, 0x47, 0x7d, 0x18,\n-0xc0, 0xf3, 0xbb, 0x9e, 0x0f, 0xd6, 0x8b, 0xae, 0x07, 0xb6, 0x5a, 0x0f, 0xce, 0x0b, 0x0c, 0x47,\n-0xa7, 0xe5, 0x3e, 0xb8, 0xbd, 0x7d, 0xc7, 0x9b, 0x35, 0xa0, 0x61, 0x97, 0x3a, 0x41, 0x75, 0x17,\n-0xcc, 0x2b, 0x96, 0x77, 0x2a, 0x92, 0x21, 0x1e, 0xd9, 0x95, 0x76, 0x20, 0x67, 0x68, 0xcf, 0x0d,\n-0xbd, 0xdf, 0xd6, 0x1f, 0x09, 0x6a, 0x9a, 0xe2, 0xcc, 0x73, 0x71, 0xa4, 0x2f, 0x7d, 0x12, 0x80,\n-0xb7, 0x53, 0x30, 0x46, 0x5e, 0x4b, 0x54, 0x99, 0x0f, 0x67, 0xc9, 0xa5, 0xc8, 0xf2, 0x20, 0xc1,\n-0x82, 0xec, 0x9d, 0x11, 0xdf, 0xc2, 0x02, 0xfb, 0x1a, 0x3b, 0xd1, 0xed, 0x20, 0x9a, 0xef, 0x65,\n-0x64, 0x92, 0x10, 0x0d, 0x2a, 0xe2, 0xde, 0x70, 0xf1, 0x18, 0x67, 0x82, 0x8c, 0x61, 0xde, 0xb8,\n-0xbc, 0xd1, 0x2f, 0x9c, 0xfb, 0x0f, 0xd0, 0x2b, 0xed, 0x1b, 0x76, 0xb9, 0xe4, 0x39, 0x55, 0xf8,\n-0xf8, 0xa1, 0x1d, 0xb8, 0xaa, 0x80, 0x00, 0x4c, 0x82, 0xe7, 0xb2, 0x7f, 0x09, 0xb8, 0xbc, 0x30,\n-0xa0, 0x2f, 0x0d, 0xf5, 0x52, 0x9e, 0x8e, 0xf7, 0x92, 0xb3, 0x0a, 0x00, 0x1d, 0x00, 0x54, 0x97,\n-0x06, 0xe0, 0xb1, 0x07, 0xd9, 0xc7, 0x0f, 0x5c, 0x65, 0x7d, 0x3c, 0x6d, 0x59, 0x57, 0xe4, 0xed,\n-0xa5, 0x8d, 0xe9, 0x40, 0x53, 0x9f, 0x15, 0x4b, 0xa0, 0x71, 0xf6, 0x1a, 0x21, 0xe3, 0xda, 0x70,\n-0x06, 0x21, 0x58, 0x14, 0x87, 0x85, 0x77, 0x79, 0xaa, 0x82, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01,\n-0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe2,\n-0xc9, 0x40, 0x9f, 0x4d, 0xce, 0xe8, 0x9a, 0xa1, 0x7c, 0xcf, 0x0e, 0x3f, 0x65, 0xc5, 0x29, 0x88,\n-0x6a, 0x19, 0x51, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n-0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n-0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n-0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xd1, 0x49, 0x57, 0xe0, 0xa7, 0xcc, 0x68, 0x58,\n-0xba, 0x01, 0x0f, 0x2b, 0x19, 0xcd, 0x8d, 0xb0, 0x61, 0x45, 0xac, 0x11, 0xed, 0x63, 0x50, 0x69,\n-0xf8, 0x1f, 0x7f, 0xbe, 0x16, 0x8f, 0xfd, 0x9d, 0xeb, 0x0b, 0xaa, 0x32, 0x47, 0x76, 0xd2, 0x67,\n-0x24, 0xed, 0xbd, 0x7c, 0x33, 0x32, 0x97, 0x2a, 0xc7, 0x05, 0x86, 0x66, 0x0d, 0x17, 0x7d, 0x14,\n-0x15, 0x1b, 0xd4, 0xeb, 0xfd, 0x1f, 0x9a, 0xf6, 0x5e, 0x97, 0x69, 0xb7, 0x1a, 0x25, 0xa4, 0x0a,\n-0xb3, 0x91, 0x3f, 0x5f, 0x36, 0xac, 0x8b, 0xec, 0x57, 0xa8, 0x3e, 0xe7, 0x81, 0x8a, 0x18, 0x57,\n-0x39, 0x85, 0x74, 0x1a, 0x42, 0xc7, 0xe9, 0x5b, 0x13, 0x5f, 0x8f, 0xf9, 0x08, 0xe9, 0x92, 0x74,\n-0x8d, 0xf5, 0x47, 0xd2, 0xab, 0x3b, 0xd6, 0xfb, 0x78, 0x66, 0x4e, 0x36, 0x7d, 0xf9, 0xe9, 0x92,\n-0xe9, 0x04, 0xde, 0xfd, 0x49, 0x63, 0xfc, 0x6d, 0xfb, 0x14, 0x71, 0x93, 0x67, 0x2f, 0x47, 0x4a,\n-0xb7, 0xb9, 0xff, 0x1e, 0x2a, 0x73, 0x70, 0x46, 0x30, 0xbf, 0x5a, 0xf2, 0x2f, 0x79, 0xa5, 0xe1,\n-0x8d, 0x0c, 0xd9, 0xf9, 0xb2, 0x63, 0x37, 0x8c, 0x37, 0x65, 0x85, 0x70, 0x6a, 0x5c, 0x5b, 0x09,\n-0x72, 0xb9, 0xad, 0x63, 0x3c, 0xb1, 0xdd, 0xf8, 0xfc, 0x32, 0xbf, 0x37, 0x86, 0xe4, 0xbb, 0x8e,\n-0x98, 0x27, 0x7e, 0xba, 0x1f, 0x16, 0xe1, 0x70, 0x11, 0xf2, 0x03, 0xdf, 0x25, 0x62, 0x32, 0x27,\n-0x26, 0x18, 0x32, 0x84, 0x9f, 0xff, 0x00, 0x3a, 0x13, 0xba, 0x9a, 0x4d, 0xf4, 0x4f, 0xb8, 0x14,\n-0x70, 0x22, 0xb1, 0xca, 0x2b, 0x90, 0xce, 0x29, 0xc1, 0x70, 0xf4, 0x2f, 0x9d, 0x7f, 0xf2, 0x90,\n-0x1e, 0xd6, 0x5a, 0xdf, 0xb7, 0x46, 0xfc, 0xe6, 0x86, 0xfa, 0xcb, 0xe0, 0x20, 0x76, 0x7a, 0xba,\n-0xa6, 0xcb, 0xf5, 0x7c, 0xde, 0x62, 0xa5, 0xb1, 0x8b, 0xee, 0xde, 0x82, 0x66, 0x8a, 0x4e, 0x3a,\n-0x30, 0x1f, 0x3f, 0x80, 0xcb, 0xad, 0x27, 0xba, 0x0c, 0x5e, 0xd7, 0xd0, 0xb1, 0x56, 0xca, 0x77,\n-0x71, 0xb2, 0xb5, 0x75, 0xa1, 0x50, 0xa9, 0x40, 0x43, 0x17, 0xc2, 0x28, 0xd9, 0xcf, 0x52, 0x8b,\n-0x5b, 0xc8, 0x63, 0xd4, 0x42, 0x3e, 0xa0, 0x33, 0x7a, 0x46, 0x2e, 0xf7, 0x0a, 0x20, 0x46, 0x54,\n-0x7e, 0x6a, 0x4f, 0x31, 0xf1, 0x81, 0x7e, 0x42, 0x74, 0x38, 0x65, 0x73, 0x27, 0xee, 0xc6, 0x7c,\n-0xb8, 0x8e, 0xd7, 0xa5, 0x3a, 0xd7, 0x98, 0xa1, 0x9c, 0x8c, 0x10, 0x55, 0xd3, 0xdb, 0x4b, 0xec,\n-0x40, 0x90, 0xf2, 0xcd, 0x6e, 0x57, 0xd2, 0x62, 0x0e, 0x7c, 0x57, 0x93, 0xb1, 0xa7, 0x6d, 0xcd,\n-0x9d, 0x83, 0xbb, 0x2a, 0xe7, 0xe5, 0xb6, 0x3b, 0x71, 0x58, 0xad, 0xfd, 0xd1, 0x45, 0xbc, 0x5a,\n-0x91, 0xee, 0x53, 0x15, 0x6f, 0xd3, 0x45, 0x09, 0x75, 0x6e, 0xba, 0x90, 0x5d, 0x1e, 0x04, 0xcf,\n-0x37, 0xdf, 0x1e, 0xa8, 0x66, 0xb1, 0x8c, 0xe6, 0x20, 0x6a, 0xef, 0xfc, 0x48, 0x4e, 0x74, 0x98,\n-0x42, 0xaf, 0x29, 0x6f, 0x2e, 0x6a, 0xc7, 0xfb, 0x7d, 0xd1, 0x66, 0x31, 0x22, 0xcc, 0x86, 0x00,\n-0x7e, 0x66, 0x83, 0x0c, 0x42, 0xf4, 0xbd, 0x34, 0x92, 0xc3, 0x1a, 0xea, 0x4f, 0xca, 0x7e, 0x72,\n-0x4d, 0x0b, 0x70, 0x8c, 0xa6, 0x48, 0xbb, 0xa6, 0xa1, 0x14, 0xf6, 0xfb, 0x58, 0x44, 0x99, 0x14,\n-0xae, 0xaa, 0x0b, 0x93, 0x69, 0xa0, 0x29, 0x25, 0x4a, 0xa5, 0xcb, 0x2b, 0xdd, 0x8a, 0x66, 0x07,\n-0x16, 0x78, 0x15, 0x57, 0x71, 0x1b, 0xec, 0xf5, 0x47, 0x84, 0xf3, 0x9e, 0x31, 0x37, 0x7a, 0xd5,\n-0x7f, 0x24, 0xad, 0xe4, 0xbc, 0xfd, 0xfd, 0xcc, 0x6e, 0x83, 0xe8, 0x0c, 0xa8, 0xb7, 0x41, 0x6c,\n-0x07, 0xdd, 0xbd, 0x3c, 0x86, 0x97, 0x2f, 0xd2, 0x30, 0x82, 0x05, 0x41, 0x30, 0x82, 0x03, 0x29,\n-0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x13, 0x06, 0x6c, 0x9f, 0xd2, 0x96, 0x35, 0x86, 0x9f, 0x0a,\n-0x0f, 0xe5, 0x86, 0x78, 0xf8, 0x5b, 0x26, 0xbb, 0x8a, 0x37, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06,\n-0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04,\n-0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n-0x43, 0x41, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30,\n-0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30,\n-0x30, 0x30, 0x30, 0x5a, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d,\n-0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41,\n-0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30,\n-0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n-0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00,\n-0xad, 0x96, 0x9f, 0x2d, 0x9c, 0x4a, 0x4c, 0x4a, 0x81, 0x79, 0x51, 0x99, 0xec, 0x8a, 0xcb, 0x6b,\n-0x60, 0x51, 0x13, 0xbc, 0x4d, 0x6d, 0x06, 0xfc, 0xb0, 0x08, 0x8d, 0xdd, 0x19, 0x10, 0x6a, 0xc7,\n-0x26, 0x0c, 0x35, 0xd8, 0xc0, 0x6f, 0x20, 0x84, 0xe9, 0x94, 0xb1, 0x9b, 0x85, 0x03, 0xc3, 0x5b,\n-0xdb, 0x4a, 0xe8, 0xc8, 0xf8, 0x90, 0x76, 0xd9, 0x5b, 0x4f, 0xe3, 0x4c, 0xe8, 0x06, 0x36, 0x4d,\n-0xcc, 0x9a, 0xac, 0x3d, 0x0c, 0x90, 0x2b, 0x92, 0xd4, 0x06, 0x19, 0x60, 0xac, 0x37, 0x44, 0x79,\n-0x85, 0x81, 0x82, 0xad, 0x5a, 0x37, 0xe0, 0x0d, 0xcc, 0x9d, 0xa6, 0x4c, 0x52, 0x76, 0xea, 0x43,\n-0x9d, 0xb7, 0x04, 0xd1, 0x50, 0xf6, 0x55, 0xe0, 0xd5, 0xd2, 0xa6, 0x49, 0x85, 0xe9, 0x37, 0xe9,\n-0xca, 0x7e, 0xae, 0x5c, 0x95, 0x4d, 0x48, 0x9a, 0x3f, 0xae, 0x20, 0x5a, 0x6d, 0x88, 0x95, 0xd9,\n-0x34, 0xb8, 0x52, 0x1a, 0x43, 0x90, 0xb0, 0xbf, 0x6c, 0x05, 0xb9, 0xb6, 0x78, 0xb7, 0xea, 0xd0,\n-0xe4, 0x3a, 0x3c, 0x12, 0x53, 0x62, 0xff, 0x4a, 0xf2, 0x7b, 0xbe, 0x35, 0x05, 0xa9, 0x12, 0x34,\n-0xe3, 0xf3, 0x64, 0x74, 0x62, 0x2c, 0x3d, 0x00, 0x49, 0x5a, 0x28, 0xfe, 0x32, 0x44, 0xbb, 0x87,\n-0xdd, 0x65, 0x27, 0x02, 0x71, 0x3b, 0xda, 0x4a, 0xf7, 0x1f, 0xda, 0xcd, 0xf7, 0x21, 0x55, 0x90,\n-0x4f, 0x0f, 0xec, 0xae, 0x82, 0xe1, 0x9f, 0x6b, 0xd9, 0x45, 0xd3, 0xbb, 0xf0, 0x5f, 0x87, 0xed,\n-0x3c, 0x2c, 0x39, 0x86, 0xda, 0x3f, 0xde, 0xec, 0x72, 0x55, 0xeb, 0x79, 0xa3, 0xad, 0xdb, 0xdd,\n-0x7c, 0xb0, 0xba, 0x1c, 0xce, 0xfc, 0xde, 0x4f, 0x35, 0x76, 0xcf, 0x0f, 0xf8, 0x78, 0x1f, 0x6a,\n-0x36, 0x51, 0x46, 0x27, 0x61, 0x5b, 0xe9, 0x9e, 0xcf, 0xf0, 0xa2, 0x55, 0x7d, 0x7c, 0x25, 0x8a,\n-0x6f, 0x2f, 0xb4, 0xc5, 0xcf, 0x84, 0x2e, 0x2b, 0xfd, 0x0d, 0x51, 0x10, 0x6c, 0xfb, 0x5f, 0x1b,\n-0xbc, 0x1b, 0x7e, 0xc5, 0xae, 0x3b, 0x98, 0x01, 0x31, 0x92, 0xff, 0x0b, 0x57, 0xf4, 0x9a, 0xb2,\n-0xb9, 0x57, 0xe9, 0xab, 0xef, 0x0d, 0x76, 0xd1, 0xf0, 0xee, 0xf4, 0xce, 0x86, 0xa7, 0xe0, 0x6e,\n-0xe9, 0xb4, 0x69, 0xa1, 0xdf, 0x69, 0xf6, 0x33, 0xc6, 0x69, 0x2e, 0x97, 0x13, 0x9e, 0xa5, 0x87,\n-0xb0, 0x57, 0x10, 0x81, 0x37, 0xc9, 0x53, 0xb3, 0xbb, 0x7f, 0xf6, 0x92, 0xd1, 0x9c, 0xd0, 0x18,\n-0xf4, 0x92, 0x6e, 0xda, 0x83, 0x4f, 0xa6, 0x63, 0x99, 0x4c, 0xa5, 0xfb, 0x5e, 0xef, 0x21, 0x64,\n-0x7a, 0x20, 0x5f, 0x6c, 0x64, 0x85, 0x15, 0xcb, 0x37, 0xe9, 0x62, 0x0c, 0x0b, 0x2a, 0x16, 0xdc,\n-0x01, 0x2e, 0x32, 0xda, 0x3e, 0x4b, 0xf5, 0x9e, 0x3a, 0xf6, 0x17, 0x40, 0x94, 0xef, 0x9e, 0x91,\n-0x08, 0x86, 0xfa, 0xbe, 0x63, 0xa8, 0x5a, 0x33, 0xec, 0xcb, 0x74, 0x43, 0x95, 0xf9, 0x6c, 0x69,\n-0x52, 0x36, 0xc7, 0x29, 0x6f, 0xfc, 0x55, 0x03, 0x5c, 0x1f, 0xfb, 0x9f, 0xbd, 0x47, 0xeb, 0xe7,\n-0x49, 0x47, 0x95, 0x0b, 0x4e, 0x89, 0x22, 0x09, 0x49, 0xe0, 0xf5, 0x61, 0x1e, 0xf1, 0xbf, 0x2e,\n-0x8a, 0x72, 0x6e, 0x80, 0x59, 0xff, 0x57, 0x3a, 0xf9, 0x75, 0x32, 0xa3, 0x4e, 0x5f, 0xec, 0xed,\n-0x28, 0x62, 0xd9, 0x4d, 0x73, 0xf2, 0xcc, 0x81, 0x17, 0x60, 0xed, 0xcd, 0xeb, 0xdc, 0xdb, 0xa7,\n-0xca, 0xc5, 0x7e, 0x02, 0xbd, 0xf2, 0x54, 0x08, 0x54, 0xfd, 0xb4, 0x2d, 0x09, 0x2c, 0x17, 0x54,\n-0x4a, 0x98, 0xd1, 0x54, 0xe1, 0x51, 0x67, 0x08, 0xd2, 0xed, 0x6e, 0x7e, 0x6f, 0x3f, 0xd2, 0x2d,\n-0x81, 0x59, 0x29, 0x66, 0xcb, 0x90, 0x39, 0x95, 0x11, 0x1e, 0x74, 0x27, 0xfe, 0xdd, 0xeb, 0xaf,\n-0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n-0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n-0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n-0x0e, 0x04, 0x16, 0x04, 0x14, 0xb0, 0x0c, 0xf0, 0x4c, 0x30, 0xf4, 0x05, 0x58, 0x02, 0x48, 0xfd,\n-0x33, 0xe5, 0x52, 0xaf, 0x4b, 0x84, 0xe3, 0x66, 0x52, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n-0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xaa, 0xa8, 0x80,\n-0x8f, 0x0e, 0x78, 0xa3, 0xe0, 0xa2, 0xd4, 0xcd, 0xe6, 0xf5, 0x98, 0x7a, 0x3b, 0xea, 0x00, 0x03,\n-0xb0, 0x97, 0x0e, 0x93, 0xbc, 0x5a, 0xa8, 0xf6, 0x2c, 0x8c, 0x72, 0x87, 0xa9, 0xb1, 0xfc, 0x7f,\n-0x73, 0xfd, 0x63, 0x71, 0x78, 0xa5, 0x87, 0x59, 0xcf, 0x30, 0xe1, 0x0d, 0x10, 0xb2, 0x13, 0x5a,\n-0x6d, 0x82, 0xf5, 0x6a, 0xe6, 0x80, 0x9f, 0xa0, 0x05, 0x0b, 0x68, 0xe4, 0x47, 0x6b, 0xc7, 0x6a,\n-0xdf, 0xb6, 0xfd, 0x77, 0x32, 0x72, 0xe5, 0x18, 0xfa, 0x09, 0xf4, 0xa0, 0x93, 0x2c, 0x5d, 0xd2,\n-0x8c, 0x75, 0x85, 0x76, 0x65, 0x90, 0x0c, 0x03, 0x79, 0xb7, 0x31, 0x23, 0x63, 0xad, 0x78, 0x83,\n-0x09, 0x86, 0x68, 0x84, 0xca, 0xff, 0xf9, 0xcf, 0x26, 0x9a, 0x92, 0x79, 0xe7, 0xcd, 0x4b, 0xc5,\n-0xe7, 0x61, 0xa7, 0x17, 0xcb, 0xf3, 0xa9, 0x12, 0x93, 0x93, 0x6b, 0xa7, 0xe8, 0x2f, 0x53, 0x92,\n-0xc4, 0x60, 0x58, 0xb0, 0xcc, 0x02, 0x51, 0x18, 0x5b, 0x85, 0x8d, 0x62, 0x59, 0x63, 0xb6, 0xad,\n-0xb4, 0xde, 0x9a, 0xfb, 0x26, 0xf7, 0x00, 0x27, 0xc0, 0x5d, 0x55, 0x37, 0x74, 0x99, 0xc9, 0x50,\n-0x7f, 0xe3, 0x59, 0x2e, 0x44, 0xe3, 0x2c, 0x25, 0xee, 0xec, 0x4c, 0x32, 0x77, 0xb4, 0x9f, 0x1a,\n-0xe9, 0x4b, 0x5d, 0x20, 0xc5, 0xda, 0xfd, 0x1c, 0x87, 0x16, 0xc6, 0x43, 0xe8, 0xd4, 0xbb, 0x26,\n-0x9a, 0x45, 0x70, 0x5e, 0xa9, 0x0b, 0x37, 0x53, 0xe2, 0x46, 0x7b, 0x27, 0xfd, 0xe0, 0x46, 0xf2,\n-0x89, 0xb7, 0xcc, 0x42, 0xb6, 0xcb, 0x28, 0x26, 0x6e, 0xd9, 0xa5, 0xc9, 0x3a, 0xc8, 0x41, 0x13,\n-0x60, 0xf7, 0x50, 0x8c, 0x15, 0xae, 0xb2, 0x6d, 0x1a, 0x15, 0x1a, 0x57, 0x78, 0xe6, 0x92, 0x2a,\n-0xd9, 0x65, 0x90, 0x82, 0x3f, 0x6c, 0x02, 0xaf, 0xae, 0x12, 0x3a, 0x27, 0x96, 0x36, 0x04, 0xd7,\n-0x1d, 0xa2, 0x80, 0x63, 0xa9, 0x9b, 0xf1, 0xe5, 0xba, 0xb4, 0x7c, 0x14, 0xb0, 0x4e, 0xc9, 0xb1,\n-0x1f, 0x74, 0x5f, 0x38, 0xf6, 0x51, 0xea, 0x9b, 0xfa, 0x2c, 0xa2, 0x11, 0xd4, 0xa9, 0x2d, 0x27,\n-0x1a, 0x45, 0xb1, 0xaf, 0xb2, 0x4e, 0x71, 0x0d, 0xc0, 0x58, 0x46, 0xd6, 0x69, 0x06, 0xcb, 0x53,\n-0xcb, 0xb3, 0xfe, 0x6b, 0x41, 0xcd, 0x41, 0x7e, 0x7d, 0x4c, 0x0f, 0x7c, 0x72, 0x79, 0x7a, 0x59,\n-0xcd, 0x5e, 0x4a, 0x0e, 0xac, 0x9b, 0xa9, 0x98, 0x73, 0x79, 0x7c, 0xb4, 0xf4, 0xcc, 0xb9, 0xb8,\n-0x07, 0x0c, 0xb2, 0x74, 0x5c, 0xb8, 0xc7, 0x6f, 0x88, 0xa1, 0x90, 0xa7, 0xf4, 0xaa, 0xf9, 0xbf,\n-0x67, 0x3a, 0xf4, 0x1a, 0x15, 0x62, 0x1e, 0xb7, 0x9f, 0xbe, 0x3d, 0xb1, 0x29, 0xaf, 0x67, 0xa1,\n-0x12, 0xf2, 0x58, 0x10, 0x19, 0x53, 0x03, 0x30, 0x1b, 0xb8, 0x1a, 0x89, 0xf6, 0x9c, 0xbd, 0x97,\n-0x03, 0x8e, 0xa3, 0x09, 0xf3, 0x1d, 0x8b, 0x21, 0xf1, 0xb4, 0xdf, 0xe4, 0x1c, 0xd1, 0x9f, 0x65,\n-0x02, 0x06, 0xea, 0x5c, 0xd6, 0x13, 0xb3, 0x84, 0xef, 0xa2, 0xa5, 0x5c, 0x8c, 0x77, 0x29, 0xa7,\n-0x68, 0xc0, 0x6b, 0xae, 0x40, 0xd2, 0xa8, 0xb4, 0xea, 0xcd, 0xf0, 0x8d, 0x4b, 0x38, 0x9c, 0x19,\n-0x9a, 0x1b, 0x28, 0x54, 0xb8, 0x89, 0x90, 0xef, 0xca, 0x75, 0x81, 0x3e, 0x1e, 0xf2, 0x64, 0x24,\n-0xc7, 0x18, 0xaf, 0x4e, 0xff, 0x47, 0x9e, 0x07, 0xf6, 0x35, 0x65, 0xa4, 0xd3, 0x0a, 0x56, 0xff,\n-0xf5, 0x17, 0x64, 0x6c, 0xef, 0xa8, 0x22, 0x25, 0x49, 0x93, 0xb6, 0xdf, 0x00, 0x17, 0xda, 0x58,\n-0x7e, 0x5d, 0xee, 0xc5, 0x1b, 0xb0, 0xd1, 0xd1, 0x5f, 0x21, 0x10, 0xc7, 0xf9, 0xf3, 0xba, 0x02,\n-0x0a, 0x27, 0x07, 0xc5, 0xf1, 0xd6, 0xc7, 0xd3, 0xe0, 0xfb, 0x09, 0x60, 0x6c, 0x30, 0x82, 0x03,\n-0x41, 0x30, 0x82, 0x02, 0x29, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x13, 0x06, 0x6c, 0x9f, 0xcf,\n-0x99, 0xbf, 0x8c, 0x0a, 0x39, 0xe2, 0xf0, 0x78, 0x8a, 0x43, 0xe6, 0x96, 0x36, 0x5b, 0xca, 0x30,\n-0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x39,\n-0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30,\n-0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19,\n-0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20,\n-0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30,\n-0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31,\n-0x31, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06,\n-0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04,\n-0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n-0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a,\n-0x02, 0x82, 0x01, 0x01, 0x00, 0xb2, 0x78, 0x80, 0x71, 0xca, 0x78, 0xd5, 0xe3, 0x71, 0xaf, 0x47,\n-0x80, 0x50, 0x74, 0x7d, 0x6e, 0xd8, 0xd7, 0x88, 0x76, 0xf4, 0x99, 0x68, 0xf7, 0x58, 0x21, 0x60,\n-0xf9, 0x74, 0x84, 0x01, 0x2f, 0xac, 0x02, 0x2d, 0x86, 0xd3, 0xa0, 0x43, 0x7a, 0x4e, 0xb2, 0xa4,\n-0xd0, 0x36, 0xba, 0x01, 0xbe, 0x8d, 0xdb, 0x48, 0xc8, 0x07, 0x17, 0x36, 0x4c, 0xf4, 0xee, 0x88,\n-0x23, 0xc7, 0x3e, 0xeb, 0x37, 0xf5, 0xb5, 0x19, 0xf8, 0x49, 0x68, 0xb0, 0xde, 0xd7, 0xb9, 0x76,\n-0x38, 0x1d, 0x61, 0x9e, 0xa4, 0xfe, 0x82, 0x36, 0xa5, 0xe5, 0x4a, 0x56, 0xe4, 0x45, 0xe1, 0xf9,\n-0xfd, 0xb4, 0x16, 0xfa, 0x74, 0xda, 0x9c, 0x9b, 0x35, 0x39, 0x2f, 0xfa, 0xb0, 0x20, 0x50, 0x06,\n-0x6c, 0x7a, 0xd0, 0x80, 0xb2, 0xa6, 0xf9, 0xaf, 0xec, 0x47, 0x19, 0x8f, 0x50, 0x38, 0x07, 0xdc,\n-0xa2, 0x87, 0x39, 0x58, 0xf8, 0xba, 0xd5, 0xa9, 0xf9, 0x48, 0x67, 0x30, 0x96, 0xee, 0x94, 0x78,\n-0x5e, 0x6f, 0x89, 0xa3, 0x51, 0xc0, 0x30, 0x86, 0x66, 0xa1, 0x45, 0x66, 0xba, 0x54, 0xeb, 0xa3,\n-0xc3, 0x91, 0xf9, 0x48, 0xdc, 0xff, 0xd1, 0xe8, 0x30, 0x2d, 0x7d, 0x2d, 0x74, 0x70, 0x35, 0xd7,\n-0x88, 0x24, 0xf7, 0x9e, 0xc4, 0x59, 0x6e, 0xbb, 0x73, 0x87, 0x17, 0xf2, 0x32, 0x46, 0x28, 0xb8,\n-0x43, 0xfa, 0xb7, 0x1d, 0xaa, 0xca, 0xb4, 0xf2, 0x9f, 0x24, 0x0e, 0x2d, 0x4b, 0xf7, 0x71, 0x5c,\n-0x5e, 0x69, 0xff, 0xea, 0x95, 0x02, 0xcb, 0x38, 0x8a, 0xae, 0x50, 0x38, 0x6f, 0xdb, 0xfb, 0x2d,\n-0x62, 0x1b, 0xc5, 0xc7, 0x1e, 0x54, 0xe1, 0x77, 0xe0, 0x67, 0xc8, 0x0f, 0x9c, 0x87, 0x23, 0xd6,\n-0x3f, 0x40, 0x20, 0x7f, 0x20, 0x80, 0xc4, 0x80, 0x4c, 0x3e, 0x3b, 0x24, 0x26, 0x8e, 0x04, 0xae,\n-0x6c, 0x9a, 0xc8, 0xaa, 0x0d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f,\n-0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n-0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30,\n-0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x84, 0x18, 0xcc, 0x85, 0x34, 0xec,\n-0xbc, 0x0c, 0x94, 0x94, 0x2e, 0x08, 0x59, 0x9c, 0xc7, 0xb2, 0x10, 0x4e, 0x0a, 0x08, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01,\n-0x01, 0x00, 0x98, 0xf2, 0x37, 0x5a, 0x41, 0x90, 0xa1, 0x1a, 0xc5, 0x76, 0x51, 0x28, 0x20, 0x36,\n-0x23, 0x0e, 0xae, 0xe6, 0x28, 0xbb, 0xaa, 0xf8, 0x94, 0xae, 0x48, 0xa4, 0x30, 0x7f, 0x1b, 0xfc,\n-0x24, 0x8d, 0x4b, 0xb4, 0xc8, 0xa1, 0x97, 0xf6, 0xb6, 0xf1, 0x7a, 0x70, 0xc8, 0x53, 0x93, 0xcc,\n-0x08, 0x28, 0xe3, 0x98, 0x25, 0xcf, 0x23, 0xa4, 0xf9, 0xde, 0x21, 0xd3, 0x7c, 0x85, 0x09, 0xad,\n-0x4e, 0x9a, 0x75, 0x3a, 0xc2, 0x0b, 0x6a, 0x89, 0x78, 0x76, 0x44, 0x47, 0x18, 0x65, 0x6c, 0x8d,\n-0x41, 0x8e, 0x3b, 0x7f, 0x9a, 0xcb, 0xf4, 0xb5, 0xa7, 0x50, 0xd7, 0x05, 0x2c, 0x37, 0xe8, 0x03,\n-0x4b, 0xad, 0xe9, 0x61, 0xa0, 0x02, 0x6e, 0xf5, 0xf2, 0xf0, 0xc5, 0xb2, 0xed, 0x5b, 0xb7, 0xdc,\n-0xfa, 0x94, 0x5c, 0x77, 0x9e, 0x13, 0xa5, 0x7f, 0x52, 0xad, 0x95, 0xf2, 0xf8, 0x93, 0x3b, 0xde,\n-0x8b, 0x5c, 0x5b, 0xca, 0x5a, 0x52, 0x5b, 0x60, 0xaf, 0x14, 0xf7, 0x4b, 0xef, 0xa3, 0xfb, 0x9f,\n-0x40, 0x95, 0x6d, 0x31, 0x54, 0xfc, 0x42, 0xd3, 0xc7, 0x46, 0x1f, 0x23, 0xad, 0xd9, 0x0f, 0x48,\n-0x70, 0x9a, 0xd9, 0x75, 0x78, 0x71, 0xd1, 0x72, 0x43, 0x34, 0x75, 0x6e, 0x57, 0x59, 0xc2, 0x02,\n-0x5c, 0x26, 0x60, 0x29, 0xcf, 0x23, 0x19, 0x16, 0x8e, 0x88, 0x43, 0xa5, 0xd4, 0xe4, 0xcb, 0x08,\n-0xfb, 0x23, 0x11, 0x43, 0xe8, 0x43, 0x29, 0x72, 0x62, 0xa1, 0xa9, 0x5d, 0x5e, 0x08, 0xd4, 0x90,\n-0xae, 0xb8, 0xd8, 0xce, 0x14, 0xc2, 0xd0, 0x55, 0xf2, 0x86, 0xf6, 0xc4, 0x93, 0x43, 0x77, 0x66,\n-0x61, 0xc0, 0xb9, 0xe8, 0x41, 0xd7, 0x97, 0x78, 0x60, 0x03, 0x6e, 0x4a, 0x72, 0xae, 0xa5, 0xd1,\n-0x7d, 0xba, 0x10, 0x9e, 0x86, 0x6c, 0x1b, 0x8a, 0xb9, 0x59, 0x33, 0xf8, 0xeb, 0xc4, 0x90, 0xbe,\n-0xf1, 0xb9, 0x30, 0x82, 0x01, 0xf2, 0x30, 0x82, 0x01, 0x78, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n-0x13, 0x06, 0x6c, 0x9f, 0xd7, 0xc1, 0xbb, 0x10, 0x4c, 0x29, 0x43, 0xe5, 0x71, 0x7b, 0x7b, 0x2c,\n-0xc8, 0x1a, 0xc1, 0x0e, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03,\n-0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n-0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e,\n-0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f,\n-0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x34, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n-0x35, 0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30,\n-0x30, 0x35, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x39, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06,\n-0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f,\n-0x74, 0x20, 0x43, 0x41, 0x20, 0x34, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce,\n-0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xd2, 0xab,\n-0x8a, 0x37, 0x4f, 0xa3, 0x53, 0x0d, 0xfe, 0xc1, 0x8a, 0x7b, 0x4b, 0xa8, 0x7b, 0x46, 0x4b, 0x63,\n-0xb0, 0x62, 0xf6, 0x2d, 0x1b, 0xdb, 0x08, 0x71, 0x21, 0xd2, 0x00, 0xe8, 0x63, 0xbd, 0x9a, 0x27,\n-0xfb, 0xf0, 0x39, 0x6e, 0x5d, 0xea, 0x3d, 0xa5, 0xc9, 0x81, 0xaa, 0xa3, 0x5b, 0x20, 0x98, 0x45,\n-0x5d, 0x16, 0xdb, 0xfd, 0xe8, 0x10, 0x6d, 0xe3, 0x9c, 0xe0, 0xe3, 0xbd, 0x5f, 0x84, 0x62, 0xf3,\n-0x70, 0x64, 0x33, 0xa0, 0xcb, 0x24, 0x2f, 0x70, 0xba, 0x88, 0xa1, 0x2a, 0xa0, 0x75, 0xf8, 0x81,\n-0xae, 0x62, 0x06, 0xc4, 0x81, 0xdb, 0x39, 0x6e, 0x29, 0xb0, 0x1e, 0xfa, 0x2e, 0x5c, 0xa3, 0x42,\n-0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n-0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n-0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd3, 0xec,\n-0xc7, 0x3a, 0x65, 0x6e, 0xcc, 0xe1, 0xda, 0x76, 0x9a, 0x56, 0xfb, 0x9c, 0xf3, 0x86, 0x6d, 0x57,\n-0xe5, 0x81, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68,\n-0x00, 0x30, 0x65, 0x02, 0x30, 0x3a, 0x8b, 0x21, 0xf1, 0xbd, 0x7e, 0x11, 0xad, 0xd0, 0xef, 0x58,\n-0x96, 0x2f, 0xd6, 0xeb, 0x9d, 0x7e, 0x90, 0x8d, 0x2b, 0xcf, 0x66, 0x55, 0xc3, 0x2c, 0xe3, 0x28,\n-0xa9, 0x70, 0x0a, 0x47, 0x0e, 0xf0, 0x37, 0x59, 0x12, 0xff, 0x2d, 0x99, 0x94, 0x28, 0x4e, 0x2a,\n-0x4f, 0x35, 0x4d, 0x33, 0x5a, 0x02, 0x31, 0x00, 0xea, 0x75, 0x00, 0x4e, 0x3b, 0xc4, 0x3a, 0x94,\n-0x12, 0x91, 0xc9, 0x58, 0x46, 0x9d, 0x21, 0x13, 0x72, 0xa7, 0x88, 0x9c, 0x8a, 0xe4, 0x4c, 0x4a,\n-0xdb, 0x96, 0xd4, 0xac, 0x8b, 0x6b, 0x6b, 0x49, 0x12, 0x53, 0x33, 0xad, 0xd7, 0xe4, 0xbe, 0x24,\n-0xfc, 0xb5, 0x0a, 0x76, 0xd4, 0xa5, 0xbc, 0x10, 0x30, 0x82, 0x06, 0x0b, 0x30, 0x82, 0x03, 0xf3,\n-0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa6, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n-0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07,\n-0x13, 0x06, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04,\n-0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64,\n-0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63,\n-0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43,\n-0x65, 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x40,\n-0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x37, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69,\n-0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52,\n-0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74,\n-0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35,\n-0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x37, 0x30, 0x37, 0x31, 0x30, 0x31, 0x31, 0x32, 0x31,\n-0x5a, 0x17, 0x0d, 0x34, 0x30, 0x30, 0x36, 0x33, 0x30, 0x31, 0x30, 0x31, 0x31, 0x32, 0x31, 0x5a,\n-0x30, 0x81, 0xa6, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x52,\n-0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x41, 0x74, 0x68, 0x65, 0x6e,\n-0x73, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c,\n-0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e,\n-0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69,\n-0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75,\n-0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x13, 0x37, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65,\n-0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,\n-0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52, 0x6f,\n-0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f,\n-0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc2, 0xf8, 0xa9, 0x3f, 0x1b, 0x89,\n-0xfc, 0x3c, 0x3c, 0x04, 0x5d, 0x3d, 0x90, 0x36, 0xb0, 0x91, 0x3a, 0x79, 0x3c, 0x66, 0x5a, 0xef,\n-0x6d, 0x39, 0x01, 0x49, 0x1a, 0xb4, 0xb7, 0xcf, 0x7f, 0x4d, 0x23, 0x53, 0xb7, 0x90, 0x00, 0xe3,\n-0x13, 0x2a, 0x28, 0xa6, 0x31, 0xf1, 0x91, 0x00, 0xe3, 0x28, 0xec, 0xae, 0x21, 0x41, 0xce, 0x1f,\n-0xda, 0xfd, 0x7d, 0x12, 0x5b, 0x01, 0x83, 0x0f, 0xb9, 0xb0, 0x5f, 0x99, 0xe1, 0xf2, 0x12, 0x83,\n-0x80, 0x4d, 0x06, 0x3e, 0xdf, 0xac, 0xaf, 0xe7, 0xa1, 0x88, 0x6b, 0x31, 0xaf, 0xf0, 0x8b, 0xd0,\n-0x18, 0x33, 0xb8, 0xdb, 0x45, 0x6a, 0x34, 0xf4, 0x02, 0x80, 0x24, 0x28, 0x0a, 0x02, 0x15, 0x95,\n-0x5e, 0x76, 0x2a, 0x0d, 0x99, 0x3a, 0x14, 0x5b, 0xf6, 0xcb, 0xcb, 0x53, 0xbc, 0x13, 0x4d, 0x01,\n-0x88, 0x37, 0x94, 0x25, 0x1b, 0x42, 0xbc, 0x22, 0xd8, 0x8e, 0xa3, 0x96, 0x5e, 0x3a, 0xd9, 0x32,\n-0xdb, 0x3e, 0xe8, 0xf0, 0x10, 0x65, 0xed, 0x74, 0xe1, 0x2f, 0xa7, 0x7c, 0xaf, 0x27, 0x34, 0xbb,\n-0x29, 0x7d, 0x9b, 0xb6, 0xcf, 0x09, 0xc8, 0xe5, 0xd3, 0x0a, 0xfc, 0x88, 0x65, 0x65, 0x74, 0x0a,\n-0xdc, 0x73, 0x1c, 0x5c, 0xcd, 0x40, 0xb1, 0x1c, 0xd4, 0xb6, 0x84, 0x8c, 0x4c, 0x50, 0xcf, 0x68,\n-0x8e, 0xa8, 0x59, 0xae, 0xc2, 0x27, 0x4e, 0x82, 0xa2, 0x35, 0xdd, 0x14, 0xf4, 0x1f, 0xff, 0xb2,\n-0x77, 0xd5, 0x87, 0x2f, 0xaa, 0x6e, 0x7d, 0x24, 0x27, 0xe7, 0xc6, 0xcb, 0x26, 0xe6, 0xe5, 0xfe,\n-0x67, 0x07, 0x63, 0xd8, 0x45, 0x0d, 0xdd, 0x3a, 0x59, 0x65, 0x39, 0x58, 0x7a, 0x92, 0x99, 0x72,\n-0x3d, 0x9c, 0x84, 0x5e, 0x88, 0x21, 0xb8, 0xd5, 0xf4, 0x2c, 0xfc, 0xd9, 0x70, 0x52, 0x4f, 0x78,\n-0xb8, 0xbd, 0x3c, 0x2b, 0x8b, 0x95, 0x98, 0xf5, 0xb3, 0xd1, 0x68, 0xcf, 0x20, 0x14, 0x7e, 0x4c,\n-0x5c, 0x5f, 0xe7, 0x8b, 0xe5, 0xf5, 0x35, 0x81, 0x19, 0x37, 0xd7, 0x11, 0x08, 0xb7, 0x66, 0xbe,\n-0xd3, 0x4a, 0xce, 0x83, 0x57, 0x00, 0x3a, 0xc3, 0x81, 0xf8, 0x17, 0xcb, 0x92, 0x36, 0x5d, 0xd1,\n-0xa3, 0xd8, 0x75, 0x1b, 0xe1, 0x8b, 0x27, 0xea, 0x7a, 0x48, 0x41, 0xfd, 0x45, 0x19, 0x06, 0xad,\n-0x27, 0x99, 0x4e, 0xc1, 0x70, 0x47, 0xdd, 0xb5, 0x9f, 0x81, 0x53, 0x12, 0xe5, 0xb1, 0x8c, 0x48,\n-0x5d, 0x31, 0x43, 0x17, 0xe3, 0x8c, 0xc6, 0x7a, 0x63, 0x96, 0x4b, 0x29, 0x30, 0x4e, 0x84, 0x4e,\n-0x62, 0x19, 0x5e, 0x3c, 0xce, 0x97, 0x90, 0xa5, 0x7f, 0x01, 0xeb, 0x9d, 0xe0, 0xf8, 0x8b, 0x89,\n-0xdd, 0x25, 0x98, 0x3d, 0x92, 0xb6, 0x7e, 0xef, 0xd9, 0xf1, 0x51, 0x51, 0x7d, 0x2d, 0x26, 0xc8,\n-0x69, 0x59, 0x61, 0xe0, 0xac, 0x6a, 0xb8, 0x2a, 0x36, 0x11, 0x04, 0x7a, 0x50, 0xbd, 0x32, 0x84,\n-0xbe, 0x2f, 0xdc, 0x72, 0xd5, 0xd7, 0x1d, 0x16, 0x47, 0xe4, 0x47, 0x66, 0x20, 0x3f, 0xf4, 0x96,\n-0xc5, 0xaf, 0x8e, 0x01, 0x7a, 0xa5, 0x0f, 0x7a, 0x64, 0xf5, 0x0d, 0x18, 0x87, 0xd9, 0xae, 0x88,\n-0xd5, 0xfa, 0x84, 0xc1, 0x3a, 0xc0, 0x69, 0x28, 0x2d, 0xf2, 0x0d, 0x68, 0x51, 0xaa, 0xe3, 0xa5,\n-0x77, 0xc6, 0xa4, 0x90, 0x0e, 0xa1, 0x37, 0x8b, 0x31, 0x23, 0x47, 0xc1, 0x09, 0x08, 0xeb, 0x6e,\n-0xf7, 0x78, 0x9b, 0xd7, 0x82, 0xfc, 0x84, 0x20, 0x99, 0x49, 0x19, 0xb6, 0x12, 0x46, 0xb1, 0xfb,\n-0x45, 0x55, 0x16, 0xa9, 0xa3, 0x65, 0xac, 0x9c, 0x07, 0x0f, 0xea, 0x6b, 0xdc, 0x1f, 0x2e, 0x06,\n-0x72, 0xec, 0x86, 0x88, 0x12, 0xe4, 0x2d, 0xdb, 0x5f, 0x05, 0x2f, 0xe4, 0xf0, 0x03, 0xd3, 0x26,\n-0x33, 0xe7, 0x80, 0xc2, 0xcd, 0x42, 0xa1, 0x17, 0x34, 0x0b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n-0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n-0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n-0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x71,\n-0x15, 0x67, 0xc8, 0xc8, 0xc9, 0xbd, 0x75, 0x5d, 0x72, 0xd0, 0x38, 0x18, 0x6a, 0x9d, 0xf3, 0x71,\n-0x24, 0x54, 0x0b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n-0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x75, 0xbb, 0x6d, 0x54, 0x4b, 0xaa, 0x10, 0x58, 0x46,\n-0x34, 0xf2, 0x62, 0xd7, 0x16, 0x36, 0x5d, 0x08, 0x5e, 0xd5, 0x6c, 0xc8, 0x87, 0xbd, 0xb4, 0x2e,\n-0x46, 0xf2, 0x31, 0xf8, 0x7c, 0xea, 0x42, 0xb5, 0x93, 0x16, 0x55, 0xdc, 0xa1, 0x0c, 0x12, 0xa0,\n-0xda, 0x61, 0x7e, 0x0f, 0x58, 0x58, 0x73, 0x64, 0x72, 0xc7, 0xe8, 0x45, 0x8e, 0xdc, 0xa9, 0xf2,\n-0x26, 0x3f, 0xc6, 0x79, 0x8c, 0xb1, 0x53, 0x08, 0x33, 0x81, 0xb0, 0x56, 0x13, 0xbe, 0xe6, 0x51,\n-0x5c, 0xd8, 0x9b, 0x0a, 0x4f, 0x4b, 0x9c, 0x56, 0x53, 0x02, 0xe9, 0x4f, 0xf6, 0x0d, 0x60, 0xea,\n-0x4d, 0x42, 0x55, 0xe8, 0x7c, 0x1b, 0x21, 0x21, 0xd3, 0x1b, 0x3a, 0xcc, 0x77, 0xf2, 0xb8, 0x90,\n-0xf1, 0x68, 0xc7, 0xf9, 0x5a, 0xfe, 0xfa, 0x2d, 0xf4, 0xbf, 0xc9, 0xf5, 0x45, 0x1b, 0xce, 0x38,\n-0x10, 0x2a, 0x37, 0x8a, 0x79, 0xa3, 0xb4, 0xe3, 0x09, 0x6c, 0x85, 0x86, 0x93, 0xff, 0x89, 0x96,\n-0x27, 0x78, 0x81, 0x8f, 0x67, 0xe3, 0x46, 0x74, 0x54, 0x8e, 0xd9, 0x0d, 0x69, 0xe2, 0x4a, 0xf4,\n-0x4d, 0x74, 0x03, 0xff, 0xb2, 0x77, 0xed, 0x95, 0x67, 0x97, 0xe4, 0xb1, 0xc5, 0xab, 0xbf, 0x6a,\n-0x23, 0xe8, 0xd4, 0x94, 0xe2, 0x44, 0x28, 0x62, 0xc4, 0x4b, 0xe2, 0xf0, 0xd8, 0xe2, 0x29, 0x6b,\n-0x1a, 0x70, 0x7e, 0x24, 0x61, 0x93, 0x7b, 0x4f, 0x03, 0x32, 0x25, 0x0d, 0x45, 0x24, 0x2b, 0x96,\n-0xb4, 0x46, 0x6a, 0xbf, 0x4a, 0x0b, 0xf7, 0x9a, 0x8f, 0xc1, 0xac, 0x1a, 0xc5, 0x67, 0xf3, 0x6f,\n-0x34, 0xd2, 0xfa, 0x73, 0x63, 0x8c, 0xef, 0x16, 0xb0, 0xa8, 0xa4, 0x46, 0x2a, 0xf8, 0xeb, 0x12,\n-0xec, 0x72, 0xb4, 0xef, 0xf8, 0x2b, 0x7e, 0x8c, 0x52, 0xc0, 0x8b, 0x84, 0x54, 0xf9, 0x2f, 0x3e,\n-0xe3, 0x55, 0xa8, 0xdc, 0x66, 0xb1, 0xd9, 0xe1, 0x5f, 0xd8, 0xb3, 0x8c, 0x59, 0x34, 0x59, 0xa4,\n-0xab, 0x4f, 0x6c, 0xbb, 0x1f, 0x18, 0xdb, 0x75, 0xab, 0xd8, 0xcb, 0x92, 0xcd, 0x94, 0x38, 0x61,\n-0x0e, 0x07, 0x06, 0x1f, 0x4b, 0x46, 0x10, 0xf1, 0x15, 0xbe, 0x8d, 0x85, 0x5c, 0x3b, 0x4a, 0x2b,\n-0x81, 0x79, 0x0f, 0xb4, 0x69, 0x9f, 0x49, 0x50, 0x97, 0x4d, 0xf7, 0x0e, 0x56, 0x5d, 0xc0, 0x95,\n-0x6a, 0xc2, 0x36, 0xc3, 0x1b, 0x68, 0xc9, 0xf5, 0x2a, 0xdc, 0x47, 0x9a, 0xbe, 0xb2, 0xce, 0xc5,\n-0x25, 0xe8, 0xfa, 0x03, 0xb9, 0xda, 0xf9, 0x16, 0x6e, 0x91, 0x84, 0xf5, 0x1c, 0x28, 0xc8, 0xfc,\n-0x26, 0xcc, 0xd7, 0x1c, 0x90, 0x56, 0xa7, 0x5f, 0x6f, 0x3a, 0x04, 0xbc, 0xcd, 0x78, 0x89, 0x0b,\n-0x8e, 0x0f, 0x2f, 0xa3, 0xaa, 0x4f, 0xa2, 0x1b, 0x12, 0x3d, 0x16, 0x08, 0x40, 0x0f, 0xf1, 0x46,\n-0x4c, 0xd7, 0xaa, 0x7b, 0x08, 0xc1, 0x0a, 0xf5, 0x6d, 0x27, 0xde, 0x02, 0x8f, 0xca, 0xc3, 0xb5,\n-0x2b, 0xca, 0xe9, 0xeb, 0xc8, 0x21, 0x53, 0x38, 0xa5, 0xcc, 0x3b, 0xd8, 0x77, 0x37, 0x30, 0xa2,\n-0x4f, 0xd9, 0x6f, 0xd1, 0xf2, 0x40, 0xad, 0x41, 0x7a, 0x17, 0xc5, 0xd6, 0x4a, 0x35, 0x89, 0xb7,\n-0x41, 0xd5, 0x7c, 0x86, 0x7f, 0x55, 0x4d, 0x83, 0x4a, 0xa5, 0x73, 0x20, 0xc0, 0x3a, 0xaf, 0x90,\n-0xf1, 0x9a, 0x24, 0x8e, 0xd9, 0x8e, 0x71, 0xca, 0x7b, 0xb8, 0x86, 0xda, 0xb2, 0x8f, 0x99, 0x3e,\n-0x1d, 0x13, 0x0d, 0x12, 0x11, 0xee, 0xd4, 0xab, 0xf0, 0xe9, 0x15, 0x76, 0x02, 0xe4, 0xe0, 0xdf,\n-0xaa, 0x20, 0x1e, 0x5b, 0x61, 0x85, 0x64, 0x40, 0xa9, 0x90, 0x97, 0x0d, 0xad, 0x53, 0xd2, 0x5a,\n-0x1d, 0x87, 0x6a, 0x00, 0x97, 0x65, 0x62, 0xb4, 0xbe, 0x6f, 0x6a, 0xa7, 0xf5, 0x2c, 0x42, 0xed,\n-0x32, 0xad, 0xb6, 0x21, 0x9e, 0xbe, 0xbc, 0x30, 0x82, 0x02, 0xc3, 0x30, 0x82, 0x02, 0x4a, 0xa0,\n-0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n-0x04, 0x03, 0x02, 0x30, 0x81, 0xaa, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x47, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x41, 0x74,\n-0x68, 0x65, 0x6e, 0x73, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48,\n-0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63,\n-0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e,\n-0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e,\n-0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03,\n-0x55, 0x04, 0x03, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63,\n-0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61,\n-0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n-0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35,\n-0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x37, 0x30, 0x37, 0x31, 0x30, 0x33, 0x37, 0x31, 0x32,\n-0x5a, 0x17, 0x0d, 0x34, 0x30, 0x30, 0x36, 0x33, 0x30, 0x31, 0x30, 0x33, 0x37, 0x31, 0x32, 0x5a,\n-0x30, 0x81, 0xaa, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x52,\n-0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x41, 0x74, 0x68, 0x65, 0x6e,\n-0x73, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c,\n-0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e,\n-0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69,\n-0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75,\n-0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65,\n-0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,\n-0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x45, 0x43,\n-0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35, 0x30, 0x76, 0x30,\n-0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00,\n-0x22, 0x03, 0x62, 0x00, 0x04, 0x92, 0xa0, 0x41, 0xe8, 0x4b, 0x82, 0x84, 0x5c, 0xe2, 0xf8, 0x31,\n-0x11, 0x99, 0x86, 0x64, 0x4e, 0x09, 0x25, 0x2f, 0x9d, 0x41, 0x2f, 0x0a, 0xae, 0x35, 0x4f, 0x74,\n-0x95, 0xb2, 0x51, 0x64, 0x6b, 0x8d, 0x6b, 0xe6, 0x3f, 0x70, 0x95, 0xf0, 0x05, 0x44, 0x47, 0xa6,\n-0x72, 0x38, 0x50, 0x76, 0x95, 0x02, 0x5a, 0x8e, 0xae, 0x28, 0x9e, 0xf9, 0x2d, 0x4e, 0x99, 0xef,\n-0x2c, 0x48, 0x6f, 0x4c, 0x25, 0x29, 0xe8, 0xd1, 0x71, 0x5b, 0xdf, 0x1d, 0xc1, 0x75, 0x37, 0xb4,\n-0xd7, 0xfa, 0x7b, 0x7a, 0x42, 0x9c, 0x6a, 0x0a, 0x56, 0x5a, 0x7c, 0x69, 0x0b, 0xaa, 0x80, 0x09,\n-0x24, 0x6c, 0x7e, 0xc1, 0x46, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,\n-0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n-0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,\n-0x0e, 0x04, 0x16, 0x04, 0x14, 0xb4, 0x22, 0x0b, 0x82, 0x99, 0x24, 0x01, 0x0e, 0x9c, 0xbb, 0xe4,\n-0x0e, 0xfd, 0xbf, 0xfb, 0x97, 0x20, 0x93, 0x99, 0x2a, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n-0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x67, 0xce, 0x16, 0x62,\n-0x38, 0xa2, 0xac, 0x62, 0x45, 0xa7, 0xa9, 0x95, 0x24, 0xc0, 0x1a, 0x27, 0x9c, 0x32, 0x3b, 0xc0,\n-0xc0, 0xd5, 0xba, 0xa9, 0xe7, 0xf8, 0x04, 0x43, 0x53, 0x85, 0xee, 0x52, 0x21, 0xde, 0x9d, 0xf5,\n-0x25, 0x83, 0x3e, 0x9e, 0x58, 0x4b, 0x2f, 0xd7, 0x67, 0x13, 0x0e, 0x21, 0x02, 0x30, 0x05, 0xe1,\n-0x75, 0x01, 0xde, 0x68, 0xed, 0x2a, 0x1f, 0x4d, 0x4c, 0x09, 0x08, 0x0d, 0xec, 0x4b, 0xad, 0x64,\n-0x17, 0x28, 0xe7, 0x75, 0xce, 0x45, 0x65, 0x72, 0x21, 0x17, 0xcb, 0x22, 0x41, 0x0e, 0x8c, 0x13,\n-0x98, 0x38, 0x9a, 0x54, 0x6d, 0x9b, 0xca, 0xe2, 0x7c, 0xea, 0x02, 0x58, 0x22, 0x91, 0x30, 0x82,\n-0x06, 0x5b, 0x30, 0x82, 0x04, 0x43, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0xca, 0xe9,\n-0x1b, 0x89, 0xf1, 0x55, 0x03, 0x0d, 0xa3, 0xe6, 0x41, 0x6d, 0xc4, 0xe3, 0xa6, 0xe1, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5a, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x12, 0x30, 0x10,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73,\n-0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x13, 0x30, 0x30, 0x30, 0x32, 0x20,\n-0x34, 0x38, 0x31, 0x34, 0x36, 0x33, 0x30, 0x38, 0x31, 0x30, 0x30, 0x30, 0x33, 0x36, 0x31, 0x19,\n-0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x10, 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e,\n-0x61, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x31,\n-0x30, 0x30, 0x31, 0x30, 0x38, 0x33, 0x32, 0x32, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x33, 0x31, 0x30,\n-0x30, 0x31, 0x30, 0x38, 0x33, 0x32, 0x32, 0x37, 0x5a, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06,\n-0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,\n-0x0a, 0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73, 0x31, 0x1c, 0x30, 0x1a,\n-0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x13, 0x30, 0x30, 0x30, 0x32, 0x20, 0x34, 0x38, 0x31, 0x34,\n-0x36, 0x33, 0x30, 0x38, 0x31, 0x30, 0x30, 0x30, 0x33, 0x36, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03,\n-0x55, 0x04, 0x03, 0x0c, 0x10, 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x20, 0x52, 0x6f,\n-0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n-0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02,\n-0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xcd, 0x18, 0x39, 0x65, 0x1a, 0x59, 0xb1, 0xea, 0x64, 0x16,\n-0x0e, 0x8c, 0x94, 0x24, 0x95, 0x7c, 0x83, 0xd3, 0xc5, 0x39, 0x26, 0xdc, 0x0c, 0xef, 0x16, 0x57,\n-0x8d, 0xd7, 0xd8, 0xac, 0xa3, 0x42, 0x7f, 0x82, 0xca, 0xed, 0xcd, 0x5b, 0xdb, 0x0e, 0xb7, 0x2d,\n-0xed, 0x45, 0x08, 0x17, 0xb2, 0xd9, 0xb3, 0xcb, 0xd6, 0x17, 0x52, 0x72, 0x28, 0xdb, 0x8e, 0x4e,\n-0x9e, 0x8a, 0xb6, 0x0b, 0xf9, 0x9e, 0x84, 0x9a, 0x4d, 0x76, 0xde, 0x22, 0x29, 0x5c, 0xd2, 0xb3,\n-0xd2, 0x06, 0x3e, 0x30, 0x39, 0xa9, 0x74, 0xa3, 0x92, 0x56, 0x1c, 0xa1, 0x6f, 0x4c, 0x0a, 0x20,\n-0x6d, 0x9f, 0x23, 0x7a, 0xb4, 0xc6, 0xda, 0x2c, 0xe4, 0x1d, 0x2c, 0xdc, 0xb3, 0x28, 0xd0, 0x13,\n-0xf2, 0x4c, 0x4e, 0x02, 0x49, 0xa1, 0x54, 0x40, 0x9e, 0xe6, 0xe5, 0x05, 0xa0, 0x2d, 0x84, 0xc8,\n-0xff, 0x98, 0x6c, 0xd0, 0xeb, 0x8a, 0x1a, 0x84, 0x08, 0x1e, 0xb7, 0x68, 0x23, 0xee, 0x23, 0xd5,\n-0x70, 0xce, 0x6d, 0x51, 0x69, 0x10, 0xee, 0xa1, 0x7a, 0xc2, 0xd1, 0x22, 0x31, 0xc2, 0x82, 0x85,\n-0xd2, 0xf2, 0x55, 0x76, 0x50, 0x7c, 0x25, 0x7a, 0xc9, 0x84, 0x5c, 0x0b, 0xac, 0xdd, 0x42, 0x4e,\n-0x2b, 0xe7, 0x82, 0xa2, 0x24, 0x89, 0xcb, 0x90, 0xb2, 0xd0, 0xee, 0x23, 0xba, 0x66, 0x4c, 0xbb,\n-0x62, 0xa4, 0xf9, 0x53, 0x5a, 0x64, 0x7b, 0x7c, 0x98, 0xfa, 0xa3, 0x48, 0x9e, 0x0f, 0x95, 0xae,\n-0xa7, 0x18, 0xf4, 0x6a, 0xec, 0x2e, 0x03, 0x45, 0xaf, 0xf0, 0x74, 0xf8, 0x2a, 0xcd, 0x7a, 0x5d,\n-0xd1, 0xbe, 0x44, 0x26, 0x32, 0x29, 0xf1, 0xf1, 0xf5, 0x6c, 0xcc, 0x7e, 0x02, 0x21, 0x0b, 0x9f,\n-0x6f, 0xa4, 0x3f, 0xbe, 0x9d, 0x53, 0xe2, 0xcf, 0x7d, 0xa9, 0x2c, 0x7c, 0x58, 0x1a, 0x97, 0xe1,\n-0x3d, 0x37, 0x37, 0x18, 0x66, 0x28, 0xd2, 0x40, 0xc5, 0x51, 0x8a, 0x8c, 0xc3, 0x2d, 0xce, 0x53,\n-0x88, 0x24, 0x58, 0x64, 0x30, 0x16, 0xc5, 0xaa, 0xe0, 0xd6, 0x0a, 0xa6, 0x40, 0xdf, 0x78, 0xf6,\n-0xf5, 0x04, 0x7c, 0x69, 0x13, 0x84, 0xbc, 0xd1, 0xd1, 0xa7, 0x06, 0xcf, 0x01, 0xf7, 0x68, 0xc0,\n-0xa8, 0x57, 0xbb, 0x3a, 0x61, 0xad, 0x04, 0x8c, 0x93, 0xe3, 0xad, 0xfc, 0xf0, 0xdb, 0x44, 0x6d,\n-0x59, 0xdc, 0x49, 0x59, 0xae, 0xac, 0x9a, 0x99, 0x36, 0x30, 0x41, 0x7b, 0x76, 0x33, 0x22, 0x87,\n-0xa3, 0xc2, 0x92, 0x86, 0x6e, 0xf9, 0x70, 0xee, 0xae, 0x87, 0x87, 0x95, 0x1b, 0xc4, 0x7a, 0xbd,\n-0x31, 0xf3, 0xd4, 0xd2, 0xe5, 0x99, 0xff, 0xbe, 0x48, 0xec, 0x75, 0xf5, 0x78, 0x16, 0x1d, 0xa6,\n-0x70, 0xc1, 0x7f, 0x3c, 0x1b, 0xa1, 0x92, 0xfb, 0xcf, 0xc8, 0x3c, 0xd6, 0xc5, 0x93, 0x0a, 0x8f,\n-0xf5, 0x55, 0x3a, 0x76, 0x95, 0xce, 0x59, 0x98, 0x8a, 0x09, 0x95, 0x77, 0x32, 0x9a, 0x83, 0xba,\n-0x2c, 0x04, 0x3a, 0x97, 0xbd, 0xd4, 0x2f, 0xbe, 0xd7, 0x6c, 0x9b, 0xa2, 0xca, 0x7d, 0x6d, 0x26,\n-0xc9, 0x55, 0xd5, 0xcf, 0xc3, 0x79, 0x52, 0x08, 0x09, 0x99, 0x07, 0x24, 0x2d, 0x64, 0x25, 0x6b,\n-0xa6, 0x21, 0x69, 0x9b, 0x6a, 0xdd, 0x74, 0x4d, 0x6b, 0x97, 0x7a, 0x41, 0xbd, 0xab, 0x17, 0xf9,\n-0x90, 0x17, 0x48, 0x8f, 0x36, 0xf9, 0x2d, 0xd5, 0xc5, 0xdb, 0xee, 0xaa, 0x85, 0x45, 0x41, 0xfa,\n-0xcd, 0x3a, 0x45, 0xb1, 0x68, 0xe6, 0x36, 0x4c, 0x9b, 0x90, 0x57, 0xec, 0x23, 0xb9, 0x87, 0x08,\n-0xc2, 0xc4, 0x09, 0xf1, 0x97, 0x86, 0x2a, 0x28, 0x4d, 0xe2, 0x74, 0xc0, 0xda, 0xc4, 0x8c, 0xdb,\n-0xdf, 0xe2, 0xa1, 0x17, 0x59, 0xce, 0x24, 0x59, 0x74, 0x31, 0xda, 0x7f, 0xfd, 0x30, 0x6d, 0xd9,\n-0xdc, 0xe1, 0x6a, 0xe1, 0xfc, 0x5f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x1a, 0x30,\n-0x82, 0x01, 0x16, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n-0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n-0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x18,\n-0x87, 0x56, 0xe0, 0x6e, 0x77, 0xee, 0x24, 0x35, 0x3c, 0x4e, 0x73, 0x9a, 0x1f, 0xd6, 0xe1, 0xe2,\n-0x79, 0x7e, 0x2b, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,\n-0x18, 0x87, 0x56, 0xe0, 0x6e, 0x77, 0xee, 0x24, 0x35, 0x3c, 0x4e, 0x73, 0x9a, 0x1f, 0xd6, 0xe1,\n-0xe2, 0x79, 0x7e, 0x2b, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3d, 0x30, 0x3b, 0x30,\n-0x39, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x31, 0x30, 0x2f, 0x06, 0x08, 0x2b, 0x06, 0x01,\n-0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77,\n-0x77, 0x77, 0x77, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x2e, 0x66, 0x72, 0x2f,\n-0x61, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x30, 0x6d, 0x06, 0x03, 0x55, 0x1d,\n-0x1f, 0x04, 0x66, 0x30, 0x64, 0x30, 0x2f, 0xa0, 0x2d, 0xa0, 0x2b, 0x86, 0x29, 0x68, 0x74, 0x74,\n-0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61,\n-0x2e, 0x66, 0x72, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x72, 0x6f, 0x6f, 0x74,\n-0x63, 0x61, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x31, 0xa0, 0x2f, 0xa0, 0x2d, 0x86, 0x2b, 0x68, 0x74,\n-0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x64, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74,\n-0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x72,\n-0x6f, 0x6f, 0x74, 0x63, 0x61, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n-0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x94, 0xb8, 0x9e,\n-0x4f, 0xf0, 0xe3, 0x95, 0x08, 0x22, 0xe7, 0xcd, 0x68, 0x41, 0xf7, 0x1c, 0x55, 0xd5, 0x7c, 0x00,\n-0xe2, 0x2d, 0x3a, 0x89, 0x5d, 0x68, 0x38, 0x2f, 0x51, 0x22, 0x0b, 0x4a, 0x8d, 0xcb, 0xe9, 0xbb,\n-0x5d, 0x3e, 0xbb, 0x5c, 0x3d, 0xb1, 0x28, 0xfe, 0xe4, 0x53, 0x55, 0x13, 0xcf, 0xa1, 0x90, 0x1b,\n-0x02, 0x1d, 0x5f, 0x66, 0x46, 0x09, 0x33, 0x28, 0xe1, 0x0d, 0x24, 0x97, 0x70, 0xd3, 0x10, 0x1f,\n-0xea, 0x64, 0x57, 0x96, 0xbb, 0x5d, 0xda, 0xe7, 0xc4, 0x8c, 0x4f, 0x4c, 0x64, 0x46, 0x1d, 0x5c,\n-0x87, 0xe3, 0x59, 0xde, 0x42, 0xd1, 0x9b, 0xa8, 0x7e, 0xa6, 0x89, 0xdd, 0x8f, 0x1c, 0xc9, 0x30,\n-0x82, 0xed, 0x3b, 0x9c, 0xcd, 0xc0, 0xe9, 0x19, 0xe0, 0x6a, 0xd8, 0x02, 0x75, 0x37, 0xab, 0xf7,\n-0x34, 0x28, 0x28, 0x91, 0xf2, 0x04, 0x0a, 0x4f, 0x35, 0xe3, 0x60, 0x26, 0x01, 0xfa, 0xd0, 0x11,\n-0x8c, 0xf9, 0x11, 0x6a, 0xee, 0xaf, 0x3d, 0xc3, 0x50, 0xd3, 0x8f, 0x5f, 0x33, 0x79, 0x3c, 0x86,\n-0xa8, 0x73, 0x45, 0x90, 0x8c, 0x20, 0xb6, 0x72, 0x73, 0x17, 0x23, 0xbe, 0x07, 0x65, 0xe5, 0x78,\n-0x92, 0x0d, 0xba, 0x01, 0xc0, 0xeb, 0x8c, 0x1c, 0x66, 0xbf, 0xac, 0x86, 0x77, 0x01, 0x94, 0x0d,\n-0x9c, 0xe6, 0xe9, 0x39, 0x8d, 0x1f, 0xa6, 0x51, 0x8c, 0x99, 0x0c, 0x39, 0x77, 0xe1, 0xb4, 0x9b,\n-0xfa, 0x1c, 0x67, 0x57, 0x6f, 0x6a, 0x6a, 0x8e, 0xa9, 0x2b, 0x4c, 0x57, 0x79, 0x7a, 0x57, 0x22,\n-0xcf, 0xcd, 0x5f, 0x63, 0x46, 0x8d, 0x5c, 0x59, 0x3a, 0x86, 0xf8, 0x32, 0x47, 0x62, 0xa3, 0x67,\n-0x0d, 0x18, 0x91, 0xdc, 0xfb, 0xa6, 0x6b, 0xf5, 0x48, 0x61, 0x73, 0x23, 0x59, 0x8e, 0x02, 0xa7,\n-0xbc, 0x44, 0xea, 0xf4, 0x49, 0x9d, 0xf1, 0x54, 0x58, 0xf9, 0x60, 0xaf, 0xda, 0x18, 0xa4, 0x2f,\n-0x28, 0x45, 0xdc, 0x7a, 0xa0, 0x88, 0x86, 0x5d, 0xf3, 0x3b, 0xe7, 0xff, 0x29, 0x35, 0x80, 0xfc,\n-0x64, 0x43, 0x94, 0xe6, 0xe3, 0x1c, 0x6f, 0xbe, 0xad, 0x0e, 0x2a, 0x63, 0x99, 0x2b, 0xc9, 0x7e,\n-0x85, 0xf6, 0x71, 0xe8, 0x06, 0x03, 0x95, 0xfe, 0xde, 0x8f, 0x48, 0x1c, 0x5a, 0xd4, 0x92, 0xe8,\n-0x2b, 0xee, 0xe7, 0x31, 0xdb, 0xba, 0x04, 0x6a, 0x87, 0x98, 0xe7, 0xc5, 0x5f, 0xef, 0x7d, 0xa7,\n-0x22, 0xf7, 0x01, 0xd8, 0x4d, 0xf9, 0x89, 0xd0, 0x0e, 0x9a, 0x05, 0x59, 0xa4, 0x9e, 0x98, 0xd9,\n-0x6f, 0x2b, 0xca, 0x70, 0xbe, 0x64, 0xc2, 0x55, 0xa3, 0xf4, 0xe9, 0xaf, 0xc3, 0x92, 0x29, 0xdc,\n-0x88, 0x16, 0x24, 0x99, 0x3c, 0x8d, 0x26, 0x98, 0xb6, 0x5b, 0xb7, 0xcc, 0xce, 0xb7, 0x37, 0x07,\n-0xfd, 0x26, 0xd9, 0x98, 0x85, 0x24, 0xff, 0x59, 0x23, 0x03, 0x9a, 0xed, 0x9d, 0x9d, 0xa8, 0xe4,\n-0x5e, 0x38, 0xce, 0xd7, 0x52, 0x0d, 0x6f, 0xd2, 0x3f, 0x6d, 0xb1, 0x05, 0x6b, 0x49, 0xce, 0x8a,\n-0x91, 0x46, 0x73, 0xf4, 0xf6, 0x2f, 0xf0, 0xa8, 0x73, 0x77, 0x0e, 0x65, 0xac, 0xa1, 0x8d, 0x66,\n-0x52, 0x69, 0x7e, 0x4b, 0x68, 0x0c, 0xc7, 0x1e, 0x37, 0x27, 0x83, 0xa5, 0x8c, 0xc7, 0x02, 0xe4,\n-0x14, 0xcd, 0x49, 0x01, 0xb0, 0x73, 0xb3, 0xfd, 0xc6, 0x90, 0x3a, 0x6f, 0xd2, 0x6c, 0xed, 0x3b,\n-0xee, 0xec, 0x91, 0xbe, 0xa2, 0x43, 0x5d, 0x8b, 0x00, 0x4a, 0x66, 0x25, 0x44, 0x70, 0xde, 0x40,\n-0x0f, 0xf8, 0x7c, 0x15, 0xf7, 0xa2, 0xce, 0x3c, 0xd7, 0x5e, 0x13, 0x8c, 0x81, 0x17, 0x18, 0x17,\n-0xd1, 0xbd, 0xf1, 0x77, 0x10, 0x3a, 0xd4, 0x65, 0x39, 0xc1, 0x27, 0xac, 0x57, 0x2c, 0x25, 0x54,\n-0xff, 0xa2, 0xda, 0x4f, 0x8a, 0x61, 0x39, 0x5e, 0xae, 0x3d, 0x4a, 0x8c, 0xbd, 0x30, 0x82, 0x04,\n-0x20, 0x30, 0x82, 0x03, 0x08, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0x84, 0x82, 0x2c,\n-0x5f, 0x1c, 0x62, 0xd0, 0x40, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x9c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n-0x13, 0x02, 0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50,\n-0x61, 0x6e, 0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b,\n-0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53,\n-0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c,\n-0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73,\n-0x74, 0x43, 0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n-0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03,\n-0x55, 0x04, 0x03, 0x0c, 0x0e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x45, 0x43,\n-0x41, 0x2d, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x30, 0x34, 0x31, 0x32, 0x33,\n-0x32, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x37, 0x32, 0x38,\n-0x30, 0x37, 0x5a, 0x30, 0x81, 0x9c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50, 0x61,\n-0x6e, 0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x50,\n-0x61, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53, 0x79,\n-0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c, 0x2e,\n-0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73, 0x74,\n-0x43, 0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20,\n-0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x0c, 0x0e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x45, 0x43, 0x41,\n-0x2d, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,\n-0x01, 0x01, 0x00, 0xcf, 0x8f, 0xe0, 0x11, 0xb5, 0x9f, 0xa8, 0x76, 0x76, 0xdb, 0xdf, 0x0f, 0x54,\n-0xef, 0x73, 0x63, 0x29, 0x82, 0xad, 0x47, 0xc6, 0xa3, 0x6b, 0xed, 0xfe, 0x5f, 0x33, 0xf8, 0x43,\n-0x51, 0xe9, 0x1a, 0x33, 0x91, 0x31, 0x17, 0xa0, 0x74, 0xc4, 0xd4, 0xa7, 0x01, 0xe6, 0xb2, 0x92,\n-0x3e, 0x6a, 0x9d, 0xed, 0x0e, 0xf9, 0x74, 0x98, 0x40, 0xd3, 0x3f, 0x03, 0x80, 0x06, 0x82, 0x40,\n-0xe8, 0xb1, 0xe2, 0xa7, 0x51, 0xa7, 0x1d, 0x83, 0x26, 0x6b, 0xab, 0xde, 0xfa, 0x17, 0x91, 0x2b,\n-0xd8, 0xc6, 0xac, 0x1e, 0xb1, 0x9e, 0x19, 0x01, 0xd5, 0x97, 0xa6, 0xea, 0x0d, 0xb7, 0xc4, 0x55,\n-0x1f, 0x27, 0x7c, 0xd2, 0x08, 0xd5, 0x76, 0x1f, 0x29, 0x15, 0x87, 0x40, 0x39, 0xdd, 0x38, 0x45,\n-0x11, 0x75, 0xd0, 0x9a, 0xa7, 0x34, 0xe0, 0xbf, 0xcd, 0xc8, 0x52, 0x1d, 0xb9, 0x47, 0x7e, 0x0d,\n-0xb8, 0xbb, 0xc6, 0x0c, 0xf6, 0x73, 0x57, 0x16, 0x5a, 0x7e, 0x43, 0x91, 0x1f, 0x55, 0x3a, 0xc6,\n-0x6d, 0x44, 0x04, 0xaa, 0x9c, 0xa9, 0x9c, 0xa7, 0x4c, 0x89, 0x17, 0x83, 0xae, 0xa3, 0x04, 0x5e,\n-0x52, 0x80, 0x8b, 0x1e, 0x12, 0x25, 0x11, 0x19, 0xd7, 0x0c, 0x7d, 0x7d, 0x31, 0x44, 0x41, 0xea,\n-0xdb, 0xaf, 0xb0, 0x1c, 0xef, 0x81, 0xd0, 0x2c, 0xc5, 0x9a, 0x21, 0x9b, 0x3d, 0xed, 0x42, 0x3b,\n-0x50, 0x26, 0xf2, 0xec, 0xce, 0x71, 0x61, 0x06, 0x62, 0x21, 0x54, 0x4e, 0x7f, 0xc1, 0x9d, 0x3e,\n-0x7f, 0x20, 0x8c, 0x80, 0xcb, 0x2a, 0xd8, 0x97, 0x62, 0xc8, 0x83, 0x33, 0x91, 0x7d, 0xb0, 0xa2,\n-0x5a, 0x0f, 0x57, 0xe8, 0x3b, 0xcc, 0xf2, 0x25, 0xb2, 0xd4, 0x7c, 0x2f, 0xec, 0x4d, 0xc6, 0xa1,\n-0x3a, 0x15, 0x7a, 0xe7, 0xb6, 0x5d, 0x35, 0xf5, 0xf6, 0x48, 0x4a, 0x36, 0x45, 0x66, 0xd4, 0xba,\n-0x98, 0x58, 0xc1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03,\n-0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x44, 0x9e, 0x48, 0xf5, 0xcc, 0x6d, 0x48, 0xd4, 0xa0,\n-0x4b, 0x7f, 0xfe, 0x59, 0x24, 0x2f, 0x83, 0x97, 0x99, 0x9a, 0x86, 0x30, 0x1f, 0x06, 0x03, 0x55,\n-0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x44, 0x9e, 0x48, 0xf5, 0xcc, 0x6d, 0x48, 0xd4,\n-0xa0, 0x4b, 0x7f, 0xfe, 0x59, 0x24, 0x2f, 0x83, 0x97, 0x99, 0x9a, 0x86, 0x30, 0x0f, 0x06, 0x03,\n-0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06,\n-0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01,\n-0x00, 0x05, 0x3e, 0x35, 0x5c, 0x15, 0x70, 0x9b, 0xc9, 0xc7, 0x73, 0x61, 0x6f, 0x72, 0x2b, 0xd4,\n-0xc2, 0x8f, 0xf2, 0x43, 0x5d, 0x02, 0xce, 0xc4, 0x94, 0xb9, 0x94, 0x11, 0x83, 0x67, 0x5d, 0xe2,\n-0x67, 0x6c, 0x75, 0x76, 0xbf, 0xbb, 0x0c, 0xaa, 0x36, 0xc6, 0xad, 0x47, 0x93, 0x63, 0xdc, 0x1e,\n-0x7e, 0xd6, 0xde, 0x2e, 0xfe, 0xe9, 0x19, 0x32, 0x38, 0x03, 0x7f, 0x14, 0xf6, 0x00, 0x73, 0x2c,\n-0x59, 0xb1, 0x21, 0x06, 0xe1, 0xfb, 0xac, 0x18, 0x95, 0x0c, 0xa3, 0xff, 0x99, 0x96, 0xf7, 0x2b,\n-0x27, 0x9b, 0xd5, 0x24, 0xcc, 0x1d, 0xdd, 0xc1, 0x3a, 0xe0, 0x98, 0x44, 0xb0, 0xc4, 0xe4, 0x3e,\n-0x77, 0xb1, 0x73, 0xa9, 0x64, 0x2c, 0xf6, 0x1c, 0x01, 0x7c, 0x3f, 0x5d, 0x45, 0x85, 0xc0, 0x85,\n-0xe7, 0x25, 0x8f, 0x95, 0xdc, 0x17, 0xf3, 0x3c, 0x9f, 0x1a, 0x6e, 0xb0, 0xca, 0xe3, 0x1d, 0x2a,\n-0xe9, 0x4c, 0x63, 0xfa, 0x24, 0x61, 0x62, 0xd6, 0xda, 0x7e, 0xb6, 0x1c, 0x6c, 0xf5, 0x02, 0x1d,\n-0xd4, 0x2a, 0xdd, 0x55, 0x90, 0xeb, 0x2a, 0x11, 0x47, 0x3c, 0x2e, 0x5e, 0x74, 0xb2, 0x82, 0x22,\n-0xa5, 0x7d, 0x53, 0x1f, 0x45, 0xec, 0x27, 0x91, 0x7d, 0xe7, 0x22, 0x16, 0xe8, 0xc0, 0x68, 0x36,\n-0xd8, 0xc6, 0xf1, 0x4f, 0x80, 0x44, 0x32, 0xf9, 0xe1, 0xd1, 0xd1, 0x1d, 0xaa, 0xde, 0xa8, 0xab,\n-0x9c, 0x04, 0xaf, 0xad, 0x20, 0x0e, 0x64, 0x98, 0x4d, 0xa5, 0x6b, 0xc0, 0x48, 0x58, 0x96, 0x69,\n-0x4d, 0xdc, 0x07, 0x8c, 0x51, 0x93, 0xa2, 0xdf, 0x9f, 0x0f, 0x3d, 0x8b, 0x60, 0xb4, 0x82, 0x8d,\n-0xaa, 0x08, 0x4e, 0x62, 0x45, 0xe0, 0xf9, 0x0b, 0xd2, 0xe0, 0xe0, 0x3c, 0x5b, 0xde, 0x5c, 0x71,\n-0x27, 0x25, 0xc2, 0xe6, 0x03, 0x81, 0x8b, 0x10, 0x53, 0xe3, 0xc7, 0x55, 0xa2, 0xb4, 0x9f, 0xd7,\n-0xe6, 0x30, 0x82, 0x06, 0x2f, 0x30, 0x82, 0x04, 0x17, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08,\n-0x25, 0xa1, 0xdf, 0xca, 0x33, 0xcb, 0x59, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa4, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n-0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08,\n-0x0c, 0x06, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04,\n-0x07, 0x0c, 0x0b, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24,\n-0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f,\n-0x72, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20,\n-0x52, 0x2e, 0x4c, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54,\n-0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n-0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x1f, 0x30,\n-0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72,\n-0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x41, 0x2d, 0x32, 0x30, 0x1e,\n-0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x30, 0x34, 0x31, 0x32, 0x33, 0x32, 0x32, 0x33, 0x5a, 0x17,\n-0x0d, 0x33, 0x34, 0x31, 0x32, 0x33, 0x31, 0x31, 0x37, 0x32, 0x36, 0x33, 0x39, 0x5a, 0x30, 0x81,\n-0xa4, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x41, 0x31, 0x0f,\n-0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x31,\n-0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61,\n-0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1b,\n-0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,\n-0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06,\n-0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x43,\n-0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n-0x72, 0x69, 0x74, 0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x54,\n-0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74,\n-0x20, 0x43, 0x41, 0x2d, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n-0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02,\n-0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa7, 0x20, 0x6e, 0xc2, 0x2a, 0xa2, 0x62, 0x24, 0x95, 0x90,\n-0x76, 0xc8, 0x38, 0x7e, 0x80, 0xd2, 0xab, 0xc1, 0x9b, 0x65, 0x05, 0x94, 0xf4, 0xc1, 0x0a, 0x10,\n-0xd5, 0x02, 0xac, 0xed, 0x9f, 0x93, 0xc7, 0x87, 0xc8, 0xb0, 0x27, 0x2b, 0x42, 0x0c, 0x3d, 0x0a,\n-0x3e, 0x41, 0x5a, 0x9e, 0x75, 0xdd, 0x8d, 0xca, 0xe0, 0x9b, 0xec, 0x68, 0x32, 0xa4, 0x69, 0x92,\n-0x68, 0x8c, 0x0b, 0x81, 0x0e, 0x56, 0xa0, 0x3e, 0x1a, 0xdd, 0x2c, 0x25, 0x14, 0x82, 0x2f, 0x97,\n-0xd3, 0x64, 0x46, 0xf4, 0x54, 0xa9, 0xdc, 0x3a, 0x54, 0x2d, 0x31, 0x2b, 0x99, 0x82, 0xf2, 0xd9,\n-0x2a, 0xd7, 0xef, 0x71, 0x00, 0xb8, 0x31, 0xa4, 0xbe, 0x7a, 0x24, 0x07, 0xc3, 0x42, 0x20, 0xf2,\n-0x8a, 0xd4, 0x92, 0x04, 0x1b, 0x65, 0x56, 0x4c, 0x6c, 0xd4, 0xfb, 0xb6, 0x61, 0x5a, 0x47, 0x23,\n-0xb4, 0xd8, 0x69, 0xb4, 0xb7, 0x3a, 0xd0, 0x74, 0x3c, 0x0c, 0x75, 0xa1, 0x8c, 0x4e, 0x76, 0xa1,\n-0xe9, 0xdb, 0x2a, 0xa5, 0x3b, 0xfa, 0xce, 0xb0, 0xff, 0x7e, 0x6a, 0x28, 0xfd, 0x27, 0x1c, 0xc8,\n-0xb1, 0xe9, 0x29, 0xf1, 0x57, 0x6e, 0x64, 0xb4, 0xd0, 0xc1, 0x15, 0x6d, 0x0e, 0xbe, 0x2e, 0x0e,\n-0x46, 0xc8, 0x5e, 0xf4, 0x51, 0xfe, 0xef, 0x0e, 0x63, 0x3a, 0x3b, 0x71, 0xba, 0xcf, 0x6f, 0x59,\n-0xca, 0x0c, 0xe3, 0x9b, 0x5d, 0x49, 0xb8, 0x4c, 0xe2, 0x57, 0xb1, 0x98, 0x8a, 0x42, 0x57, 0x9c,\n-0x76, 0xef, 0xef, 0xbd, 0xd1, 0x68, 0xa8, 0xd2, 0xf4, 0x09, 0xbb, 0x77, 0x35, 0xbe, 0x25, 0x82,\n-0x08, 0xc4, 0x16, 0x2c, 0x44, 0x20, 0x56, 0xa9, 0x44, 0x11, 0x77, 0xef, 0x5d, 0xb4, 0x1d, 0xaa,\n-0x5e, 0x6b, 0x3e, 0x8b, 0x32, 0xf6, 0x07, 0x2f, 0x57, 0x04, 0x92, 0xca, 0xf5, 0xfe, 0x9d, 0xc2,\n-0xe9, 0xe8, 0xb3, 0x8e, 0x4c, 0x4b, 0x02, 0x31, 0xd9, 0xe4, 0x3c, 0x48, 0x82, 0x27, 0xf7, 0x18,\n-0x82, 0x76, 0x48, 0x3a, 0x71, 0xb1, 0x13, 0xa1, 0x39, 0xd5, 0x2e, 0xc5, 0x34, 0xc2, 0x1d, 0x62,\n-0x85, 0xdf, 0x03, 0xfe, 0x4d, 0xf4, 0xaf, 0x3d, 0xdf, 0x5c, 0x5b, 0x8d, 0xfa, 0x70, 0xe1, 0xa5,\n-0x7e, 0x27, 0xc7, 0x86, 0x2e, 0x6a, 0x8f, 0x12, 0xc6, 0x84, 0x5e, 0x43, 0x51, 0x50, 0x9c, 0x19,\n-0x9b, 0x78, 0xe6, 0xfc, 0xf6, 0xed, 0x47, 0x7e, 0x7b, 0x3d, 0x66, 0xef, 0x13, 0x13, 0x88, 0x5f,\n-0x3c, 0xa1, 0x63, 0xfb, 0xf9, 0xac, 0x87, 0x35, 0x9f, 0xf3, 0x82, 0x9e, 0xa4, 0x3f, 0x0a, 0x9c,\n-0x31, 0x69, 0x8b, 0x99, 0xa4, 0x88, 0x4a, 0x8e, 0x6e, 0x66, 0x4d, 0xef, 0x16, 0xc4, 0x0f, 0x79,\n-0x28, 0x21, 0x60, 0x0d, 0x85, 0x16, 0x7d, 0xd7, 0x54, 0x38, 0xf1, 0x92, 0x56, 0xfd, 0xb5, 0x33,\n-0x4c, 0x83, 0xdc, 0xd7, 0x10, 0x9f, 0x4b, 0xfd, 0xc6, 0xf8, 0x42, 0xbd, 0xba, 0x7c, 0x73, 0x02,\n-0xe0, 0xff, 0x7d, 0xcd, 0x5b, 0xe1, 0xd4, 0xac, 0x61, 0x7b, 0x57, 0xd5, 0x4a, 0x7b, 0x5b, 0xd4,\n-0x85, 0x58, 0x27, 0x5d, 0xbf, 0xf8, 0x2b, 0x60, 0xac, 0xa0, 0x26, 0xae, 0x14, 0x21, 0x27, 0xc6,\n-0x77, 0x9a, 0x33, 0x80, 0x3c, 0x5e, 0x46, 0x3f, 0xf7, 0xc3, 0xb1, 0xa3, 0x86, 0x33, 0xc6, 0xe8,\n-0x5e, 0x0d, 0xb9, 0x35, 0x2c, 0xaa, 0x46, 0xc1, 0x85, 0x02, 0x75, 0x80, 0xa0, 0xeb, 0x24, 0xfb,\n-0x15, 0xaa, 0xe4, 0x67, 0x7f, 0x6e, 0x77, 0x3f, 0xf4, 0x04, 0x8a, 0x2f, 0x7c, 0x7b, 0xe3, 0x17,\n-0x61, 0xf0, 0xdd, 0x09, 0xa9, 0x20, 0xc8, 0xbe, 0x09, 0xa4, 0xd0, 0x7e, 0x44, 0xc3, 0xb2, 0x30,\n-0x4a, 0x38, 0xaa, 0xa9, 0xec, 0x18, 0x9a, 0x07, 0x82, 0x2b, 0xdb, 0xb8, 0x9c, 0x18, 0xad, 0xda,\n-0xe0, 0x46, 0x17, 0xac, 0xcf, 0x5d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30,\n-0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd9, 0xfe, 0x21, 0x40, 0x6e, 0x94,\n-0x9e, 0xbc, 0x9b, 0x3d, 0x9c, 0x7d, 0x98, 0x20, 0x19, 0xe5, 0x8c, 0x30, 0x62, 0xb2, 0x30, 0x1f,\n-0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xd9, 0xfe, 0x21, 0x40, 0x6e,\n-0x94, 0x9e, 0xbc, 0x9b, 0x3d, 0x9c, 0x7d, 0x98, 0x20, 0x19, 0xe5, 0x8c, 0x30, 0x62, 0xb2, 0x30,\n-0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n-0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03,\n-0x82, 0x02, 0x01, 0x00, 0x9e, 0x45, 0x9e, 0x0c, 0x3b, 0xb6, 0xef, 0xe1, 0x3a, 0xc8, 0x7c, 0xd1,\n-0x00, 0x3d, 0xcf, 0xe2, 0xea, 0x06, 0xb5, 0xb2, 0x3a, 0xbb, 0x06, 0x4b, 0x68, 0x7a, 0xd0, 0x23,\n-0x97, 0x74, 0xa7, 0x2c, 0xf0, 0x08, 0xd8, 0x79, 0x5a, 0xd7, 0x5a, 0x84, 0x8a, 0xd8, 0x12, 0x9a,\n-0x1b, 0xd9, 0x7d, 0x5c, 0x4d, 0x70, 0xc5, 0xa5, 0xf9, 0xab, 0xe5, 0xa3, 0x89, 0x89, 0xdd, 0x01,\n-0xfa, 0xec, 0xdd, 0xf9, 0xe9, 0x92, 0x97, 0xdb, 0xb0, 0x46, 0x42, 0xf3, 0xd3, 0x62, 0xaa, 0x95,\n-0xfe, 0x31, 0x67, 0x14, 0x69, 0x58, 0x90, 0x0a, 0xaa, 0x0b, 0xee, 0x37, 0x23, 0xc7, 0x50, 0x51,\n-0xb4, 0xf5, 0x7e, 0x9e, 0xe3, 0x7b, 0xf7, 0xe4, 0xcc, 0x42, 0x32, 0x2d, 0x49, 0x0c, 0xcb, 0xff,\n-0x49, 0x0c, 0x9b, 0x1e, 0x34, 0xfd, 0x6e, 0x6e, 0x96, 0x8a, 0x79, 0x03, 0xb6, 0x6f, 0xdb, 0x09,\n-0xcb, 0xfd, 0x5f, 0x65, 0x14, 0x37, 0xe1, 0x38, 0xf5, 0xf3, 0x61, 0x16, 0x58, 0xe4, 0xb5, 0x6d,\n-0x0d, 0x0b, 0x04, 0x1b, 0x3f, 0x50, 0x2d, 0x7f, 0xb3, 0xc7, 0x7a, 0x1a, 0x16, 0x80, 0x60, 0xf8,\n-0x8a, 0x1f, 0xe9, 0x1b, 0x2a, 0xc6, 0xf9, 0xba, 0x01, 0x1a, 0x69, 0xbf, 0xd2, 0x58, 0xc7, 0x54,\n-0x57, 0x08, 0x8f, 0xe1, 0x39, 0x60, 0x77, 0x4b, 0xac, 0x59, 0x84, 0x1a, 0x88, 0xf1, 0xdd, 0xcb,\n-0x4f, 0x78, 0xd7, 0xe7, 0xe1, 0x33, 0x2d, 0xfc, 0xee, 0x41, 0xfa, 0x20, 0xb0, 0xbe, 0xcb, 0xf7,\n-0x38, 0x94, 0xc0, 0xe1, 0xd0, 0x85, 0x0f, 0xbb, 0xed, 0x2c, 0x73, 0xab, 0xed, 0xfe, 0x92, 0x76,\n-0x1a, 0x64, 0x7f, 0x5b, 0x0d, 0x33, 0x09, 0x07, 0x33, 0x7b, 0x06, 0x3f, 0x11, 0xa4, 0x5c, 0x70,\n-0x3c, 0x85, 0xc0, 0xcf, 0xe3, 0x90, 0xa8, 0x83, 0x77, 0xfa, 0xdb, 0xe6, 0xc5, 0x8c, 0x68, 0x67,\n-0x10, 0x67, 0xa5, 0x52, 0x2d, 0xf0, 0xc4, 0x99, 0x8f, 0x7f, 0xbf, 0xd1, 0x6b, 0xe2, 0xb5, 0x47,\n-0xd6, 0xd9, 0xd0, 0x85, 0x99, 0x4d, 0x94, 0x9b, 0x0f, 0x4b, 0x8d, 0xee, 0x00, 0x5a, 0x47, 0x1d,\n-0x11, 0x03, 0xac, 0x41, 0x18, 0xaf, 0x87, 0xb7, 0x6f, 0x0c, 0x3a, 0x8f, 0xca, 0xcf, 0xdc, 0x03,\n-0xc1, 0xa2, 0x09, 0xc8, 0xe5, 0xfd, 0x80, 0x5e, 0xc8, 0x60, 0x42, 0x01, 0x1b, 0x1a, 0x53, 0x5a,\n-0xbb, 0x37, 0xa6, 0xb7, 0xbc, 0xba, 0x84, 0xe9, 0x1e, 0x6c, 0x1a, 0xd4, 0x64, 0xda, 0xd4, 0x43,\n-0xfe, 0x93, 0x8b, 0x4b, 0xf2, 0x2c, 0x79, 0x16, 0x10, 0xd4, 0x93, 0x0b, 0x88, 0x8f, 0xa1, 0xd8,\n-0x86, 0x14, 0x46, 0x91, 0x47, 0x9b, 0x28, 0x24, 0xef, 0x57, 0x52, 0x4e, 0x5c, 0x42, 0x9c, 0xaa,\n-0xf7, 0x49, 0xec, 0x27, 0xe8, 0x40, 0x1e, 0xb3, 0xa6, 0x89, 0x22, 0x72, 0x9c, 0xf5, 0x0d, 0x33,\n-0xb4, 0x58, 0xa3, 0x30, 0x3b, 0xdd, 0xd4, 0x6a, 0x54, 0x93, 0xbe, 0x1a, 0x4d, 0xf3, 0x93, 0x94,\n-0xf7, 0xfc, 0x84, 0x0b, 0x3f, 0x84, 0x20, 0x5c, 0x34, 0x03, 0x44, 0xc5, 0xda, 0xad, 0xbc, 0x0a,\n-0xc1, 0x02, 0xcf, 0x1e, 0xe5, 0x94, 0xd9, 0xf3, 0x8e, 0x5b, 0xd8, 0x4c, 0xf0, 0x9d, 0xec, 0x61,\n-0x17, 0xbb, 0x14, 0x32, 0x54, 0x0c, 0x02, 0x29, 0x93, 0x1e, 0x92, 0x86, 0xf6, 0x7f, 0xef, 0xe7,\n-0x92, 0x05, 0x0e, 0x59, 0xdd, 0x99, 0x08, 0x2e, 0x2e, 0xfa, 0x9c, 0x00, 0x52, 0xd3, 0xc5, 0x66,\n-0x29, 0xe4, 0xa7, 0x97, 0x44, 0xa4, 0x0e, 0x28, 0x81, 0x13, 0x35, 0xc5, 0xf6, 0x6f, 0x64, 0xe6,\n-0x41, 0xc4, 0xd5, 0x2f, 0xcc, 0x34, 0x45, 0x25, 0xcf, 0x41, 0x00, 0x96, 0x3d, 0x4a, 0x2e, 0xc2,\n-0x96, 0x98, 0x4f, 0x4e, 0x4a, 0x9c, 0x97, 0xb7, 0xdb, 0x1f, 0x92, 0x32, 0xc8, 0xff, 0x0f, 0x51,\n-0x6e, 0xd6, 0xec, 0x09, 0x30, 0x82, 0x04, 0x30, 0x30, 0x82, 0x03, 0x18, 0xa0, 0x03, 0x02, 0x01,\n-0x02, 0x02, 0x09, 0x00, 0xda, 0x9b, 0xec, 0x71, 0xf3, 0x03, 0xb0, 0x19, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa4, 0x31, 0x0b,\n-0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06,\n-0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12,\n-0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69,\n-0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75,\n-0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e,\n-0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04,\n-0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74,\n-0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,\n-0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x54, 0x72, 0x75, 0x73,\n-0x74, 0x43, 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x41,\n-0x2d, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x30, 0x34, 0x31, 0x32, 0x33, 0x32,\n-0x31, 0x36, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x37, 0x32, 0x33, 0x31,\n-0x36, 0x5a, 0x30, 0x81, 0xa4, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x50, 0x41, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x06, 0x50, 0x61, 0x6e,\n-0x61, 0x6d, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x50, 0x61,\n-0x6e, 0x61, 0x6d, 0x61, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55,\n-0x04, 0x0a, 0x0c, 0x1b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x53, 0x79, 0x73,\n-0x74, 0x65, 0x6d, 0x73, 0x20, 0x53, 0x2e, 0x20, 0x64, 0x65, 0x20, 0x52, 0x2e, 0x4c, 0x2e, 0x31,\n-0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43,\n-0x6f, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41,\n-0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x0c, 0x16, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n-0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x41, 0x2d, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f,\n-0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x8e, 0xb7, 0x95, 0xe2, 0xc2,\n-0x26, 0x12, 0x6b, 0x33, 0x19, 0xc7, 0x40, 0x58, 0x0a, 0xab, 0x59, 0xaa, 0x8d, 0x00, 0xa3, 0xfc,\n-0x80, 0xc7, 0x50, 0x7b, 0x8e, 0xd4, 0x20, 0x26, 0xba, 0x32, 0x12, 0xd8, 0x23, 0x54, 0x49, 0x25,\n-0x10, 0x22, 0x98, 0x9d, 0x46, 0xd2, 0xc1, 0xc9, 0x9e, 0x4e, 0x1b, 0x2e, 0x2c, 0x0e, 0x38, 0xf3,\n-0x1a, 0x25, 0x68, 0x1c, 0xa6, 0x5a, 0x05, 0xe6, 0x1e, 0x8b, 0x48, 0xbf, 0x98, 0x96, 0x74, 0x3e,\n-0x69, 0xca, 0xe9, 0xb5, 0x78, 0xa5, 0x06, 0xbc, 0xd5, 0x00, 0x5e, 0x09, 0x0a, 0xf2, 0x27, 0x7a,\n-0x52, 0xfc, 0x2d, 0xd5, 0xb1, 0xea, 0xb4, 0x89, 0x61, 0x24, 0xf3, 0x1a, 0x13, 0xdb, 0xa9, 0xcf,\n-0x52, 0xed, 0x0c, 0x24, 0xba, 0xb9, 0x9e, 0xec, 0x7e, 0x00, 0x74, 0xfa, 0x93, 0xad, 0x6c, 0x29,\n-0x92, 0xae, 0x51, 0xb4, 0xbb, 0xd3, 0x57, 0xbf, 0xb3, 0xf3, 0xa8, 0x8d, 0x9c, 0xf4, 0x24, 0x4b,\n-0x2a, 0xd6, 0x99, 0x9e, 0xf4, 0x9e, 0xfe, 0xc0, 0x7e, 0x42, 0x3a, 0xe7, 0x0b, 0x95, 0x53, 0xda,\n-0xb7, 0x68, 0x0e, 0x90, 0x4c, 0xfb, 0x70, 0x3f, 0x8f, 0x4a, 0x2c, 0x94, 0xf3, 0x26, 0xdd, 0x63,\n-0x69, 0xa9, 0x94, 0xd8, 0x10, 0x4e, 0xc5, 0x47, 0x08, 0x90, 0x99, 0x1b, 0x17, 0x4d, 0xb9, 0x6c,\n-0x6e, 0xef, 0x60, 0x95, 0x11, 0x8e, 0x21, 0x80, 0xb5, 0xbd, 0xa0, 0x73, 0xd8, 0xd0, 0xb2, 0x77,\n-0xc4, 0x45, 0xea, 0x5a, 0x26, 0xfb, 0x66, 0x76, 0x76, 0xf8, 0x06, 0x1f, 0x61, 0x6d, 0x0f, 0x55,\n-0xc5, 0x83, 0xb7, 0x10, 0x56, 0x72, 0x06, 0x07, 0xa5, 0xf3, 0xb1, 0x1a, 0x03, 0x05, 0x64, 0x0e,\n-0x9d, 0x5a, 0x8a, 0xd6, 0x86, 0x70, 0x1b, 0x24, 0xde, 0xfe, 0x28, 0x8a, 0x2b, 0xd0, 0x6a, 0xb0,\n-0xfc, 0x7a, 0xa2, 0xdc, 0xb2, 0x79, 0x0e, 0x8b, 0x65, 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n-0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xee, 0x6b,\n-0x49, 0x3c, 0x7a, 0x3f, 0x0d, 0xe3, 0xb1, 0x09, 0xb7, 0x8a, 0xc8, 0xab, 0x19, 0x9f, 0x73, 0x33,\n-0x50, 0xe7, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xee,\n-0x6b, 0x49, 0x3c, 0x7a, 0x3f, 0x0d, 0xe3, 0xb1, 0x09, 0xb7, 0x8a, 0xc8, 0xab, 0x19, 0x9f, 0x73,\n-0x33, 0x50, 0xe7, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n-0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n-0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n-0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x25, 0x18, 0xd4, 0x91, 0x8f, 0x13, 0xee, 0x8f,\n-0x1e, 0x1d, 0x11, 0x53, 0xda, 0x2d, 0x44, 0x29, 0x19, 0xa0, 0x1e, 0x6b, 0x31, 0x9e, 0x4d, 0x0e,\n-0x9e, 0xad, 0x3d, 0x5c, 0x41, 0x6f, 0x95, 0x2b, 0x24, 0xa1, 0x79, 0x98, 0x3a, 0x38, 0x36, 0xfb,\n-0xbb, 0x66, 0x9e, 0x48, 0xff, 0x90, 0x90, 0xef, 0x3d, 0xd4, 0xb8, 0x9b, 0xb4, 0x87, 0x75, 0x3f,\n-0x20, 0x9b, 0xce, 0x72, 0xcf, 0xa1, 0x55, 0xc1, 0x4d, 0x64, 0xa2, 0x19, 0x06, 0xa1, 0x07, 0x33,\n-0x0c, 0x0b, 0x29, 0xe5, 0xf1, 0xea, 0xab, 0xa3, 0xec, 0xb5, 0x0a, 0x74, 0x90, 0xc7, 0x7d, 0x72,\n-0xf2, 0xd7, 0x5c, 0x9f, 0x91, 0xef, 0x91, 0x8b, 0xb7, 0xdc, 0xed, 0x66, 0xa2, 0xcf, 0x8e, 0x66,\n-0x3b, 0xbc, 0x9f, 0x3a, 0x02, 0xe0, 0x27, 0xdd, 0x16, 0x98, 0xc0, 0x95, 0xd4, 0x0a, 0xa4, 0xe4,\n-0x81, 0x9a, 0x75, 0x94, 0x35, 0x9c, 0x90, 0x5f, 0x88, 0x37, 0x06, 0xad, 0x59, 0x95, 0x0a, 0xb0,\n-0xd1, 0x67, 0xd3, 0x19, 0xca, 0x89, 0xe7, 0x32, 0x5a, 0x36, 0x1c, 0x3e, 0x82, 0xa8, 0x5a, 0x93,\n-0xbe, 0xc6, 0xd0, 0x64, 0x91, 0xb6, 0xcf, 0xd9, 0xb6, 0x18, 0xcf, 0xdb, 0x7e, 0xd2, 0x65, 0xa3,\n-0xa6, 0xc4, 0x8e, 0x17, 0x31, 0xc1, 0xfb, 0x7e, 0x76, 0xdb, 0xd3, 0x85, 0xe3, 0x58, 0xb2, 0x77,\n-0x7a, 0x76, 0x3b, 0x6c, 0x2f, 0x50, 0x1c, 0xe7, 0xdb, 0xf6, 0x67, 0x79, 0x1f, 0xf5, 0x82, 0x95,\n-0x9a, 0x07, 0xa7, 0x14, 0xaf, 0x8f, 0xdc, 0x28, 0x21, 0x67, 0x09, 0xd2, 0xd6, 0x4d, 0x5a, 0x1c,\n-0x19, 0x1c, 0x8e, 0x77, 0x5c, 0xc3, 0x94, 0x24, 0x3d, 0x32, 0x6b, 0x4b, 0x7e, 0xd4, 0x78, 0x94,\n-0x83, 0xbe, 0x37, 0x4d, 0xce, 0x5f, 0xc7, 0x1e, 0x4e, 0x3c, 0xe0, 0x89, 0x33, 0x95, 0x0b, 0x0f,\n-0xa5, 0x32, 0xd6, 0x3c, 0x5a, 0x79, 0x2c, 0x19, 0x30, 0x82, 0x05, 0x5a, 0x30, 0x82, 0x03, 0x42,\n-0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x4f, 0xd2, 0x2b, 0x8f, 0xf5, 0x64, 0xc8, 0x33, 0x9e,\n-0x4f, 0x34, 0x58, 0x66, 0x23, 0x70, 0x60, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n-0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08,\n-0x55, 0x6e, 0x69, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x0c, 0x1c, 0x55, 0x43, 0x41, 0x20, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20,\n-0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30,\n-0x1e, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x33, 0x31, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,\n-0x17, 0x0d, 0x33, 0x38, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30,\n-0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x11,\n-0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x55, 0x6e, 0x69, 0x54, 0x72, 0x75, 0x73,\n-0x74, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, 0x55, 0x43, 0x41, 0x20,\n-0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,\n-0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00,\n-0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa9, 0x09, 0x07, 0x28, 0x13, 0x02, 0xb0,\n-0x99, 0xe0, 0x64, 0xaa, 0x1e, 0x43, 0x16, 0x7a, 0x73, 0xb1, 0x91, 0xa0, 0x75, 0x3e, 0xa8, 0xfa,\n-0xe3, 0x38, 0x00, 0x7a, 0xec, 0x89, 0x6a, 0x20, 0x0f, 0x8b, 0xc5, 0xb0, 0x9b, 0x33, 0x03, 0x5a,\n-0x86, 0xc6, 0x58, 0x86, 0xd5, 0xc1, 0x85, 0xbb, 0x4f, 0xc6, 0x9c, 0x40, 0x4d, 0xca, 0xbe, 0xee,\n-0x69, 0x96, 0xb8, 0xad, 0x81, 0x30, 0x9a, 0x7c, 0x92, 0x05, 0xeb, 0x05, 0x2b, 0x9a, 0x48, 0xd0,\n-0xb8, 0x76, 0x3e, 0x96, 0xc8, 0x20, 0xbb, 0xd2, 0xb0, 0xf1, 0x8f, 0xd8, 0xac, 0x45, 0x46, 0xff,\n-0xaa, 0x67, 0x60, 0xb4, 0x77, 0x7e, 0x6a, 0x1f, 0x3c, 0x1a, 0x52, 0x7a, 0x04, 0x3d, 0x07, 0x3c,\n-0x85, 0x0d, 0x84, 0xd0, 0x1f, 0x76, 0x0a, 0xf7, 0x6a, 0x14, 0xdf, 0x72, 0xe3, 0x34, 0x7c, 0x57,\n-0x4e, 0x56, 0x01, 0x3e, 0x79, 0xf1, 0xaa, 0x29, 0x3b, 0x6c, 0xfa, 0xf8, 0x8f, 0x6d, 0x4d, 0xc8,\n-0x35, 0xdf, 0xae, 0xeb, 0xdc, 0x24, 0xee, 0x79, 0x45, 0xa7, 0x85, 0xb6, 0x05, 0x88, 0xde, 0x88,\n-0x5d, 0x25, 0x7c, 0x97, 0x64, 0x67, 0x09, 0xd9, 0xbf, 0x5a, 0x15, 0x05, 0x86, 0xf3, 0x09, 0x1e,\n-0xec, 0x58, 0x32, 0x33, 0x11, 0xf3, 0x77, 0x64, 0xb0, 0x76, 0x1f, 0xe4, 0x10, 0x35, 0x17, 0x1b,\n-0xf2, 0x0e, 0xb1, 0x6c, 0xa4, 0x2a, 0xa3, 0x73, 0xfc, 0x09, 0x1f, 0x1e, 0x32, 0x19, 0x53, 0x11,\n-0xe7, 0xd9, 0xb3, 0x2c, 0x2e, 0x76, 0x2e, 0xa1, 0xa3, 0xde, 0x7e, 0x6a, 0x88, 0x09, 0xe8, 0xf2,\n-0x07, 0x8a, 0xf8, 0xb2, 0xcd, 0x10, 0xe7, 0xe2, 0x73, 0x40, 0x93, 0xbb, 0x08, 0xd1, 0x3f, 0xe1,\n-0xfc, 0x0b, 0x94, 0xb3, 0x25, 0xef, 0x7c, 0xa6, 0xd7, 0xd1, 0xaf, 0x9f, 0xff, 0x96, 0x9a, 0xf5,\n-0x91, 0x7b, 0x98, 0x0b, 0x77, 0xd4, 0x7e, 0xe8, 0x07, 0xd2, 0x62, 0xb5, 0x95, 0x39, 0xe3, 0xf3,\n-0xf1, 0x6d, 0x0f, 0x0e, 0x65, 0x84, 0x8a, 0x63, 0x54, 0xc5, 0x80, 0xb6, 0xe0, 0x9e, 0x4b, 0x7d,\n-0x47, 0x26, 0xa7, 0x01, 0x08, 0x5d, 0xd1, 0x88, 0x9e, 0xd7, 0xc3, 0x32, 0x44, 0xfa, 0x82, 0x4a,\n-0x0a, 0x68, 0x54, 0x7f, 0x38, 0x53, 0x03, 0xcc, 0xa4, 0x00, 0x33, 0x64, 0x51, 0x59, 0x0b, 0xa3,\n-0x82, 0x91, 0x7a, 0x5e, 0xec, 0x16, 0xc2, 0xf3, 0x2a, 0xe6, 0x62, 0xda, 0x2a, 0xdb, 0x59, 0x62,\n-0x10, 0x25, 0x4a, 0x2a, 0x81, 0x0b, 0x47, 0x07, 0x43, 0x06, 0x70, 0x87, 0xd2, 0xfa, 0x93, 0x11,\n-0x29, 0x7a, 0x48, 0x4d, 0xeb, 0x94, 0xc7, 0x70, 0x4d, 0xaf, 0x67, 0xd5, 0x51, 0xb1, 0x80, 0x20,\n-0x01, 0x01, 0xb4, 0x7a, 0x08, 0xa6, 0x90, 0x7f, 0x4e, 0xe0, 0xef, 0x07, 0x41, 0x87, 0xaf, 0x6a,\n-0xa5, 0x5e, 0x8b, 0xfb, 0xcf, 0x50, 0xb2, 0x9a, 0x54, 0xaf, 0xc3, 0x89, 0xba, 0x58, 0x2d, 0xf5,\n-0x30, 0x98, 0xb1, 0x36, 0x72, 0x39, 0x7e, 0x49, 0x04, 0xfd, 0x29, 0xa7, 0x4c, 0x79, 0xe4, 0x05,\n-0x57, 0xdb, 0x94, 0xb9, 0x16, 0x53, 0x8d, 0x46, 0xb3, 0x1d, 0x95, 0x61, 0x57, 0x56, 0x7f, 0xaf,\n-0xf0, 0x16, 0x5b, 0x61, 0x58, 0x6f, 0x36, 0x50, 0x11, 0x0b, 0xd8, 0xac, 0x2b, 0x95, 0x16, 0x1a,\n-0x0e, 0x1f, 0x08, 0xcd, 0x36, 0x34, 0x65, 0x10, 0x62, 0x66, 0xd5, 0x80, 0x5f, 0x14, 0x20, 0x5f,\n-0x2d, 0x0c, 0xa0, 0x78, 0x0a, 0x68, 0xd6, 0x2c, 0xd7, 0xe9, 0x6f, 0x2b, 0xd2, 0x4a, 0x05, 0x93,\n-0xfc, 0x9e, 0x6f, 0x6b, 0x67, 0xff, 0x88, 0xf1, 0x4e, 0xa5, 0x69, 0x4a, 0x52, 0x37, 0x05, 0xea,\n-0xc6, 0x16, 0x8d, 0xd2, 0xc4, 0x99, 0xd1, 0x82, 0x2b, 0x3b, 0xba, 0x35, 0x75, 0xf7, 0x51, 0x51,\n-0x58, 0xf3, 0xc8, 0x07, 0xdd, 0xe4, 0xb4, 0x03, 0x7f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n-0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd9, 0x74, 0x3a,\n-0xe4, 0x30, 0x3d, 0x0d, 0xf7, 0x12, 0xdc, 0x7e, 0x5a, 0x05, 0x9f, 0x1e, 0x34, 0x9a, 0xf7, 0xe1,\n-0x14, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n-0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n-0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n-0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x36, 0x8d, 0x97, 0xcc, 0x42, 0x15, 0x64, 0x29, 0x37, 0x9b,\n-0x26, 0x2c, 0xd6, 0xfb, 0xae, 0x15, 0x69, 0x2c, 0x6b, 0x1a, 0x1a, 0xf7, 0x5f, 0xb6, 0xf9, 0x07,\n-0x4c, 0x59, 0xea, 0xf3, 0xc9, 0xc8, 0xb9, 0xae, 0xcc, 0xba, 0x2e, 0x7a, 0xdc, 0xc0, 0xf5, 0xb0,\n-0x2d, 0xc0, 0x3b, 0xaf, 0x9f, 0x70, 0x05, 0x11, 0x6a, 0x9f, 0x25, 0x4f, 0x01, 0x29, 0x70, 0xe3,\n-0xe5, 0x0c, 0xe1, 0xea, 0x5a, 0x7c, 0xdc, 0x49, 0xbb, 0xc1, 0x1e, 0x2a, 0x81, 0xf5, 0x16, 0x4b,\n-0x72, 0x91, 0xc8, 0xa2, 0x31, 0xb9, 0xaa, 0xda, 0xfc, 0x9d, 0x1f, 0xf3, 0x5d, 0x40, 0x02, 0x13,\n-0xfc, 0x4e, 0x1c, 0x06, 0xca, 0xb3, 0x14, 0x90, 0x54, 0x17, 0x19, 0x12, 0x1a, 0xf1, 0x1f, 0xd7,\n-0x0c, 0x69, 0x5a, 0xf6, 0x71, 0x78, 0xf4, 0x94, 0x7d, 0x91, 0x0b, 0x8e, 0xec, 0x90, 0x54, 0x8e,\n-0xbc, 0x6f, 0xa1, 0x4c, 0xab, 0xfc, 0x74, 0x64, 0xfd, 0x71, 0x9a, 0xf8, 0x41, 0x07, 0xa1, 0xcd,\n-0x91, 0xe4, 0x3c, 0x9a, 0xe0, 0x9b, 0x32, 0x39, 0x73, 0xab, 0x2a, 0xd5, 0x69, 0xc8, 0x78, 0x91,\n-0x26, 0x31, 0x7d, 0xe2, 0xc7, 0x30, 0xf1, 0xfc, 0x14, 0x78, 0x77, 0x12, 0x0e, 0x13, 0xf4, 0xdd,\n-0x16, 0x94, 0xbf, 0x4b, 0x67, 0x7b, 0x70, 0x53, 0x85, 0xca, 0xb0, 0xbb, 0xf3, 0x38, 0x4d, 0x2c,\n-0x90, 0x39, 0xc0, 0x0d, 0xc2, 0x5d, 0x6b, 0xe9, 0xe2, 0xe5, 0xd5, 0x88, 0x8d, 0xd6, 0x2c, 0xbf,\n-0xab, 0x1b, 0xbe, 0xb5, 0x28, 0x87, 0x12, 0x17, 0x74, 0x6e, 0xfc, 0x7d, 0xfc, 0x8f, 0xd0, 0x87,\n-0x26, 0xb0, 0x1b, 0xfb, 0xb9, 0x6c, 0xab, 0xe2, 0x9e, 0x3d, 0x15, 0xc1, 0x3b, 0x2e, 0x67, 0x02,\n-0x58, 0x91, 0x9f, 0xef, 0xf8, 0x42, 0x1f, 0x2c, 0xb7, 0x68, 0xf5, 0x75, 0xad, 0xcf, 0xb5, 0xf6,\n-0xff, 0x11, 0x7d, 0xc2, 0xf0, 0x24, 0xa5, 0xad, 0xd3, 0xfa, 0xa0, 0x3c, 0xa9, 0xfa, 0x5d, 0xdc,\n-0xa5, 0xa0, 0xef, 0x44, 0xa4, 0xbe, 0xd6, 0xe8, 0xe5, 0xe4, 0x13, 0x96, 0x17, 0x7b, 0x06, 0x3e,\n-0x32, 0xed, 0xc7, 0xb7, 0x42, 0xbc, 0x76, 0xa3, 0xd8, 0x65, 0x38, 0x2b, 0x38, 0x35, 0x51, 0x21,\n-0x0e, 0x0e, 0x6f, 0x2e, 0x34, 0x13, 0x40, 0xe1, 0x2b, 0x67, 0x0c, 0x6d, 0x4a, 0x41, 0x30, 0x18,\n-0x23, 0x5a, 0x32, 0x55, 0x99, 0xc9, 0x17, 0xe0, 0x3c, 0xde, 0xf6, 0xec, 0x79, 0xad, 0x2b, 0x58,\n-0x19, 0xa2, 0xad, 0x2c, 0x22, 0x1a, 0x95, 0x8e, 0xbe, 0x96, 0x90, 0x5d, 0x42, 0x57, 0xc4, 0xf9,\n-0x14, 0x03, 0x35, 0x2b, 0x1c, 0x2d, 0x51, 0x57, 0x08, 0xa7, 0x3a, 0xde, 0x3f, 0xe4, 0xc8, 0xb4,\n-0x03, 0x73, 0xc2, 0xc1, 0x26, 0x80, 0xbb, 0x0b, 0x42, 0x1f, 0xad, 0x0d, 0xaf, 0x26, 0x72, 0xda,\n-0xcc, 0xbe, 0xb3, 0xa3, 0x83, 0x58, 0x0d, 0x82, 0xc5, 0x1f, 0x46, 0x51, 0xe3, 0x9c, 0x18, 0xcc,\n-0x8d, 0x9b, 0x8d, 0xec, 0x49, 0xeb, 0x75, 0x50, 0xd5, 0x8c, 0x28, 0x59, 0xca, 0x74, 0x34, 0xda,\n-0x8c, 0x0b, 0x21, 0xab, 0x1e, 0xea, 0x1b, 0xe5, 0xc7, 0xfd, 0x15, 0x3e, 0xc0, 0x17, 0xaa, 0xfb,\n-0x23, 0x6e, 0x26, 0x46, 0xcb, 0xfa, 0xf9, 0xb1, 0x72, 0x6b, 0x69, 0xcf, 0x22, 0x84, 0x0b, 0x62,\n-0x0f, 0xac, 0xd9, 0x19, 0x00, 0x94, 0xa2, 0x76, 0x3c, 0xd4, 0x2d, 0x9a, 0xed, 0x04, 0x9e, 0x2d,\n-0x06, 0x62, 0x10, 0x37, 0x52, 0x1c, 0x85, 0x72, 0x1b, 0x27, 0xe5, 0xcc, 0xc6, 0x31, 0xec, 0x37,\n-0xec, 0x63, 0x59, 0x9b, 0x0b, 0x1d, 0x76, 0xcc, 0x7e, 0x32, 0x9a, 0x88, 0x95, 0x08, 0x36, 0x52,\n-0xbb, 0xde, 0x76, 0x5f, 0x76, 0x49, 0x49, 0xad, 0x7f, 0xbd, 0x65, 0x20, 0xb2, 0xc9, 0xc1, 0x2b,\n-0x76, 0x18, 0x76, 0x9f, 0x56, 0xb1, 0x30, 0x82, 0x05, 0x46, 0x30, 0x82, 0x03, 0x2e, 0xa0, 0x03,\n-0x02, 0x01, 0x02, 0x02, 0x10, 0x5d, 0xdf, 0xb1, 0xda, 0x5a, 0xa3, 0xed, 0x5d, 0xbe, 0x5a, 0x65,\n-0x20, 0x65, 0x03, 0x90, 0xef, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x0b, 0x05, 0x00, 0x30, 0x3d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x43, 0x4e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x55, 0x6e,\n-0x69, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n-0x12, 0x55, 0x43, 0x41, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x47, 0x32, 0x20, 0x52,\n-0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x33, 0x31, 0x31, 0x30, 0x30, 0x30,\n-0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30,\n-0x30, 0x30, 0x5a, 0x30, 0x3d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x43, 0x4e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x55, 0x6e, 0x69,\n-0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x12,\n-0x55, 0x43, 0x41, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x47, 0x32, 0x20, 0x52, 0x6f,\n-0x6f, 0x74, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82,\n-0x02, 0x01, 0x00, 0xc5, 0xe6, 0x2b, 0x6f, 0x7c, 0xef, 0x26, 0x05, 0x27, 0xa3, 0x81, 0x24, 0xda,\n-0x6f, 0xcb, 0x01, 0xf9, 0x99, 0x9a, 0xa9, 0x32, 0xc2, 0x22, 0x87, 0x61, 0x41, 0x91, 0x3b, 0xcb,\n-0xc3, 0x68, 0x1b, 0x06, 0xc5, 0x4c, 0xa9, 0x2b, 0xc1, 0x67, 0x17, 0x22, 0x1d, 0x2b, 0xed, 0xf9,\n-0x29, 0x89, 0x93, 0xa2, 0x78, 0xbd, 0x92, 0x6b, 0xa0, 0xa3, 0x0d, 0xa2, 0x7e, 0xca, 0x93, 0xb3,\n-0xa6, 0xd1, 0x8c, 0x35, 0xd5, 0x75, 0xf9, 0x17, 0xf6, 0xcf, 0x45, 0xc5, 0xe5, 0x7a, 0xec, 0x77,\n-0x93, 0xa0, 0x8f, 0x23, 0xae, 0x0e, 0x1a, 0x03, 0x7f, 0xbe, 0xd4, 0xd0, 0xed, 0x2e, 0x7b, 0xab,\n-0x46, 0x23, 0x5b, 0xff, 0x2c, 0xe6, 0x54, 0x7a, 0x94, 0xc0, 0x2a, 0x15, 0xf0, 0xc9, 0x8d, 0xb0,\n-0x7a, 0x3b, 0x24, 0xe1, 0xd7, 0x68, 0xe2, 0x31, 0x3c, 0x06, 0x33, 0x46, 0xb6, 0x54, 0x11, 0xa6,\n-0xa5, 0x2f, 0x22, 0x54, 0x2a, 0x58, 0x0d, 0x01, 0x02, 0xf1, 0xfa, 0x15, 0x51, 0x67, 0x6c, 0xc0,\n-0xfa, 0xd7, 0xb6, 0x1b, 0x7f, 0xd1, 0x56, 0x88, 0x2f, 0x1a, 0x3a, 0x8d, 0x3b, 0xbb, 0x82, 0x11,\n-0xe0, 0x47, 0x00, 0xd0, 0x52, 0x87, 0xab, 0xfb, 0x86, 0x7e, 0x0f, 0x24, 0x6b, 0x40, 0x9d, 0x34,\n-0x67, 0xbc, 0x8d, 0xc7, 0x2d, 0x86, 0x6f, 0x79, 0x3e, 0x8e, 0xa9, 0x3c, 0x17, 0x4b, 0x7f, 0xb0,\n-0x99, 0xe3, 0xb0, 0x71, 0x60, 0xdc, 0x0b, 0xf5, 0x64, 0xc3, 0xce, 0x43, 0xbc, 0x6d, 0x71, 0xb9,\n-0xd2, 0xde, 0x27, 0x5b, 0x8a, 0xe8, 0xd8, 0xc6, 0xae, 0xe1, 0x59, 0x7d, 0xcf, 0x28, 0x2d, 0x35,\n-0xb8, 0x95, 0x56, 0x1a, 0xf1, 0xb2, 0x58, 0x4b, 0xb7, 0x12, 0x37, 0xc8, 0x7c, 0xb3, 0xed, 0x4b,\n-0x80, 0xe1, 0x8d, 0xfa, 0x32, 0x23, 0xb6, 0x6f, 0xb7, 0x48, 0x95, 0x08, 0xb1, 0x44, 0x4e, 0x85,\n-0x8c, 0x3a, 0x02, 0x54, 0x20, 0x2f, 0xdf, 0xbf, 0x57, 0x4f, 0x3b, 0x3a, 0x90, 0x21, 0xd7, 0xc1,\n-0x26, 0x35, 0x54, 0x20, 0xec, 0xc7, 0x3f, 0x47, 0xec, 0xef, 0x5a, 0xbf, 0x4b, 0x7a, 0xc1, 0xad,\n-0x3b, 0x17, 0x50, 0x5c, 0x62, 0xd8, 0x0f, 0x4b, 0x4a, 0xdc, 0x2b, 0xfa, 0x6e, 0xbc, 0x73, 0x92,\n-0xcd, 0xec, 0xc7, 0x50, 0xe8, 0x41, 0x96, 0xd7, 0xa9, 0x7e, 0x6d, 0xd8, 0xe9, 0x1d, 0x8f, 0x8a,\n-0xb5, 0xb9, 0x58, 0x92, 0xba, 0x4a, 0x92, 0x2b, 0x0c, 0x56, 0xfd, 0x80, 0xeb, 0x08, 0xf0, 0x5e,\n-0x29, 0x6e, 0x1b, 0x1c, 0x0c, 0xaf, 0x8f, 0x93, 0x89, 0xad, 0xdb, 0xbd, 0xa3, 0x9e, 0x21, 0xca,\n-0x89, 0x19, 0xec, 0xdf, 0xb5, 0xc3, 0x1a, 0xeb, 0x16, 0xfe, 0x78, 0x36, 0x4c, 0xd6, 0x6e, 0xd0,\n-0x3e, 0x17, 0x1c, 0x90, 0x17, 0x6b, 0x26, 0xba, 0xfb, 0x7a, 0x2f, 0xbf, 0x11, 0x1c, 0x18, 0x0e,\n-0x2d, 0x73, 0x03, 0x8f, 0xa0, 0xe5, 0x35, 0xa0, 0x5a, 0xe2, 0x4c, 0x75, 0x1d, 0x71, 0xe1, 0x39,\n-0x38, 0x53, 0x78, 0x40, 0xcc, 0x83, 0x93, 0xd7, 0x0a, 0x9e, 0x9d, 0x5b, 0x8f, 0x8a, 0xe4, 0xe5,\n-0xe0, 0x48, 0xe4, 0x48, 0xb2, 0x47, 0xcd, 0x4e, 0x2a, 0x75, 0x2a, 0x7b, 0xf2, 0x22, 0xf6, 0xc9,\n-0xbe, 0x09, 0x91, 0x96, 0x57, 0x7a, 0x88, 0x88, 0xac, 0xee, 0x70, 0xac, 0xf9, 0xdc, 0x29, 0xe3,\n-0x0c, 0x1c, 0x3b, 0x12, 0x4e, 0x44, 0xd6, 0xa7, 0x4e, 0xb0, 0x26, 0xc8, 0xf3, 0xd9, 0x1a, 0x97,\n-0x91, 0x68, 0xea, 0xef, 0x8d, 0x46, 0x06, 0xd2, 0x56, 0x45, 0x58, 0x9a, 0x3c, 0x0c, 0x0f, 0x83,\n-0xb8, 0x05, 0x25, 0xc3, 0x39, 0xcf, 0x3b, 0xa4, 0x34, 0x89, 0xb7, 0x79, 0x12, 0x2f, 0x47, 0xc5,\n-0xe7, 0xa9, 0x97, 0x69, 0xfc, 0xa6, 0x77, 0x67, 0xb5, 0xdf, 0x7b, 0xf1, 0x7a, 0x65, 0x15, 0xe4,\n-0x61, 0x56, 0x65, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03,\n-0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03,\n-0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06,\n-0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x81, 0xc4, 0x8c, 0xcc, 0xf5, 0xe4, 0x30, 0xff,\n-0xa5, 0x0c, 0x08, 0x5f, 0x8c, 0x15, 0x67, 0x21, 0x74, 0x01, 0xdf, 0xdf, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00,\n-0x13, 0x65, 0x22, 0xf5, 0x8e, 0x2b, 0xad, 0x44, 0xe4, 0xcb, 0xff, 0xb9, 0x68, 0xe6, 0xc3, 0x80,\n-0x48, 0x3d, 0x04, 0x7b, 0xfa, 0x23, 0x2f, 0x7a, 0xed, 0x36, 0xda, 0xb2, 0xce, 0x6d, 0xf6, 0xe6,\n-0x9e, 0xe5, 0x5f, 0x58, 0x8f, 0xcb, 0x37, 0x32, 0xa1, 0xc8, 0x65, 0xb6, 0xae, 0x38, 0x3d, 0x35,\n-0x1b, 0x3e, 0xbc, 0x3b, 0xb6, 0x04, 0xd0, 0xbc, 0xf9, 0x49, 0xf5, 0x9b, 0xf7, 0x85, 0xc5, 0x36,\n-0xb6, 0xcb, 0xbc, 0xf8, 0xc8, 0x39, 0xd5, 0xe4, 0x5f, 0x07, 0xbd, 0x15, 0x54, 0x97, 0x74, 0xca,\n-0xca, 0xed, 0x4f, 0xba, 0xba, 0x64, 0x76, 0x9f, 0x81, 0xb8, 0x84, 0x45, 0x49, 0x4c, 0x8d, 0x6f,\n-0xa2, 0xeb, 0xb1, 0xcc, 0xd1, 0xc3, 0x94, 0xda, 0x44, 0xc2, 0xe6, 0xe2, 0xea, 0x18, 0xe8, 0xa2,\n-0x1f, 0x27, 0x05, 0xba, 0xd7, 0xe5, 0xd6, 0xa9, 0xcd, 0xdd, 0xef, 0x76, 0x98, 0x8d, 0x00, 0x0e,\n-0xcd, 0x1b, 0xfa, 0x03, 0xb7, 0x8e, 0x80, 0x58, 0x0e, 0x27, 0x3f, 0x52, 0xfb, 0x94, 0xa2, 0xca,\n-0x5e, 0x65, 0xc9, 0xd6, 0x84, 0xda, 0xb9, 0x35, 0x71, 0xf3, 0x26, 0xc0, 0x4f, 0x77, 0xe6, 0x81,\n-0x27, 0xd2, 0x77, 0x3b, 0x9a, 0x14, 0x6f, 0x79, 0xf4, 0xf6, 0xd0, 0xe1, 0xd3, 0x94, 0xba, 0xd0,\n-0x57, 0x51, 0xbd, 0x27, 0x05, 0x0d, 0xc1, 0xfd, 0xc8, 0x12, 0x30, 0xee, 0x6f, 0x8d, 0x11, 0x2b,\n-0x08, 0x9d, 0xd4, 0xd4, 0xbf, 0x80, 0x45, 0x14, 0x9a, 0x88, 0x44, 0xda, 0x30, 0xea, 0xb4, 0xa7,\n-0xe3, 0xee, 0xef, 0x5b, 0x82, 0xd5, 0x3e, 0xd6, 0xad, 0x78, 0x92, 0xdb, 0x5c, 0x3c, 0xf3, 0xd8,\n-0xad, 0xfa, 0xb8, 0x6b, 0x7f, 0xc4, 0x36, 0x28, 0xb6, 0x02, 0x15, 0x8a, 0x54, 0x2c, 0x9c, 0xb0,\n-0x17, 0x73, 0x8e, 0xd0, 0x37, 0xa3, 0x14, 0x3c, 0x98, 0x95, 0x00, 0x0c, 0x29, 0x05, 0x5b, 0x9e,\n-0x49, 0x49, 0xb1, 0x5f, 0xc7, 0xe3, 0xcb, 0xcf, 0x27, 0x65, 0x8e, 0x35, 0x17, 0xb7, 0x57, 0xc8,\n-0x30, 0xd9, 0x41, 0x5b, 0xb9, 0x14, 0xb6, 0xe8, 0xc2, 0x0f, 0x94, 0x31, 0xa7, 0x94, 0x98, 0xcc,\n-0x6a, 0xeb, 0xb5, 0xe1, 0x27, 0xf5, 0x10, 0xa8, 0x01, 0xe8, 0x8e, 0x12, 0x62, 0xe8, 0x88, 0xcc,\n-0xb5, 0x7f, 0x46, 0x97, 0xc0, 0x9b, 0x10, 0x66, 0x38, 0x1a, 0x36, 0x46, 0x5f, 0x22, 0x68, 0x3d,\n-0xdf, 0xc9, 0xc6, 0x13, 0x27, 0xab, 0x53, 0x06, 0xac, 0xa2, 0x3c, 0x86, 0x06, 0x65, 0x6f, 0xb1,\n-0x7e, 0xb1, 0x29, 0x44, 0x9a, 0xa3, 0xba, 0x49, 0x69, 0x28, 0x69, 0x8f, 0xd7, 0xe5, 0x5f, 0xad,\n-0x04, 0x86, 0x64, 0x6f, 0x1a, 0xa0, 0x0c, 0xc5, 0x08, 0x62, 0xce, 0x80, 0xa3, 0xd0, 0xf3, 0xec,\n-0x68, 0xde, 0xbe, 0x33, 0xc7, 0x17, 0x5b, 0x7f, 0x80, 0xc4, 0x4c, 0x4c, 0xb1, 0xa6, 0x84, 0x8a,\n-0xc3, 0x3b, 0xb8, 0x09, 0xcd, 0x14, 0x81, 0xba, 0x18, 0xe3, 0x54, 0x57, 0x36, 0xfe, 0xdb, 0x2f,\n-0x7c, 0x47, 0xa1, 0x3a, 0x33, 0xc8, 0xf9, 0x58, 0x3b, 0x44, 0x4f, 0xb1, 0xca, 0x02, 0x89, 0x04,\n-0x96, 0x28, 0x68, 0xc5, 0x4b, 0xb8, 0x26, 0x89, 0xbb, 0xd6, 0x33, 0x2f, 0x50, 0xd5, 0xfe, 0x9a,\n-0x89, 0xba, 0x18, 0x32, 0x92, 0x54, 0xc6, 0x5b, 0xe0, 0x9d, 0xf9, 0x5e, 0xe5, 0x0d, 0x22, 0x9b,\n-0xf6, 0xda, 0xe2, 0xc8, 0x21, 0xb2, 0x62, 0x21, 0xaa, 0x86, 0x40, 0xb2, 0x2e, 0x64, 0xd3, 0x5f,\n-0xc8, 0xe3, 0x7e, 0x11, 0x67, 0x45, 0x1f, 0x05, 0xfe, 0xe3, 0xa2, 0xef, 0xb3, 0xa8, 0xb3, 0xf3,\n-0x7d, 0x8f, 0xf8, 0x0c, 0x1f, 0x22, 0x1f, 0x2d, 0x70, 0xb4, 0xb8, 0x01, 0x34, 0x76, 0x30, 0x00,\n-0xe5, 0x23, 0x78, 0xa7, 0x56, 0xd7, 0x50, 0x1f, 0x8a, 0xfb, 0x06, 0xf5, 0xc2, 0x19, 0xf0, 0xd0,\n-0x30, 0x82, 0x02, 0x94, 0x30, 0x82, 0x02, 0x1a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x2c,\n-0x29, 0x9c, 0x5b, 0x16, 0xed, 0x05, 0x95, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n-0x04, 0x03, 0x02, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78,\n-0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75,\n-0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53,\n-0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x34,\n-0x30, 0x32, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2b, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d,\n-0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n-0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n-0x20, 0x45, 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x31, 0x32, 0x31, 0x38,\n-0x31, 0x35, 0x32, 0x33, 0x5a, 0x17, 0x0d, 0x34, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x38, 0x31,\n-0x35, 0x32, 0x33, 0x5a, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65,\n-0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f,\n-0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f,\n-0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31,\n-0x34, 0x30, 0x32, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2b, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f,\n-0x6d, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n-0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,\n-0x79, 0x20, 0x45, 0x43, 0x43, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n-0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xaa, 0x12, 0x47,\n-0x90, 0x98, 0x1b, 0xfb, 0xef, 0xc3, 0x40, 0x07, 0x83, 0x20, 0x4e, 0xf1, 0x30, 0x82, 0xa2, 0x06,\n-0xd1, 0xf2, 0x92, 0x86, 0x61, 0xf2, 0xf6, 0x21, 0x68, 0xca, 0x00, 0xc4, 0xc7, 0xea, 0x43, 0x00,\n-0x54, 0x86, 0xdc, 0xfd, 0x1f, 0xdf, 0x00, 0xb8, 0x41, 0x62, 0x5c, 0xdc, 0x70, 0x16, 0x32, 0xde,\n-0x1f, 0x99, 0xd4, 0xcc, 0xc5, 0x07, 0xc8, 0x08, 0x1f, 0x61, 0x16, 0x07, 0x51, 0x3d, 0x7d, 0x5c,\n-0x07, 0x53, 0xe3, 0x35, 0x38, 0x8c, 0xdf, 0xcd, 0x9f, 0xd9, 0x2e, 0x0d, 0x4a, 0xb6, 0x19, 0x2e,\n-0x5a, 0x70, 0x5a, 0x06, 0xed, 0xbe, 0xf0, 0xa1, 0xb0, 0xca, 0xd0, 0x09, 0x29, 0xa3, 0x63, 0x30,\n-0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x5b, 0xca, 0x5e, 0xe5,\n-0xde, 0xd2, 0x81, 0xaa, 0xcd, 0xa8, 0x2d, 0x64, 0x51, 0xb6, 0xd9, 0x72, 0x9b, 0x97, 0xe6, 0x4f,\n-0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n-0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x5b, 0xca,\n-0x5e, 0xe5, 0xde, 0xd2, 0x81, 0xaa, 0xcd, 0xa8, 0x2d, 0x64, 0x51, 0xb6, 0xd9, 0x72, 0x9b, 0x97,\n-0xe6, 0x4f, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n-0x01, 0x86, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x68,\n-0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0x8a, 0xe6, 0x40, 0x89, 0x37, 0xeb, 0xe9, 0xd5, 0x13, 0xd9,\n-0xca, 0xd4, 0x6b, 0x24, 0xf3, 0xb0, 0x3d, 0x87, 0x46, 0x58, 0x1a, 0xec, 0xb1, 0xdf, 0x6f, 0xfb,\n-0x56, 0xba, 0x70, 0x6b, 0xc7, 0x38, 0xcc, 0xe8, 0xb1, 0x8c, 0x4f, 0x0f, 0xf7, 0xf1, 0x67, 0x76,\n-0x0e, 0x83, 0xd0, 0x1e, 0x51, 0x8f, 0x02, 0x30, 0x3d, 0xf6, 0x23, 0x28, 0x26, 0x4c, 0xc6, 0x60,\n-0x87, 0x93, 0x26, 0x9b, 0xb2, 0x35, 0x1e, 0xba, 0xd6, 0xf7, 0x3c, 0xd1, 0x1c, 0xce, 0xfa, 0x25,\n-0x3c, 0xa6, 0x1a, 0x81, 0x15, 0x5b, 0xf3, 0x12, 0x0f, 0x6c, 0xee, 0x65, 0x8a, 0xc9, 0x87, 0xa8,\n-0xf9, 0x07, 0xe0, 0x62, 0x9a, 0x8c, 0x5c, 0x4a, 0x30, 0x82, 0x02, 0x8d, 0x30, 0x82, 0x02, 0x14,\n-0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x75, 0xe6, 0xdf, 0xcb, 0xc1, 0x68, 0x5b, 0xa8, 0x30,\n-0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x30, 0x7c, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03,\n-0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03,\n-0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f,\n-0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n-0x28, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65,\n-0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n-0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x45, 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30,\n-0x32, 0x31, 0x32, 0x31, 0x38, 0x31, 0x34, 0x30, 0x33, 0x5a, 0x17, 0x0d, 0x34, 0x31, 0x30, 0x32,\n-0x31, 0x32, 0x31, 0x38, 0x31, 0x34, 0x30, 0x33, 0x5a, 0x30, 0x7c, 0x31, 0x0b, 0x30, 0x09, 0x06,\n-0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04,\n-0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04,\n-0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61,\n-0x74, 0x69, 0x6f, 0x6e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x28, 0x53,\n-0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74,\n-0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,\n-0x69, 0x74, 0x79, 0x20, 0x45, 0x43, 0x43, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48,\n-0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x45,\n-0x6e, 0xa9, 0x50, 0xc4, 0xa6, 0x23, 0x36, 0x9e, 0x5f, 0x28, 0x8d, 0x17, 0xcb, 0x96, 0x22, 0x64,\n-0x3f, 0xdc, 0x7a, 0x8e, 0x1d, 0xcc, 0x08, 0xb3, 0xa2, 0x71, 0x24, 0xba, 0x8e, 0x49, 0xb9, 0x04,\n-0x1b, 0x47, 0x96, 0x58, 0xab, 0x2d, 0x95, 0xc8, 0xed, 0x9e, 0x08, 0x35, 0xc8, 0x27, 0xeb, 0x89,\n-0x8c, 0x53, 0x58, 0xeb, 0x62, 0x8a, 0xfe, 0xf0, 0x5b, 0x0f, 0x6b, 0x31, 0x52, 0x63, 0x41, 0x3b,\n-0x89, 0xcd, 0xec, 0xec, 0xb6, 0x8d, 0x19, 0xd3, 0x34, 0x07, 0xdc, 0xbb, 0xc6, 0x06, 0x7f, 0xc2,\n-0x45, 0x95, 0xec, 0xcb, 0x7f, 0xa8, 0x23, 0xe0, 0x09, 0xe9, 0x81, 0xfa, 0xf3, 0x47, 0xd3, 0xa3,\n-0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x82, 0xd1,\n-0x85, 0x73, 0x30, 0xe7, 0x35, 0x04, 0xd3, 0x8e, 0x02, 0x92, 0xfb, 0xe5, 0xa4, 0xd1, 0xc4, 0x21,\n-0xe8, 0xcd, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n-0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,\n-0x82, 0xd1, 0x85, 0x73, 0x30, 0xe7, 0x35, 0x04, 0xd3, 0x8e, 0x02, 0x92, 0xfb, 0xe5, 0xa4, 0xd1,\n-0xc4, 0x21, 0xe8, 0xcd, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n-0x03, 0x02, 0x01, 0x86, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,\n-0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x6f, 0xe7, 0xeb, 0x59, 0x11, 0xa4, 0x60, 0xcf, 0x61,\n-0xb0, 0x96, 0x7b, 0xed, 0x05, 0xf9, 0x2f, 0x13, 0x91, 0xdc, 0xed, 0xe5, 0xfc, 0x50, 0x6b, 0x11,\n-0x46, 0x46, 0xb3, 0x1c, 0x21, 0x00, 0x62, 0xbb, 0xbe, 0xc3, 0xe7, 0xe8, 0xcd, 0x07, 0x99, 0xf9,\n-0x0d, 0x0b, 0x5d, 0x72, 0x3e, 0xc4, 0xaa, 0x02, 0x30, 0x1f, 0xbc, 0xba, 0x0b, 0xe2, 0x30, 0x24,\n-0xfb, 0x7c, 0x6d, 0x80, 0x55, 0x0a, 0x99, 0x3e, 0x80, 0x0d, 0x33, 0xe5, 0x66, 0xa3, 0xb3, 0xa3,\n-0xbb, 0xa5, 0xd5, 0x8b, 0x8f, 0x09, 0x2c, 0xa6, 0x5d, 0x7e, 0xe2, 0xf0, 0x07, 0x08, 0x68, 0x6d,\n-0xd2, 0x7c, 0x69, 0x6e, 0x5f, 0xdf, 0xe5, 0x6a, 0x65, 0x30, 0x82, 0x05, 0xdd, 0x30, 0x82, 0x03,\n-0xc5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x7b, 0x2c, 0x9b, 0xd3, 0x16, 0x80, 0x32, 0x99,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,\n-0x7c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e,\n-0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10,\n-0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e,\n-0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43,\n-0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03,\n-0x55, 0x04, 0x03, 0x0c, 0x28, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f,\n-0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n-0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x30, 0x1e, 0x17,\n-0x0d, 0x31, 0x36, 0x30, 0x32, 0x31, 0x32, 0x31, 0x37, 0x33, 0x39, 0x33, 0x39, 0x5a, 0x17, 0x0d,\n-0x34, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x37, 0x33, 0x39, 0x33, 0x39, 0x5a, 0x30, 0x7c, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0e, 0x30, 0x0c,\n-0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x05, 0x54, 0x65, 0x78, 0x61, 0x73, 0x31, 0x10, 0x30, 0x0e,\n-0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x48, 0x6f, 0x75, 0x73, 0x74, 0x6f, 0x6e, 0x31, 0x18,\n-0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6f, 0x72,\n-0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x0c, 0x28, 0x53, 0x53, 0x4c, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n-0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75,\n-0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30,\n-0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n-0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xf9, 0x0f, 0xdd, 0xa3,\n-0x2b, 0x7d, 0xcb, 0xd0, 0x2a, 0xfe, 0xec, 0x67, 0x85, 0xa6, 0xe7, 0x2e, 0x1b, 0xba, 0x77, 0xe1,\n-0xe3, 0xf5, 0xaf, 0xa4, 0xec, 0xfa, 0x4a, 0x5d, 0x91, 0xc4, 0x57, 0x47, 0x6b, 0x18, 0x77, 0x6b,\n-0x76, 0xf2, 0xfd, 0x93, 0xe4, 0x3d, 0x0f, 0xc2, 0x16, 0x9e, 0x0b, 0x66, 0xc3, 0x56, 0x94, 0x9e,\n-0x17, 0x83, 0x85, 0xce, 0x56, 0xef, 0xf2, 0x16, 0xfd, 0x00, 0x62, 0xf5, 0x22, 0x09, 0x54, 0xe8,\n-0x65, 0x17, 0x4e, 0x41, 0xb9, 0xe0, 0x4f, 0x46, 0x97, 0xaa, 0x1b, 0xc8, 0xb8, 0x6e, 0x62, 0x5e,\n-0x69, 0xb1, 0x5f, 0xdb, 0x2a, 0x02, 0x7e, 0xfc, 0x6c, 0xca, 0xf3, 0x41, 0xd8, 0xed, 0xd0, 0xe8,\n-0xfc, 0x3f, 0x61, 0x48, 0xed, 0xb0, 0x03, 0x14, 0x1d, 0x10, 0x0e, 0x4b, 0x19, 0xe0, 0xbb, 0x4e,\n-0xec, 0x86, 0x65, 0xff, 0x36, 0xf3, 0x5e, 0x67, 0x02, 0x0b, 0x9d, 0x86, 0x55, 0x61, 0xfd, 0x7a,\n-0x38, 0xed, 0xfe, 0xe2, 0x19, 0x00, 0xb7, 0x6f, 0xa1, 0x50, 0x62, 0x75, 0x74, 0x3c, 0xa0, 0xfa,\n-0xc8, 0x25, 0x92, 0xb4, 0x6e, 0x7a, 0x22, 0xc7, 0xf8, 0x1e, 0xa1, 0xe3, 0xb2, 0xdd, 0x91, 0x31,\n-0xab, 0x2b, 0x1d, 0x04, 0xff, 0xa5, 0x4a, 0x04, 0x37, 0xe9, 0x85, 0xa4, 0x33, 0x2b, 0xfd, 0xe2,\n-0xd6, 0x55, 0x34, 0x7c, 0x19, 0xa4, 0x4a, 0x68, 0xc7, 0xb2, 0xa8, 0xd3, 0xb7, 0xca, 0xa1, 0x93,\n-0x88, 0xeb, 0xc1, 0x97, 0xbc, 0x8c, 0xf9, 0x1d, 0xd9, 0x22, 0x84, 0x24, 0x74, 0xc7, 0x04, 0x3d,\n-0x6a, 0xa9, 0x29, 0x93, 0xcc, 0xeb, 0xb8, 0x5b, 0xe1, 0xfe, 0x5f, 0x25, 0xaa, 0x34, 0x58, 0xc8,\n-0xc1, 0x23, 0x54, 0x9d, 0x1b, 0x98, 0x11, 0xc3, 0x38, 0x9c, 0x7e, 0x3d, 0x86, 0x6c, 0xa5, 0x0f,\n-0x40, 0x86, 0x7c, 0x02, 0xf4, 0x5c, 0x02, 0x4f, 0x28, 0xcb, 0xae, 0x71, 0x9f, 0x0f, 0x3a, 0xc8,\n-0x33, 0xfe, 0x11, 0x25, 0x35, 0xea, 0xfc, 0xba, 0xc5, 0x60, 0x3d, 0xd9, 0x7c, 0x18, 0xd5, 0xb2,\n-0xa9, 0xd3, 0x75, 0x78, 0x03, 0x72, 0x22, 0xca, 0x3a, 0xc3, 0x1f, 0xef, 0x2c, 0xe5, 0x2e, 0xa9,\n-0xfa, 0x9e, 0x2c, 0xb6, 0x51, 0x46, 0xfd, 0xaf, 0x03, 0xd6, 0xea, 0x60, 0x68, 0xea, 0x85, 0x16,\n-0x36, 0x6b, 0x85, 0xe9, 0x1e, 0xc0, 0xb3, 0xdd, 0xc4, 0x24, 0xdc, 0x80, 0x2a, 0x81, 0x41, 0x6d,\n-0x94, 0x3e, 0xc8, 0xe0, 0xc9, 0x81, 0x41, 0x00, 0x9e, 0x5e, 0xbf, 0x7f, 0xc5, 0x08, 0x98, 0xa2,\n-0x18, 0x2c, 0x42, 0x40, 0xb3, 0xf9, 0x6f, 0x38, 0x27, 0x4b, 0x4e, 0x80, 0xf4, 0x3d, 0x81, 0x47,\n-0xe0, 0x88, 0x7c, 0xea, 0x1c, 0xce, 0xb5, 0x75, 0x5c, 0x51, 0x2e, 0x1c, 0x2b, 0x7f, 0x1a, 0x72,\n-0x28, 0xe7, 0x00, 0xb5, 0xd1, 0x74, 0xc6, 0xd7, 0xe4, 0x9f, 0xad, 0x07, 0x93, 0xb6, 0x53, 0x35,\n-0x35, 0xfc, 0x37, 0xe4, 0xc3, 0xf6, 0x5d, 0x16, 0xbe, 0x21, 0x73, 0xde, 0x92, 0x0a, 0xf8, 0xa0,\n-0x63, 0x6a, 0xbc, 0x96, 0x92, 0x6a, 0x3e, 0xf8, 0xbc, 0x65, 0x55, 0x9b, 0xde, 0xf5, 0x0d, 0x89,\n-0x26, 0x04, 0xfc, 0x25, 0x1a, 0xa6, 0x25, 0x69, 0xcb, 0xc2, 0x6d, 0xca, 0x7c, 0xe2, 0x59, 0x5f,\n-0x97, 0xac, 0xeb, 0xef, 0x2e, 0xc8, 0xbc, 0xd7, 0x1b, 0x59, 0x3c, 0x2b, 0xcc, 0xf2, 0x19, 0xc8,\n-0x93, 0x6b, 0x27, 0x63, 0x19, 0xcf, 0xfc, 0xe9, 0x26, 0xf8, 0xca, 0x71, 0x9b, 0x7f, 0x93, 0xfe,\n-0x34, 0x67, 0x84, 0x4e, 0x99, 0xeb, 0xfc, 0xb3, 0x78, 0x09, 0x33, 0x70, 0xba, 0x66, 0xa6, 0x76,\n-0xed, 0x1b, 0x73, 0xeb, 0x1a, 0xa5, 0x0d, 0xc4, 0x22, 0x13, 0x20, 0x94, 0x56, 0x0a, 0x4e, 0x2c,\n-0x6c, 0x4e, 0xb1, 0xfd, 0xcf, 0x9c, 0x09, 0xba, 0xa2, 0x33, 0xed, 0x87, 0x02, 0x03, 0x01, 0x00,\n-0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n-0xdd, 0x04, 0x09, 0x07, 0xa2, 0xf5, 0x7a, 0x7d, 0x52, 0x53, 0x12, 0x92, 0x95, 0xee, 0x38, 0x80,\n-0x25, 0x0d, 0xa6, 0x59, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n-0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16,\n-0x80, 0x14, 0xdd, 0x04, 0x09, 0x07, 0xa2, 0xf5, 0x7a, 0x7d, 0x52, 0x53, 0x12, 0x92, 0x95, 0xee,\n-0x38, 0x80, 0x25, 0x0d, 0xa6, 0x59, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n-0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x20, 0x18, 0x11, 0x94, 0x29, 0xfb,\n-0x26, 0x9d, 0x1c, 0x1e, 0x1e, 0x70, 0x61, 0xf1, 0x95, 0x72, 0x93, 0x71, 0x24, 0xad, 0x68, 0x93,\n-0x58, 0x8e, 0x32, 0xaf, 0x1b, 0xb3, 0x70, 0x03, 0xfc, 0x25, 0x2b, 0x74, 0x85, 0x90, 0x3d, 0x78,\n-0x6a, 0xf4, 0xb9, 0x8b, 0xa5, 0x97, 0x3b, 0xb5, 0x18, 0x91, 0xbb, 0x1e, 0xa7, 0xf9, 0x40, 0x5b,\n-0x91, 0xf9, 0x55, 0x99, 0xaf, 0x1e, 0x11, 0xd0, 0x5c, 0x1d, 0xa7, 0x66, 0xe3, 0xb1, 0x94, 0x07,\n-0x0c, 0x32, 0x39, 0xa6, 0xea, 0x1b, 0xb0, 0x79, 0xd8, 0x1d, 0x9c, 0x70, 0x44, 0xe3, 0x8a, 0xdd,\n-0xc4, 0xf9, 0x95, 0x1f, 0x8a, 0x38, 0x43, 0x3f, 0x01, 0x85, 0xa5, 0x47, 0xa7, 0x3d, 0x46, 0xb2,\n-0xbc, 0xe5, 0x22, 0x68, 0xf7, 0x7b, 0x9c, 0xd8, 0x2c, 0x3e, 0x0a, 0x21, 0xc8, 0x2d, 0x33, 0xac,\n-0xbf, 0xc5, 0x81, 0x99, 0x31, 0x74, 0xc1, 0x75, 0x71, 0xc5, 0xbe, 0xb1, 0xf0, 0x23, 0x45, 0xf4,\n-0x9d, 0x6b, 0xfc, 0x19, 0x63, 0x9d, 0xa3, 0xbc, 0x04, 0xc6, 0x18, 0x0b, 0x25, 0xbb, 0x53, 0x89,\n-0x0f, 0xb3, 0x80, 0x50, 0xde, 0x45, 0xee, 0x44, 0x7f, 0xab, 0x94, 0x78, 0x64, 0x98, 0xd3, 0xf6,\n-0x28, 0xdd, 0x87, 0xd8, 0x70, 0x65, 0x74, 0xfb, 0x0e, 0xb9, 0x13, 0xeb, 0xa7, 0x0f, 0x61, 0xa9,\n-0x32, 0x96, 0xcc, 0xde, 0xbb, 0xed, 0x63, 0x4c, 0x18, 0xbb, 0xa9, 0x40, 0xf7, 0xa0, 0x54, 0x6e,\n-0x20, 0x88, 0x71, 0x75, 0x18, 0xea, 0x7a, 0xb4, 0x34, 0x72, 0xe0, 0x23, 0x27, 0x77, 0x5c, 0xb6,\n-0x90, 0xea, 0x86, 0x25, 0x40, 0xab, 0xef, 0x33, 0x0f, 0xcb, 0x9f, 0x82, 0xbe, 0xa2, 0x20, 0xfb,\n-0xf6, 0xb5, 0x2d, 0x1a, 0xe6, 0xc2, 0x85, 0xb1, 0x74, 0x0f, 0xfb, 0xc8, 0x65, 0x02, 0xa4, 0x52,\n-0x01, 0x47, 0xdd, 0x49, 0x22, 0xc1, 0xbf, 0xd8, 0xeb, 0x6b, 0xac, 0x7e, 0xde, 0xec, 0x63, 0x33,\n-0x15, 0xb7, 0x23, 0x08, 0x8f, 0xc6, 0x0f, 0x8d, 0x41, 0x5a, 0xdd, 0x8e, 0xc5, 0xb9, 0x8f, 0xe5,\n-0x45, 0x3f, 0x78, 0xdb, 0xba, 0xd2, 0x1b, 0x40, 0xb1, 0xfe, 0x71, 0x4d, 0x3f, 0xe0, 0x81, 0xa2,\n-0xba, 0x5e, 0xb4, 0xec, 0x15, 0xe0, 0x93, 0xdd, 0x08, 0x1f, 0x7e, 0xe1, 0x55, 0x99, 0x0b, 0x21,\n-0xde, 0x93, 0x9e, 0x0a, 0xfb, 0xe6, 0xa3, 0x49, 0xbd, 0x36, 0x30, 0xfe, 0xe7, 0x77, 0xb2, 0xa0,\n-0x75, 0x97, 0xb5, 0x2d, 0x81, 0x88, 0x17, 0x65, 0x20, 0xf7, 0xda, 0x90, 0x00, 0x9f, 0xc9, 0x52,\n-0xcc, 0x32, 0xca, 0x35, 0x7c, 0xf5, 0x3d, 0x0f, 0xd8, 0x2b, 0xd7, 0xf5, 0x26, 0x6c, 0xc9, 0x06,\n-0x34, 0x96, 0x16, 0xea, 0x70, 0x59, 0x1a, 0x32, 0x79, 0x79, 0x0b, 0xb6, 0x88, 0x7f, 0x0f, 0x52,\n-0x48, 0x3d, 0xbf, 0x6c, 0xd8, 0xa2, 0x44, 0x2e, 0xd1, 0x4e, 0xb7, 0x72, 0x58, 0xd3, 0x89, 0x13,\n-0x95, 0xfe, 0x44, 0xab, 0xf8, 0xd7, 0x8b, 0x1b, 0x6e, 0x9c, 0xbc, 0x2c, 0xa0, 0x5b, 0xd5, 0x6a,\n-0x00, 0xaf, 0x5f, 0x37, 0xe1, 0xd5, 0xfa, 0x10, 0x0b, 0x98, 0x9c, 0x86, 0xe7, 0x26, 0x8f, 0xce,\n-0xf0, 0xec, 0x6e, 0x8a, 0x57, 0x0b, 0x80, 0xe3, 0x4e, 0xb2, 0xc0, 0xa0, 0x63, 0x61, 0x90, 0xba,\n-0x55, 0x68, 0x37, 0x74, 0x6a, 0xb6, 0x92, 0xdb, 0x9f, 0xa1, 0x86, 0x22, 0xb6, 0x65, 0x27, 0x0e,\n-0xec, 0xb6, 0x9f, 0x42, 0x60, 0xe4, 0x67, 0xc2, 0xb5, 0xda, 0x41, 0x0b, 0xc4, 0xd3, 0x8b, 0x61,\n-0x1b, 0xbc, 0xfa, 0x1f, 0x91, 0x2b, 0xd7, 0x44, 0x07, 0x5e, 0xba, 0x29, 0xac, 0xd9, 0xc5, 0xe9,\n-0xef, 0x53, 0x48, 0x5a, 0xeb, 0x80, 0xf1, 0x28, 0x58, 0x21, 0xcd, 0xb0, 0x06, 0x55, 0xfb, 0x27,\n-0x3f, 0x53, 0x90, 0x70, 0xa9, 0x04, 0x1e, 0x57, 0x27, 0xb9, 0x30, 0x82, 0x05, 0x83, 0x30, 0x82,\n-0x03, 0x6b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0f, 0x5d, 0x93, 0x8d, 0x30, 0x67, 0x36, 0xc8,\n-0x06, 0x1d, 0x1a, 0xc7, 0x54, 0x84, 0x69, 0x07, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n-0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,\n-0x08, 0x46, 0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55,\n-0x04, 0x0b, 0x0c, 0x10, 0x41, 0x43, 0x20, 0x52, 0x41, 0x49, 0x5a, 0x20, 0x46, 0x4e, 0x4d, 0x54,\n-0x2d, 0x52, 0x43, 0x4d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x30, 0x32, 0x39, 0x31, 0x35,\n-0x35, 0x39, 0x35, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30,\n-0x30, 0x30, 0x30, 0x5a, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x45, 0x53, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x46, 0x4e,\n-0x4d, 0x54, 0x2d, 0x52, 0x43, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c,\n-0x10, 0x41, 0x43, 0x20, 0x52, 0x41, 0x49, 0x5a, 0x20, 0x46, 0x4e, 0x4d, 0x54, 0x2d, 0x52, 0x43,\n-0x4d, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02,\n-0x01, 0x00, 0xba, 0x71, 0x80, 0x7a, 0x4c, 0x86, 0x6e, 0x7f, 0xc8, 0x13, 0x6d, 0xc0, 0xc6, 0x7d,\n-0x1c, 0x00, 0x97, 0x8f, 0x2c, 0x0c, 0x23, 0xbb, 0x10, 0x9a, 0x40, 0xa9, 0x1a, 0xb7, 0x87, 0x88,\n-0xf8, 0x9b, 0x56, 0x6a, 0xfb, 0xe6, 0x7b, 0x8e, 0x8b, 0x92, 0x8e, 0xa7, 0x25, 0x5d, 0x59, 0x11,\n-0xdb, 0x36, 0x2e, 0xb7, 0x51, 0x17, 0x1f, 0xa9, 0x08, 0x1f, 0x04, 0x17, 0x24, 0x58, 0xaa, 0x37,\n-0x4a, 0x18, 0xdf, 0xe5, 0x39, 0xd4, 0x57, 0xfd, 0xd7, 0xc1, 0x2c, 0x91, 0x01, 0x91, 0xe2, 0x22,\n-0xd4, 0x03, 0xc0, 0x58, 0xfc, 0x77, 0x47, 0xec, 0x8f, 0x3e, 0x74, 0x43, 0xba, 0xac, 0x34, 0x8d,\n-0x4d, 0x38, 0x76, 0x67, 0x8e, 0xb0, 0xc8, 0x6f, 0x30, 0x33, 0x58, 0x71, 0x5c, 0xb4, 0xf5, 0x6b,\n-0x6e, 0xd4, 0x01, 0x50, 0xb8, 0x13, 0x7e, 0x6c, 0x4a, 0xa3, 0x49, 0xd1, 0x20, 0x19, 0xee, 0xbc,\n-0xc0, 0x29, 0x18, 0x65, 0xa7, 0xde, 0xfe, 0xef, 0xdd, 0x0a, 0x90, 0x21, 0xe7, 0x1a, 0x67, 0x92,\n-0x42, 0x10, 0x98, 0x5f, 0x4f, 0x30, 0xbc, 0x3e, 0x1c, 0x45, 0xb4, 0x10, 0xd7, 0x68, 0x40, 0x14,\n-0xc0, 0x40, 0xfa, 0xe7, 0x77, 0x17, 0x7a, 0xe6, 0x0b, 0x8f, 0x65, 0x5b, 0x3c, 0xd9, 0x9a, 0x52,\n-0xdb, 0xb5, 0xbd, 0x9e, 0x46, 0xcf, 0x3d, 0xeb, 0x91, 0x05, 0x02, 0xc0, 0x96, 0xb2, 0x76, 0x4c,\n-0x4d, 0x10, 0x96, 0x3b, 0x92, 0xfa, 0x9c, 0x7f, 0x0f, 0x99, 0xdf, 0xbe, 0x23, 0x35, 0x45, 0x1e,\n-0x02, 0x5c, 0xfe, 0xb5, 0xa8, 0x9b, 0x99, 0x25, 0xda, 0x5e, 0xf3, 0x22, 0xc3, 0x39, 0xf5, 0xe4,\n-0x2a, 0x2e, 0xd3, 0xc6, 0x1f, 0xc4, 0x6c, 0xaa, 0xc5, 0x1c, 0x6a, 0x01, 0x05, 0x4a, 0x2f, 0xd2,\n-0xc5, 0xc1, 0xa8, 0x34, 0x26, 0x5d, 0x66, 0xa5, 0xd2, 0x02, 0x21, 0xf9, 0x18, 0xb7, 0x06, 0xf5,\n-0x4e, 0x99, 0x6f, 0xa8, 0xab, 0x4c, 0x51, 0xe8, 0xcf, 0x50, 0x18, 0xc5, 0x77, 0xc8, 0x39, 0x09,\n-0x2c, 0x49, 0x92, 0x32, 0x99, 0xa8, 0xbb, 0x17, 0x17, 0x79, 0xb0, 0x5a, 0xc5, 0xe6, 0xa3, 0xc4,\n-0x59, 0x65, 0x47, 0x35, 0x83, 0x5e, 0xa9, 0xe8, 0x35, 0x0b, 0x99, 0xbb, 0xe4, 0xcd, 0x20, 0xc6,\n-0x9b, 0x4a, 0x06, 0x39, 0xb5, 0x68, 0xfc, 0x22, 0xba, 0xee, 0x55, 0x8c, 0x2b, 0x4e, 0xea, 0xf3,\n-0xb1, 0xe3, 0xfc, 0xb6, 0x99, 0x9a, 0xd5, 0x42, 0xfa, 0x71, 0x4d, 0x08, 0xcf, 0x87, 0x1e, 0x6a,\n-0x71, 0x7d, 0xf9, 0xd3, 0xb4, 0xe9, 0xa5, 0x71, 0x81, 0x7b, 0xc2, 0x4e, 0x47, 0x96, 0xa5, 0xf6,\n-0x76, 0x85, 0xa3, 0x28, 0x8f, 0xe9, 0x80, 0x6e, 0x81, 0x53, 0xa5, 0x6d, 0x5f, 0xb8, 0x48, 0xf9,\n-0xc2, 0xf9, 0x36, 0xa6, 0x2e, 0x49, 0xff, 0xb8, 0x96, 0xc2, 0x8c, 0x07, 0xb3, 0x9b, 0x88, 0x58,\n-0xfc, 0xeb, 0x1b, 0x1c, 0xde, 0x2d, 0x70, 0xe2, 0x97, 0x92, 0x30, 0xa1, 0x89, 0xe3, 0xbc, 0x55,\n-0xa8, 0x27, 0xd6, 0x4b, 0xed, 0x90, 0xad, 0x8b, 0xfa, 0x63, 0x25, 0x59, 0x2d, 0xa8, 0x35, 0xdd,\n-0xca, 0x97, 0x33, 0xbc, 0xe5, 0xcd, 0xc7, 0x9d, 0xd1, 0xec, 0xef, 0x5e, 0x0e, 0x4a, 0x90, 0x06,\n-0x26, 0x63, 0xad, 0xb9, 0xd9, 0x35, 0x2d, 0x07, 0xba, 0x76, 0x65, 0x2c, 0xac, 0x57, 0x8f, 0x7d,\n-0xf4, 0x07, 0x94, 0xd7, 0x81, 0x02, 0x96, 0x5d, 0xa3, 0x07, 0x49, 0xd5, 0x7a, 0xd0, 0x57, 0xf9,\n-0x1b, 0xe7, 0x53, 0x46, 0x75, 0xaa, 0xb0, 0x79, 0x42, 0xcb, 0x68, 0x71, 0x08, 0xe9, 0x60, 0xbd,\n-0x39, 0x69, 0xce, 0xf4, 0xaf, 0xc3, 0x56, 0x40, 0xc7, 0xad, 0x52, 0xa2, 0x09, 0xe4, 0x6f, 0x86,\n-0x47, 0x8a, 0x1f, 0xeb, 0x28, 0x27, 0x5d, 0x83, 0x20, 0xaf, 0x04, 0xc9, 0x6c, 0x56, 0x9a, 0x8b,\n-0x46, 0xf5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x83, 0x30, 0x81, 0x80, 0x30, 0x0f, 0x06,\n-0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e,\n-0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d,\n-0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xf7, 0x7d, 0xc5, 0xfd, 0xc4, 0xe8, 0x9a,\n-0x1b, 0x77, 0x64, 0xa7, 0xf5, 0x1d, 0xa0, 0xcc, 0xbf, 0x87, 0x60, 0x9a, 0x6d, 0x30, 0x3e, 0x06,\n-0x03, 0x55, 0x1d, 0x20, 0x04, 0x37, 0x30, 0x35, 0x30, 0x33, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00,\n-0x30, 0x2b, 0x30, 0x29, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1d,\n-0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x2e,\n-0x66, 0x6e, 0x6d, 0x74, 0x2e, 0x65, 0x73, 0x2f, 0x64, 0x70, 0x63, 0x73, 0x2f, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,\n-0x00, 0x07, 0x90, 0x4a, 0xdf, 0xf3, 0x23, 0x4e, 0xf0, 0xc3, 0x9c, 0x51, 0x65, 0x9b, 0x9c, 0x22,\n-0xa2, 0x8a, 0x0c, 0x85, 0xf3, 0x73, 0x29, 0x6b, 0x4d, 0xfe, 0x01, 0xe2, 0xa9, 0x0c, 0x63, 0x01,\n-0xbf, 0x04, 0x67, 0xa5, 0x9d, 0x98, 0x5f, 0xfd, 0x01, 0x13, 0xfa, 0xec, 0x9a, 0x62, 0xe9, 0x86,\n-0xfe, 0xb6, 0x62, 0xd2, 0x6e, 0x4c, 0x94, 0xfb, 0xc0, 0x75, 0x45, 0x7c, 0x65, 0x0c, 0xf8, 0xb2,\n-0x37, 0xcf, 0xac, 0x0f, 0xcf, 0x8d, 0x6f, 0xf9, 0x19, 0xf7, 0x8f, 0xec, 0x1e, 0xf2, 0x70, 0x9e,\n-0xf0, 0xca, 0xb8, 0xef, 0xb7, 0xff, 0x76, 0x37, 0x76, 0x5b, 0xf6, 0x6e, 0x88, 0xf3, 0xaf, 0x62,\n-0x32, 0x22, 0x93, 0x0d, 0x3a, 0x6a, 0x8e, 0x14, 0x66, 0x0c, 0x2d, 0x53, 0x74, 0x57, 0x65, 0x1e,\n-0xd5, 0xb2, 0xdd, 0x23, 0x81, 0x3b, 0xa5, 0x66, 0x23, 0x27, 0x67, 0x09, 0x8f, 0xe1, 0x77, 0xaa,\n-0x43, 0xcd, 0x65, 0x51, 0x08, 0xed, 0x51, 0x58, 0xfe, 0xe6, 0x39, 0xf9, 0xcb, 0x47, 0x84, 0xa4,\n-0x15, 0xf1, 0x76, 0xbb, 0xa4, 0xee, 0xa4, 0x3b, 0xc4, 0x5f, 0xef, 0xb2, 0x33, 0x96, 0x11, 0x18,\n-0xb7, 0xc9, 0x65, 0xbe, 0x18, 0xe1, 0xa3, 0xa4, 0xdc, 0xfa, 0x18, 0xf9, 0xd3, 0xbc, 0x13, 0x9b,\n-0x39, 0x7a, 0x34, 0xba, 0xd3, 0x41, 0xfb, 0xfa, 0x32, 0x8a, 0x2a, 0xb7, 0x2b, 0x86, 0x0b, 0x69,\n-0x83, 0x38, 0xbe, 0xcd, 0x8a, 0x2e, 0x0b, 0x70, 0xad, 0x8d, 0x26, 0x92, 0xee, 0x1e, 0xf5, 0x01,\n-0x2b, 0x0a, 0xd9, 0xd6, 0x97, 0x9b, 0x6e, 0xe0, 0xa8, 0x19, 0x1c, 0x3a, 0x21, 0x8b, 0x0c, 0x1e,\n-0x40, 0xad, 0x03, 0xe7, 0xdd, 0x66, 0x7e, 0xf5, 0xb9, 0x20, 0x0d, 0x03, 0xe8, 0x96, 0xf9, 0x82,\n-0x45, 0xd4, 0x39, 0xe0, 0xa0, 0x00, 0x5d, 0xd7, 0x98, 0xe6, 0x7d, 0x9e, 0x67, 0x73, 0xc3, 0x9a,\n-0x2a, 0xf7, 0xab, 0x8b, 0xa1, 0x3a, 0x14, 0xef, 0x34, 0xbc, 0x52, 0x0e, 0x89, 0x98, 0x9a, 0x04,\n-0x40, 0x84, 0x1d, 0x7e, 0x45, 0x69, 0x93, 0x57, 0xce, 0xeb, 0xce, 0xf8, 0x50, 0x7c, 0x4f, 0x1c,\n-0x6e, 0x04, 0x43, 0x9b, 0xf9, 0xd6, 0x3b, 0x23, 0x18, 0xe9, 0xea, 0x8e, 0xd1, 0x4d, 0x46, 0x8d,\n-0xf1, 0x3b, 0xe4, 0x6a, 0xca, 0xba, 0xfb, 0x23, 0xb7, 0x9b, 0xfa, 0x99, 0x01, 0x29, 0x5a, 0x58,\n-0x5a, 0x2d, 0xe3, 0xf9, 0xd4, 0x6d, 0x0e, 0x26, 0xad, 0xc1, 0x6e, 0x34, 0xbc, 0x32, 0xf8, 0x0c,\n-0x05, 0xfa, 0x65, 0xa3, 0xdb, 0x3b, 0x37, 0x83, 0x22, 0xe9, 0xd6, 0xdc, 0x72, 0x33, 0xfd, 0x5d,\n-0xf2, 0x20, 0xbd, 0x76, 0x3c, 0x23, 0xda, 0x28, 0xf7, 0xf9, 0x1b, 0xeb, 0x59, 0x64, 0xd5, 0xdc,\n-0x5f, 0x72, 0x7e, 0x20, 0xfc, 0xcd, 0x89, 0xb5, 0x90, 0x67, 0x4d, 0x62, 0x7a, 0x3f, 0x4e, 0xad,\n-0x1d, 0xc3, 0x39, 0xfe, 0x7a, 0xf4, 0x28, 0x16, 0xdf, 0x41, 0xf6, 0x48, 0x80, 0x05, 0xd7, 0x0f,\n-0x51, 0x79, 0xac, 0x10, 0xab, 0xd4, 0xec, 0x03, 0x66, 0xe6, 0x6a, 0xb0, 0xba, 0x31, 0x92, 0x42,\n-0x40, 0x6a, 0xbe, 0x3a, 0xd3, 0x72, 0xe1, 0x6a, 0x37, 0x55, 0xbc, 0xac, 0x1d, 0x95, 0xb7, 0x69,\n-0x61, 0xf2, 0x43, 0x91, 0x74, 0xe6, 0xa0, 0xd3, 0x0a, 0x24, 0x46, 0xa1, 0x08, 0xaf, 0xd6, 0xda,\n-0x45, 0x19, 0x96, 0xd4, 0x53, 0x1d, 0x5b, 0x84, 0x79, 0xf0, 0xc0, 0xf7, 0x47, 0xef, 0x8b, 0x8f,\n-0xc5, 0x06, 0xae, 0x9d, 0x4c, 0x62, 0x9d, 0xff, 0x46, 0x04, 0xf8, 0xd3, 0xc9, 0xb6, 0x10, 0x25,\n-0x40, 0x75, 0xfe, 0x16, 0xaa, 0xc9, 0x4a, 0x60, 0x86, 0x2f, 0xba, 0xef, 0x30, 0x77, 0xe4, 0x54,\n-0xe2, 0xb8, 0x84, 0x99, 0x58, 0x80, 0xaa, 0x13, 0x8b, 0x51, 0x3a, 0x4f, 0x48, 0xf6, 0x8b, 0xb6,\n-0xb3, 0x30, 0x82, 0x05, 0x8d, 0x30, 0x82, 0x03, 0x75, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04,\n-0x18, 0x4a, 0xcc, 0xd6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n-0x0b, 0x05, 0x00, 0x30, 0x56, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x43, 0x4e, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x27, 0x43, 0x68, 0x69,\n-0x6e, 0x61, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72,\n-0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n-0x72, 0x69, 0x74, 0x79, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x43,\n-0x46, 0x43, 0x41, 0x20, 0x45, 0x56, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n-0x32, 0x30, 0x38, 0x30, 0x38, 0x30, 0x33, 0x30, 0x37, 0x30, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x39,\n-0x31, 0x32, 0x33, 0x31, 0x30, 0x33, 0x30, 0x37, 0x30, 0x31, 0x5a, 0x30, 0x56, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x0c, 0x27, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e,\n-0x63, 0x69, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n-0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x15, 0x30, 0x13,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x43, 0x46, 0x43, 0x41, 0x20, 0x45, 0x56, 0x20, 0x52,\n-0x4f, 0x4f, 0x54, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n-0x82, 0x02, 0x01, 0x00, 0xd7, 0x5d, 0x6b, 0xcd, 0x10, 0x3f, 0x1f, 0x05, 0x59, 0xd5, 0x05, 0x4d,\n-0x37, 0xb1, 0x0e, 0xec, 0x98, 0x2b, 0x8e, 0x15, 0x1d, 0xfa, 0x93, 0x4b, 0x17, 0x82, 0x21, 0x71,\n-0x10, 0x52, 0xd7, 0x51, 0x64, 0x70, 0x16, 0xc2, 0x55, 0x69, 0x4d, 0x8e, 0x15, 0x6d, 0x9f, 0xbf,\n-0x0c, 0x1b, 0xc2, 0xe0, 0xa3, 0x67, 0xd6, 0x0c, 0xac, 0xcf, 0x22, 0xae, 0xaf, 0x77, 0x54, 0x2a,\n-0x4b, 0x4c, 0x8a, 0x53, 0x52, 0x7a, 0xc3, 0xee, 0x2e, 0xde, 0xb3, 0x71, 0x25, 0xc1, 0xe9, 0x5d,\n-0x3d, 0xee, 0xa1, 0x2f, 0xa3, 0xf7, 0x2a, 0x3c, 0xc9, 0x23, 0x1d, 0x6a, 0xab, 0x1d, 0xa1, 0xa7,\n-0xf1, 0xf3, 0xec, 0xa0, 0xd5, 0x44, 0xcf, 0x15, 0xcf, 0x72, 0x2f, 0x1d, 0x63, 0x97, 0xe8, 0x99,\n-0xf9, 0xfd, 0x93, 0xa4, 0x54, 0x80, 0x4c, 0x52, 0xd4, 0x52, 0xab, 0x2e, 0x49, 0xdf, 0x90, 0xcd,\n-0xb8, 0x5f, 0xbe, 0x3f, 0xde, 0xa1, 0xca, 0x4d, 0x20, 0xd4, 0x25, 0xe8, 0x84, 0x29, 0x53, 0xb7,\n-0xb1, 0x88, 0x1f, 0xff, 0xfa, 0xda, 0x90, 0x9f, 0x0a, 0xa9, 0x2d, 0x41, 0x3f, 0xb1, 0xf1, 0x18,\n-0x29, 0xee, 0x16, 0x59, 0x2c, 0x34, 0x49, 0x1a, 0xa8, 0x06, 0xd7, 0xa8, 0x88, 0xd2, 0x03, 0x72,\n-0x7a, 0x32, 0xe2, 0xea, 0x68, 0x4d, 0x6e, 0x2c, 0x96, 0x65, 0x7b, 0xca, 0x59, 0xfa, 0xf2, 0xe2,\n-0xdd, 0xee, 0x30, 0x2c, 0xfb, 0xcc, 0x46, 0xac, 0xc4, 0x63, 0xeb, 0x6f, 0x7f, 0x36, 0x2b, 0x34,\n-0x73, 0x12, 0x94, 0x7f, 0xdf, 0xcc, 0x26, 0x9e, 0xf1, 0x72, 0x5d, 0x50, 0x65, 0x59, 0x8f, 0x69,\n-0xb3, 0x87, 0x5e, 0x32, 0x6f, 0xc3, 0x18, 0x8a, 0xb5, 0x95, 0x8f, 0xb0, 0x7a, 0x37, 0xde, 0x5a,\n-0x45, 0x3b, 0xc7, 0x36, 0xe1, 0xef, 0x67, 0xd1, 0x39, 0xd3, 0x97, 0x5b, 0x73, 0x62, 0x19, 0x48,\n-0x2d, 0x87, 0x1c, 0x06, 0xfb, 0x74, 0x98, 0x20, 0x49, 0x73, 0xf0, 0x05, 0xd2, 0x1b, 0xb1, 0xa0,\n-0xa3, 0xb7, 0x1b, 0x70, 0xd3, 0x88, 0x69, 0xb9, 0x5a, 0xd6, 0x38, 0xf4, 0x62, 0xdc, 0x25, 0x8b,\n-0x78, 0xbf, 0xf8, 0xe8, 0x7e, 0xb8, 0x5c, 0xc9, 0x95, 0x4f, 0x5f, 0xa7, 0x2d, 0xb9, 0x20, 0x6b,\n-0xcf, 0x6b, 0xdd, 0xf5, 0x0d, 0xf4, 0x82, 0xb7, 0xf4, 0xb2, 0x66, 0x2e, 0x10, 0x28, 0xf6, 0x97,\n-0x5a, 0x7b, 0x96, 0x16, 0x8f, 0x01, 0x19, 0x2d, 0x6c, 0x6e, 0x7f, 0x39, 0x58, 0x06, 0x64, 0x83,\n-0x01, 0x83, 0x83, 0xc3, 0x4d, 0x92, 0xdd, 0x32, 0xc6, 0x87, 0xa4, 0x37, 0xe9, 0x16, 0xce, 0xaa,\n-0x2d, 0x68, 0xaf, 0x0a, 0x81, 0x65, 0x3a, 0x70, 0xc1, 0x9b, 0xad, 0x4d, 0x6d, 0x54, 0xca, 0x2a,\n-0x2d, 0x4b, 0x85, 0x1b, 0xb3, 0x80, 0xe6, 0x70, 0x45, 0x0d, 0x6b, 0x5e, 0x35, 0xf0, 0x7f, 0x3b,\n-0xb8, 0x9c, 0xe4, 0x04, 0x70, 0x89, 0x12, 0x25, 0x93, 0xda, 0x0a, 0x99, 0x22, 0x60, 0x6a, 0x63,\n-0x60, 0x4e, 0x76, 0x06, 0x98, 0x4e, 0xbd, 0x83, 0xad, 0x1d, 0x58, 0x8a, 0x25, 0x85, 0xd2, 0xc7,\n-0x65, 0x1e, 0x2d, 0x8e, 0xc6, 0xdf, 0xb6, 0xc6, 0xe1, 0x7f, 0x8a, 0x04, 0x21, 0x15, 0x29, 0x74,\n-0xf0, 0x3e, 0x9c, 0x90, 0x9d, 0x0c, 0x2e, 0xf1, 0x8a, 0x3e, 0x5a, 0xaa, 0x0c, 0x09, 0x1e, 0xc7,\n-0xd5, 0x3c, 0xa3, 0xed, 0x97, 0xc3, 0x1e, 0x34, 0xfa, 0x38, 0xf9, 0x08, 0x0e, 0xe3, 0xc0, 0x5d,\n-0x2b, 0x83, 0xd1, 0x56, 0x6a, 0xc9, 0xb6, 0xa8, 0x54, 0x53, 0x2e, 0x78, 0x32, 0x67, 0x3d, 0x82,\n-0x7f, 0x74, 0xd0, 0xfb, 0xe1, 0xb6, 0x05, 0x60, 0xb9, 0x70, 0xdb, 0x8e, 0x0b, 0xf9, 0x13, 0x58,\n-0x6f, 0x71, 0x60, 0x10, 0x52, 0x10, 0xb9, 0xc1, 0x41, 0x09, 0xef, 0x72, 0x1f, 0x67, 0x31, 0x78,\n-0xff, 0x96, 0x05, 0x8d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1f, 0x06,\n-0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xe3, 0xfe, 0x2d, 0xfd, 0x28, 0xd0,\n-0x0b, 0xb5, 0xba, 0xb6, 0xa2, 0xc4, 0xbf, 0x06, 0xaa, 0x05, 0x8c, 0x93, 0xfb, 0x2f, 0x30, 0x0f,\n-0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n-0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n-0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe3, 0xfe, 0x2d, 0xfd, 0x28, 0xd0,\n-0x0b, 0xb5, 0xba, 0xb6, 0xa2, 0xc4, 0xbf, 0x06, 0xaa, 0x05, 0x8c, 0x93, 0xfb, 0x2f, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02,\n-0x01, 0x00, 0x25, 0xc6, 0xba, 0x6b, 0xeb, 0x87, 0xcb, 0xde, 0x82, 0x39, 0x96, 0x3d, 0xf0, 0x44,\n-0xa7, 0x6b, 0x84, 0x73, 0x03, 0xde, 0x9d, 0x2b, 0x4f, 0xba, 0x20, 0x7f, 0xbc, 0x78, 0xb2, 0xcf,\n-0x97, 0xb0, 0x1b, 0x9c, 0xf3, 0xd7, 0x79, 0x2e, 0xf5, 0x48, 0xb6, 0xd2, 0xfb, 0x17, 0x88, 0xe6,\n-0xd3, 0x7a, 0x3f, 0xed, 0x53, 0x13, 0xd0, 0xe2, 0x2f, 0x6a, 0x79, 0xcb, 0x00, 0x23, 0x28, 0xe6,\n-0x1e, 0x37, 0x57, 0x35, 0x89, 0x84, 0xc2, 0x76, 0x4f, 0x34, 0x36, 0xad, 0x67, 0xc3, 0xce, 0x41,\n-0x06, 0x88, 0xc5, 0xf7, 0xee, 0xd8, 0x1a, 0xb8, 0xd6, 0x0b, 0x7f, 0x50, 0xff, 0x93, 0xaa, 0x17,\n-0x4b, 0x8c, 0xec, 0xed, 0x52, 0x60, 0xb2, 0xa4, 0x06, 0xea, 0x4e, 0xeb, 0xf4, 0x6b, 0x19, 0xfd,\n-0xeb, 0xf5, 0x1a, 0xe0, 0x25, 0x2a, 0x9a, 0xdc, 0xc7, 0x41, 0x36, 0xf7, 0xc8, 0x74, 0x05, 0x84,\n-0x39, 0x95, 0x39, 0xd6, 0x0b, 0x3b, 0xa4, 0x27, 0xfa, 0x08, 0xd8, 0x5c, 0x1e, 0xf8, 0x04, 0x60,\n-0x52, 0x11, 0x28, 0x28, 0x03, 0xff, 0xef, 0x53, 0x66, 0x00, 0xa5, 0x4a, 0x34, 0x16, 0x66, 0x7c,\n-0xfd, 0x09, 0xa4, 0xae, 0x9e, 0x67, 0x1a, 0x6f, 0x41, 0x0b, 0x6b, 0x06, 0x13, 0x9b, 0x8f, 0x86,\n-0x71, 0x05, 0xb4, 0x2f, 0x8d, 0x89, 0x66, 0x33, 0x29, 0x76, 0x54, 0x9a, 0x11, 0xf8, 0x27, 0xfa,\n-0xb2, 0x3f, 0x91, 0xe0, 0xce, 0x0d, 0x1b, 0xf3, 0x30, 0x1a, 0xad, 0xbf, 0x22, 0x5d, 0x1b, 0xd3,\n-0xbf, 0x25, 0x05, 0x4d, 0xe1, 0x92, 0x1a, 0x7f, 0x99, 0x9f, 0x3c, 0x44, 0x93, 0xca, 0xd4, 0x40,\n-0x49, 0x6c, 0x80, 0x87, 0xd7, 0x04, 0x3a, 0xc3, 0x32, 0x52, 0x35, 0x0e, 0x56, 0xf8, 0xa5, 0xdd,\n-0x7d, 0xc4, 0x8b, 0x0d, 0x11, 0x1f, 0x53, 0xcb, 0x1e, 0xb2, 0x17, 0xb6, 0x68, 0x77, 0x5a, 0xe0,\n-0xd4, 0xcb, 0xc8, 0x07, 0xae, 0xf5, 0x3a, 0x2e, 0x8e, 0x37, 0xb7, 0xd0, 0x01, 0x4b, 0x43, 0x29,\n-0x77, 0x8c, 0x39, 0x97, 0x8f, 0x82, 0x5a, 0xf8, 0x51, 0xe5, 0x89, 0xa0, 0x18, 0xe7, 0x68, 0x7f,\n-0x5d, 0x0a, 0x2e, 0xfb, 0xa3, 0x47, 0x0e, 0x3d, 0xa6, 0x23, 0x7a, 0xc6, 0x01, 0xc7, 0x8f, 0xc8,\n-0x5e, 0xbf, 0x6d, 0x80, 0x56, 0xbe, 0x8a, 0x24, 0xba, 0x33, 0xea, 0x9f, 0xe1, 0x32, 0x11, 0x9e,\n-0xf1, 0xd2, 0x4f, 0x80, 0xf6, 0x1b, 0x40, 0xaf, 0x38, 0x9e, 0x11, 0x50, 0x79, 0x73, 0x12, 0x12,\n-0xcd, 0xe6, 0x6c, 0x9d, 0x2c, 0x88, 0x72, 0x3c, 0x30, 0x81, 0x06, 0x91, 0x22, 0xea, 0x59, 0xad,\n-0xda, 0x19, 0x2e, 0x22, 0xc2, 0x8d, 0xb9, 0x8c, 0x87, 0xe0, 0x66, 0xbc, 0x73, 0x23, 0x5f, 0x21,\n-0x64, 0x63, 0x80, 0x48, 0xf5, 0xa0, 0x3c, 0x18, 0x3d, 0x94, 0xc8, 0x48, 0x41, 0x1d, 0x40, 0xba,\n-0x5e, 0xfe, 0xfe, 0x56, 0x39, 0xa1, 0xc8, 0xcf, 0x5e, 0x9e, 0x19, 0x64, 0x46, 0x10, 0xda, 0x17,\n-0x91, 0xb7, 0x05, 0x80, 0xac, 0x8b, 0x99, 0x92, 0x7d, 0xe7, 0xa2, 0xd8, 0x07, 0x0b, 0x36, 0x27,\n-0xe7, 0x48, 0x79, 0x60, 0x8a, 0xc3, 0xd7, 0x13, 0x5c, 0xf8, 0x72, 0x40, 0xdf, 0x4a, 0xcb, 0xcf,\n-0x99, 0x00, 0x0a, 0x00, 0x0b, 0x11, 0x95, 0xda, 0x56, 0x45, 0x03, 0x88, 0x0a, 0x9f, 0x67, 0xd0,\n-0xd5, 0x79, 0xb1, 0xa8, 0x8d, 0x40, 0x6d, 0x0d, 0xc2, 0x7a, 0x40, 0xfa, 0xf3, 0x5f, 0x64, 0x47,\n-0x92, 0xcb, 0x53, 0xb9, 0xbb, 0x59, 0xce, 0x4f, 0xfd, 0xd0, 0x15, 0x53, 0x01, 0xd8, 0xdf, 0xeb,\n-0xd9, 0xe6, 0x76, 0xef, 0xd0, 0x23, 0xbb, 0x3b, 0xa9, 0x79, 0xb3, 0xd5, 0x02, 0x29, 0xcd, 0x89,\n-0xa3, 0x96, 0x0f, 0x4a, 0x35, 0xe7, 0x4e, 0x42, 0xc0, 0x75, 0xcd, 0x07, 0xcf, 0xe6, 0x2c, 0xeb,\n-0x7b, 0x2e, 0x30, 0x82, 0x04, 0x15, 0x30, 0x82, 0x02, 0xfd, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n-0x06, 0x49, 0x41, 0x2c, 0xe4, 0x00, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa7, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n-0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c,\n-0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55,\n-0x04, 0x0a, 0x0c, 0x0c, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e,\n-0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x2e, 0x54, 0x61, 0x6e, 0xc3, 0xba,\n-0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0xc3, 0xb3, 0x6b,\n-0x20, 0x28, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n-0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x29, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x0c, 0x2c, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x41, 0x72, 0x61, 0x6e,\n-0x79, 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x29, 0x20, 0x46,\n-0xc5, 0x91, 0x74, 0x61, 0x6e, 0xc3, 0xba, 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79,\n-0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x32, 0x31, 0x31, 0x31, 0x35, 0x30, 0x38, 0x32, 0x31,\n-0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, 0x30, 0x36, 0x31, 0x35, 0x30, 0x38, 0x32, 0x31, 0x5a,\n-0x30, 0x81, 0xa7, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55,\n-0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70,\n-0x65, 0x73, 0x74, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x4e, 0x65,\n-0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03,\n-0x55, 0x04, 0x0b, 0x0c, 0x2e, 0x54, 0x61, 0x6e, 0xc3, 0xba, 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3,\n-0xa1, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0xc3, 0xb3, 0x6b, 0x20, 0x28, 0x43, 0x65, 0x72, 0x74,\n-0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n-0x65, 0x73, 0x29, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2c, 0x4e, 0x65,\n-0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x41, 0x72, 0x61, 0x6e, 0x79, 0x20, 0x28, 0x43, 0x6c, 0x61,\n-0x73, 0x73, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x29, 0x20, 0x46, 0xc5, 0x91, 0x74, 0x61, 0x6e, 0xc3,\n-0xba, 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,\n-0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc4, 0x24, 0x5e, 0x73, 0xbe,\n-0x4b, 0x6d, 0x14, 0xc3, 0xa1, 0xf4, 0xe3, 0x97, 0x90, 0x6e, 0xd2, 0x30, 0x45, 0x1e, 0x3c, 0xee,\n-0x67, 0xd9, 0x64, 0xe0, 0x1a, 0x8a, 0x7f, 0xca, 0x30, 0xca, 0x83, 0xe3, 0x20, 0xc1, 0xe3, 0xf4,\n-0x3a, 0xd3, 0x94, 0x5f, 0x1a, 0x7c, 0x5b, 0x6d, 0xbf, 0x30, 0x4f, 0x84, 0x27, 0xf6, 0x9f, 0x1f,\n-0x49, 0xbc, 0xc6, 0x99, 0x0a, 0x90, 0xf2, 0x0f, 0xf5, 0x7f, 0x43, 0x84, 0x37, 0x63, 0x51, 0x8b,\n-0x7a, 0xa5, 0x70, 0xfc, 0x7a, 0x58, 0xcd, 0x8e, 0x9b, 0xed, 0xc3, 0x46, 0x6c, 0x84, 0x70, 0x5d,\n-0xda, 0xf3, 0x01, 0x90, 0x23, 0xfc, 0x4e, 0x30, 0xa9, 0x7e, 0xe1, 0x27, 0x63, 0xe7, 0xed, 0x64,\n-0x3c, 0xa0, 0xb8, 0xc9, 0x33, 0x63, 0xfe, 0x16, 0x90, 0xff, 0xb0, 0xb8, 0xfd, 0xd7, 0xa8, 0xc0,\n-0xc0, 0x94, 0x43, 0x0b, 0xb6, 0xd5, 0x59, 0xa6, 0x9e, 0x56, 0xd0, 0x24, 0x1f, 0x70, 0x79, 0xaf,\n-0xdb, 0x39, 0x54, 0x0d, 0x65, 0x75, 0xd9, 0x15, 0x41, 0x94, 0x01, 0xaf, 0x5e, 0xec, 0xf6, 0x8d,\n-0xf1, 0xff, 0xad, 0x64, 0xfe, 0x20, 0x9a, 0xd7, 0x5c, 0xeb, 0xfe, 0xa6, 0x1f, 0x08, 0x64, 0xa3,\n-0x8b, 0x76, 0x55, 0xad, 0x1e, 0x3b, 0x28, 0x60, 0x2e, 0x87, 0x25, 0xe8, 0xaa, 0xaf, 0x1f, 0xc6,\n-0x64, 0x46, 0x20, 0xb7, 0x70, 0x7f, 0x3c, 0xde, 0x48, 0xdb, 0x96, 0x53, 0xb7, 0x39, 0x77, 0xe4,\n-0x1a, 0xe2, 0xc7, 0x16, 0x84, 0x76, 0x97, 0x5b, 0x2f, 0xbb, 0x19, 0x15, 0x85, 0xf8, 0x69, 0x85,\n-0xf5, 0x99, 0xa7, 0xa9, 0xf2, 0x34, 0xa7, 0xa9, 0xb6, 0xa6, 0x03, 0xfc, 0x6f, 0x86, 0x3d, 0x54,\n-0x7c, 0x76, 0x04, 0x9b, 0x6b, 0xf9, 0x40, 0x5d, 0x00, 0x34, 0xc7, 0x2e, 0x99, 0x75, 0x9d, 0xe5,\n-0x88, 0x03, 0xaa, 0x4d, 0xf8, 0x03, 0xd2, 0x42, 0x76, 0xc0, 0x1b, 0x02, 0x03, 0x00, 0xa8, 0x8b,\n-0xa3, 0x45, 0x30, 0x43, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08,\n-0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x04, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n-0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n-0x16, 0x04, 0x14, 0xcc, 0xfa, 0x67, 0x93, 0xf0, 0xb6, 0xb8, 0xd0, 0xa5, 0xc0, 0x1e, 0xf3, 0x53,\n-0xfd, 0x8c, 0x53, 0xdf, 0x83, 0xd7, 0x96, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xab, 0x7f, 0xee, 0x1c, 0x16,\n-0xa9, 0x9c, 0x3c, 0x51, 0x00, 0xa0, 0xc0, 0x11, 0x08, 0x05, 0xa7, 0x99, 0xe6, 0x6f, 0x01, 0x88,\n-0x54, 0x61, 0x6e, 0xf1, 0xb9, 0x18, 0xad, 0x4a, 0xad, 0xfe, 0x81, 0x40, 0x23, 0x94, 0x2f, 0xfb,\n-0x75, 0x7c, 0x2f, 0x28, 0x4b, 0x62, 0x24, 0x81, 0x82, 0x0b, 0xf5, 0x61, 0xf1, 0x1c, 0x6e, 0xb8,\n-0x61, 0x38, 0xeb, 0x81, 0xfa, 0x62, 0xa1, 0x3b, 0x5a, 0x62, 0xd3, 0x94, 0x65, 0xc4, 0xe1, 0xe6,\n-0x6d, 0x82, 0xf8, 0x2f, 0x25, 0x70, 0xb2, 0x21, 0x26, 0xc1, 0x72, 0x51, 0x1f, 0x8c, 0x2c, 0xc3,\n-0x84, 0x90, 0xc3, 0x5a, 0x8f, 0xba, 0xcf, 0xf4, 0xa7, 0x65, 0xa5, 0xeb, 0x98, 0xd1, 0xfb, 0x05,\n-0xb2, 0x46, 0x75, 0x15, 0x23, 0x6a, 0x6f, 0x85, 0x63, 0x30, 0x80, 0xf0, 0xd5, 0x9e, 0x1f, 0x29,\n-0x1c, 0xc2, 0x6c, 0xb0, 0x50, 0x59, 0x5d, 0x90, 0x5b, 0x3b, 0xa8, 0x0d, 0x30, 0xcf, 0xbf, 0x7d,\n-0x7f, 0xce, 0xf1, 0x9d, 0x83, 0xbd, 0xc9, 0x46, 0x6e, 0x20, 0xa6, 0xf9, 0x61, 0x51, 0xba, 0x21,\n-0x2f, 0x7b, 0xbe, 0xa5, 0x15, 0x63, 0xa1, 0xd4, 0x95, 0x87, 0xf1, 0x9e, 0xb9, 0xf3, 0x89, 0xf3,\n-0x3d, 0x85, 0xb8, 0xb8, 0xdb, 0xbe, 0xb5, 0xb9, 0x29, 0xf9, 0xda, 0x37, 0x05, 0x00, 0x49, 0x94,\n-0x03, 0x84, 0x44, 0xe7, 0xbf, 0x43, 0x31, 0xcf, 0x75, 0x8b, 0x25, 0xd1, 0xf4, 0xa6, 0x64, 0xf5,\n-0x92, 0xf6, 0xab, 0x05, 0xeb, 0x3d, 0xe9, 0xa5, 0x0b, 0x36, 0x62, 0xda, 0xcc, 0x06, 0x5f, 0x36,\n-0x8b, 0xb6, 0x5e, 0x31, 0xb8, 0x2a, 0xfb, 0x5e, 0xf6, 0x71, 0xdf, 0x44, 0x26, 0x9e, 0xc4, 0xe6,\n-0x0d, 0x91, 0xb4, 0x2e, 0x75, 0x95, 0x80, 0x51, 0x6a, 0x4b, 0x30, 0xa6, 0xb0, 0x62, 0xa1, 0x93,\n-0xf1, 0x9b, 0xd8, 0xce, 0xc4, 0x63, 0x75, 0x3f, 0x59, 0x47, 0xb1, 0x30, 0x82, 0x03, 0x4a, 0x30,\n-0x82, 0x02, 0x32, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x44, 0xaf, 0xb0, 0x80, 0xd6, 0xa3,\n-0x27, 0xba, 0x89, 0x30, 0x39, 0x86, 0x2e, 0xf8, 0x40, 0x6b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69,\n-0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f,\n-0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54, 0x20,\n-0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x58, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30,\n-0x30, 0x39, 0x33, 0x30, 0x32, 0x31, 0x31, 0x32, 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30,\n-0x39, 0x33, 0x30, 0x31, 0x34, 0x30, 0x31, 0x31, 0x35, 0x5a, 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53,\n-0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43,\n-0x6f, 0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54,\n-0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x58, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30,\n-0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82,\n-0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdf, 0xaf, 0xe9, 0x97,\n-0x50, 0x08, 0x83, 0x57, 0xb4, 0xcc, 0x62, 0x65, 0xf6, 0x90, 0x82, 0xec, 0xc7, 0xd3, 0x2c, 0x6b,\n-0x30, 0xca, 0x5b, 0xec, 0xd9, 0xc3, 0x7d, 0xc7, 0x40, 0xc1, 0x18, 0x14, 0x8b, 0xe0, 0xe8, 0x33,\n-0x76, 0x49, 0x2a, 0xe3, 0x3f, 0x21, 0x49, 0x93, 0xac, 0x4e, 0x0e, 0xaf, 0x3e, 0x48, 0xcb, 0x65,\n-0xee, 0xfc, 0xd3, 0x21, 0x0f, 0x65, 0xd2, 0x2a, 0xd9, 0x32, 0x8f, 0x8c, 0xe5, 0xf7, 0x77, 0xb0,\n-0x12, 0x7b, 0xb5, 0x95, 0xc0, 0x89, 0xa3, 0xa9, 0xba, 0xed, 0x73, 0x2e, 0x7a, 0x0c, 0x06, 0x32,\n-0x83, 0xa2, 0x7e, 0x8a, 0x14, 0x30, 0xcd, 0x11, 0xa0, 0xe1, 0x2a, 0x38, 0xb9, 0x79, 0x0a, 0x31,\n-0xfd, 0x50, 0xbd, 0x80, 0x65, 0xdf, 0xb7, 0x51, 0x63, 0x83, 0xc8, 0xe2, 0x88, 0x61, 0xea, 0x4b,\n-0x61, 0x81, 0xec, 0x52, 0x6b, 0xb9, 0xa2, 0xe2, 0x4b, 0x1a, 0x28, 0x9f, 0x48, 0xa3, 0x9e, 0x0c,\n-0xda, 0x09, 0x8e, 0x3e, 0x17, 0x2e, 0x1e, 0xdd, 0x20, 0xdf, 0x5b, 0xc6, 0x2a, 0x8a, 0xab, 0x2e,\n-0xbd, 0x70, 0xad, 0xc5, 0x0b, 0x1a, 0x25, 0x90, 0x74, 0x72, 0xc5, 0x7b, 0x6a, 0xab, 0x34, 0xd6,\n-0x30, 0x89, 0xff, 0xe5, 0x68, 0x13, 0x7b, 0x54, 0x0b, 0xc8, 0xd6, 0xae, 0xec, 0x5a, 0x9c, 0x92,\n-0x1e, 0x3d, 0x64, 0xb3, 0x8c, 0xc6, 0xdf, 0xbf, 0xc9, 0x41, 0x70, 0xec, 0x16, 0x72, 0xd5, 0x26,\n-0xec, 0x38, 0x55, 0x39, 0x43, 0xd0, 0xfc, 0xfd, 0x18, 0x5c, 0x40, 0xf1, 0x97, 0xeb, 0xd5, 0x9a,\n-0x9b, 0x8d, 0x1d, 0xba, 0xda, 0x25, 0xb9, 0xc6, 0xd8, 0xdf, 0xc1, 0x15, 0x02, 0x3a, 0xab, 0xda,\n-0x6e, 0xf1, 0x3e, 0x2e, 0xf5, 0x5c, 0x08, 0x9c, 0x3c, 0xd6, 0x83, 0x69, 0xe4, 0x10, 0x9b, 0x19,\n-0x2a, 0xb6, 0x29, 0x57, 0xe3, 0xe5, 0x3d, 0x9b, 0x9f, 0xf0, 0x02, 0x5d, 0x02, 0x03, 0x01, 0x00,\n-0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n-0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n-0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n-0x14, 0xc4, 0xa7, 0xb1, 0xa4, 0x7b, 0x2c, 0x71, 0xfa, 0xdb, 0xe1, 0x4b, 0x90, 0x75, 0xff, 0xc4,\n-0x15, 0x60, 0x85, 0x89, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x1a, 0x2c, 0x9b, 0x17, 0x00, 0x5c,\n-0xa9, 0x1e, 0xee, 0x28, 0x66, 0x37, 0x3a, 0xbf, 0x83, 0xc7, 0x3f, 0x4b, 0xc3, 0x09, 0xa0, 0x95,\n-0x20, 0x5d, 0xe3, 0xd9, 0x59, 0x44, 0xd2, 0x3e, 0x0d, 0x3e, 0xbd, 0x8a, 0x4b, 0xa0, 0x74, 0x1f,\n-0xce, 0x10, 0x82, 0x9c, 0x74, 0x1a, 0x1d, 0x7e, 0x98, 0x1a, 0xdd, 0xcb, 0x13, 0x4b, 0xb3, 0x20,\n-0x44, 0xe4, 0x91, 0xe9, 0xcc, 0xfc, 0x7d, 0xa5, 0xdb, 0x6a, 0xe5, 0xfe, 0xe6, 0xfd, 0xe0, 0x4e,\n-0xdd, 0xb7, 0x00, 0x3a, 0xb5, 0x70, 0x49, 0xaf, 0xf2, 0xe5, 0xeb, 0x02, 0xf1, 0xd1, 0x02, 0x8b,\n-0x19, 0xcb, 0x94, 0x3a, 0x5e, 0x48, 0xc4, 0x18, 0x1e, 0x58, 0x19, 0x5f, 0x1e, 0x02, 0x5a, 0xf0,\n-0x0c, 0xf1, 0xb1, 0xad, 0xa9, 0xdc, 0x59, 0x86, 0x8b, 0x6e, 0xe9, 0x91, 0xf5, 0x86, 0xca, 0xfa,\n-0xb9, 0x66, 0x33, 0xaa, 0x59, 0x5b, 0xce, 0xe2, 0xa7, 0x16, 0x73, 0x47, 0xcb, 0x2b, 0xcc, 0x99,\n-0xb0, 0x37, 0x48, 0xcf, 0xe3, 0x56, 0x4b, 0xf5, 0xcf, 0x0f, 0x0c, 0x72, 0x32, 0x87, 0xc6, 0xf0,\n-0x44, 0xbb, 0x53, 0x72, 0x6d, 0x43, 0xf5, 0x26, 0x48, 0x9a, 0x52, 0x67, 0xb7, 0x58, 0xab, 0xfe,\n-0x67, 0x76, 0x71, 0x78, 0xdb, 0x0d, 0xa2, 0x56, 0x14, 0x13, 0x39, 0x24, 0x31, 0x85, 0xa2, 0xa8,\n-0x02, 0x5a, 0x30, 0x47, 0xe1, 0xdd, 0x50, 0x07, 0xbc, 0x02, 0x09, 0x90, 0x00, 0xeb, 0x64, 0x63,\n-0x60, 0x9b, 0x16, 0xbc, 0x88, 0xc9, 0x12, 0xe6, 0xd2, 0x7d, 0x91, 0x8b, 0xf9, 0x3d, 0x32, 0x8d,\n-0x65, 0xb4, 0xe9, 0x7c, 0xb1, 0x57, 0x76, 0xea, 0xc5, 0xb6, 0x28, 0x39, 0xbf, 0x15, 0x65, 0x1c,\n-0xc8, 0xf6, 0x77, 0x96, 0x6a, 0x0a, 0x8d, 0x77, 0x0b, 0xd8, 0x91, 0x0b, 0x04, 0x8e, 0x07, 0xdb,\n-0x29, 0xb6, 0x0a, 0xee, 0x9d, 0x82, 0x35, 0x35, 0x10, 0x30, 0x82, 0x03, 0xe6, 0x30, 0x82, 0x02,\n-0xce, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x57, 0xcb, 0x33, 0x6f, 0xc2, 0x5c, 0x16, 0xe6,\n-0x47, 0x16, 0x17, 0xe3, 0x90, 0x31, 0x68, 0xe0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n-0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n-0x18, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f,\n-0x6e, 0x73, 0x20, 0x4c, 0x2e, 0x4c, 0x2e, 0x43, 0x2e, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x13, 0x27, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c, 0x75,\n-0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n-0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30,\n-0x36, 0x31, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39,\n-0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x62, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x13, 0x18, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c,\n-0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x4c, 0x2e, 0x4c, 0x2e, 0x43, 0x2e, 0x31, 0x30, 0x30,\n-0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x27, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20,\n-0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n-0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30,\n-0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n-0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00,\n-0xe4, 0xbc, 0x7e, 0x92, 0x30, 0x6d, 0xc6, 0xd8, 0x8e, 0x2b, 0x0b, 0xbc, 0x46, 0xce, 0xe0, 0x27,\n-0x96, 0xde, 0xde, 0xf9, 0xfa, 0x12, 0xd3, 0x3c, 0x33, 0x73, 0xb3, 0x04, 0x2f, 0xbc, 0x71, 0x8c,\n-0xe5, 0x9f, 0xb6, 0x22, 0x60, 0x3e, 0x5f, 0x5d, 0xce, 0x09, 0xff, 0x82, 0x0c, 0x1b, 0x9a, 0x51,\n-0x50, 0x1a, 0x26, 0x89, 0xdd, 0xd5, 0x61, 0x5d, 0x19, 0xdc, 0x12, 0x0f, 0x2d, 0x0a, 0xa2, 0x43,\n-0x5d, 0x17, 0xd0, 0x34, 0x92, 0x20, 0xea, 0x73, 0xcf, 0x38, 0x2c, 0x06, 0x26, 0x09, 0x7a, 0x72,\n-0xf7, 0xfa, 0x50, 0x32, 0xf8, 0xc2, 0x93, 0xd3, 0x69, 0xa2, 0x23, 0xce, 0x41, 0xb1, 0xcc, 0xe4,\n-0xd5, 0x1f, 0x36, 0xd1, 0x8a, 0x3a, 0xf8, 0x8c, 0x63, 0xe2, 0x14, 0x59, 0x69, 0xed, 0x0d, 0xd3,\n-0x7f, 0x6b, 0xe8, 0xb8, 0x03, 0xe5, 0x4f, 0x6a, 0xe5, 0x98, 0x63, 0x69, 0x48, 0x05, 0xbe, 0x2e,\n-0xff, 0x33, 0xb6, 0xe9, 0x97, 0x59, 0x69, 0xf8, 0x67, 0x19, 0xae, 0x93, 0x61, 0x96, 0x44, 0x15,\n-0xd3, 0x72, 0xb0, 0x3f, 0xbc, 0x6a, 0x7d, 0xec, 0x48, 0x7f, 0x8d, 0xc3, 0xab, 0xaa, 0x71, 0x2b,\n-0x53, 0x69, 0x41, 0x53, 0x34, 0xb5, 0xb0, 0xb9, 0xc5, 0x06, 0x0a, 0xc4, 0xb0, 0x45, 0xf5, 0x41,\n-0x5d, 0x6e, 0x89, 0x45, 0x7b, 0x3d, 0x3b, 0x26, 0x8c, 0x74, 0xc2, 0xe5, 0xd2, 0xd1, 0x7d, 0xb2,\n-0x11, 0xd4, 0xfb, 0x58, 0x32, 0x22, 0x9a, 0x80, 0xc9, 0xdc, 0xfd, 0x0c, 0xe9, 0x7f, 0x5e, 0x03,\n-0x97, 0xce, 0x3b, 0x00, 0x14, 0x87, 0x27, 0x70, 0x38, 0xa9, 0x8e, 0x6e, 0xb3, 0x27, 0x76, 0x98,\n-0x51, 0xe0, 0x05, 0xe3, 0x21, 0xab, 0x1a, 0xd5, 0x85, 0x22, 0x3c, 0x29, 0xb5, 0x9a, 0x16, 0xc5,\n-0x80, 0xa8, 0xf4, 0xbb, 0x6b, 0x30, 0x8f, 0x2f, 0x46, 0x02, 0xa2, 0xb1, 0x0c, 0x22, 0xe0, 0xd3,\n-0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x97, 0x30, 0x81, 0x94, 0x30, 0x1d, 0x06, 0x03, 0x55,\n-0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x21, 0x30, 0xc9, 0xfb, 0x00, 0xd7, 0x4e, 0x98, 0xda, 0x87,\n-0xaa, 0x2a, 0xd0, 0xa7, 0x2e, 0xb1, 0x40, 0x31, 0xa7, 0x4c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n-0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,\n-0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x52, 0x06, 0x03, 0x55,\n-0x1d, 0x1f, 0x04, 0x4b, 0x30, 0x49, 0x30, 0x47, 0xa0, 0x45, 0xa0, 0x43, 0x86, 0x41, 0x68, 0x74,\n-0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x6e, 0x65, 0x74, 0x73, 0x6f, 0x6c, 0x73,\n-0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f,\n-0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n-0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x63, 0x72, 0x6c, 0x30,\n-0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82,\n-0x01, 0x01, 0x00, 0xbb, 0xae, 0x4b, 0xe7, 0xb7, 0x57, 0xeb, 0x7f, 0xaa, 0x2d, 0xb7, 0x73, 0x47,\n-0x85, 0x6a, 0xc1, 0xe4, 0xa5, 0x1d, 0xe4, 0xe7, 0x3c, 0xe9, 0xf4, 0x59, 0x65, 0x77, 0xb5, 0x7a,\n-0x5b, 0x5a, 0x8d, 0x25, 0x36, 0xe0, 0x7a, 0x97, 0x2e, 0x38, 0xc0, 0x57, 0x60, 0x83, 0x98, 0x06,\n-0x83, 0x9f, 0xb9, 0x76, 0x7a, 0x6e, 0x50, 0xe0, 0xba, 0x88, 0x2c, 0xfc, 0x45, 0xcc, 0x18, 0xb0,\n-0x99, 0x95, 0x51, 0x0e, 0xec, 0x1d, 0xb8, 0x88, 0xff, 0x87, 0x50, 0x1c, 0x82, 0xc2, 0xe3, 0xe0,\n-0x32, 0x80, 0xbf, 0xa0, 0x0b, 0x47, 0xc8, 0xc3, 0x31, 0xef, 0x99, 0x67, 0x32, 0x80, 0x4f, 0x17,\n-0x21, 0x79, 0x0c, 0x69, 0x5c, 0xde, 0x5e, 0x34, 0xae, 0x02, 0xb5, 0x26, 0xea, 0x50, 0xdf, 0x7f,\n-0x18, 0x65, 0x2c, 0xc9, 0xf2, 0x63, 0xe1, 0xa9, 0x07, 0xfe, 0x7c, 0x71, 0x1f, 0x6b, 0x33, 0x24,\n-0x6a, 0x1e, 0x05, 0xf7, 0x05, 0x68, 0xc0, 0x6a, 0x12, 0xcb, 0x2e, 0x5e, 0x61, 0xcb, 0xae, 0x28,\n-0xd3, 0x7e, 0xc2, 0xb4, 0x66, 0x91, 0x26, 0x5f, 0x3c, 0x2e, 0x24, 0x5f, 0xcb, 0x58, 0x0f, 0xeb,\n-0x28, 0xec, 0xaf, 0x11, 0x96, 0xf3, 0xdc, 0x7b, 0x6f, 0xc0, 0xa7, 0x88, 0xf2, 0x53, 0x77, 0xb3,\n-0x60, 0x5e, 0xae, 0xae, 0x28, 0xda, 0x35, 0x2c, 0x6f, 0x34, 0x45, 0xd3, 0x26, 0xe1, 0xde, 0xec,\n-0x5b, 0x4f, 0x27, 0x6b, 0x16, 0x7c, 0xbd, 0x44, 0x04, 0x18, 0x82, 0xb3, 0x89, 0x79, 0x17, 0x10,\n-0x71, 0x3d, 0x7a, 0xa2, 0x16, 0x4e, 0xf5, 0x01, 0xcd, 0xa4, 0x6c, 0x65, 0x68, 0xa1, 0x49, 0x76,\n-0x5c, 0x43, 0xc9, 0xd8, 0xbc, 0x36, 0x67, 0x6c, 0xa5, 0x94, 0xb5, 0xd4, 0xcc, 0xb9, 0xbd, 0x6a,\n-0x35, 0x56, 0x21, 0xde, 0xd8, 0xc3, 0xeb, 0xfb, 0xcb, 0xa4, 0x60, 0x4c, 0xb0, 0x55, 0xa0, 0xa0,\n-0x7b, 0x57, 0xb2, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0, 0x03, 0x02, 0x01, 0x02,\n-0x02, 0x14, 0x78, 0x58, 0x5f, 0x2e, 0xad, 0x2c, 0x19, 0x4b, 0xe3, 0x37, 0x07, 0x35, 0x34, 0x13,\n-0x28, 0xb5, 0x96, 0xd4, 0x65, 0x93, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n-0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51,\n-0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31,\n-0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64,\n-0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x20, 0x47, 0x33, 0x30,\n-0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x37, 0x32, 0x37, 0x34, 0x34, 0x5a,\n-0x17, 0x0d, 0x34, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x37, 0x32, 0x37, 0x34, 0x34, 0x5a, 0x30,\n-0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19,\n-0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69,\n-0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55,\n-0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f,\n-0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x20, 0x47, 0x33, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f,\n-0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa0, 0xbe, 0x50, 0x10, 0x8e, 0xe9,\n-0xf2, 0x6c, 0x40, 0xb4, 0x04, 0x9c, 0x85, 0xb9, 0x31, 0xca, 0xdc, 0x2d, 0xe4, 0x11, 0xa9, 0x04,\n-0x3c, 0x1b, 0x55, 0xc1, 0xe7, 0x58, 0x30, 0x1d, 0x24, 0xb4, 0xc3, 0xef, 0x85, 0xde, 0x8c, 0x2c,\n-0xe1, 0xc1, 0x3d, 0xdf, 0x82, 0xe6, 0x4f, 0xad, 0x47, 0x87, 0x6c, 0xec, 0x5b, 0x49, 0xc1, 0x4a,\n-0xd5, 0xbb, 0x8f, 0xec, 0x87, 0xac, 0x7f, 0x82, 0x9a, 0x86, 0xec, 0x3d, 0x03, 0x99, 0x52, 0x01,\n-0xd2, 0x35, 0x9e, 0xac, 0xda, 0xf0, 0x53, 0xc9, 0x66, 0x3c, 0xd4, 0xac, 0x02, 0x01, 0xda, 0x24,\n-0xd3, 0x3b, 0xa8, 0x02, 0x46, 0xaf, 0xa4, 0x1c, 0xe3, 0xf8, 0x73, 0x58, 0x76, 0xb7, 0xf6, 0x0e,\n-0x90, 0x0d, 0xb5, 0xf0, 0xcf, 0xcc, 0xfa, 0xf9, 0xc6, 0x4c, 0xe5, 0xc3, 0x86, 0x30, 0x0a, 0x8d,\n-0x17, 0x7e, 0x35, 0xeb, 0xc5, 0xdf, 0xbb, 0x0e, 0x9c, 0xc0, 0x8d, 0x87, 0xe3, 0x88, 0x38, 0x85,\n-0x67, 0xfa, 0x3e, 0xc7, 0xab, 0xe0, 0x13, 0x9c, 0x05, 0x18, 0x98, 0xcf, 0x93, 0xf5, 0xb1, 0x92,\n-0xb4, 0xfc, 0x23, 0xd3, 0xcf, 0xd5, 0xc4, 0x27, 0x49, 0xe0, 0x9e, 0x3c, 0x9b, 0x08, 0xa3, 0x8b,\n-0x5d, 0x2a, 0x21, 0xe0, 0xfc, 0x39, 0xaa, 0x53, 0xda, 0x7d, 0x7e, 0xcf, 0x1a, 0x09, 0x53, 0xbc,\n-0x5d, 0x05, 0x04, 0xcf, 0xa1, 0x4a, 0x8f, 0x8b, 0x76, 0x82, 0x0d, 0xa1, 0xf8, 0xd2, 0xc7, 0x14,\n-0x77, 0x5b, 0x90, 0x36, 0x07, 0x81, 0x9b, 0x3e, 0x06, 0xfa, 0x52, 0x5e, 0x63, 0xc5, 0xa6, 0x00,\n-0xfe, 0xa5, 0xe9, 0x52, 0x1b, 0x52, 0xb5, 0x92, 0x39, 0x72, 0x03, 0x09, 0x62, 0xbd, 0xb0, 0x60,\n-0x16, 0x6e, 0xa6, 0xdd, 0x25, 0xc2, 0x03, 0x66, 0xdd, 0xf3, 0x04, 0xd1, 0x40, 0xe2, 0x4e, 0x8b,\n-0x86, 0xf4, 0x6f, 0xe5, 0x83, 0xa0, 0x27, 0x84, 0x5e, 0x04, 0xc1, 0xf5, 0x90, 0xbd, 0x30, 0x3d,\n-0xc4, 0xef, 0xa8, 0x69, 0xbc, 0x38, 0x9b, 0xa4, 0xa4, 0x96, 0xd1, 0x62, 0xda, 0x69, 0xc0, 0x01,\n-0x96, 0xae, 0xcb, 0xc4, 0x51, 0x34, 0xea, 0x0c, 0xaa, 0xff, 0x21, 0x8e, 0x59, 0x8f, 0x4a, 0x5c,\n-0xe4, 0x61, 0x9a, 0xa7, 0xd2, 0xe9, 0x2a, 0x78, 0x8d, 0x51, 0x3d, 0x3a, 0x15, 0xee, 0xa2, 0x59,\n-0x8e, 0xa9, 0x5c, 0xde, 0xc5, 0xf9, 0x90, 0x22, 0xe5, 0x88, 0x45, 0x71, 0xdd, 0x91, 0x99, 0x6c,\n-0x7a, 0x9f, 0x3d, 0x3d, 0x98, 0x7c, 0x5e, 0xf6, 0xbe, 0x16, 0x68, 0xa0, 0x5e, 0xae, 0x0b, 0x23,\n-0xfc, 0x5a, 0x0f, 0xaa, 0x22, 0x76, 0x2d, 0xc9, 0xa1, 0x10, 0x1d, 0xe4, 0xd3, 0x44, 0x23, 0x90,\n-0x88, 0x9f, 0xc6, 0x2a, 0xe6, 0xd7, 0xf5, 0x9a, 0xb3, 0x58, 0x1e, 0x2f, 0x30, 0x89, 0x08, 0x1b,\n-0x54, 0xa2, 0xb5, 0x98, 0x23, 0xec, 0x08, 0x77, 0x1c, 0x95, 0x5d, 0x61, 0xd1, 0xcb, 0x89, 0x9c,\n-0x5f, 0xa2, 0x4a, 0x91, 0x9a, 0xef, 0x21, 0xaa, 0x49, 0x16, 0x08, 0xa8, 0xbd, 0x61, 0x28, 0x31,\n-0xc9, 0x74, 0xad, 0x85, 0xf6, 0xd9, 0xc5, 0xb1, 0x8b, 0xd1, 0xe5, 0x10, 0x32, 0x4d, 0x5f, 0x8b,\n-0x20, 0x3a, 0x3c, 0x49, 0x1f, 0x33, 0x85, 0x59, 0x0d, 0xdb, 0xcb, 0x09, 0x75, 0x43, 0x69, 0x73,\n-0xfb, 0x6b, 0x71, 0x7d, 0xf0, 0xdf, 0xc4, 0x4c, 0x7d, 0xc6, 0xa3, 0x2e, 0xc8, 0x95, 0x79, 0xcb,\n-0x73, 0xa2, 0x8e, 0x4e, 0x4d, 0x24, 0xfb, 0x5e, 0xe4, 0x04, 0xbe, 0x72, 0x1b, 0xa6, 0x27, 0x2d,\n-0x49, 0x5a, 0x99, 0x7a, 0xd7, 0x5c, 0x09, 0x20, 0xb7, 0x7f, 0x94, 0xb9, 0x4f, 0xf1, 0x0d, 0x1c,\n-0x5e, 0x88, 0x42, 0x1b, 0x11, 0xb7, 0xe7, 0x91, 0xdb, 0x9e, 0x6c, 0xf4, 0x6a, 0xdf, 0x8c, 0x06,\n-0x98, 0x03, 0xad, 0xcc, 0x28, 0xef, 0xa5, 0x47, 0xf3, 0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,\n-0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,\n-0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n-0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa3,\n-0x97, 0xd6, 0xf3, 0x5e, 0xa2, 0x10, 0xe1, 0xab, 0x45, 0x9f, 0x3c, 0x17, 0x64, 0x3c, 0xee, 0x01,\n-0x70, 0x9c, 0xcc, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\n-0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x18, 0xfa, 0x5b, 0x75, 0xfc, 0x3e, 0x7a, 0xc7, 0x5f,\n-0x77, 0xc7, 0xca, 0xdf, 0xcf, 0x5f, 0xc3, 0x12, 0xc4, 0x40, 0x5d, 0xd4, 0x32, 0xaa, 0xb8, 0x6a,\n-0xd7, 0xd5, 0x15, 0x15, 0x46, 0x98, 0x23, 0xa5, 0xe6, 0x90, 0x5b, 0x18, 0x99, 0x4c, 0xe3, 0xad,\n-0x42, 0xa3, 0x82, 0x31, 0x36, 0x88, 0xcd, 0xe9, 0xfb, 0xc4, 0x04, 0x96, 0x48, 0x8b, 0x01, 0xc7,\n-0x8d, 0x01, 0xcf, 0x5b, 0x33, 0x06, 0x96, 0x46, 0x66, 0x74, 0x1d, 0x4f, 0xed, 0xc1, 0xb6, 0xb9,\n-0xb4, 0x0d, 0x61, 0xcc, 0x63, 0x7e, 0xd7, 0x2e, 0x77, 0x8c, 0x96, 0x1c, 0x2a, 0x23, 0x68, 0x6b,\n-0x85, 0x57, 0x76, 0x70, 0x33, 0x13, 0xfe, 0xe1, 0x4f, 0xa6, 0x23, 0x77, 0x18, 0xfa, 0x1a, 0x8c,\n-0xe8, 0xbd, 0x65, 0xc9, 0xcf, 0x3f, 0xf4, 0xc9, 0x17, 0xdc, 0xeb, 0xc7, 0xbc, 0xc0, 0x04, 0x2e,\n-0x2d, 0x46, 0x2f, 0x69, 0x66, 0xc3, 0x1b, 0x8f, 0xfe, 0xec, 0x3e, 0xd3, 0xca, 0x94, 0xbf, 0x76,\n-0x0a, 0x25, 0x0d, 0xa9, 0x7b, 0x02, 0x1c, 0xa9, 0xd0, 0x3b, 0x5f, 0x0b, 0xc0, 0x81, 0x3a, 0x3d,\n-0x64, 0xe1, 0xbf, 0xa7, 0x2d, 0x4e, 0xbd, 0x4d, 0xc4, 0xd8, 0x29, 0xc6, 0x22, 0x18, 0xd0, 0xc5,\n-0xac, 0x72, 0x02, 0x82, 0x3f, 0xaa, 0x3a, 0xa2, 0x3a, 0x22, 0x97, 0x31, 0xdd, 0x08, 0x63, 0xc3,\n-0x75, 0x14, 0xb9, 0x60, 0x28, 0x2d, 0x5b, 0x68, 0xe0, 0x16, 0xa9, 0x66, 0x82, 0x23, 0x51, 0xf5,\n-0xeb, 0x53, 0xd8, 0x31, 0x9b, 0x7b, 0xe9, 0xb7, 0x9d, 0x4b, 0xeb, 0x88, 0x16, 0xcf, 0xf9, 0x5d,\n-0x38, 0x8a, 0x49, 0x30, 0x8f, 0xed, 0xf1, 0xeb, 0x19, 0xf4, 0x77, 0x1a, 0x31, 0x18, 0x4d, 0x67,\n-0x54, 0x6c, 0x2f, 0x6f, 0x65, 0xf9, 0xdb, 0x3d, 0xec, 0x21, 0xec, 0x5e, 0xf4, 0xf4, 0x8b, 0xca,\n-0x60, 0x65, 0x54, 0xd1, 0x71, 0x64, 0xf4, 0xf9, 0xa6, 0xa3, 0x81, 0x33, 0x36, 0x33, 0x71, 0xf0,\n-0xa4, 0x78, 0x5f, 0x4e, 0xad, 0x83, 0x21, 0xde, 0x34, 0x49, 0x8d, 0xe8, 0x59, 0xac, 0x9d, 0xf2,\n-0x76, 0x5a, 0x36, 0xf2, 0x13, 0xf4, 0xaf, 0xe0, 0x09, 0xc7, 0x61, 0x2a, 0x6c, 0xf7, 0xe0, 0x9d,\n-0xae, 0xbb, 0x86, 0x4a, 0x28, 0x6f, 0x2e, 0xee, 0xb4, 0x79, 0xcd, 0x90, 0x33, 0xc3, 0xb3, 0x76,\n-0xfa, 0xf5, 0xf0, 0x6c, 0x9d, 0x01, 0x90, 0xfa, 0x9e, 0x90, 0xf6, 0x9c, 0x72, 0xcf, 0x47, 0xda,\n-0xc3, 0x1f, 0xe4, 0x35, 0x20, 0x53, 0xf2, 0x54, 0xd1, 0xdf, 0x61, 0x83, 0xa6, 0x02, 0xe2, 0x25,\n-0x38, 0xde, 0x85, 0x32, 0x2d, 0x5e, 0x73, 0x90, 0x52, 0x5d, 0x42, 0xc4, 0xce, 0x3d, 0x4b, 0xe1,\n-0xf9, 0x19, 0x84, 0x1d, 0xd5, 0xa2, 0x50, 0xcc, 0x41, 0xfb, 0x41, 0x14, 0xc3, 0xbd, 0xd6, 0xc9,\n-0x5a, 0xa3, 0x63, 0x66, 0x02, 0x80, 0xbd, 0x05, 0x3a, 0x3b, 0x47, 0x9c, 0xec, 0x00, 0x26, 0x4c,\n-0xf5, 0x88, 0x51, 0xbf, 0xa8, 0x23, 0x7f, 0x18, 0x07, 0xb0, 0x0b, 0xed, 0x8b, 0x26, 0xa1, 0x64,\n-0xd3, 0x61, 0x4a, 0xeb, 0x5c, 0x9f, 0xde, 0xb3, 0xaf, 0x67, 0x03, 0xb3, 0x1f, 0xdd, 0x6d, 0x5d,\n-0x69, 0x68, 0x69, 0xab, 0x5e, 0x3a, 0xec, 0x7c, 0x69, 0xbc, 0xc7, 0x3b, 0x85, 0x4e, 0x9e, 0x15,\n-0xb9, 0xb4, 0x15, 0x4f, 0xc3, 0x95, 0x7a, 0x58, 0xd7, 0xc9, 0x6c, 0xe9, 0x6c, 0xb9, 0xf3, 0x29,\n-0x63, 0x5e, 0xb4, 0x2c, 0xf0, 0x2d, 0x3d, 0xed, 0x5a, 0x65, 0xe0, 0xa9, 0x5b, 0x40, 0xc2, 0x48,\n-0x99, 0x81, 0x6d, 0x9e, 0x1f, 0x06, 0x2a, 0x3c, 0x12, 0xb4, 0x8b, 0x0f, 0x9b, 0xa2, 0x24, 0xf0,\n-0xa6, 0x8d, 0xd6, 0x7a, 0xe0, 0x4b, 0xb6, 0x64, 0x96, 0x63, 0x95, 0x84, 0xc2, 0x4a, 0xcd, 0x1c,\n-0x2e, 0x24, 0x87, 0x33, 0x60, 0xe5, 0xc3, 0x30, 0x82, 0x05, 0xb7, 0x30, 0x82, 0x03, 0x9f, 0xa0,\n-0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x05, 0x09, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n-0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n-0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65,\n-0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56,\n-0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x1e,\n-0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x34, 0x31, 0x38, 0x32, 0x37, 0x30, 0x30, 0x5a, 0x17,\n-0x0d, 0x33, 0x31, 0x31, 0x31, 0x32, 0x34, 0x31, 0x38, 0x32, 0x33, 0x33, 0x33, 0x5a, 0x30, 0x45,\n-0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30,\n-0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73,\n-0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n-0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n-0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02,\n-0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x9a, 0x18, 0xca, 0x4b, 0x94, 0x0d, 0x00, 0x2d, 0xaf, 0x03,\n-0x29, 0x8a, 0xf0, 0x0f, 0x81, 0xc8, 0xae, 0x4c, 0x19, 0x85, 0x1d, 0x08, 0x9f, 0xab, 0x29, 0x44,\n-0x85, 0xf3, 0x2f, 0x81, 0xad, 0x32, 0x1e, 0x90, 0x46, 0xbf, 0xa3, 0x86, 0x26, 0x1a, 0x1e, 0xfe,\n-0x7e, 0x1c, 0x18, 0x3a, 0x5c, 0x9c, 0x60, 0x17, 0x2a, 0x3a, 0x74, 0x83, 0x33, 0x30, 0x7d, 0x61,\n-0x54, 0x11, 0xcb, 0xed, 0xab, 0xe0, 0xe6, 0xd2, 0xa2, 0x7e, 0xf5, 0x6b, 0x6f, 0x18, 0xb7, 0x0a,\n-0x0b, 0x2d, 0xfd, 0xe9, 0x3e, 0xef, 0x0a, 0xc6, 0xb3, 0x10, 0xe9, 0xdc, 0xc2, 0x46, 0x17, 0xf8,\n-0x5d, 0xfd, 0xa4, 0xda, 0xff, 0x9e, 0x49, 0x5a, 0x9c, 0xe6, 0x33, 0xe6, 0x24, 0x96, 0xf7, 0x3f,\n-0xba, 0x5b, 0x2b, 0x1c, 0x7a, 0x35, 0xc2, 0xd6, 0x67, 0xfe, 0xab, 0x66, 0x50, 0x8b, 0x6d, 0x28,\n-0x60, 0x2b, 0xef, 0xd7, 0x60, 0xc3, 0xc7, 0x93, 0xbc, 0x8d, 0x36, 0x91, 0xf3, 0x7f, 0xf8, 0xdb,\n-0x11, 0x13, 0xc4, 0x9c, 0x77, 0x76, 0xc1, 0xae, 0xb7, 0x02, 0x6a, 0x81, 0x7a, 0xa9, 0x45, 0x83,\n-0xe2, 0x05, 0xe6, 0xb9, 0x56, 0xc1, 0x94, 0x37, 0x8f, 0x48, 0x71, 0x63, 0x22, 0xec, 0x17, 0x65,\n-0x07, 0x95, 0x8a, 0x4b, 0xdf, 0x8f, 0xc6, 0x5a, 0x0a, 0xe5, 0xb0, 0xe3, 0x5f, 0x5e, 0x6b, 0x11,\n-0xab, 0x0c, 0xf9, 0x85, 0xeb, 0x44, 0xe9, 0xf8, 0x04, 0x73, 0xf2, 0xe9, 0xfe, 0x5c, 0x98, 0x8c,\n-0xf5, 0x73, 0xaf, 0x6b, 0xb4, 0x7e, 0xcd, 0xd4, 0x5c, 0x02, 0x2b, 0x4c, 0x39, 0xe1, 0xb2, 0x95,\n-0x95, 0x2d, 0x42, 0x87, 0xd7, 0xd5, 0xb3, 0x90, 0x43, 0xb7, 0x6c, 0x13, 0xf1, 0xde, 0xdd, 0xf6,\n-0xc4, 0xf8, 0x89, 0x3f, 0xd1, 0x75, 0xf5, 0x92, 0xc3, 0x91, 0xd5, 0x8a, 0x88, 0xd0, 0x90, 0xec,\n-0xdc, 0x6d, 0xde, 0x89, 0xc2, 0x65, 0x71, 0x96, 0x8b, 0x0d, 0x03, 0xfd, 0x9c, 0xbf, 0x5b, 0x16,\n-0xac, 0x92, 0xdb, 0xea, 0xfe, 0x79, 0x7c, 0xad, 0xeb, 0xaf, 0xf7, 0x16, 0xcb, 0xdb, 0xcd, 0x25,\n-0x2b, 0xe5, 0x1f, 0xfb, 0x9a, 0x9f, 0xe2, 0x51, 0xcc, 0x3a, 0x53, 0x0c, 0x48, 0xe6, 0x0e, 0xbd,\n-0xc9, 0xb4, 0x76, 0x06, 0x52, 0xe6, 0x11, 0x13, 0x85, 0x72, 0x63, 0x03, 0x04, 0xe0, 0x04, 0x36,\n-0x2b, 0x20, 0x19, 0x02, 0xe8, 0x74, 0xa7, 0x1f, 0xb6, 0xc9, 0x56, 0x66, 0xf0, 0x75, 0x25, 0xdc,\n-0x67, 0xc1, 0x0e, 0x61, 0x60, 0x88, 0xb3, 0x3e, 0xd1, 0xa8, 0xfc, 0xa3, 0xda, 0x1d, 0xb0, 0xd1,\n-0xb1, 0x23, 0x54, 0xdf, 0x44, 0x76, 0x6d, 0xed, 0x41, 0xd8, 0xc1, 0xb2, 0x22, 0xb6, 0x53, 0x1c,\n-0xdf, 0x35, 0x1d, 0xdc, 0xa1, 0x77, 0x2a, 0x31, 0xe4, 0x2d, 0xf5, 0xe5, 0xe5, 0xdb, 0xc8, 0xe0,\n-0xff, 0xe5, 0x80, 0xd7, 0x0b, 0x63, 0xa0, 0xff, 0x33, 0xa1, 0x0f, 0xba, 0x2c, 0x15, 0x15, 0xea,\n-0x97, 0xb3, 0xd2, 0xa2, 0xb5, 0xbe, 0xf2, 0x8c, 0x96, 0x1e, 0x1a, 0x8f, 0x1d, 0x6c, 0xa4, 0x61,\n-0x37, 0xb9, 0x86, 0x73, 0x33, 0xd7, 0x97, 0x96, 0x9e, 0x23, 0x7d, 0x82, 0xa4, 0x4c, 0x81, 0xe2,\n-0xa1, 0xd1, 0xba, 0x67, 0x5f, 0x95, 0x07, 0xa3, 0x27, 0x11, 0xee, 0x16, 0x10, 0x7b, 0xbc, 0x45,\n-0x4a, 0x4c, 0xb2, 0x04, 0xd2, 0xab, 0xef, 0xd5, 0xfd, 0x0c, 0x51, 0xce, 0x50, 0x6a, 0x08, 0x31,\n-0xf9, 0x91, 0xda, 0x0c, 0x8f, 0x64, 0x5c, 0x03, 0xc3, 0x3a, 0x8b, 0x20, 0x3f, 0x6e, 0x8d, 0x67,\n-0x3d, 0x3a, 0xd6, 0xfe, 0x7d, 0x5b, 0x88, 0xc9, 0x5e, 0xfb, 0xcc, 0x61, 0xdc, 0x8b, 0x33, 0x77,\n-0xd3, 0x44, 0x32, 0x35, 0x09, 0x62, 0x04, 0x92, 0x16, 0x10, 0xd8, 0x9e, 0x27, 0x47, 0xfb, 0x3b,\n-0x21, 0xe3, 0xf8, 0xeb, 0x1d, 0x5b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb0, 0x30, 0x81,\n-0xad, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n-0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,\n-0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1a, 0x84, 0x62, 0xbc, 0x48, 0x4c,\n-0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, 0x03, 0xc4, 0x19, 0x46, 0xd1, 0x94, 0x6b, 0x30, 0x6e,\n-0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x1a, 0x84, 0x62, 0xbc, 0x48,\n-0x4c, 0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, 0x03, 0xc4, 0x19, 0x46, 0xd1, 0x94, 0x6b, 0xa1,\n-0x49, 0xa4, 0x47, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f,\n-0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30,\n-0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73,\n-0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x82, 0x02, 0x05, 0x09, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02,\n-0x01, 0x00, 0x3e, 0x0a, 0x16, 0x4d, 0x9f, 0x06, 0x5b, 0xa8, 0xae, 0x71, 0x5d, 0x2f, 0x05, 0x2f,\n-0x67, 0xe6, 0x13, 0x45, 0x83, 0xc4, 0x36, 0xf6, 0xf3, 0xc0, 0x26, 0x0c, 0x0d, 0xb5, 0x47, 0x64,\n-0x5d, 0xf8, 0xb4, 0x72, 0xc9, 0x46, 0xa5, 0x03, 0x18, 0x27, 0x55, 0x89, 0x78, 0x7d, 0x76, 0xea,\n-0x96, 0x34, 0x80, 0x17, 0x20, 0xdc, 0xe7, 0x83, 0xf8, 0x8d, 0xfc, 0x07, 0xb8, 0xda, 0x5f, 0x4d,\n-0x2e, 0x67, 0xb2, 0x84, 0xfd, 0xd9, 0x44, 0xfc, 0x77, 0x50, 0x81, 0xe6, 0x7c, 0xb4, 0xc9, 0x0d,\n-0x0b, 0x72, 0x53, 0xf8, 0x76, 0x07, 0x07, 0x41, 0x47, 0x96, 0x0c, 0xfb, 0xe0, 0x82, 0x26, 0x93,\n-0x55, 0x8c, 0xfe, 0x22, 0x1f, 0x60, 0x65, 0x7c, 0x5f, 0xe7, 0x26, 0xb3, 0xf7, 0x32, 0x90, 0x98,\n-0x50, 0xd4, 0x37, 0x71, 0x55, 0xf6, 0x92, 0x21, 0x78, 0xf7, 0x95, 0x79, 0xfa, 0xf8, 0x2d, 0x26,\n-0x87, 0x66, 0x56, 0x30, 0x77, 0xa6, 0x37, 0x78, 0x33, 0x52, 0x10, 0x58, 0xae, 0x3f, 0x61, 0x8e,\n-0xf2, 0x6a, 0xb1, 0xef, 0x18, 0x7e, 0x4a, 0x59, 0x63, 0xca, 0x8d, 0xa2, 0x56, 0xd5, 0xa7, 0x2f,\n-0xbc, 0x56, 0x1f, 0xcf, 0x39, 0xc1, 0xe2, 0xfb, 0x0a, 0xa8, 0x15, 0x2c, 0x7d, 0x4d, 0x7a, 0x63,\n-0xc6, 0x6c, 0x97, 0x44, 0x3c, 0xd2, 0x6f, 0xc3, 0x4a, 0x17, 0x0a, 0xf8, 0x90, 0xd2, 0x57, 0xa2,\n-0x19, 0x51, 0xa5, 0x2d, 0x97, 0x41, 0xda, 0x07, 0x4f, 0xa9, 0x50, 0xda, 0x90, 0x8d, 0x94, 0x46,\n-0xe1, 0x3e, 0xf0, 0x94, 0xfd, 0x10, 0x00, 0x38, 0xf5, 0x3b, 0xe8, 0x40, 0xe1, 0xb4, 0x6e, 0x56,\n-0x1a, 0x20, 0xcc, 0x6f, 0x58, 0x8d, 0xed, 0x2e, 0x45, 0x8f, 0xd6, 0xe9, 0x93, 0x3f, 0xe7, 0xb1,\n-0x2c, 0xdf, 0x3a, 0xd6, 0x22, 0x8c, 0xdc, 0x84, 0xbb, 0x22, 0x6f, 0xd0, 0xf8, 0xe4, 0xc6, 0x39,\n-0xe9, 0x04, 0x88, 0x3c, 0xc3, 0xba, 0xeb, 0x55, 0x7a, 0x6d, 0x80, 0x99, 0x24, 0xf5, 0x6c, 0x01,\n-0xfb, 0xf8, 0x97, 0xb0, 0x94, 0x5b, 0xeb, 0xfd, 0xd2, 0x6f, 0xf1, 0x77, 0x68, 0x0d, 0x35, 0x64,\n-0x23, 0xac, 0xb8, 0x55, 0xa1, 0x03, 0xd1, 0x4d, 0x42, 0x19, 0xdc, 0xf8, 0x75, 0x59, 0x56, 0xa3,\n-0xf9, 0xa8, 0x49, 0x79, 0xf8, 0xaf, 0x0e, 0xb9, 0x11, 0xa0, 0x7c, 0xb7, 0x6a, 0xed, 0x34, 0xd0,\n-0xb6, 0x26, 0x62, 0x38, 0x1a, 0x87, 0x0c, 0xf8, 0xe8, 0xfd, 0x2e, 0xd3, 0x90, 0x7f, 0x07, 0x91,\n-0x2a, 0x1d, 0xd6, 0x7e, 0x5c, 0x85, 0x83, 0x99, 0xb0, 0x38, 0x08, 0x3f, 0xe9, 0x5e, 0xf9, 0x35,\n-0x07, 0xe4, 0xc9, 0x62, 0x6e, 0x57, 0x7f, 0xa7, 0x50, 0x95, 0xf7, 0xba, 0xc8, 0x9b, 0xe6, 0x8e,\n-0xa2, 0x01, 0xc5, 0xd6, 0x66, 0xbf, 0x79, 0x61, 0xf3, 0x3c, 0x1c, 0xe1, 0xb9, 0x82, 0x5c, 0x5d,\n-0xa0, 0xc3, 0xe9, 0xd8, 0x48, 0xbd, 0x19, 0xa2, 0x11, 0x14, 0x19, 0x6e, 0xb2, 0x86, 0x1b, 0x68,\n-0x3e, 0x48, 0x37, 0x1a, 0x88, 0xb7, 0x5d, 0x96, 0x5e, 0x9c, 0xc7, 0xef, 0x27, 0x62, 0x08, 0xe2,\n-0x91, 0x19, 0x5c, 0xd2, 0xf1, 0x21, 0xdd, 0xba, 0x17, 0x42, 0x82, 0x97, 0x71, 0x81, 0x53, 0x31,\n-0xa9, 0x9f, 0xf6, 0x7d, 0x62, 0xbf, 0x72, 0xe1, 0xa3, 0x93, 0x1d, 0xcc, 0x8a, 0x26, 0x5a, 0x09,\n-0x38, 0xd0, 0xce, 0xd7, 0x0d, 0x80, 0x16, 0xb4, 0x78, 0xa5, 0x3a, 0x87, 0x4c, 0x8d, 0x8a, 0xa5,\n-0xd5, 0x46, 0x97, 0xf2, 0x2c, 0x10, 0xb9, 0xbc, 0x54, 0x22, 0xc0, 0x01, 0x50, 0x69, 0x43, 0x9e,\n-0xf4, 0xb2, 0xef, 0x6d, 0xf8, 0xec, 0xda, 0xf1, 0xe3, 0xb1, 0xef, 0xdf, 0x91, 0x8f, 0x54, 0x2a,\n-0x0b, 0x25, 0xc1, 0x26, 0x19, 0xc4, 0x52, 0x10, 0x05, 0x65, 0xd5, 0x82, 0x10, 0xea, 0xc2, 0x31,\n-0xcd, 0x2e, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n-0x14, 0x44, 0x57, 0x34, 0x24, 0x5b, 0x81, 0x89, 0x9b, 0x35, 0xf2, 0xce, 0xb8, 0x2b, 0x3b, 0x5b,\n-0xa7, 0x26, 0xf0, 0x75, 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x0b, 0x05, 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75,\n-0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e,\n-0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69,\n-0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x47, 0x33, 0x30, 0x1e,\n-0x17, 0x0d, 0x31, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x38, 0x35, 0x39, 0x33, 0x32, 0x5a, 0x17,\n-0x0d, 0x34, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x38, 0x35, 0x39, 0x33, 0x32, 0x5a, 0x30, 0x48,\n-0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30,\n-0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73,\n-0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n-0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x47, 0x33, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00,\n-0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa1, 0xae, 0x25, 0xb2, 0x01, 0x18, 0xdc,\n-0x57, 0x88, 0x3f, 0x46, 0xeb, 0xf9, 0xaf, 0xe2, 0xeb, 0x23, 0x71, 0xe2, 0x9a, 0xd1, 0x61, 0x66,\n-0x21, 0x5f, 0xaa, 0xaf, 0x27, 0x51, 0xe5, 0x6e, 0x1b, 0x16, 0xd4, 0x2d, 0x7d, 0x50, 0xb0, 0x53,\n-0x77, 0xbd, 0x78, 0x3a, 0x60, 0xe2, 0x64, 0x02, 0x9b, 0x7c, 0x86, 0x9b, 0xd6, 0x1a, 0x8e, 0xad,\n-0xff, 0x1f, 0x15, 0x7f, 0xd5, 0x95, 0x1e, 0x12, 0xcb, 0xe6, 0x14, 0x84, 0x04, 0xc1, 0xdf, 0x36,\n-0xb3, 0x16, 0x9f, 0x8a, 0xe3, 0xc9, 0xdb, 0x98, 0x34, 0xce, 0xd8, 0x33, 0x17, 0x28, 0x46, 0xfc,\n-0xa7, 0xc9, 0xf0, 0xd2, 0xb4, 0xd5, 0x4d, 0x09, 0x72, 0x49, 0xf9, 0xf2, 0x87, 0xe3, 0xa9, 0xda,\n-0x7d, 0xa1, 0x7d, 0x6b, 0xb2, 0x3a, 0x25, 0xa9, 0x6d, 0x52, 0x44, 0xac, 0xf8, 0xbe, 0x6e, 0xfb,\n-0xdc, 0xa6, 0x73, 0x91, 0x90, 0x61, 0xa6, 0x03, 0x14, 0x20, 0xf2, 0xe7, 0x87, 0xa3, 0x88, 0xad,\n-0xad, 0xa0, 0x8c, 0xff, 0xa6, 0x0b, 0x25, 0x52, 0x25, 0xe7, 0x16, 0x01, 0xd5, 0xcb, 0xb8, 0x35,\n-0x81, 0x0c, 0xa3, 0x3b, 0xf0, 0xe1, 0xe1, 0xfc, 0x5a, 0x5d, 0xce, 0x80, 0x71, 0x6d, 0xf8, 0x49,\n-0xab, 0x3e, 0x3b, 0xba, 0xb8, 0xd7, 0x80, 0x01, 0xfb, 0xa5, 0xeb, 0x5b, 0xb3, 0xc5, 0x5e, 0x60,\n-0x2a, 0x31, 0xa0, 0xaf, 0x37, 0xe8, 0x20, 0x3a, 0x9f, 0xa8, 0x32, 0x2c, 0x0c, 0xcc, 0x09, 0x1d,\n-0xd3, 0x9e, 0x8e, 0x5d, 0xbc, 0x4c, 0x98, 0xee, 0xc5, 0x1a, 0x68, 0x7b, 0xec, 0x53, 0xa6, 0xe9,\n-0x14, 0x35, 0xa3, 0xdf, 0xcd, 0x80, 0x9f, 0x0c, 0x48, 0xfb, 0x1c, 0xf4, 0xf1, 0xbf, 0x4a, 0xb8,\n-0xfa, 0xd5, 0x8c, 0x71, 0x4a, 0xc7, 0x1f, 0xad, 0xfe, 0x41, 0x9a, 0xb3, 0x83, 0x5d, 0xf2, 0x84,\n-0x56, 0xef, 0xa5, 0x57, 0x43, 0xce, 0x29, 0xad, 0x8c, 0xab, 0x55, 0xbf, 0xc4, 0xfb, 0x5b, 0x01,\n-0xdd, 0x23, 0x21, 0xa1, 0x58, 0x00, 0x8e, 0xc3, 0xd0, 0x6a, 0x13, 0xed, 0x13, 0xe3, 0x12, 0x2b,\n-0x80, 0xdc, 0x67, 0xe6, 0x95, 0xb2, 0xcd, 0x1e, 0x22, 0x6e, 0x2a, 0xf8, 0x41, 0xd4, 0xf2, 0xca,\n-0x14, 0x07, 0x8d, 0x8a, 0x55, 0x12, 0xc6, 0x69, 0xf5, 0xb8, 0x86, 0x68, 0x2f, 0x53, 0x5e, 0xb0,\n-0xd2, 0xaa, 0x21, 0xc1, 0x98, 0xe6, 0x30, 0xe3, 0x67, 0x55, 0xc7, 0x9b, 0x6e, 0xac, 0x19, 0xa8,\n-0x55, 0xa6, 0x45, 0x06, 0xd0, 0x23, 0x3a, 0xdb, 0xeb, 0x65, 0x5d, 0x2a, 0x11, 0x11, 0xf0, 0x3b,\n-0x4f, 0xca, 0x6d, 0xf4, 0x34, 0xc4, 0x71, 0xe4, 0xff, 0x00, 0x5a, 0xf6, 0x5c, 0xae, 0x23, 0x60,\n-0x85, 0x73, 0xf1, 0xe4, 0x10, 0xb1, 0x25, 0xae, 0xd5, 0x92, 0xbb, 0x13, 0xc1, 0x0c, 0xe0, 0x39,\n-0xda, 0xb4, 0x39, 0x57, 0xb5, 0xab, 0x35, 0xaa, 0x72, 0x21, 0x3b, 0x83, 0x35, 0xe7, 0x31, 0xdf,\n-0x7a, 0x21, 0x6e, 0xb8, 0x32, 0x08, 0x7d, 0x1d, 0x32, 0x91, 0x15, 0x4a, 0x62, 0x72, 0xcf, 0xe3,\n-0x77, 0xa1, 0xbc, 0xd5, 0x11, 0x1b, 0x76, 0x01, 0x67, 0x08, 0xe0, 0x41, 0x0b, 0xc3, 0xeb, 0x15,\n-0x6e, 0xf8, 0xa4, 0x19, 0xd9, 0xa2, 0xab, 0xaf, 0xe2, 0x27, 0x52, 0x56, 0x2b, 0x02, 0x8a, 0x2c,\n-0x14, 0x24, 0xf9, 0xbf, 0x42, 0x02, 0xbf, 0x26, 0xc8, 0xc6, 0x8f, 0xe0, 0x6e, 0x38, 0x7d, 0x53,\n-0x2d, 0xe5, 0xed, 0x98, 0xb3, 0x95, 0x63, 0x68, 0x7f, 0xf9, 0x35, 0xf4, 0xdf, 0x88, 0xc5, 0x60,\n-0x35, 0x92, 0xc0, 0x7c, 0x69, 0x1c, 0x61, 0x95, 0x16, 0xd0, 0xeb, 0xde, 0x0b, 0xaf, 0x3e, 0x04,\n-0x10, 0x45, 0x65, 0x58, 0x50, 0x38, 0xaf, 0x48, 0xf2, 0x59, 0xb6, 0x16, 0xf2, 0x3c, 0x0d, 0x90,\n-0x02, 0xc6, 0x70, 0x2e, 0x01, 0xad, 0x3c, 0x15, 0xd7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n-0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n-0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,\n-0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xed, 0xe7,\n-0x6f, 0x76, 0x5a, 0xbf, 0x60, 0xec, 0x49, 0x5b, 0xc6, 0xa5, 0x77, 0xbb, 0x72, 0x16, 0x71, 0x9b,\n-0xc4, 0x3d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n-0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x91, 0xdf, 0x80, 0x3f, 0x43, 0x09, 0x7e, 0x71, 0xc2, 0xf7,\n-0xeb, 0xb3, 0x88, 0x8f, 0xe1, 0x51, 0xb2, 0xbc, 0x3d, 0x75, 0xf9, 0x28, 0x5d, 0xc8, 0xbc, 0x99,\n-0x9b, 0x7b, 0x5d, 0xaa, 0xe5, 0xca, 0xe1, 0x0a, 0xf7, 0xe8, 0xb2, 0xd3, 0x9f, 0xdd, 0x67, 0x31,\n-0x7e, 0xba, 0x01, 0xaa, 0xc7, 0x6a, 0x41, 0x3b, 0x90, 0xd4, 0x08, 0x5c, 0xb2, 0x60, 0x6a, 0x90,\n-0xf0, 0xc8, 0xce, 0x03, 0x62, 0xf9, 0x8b, 0xed, 0xfb, 0x6e, 0x2a, 0xdc, 0x06, 0x4d, 0x3c, 0x29,\n-0x0f, 0x89, 0x16, 0x8a, 0x58, 0x4c, 0x48, 0x0f, 0xe8, 0x84, 0x61, 0xea, 0x3c, 0x72, 0xa6, 0x77,\n-0xe4, 0x42, 0xae, 0x88, 0xa3, 0x43, 0x58, 0x79, 0x7e, 0xae, 0xca, 0xa5, 0x53, 0x0d, 0xa9, 0x3d,\n-0x70, 0xbd, 0x20, 0x19, 0x61, 0xa4, 0x6c, 0x38, 0xfc, 0x43, 0x32, 0xe1, 0xc1, 0x47, 0xff, 0xf8,\n-0xec, 0xf1, 0x11, 0x22, 0x32, 0x96, 0x9c, 0xc2, 0xf6, 0x5b, 0x69, 0x96, 0x7b, 0x20, 0x0c, 0x43,\n-0x41, 0x9a, 0x5b, 0xf6, 0x59, 0x19, 0x88, 0xde, 0x55, 0x88, 0x37, 0x51, 0x0b, 0x78, 0x5c, 0x0a,\n-0x1e, 0xa3, 0x42, 0xfd, 0xc7, 0x9d, 0x88, 0x0f, 0xc0, 0xf2, 0x78, 0x02, 0x24, 0x54, 0x93, 0xaf,\n-0x89, 0x87, 0x88, 0xc9, 0x4a, 0x80, 0x1d, 0xea, 0xd0, 0x6e, 0x3e, 0x61, 0x2e, 0x36, 0xbb, 0x35,\n-0x0e, 0x27, 0x96, 0xfd, 0x66, 0x34, 0x3b, 0x61, 0x72, 0x73, 0xf1, 0x16, 0x5c, 0x47, 0x06, 0x54,\n-0x49, 0x00, 0x7a, 0x58, 0x12, 0xb0, 0x0a, 0xef, 0x85, 0xfd, 0xb1, 0xb8, 0x33, 0x75, 0x6a, 0x93,\n-0x1c, 0x12, 0xe6, 0x60, 0x5e, 0x6f, 0x1d, 0x7f, 0xc9, 0x1f, 0x23, 0xcb, 0x84, 0x61, 0x9f, 0x1e,\n-0x82, 0x44, 0xf9, 0x5f, 0xad, 0x62, 0x55, 0x24, 0x9a, 0x52, 0x98, 0xed, 0x51, 0xe7, 0xa1, 0x7e,\n-0x97, 0x3a, 0xe6, 0x2f, 0x1f, 0x11, 0xda, 0x53, 0x80, 0x2c, 0x85, 0x9e, 0xab, 0x35, 0x10, 0xdb,\n-0x22, 0x5f, 0x6a, 0xc5, 0x5e, 0x97, 0x53, 0xf2, 0x32, 0x02, 0x09, 0x30, 0xa3, 0x58, 0xf0, 0x0d,\n-0x01, 0xd5, 0x72, 0xc6, 0xb1, 0x7c, 0x69, 0x7b, 0xc3, 0xf5, 0x36, 0x45, 0xcc, 0x61, 0x6e, 0x5e,\n-0x4c, 0x94, 0xc5, 0x5e, 0xae, 0xe8, 0x0e, 0x5e, 0x8b, 0xbf, 0xf7, 0xcd, 0xe0, 0xed, 0xa1, 0x0e,\n-0x1b, 0x33, 0xee, 0x54, 0x18, 0xfe, 0x0f, 0xbe, 0xef, 0x7e, 0x84, 0x6b, 0x43, 0xe3, 0x70, 0x98,\n-0xdb, 0x5d, 0x75, 0xb2, 0x0d, 0x59, 0x07, 0x85, 0x15, 0x23, 0x39, 0xd6, 0xf1, 0xdf, 0xa9, 0x26,\n-0x0f, 0xd6, 0x48, 0xc7, 0xb3, 0xa6, 0x22, 0xf5, 0x33, 0x37, 0x5a, 0x95, 0x47, 0x9f, 0x7b, 0xba,\n-0x18, 0x15, 0x6f, 0xff, 0xd6, 0x14, 0x64, 0x83, 0x49, 0xd2, 0x0a, 0x67, 0x21, 0xdb, 0x0f, 0x35,\n-0x63, 0x60, 0x28, 0x22, 0xe3, 0xb1, 0x95, 0x83, 0xcd, 0x85, 0xa6, 0xdd, 0x2f, 0x0f, 0xe7, 0x67,\n-0x52, 0x6e, 0xbb, 0x2f, 0x85, 0x7c, 0xf5, 0x4a, 0x73, 0xe7, 0xc5, 0x3e, 0xc0, 0xbd, 0x21, 0x12,\n-0x05, 0x3f, 0xfc, 0xb7, 0x03, 0x49, 0x02, 0x5b, 0xc8, 0x25, 0xe6, 0xe2, 0x54, 0x38, 0xf5, 0x79,\n-0x87, 0x8c, 0x1d, 0x53, 0xb2, 0x4e, 0x85, 0x7b, 0x06, 0x38, 0xc7, 0x2c, 0xf8, 0xf8, 0xb0, 0x72,\n-0x8d, 0x25, 0xe5, 0x77, 0x52, 0xf4, 0x03, 0x1c, 0x48, 0xa6, 0x50, 0x5f, 0x88, 0x20, 0x30, 0x6e,\n-0xf2, 0x82, 0x43, 0xab, 0x3d, 0x97, 0x84, 0xe7, 0x53, 0xfb, 0x21, 0xc1, 0x4f, 0x0f, 0x22, 0x9a,\n-0x86, 0xb8, 0x59, 0x2a, 0xf6, 0x47, 0x3d, 0x19, 0x88, 0x2d, 0xe8, 0x85, 0xe1, 0x9e, 0xec, 0x85,\n-0x08, 0x6a, 0xb1, 0x6c, 0x34, 0xc9, 0x1d, 0xec, 0x48, 0x2b, 0x3b, 0x78, 0xed, 0x66, 0xc4, 0x8e,\n-0x79, 0x69, 0x83, 0xde, 0x7f, 0x8c, 0x30, 0x82, 0x06, 0x9d, 0x30, 0x82, 0x04, 0x85, 0xa0, 0x03,\n-0x02, 0x01, 0x02, 0x02, 0x02, 0x05, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n-0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10,\n-0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,\n-0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61,\n-0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x1e, 0x17,\n-0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x34, 0x31, 0x39, 0x31, 0x31, 0x32, 0x33, 0x5a, 0x17, 0x0d,\n-0x33, 0x31, 0x31, 0x31, 0x32, 0x34, 0x31, 0x39, 0x30, 0x36, 0x34, 0x34, 0x5a, 0x30, 0x45, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20,\n-0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n-0x43, 0x41, 0x20, 0x33, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a,\n-0x02, 0x82, 0x02, 0x01, 0x00, 0xcc, 0x57, 0x42, 0x16, 0x54, 0x9c, 0xe6, 0x98, 0xd3, 0xd3, 0x4d,\n-0xee, 0xfe, 0xed, 0xc7, 0x9f, 0x43, 0x39, 0x4a, 0x65, 0xb3, 0xe8, 0x16, 0x88, 0x34, 0xdb, 0x0d,\n-0x59, 0x91, 0x74, 0xcf, 0x92, 0xb8, 0x04, 0x40, 0xad, 0x02, 0x4b, 0x31, 0xab, 0xbc, 0x8d, 0x91,\n-0x68, 0xd8, 0x20, 0x0e, 0x1a, 0x01, 0xe2, 0x1a, 0x7b, 0x4e, 0x17, 0x5d, 0xe2, 0x8a, 0xb7, 0x3f,\n-0x99, 0x1a, 0xcd, 0xeb, 0x61, 0xab, 0xc2, 0x65, 0xa6, 0x1f, 0xb7, 0xb7, 0xbd, 0xb7, 0x8f, 0xfc,\n-0xfd, 0x70, 0x8f, 0x0b, 0xa0, 0x67, 0xbe, 0x01, 0xa2, 0x59, 0xcf, 0x71, 0xe6, 0x0f, 0x29, 0x76,\n-0xff, 0xb1, 0x56, 0x79, 0x45, 0x2b, 0x1f, 0x9e, 0x7a, 0x54, 0xe8, 0xa3, 0x29, 0x35, 0x68, 0xa4,\n-0x01, 0x4f, 0x0f, 0xa4, 0x2e, 0x37, 0xef, 0x1b, 0xbf, 0xe3, 0x8f, 0x10, 0xa8, 0x72, 0xab, 0x58,\n-0x57, 0xe7, 0x54, 0x86, 0xc8, 0xc9, 0xf3, 0x5b, 0xda, 0x2c, 0xda, 0x5d, 0x8e, 0x6e, 0x3c, 0xa3,\n-0x3e, 0xda, 0xfb, 0x82, 0xe5, 0xdd, 0xf2, 0x5c, 0xb2, 0x05, 0x33, 0x6f, 0x8a, 0x36, 0xce, 0xd0,\n-0x13, 0x4e, 0xff, 0xbf, 0x4a, 0x0c, 0x34, 0x4c, 0xa6, 0xc3, 0x21, 0xbd, 0x50, 0x04, 0x55, 0xeb,\n-0xb1, 0xbb, 0x9d, 0xfb, 0x45, 0x1e, 0x64, 0x15, 0xde, 0x55, 0x01, 0x8c, 0x02, 0x76, 0xb5, 0xcb,\n-0xa1, 0x3f, 0x42, 0x69, 0xbc, 0x2f, 0xbd, 0x68, 0x43, 0x16, 0x56, 0x89, 0x2a, 0x37, 0x61, 0x91,\n-0xfd, 0xa6, 0xae, 0x4e, 0xc0, 0xcb, 0x14, 0x65, 0x94, 0x37, 0x4b, 0x92, 0x06, 0xef, 0x04, 0xd0,\n-0xc8, 0x9c, 0x88, 0xdb, 0x0b, 0x7b, 0x81, 0xaf, 0xb1, 0x3d, 0x2a, 0xc4, 0x65, 0x3a, 0x78, 0xb6,\n-0xee, 0xdc, 0x80, 0xb1, 0xd2, 0xd3, 0x99, 0x9c, 0x3a, 0xee, 0x6b, 0x5a, 0x6b, 0xb3, 0x8d, 0xb7,\n-0xd5, 0xce, 0x9c, 0xc2, 0xbe, 0xa5, 0x4b, 0x2f, 0x16, 0xb1, 0x9e, 0x68, 0x3b, 0x06, 0x6f, 0xae,\n-0x7d, 0x9f, 0xf8, 0xde, 0xec, 0xcc, 0x29, 0xa7, 0x98, 0xa3, 0x25, 0x43, 0x2f, 0xef, 0xf1, 0x5f,\n-0x26, 0xe1, 0x88, 0x4d, 0xf8, 0x5e, 0x6e, 0xd7, 0xd9, 0x14, 0x6e, 0x19, 0x33, 0x69, 0xa7, 0x3b,\n-0x84, 0x89, 0x93, 0xc4, 0x53, 0x55, 0x13, 0xa1, 0x51, 0x78, 0x40, 0xf8, 0xb8, 0xc9, 0xa2, 0xee,\n-0x7b, 0xba, 0x52, 0x42, 0x83, 0x9e, 0x14, 0xed, 0x05, 0x52, 0x5a, 0x59, 0x56, 0xa7, 0x97, 0xfc,\n-0x9d, 0x3f, 0x0a, 0x29, 0xd8, 0xdc, 0x4f, 0x91, 0x0e, 0x13, 0xbc, 0xde, 0x95, 0xa4, 0xdf, 0x8b,\n-0x99, 0xbe, 0xac, 0x9b, 0x33, 0x88, 0xef, 0xb5, 0x81, 0xaf, 0x1b, 0xc6, 0x22, 0x53, 0xc8, 0xf6,\n-0xc7, 0xee, 0x97, 0x14, 0xb0, 0xc5, 0x7c, 0x78, 0x52, 0xc8, 0xf0, 0xce, 0x6e, 0x77, 0x60, 0x84,\n-0xa6, 0xe9, 0x2a, 0x76, 0x20, 0xed, 0x58, 0x01, 0x17, 0x30, 0x93, 0xe9, 0x1a, 0x8b, 0xe0, 0x73,\n-0x63, 0xd9, 0x6a, 0x92, 0x94, 0x49, 0x4e, 0xb4, 0xad, 0x4a, 0x85, 0xc4, 0xa3, 0x22, 0x30, 0xfc,\n-0x09, 0xed, 0x68, 0x22, 0x73, 0xa6, 0x88, 0x0c, 0x55, 0x21, 0x58, 0xc5, 0xe1, 0x3a, 0x9f, 0x2a,\n-0xdd, 0xca, 0xe1, 0x90, 0xe0, 0xd9, 0x73, 0xab, 0x6c, 0x80, 0xb8, 0xe8, 0x0b, 0x64, 0x93, 0xa0,\n-0x9c, 0x8c, 0x19, 0xff, 0xb3, 0xd2, 0x0c, 0xec, 0x91, 0x26, 0x87, 0x8a, 0xb3, 0xa2, 0xe1, 0x70,\n-0x8f, 0x2c, 0x0a, 0xe5, 0xcd, 0x6d, 0x68, 0x51, 0xeb, 0xda, 0x3f, 0x05, 0x7f, 0x8b, 0x32, 0xe6,\n-0x13, 0x5c, 0x6b, 0xfe, 0x5f, 0x40, 0xe2, 0x22, 0xc8, 0xb4, 0xb4, 0x64, 0x4f, 0xd6, 0xba, 0x7d,\n-0x48, 0x3e, 0xa8, 0x69, 0x0c, 0xd7, 0xbb, 0x86, 0x71, 0xc9, 0x73, 0xb8, 0x3f, 0x3b, 0x9d, 0x25,\n-0x4b, 0xda, 0xff, 0x40, 0xeb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x95, 0x30, 0x82,\n-0x01, 0x91, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03,\n-0x01, 0x01, 0xff, 0x30, 0x81, 0xe1, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x81, 0xd9, 0x30, 0x81,\n-0xd6, 0x30, 0x81, 0xd3, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xbe, 0x58, 0x00, 0x03, 0x30,\n-0x81, 0xc5, 0x30, 0x81, 0x93, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30,\n-0x81, 0x86, 0x1a, 0x81, 0x83, 0x41, 0x6e, 0x79, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20,\n-0x74, 0x68, 0x69, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n-0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61, 0x63, 0x63,\n-0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x51,\n-0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20,\n-0x33, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x50, 0x6f,\n-0x6c, 0x69, 0x63, 0x79, 0x20, 0x2f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n-0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x20, 0x53, 0x74,\n-0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x30, 0x2d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,\n-0x05, 0x07, 0x02, 0x01, 0x16, 0x21, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,\n-0x2e, 0x71, 0x75, 0x6f, 0x76, 0x61, 0x64, 0x69, 0x73, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e,\n-0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x70, 0x73, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04,\n-0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xf2,\n-0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb, 0xee, 0x2f, 0x67, 0x32, 0x96, 0x35, 0x5c, 0xdb, 0xb8,\n-0xcb, 0x02, 0xd0, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, 0x14,\n-0xf2, 0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb, 0xee, 0x2f, 0x67, 0x32, 0x96, 0x35, 0x5c, 0xdb,\n-0xb8, 0xcb, 0x02, 0xd0, 0xa1, 0x49, 0xa4, 0x47, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n-0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a,\n-0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74,\n-0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f,\n-0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x82,\n-0x02, 0x05, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,\n-0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x4f, 0xad, 0xa0, 0x2c, 0x4c, 0xfa, 0xc0, 0xf2, 0x6f,\n-0xf7, 0x66, 0x55, 0xab, 0x23, 0x34, 0xee, 0xe7, 0x29, 0xda, 0xc3, 0x5b, 0xb6, 0xb0, 0x83, 0xd9,\n-0xd0, 0xd0, 0xe2, 0x21, 0xfb, 0xf3, 0x60, 0xa7, 0x3b, 0x5d, 0x60, 0x53, 0x27, 0xa2, 0x9b, 0xf6,\n-0x08, 0x22, 0x2a, 0xe7, 0xbf, 0xa0, 0x72, 0xe5, 0x9c, 0x24, 0x6a, 0x31, 0xb1, 0x90, 0x7a, 0x27,\n-0xdb, 0x84, 0x11, 0x89, 0x27, 0xa6, 0x77, 0x5a, 0x38, 0xd7, 0xbf, 0xac, 0x86, 0xfc, 0xee, 0x5d,\n-0x83, 0xbc, 0x06, 0xc6, 0xd1, 0x77, 0x6b, 0x0f, 0x6d, 0x24, 0x2f, 0x4b, 0x7a, 0x6c, 0xa7, 0x07,\n-0x96, 0xca, 0xe3, 0x84, 0x9f, 0xad, 0x88, 0x8b, 0x1d, 0xab, 0x16, 0x8d, 0x5b, 0x66, 0x17, 0xd9,\n-0x16, 0xf4, 0x8b, 0x80, 0xd2, 0xdd, 0xf8, 0xb2, 0x76, 0xc3, 0xfc, 0x38, 0x13, 0xaa, 0x0c, 0xde,\n-0x42, 0x69, 0x2b, 0x6e, 0xf3, 0x3c, 0xeb, 0x80, 0x27, 0xdb, 0xf5, 0xa6, 0x44, 0x0d, 0x9f, 0x5a,\n-0x55, 0x59, 0x0b, 0xd5, 0x0d, 0x52, 0x48, 0xc5, 0xae, 0x9f, 0xf2, 0x2f, 0x80, 0xc5, 0xea, 0x32,\n-0x50, 0x35, 0x12, 0x97, 0x2e, 0xc1, 0xe1, 0xff, 0xf1, 0x23, 0x88, 0x51, 0x38, 0x9f, 0xf2, 0x66,\n-0x56, 0x76, 0xe7, 0x0f, 0x51, 0x97, 0xa5, 0x52, 0x0c, 0x4d, 0x49, 0x51, 0x95, 0x36, 0x3d, 0xbf,\n-0xa2, 0x4b, 0x0c, 0x10, 0x1d, 0x86, 0x99, 0x4c, 0xaa, 0xf3, 0x72, 0x11, 0x93, 0xe4, 0xea, 0xf6,\n-0x9b, 0xda, 0xa8, 0x5d, 0xa7, 0x4d, 0xb7, 0x9e, 0x02, 0xae, 0x73, 0x00, 0xc8, 0xda, 0x23, 0x03,\n-0xe8, 0xf9, 0xea, 0x19, 0x74, 0x62, 0x00, 0x94, 0xcb, 0x22, 0x20, 0xbe, 0x94, 0xa7, 0x59, 0xb5,\n-0x82, 0x6a, 0xbe, 0x99, 0x79, 0x7a, 0xa9, 0xf2, 0x4a, 0x24, 0x52, 0xf7, 0x74, 0xfd, 0xba, 0x4e,\n-0xe6, 0xa8, 0x1d, 0x02, 0x6e, 0xb1, 0x0d, 0x80, 0x44, 0xc1, 0xae, 0xd3, 0x23, 0x37, 0x5f, 0xbb,\n-0x85, 0x7c, 0x2b, 0x92, 0x2e, 0xe8, 0x7e, 0xa5, 0x8b, 0xdd, 0x99, 0xe1, 0xbf, 0x27, 0x6f, 0x2d,\n-0x5d, 0xaa, 0x7b, 0x87, 0xfe, 0x0a, 0xdd, 0x4b, 0xfc, 0x8e, 0xf5, 0x26, 0xe4, 0x6e, 0x70, 0x42,\n-0x6e, 0x33, 0xec, 0x31, 0x9e, 0x7b, 0x93, 0xc1, 0xe4, 0xc9, 0x69, 0x1a, 0x3d, 0xc0, 0x6b, 0x4e,\n-0x22, 0x6d, 0xee, 0xab, 0x58, 0x4d, 0xc6, 0xd0, 0x41, 0xc1, 0x2b, 0xea, 0x4f, 0x12, 0x87, 0x5e,\n-0xeb, 0x45, 0xd8, 0x6c, 0xf5, 0x98, 0x02, 0xd3, 0xa0, 0xd8, 0x55, 0x8a, 0x06, 0x99, 0x19, 0xa2,\n-0xa0, 0x77, 0xd1, 0x30, 0x9e, 0xac, 0xcc, 0x75, 0xee, 0x83, 0xf5, 0xb0, 0x62, 0x39, 0xcf, 0x6c,\n-0x57, 0xe2, 0x4c, 0xd2, 0x91, 0x0b, 0x0e, 0x75, 0x28, 0x1b, 0x9a, 0xbf, 0xfd, 0x1a, 0x43, 0xf1,\n-0xca, 0x77, 0xfb, 0x3b, 0x8f, 0x61, 0xb8, 0x69, 0x28, 0x16, 0x42, 0x04, 0x5e, 0x70, 0x2a, 0x1c,\n-0x21, 0xd8, 0x8f, 0xe1, 0xbd, 0x23, 0x5b, 0x2d, 0x74, 0x40, 0x92, 0xd9, 0x63, 0x19, 0x0d, 0x73,\n-0xdd, 0x69, 0xbc, 0x62, 0x47, 0xbc, 0xe0, 0x74, 0x2b, 0xb2, 0xeb, 0x7d, 0xbe, 0x41, 0x1b, 0xb5,\n-0xc0, 0x46, 0xc5, 0xa1, 0x22, 0xcb, 0x5f, 0x4e, 0xc1, 0x28, 0x92, 0xde, 0x18, 0xba, 0xd5, 0x2a,\n-0x28, 0xbb, 0x11, 0x8b, 0x17, 0x93, 0x98, 0x99, 0x60, 0x94, 0x5c, 0x23, 0xcf, 0x5a, 0x27, 0x97,\n-0x5e, 0x0b, 0x05, 0x06, 0x93, 0x37, 0x1e, 0x3b, 0x69, 0x36, 0xeb, 0xa9, 0x9e, 0x61, 0x1d, 0x8f,\n-0x32, 0xda, 0x8e, 0x0c, 0xd6, 0x74, 0x3e, 0x7b, 0x09, 0x24, 0xda, 0x01, 0x77, 0x47, 0xc4, 0x3b,\n-0xcd, 0x34, 0x8c, 0x99, 0xf5, 0xca, 0xe1, 0x25, 0x61, 0x33, 0xb2, 0x59, 0x1b, 0xe2, 0x6e, 0xd7,\n-0x37, 0x57, 0xb6, 0x0d, 0xa9, 0x12, 0xda, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0,\n-0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x2e, 0xf5, 0x9b, 0x02, 0x28, 0xa7, 0xdb, 0x7a, 0xff, 0xd5,\n-0xa3, 0xa9, 0xee, 0xbd, 0x03, 0xa0, 0xcf, 0x12, 0x6a, 0x1d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06,\n-0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04,\n-0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69,\n-0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75,\n-0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33,\n-0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32,\n-0x36, 0x33, 0x32, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, 0x36,\n-0x33, 0x32, 0x5a, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f,\n-0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30,\n-0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73,\n-0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x20, 0x47, 0x33, 0x30, 0x82, 0x02,\n-0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,\n-0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb3, 0xcb,\n-0x0e, 0x10, 0x67, 0x8e, 0xea, 0x14, 0x97, 0xa7, 0x32, 0x2a, 0x0a, 0x56, 0x36, 0x7f, 0x68, 0x4c,\n-0xc7, 0xb3, 0x6f, 0x3a, 0x23, 0x14, 0x91, 0xff, 0x19, 0x7f, 0xa5, 0xca, 0xac, 0xee, 0xb3, 0x76,\n-0x9d, 0x7a, 0xe9, 0x8b, 0x1b, 0xab, 0x6b, 0x31, 0xdb, 0xfa, 0x0b, 0x53, 0x4c, 0xaf, 0xc5, 0xa5,\n-0x1a, 0x79, 0x3c, 0x8a, 0x4c, 0xff, 0xac, 0xdf, 0x25, 0xde, 0x4e, 0xd9, 0x82, 0x32, 0x0b, 0x44,\n-0xde, 0xca, 0xdb, 0x8c, 0xac, 0xa3, 0x6e, 0x16, 0x83, 0x3b, 0xa6, 0x64, 0x4b, 0x32, 0x89, 0xfb,\n-0x16, 0x16, 0x38, 0x7e, 0xeb, 0x43, 0xe2, 0xd3, 0x74, 0x4a, 0xc2, 0x62, 0x0a, 0x73, 0x0a, 0xdd,\n-0x49, 0xb3, 0x57, 0xd2, 0xb0, 0x0a, 0x85, 0x9d, 0x71, 0x3c, 0xde, 0xa3, 0xcb, 0xc0, 0x32, 0xf3,\n-0x01, 0x39, 0x20, 0x43, 0x1b, 0x35, 0xd1, 0x53, 0xb3, 0xb1, 0xee, 0xc5, 0x93, 0x69, 0x82, 0x3e,\n-0x16, 0xb5, 0x28, 0x46, 0xa1, 0xde, 0xea, 0x89, 0x09, 0xed, 0x43, 0xb8, 0x05, 0x46, 0x8a, 0x86,\n-0xf5, 0x59, 0x47, 0xbe, 0x1b, 0x6f, 0x01, 0x21, 0x10, 0xb9, 0xfd, 0xa9, 0xd2, 0x28, 0xca, 0x10,\n-0x39, 0x09, 0xca, 0x13, 0x36, 0xcf, 0x9c, 0xad, 0xad, 0x40, 0x74, 0x79, 0x2b, 0x02, 0x3f, 0x34,\n-0xff, 0xfa, 0x20, 0x69, 0x7d, 0xd3, 0xee, 0x61, 0xf5, 0xba, 0xb3, 0xe7, 0x30, 0xd0, 0x37, 0x23,\n-0x86, 0x72, 0x61, 0x45, 0x29, 0x48, 0x59, 0x68, 0x6f, 0x77, 0xa6, 0x2e, 0x81, 0xbe, 0x07, 0x4d,\n-0x6f, 0xaf, 0xce, 0xc4, 0x45, 0x13, 0x91, 0x14, 0x70, 0x06, 0x8f, 0x1f, 0x9f, 0xf8, 0x87, 0x69,\n-0xb1, 0x0e, 0xef, 0xc3, 0x89, 0x19, 0xeb, 0xea, 0x1c, 0x61, 0xfc, 0x7a, 0x6c, 0x8a, 0xdc, 0xd6,\n-0x03, 0x0b, 0x9e, 0x26, 0xba, 0x12, 0xdd, 0xd4, 0x54, 0x39, 0xab, 0x26, 0xa3, 0x33, 0xea, 0x75,\n-0x81, 0xda, 0x2d, 0xcd, 0x0f, 0x4f, 0xe4, 0x03, 0xd1, 0xef, 0x15, 0x97, 0x1b, 0x6b, 0x90, 0xc5,\n-0x02, 0x90, 0x93, 0x66, 0x02, 0x21, 0xb1, 0x47, 0xde, 0x8b, 0x9a, 0x4a, 0x80, 0xb9, 0x55, 0x8f,\n-0xb5, 0xa2, 0x2f, 0xc0, 0xd6, 0x33, 0x67, 0xda, 0x7e, 0xc4, 0xa7, 0xb4, 0x04, 0x44, 0xeb, 0x47,\n-0xfb, 0xe6, 0x58, 0xb9, 0xf7, 0x0c, 0xf0, 0x7b, 0x2b, 0xb1, 0xc0, 0x70, 0x29, 0xc3, 0x40, 0x62,\n-0x2d, 0x3b, 0x48, 0x69, 0xdc, 0x23, 0x3c, 0x48, 0xeb, 0x7b, 0x09, 0x79, 0xa9, 0x6d, 0xda, 0xa8,\n-0x30, 0x98, 0xcf, 0x80, 0x72, 0x03, 0x88, 0xa6, 0x5b, 0x46, 0xae, 0x72, 0x79, 0x7c, 0x08, 0x03,\n-0x21, 0x65, 0xae, 0xb7, 0xe1, 0x1c, 0xa5, 0xb1, 0x2a, 0xa2, 0x31, 0xde, 0x66, 0x04, 0xf7, 0xc0,\n-0x74, 0xe8, 0x71, 0xde, 0xff, 0x3d, 0x59, 0xcc, 0x96, 0x26, 0x12, 0x8b, 0x85, 0x95, 0x57, 0x1a,\n-0xab, 0x6b, 0x75, 0x0b, 0x44, 0x3d, 0x11, 0x28, 0x3c, 0x7b, 0x61, 0xb7, 0xe2, 0x8f, 0x67, 0x4f,\n-0xe5, 0xec, 0x3c, 0x4c, 0x60, 0x80, 0x69, 0x57, 0x38, 0x1e, 0x01, 0x5b, 0x8d, 0x55, 0xe8, 0xc7,\n-0xdf, 0xc0, 0xcc, 0x77, 0x23, 0x34, 0x49, 0x75, 0x7c, 0xf6, 0x98, 0x11, 0xeb, 0x2d, 0xde, 0xed,\n-0x41, 0x2e, 0x14, 0x05, 0x02, 0x7f, 0xe0, 0xfe, 0x20, 0xeb, 0x35, 0xe7, 0x11, 0xac, 0x22, 0xce,\n-0x57, 0x3d, 0xde, 0xc9, 0x30, 0x6d, 0x10, 0x03, 0x85, 0xcd, 0xf1, 0xff, 0x8c, 0x16, 0xb5, 0xc1,\n-0xb2, 0x3e, 0x88, 0x6c, 0x60, 0x7f, 0x90, 0x4f, 0x95, 0xf7, 0xf6, 0x2d, 0xad, 0x01, 0x39, 0x07,\n-0x04, 0xfa, 0x75, 0x80, 0x7d, 0xbf, 0x49, 0x50, 0xed, 0xef, 0xc9, 0xc4, 0x7c, 0x1c, 0xeb, 0x80,\n-0x7e, 0xdb, 0xb6, 0xd0, 0xdd, 0x13, 0xfe, 0xc9, 0xd3, 0x9c, 0xd7, 0xb2, 0x97, 0xa9, 0x02, 0x03,\n-0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n-0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n-0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n-0x16, 0x04, 0x14, 0xc6, 0x17, 0xd0, 0xbc, 0xa8, 0xea, 0x02, 0x43, 0xf2, 0x1b, 0x06, 0x99, 0x5d,\n-0x2b, 0x90, 0x20, 0xb9, 0xd7, 0x9c, 0xe4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x34, 0x61, 0xd9, 0x56, 0xb5,\n-0x12, 0x87, 0x55, 0x4d, 0xdd, 0xa3, 0x35, 0x31, 0x46, 0xbb, 0xa4, 0x07, 0x72, 0xbc, 0x5f, 0x61,\n-0x62, 0xe8, 0xa5, 0xfb, 0x0b, 0x37, 0xb1, 0x3c, 0xb6, 0xb3, 0xfa, 0x29, 0x9d, 0x7f, 0x02, 0xf5,\n-0xa4, 0xc9, 0xa8, 0x93, 0xb7, 0x7a, 0x71, 0x28, 0x69, 0x8f, 0x73, 0xe1, 0x52, 0x90, 0xda, 0xd5,\n-0xbe, 0x3a, 0xe5, 0xb7, 0x76, 0x6a, 0x56, 0x80, 0x21, 0xdf, 0x5d, 0xe6, 0xe9, 0x3a, 0x9e, 0xe5,\n-0x3e, 0xf6, 0xa2, 0x69, 0xc7, 0x2a, 0x0a, 0xb0, 0x18, 0x47, 0xdc, 0x20, 0x70, 0x7d, 0x52, 0xa3,\n-0x3e, 0x59, 0x7c, 0xc1, 0xba, 0xc9, 0xc8, 0x15, 0x40, 0x61, 0xca, 0x72, 0xd6, 0x70, 0xac, 0xd2,\n-0xb7, 0xf0, 0x1c, 0xe4, 0x86, 0x29, 0xf0, 0xce, 0xef, 0x68, 0x63, 0xd0, 0xb5, 0x20, 0x8a, 0x15,\n-0x61, 0x9a, 0x7e, 0x86, 0x98, 0xb4, 0xc9, 0xc2, 0x76, 0xfb, 0xcc, 0xba, 0x30, 0x16, 0xcc, 0xa3,\n-0x61, 0xc6, 0x74, 0x13, 0xe5, 0x6b, 0xef, 0xa3, 0x15, 0xea, 0x03, 0xfe, 0x13, 0x8b, 0x64, 0xe4,\n-0xd3, 0xc1, 0xd2, 0xe8, 0x84, 0xfb, 0x49, 0xd1, 0x10, 0x4d, 0x79, 0x66, 0xeb, 0xaa, 0xfd, 0xf4,\n-0x8d, 0x31, 0x1e, 0x70, 0x14, 0xad, 0xdc, 0xde, 0x67, 0x13, 0x4c, 0x81, 0x15, 0x61, 0xbc, 0xb7,\n-0xd9, 0x91, 0x77, 0x71, 0x19, 0x81, 0x60, 0xbb, 0xf0, 0x58, 0xa5, 0xb5, 0x9c, 0x0b, 0xf7, 0x8f,\n-0x22, 0x55, 0x27, 0xc0, 0x4b, 0x01, 0x6d, 0x3b, 0x99, 0x0d, 0xd4, 0x1d, 0x9b, 0x63, 0x67, 0x2f,\n-0xd0, 0xee, 0x0d, 0xca, 0x66, 0xbc, 0x94, 0x4f, 0xa6, 0xad, 0xed, 0xfc, 0xee, 0x63, 0xac, 0x57,\n-0x3f, 0x65, 0x25, 0xcf, 0xb2, 0x86, 0x8f, 0xd0, 0x08, 0xff, 0xb8, 0x76, 0x14, 0x6e, 0xde, 0xe5,\n-0x27, 0xec, 0xab, 0x78, 0xb5, 0x53, 0xb9, 0xb6, 0x3f, 0xe8, 0x20, 0xf9, 0xd2, 0xa8, 0xbe, 0x61,\n-0x46, 0xca, 0x87, 0x8c, 0x84, 0xf3, 0xf9, 0xf1, 0xa0, 0x68, 0x9b, 0x22, 0x1e, 0x81, 0x26, 0x9b,\n-0x10, 0x04, 0x91, 0x71, 0xc0, 0x06, 0x1f, 0xdc, 0xa0, 0xd3, 0xb9, 0x56, 0xa7, 0xe3, 0x98, 0x2d,\n-0x7f, 0x83, 0x9d, 0xdf, 0x8c, 0x2b, 0x9c, 0x32, 0x8e, 0x32, 0x94, 0xf0, 0x01, 0x3c, 0x22, 0x2a,\n-0x9f, 0x43, 0xc2, 0x2e, 0xc3, 0x98, 0x39, 0x07, 0x38, 0x7b, 0xfc, 0x5e, 0x00, 0x42, 0x1f, 0xf3,\n-0x32, 0x26, 0x79, 0x83, 0x84, 0xf6, 0xe5, 0xf0, 0xc1, 0x51, 0x12, 0xc0, 0x0b, 0x1e, 0x04, 0x23,\n-0x0c, 0x54, 0xa5, 0x4c, 0x2f, 0x49, 0xc5, 0x4a, 0xd1, 0xb6, 0x6e, 0x60, 0x0d, 0x6b, 0xfc, 0x6b,\n-0x8b, 0x85, 0x24, 0x64, 0xb7, 0x89, 0x0e, 0xab, 0x25, 0x47, 0x5b, 0x3c, 0xcf, 0x7e, 0x49, 0xbd,\n-0xc7, 0xe9, 0x0a, 0xc6, 0xda, 0xf7, 0x7e, 0x0e, 0x17, 0x08, 0xd3, 0x48, 0x97, 0xd0, 0x71, 0x92,\n-0xf0, 0x0f, 0x39, 0x3e, 0x34, 0x6a, 0x1c, 0x7d, 0xd8, 0xf2, 0x22, 0xae, 0xbb, 0x69, 0xf4, 0x33,\n-0xb4, 0xa6, 0x48, 0x55, 0xd1, 0x0f, 0x0e, 0x26, 0xe8, 0xec, 0xb6, 0x0b, 0x2d, 0xa7, 0x85, 0x35,\n-0xcd, 0xfd, 0x59, 0xc8, 0x9f, 0xd1, 0xcd, 0x3e, 0x5a, 0x29, 0x34, 0xb9, 0x3d, 0x84, 0xce, 0xb1,\n-0x65, 0xd4, 0x59, 0x91, 0x91, 0x56, 0x75, 0x21, 0xc1, 0x77, 0x9e, 0xf9, 0x7a, 0xe1, 0x60, 0x9d,\n-0xd3, 0xad, 0x04, 0x18, 0xf4, 0x7c, 0xeb, 0x5e, 0x93, 0x8f, 0x53, 0x4a, 0x22, 0x29, 0xf8, 0x48,\n-0x2b, 0x3e, 0x4d, 0x86, 0xac, 0x5b, 0x7f, 0xcb, 0x06, 0x99, 0x59, 0x60, 0xd8, 0x58, 0x65, 0x95,\n-0x8d, 0x44, 0xd1, 0xf7, 0x7f, 0x7e, 0x27, 0x7f, 0x7d, 0xae, 0x80, 0xf5, 0x07, 0x4c, 0xb6, 0x3e,\n-0x9c, 0x71, 0x54, 0x99, 0x04, 0x4b, 0xfd, 0x58, 0xf9, 0x98, 0xf4, 0x30, 0x82, 0x03, 0x6d, 0x30,\n-0x82, 0x02, 0x55, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n-0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09,\n-0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55,\n-0x04, 0x0a, 0x13, 0x22, 0x4a, 0x61, 0x70, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n-0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73,\n-0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n-0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74,\n-0x43, 0x41, 0x31, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x34, 0x30, 0x38, 0x30, 0x34,\n-0x35, 0x36, 0x34, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x34, 0x30, 0x38, 0x30, 0x34, 0x35,\n-0x36, 0x34, 0x37, 0x5a, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x4a, 0x50, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x22, 0x4a, 0x61,\n-0x70, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n-0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,\n-0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72,\n-0x65, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x31, 0x30, 0x82,\n-0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n-0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xfd,\n-0x77, 0xaa, 0xa5, 0x1c, 0x90, 0x05, 0x3b, 0xcb, 0x4c, 0x9b, 0x33, 0x8b, 0x5a, 0x14, 0x45, 0xa4,\n-0xe7, 0x90, 0x16, 0xd1, 0xdf, 0x57, 0xd2, 0x21, 0x10, 0xa4, 0x17, 0xfd, 0xdf, 0xac, 0xd6, 0x1f,\n-0xa7, 0xe4, 0xdb, 0x7c, 0xf7, 0xec, 0xdf, 0xb8, 0x03, 0xda, 0x94, 0x58, 0xfd, 0x5d, 0x72, 0x7c,\n-0x8c, 0x3f, 0x5f, 0x01, 0x67, 0x74, 0x15, 0x96, 0xe3, 0x02, 0x3c, 0x87, 0xdb, 0xae, 0xcb, 0x01,\n-0x8e, 0xc2, 0xf3, 0x66, 0xc6, 0x85, 0x45, 0xf4, 0x02, 0xc6, 0x3a, 0xb5, 0x62, 0xb2, 0xaf, 0xfa,\n-0x9c, 0xbf, 0xa4, 0xe6, 0xd4, 0x80, 0x30, 0x98, 0xf3, 0x0d, 0xb6, 0x93, 0x8f, 0xa9, 0xd4, 0xd8,\n-0x36, 0xf2, 0xb0, 0xfc, 0x8a, 0xca, 0x2c, 0xa1, 0x15, 0x33, 0x95, 0x31, 0xda, 0xc0, 0x1b, 0xf2,\n-0xee, 0x62, 0x99, 0x86, 0x63, 0x3f, 0xbf, 0xdd, 0x93, 0x2a, 0x83, 0xa8, 0x76, 0xb9, 0x13, 0x1f,\n-0xb7, 0xce, 0x4e, 0x42, 0x85, 0x8f, 0x22, 0xe7, 0x2e, 0x1a, 0xf2, 0x95, 0x09, 0xb2, 0x05, 0xb5,\n-0x44, 0x4e, 0x77, 0xa1, 0x20, 0xbd, 0xa9, 0xf2, 0x4e, 0x0a, 0x7d, 0x50, 0xad, 0xf5, 0x05, 0x0d,\n-0x45, 0x4f, 0x46, 0x71, 0xfd, 0x28, 0x3e, 0x53, 0xfb, 0x04, 0xd8, 0x2d, 0xd7, 0x65, 0x1d, 0x4a,\n-0x1b, 0xfa, 0xcf, 0x3b, 0xb0, 0x31, 0x9a, 0x35, 0x6e, 0xc8, 0x8b, 0x06, 0xd3, 0x00, 0x91, 0xf2,\n-0x94, 0x08, 0x65, 0x4c, 0xb1, 0x34, 0x06, 0x00, 0x7a, 0x89, 0xe2, 0xf0, 0xc7, 0x03, 0x59, 0xcf,\n-0xd5, 0xd6, 0xe8, 0xa7, 0x32, 0xb3, 0xe6, 0x98, 0x40, 0x86, 0xc5, 0xcd, 0x27, 0x12, 0x8b, 0xcc,\n-0x7b, 0xce, 0xb7, 0x11, 0x3c, 0x62, 0x60, 0x07, 0x23, 0x3e, 0x2b, 0x40, 0x6e, 0x94, 0x80, 0x09,\n-0x6d, 0xb6, 0xb3, 0x6f, 0x77, 0x6f, 0x35, 0x08, 0x50, 0xfb, 0x02, 0x87, 0xc5, 0x3e, 0x89, 0x02,\n-0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n-0x16, 0x04, 0x14, 0x5b, 0xf8, 0x4d, 0x4f, 0xb2, 0xa5, 0x86, 0xd4, 0x3a, 0xd2, 0xf1, 0x63, 0x9a,\n-0xa0, 0xbe, 0x09, 0xf6, 0x57, 0xb7, 0xde, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,\n-0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n-0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa0, 0xa1, 0x38, 0x16,\n-0x66, 0x2e, 0xa7, 0x56, 0x1f, 0x21, 0x9c, 0x06, 0xfa, 0x1d, 0xed, 0xb9, 0x22, 0xc5, 0x38, 0x26,\n-0xd8, 0x4e, 0x4f, 0xec, 0xa3, 0x7f, 0x79, 0xde, 0x46, 0x21, 0xa1, 0x87, 0x77, 0x8f, 0x07, 0x08,\n-0x9a, 0xb2, 0xa4, 0xc5, 0xaf, 0x0f, 0x32, 0x98, 0x0b, 0x7c, 0x66, 0x29, 0xb6, 0x9b, 0x7d, 0x25,\n-0x52, 0x49, 0x43, 0xab, 0x4c, 0x2e, 0x2b, 0x6e, 0x7a, 0x70, 0xaf, 0x16, 0x0e, 0xe3, 0x02, 0x6c,\n-0xfb, 0x42, 0xe6, 0x18, 0x9d, 0x45, 0xd8, 0x55, 0xc8, 0xe8, 0x3b, 0xdd, 0xe7, 0xe1, 0xf4, 0x2e,\n-0x0b, 0x1c, 0x34, 0x5c, 0x6c, 0x58, 0x4a, 0xfb, 0x8c, 0x88, 0x50, 0x5f, 0x95, 0x1c, 0xbf, 0xed,\n-0xab, 0x22, 0xb5, 0x65, 0xb3, 0x85, 0xba, 0x9e, 0x0f, 0xb8, 0xad, 0xe5, 0x7a, 0x1b, 0x8a, 0x50,\n-0x3a, 0x1d, 0xbd, 0x0d, 0xbc, 0x7b, 0x54, 0x50, 0x0b, 0xb9, 0x42, 0xaf, 0x55, 0xa0, 0x18, 0x81,\n-0xad, 0x65, 0x99, 0xef, 0xbe, 0xe4, 0x9c, 0xbf, 0xc4, 0x85, 0xab, 0x41, 0xb2, 0x54, 0x6f, 0xdc,\n-0x25, 0xcd, 0xed, 0x78, 0xe2, 0x8e, 0x0c, 0x8d, 0x09, 0x49, 0xdd, 0x63, 0x7b, 0x5a, 0x69, 0x96,\n-0x02, 0x21, 0xa8, 0xbd, 0x52, 0x59, 0xe9, 0x7d, 0x35, 0xcb, 0xc8, 0x52, 0xca, 0x7f, 0x81, 0xfe,\n-0xd9, 0x6b, 0xd3, 0xf7, 0x11, 0xed, 0x25, 0xdf, 0xf8, 0xe7, 0xf9, 0xa4, 0xfa, 0x72, 0x97, 0x84,\n-0x53, 0x0d, 0xa5, 0xd0, 0x32, 0x18, 0x51, 0x76, 0x59, 0x14, 0x6c, 0x0f, 0xeb, 0xec, 0x5f, 0x80,\n-0x8c, 0x75, 0x43, 0x83, 0xc3, 0x85, 0x98, 0xff, 0x4c, 0x9e, 0x2d, 0x0d, 0xe4, 0x77, 0x83, 0x93,\n-0x4e, 0xb5, 0x96, 0x07, 0x8b, 0x28, 0x13, 0x9b, 0x8c, 0x19, 0x8d, 0x41, 0x27, 0x49, 0x40, 0xee,\n-0xde, 0xe6, 0x23, 0x44, 0x39, 0xdc, 0xa1, 0x22, 0xd6, 0xba, 0x03, 0xf2, 0x30, 0x82, 0x03, 0x5a,\n-0x30, 0x82, 0x02, 0x42, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x50, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x13, 0x0f, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74,\n-0x2e, 0x6e, 0x65, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53,\n-0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63,\n-0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30, 0x1e, 0x17,\n-0x0d, 0x30, 0x33, 0x30, 0x39, 0x33, 0x30, 0x30, 0x34, 0x32, 0x30, 0x34, 0x39, 0x5a, 0x17, 0x0d,\n-0x32, 0x33, 0x30, 0x39, 0x33, 0x30, 0x30, 0x34, 0x32, 0x30, 0x34, 0x39, 0x5a, 0x30, 0x50, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x18, 0x30, 0x16,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75,\n-0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,\n-0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e,\n-0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30,\n-0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,\n-0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00,\n-0xb3, 0xb3, 0xfe, 0x7f, 0xd3, 0x6d, 0xb1, 0xef, 0x16, 0x7c, 0x57, 0xa5, 0x0c, 0x6d, 0x76, 0x8a,\n-0x2f, 0x4b, 0xbf, 0x64, 0xfb, 0x4c, 0xee, 0x8a, 0xf0, 0xf3, 0x29, 0x7c, 0xf5, 0xff, 0xee, 0x2a,\n-0xe0, 0xe9, 0xe9, 0xba, 0x5b, 0x64, 0x22, 0x9a, 0x9a, 0x6f, 0x2c, 0x3a, 0x26, 0x69, 0x51, 0x05,\n-0x99, 0x26, 0xdc, 0xd5, 0x1c, 0x6a, 0x71, 0xc6, 0x9a, 0x7d, 0x1e, 0x9d, 0xdd, 0x7c, 0x6c, 0xc6,\n-0x8c, 0x67, 0x67, 0x4a, 0x3e, 0xf8, 0x71, 0xb0, 0x19, 0x27, 0xa9, 0x09, 0x0c, 0xa6, 0x95, 0xbf,\n-0x4b, 0x8c, 0x0c, 0xfa, 0x55, 0x98, 0x3b, 0xd8, 0xe8, 0x22, 0xa1, 0x4b, 0x71, 0x38, 0x79, 0xac,\n-0x97, 0x92, 0x69, 0xb3, 0x89, 0x7e, 0xea, 0x21, 0x68, 0x06, 0x98, 0x14, 0x96, 0x87, 0xd2, 0x61,\n-0x36, 0xbc, 0x6d, 0x27, 0x56, 0x9e, 0x57, 0xee, 0xc0, 0xc0, 0x56, 0xfd, 0x32, 0xcf, 0xa4, 0xd9,\n-0x8e, 0xc2, 0x23, 0xd7, 0x8d, 0xa8, 0xf3, 0xd8, 0x25, 0xac, 0x97, 0xe4, 0x70, 0x38, 0xf4, 0xb6,\n-0x3a, 0xb4, 0x9d, 0x3b, 0x97, 0x26, 0x43, 0xa3, 0xa1, 0xbc, 0x49, 0x59, 0x72, 0x4c, 0x23, 0x30,\n-0x87, 0x01, 0x58, 0xf6, 0x4e, 0xbe, 0x1c, 0x68, 0x56, 0x66, 0xaf, 0xcd, 0x41, 0x5d, 0xc8, 0xb3,\n-0x4d, 0x2a, 0x55, 0x46, 0xab, 0x1f, 0xda, 0x1e, 0xe2, 0x40, 0x3d, 0xdb, 0xcd, 0x7d, 0xb9, 0x92,\n-0x80, 0x9c, 0x37, 0xdd, 0x0c, 0x96, 0x64, 0x9d, 0xdc, 0x22, 0xf7, 0x64, 0x8b, 0xdf, 0x61, 0xde,\n-0x15, 0x94, 0x52, 0x15, 0xa0, 0x7d, 0x52, 0xc9, 0x4b, 0xa8, 0x21, 0xc9, 0xc6, 0xb1, 0xed, 0xcb,\n-0xc3, 0x95, 0x60, 0xd1, 0x0f, 0xf0, 0xab, 0x70, 0xf8, 0xdf, 0xcb, 0x4d, 0x7e, 0xec, 0xd6, 0xfa,\n-0xab, 0xd9, 0xbd, 0x7f, 0x54, 0xf2, 0xa5, 0xe9, 0x79, 0xfa, 0xd9, 0xd6, 0x76, 0x24, 0x28, 0x73,\n-0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x3f, 0x30, 0x3d, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\n-0x04, 0x16, 0x04, 0x14, 0xa0, 0x73, 0x49, 0x99, 0x68, 0xdc, 0x85, 0x5b, 0x65, 0xe3, 0x9b, 0x28,\n-0x2f, 0x57, 0x9f, 0xbd, 0x33, 0xbc, 0x07, 0x48, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04,\n-0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n-0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x68, 0x40, 0xa9, 0xa8, 0xbb, 0xe4,\n-0x4f, 0x5d, 0x79, 0xb3, 0x05, 0xb5, 0x17, 0xb3, 0x60, 0x13, 0xeb, 0xc6, 0x92, 0x5d, 0xe0, 0xd1,\n-0xd3, 0x6a, 0xfe, 0xfb, 0xbe, 0x9b, 0x6d, 0xbf, 0xc7, 0x05, 0x6d, 0x59, 0x20, 0xc4, 0x1c, 0xf0,\n-0xb7, 0xda, 0x84, 0x58, 0x02, 0x63, 0xfa, 0x48, 0x16, 0xef, 0x4f, 0xa5, 0x0b, 0xf7, 0x4a, 0x98,\n-0xf2, 0x3f, 0x9e, 0x1b, 0xad, 0x47, 0x6b, 0x63, 0xce, 0x08, 0x47, 0xeb, 0x52, 0x3f, 0x78, 0x9c,\n-0xaf, 0x4d, 0xae, 0xf8, 0xd5, 0x4f, 0xcf, 0x9a, 0x98, 0x2a, 0x10, 0x41, 0x39, 0x52, 0xc4, 0xdd,\n-0xd9, 0x9b, 0x0e, 0xef, 0x93, 0x01, 0xae, 0xb2, 0x2e, 0xca, 0x68, 0x42, 0x24, 0x42, 0x6c, 0xb0,\n-0xb3, 0x3a, 0x3e, 0xcd, 0xe9, 0xda, 0x48, 0xc4, 0x15, 0xcb, 0xe9, 0xf9, 0x07, 0x0f, 0x92, 0x50,\n-0x49, 0x8a, 0xdd, 0x31, 0x97, 0x5f, 0xc9, 0xe9, 0x37, 0xaa, 0x3b, 0x59, 0x65, 0x97, 0x94, 0x32,\n-0xc9, 0xb3, 0x9f, 0x3e, 0x3a, 0x62, 0x58, 0xc5, 0x49, 0xad, 0x62, 0x0e, 0x71, 0xa5, 0x32, 0xaa,\n-0x2f, 0xc6, 0x89, 0x76, 0x43, 0x40, 0x13, 0x13, 0x67, 0x3d, 0xa2, 0x54, 0x25, 0x10, 0xcb, 0xf1,\n-0x3a, 0xf2, 0xd9, 0xfa, 0xdb, 0x49, 0x56, 0xbb, 0xa6, 0xfe, 0xa7, 0x41, 0x35, 0xc3, 0xe0, 0x88,\n-0x61, 0xc9, 0x88, 0xc7, 0xdf, 0x36, 0x10, 0x22, 0x98, 0x59, 0xea, 0xb0, 0x4a, 0xfb, 0x56, 0x16,\n-0x73, 0x6e, 0xac, 0x4d, 0xf7, 0x22, 0xa1, 0x4f, 0xad, 0x1d, 0x7a, 0x2d, 0x45, 0x27, 0xe5, 0x30,\n-0xc1, 0x5e, 0xf2, 0xda, 0x13, 0xcb, 0x25, 0x42, 0x51, 0x95, 0x47, 0x03, 0x8c, 0x6c, 0x21, 0xcc,\n-0x74, 0x42, 0xed, 0x53, 0xff, 0x33, 0x8b, 0x8f, 0x0f, 0x57, 0x01, 0x16, 0x2f, 0xcf, 0xa6, 0xee,\n-0xc9, 0x70, 0x22, 0x14, 0xbd, 0xfd, 0xbe, 0x6c, 0x0b, 0x03, 0x30, 0x82, 0x03, 0x77, 0x30, 0x82,\n-0x02, 0x5f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, 0x06,\n-0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04,\n-0x0a, 0x13, 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53,\n-0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31,\n-0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69,\n-0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n-0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x35,\n-0x32, 0x39, 0x30, 0x35, 0x30, 0x30, 0x33, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x35, 0x32,\n-0x39, 0x30, 0x35, 0x30, 0x30, 0x33, 0x39, 0x5a, 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n-0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a,\n-0x13, 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x79,\n-0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x27,\n-0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,\n-0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n-0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n-0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,\n-0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd0, 0x15, 0x39, 0x52, 0xb1, 0x52, 0xb3, 0xba,\n-0xc5, 0x59, 0x82, 0xc4, 0x5d, 0x52, 0xae, 0x3a, 0x43, 0x65, 0x80, 0x4b, 0xc7, 0xf2, 0x96, 0xbc,\n-0xdb, 0x36, 0x97, 0xd6, 0xa6, 0x64, 0x8c, 0xa8, 0x5e, 0xf0, 0xe3, 0x0a, 0x1c, 0xf7, 0xdf, 0x97,\n-0x3d, 0x4b, 0xae, 0xf6, 0x5d, 0xec, 0x21, 0xb5, 0x41, 0xab, 0xcd, 0xb9, 0x7e, 0x76, 0x9f, 0xbe,\n-0xf9, 0x3e, 0x36, 0x34, 0xa0, 0x3b, 0xc1, 0xf6, 0x31, 0x11, 0x45, 0x74, 0x93, 0x3d, 0x57, 0x80,\n-0xc5, 0xf9, 0x89, 0x99, 0xca, 0xe5, 0xab, 0x6a, 0xd4, 0xb5, 0xda, 0x41, 0x90, 0x10, 0xc1, 0xd6,\n-0xd6, 0x42, 0x89, 0xc2, 0xbf, 0xf4, 0x38, 0x12, 0x95, 0x4c, 0x54, 0x05, 0xf7, 0x36, 0xe4, 0x45,\n-0x83, 0x7b, 0x14, 0x65, 0xd6, 0xdc, 0x0c, 0x4d, 0xd1, 0xde, 0x7e, 0x0c, 0xab, 0x3b, 0xc4, 0x15,\n-0xbe, 0x3a, 0x56, 0xa6, 0x5a, 0x6f, 0x76, 0x69, 0x52, 0xa9, 0x7a, 0xb9, 0xc8, 0xeb, 0x6a, 0x9a,\n-0x5d, 0x52, 0xd0, 0x2d, 0x0a, 0x6b, 0x35, 0x16, 0x09, 0x10, 0x84, 0xd0, 0x6a, 0xca, 0x3a, 0x06,\n-0x00, 0x37, 0x47, 0xe4, 0x7e, 0x57, 0x4f, 0x3f, 0x8b, 0xeb, 0x67, 0xb8, 0x88, 0xaa, 0xc5, 0xbe,\n-0x53, 0x55, 0xb2, 0x91, 0xc4, 0x7d, 0xb9, 0xb0, 0x85, 0x19, 0x06, 0x78, 0x2e, 0xdb, 0x61, 0x1a,\n-0xfa, 0x85, 0xf5, 0x4a, 0x91, 0xa1, 0xe7, 0x16, 0xd5, 0x8e, 0xa2, 0x39, 0xdf, 0x94, 0xb8, 0x70,\n-0x1f, 0x28, 0x3f, 0x8b, 0xfc, 0x40, 0x5e, 0x63, 0x83, 0x3c, 0x83, 0x2a, 0x1a, 0x99, 0x6b, 0xcf,\n-0xde, 0x59, 0x6a, 0x3b, 0xfc, 0x6f, 0x16, 0xd7, 0x1f, 0xfd, 0x4a, 0x10, 0xeb, 0x4e, 0x82, 0x16,\n-0x3a, 0xac, 0x27, 0x0c, 0x53, 0xf1, 0xad, 0xd5, 0x24, 0xb0, 0x6b, 0x03, 0x50, 0xc1, 0x2d, 0x3c,\n-0x16, 0xdd, 0x44, 0x34, 0x27, 0x1a, 0x75, 0xfb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30,\n-0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x0a, 0x85, 0xa9, 0x77,\n-0x65, 0x05, 0x98, 0x7c, 0x40, 0x81, 0xf8, 0x0f, 0x97, 0x2c, 0x38, 0xf1, 0x0a, 0xec, 0x3c, 0xcf,\n-0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n-0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n-0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n-0x03, 0x82, 0x01, 0x01, 0x00, 0x4c, 0x3a, 0xa3, 0x44, 0xac, 0xb9, 0x45, 0xb1, 0xc7, 0x93, 0x7e,\n-0xc8, 0x0b, 0x0a, 0x42, 0xdf, 0x64, 0xea, 0x1c, 0xee, 0x59, 0x6c, 0x08, 0xba, 0x89, 0x5f, 0x6a,\n-0xca, 0x4a, 0x95, 0x9e, 0x7a, 0x8f, 0x07, 0xc5, 0xda, 0x45, 0x72, 0x82, 0x71, 0x0e, 0x3a, 0xd2,\n-0xcc, 0x6f, 0xa7, 0xb4, 0xa1, 0x23, 0xbb, 0xf6, 0x24, 0x9f, 0xcb, 0x17, 0xfe, 0x8c, 0xa6, 0xce,\n-0xc2, 0xd2, 0xdb, 0xcc, 0x8d, 0xfc, 0x71, 0xfc, 0x03, 0x29, 0xc1, 0x6c, 0x5d, 0x33, 0x5f, 0x64,\n-0xb6, 0x65, 0x3b, 0x89, 0x6f, 0x18, 0x76, 0x78, 0xf5, 0xdc, 0xa2, 0x48, 0x1f, 0x19, 0x3f, 0x8e,\n-0x93, 0xeb, 0xf1, 0xfa, 0x17, 0xee, 0xcd, 0x4e, 0xe3, 0x04, 0x12, 0x55, 0xd6, 0xe5, 0xe4, 0xdd,\n-0xfb, 0x3e, 0x05, 0x7c, 0xe2, 0x1d, 0x5e, 0xc6, 0xa7, 0xbc, 0x97, 0x4f, 0x68, 0x3a, 0xf5, 0xe9,\n-0x2e, 0x0a, 0x43, 0xb6, 0xaf, 0x57, 0x5c, 0x62, 0x68, 0x7c, 0xb7, 0xfd, 0xa3, 0x8a, 0x84, 0xa0,\n-0xac, 0x62, 0xbe, 0x2b, 0x09, 0x87, 0x34, 0xf0, 0x6a, 0x01, 0xbb, 0x9b, 0x29, 0x56, 0x3c, 0xfe,\n-0x00, 0x37, 0xcf, 0x23, 0x6c, 0xf1, 0x4e, 0xaa, 0xb6, 0x74, 0x46, 0x12, 0x6c, 0x91, 0xee, 0x34,\n-0xd5, 0xec, 0x9a, 0x91, 0xe7, 0x44, 0xbe, 0x90, 0x31, 0x72, 0xd5, 0x49, 0x02, 0xf6, 0x02, 0xe5,\n-0xf4, 0x1f, 0xeb, 0x7c, 0xd9, 0x96, 0x55, 0xa9, 0xff, 0xec, 0x8a, 0xf9, 0x99, 0x47, 0xff, 0x35,\n-0x5a, 0x02, 0xaa, 0x04, 0xcb, 0x8a, 0x5b, 0x87, 0x71, 0x29, 0x91, 0xbd, 0xa4, 0xb4, 0x7a, 0x0d,\n-0xbd, 0x9a, 0xf5, 0x57, 0x23, 0x00, 0x07, 0x21, 0x17, 0x3f, 0x4a, 0x39, 0xd1, 0x05, 0x49, 0x0b,\n-0xa7, 0xb6, 0x37, 0x81, 0xa5, 0x5d, 0x8c, 0xaa, 0x33, 0x5e, 0x81, 0x28, 0x7c, 0xa7, 0x7d, 0x27,\n-0xeb, 0x00, 0xae, 0x8d, 0x37, 0x30, 0x82, 0x05, 0xd8, 0x30, 0x82, 0x03, 0xc0, 0xa0, 0x03, 0x02,\n-0x01, 0x02, 0x02, 0x10, 0x4c, 0xaa, 0xf9, 0xca, 0xdb, 0x63, 0x6f, 0xe0, 0x1f, 0xf7, 0x4e, 0xd8,\n-0x5b, 0x03, 0x86, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n-0x0c, 0x05, 0x00, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72,\n-0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72,\n-0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f,\n-0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d,\n-0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b,\n-0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20,\n-0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n-0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31,\n-0x30, 0x30, 0x31, 0x31, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38,\n-0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x85, 0x31, 0x0b,\n-0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06,\n-0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61,\n-0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04,\n-0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c,\n-0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n-0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74,\n-0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,\n-0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02,\n-0x82, 0x02, 0x01, 0x00, 0x91, 0xe8, 0x54, 0x92, 0xd2, 0x0a, 0x56, 0xb1, 0xac, 0x0d, 0x24, 0xdd,\n-0xc5, 0xcf, 0x44, 0x67, 0x74, 0x99, 0x2b, 0x37, 0xa3, 0x7d, 0x23, 0x70, 0x00, 0x71, 0xbc, 0x53,\n-0xdf, 0xc4, 0xfa, 0x2a, 0x12, 0x8f, 0x4b, 0x7f, 0x10, 0x56, 0xbd, 0x9f, 0x70, 0x72, 0xb7, 0x61,\n-0x7f, 0xc9, 0x4b, 0x0f, 0x17, 0xa7, 0x3d, 0xe3, 0xb0, 0x04, 0x61, 0xee, 0xff, 0x11, 0x97, 0xc7,\n-0xf4, 0x86, 0x3e, 0x0a, 0xfa, 0x3e, 0x5c, 0xf9, 0x93, 0xe6, 0x34, 0x7a, 0xd9, 0x14, 0x6b, 0xe7,\n-0x9c, 0xb3, 0x85, 0xa0, 0x82, 0x7a, 0x76, 0xaf, 0x71, 0x90, 0xd7, 0xec, 0xfd, 0x0d, 0xfa, 0x9c,\n-0x6c, 0xfa, 0xdf, 0xb0, 0x82, 0xf4, 0x14, 0x7e, 0xf9, 0xbe, 0xc4, 0xa6, 0x2f, 0x4f, 0x7f, 0x99,\n-0x7f, 0xb5, 0xfc, 0x67, 0x43, 0x72, 0xbd, 0x0c, 0x00, 0xd6, 0x89, 0xeb, 0x6b, 0x2c, 0xd3, 0xed,\n-0x8f, 0x98, 0x1c, 0x14, 0xab, 0x7e, 0xe5, 0xe3, 0x6e, 0xfc, 0xd8, 0xa8, 0xe4, 0x92, 0x24, 0xda,\n-0x43, 0x6b, 0x62, 0xb8, 0x55, 0xfd, 0xea, 0xc1, 0xbc, 0x6c, 0xb6, 0x8b, 0xf3, 0x0e, 0x8d, 0x9a,\n-0xe4, 0x9b, 0x6c, 0x69, 0x99, 0xf8, 0x78, 0x48, 0x30, 0x45, 0xd5, 0xad, 0xe1, 0x0d, 0x3c, 0x45,\n-0x60, 0xfc, 0x32, 0x96, 0x51, 0x27, 0xbc, 0x67, 0xc3, 0xca, 0x2e, 0xb6, 0x6b, 0xea, 0x46, 0xc7,\n-0xc7, 0x20, 0xa0, 0xb1, 0x1f, 0x65, 0xde, 0x48, 0x08, 0xba, 0xa4, 0x4e, 0xa9, 0xf2, 0x83, 0x46,\n-0x37, 0x84, 0xeb, 0xe8, 0xcc, 0x81, 0x48, 0x43, 0x67, 0x4e, 0x72, 0x2a, 0x9b, 0x5c, 0xbd, 0x4c,\n-0x1b, 0x28, 0x8a, 0x5c, 0x22, 0x7b, 0xb4, 0xab, 0x98, 0xd9, 0xee, 0xe0, 0x51, 0x83, 0xc3, 0x09,\n-0x46, 0x4e, 0x6d, 0x3e, 0x99, 0xfa, 0x95, 0x17, 0xda, 0x7c, 0x33, 0x57, 0x41, 0x3c, 0x8d, 0x51,\n-0xed, 0x0b, 0xb6, 0x5c, 0xaf, 0x2c, 0x63, 0x1a, 0xdf, 0x57, 0xc8, 0x3f, 0xbc, 0xe9, 0x5d, 0xc4,\n-0x9b, 0xaf, 0x45, 0x99, 0xe2, 0xa3, 0x5a, 0x24, 0xb4, 0xba, 0xa9, 0x56, 0x3d, 0xcf, 0x6f, 0xaa,\n-0xff, 0x49, 0x58, 0xbe, 0xf0, 0xa8, 0xff, 0xf4, 0xb8, 0xad, 0xe9, 0x37, 0xfb, 0xba, 0xb8, 0xf4,\n-0x0b, 0x3a, 0xf9, 0xe8, 0x43, 0x42, 0x1e, 0x89, 0xd8, 0x84, 0xcb, 0x13, 0xf1, 0xd9, 0xbb, 0xe1,\n-0x89, 0x60, 0xb8, 0x8c, 0x28, 0x56, 0xac, 0x14, 0x1d, 0x9c, 0x0a, 0xe7, 0x71, 0xeb, 0xcf, 0x0e,\n-0xdd, 0x3d, 0xa9, 0x96, 0xa1, 0x48, 0xbd, 0x3c, 0xf7, 0xaf, 0xb5, 0x0d, 0x22, 0x4c, 0xc0, 0x11,\n-0x81, 0xec, 0x56, 0x3b, 0xf6, 0xd3, 0xa2, 0xe2, 0x5b, 0xb7, 0xb2, 0x04, 0x22, 0x52, 0x95, 0x80,\n-0x93, 0x69, 0xe8, 0x8e, 0x4c, 0x65, 0xf1, 0x91, 0x03, 0x2d, 0x70, 0x74, 0x02, 0xea, 0x8b, 0x67,\n-0x15, 0x29, 0x69, 0x52, 0x02, 0xbb, 0xd7, 0xdf, 0x50, 0x6a, 0x55, 0x46, 0xbf, 0xa0, 0xa3, 0x28,\n-0x61, 0x7f, 0x70, 0xd0, 0xc3, 0xa2, 0xaa, 0x2c, 0x21, 0xaa, 0x47, 0xce, 0x28, 0x9c, 0x06, 0x45,\n-0x76, 0xbf, 0x82, 0x18, 0x27, 0xb4, 0xd5, 0xae, 0xb4, 0xcb, 0x50, 0xe6, 0x6b, 0xf4, 0x4c, 0x86,\n-0x71, 0x30, 0xe9, 0xa6, 0xdf, 0x16, 0x86, 0xe0, 0xd8, 0xff, 0x40, 0xdd, 0xfb, 0xd0, 0x42, 0x88,\n-0x7f, 0xa3, 0x33, 0x3a, 0x2e, 0x5c, 0x1e, 0x41, 0x11, 0x81, 0x63, 0xce, 0x18, 0x71, 0x6b, 0x2b,\n-0xec, 0xa6, 0x8a, 0xb7, 0x31, 0x5c, 0x3a, 0x6a, 0x47, 0xe0, 0xc3, 0x79, 0x59, 0xd6, 0x20, 0x1a,\n-0xaf, 0xf2, 0x6a, 0x98, 0xaa, 0x72, 0xbc, 0x57, 0x4a, 0xd2, 0x4b, 0x9d, 0xbb, 0x10, 0xfc, 0xb0,\n-0x4c, 0x41, 0xe5, 0xed, 0x1d, 0x3d, 0x5e, 0x28, 0x9d, 0x9c, 0xcc, 0xbf, 0xb3, 0x51, 0xda, 0xa7,\n-0x47, 0xe5, 0x84, 0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06,\n-0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xbb, 0xaf, 0x7e, 0x02, 0x3d, 0xfa, 0xa6, 0xf1,\n-0x3c, 0x84, 0x8e, 0xad, 0xee, 0x38, 0x98, 0xec, 0xd9, 0x32, 0x32, 0xd4, 0x30, 0x0e, 0x06, 0x03,\n-0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03,\n-0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,\n-0x00, 0x0a, 0xf1, 0xd5, 0x46, 0x84, 0xb7, 0xae, 0x51, 0xbb, 0x6c, 0xb2, 0x4d, 0x41, 0x14, 0x00,\n-0x93, 0x4c, 0x9c, 0xcb, 0xe5, 0xc0, 0x54, 0xcf, 0xa0, 0x25, 0x8e, 0x02, 0xf9, 0xfd, 0xb0, 0xa2,\n-0x0d, 0xf5, 0x20, 0x98, 0x3c, 0x13, 0x2d, 0xac, 0x56, 0xa2, 0xb0, 0xd6, 0x7e, 0x11, 0x92, 0xe9,\n-0x2e, 0xba, 0x9e, 0x2e, 0x9a, 0x72, 0xb1, 0xbd, 0x19, 0x44, 0x6c, 0x61, 0x35, 0xa2, 0x9a, 0xb4,\n-0x16, 0x12, 0x69, 0x5a, 0x8c, 0xe1, 0xd7, 0x3e, 0xa4, 0x1a, 0xe8, 0x2f, 0x03, 0xf4, 0xae, 0x61,\n-0x1d, 0x10, 0x1b, 0x2a, 0xa4, 0x8b, 0x7a, 0xc5, 0xfe, 0x05, 0xa6, 0xe1, 0xc0, 0xd6, 0xc8, 0xfe,\n-0x9e, 0xae, 0x8f, 0x2b, 0xba, 0x3d, 0x99, 0xf8, 0xd8, 0x73, 0x09, 0x58, 0x46, 0x6e, 0xa6, 0x9c,\n-0xf4, 0xd7, 0x27, 0xd3, 0x95, 0xda, 0x37, 0x83, 0x72, 0x1c, 0xd3, 0x73, 0xe0, 0xa2, 0x47, 0x99,\n-0x03, 0x38, 0x5d, 0xd5, 0x49, 0x79, 0x00, 0x29, 0x1c, 0xc7, 0xec, 0x9b, 0x20, 0x1c, 0x07, 0x24,\n-0x69, 0x57, 0x78, 0xb2, 0x39, 0xfc, 0x3a, 0x84, 0xa0, 0xb5, 0x9c, 0x7c, 0x8d, 0xbf, 0x2e, 0x93,\n-0x62, 0x27, 0xb7, 0x39, 0xda, 0x17, 0x18, 0xae, 0xbd, 0x3c, 0x09, 0x68, 0xff, 0x84, 0x9b, 0x3c,\n-0xd5, 0xd6, 0x0b, 0x03, 0xe3, 0x57, 0x9e, 0x14, 0xf7, 0xd1, 0xeb, 0x4f, 0xc8, 0xbd, 0x87, 0x23,\n-0xb7, 0xb6, 0x49, 0x43, 0x79, 0x85, 0x5c, 0xba, 0xeb, 0x92, 0x0b, 0xa1, 0xc6, 0xe8, 0x68, 0xa8,\n-0x4c, 0x16, 0xb1, 0x1a, 0x99, 0x0a, 0xe8, 0x53, 0x2c, 0x92, 0xbb, 0xa1, 0x09, 0x18, 0x75, 0x0c,\n-0x65, 0xa8, 0x7b, 0xcb, 0x23, 0xb7, 0x1a, 0xc2, 0x28, 0x85, 0xc3, 0x1b, 0xff, 0xd0, 0x2b, 0x62,\n-0xef, 0xa4, 0x7b, 0x09, 0x91, 0x98, 0x67, 0x8c, 0x14, 0x01, 0xcd, 0x68, 0x06, 0x6a, 0x63, 0x21,\n-0x75, 0x03, 0x80, 0x88, 0x8a, 0x6e, 0x81, 0xc6, 0x85, 0xf2, 0xa9, 0xa4, 0x2d, 0xe7, 0xf4, 0xa5,\n-0x24, 0x10, 0x47, 0x83, 0xca, 0xcd, 0xf4, 0x8d, 0x79, 0x58, 0xb1, 0x06, 0x9b, 0xe7, 0x1a, 0x2a,\n-0xd9, 0x9d, 0x01, 0xd7, 0x94, 0x7d, 0xed, 0x03, 0x4a, 0xca, 0xf0, 0xdb, 0xe8, 0xa9, 0x01, 0x3e,\n-0xf5, 0x56, 0x99, 0xc9, 0x1e, 0x8e, 0x49, 0x3d, 0xbb, 0xe5, 0x09, 0xb9, 0xe0, 0x4f, 0x49, 0x92,\n-0x3d, 0x16, 0x82, 0x40, 0xcc, 0xcc, 0x59, 0xc6, 0xe6, 0x3a, 0xed, 0x12, 0x2e, 0x69, 0x3c, 0x6c,\n-0x95, 0xb1, 0xfd, 0xaa, 0x1d, 0x7b, 0x7f, 0x86, 0xbe, 0x1e, 0x0e, 0x32, 0x46, 0xfb, 0xfb, 0x13,\n-0x8f, 0x75, 0x7f, 0x4c, 0x8b, 0x4b, 0x46, 0x63, 0xfe, 0x00, 0x34, 0x40, 0x70, 0xc1, 0xc3, 0xb9,\n-0xa1, 0xdd, 0xa6, 0x70, 0xe2, 0x04, 0xb3, 0x41, 0xbc, 0xe9, 0x80, 0x91, 0xea, 0x64, 0x9c, 0x7a,\n-0xe1, 0x22, 0x03, 0xa9, 0x9c, 0x6e, 0x6f, 0x0e, 0x65, 0x4f, 0x6c, 0x87, 0x87, 0x5e, 0xf3, 0x6e,\n-0xa0, 0xf9, 0x75, 0xa5, 0x9b, 0x40, 0xe8, 0x53, 0xb2, 0x27, 0x9d, 0x4a, 0xb9, 0xc0, 0x77, 0x21,\n-0x8d, 0xff, 0x87, 0xf2, 0xde, 0xbc, 0x8c, 0xef, 0x17, 0xdf, 0xb7, 0x49, 0x0b, 0xd1, 0xf2, 0x6e,\n-0x30, 0x0b, 0x1a, 0x0e, 0x4e, 0x76, 0xed, 0x11, 0xfc, 0xf5, 0xe9, 0x56, 0xb2, 0x7d, 0xbf, 0xc7,\n-0x6d, 0x0a, 0x93, 0x8c, 0xa5, 0xd0, 0xc0, 0xb6, 0x1d, 0xbe, 0x3a, 0x4e, 0x94, 0xa2, 0xd7, 0x6e,\n-0x6c, 0x0b, 0xc2, 0x8a, 0x7c, 0xfa, 0x20, 0xf3, 0xc4, 0xe4, 0xe5, 0xcd, 0x0d, 0xa8, 0xcb, 0x91,\n-0x92, 0xb1, 0x7c, 0x85, 0xec, 0xb5, 0x14, 0x69, 0x66, 0x0e, 0x82, 0xe7, 0xcd, 0xce, 0xc8, 0x2d,\n-0xa6, 0x51, 0x7f, 0x21, 0xc1, 0x35, 0x53, 0x85, 0x06, 0x4a, 0x5d, 0x9f, 0xad, 0xbb, 0x1b, 0x5f,\n-0x74, 0x30, 0x82, 0x04, 0x0f, 0x30, 0x82, 0x02, 0xf7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01,\n-0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,\n-0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n-0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69,\n-0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73,\n-0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,\n-0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73,\n-0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n-0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34,\n-0x30, 0x36, 0x32, 0x39, 0x31, 0x37, 0x33, 0x39, 0x31, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x30,\n-0x36, 0x32, 0x39, 0x31, 0x37, 0x33, 0x39, 0x31, 0x36, 0x5a, 0x30, 0x68, 0x31, 0x0b, 0x30, 0x09,\n-0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55,\n-0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65,\n-0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,\n-0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x29, 0x53, 0x74, 0x61, 0x72, 0x66,\n-0x69, 0x65, 0x6c, 0x64, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72,\n-0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n-0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08,\n-0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0x32, 0xc8, 0xfe, 0xe9, 0x71, 0xa6, 0x04, 0x85, 0xad, 0x0c,\n-0x11, 0x64, 0xdf, 0xce, 0x4d, 0xef, 0xc8, 0x03, 0x18, 0x87, 0x3f, 0xa1, 0xab, 0xfb, 0x3c, 0xa6,\n-0x9f, 0xf0, 0xc3, 0xa1, 0xda, 0xd4, 0xd8, 0x6e, 0x2b, 0x53, 0x90, 0xfb, 0x24, 0xa4, 0x3e, 0x84,\n-0xf0, 0x9e, 0xe8, 0x5f, 0xec, 0xe5, 0x27, 0x44, 0xf5, 0x28, 0xa6, 0x3f, 0x7b, 0xde, 0xe0, 0x2a,\n-0xf0, 0xc8, 0xaf, 0x53, 0x2f, 0x9e, 0xca, 0x05, 0x01, 0x93, 0x1e, 0x8f, 0x66, 0x1c, 0x39, 0xa7,\n-0x4d, 0xfa, 0x5a, 0xb6, 0x73, 0x04, 0x25, 0x66, 0xeb, 0x77, 0x7f, 0xe7, 0x59, 0xc6, 0x4a, 0x99,\n-0x25, 0x14, 0x54, 0xeb, 0x26, 0xc7, 0xf3, 0x7f, 0x19, 0xd5, 0x30, 0x70, 0x8f, 0xaf, 0xb0, 0x46,\n-0x2a, 0xff, 0xad, 0xeb, 0x29, 0xed, 0xd7, 0x9f, 0xaa, 0x04, 0x87, 0xa3, 0xd4, 0xf9, 0x89, 0xa5,\n-0x34, 0x5f, 0xdb, 0x43, 0x91, 0x82, 0x36, 0xd9, 0x66, 0x3c, 0xb1, 0xb8, 0xb9, 0x82, 0xfd, 0x9c,\n-0x3a, 0x3e, 0x10, 0xc8, 0x3b, 0xef, 0x06, 0x65, 0x66, 0x7a, 0x9b, 0x19, 0x18, 0x3d, 0xff, 0x71,\n-0x51, 0x3c, 0x30, 0x2e, 0x5f, 0xbe, 0x3d, 0x77, 0x73, 0xb2, 0x5d, 0x06, 0x6c, 0xc3, 0x23, 0x56,\n-0x9a, 0x2b, 0x85, 0x26, 0x92, 0x1c, 0xa7, 0x02, 0xb3, 0xe4, 0x3f, 0x0d, 0xaf, 0x08, 0x79, 0x82,\n-0xb8, 0x36, 0x3d, 0xea, 0x9c, 0xd3, 0x35, 0xb3, 0xbc, 0x69, 0xca, 0xf5, 0xcc, 0x9d, 0xe8, 0xfd,\n-0x64, 0x8d, 0x17, 0x80, 0x33, 0x6e, 0x5e, 0x4a, 0x5d, 0x99, 0xc9, 0x1e, 0x87, 0xb4, 0x9d, 0x1a,\n-0xc0, 0xd5, 0x6e, 0x13, 0x35, 0x23, 0x5e, 0xdf, 0x9b, 0x5f, 0x3d, 0xef, 0xd6, 0xf7, 0x76, 0xc2,\n-0xea, 0x3e, 0xbb, 0x78, 0x0d, 0x1c, 0x42, 0x67, 0x6b, 0x04, 0xd8, 0xf8, 0xd6, 0xda, 0x6f, 0x8b,\n-0xf2, 0x44, 0xa0, 0x01, 0xab, 0x02, 0x01, 0x03, 0xa3, 0x81, 0xc5, 0x30, 0x81, 0xc2, 0x30, 0x1d,\n-0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xbf, 0x5f, 0xb7, 0xd1, 0xce, 0xdd, 0x1f,\n-0x86, 0xf4, 0x5b, 0x55, 0xac, 0xdc, 0xd7, 0x10, 0xc2, 0x0e, 0xa9, 0x88, 0xe7, 0x30, 0x81, 0x92,\n-0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x8a, 0x30, 0x81, 0x87, 0x80, 0x14, 0xbf, 0x5f, 0xb7,\n-0xd1, 0xce, 0xdd, 0x1f, 0x86, 0xf4, 0x5b, 0x55, 0xac, 0xdc, 0xd7, 0x10, 0xc2, 0x0e, 0xa9, 0x88,\n-0xe7, 0xa1, 0x6c, 0xa4, 0x6a, 0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n-0x13, 0x02, 0x55, 0x53, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53,\n-0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c,\n-0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06,\n-0x03, 0x55, 0x04, 0x0b, 0x13, 0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20,\n-0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\n-0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x82,\n-0x01, 0x00, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,\n-0x82, 0x01, 0x01, 0x00, 0x05, 0x9d, 0x3f, 0x88, 0x9d, 0xd1, 0xc9, 0x1a, 0x55, 0xa1, 0xac, 0x69,\n-0xf3, 0xf3, 0x59, 0xda, 0x9b, 0x01, 0x87, 0x1a, 0x4f, 0x57, 0xa9, 0xa1, 0x79, 0x09, 0x2a, 0xdb,\n-0xf7, 0x2f, 0xb2, 0x1e, 0xcc, 0xc7, 0x5e, 0x6a, 0xd8, 0x83, 0x87, 0xa1, 0x97, 0xef, 0x49, 0x35,\n-0x3e, 0x77, 0x06, 0x41, 0x58, 0x62, 0xbf, 0x8e, 0x58, 0xb8, 0x0a, 0x67, 0x3f, 0xec, 0xb3, 0xdd,\n-0x21, 0x66, 0x1f, 0xc9, 0x54, 0xfa, 0x72, 0xcc, 0x3d, 0x4c, 0x40, 0xd8, 0x81, 0xaf, 0x77, 0x9e,\n-0x83, 0x7a, 0xbb, 0xa2, 0xc7, 0xf5, 0x34, 0x17, 0x8e, 0xd9, 0x11, 0x40, 0xf4, 0xfc, 0x2c, 0x2a,\n-0x4d, 0x15, 0x7f, 0xa7, 0x62, 0x5d, 0x2e, 0x25, 0xd3, 0x00, 0x0b, 0x20, 0x1a, 0x1d, 0x68, 0xf9,\n-0x17, 0xb8, 0xf4, 0xbd, 0x8b, 0xed, 0x28, 0x59, 0xdd, 0x4d, 0x16, 0x8b, 0x17, 0x83, 0xc8, 0xb2,\n-0x65, 0xc7, 0x2d, 0x7a, 0xa5, 0xaa, 0xbc, 0x53, 0x86, 0x6d, 0xdd, 0x57, 0xa4, 0xca, 0xf8, 0x20,\n-0x41, 0x0b, 0x68, 0xf0, 0xf4, 0xfb, 0x74, 0xbe, 0x56, 0x5d, 0x7a, 0x79, 0xf5, 0xf9, 0x1d, 0x85,\n-0xe3, 0x2d, 0x95, 0xbe, 0xf5, 0x71, 0x90, 0x43, 0xcc, 0x8d, 0x1f, 0x9a, 0x00, 0x0a, 0x87, 0x29,\n-0xe9, 0x55, 0x22, 0x58, 0x00, 0x23, 0xea, 0xe3, 0x12, 0x43, 0x29, 0x5b, 0x47, 0x08, 0xdd, 0x8c,\n-0x41, 0x6a, 0x65, 0x06, 0xa8, 0xe5, 0x21, 0xaa, 0x41, 0xb4, 0x95, 0x21, 0x95, 0xb9, 0x7d, 0xd1,\n-0x34, 0xab, 0x13, 0xd6, 0xad, 0xbc, 0xdc, 0xe2, 0x3d, 0x39, 0xcd, 0xbd, 0x3e, 0x75, 0x70, 0xa1,\n-0x18, 0x59, 0x03, 0xc9, 0x22, 0xb4, 0x8f, 0x9c, 0xd5, 0x5e, 0x2a, 0xd7, 0xa5, 0xb6, 0xd4, 0x0a,\n-0x6d, 0xf8, 0xb7, 0x40, 0x11, 0x46, 0x9a, 0x1f, 0x79, 0x0e, 0x62, 0xbf, 0x0f, 0x97, 0xec, 0xe0,\n-0x2f, 0x1f, 0x17, 0x94, 0x30, 0x82, 0x03, 0xdd, 0x30, 0x82, 0x02, 0xc5, 0xa0, 0x03, 0x02, 0x01,\n-0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n-0x0b, 0x05, 0x00, 0x30, 0x81, 0x8f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72,\n-0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a,\n-0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03,\n-0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54,\n-0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63,\n-0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x53, 0x74, 0x61, 0x72,\n-0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n-0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n-0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x30, 0x31, 0x30,\n-0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33,\n-0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x8f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n-0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07,\n-0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07,\n-0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64,\n-0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49,\n-0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x53, 0x74,\n-0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n-0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,\n-0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n-0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,\n-0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbd, 0xed, 0xc1, 0x03, 0xfc, 0xf6, 0x8f, 0xfc,\n-0x02, 0xb1, 0x6f, 0x5b, 0x9f, 0x48, 0xd9, 0x9d, 0x79, 0xe2, 0xa2, 0xb7, 0x03, 0x61, 0x56, 0x18,\n-0xc3, 0x47, 0xb6, 0xd7, 0xca, 0x3d, 0x35, 0x2e, 0x89, 0x43, 0xf7, 0xa1, 0x69, 0x9b, 0xde, 0x8a,\n-0x1a, 0xfd, 0x13, 0x20, 0x9c, 0xb4, 0x49, 0x77, 0x32, 0x29, 0x56, 0xfd, 0xb9, 0xec, 0x8c, 0xdd,\n-0x22, 0xfa, 0x72, 0xdc, 0x27, 0x61, 0x97, 0xee, 0xf6, 0x5a, 0x84, 0xec, 0x6e, 0x19, 0xb9, 0x89,\n-0x2c, 0xdc, 0x84, 0x5b, 0xd5, 0x74, 0xfb, 0x6b, 0x5f, 0xc5, 0x89, 0xa5, 0x10, 0x52, 0x89, 0x46,\n-0x55, 0xf4, 0xb8, 0x75, 0x1c, 0xe6, 0x7f, 0xe4, 0x54, 0xae, 0x4b, 0xf8, 0x55, 0x72, 0x57, 0x02,\n-0x19, 0xf8, 0x17, 0x71, 0x59, 0xeb, 0x1e, 0x28, 0x07, 0x74, 0xc5, 0x9d, 0x48, 0xbe, 0x6c, 0xb4,\n-0xf4, 0xa4, 0xb0, 0xf3, 0x64, 0x37, 0x79, 0x92, 0xc0, 0xec, 0x46, 0x5e, 0x7f, 0xe1, 0x6d, 0x53,\n-0x4c, 0x62, 0xaf, 0xcd, 0x1f, 0x0b, 0x63, 0xbb, 0x3a, 0x9d, 0xfb, 0xfc, 0x79, 0x00, 0x98, 0x61,\n-0x74, 0xcf, 0x26, 0x82, 0x40, 0x63, 0xf3, 0xb2, 0x72, 0x6a, 0x19, 0x0d, 0x99, 0xca, 0xd4, 0x0e,\n-0x75, 0xcc, 0x37, 0xfb, 0x8b, 0x89, 0xc1, 0x59, 0xf1, 0x62, 0x7f, 0x5f, 0xb3, 0x5f, 0x65, 0x30,\n-0xf8, 0xa7, 0xb7, 0x4d, 0x76, 0x5a, 0x1e, 0x76, 0x5e, 0x34, 0xc0, 0xe8, 0x96, 0x56, 0x99, 0x8a,\n-0xb3, 0xf0, 0x7f, 0xa4, 0xcd, 0xbd, 0xdc, 0x32, 0x31, 0x7c, 0x91, 0xcf, 0xe0, 0x5f, 0x11, 0xf8,\n-0x6b, 0xaa, 0x49, 0x5c, 0xd1, 0x99, 0x94, 0xd1, 0xa2, 0xe3, 0x63, 0x5b, 0x09, 0x76, 0xb5, 0x56,\n-0x62, 0xe1, 0x4b, 0x74, 0x1d, 0x96, 0xd4, 0x26, 0xd4, 0x08, 0x04, 0x59, 0xd0, 0x98, 0x0e, 0x0e,\n-0xe6, 0xde, 0xfc, 0xc3, 0xec, 0x1f, 0x90, 0xf1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30,\n-0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n-0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n-0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7c, 0x0c, 0x32,\n-0x1f, 0xa7, 0xd9, 0x30, 0x7f, 0xc4, 0x7d, 0x68, 0xa3, 0x62, 0xa8, 0xa1, 0xce, 0xab, 0x07, 0x5b,\n-0x27, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,\n-0x03, 0x82, 0x01, 0x01, 0x00, 0x11, 0x59, 0xfa, 0x25, 0x4f, 0x03, 0x6f, 0x94, 0x99, 0x3b, 0x9a,\n-0x1f, 0x82, 0x85, 0x39, 0xd4, 0x76, 0x05, 0x94, 0x5e, 0xe1, 0x28, 0x93, 0x6d, 0x62, 0x5d, 0x09,\n-0xc2, 0xa0, 0xa8, 0xd4, 0xb0, 0x75, 0x38, 0xf1, 0x34, 0x6a, 0x9d, 0xe4, 0x9f, 0x8a, 0x86, 0x26,\n-0x51, 0xe6, 0x2c, 0xd1, 0xc6, 0x2d, 0x6e, 0x95, 0x20, 0x4a, 0x92, 0x01, 0xec, 0xb8, 0x8a, 0x67,\n-0x7b, 0x31, 0xe2, 0x67, 0x2e, 0x8c, 0x95, 0x03, 0x26, 0x2e, 0x43, 0x9d, 0x4a, 0x31, 0xf6, 0x0e,\n-0xb5, 0x0c, 0xbb, 0xb7, 0xe2, 0x37, 0x7f, 0x22, 0xba, 0x00, 0xa3, 0x0e, 0x7b, 0x52, 0xfb, 0x6b,\n-0xbb, 0x3b, 0xc4, 0xd3, 0x79, 0x51, 0x4e, 0xcd, 0x90, 0xf4, 0x67, 0x07, 0x19, 0xc8, 0x3c, 0x46,\n-0x7a, 0x0d, 0x01, 0x7d, 0xc5, 0x58, 0xe7, 0x6d, 0xe6, 0x85, 0x30, 0x17, 0x9a, 0x24, 0xc4, 0x10,\n-0xe0, 0x04, 0xf7, 0xe0, 0xf2, 0x7f, 0xd4, 0xaa, 0x0a, 0xff, 0x42, 0x1d, 0x37, 0xed, 0x94, 0xe5,\n-0x64, 0x59, 0x12, 0x20, 0x77, 0x38, 0xd3, 0x32, 0x3e, 0x38, 0x81, 0x75, 0x96, 0x73, 0xfa, 0x68,\n-0x8f, 0xb1, 0xcb, 0xce, 0x1f, 0xc5, 0xec, 0xfa, 0x9c, 0x7e, 0xcf, 0x7e, 0xb1, 0xf1, 0x07, 0x2d,\n-0xb6, 0xfc, 0xbf, 0xca, 0xa4, 0xbf, 0xd0, 0x97, 0x05, 0x4a, 0xbc, 0xea, 0x18, 0x28, 0x02, 0x90,\n-0xbd, 0x54, 0x78, 0x09, 0x21, 0x71, 0xd3, 0xd1, 0x7d, 0x1d, 0xd9, 0x16, 0xb0, 0xa9, 0x61, 0x3d,\n-0xd0, 0x0a, 0x00, 0x22, 0xfc, 0xc7, 0x7b, 0xcb, 0x09, 0x64, 0x45, 0x0b, 0x3b, 0x40, 0x81, 0xf7,\n-0x7d, 0x7c, 0x32, 0xf5, 0x98, 0xca, 0x58, 0x8e, 0x7d, 0x2a, 0xee, 0x90, 0x59, 0x73, 0x64, 0xf9,\n-0x36, 0x74, 0x5e, 0x25, 0xa1, 0xf5, 0x66, 0x05, 0x2e, 0x7f, 0x39, 0x15, 0xa9, 0x2a, 0xfb, 0x50,\n-0x8b, 0x8e, 0x85, 0x69, 0xf4, 0x30, 0x82, 0x03, 0xef, 0x30, 0x82, 0x02, 0xd7, 0xa0, 0x03, 0x02,\n-0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n-0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41,\n-0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13,\n-0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20,\n-0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e,\n-0x63, 0x2e, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x53, 0x74, 0x61,\n-0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20,\n-0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n-0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30,\n-0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,\n-0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30,\n-0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n-0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e,\n-0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74,\n-0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n-0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e,\n-0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3b, 0x30,\n-0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c,\n-0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20,\n-0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68,\n-0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,\n-0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd5, 0x0c, 0x3a, 0xc4, 0x2a,\n-0xf9, 0x4e, 0xe2, 0xf5, 0xbe, 0x19, 0x97, 0x5f, 0x8e, 0x88, 0x53, 0xb1, 0x1f, 0x3f, 0xcb, 0xcf,\n-0x9f, 0x20, 0x13, 0x6d, 0x29, 0x3a, 0xc8, 0x0f, 0x7d, 0x3c, 0xf7, 0x6b, 0x76, 0x38, 0x63, 0xd9,\n-0x36, 0x60, 0xa8, 0x9b, 0x5e, 0x5c, 0x00, 0x80, 0xb2, 0x2f, 0x59, 0x7f, 0xf6, 0x87, 0xf9, 0x25,\n-0x43, 0x86, 0xe7, 0x69, 0x1b, 0x52, 0x9a, 0x90, 0xe1, 0x71, 0xe3, 0xd8, 0x2d, 0x0d, 0x4e, 0x6f,\n-0xf6, 0xc8, 0x49, 0xd9, 0xb6, 0xf3, 0x1a, 0x56, 0xae, 0x2b, 0xb6, 0x74, 0x14, 0xeb, 0xcf, 0xfb,\n-0x26, 0xe3, 0x1a, 0xba, 0x1d, 0x96, 0x2e, 0x6a, 0x3b, 0x58, 0x94, 0x89, 0x47, 0x56, 0xff, 0x25,\n-0xa0, 0x93, 0x70, 0x53, 0x83, 0xda, 0x84, 0x74, 0x14, 0xc3, 0x67, 0x9e, 0x04, 0x68, 0x3a, 0xdf,\n-0x8e, 0x40, 0x5a, 0x1d, 0x4a, 0x4e, 0xcf, 0x43, 0x91, 0x3b, 0xe7, 0x56, 0xd6, 0x00, 0x70, 0xcb,\n-0x52, 0xee, 0x7b, 0x7d, 0xae, 0x3a, 0xe7, 0xbc, 0x31, 0xf9, 0x45, 0xf6, 0xc2, 0x60, 0xcf, 0x13,\n-0x59, 0x02, 0x2b, 0x80, 0xcc, 0x34, 0x47, 0xdf, 0xb9, 0xde, 0x90, 0x65, 0x6d, 0x02, 0xcf, 0x2c,\n-0x91, 0xa6, 0xa6, 0xe7, 0xde, 0x85, 0x18, 0x49, 0x7c, 0x66, 0x4e, 0xa3, 0x3a, 0x6d, 0xa9, 0xb5,\n-0xee, 0x34, 0x2e, 0xba, 0x0d, 0x03, 0xb8, 0x33, 0xdf, 0x47, 0xeb, 0xb1, 0x6b, 0x8d, 0x25, 0xd9,\n-0x9b, 0xce, 0x81, 0xd1, 0x45, 0x46, 0x32, 0x96, 0x70, 0x87, 0xde, 0x02, 0x0e, 0x49, 0x43, 0x85,\n-0xb6, 0x6c, 0x73, 0xbb, 0x64, 0xea, 0x61, 0x41, 0xac, 0xc9, 0xd4, 0x54, 0xdf, 0x87, 0x2f, 0xc7,\n-0x22, 0xb2, 0x26, 0xcc, 0x9f, 0x59, 0x54, 0x68, 0x9f, 0xfc, 0xbe, 0x2a, 0x2f, 0xc4, 0x55, 0x1c,\n-0x75, 0x40, 0x60, 0x17, 0x85, 0x02, 0x55, 0x39, 0x8b, 0x7f, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01,\n-0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,\n-0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n-0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n-0x9c, 0x5f, 0x00, 0xdf, 0xaa, 0x01, 0xd7, 0x30, 0x2b, 0x38, 0x88, 0xa2, 0xb8, 0x6d, 0x4a, 0x9c,\n-0xf2, 0x11, 0x91, 0x83, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n-0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x4b, 0x36, 0xa6, 0x84, 0x77, 0x69, 0xdd, 0x3b,\n-0x19, 0x9f, 0x67, 0x23, 0x08, 0x6f, 0x0e, 0x61, 0xc9, 0xfd, 0x84, 0xdc, 0x5f, 0xd8, 0x36, 0x81,\n-0xcd, 0xd8, 0x1b, 0x41, 0x2d, 0x9f, 0x60, 0xdd, 0xc7, 0x1a, 0x68, 0xd9, 0xd1, 0x6e, 0x86, 0xe1,\n-0x88, 0x23, 0xcf, 0x13, 0xde, 0x43, 0xcf, 0xe2, 0x34, 0xb3, 0x04, 0x9d, 0x1f, 0x29, 0xd5, 0xbf,\n-0xf8, 0x5e, 0xc8, 0xd5, 0xc1, 0xbd, 0xee, 0x92, 0x6f, 0x32, 0x74, 0xf2, 0x91, 0x82, 0x2f, 0xbd,\n-0x82, 0x42, 0x7a, 0xad, 0x2a, 0xb7, 0x20, 0x7d, 0x4d, 0xbc, 0x7a, 0x55, 0x12, 0xc2, 0x15, 0xea,\n-0xbd, 0xf7, 0x6a, 0x95, 0x2e, 0x6c, 0x74, 0x9f, 0xcf, 0x1c, 0xb4, 0xf2, 0xc5, 0x01, 0xa3, 0x85,\n-0xd0, 0x72, 0x3e, 0xad, 0x73, 0xab, 0x0b, 0x9b, 0x75, 0x0c, 0x6d, 0x45, 0xb7, 0x8e, 0x94, 0xac,\n-0x96, 0x37, 0xb5, 0xa0, 0xd0, 0x8f, 0x15, 0x47, 0x0e, 0xe3, 0xe8, 0x83, 0xdd, 0x8f, 0xfd, 0xef,\n-0x41, 0x01, 0x77, 0xcc, 0x27, 0xa9, 0x62, 0x85, 0x33, 0xf2, 0x37, 0x08, 0xef, 0x71, 0xcf, 0x77,\n-0x06, 0xde, 0xc8, 0x19, 0x1d, 0x88, 0x40, 0xcf, 0x7d, 0x46, 0x1d, 0xff, 0x1e, 0xc7, 0xe1, 0xce,\n-0xff, 0x23, 0xdb, 0xc6, 0xfa, 0x8d, 0x55, 0x4e, 0xa9, 0x02, 0xe7, 0x47, 0x11, 0x46, 0x3e, 0xf4,\n-0xfd, 0xbd, 0x7b, 0x29, 0x26, 0xbb, 0xa9, 0x61, 0x62, 0x37, 0x28, 0xb6, 0x2d, 0x2a, 0xf6, 0x10,\n-0x86, 0x64, 0xc9, 0x70, 0xa7, 0xd2, 0xad, 0xb7, 0x29, 0x70, 0x79, 0xea, 0x3c, 0xda, 0x63, 0x25,\n-0x9f, 0xfd, 0x68, 0xb7, 0x30, 0xec, 0x70, 0xfb, 0x75, 0x8a, 0xb7, 0x6d, 0x60, 0x67, 0xb2, 0x1e,\n-0xc8, 0xb9, 0xe9, 0xd8, 0xa8, 0x6f, 0x02, 0x8b, 0x67, 0x0d, 0x4d, 0x26, 0x57, 0x71, 0xda, 0x20,\n-0xfc, 0xc1, 0x4a, 0x50, 0x8d, 0xb1, 0x28, 0xba, 0x30, 0x82, 0x05, 0xde, 0x30, 0x82, 0x03, 0xc6,\n-0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x01, 0xfd, 0x6d, 0x30, 0xfc, 0xa3, 0xca, 0x51, 0xa8,\n-0x1b, 0xbc, 0x64, 0x0e, 0x35, 0x03, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n-0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13,\n-0x0a, 0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06,\n-0x03, 0x55, 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74,\n-0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20,\n-0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n-0x6b, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52,\n-0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\n-0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,\n-0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30,\n-0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39,\n-0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n-0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, 0x65, 0x77, 0x20,\n-0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13,\n-0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54,\n-0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x2e, 0x30, 0x2c,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74,\n-0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n-0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n-0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x80, 0x12, 0x65,\n-0x17, 0x36, 0x0e, 0xc3, 0xdb, 0x08, 0xb3, 0xd0, 0xac, 0x57, 0x0d, 0x76, 0xed, 0xcd, 0x27, 0xd3,\n-0x4c, 0xad, 0x50, 0x83, 0x61, 0xe2, 0xaa, 0x20, 0x4d, 0x09, 0x2d, 0x64, 0x09, 0xdc, 0xce, 0x89,\n-0x9f, 0xcc, 0x3d, 0xa9, 0xec, 0xf6, 0xcf, 0xc1, 0xdc, 0xf1, 0xd3, 0xb1, 0xd6, 0x7b, 0x37, 0x28,\n-0x11, 0x2b, 0x47, 0xda, 0x39, 0xc6, 0xbc, 0x3a, 0x19, 0xb4, 0x5f, 0xa6, 0xbd, 0x7d, 0x9d, 0xa3,\n-0x63, 0x42, 0xb6, 0x76, 0xf2, 0xa9, 0x3b, 0x2b, 0x91, 0xf8, 0xe2, 0x6f, 0xd0, 0xec, 0x16, 0x20,\n-0x90, 0x09, 0x3e, 0xe2, 0xe8, 0x74, 0xc9, 0x18, 0xb4, 0x91, 0xd4, 0x62, 0x64, 0xdb, 0x7f, 0xa3,\n-0x06, 0xf1, 0x88, 0x18, 0x6a, 0x90, 0x22, 0x3c, 0xbc, 0xfe, 0x13, 0xf0, 0x87, 0x14, 0x7b, 0xf6,\n-0xe4, 0x1f, 0x8e, 0xd4, 0xe4, 0x51, 0xc6, 0x11, 0x67, 0x46, 0x08, 0x51, 0xcb, 0x86, 0x14, 0x54,\n-0x3f, 0xbc, 0x33, 0xfe, 0x7e, 0x6c, 0x9c, 0xff, 0x16, 0x9d, 0x18, 0xbd, 0x51, 0x8e, 0x35, 0xa6,\n-0xa7, 0x66, 0xc8, 0x72, 0x67, 0xdb, 0x21, 0x66, 0xb1, 0xd4, 0x9b, 0x78, 0x03, 0xc0, 0x50, 0x3a,\n-0xe8, 0xcc, 0xf0, 0xdc, 0xbc, 0x9e, 0x4c, 0xfe, 0xaf, 0x05, 0x96, 0x35, 0x1f, 0x57, 0x5a, 0xb7,\n-0xff, 0xce, 0xf9, 0x3d, 0xb7, 0x2c, 0xb6, 0xf6, 0x54, 0xdd, 0xc8, 0xe7, 0x12, 0x3a, 0x4d, 0xae,\n-0x4c, 0x8a, 0xb7, 0x5c, 0x9a, 0xb4, 0xb7, 0x20, 0x3d, 0xca, 0x7f, 0x22, 0x34, 0xae, 0x7e, 0x3b,\n-0x68, 0x66, 0x01, 0x44, 0xe7, 0x01, 0x4e, 0x46, 0x53, 0x9b, 0x33, 0x60, 0xf7, 0x94, 0xbe, 0x53,\n-0x37, 0x90, 0x73, 0x43, 0xf3, 0x32, 0xc3, 0x53, 0xef, 0xdb, 0xaa, 0xfe, 0x74, 0x4e, 0x69, 0xc7,\n-0x6b, 0x8c, 0x60, 0x93, 0xde, 0xc4, 0xc7, 0x0c, 0xdf, 0xe1, 0x32, 0xae, 0xcc, 0x93, 0x3b, 0x51,\n-0x78, 0x95, 0x67, 0x8b, 0xee, 0x3d, 0x56, 0xfe, 0x0c, 0xd0, 0x69, 0x0f, 0x1b, 0x0f, 0xf3, 0x25,\n-0x26, 0x6b, 0x33, 0x6d, 0xf7, 0x6e, 0x47, 0xfa, 0x73, 0x43, 0xe5, 0x7e, 0x0e, 0xa5, 0x66, 0xb1,\n-0x29, 0x7c, 0x32, 0x84, 0x63, 0x55, 0x89, 0xc4, 0x0d, 0xc1, 0x93, 0x54, 0x30, 0x19, 0x13, 0xac,\n-0xd3, 0x7d, 0x37, 0xa7, 0xeb, 0x5d, 0x3a, 0x6c, 0x35, 0x5c, 0xdb, 0x41, 0xd7, 0x12, 0xda, 0xa9,\n-0x49, 0x0b, 0xdf, 0xd8, 0x80, 0x8a, 0x09, 0x93, 0x62, 0x8e, 0xb5, 0x66, 0xcf, 0x25, 0x88, 0xcd,\n-0x84, 0xb8, 0xb1, 0x3f, 0xa4, 0x39, 0x0f, 0xd9, 0x02, 0x9e, 0xeb, 0x12, 0x4c, 0x95, 0x7c, 0xf3,\n-0x6b, 0x05, 0xa9, 0x5e, 0x16, 0x83, 0xcc, 0xb8, 0x67, 0xe2, 0xe8, 0x13, 0x9d, 0xcc, 0x5b, 0x82,\n-0xd3, 0x4c, 0xb3, 0xed, 0x5b, 0xff, 0xde, 0xe5, 0x73, 0xac, 0x23, 0x3b, 0x2d, 0x00, 0xbf, 0x35,\n-0x55, 0x74, 0x09, 0x49, 0xd8, 0x49, 0x58, 0x1a, 0x7f, 0x92, 0x36, 0xe6, 0x51, 0x92, 0x0e, 0xf3,\n-0x26, 0x7d, 0x1c, 0x4d, 0x17, 0xbc, 0xc9, 0xec, 0x43, 0x26, 0xd0, 0xbf, 0x41, 0x5f, 0x40, 0xa9,\n-0x44, 0x44, 0xf4, 0x99, 0xe7, 0x57, 0x87, 0x9e, 0x50, 0x1f, 0x57, 0x54, 0xa8, 0x3e, 0xfd, 0x74,\n-0x63, 0x2f, 0xb1, 0x50, 0x65, 0x09, 0xe6, 0x58, 0x42, 0x2e, 0x43, 0x1a, 0x4c, 0xb4, 0xf0, 0x25,\n-0x47, 0x59, 0xfa, 0x04, 0x1e, 0x93, 0xd4, 0x26, 0x46, 0x4a, 0x50, 0x81, 0xb2, 0xde, 0xbe, 0x78,\n-0xb7, 0xfc, 0x67, 0x15, 0xe1, 0xc9, 0x57, 0x84, 0x1e, 0x0f, 0x63, 0xd6, 0xe9, 0x62, 0xba, 0xd6,\n-0x5f, 0x55, 0x2e, 0xea, 0x5c, 0xc6, 0x28, 0x08, 0x04, 0x25, 0x39, 0xb8, 0x0e, 0x2b, 0xa9, 0xf2,\n-0x4c, 0x97, 0x1c, 0x07, 0x3f, 0x0d, 0x52, 0xf5, 0xed, 0xef, 0x2f, 0x82, 0x0f, 0x02, 0x03, 0x01,\n-0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,\n-0x14, 0x53, 0x79, 0xbf, 0x5a, 0xaa, 0x2b, 0x4a, 0xcf, 0x54, 0x80, 0xe1, 0xd8, 0x9b, 0xc0, 0x9d,\n-0xf2, 0xb2, 0x03, 0x66, 0xcb, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n-0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\n-0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x5c, 0xd4, 0x7c, 0x0d, 0xcf, 0xf7,\n-0x01, 0x7d, 0x41, 0x99, 0x65, 0x0c, 0x73, 0xc5, 0x52, 0x9f, 0xcb, 0xf8, 0xcf, 0x99, 0x06, 0x7f,\n-0x1b, 0xda, 0x43, 0x15, 0x9f, 0x9e, 0x02, 0x55, 0x57, 0x96, 0x14, 0xf1, 0x52, 0x3c, 0x27, 0x87,\n-0x94, 0x28, 0xed, 0x1f, 0x3a, 0x01, 0x37, 0xa2, 0x76, 0xfc, 0x53, 0x50, 0xc0, 0x84, 0x9b, 0xc6,\n-0x6b, 0x4e, 0xba, 0x8c, 0x21, 0x4f, 0xa2, 0x8e, 0x55, 0x62, 0x91, 0xf3, 0x69, 0x15, 0xd8, 0xbc,\n-0x88, 0xe3, 0xc4, 0xaa, 0x0b, 0xfd, 0xef, 0xa8, 0xe9, 0x4b, 0x55, 0x2a, 0x06, 0x20, 0x6d, 0x55,\n-0x78, 0x29, 0x19, 0xee, 0x5f, 0x30, 0x5c, 0x4b, 0x24, 0x11, 0x55, 0xff, 0x24, 0x9a, 0x6e, 0x5e,\n-0x2a, 0x2b, 0xee, 0x0b, 0x4d, 0x9f, 0x7f, 0xf7, 0x01, 0x38, 0x94, 0x14, 0x95, 0x43, 0x07, 0x09,\n-0xfb, 0x60, 0xa9, 0xee, 0x1c, 0xab, 0x12, 0x8c, 0xa0, 0x9a, 0x5e, 0xa7, 0x98, 0x6a, 0x59, 0x6d,\n-0x8b, 0x3f, 0x08, 0xfb, 0xc8, 0xd1, 0x45, 0xaf, 0x18, 0x15, 0x64, 0x90, 0x12, 0x0f, 0x73, 0x28,\n-0x2e, 0xc5, 0xe2, 0x24, 0x4e, 0xfc, 0x58, 0xec, 0xf0, 0xf4, 0x45, 0xfe, 0x22, 0xb3, 0xeb, 0x2f,\n-0x8e, 0xd2, 0xd9, 0x45, 0x61, 0x05, 0xc1, 0x97, 0x6f, 0xa8, 0x76, 0x72, 0x8f, 0x8b, 0x8c, 0x36,\n-0xaf, 0xbf, 0x0d, 0x05, 0xce, 0x71, 0x8d, 0xe6, 0xa6, 0x6f, 0x1f, 0x6c, 0xa6, 0x71, 0x62, 0xc5,\n-0xd8, 0xd0, 0x83, 0x72, 0x0c, 0xf1, 0x67, 0x11, 0x89, 0x0c, 0x9c, 0x13, 0x4c, 0x72, 0x34, 0xdf,\n-0xbc, 0xd5, 0x71, 0xdf, 0xaa, 0x71, 0xdd, 0xe1, 0xb9, 0x6c, 0x8c, 0x3c, 0x12, 0x5d, 0x65, 0xda,\n-0xbd, 0x57, 0x12, 0xb6, 0x43, 0x6b, 0xff, 0xe5, 0xde, 0x4d, 0x66, 0x11, 0x51, 0xcf, 0x99, 0xae,\n-0xec, 0x17, 0xb6, 0xe8, 0x71, 0x91, 0x8c, 0xde, 0x49, 0xfe, 0xdd, 0x35, 0x71, 0xa2, 0x15, 0x27,\n-0x94, 0x1c, 0xcf, 0x61, 0xe3, 0x26, 0xbb, 0x6f, 0xa3, 0x67, 0x25, 0x21, 0x5d, 0xe6, 0xdd, 0x1d,\n-0x0b, 0x2e, 0x68, 0x1b, 0x3b, 0x82, 0xaf, 0xec, 0x83, 0x67, 0x85, 0xd4, 0x98, 0x51, 0x74, 0xb1,\n-0xb9, 0x99, 0x80, 0x89, 0xff, 0x7f, 0x78, 0x19, 0x5c, 0x79, 0x4a, 0x60, 0x2e, 0x92, 0x40, 0xae,\n-0x4c, 0x37, 0x2a, 0x2c, 0xc9, 0xc7, 0x62, 0xc8, 0x0e, 0x5d, 0xf7, 0x36, 0x5b, 0xca, 0xe0, 0x25,\n-0x25, 0x01, 0xb4, 0xdd, 0x1a, 0x07, 0x9c, 0x77, 0x00, 0x3f, 0xd0, 0xdc, 0xd5, 0xec, 0x3d, 0xd4,\n-0xfa, 0xbb, 0x3f, 0xcc, 0x85, 0xd6, 0x6f, 0x7f, 0xa9, 0x2d, 0xdf, 0xb9, 0x02, 0xf7, 0xf5, 0x97,\n-0x9a, 0xb5, 0x35, 0xda, 0xc3, 0x67, 0xb0, 0x87, 0x4a, 0xa9, 0x28, 0x9e, 0x23, 0x8e, 0xff, 0x5c,\n-0x27, 0x6b, 0xe1, 0xb0, 0x4f, 0xf3, 0x07, 0xee, 0x00, 0x2e, 0xd4, 0x59, 0x87, 0xcb, 0x52, 0x41,\n-0x95, 0xea, 0xf4, 0x47, 0xd7, 0xee, 0x64, 0x41, 0x55, 0x7c, 0x8d, 0x59, 0x02, 0x95, 0xdd, 0x62,\n-0x9d, 0xc2, 0xb9, 0xee, 0x5a, 0x28, 0x74, 0x84, 0xa5, 0x9b, 0xb7, 0x90, 0xc7, 0x0c, 0x07, 0xdf,\n-0xf5, 0x89, 0x36, 0x74, 0x32, 0xd6, 0x28, 0xc1, 0xb0, 0xb0, 0x0b, 0xe0, 0x9c, 0x4c, 0xc3, 0x1c,\n-0xd6, 0xfc, 0xe3, 0x69, 0xb5, 0x47, 0x46, 0x81, 0x2f, 0xa2, 0x82, 0xab, 0xd3, 0x63, 0x44, 0x70,\n-0xc4, 0x8d, 0xff, 0x2d, 0x33, 0xba, 0xad, 0x8f, 0x7b, 0xb5, 0x70, 0x88, 0xae, 0x3e, 0x19, 0xcf,\n-0x40, 0x28, 0xd8, 0xfc, 0xc8, 0x90, 0xbb, 0x5d, 0x99, 0x22, 0xf5, 0x52, 0xe6, 0x58, 0xc5, 0x1f,\n-0x88, 0x31, 0x43, 0xee, 0x88, 0x1d, 0xd7, 0xc6, 0x8e, 0x3c, 0x43, 0x6a, 0x1d, 0xa7, 0x18, 0xde,\n-0x7d, 0x3d, 0x16, 0xf1, 0x62, 0xf9, 0xca, 0x90, 0xa8, 0xfd, 0x30, 0x82, 0x02, 0x8f, 0x30, 0x82,\n-0x02, 0x15, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x5c, 0x8b, 0x99, 0xc5, 0x5a, 0x94, 0xc5,\n-0xd2, 0x71, 0x56, 0xde, 0xcd, 0x89, 0x80, 0xcc, 0x26, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,\n-0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n-0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a,\n-0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03,\n-0x55, 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79,\n-0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55,\n-0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,\n-0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54,\n-0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,\n-0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,\n-0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n-0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a,\n-0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53,\n-0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, 0x65, 0x77, 0x20, 0x4a,\n-0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0b,\n-0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52,\n-0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x2e, 0x30, 0x2c, 0x06,\n-0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20,\n-0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n-0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x76, 0x30, 0x10, 0x06,\n-0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03,\n-0x62, 0x00, 0x04, 0x1a, 0xac, 0x54, 0x5a, 0xa9, 0xf9, 0x68, 0x23, 0xe7, 0x7a, 0xd5, 0x24, 0x6f,\n-0x53, 0xc6, 0x5a, 0xd8, 0x4b, 0xab, 0xc6, 0xd5, 0xb6, 0xd1, 0xe6, 0x73, 0x71, 0xae, 0xdd, 0x9c,\n-0xd6, 0x0c, 0x61, 0xfd, 0xdb, 0xa0, 0x89, 0x03, 0xb8, 0x05, 0x14, 0xec, 0x57, 0xce, 0xee, 0x5d,\n-0x3f, 0xe2, 0x21, 0xb3, 0xce, 0xf7, 0xd4, 0x8a, 0x79, 0xe0, 0xa3, 0x83, 0x7e, 0x2d, 0x97, 0xd0,\n-0x61, 0xc4, 0xf1, 0x99, 0xdc, 0x25, 0x91, 0x63, 0xab, 0x7f, 0x30, 0xa3, 0xb4, 0x70, 0xe2, 0xc7,\n-0xa1, 0x33, 0x9c, 0xf3, 0xbf, 0x2e, 0x5c, 0x53, 0xb1, 0x5f, 0xb3, 0x7d, 0x32, 0x7f, 0x8a, 0x34,\n-0xe3, 0x79, 0x79, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n-0x04, 0x14, 0x3a, 0xe1, 0x09, 0x86, 0xd4, 0xcf, 0x19, 0xc2, 0x96, 0x76, 0x74, 0x49, 0x76, 0xdc,\n-0xe0, 0x35, 0xc6, 0x63, 0x63, 0x9a, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n-0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n-0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n-0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x30, 0x36, 0x67, 0xa1, 0x16, 0x08, 0xdc,\n-0xe4, 0x97, 0x00, 0x41, 0x1d, 0x4e, 0xbe, 0xe1, 0x63, 0x01, 0xcf, 0x3b, 0xaa, 0x42, 0x11, 0x64,\n-0xa0, 0x9d, 0x94, 0x39, 0x02, 0x11, 0x79, 0x5c, 0x7b, 0x1d, 0xfa, 0x64, 0xb9, 0xee, 0x16, 0x42,\n-0xb3, 0xbf, 0x8a, 0xc2, 0x09, 0xc4, 0xec, 0xe4, 0xb1, 0x4d, 0x02, 0x31, 0x00, 0xe9, 0x2a, 0x61,\n-0x47, 0x8c, 0x52, 0x4a, 0x4b, 0x4e, 0x18, 0x70, 0xf6, 0xd6, 0x44, 0xd6, 0x6e, 0xf5, 0x83, 0xba,\n-0x6d, 0x58, 0xbd, 0x24, 0xd9, 0x56, 0x48, 0xea, 0xef, 0xc4, 0xa2, 0x46, 0x81, 0x88, 0x6a, 0x3a,\n-0x46, 0xd1, 0xa9, 0x9b, 0x4d, 0xc9, 0x61, 0xda, 0xd1, 0x5d, 0x57, 0x6a, 0x18, 0x30, 0x82, 0x04,\n-0x91, 0x30, 0x82, 0x03, 0x79, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x45, 0x6b, 0x50, 0x54,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,\n-0x81, 0xb0, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n-0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73,\n-0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b,\n-0x13, 0x30, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65,\n-0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f,\n-0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,\n-0x63, 0x65, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x28, 0x63, 0x29,\n-0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49,\n-0x6e, 0x63, 0x2e, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x45, 0x6e,\n-0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n-0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,\n-0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x32, 0x33,\n-0x34, 0x32, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x35, 0x33, 0x34,\n-0x32, 0x5a, 0x30, 0x81, 0xb0, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74,\n-0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03,\n-0x55, 0x04, 0x0b, 0x13, 0x30, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74,\n-0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6f,\n-0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65,\n-0x72, 0x65, 0x6e, 0x63, 0x65, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16,\n-0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74,\n-0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n-0x24, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65,\n-0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n-0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n-0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,\n-0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb6, 0x95, 0xb6, 0x43, 0x42, 0xfa, 0xc6, 0x6d, 0x2a, 0x6f,\n-0x48, 0xdf, 0x94, 0x4c, 0x39, 0x57, 0x05, 0xee, 0xc3, 0x79, 0x11, 0x41, 0x68, 0x36, 0xed, 0xec,\n-0xfe, 0x9a, 0x01, 0x8f, 0xa1, 0x38, 0x28, 0xfc, 0xf7, 0x10, 0x46, 0x66, 0x2e, 0x4d, 0x1e, 0x1a,\n-0xb1, 0x1a, 0x4e, 0xc6, 0xd1, 0xc0, 0x95, 0x88, 0xb0, 0xc9, 0xff, 0x31, 0x8b, 0x33, 0x03, 0xdb,\n-0xb7, 0x83, 0x7b, 0x3e, 0x20, 0x84, 0x5e, 0xed, 0xb2, 0x56, 0x28, 0xa7, 0xf8, 0xe0, 0xb9, 0x40,\n-0x71, 0x37, 0xc5, 0xcb, 0x47, 0x0e, 0x97, 0x2a, 0x68, 0xc0, 0x22, 0x95, 0x62, 0x15, 0xdb, 0x47,\n-0xd9, 0xf5, 0xd0, 0x2b, 0xff, 0x82, 0x4b, 0xc9, 0xad, 0x3e, 0xde, 0x4c, 0xdb, 0x90, 0x80, 0x50,\n-0x3f, 0x09, 0x8a, 0x84, 0x00, 0xec, 0x30, 0x0a, 0x3d, 0x18, 0xcd, 0xfb, 0xfd, 0x2a, 0x59, 0x9a,\n-0x23, 0x95, 0x17, 0x2c, 0x45, 0x9e, 0x1f, 0x6e, 0x43, 0x79, 0x6d, 0x0c, 0x5c, 0x98, 0xfe, 0x48,\n-0xa7, 0xc5, 0x23, 0x47, 0x5c, 0x5e, 0xfd, 0x6e, 0xe7, 0x1e, 0xb4, 0xf6, 0x68, 0x45, 0xd1, 0x86,\n-0x83, 0x5b, 0xa2, 0x8a, 0x8d, 0xb1, 0xe3, 0x29, 0x80, 0xfe, 0x25, 0x71, 0x88, 0xad, 0xbe, 0xbc,\n-0x8f, 0xac, 0x52, 0x96, 0x4b, 0xaa, 0x51, 0x8d, 0xe4, 0x13, 0x31, 0x19, 0xe8, 0x4e, 0x4d, 0x9f,\n-0xdb, 0xac, 0xb3, 0x6a, 0xd5, 0xbc, 0x39, 0x54, 0x71, 0xca, 0x7a, 0x7a, 0x7f, 0x90, 0xdd, 0x7d,\n-0x1d, 0x80, 0xd9, 0x81, 0xbb, 0x59, 0x26, 0xc2, 0x11, 0xfe, 0xe6, 0x93, 0xe2, 0xf7, 0x80, 0xe4,\n-0x65, 0xfb, 0x34, 0x37, 0x0e, 0x29, 0x80, 0x70, 0x4d, 0xaf, 0x38, 0x86, 0x2e, 0x9e, 0x7f, 0x57,\n-0xaf, 0x9e, 0x17, 0xae, 0xeb, 0x1c, 0xcb, 0x28, 0x21, 0x5f, 0xb6, 0x1c, 0xd8, 0xe7, 0xa2, 0x04,\n-0x22, 0xf9, 0xd3, 0xda, 0xd8, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb0, 0x30, 0x81,\n-0xad, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n-0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n-0x01, 0xff, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x1d, 0x10, 0x04, 0x24, 0x30, 0x22, 0x80, 0x0f, 0x32,\n-0x30, 0x30, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x32, 0x33, 0x34, 0x32, 0x5a, 0x81, 0x0f,\n-0x32, 0x30, 0x32, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x35, 0x33, 0x34, 0x32, 0x5a, 0x30,\n-0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x68, 0x90, 0xe4, 0x67,\n-0xa4, 0xa6, 0x53, 0x80, 0xc7, 0x86, 0x66, 0xa4, 0xf1, 0xf7, 0x4b, 0x43, 0xfb, 0x84, 0xbd, 0x6d,\n-0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x68, 0x90, 0xe4, 0x67, 0xa4,\n-0xa6, 0x53, 0x80, 0xc7, 0x86, 0x66, 0xa4, 0xf1, 0xf7, 0x4b, 0x43, 0xfb, 0x84, 0xbd, 0x6d, 0x30,\n-0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, 0x00, 0x04, 0x10, 0x30, 0x0e,\n-0x1b, 0x08, 0x56, 0x37, 0x2e, 0x31, 0x3a, 0x34, 0x2e, 0x30, 0x03, 0x02, 0x04, 0x90, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01,\n-0x01, 0x00, 0x93, 0xd4, 0x30, 0xb0, 0xd7, 0x03, 0x20, 0x2a, 0xd0, 0xf9, 0x63, 0xe8, 0x91, 0x0c,\n-0x05, 0x20, 0xa9, 0x5f, 0x19, 0xca, 0x7b, 0x72, 0x4e, 0xd4, 0xb1, 0xdb, 0xd0, 0x96, 0xfb, 0x54,\n-0x5a, 0x19, 0x2c, 0x0c, 0x08, 0xf7, 0xb2, 0xbc, 0x85, 0xa8, 0x9d, 0x7f, 0x6d, 0x3b, 0x52, 0xb3,\n-0x2a, 0xdb, 0xe7, 0xd4, 0x84, 0x8c, 0x63, 0xf6, 0x0f, 0xcb, 0x26, 0x01, 0x91, 0x50, 0x6c, 0xf4,\n-0x5f, 0x14, 0xe2, 0x93, 0x74, 0xc0, 0x13, 0x9e, 0x30, 0x3a, 0x50, 0xe3, 0xb4, 0x60, 0xc5, 0x1c,\n-0xf0, 0x22, 0x44, 0x8d, 0x71, 0x47, 0xac, 0xc8, 0x1a, 0xc9, 0xe9, 0x9b, 0x9a, 0x00, 0x60, 0x13,\n-0xff, 0x70, 0x7e, 0x5f, 0x11, 0x4d, 0x49, 0x1b, 0xb3, 0x15, 0x52, 0x7b, 0xc9, 0x54, 0xda, 0xbf,\n-0x9d, 0x95, 0xaf, 0x6b, 0x9a, 0xd8, 0x9e, 0xe9, 0xf1, 0xe4, 0x43, 0x8d, 0xe2, 0x11, 0x44, 0x3a,\n-0xbf, 0xaf, 0xbd, 0x83, 0x42, 0x73, 0x52, 0x8b, 0xaa, 0xbb, 0xa7, 0x29, 0xcf, 0xf5, 0x64, 0x1c,\n-0x0a, 0x4d, 0xd1, 0xbc, 0xaa, 0xac, 0x9f, 0x2a, 0xd0, 0xff, 0x7f, 0x7f, 0xda, 0x7d, 0xea, 0xb1,\n-0xed, 0x30, 0x25, 0xc1, 0x84, 0xda, 0x34, 0xd2, 0x5b, 0x78, 0x83, 0x56, 0xec, 0x9c, 0x36, 0xc3,\n-0x26, 0xe2, 0x11, 0xf6, 0x67, 0x49, 0x1d, 0x92, 0xab, 0x8c, 0xfb, 0xeb, 0xff, 0x7a, 0xee, 0x85,\n-0x4a, 0xa7, 0x50, 0x80, 0xf0, 0xa7, 0x5c, 0x4a, 0x94, 0x2e, 0x5f, 0x05, 0x99, 0x3c, 0x52, 0x41,\n-0xe0, 0xcd, 0xb4, 0x63, 0xcf, 0x01, 0x43, 0xba, 0x9c, 0x83, 0xdc, 0x8f, 0x60, 0x3b, 0xf3, 0x5a,\n-0xb4, 0xb4, 0x7b, 0xae, 0xda, 0x0b, 0x90, 0x38, 0x75, 0xef, 0x81, 0x1d, 0x66, 0xd2, 0xf7, 0x57,\n-0x70, 0x36, 0xb3, 0xbf, 0xfc, 0x28, 0xaf, 0x71, 0x25, 0x85, 0x5b, 0x13, 0xfe, 0x1e, 0x7f, 0x5a,\n-0xb4, 0x3c, 0x30, 0x82, 0x05, 0x56, 0x30, 0x82, 0x04, 0x3e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,\n-0x10, 0xee, 0x2b, 0x3d, 0xeb, 0xd4, 0x21, 0xde, 0x14, 0xa8, 0x62, 0xac, 0x04, 0xf3, 0xdd, 0xc4,\n-0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,\n-0x30, 0x81, 0xf3, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53,\n-0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x32, 0x41, 0x67, 0x65, 0x6e, 0x63,\n-0x69, 0x61, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x64, 0x65, 0x20, 0x43,\n-0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x20, 0x28, 0x4e, 0x49, 0x46,\n-0x20, 0x51, 0x2d, 0x30, 0x38, 0x30, 0x31, 0x31, 0x37, 0x36, 0x2d, 0x49, 0x29, 0x31, 0x28, 0x30,\n-0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x69, 0x73, 0x20,\n-0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\n-0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b,\n-0x13, 0x2c, 0x56, 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f,\n-0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f,\n-0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65, 0x6c, 0x20, 0x28, 0x63, 0x29, 0x30, 0x33, 0x31, 0x35,\n-0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x4a, 0x65, 0x72, 0x61, 0x72, 0x71, 0x75,\n-0x69, 0x61, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x61, 0x74, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43,\n-0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x20, 0x43, 0x61, 0x74, 0x61,\n-0x6c, 0x61, 0x6e, 0x65, 0x73, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06,\n-0x45, 0x43, 0x2d, 0x41, 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x30, 0x31, 0x30, 0x37,\n-0x32, 0x33, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x30, 0x31, 0x30, 0x37, 0x32,\n-0x32, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xf3, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n-0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,\n-0x32, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e,\n-0x61, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69,\n-0x6f, 0x20, 0x28, 0x4e, 0x49, 0x46, 0x20, 0x51, 0x2d, 0x30, 0x38, 0x30, 0x31, 0x31, 0x37, 0x36,\n-0x2d, 0x49, 0x29, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65,\n-0x72, 0x76, 0x65, 0x69, 0x73, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x73, 0x20, 0x64, 0x65,\n-0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x31, 0x35, 0x30,\n-0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74,\n-0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72,\n-0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65, 0x6c, 0x20, 0x28,\n-0x63, 0x29, 0x30, 0x33, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x4a,\n-0x65, 0x72, 0x61, 0x72, 0x71, 0x75, 0x69, 0x61, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x61, 0x74,\n-0x73, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69,\n-0x6f, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x31, 0x0f, 0x30, 0x0d, 0x06,\n-0x03, 0x55, 0x04, 0x03, 0x13, 0x06, 0x45, 0x43, 0x2d, 0x41, 0x43, 0x43, 0x30, 0x82, 0x01, 0x22,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n-0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb3, 0x22, 0xc7,\n-0x4f, 0xe2, 0x97, 0x42, 0x95, 0x88, 0x47, 0x83, 0x40, 0xf6, 0x1d, 0x17, 0xf3, 0x83, 0x73, 0x24,\n-0x1e, 0x51, 0xf3, 0x98, 0x8a, 0xc3, 0x92, 0xb8, 0xff, 0x40, 0x90, 0x05, 0x70, 0x87, 0x60, 0xc9,\n-0x00, 0xa9, 0xb5, 0x94, 0x65, 0x19, 0x22, 0x15, 0x17, 0xc2, 0x43, 0x6c, 0x66, 0x44, 0x9a, 0x0d,\n-0x04, 0x3e, 0x39, 0x6f, 0xa5, 0x4b, 0x7a, 0xaa, 0x63, 0xb7, 0x8a, 0x44, 0x9d, 0xd9, 0x63, 0x91,\n-0x84, 0x66, 0xe0, 0x28, 0x0f, 0xba, 0x42, 0xe3, 0x6e, 0x8e, 0xf7, 0x14, 0x27, 0x93, 0x69, 0xee,\n-0x91, 0x0e, 0xa3, 0x5f, 0x0e, 0xb1, 0xeb, 0x66, 0xa2, 0x72, 0x4f, 0x12, 0x13, 0x86, 0x65, 0x7a,\n-0x3e, 0xdb, 0x4f, 0x07, 0xf4, 0xa7, 0x09, 0x60, 0xda, 0x3a, 0x42, 0x99, 0xc7, 0xb2, 0x7f, 0xb3,\n-0x16, 0x95, 0x1c, 0xc7, 0xf9, 0x34, 0xb5, 0x94, 0x85, 0xd5, 0x99, 0x5e, 0xa0, 0x48, 0xa0, 0x7e,\n-0xe7, 0x17, 0x65, 0xb8, 0xa2, 0x75, 0xb8, 0x1e, 0xf3, 0xe5, 0x42, 0x7d, 0xaf, 0xed, 0xf3, 0x8a,\n-0x48, 0x64, 0x5d, 0x82, 0x14, 0x93, 0xd8, 0xc0, 0xe4, 0xff, 0xb3, 0x50, 0x72, 0xf2, 0x76, 0xf6,\n-0xb3, 0x5d, 0x42, 0x50, 0x79, 0xd0, 0x94, 0x3e, 0x6b, 0x0c, 0x00, 0xbe, 0xd8, 0x6b, 0x0e, 0x4e,\n-0x2a, 0xec, 0x3e, 0xd2, 0xcc, 0x82, 0xa2, 0x18, 0x65, 0x33, 0x13, 0x77, 0x9e, 0x9a, 0x5d, 0x1a,\n-0x13, 0xd8, 0xc3, 0xdb, 0x3d, 0xc8, 0x97, 0x7a, 0xee, 0x70, 0xed, 0xa7, 0xe6, 0x7c, 0xdb, 0x71,\n-0xcf, 0x2d, 0x94, 0x62, 0xdf, 0x6d, 0xd6, 0xf5, 0x38, 0xbe, 0x3f, 0xa5, 0x85, 0x0a, 0x19, 0xb8,\n-0xa8, 0xd8, 0x09, 0x75, 0x42, 0x70, 0xc4, 0xea, 0xef, 0xcb, 0x0e, 0xc8, 0x34, 0xa8, 0x12, 0x22,\n-0x98, 0x0c, 0xb8, 0x13, 0x94, 0xb6, 0x4b, 0xec, 0xf0, 0xd0, 0x90, 0xe7, 0x27, 0x02, 0x03, 0x01,\n-0x00, 0x01, 0xa3, 0x81, 0xe3, 0x30, 0x81, 0xe0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04,\n-0x16, 0x30, 0x14, 0x81, 0x12, 0x65, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x40, 0x63, 0x61, 0x74, 0x63,\n-0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,\n-0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,\n-0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,\n-0x16, 0x04, 0x14, 0xa0, 0xc3, 0x8b, 0x44, 0xaa, 0x37, 0xa5, 0x45, 0xbf, 0x97, 0x80, 0x5a, 0xd1,\n-0xf1, 0x78, 0xa2, 0x9b, 0xe9, 0x5d, 0x8d, 0x30, 0x7f, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x78,\n-0x30, 0x76, 0x30, 0x74, 0x06, 0x0b, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xf5, 0x78, 0x01, 0x03, 0x01,\n-0x0a, 0x30, 0x65, 0x30, 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16,\n-0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74,\n-0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65,\n-0x6c, 0x30, 0x35, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x29, 0x1a,\n-0x27, 0x56, 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77,\n-0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76,\n-0x65, 0x72, 0x61, 0x72, 0x72, 0x65, 0x6c, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa0, 0x48, 0x5b, 0x82,\n-0x01, 0xf6, 0x4d, 0x48, 0xb8, 0x39, 0x55, 0x35, 0x9c, 0x80, 0x7a, 0x53, 0x99, 0xd5, 0x5a, 0xff,\n-0xb1, 0x71, 0x3b, 0xcc, 0x39, 0x09, 0x94, 0x5e, 0xd6, 0xda, 0xef, 0xbe, 0x01, 0x5b, 0x5d, 0xd3,\n-0x1e, 0xd8, 0xfd, 0x7d, 0x4f, 0xcd, 0xa0, 0x41, 0xe0, 0x34, 0x93, 0xbf, 0xcb, 0xe2, 0x86, 0x9c,\n-0x37, 0x92, 0x90, 0x56, 0x1c, 0xdc, 0xeb, 0x29, 0x05, 0xe5, 0xc4, 0x9e, 0xc7, 0x35, 0xdf, 0x8a,\n-0x0c, 0xcd, 0xc5, 0x21, 0x43, 0xe9, 0xaa, 0x88, 0xe5, 0x35, 0xc0, 0x19, 0x42, 0x63, 0x5a, 0x02,\n-0x5e, 0xa4, 0x48, 0x18, 0x3a, 0x85, 0x6f, 0xdc, 0x9d, 0xbc, 0x3f, 0x9d, 0x9c, 0xc1, 0x87, 0xb8,\n-0x7a, 0x61, 0x08, 0xe9, 0x77, 0x0b, 0x7f, 0x70, 0xab, 0x7a, 0xdd, 0xd9, 0x97, 0x2c, 0x64, 0x1e,\n-0x85, 0xbf, 0xbc, 0x74, 0x96, 0xa1, 0xc3, 0x7a, 0x12, 0xec, 0x0c, 0x1a, 0x6e, 0x83, 0x0c, 0x3c,\n-0xe8, 0x72, 0x46, 0x9f, 0xfb, 0x48, 0xd5, 0x5e, 0x97, 0xe6, 0xb1, 0xa1, 0xf8, 0xe4, 0xef, 0x46,\n-0x25, 0x94, 0x9c, 0x89, 0xdb, 0x69, 0x38, 0xbe, 0xec, 0x5c, 0x0e, 0x56, 0xc7, 0x65, 0x51, 0xe5,\n-0x50, 0x88, 0x88, 0xbf, 0x42, 0xd5, 0x2b, 0x3d, 0xe5, 0xf9, 0xba, 0x9e, 0x2e, 0xb3, 0xca, 0xf4,\n-0x73, 0x92, 0x02, 0x0b, 0xbe, 0x4c, 0x66, 0xeb, 0x20, 0xfe, 0xb9, 0xcb, 0xb5, 0x99, 0x7f, 0xe6,\n-0xb6, 0x13, 0xfa, 0xca, 0x4b, 0x4d, 0xd9, 0xee, 0x53, 0x46, 0x06, 0x3b, 0xc6, 0x4e, 0xad, 0x93,\n-0x5a, 0x81, 0x7e, 0x6c, 0x2a, 0x4b, 0x6a, 0x05, 0x45, 0x8c, 0xf2, 0x21, 0xa4, 0x31, 0x90, 0x87,\n-0x6c, 0x65, 0x9c, 0x9d, 0xa5, 0x60, 0x95, 0x3a, 0x52, 0x7f, 0xf5, 0xd1, 0xab, 0x08, 0x6e, 0xf3,\n-0xee, 0x5b, 0xf9, 0x88, 0x3d, 0x7e, 0xb8, 0x6f, 0x6e, 0x03, 0xe4, 0x42, 0x30, 0x82, 0x04, 0x2a,\n-0x30, 0x82, 0x03, 0x12, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x38, 0x63, 0xde, 0xf8, 0x30,\n-0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81,\n-0xb4, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x45, 0x6e, 0x74, 0x72,\n-0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x0b,\n-0x14, 0x37, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65,\n-0x74, 0x2f, 0x43, 0x50, 0x53, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72,\n-0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x2e, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69,\n-0x74, 0x73, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55,\n-0x04, 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, 0x74,\n-0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,\n-0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75,\n-0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n-0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x28,\n-0x32, 0x30, 0x34, 0x38, 0x29, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x31, 0x32, 0x32, 0x34, 0x31,\n-0x37, 0x35, 0x30, 0x35, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x37, 0x32, 0x34, 0x31, 0x34,\n-0x31, 0x35, 0x31, 0x32, 0x5a, 0x30, 0x81, 0xb4, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04,\n-0x0a, 0x13, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x40,\n-0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x14, 0x37, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74,\n-0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x5f, 0x32, 0x30, 0x34,\n-0x38, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66,\n-0x2e, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29,\n-0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, 0x20, 0x31,\n-0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20,\n-0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x65,\n-0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68,\n-0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x28, 0x32, 0x30, 0x34, 0x38, 0x29, 0x30, 0x82, 0x01, 0x22,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n-0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xad, 0x4d, 0x4b,\n-0xa9, 0x12, 0x86, 0xb2, 0xea, 0xa3, 0x20, 0x07, 0x15, 0x16, 0x64, 0x2a, 0x2b, 0x4b, 0xd1, 0xbf,\n-0x0b, 0x4a, 0x4d, 0x8e, 0xed, 0x80, 0x76, 0xa5, 0x67, 0xb7, 0x78, 0x40, 0xc0, 0x73, 0x42, 0xc8,\n-0x68, 0xc0, 0xdb, 0x53, 0x2b, 0xdd, 0x5e, 0xb8, 0x76, 0x98, 0x35, 0x93, 0x8b, 0x1a, 0x9d, 0x7c,\n-0x13, 0x3a, 0x0e, 0x1f, 0x5b, 0xb7, 0x1e, 0xcf, 0xe5, 0x24, 0x14, 0x1e, 0xb1, 0x81, 0xa9, 0x8d,\n-0x7d, 0xb8, 0xcc, 0x6b, 0x4b, 0x03, 0xf1, 0x02, 0x0c, 0xdc, 0xab, 0xa5, 0x40, 0x24, 0x00, 0x7f,\n-0x74, 0x94, 0xa1, 0x9d, 0x08, 0x29, 0xb3, 0x88, 0x0b, 0xf5, 0x87, 0x77, 0x9d, 0x55, 0xcd, 0xe4,\n-0xc3, 0x7e, 0xd7, 0x6a, 0x64, 0xab, 0x85, 0x14, 0x86, 0x95, 0x5b, 0x97, 0x32, 0x50, 0x6f, 0x3d,\n-0xc8, 0xba, 0x66, 0x0c, 0xe3, 0xfc, 0xbd, 0xb8, 0x49, 0xc1, 0x76, 0x89, 0x49, 0x19, 0xfd, 0xc0,\n-0xa8, 0xbd, 0x89, 0xa3, 0x67, 0x2f, 0xc6, 0x9f, 0xbc, 0x71, 0x19, 0x60, 0xb8, 0x2d, 0xe9, 0x2c,\n-0xc9, 0x90, 0x76, 0x66, 0x7b, 0x94, 0xe2, 0xaf, 0x78, 0xd6, 0x65, 0x53, 0x5d, 0x3c, 0xd6, 0x9c,\n-0xb2, 0xcf, 0x29, 0x03, 0xf9, 0x2f, 0xa4, 0x50, 0xb2, 0xd4, 0x48, 0xce, 0x05, 0x32, 0x55, 0x8a,\n-0xfd, 0xb2, 0x64, 0x4c, 0x0e, 0xe4, 0x98, 0x07, 0x75, 0xdb, 0x7f, 0xdf, 0xb9, 0x08, 0x55, 0x60,\n-0x85, 0x30, 0x29, 0xf9, 0x7b, 0x48, 0xa4, 0x69, 0x86, 0xe3, 0x35, 0x3f, 0x1e, 0x86, 0x5d, 0x7a,\n-0x7a, 0x15, 0xbd, 0xef, 0x00, 0x8e, 0x15, 0x22, 0x54, 0x17, 0x00, 0x90, 0x26, 0x93, 0xbc, 0x0e,\n-0x49, 0x68, 0x91, 0xbf, 0xf8, 0x47, 0xd3, 0x9d, 0x95, 0x42, 0xc1, 0x0e, 0x4d, 0xdf, 0x6f, 0x26,\n-0xcf, 0xc3, 0x18, 0x21, 0x62, 0x66, 0x43, 0x70, 0xd6, 0xd5, 0xc0, 0x07, 0xe1, 0x02, 0x03, 0x01,\n-0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,\n-0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,\n-0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,\n-0x04, 0x14, 0x55, 0xe4, 0x81, 0xd1, 0x11, 0x80, 0xbe, 0xd8, 0x89, 0xb9, 0x08, 0xa3, 0x31, 0xf9,\n-0xa1, 0x24, 0x09, 0x16, 0xb9, 0x70, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3b, 0x9b, 0x8f, 0x56, 0x9b, 0x30,\n-0xe7, 0x53, 0x99, 0x7c, 0x7a, 0x79, 0xa7, 0x4d, 0x97, 0xd7, 0x19, 0x95, 0x90, 0xfb, 0x06, 0x1f,\n-0xca, 0x33, 0x7c, 0x46, 0x63, 0x8f, 0x96, 0x66, 0x24, 0xfa, 0x40, 0x1b, 0x21, 0x27, 0xca, 0xe6,\n-0x72, 0x73, 0xf2, 0x4f, 0xfe, 0x31, 0x99, 0xfd, 0xc8, 0x0c, 0x4c, 0x68, 0x53, 0xc6, 0x80, 0x82,\n-0x13, 0x98, 0xfa, 0xb6, 0xad, 0xda, 0x5d, 0x3d, 0xf1, 0xce, 0x6e, 0xf6, 0x15, 0x11, 0x94, 0x82,\n-0x0c, 0xee, 0x3f, 0x95, 0xaf, 0x11, 0xab, 0x0f, 0xd7, 0x2f, 0xde, 0x1f, 0x03, 0x8f, 0x57, 0x2c,\n-0x1e, 0xc9, 0xbb, 0x9a, 0x1a, 0x44, 0x95, 0xeb, 0x18, 0x4f, 0xa6, 0x1f, 0xcd, 0x7d, 0x57, 0x10,\n-0x2f, 0x9b, 0x04, 0x09, 0x5a, 0x84, 0xb5, 0x6e, 0xd8, 0x1d, 0x3a, 0xe1, 0xd6, 0x9e, 0xd1, 0x6c,\n-0x79, 0x5e, 0x79, 0x1c, 0x14, 0xc5, 0xe3, 0xd0, 0x4c, 0x93, 0x3b, 0x65, 0x3c, 0xed, 0xdf, 0x3d,\n-0xbe, 0xa6, 0xe5, 0x95, 0x1a, 0xc3, 0xb5, 0x19, 0xc3, 0xbd, 0x5e, 0x5b, 0xbb, 0xff, 0x23, 0xef,\n-0x68, 0x19, 0xcb, 0x12, 0x93, 0x27, 0x5c, 0x03, 0x2d, 0x6f, 0x30, 0xd0, 0x1e, 0xb6, 0x1a, 0xac,\n-0xde, 0x5a, 0xf7, 0xd1, 0xaa, 0xa8, 0x27, 0xa6, 0xfe, 0x79, 0x81, 0xc4, 0x79, 0x99, 0x33, 0x57,\n-0xba, 0x12, 0xb0, 0xa9, 0xe0, 0x42, 0x6c, 0x93, 0xca, 0x56, 0xde, 0xfe, 0x6d, 0x84, 0x0b, 0x08,\n-0x8b, 0x7e, 0x8d, 0xea, 0xd7, 0x98, 0x21, 0xc6, 0xf3, 0xe7, 0x3c, 0x79, 0x2f, 0x5e, 0x9c, 0xd1,\n-0x4c, 0x15, 0x8d, 0xe1, 0xec, 0x22, 0x37, 0xcc, 0x9a, 0x43, 0x0b, 0x97, 0xdc, 0x80, 0x90, 0x8d,\n-0xb3, 0x67, 0x9b, 0x6f, 0x48, 0x08, 0x15, 0x56, 0xcf, 0xbf, 0xf1, 0x2b, 0x7c, 0x5e, 0x9a, 0x76,\n-0xe9, 0x59, 0x90, 0xc5, 0x7c, 0x83, 0x35, 0x11, 0x65, 0x51, 0x30, 0x82, 0x04, 0x32, 0x30, 0x82,\n-0x03, 0x1a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06,\n-0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04,\n-0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68,\n-0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07,\n-0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a,\n-0x0c, 0x11, 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69,\n-0x74, 0x65, 0x64, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x18, 0x41, 0x41,\n-0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65,\n-0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x31, 0x30, 0x31,\n-0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, 0x33, 0x31, 0x32,\n-0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n-0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12,\n-0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74,\n-0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c,\n-0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43,\n-0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,\n-0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x18, 0x41, 0x41, 0x41, 0x20, 0x43,\n-0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69,\n-0x63, 0x65, 0x73, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02,\n-0x82, 0x01, 0x01, 0x00, 0xbe, 0x40, 0x9d, 0xf4, 0x6e, 0xe1, 0xea, 0x76, 0x87, 0x1c, 0x4d, 0x45,\n-0x44, 0x8e, 0xbe, 0x46, 0xc8, 0x83, 0x06, 0x9d, 0xc1, 0x2a, 0xfe, 0x18, 0x1f, 0x8e, 0xe4, 0x02,\n-0xfa, 0xf3, 0xab, 0x5d, 0x50, 0x8a, 0x16, 0x31, 0x0b, 0x9a, 0x06, 0xd0, 0xc5, 0x70, 0x22, 0xcd,\n-0x49, 0x2d, 0x54, 0x63, 0xcc, 0xb6, 0x6e, 0x68, 0x46, 0x0b, 0x53, 0xea, 0xcb, 0x4c, 0x24, 0xc0,\n-0xbc, 0x72, 0x4e, 0xea, 0xf1, 0x15, 0xae, 0xf4, 0x54, 0x9a, 0x12, 0x0a, 0xc3, 0x7a, 0xb2, 0x33,\n-0x60, 0xe2, 0xda, 0x89, 0x55, 0xf3, 0x22, 0x58, 0xf3, 0xde, 0xdc, 0xcf, 0xef, 0x83, 0x86, 0xa2,\n-0x8c, 0x94, 0x4f, 0x9f, 0x68, 0xf2, 0x98, 0x90, 0x46, 0x84, 0x27, 0xc7, 0x76, 0xbf, 0xe3, 0xcc,\n-0x35, 0x2c, 0x8b, 0x5e, 0x07, 0x64, 0x65, 0x82, 0xc0, 0x48, 0xb0, 0xa8, 0x91, 0xf9, 0x61, 0x9f,\n-0x76, 0x20, 0x50, 0xa8, 0x91, 0xc7, 0x66, 0xb5, 0xeb, 0x78, 0x62, 0x03, 0x56, 0xf0, 0x8a, 0x1a,\n-0x13, 0xea, 0x31, 0xa3, 0x1e, 0xa0, 0x99, 0xfd, 0x38, 0xf6, 0xf6, 0x27, 0x32, 0x58, 0x6f, 0x07,\n-0xf5, 0x6b, 0xb8, 0xfb, 0x14, 0x2b, 0xaf, 0xb7, 0xaa, 0xcc, 0xd6, 0x63, 0x5f, 0x73, 0x8c, 0xda,\n-0x05, 0x99, 0xa8, 0x38, 0xa8, 0xcb, 0x17, 0x78, 0x36, 0x51, 0xac, 0xe9, 0x9e, 0xf4, 0x78, 0x3a,\n-0x8d, 0xcf, 0x0f, 0xd9, 0x42, 0xe2, 0x98, 0x0c, 0xab, 0x2f, 0x9f, 0x0e, 0x01, 0xde, 0xef, 0x9f,\n-0x99, 0x49, 0xf1, 0x2d, 0xdf, 0xac, 0x74, 0x4d, 0x1b, 0x98, 0xb5, 0x47, 0xc5, 0xe5, 0x29, 0xd1,\n-0xf9, 0x90, 0x18, 0xc7, 0x62, 0x9c, 0xbe, 0x83, 0xc7, 0x26, 0x7b, 0x3e, 0x8a, 0x25, 0xc7, 0xc0,\n-0xdd, 0x9d, 0xe6, 0x35, 0x68, 0x10, 0x20, 0x9d, 0x8f, 0xd8, 0xde, 0xd2, 0xc3, 0x84, 0x9c, 0x0d,\n-0x5e, 0xe8, 0x2f, 0xc9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xc0, 0x30, 0x81, 0xbd, 0x30,\n-0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa0, 0x11, 0x0a, 0x23, 0x3e, 0x96,\n-0xf1, 0x07, 0xec, 0xe2, 0xaf, 0x29, 0xef, 0x82, 0xa5, 0x7f, 0xd0, 0x30, 0xa4, 0xb4, 0x30, 0x0e,\n-0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f,\n-0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n-0x7b, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x74, 0x30, 0x72, 0x30, 0x38, 0xa0, 0x36, 0xa0, 0x34,\n-0x86, 0x32, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d,\n-0x6f, 0x64, 0x6f, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x41, 0x41, 0x43, 0x65, 0x72,\n-0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73,\n-0x2e, 0x63, 0x72, 0x6c, 0x30, 0x36, 0xa0, 0x34, 0xa0, 0x32, 0x86, 0x30, 0x68, 0x74, 0x74, 0x70,\n-0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x2e, 0x6e, 0x65,\n-0x74, 0x2f, 0x41, 0x41, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,\n-0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,\n-0x08, 0x56, 0xfc, 0x02, 0xf0, 0x9b, 0xe8, 0xff, 0xa4, 0xfa, 0xd6, 0x7b, 0xc6, 0x44, 0x80, 0xce,\n-0x4f, 0xc4, 0xc5, 0xf6, 0x00, 0x58, 0xcc, 0xa6, 0xb6, 0xbc, 0x14, 0x49, 0x68, 0x04, 0x76, 0xe8,\n-0xe6, 0xee, 0x5d, 0xec, 0x02, 0x0f, 0x60, 0xd6, 0x8d, 0x50, 0x18, 0x4f, 0x26, 0x4e, 0x01, 0xe3,\n-0xe6, 0xb0, 0xa5, 0xee, 0xbf, 0xbc, 0x74, 0x54, 0x41, 0xbf, 0xfd, 0xfc, 0x12, 0xb8, 0xc7, 0x4f,\n-0x5a, 0xf4, 0x89, 0x60, 0x05, 0x7f, 0x60, 0xb7, 0x05, 0x4a, 0xf3, 0xf6, 0xf1, 0xc2, 0xbf, 0xc4,\n-0xb9, 0x74, 0x86, 0xb6, 0x2d, 0x7d, 0x6b, 0xcc, 0xd2, 0xf3, 0x46, 0xdd, 0x2f, 0xc6, 0xe0, 0x6a,\n-0xc3, 0xc3, 0x34, 0x03, 0x2c, 0x7d, 0x96, 0xdd, 0x5a, 0xc2, 0x0e, 0xa7, 0x0a, 0x99, 0xc1, 0x05,\n-0x8b, 0xab, 0x0c, 0x2f, 0xf3, 0x5c, 0x3a, 0xcf, 0x6c, 0x37, 0x55, 0x09, 0x87, 0xde, 0x53, 0x40,\n-0x6c, 0x58, 0xef, 0xfc, 0xb6, 0xab, 0x65, 0x6e, 0x04, 0xf6, 0x1b, 0xdc, 0x3c, 0xe0, 0x5a, 0x15,\n-0xc6, 0x9e, 0xd9, 0xf1, 0x59, 0x48, 0x30, 0x21, 0x65, 0x03, 0x6c, 0xec, 0xe9, 0x21, 0x73, 0xec,\n-0x9b, 0x03, 0xa1, 0xe0, 0x37, 0xad, 0xa0, 0x15, 0x18, 0x8f, 0xfa, 0xba, 0x02, 0xce, 0xa7, 0x2c,\n-0xa9, 0x10, 0x13, 0x2c, 0xd4, 0xe5, 0x08, 0x26, 0xab, 0x22, 0x97, 0x60, 0xf8, 0x90, 0x5e, 0x74,\n-0xd4, 0xa2, 0x9a, 0x53, 0xbd, 0xf2, 0xa9, 0x68, 0xe0, 0xa2, 0x6e, 0xc2, 0xd7, 0x6c, 0xb1, 0xa3,\n-0x0f, 0x9e, 0xbf, 0xeb, 0x68, 0xe7, 0x56, 0xf2, 0xae, 0xf2, 0xe3, 0x2b, 0x38, 0x3a, 0x09, 0x81,\n-0xb5, 0x6b, 0x85, 0xd7, 0xbe, 0x2d, 0xed, 0x3f, 0x1a, 0xb7, 0xb2, 0x63, 0xe2, 0xf5, 0x62, 0x2c,\n-0x82, 0xd4, 0x6a, 0x00, 0x41, 0x50, 0xf1, 0x39, 0x83, 0x9f, 0x95, 0xe9, 0x36, 0x96, 0x98, 0x6e,\n-0x30, 0x82, 0x07, 0xd3, 0x30, 0x82, 0x05, 0xbb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x5e,\n-0xc3, 0xb7, 0xa6, 0x43, 0x7f, 0xa4, 0xe0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n-0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x42, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x0c, 0x09, 0x41, 0x43, 0x43, 0x56, 0x52, 0x41, 0x49, 0x5a, 0x31, 0x31, 0x10, 0x30, 0x0e,\n-0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x07, 0x50, 0x4b, 0x49, 0x41, 0x43, 0x43, 0x56, 0x31, 0x0d,\n-0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x43, 0x43, 0x56, 0x31, 0x0b, 0x30,\n-0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31,\n-0x30, 0x35, 0x30, 0x35, 0x30, 0x39, 0x33, 0x37, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31,\n-0x32, 0x33, 0x31, 0x30, 0x39, 0x33, 0x37, 0x33, 0x37, 0x5a, 0x30, 0x42, 0x31, 0x12, 0x30, 0x10,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x09, 0x41, 0x43, 0x43, 0x56, 0x52, 0x41, 0x49, 0x5a, 0x31,\n-0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x07, 0x50, 0x4b, 0x49, 0x41, 0x43,\n-0x43, 0x56, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x43, 0x43,\n-0x56, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x30, 0x82,\n-0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n-0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x9b,\n-0xa9, 0xab, 0xbf, 0x61, 0x4a, 0x97, 0xaf, 0x2f, 0x97, 0x66, 0x9a, 0x74, 0x5f, 0xd0, 0xd9, 0x96,\n-0xfd, 0xcf, 0xe2, 0xe4, 0x66, 0xef, 0x1f, 0x1f, 0x47, 0x33, 0xc2, 0x44, 0xa3, 0xdf, 0x9a, 0xde,\n-0x1f, 0xb5, 0x54, 0xdd, 0x15, 0x7c, 0x69, 0x35, 0x11, 0x6f, 0xbb, 0xc8, 0x0c, 0x8e, 0x6a, 0x18,\n-0x1e, 0xd8, 0x8f, 0xd9, 0x16, 0xbc, 0x10, 0x48, 0x36, 0x5c, 0xf0, 0x63, 0xb3, 0x90, 0x5a, 0x5c,\n-0x24, 0x37, 0xd7, 0xa3, 0xd6, 0xcb, 0x09, 0x71, 0xb9, 0xf1, 0x01, 0x72, 0x84, 0xb0, 0x7d, 0xdb,\n-0x4d, 0x80, 0xcd, 0xfc, 0xd3, 0x6f, 0xc9, 0xf8, 0xda, 0xb6, 0x0e, 0x82, 0xd2, 0x45, 0x85, 0xa8,\n-0x1b, 0x68, 0xa8, 0x3d, 0xe8, 0xf4, 0x44, 0x6c, 0xbd, 0xa1, 0xc2, 0xcb, 0x03, 0xbe, 0x8c, 0x3e,\n-0x13, 0x00, 0x84, 0xdf, 0x4a, 0x48, 0xc0, 0xe3, 0x22, 0x0a, 0xe8, 0xe9, 0x37, 0xa7, 0x18, 0x4c,\n-0xb1, 0x09, 0x0d, 0x23, 0x56, 0x7f, 0x04, 0x4d, 0xd9, 0x17, 0x84, 0x18, 0xa5, 0xc8, 0xda, 0x40,\n-0x94, 0x73, 0xeb, 0xce, 0x0e, 0x57, 0x3c, 0x03, 0x81, 0x3a, 0x9d, 0x0a, 0xa1, 0x57, 0x43, 0x69,\n-0xac, 0x57, 0x6d, 0x79, 0x90, 0x78, 0xe5, 0xb5, 0xb4, 0x3b, 0xd8, 0xbc, 0x4c, 0x8d, 0x28, 0xa1,\n-0xa7, 0xa3, 0xa7, 0xba, 0x02, 0x4e, 0x25, 0xd1, 0x2a, 0xae, 0xed, 0xae, 0x03, 0x22, 0xb8, 0x6b,\n-0x20, 0x0f, 0x30, 0x28, 0x54, 0x95, 0x7f, 0xe0, 0xee, 0xce, 0x0a, 0x66, 0x9d, 0xd1, 0x40, 0x2d,\n-0x6e, 0x22, 0xaf, 0x9d, 0x1a, 0xc1, 0x05, 0x19, 0xd2, 0x6f, 0xc0, 0xf2, 0x9f, 0xf8, 0x7b, 0xb3,\n-0x02, 0x42, 0xfb, 0x50, 0xa9, 0x1d, 0x2d, 0x93, 0x0f, 0x23, 0xab, 0xc6, 0xc1, 0x0f, 0x92, 0xff,\n-0xd0, 0xa2, 0x15, 0xf5, 0x53, 0x09, 0x71, 0x1c, 0xff, 0x45, 0x13, 0x84, 0xe6, 0x26, 0x5e, 0xf8,\n-0xe0, 0x88, 0x1c, 0x0a, 0xfc, 0x16, 0xb6, 0xa8, 0x73, 0x06, 0xb8, 0xf0, 0x63, 0x84, 0x02, 0xa0,\n-0xc6, 0x5a, 0xec, 0xe7, 0x74, 0xdf, 0x70, 0xae, 0xa3, 0x83, 0x25, 0xea, 0xd6, 0xc7, 0x97, 0x87,\n-0x93, 0xa7, 0xc6, 0x8a, 0x8a, 0x33, 0x97, 0x60, 0x37, 0x10, 0x3e, 0x97, 0x3e, 0x6e, 0x29, 0x15,\n-0xd6, 0xa1, 0x0f, 0xd1, 0x88, 0x2c, 0x12, 0x9f, 0x6f, 0xaa, 0xa4, 0xc6, 0x42, 0xeb, 0x41, 0xa2,\n-0xe3, 0x95, 0x43, 0xd3, 0x01, 0x85, 0x6d, 0x8e, 0xbb, 0x3b, 0xf3, 0x23, 0x36, 0xc7, 0xfe, 0x3b,\n-0xe0, 0xa1, 0x25, 0x07, 0x48, 0xab, 0xc9, 0x89, 0x74, 0xff, 0x08, 0x8f, 0x80, 0xbf, 0xc0, 0x96,\n-0x65, 0xf3, 0xee, 0xec, 0x4b, 0x68, 0xbd, 0x9d, 0x88, 0xc3, 0x31, 0xb3, 0x40, 0xf1, 0xe8, 0xcf,\n-0xf6, 0x38, 0xbb, 0x9c, 0xe4, 0xd1, 0x7f, 0xd4, 0xe5, 0x58, 0x9b, 0x7c, 0xfa, 0xd4, 0xf3, 0x0e,\n-0x9b, 0x75, 0x91, 0xe4, 0xba, 0x52, 0x2e, 0x19, 0x7e, 0xd1, 0xf5, 0xcd, 0x5a, 0x19, 0xfc, 0xba,\n-0x06, 0xf6, 0xfb, 0x52, 0xa8, 0x4b, 0x99, 0x04, 0xdd, 0xf8, 0xf9, 0xb4, 0x8b, 0x50, 0xa3, 0x4e,\n-0x62, 0x89, 0xf0, 0x87, 0x24, 0xfa, 0x83, 0x42, 0xc1, 0x87, 0xfa, 0xd5, 0x2d, 0x29, 0x2a, 0x5a,\n-0x71, 0x7a, 0x64, 0x6a, 0xd7, 0x27, 0x60, 0x63, 0x0d, 0xdb, 0xce, 0x49, 0xf5, 0x8d, 0x1f, 0x90,\n-0x89, 0x32, 0x17, 0xf8, 0x73, 0x43, 0xb8, 0xd2, 0x5a, 0x93, 0x86, 0x61, 0xd6, 0xe1, 0x75, 0x0a,\n-0xea, 0x79, 0x66, 0x76, 0x88, 0x4f, 0x71, 0xeb, 0x04, 0x25, 0xd6, 0x0a, 0x5a, 0x7a, 0x93, 0xe5,\n-0xb9, 0x4b, 0x17, 0x40, 0x0f, 0xb1, 0xb6, 0xb9, 0xf5, 0xde, 0x4f, 0xdc, 0xe0, 0xb3, 0xac, 0x3b,\n-0x11, 0x70, 0x60, 0x84, 0x4a, 0x43, 0x6e, 0x99, 0x20, 0xc0, 0x29, 0x71, 0x0a, 0xc0, 0x65, 0x02,\n-0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0xcb, 0x30, 0x82, 0x02, 0xc7, 0x30, 0x7d, 0x06, 0x08,\n-0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x71, 0x30, 0x6f, 0x30, 0x4c, 0x06, 0x08,\n-0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x40, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,\n-0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x6c,\n-0x65, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x6f, 0x73, 0x2f,\n-0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x64, 0x6f, 0x73, 0x2f, 0x72, 0x61, 0x69,\n-0x7a, 0x61, 0x63, 0x63, 0x76, 0x31, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x1f, 0x06, 0x08, 0x2b, 0x06,\n-0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x13, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f,\n-0x63, 0x73, 0x70, 0x2e, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65, 0x73, 0x30, 0x1d, 0x06, 0x03, 0x55,\n-0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd2, 0x87, 0xb4, 0xe3, 0xdf, 0x37, 0x27, 0x93, 0x55, 0xf6,\n-0x56, 0xea, 0x81, 0xe5, 0x36, 0xcc, 0x8c, 0x1e, 0x3f, 0xbd, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,\n-0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55,\n-0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xd2, 0x87, 0xb4, 0xe3, 0xdf, 0x37, 0x27, 0x93,\n-0x55, 0xf6, 0x56, 0xea, 0x81, 0xe5, 0x36, 0xcc, 0x8c, 0x1e, 0x3f, 0xbd, 0x30, 0x82, 0x01, 0x73,\n-0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x82, 0x01, 0x6a, 0x30, 0x82, 0x01, 0x66, 0x30, 0x82, 0x01,\n-0x62, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x82, 0x01, 0x58, 0x30, 0x82, 0x01, 0x22, 0x06,\n-0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x82, 0x01, 0x14, 0x1e, 0x82, 0x01,\n-0x10, 0x00, 0x41, 0x00, 0x75, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, 0x64, 0x00,\n-0x61, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, 0x00,\n-0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00,\n-0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x52, 0x00, 0x61, 0x00, 0xed, 0x00, 0x7a, 0x00,\n-0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x20, 0x00, 0x41, 0x00,\n-0x43, 0x00, 0x43, 0x00, 0x56, 0x00, 0x20, 0x00, 0x28, 0x00, 0x41, 0x00, 0x67, 0x00, 0x65, 0x00,\n-0x6e, 0x00, 0x63, 0x00, 0x69, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00,\n-0x54, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x67, 0x00,\n-0xed, 0x00, 0x61, 0x00, 0x20, 0x00, 0x79, 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, 0x00, 0x72, 0x00,\n-0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x69, 0x00,\n-0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x45, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00,\n-0x72, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x2c, 0x00, 0x20, 0x00,\n-0x43, 0x00, 0x49, 0x00, 0x46, 0x00, 0x20, 0x00, 0x51, 0x00, 0x34, 0x00, 0x36, 0x00, 0x30, 0x00,\n-0x31, 0x00, 0x31, 0x00, 0x35, 0x00, 0x36, 0x00, 0x45, 0x00, 0x29, 0x00, 0x2e, 0x00, 0x20, 0x00,\n-0x43, 0x00, 0x50, 0x00, 0x53, 0x00, 0x20, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x68, 0x00,\n-0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00,\n-0x77, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x76, 0x00, 0x2e, 0x00, 0x65, 0x00,\n-0x73, 0x30, 0x30, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x24, 0x68,\n-0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65,\n-0x73, 0x2f, 0x6c, 0x65, 0x67, 0x69, 0x73, 0x6c, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x2e,\n-0x68, 0x74, 0x6d, 0x30, 0x55, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x4e, 0x30, 0x4c, 0x30, 0x4a,\n-0xa0, 0x48, 0xa0, 0x46, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,\n-0x2e, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x61, 0x64, 0x6d,\n-0x69, 0x6e, 0x2f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x6f, 0x73, 0x2f, 0x63, 0x65, 0x72, 0x74,\n-0x69, 0x66, 0x69, 0x63, 0x61, 0x64, 0x6f, 0x73, 0x2f, 0x72, 0x61, 0x69, 0x7a, 0x61, 0x63, 0x63,\n-0x76, 0x31, 0x5f, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n-0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x17, 0x06, 0x03, 0x55, 0x1d,\n-0x11, 0x04, 0x10, 0x30, 0x0e, 0x81, 0x0c, 0x61, 0x63, 0x63, 0x76, 0x40, 0x61, 0x63, 0x63, 0x76,\n-0x2e, 0x65, 0x73, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,\n-0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x97, 0x31, 0x02, 0x9f, 0xe7, 0xfd, 0x43, 0x67, 0x48,\n-0x44, 0x14, 0xe4, 0x29, 0x87, 0xed, 0x4c, 0x28, 0x66, 0xd0, 0x8f, 0x35, 0xda, 0x4d, 0x61, 0xb7,\n-0x4a, 0x97, 0x4d, 0xb5, 0xdb, 0x90, 0xe0, 0x05, 0x2e, 0x0e, 0xc6, 0x79, 0xd0, 0xf2, 0x97, 0x69,\n-0x0f, 0xbd, 0x04, 0x47, 0xd9, 0xbe, 0xdb, 0xb5, 0x29, 0xda, 0x9b, 0xd9, 0xae, 0xa9, 0x99, 0xd5,\n-0xd3, 0x3c, 0x30, 0x93, 0xf5, 0x8d, 0xa1, 0xa8, 0xfc, 0x06, 0x8d, 0x44, 0xf4, 0xca, 0x16, 0x95,\n-0x7c, 0x33, 0xdc, 0x62, 0x8b, 0xa8, 0x37, 0xf8, 0x27, 0xd8, 0x09, 0x2d, 0x1b, 0xef, 0xc8, 0x14,\n-0x27, 0x20, 0xa9, 0x64, 0x44, 0xff, 0x2e, 0xd6, 0x75, 0xaa, 0x6c, 0x4d, 0x60, 0x40, 0x19, 0x49,\n-0x43, 0x54, 0x63, 0xda, 0xe2, 0xcc, 0xba, 0x66, 0xe5, 0x4f, 0x44, 0x7a, 0x5b, 0xd9, 0x6a, 0x81,\n-0x2b, 0x40, 0xd5, 0x7f, 0xf9, 0x01, 0x27, 0x58, 0x2c, 0xc8, 0xed, 0x48, 0x91, 0x7c, 0x3f, 0xa6,\n-0x00, 0xcf, 0xc4, 0x29, 0x73, 0x11, 0x36, 0xde, 0x86, 0x19, 0x3e, 0x9d, 0xee, 0x19, 0x8a, 0x1b,\n-0xd5, 0xb0, 0xed, 0x8e, 0x3d, 0x9c, 0x2a, 0xc0, 0x0d, 0xd8, 0x3d, 0x66, 0xe3, 0x3c, 0x0d, 0xbd,\n-0xd5, 0x94, 0x5c, 0xe2, 0xe2, 0xa7, 0x35, 0x1b, 0x04, 0x00, 0xf6, 0x3f, 0x5a, 0x8d, 0xea, 0x43,\n-0xbd, 0x5f, 0x89, 0x1d, 0xa9, 0xc1, 0xb0, 0xcc, 0x99, 0xe2, 0x4d, 0x00, 0x0a, 0xda, 0xc9, 0x27,\n-0x5b, 0xe7, 0x13, 0x90, 0x5c, 0xe4, 0xf5, 0x33, 0xa2, 0x55, 0x6d, 0xdc, 0xe0, 0x09, 0x4d, 0x2f,\n-0xb1, 0x26, 0x5b, 0x27, 0x75, 0x00, 0x09, 0xc4, 0x62, 0x77, 0x29, 0x08, 0x5f, 0x9e, 0x59, 0xac,\n-0xb6, 0x7e, 0xad, 0x9f, 0x54, 0x30, 0x22, 0x03, 0xc1, 0x1e, 0x71, 0x64, 0xfe, 0xf9, 0x38, 0x0a,\n-0x96, 0x18, 0xdd, 0x02, 0x14, 0xac, 0x23, 0xcb, 0x06, 0x1c, 0x1e, 0xa4, 0x7d, 0x8d, 0x0d, 0xde,\n-0x27, 0x41, 0xe8, 0xad, 0xda, 0x15, 0xb7, 0xb0, 0x23, 0xdd, 0x2b, 0xa8, 0xd3, 0xda, 0x25, 0x87,\n-0xed, 0xe8, 0x55, 0x44, 0x4d, 0x88, 0xf4, 0x36, 0x7e, 0x84, 0x9a, 0x78, 0xac, 0xf7, 0x0e, 0x56,\n-0x49, 0x0e, 0xd6, 0x33, 0x25, 0xd6, 0x84, 0x50, 0x42, 0x6c, 0x20, 0x12, 0x1d, 0x2a, 0xd5, 0xbe,\n-0xbc, 0xf2, 0x70, 0x81, 0xa4, 0x70, 0x60, 0xbe, 0x05, 0xb5, 0x9b, 0x9e, 0x04, 0x44, 0xbe, 0x61,\n-0x23, 0xac, 0xe9, 0xa5, 0x24, 0x8c, 0x11, 0x80, 0x94, 0x5a, 0xa2, 0xa2, 0xb9, 0x49, 0xd2, 0xc1,\n-0xdc, 0xd1, 0xa7, 0xed, 0x31, 0x11, 0x2c, 0x9e, 0x19, 0xa6, 0xee, 0xe1, 0x55, 0xe1, 0xc0, 0xea,\n-0xcf, 0x0d, 0x84, 0xe4, 0x17, 0xb7, 0xa2, 0x7c, 0xa5, 0xde, 0x55, 0x25, 0x06, 0xee, 0xcc, 0xc0,\n-0x87, 0x5c, 0x40, 0xda, 0xcc, 0x95, 0x3f, 0x55, 0xe0, 0x35, 0xc7, 0xb8, 0x84, 0xbe, 0xb4, 0x5d,\n-0xcd, 0x7a, 0x83, 0x01, 0x72, 0xee, 0x87, 0xe6, 0x5f, 0x1d, 0xae, 0xb5, 0x85, 0xc6, 0x26, 0xdf,\n-0xe6, 0xc1, 0x9a, 0xe9, 0x1e, 0x02, 0x47, 0x9f, 0x2a, 0xa8, 0x6d, 0xa9, 0x5b, 0xcf, 0xec, 0x45,\n-0x77, 0x7f, 0x98, 0x27, 0x9a, 0x32, 0x5d, 0x2a, 0xe3, 0x84, 0xee, 0xc5, 0x98, 0x66, 0x2f, 0x96,\n-0x20, 0x1d, 0xdd, 0xd8, 0xc3, 0x27, 0xd7, 0xb0, 0xf9, 0xfe, 0xd9, 0x7d, 0xcd, 0xd0, 0x9f, 0x8f,\n-0x0b, 0x14, 0x58, 0x51, 0x9f, 0x2f, 0x8b, 0xc3, 0x38, 0x2d, 0xde, 0xe8, 0x8f, 0xd6, 0x8d, 0x87,\n-0xa4, 0xf5, 0x56, 0x43, 0x16, 0x99, 0x2c, 0xf4, 0xa4, 0x56, 0xb4, 0x34, 0xb8, 0x61, 0x37, 0xc9,\n-0xc2, 0x58, 0x80, 0x1b, 0xa0, 0x97, 0xa1, 0xfc, 0x59, 0x8d, 0xe9, 0x11, 0xf6, 0xd1, 0x0f, 0x4b,\n-0x55, 0x34, 0x46, 0x2a, 0x8b, 0x86, 0x3b, 0x30, 0x82, 0x05, 0xbb, 0x30, 0x82, 0x03, 0xa3, 0xa0,\n-0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x57, 0x0a, 0x11, 0x97, 0x42, 0xc4, 0xe3, 0xcc, 0x30, 0x0d,\n-0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x6b, 0x31,\n-0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x54, 0x31, 0x0e, 0x30, 0x0c,\n-0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x05, 0x4d, 0x69, 0x6c, 0x61, 0x6e, 0x31, 0x23, 0x30, 0x21,\n-0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x41, 0x63, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x20, 0x53,\n-0x2e, 0x70, 0x2e, 0x41, 0x2e, 0x2f, 0x30, 0x33, 0x33, 0x35, 0x38, 0x35, 0x32, 0x30, 0x39, 0x36,\n-0x37, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x41, 0x63, 0x74, 0x61,\n-0x6c, 0x69, 0x73, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69,\n-0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31,\n-0x30, 0x39, 0x32, 0x32, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x30,\n-0x39, 0x32, 0x32, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, 0x5a, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09,\n-0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x54, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55,\n-0x04, 0x07, 0x0c, 0x05, 0x4d, 0x69, 0x6c, 0x61, 0x6e, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55,\n-0x04, 0x0a, 0x0c, 0x1a, 0x41, 0x63, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x20, 0x53, 0x2e, 0x70, 0x2e,\n-0x41, 0x2e, 0x2f, 0x30, 0x33, 0x33, 0x35, 0x38, 0x35, 0x32, 0x30, 0x39, 0x36, 0x37, 0x31, 0x27,\n-0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x41, 0x63, 0x74, 0x61, 0x6c, 0x69, 0x73,\n-0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,\n-0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,\n-0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30,\n-0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa7, 0xc6, 0xc4, 0xa5, 0x29, 0xa4, 0x2c, 0xef,\n-0xe5, 0x18, 0xc5, 0xb0, 0x50, 0xa3, 0x6f, 0x51, 0x3b, 0x9f, 0x0a, 0x5a, 0xc9, 0xc2, 0x48, 0x38,\n-0x0a, 0xc2, 0x1c, 0xa0, 0x18, 0x7f, 0x91, 0xb5, 0x87, 0xb9, 0x40, 0x3f, 0xdd, 0x1d, 0x68, 0x1f,\n-0x08, 0x83, 0xd5, 0x2d, 0x1e, 0x88, 0xa0, 0xf8, 0x8f, 0x56, 0x8f, 0x6d, 0x99, 0x02, 0x92, 0x90,\n-0x16, 0xd5, 0x5f, 0x08, 0x6c, 0x89, 0xd7, 0xe1, 0xac, 0xbc, 0x20, 0xc2, 0xb1, 0xe0, 0x83, 0x51,\n-0x8a, 0x69, 0x4d, 0x00, 0x96, 0x5a, 0x6f, 0x2f, 0xc0, 0x44, 0x7e, 0xa3, 0x0e, 0xe4, 0x91, 0xcd,\n-0x58, 0xee, 0xdc, 0xfb, 0xc7, 0x1e, 0x45, 0x47, 0xdd, 0x27, 0xb9, 0x08, 0x01, 0x9f, 0xa6, 0x21,\n-0x1d, 0xf5, 0x41, 0x2d, 0x2f, 0x4c, 0xfd, 0x28, 0xad, 0xe0, 0x8a, 0xad, 0x22, 0xb4, 0x56, 0x65,\n-0x8e, 0x86, 0x54, 0x8f, 0x93, 0x43, 0x29, 0xde, 0x39, 0x46, 0x78, 0xa3, 0x30, 0x23, 0xba, 0xcd,\n-0xf0, 0x7d, 0x13, 0x57, 0xc0, 0x5d, 0xd2, 0x83, 0x6b, 0x48, 0x4c, 0xc4, 0xab, 0x9f, 0x80, 0x5a,\n-0x5b, 0x3a, 0xbd, 0xc9, 0xa7, 0x22, 0x3f, 0x80, 0x27, 0x33, 0x5b, 0x0e, 0xb7, 0x8a, 0x0c, 0x5d,\n-0x07, 0x37, 0x08, 0xcb, 0x6c, 0xd2, 0x7a, 0x47, 0x22, 0x44, 0x35, 0xc5, 0xcc, 0xcc, 0x2e, 0x8e,\n-0xdd, 0x2a, 0xed, 0xb7, 0x7d, 0x66, 0x0d, 0x5f, 0x61, 0x51, 0x22, 0x55, 0x1b, 0xe3, 0x46, 0xe3,\n-0xe3, 0x3d, 0xd0, 0x35, 0x62, 0x9a, 0xdb, 0xaf, 0x14, 0xc8, 0x5b, 0xa1, 0xcc, 0x89, 0x1b, 0xe1,\n-0x30, 0x26, 0xfc, 0xa0, 0x9b, 0x1f, 0x81, 0xa7, 0x47, 0x1f, 0x04, 0xeb, 0xa3, 0x39, 0x92, 0x06,\n-0x9f, 0x99, 0xd3, 0xbf, 0xd3, 0xea, 0x4f, 0x50, 0x9c, 0x19, 0xfe, 0x96, 0x87, 0x1e, 0x3c, 0x65,\n-0xf6, 0xa3, 0x18, 0x24, 0x83, 0x86, 0x10, 0xe7, 0x54, 0x3e, 0xa8, 0x3a, 0x76, 0x24, 0x4f, 0x81,\n-0x21, 0xc5, 0xe3, 0x0f, 0x02, 0xf8, 0x93, 0x94, 0x47, 0x20, 0xbb, 0xfe, 0xd4, 0x0e, 0xd3, 0x68,\n-0xb9, 0xdd, 0xc4, 0x7a, 0x84, 0x82, 0xe3, 0x53, 0x54, 0x79, 0xdd, 0xdb, 0x9c, 0xd2, 0xf2, 0x07,\n-0x9b, 0x2e, 0xb6, 0xbc, 0x3e, 0xed, 0x85, 0x6d, 0xef, 0x25, 0x11, 0xf2, 0x97, 0x1a, 0x42, 0x61,\n-0xf7, 0x4a, 0x97, 0xe8, 0x8b, 0xb1, 0x10, 0x07, 0xfa, 0x65, 0x81, 0xb2, 0xa2, 0x39, 0xcf, 0xf7,\n-0x3c, 0xff, 0x18, 0xfb, 0xc6, 0xf1, 0x5a, 0x8b, 0x59, 0xe2, 0x02, 0xac, 0x7b, 0x92, 0xd0, 0x4e,\n-0x14, 0x4f, 0x59, 0x45, 0xf6, 0x0c, 0x5e, 0x28, 0x5f, 0xb0, 0xe8, 0x3f, 0x45, 0xcf, 0xcf, 0xaf,\n-0x9b, 0x6f, 0xfb, 0x84, 0xd3, 0x77, 0x5a, 0x95, 0x6f, 0xac, 0x94, 0x84, 0x9e, 0xee, 0xbc, 0xc0,\n-0x4a, 0x8f, 0x4a, 0x93, 0xf8, 0x44, 0x21, 0xe2, 0x31, 0x45, 0x61, 0x50, 0x4e, 0x10, 0xd8, 0xe3,\n-0x35, 0x7c, 0x4c, 0x19, 0xb4, 0xde, 0x05, 0xbf, 0xa3, 0x06, 0x9f, 0xc8, 0xb5, 0xcd, 0xe4, 0x1f,\n-0xd7, 0x17, 0x06, 0x0d, 0x7a, 0x95, 0x74, 0x55, 0x0d, 0x68, 0x1a, 0xfc, 0x10, 0x1b, 0x62, 0x64,\n-0x9d, 0x6d, 0xe0, 0x95, 0xa0, 0xc3, 0x94, 0x07, 0x57, 0x0d, 0x14, 0xe6, 0xbd, 0x05, 0xfb, 0xb8,\n-0x9f, 0xe6, 0xdf, 0x8b, 0xe2, 0xc6, 0xe7, 0x7e, 0x96, 0xf6, 0x53, 0xc5, 0x80, 0x34, 0x50, 0x28,\n-0x58, 0xf0, 0x12, 0x50, 0x71, 0x17, 0x30, 0xba, 0xe6, 0x78, 0x63, 0xbc, 0xf4, 0xb2, 0xad, 0x9b,\n-0x2b, 0xb2, 0xfe, 0xe1, 0x39, 0x8c, 0x5e, 0xba, 0x0b, 0x20, 0x94, 0xde, 0x7b, 0x83, 0xb8, 0xff,\n-0xe3, 0x56, 0x8d, 0xb7, 0x11, 0xe9, 0x3b, 0x8c, 0xf2, 0xb1, 0xc1, 0x5d, 0x9d, 0xa4, 0x0b, 0x4c,\n-0x2b, 0xd9, 0xb2, 0x18, 0xf5, 0xb5, 0x9f, 0x4b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30,\n-0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x52, 0xd8, 0x88, 0x3a,\n-0xc8, 0x9f, 0x78, 0x66, 0xed, 0x89, 0xf3, 0x7b, 0x38, 0x70, 0x94, 0xc9, 0x02, 0x02, 0x36, 0xd0,\n-0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n-0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x52, 0xd8,\n-0x88, 0x3a, 0xc8, 0x9f, 0x78, 0x66, 0xed, 0x89, 0xf3, 0x7b, 0x38, 0x70, 0x94, 0xc9, 0x02, 0x02,\n-0x36, 0xd0, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n-0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n-0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x0b, 0x7b, 0x72, 0x87, 0xc0, 0x60, 0xa6, 0x49, 0x4c, 0x88,\n-0x58, 0xe6, 0x1d, 0x88, 0xf7, 0x14, 0x64, 0x48, 0xa6, 0xd8, 0x58, 0x0a, 0x0e, 0x4f, 0x13, 0x35,\n-0xdf, 0x35, 0x1d, 0xd4, 0xed, 0x06, 0x31, 0xc8, 0x81, 0x3e, 0x6a, 0xd5, 0xdd, 0x3b, 0x1a, 0x32,\n-0xee, 0x90, 0x3d, 0x11, 0xd2, 0x2e, 0xf4, 0x8e, 0xc3, 0x63, 0x2e, 0x23, 0x66, 0xb0, 0x67, 0xbe,\n-0x6f, 0xb6, 0xc0, 0x13, 0x39, 0x60, 0xaa, 0xa2, 0x34, 0x25, 0x93, 0x75, 0x52, 0xde, 0xa7, 0x9d,\n-0xad, 0x0e, 0x87, 0x89, 0x52, 0x71, 0x6a, 0x16, 0x3c, 0x19, 0x1d, 0x83, 0xf8, 0x9a, 0x29, 0x65,\n-0xbe, 0xf4, 0x3f, 0x9a, 0xd9, 0xf0, 0xf3, 0x5a, 0x87, 0x21, 0x71, 0x80, 0x4d, 0xcb, 0xe0, 0x38,\n-0x9b, 0x3f, 0xbb, 0xfa, 0xe0, 0x30, 0x4d, 0xcf, 0x86, 0xd3, 0x65, 0x10, 0x19, 0x18, 0xd1, 0x97,\n-0x02, 0xb1, 0x2b, 0x72, 0x42, 0x68, 0xac, 0xa0, 0xbd, 0x4e, 0x5a, 0xda, 0x18, 0xbf, 0x6b, 0x98,\n-0x81, 0xd0, 0xfd, 0x9a, 0xbe, 0x5e, 0x15, 0x48, 0xcd, 0x11, 0x15, 0xb9, 0xc0, 0x29, 0x5c, 0xb4,\n-0xe8, 0x88, 0xf7, 0x3e, 0x36, 0xae, 0xb7, 0x62, 0xfd, 0x1e, 0x62, 0xde, 0x70, 0x78, 0x10, 0x1c,\n-0x48, 0x5b, 0xda, 0xbc, 0xa4, 0x38, 0xba, 0x67, 0xed, 0x55, 0x3e, 0x5e, 0x57, 0xdf, 0xd4, 0x03,\n-0x40, 0x4c, 0x81, 0xa4, 0xd2, 0x4f, 0x63, 0xa7, 0x09, 0x42, 0x09, 0x14, 0xfc, 0x00, 0xa9, 0xc2,\n-0x80, 0x73, 0x4f, 0x2e, 0xc0, 0x40, 0xd9, 0x11, 0x7b, 0x48, 0xea, 0x7a, 0x02, 0xc0, 0xd3, 0xeb,\n-0x28, 0x01, 0x26, 0x58, 0x74, 0xc1, 0xc0, 0x73, 0x22, 0x6d, 0x93, 0x95, 0xfd, 0x39, 0x7d, 0xbb,\n-0x2a, 0xe3, 0xf6, 0x82, 0xe3, 0x2c, 0x97, 0x5f, 0x4e, 0x1f, 0x91, 0x94, 0xfa, 0xfe, 0x2c, 0xa3,\n-0xd8, 0x76, 0x1a, 0xb8, 0x4d, 0xb2, 0x38, 0x4f, 0x9b, 0xfa, 0x1d, 0x48, 0x60, 0x79, 0x26, 0xe2,\n-0xf3, 0xfd, 0xa9, 0xd0, 0x9a, 0xe8, 0x70, 0x8f, 0x49, 0x7a, 0xd6, 0xe5, 0xbd, 0x0a, 0x0e, 0xdb,\n-0x2d, 0xf3, 0x8d, 0xbf, 0xeb, 0xe3, 0xa4, 0x7d, 0xcb, 0xc7, 0x95, 0x71, 0xe8, 0xda, 0xa3, 0x7c,\n-0xc5, 0xc2, 0xf8, 0x74, 0x92, 0x04, 0x1b, 0x86, 0xac, 0xa4, 0x22, 0x53, 0x40, 0xb6, 0xac, 0xfe,\n-0x4c, 0x76, 0xcf, 0xfb, 0x94, 0x32, 0xc0, 0x35, 0x9f, 0x76, 0x3f, 0x6e, 0xe5, 0x90, 0x6e, 0xa0,\n-0xa6, 0x26, 0xa2, 0xb8, 0x2c, 0xbe, 0xd1, 0x2b, 0x85, 0xfd, 0xa7, 0x68, 0xc8, 0xba, 0x01, 0x2b,\n-0xb1, 0x6c, 0x74, 0x1d, 0xb8, 0x73, 0x95, 0xe7, 0xee, 0xb7, 0xc7, 0x25, 0xf0, 0x00, 0x4c, 0x00,\n-0xb2, 0x7e, 0xb6, 0x0b, 0x8b, 0x1c, 0xf3, 0xc0, 0x50, 0x9e, 0x25, 0xb9, 0xe0, 0x08, 0xde, 0x36,\n-0x66, 0xff, 0x37, 0xa5, 0xd1, 0xbb, 0x54, 0x64, 0x2c, 0xc9, 0x27, 0xb5, 0x4b, 0x92, 0x7e, 0x65,\n-0xff, 0xd3, 0x2d, 0xe1, 0xb9, 0x4e, 0xbc, 0x7f, 0xa4, 0x41, 0x21, 0x90, 0x41, 0x77, 0xa6, 0x39,\n-0x1f, 0xea, 0x9e, 0xe3, 0x9f, 0xd0, 0x66, 0x6f, 0x05, 0xec, 0xaa, 0x76, 0x7e, 0xbf, 0x6b, 0x16,\n-0xa0, 0xeb, 0xb5, 0xc7, 0xfc, 0x92, 0x54, 0x2f, 0x2b, 0x11, 0x27, 0x25, 0x37, 0x78, 0x4c, 0x51,\n-0x6a, 0xb0, 0xf3, 0xcc, 0x58, 0x5d, 0x14, 0xf1, 0x6a, 0x48, 0x15, 0xff, 0xc2, 0x07, 0xb6, 0xb1,\n-0x8d, 0x0f, 0x8e, 0x5c, 0x50, 0x46, 0xb3, 0x3d, 0xbf, 0x01, 0x98, 0x4f, 0xb2, 0x59, 0x54, 0x47,\n-0x3e, 0x34, 0x7b, 0x78, 0x6d, 0x56, 0x93, 0x2e, 0x73, 0xea, 0x66, 0x28, 0x78, 0xcd, 0x1d, 0x14,\n-0xbf, 0xa0, 0x8f, 0x2f, 0x2e, 0xb8, 0x2e, 0x8e, 0xf2, 0x14, 0x8a, 0xcc, 0xe9, 0xb5, 0x7c, 0xfb,\n-0x6c, 0x9d, 0x0c, 0xa5, 0xe1, 0x96, 0x30, 0x82, 0x03, 0x4c, 0x30, 0x82, 0x02, 0x34, 0xa0, 0x03,\n-0x02, 0x01, 0x02, 0x02, 0x08, 0x77, 0x77, 0x06, 0x27, 0x26, 0xa9, 0xb1, 0x7c, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x44, 0x31, 0x0b,\n-0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73,\n-0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, 0x66, 0x69,\n-0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69,\n-0x61, 0x6c, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x30, 0x36,\n-0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x30, 0x36, 0x30,\n-0x36, 0x5a, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n-0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69,\n-0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x0c, 0x16, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f,\n-0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,\n-0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf6, 0x1b, 0x4f, 0x67, 0x07, 0x2b, 0xa1,\n-0x15, 0xf5, 0x06, 0x22, 0xcb, 0x1f, 0x01, 0xb2, 0xe3, 0x73, 0x45, 0x06, 0x44, 0x49, 0x2c, 0xbb,\n-0x49, 0x25, 0x14, 0xd6, 0xce, 0xc3, 0xb7, 0xab, 0x2c, 0x4f, 0xc6, 0x41, 0x32, 0x94, 0x57, 0xfa,\n-0x12, 0xa7, 0x5b, 0x0e, 0xe2, 0x8f, 0x1f, 0x1e, 0x86, 0x19, 0xa7, 0xaa, 0xb5, 0x2d, 0xb9, 0x5f,\n-0x0d, 0x8a, 0xc2, 0xaf, 0x85, 0x35, 0x79, 0x32, 0x2d, 0xbb, 0x1c, 0x62, 0x37, 0xf2, 0xb1, 0x5b,\n-0x4a, 0x3d, 0xca, 0xcd, 0x71, 0x5f, 0xe9, 0x42, 0xbe, 0x94, 0xe8, 0xc8, 0xde, 0xf9, 0x22, 0x48,\n-0x64, 0xc6, 0xe5, 0xab, 0xc6, 0x2b, 0x6d, 0xad, 0x05, 0xf0, 0xfa, 0xd5, 0x0b, 0xcf, 0x9a, 0xe5,\n-0xf0, 0x50, 0xa4, 0x8b, 0x3b, 0x47, 0xa5, 0x23, 0x5b, 0x7a, 0x7a, 0xf8, 0x33, 0x3f, 0xb8, 0xef,\n-0x99, 0x97, 0xe3, 0x20, 0xc1, 0xd6, 0x28, 0x89, 0xcf, 0x94, 0xfb, 0xb9, 0x45, 0xed, 0xe3, 0x40,\n-0x17, 0x11, 0xd4, 0x74, 0xf0, 0x0b, 0x31, 0xe2, 0x2b, 0x26, 0x6a, 0x9b, 0x4c, 0x57, 0xae, 0xac,\n-0x20, 0x3e, 0xba, 0x45, 0x7a, 0x05, 0xf3, 0xbd, 0x9b, 0x69, 0x15, 0xae, 0x7d, 0x4e, 0x20, 0x63,\n-0xc4, 0x35, 0x76, 0x3a, 0x07, 0x02, 0xc9, 0x37, 0xfd, 0xc7, 0x47, 0xee, 0xe8, 0xf1, 0x76, 0x1d,\n-0x73, 0x15, 0xf2, 0x97, 0xa4, 0xb5, 0xc8, 0x7a, 0x79, 0xd9, 0x42, 0xaa, 0x2b, 0x7f, 0x5c, 0xfe,\n-0xce, 0x26, 0x4f, 0xa3, 0x66, 0x81, 0x35, 0xaf, 0x44, 0xba, 0x54, 0x1e, 0x1c, 0x30, 0x32, 0x65,\n-0x9d, 0xe6, 0x3c, 0x93, 0x5e, 0x50, 0x4e, 0x7a, 0xe3, 0x3a, 0xd4, 0x6e, 0xcc, 0x1a, 0xfb, 0xf9,\n-0xd2, 0x37, 0xae, 0x24, 0x2a, 0xab, 0x57, 0x03, 0x22, 0x28, 0x0d, 0x49, 0x75, 0x7f, 0xb7, 0x28,\n-0xda, 0x75, 0xbf, 0x8e, 0xe3, 0xdc, 0x0e, 0x79, 0x31, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n-0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x93, 0xc6,\n-0x53, 0x8b, 0x5e, 0xca, 0xaf, 0x3f, 0x9f, 0x1e, 0x0f, 0xe5, 0x99, 0x95, 0xbc, 0x24, 0xf6, 0x94,\n-0x8f, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n-0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n-0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,\n-0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x58, 0xac, 0xf4, 0x04, 0x0e, 0xcd, 0xc0, 0x0d, 0xff, 0x0a,\n-0xfd, 0xd4, 0xba, 0x16, 0x5f, 0x29, 0xbd, 0x7b, 0x68, 0x99, 0x58, 0x49, 0xd2, 0xb4, 0x1d, 0x37,\n-0x4d, 0x7f, 0x27, 0x7d, 0x46, 0x06, 0x5d, 0x43, 0xc6, 0x86, 0x2e, 0x3e, 0x73, 0xb2, 0x26, 0x7d,\n-0x4f, 0x93, 0xa9, 0xb6, 0xc4, 0x2a, 0x9a, 0xab, 0x21, 0x97, 0x14, 0xb1, 0xde, 0x8c, 0xd3, 0xab,\n-0x89, 0x15, 0xd8, 0x6b, 0x24, 0xd4, 0xf1, 0x16, 0xae, 0xd8, 0xa4, 0x5c, 0xd4, 0x7f, 0x51, 0x8e,\n-0xed, 0x18, 0x01, 0xb1, 0x93, 0x63, 0xbd, 0xbc, 0xf8, 0x61, 0x80, 0x9a, 0x9e, 0xb1, 0xce, 0x42,\n-0x70, 0xe2, 0xa9, 0x7d, 0x06, 0x25, 0x7d, 0x27, 0xa1, 0xfe, 0x6f, 0xec, 0xb3, 0x1e, 0x24, 0xda,\n-0xe3, 0x4b, 0x55, 0x1a, 0x00, 0x3b, 0x35, 0xb4, 0x3b, 0xd9, 0xd7, 0x5d, 0x30, 0xfd, 0x81, 0x13,\n-0x89, 0xf2, 0xc2, 0x06, 0x2b, 0xed, 0x67, 0xc4, 0x8e, 0xc9, 0x43, 0xb2, 0x5c, 0x6b, 0x15, 0x89,\n-0x02, 0xbc, 0x62, 0xfc, 0x4e, 0xf2, 0xb5, 0x33, 0xaa, 0xb2, 0x6f, 0xd3, 0x0a, 0xa2, 0x50, 0xe3,\n-0xf6, 0x3b, 0xe8, 0x2e, 0x44, 0xc2, 0xdb, 0x66, 0x38, 0xa9, 0x33, 0x56, 0x48, 0xf1, 0x6d, 0x1b,\n-0x33, 0x8d, 0x0d, 0x8c, 0x3f, 0x60, 0x37, 0x9d, 0xd3, 0xca, 0x6d, 0x7e, 0x34, 0x7e, 0x0d, 0x9f,\n-0x72, 0x76, 0x8b, 0x1b, 0x9f, 0x72, 0xfd, 0x52, 0x35, 0x41, 0x45, 0x02, 0x96, 0x2f, 0x1c, 0xb2,\n-0x9a, 0x73, 0x49, 0x21, 0xb1, 0x49, 0x47, 0x45, 0x47, 0xb4, 0xef, 0x6a, 0x34, 0x11, 0xc9, 0x4d,\n-0x9a, 0xcc, 0x59, 0xb7, 0xd6, 0x02, 0x9e, 0x5a, 0x4e, 0x65, 0xb5, 0x94, 0xae, 0x1b, 0xdf, 0x29,\n-0xb0, 0x16, 0xf1, 0xbf, 0x00, 0x9e, 0x07, 0x3a, 0x17, 0x64, 0xb5, 0x04, 0xb5, 0x23, 0x21, 0x99,\n-0x0a, 0x95, 0x3b, 0x97, 0x7c, 0xef, 0x30, 0x82, 0x05, 0xb0, 0x30, 0x82, 0x03, 0x98, 0xa0, 0x03,\n-0x02, 0x01, 0x02, 0x02, 0x10, 0x15, 0xc8, 0xbd, 0x65, 0x47, 0x5c, 0xaf, 0xb8, 0x97, 0x00, 0x5e,\n-0xe4, 0x06, 0xd2, 0xbc, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x05, 0x05, 0x00, 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x54, 0x57, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x43, 0x68,\n-0x75, 0x6e, 0x67, 0x68, 0x77, 0x61, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x63, 0x6f, 0x6d, 0x20, 0x43,\n-0x6f, 0x2e, 0x2c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04,\n-0x0b, 0x0c, 0x21, 0x65, 0x50, 0x4b, 0x49, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n-0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n-0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x31, 0x32, 0x32, 0x30, 0x30, 0x32,\n-0x33, 0x31, 0x32, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x31, 0x32, 0x32, 0x30, 0x30, 0x32, 0x33,\n-0x31, 0x32, 0x37, 0x5a, 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n-0x02, 0x54, 0x57, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x43, 0x68,\n-0x75, 0x6e, 0x67, 0x68, 0x77, 0x61, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x63, 0x6f, 0x6d, 0x20, 0x43,\n-0x6f, 0x2e, 0x2c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04,\n-0x0b, 0x0c, 0x21, 0x65, 0x50, 0x4b, 0x49, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,\n-0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,\n-0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n-0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a,\n-0x02, 0x82, 0x02, 0x01, 0x00, 0xe1, 0x25, 0x0f, 0xee, 0x8d, 0xdb, 0x88, 0x33, 0x75, 0x67, 0xcd,\n-0xad, 0x1f, 0x7d, 0x3a, 0x4e, 0x6d, 0x9d, 0xd3, 0x2f, 0x14, 0xf3, 0x63, 0x74, 0xcb, 0x01, 0x21,\n-0x6a, 0x37, 0xea, 0x84, 0x50, 0x07, 0x4b, 0x26, 0x5b, 0x09, 0x43, 0x6c, 0x21, 0x9e, 0x6a, 0xc8,\n-0xd5, 0x03, 0xf5, 0x60, 0x69, 0x8f, 0xcc, 0xf0, 0x22, 0xe4, 0x1f, 0xe7, 0xf7, 0x6a, 0x22, 0x31,\n-0xb7, 0x2c, 0x15, 0xf2, 0xe0, 0xfe, 0x00, 0x6a, 0x43, 0xff, 0x87, 0x65, 0xc6, 0xb5, 0x1a, 0xc1,\n-0xa7, 0x4c, 0x6d, 0x22, 0x70, 0x21, 0x8a, 0x31, 0xf2, 0x97, 0x74, 0x89, 0x09, 0x12, 0x26, 0x1c,\n-0x9e, 0xca, 0xd9, 0x12, 0xa2, 0x95, 0x3c, 0xda, 0xe9, 0x67, 0xbf, 0x08, 0xa0, 0x64, 0xe3, 0xd6,\n-0x42, 0xb7, 0x45, 0xef, 0x97, 0xf4, 0xf6, 0xf5, 0xd7, 0xb5, 0x4a, 0x15, 0x02, 0x58, 0x7d, 0x98,\n-0x58, 0x4b, 0x60, 0xbc, 0xcd, 0xd7, 0x0d, 0x9a, 0x13, 0x33, 0x53, 0xd1, 0x61, 0xf9, 0x7a, 0xd5,\n-0xd7, 0x78, 0xb3, 0x9a, 0x33, 0xf7, 0x00, 0x86, 0xce, 0x1d, 0x4d, 0x94, 0x38, 0xaf, 0xa8, 0xec,\n-0x78, 0x51, 0x70, 0x8a, 0x5c, 0x10, 0x83, 0x51, 0x21, 0xf7, 0x11, 0x3d, 0x34, 0x86, 0x5e, 0xe5,\n-0x48, 0xcd, 0x97, 0x81, 0x82, 0x35, 0x4c, 0x19, 0xec, 0x65, 0xf6, 0x6b, 0xc5, 0x05, 0xa1, 0xee,\n-0x47, 0x13, 0xd6, 0xb3, 0x21, 0x27, 0x94, 0x10, 0x0a, 0xd9, 0x24, 0x3b, 0xba, 0xbe, 0x44, 0x13,\n-0x46, 0x30, 0x3f, 0x97, 0x3c, 0xd8, 0xd7, 0xd7, 0x6a, 0xee, 0x3b, 0x38, 0xe3, 0x2b, 0xd4, 0x97,\n-0x0e, 0xb9, 0x1b, 0xe7, 0x07, 0x49, 0x7f, 0x37, 0x2a, 0xf9, 0x77, 0x78, 0xcf, 0x54, 0xed, 0x5b,\n-0x46, 0x9d, 0xa3, 0x80, 0x0e, 0x91, 0x43, 0xc1, 0xd6, 0x5b, 0x5f, 0x14, 0xba, 0x9f, 0xa6, 0x8d,\n-0x24, 0x47, 0x40, 0x59, 0xbf, 0x72, 0x38, 0xb2, 0x36, 0x6c, 0x37, 0xff, 0x99, 0xd1, 0x5d, 0x0e,\n-0x59, 0x0a, 0xab, 0x69, 0xf7, 0xc0, 0xb2, 0x04, 0x45, 0x7a, 0x54, 0x00, 0xae, 0xbe, 0x53, 0xf6,\n-0xb5, 0xe7, 0xe1, 0xf8, 0x3c, 0xa3, 0x31, 0xd2, 0xa9, 0xfe, 0x21, 0x52, 0x64, 0xc5, 0xa6, 0x67,\n-0xf0, 0x75, 0x07, 0x06, 0x94, 0x14, 0x81, 0x55, 0xc6, 0x27, 0xe4, 0x01, 0x8f, 0x17, 0xc1, 0x6a,\n-0x71, 0xd7, 0xbe, 0x4b, 0xfb, 0x94, 0x58, 0x7d, 0x7e, 0x11, 0x33, 0xb1, 0x42, 0xf7, 0x62, 0x6c,\n-0x18, 0xd6, 0xcf, 0x09, 0x68, 0x3e, 0x7f, 0x6c, 0xf6, 0x1e, 0x8f, 0x62, 0xad, 0xa5, 0x63, 0xdb,\n-0x09, 0xa7, 0x1f, 0x22, 0x42, 0x41, 0x1e, 0x6f, 0x99, 0x8a, 0x3e, 0xd7, 0xf9, 0x3f, 0x40, 0x7a,\n-0x79, 0xb0, 0xa5, 0x01, 0x92, 0xd2, 0x9d, 0x3d, 0x08, 0x15, 0xa5, 0x10, 0x01, 0x2d, 0xb3, 0x32,\n-0x76, 0xa8, 0x95, 0x0d, 0xb3, 0x7a, 0x9a, 0xfb, 0x07, 0x10, 0x78, 0x11, 0x6f, 0xe1, 0x8f, 0xc7,\n-0xba, 0x0f, 0x25, 0x1a, 0x74, 0x2a, 0xe5, 0x1c, 0x98, 0x41, 0x99, 0xdf, 0x21, 0x87, 0xe8, 0x95,\n-0x06, 0x6a, 0x0a, 0xb3, 0x6a, 0x47, 0x76, 0x65, 0xf6, 0x3a, 0xcf, 0x8f, 0x62, 0x17, 0x19, 0x7b,\n-0x0a, 0x28, 0xcd, 0x1a, 0xd2, 0x83, 0x1e, 0x21, 0xc7, 0x2c, 0xbf, 0xbe, 0xff, 0x61, 0x68, 0xb7,\n-0x67, 0x1b, 0xbb, 0x78, 0x4d, 0x8d, 0xce, 0x67, 0xe5, 0xe4, 0xc1, 0x8e, 0xb7, 0x23, 0x66, 0xe2,\n-0x9d, 0x90, 0x75, 0x34, 0x98, 0xa9, 0x36, 0x2b, 0x8a, 0x9a, 0x94, 0xb9, 0x9d, 0xec, 0xcc, 0x8a,\n-0xb1, 0xf8, 0x25, 0x89, 0x5c, 0x5a, 0xb6, 0x2f, 0x8c, 0x1f, 0x6d, 0x79, 0x24, 0xa7, 0x52, 0x68,\n-0xc3, 0x84, 0x35, 0xe2, 0x66, 0x8d, 0x63, 0x0e, 0x25, 0x4d, 0xd5, 0x19, 0xb2, 0xe6, 0x79, 0x37,\n-0xa7, 0x22, 0x9d, 0x54, 0x31, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x6a, 0x30, 0x68, 0x30, 0x1d,\n-0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1e, 0x0c, 0xf7, 0xb6, 0x67, 0xf2, 0xe1,\n-0x92, 0x26, 0x09, 0x45, 0xc0, 0x55, 0x39, 0x2e, 0x77, 0x3f, 0x42, 0x4a, 0xa2, 0x30, 0x0c, 0x06,\n-0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x39, 0x06, 0x04, 0x67,\n-0x2a, 0x07, 0x00, 0x04, 0x31, 0x30, 0x2f, 0x30, 0x2d, 0x02, 0x01, 0x00, 0x30, 0x09, 0x06, 0x05,\n-0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x30, 0x07, 0x06, 0x05, 0x67, 0x2a, 0x03, 0x00, 0x00,\n-0x04, 0x14, 0x45, 0xb0, 0xc2, 0xc7, 0x0a, 0x56, 0x7c, 0xee, 0x5b, 0x78, 0x0c, 0x95, 0xf9, 0x18,\n-0x53, 0xc1, 0xa6, 0x1c, 0xd8, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x09, 0xb3, 0x83, 0x53, 0x59, 0x01,\n-0x3e, 0x95, 0x49, 0xb9, 0xf1, 0x81, 0xba, 0xf9, 0x76, 0x20, 0x23, 0xb5, 0x27, 0x60, 0x74, 0xd4,\n-0x6a, 0x99, 0x34, 0x5e, 0x6c, 0x00, 0x53, 0xd9, 0x9f, 0xf2, 0xa6, 0xb1, 0x24, 0x07, 0x44, 0x6a,\n-0x2a, 0xc6, 0xa5, 0x8e, 0x78, 0x12, 0xe8, 0x47, 0xd9, 0x58, 0x1b, 0x13, 0x2a, 0x5e, 0x79, 0x9b,\n-0x9f, 0x0a, 0x2a, 0x67, 0xa6, 0x25, 0x3f, 0x06, 0x69, 0x56, 0x73, 0xc3, 0x8a, 0x66, 0x48, 0xfb,\n-0x29, 0x81, 0x57, 0x74, 0x06, 0xca, 0x9c, 0xea, 0x28, 0xe8, 0x38, 0x67, 0x26, 0x2b, 0xf1, 0xd5,\n-0xb5, 0x3f, 0x65, 0x93, 0xf8, 0x36, 0x5d, 0x8e, 0x8d, 0x8d, 0x40, 0x20, 0x87, 0x19, 0xea, 0xef,\n-0x27, 0xc0, 0x3d, 0xb4, 0x39, 0x0f, 0x25, 0x7b, 0x68, 0x50, 0x74, 0x55, 0x9c, 0x0c, 0x59, 0x7d,\n-0x5a, 0x3d, 0x41, 0x94, 0x25, 0x52, 0x08, 0xe0, 0x47, 0x2c, 0x15, 0x31, 0x19, 0xd5, 0xbf, 0x07,\n-0x55, 0xc6, 0xbb, 0x12, 0xb5, 0x97, 0xf4, 0x5f, 0x83, 0x85, 0xba, 0x71, 0xc1, 0xd9, 0x6c, 0x81,\n-0x11, 0x76, 0x0a, 0x0a, 0xb0, 0xbf, 0x82, 0x97, 0xf7, 0xea, 0x3d, 0xfa, 0xfa, 0xec, 0x2d, 0xa9,\n-0x28, 0x94, 0x3b, 0x56, 0xdd, 0xd2, 0x51, 0x2e, 0xae, 0xc0, 0xbd, 0x08, 0x15, 0x8c, 0x77, 0x52,\n-0x34, 0x96, 0xd6, 0x9b, 0xac, 0xd3, 0x1d, 0x8e, 0x61, 0x0f, 0x35, 0x7b, 0x9b, 0xae, 0x39, 0x69,\n-0x0b, 0x62, 0x60, 0x40, 0x20, 0x36, 0x8f, 0xaf, 0xfb, 0x36, 0xee, 0x2d, 0x08, 0x4a, 0x1d, 0xb8,\n-0xbf, 0x9b, 0x5c, 0xf8, 0xea, 0xa5, 0x1b, 0xa0, 0x73, 0xa6, 0xd8, 0xf8, 0x6e, 0xe0, 0x33, 0x04,\n-0x5f, 0x68, 0xaa, 0x27, 0x87, 0xed, 0xd9, 0xc1, 0x90, 0x9c, 0xed, 0xbd, 0xe3, 0x6a, 0x35, 0xaf,\n-0x63, 0xdf, 0xab, 0x18, 0xd9, 0xba, 0xe6, 0xe9, 0x4a, 0xea, 0x50, 0x8a, 0x0f, 0x61, 0x93, 0x1e,\n-0xe2, 0x2d, 0x19, 0xe2, 0x30, 0x94, 0x35, 0x92, 0x5d, 0x0e, 0xb6, 0x07, 0xaf, 0x19, 0x80, 0x8f,\n-0x47, 0x90, 0x51, 0x4b, 0x2e, 0x4d, 0xdd, 0x85, 0xe2, 0xd2, 0x0a, 0x52, 0x0a, 0x17, 0x9a, 0xfc,\n-0x1a, 0xb0, 0x50, 0x02, 0xe5, 0x01, 0xa3, 0x63, 0x37, 0x21, 0x4c, 0x44, 0xc4, 0x9b, 0x51, 0x99,\n-0x11, 0x0e, 0x73, 0x9c, 0x06, 0x8f, 0x54, 0x2e, 0xa7, 0x28, 0x5e, 0x44, 0x39, 0x87, 0x56, 0x2d,\n-0x37, 0xbd, 0x85, 0x44, 0x94, 0xe1, 0x0c, 0x4b, 0x2c, 0x9c, 0xc3, 0x92, 0x85, 0x34, 0x61, 0xcb,\n-0x0f, 0xb8, 0x9b, 0x4a, 0x43, 0x52, 0xfe, 0x34, 0x3a, 0x7d, 0xb8, 0xe9, 0x29, 0xdc, 0x76, 0xa9,\n-0xc8, 0x30, 0xf8, 0x14, 0x71, 0x80, 0xc6, 0x1e, 0x36, 0x48, 0x74, 0x22, 0x41, 0x5c, 0x87, 0x82,\n-0xe8, 0x18, 0x71, 0x8b, 0x41, 0x89, 0x44, 0xe7, 0x7e, 0x58, 0x5b, 0xa8, 0xb8, 0x8d, 0x13, 0xe9,\n-0xa7, 0x6c, 0xc3, 0x47, 0xed, 0xb3, 0x1a, 0x9d, 0x62, 0xae, 0x8d, 0x82, 0xea, 0x94, 0x9e, 0xdd,\n-0x59, 0x10, 0xc3, 0xad, 0xdd, 0xe2, 0x4d, 0xe3, 0x31, 0xd5, 0xc7, 0xec, 0xe8, 0xf2, 0xb0, 0xfe,\n-0x92, 0x1e, 0x16, 0x0a, 0x1a, 0xfc, 0xd9, 0xf3, 0xf8, 0x27, 0xb6, 0xc9, 0xbe, 0x1d, 0xb4, 0x6c,\n-0x64, 0x90, 0x7f, 0xf4, 0xe4, 0xc4, 0x5b, 0xd7, 0x37, 0xae, 0x42, 0x0e, 0xdd, 0xa4, 0x1a, 0x6f,\n-0x7c, 0x88, 0x54, 0xc5, 0x16, 0x6e, 0xe1, 0x7a, 0x68, 0x2e, 0xf8, 0x3a, 0xbf, 0x0d, 0xa4, 0x3c,\n-0x89, 0x3b, 0x78, 0xa7, 0x4e, 0x63, 0x83, 0x04, 0x21, 0x08, 0x67, 0x8d, 0xf2, 0x82, 0x49, 0xd0,\n-0x5b, 0xfd, 0xb1, 0xcd, 0x0f, 0x83, 0x84, 0xd4, 0x3e, 0x20, 0x85, 0xf7, 0x4a, 0x3d, 0x2b, 0x9c,\n-0xfd, 0x2a, 0x0a, 0x09, 0x4d, 0xea, 0x81, 0xf8, 0x11, 0x9c, 0x30, 0x82, 0x05, 0x46, 0x30, 0x82,\n-0x03, 0x2e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x6d, 0x8c, 0x14, 0x46, 0xb1, 0xa6, 0x0a,\n-0xee, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00,\n-0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,\n-0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d,\n-0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13,\n-0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d,\n-0x69, 0x75, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x31,\n-0x30, 0x33, 0x36, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x31, 0x30,\n-0x33, 0x36, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n-0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66,\n-0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x0c, 0x13, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50,\n-0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82,\n-0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc4, 0x12, 0xdf, 0xa9, 0x5f, 0xfe, 0x41, 0xdd, 0xdd,\n-0xf5, 0x9f, 0x8a, 0xe3, 0xf6, 0xac, 0xe1, 0x3c, 0x78, 0x9a, 0xbc, 0xd8, 0xf0, 0x7f, 0x7a, 0xa0,\n-0x33, 0x2a, 0xdc, 0x8d, 0x20, 0x5b, 0xae, 0x2d, 0x6f, 0xe7, 0x93, 0xd9, 0x36, 0x70, 0x6a, 0x68,\n-0xcf, 0x8e, 0x51, 0xa3, 0x85, 0x5b, 0x67, 0x04, 0xa0, 0x10, 0x24, 0x6f, 0x5d, 0x28, 0x82, 0xc1,\n-0x97, 0x57, 0xd8, 0x48, 0x29, 0x13, 0xb6, 0xe1, 0xbe, 0x91, 0x4d, 0xdf, 0x85, 0x0c, 0x53, 0x18,\n-0x9a, 0x1e, 0x24, 0xa2, 0x4f, 0x8f, 0xf0, 0xa2, 0x85, 0x0b, 0xcb, 0xf4, 0x29, 0x7f, 0xd2, 0xa4,\n-0x58, 0xee, 0x26, 0x4d, 0xc9, 0xaa, 0xa8, 0x7b, 0x9a, 0xd9, 0xfa, 0x38, 0xde, 0x44, 0x57, 0x15,\n-0xe5, 0xf8, 0x8c, 0xc8, 0xd9, 0x48, 0xe2, 0x0d, 0x16, 0x27, 0x1d, 0x1e, 0xc8, 0x83, 0x85, 0x25,\n-0xb7, 0xba, 0xaa, 0x55, 0x41, 0xcc, 0x03, 0x22, 0x4b, 0x2d, 0x91, 0x8d, 0x8b, 0xe6, 0x89, 0xaf,\n-0x66, 0xc7, 0xe9, 0xff, 0x2b, 0xe9, 0x3c, 0xac, 0xda, 0xd2, 0xb3, 0xc3, 0xe1, 0x68, 0x9c, 0x89,\n-0xf8, 0x7a, 0x00, 0x56, 0xde, 0xf4, 0x55, 0x95, 0x6c, 0xfb, 0xba, 0x64, 0xdd, 0x62, 0x8b, 0xdf,\n-0x0b, 0x77, 0x32, 0xeb, 0x62, 0xcc, 0x26, 0x9a, 0x9b, 0xbb, 0xaa, 0x62, 0x83, 0x4c, 0xb4, 0x06,\n-0x7a, 0x30, 0xc8, 0x29, 0xbf, 0xed, 0x06, 0x4d, 0x97, 0xb9, 0x1c, 0xc4, 0x31, 0x2b, 0xd5, 0x5f,\n-0xbc, 0x53, 0x12, 0x17, 0x9c, 0x99, 0x57, 0x29, 0x66, 0x77, 0x61, 0x21, 0x31, 0x07, 0x2e, 0x25,\n-0x49, 0x9d, 0x18, 0xf2, 0xee, 0xf3, 0x2b, 0x71, 0x8c, 0xb5, 0xba, 0x39, 0x07, 0x49, 0x77, 0xfc,\n-0xef, 0x2e, 0x92, 0x90, 0x05, 0x8d, 0x2d, 0x2f, 0x77, 0x7b, 0xef, 0x43, 0xbf, 0x35, 0xbb, 0x9a,\n-0xd8, 0xf9, 0x73, 0xa7, 0x2c, 0xf2, 0xd0, 0x57, 0xee, 0x28, 0x4e, 0x26, 0x5f, 0x8f, 0x90, 0x68,\n-0x09, 0x2f, 0xb8, 0xf8, 0xdc, 0x06, 0xe9, 0x2e, 0x9a, 0x3e, 0x51, 0xa7, 0xd1, 0x22, 0xc4, 0x0a,\n-0xa7, 0x38, 0x48, 0x6c, 0xb3, 0xf9, 0xff, 0x7d, 0xab, 0x86, 0x57, 0xe3, 0xba, 0xd6, 0x85, 0x78,\n-0x77, 0xba, 0x43, 0xea, 0x48, 0x7f, 0xf6, 0xd8, 0xbe, 0x23, 0x6d, 0x1e, 0xbf, 0xd1, 0x36, 0x6c,\n-0x58, 0x5c, 0xf1, 0xee, 0xa4, 0x19, 0x54, 0x1a, 0xf5, 0x03, 0xd2, 0x76, 0xe6, 0xe1, 0x8c, 0xbd,\n-0x3c, 0xb3, 0xd3, 0x48, 0x4b, 0xe2, 0xc8, 0xf8, 0x7f, 0x92, 0xa8, 0x76, 0x46, 0x9c, 0x42, 0x65,\n-0x3e, 0xa4, 0x1e, 0xc1, 0x07, 0x03, 0x5a, 0x46, 0x2d, 0xb8, 0x97, 0xf3, 0xb7, 0xd5, 0xb2, 0x55,\n-0x21, 0xef, 0xba, 0xdc, 0x4c, 0x00, 0x97, 0xfb, 0x14, 0x95, 0x27, 0x33, 0xbf, 0xe8, 0x43, 0x47,\n-0x46, 0xd2, 0x08, 0x99, 0x16, 0x60, 0x3b, 0x9a, 0x7e, 0xd2, 0xe6, 0xed, 0x38, 0xea, 0xec, 0x01,\n-0x1e, 0x3c, 0x48, 0x56, 0x49, 0x09, 0xc7, 0x4c, 0x37, 0x00, 0x9e, 0x88, 0x0e, 0xc0, 0x73, 0xe1,\n-0x6f, 0x66, 0xe9, 0x72, 0x47, 0x30, 0x3e, 0x10, 0xe5, 0x0b, 0x03, 0xc9, 0x9a, 0x42, 0x00, 0x6c,\n-0xc5, 0x94, 0x7e, 0x61, 0xc4, 0x8a, 0xdf, 0x7f, 0x82, 0x1a, 0x0b, 0x59, 0xc4, 0x59, 0x32, 0x77,\n-0xb3, 0xbc, 0x60, 0x69, 0x56, 0x39, 0xfd, 0xb4, 0x06, 0x7b, 0x2c, 0xd6, 0x64, 0x36, 0xd9, 0xbd,\n-0x48, 0xed, 0x84, 0x1f, 0x7e, 0xa5, 0x22, 0x8f, 0x2a, 0xb8, 0x42, 0xf4, 0x82, 0xb7, 0xd4, 0x53,\n-0x90, 0x78, 0x4e, 0x2d, 0x1a, 0xfd, 0x81, 0x6f, 0x44, 0xd7, 0x3b, 0x01, 0x74, 0x96, 0x42, 0xe0,\n-0x00, 0xe2, 0x2e, 0x6b, 0xea, 0xc5, 0xee, 0x72, 0xac, 0xbb, 0xbf, 0xfe, 0xea, 0xaa, 0xa8, 0xf8,\n-0xdc, 0xf6, 0xb2, 0x79, 0x8a, 0xb6, 0x67, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40,\n-0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0xc0, 0x67, 0xa6, 0x0c,\n-0x22, 0xd9, 0x26, 0xf5, 0x45, 0xab, 0xa6, 0x65, 0x52, 0x11, 0x27, 0xd8, 0x45, 0xac, 0x63, 0x30,\n-0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n-0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06,\n-0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03,\n-0x82, 0x02, 0x01, 0x00, 0xb3, 0x57, 0x4d, 0x10, 0x62, 0x4e, 0x3a, 0xe4, 0xac, 0xea, 0xb8, 0x1c,\n-0xaf, 0x32, 0x23, 0xc8, 0xb3, 0x49, 0x5a, 0x51, 0x9c, 0x76, 0x28, 0x8d, 0x79, 0xaa, 0x57, 0x46,\n-0x17, 0xd5, 0xf5, 0x52, 0xf6, 0xb7, 0x44, 0xe8, 0x08, 0x44, 0xbf, 0x18, 0x84, 0xd2, 0x0b, 0x80,\n-0xcd, 0xc5, 0x12, 0xfd, 0x00, 0x55, 0x05, 0x61, 0x87, 0x41, 0xdc, 0xb5, 0x24, 0x9e, 0x3c, 0xc4,\n-0xd8, 0xc8, 0xfb, 0x70, 0x9e, 0x2f, 0x78, 0x96, 0x83, 0x20, 0x36, 0xde, 0x7c, 0x0f, 0x69, 0x13,\n-0x88, 0xa5, 0x75, 0x36, 0x98, 0x08, 0xa6, 0xc6, 0xdf, 0xac, 0xce, 0xe3, 0x58, 0xd6, 0xb7, 0x3e,\n-0xde, 0xba, 0xf3, 0xeb, 0x34, 0x40, 0xd8, 0xa2, 0x81, 0xf5, 0x78, 0x3f, 0x2f, 0xd5, 0xa5, 0xfc,\n-0xd9, 0xa2, 0xd4, 0x5e, 0x04, 0x0e, 0x17, 0xad, 0xfe, 0x41, 0xf0, 0xe5, 0xb2, 0x72, 0xfa, 0x44,\n-0x82, 0x33, 0x42, 0xe8, 0x2d, 0x58, 0xf7, 0x56, 0x8c, 0x62, 0x3f, 0xba, 0x42, 0xb0, 0x9c, 0x0c,\n-0x5c, 0x7e, 0x2e, 0x65, 0x26, 0x5c, 0x53, 0x4f, 0x00, 0xb2, 0x78, 0x7e, 0xa1, 0x0d, 0x99, 0x2d,\n-0x8d, 0xb8, 0x1d, 0x8e, 0xa2, 0xc4, 0xb0, 0xfd, 0x60, 0xd0, 0x30, 0xa4, 0x8e, 0xc8, 0x04, 0x62,\n-0xa9, 0xc4, 0xed, 0x35, 0xde, 0x7a, 0x97, 0xed, 0x0e, 0x38, 0x5e, 0x92, 0x2f, 0x93, 0x70, 0xa5,\n-0xa9, 0x9c, 0x6f, 0xa7, 0x7d, 0x13, 0x1d, 0x7e, 0xc6, 0x08, 0x48, 0xb1, 0x5e, 0x67, 0xeb, 0x51,\n-0x08, 0x25, 0xe9, 0xe6, 0x25, 0x6b, 0x52, 0x29, 0x91, 0x9c, 0xd2, 0x39, 0x73, 0x08, 0x57, 0xde,\n-0x99, 0x06, 0xb4, 0x5b, 0x9d, 0x10, 0x06, 0xe1, 0xc2, 0x00, 0xa8, 0xb8, 0x1c, 0x4a, 0x02, 0x0a,\n-0x14, 0xd0, 0xc1, 0x41, 0xca, 0xfb, 0x8c, 0x35, 0x21, 0x7d, 0x82, 0x38, 0xf2, 0xa9, 0x54, 0x91,\n-0x19, 0x35, 0x93, 0x94, 0x6d, 0x6a, 0x3a, 0xc5, 0xb2, 0xd0, 0xbb, 0x89, 0x86, 0x93, 0xe8, 0x9b,\n-0xc9, 0x0f, 0x3a, 0xa7, 0x7a, 0xb8, 0xa1, 0xf0, 0x78, 0x46, 0xfa, 0xfc, 0x37, 0x2f, 0xe5, 0x8a,\n-0x84, 0xf3, 0xdf, 0xfe, 0x04, 0xd9, 0xa1, 0x68, 0xa0, 0x2f, 0x24, 0xe2, 0x09, 0x95, 0x06, 0xd5,\n-0x95, 0xca, 0xe1, 0x24, 0x96, 0xeb, 0x7c, 0xf6, 0x93, 0x05, 0xbb, 0xed, 0x73, 0xe9, 0x2d, 0xd1,\n-0x75, 0x39, 0xd7, 0xe7, 0x24, 0xdb, 0xd8, 0x4e, 0x5f, 0x43, 0x8f, 0x9e, 0xd0, 0x14, 0x39, 0xbf,\n-0x55, 0x70, 0x48, 0x99, 0x57, 0x31, 0xb4, 0x9c, 0xee, 0x4a, 0x98, 0x03, 0x96, 0x30, 0x1f, 0x60,\n-0x06, 0xee, 0x1b, 0x23, 0xfe, 0x81, 0x60, 0x23, 0x1a, 0x47, 0x62, 0x85, 0xa5, 0xcc, 0x19, 0x34,\n-0x80, 0x6f, 0xb3, 0xac, 0x1a, 0xe3, 0x9f, 0xf0, 0x7b, 0x48, 0xad, 0xd5, 0x01, 0xd9, 0x67, 0xb6,\n-0xa9, 0x72, 0x93, 0xea, 0x2d, 0x66, 0xb5, 0xb2, 0xb8, 0xe4, 0x3d, 0x3c, 0xb2, 0xef, 0x4c, 0x8c,\n-0xea, 0xeb, 0x07, 0xbf, 0xab, 0x35, 0x9a, 0x55, 0x86, 0xbc, 0x18, 0xa6, 0xb5, 0xa8, 0x5e, 0xb4,\n-0x83, 0x6c, 0x6b, 0x69, 0x40, 0xd3, 0x9f, 0xdc, 0xf1, 0xc3, 0x69, 0x6b, 0xb9, 0xe1, 0x6d, 0x09,\n-0xf4, 0xf1, 0xaa, 0x50, 0x76, 0x0a, 0x7a, 0x7d, 0x7a, 0x17, 0xa1, 0x55, 0x96, 0x42, 0x99, 0x31,\n-0x09, 0xdd, 0x60, 0x11, 0x8d, 0x05, 0x30, 0x7e, 0xe6, 0x8e, 0x46, 0xd1, 0x9d, 0x14, 0xda, 0xc7,\n-0x17, 0xe4, 0x05, 0x96, 0x8c, 0xc4, 0x24, 0xb5, 0x1b, 0xcf, 0x14, 0x07, 0xb2, 0x40, 0xf8, 0xa3,\n-0x9e, 0x41, 0x86, 0xbc, 0x04, 0xd0, 0x6b, 0x96, 0xc8, 0x2a, 0x80, 0x34, 0xfd, 0xbf, 0xef, 0x06,\n-0xa3, 0xdd, 0x58, 0xc5, 0x85, 0x3d, 0x3e, 0x8f, 0xfe, 0x9e, 0x29, 0xe0, 0xb6, 0xb8, 0x09, 0x68,\n-0x19, 0x1c, 0x18, 0x43, 0x30, 0x82, 0x01, 0xfe, 0x30, 0x82, 0x01, 0x85, 0xa0, 0x03, 0x02, 0x01,\n-0x02, 0x02, 0x08, 0x74, 0x97, 0x25, 0x8a, 0xc7, 0x3f, 0x7a, 0x54, 0x30, 0x0a, 0x06, 0x08, 0x2a,\n-0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n-0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,\n-0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e,\n-0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75,\n-0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x45, 0x43, 0x43, 0x30, 0x1e,\n-0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x32, 0x30, 0x32, 0x34, 0x5a, 0x17,\n-0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x32, 0x30, 0x32, 0x34, 0x5a, 0x30, 0x45,\n-0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30,\n-0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72,\n-0x75, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, 0x41, 0x66,\n-0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75,\n-0x6d, 0x20, 0x45, 0x43, 0x43, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d,\n-0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x0d, 0x30, 0x5e,\n-0x1b, 0x15, 0x9d, 0x03, 0xd0, 0xa1, 0x79, 0x35, 0xb7, 0x3a, 0x3c, 0x92, 0x7a, 0xca, 0x15, 0x1c,\n-0xcd, 0x62, 0xf3, 0x9c, 0x26, 0x5c, 0x07, 0x3d, 0xe5, 0x54, 0xfa, 0xa3, 0xd6, 0xcc, 0x12, 0xea,\n-0xf4, 0x14, 0x5f, 0xe8, 0x8e, 0x19, 0xab, 0x2f, 0x2e, 0x48, 0xe6, 0xac, 0x18, 0x43, 0x78, 0xac,\n-0xd0, 0x37, 0xc3, 0xbd, 0xb2, 0xcd, 0x2c, 0xe6, 0x47, 0xe2, 0x1a, 0xe6, 0x63, 0xb8, 0x3d, 0x2e,\n-0x2f, 0x78, 0xc4, 0x4f, 0xdb, 0xf4, 0x0f, 0xa4, 0x68, 0x4c, 0x55, 0x72, 0x6b, 0x95, 0x1d, 0x4e,\n-0x18, 0x42, 0x95, 0x78, 0xcc, 0x37, 0x3c, 0x91, 0xe2, 0x9b, 0x65, 0x2b, 0x29, 0xa3, 0x42, 0x30,\n-0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9a, 0xaf, 0x29, 0x7a,\n-0xc0, 0x11, 0x35, 0x35, 0x26, 0x51, 0x30, 0x00, 0xc3, 0x6a, 0xfe, 0x40, 0xd5, 0xae, 0xd6, 0x3c,\n-0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,\n-0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01,\n-0x06, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x67, 0x00,\n-0x30, 0x64, 0x02, 0x30, 0x17, 0x09, 0xf3, 0x87, 0x88, 0x50, 0x5a, 0xaf, 0xc8, 0xc0, 0x42, 0xbf,\n-0x47, 0x5f, 0xf5, 0x6c, 0x6a, 0x86, 0xe0, 0xc4, 0x27, 0x74, 0xe4, 0x38, 0x53, 0xd7, 0x05, 0x7f,\n-0x1b, 0x34, 0xe3, 0xc6, 0x2f, 0xb3, 0xca, 0x09, 0x3c, 0x37, 0x9d, 0xd7, 0xe7, 0xb8, 0x46, 0xf1,\n-0xfd, 0xa1, 0xe2, 0x71, 0x02, 0x30, 0x42, 0x59, 0x87, 0x43, 0xd4, 0x51, 0xdf, 0xba, 0xd3, 0x09,\n-0x32, 0x5a, 0xce, 0x88, 0x7e, 0x57, 0x3d, 0x9c, 0x5f, 0x42, 0x6b, 0xf5, 0x07, 0x2d, 0xb5, 0xf0,\n-0x82, 0x93, 0xf9, 0x59, 0x6f, 0xae, 0x64, 0xfa, 0x58, 0xe5, 0x8b, 0x1e, 0xe3, 0x63, 0xbe, 0xb5,\n-0x81, 0xcd, 0x6f, 0x02, 0x8c, 0x79, 0x30, 0x82, 0x03, 0x4c, 0x30, 0x82, 0x02, 0x34, 0xa0, 0x03,\n-0x02, 0x01, 0x02, 0x02, 0x08, 0x7c, 0x4f, 0x04, 0x39, 0x1c, 0xd4, 0x99, 0x2d, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x44, 0x31, 0x0b,\n-0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73,\n-0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, 0x66, 0x69,\n-0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69,\n-0x6e, 0x67, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x30, 0x38,\n-0x32, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x30, 0x38, 0x32,\n-0x34, 0x5a, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n-0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69,\n-0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,\n-0x0c, 0x16, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65,\n-0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,\n-0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb4, 0x84, 0xcc, 0x33, 0x17, 0x2e, 0x6b,\n-0x94, 0x6c, 0x6b, 0x61, 0x52, 0xa0, 0xeb, 0xa3, 0xcf, 0x79, 0x94, 0x4c, 0xe5, 0x94, 0x80, 0x99,\n-0xcb, 0x55, 0x64, 0x44, 0x65, 0x8f, 0x67, 0x64, 0xe2, 0x06, 0xe3, 0x5c, 0x37, 0x49, 0xf6, 0x2f,\n-0x9b, 0x84, 0x84, 0x1e, 0x2d, 0xf2, 0x60, 0x9d, 0x30, 0x4e, 0xcc, 0x84, 0x85, 0xe2, 0x2c, 0xcf,\n-0x1e, 0x9e, 0xfe, 0x36, 0xab, 0x33, 0x77, 0x35, 0x44, 0xd8, 0x35, 0x96, 0x1a, 0x3d, 0x36, 0xe8,\n-0x7a, 0x0e, 0xd8, 0xd5, 0x47, 0xa1, 0x6a, 0x69, 0x8b, 0xd9, 0xfc, 0xbb, 0x3a, 0xae, 0x79, 0x5a,\n-0xd5, 0xf4, 0xd6, 0x71, 0xbb, 0x9a, 0x90, 0x23, 0x6b, 0x9a, 0xb7, 0x88, 0x74, 0x87, 0x0c, 0x1e,\n-0x5f, 0xb9, 0x9e, 0x2d, 0xfa, 0xab, 0x53, 0x2b, 0xdc, 0xbb, 0x76, 0x3e, 0x93, 0x4c, 0x08, 0x08,\n-0x8c, 0x1e, 0xa2, 0x23, 0x1c, 0xd4, 0x6a, 0xad, 0x22, 0xba, 0x99, 0x01, 0x2e, 0x6d, 0x65, 0xcb,\n-0xbe, 0x24, 0x66, 0x55, 0x24, 0x4b, 0x40, 0x44, 0xb1, 0x1b, 0xd7, 0xe1, 0xc2, 0x85, 0xc0, 0xde,\n-0x10, 0x3f, 0x3d, 0xed, 0xb8, 0xfc, 0xf1, 0xf1, 0x23, 0x53, 0xdc, 0xbf, 0x65, 0x97, 0x6f, 0xd9,\n-0xf9, 0x40, 0x71, 0x8d, 0x7d, 0xbd, 0x95, 0xd4, 0xce, 0xbe, 0xa0, 0x5e, 0x27, 0x23, 0xde, 0xfd,\n-0xa6, 0xd0, 0x26, 0x0e, 0x00, 0x29, 0xeb, 0x3c, 0x46, 0xf0, 0x3d, 0x60, 0xbf, 0x3f, 0x50, 0xd2,\n-0xdc, 0x26, 0x41, 0x51, 0x9e, 0x14, 0x37, 0x42, 0x04, 0xa3, 0x70, 0x57, 0xa8, 0x1b, 0x87, 0xed,\n-0x2d, 0xfa, 0x7b, 0xee, 0x8c, 0x0a, 0xe3, 0xa9, 0x66, 0x89, 0x19, 0xcb, 0x41, 0xf9, 0xdd, 0x44,\n-0x36, 0x61, 0xcf, 0xe2, 0x77, 0x46, 0xc8, 0x7d, 0xf6, 0xf4, 0x92, 0x81, 0x36, 0xfd, 0xdb, 0x34,\n-0xf1, 0x72, 0x7e, 0xf3, 0x0c, 0x16, 0xbd, 0xb4, 0x15, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,\n-0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x07, 0x1f, 0xd2,\n-0xe7, 0x9c, 0xda, 0xc2, 0x6e, 0xa2, 0x40, 0xb4, 0xb0, 0x7a, 0x50, 0x10, 0x50, 0x74, 0xc4, 0xc8,\n-0xbd, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,\n-0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n-0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,\n-0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x89, 0x57, 0xb2, 0x16, 0x7a, 0xa8, 0xc2, 0xfd, 0xd6, 0xd9,\n-0x9b, 0x9b, 0x34, 0xc2, 0x9c, 0xb4, 0x32, 0x14, 0x4d, 0xa7, 0xa4, 0xdf, 0xec, 0xbe, 0xa7, 0xbe,\n-0xf8, 0x43, 0xdb, 0x91, 0x37, 0xce, 0xb4, 0x32, 0x2e, 0x50, 0x55, 0x1a, 0x35, 0x4e, 0x76, 0x43,\n-0x71, 0x20, 0xef, 0x93, 0x77, 0x4e, 0x15, 0x70, 0x2e, 0x87, 0xc3, 0xc1, 0x1d, 0x6d, 0xdc, 0xcb,\n-0xb5, 0x27, 0xd4, 0x2c, 0x56, 0xd1, 0x52, 0x53, 0x3a, 0x44, 0xd2, 0x73, 0xc8, 0xc4, 0x1b, 0x05,\n-0x65, 0x5a, 0x62, 0x92, 0x9c, 0xee, 0x41, 0x8d, 0x31, 0xdb, 0xe7, 0x34, 0xea, 0x59, 0x21, 0xd5,\n-0x01, 0x7a, 0xd7, 0x64, 0xb8, 0x64, 0x39, 0xcd, 0xc9, 0xed, 0xaf, 0xed, 0x4b, 0x03, 0x48, 0xa7,\n-0xa0, 0x99, 0x01, 0x80, 0xdc, 0x65, 0xa3, 0x36, 0xae, 0x65, 0x59, 0x48, 0x4f, 0x82, 0x4b, 0xc8,\n-0x65, 0xf1, 0x57, 0x1d, 0xe5, 0x59, 0x2e, 0x0a, 0x3f, 0x6c, 0xd8, 0xd1, 0xf5, 0xe5, 0x09, 0xb4,\n-0x6c, 0x54, 0x00, 0x0a, 0xe0, 0x15, 0x4d, 0x87, 0x75, 0x6d, 0xb7, 0x58, 0x96, 0x5a, 0xdd, 0x6d,\n-0xd2, 0x00, 0xa0, 0xf4, 0x9b, 0x48, 0xbe, 0xc3, 0x37, 0xa4, 0xba, 0x36, 0xe0, 0x7c, 0x87, 0x85,\n-0x97, 0x1a, 0x15, 0xa2, 0xde, 0x2e, 0xa2, 0x5b, 0xbd, 0xaf, 0x18, 0xf9, 0x90, 0x50, 0xcd, 0x70,\n-0x59, 0xf8, 0x27, 0x67, 0x47, 0xcb, 0xc7, 0xa0, 0x07, 0x3a, 0x7d, 0xd1, 0x2c, 0x5d, 0x6c, 0x19,\n-0x3a, 0x66, 0xb5, 0x7d, 0xfd, 0x91, 0x6f, 0x82, 0xb1, 0xbe, 0x08, 0x93, 0xdb, 0x14, 0x47, 0xf1,\n-0xa2, 0x37, 0xc7, 0x45, 0x9e, 0x3c, 0xc7, 0x77, 0xaf, 0x64, 0xa8, 0x93, 0xdf, 0xf6, 0x69, 0x83,\n-0x82, 0x60, 0xf2, 0x49, 0x42, 0x34, 0xed, 0x5a, 0x00, 0x54, 0x85, 0x1c, 0x16, 0x36, 0x92, 0x0c,\n-0x5c, 0xfa, 0xa6, 0xad, 0xbf, 0xdb, 0x30, 0x82, 0x06, 0x14, 0x30, 0x82, 0x03, 0xfc, 0xa0, 0x03,\n-0x02, 0x01, 0x02, 0x02, 0x08, 0x53, 0xec, 0x3b, 0xee, 0xfb, 0xb2, 0x48, 0x5f, 0x30, 0x0d, 0x06,\n-0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x51, 0x31, 0x0b,\n-0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x42, 0x30, 0x40, 0x06,\n-0x03, 0x55, 0x04, 0x03, 0x0c, 0x39, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20,\n-0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e,\n-0x20, 0x46, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61,\n-0x6c, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, 0x30, 0x36, 0x38, 0x30,\n-0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x35, 0x32, 0x30, 0x30, 0x38, 0x33, 0x38, 0x31, 0x35, 0x5a,\n-0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30, 0x38, 0x33, 0x38, 0x31, 0x35, 0x5a, 0x30,\n-0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x42,\n-0x30, 0x40, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x39, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64,\n-0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63,\n-0x69, 0x6f, 0x6e, 0x20, 0x46, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69,\n-0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, 0x30,\n-0x36, 0x38, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n-0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82,\n-0x02, 0x01, 0x00, 0xca, 0x96, 0x6b, 0x8e, 0xea, 0xf8, 0xfb, 0xf1, 0xa2, 0x35, 0xe0, 0x7f, 0x4c,\n-0xda, 0xe0, 0xc3, 0x52, 0xd7, 0x7d, 0xb6, 0x10, 0xc8, 0x02, 0x5e, 0xb3, 0x43, 0x2a, 0xc4, 0x4f,\n-0x6a, 0xb2, 0xca, 0x1c, 0x5d, 0x28, 0x9a, 0x78, 0x11, 0x1a, 0x69, 0x59, 0x57, 0xaf, 0xb5, 0x20,\n-0x42, 0xe4, 0x8b, 0x0f, 0xe6, 0xdf, 0x5b, 0xa6, 0x03, 0x92, 0x2f, 0xf5, 0x11, 0xe4, 0x62, 0xd7,\n-0x32, 0x71, 0x38, 0xd9, 0x04, 0x0c, 0x71, 0xab, 0x3d, 0x51, 0x7e, 0x0f, 0x07, 0xdf, 0x63, 0x05,\n-0x5c, 0xe9, 0xbf, 0x94, 0x6f, 0xc1, 0x29, 0x82, 0xc0, 0xb4, 0xda, 0x51, 0xb0, 0xc1, 0x3c, 0xbb,\n-0xad, 0x37, 0x4a, 0x5c, 0xca, 0xf1, 0x4b, 0x36, 0x0e, 0x24, 0xab, 0xbf, 0xc3, 0x84, 0x77, 0xfd,\n-0xa8, 0x50, 0xf4, 0xb1, 0xe7, 0xc6, 0x2f, 0xd2, 0x2d, 0x59, 0x8d, 0x7a, 0x0a, 0x4e, 0x96, 0x69,\n-0x52, 0x02, 0xaa, 0x36, 0x98, 0xec, 0xfc, 0xfa, 0x14, 0x83, 0x0c, 0x37, 0x1f, 0xc9, 0x92, 0x37,\n-0x7f, 0xd7, 0x81, 0x2d, 0xe5, 0xc4, 0xb9, 0xe0, 0x3e, 0x34, 0xfe, 0x67, 0xf4, 0x3e, 0x66, 0xd1,\n-0xd3, 0xf4, 0x40, 0xcf, 0x5e, 0x62, 0x34, 0x0f, 0x70, 0x06, 0x3e, 0x20, 0x18, 0x5a, 0xce, 0xf7,\n-0x72, 0x1b, 0x25, 0x6c, 0x93, 0x74, 0x14, 0x93, 0xa3, 0x73, 0xb1, 0x0e, 0xaa, 0x87, 0x10, 0x23,\n-0x59, 0x5f, 0x20, 0x05, 0x19, 0x47, 0xed, 0x68, 0x8e, 0x92, 0x12, 0xca, 0x5d, 0xfc, 0xd6, 0x2b,\n-0xb2, 0x92, 0x3c, 0x20, 0xcf, 0xe1, 0x5f, 0xaf, 0x20, 0xbe, 0xa0, 0x76, 0x7f, 0x76, 0xe5, 0xec,\n-0x1a, 0x86, 0x61, 0x33, 0x3e, 0xe7, 0x7b, 0xb4, 0x3f, 0xa0, 0x0f, 0x8e, 0xa2, 0xb9, 0x6a, 0x6f,\n-0xb9, 0x87, 0x26, 0x6f, 0x41, 0x6c, 0x88, 0xa6, 0x50, 0xfd, 0x6a, 0x63, 0x0b, 0xf5, 0x93, 0x16,\n-0x1b, 0x19, 0x8f, 0xb2, 0xed, 0x9b, 0x9b, 0xc9, 0x90, 0xf5, 0x01, 0x0c, 0xdf, 0x19, 0x3d, 0x0f,\n-0x3e, 0x38, 0x23, 0xc9, 0x2f, 0x8f, 0x0c, 0xd1, 0x02, 0xfe, 0x1b, 0x55, 0xd6, 0x4e, 0xd0, 0x8d,\n-0x3c, 0xaf, 0x4f, 0xa4, 0xf3, 0xfe, 0xaf, 0x2a, 0xd3, 0x05, 0x9d, 0x79, 0x08, 0xa1, 0xcb, 0x57,\n-0x31, 0xb4, 0x9c, 0xc8, 0x90, 0xb2, 0x67, 0xf4, 0x18, 0x16, 0x93, 0x3a, 0xfc, 0x47, 0xd8, 0xd1,\n-0x78, 0x96, 0x31, 0x1f, 0xba, 0x2b, 0x0c, 0x5f, 0x5d, 0x99, 0xad, 0x63, 0x89, 0x5a, 0x24, 0x20,\n-0x76, 0xd8, 0xdf, 0xfd, 0xab, 0x4e, 0xa6, 0x22, 0xaa, 0x9d, 0x5e, 0xe6, 0x27, 0x8a, 0x7d, 0x68,\n-0x29, 0xa3, 0xe7, 0x8a, 0xb8, 0xda, 0x11, 0xbb, 0x17, 0x2d, 0x99, 0x9d, 0x13, 0x24, 0x46, 0xf7,\n-0xc5, 0xe2, 0xd8, 0x9f, 0x8e, 0x7f, 0xc7, 0x8f, 0x74, 0x6d, 0x5a, 0xb2, 0xe8, 0x72, 0xf5, 0xac,\n-0xee, 0x24, 0x10, 0xad, 0x2f, 0x14, 0xda, 0xff, 0x2d, 0x9a, 0x46, 0x71, 0x47, 0xbe, 0x42, 0xdf,\n-0xbb, 0x01, 0xdb, 0xf4, 0x7f, 0xd3, 0x28, 0x8f, 0x31, 0x59, 0x5b, 0xd3, 0xc9, 0x02, 0xa6, 0xb4,\n-0x52, 0xca, 0x6e, 0x97, 0xfb, 0x43, 0xc5, 0x08, 0x26, 0x6f, 0x8a, 0xf4, 0xbb, 0xfd, 0x9f, 0x28,\n-0xaa, 0x0d, 0xd5, 0x45, 0xf3, 0x13, 0x3a, 0x1d, 0xd8, 0xc0, 0x78, 0x8f, 0x41, 0x67, 0x3c, 0x1e,\n-0x94, 0x64, 0xae, 0x7b, 0x0b, 0xc5, 0xe8, 0xd9, 0x01, 0x88, 0x39, 0x1a, 0x97, 0x86, 0x64, 0x41,\n-0xd5, 0x3b, 0x87, 0x0c, 0x6e, 0xfa, 0x0f, 0xc6, 0xbd, 0x48, 0x14, 0xbf, 0x39, 0x4d, 0xd4, 0x9e,\n-0x41, 0xb6, 0x8f, 0x96, 0x1d, 0x63, 0x96, 0x93, 0xd9, 0x95, 0x06, 0x78, 0x31, 0x68, 0x9e, 0x37,\n-0x06, 0x3b, 0x80, 0x89, 0x45, 0x61, 0x39, 0x23, 0xc7, 0x1b, 0x44, 0xa3, 0x15, 0xe5, 0x1c, 0xf8,\n-0x92, 0x30, 0xbb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xef, 0x30, 0x81, 0xec, 0x30, 0x12,\n-0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02,\n-0x01, 0x01, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n-0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x65, 0xcd, 0xeb,\n-0xab, 0x35, 0x1e, 0x00, 0x3e, 0x7e, 0xd5, 0x74, 0xc0, 0x1c, 0xb4, 0x73, 0x47, 0x0e, 0x1a, 0x64,\n-0x2f, 0x30, 0x81, 0xa6, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x81, 0x9e, 0x30, 0x81, 0x9b, 0x30,\n-0x81, 0x98, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x81, 0x8f, 0x30, 0x2f, 0x06, 0x08, 0x2b,\n-0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,\n-0x77, 0x77, 0x77, 0x2e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69,\n-0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x70, 0x73, 0x30, 0x5c, 0x06, 0x08,\n-0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x50, 0x1e, 0x4e, 0x00, 0x50, 0x00, 0x61,\n-0x00, 0x73, 0x00, 0x65, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c,\n-0x00, 0x61, 0x00, 0x20, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x6f,\n-0x00, 0x76, 0x00, 0x61, 0x00, 0x20, 0x00, 0x34, 0x00, 0x37, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61,\n-0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x20,\n-0x00, 0x30, 0x00, 0x38, 0x00, 0x30, 0x00, 0x31, 0x00, 0x37, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n-0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x17, 0x7d,\n-0xa0, 0xf9, 0xb4, 0xdd, 0xc5, 0xc5, 0xeb, 0xad, 0x4b, 0x24, 0xb5, 0xa1, 0x02, 0xab, 0xdd, 0xa5,\n-0x88, 0x4a, 0xb2, 0x0f, 0x55, 0x4b, 0x2b, 0x57, 0x8c, 0x3b, 0xe5, 0x31, 0xdd, 0xfe, 0xc4, 0x32,\n-0xf1, 0xe7, 0x5b, 0x64, 0x96, 0x36, 0x32, 0x18, 0xec, 0xa5, 0x32, 0x77, 0xd7, 0xe3, 0x44, 0xb6,\n-0xc0, 0x11, 0x2a, 0x80, 0xb9, 0x3d, 0x6a, 0x6e, 0x7c, 0x9b, 0xd3, 0xad, 0xfc, 0xc3, 0xd6, 0xa3,\n-0xe6, 0x64, 0x29, 0x7c, 0xd1, 0xe1, 0x38, 0x1e, 0x82, 0x2b, 0xff, 0x27, 0x65, 0xaf, 0xfb, 0x16,\n-0x15, 0xc4, 0x2e, 0x71, 0x84, 0xe5, 0xb5, 0xff, 0xfa, 0xa4, 0x47, 0xbd, 0x64, 0x32, 0xbb, 0xf6,\n-0x25, 0x84, 0xa2, 0x27, 0x42, 0xf5, 0x20, 0xb0, 0xc2, 0x13, 0x10, 0x11, 0xcd, 0x10, 0x15, 0xba,\n-0x42, 0x90, 0x2a, 0xd2, 0x44, 0xe1, 0x96, 0x26, 0xeb, 0x31, 0x48, 0x12, 0xfd, 0x2a, 0xda, 0xc9,\n-0x06, 0xcf, 0x74, 0x1e, 0xa9, 0x4b, 0xd5, 0x87, 0x28, 0xf9, 0x79, 0x34, 0x92, 0x3e, 0x2e, 0x44,\n-0xe8, 0xf6, 0x8f, 0x4f, 0x8f, 0x35, 0x3f, 0x25, 0xb3, 0x39, 0xdc, 0x63, 0x2a, 0x90, 0x6b, 0x20,\n-0x5f, 0xc4, 0x52, 0x12, 0x4e, 0x97, 0x2c, 0x2a, 0xac, 0x9d, 0x97, 0xde, 0x48, 0xf2, 0xa3, 0x66,\n-0xdb, 0xc2, 0xd2, 0x83, 0x95, 0xa6, 0x66, 0xa7, 0x9e, 0x25, 0x0f, 0xe9, 0x0b, 0x33, 0x91, 0x65,\n-0x0a, 0x5a, 0xc3, 0xd9, 0x54, 0x12, 0xdd, 0xaf, 0xc3, 0x4e, 0x0e, 0x1f, 0x26, 0x5e, 0x0d, 0xdc,\n-0xb3, 0x8d, 0xec, 0xd5, 0x81, 0x70, 0xde, 0xd2, 0x4f, 0x24, 0x05, 0xf3, 0x6c, 0x4e, 0xf5, 0x4c,\n-0x49, 0x66, 0x8d, 0xd1, 0xff, 0xd2, 0x0b, 0x25, 0x41, 0x48, 0xfe, 0x51, 0x84, 0xc6, 0x42, 0xaf,\n-0x80, 0x04, 0xcf, 0xd0, 0x7e, 0x64, 0x49, 0xe4, 0xf2, 0xdf, 0xa2, 0xec, 0xb1, 0x4c, 0xc0, 0x2a,\n-0x1d, 0xe7, 0xb4, 0xb1, 0x65, 0xa2, 0xc4, 0xbc, 0xf1, 0x98, 0xf4, 0xaa, 0x70, 0x07, 0x63, 0xb4,\n-0xb8, 0xda, 0x3b, 0x4c, 0xfa, 0x40, 0x22, 0x30, 0x5b, 0x11, 0xa6, 0xf0, 0x05, 0x0e, 0xc6, 0x02,\n-0x03, 0x48, 0xab, 0x86, 0x9b, 0x85, 0xdd, 0xdb, 0xdd, 0xea, 0xa2, 0x76, 0x80, 0x73, 0x7d, 0xf5,\n-0x9c, 0x04, 0xc4, 0x45, 0x8d, 0xe7, 0xb9, 0x1c, 0x8b, 0x9e, 0xea, 0xd7, 0x75, 0xd1, 0x72, 0xb1,\n-0xde, 0x75, 0x44, 0xe7, 0x42, 0x7d, 0xe2, 0x57, 0x6b, 0x7d, 0xdc, 0x99, 0xbc, 0x3d, 0x83, 0x28,\n-0xea, 0x80, 0x93, 0x8d, 0xc5, 0x4c, 0x65, 0xc1, 0x70, 0x81, 0xb8, 0x38, 0xfc, 0x43, 0x31, 0xb2,\n-0xf6, 0x03, 0x34, 0x47, 0xb2, 0xac, 0xfb, 0x22, 0x06, 0xcb, 0x1e, 0xdd, 0x17, 0x47, 0x1c, 0x5f,\n-0x66, 0xb9, 0xd3, 0x1a, 0xa2, 0xda, 0x11, 0xb1, 0xa4, 0xbc, 0x23, 0xc9, 0xe4, 0xbe, 0x87, 0xff,\n-0xb9, 0x94, 0xb6, 0xf8, 0x5d, 0x20, 0x4a, 0xd4, 0x5f, 0xe7, 0xbd, 0x68, 0x7b, 0x65, 0xf2, 0x15,\n-0x1e, 0xd2, 0x3a, 0xa9, 0x2d, 0xe9, 0xd8, 0x6b, 0x24, 0xac, 0x97, 0x58, 0x44, 0x47, 0xad, 0x59,\n-0x18, 0xf1, 0x21, 0x65, 0x70, 0xde, 0xce, 0x34, 0x60, 0xa8, 0x40, 0xf1, 0xf3, 0x3c, 0xa4, 0xc3,\n-0x28, 0x23, 0x8c, 0xfe, 0x27, 0x33, 0x43, 0x40, 0xa0, 0x17, 0x3c, 0xeb, 0xea, 0x3b, 0xb0, 0x72,\n-0xa6, 0xa3, 0xb9, 0x4a, 0x4b, 0x5e, 0x16, 0x48, 0xf4, 0xb2, 0xbc, 0xc8, 0x8c, 0x92, 0xc5, 0x9d,\n-0x9f, 0xac, 0x72, 0x36, 0xbc, 0x34, 0x80, 0x34, 0x6b, 0xa9, 0x8b, 0x92, 0xc0, 0xb8, 0x17, 0xed,\n-0xec, 0x76, 0x53, 0xf5, 0x24, 0x01, 0x8c, 0xb3, 0x22, 0xe8, 0x4b, 0x7c, 0x55, 0xc6, 0x9d, 0xfa,\n-0xa3, 0x14, 0xbb, 0x65, 0x85, 0x6e, 0x6e, 0x4f, 0x12, 0x7e, 0x0a, 0x3c, 0x9d, 0x95, 0x30, 0x82,\n-0x03, 0x77, 0x30, 0x82, 0x02, 0x5f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, 0x00, 0x00,\n-0xb9, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,\n-0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x45, 0x31,\n-0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d,\n-0x6f, 0x72, 0x65, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x43, 0x79,\n-0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04,\n-0x03, 0x13, 0x19, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x62,\n-0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d,\n-0x30, 0x30, 0x30, 0x35, 0x31, 0x32, 0x31, 0x38, 0x34, 0x36, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32,\n-0x35, 0x30, 0x35, 0x31, 0x32, 0x32, 0x33, 0x35, 0x39, 0x30, 0x30, 0x5a, 0x30, 0x5a, 0x31, 0x0b,\n-0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x45, 0x31, 0x12, 0x30, 0x10, 0x06,\n-0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x31,\n-0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54,\n-0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x42,\n-0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72,\n-0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,\n-0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x04, 0xbb, 0x22, 0xab, 0x98, 0x3d,\n-0x57, 0xe8, 0x26, 0x72, 0x9a, 0xb5, 0x79, 0xd4, 0x29, 0xe2, 0xe1, 0xe8, 0x95, 0x80, 0xb1, 0xb0,\n-0xe3, 0x5b, 0x8e, 0x2b, 0x29, 0x9a, 0x64, 0xdf, 0xa1, 0x5d, 0xed, 0xb0, 0x09, 0x05, 0x6d, 0xdb,\n-0x28, 0x2e, 0xce, 0x62, 0xa2, 0x62, 0xfe, 0xb4, 0x88, 0xda, 0x12, 0xeb, 0x38, 0xeb, 0x21, 0x9d,\n-0xc0, 0x41, 0x2b, 0x01, 0x52, 0x7b, 0x88, 0x77, 0xd3, 0x1c, 0x8f, 0xc7, 0xba, 0xb9, 0x88, 0xb5,\n-0x6a, 0x09, 0xe7, 0x73, 0xe8, 0x11, 0x40, 0xa7, 0xd1, 0xcc, 0xca, 0x62, 0x8d, 0x2d, 0xe5, 0x8f,\n-0x0b, 0xa6, 0x50, 0xd2, 0xa8, 0x50, 0xc3, 0x28, 0xea, 0xf5, 0xab, 0x25, 0x87, 0x8a, 0x9a, 0x96,\n-0x1c, 0xa9, 0x67, 0xb8, 0x3f, 0x0c, 0xd5, 0xf7, 0xf9, 0x52, 0x13, 0x2f, 0xc2, 0x1b, 0xd5, 0x70,\n-0x70, 0xf0, 0x8f, 0xc0, 0x12, 0xca, 0x06, 0xcb, 0x9a, 0xe1, 0xd9, 0xca, 0x33, 0x7a, 0x77, 0xd6,\n-0xf8, 0xec, 0xb9, 0xf1, 0x68, 0x44, 0x42, 0x48, 0x13, 0xd2, 0xc0, 0xc2, 0xa4, 0xae, 0x5e, 0x60,\n-0xfe, 0xb6, 0xa6, 0x05, 0xfc, 0xb4, 0xdd, 0x07, 0x59, 0x02, 0xd4, 0x59, 0x18, 0x98, 0x63, 0xf5,\n-0xa5, 0x63, 0xe0, 0x90, 0x0c, 0x7d, 0x5d, 0xb2, 0x06, 0x7a, 0xf3, 0x85, 0xea, 0xeb, 0xd4, 0x03,\n-0xae, 0x5e, 0x84, 0x3e, 0x5f, 0xff, 0x15, 0xed, 0x69, 0xbc, 0xf9, 0x39, 0x36, 0x72, 0x75, 0xcf,\n-0x77, 0x52, 0x4d, 0xf3, 0xc9, 0x90, 0x2c, 0xb9, 0x3d, 0xe5, 0xc9, 0x23, 0x53, 0x3f, 0x1f, 0x24,\n-0x98, 0x21, 0x5c, 0x07, 0x99, 0x29, 0xbd, 0xc6, 0x3a, 0xec, 0xe7, 0x6e, 0x86, 0x3a, 0x6b, 0x97,\n-0x74, 0x63, 0x33, 0xbd, 0x68, 0x18, 0x31, 0xf0, 0x78, 0x8d, 0x76, 0xbf, 0xfc, 0x9e, 0x8e, 0x5d,\n-0x2a, 0x86, 0xa7, 0x4d, 0x90, 0xdc, 0x27, 0x1a, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x45,\n-0x30, 0x43, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe5, 0x9d, 0x59,\n-0x30, 0x82, 0x47, 0x58, 0xcc, 0xac, 0xfa, 0x08, 0x54, 0x36, 0x86, 0x7b, 0x3a, 0xb5, 0x04, 0x4d,\n-0xf0, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01,\n-0x01, 0xff, 0x02, 0x01, 0x03, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,\n-0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\n-0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x85, 0x0c, 0x5d, 0x8e, 0xe4, 0x6f, 0x51,\n-0x68, 0x42, 0x05, 0xa0, 0xdd, 0xbb, 0x4f, 0x27, 0x25, 0x84, 0x03, 0xbd, 0xf7, 0x64, 0xfd, 0x2d,\n-0xd7, 0x30, 0xe3, 0xa4, 0x10, 0x17, 0xeb, 0xda, 0x29, 0x29, 0xb6, 0x79, 0x3f, 0x76, 0xf6, 0x19,\n-0x13, 0x23, 0xb8, 0x10, 0x0a, 0xf9, 0x58, 0xa4, 0xd4, 0x61, 0x70, 0xbd, 0x04, 0x61, 0x6a, 0x12,\n-0x8a, 0x17, 0xd5, 0x0a, 0xbd, 0xc5, 0xbc, 0x30, 0x7c, 0xd6, 0xe9, 0x0c, 0x25, 0x8d, 0x86, 0x40,\n-0x4f, 0xec, 0xcc, 0xa3, 0x7e, 0x38, 0xc6, 0x37, 0x11, 0x4f, 0xed, 0xdd, 0x68, 0x31, 0x8e, 0x4c,\n-0xd2, 0xb3, 0x01, 0x74, 0xee, 0xbe, 0x75, 0x5e, 0x07, 0x48, 0x1a, 0x7f, 0x70, 0xff, 0x16, 0x5c,\n-0x84, 0xc0, 0x79, 0x85, 0xb8, 0x05, 0xfd, 0x7f, 0xbe, 0x65, 0x11, 0xa3, 0x0f, 0xc0, 0x02, 0xb4,\n-0xf8, 0x52, 0x37, 0x39, 0x04, 0xd5, 0xa9, 0x31, 0x7a, 0x18, 0xbf, 0xa0, 0x2a, 0xf4, 0x12, 0x99,\n-0xf7, 0xa3, 0x45, 0x82, 0xe3, 0x3c, 0x5e, 0xf5, 0x9d, 0x9e, 0xb5, 0xc8, 0x9e, 0x7c, 0x2e, 0xc8,\n-0xa4, 0x9e, 0x4e, 0x08, 0x14, 0x4b, 0x6d, 0xfd, 0x70, 0x6d, 0x6b, 0x1a, 0x63, 0xbd, 0x64, 0xe6,\n-0x1f, 0xb7, 0xce, 0xf0, 0xf2, 0x9f, 0x2e, 0xbb, 0x1b, 0xb7, 0xf2, 0x50, 0x88, 0x73, 0x92, 0xc2,\n-0xe2, 0xe3, 0x16, 0x8d, 0x9a, 0x32, 0x02, 0xab, 0x8e, 0x18, 0xdd, 0xe9, 0x10, 0x11, 0xee, 0x7e,\n-0x35, 0xab, 0x90, 0xaf, 0x3e, 0x30, 0x94, 0x7a, 0xd0, 0x33, 0x3d, 0xa7, 0x65, 0x0f, 0xf5, 0xfc,\n-0x8e, 0x9e, 0x62, 0xcf, 0x47, 0x44, 0x2c, 0x01, 0x5d, 0xbb, 0x1d, 0xb5, 0x32, 0xd2, 0x47, 0xd2,\n-0x38, 0x2e, 0xd0, 0xfe, 0x81, 0xdc, 0x32, 0x6a, 0x1e, 0xb5, 0xee, 0x3c, 0xd5, 0xfc, 0xe7, 0x81,\n-0x1d, 0x19, 0xc3, 0x24, 0x42, 0xea, 0x63, 0x39, 0xa9, 0x30, 0x82, 0x05, 0x59, 0x30, 0x82, 0x03,\n-0x41, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,\n-0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n-0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a,\n-0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33,\n-0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n-0x17, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32,\n-0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x31, 0x30,\n-0x32, 0x36, 0x30, 0x38, 0x33, 0x38, 0x30, 0x33, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x30, 0x32,\n-0x36, 0x30, 0x38, 0x33, 0x38, 0x30, 0x33, 0x5a, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n-0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a,\n-0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33,\n-0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,\n-0x17, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32,\n-0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09,\n-0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00,\n-0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd7, 0xc7, 0x5e, 0xf7, 0xc1, 0x07, 0xd4,\n-0x77, 0xfb, 0x43, 0x21, 0xf4, 0xf4, 0xf5, 0x69, 0xe4, 0xee, 0x32, 0x01, 0xdb, 0xa3, 0x86, 0x1f,\n-0xe4, 0x59, 0x0d, 0xba, 0xe7, 0x75, 0x83, 0x52, 0xeb, 0xea, 0x1c, 0x61, 0x15, 0x48, 0xbb, 0x1d,\n-0x07, 0xca, 0x8c, 0xae, 0xb0, 0xdc, 0x96, 0x9d, 0xea, 0xc3, 0x60, 0x92, 0x86, 0x82, 0x28, 0x73,\n-0x9c, 0x56, 0x06, 0xff, 0x4b, 0x64, 0xf0, 0x0c, 0x2a, 0x37, 0x49, 0xb5, 0xe5, 0xcf, 0x0c, 0x7c,\n-0xee, 0xf1, 0x4a, 0xbb, 0x73, 0x30, 0x65, 0xf3, 0xd5, 0x2f, 0x83, 0xb6, 0x7e, 0xe3, 0xe7, 0xf5,\n-0x9e, 0xab, 0x60, 0xf9, 0xd3, 0xf1, 0x9d, 0x92, 0x74, 0x8a, 0xe4, 0x1c, 0x96, 0xac, 0x5b, 0x80,\n-0xe9, 0xb5, 0xf4, 0x31, 0x87, 0xa3, 0x51, 0xfc, 0xc7, 0x7e, 0xa1, 0x6f, 0x8e, 0x53, 0x77, 0xd4,\n-0x97, 0xc1, 0x55, 0x33, 0x92, 0x3e, 0x18, 0x2f, 0x75, 0xd4, 0xad, 0x86, 0x49, 0xcb, 0x95, 0xaf,\n-0x54, 0x06, 0x6c, 0xd8, 0x06, 0x13, 0x8d, 0x5b, 0xff, 0xe1, 0x26, 0x19, 0x59, 0xc0, 0x24, 0xba,\n-0x81, 0x71, 0x79, 0x90, 0x44, 0x50, 0x68, 0x24, 0x94, 0x5f, 0xb8, 0xb3, 0x11, 0xf1, 0x29, 0x41,\n-0x61, 0xa3, 0x41, 0xcb, 0x23, 0x36, 0xd5, 0xc1, 0xf1, 0x32, 0x50, 0x10, 0x4e, 0x7f, 0xf4, 0x86,\n-0x93, 0xec, 0x84, 0xd3, 0x8e, 0xbc, 0x4b, 0xbf, 0x5c, 0x01, 0x4e, 0x07, 0x3d, 0xdc, 0x14, 0x8a,\n-0x94, 0x0a, 0xa4, 0xea, 0x73, 0xfb, 0x0b, 0x51, 0xe8, 0x13, 0x07, 0x18, 0xfa, 0x0e, 0xf1, 0x2b,\n-0xd1, 0x54, 0x15, 0x7d, 0x3c, 0xe1, 0xf7, 0xb4, 0x19, 0x42, 0x67, 0x62, 0x5e, 0x77, 0xe0, 0xa2,\n-0x55, 0xec, 0xb6, 0xd9, 0x69, 0x17, 0xd5, 0x3a, 0xaf, 0x44, 0xed, 0x4a, 0xc5, 0x9e, 0xe4, 0x7a,\n-0x27, 0x7c, 0xe5, 0x75, 0xd7, 0xaa, 0xcb, 0x25, 0xe7, 0xdf, 0x6b, 0x0a, 0xdb, 0x0f, 0x4d, 0x93,\n-0x4e, 0xa8, 0xa0, 0xcd, 0x7b, 0x2e, 0xf2, 0x59, 0x01, 0x6a, 0xb7, 0x0d, 0xb8, 0x07, 0x81, 0x7e,\n-0x8b, 0x38, 0x1b, 0x38, 0xe6, 0x0a, 0x57, 0x99, 0x3d, 0x